歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

從RDP到RCE:詳細分析RDG中的2個漏洞

來源:本站整理 作者:佚名 時間:2020-01-21 TAG: 我要投稿

Remote Desktop Gateway(RDG,遠程桌面網關)之前名為“Terminal Services Gateway”,是為Remote Desktop (RDP,遠程桌面)提供路由的一種Windows Server組件。在RDG應用場景中,用戶并沒有直接連接到RDP服務器,而是連接網關,通過網關的身份認證。認證成功后,網關會將RDP流量轉發至用戶指定的地址,因此網關實際上扮演的是代理角色。在這種場景下,只有網關需要對互聯網開放,其他所有RDP服務端可以安全躲在防火墻后面。由于RDP是更為龐大的攻擊面,因此正確設置RDG環境后,我們可以顯著減少可能存在的攻擊面。
在2020年1月的安全更新中,微軟修復了RDG中存在的2個漏洞。漏洞編號分別為CVE-2020-0609及CVE-2020-0610,這兩個漏洞都可以實現預認證遠程代碼執行效果。
 
0x01 Diff分析
首先我們可以分析受影響的DLL在打補丁之前和打補丁之后存在哪些差異點。

圖1. BinDiff分析打補丁前后的RDG可執行文件
經過分析后,我們發現只有1個函數被修改過。RDG支持3種不同的協議:HTTP、HTTPS以及UDP,更新版的函數負責處理負責處理UDP協議。正常情況下,我們可以并排比較打補丁前后的相關函數。然而不幸的是,這個代碼非常龐大,有多處改動。因此為了便于大家理解,這里我們直接給出該函數對應的偽代碼,剔除了其他不相關的代碼。

圖2. 處理UDP報文的函數偽代碼片段
RDG UDP協議允許將較大的消息拆分為多個獨立的UDP報文。由于UDP屬于無連接協議,因此報文可以亂序到達。該函數的功能是重組消息,確保每個報文都位于正確的位置上。每個報文中都包含一個頭部數據,其中包含如下字段:
fragment_id:報文在序列中的具體位置;
num_fragments:序列中報文的總數;
fragment_length:報文數據長度。
消息處理函數使用報文頭部數據來確保收到的消息能以正確的順序重組,不會缺失任何消息。然而,該函數在實現上存在一些bug,可以為攻擊者所用。
 
0x02 CVE-2020-0609

圖3. 報文處理函數中的邊界檢查邏輯
memcpy_s會將每個分片(fragment)拷貝到重組緩沖區的某個偏移量,重組緩沖區在堆上分配,每個分片的偏移量由fragment_id乘以1000計算得出。然而,這里的邊界檢查邏輯并沒有考慮到偏移量這個因素。這里我們可以假設buffer_size等于1000,然后我們發送包含2個分片的消息。
1、第1個分片(fragment_id=0)長度為1。此時this->bytes_written等于0,因此可以通過邊界檢查。
2、代碼將1字節數據寫入偏移量為0的緩沖區地址,bytes_written遞增1。第2個分片(fragment_id=1)長度為998,此時this->bytes_written等于1,而1 + 998仍然小于1000,因此可以通過邊界檢查。
3、代碼將998字節數據寫入偏移量為1000(fragment_id*1000)的緩沖區地址,導致在緩沖區末尾后寫入998個字節。
需要注意的是,報文不一定按順序發送(UDP協議)。因此如果我們發送的第1個報文中fragment_id=65535(最大值),那么就會被寫入偏移量為65535*1000的地址,也就是緩沖區末尾后的65534000個字節。攻擊者可以修改fragment_id,這樣就有可能將最多999字節數據寫入緩沖區后偏移量為1到65534000的任何地址。與典型的線性堆溢出漏洞相比,這個漏洞要更加靈活。該漏洞不單單可以用來控制寫入數據的大小,也能控制寫入數據的位置。如果附加額外控制技術,攻擊者可以實現更為精準的數據寫入,避免出現不必要的數據破壞現象。
 
0x03 CVE-2020-0610

圖4. 報文處理函數中標記哪些分片已接收成功
上圖中的類對象維護了32位無符號整數組成的一個數組(每個數組元素對應1個分片),當收到1個分片后,相應的數據元素值會從0修改為1。當所有元素都被設置為1時,代碼完成消息重組,開始處理整個消息。該數組最多容納64個元素,但fragment_id的取值范圍為0到65535。代碼唯一執行的驗證操作就是確保fragment_id值小于num_fragments(后者同樣可以被設置為65535)。因此,我們可以將fragment_id設置為65到65535之間的任意值,將在數據邊界外寫入1(TRUE)。雖然只將1個值設置為1可能很難實現RCE效果,但即使最小的改動也可以對程序正常行為帶來巨大的影響。
0x04 緩解措施
如果出于某種原因,用戶無法安裝補丁,此時仍然可以防御攻擊者利用這類漏洞。RDG支持HTTP、HTTPS及UDP協議,但漏洞只存在于UDP報文的處理代碼中。因此,用戶可以簡單禁用UDP傳輸功能,或者使用防火墻阻止UDP端口(通常為3391),就足以防御這些漏洞。

圖5. RDG設置
 

【聲明】:黑吧安全網(http://www.zjtpzs.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        神秘东方电子游艺 幸运飞艇怎么看走势图 打麻将游戏在线玩 山东十一选五直播视 一本道成人小说 捕鱼王2佣金是怎么算的 至尊棋牌公司联系方 辽宁11选5走势图软件 欧美a片欣赏 股票跌什么会涨 给我下载心悦麻将 贵州快三基本走势图一定牛 彩票深圳风采开奖结果今天 福州沐足一般都是什么项目 龙头股份股票 豪利棋牌每天送9块救济金 新快3开奖软件