渗透测试隧道代理

一、前言

之前奇安信红队面试的时候,有个问题我印象比较深刻:怎么根据实际情况选择使用什么代理?

代理这块一直是我的薄弱项,当时没有回答好,感觉有些概念搞不清,于是就有了下文。

二、基础知识

什么是代理?

代理简单来说就是通过一个中间的代理服务器,将原本属于不同网络环境中的服务建立通信的过程。

中间的代理服务器需要满足双向通信,在我们的攻击机和靶机之间可以采用正向或者反向的连接方式。

正向代理和反向代理

正向代理,顾名思义,就是攻击机去主动连接靶机;反之则是反向代理。

在内网渗透中:

我们比如通过打点或者钓鱼拿下了一台出网的服务器,可以通过C2或frp等工具首先建立反向连接通道,这样这台服务器就能够实现和vps的双向通信,随后在该通信通道基础上构建SOCKS等正向代理能力,从而将该主机转化为代理节点,用于访问内网其他资产并进行横向移动。

在内网中除了使用SOCKS5作为正向代理隧道,还可以使用HTTP代理、SSH隧道、TCP端口转发和UDP隧道等。

解释一下内网穿透的概念:内网穿透是一种通过在内网主机与外部服务器之间建立反向通信隧道,并在该隧道基础上进行端口映射与流量转发的技术,使外部网络能够访问原本处于内网的服务。

代理协议

  • HTTP/HTTPS协议

HTTP是一种基于 TCP 的应用层请求-响应协议,用于客户端和服务器之间传输超文本数据。suo5就是利用http协议作为载体实现的临时socks5隧道

  • SOCKS5协议

SOCKS5可以理解为流量转发的规则,支持TCP/UDP等传输协议。

  • TCP协议

TCP协议是一种可靠的双向传输通道,常见的frp、ssh还有C2的反向隧道都是基于TCP协议的

  • ICMP协议

ICMP是一个网络层控制协议,一般用于ping和traceroute,ICMP协议由于速度慢、传输的数据量小,连接不稳定,在建立隧道时不是很常见,但是基于ICMP的隧道往往比较隐蔽,不容易被防火墙拦截。

代理层级

  • 应用层隧道(DNS、SOCKS、HTTP、SSH)
  • 传输层隧道(TCP隧道、UDP隧道)
  • 网络层隧道(ICMP、IPv6隧道)

这些协议都可以作为隧道协议,层级越低越隐蔽,但是性能可能也会越低

三、代理工具

suo5

地址

https://github.com/zema1/suo5

Suo5 是一款久经实战检验的高性能 HTTP 正向代理工具,持续打磨只为解决一个需求:不出网场景下的稳定正向代理。

原理

根据上一part的知识,再来理解suo5是怎么实现的隧道代理。

首先我们shell了一个服务器之后需要用c2的马子或者frp来做一个双向通信隧道,但是suo5并没有做这一步,而是直接利用现成的HTTP请求和响应来完成这一过程的。suo5使用http的数据来封装了socks5的数据,实现了一个基于SOCKS5协议的内网的正向代理隧道。

该工具比常见的frp或者c2木马要方便一些,只需要文件上传(还要解析)就能实现内网隧道搭建,而且在目标服务器不出网的情况下也可以使用。

使用

  1. 上传suo5的服务端文件到服务器上

  2. 通过客户端建立隧道

image-20260414170113883

linux系统

./suo5 -t http://target.com/suo5.jsp
  1. 访问内网web服务
  • 在本地的浏览器配置socks5的代理为127.0.0.0:1111,即可访问内网的web服务

image-20260414170811730

也可以在burp中设置socks5代理

image-20260414171023368

  • 内网探测

要在本地访问内网的服务,就需要先搭建一个suo5的SOCKS5代理节点,通过这个节点来进行访问。

在本地,不同的系统有不同的代理工具:

Linux

proxychais:https://github.com/haad/proxychains

apt-get install proxychains

proxychais的配置文件在/etc/proxychains.conf

只需要在[ProxyList]加一行就行了

[ProxyList]
# add proxy here ...
# meanwile
# defaults set to "tor"
# socks4  127.0.0.1 9050  ##注释掉或者直接删掉默认的本地代理
socks5  IP PORT [uername] [password]

然后只需要在需要使用代理的命令之前添加:proxychains4即可

proxychains4 curl 10.10.10.10

Windows

Proxifier:https://www.proxifier.com/

我使用frp在vps上开启了SOCKS5代理

然后在本地使用Proxifier进行连接,注意这里的端口是frp客户端设置的端口

image-20260415125012279

然后check一下

image-20260415124913107

配置好后启用

image-20260415125410468

frp

工具地址

https://github.com/fatedier/frp/

端口映射

网络环境:

攻击机(虚拟机-kali) 192.168.146.134

代理机(虚拟机-ubuntu) 192.168.146.133

靶机(wsl2-kali) 172.21.165.188

  1. 将frps和frps.toml文件上传到代理机

  2. 将frpc和frpc.toml文件上传到客户端

  3. 配置规则

frpc.toml

[common]
server_addr = 192.168.146.133
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

表示将本机的22端口转发到代理服务器(192.168.146.133)的6000端口

frps.toml

[common]
bind_addr = 0.0.0.0
bind_port = 7000
  1. 运行frp工具
./frps -c frps.toml		# 服务端   
./frpc -c frpc.toml		# 客户端   

服务端

image-20260414194747556

客户端

image-20260414194723131

  1. 攻击机连接代理机6000端口访问内网服务器的ssh服务
ssh -p 6000 root@192.168.146.133

image-20260414200315252

成功的通过代理机的6000端口连接我的wsl2-kali

SOCKS5代理

同样是上面的网络环境,目标是通过代理机搭建一个访问内网的socks5隧道

  1. 将frps和frps.toml文件上传到vps

  2. 将frpc和frpc.toml文件上传到客户端

  3. 配置规则

frpc.toml

[common]
server_addr = 192.168.146.133
server_port = 7000

[socks5]
type = tcp
remote_port = 6001
plugin = socks5

将本机的网络数据通过socks5协议传输到代理机的6001端口

frps.toml

[common]
bind_addr = 0.0.0.0
bind_port = 7000

攻击机配置全局SOCKS5代理

/etc/proxychains.conf

[ProxyList]
socks5 192.168.146.133 6001

image-20260414201932475

  1. 运行frp
./frps -c frps.toml		# 服务端   
./frpc -c frpc.toml		# 客户端   

image-20260414201810161

image-20260414201823806

SSH

使用linux原生的工具SSH也可以搭建隧道代理

网络环境:

攻击机:虚拟机win10 192.168.146.132

代理机:虚拟机ubuntu 外网ip:192.168.146.133

​ 内网ip:10.10.10.130

靶机:虚拟机kali 10.10.10.129

我在靶机上跑一个web服务用于检测隧道是否搭建成功

import http.server
import socketserver

PORT = 8005
CONTENT = b"""
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Proxy Test</title>
</head>
<body>
    <h1>proxytest</h1>
    <h1>success</h1>
</body>
</html>
"""

class CustomHandler(http.server.BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)                     
        self.send_header("Content-type", "text/html; charset=utf-8")
        self.end_headers()
        self.wfile.write(CONTENT)

    def log_message(self, format, *args):
        return 

if __name__ == "__main__":
    with socketserver.TCPServer(("0.0.0.0", PORT), CustomHandler) as httpd:
        print(f"[+] Serving on port {PORT} ...")
        httpd.serve_forever()

运行命令将web服务起在8005端口

python3 testweb.py

image-20260414204611632

image-20260414205152420

端口映射

利用靶机的ssh执行

ssh -R 0.0.0.0:8999:localhost:8005 -N -f litsasuk@10.10.10.130

这里的0.0.0.0一定要加,不然只有代理机通过localhost才能访问

表示将靶机的8005端口上的服务映射到代理机的8999端口

image-20260414210647720

这里在代理机上访问成功了

image-20260414211533230

动态端口转发

这个类似于socks5的代理

ssh -N -D 0.0.0.0:2555 litsasuk@10.10.10.130
  • -N:不执行远程命令,仅建立隧道(用于端口转发)
  • -D:启动一个 SOCKS5 代理,监听在本地指定的 IP 和端口

在浏览器的FoxyProxy配置下socks5代理:

image-20260414213703858

可以看到通过代理是可以访问内网服务的

image-20260414213502710

四、总结

回到开头的问题:什么情况下需要搭建什么代理?

我觉得可以根据服务器出网与否来判断:

如果目标是出网的,那么大部分的隧道工具都能使用,比如frp或者c2的木马这类反向连接木马,可以实现双向TCP通信隧道。

目标不出网,那么只能采用正向代理,比如使用suo5或者控制了一台边界服务器后使用frp做端口转发。

posted @ 2026-06-10 18:29  Litsasuk  阅读(39)  评论(0)    收藏  举报