Tunna 是一套工具,用于将任何 TCP 通信封装并通过 HTTP 隧道传输。可用于绕过完全防火墙环境中的网络限制。
v1.1 Alpha 版本
_____
|_ _| _ _ __ _ __ __ _
| || | | | '_ \| '_ \ / _` |
| || |_| | | | | | | | (_| |
|_| \__,_|_| |_|_| |_|\__,_|
Tunna 0.1,用于 HTTP 隧道传输 TCP 连接,作者 Nikos Vassakis
http://www.secforce.co.uk / nikos.vassakis <at> secforce.com
################################################################################################################
TLDR:通过 HTTP 隧道传输 TCP 连接
在完全防火墙(入站和出站连接均受限——仅开放 Web 服务器端口)的环境中
该 Web Shell 可用于连接远程主机上的任何服务。这将是对远程主机本地端口的本地连接,且应被防火墙允许。
Web Shell 将从服务端口读取数据,将其封装为 HTTP 协议,并作为 HTTP 响应发送给本地代理。
本地代理将解封装数据,并将其写入本地端口,客户端程序将连接到此端口。
当本地代理在本地端口收到数据时,会将其作为 HTTP POST 发送给 Web Shell。
Web Shell 将从 HTTP POST 中读取数据,并将其写入服务端口。
然后重复上述过程。
仅需开放 Web 服务器端口(通常为 80/443)。 整个通信(外部)均通过 HTTP 协议进行。
python proxy.py -u <远程URL> -l <本地端口> [选项]
--help, -h 显示此帮助信息并退出
--url=URL, -u URL 远程 Web Shell 的 URL
--lport=本地端口, -l 本地端口
本地监听端口
--verbose, -v 详细模式(输出数据包大小)
--buffer=缓冲区大小, -b 缓冲区大小*
HTTP 请求大小(某些 Web Shell 有大小限制)
如果使用了 SOCKS 代理,则忽略这些选项。
--no-socks, -n 不使用 SOCKS 代理
--rport=远程端口, -r 远程端口
Web Shell 要连接的远程服务端口
--addr=远程IP, -a 远程IP
Web Shell 要连接的远程地址(默认 = 127.0.0.1)
通过本地代理隧道连接
--up-proxy=上游代理, -x 上游代理
上游代理(http://proxyserver.com:3128)
--auth, -A 上游代理需要身份验证
--ping-interval=PING_DELAY, -q PING_DELAY
webshprx 轮询线程间隔(默认 = 0.5 秒)
--start-ping, -s 先启动轮询线程——某些服务会先发送数据(例如 SSH)
--cookie, -C 请求 Cookie
--authentication, -t 基本身份验证
使用示例:
python proxy.py -u http://10.3.3.1/conn.aspx -l 8000 -v
# 这将在本地端口 8000 启动一个 SOCKS 代理服务器
# 此连接将通过 HTTP 封装,并在远程服务器解封装
python proxy.py -u http://10.3.3.1/conn.aspx -l 8000 -x https://192.168.1.100:3128 -A -v
# 这将在本地端口 8000 启动一个 SOCKS 代理服务器
# 它将通过一个需要身份验证的本地代理(https://192.168.1.100:3128)连接到远程 Tunna Web Shell
python proxy.py -u http://10.3.3.1/conn.aspx -l 4444 -r 3389 -b 8192 -v --no-socks
# 这将发起 Web Shell 与远程主机 RDP(3389)服务之间的连接
# RDP 客户端可以连接 localhost 端口 4444
# 此连接将通过 HTTP 封装
能够在远程服务器上上传 Web Shell
这是概念验证代码,可能导致服务器拒绝服务。
已尽力在运行后或出错时进行清理(但不保证)
基于本地测试:
* JSP 缓冲区需限制(使用缓冲区选项):
在 Linux Apache Tomcat 上 4096 可行
在 XAMPP Apache Tomcat 上 1024 可行(较慢)
* 超过此大小可能导致远程套接字字节丢失
例如:ruby proxy.rb -u http://10.3.3.1/conn.jsp -l 4444 -r 3389 -b 1024 -v
* 默认未启用套接字:
php windows(IIS + PHP)
XAMPP Windows
php linux(PHP 内置 Web 服务器 / Apache + PHP)
如果出现错误:Uncaught Error: Call to undefined function socket_create()
请参阅 https://stackoverflow.com/questions/6137823/fatal-error-call-to-undefined-function-socket-create
* Web Shell 中的回车符(代码之外):
会出现在响应中 / 被写入本地套接字 → 导致数据包损坏
* Windows 下 PHP Web Shell:循环函数导致远程套接字拒绝服务:
已添加 sleep 函数 → 可行但稍慢
* PHP Web Shell 需要在文件末尾("?>" 之后)删除换行符
因为这些字符会在每次响应中被发送,导致 Tunna 混淆
Web Shell:
conn.jsp 已在 Apache Tomcat(Windows + Linux)上测试
conn.aspx 已在 IIS 6+8(Windows Server 2003/2012)上测试
conn.php 已在 LAMP + XAMPP + IIS(Windows + Linux)上测试
Web 服务器:
webserver.py 已在 Python 2.6.5 上测试
代理:
proxy.py 已在 Python 2.6.5 上测试
数据以原始形式发送在 HTTP POST 体中(无 POST 变量)
指令/配置作为 URL 参数(HTTP GET)发送给 Web Shell
数据在 HTTP 体(HTTP POST)中发送
未使用 WebSocket:大多数 Web 服务器默认不支持
无法实现异步 HTTP 响应
代理持续轮询服务器(默认 0.5 秒)
第一个数据包与 Web Shell 建立会话——获取 Cookie 返回 例如:http://webserver/conn.ext?proxy
第二个数据包向 Web Shell 发送连接配置选项 例如:http://webserver/conn.ext?proxy&port=4444&ip=127.0.0.1
Web Shell 要连接的 IP 和端口
这是一个线程化请求:
在 PHP 中,此请求将进入无限循环
以保持 Web Shell 套接字连接存活
在其他 Web Shell 中,会收到 [OK] 返回
将创建一个本地套接字,供客户端程序连接 客户端连接后,启动轮询线程并开始执行 套接字上的任何数据(来自客户端)被读取并作为 HTTP POST 请求发送 Web Shell 套接字上的任何数据将作为对 POST 请求的响应发送
由于 HTTP 响应不能是异步的。 此线程将按间隔(默认 0.5 秒)对 Web Shell 执行 HTTP GET 请求 如果 Web Shell 有数据要发送,它将(也)作为对此请求的回复发送 否则发送空响应
通常: 来自本地代理的数据通过 HTTP POST 发送 每 0.5 秒执行一次 GET 请求以查询 Web Shell 的数据 如果 Web Shell 端有数据,将作为对其中一个请求的响应发送
Web Shell 连接到本地或远程主机上的套接字。 写入套接字的任何数据都将作为对请求(POST/GET)的回复发回代理 通过 POST 接收到的任何数据都将写入套接字
所有请求都需要设置 URL 参数 "proxy",以便由 Web Shell 处理 (http://webserver/conn.ext?proxy)
终止所有线程并关闭本地套接字 向 Web Shell 发送 proxy&close: 终止远程线程并关闭套接字
SOCKS 支持是 Tunna 的一个附加模块。在本地,它是一个独立的线程,处理连接请求和流量,添加一个指定端口和数据包大小的头部,并将其转发给 Tunna。Tunna 将其发送到远程 Web 服务器,移除 HTTP 头部,并将数据包转发到远程 SOCKS 代理。远程 SOCKS 代理发起连接,并将接收到的端口映射到本地端口。如果远程 SOCKS 代理从服务收到数据,它会查看映射表,找到需要响应的端口,将端口作为头部添加,以便本地 SOCKS 代理知道将数据转发到何处。从接收端口来的任何流量将被转发到本地端口,反之亦然。
Tunna,基于 HTTP 的 TCP 隧道 Nikos Vassakis 版权所有(C)2014 SECFORCE。
此工具仅用于合法目的。
本程序是自由软件:您可以重新分发和/或修改它 根据自由软件基金会发布的 GNU 通用公共许可证, 许可证版本 3 或(由您选择)任何更高版本。
分发此程序的目的是希望它有用,但 不提供任何担保;甚至没有针对特定用途的默示担保。 有关更多详情,请参阅 GNU 通用公共许可证。
您应该已收到 GNU 通用公共许可证的副本,随此程序一起。 如果没有,请参见 http://www.gnu.org/licenses/。