隧道代理-基于Linux原生工具的隧道代理

文章的灵感来自于面试官的问题:“知道linux不上传任何工具怎么搭隧道代理吗”

由于平时习惯直接使用frp、venom、suo5等代理工具,或者是直接使用C2自带的代理,所以被问到的时候直接懵了,后面才发现我竟然在学习代理的时候是学过的:隧道代理-端口转发相关工具,但是当时没有上手实践所以根本没记住,特有此篇文章来记录相关操作

准备工作

我写了一个python脚本,用于在内网起一个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()

在被控服务器内网的8005端口运行(由于安全组等原因,不会开放到外网):

QQ_1750516993762

可以看到现在是无法在外网访问的:
QQ_1750516779223

接下来开始进行代理操作

SSH端口转发

首先是端口转发,一般都是选择正向转发:

ssh -CfNg -L [本地端口]:[内网主机IP]:[内网主机端口] [外网主机IP]

这里的参数含义如下:

  • -C:启用压缩(Compress),减少传输数据量,提高隧道效率,尤其在网络较差时
  • -f:在验证成功后后台运行 SSH,否则会阻塞终端
  • -N:不执行远程命令,仅用于端口转发
  • -g:允许其他主机连接到你本地绑定的端口(否则默认只允许本机访问)
  • -L:启用本地端口转发

首先将这个台被控主机反弹shell到我的控制端vps上:

QQ_1750516969746

然后python获取pty(一定要有一个交互式shell,我在测试的时候,反弹的shell不能直接输入ssh连接的密码),查看是否有ssh并端口转发,将内网8005端口转发到外网2333端口:

ssh -CfNg -L 2333:127.0.0.1:8005 [被控端服务器公网IP]
[回车后输入获取到的内网主机账户密码]

QQ_1750518014388

如此就实现了端口的转发,我们可以通过访问公网2333端口看到内网的8005端口web页面:

QQ_1750518071186

在测试完毕后,只需要kill掉相应进程即可:

QQ_1750518339856

SSH动态转发

由于端口转发只能让我们可以访问固定的内网服务,这在一定程度上会限制我们的内网操作,所以可以考虑动态转发,这是一个类似socks5代理的方法:

ssh -N -D [本地监听IP]:[本地监听端口] [用户名]@[跳板机内网IP]

参数:

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

所以前面的步骤和上面一样,只是ssh的使用命令变了:

ssh -N -D 0.0.0.0:2333 root@[被控服务器内网IP]

QQ_1750520414629

接下来我们在proxifier上配置socks5代理,实现对内网IP访问的转发:

QQ_1750520516147

接下来我们就可以随意的访问172.21.130.1/24段的内网服务了,比如浏览器直接访问上面内网的8005端口网页:

QQ_1750520623505

由于这里的动态转发并没有使用-f参数,所以不会在后台运行,在断开连接后,ssh进程就自动退出了,不需要kill进程来清楚痕迹:

QQ_1750520819550

总结

这里我们记录了两种通过SSH在linux主机搭建隧道代理的方式,在不方便上传代理工具等特殊情况可以考虑使用,其实同样的在windows上也有netsh(只能用于端口转发),但由于windows的渗透通常都需要上线到C2,而C2的代理功能固然好用更多,所以就不记录了

posted @ 2025-06-22 00:32  Yuy0ung  阅读(180)  评论(1)    收藏  举报