發表文章

精選

對 Windows 10 UAC 保護實作細節逆向工程 (Windows 10 Enterprise 17763)

圖片
- 前言 啊啊,真的蠻久沒更新的,部落格荒廢一陣子。🥴 身為一個碩一升碩二,畢業即失業的我最近開始想動手玩一些有趣的東西(不然畢業後投履歷沒東西寫可能真的要餓死街頭了怕爆 QQ)
年初看了這一篇挺有趣的文章由 David Wells 所發表的部落格文  UAC Bypass by Mocking Trusted Directories 裡面提及了在 Windows 10 Build 17134 版本中出現的 Path Normalization 在 WinNT 跟實際 DOS Path 絕對路徑產生的歧異所引發安全上的缺陷允許繞過 UAC 設計。


不過這一篇文章只講到了其中一個利用點、經過完整逆向後發現一些有趣的資訊有其他打法可以利用,身為只會刷水稿的我,運氣不錯今年刷刷水稿有丟上 HITCON (。・ω・。)ノ 喔拜託,如果有打算到現場的不要噓我 QQ 怕爆.jpg
而 整體 UAC(User Account Control)保護設計在網路上也未被多加著墨(至少當前沒有太多逆向工程細節 XD)所以興致來了寫了一篇廢文解釋一下整體逆向工程完畢後對 Windows 10 當前最新企業版設計做出一些解釋。

// 附註 整體 UAC(User Account Control)實作其實相當精細,其中包含了本地端 RPC 消息傳遞、微軟官方未公布的一堆MACRO標記與結構體、Windows特權令牌分發細節 等。礙於本人逆向功力不足、與網路上可爬到的未公布資料實在太少,底下許多提到的數字細節都是我根據當下程式碼結構上臆測的結果而無法考證微軟內部程式碼,若有錯誤麻煩再回覆告知。
此外,本文所描述的逆向分析結果都在於認證機制層面上、但許多程式碼跳轉部分其實 RPC 消息傳遞影響的成分相當重、但本文為了簡化整體架構方便釐清、那些特殊影響邏輯跳轉的 RPC 消息邏輯暫且不提。
- Environment 截至今日  2019/07/27 目前分析環境為 Windows 10, 17763 企業版,更新補丁上到最新版本。 - SVCHOST UAC 保護設計在 Windows 中是以系統服務形式被安裝在作業系統之上,在這邊可以看到 UAC 服務名稱對應是 AppInfo,這也代表著系統開機後會有一個 Process 施作 UAC 細節。
在 WinInit 服務叫起的 Services…

Linux ELF Loader Note

之前玩 ELF 一直不懂為啥 _start 走進去後居然是去呼叫:
__libc_start_main(main, __libc_csu_init, __libc_csu_fini)

然後莫名其妙的就走進去 main function 了;有別於 Windows PE _start 進去後就是初始化 CRT 接著呼叫 exit(main(argc, argv, envp))。

看完 [1], [2] 之後大概就可以知道:

1. __libc_start_main 在於 Process 中程式文件被 Mapping 到正確記憶體分配後,負責處理一些初始化的作業,比方說有用到第三方函數庫或全域變數初始化等等都會負責呼叫 __libc_csu_init 來協助完成這些初始化作業(實際初始化方式也僅是透過 ELF 自帶的 .init section 程式碼呼叫、其他第三方函數庫家載後 .init 也得呼叫)

2. __libc_start_main 完成初始化後透過 .plt 來呼叫系統函數來取得 argc, argv, envp 作為參數傳遞給開發者的 main 函數

3. 等待開發者 main 函數返回後,在跳至 .fini section 的程式碼做一些後續關閉 Process 必要的清理作業(比方說記憶體回收之類的)

感覺上大概就是把 Windows 編譯器產出的 CRTStartup 這件事情封裝在 glibc 內分成三塊來處理XD

[1]: https://blog.csdn.net/gary_ygl/article/details/8506007
[2]: https://stackoverflow.com/…/whats-going-on-in-libc-start-ma…
[3]: https://felixzhang00.github.io/2016/12/24/2016-12-24-ELF%E6%96%87%E4%BB%B6%E8%A3%85%E8%BD%BD%E9%93%BE%E6%8E%A5%E8%BF%87%E7%A8%8B%E5%8F%8Ahook%E5%8E%9F%E7%90%86/

[Black Asia Arsenal] puzzCode: 專注開發後門的編譯器, 自帶反逆向、對抗病毒特徵碼定位技術

圖片
前言安安,這篇沒有講任何工具本身細節XD 純粹是個人一些 murmur 的廢文 簡報
專案github.com/aaaddress1/puzzCode
吃我 Source 看細節啦(?)
#murmur
其實事情是這樣 der,去年底忙完一堆工作的事情後發現好像有點閒,然後就收到了這樣的一封信躺在我的 gmail 裡面。畢竟個人覺得自己沒那個屁股能投稿上 BlackHat 或者 DEFCON 這種一線等級的大 Conf。



這封信指出可以投稿你自己的駭客工具到 Black Hat Asia,若被接受,你可以獲得一個攤位和大約 2hr 時間可以讓你 present 你工具特別之處,最棒的是你可以獲得價值六萬塊新台票的入場券!(就是門票啦,那張 Badge)除此之外會贈送大會背包這樣,對一個沒去過 Black Hat 的屁孩如我來說超吸引的啊XD

之前的研究一直都差不多打轉在防毒軟體怎麼設計安全防護上,然後花了一點時間接了 MinGW 編譯器(GCC 在 Windows 分支版本的編譯器)用 C# 寫了一個簡單的 UI,來做到自動化將 C/C++ 原始碼透過編譯器產生 Assembly Script(其實理想狀況用編譯器的 IR Code 會比較恰當,畢竟如果要跨 CPU 架構,你的混淆 Patten 很容易吃大便)然後自幹了簡單的 Assembly 指令混淆邏輯單元、最後再透過組譯器產生出 Object File 與連結器封裝為 *.exe 的 Windows 程式這樣XD

這樣的工具當初構想是:很多基於 YARA 或者其他自定義的惡意程式特徵碼設計概念都是連續組合語言片段檢測 + Hash Check 來確認一隻文件是否具有惡意(正確來說應該是:是否已經被建檔為惡意文件)所以如果能設計一個編譯器自動化做到同份原始碼、每次編譯出的執行程式都會被混淆邏輯單元打散程式碼順序與穿插混淆程式碼,那其實可以做到很強程度的對抗現在一線的防毒軟體(看看那隻有點紅的小傘)

運氣不錯的是:以往 Black Hat 收錄的工具沒有這類型的工具,原本只有備取、最後成功被收錄到 Black Hat Asia 的軍火庫(Arsenal)啦,可參見至:PUZZCODE, MAKE BACKDOORS GREAT AGAIN!


實際擺攤的時候,對你工具有興趣想聽的會在你攤位開始的時間前面卡位等著,然後看…

Windows Shim (ACT) 在 Windows10 下禁止 Inject Dll 系統實作細節原因

圖片
前言 如果你對 Windows Shim (ACT) 不熟是什麼,建議你可以先參考這篇:详解Windows Shim的攻防利用,這篇很不錯的介紹了 Windows Shim 相容性工具如何被惡意濫用進行攻擊。另外還有一篇俄羅斯的文章介紹的也不錯:shim handlers
前陣子在做一份玩具需要做到對單一 Process 每次開機重啟都能穩定 hook 住固定 API 作檢測,第一個想到最穩定的做法當然是 TMD 幫該執行程式打一層補丁 (Shim) 指定該 Process 每次開機重啟都會加載我的 *.dll,接著就可以做熱修復(Hot Patch)這做法很漂亮,一個簡單 *.sdb 就能簡單起到穩定的 *.dll 同一 Process 穩定注入,不過...
對,Windows 10 不給玩這招了,你在 Windows 10 下打上 Inject Dll 的補丁是會被無視的 QQ,最近時間比較充裕 並沒有,只是突然很想知道為什麼不給這樣搞  花了大概一小時的時間把 Windows 7 與 Windows 10 的 Loader 實作細節分析完畢,然後就大概摸出了問題點在哪...囧。
PE Loader (at ntdll.dll) on Windows 7 如果你跟我一樣吃飽太閒(不過其實打這篇文章的時候我好餓喔...好想吃滷肉飯)翻一下 ntdll.dll 的實作你應該可以看到一支 *.exe 被執行起來後,要開始做程式必備初始化的修復動作,這些步驟可以看到在 ntdll!LdrpInitializeProcess 內實作:
如果你有開 IDA Pro 的話上下捲捲捲就可以看到這個函數內在初始化 Process 時候,會按造順序分配堆疊必備的記憶體空間、分配各區段對應在虛擬地址上、修正重定向、最後修正了引入函數表(IAT, Import Address Table)而這幾大修正步驟過程中,根據 Shim 的需求可能會需要在載入 DLL 之前、期間、之後,各階段插入不同的行為來完成打補釘的行為。
每次要讓 Shim 機制介入打補釘時,就會呼叫 ntdll!LdrpLoadShimEngine 函數來載入 Shim 引擎,如果完成該階段的目標後,就會呼叫 ntdll!LdrpUnloadShimEngine 來卸載 Shim 引擎,而 LdrpLoadShim…