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_trtlcomparememory(
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.exeinjectdll 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站點,新增乙個單獨用來備份...