Pocsuite 插件编写
插件信息
漏洞名称:漏洞编号 产品厂商 产品名称 漏洞特征( 端点... )漏洞类型
例:CVE-2024-51567 CyberPanel upgrademysqlstatus 命令执行漏洞
文件读取
漏洞检测
读取特征然后尝试使用正则去匹配:
read_file 要检测一下是不是蜜罐,所以包含再 HTML 里面的就要提取好完整的结果。而不是直接返回 res.text。
漏洞利用
如果可以读取 .ssh 下面的密钥,可以实现远程登陆,还是比较有用的。
https://www.runoob.com/w3cnote/set-ssh-login-key.html
SonicWALL Apache HTTP 任意文件读取漏洞可以读取 sqlite3 格式的配置文件,但是发现原生字符串直接存储到系统中导致无法还原。
所以需要存储为 base64
特殊情况
响应内容为:
只能使用 socket 去提取:
命令执行
有回显
有回显检测比较简单,输出随机的字符串即可,但是在 exec 中需要谨慎对待,因为很多会返回 xxx command not found,所以还是需要特殊情况特殊对待,写完后跑一遍,找找特殊情况。
无回显
无回显分为两种情况:
- 有写入文件权限
- 写 webshell
- 写 web 静态文件
- 远程下载( sh | bat )
- 无写入文件权限
- dnslog 检测
- 延时检测
- httplog 外带获取回显
写静态文件
把命令执行的结果直接写入 txt 或者其他类型的文件,然后读取结果再删掉文件。
这个比较常用,因为一些可以写小马的环境比如 PHP、JSP 等可能会出现杀软杀掉。
有特殊情况写的文件需要再加一层赋予权限的操作才能读 chmod 777 file_path ( CVE-2024-3400 )
dnslog
httplog
httplog 是对于哪些写不了文件的,权限比较低但是又想要回显的情况。
通过 self.ish.poll() 获取 http 协议的请求获取命令执行的结果。
ish 响应:
封装为对应的函数如下:
延时检测
对于不出网的情况的漏洞检测。
利用:timeout、sleep、ping 等命令造成延时
有 sleep 的可以类似 sql 注入的延时检测:
- 延时后的时间 > 延时时间(随机 20 ~ 30 s) > 正常请求
没有的使用 ping:
- ping 15 次时间 > ping 10 次 > ping 5 次
这类 poc 可以增加一个检测日志,执行的命令,响应所用的秒数,用于人工看的时候可以明显判定非误报。
测试漏洞:CVE-2023-46359 Salia PLCC cPH2 命令执行漏洞
测试情况:
- 共 58 条 url
- dnslog 检测结果:7 个
- sleep 检测结果:随机 30 ~ 40s | 结果:7 个
- ping 检测结果:分别 ping 30、20、10、1 次 | 结果:6 个
- 没有误报的
sleep 类型:
ping 类型:
测试日志:
具体代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | |
特殊情况
回显到响应头
解决方法:
- 构造合法 header
- 写到文件后读取
合法 header:
Python 就可以解析:
写入文件:
回显位置响应体或者响应头
CVE-2024-10914 D-Link NAS account_mgr.cgi name 参数命令注入漏洞
所以只能使用 sockt 完成 http 请求,然后利用 echo "
中文编码问题
首先尝试解码如 gbk 测试网站:http://www.mytju.com/classcode/tools/messycoderecover.asp
这个不行,换一种思路,通过 powershell 输出 base64 的形态,然后再解码获取正确的中文( 之前遇到一个数据库 postgresql 命令执行会因为编码问题报错,也是这样解决的 )
那么对于正常的可以使用 GBK 解码的就可以这样:
系统类型
命令执行需要先判断系统类型( windows | linux ),之前使用的是 whoami 的形式,windows whoami 有一个斜杠,而 linux 没有:
但是有些漏洞就会出现问题,比如出现没有 whoami 或者 linux 的 whoami 结果是一个报错的但是报错中包含有斜杆的就会导致失误。
更换为了多个命令判断:
windows:
- echo %OS% => Windows_NT( linux 就会正常的 %OS% )
- ver => Microsoft Windows [版本 10.0.22631.4037]
linux:
- uname => Linux
而且获取多次可能会导致一次获取到一次不行。
修改为判断漏洞是否存在后就判断能否获取到操作系统:
文件上传
漏洞检测
最简单准确的做法,通过输出 MD5 或者随机字符串:
PHP:
JSP:
漏洞利用
通过 pocsuite3 上传小马进行命令执行
- 上传小马
- 访问检测是否上传成功
- 命令执行
- 删除自身( 在上传的小马中写好自删除的逻辑 )
常用小马
PHP
普通小马
命令执行函数存在限制的简单绕过小马( 哥斯拉的 )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | |
重新写一个命令执行的小马,对于一些限制上传种有 system 这种函数的简单绕过
JSP
ASP
ASPX
提取结果的脚本
ASMS
SQL注入
有回显
漏洞检测
通过输出特殊字符串或者 MD5 来判断( 和命令执行相同 )
写一个 exec_sql 用于执行给定的 SQL 语句。
漏洞利用
- 插入后台用户 GetShell => CVE-2024-27956 WP-Automatic Plugin SQL 注入漏洞( 插入管理员账号,登录上传带有 shell 的插件 )
- 正常的获取数据库结构
- 有返回长度限制的,一个一个查 => Saber 企业级开发平台 menu/list SQL注入
- 没有的,直接 group_concat
示例
用友 U8 Cloud approveservlet SQL 注入漏洞
SQL Server 的数据库第一次遇到
UNION 联合注入类型:
数据库基本信息:
数据库结构:
因为是 UNION 的查出来的也就是单个的字段显示,而 SQL Server 版本低,不能使用拼接函数,所有通过 FOR XML PATH 拼接结果为字符串。














