利用IAT hook實現windows通用密碼後門

2021-04-17 23:26:11 字數 3039 閱讀 5037

windows有通用密碼嗎?

去問比爾大叔吧。

先不管是不是真的有,我們可以自己實現乙個這樣的後門。

先簡單介紹一下windows登陸過程中的一些過程。

winlogon程序用gina.dll獲取使用者名稱和密碼,通過lpc傳給lsass程序。

然後lsass程序呼叫預設認證包msv1_0.dll來驗證密碼的對錯。

而msv1_0則從sam中獲得使用者的資訊,包括密碼的雜湊。

要實現這樣乙個後門,首先要找到登陸驗證這一系列函式的最底層的乙個,然後在那裡做手腳。

很明顯,這個最底層的函式在lsass程序的msv1_0.dll模組中。

lsass呼叫msv1_0.dll的是這個函式:

**:

msv1_0!lsaaplogonuserex2

lsaaplogonuserex2 in msdn

那我們就應該除錯lsass程序然後在msv1_0!lsaaplogonuserex2下斷點。

這裡我使用windbg和vmware並利用dbgsrv進行遠端的使用者態除錯。

上面spat在blog中介紹了如何用dbgsrv除錯(debugging lsa via dbgsrv.exe)。

在虛擬機器(被除錯端)執行

**:

dbgsrv.exe -t tcp:port=1234,password=spat

然後在除錯端執行

**:

windbg.exe -premote tcp:server=192.168.1.102,port=1234,password=spat

然後選擇附加lsass程序。

但這裡我們不能登陸之後再執行dbgsrv,那樣dbgsrv就被關掉了,所以我利用windows的任務計畫讓dbgsrv開機就執行起來。

虛擬機器啟動後,dbgsrv也起來了,然後用windbg連上並附上lsass程序。

在下了斷點msv1_0!lsaaplogonuserex2後,讓lsass繼續執行。

然後登陸,果然windbg斷下來了。

這個時候給大家介紹windbg的乙個強勁的命令,那就是wt,它能所有的記錄函式呼叫關係,一直記錄到ret,具體用法請看windbg幫助。

我猜wt是單步執行,所以很慢。

但是wt輸出的文字很多,太難看了,於是我寫了個python指令碼把wt的輸出轉成乙個treectrl,附圖:

大家注意看我滑鼠點上的那個函式:ntdll!rtlcomparememory。

經過除錯我發現這個函式就是我要找的那個「最底層的函式」。

**:

size_t

rtlcomparememory(

in const void  *source1,

in const void  *source2,

in size_t  length

);

rtlcomparememory in msdn

並且我還發現了驗證密碼時這個函式3個引數的細節,

source1是從sam中取出的使用者密碼的unicode形式的md4雜湊,

source2是使用者輸入的密碼的unicode形式的md4雜湊,

length總是16,因為md4的雜湊就是16位。

很容易我寫出了下面這個替代的函式:

**:

int winapi myrtlcomparememory(void *a, void *b, int len)

其中prtlcomparememory是全域性變數,是真正的rtlcomparememory的位址,passwd_hash是通用密碼的雜湊。

使用myrtlcomparememory來hook掉rtlcomparememory,就可以實現預定的功能了。

如果要比較的是16位的,並且第二段記憶體與我們的雜湊一樣那就直接放行,不管第一段記憶體是什麼。

也許有朋友會問,你這是hook了msv1_0模組內所有呼叫rtlcomparememory的地方,不會出錯嗎?

放心吧,哪有那麼巧,要比較的是16位的而且第二段記憶體又和我們的雜湊一模一樣?

要hook這個函式有很多方法,

我選擇了最懶的一種,iat hook+dll注入。

於是我寫了乙個小工具來注入dll:dllinject

**:

c:/documents and settings/cly/桌面/bin>injectdll.exe

injectdll v0.1

inject/uninject a dll file to a process, by cly, at 20080522

usage:

injectdll.exe (-i | -u | -u) pid filename

-i: inject

-u: uninject once

-u: uninject at all

passdoor.dll是要注入到lsass程序的dll,這個dll在dllmain中實現了iat hook,很土的技術了,就不貼**了,網上一搜一籮筐。

然後我又寫了乙個小工具:pdconfig

其實就是改passdoor.dll中的雜湊,以免要換密碼是又要重新編譯passdoor.dll。

使用方法:

**:

injectdll.exe -i pid_of_lsass full_path_of_passdoor.dll

解除安裝方法:

這裡是本文中相關工具的原始碼以及編譯好的二進位制檔案。

其中包括injectdll.exe, passdoor.dll和pdconfig.exe,所有**均使用mingw gcc4.2.1編譯。

鬱悶,不能傳附件。

在Windows上實現遠端IAT hook

iat hook,就是我們要hook的目標函式在匯入表it中,通過修改目標函式所在iat中項的位址為我們自定義函式的位址,從而實現函式hook。在這裡我們要hook的目標是乙個遠端程序,採用之前部落格 windows上的程序注入 一文中用到的反射式dll注入這一技術,在其中新增額外的iat hook...

利用rsync從linux同步到windows

命令裡面的具體引數 說明 a 引數,相當於 rlptgod,r 是遞迴 l 是鏈結檔案,意思是拷貝鏈結檔案 p 表示保持檔案原有許可權 t 保持檔案原有時間 g 保持檔案原有使用者組 o 保持檔案原有屬主 d 相當於塊裝置檔案 z 傳輸時壓縮 p 傳輸進度 v 傳輸時的進度等資訊,和 p有點關係,自...

利用FTP將Linux檔案備份到Windows

windows windows server 2008 linux centos release 5.5 final 首先在windows上安裝好ftp,本人使用的是windows server 2008自帶的iis,安裝過程這裡略過 iis安裝完成後,在 項右擊新增ftp站點,新增乙個單獨用來備份...