0x01 引子
2017年5月24日Samba官方發布了安全公告,新發布的Samba 4.6.4修復了一個嚴重的代碼執行漏洞(CVE-2017-7494),該漏洞影響了Samba 3.5.0 之后到4.6.4/4.5.10/4.4.14中間的所有版本。在rpc_server/srv_pipe.c中的存在一個驗證BUG,攻擊者可以利用客戶端上傳惡意動態庫文件到具有可寫權限的共享目錄中,之后發出請求,使服務器加載Samba運行目錄以外的非法模塊,導致惡意代碼執行。
Samba,是種用來讓UNIX系列的操作系統與微軟Windows操作系統的SMB/CIFS網絡協議做鏈接的自由軟件。很多企業或個人的 NAS(Network Attached Storage),路由器和其他IOT設備存儲解決方案會選擇開源軟件Samba提供數據訪問服務。IPC$(Internet Process Connection) 是共享 “命名管道” 的資源,能使用戶匿名訪問Samba服務器的共享資源。
0x02 漏洞影響分析
基于360天眼實驗室全網掃描的數據顯示,目前中國大陸及港澳臺開放445端口的IP數為18883個,其中Samba服務共4433個,而Samba版本落在漏洞版本區間的IP數為3765個,占到了Samba服務的85%!臺灣、香港分別為1767、1853個,其余各省分布如下圖所示。

0x03 漏洞驗證及分析
環境準備:

使用Metasploit公開的exploits模塊(is_known_pipename)進行測試。下載地址:https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/linux/samba/is_known_pipename.rb
攻擊過程:
1. 向具有寫權限的Samba服務器共享目錄中上傳惡意動態庫,這里命名為evil.so;
2. 攻擊者暴力猜解共享目錄的絕對路徑,同時以IPC$(命名管道)資源的方式請求步驟1上傳的惡意動態庫,使文件名變為服務器上的絕對路徑” /path/to/evil.so”;
3. 服務器端誤將文件資源 ” /path/to/evil.so” 當作IPC$(命名管道)資源加載運行,漏洞觸發。
1)上傳惡意動態庫文件到服務器共享目錄public

第51個包Write AndX Request寫操作請求數據,如下所示:
SMB (Server Message Block Protocol)
SMB Header
Server Component: SMB
[Response in: 52]
SMB Command: Write AndX (0x2f)
Error Class: Success (0x00)
…
Tree ID: 51295 (\\192.168.119.155\public) #訪問靶機共享文件路徑Tree ID
Process ID: 51988
User ID: 62509
Multiplex ID: 27235
Write AndX Request (0x2f)
Word Count (WCT): 14
AndXCommand: No further commands (0xff)
Reserved: 00
AndXOffset: 0
FID: 0xef37 (\rDfDKbgV.so) # 惡意動態庫文件FID
…
[File RW Length: 476] #寫入文件大小
Byte Count (BCC): 476
Data (476 bytes) #上傳二進制數據
Data: 7f454c4602010100000000000000000003003e0001000000...
[Length: 476]
2)以命名管道方式請求惡意動態庫

第59個包NT Create AndX Request 請求命名管道資源數據,如下所示:
SMB (Server Message Block Protocol)
SMB Header
Server Component: SMB
SMB Command: NT Create AndX (0xa2)
…
Tree ID: 19967 (\\192.168.119.155\IPC$) #這里使用命名管道方式很重要
Process ID: 51988
User ID: 62509
Multiplex ID: 27235
NT Create AndX Request (0xa2)
Word Count (WCT): 24
AndXCommand: No further commands (0xff)
Reserved: 00
AndXOffset: 0
Reserved: 00 File Name Len: 23
Create Flags: 0x00000016
Root FID: 0x00000000
…
Byte Count (BCC): 24
File Name: /home/samba/rDfDKbgV.so # 管道名稱即為前面上傳文件的絕對路徑
3)服務器加載惡意動態庫
Smbd服務進程詳細調用鏈,如下如所示:

Samba漏洞關鍵源代碼位置,如下如所示:

由于沒有對pipename的值做判斷,smb_probe_module函數調用執行在共享目錄下上傳so的文件,進而導致惡意代碼執行漏洞。

Metaspoit中提供在SMB_SHARE_BASE的列表用于猜解,共享目錄的絕對路徑。筆者直接設置可正確的Samba共享目錄絕對路徑,可以確保一次通過。
0x04 檢測漏洞是否存在
1) 本地檢測:本地檢查Samba版本是否屬于 4.4.14、 4.5.10、4.6.4 及以后的版本。
2) 遠程檢測:使用nmap --script=smb-os-discovery -p 445 192.168.1.122/24命令掃描網絡中Samba版本。
0x05 漏洞修復
1. Samba 官方已經提供了新版本來修復上述漏洞,請受影響的用戶盡快升級到新版本。使用源碼安裝的 Samba 用戶,請盡快下載最新的 Samba 版本手動更新;使用二進制分發包(RPM 等方式)的用戶立即進行 yum,apt-get update 等安全更新操作。
下載鏈接如下:
https://download.samba.org/pub/samba/stable/samba-4.6.4.tar.gz https://download.samba.org/pub/samba/stable/samba-4.5.10.tar.gz https://download.samba.org/pub/samba/stable/samba-4.4.14.tar.gz
2. 緩解措施:通過在 smb.conf 的[global]節點下增加 nt pipe support = no選項, 然后重新啟動Samba 服務,以此達到緩解針對該漏洞攻擊的效果。
0x06 FAQ
1)很多童鞋在ubuntu16.04或者centos6.8上沒有驗證成功,是so不對?metasploit版本不對?還是靶機環境不對?
答:
a) kali上的metasploit保證最新,然后只需下載對應的is_known_pipename.rb模塊,放入/usr/share/metasploit-framework/modules/exploits/linux/samba/目錄即可;
b) 使用metasploit自帶的payload生成模塊即可,默認為reverse TCP;
c) 本次測試靶機的smb.conf設置如下:
[public]
path = /home/samba
public = yes
writable = yes
browseable = yes
guest ok = yes
read list = nobody
write list = nobody
能觸發漏洞的配置文件版本很多,writable = yes是必需的,global里有個security設置,刪除后默認是匿名訪問。
d) 本次測試共享目錄/home/samba的權限為777;
e) 重點:2017年5月24日以后使用apt或者yum安裝的smb服務基本都是打過補丁的,所以不可能利用成功。
2)如何在ubuntu下查看Samba的完整版本?
a) apt install apt-show-versions
b) apt-show-versions samba

c) 位置1是Samba版本,位置2是ubuntu補丁版(ubuntu0.16.04.7),可以參見ubuntu的修改日志http://changelogs.ubuntu.com/changelogs/pool/main/s/samba/samba_4.3.11+dfsg-0ubuntu0.16.04.7/changelog,可以看到已經修復了漏洞CVE-2017-7494。
3)如何查看centos已經修復的版本?
筆者這里找到的是RHEL的更新日志,redhat也在5月24日緊急更新了所有在維護的Samba包,修復漏洞CVE-2017-7494。文章詳見:https://rhn.redhat.com/errata/RHSA-2017-1270.html。
|