渗透测试中的代理

渗透技巧 2年前 (2023) admin
1,327 0 0
渗透测试中的代理

本文来源自平安银河实验室

作者:Ocean



0x01 前言

我们在日常渗透测试或者攻防项目中会经常用到代理,因为我们作为一个外部攻击者在突破外网入口后,面对的是一个较为封闭的内网,哪怕是一台单主机也回有本地监听的端口,所以我们就需要借助搭建代理服务来探测更多内网的服务,为横向或者后渗透做准备。

代理的本质即服务端代替你去访问和连接其他网络,使用代理后就意味着拥有了服务端的网络环境和网络边界。

0x02 代理协议

说到代理,常接触到的就是HTTP/HTTPS、SOCKS5(SOCKS4A)协议。

Socks协议

什么是Socks协议?防火墙安全会话转换协议,工作在OSI参考模型的第5层(会话层)。因为Socks介于传输层与表示层之间,使用TCP协议传输数据,因而不提供如传递ICMP信息之类的网络层相关服务。

目前有两个版本:SOCKS4和SOCKS5

SOCKS4支持TELNET、FTPHTTP等TCP协议。SOCKS5支持TCP与UDP,并支持安全认证方案。

这里需要注意的是Socks不支持ICMP,所以使用PING命令的时候不能走代理,包括一些基于ICMP协议的扫描器也不适合走代理扫描。

渗透测试中的代理

HTTP/HTTPS代理协议

HTTP/HTTPS代理是指将使用HTTP访问的数据(HTTP数据流)转移到第三方(如网站-代理-您的计算机)的行为;或者具有转发HTTP消息功能的服务器。

HTTP/HTTPS代理简单来说可以将你HTTP访问请求包转发到代理服务端,然后代理服务端代替你发起HTTP请求的过程。

渗透测试中的代理

上图是HTTP代理请求的过程,那这个请求会直接发给中间的代理。代理收到后根据目标域名或IP地址连接服务器并将浏览器的请求转发给服务器,最后将服务器的响应转发给浏览器。整个过程都是通过明文TCP连接发送的。

后来,HTTPS出现了。如果浏览器想通过HTTPS访问网页,会先建立加密通道,然后将HTTP请求加密之后发给服务器。如果这个时候想在中间加个代理,代理也没法解密浏览器的加密请求,从而无法代理。为了解决这个问题,人们引入了一种叫CONNECT的HTTPS请求方法,工作过程如下:

渗透测试中的代理

浏览器先跟代理建议TCP连接。如果它想访问 https://google.com,就需要先发一个这样的请求:
CONNECT google.com:443 HTTP/1.1

代理收到后会主动连接google.com:443对应的服务器,两边TCP连接都建好了,代理会自动双向转发数据。也就是说,这个时候浏览器的加密数据就会被转发到服务器,服务器的加密数据也会转发给浏览器。但代理并不知道加密数据的明文。

但不论是明文HTTP请求还是加密的HTTPS请求,从浏览器到代理这一段的通信都是通过明文TCP传输的。也就是说不论是浏览器发出的GET请求还是 CONNECT请求,在浏览器到代理的链路上,所有节点都是能监控的。这些节点知道你要访问哪个网站,这会导致隐私泄漏。而且有的代理需要登录,用户名和密码也是通过明文传输的,根本没有安全性可言。

为了解决这个问题,人们引入了所谓的Secure Web Proxy,也就是所谓的 HTTPS代理。核心思路就是使用HTTPS/TLS对浏览器到代理这一段的通信进行加密,这样中间节点就不能监听数据。

HTTPS代理的工作过程跟HTTP很像,只不过浏览器在跟Proxy建议TCP连接之后还需要再协商TLS会话。TLS信道建立后的通信过程跟HTTP代理就一样了。

0x03 代理分类

根据代理的连接方式我们可以简单的分为正向和反向代理。

正向代理中,Proxy和Client同属一个区域,对Server是透明的;反向代理中,Proxy和Server同属一个区域,对Client透明。但其实这不管是正向还是反向代理都有一个共同的特点,都是代替收发请求和响应,不过从结构上来看正好左右互换了下,所以把前者那种代理方式叫做正向代理,后者叫做反向代理。

渗透测试中的代理

正向代理

通常说的代理,都是指正向代理。

正向代理时,由客户端发送对某一个目标服务器的请求,代理服务器在中间将请求转发给该目标服务器,目标服务器将结果返回给代理服务器,代理服务器再将结果返回给客户端。

使用正向代理时,客户端是需要配置代理服务的地址、端口、账号密码(如有)等才可使用的。通过上图可以看到,客户端并没有直接与服务器相连。正向代理隐藏了真实的客户端地址。可以很好地保护客户端的安全性。

渗透测试中的代理
渗透测试中的代理
Lhost- ->proxy-->Rhost

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

反向代理

服务器根据客户端的请求,从其关系的一组或多组后端服务器(如Web服务器)上获取资源,然后再将这些资源返回给客户端,客户端只会得知代理服务器的IP地址,而不知道在代理服务器后面的服务器集群的存在。

渗透测试中的代理

反向代理整个流程:由客户端发起对代理服务器的请求,代理服务器在中间将请求转发给某一个服务器,服务器将结果返回给代理服务器,代理服务器再将结果返回给客户端。

渗透测试中的代理

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

和正向代理相反,一般情况下,防火墙肯定不能让外网机器随便访问内网机器,所以就提出反向代理。

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

反向代理的适用场景

  • 负载均衡:如果服务器集群中有负荷较高者,反向代理通过URL重写,根据连线请求从负荷较低者获取与所需相同的资源或备援。可以有效降低服务器压力,增加服务器稳定性

  • 提升服务器安全性:可以对客户端隐藏服务器的IP地址;也可以作为应用层防火墙,为网站提供对基于Web的攻击行为(例如DoS/DDoS)的防护,更容易排查恶意软件等

  • 加密/SSL加速:将SSL加密工作交由配备了SSL硬件加速器的反向代理来完成

  • 提供缓存服务:加速客户端访问;对于静态内容及短时间内有大量访问请求的动态内容提供缓存服务

  • 数据统一压缩:节约带宽;为网络带宽不好的网络提供服务

  • 统一的访问权限控制

  • 统一的访问控制

  • 突破互联网的封锁

  • 上传下载减速控制


正向代理与反向代理的区别

当前面的内容理解后,对于正向代理和反向代理的区别就很好理解了。最核心的不同在于代理的对象不同。正向代理是代理客户端,正向代理隐藏真实客户端。反向代理是代理服务器,反向代理隐藏真实服务端


0x04 本地配置上网代理工具

ProxyChains

ProxyChains是Linux和其他Unices下的代理工具。它可以使任何程序通过代理上网,允许TCP和DNS通过代理隧道,支持HTTP、SOCKS4和SOCKS5类型的代理服务器,并且可配置多个代理。ProxyChains通过一个用户定义的代理列表强制连接指定的应用程序,直接断开接收方和发送方的连接。本节将介绍设置ProxyChains的方法。

proxychains-ng是proxychains的加强版,主要有以下功能和不足:

  • 支持http/https/socks4/socks5

  • 支持认证

  • 远端dns查询

  • 多种代理模式

  • 不支持udp/icmp转发

  • 少部分程序和在后台运行的可能无法代理


proxychains原理,简单的说就是这个程序Hook 了 sockets 相关的操作,让普通程序的sockets 数据走SOCKS/HTTP代理。其核心就是利用了 LD_PRELOAD这个环境变量(Mac 上是 DYLD_INSERT_LIBRARIES)。在 Unix 系统中,如果设置了LD_PRELOAD环境变量,那么在程序运行时,动态链接器会先加载该环境变量所指定的动态库。也就是说,这个动态库的加载优先于任何其它的库,包括libc。

ProxyChains创建了一个叫libproxychains4.so(Mac 上是 libproxychains4.dylib)的动态库。里面重写了connect、close以及sendto 等与socket相关的函数,通过这些函数发出的数据将会走代理,详细代码可以参考libproxychains.c。

在主程序里,它会读取配置文件,查找libproxychains4所在位置,把这些信息存入环境变量后执行子程序。这样子程序里对socket相关的函数调用就会被 Hook 了,对子程序来说,跟代理相关的东西都是透明的。

proxychains配置只需要修改proxychains.conf配置文件即可,然后启动程序的时候在命令行前面加上proxychains。

proxifier

Proxifier是一款功能非常强大的代理客户端,支持Windows XP/Vista/Win7/Win10 和MacOS,支持http/https、socks4/5、TCP、UDP等协议,可以指定端口,指定IP,指定域名、指定程序、指定用户名密码授权等运行模式,兼容性非常好,有点类似SOCKSCAP。

有许多网络应用程序不支持通过代理服务器工作,不能用于局域网或防火墙后面。这些会损害公司的隐私和导致很多限制。Proxifier解决了这些问题和所有限制,让您有机会不受任何限制使用你喜爱的软件。此外,它让你获得了额外的网络安全控制,创建代理隧道,并添加使用更多网络功能的权力。

代理流程主要分为两步:
1、添加代理服务器
2、设置代理规则(设置需要代理的应用程序)

这样,只要选择需要代理的应用程序,比如chrome.exe,即可实现代理流量转发。

在渗透测试中我们还可以设置代理链的形式来实现多级代理。

0x05 代理服务和隧道搭建

SSH隧道

SSH(Secure Shell protocol)协议是应用层协议,OpenSSH是SSH (Secure SHell)协议的免费开源实现,SSH协议族可以用来进行远程控制,或在计算机之间传送文件。而实现此功能的传统方式,如telnet(终端仿真协议)、 rcp ftp、 rlogin、rsh都是极为不安全的,并且会使用明文传送密码。OpenSSH提供了服务端后台程序和客户端工具,用来加密远程控件和文件传输过程的中的数据,并由此来代替原来的类似服务。

SSH能够提供客户端到服务端的加密传输,当HTTP、FTP等协议被防火墙所拦截时,可以考虑使用SSH的端口转发功能,将其它TCP端口的网络数据通过SSH连接来转发。

创建隧道常用的参数说明:
-C 压缩传输,增加传输的效率,-f 将SSH传输放在后台执行,不占用当前的SHELL-N 建立静默连接,就是建立了连接,但是看不到具体的会话;还有一种说法是不允许执行命令-g 允许远程主机连接本地用于转发端口-L 本地端口转发-R 远程端口转发-D 动态转发-P 指定SSH客户端连接的服务器端口-q 表示安静模式,不向用户输出任何警告信息-t 参数在SSH直接运行远端命令时,提供一个互动式 Shell。

远程端口转发前提:

1.sshd_config里要打开AllowTcpForwarding选项,否则-R远程端口转发会失败。

2.默认转发到远程主机上的端口绑定的是127.0.0.1,如要绑定0.0.0.0需要打开sshd_config里的GatewayPorts选项

什么是端口转发?

SSH会加密和解密SSH客户端与服务端的网络数据,SSH还可以将其他的TCP端口网络数据通过SSH链接来转发,并且是机密解密的(又称隧道)。而且一般情况下SSH协议是被允许通过防火墙的,所以很容易被攻击者利用。

SSH端口转发的优势:
  • 加密客户端和服务端之间通讯数据

  • 可以突破防火墙的限制


本地转发

将发送到本地端口的请求,转发到目标端口,常用做跳板机实现单个端口通信转发。

渗透测试中的代理
情况:centos不允许攻击者Kali访问,允许跳板机Kali访问目标:从攻击者访问到内网192.168.254.150的服务,在攻击机kali上执行如下命令:
ssh -N -L 54321:192.168.254.150:22 [email protected]

通过跳板机192.168.0.137将本地主机54321端口数据转发到192.168.254.150的22端口。此时攻击者kali主机可以通过ssh连接本地54321端口,连接到centos主机的SSH服务。

数据流向:kali1与kali2通过ssh加密传输数据,kali2接收到加密传输的数据后解密,将解密后的数据流量转发到内网centos的22端口上,也就是SSH服务。

远程转发

将发送到远程端口的请求,转发到目标端口,常用于内网穿透。

首先虚拟机Msf上通过SSH连接远程VPS并且通过端口转发,将VPS的某个端口转发到本地。至此,VPS的某个端口收到流量就会自动通过隧道转发到本地的某个端口上。
ssh -C -f -N -g -R 0.0.0.0:85:127.0.0.1:1234 root@IP -p 22passwd xxxx

这条语句的意思就是用SSH远程端口转发,将VPS上的85端口转发到本地的1234端口上。其实就是类似FRP的反向代理,正常的FRP代理是通过将内网端口和外网端口建立一个隧道,这时访问外网端口相当于直接访问到内网某个端口,这里就是通过监听端口设置在85,受控主机与VPS 85端口进行数据传输,于是通过SSH远程端口转发,将VPS 85端口获取的数据转发到本地主机的1234端口。其实就可以看作是将本地1234端口映射到VPS的85端口。

端口转发

目标:从攻击者访问到内网192.168.254.150的服务。在跳板机上执行如下命令:
ssh -N -R 192.168.0.3:12345:192.168.254.150:80 [email protected]

此时攻击机kali通过访问本地12345端口就相当于访问192.168.254.150的80端口。

数据流向:跳板机Kali主动通过SSH连接攻击机Kali,跳板机和攻击机中间应该还有一个小的端口转发的过程,当攻击机Kali访问本机12345端口的时候,跳板机接受到流量然后解密后再将解密后的流量发送给内网主机Centos。

渗透测试中的代理

本地转发和远程转发的区别

通过上述可以看到,可以通过本地转发和远程转发都可以实现攻击机访问自身端口然后将数据导向内网主机Centos。两者主要的区别在于跳板机和攻击机之前,本地转发是一个正向代理连接的过程,远程转发更像是反向连接的过程。

动态转发

就是正向的socks代理

渗透测试中的代理
在攻击机Kali执行如下命令
ssh -qTfnN -D 1080 [email protected]

这是我们就已经通过192.168.0.137这台主机代理进内网了,在本地通过proxychains代理本地1080端口即可利用正向socks进入该内网网段中。

数据流向:攻击机Kali与跳板机Kali通过SSH加密传输socks协议流量,然后跳板机服务端解密并且解析socks协议获得解密流量,然后跳板机将数据流量转发到本机指定的IP和Port。

这样就相当于全端口式的本地转发,通过跳板机将流量定向到自己指定的IP和Port处。

Earthworm

EarthWorm是一套便携式的网络穿透工具,具有 SOCKS v5服务架设和端口转发两大核心功能,能够以“正向”、“反向”、“多级级联”等方式打通一条网络隧道,直达网络深处,可在复杂网络环境下完成网络穿透。工具包中提供了多种可执行文件,以适用Linux、Windows、MacOS、Arm-Linux 等不同的操作系统。

EarthWorm提供6种功能:
ssocksd rssocks rcsocks lcx_listen lcx_tran lcx_slave //通过-s参数指定

各命令用法解释:
./ew -s ssocksd -l 1080 //开启正向socks服务./ew -s rcsocks -l 1080 -e 8888 //监听1080端口,1080接收的数据通过8888交互传递./ew -s rssocks -d rev_ip -e 8888 //开启反向socks服务。反向连接rev_ip的8888端口./ew -s lcx_listen -l 1080 -e 8888 //监听1080端口,1080接收的数据通过8888交互传递./ew -s lcx_tran -l 1080 -f forward_ip -g 8888 //监听1080端口,1080接收的数据正向传给forward_ip的8888端口./ew -s lcx_slave -d vps_ip -e 8888 -f B_ip -g 9999 //作为中间角色,反向连接vps的8888,正向连接B的9999。打通两者

目标在公网
渗透测试中的代理
目标A:ew_for_win.exe -s ssocksd -l 1080PC:socks代理连接目标A的1080端口,即可代理近目标内网

目标在内网(能出网)
渗透测试中的代理
在vps运行:ew_for_win.exe -s rcsocks -l 1080 -e 8888在目标A运行:ew_for_win.exe -s rssocks -d vps_ip -e 8888socks代理连接vps_ip的1080端口,即可代理近目标内网

目标B在内网(不出网,通出网机器A)

A→B正向连接
在vps运行:ew_for_win.exe -s lcx_listen -l 1080 -e 8888在目标B运行:ew_for_win.exe -s ssocksd -l 9999在出网机器A运行:ew_for_win.exe -s lcx_slave -d vps_ip -e 8888 -f B_ip -g 9999

A←B反向连接
在vps运行:ew_for_win.exe -s rcsocks -l 1080 -e 8888在出网机器A运行:ew_for_win.exe -s lcx_tran -l 9999 -f vps_ip -g 8888在目标B运行:ew_for_win.exe -s rssocks -d A_ip -e 9999

EW小结

  • SOCKS5 服务的核心逻辑支持由 ssocksd 和 rssocks 提供,分别对应正向与反向socks代理。rssocks需要与rcsocks共同使用。

  • lcx_xxxx用于打通vps和socks服务器之间的链路
  • -d 8.8.8.8 -e 8888 用于反向连接;-f 8.8.8.8 -g 9999 用于正向连接


reGeorg

reGeorg 项目介绍为reDuh的继承者,主要是通过web服务把位于DMZ区的网络代理出来。Neo-reGeorg是一个旨在积极重构reGeorg的项目,他优化了很多东西。具体参考项目:https://github.com/L-codes/Neo-reGeorg。

reGeorg的使用非常简单,只需要将对应的reGeorg webshell上传到目标服务器,然后本地python启动客户端。
$ python reGeorgSocksProxy.py -p 8080 -u http://upload.sensepost.net:8080/tunnel/tunnel.jsp-p 参数代表本地启动监听的socks端口-u 参数为上传的url地址

然后本地应用通过socks5端口去访问网络即可。

渗透测试中的代理
通过上面reGeorg执行流程图我们可以发现reGeorg的原理:客户端将sock5协议转化成指令通过HTTP请求发送到webshell,webshell处理后将数据流通过http返回的respond返回给客户端,客户端还原成socks5协议后传递给应用。

FRP

项目地址:https://github.com/fatedier/frp

在网络上可以搜索到诸多安装部署教程,可以看到FRP是一个可用于内网穿透的高性能的反向代理应用,支持TCPUDP协议,为HTTP和HTTPS应用协议提供了额外的能力,且尝试性支持了点对点穿透。

FRP采用Go语言开发,如果你擅长此种编程语言,可以进行客制化修改,来满足不同的需求。更多的人使用FRP是为了进行反代,满足通过公网服务器访问处于内网的服务,如访问内网Web服务,远程ssh内网服务器,远程控制内网NAS等,实现类似花生壳、ngrok等功能。

而对于内网渗透来讲,这种功能恰好能够满足我们进行内网渗透的流量转发。FRP分为客户端和服务端 , 服务端一般放到VPS的机器上 , 然后客户端(受控目标机器)连接服务端。

socks反向代理

这一功能在FRP中是以插件的形式实现的。

客户端配置:
[common]# 远程VPS地址server_addr = 108.8.8.8server_port = 7000tls_enable = truepool_count = 5

[plugin_socks]type = tcpremote_port = 46075plugin = socks5plugin_user = userplugin_passwd = passwduse_encryption = trueuse_compression = true

然后启动客户端 , 回连服务端
./frpc -c frpc.ini

这样我们的服务端VPS机器上就开放了一个socks5端口46075,然后我们本地连接这个端口,就可以获取到客户端(受控目标机器)所在机器的网络。

0x06 代理方式的选择

针对不同的网络环境和通路,我们需要根据实际情况去选择需要使用的代理方式,更重要的是理解常见代理的协议和原理,这样我们就能更加灵活的去应对复杂的网络环境。

参考来源:
浅谈内网渗透代理
https://xz.aliyun.com/t/8001



银河实验室

渗透测试中的代理

银河实验室(GalaxyLab)是平安集团信息安全部下一个相对独立的安全实验室,主要从事安全技术研究和安全测试工作。团队内现在覆盖逆向、物联网、Web、Android、iOS、云平台区块链安全等多个安全方向。
官网:http://galaxylab.pingan.com.cn/




 好   顾 


JSP下的白魔法:JspEncounter
利用Cloudflare 零信任进行C2通信及防护
使用GitHub Actions进行红队自动化构建
使用VS-Code结合源码进行内核及内核模块远程调试的方法



点赞、分享,感谢你的阅读▼ 


▼ 点击阅读原文,进入官网

原文始发于微信公众号(平安集团安全应急响应中心):渗透测试中的代理

版权声明:admin 发表于 2023年2月16日 下午6:00。
转载请注明:渗透测试中的代理 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...