
介紹
大家一聽到“傳真機”這三個字,肯定覺得這種設備離自己非常遠。但實際上,現在很多辦公室里仍然存在著這種“遠古”設備,而且在商業和法律通信等領域內仍處于廣泛使用中。傳真機的大部分技術都是幾十年前的了,而且在過去的幾年里基本沒有升級過。
以前的傳真機主要通過座機電話和電話線來訪問,并且通過以太網來連接本地網絡。但說實話,可能很多人并不了解傳真機背后的通信機制。網上只有一些介紹打印機標準的文檔,其實也并沒有什么X用,而且我們也不準備對打印機的固件進行逆向分析。不過幸運的是,網上有很多開源(源代碼可完全訪問)的打印機模擬工具,而且它們還實現了很多額外功能,這就非常棒了。
大家準備好了嗎?那我們開始吧!
傳真模擬軟件
傳真機看起來其實有點像一臺連接了電話線的打印機,不過傳真機會發出各種奇怪的聲音,還能通過電話線并以低速傳輸的形式進行頁面掃描和輸出。雖然在全球各地的各種辦公室內仍然能找到傳真機的身影,但實際上并沒有多少人喜歡這種設備。
在網上搜索半天之后,我們也找到了很多有意思的傳真機軟件開源項目,其中更新比較頻繁的就是HyLaFax。HylaFAX貌似是一款企業級的軟件傳真工具,而eFAX和mgetty + sendFAX則是一種基于命令行的更輕量級的軟件傳真替代方案。除了它們之外,還有很多開源項目都在為軟件傳真生態系統做貢獻。比如說,ICTFAX就是一種基于Web的解決方案,IAXmodem則是一款支持連接PBX和傳真客戶端的軟件橋接工具,以及Spandsp庫等等。
簡單來說,傳真的整個過程需要涉及到三種通信層:
1.數據層:此時,調制解調器需要撥號,然后發出各種奇怪的聲音,最后在通信雙方之間建立數據信道,并允許雙方交換數據符號。
2.會話層:在這一層,傳真機會進行通信參數協商,其中包括頁面格式、頁面傳輸速度和圖片壓縮方式等等。
3.圖片/頁面層:傳真機會在這一層對頁面信息進行編碼/解碼,對數據進行壓縮/解壓,檢查并糾正錯誤等等。
根據調制解調器需要處理的通信層數量,我們可以對設備進行歸類:
1.第一類:調制解調器處理數據層,同時依靠傳真機軟件來實現會話處理和頁面處理任務。
2.第二類:調制解調器處理數據層和會話層,然后把圖片處理任務交給軟件端完成。
除此之外,還有一類設備負責提供額外功能,比如說設置不同的傳輸速度等等。由于我們這篇文章主要針對的是第一類設備,所以其他種類的設備就大家自行搜索啦!
那么,在傳真機軟件(例如HylaFAX)和傳真機調制解調器的幫助下,任何人都可以通過電話線來發送和接收傳真。在發送一份傳真時,我們只需要一份輸入文檔和目的傳真機的電話號碼,然后用軟件進行撥號和數據編碼,最后發送出去就可以了。在接收一份傳真時,會有一個軟件進程通過調制解調器的串口來監聽來電信號,接收所有的數據信息,然后將其存入本地文件系統或通過郵件發送給用戶。

安裝配置
接下來,我們需要深入分析軟件傳真背后每一層的工作機制。此時,我們需要用到下列幾種組件:
1.兩臺90年代的老式傳真機;
2.兩個USB傳真機調制解調器;
3.思科SPA112;
4.Asterisk;
5.IAXmodem;
6.HylaFAX、eFAX和mgetty;
7.gdb;
8.vim;
9.afl。
我們的組件將幫助我們部署不同的配置環境,Asterisk是我們的主PBX,它負責進行路由調用和提供私人電話網絡(允許我們的各種組件與其他組件撥號通信,而無需使用到使用到公用電話網絡PSTN)。思科SPA允許我們物理連接到傳真機設備,并使用USB調制解調器連接我們的Asterisk網絡。同時,gdb和vim可以幫助我們閱讀程序的源代碼和編譯過程。在整個過程中,我們還需要運行afl模糊測試器來測試不同代碼塊和功能組件的安全性。
漏洞收集
在對傳真機軟件的安全性進行了詳細研究之后,我們發現并上報了多個漏洞,相關廠商也在第一時間修復了上報的漏洞。
Mgetty中的多個安全漏洞
下面是我們發現并上報的漏洞信息:
CVE-2018-16741:通過Mgetty的任務描述實現Shell注入
CVE-2018-16742:通過Mgetty的命令行參數實現棧緩沖區溢出
CVE-2018-16743:通過Mgetty的命令行參數實現棧緩沖區溢出
CVE-2018-16744:通過Mgetty的配置參數實現棧緩沖區溢出
CVE-2018-16745:通過Mgetty的配置參數實現緩沖區溢出
參考資料:【傳送門】
HylaFAX的遠程代碼執行漏洞
CVE-2018-17141:在HylaFAX的傳真接收過程中,遠程攻擊者將能夠寫入一個未序列化的指針;
參考資料:【傳送門】
在我們的研究過程中,我們發現HylaFAX和HylaFAX+的功能非常豐富,而且完全可以實現傳真機通信的全部要求。除此之外,它們的源代碼也非常好讀,不過在讀源代碼的過程中,我們發現代碼中負責進行ECM頁面傳輸的部分存在安全問題。請大家看下面的代碼:
//fromhttps://github.com/ifax/HylaFAX/blob/09ad7eb6244e6160b42e9646495f0496f80d63fc/faxd/CopyQuality.c%2B%2B#L446
memcpy(recvRow,(const char*) buf, cc);
recvRow+= cc;
你沒看錯,就是緩沖區溢出的問題!這部分代碼來自于FaxModem::recvPageDLEData()函數,而這個函數主要負責處理傳真接收(開啟JPEG傳輸功能時),而整個過程中沒有對緩沖區的邊界進行檢測,當接收到數據量過大的頁面時,將會出現緩沖區溢出的情況。
//fromhttps://github.com/ifax/HylaFAX/blob/09ad7eb6244e6160b42e9646495f0496f80d63fc/faxd/CopyQuality.c%2B%2B#L987
caseJP_GREY+4:
caseJP_COLOR+4:
recvEOLCount = 0;
recvRow = (u_char*) malloc(1024*1000); //1M should do it?

總結
在對傳真機軟件的安全性進行了研究之后,我們可以更好地了解這種技術,并揭示傳真機系統中不同層級和不同復雜度的組件及其工作機制。在各種開源、免費工具的幫助下,我們能夠迅速了解傳真機工作機制中每一層的通信原理,除此之外,我們還能閱讀源代碼,并識別出其中可能存在安全漏洞的部分。
傳真機已經存在了好多好多年了,也許現在的安全社區已經沒人去研究傳真機的安全問題了,但如果有一天,你旁邊那臺傳真機給你帶來了“毀滅性”的災難,你該怎么辦?
|