註:以下文章非本人撰寫為中國大陸網路轉載文章,並經本人整理。
來源:Cmd模式下的入侵技术大全<黑客该有的技术>
作者:HMC
##CONTINUE##
註:為免版面凌亂[----]中間所包夾的範圍為指令或程式碼。
前言:
Cmd Shell(命令列介面)是駭客永恆的話題,它歷史悠久並且長盛不衰。
本文旨在介紹和總結一些在命令列下控制Windows系統的方法。這些方法都是盡可能地利用系統內建的工具實現的。
註冊表、服務和群組原則篇:
先說註冊表。很多命令列下存取註冊表的工具都是互動式的,溢出產生的shell一般不能再次重定向輸入/輸出流,所以無法使用。
好在系統內建的regedit.exe足夠用了。
1:讀取註冊表:
先將想查詢的註冊表項匯出,再用type查看,比如:
C:\>regedit /e 1.reg "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp"
C:\>type 1.reg | find "PortNumber"
"PortNumber"=dword:00000d3d
C:\>del 1.reg
所以終端服務的埠是3389(十六進位d3d)
2:修改/刪除註冊表項:
先echo一個reg檔,然後導入,比如:
--------------------------------------------------------------------
echo Windows Registry Editor Version 5.00 >1.reg
echo. >>1.reg
echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\TelnetServer\1.0] >>1.reg
echo "TelnetPort"=dword:00000913 >>1.reg
echo "NTLM"=dword:00000001 >>1.reg
echo. >>1.reg
regedit /s 1.reg
--------------------------------------------------------------------
將telnet服務埠改為2323(十六進位913),NTLM認證方式為1。
要刪除一個項,在名字前面加減號,比如:
[-HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Serv-U]
要刪除一個值,在等號後面用減號,比如:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
"KAVRun"=-
3:用inf檔存取註冊表:
上面對註冊表的三個操作,也可以用下面這個inf檔來實現:
--------------------------------------------------------------------
[Version]
Signature="$WINDOWS NT$"
[DefaultInstall]
AddReg=My_AddReg_Name
DelReg=My_DelReg_Name
[My_AddReg_Name]
HKLM,SOFTWARE\Microsoft\TelnetServer\1.0,TelnetPort,0x00010001,2323
HKLM,SOFTWARE\Microsoft\TelnetServer\1.0,NTLM,0x00010001,1
[My_DelReg_Name]
HKLM,SYSTEM\CurrentControlSet\Services\Serv-U
HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Run,KAVRun
將它寫入c:\path\reg.inf然後用下面這個命令"安裝":
rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:\path\reg.inf
--------------------------------------------------------------------
幾點說明1:
1:[Version]和[DefaultInstall]是必須的,AddReg和DelReg至少要有一個。My_AddReg_Name和My_DelReg_Name可以自訂。
0x00010001表示REG_DWORD資料類型,0x00000000或省略該項(保留逗號)表示REG_SZ(字串)。0x00020000表示REG_EXPAND_SZ。
2323也可以用0x913代替。
關於inf檔的詳細資訊,可以參考DDK説明文檔。
2:InstallHinfSection是大小寫敏感的。它和setupapi之間只有一個逗號,沒有空格。
128表示給定路徑,該參數其他取值及含義參見MSDN。
特別注意,最後一個參數,必須是inf檔的全路徑,不要用相對路徑。
3:inf檔中的專案都是大小寫不敏感的。
接下來說服務。如果想啟動或停止服務,用net命令就可以。但想增加或刪除服務,需要用SC,instsrv.exe,xnet.exe等工具。而這些工具系統沒有自帶(XP和2003自帶SC)。導入註冊表雖然可以,但效果不好,原因後面會提到。還是得靠inf檔出馬。
增加一個服務:
--------------------------------------------------------------------
[Version]
Si
gnature="$WINDOWS NT$"
[DefaultInstall.Services]
AddService=inetsvr,,My_AddService_Name
[My_AddService_Name]
DisplayName=Windows Internet Service
Descrīption=提供對 Internet 資訊服務管理的支援。
ServiceType=0x10
StartType=2
ErrorControl=0
ServiceBinary=%11%\inetsvr.exe
--------------------------------------------------------------------
保存為inetsvr.inf,然後:
rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:\path\inetsvr.inf
這個例子增加一個名為inetsvr的服務(是不是很像系統自帶的服務,呵呵)。
幾點說明2:
1:最後四項分別是:
服務類型:0x10為獨立進程服務,0x20為共用進程服務(比如svchost);
啟動類型:0 系統引導時載入,1 OS初始化時載入,2 由SCM(服務控制管理器)自動啟動,3 手動啟動,4 禁用。(注意,0和1只能用於驅動程式)
錯誤控制:0 忽略,1 繼續並警告,2 切換到LastKnownGood的設置,3 藍屏。
服務程式位置:%11%表示system32目錄,%10%表示系統目錄(WINNT或Windows),%12%為驅動目錄system32\drivers。其他取值參見DDK。你也可以不用變數,直接使用全路徑。這四項是必須要有的。
2:除例子中的六個項目,還有LoadOrderGroup、Dependencies等。不常用所以不介紹了。
3:inetsvr後面有兩個逗號,因為中間省略了一個不常用的參數flags。
刪除一個服務:
--------------------------------------------------------------------
[Version]
Signature="$WINDOWS NT$"
[DefaultInstall.Services]
DelService=inetsvr
--------------------------------------------------------------------
很簡單,不是嗎?
當然,你也可以通過導入註冊表達到目的。
但 inf 自有其優勢。
1:匯出一個系統內建服務的註冊表項,你會發現其執行路徑是這樣的:
"ImagePath"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,\
74,00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,74,\
00,6c,00,6e,00,74,00,73,00,76,00,72,00,2e,00,65,00,78,00,65,00,00,00
可讀性太差。其實它就是%SystemRoot%\system32\tlntsvr.exe,但資料類型是REG_EXPAND_SZ。當手動導入註冊表以增加服務時,這樣定義ImagePath顯然很不方便。如果用REG_SZ代替會有些問題--不能用環境變數了。即只能使用完整路徑。用inf檔完全沒有這個問題,ServiceBinary(即ImagePath)自動成為REG_EXPAND_SZ。
2:最關鍵的是,和用SC等工具一樣,inf檔的效果是即時起效的,而導入reg後必須重啟才有效。
3:inf 檔會自動為服務的註冊表項添加一個Security子鍵,使它看起來更像系統內建的服務。
另外,AddService和DelService以及AddReg、DelReg可以同時且重複使用。即可以同時增加和刪除多個服務和註冊表項。詳細的內容還是請查看DDK。
--------------------------------------------------------------------
最後說明群組原則。群組原則是建立Windows安全環境的重要手段,尤其是在Windows 網域環境下。一個出色的系統管理員,應該能熟練地掌握並應用群組原則。在視窗介面下訪問群組原則用gpedit.msc,命令列下用secedit.exe。
先看secedit命令語法:
secedit /analyze
secedit /configure
secedit /export
secedit /validate
secedit /refreshpolicy
這5個命令的功能分別是分析群組原則、配置群組原則、匯出群組原則、驗證範本語法和更新群組原則。其中secedit /refreshpolicy 在XP/2003下被gpupdate代替。這些命令具體的語法自己在命令列下查看就知道了。
與存取註冊表只需reg檔不同的是,存取群組原則除了要有個範本檔(還是inf),還需要一個安全資料庫檔(sdb)。要修改群組原則,必須先將範本導入安全資料庫,再通過應用安全資料庫來刷新群組原則。來看個例子:
假設我要將密碼長度最小值設置為6,並啟用"密碼必須符合複雜性要求",那麼先寫這麼一個範本:
--------------------------------------------------------------------
[version]
signature="$CHICAGO$"
[System Access]
MinimumPasswordLength = 6
PasswordComplexity = 1
--------------------------------------------------------------------
保存為gp.inf,然後導入:
secedit /configure /db gp.sdb /cfg gp.inf /quiet
這個命令執行完成後,將在目前的目錄產生一個gp.sdb,它是"中間暫存產品",你可以刪除它。
/quiet參數表示"安靜模式",不產生日誌。但根據我的試驗,在2000sp4下該參數似乎不起作用,XP下正常。日誌總是保存在%windir%\security\logs\scesrv.log。你也可以自己指定日誌以便隨後刪除它。比如:
--------------------------------------------------------------------
secedit /configure /db gp.sdb /cfg gp.inf /log gp.log
del gp.*
--------------------------------------------------------------------
另外,在導入範本前,還可以先分析語法是否正確:
secedit /validate gp.inf
那麼,如何知道具體的語法呢?當然到 MSDN 裡找啦。也有偷懶的辦法,因為系統內建了一些安全範本,在 %windir%\security\templates 目錄下。打開這些範本,基本上包含了常用的安全設置語法,一看就懂。
再舉個例子:關閉所有的"稽核原則"。(它所審核的事件將記錄在事件檢視器的"安全性"裡)。
echo版本:
--------------------------------------------------------------------
echo [version] >1.inf
echo signature="$CHICAGO$" >>1.inf
echo [Event Audit] >>1.inf
echo AuditSystemEvents=0 >>1.inf
echo AuditObjectAccess=0 >>1.inf
echo AuditPrivilegeUse=0 >>1.inf
echo AuditPolicyChange=0 >>1.inf
echo AuditAccountManage=0 >>1.inf
echo AuditProcessTracking=0 >>1.inf
echo AuditDSAccess=0 >>1.inf
echo AuditAccountLogon=0 >>1.inf
echo AuditLogonEvents=0 >>1.inf
secedit /configure /db 1.sdb /cfg 1.inf /log 1.log /quiet
del 1.*
--------------------------------------------------------------------
也許有人會說:群組原則不是保存在註冊表中嗎,為什麼不直接修改註冊表?
原因為:不是所有的群組原則都保存在註冊表中。比如"稽核原則"就不是。你可以用regsnap比較修改該策略前後註冊表的變化。我測試的結果是什麼都沒有改變。只有"管理範本"這一部分是完全基於註冊表的。而且,知道了具體位置,用哪個方法都不複雜。
例如,XP和2003的"本機安全性原則"-->"本機原則"-->"安全性選項"增加了一個"網路存取:共用和安全性模式用於本機帳戶"的規則。XP下預設是"僅適用於Guest來賓"。這就是為什麼用管理員帳號連接XP的ipc$仍然只有Guest許可權的原因。可以通過導入reg檔修改它:
--------------------------------------------------------------------
echo Windows Registry Editor Version 5.00 >1.reg
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa] >>1.reg
echo "forceguest"=dword:00000000 >>1.reg
regedit /s 1.reg
del 1.reg
--------------------------------------------------------------------
而相應的用inf,應該是:
--------------------------------------------------------------------
echo [version] >1.inf
echo signature="$CHICAGO$" >>1.inf
echo [Registry Values] >>1.inf
echo MACHINE\System\CurrentControlSet\Control\Lsa\ForceGuest=4,0 >>1.inf
secedit /configure /db 1.sdb /cfg 1.inf /log 1.log
del 1.*
--------------------------------------------------------------------
關於命令列下讀取群組原則的問題。
系統預設的安全資料庫位於%windir%\security\database\secedit.sdb,將它匯出至 inf 文件:
secedit /export /cfg gp.inf /log 1.log
沒有用/db參數指定資料庫就是採用預設的。然後查看gp.inf。
不過,這樣得到的只是群組原則的一部分(即"Windows設定")。而且,某個規則如果未配置設定,是不會被匯出的。比如"重新命名系統管理員帳戶",只有被定義了才會在inf檔中出現NewAdministratorName="xxx"。對於無法匯出的其他的群組原則只有通過存取註冊表來獲得了。
此辦法在XP和2003下無效:可以匯出但內容基本是空的。原因不明。根據官方的資料,XP和2003顯示群組原則用RSoP(群組原則結果集)。相應的命令列工具是gpresult。但是,它獲得的是在系統啟動時被附加(來自網域)的群組原則,單機測試結果還是"空"。所以,如果想知道某些群組原則是否被設置,只有先寫一個inf,再用secedit /analyze,然後查看LOG了。
--------------------------------------------------------------------
相關連結:
Cmd模式下的入侵:檔案傳輸篇
Cmd模式下的入侵:網路配置篇