利用pearcmd实现裸文件包含

news/2024/9/28 21:24:49

利用pearcmd实现裸文件包含

在 ctf 中,常常有这样一类题:

题目很简单,一般围绕一个 include 函数展开。

例:

ctfshow 元旦水友赛 easy_include

image-20240511014152812

这类题目没有提供文件上传点,因此不能使用常规方法上传一句话实现命令执行。

裸文件包含是一种针对这类题目的解题手法。

这里引入大佬的文章:https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html

后面我的研究很多都是基于这篇文章的。

由于没有文件上传点,我们只能利用靶机本身的一些特殊文件的特性写入一句话实现命令执行。

常规的用法是日志文件包含,日志文件有以下特点

  • 用户的请求会导致某些日志的跟新
  • 用户请求中的某些参数会写入日志里(如User-Agent)
  • 日志文件的默认位置一般是确定的

但是在 ctf 环境中,题目大多为 docker 环境,docker 环境下的日志会有很多变数(具体参考上面大佬的文章)

那么,docker 环境下,有没有什么更加普适性的方法来实现文件包含+命令执行呢?

接下来就要引出一个docker环境下很大概率会有的一个工具—— pear包管理系统

pear包管理系统

pecl是PHP中用于管理扩展而使用的命令行工具,而pear是pecl依赖的类库。在7.3及以前,pecl/pear是默认安装的;在7.4及以后,需要我们在编译PHP的时候指定--with-pear才会安装。

不过,在Docker任意版本镜像中,pcel/pear都会被默认安装,安装的路径在/usr/local/lib/php

PEAR(PHP Extension and Application Repository)

这是一个PHP 的包管理系统,用于安装和管理 PHP 扩展和库。

PEAR 包管理器通常使用 pear 命令来执行各种操作,例如安装、更新和删除 PHP 包。

关键命令 config-create

我们关注这样一条命令

pear config-create <directory> <filename>

这个命令使用了 config-create 模式,表明要创建一个配置文件

:指定配置文件将保存的目录路径。
:指定要创建的配置文件的名称。

其中,如果我们把写成一句话木马,文件名写成 /tmp/cmd.php

这样,pear就会在 tmp 目录下创建一个包含一句话木马的配置文件。此时,我们再利用 ctf 题目本身的文件包含,包含这个一句话就能实现远控了。

那么,怎么调用到这个 pear 命令行工具呢?

pearcmd.php

pearcmd.php 的默认路径是 /usr/local/lib/php/pearcmd.php

这个文件的第64行 调用了一个 readPHPArgv() 方法来获取参数

https://github.com/AppStateESS/phpwebsite/blob/master/lib/pear/pearcmd.php

image-20240511114700499

这个方法在 Getopt.php 的第273行定义

https://github.com/AppStateESS/phpwebsite/blob/master/lib/pear/Console/Getopt.php

function readPHPArgv(){global $argv;if (!is_array($argv)) {if (!@is_array($_SERVER['argv'])) {if (!@is_array($GLOBALS['HTTP_SERVER_VARS']['argv'])) {return PEAR::raiseError("Console_Getopt: Could not read cmd args (register_argc_argv=Off?)");}return $GLOBALS['HTTP_SERVER_VARS']['argv'];}return $_SERVER['argv'];}return $argv;}

这个函数先尝试获取$argv,如果不存在就再尝试$_SERVER['argv'],后者我们可通过query-string控制。

$argv 是命令行输入的参数,在ctf场景几乎用不到这个条件。

关键是这个 $_SERVER['argv'],这是我们可以控制的

$_SERVER['argv']

大佬原文的 0x06 的部分提到了这个参数的读取原理

https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html

docker环境下的 php.ini 会默认开启 register_argc_argv 这个配置

image-20240511115527862

开启这个配置之后,我们get请求的参数就会被读取进 $_SERVER['argv'] 里

像这样

image-20240511115919454

我们能在 phpinfo 里看到这个 $_SERVER['argv'] 的值

image-20240511124018497

利用链

假设题目为:

<?php include($_GET['file']); ?>

那么我们可以构造如下请求(方便演示,这里写入 phpinfo )

/test.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php<?=phpinfo()?>+/tmp/hello.php

此时,服务端接收到的 $_SERVER[‘argv’] 参数就会是这种形式

image-20240511130104687

这里有个坑:请求里的尖括号会被url编码

可以使用burp抓包,并直接修改回原来的符号

由于包含了 pearcmd.php ,那么接收到的参数就会传入pear工具,等价于执行以下命令:

pear config-create /&file=/usr/local/lib/php/pearcmd.php<?=phpinfo()?> /tmp/hello.php

执行这条命令后,会在 /tmp目录下创建一个hello.php的文件,这个文件里面就会带有上面那条命令里的第二个参数(含有一句话木马的字符串)

执行成功后一般会返回如下页面

image-20240511131215178

此时再文件包含生成的 /tmp/hello.php,即可执行 phpinfo() 命令

/test.php?file=/tmp/hello.php

image-20240511131548455

坑点:如果包含文件后发现尖括号被编码了,像这样

image-20240511131851970

那么就不要用浏览器发起请求,直接用 burp 抓包修改回尖括号

同理,phpinfo 换成经典一句话,就可以实现命令执行。

总结

  1. 文件包含 pearcmd.php
  2. get 请求传入 参数列表(1. config-create模式 2. 一句话木马 3. 生成文件的位置)
  3. 文件包含生成的一句话木马文件,实现命令执行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/30188.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

怎么把excel里已经变成科学记数法的数字恢复

从数据库导出的数据经常有id字段,包含一长串的数字,导出为excel或者csv格式后打开,id字段经常被转换成科学技术法了,不方便查看。 如果想把它转变为通常的显示方法,在单元格上点击鼠标右键,点击“设置单元格格式”。 在打开的窗口中,切换到“数字”选项卡,点击“自定义…

架构每日一学 4:成为首席架构师,你必须学会顺应人性

本文首发于公众平台:腐烂的橘子架构师生存法则之二:架构活动需要顺应人性 程序员入行的第一天起就进入了一个机器的世界。在别人的眼中,程序员平时很少说话,更多的时间在和电脑打交道。 程序员工作时间久了大脑会被格式化,就像一个一个方格。它有一定好处,就是你在写代码…

C# 实现Ping远程主机功能

C#实现Ping远程主机功能。1、引用nuget包 Wesky.Net.OpenTools OpenTools是一个用于提高开发效率的开源工具库。该项目为个人开源项目,采用MIT开源协议,永不更改协议。开源项目地址: Gitee:https://gitee.com/dreamer_j/open-tools.gitGithub:https://github.com/LittleLitt…

采用flex布局,父组件width为百分比,解决子组件canvas画布width自适应问题

创建EleResize.js文件(拷贝以下代码即可)var EleResize = {_handleResize: function (e) {var ele = e.target || e.srcElementvar trigger = ele.__resizeTrigger__if (trigger) {var handlers = trigger.__z_resizeListenersif (handlers) {var size = handlers.lengthfor …

VMware SD-WAN 6.0 发布(含下载) - 领先的 SD-WAN 解决方案

VMware SD-WAN 6.0 发布(含下载) - 领先的 SD-WAN 解决方案VMware SD-WAN 6.0 发布(含下载) - 领先的 SD-WAN 解决方案 VMware VeloCloud SD-WAN, 全球 SD-WAN 领导者 请访问原文链接:https://sysin.org/blog/vmware-sd-wan-6/,查看最新版。原创作品,转载请保留出处。 作…

Copilot - OpenAI与GitHub联合出品的自动代码生成AI+VirtualLCD - 可用于 GUI 移植的 LCD 模拟器

1、AntOS - 适用 8051 的超轻量级实时操作系统 AntOS 是一款超轻量级实时操作系统,抢占式调度极简内核,专门为小型家电及轻量型物联网终端设计,适合在8051为内核的MCU上运行。项目主页: https://gitee.com/zeweni/ant-osAntOS 提供层级服务,可以进行任意裁剪。内核层包含两…

nRF51_Platform - 基于nRF51平台(蓝牙4.0)的轻量级SDK+AliOS Things - 阿里出品轻量级物联网嵌入式操作系统

1、AliOS Things - 阿里出品轻量级物联网嵌入式操作系统 AliOS Things 发布于2017年杭州云栖大会, 是 AliOS 家族旗下的、面向IoT领域的、高可伸缩的物联网操作系统。AliOS Things 致力于搭建云端一体化IoT基础设施,具备极致性能、极简开发、云端一体。项目主页: https://gi…

SciTech-Mathmatics-ProbabilitiesAndStatistics-Distribution-is-all-you-need: 概率统计到深度学习

Distribution-is-all-you-need 概率统计到深度学习,四大技术路线图谱,都在这里! https://github.com/graykode/distribution-is-all-you-need 自然语言处理路线图: 数学基础 -> 语言基础 -> 模型和算法 项目作者:Tae-Hwan Jung, Github:graykode, 2019-09-30 13:35,…