與我們合作
我們專注:網站策劃設計、網絡輿論監控、網站優化及網站營銷、品牌策略與設計
主營業務:網站建設、移動端微信小程序開發、APP開發、網絡運營、云產品·運維解決方案
有一個品牌項目想和我們談談嗎?
您可以填寫右邊的表格,讓我們了解您的項目需求,這是一個良好的開始,我們將會盡快與您取得聯系。當然也歡迎您給我們寫信或是打電話,讓我們聽到您的聲音
您也可通過下列途徑與我們取得聯系:
地 址: 上海市長寧區華寧國際7L
電 話: 400-825-2717(咨詢專線)
電 話: 13054973230(售后客戶服務)
網 址: http://www.586918.cn
傳 真: 021-61488448
郵 箱: [email protected]
快速提交您的需求 ↓
郵件偽造之SPF繞過的5種思路
發布日期:2024-01-31 瀏覽次數:469
SMTP(SimpleMail Transfer Protocol) 即簡單郵件傳輸協議,正如名字所暗示的那樣,它其實是一個非常簡單的傳輸協議,無需身份認證,而且發件人的郵箱地址是可以由發信方任意聲明的,利用這個特性可以偽造任意發件人。
SPF出現的目的,就是為了防止隨意偽造發件人。SPF,全稱為 Sender Policy Framework,是一種以IP地址認證電子郵件發件人身份的技術。郵件接收方首先會去檢查域名的SPF記錄,來確定發件人的IP地址是否被包含在SPF記錄里面,如果在,就認為是一封正確的郵件,否則會認為是一封偽造的郵件并進行退回。
眾所周知,如果沒有配置SPF,攻擊者可以任意偽造郵件,即使配置了SPF,在特定的情況下,依然可以完美偽造郵件發件人。當我們開始查看一個目標郵箱的SPF記錄時,一場關于郵件安全策略的對抗也就開始了。
nslookup -type=txt qq.com
本文結合SPF配置的過程,通過一些郵件測試驗證,分享了5種SPF繞過的思路。從攻擊者的視角出發,來看看它會如何繞過SPF檢測,完美偽造郵件人地址,并成功投遞到目標郵箱,歡迎指正和補充~
1、SPF解析不當導致繞過
假設我的SPF記錄設置為:
v=spf1 ip4:220.xxx.10.0/24 ~all
這條SPF記錄的意思是說只允許220.xxx.10.1~220.xxx.10.255
范圍內的IP,軟拒絕,發件 IP 非法,但是不采取強硬措施。
這就存在兩個嚴重的安全隱患:
一個是IP段過大,在C段里面,只要獲取任意一臺主機的權限,那么就可以使用合法的IP進行郵件偽造。
一個是軟拒絕,也就是會接受來信,但可能被標記為垃圾郵件。如果SPF記錄設置拒絕,就會有大量的郵件被丟棄或者隔離,影響辦公效率,有一些郵件系統管理員為了減少業務影響,而采用軟拒絕的策略。
當SPF記錄設置成~all時,通過測試可以發現,outlook郵箱可以接收郵件,QQ郵箱不接收,163郵箱被標記為垃圾郵件。
還有一種極為嚴重的錯誤,就是SPF解析記錄配置錯誤,早在之前鵝廠就出現過SPF解析錯誤,比如:
v=spf1 ip4:113.110.223.0/24 183.110.226.0/24 183.110.255.0/24 59.110.132.0/24 -all
這里介紹一個工具,輸入域名和SPF記錄,可快速檢查SPF記錄是否正確
測試地址:
https://www.kitterman.com/spf/validate.html

SPF記錄報錯,在這條SPF記錄中,存在多個IP段,但只有開頭的一段ip用了ipv4,這就導致了語法錯誤。因為這個錯誤,將導致整個SPF記錄完全失效,因為SPF無效,郵件接收方的SPF檢測功能也就失效了。
綜上,當我們在查看一個域名的SPF記錄時,它其實不只是一條解析記錄,更是一種郵件安全的策略,SPF記錄配置不嚴或SPF解析錯誤,就容易導致大量本該被攔截的郵件直接被放進來,而繞過的策略就隱藏在這條SPF記錄里面。
2、SPF配置不當導致繞過
郵件服務器管理員做SPF配置時,其實是需要兩個步驟的,首先在域名中增加SPF記錄,向支持SPF功能的郵件服務器提供驗證信息,使別人能驗證自己;另外,需要配置郵件服務器支持 SPF,這樣才可以驗證別人。
那么,在SPF配置過程中,也常常因為配置不當導致繞過,比如:
種情況:
域名增加了SPF記錄,但是郵件服務器不支持SPF檢查或郵件網關未開啟SPF檢測,無法驗證郵件來源。這種情況下,我們聲明了自己是誰,但卻無法驗證對方是誰,SPF檢測無效,可偽造任意用戶發送到你的域名郵箱里。
第二種情況:
SPF解析在公網DNS,郵件服務器配置內部DNS,內部DNS無法進行SPF解析,從而導致繞過,可從公網偽造任意用戶發送郵件。
第三種情況:
攻擊者在公司內網,內網SMTP服務器開啟匿名郵件發送或者在信任中繼服務器IP段,就可以使用任意用戶發送郵件。
比如,當 mynetworks = 192.168.0.0/16
,在內網,任意一臺終端就可以直連公司的SMTP服務器,偽造了一封來自[email protected]
的郵件發給自己。
python SimpleEmailSpoofer.py -t [目標郵箱] -n QQ郵箱管理員 -f [email protected] -j "郵件主題" -e 1.txt -s [內網郵件服務器IP]測試效果如下:
3、高權限用戶繞過
對于Exchange郵箱系統,擁有Domain admin
權限的域用戶,可通過outlook直接指定發件人,偽造任意發件人發送郵件。偽造郵件的方式十分簡單,且郵件頭無法顯示真實IP。
測試過程:我給自己的賬號也添加了Domain admin
權限。
使用Outlook2013
客戶端指定發件人發送郵件,接收郵件直接顯示偽造人的名字,偽造成功。
使用Outlook2016
客戶端測試,郵件接收方的發件人位置顯示”XXX代表XXX”。

存在一定的郵件偽造風險,但在實際中意義并不大,如果擁有了Domain admin
權限,哪里還需要郵件偽造呢?
4、郵件客戶端內容解析差異
很多時候,大部分的企業郵箱SPF配置都是正確的,理論上,它會對每一封郵件進行檢測,那么它是怎么驗證發件人的IP地址的呢?
我們使用一個SPF在線檢測的工具,來做一下小小的嘗試,利用我本地搭建的匿名SMTP服務器偽造[email protected]郵箱。
測試地址:
https://www.kitterman.com/spf/validate.html
1、在IP address: 里輸入將要發信的IP地址,即本地ip地址。 2、SPF Record v=spf1...://-->:輸入nslookup查出來的SPF記錄 3、Mail From address:輸入將要發信的發件人

點擊Test SPF Recod進行驗證:

結果毫無疑問,SPF驗證失敗,偽造郵箱不成功,偽造的郵件將會被退回。
通過查看郵件頭信息,有兩個比較重要的字段,Sender和From。
Sender字段,代表的是郵件的實際發送者,郵件接收方會對它的郵件域名進行SPF檢測,確認是否包含了發信人的IP地址。From字段,代表的是郵件發送人,即郵件里所顯示的發件人,容易被偽造。
在SPF配置有效的情況下,Sender必須通過SPF檢驗,所以我們可以設置為正常的郵件服務器地址,然后對From字段進行偽造。
使用swaks做一個郵件測試:
sudo ./swaks --to 67*****[email protected] --from [email protected] --h-From: '=?GB2312?B?UVHTys/kudzA7dSx?= <[email protected]>' --ehlo evil.com --body hello --header "Subject: test" 其中參數:--from <實際發件人,對應Sender字段>--h-From <郵件顯示的發件人,對應From字段>
QQ郵箱網頁版查看郵件,Sender和From字段不一樣時,發件人的位置顯示由[email protected]代發。

使用Foxmail客戶端查看同一封郵件,Sender和From字段不一樣時,不顯示代發,偽造成功。

我們分別使用網頁版郵箱和客戶端郵箱打開同一封郵件,通過對比可以發現,不同的郵件客戶端對發件人位置的內容解析是不一樣的。
平時工作中,不少使用騰訊企業郵箱的童鞋,都喜歡使用Foxmail客戶端查收郵件,這就給了我們成功偽造郵件的可乘之機。
通過測試可以發現:qq郵箱、163郵箱網頁版均會顯示代發,Outlook郵箱不顯示代發,具體郵件客戶端軟件可具體再行測試。
5、From字段名截斷繞過
當我們偽造郵件發送成功的時候,由于Sender和From字段不一樣,部分郵件客戶端接收郵件后,會提示郵件代發。

那么有沒有辦法只顯示偽造的發件人,不顯示郵件代發呢?
在網絡上看到一種思路,來源于網貼《關于郵件偽造的一些新思路》,挺有意思的。
在用SMTP發送電子郵件時,發件人別名,格式為:From:發件人別名<郵件地址>
。通過對發件人別名字段填充大量的特殊字符,使郵箱客戶端截取真實的郵件地址失敗,從而只展示我們偽造的發件人別名和偽造郵箱。
郵件偽造測試過程:
1、在QQ郵箱中導出mail.eml文件,刪除前面不必要的字段信息。
2、填充發件人別名,偽造郵件頭Fron字段:
From:=?gb2312?B?udzA7dSxIDxhZG1pbkBxcS5jb20+0aGhoaGhoaGhoaGhoaGhoaGhoaGhoQ==?==?gb2312?B?oaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh?==?gb2312?B?oaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh?==?gb2312?B?oaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh?==?gb2312?B?oaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh?==?gb2312?B?oaGhoaGhoaGhoaGhoaGhoaGhoaGhoSAgICAgICAgICAgICAgICAgIKGkoaQ=?==?gb2312?B?oaQgICAgICAgICAgICAgICAgIKGhICAgICAgIKGkoaShpA==?= <[email protected]>
3、使用 —data參數發送郵件。
sudo ./swaks --data mail.eml --to 67*****[email protected] --from [email protected]
4、成功發送給目標郵箱,QQ郵箱接收郵件后的呈現效果:

備注:從測試情況看,我偽造的郵件進了QQ垃圾箱,但這種思路還是挺不錯的,重新Fuzz,或許可以構造特殊的數據包觸發這個問題。

