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

安裝配置
接下來(lái),我們需要深入分析軟件傳真背后每一層的工作機(jī)制。此時(shí),我們需要用到下列幾種組件:
1.兩臺(tái)90年代的老式傳真機(jī);
2.兩個(gè)USB傳真機(jī)調(diào)制解調(diào)器;
3.思科SPA112;
4.Asterisk;
5.IAXmodem;
6.HylaFAX、eFAX和mgetty;
7.gdb;
8.vim;
9.afl。
我們的組件將幫助我們部署不同的配置環(huán)境,Asterisk是我們的主PBX,它負(fù)責(zé)進(jìn)行路由調(diào)用和提供私人電話網(wǎng)絡(luò)(允許我們的各種組件與其他組件撥號(hào)通信,而無(wú)需使用到使用到公用電話網(wǎng)絡(luò)PSTN)。思科SPA允許我們物理連接到傳真機(jī)設(shè)備,并使用USB調(diào)制解調(diào)器連接我們的Asterisk網(wǎng)絡(luò)。同時(shí),gdb和vim可以幫助我們閱讀程序的源代碼和編譯過(guò)程。在整個(gè)過(guò)程中,我們還需要運(yùn)行afl模糊測(cè)試器來(lái)測(cè)試不同代碼塊和功能組件的安全性。
漏洞收集
在對(duì)傳真機(jī)軟件的安全性進(jìn)行了詳細(xì)研究之后,我們發(fā)現(xiàn)并上報(bào)了多個(gè)漏洞,相關(guān)廠商也在第一時(shí)間修復(fù)了上報(bào)的漏洞。
Mgetty中的多個(gè)安全漏洞
下面是我們發(fā)現(xiàn)并上報(bào)的漏洞信息:
CVE-2018-16741:通過(guò)Mgetty的任務(wù)描述實(shí)現(xiàn)Shell注入
CVE-2018-16742:通過(guò)Mgetty的命令行參數(shù)實(shí)現(xiàn)棧緩沖區(qū)溢出
CVE-2018-16743:通過(guò)Mgetty的命令行參數(shù)實(shí)現(xiàn)棧緩沖區(qū)溢出
CVE-2018-16744:通過(guò)Mgetty的配置參數(shù)實(shí)現(xiàn)棧緩沖區(qū)溢出
CVE-2018-16745:通過(guò)Mgetty的配置參數(shù)實(shí)現(xiàn)緩沖區(qū)溢出
參考資料:【傳送門】
HylaFAX的遠(yuǎn)程代碼執(zhí)行漏洞
CVE-2018-17141:在HylaFAX的傳真接收過(guò)程中,遠(yuǎn)程攻擊者將能夠?qū)懭胍粋(gè)未序列化的指針;
參考資料:【傳送門】
在我們的研究過(guò)程中,我們發(fā)現(xiàn)HylaFAX和HylaFAX+的功能非常豐富,而且完全可以實(shí)現(xiàn)傳真機(jī)通信的全部要求。除此之外,它們的源代碼也非常好讀,不過(guò)在讀源代碼的過(guò)程中,我們發(fā)現(xiàn)代碼中負(fù)責(zé)進(jìn)行ECM頁(yè)面?zhèn)鬏數(shù)牟糠执嬖诎踩珕?wèn)題。請(qǐng)大家看下面的代碼:
//fromhttps://github.com/ifax/HylaFAX/blob/09ad7eb6244e6160b42e9646495f0496f80d63fc/faxd/CopyQuality.c%2B%2B#L446
memcpy(recvRow,(const char*) buf, cc);
recvRow+= cc;
你沒(méi)看錯(cuò),就是緩沖區(qū)溢出的問(wèn)題!這部分代碼來(lái)自于FaxModem::recvPageDLEData()函數(shù),而這個(gè)函數(shù)主要負(fù)責(zé)處理傳真接收(開(kāi)啟JPEG傳輸功能時(shí)),而整個(gè)過(guò)程中沒(méi)有對(duì)緩沖區(qū)的邊界進(jìn)行檢測(cè),當(dāng)接收到數(shù)據(jù)量過(guò)大的頁(yè)面時(shí),將會(huì)出現(xiàn)緩沖區(qū)溢出的情況。
//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?

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