• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            tqsheng

            go.....
            隨筆 - 366, 文章 - 18, 評(píng)論 - 101, 引用 - 0
            數(shù)據(jù)加載中……

            寬帶撥號(hào)連接密碼恢復(fù)原理

             

            技術(shù)可以通過努力學(xué)習(xí)而有所成就,但攻防的思維方式即使苦心鉆研往往也無大的收獲,就得多多借鑒高手的經(jīng)驗(yàn)了……

             

             編者按:在讀者來信中,經(jīng)常有朋友詢問如何做一名成功的黑客或安全專家,如何才能找到好的安全技術(shù)學(xué)習(xí)方法。其實(shí),除了掌握一些必備的基礎(chǔ)知識(shí)和工具外,還要懂得編程等技術(shù);另外攻防思路的養(yǎng)成和培訓(xùn)也是很重要的。因?yàn)榧夹g(shù)可以通過努力學(xué)習(xí)而有所成就,但攻防的思維方式即使苦心鉆研往往也無大的收獲,就得多多借鑒高手的經(jīng)驗(yàn)了。在本文中,作者通過對(duì)NT平臺(tái)撥號(hào)連接密碼恢復(fù)原理的研究,層層索引,步步入微的思維方法就值得推薦。

              前段時(shí)間我的ADSL密碼忘記了,但幸好還保存在撥號(hào)連接里面,于是我到網(wǎng)上找了些星號(hào)密碼顯示工具,可惜不起作用。后來找到一種名為Dialupass的工具,這家伙不負(fù)我所望,把密碼給我還原出來了 (用的Dialupass v2.42,我的系統(tǒng)是Windows XP) 。抱著濃厚的興趣,我決定深入研究。略有收獲,愿與大家共享。

              Dialupass星號(hào)密碼顯示之謎

              看上去,Dialupass是非普通的星號(hào)密碼顯示工具,那它的原理是什么呢?上Google查了一番,沒找到相關(guān)資料。一生氣便抄起家伙——Windbg,準(zhǔn)備把它大卸八塊。郁悶的是,用Windbg加載后,密碼就不能還原出來了,顯示的是星號(hào)。換替補(bǔ)Ollydbg上場(chǎng),情況依舊。怪了,莫非這小工具有Anti-Debug功能?當(dāng)時(shí)只是一絲懷疑,因?yàn)閷?shí)在不相信這樣的小工具作者會(huì)花心思來保護(hù)。

              小知識(shí):

              Windbg工具:

              Windbg是微軟開發(fā)的免費(fèi)源碼級(jí)調(diào)試工具。可以用于Kernel模式調(diào)試和用戶模式調(diào)試,還可以調(diào)試Dump文件。

              Anti-Debug技術(shù):

              Anti-Debug,即反跟蹤技術(shù)。防止 Cracker 用 SoftICE 之類的調(diào)試器動(dòng)態(tài)跟蹤,分析軟件。反跟蹤技術(shù)一般是具有針對(duì)性的,即針對(duì)某種調(diào)試器的反跟蹤,而不能防止所有的調(diào)試器跟蹤。

              在用S-ICE跟蹤的過程中,發(fā)現(xiàn)有這么一個(gè)調(diào)用:GetProcAddress(xx, “IsDebugPresent”)。原來真的有Anti-Debug功能,好在比較簡(jiǎn)單。統(tǒng)計(jì)了一下,總共有五處進(jìn)行了Anti-Debug檢查。

              OK,情況查明了,便換回Windbg來調(diào)試。在Windbg里面有這么一個(gè)斷點(diǎn)可繞過Anti-Debug檢測(cè):bp KERNEL32!IsDebuggerPresent “g poi(esp);r eax=0;g”。

              花了些時(shí)間跟蹤了一下,把Dialupass恢復(fù)密碼的流程都搞清楚了。這小程序貓膩還挺多的,總結(jié)如下:

              1. 關(guān)鍵函數(shù)不直接調(diào)用,而是用LoadLibraryA和GetProcAddress來獲取函數(shù)地址后再CALL;
              2. 函數(shù)名是經(jīng)過編碼的,反匯編后看字符串是看不到的;
              3. 關(guān)鍵地方一概用花指令來迷惑你和反匯編軟件。

             其實(shí)原理很簡(jiǎn)單,就是用rasapi32.dll里面的一些函數(shù)來獲取撥號(hào)連接的一些信息,再用 ADVAPI32!LsaRetrievePrivateData 函數(shù)來獲取密碼。


             

              關(guān)鍵字:LsaRetrievePrivateData和RasDialParams

              根據(jù)Dialupass的原理,寫了個(gè)類似的工具(完整的源代碼x_dialupass.c可以從.net/src/x_dialupass.c">http://security.xici.net/src/x_dialupass.c獲取)。后來用LsaRetrievePrivateData和RasDialParams做關(guān)鍵字,重新在Google搜索了一遍,找到一些類似的代碼。

              小提示:

              參考資源①和②是俄羅斯人公布的演示代碼,沒有對(duì)LsaRetrievePrivateData返回的數(shù)據(jù)進(jìn)行拆分用戶名和密碼。參考資源③是日本人公布的完整的應(yīng)用程序的代碼,可惜在對(duì)LsaRetrievePrivateData返回的數(shù)據(jù)進(jìn)行拆分處理時(shí)存在BUG,導(dǎo)致有些情況下用戶名和密碼取得不正確。

              ①http://www.lwteam.ru/modules/ne ws/article.php?storyid=167
              ②http://www.wasm.ru/forum/index.php?action=vthread&forum=12&topic=4873
              ③http://homepage2.nifty.com/spw/software/rtrick/

              后來發(fā)現(xiàn)Lsadump2 DUMP出來的數(shù)據(jù)里面包含了“LsaRetrievePrivateData”返回的數(shù)據(jù)。Lsadump2的原理大致如下:

              1.插入一個(gè)線程到Lsass.exe進(jìn)程;
              2.打開LSA Policy database;
              3.從注冊(cè)表“HKLM\SECURITY\Policy\Secrets”中枚舉子鍵;
              4.LsarOpenSecret;
              5.LsarQuerySecret。

              進(jìn)一步跟蹤后發(fā)現(xiàn),其實(shí)ADVAPI32!LsaRetrievePrivateData是通過NdrClientCall2發(fā)送RPC調(diào)用到Lsass.exe進(jìn)程,Lsass.exe里面再調(diào)用LsarOpenSecret、LsarQuerySecret來完成獲取撥號(hào)連接信息過程的(LsarOpenSecret里面有權(quán)限判斷,非Admin組用戶是沒有權(quán)限來調(diào)用ADVAPI32!LsaRetrievePrivateData的)。

              跟蹤了一下LsarQuerySecret,發(fā)現(xiàn)它返回的數(shù)據(jù)其實(shí)是從注冊(cè)表中讀取。保存撥號(hào)連接信息的注冊(cè)表鍵值為:“HKLM(HKEY_LOCAL_MACHINE的縮寫)\SECURITY\Policy\Secrets\RasDialParams!SID#0\CurrVal”。

              SID對(duì)應(yīng)的是用戶的String SID (“HKLM\SECURITY”這個(gè)鍵只有System有權(quán)限讀寫)。

              LsarQuerySecret從注冊(cè)表中讀取出來數(shù)據(jù)后,接著調(diào)用LsapCrDecryptValue函數(shù)來解密,對(duì)于同一臺(tái)機(jī)器來說,解密時(shí)用的KEY始終都是固定的,這個(gè)KEY在lsasrv.dll里面的變量名為_LsapDbSecretCipherKey。在Windows 2003里面,變量名不一樣,對(duì)應(yīng)的有兩個(gè),分別為L(zhǎng)sapDbSecretCipherKeyWrite和LsapDbSecretCipherKeyRead,但這兩個(gè)變量里面的數(shù)據(jù)是一樣的。

              LsapCrDecryptValue用的似乎是標(biāo)準(zhǔn)DES算法,解密時(shí)主要流程如下:

              lsasrv!LsapCrDecryptValue→advapi32!SystemFunction005→advapi32!DecryptDataLength→advapi32!SystemFunction002→advapi32!DES_ECB_LM→advapi32!des

              解密后,在“<<”標(biāo)志處還有一個(gè)判斷(如圖所示)。

             

              假如[esi+45h]為0的話(esi是LsarOpenSecret函數(shù)返回的Handle),它會(huì)把解密后的數(shù)據(jù)再進(jìn)行一次加密,不管是Windows 2000還是Windows 2003,這時(shí)用的KEY始終都是固定為“SystemLibraryDTC”。

              Lsadump2里面調(diào)用LsarOpenSecret得到的Handle,偏移0x45處值為1,所以LsarQuerySecret函數(shù)返回的就是解密后的數(shù)據(jù)了。

              而在調(diào)用ADVAPI32!LsaRetrievePrivateData時(shí),LsarOpenSecret返回的Handle偏移0x45處值為0x0,所以LsarQuerySecret返回的是解密后又加密的數(shù)據(jù),所以在ADVAPI32!LsaRetrievePrivateData里面還有一個(gè)對(duì)應(yīng)的解密過程。相應(yīng)地,LsapCrEncryptValue加密的主要流程如下:
              lsasrv!LsapCrEncryptValue→advapi32!SystemFunction004→advapi32!EncryptDataLength→advapi32!SystemFunction001→advapi32!DES_ECB_LM→advapi32!des

              _LsapDbSecretCipherKey是如何產(chǎn)生的?

              開始我以為在同一版本的Windows里面,_LsapDbSecretCipherKey是固定的,后來發(fā)現(xiàn)我錯(cuò)了。那么這個(gè)


            _LsapDbSecretCipherKey是如何產(chǎn)生的?流程如下:

              1.調(diào)用ntdll!NtConnectPort打開 L“\Security\WxApiPort”;
              2.調(diào)用ntdll!NtRequestWaitReplyPort得到一些數(shù)據(jù);
              ebp-40處為NtRequestWaitReplyPort返回的LPCMESSAGE:
              kd> dd ebp-40
              0006fcb8 00400028 00000002 000000dc 000000d8
              0006fcc8  00000024 00000000 00000000 00000000
              0006fcd8  00000001 00000010 00000010 fd317e3e
              0006fce8  7e24e86d d12503d3 5f7d01a8 7665f528
              kd> db ebp-14
              0006fce4  3e 7e 31 fd 6d e8 24 7e-d3 03 25 d1 a8 01 7d 5f

              3.將上述“ebp-14”處的0x10字節(jié)數(shù)據(jù)COPY到lsasrv.dll里面的_LsapDbSysKey變量。

              _LsapDbSysKey在不同的機(jī)器上面(即使版本相同)都是不一樣的。它是怎么產(chǎn)生的?有幸拜讀了Flashsky的大作后(http://www.xfocus.net/articles/200306/550.html),我才明白這就是傳說中的“SYSKEY”。用Flashsky的代碼驗(yàn)證一下:

              c:\>getsyskey
              3e 7e 31 fd 6d e8 24 7e d3 03 25 d1 a8 01 7d 5f

              跟蹤系統(tǒng)啟動(dòng)過程,可知道“\Security\WxApiPort”是由Winlogon.exe進(jìn)程創(chuàng)建的,然后Lsass進(jìn)程通過這個(gè)LPC PORT從Winlogon進(jìn)程獲取SYSKEY,隨后Winlogon進(jìn)程會(huì)關(guān)閉這個(gè)LPC PORT。所以在系統(tǒng)啟動(dòng)完成之后,用Process Explorer等工具是看不到這個(gè)LPC PORT存在的,而且在Winlogon和Lsass進(jìn)程空間都搜索不到上述SYSKEY。

              4.從注冊(cè)表“HKLM\SECURITY\Policy\PolSecretEncryptionKey”中讀取出來一段數(shù)據(jù),調(diào)用函數(shù)_LsapDbDecryptKeyWithSyskey,把它用_LsapDbSysKey來解密,_LsapDbSecretCipherKey就在解密完后的數(shù)據(jù)里面(LsapDbDecryptKeyWithSyskey函數(shù)做的其實(shí)就是MD5和RC4運(yùn)算)。

              從注冊(cè)表中獲取撥號(hào)連接密碼

              了解原理后,我們就可以直接從注冊(cè)表里面來獲取撥號(hào)連接中的密碼等數(shù)據(jù)了。但有幾個(gè)問題需要解決:

              1.原料:“HKLM\SECURITY”鍵只有SYSTEM有權(quán)限讀寫。我們可以把代碼插入到SYSTEM進(jìn)程里面去運(yùn)行,或者把這個(gè)鍵修改為ADMIN有權(quán)限讀,或者提升本進(jìn)程權(quán)限。

              2.催化劑:如何獲取_LsapDbSysKey解密用的函數(shù),_LsapDbDecryptKeyWithSyskey為非導(dǎo)出函數(shù)。可以用Flashsky的代碼來獲取SYSKEY,利用公開的MD5和RC4庫函數(shù)來解密。

              直接從Lsass.exe進(jìn)程里面搜索_LsapDbSecretCipherKey,它的結(jié)構(gòu)如下:

              typedef struct _LSA_BLOB {
              DWORD cbData;
              DWORD cbMaxData;
              BYTE  pbData;
              } LSA_BLOB;

              pbData指向存儲(chǔ)KEY的地址,KEY長(zhǎng)度固定為0x10字節(jié),即cbData和cbMaxData都是固定為0x10。所以從Lsass進(jìn)程的空間里面搜索“\x10\x00\x00\x00\x10\x00\x00\x00”即可找到正確的KEY。結(jié)果可能會(huì)有多個(gè),可以把所有搜索到的KEY都試一下,總有一個(gè)正確的。

              3.工具:解密函數(shù)LsapCrDecryptValue為非導(dǎo)出函數(shù),怎么辦?或許可以根據(jù)特征碼來搜索,但總覺得不太可靠。幸好,LsapCrDecryptValue調(diào)用的advapi32!SystemFunction005是導(dǎo)出函數(shù)。或者直接利用公開的DES庫函數(shù),自己來運(yùn)算。

              注:x_dialupass2.cpp中的代碼演示了直接從注冊(cè)表中讀取數(shù)據(jù)并解密之的過程,完整的源代碼可從http://security.xici.net/src/x_dialupass2.cpp獲取。

            posted on 2013-02-11 10:49 tqsheng 閱讀(895) 評(píng)論(2)  編輯 收藏 引用

            評(píng)論

            # re: 寬帶撥號(hào)連接密碼恢復(fù)原理  回復(fù)  更多評(píng)論   

            完整源代碼網(wǎng)址沒了!
            請(qǐng)問有備用的嗎~
            或者可以寄給我呢~
            2015-03-03 10:54 | 女兆小弟

            # re: 寬帶撥號(hào)連接密碼恢復(fù)原理  回復(fù)  更多評(píng)論   

            可以
            2016-06-13 20:28 | 薛根成

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            香蕉99久久国产综合精品宅男自 | 久久夜色精品国产亚洲| 国产69精品久久久久久人妻精品| 欧美精品一区二区久久| 亚洲精品乱码久久久久久中文字幕| 99精品久久精品一区二区| 国产精品久久久久天天影视| 久久黄视频| 久久亚洲精品成人AV| 国产成人精品久久亚洲| 亚洲天堂久久久| 久久精品国产清高在天天线| 久久久精品波多野结衣| 久久精品国产亚洲av高清漫画| 欧美麻豆久久久久久中文| 久久精品无码专区免费青青| 欧美激情精品久久久久久久| 久久99毛片免费观看不卡| 久久人人爽人人爽人人片AV不| 国产精品视频久久久| 国产69精品久久久久9999APGF| 久久久久人妻精品一区三寸蜜桃| 东京热TOKYO综合久久精品| 久久精品极品盛宴观看| 99精品伊人久久久大香线蕉| 久久久久久久人妻无码中文字幕爆 | 久久久久久午夜成人影院| 久久精品一区二区影院| 国产一区二区三区久久精品| 伊人久久精品无码二区麻豆| 久久久久久久国产免费看| 色综合久久天天综合| 粉嫩小泬无遮挡久久久久久| 色综合久久久久久久久五月| 精品伊人久久大线蕉色首页| 久久人人爽人人人人爽AV| 久久久久久久国产免费看| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 色综合合久久天天给综看| 久久国产精品二国产精品| 久久精品女人天堂AV麻|