<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    CS:GO 從0到0day!

    VSole2023-05-31 14:30:11

    背景介紹:

    國外一家安全公司(Neodyme)在CS:GO(反恐精英:全球攻勢)游戲中發現了三個獨立的遠程代碼執行 (RCE) 漏洞,當游戲客戶端連接到惡意的 Python CS:GO 服務器時,每個漏洞都會被觸發。本篇文章詳細介紹了他們通過 CS:GO 二進制文件的分析旅程,并對各種已識別的漏洞進行了深入技術研究。最后他們還展示了一個概念驗證 (POC)視頻 ,該漏洞利用四種不同的邏輯漏洞在游戲客戶端連接到服務器時觸發遠程執行代碼。

    概述:

    2021年4月28日的 CS:GO 補丁修復了幾個關鍵漏洞,包括三個關鍵漏洞。本文描述了如何發現這三個關鍵漏洞的方法,詳細展示了一個由4個邏輯漏洞組成的漏洞鏈,并解釋了如何通過巧妙地將它們組合起來導致客戶端的遠程代碼執行 (RCE)。雖然這篇文章確實解釋了四個邏輯漏洞,但重點是他們的研究方法很值得我們學習。

    補丁鏈接:https://blog.counter-strike.net/index.php/2021/04/33895/

    首先,他們查看 CS:GO 游戲的現有研究,并做了大致介紹,從而減輕復雜客戶端逆向工程的痛苦,隨后介紹了 CS:GO 網絡協議的基本概念,如 fast_dl 和 Cvars ,并詳細介紹了4種不同的邏輯漏洞。將這些漏洞結合起來就可以通過連接到攻擊者控制的惡意服務器來利用 CS:GO 客戶端的概念證明。

    了解你的目標:

    安全研究不是盲目地尋找安全漏洞。因為只有當你完全理解了一個目標,你才有能力突破技術限制。因此,第一步應該盡可能多地獲取有關目標的信息。以下內容提供了“偵察”階段的想法:

    軟件工具包

    支持改裝的游戲通常會提供官方軟件開發工具包 (SDK),雖然 SDK 不包含目標的源代碼,但其中定義的結構提供了有關網絡包和類定義的寶貴信息,有助于理解引擎,特別對于 Valve 公司的游戲,引擎或完整游戲(2003 年、2007 年和 2020 年)發生過多起源代碼泄漏事件,盡管源代碼經常過時并且包含許多現已修復的安全漏洞,但這些泄漏非常有用。主要是因為源代碼比經過編譯器優化的匯編更易于閱讀。

    公共研究

    眾所周知,該公司并不是第一個在CS:GO游戲中尋找漏洞的組織,因此,可以在互聯網上搜索到很多有用的博文和PPT。

    作弊社區

    在游戲中超級令人討厭,但卻受到安全研究人員喜愛的:像 UnknownCheats 這樣的作弊社區,這些社區提供了詳細的逆向帖子和引擎內部結構,在這種情況下,Felipe 已經編寫了一個 Network Cheat,對理解網絡協議做出了很大貢獻。

    調試符號

    調試符號包含了許多無法識別的函數名和類結構,從而使逆向工程更加方便。有時游戲的版本也會有意附帶調試符號以生成更好的錯誤報告,然而,有時程序員會忘記從游戲最終的二進制文件中刪除調試符號,畢竟程序員也是人,是人就會犯錯。

    帶有調試符號的 CS:GO 二進制文件

    2017 年 4 月的 macOS CS:GO 版本(如下圖所示)包含了完整的調試符號。帶有調試符號的游戲文件比無符號的游戲文件大很多倍,因此可以使用 SteamDB 和舊存儲庫自動識別。

    雖然在 2021 年仍然可以使用 SteamCMD 專門下載舊版本,但同時該功能似乎已被 Valve 公司禁用。

    模糊測試(Fuzz)

    盡管有所有信息,仍須投入大量時間對目標進行逆向分析,只有當完全了解哪個緩沖區處理網絡數據時,才能開始做那些令人興奮的事。但這種努力是值得的!

    該組織使用 Hongfuzz、pubic protobuf network structures和 libprotobuf-mutator 對客戶端進行模糊測試時發現了崩潰,而這些崩潰直接提供了 instruction pointer 的控制,因此很可能被利用!為了全面測試并制定漏洞利用策略,該組織決定用 Python 實現自己早期階段的服務器。

    4個邏輯漏洞的發現:

    對于像 CS:GO 這樣的目標,由于多年的開發和公共漏洞賞金計劃,現在很可能已經修復了簡單的漏洞,如果只是在巨大的 engine.dll 中隨機尋找堆棧溢出,你會很快放棄。但事實證明:每一個小異常都可以證明是有價值的,在盯著 CS:GO 反匯編和源代碼的幾周時間里,他們不斷地問自己以下問題:

    • 我們已經擁有哪些‘原料’?
    • 結合它們我們能做什么?
    • 有哪些安全機制?
    • 開發人員可能沒有考慮過哪些奇怪的邊緣問題?

    內存破壞利用很難,盡管提交給 Valve 的三個全鏈漏洞利用中有兩個是內存破壞,但這意味著極高的開銷,并且始終存在客戶端因錯誤的內存分配而崩潰的風險。每次啟動 CS:GO 連接到服務器加載地圖都需要幾分鐘,這讓開發變得非常困難。

    在本篇文章中,不解釋奇怪的堆風水機制,而是關注4個邏輯漏洞,它們共同導致了客戶端遠程執行代碼。發現順序如下:

    Bug1:從服務器執行特權命令

    該漏洞允許攻擊者在客戶端上執行通常只能在單人游戲模式下的“特權”命令

    為了驗證自定義Python CS:GO 服務器是否工作,他們通過 CNETMsg_StringCmd 向客戶端發送了命令 echo Hello World! ,并且正如預期的那樣,在游戲控制臺上收到了輸出 Hello World! 。隨后他們還嘗試發送 quit 命令,比賽結束!他們無法相信服務器會允許這樣做,通常這是不允許的:但在 SourceMod 的幫助下,他們使用官方和修改后的服務器重新創建了一個可以向客戶端發送消息的源引擎修改框架,結果:

    FCVAR_SERVER_CAN_EXECUTE prevented server running command: quit 。

    就這樣找到漏洞了嗎?漏洞究竟是如何發生的?

    SourceMod:https://www.sourcemod.net/

    源引擎單人游戲在內部使用本地托管的源引擎服務器,然后單人客戶端連接到自己的服務器加入游戲,這個單人服務器當然應該擁有特權,比如改變客戶端的鍵盤布局或截屏。

    如果最多只有一個客戶端可以連接到服務器,則多人服務器被認為是本地服務器,因此是具有特權的單人服務器。漏洞在于確定服務器類型:可以連接到服務器的最大客戶端數由變量 m_nMaxClients 控制,并在連接到服務器時由客戶端接收,然而 Python 服務器將變量 m_nMaxClients 設置為 1,這樣就可以在客戶端執行特權命令了!

    Host_IsSinglePlayerGame Check

    Bug2:由擴展名剝離導致的任意文件下載

    此漏洞允許攻擊者繞過擴展名過濾器下載任意擴展名的文件

    源引擎服務器可以向客戶端發送額外的游戲文件,例如地圖或玩家模型,數據傳輸可以通過源網絡協議或 HTTP fast_dl 完成,為了防止惡意文件被發送到客戶端,某些文件擴展名如 *.exe 、 *.dll 、 *.ini 會被阻止。

    如果設置了 fast_dl 選項,附加內容將從指定的 HTTP 服務器加載,而不是直接從 CS:GO 服務器加載,URL 由 snprintf(p_cResult, 256, "%s/%s", p_cServerName, p_cFileName) 函數根據服務器名稱和完整文件名動態生成。 

    snprintf 函數將字符串的長度限制為 256 個字符,從而從文件名中截斷不需要的字符,但 p_cServerName 和 p_cFileName 卻可以有 256 個字符的長度!像 ././[..]/file.AAA.BBB 這樣的文件名可以在 .AAA 擴展名之后終止,因為 .BBB 部分被 snprintf 函數截斷了,由此可以完全繞過危險文件過濾器!

    以下源代碼片段說明擴展名已被刪除:

    snprintf 函數從字符串中刪除多余數據

    該漏洞通過對 fast_dl 協議的代碼分析發現,且該協議近年來變化不大。

    Bug3:任意文本文件寫入游戲目錄

    該漏洞允許攻擊者(覆蓋)寫入游戲文件夾的任意文件

    由于不確定如何組合前面的兩個漏洞,因此,該組織在 CS:GO 二進制文件中搜索有用的特權命令,通過 con_logfile 命令,他們驚奇地發現該命令可以將任意 *.log 文件寫入游戲的任意文件夾,由于 snprintf 的類似擴展名剝離漏洞,還可以指定任意文件擴展名,從而編寫具有任意內容和任意擴展名的文本文件。

    具體來說,該漏洞可使用任意 CS:GO 命令創建新的配置文件 cfg/leak.log , leak.log “配置”文件可以由 exec leak.log 命令加載,從 cfg 文件夾中讀取文件。

    Bug4:回退至禁用簽名檢查

    該漏洞允許攻擊者以“不安全”模式啟動CS:GO客戶端,并允許加載未簽名的游戲二進制文件

    當啟動 CS:GO 客戶端時,游戲 DLL 的完整性通過匹配哈希值進行驗證,只有通過此驗證才能在官方服務器上玩,如果 DLL 驗證失敗,則會回退到 insecure 模式,這也可以通過額外的命令行參數 -insecure 來實現,只有在這種模式下,才能加載不在游戲 bin/ 路徑中的其它 DLL,如果攻擊者成功使DLL 驗證失敗,就可以創建自己的DLL,在配置中引用這些DLL,實現命令執行,在 Windows 中,攻擊者可以指定將 DLL 加載到進程中時執行的代碼,因此,攻擊者可以在客戶端系統上執行任意代碼。

    Windows 防止覆蓋在運行進程中加載的 DLL,因此,必須找到一個在游戲開始時驗證但未加載到進程中的 DLL,幸運的是, client.dll 已經被 client_panorama.dll 替換了,因此不再加載,但仍可以驗證!用(Bug3)任意文本覆蓋 client.dll 。

    完整的邏輯漏洞鏈:

    1. 在客戶端執行特權命令
    2. 將惡意 DLL 下載到游戲目錄
    3. 替換 gameinfo.txt 以便在游戲啟動時加載惡意 DLL
    4. 破壞 client.dll 以實現回退到 insecure 模式


    為了理解下面的步驟,需要介紹源引擎的兩個經典元素: 

    gameinfo.txt 和 CVars:

    所有基于源引擎的游戲實際上都是《半條命》游戲的“附加組件”,游戲的資產和 DLL 從文件 gameinfo.txt 中定義的特殊路徑加載:

    通過將 |gameinfo_path|/exploit 設置為 FileSystem 數組中的第一個,引擎會嘗試從該路徑加載丟失的 DLL,當在那里找不到要加載的元素時,才使用原始游戲路徑,在游戲開始時加載的一個 DLL 是 matchmaking.dll ,這意味著可以放置一個新的 matchmaking.dll 并在 CS:GO 客戶端加載 DLL 時調用任意代碼。

    CVars 是源引擎游戲中的一個基本概念,無處不在,這些變量幾乎控制了游戲中要設置的所有內容:路徑、鍵綁定、十字準線的外觀、游戲模式等,還有傳說中的 sv_cheats 變量,許多CS玩家可能都聽說過。根據 CVar ,也可以由服務器設置,從而覆蓋本地選項。

    連接后,客戶端告訴服務器在客戶端設置了哪個本地 CVars ,以便服務器可以做出相應的反應,例如,如果在客戶端將 sv_cheats 設置為 1 ,則服務器可以踢出客戶端,作為攻擊者,我們需要知道 CS:GO 客戶端的安裝目錄,以便我們可以通過選擇長度恰到好處的路徑來利用 bug 2 和 bug 4 ,不幸的是,默認情況下,客戶端不會發送包含當前游戲目錄的 CVar ,因此,需要使用一個技巧來設置新的 CVAR GAMEBIN ,并將其發送回攻擊者控制的服務器。基本思路如下:

    1. 執行“腳本” leak.log 來設置 CVar GAMEBIN
    2. 指示客戶端重新連接到惡意服務器
    3. 重新連接后,所有 CVars 并設置回惡意服務器
    4. 詳細信息涉及從配置文件調用 path 命令將 CVAR GAMEBIN 設置為游戲的安裝路徑,利用攻擊者編寫的配置文件 leak.log ,其中包括 path 命令,客戶端必須執行配置文件,否則 CVar 不會在下一次服務器連接期間持久存儲, leak.log 文件是用 exec 命令執行的,之后惡意服務器指示客戶端重新連接,重新連接后, CVar 會泄露回服務器。

    漏洞利用流程:

    POC視頻截圖:

    來自Neodyme的結束語:

    人們經常問我們花了多少時間來構建這個漏洞利用鏈,遺憾的是,我們無法確定花費的總時間,幾個星期以來,我們晚上在 Discord 上會面,交流想法,一起編程并分析我們的發現,直到深夜,那時的 Alain 在 CS:GO 中玩了大約 250 小時,還沒有玩過一場在線比賽,我們“相對”快速地發現了這些漏洞,但對于他們的漏洞賞金計劃,Valve 需要一個全鏈漏洞來證明 RCE 的影響,如果沒有精心演示,研究將在 30% 的時間后完成。因此,我們在 RCE 演示中投入了相當多的時間。

    說到 Valve:我們通過各種看似簡單的 HackerOne 報告了解到 Valve 為 CS:GO 支付的高額費用,當時的報告只需要證明內存損壞就可以獲得全額賞金,在我們的三份不同報告被迅速宣布有效后,我們最初的興奮很快就消退了,但即使在 13 個月和多次請求之后仍然沒有得到解決,經過大量壓力和全面披露的威脅,這些漏洞終于被修復了。每個漏洞的支出為 7.5k,低于我們的預期,總而言之,這是一次發人深省的經歷。

    對我們來說,CS:GO 漏洞賞金之旅是我們第一次將數周時間投入到一個項目中,我們個人的收獲主要是:

    • 不要只想著能夠快速尋找到關鍵漏洞
    • 組合你的漏洞以充分發揮其潛力
    • 留意邊緣情況和開發人員沒有想到的事情
    • 更加努力!如果碰壁,要尋找突破口,不要過早放棄
    命令模式游戲服務器
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    CS:GO 從0到0day!
    2023-05-31 14:30:11
    ,并詳細介紹了4種不同的邏輯漏洞。公共研究眾所周知,該公司并不是第一個在CS:GO游戲中尋找漏洞的組織,因此,可以在互聯網上搜索到很多有用的博文和PPT。專門下載舊版本,但同時該功能似乎已被 Valve 公司禁用。為了全面測試并制定漏洞利用策略,該組織決定用 Python 實現自己早期階段的服務器。函數將字符串的長度限制為 256 個字符,從而從文件名中截斷不需要
    受限于發現樣本的延遲,C&C 服務器可能已經失效。據此,成功從 197 個樣本中提取了針對 12 個漏洞的攻擊行為。其中,Mirai 是二進制協議、Gafgyt 與 Daddyl33t 是文本協議。惡意軟件家族名使用 AVClass 進行合并,但存在問題是會將 Mozi 分類為 Mirai。其中,10 個自治系統相關的 C&C 服務器占比超過 69.7%,如下所示。威脅情報有效性60% 的 C&C 服務器與不止一個二進制文件存在關聯。發起攻擊的 C&C 服務器通常具有更長的生命周期,平均為 10 天。
    可能涉及的部件市電環境;電源、主板、CPU、內存、顯示卡、其它可能的板卡;BIOS中的設置;開關及開關線、復位按鈕及復位線本身的故障。啟動與關閉類故障定義舉例與啟動、關閉過程有關的故障。顯示的內容的觀察:要注意屏幕報錯的內容、死機的位置,以確定故障可能發生的部位。以下檢查應在軟件最小系統下進行。
    可能涉及的部件市電環境;電源、主板、CPU、內存、顯示卡、其它可能的板卡;BIOS中的設置;開關及開關線、復位按鈕及復位線本身的故障。2) 萬用表; 3) 試電筆; 4) CPU負載。啟動與關閉類故障定義舉例與啟動、關閉過程有關的故障。4) 顯示的內容的觀察:要注意屏幕報錯的內容、死機的位置,以確定故障可能發生的部位。以下檢查應在軟件最小系統下進行。
    為了與惡意擴展程序進行通信,開發者使用了命令和控制服務器(C2),這與之前用于安裝擴展程序的安裝服務器不同。該惡意軟件使用各種擴展功能,使其在用戶瀏覽器中占有一席之地。
    從6月開始,分析家們發現了幾個獨特的網絡攻擊集群。Chaos惡意軟件針對的是已知的漏洞,"Dehus補充說,"我們建議網絡管理員實行嚴格的補丁管理,并使用我們報告中列出的IoCs來監測感染或與可疑基礎設施的連接情況。消費者和遠程工作者應啟用自動軟件更新,并定期更新密碼和重新啟動硬件"。黑蓮花實驗室認為這種惡意軟件與2021年發現的Chaos勒索軟件構建者沒有關系;相反,重疊的代碼和功能表明它很可能是2020年發現的DDoS惡意軟件Kaiji的演變。
    微軟正在調查一起攻擊,攻擊者使用由該公司簽名的驅動程序 Netfilter 驅動程序植入 Rootkit。微軟宣布正在調查一名威脅行為者在針對中國游戲行業的攻擊中分發惡意驅動程序。這家 IT 巨頭簽署的其中一個驅動程序名為 Netfilter,是在連接到中國的 C2 時發現的惡意 Windows rootkit。這家 IT 巨頭指出,其 WHCP 簽名證書沒有暴露,其基礎設施也沒有受到黑客的破壞。閱讀Microsoft 安全響應中心 發布的帖子。Microsoft 已暫停用于提交驅動程序的帳戶,并審查其提交的其他惡意軟件指標。
    趨勢科技的研究人員檢測到Mac惡意軟件MacStealer通過網站、社交媒體和消息平臺Twitter、Discord和Telegram大肆傳播。研究人員已經發現MacStealer的源代碼已經通過在線公共掃描服務泄露。惡意軟件背后的攻擊者會偽裝成一家合法的游戲公司,尋找測試人員,并吸引潛在的受害者下載他們的應用程序。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类