域滲透——Hook PasswordChangeNotify

wyzsk發表於2020-08-19
作者: 三好學生 · 2016/03/21 10:30

0x00 前言


在之前的文章中介紹了兩種維持域控許可權的方法——SSPSkeleton Key,這兩種方法均需要藉助Mimikatz來實現,或多或少存在一些不足,所以這次接著介紹一個更加隱蔽且不需要使用Mimikatz的後門方法——Hook PasswordChangeNotify.

Alt text

0x01 簡介


Hook PasswordChangeNotify這個概念最早是在2013年9月15日由clymb3r提出,透過Hook PasswordChangeNotify攔截修改的帳戶密碼。

需要了解的相關背景知識如下:

  1. 在修改域控密碼時會進行如下同步操作:

    a. 當修改域控密碼時,LSA首先呼叫PasswordFileter來判斷新密碼是否符合密碼複雜度要求 b. 如果符合,LSA接著呼叫PasswordChangeNotify在系統上同步更新密碼

  2. 函式PasswordChangeNotify存在於rassfm.dll

  3. rassfm.dll可理解為Remote Access Subauthentication dll,只存在於在Server系統下,xp、win7、win8等均不存在

  4. 可以使用dumpbin檢視rassfm.dll匯出函式來驗證結論2:

    #!bash
    dumpbin /exports c:\windows\system32\rassfm.dll
    

如圖 Alt text

0x02 特點


對於之前介紹過的Security Support Provider,在實際使用過程中不可避免的會有以下不足:

  1. 安裝後需要重啟系統
  2. 需要在System32資料夾下放置dll
  3. 需要修改登錄檔

而使用Hook PasswordChangeNotify卻有如下優點:

  1. 不需要重啟
  2. 不需要修改登錄檔
  3. 甚至不需要在系統放置dll

可以說在隱蔽性上,使用Hook PasswordChangeNotify優於Security Support Provider

0x03 技術實現


根據clymb3r提供的poc,實現Hook PasswordChangeNotify共包含兩部分:

1、Hook dll

下載連結:
https://github.com/clymb3r/Misc-Windows-Hacking
(1)為PasswordChangeNotify建立一個inline Hook,將初始函式重定向到PasswordChangeNotifyHook
(2)在PasswordChangeNotifyHook中實現記錄密碼的操作,然後重新將控制權交給PasswordChangeNotify

2、dll注入

可以利用 Powershell tricks中的Process Injection將我們自己編寫的dll注入到lsass程式,實現Hook功能

0x04 實際測試


測試環境:

Server 2008 R2 x64
Server 2012 R2 x64

測試步驟:

1、生成Hook dll

poc下載地址:
https://github.com/clymb3r/Misc-Windows-Hacking

使用VS2015開發環境,MFC設定為在靜態庫中使用MFC
編譯工程,生成HookPasswordChange.dll

Alt text

2、生成dll注入的powershell指令碼

下載Powershell的dll注入指令碼
https://github.com/clymb3r/PowerShell/blob/master/Invoke-ReflectivePEInjection/Invoke-ReflectivePEInjection.ps1

在程式碼尾部新增如下程式碼:

Invoke-ReflectivePEInjection -PEPath HookPasswordChange.dll –procname lsass

並命名為HookPasswordChangeNotify.ps1

3、Hook PasswordChangeNotify

上傳HookPasswordChangeNotify.ps1和HookPasswordChange.dll

管理員許可權執行:

#!bash
PowerShell.exe -ExecutionPolicy Bypass -File HookPasswordChangeNotify.ps1

如圖 Alt text

4、自動記錄新密碼

在Server 2012 R2 x64下,手動修改域控密碼後
在C:\Windows\Temp下可以找到passwords.txt,其中記錄了新修改的密碼

如圖 Alt text

在Server 2008 R2 x64下,同樣成功

如圖 Alt text

0x05 小結


本文依舊是對常規功能做了演示,後續可自定義dll程式碼實現更多高階功能,如自動上傳新密碼。

以下連結中的程式碼可作為參考,其中實現了將獲取的新密碼上傳至Http伺服器

http://carnal0wnage.attackresearch.com/2013/09/stealing-passwords-every-time-they.html

使用Hook PasswordChangeNotify來記錄新密碼,如果放在以前,程式注入的操作很容易被檢測,但是得益於Powershell應用的發展,透過Powershell來程式注入可以繞過常規的攔截。

當然,Hook PasswordChangeNotify僅僅是眾多Hook方法中的一個。

我已經Fork了clymb3r的程式碼,並結合本文需要的程式碼做了更新,下載地址如下:

https://github.com/3gstudent/Hook-PasswordChangeNotify

0x06 參考資料


本文由三好學生原創並首發於烏雲drops,轉載請註明

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章