一封偽造郵件引發的「探索」(涉及釣魚郵件、SPF和DKIM等)
0x00. 引言
我用swaks 發送一封以我們公司CTO為顯示發件人(騰訊企業郵箱)的偽造郵件給我的一個同事,郵件的內容就是讓這位同事去CTO的辦公司一趟,沒想到這位同事真的去了,然後一臉懵逼的回來了。
惡作劇算是完了,但是這讓我開始研究偽造郵件是為什麼產生的,騰訊企業郵為什麼沒有攔截。
0x01. 關於偽造郵件的一些總結
1)
郵件服務商之間轉發郵件是不需要認證的,也就是說MTA 到MTA之間轉發郵件是不需要認證的,這是SMTP協議本身定義的。 所以協議釣魚郵件就可以偽稱來自某某MTA發送釣魚郵件;2)
互聯網上有一些郵件域名沒有配置SPF記錄 或者SPF記錄值設置不當,就會被用作偽造郵件的mail_from 後綴域名;
比如88mmmoney.com
3)
我們平常必須登錄才能發送郵件(一般用的發郵件工具稱作MUA,比如foxmail等),這是因為郵件服務商人為要求的,這不是SMTP協議本身要求的,SMTP協議本身是不需要身份認證的
4)
mail_from 和from 的區別
mail_from: 是信封上的發件人,由[前綴@域名]組成,是實際發件人
from: 信封內容里的發件人。 也就是我們平時收到郵件所看到的發件人,稱為:顯示發件人
如果mail_from (實際發件人) 和 from (宣稱的發件人) 不一致,則收到的郵件會顯示 本郵件由<實際發件人>代發, 以提醒收件人兩者的不同。
有的ESP(郵件服務商)並不會要求mail_from 和from完全一致,而只是要求兩者的域名相同(比如QQ 郵箱 和Gmail郵箱)。
下面是Gmail郵箱收到的一封<碼農周刊>發送的郵件,mail_from 和from 不完全一致, 但沒有提示代發。
<碼農周刊>是調用sendCloud 的API 進行發件的,由於SendCloud 對mail_from 的前綴(@前面的)用的是隨機字元串,所以遇到嚴苛的ESP(mail_from 和from 必須完全一致才不顯示代發,比如網易郵箱), 那就愛莫能助了。
5)
一個騰訊企業郵特殊的例子這是一封騰訊企業郵的收到的偽造郵件(mail_from 和from不一致), mail_from 是xxx@xxx.com from是xxx@xxx.cn
mail_from 和from 的後綴中就cn 和com 不同,也就是說只有頂級域名不同,其他相同
這樣騰訊企業有竟然沒有代發提示、安全提示,正常的出現在了我的收件箱中, 不管mail_from 中後綴xxx.com 的SPF是不是OK,
也不管xxx.com是不是存在
騰訊企業郵支持將郵件原始內容導出成eml文件(可用文本編輯器編輯、查看)
而另一封我偽造的一封郵件實際發件人是 service@htouhui.com, 顯示發件人是xxx@xxx.cn ,收件人是 xxxx@xxx.cn
顯然mail_from 和from不一致,這裡騰訊企業郵是會提示你代發
比對兩個偽造郵件,我據此反饋給了騰訊企業郵開發組,我覺得是騰訊企業郵的BUG,截止到本篇文章發表1周前,騰訊企業郵給我的回復是:郵件相關策略有問題,還在優化中
6)
reply-to: 信件回復的收件人, 用戶直接回復郵件時,reply-to就是默認收件人。 如果用戶不指定它, from就是默認收件人7)
mail_to 和 to的區別 mail_to 是實際收件人(信封上的收件人), 而 to 是顯示收件人(即信封內容中的收件人)
to 也是可以偽造的(to 支持別名顯示,別名也是可以偽造的),類似於from
這是一封偽造郵件,to 也被偽造了
0x02. 關於防止垃圾郵件的兩種技術
1、SPF
關於SPF的概念
查看
SPF維基百科%20%20%20%20%20%20%20%20%20%20%20%20%E6%88%96%E8%80%85%20%20%20%20%20%20%20%20%20%20%20%20%5B%E6%88%91%E7%9A%84%E5%89%8D%E4%B8%80%E7%AF%87%E6%96%87%E7%AB%A0%5D(https%3A//forrestx386.github.io/2017/04/01/%E5%85%B3%E4%BA%8E%20SPF/))
SPF的配置
SPF 其實就是一條DNS的TXT的記錄,其記錄值就是 SPF的內容 比如:v=spf1 include:spf.mail.qq.com -all」
SPF 需要在域名解析伺服器上配置,比如說是我們國內常用的DNSPOD配置如下
比如說service@freebuf.com 這封郵件的SPF 記錄怎麼設置,那麼需要在二級域名freebuf.com下增加一個主機記錄為@, 記錄類型為TXT, 記錄值為v=spf1 include:spf.mail.qq.com ~all (記錄值格式是這樣,具體值可能有所不同)
如果收到的郵件格式是這樣的: service@mail.vpgame.net ,那麼SPF 記錄需要這樣設置
在二級域名vpgame.net配置如下:
主機記錄為mail ,記錄類型為TXT,記錄值為:v=spf1 include:spf.sendcloud.org -all
查詢郵件域的SPF記錄也很簡單:
windows :
nslookup -qt=txt freebuf.com
Linux:
dig -t txt freebuf.com
2、DKIM
國外用的比較多,國內不多,比如騰訊郵箱默認就不支持這個
下圖是一封騰訊企業郵發送到Gmail郵箱的郵件部分原始郵件信息:
可以看到並沒有DKIM簽名
而Gmail默認是有DKIM簽名的
下圖是一封Gmail郵箱發送到騰訊企業的郵件部分原始郵件信息:
可以看到是有DKIM簽名的
關於DKIM的概念
DKIM全稱叫」Domain Key Identified Mail」,是yahoo的domainkey技術跟cisco的identified mail合起來的產物,有標準rfc4871、rfc5762,它的目的主要用來保證郵件的完整性,避免釣魚。與SPF一樣也做Sender authentication,但DKIM做的比SPF更複雜,DKIM會對郵件頭及正文進行簽名,沒有私鑰下,郵件被假冒或篡改後,就會與郵件頭簽名不一致,從而防止這樣的情況。
DKIM簽名是先對內容(BODY)部分HASH,然後把這個BODY HASH放到HEADER裡面,再對頭部做簽名。頭部也不是所有欄位都要簽名,只有一些常用的欄位,或者比較有意義的。像Received、Return-path、Bcc、Resent-bcc、DKIM-Signature、Comments、Keywords這樣的欄位一般不簽名,FROM則是必須被簽名(rfc4871 5.5 Recommended Signature Content), 最後在郵件頭中增加一個DKIM-Signature頭用於記錄簽名信息。接收方則通過DNS查詢得到公開密鑰後進行驗證, 驗證不通過,則認為是垃圾郵件,所以DKIM不僅僅可以防止垃圾郵件,還可以防止郵件內容被篡改。
簡單來說,DKIM(DomainKeys Identified Mail)是一種電子郵件的驗證技術,使用密碼學的基礎提供了簽名與驗證的功能。
一般來說,發送方會在電子郵件的標頭插入DKIM-Signature及電子簽名信息。而接收方則通過DNS查詢得到公開密鑰後進行驗證。
郵件域的DKIM配置和查詢
郵件接收方通過DNS查詢得到公開密鑰後進行驗證所以說需要在DNS域名解析上中加上一個TXT的記錄,用來記錄DKIM的公鑰信息, 以DNSPOD為例 ,類似SPF記錄
以service@mail.vpgame.net為例
在主機記錄中寫入 mail._domainkey.mail (這裡的第一個mail為DKIM中域名的selector,可以修改為不同的值,一個域名可以有多個selector,這樣不同的Email server可以有不同的key), 記錄類型為TXT, 記錄值為:
v=DKIM1;k=rsa;p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCmMPX+sFtBSSBaQENMXIY0kMoU xwpjsktTkjlsrdErh8WKSdRqNEZCE7e5/i9qT/rot5WikkyLoO9nWactl5u5rXli Nqy4eGq3aSQAo0J1/prrL9ZP/NWVo2j6lcSgkMgVCdw7gSIxObfvmp6PIb4edNzP nRBnpjey8xWFTDBzvQIDAQAB
格式類似這樣,可能具體的公鑰信息不一致, 其中v表示DKIM的版本; k表示非對稱的加密演算法; p表示base64之後的公鑰信息
如何查詢郵件域的DKIM 公鑰:
windows:
nslookup -qt=txt mail._domainkey.mail.vpgame.net
第一個mail 是上面所說的郵件域的selector,_domainkey 是固定格式(DKIM就是基於domainkeys的技術發展而來), mail.vpgame.net 是郵件域
Linux:
dig -t txt mail._domainkey.mail.vpgame.net
補充一個gmail的:
DKIM簽名信息分析
這是一封Gmail發給我的騰訊企業郵箱的郵件:
我們看一下DKIM-Signature的內容:
其中,v表示DKIM的版本
a=rsa-sha1,表示演算法(algorithm)。有rsa-sha1和rsa-sha256兩種,
c=relaxed/relaxed,表示標準化方法(Canonicalization),頭部和內容都用的relaxed方法。還可以用simple,表示不能有任何改動,包括空格.
d=gmail.com,發送者的域名, 也就是Gmail收到郵件信息中的所謂的」署名域」, 這個」署名域」需要在郵件伺服器的DKIM設置中配置的,可以和郵件域(比如service@mail.vpgame.net @後面的即是郵件域)不一樣(一般都保持一樣)
s=20161025,表示域名的selector,通過這個selector,可以允許一個域名有多個public key,這樣不同的server可以有不同的key。
h=…,是header list,表示對HEADER中有哪些欄位簽名。
bh=…,是body hash。也就是內容的hash。
b=…,是header的簽名。也就是把h=那個裡面所有的欄位及其值都取出來,外加DKIM-signature這個頭(除了b=這個值,因為還不存在),一起hash一下,然後用rsa加密。
0x03. 關於國內有名的sendCloud配置注意事項
1、發件域和顯示發件人(from)的郵件域(@後面的部分) 不一致導致的代發提示
ESP(郵件服務商)在收到郵件的時候都會檢查mail_from 和from 的郵件域(@後面的部分)是否一致,不一致則提示郵件代發
gmail也是這樣處理
如果你在sendCloud上配置的發件域和郵件顯示的發件人的郵件域不一致,則會在gmail郵箱中顯示郵件代發
實際發件域是mail.vpgame.net,而顯示的發件人的郵件域是mail.vpgame.cn ,兩者不一致,Gmail提示代發
下圖是一封碼農周刊發送到我Gmail郵箱中的一封郵件, 沒有提示代發,因為實際發件人的郵件域是和顯示發件人的郵件域是一致的
2、使用非加密埠發送代發郵件
比如上面的mail.vpgame.net 代發的一封郵件就是被顯示沒有加密,可能是直接調用sendCloud的未加密埠發送的
這裡顯示sendCloud.org未加密這封郵件, 因為gmail是從sendCloud 收到這封郵件的
0x04. 郵件代發之偽裝成他人發件
1.
foxmail 可以配置顯示其他賬戶(由本郵件代發顯示郵件賬號)2.
用上圖的配置給自己(上圖的實際賬號)發封郵件這裡會顯示代發
3.
如果是微信收到郵件呢(騰訊企業郵箱綁定微信後,微信可收信)不注意看,還真以為是顯示的發件人發的郵件呢
4.
給Gmail 也發一封Gmail 也沒提示代發
但是我們查看Gmail的原始郵件,可以看到此郵件不是顯示發件人發的
5.
我們來看回復此郵件能不能看到貓膩Gmail的回復, 回復給了顯示發件人
foxmail的回復,也是回復給了顯示收件人
foxmail的快速回復, 回復給了實際發件人
註: 如果是回復全部,則包含實際發件人
0x05. 一些識別偽造郵件的小技巧
1、實際發件人與顯示發件人不一致
這時候就需要小心了,確認郵件真的是由合法的第三方代發的,比如有名的郵件代發服務商sendCloud,如果不是,一般都是偽造郵件
如何知道郵件的實際發件人?
一般是查看郵件的原始內容,不過還有一個小技巧,就是在收到郵件的時候,郵箱提示信息中顯示的就是實際發件人
2、一般正常的發件伺服器都會配置SPF,有的還會配置DKIM,如果收到的郵件的發件人的郵件域沒有配置SPF,則有可能是偽造郵件
3、一般郵件服務商都會有相應的反垃圾郵件的機制,對於有安全提示的郵件要小心,不要輕易相信,不要輕易點擊其中圖片、鏈接、附件
如上圖,都是偽造郵件,而且顯示是收件人也是偽造的
0x06. 補充
騰訊企業郵發送的郵件默認是加密的
一般郵件body 內容是base64-utf8 編碼後的結果,可以使用k8-web 編碼轉換工具解碼或者編碼
郵件中的郵件頭的from 或者 to 部分都支持中文別名顯示(subject也支持中文),這些就需要寫代碼將中文內容編碼一下
#!/usr/bin/env python
# -*- coding:utf8 -*-
import sys
from email.header import make_header
if __name__ == "__main__":
reload(sys)
sys.setdefaultencoding("utf8")
content = repr("訪問下郵件中的鏈接,看看不能訪問")
print make_header([("xe8xaexbfxe9x97xaexe4xb8x8bxe9x82xaexe4xbbxb6xe4xb8xadxe7x9ax84xe9x93xbexe6x8exa5xefxbcx8cxe7x9cx8bxe7x9cx8bxe4xb8x8dxe8x83xbdxe8xaexbfxe9x97xae", "utf-8")]).encode()
比如說自己構造郵件原始內容(不是調用某某庫哦)的時候想把subject 內容修改一下,則需要先用repr 將中文的16進位編碼內容傳入make_header的參數中,這種得到的結果就是郵件subject(中文)原始內容
這裡要注意一下,不能直接將content傳入make_header中,否則會出錯,而是先列印repr(『subject中文內容』)值,然後將其拷貝至make_header中
*本文作者:knpewg85942,轉載請註明來自FreeBuf.COM
※NSA的第七種武器|雙脈衝星(DoublePulsar) 後門詳細分析
※OOB(out of band)分析系列之DNS滲漏
※利用系統特性偽裝成一個免密登陸後門
TAG:FreeBuf |
※黑客通過垃圾郵件群發XTRAT和DUNIHI後門以及 Adwind和Loki木馬
※最新的Turla後門利用電子郵件PDF附件作為C&C機制
※垃圾郵件活動使用XTRAT、DUNIHI和Adwind後門
※IETF推出用來取代IMAP的現代開源電子郵件協議JMAP
※電子郵件加密工具PGP和S/MIME被曝嚴重漏洞
※安全業者攻破OPENPGP與S/MINE郵件端到端加密協議
※囧科技:來自Steαm的PUBG預約郵件
※垃圾電子郵件活動通過BEBLOH和URSNIF惡意軟體感染日本用戶
※如何聯繫Instagram網紅-模板(DM和電子郵件)
※郵件形同裸奔,PGP與S/MIME加密協議被曝嚴重漏洞
※PGP和S/MIME嚴重缺陷導致明文顯示加密電子郵件
※AIC郵件泄露NVIDIA 新系列顯卡命名及發布日期
※ZeroBounce發布創新的A.I.電子郵件驗證引擎
※解密谷歌Gmail新功能:結合BoW模型和RNN-LM,幫助用戶快速寫郵件
※eBay英國站發郵件提醒賣家繳納VAT
※加密貨幣泄露,黑客利用釣魚電子郵件將DADI ICO投資者作為目標
※谷歌:Gmail郵件系統將引入AMP功能
※vivo社區泄露內部郵件 下一代新機APEX代號水滴
※使用 OpenGPG 加密電子郵件
※郵件圖標:用PS鼠繪時尚的郵件圖標