收釣魚信學冷知識 - 在 SMTP 郵件假冒寄件人
| | 3 | |
「社交攻擊演練」幾乎已是資安教育的必修課程,也成為各大資安廠商的標準服務項目,就像牛肉麵店都有豆干跟海帶一樣。
於是,我們三不五時都會收到各式釣魚信,五花八門,什麼都有:商品特價優惠、催繳停車費、專案促銷回饋、通知可以退稅、催你點連結進 Teams 開會... 一時失察點中連結,很快會收到關懷(連釣魚信都分不出來,可憐的孩子 😄)。
久而久之,我們多半練就出用膝蓋都能識別釣魚信的能力,例如:可疑的寄件者及連結網址,網域名稱刻意取跟正版差一兩個易混淆的字元、非公務內容... 等,一望便知。
其中最好識別的就是寄件者,發現寄件者是外部信箱且非熟悉的往來對象,馬上提高警覺就對了!
不過,最近我收到一封高仿真的社交攻擊演練釣魚信,除了抓準近期內部公告的某項政策結合時事,用詞遣字也用到內部獨有術語,並加註處理期限提醒逾會影響考績,企圖增加收信者發生受迫性失誤的機率,高度客製化的設計讓我迷惑了幾秒。
但身為技術控,則在釣魚信找到其他亮點,拓展了眼界學到新東西。
我用自家的 Docker Mailserver嘗試重現。
這是一封外部寄件者寄給 admin@example.com 的信件,但在 Outlook 清單顯示的寄件者是 hr@example.com [1],跟 admin@example.com 同一網域,開啟信件的寄件者則顯示為 Phisher <service@phisher.com> 代表hr@example.com
[2]。
我過去沒注意過 Email 可以這樣玩,以為資安廠商用了什麼高級駭客技巧,後來才發現這是古老 SMTP 協定就支援的規格。
The "From:" field specifies the author(s) of the message, that is, the mailbox(es) of the person(s) or system(s) responsible for the writing of the message. The "Sender:" field specifies the mailbox of the agent responsible for the actual transmission of the message.
「From:」欄位指定訊息的作者,即負責撰寫訊息的個人或系統的電子郵件地址。「Sender:」欄位則指定負責實際傳送該訊息的代理人的電子郵件地址。
SMTP 允許兩個欄位不同,而在郵件軟體會顯示成 Sender 代表 From
。信是用底下這段程式做出來的,跟標準 SMTP 寄信寫法幾乎相同,只差在宣告不同的 From 跟 Sender:
using MimeKit;
using MailKit.Net.Smtp;
// System.Net.Mail 的 HELO 宣告固定用機器名稱,會被 Docker Mailserver SMTP Server 拒收
// 故程式改用可指定 client.LocalDomain 的 MailKit
var message = new MimeMessage();
message.From.Add(new MailboxAddress(string.Empty, "hr@example.com"));
message.Sender = new MailboxAddress("Phisher", "service@phisher.com");
message.To.Add(new MailboxAddress("Admin", "admin@example.com"));
message.Subject = "出勤異常通知: 2025-05-16 下班未刷卡";
message.Body = new TextPart("html")
{
Text =
"""
<div style="font-family: 微軟正黑體; font-size: 11pt;">
<p>親愛的同仁您好,</p>
<p>系統發現您於 <span style="color: red"><strong>2025-05-16</strong> 當日下班時未完成刷卡</span>。</p>
<p>請您儘速至<a href="https://fakeweb.phisher.com/gotyou">人資系統補登下班紀錄</a>,或洽詢人資部門協助。</p>
</div>
"""
};
using (var client = new SmtpClient())
{
client.LocalDomain = "mail.example.com";
client.Connect("mail.example.com", 25, false);
client.Send(message);
client.Disconnect(true);
}
Console.WriteLine("Email sent successfully.");
未經檢核授權就任意宣告代表誰,感覺是會被誤用或惡意利用的特性呀! 好奇郵件伺服器真的不設防嗎?
查了一下,SMTP 協議本身允許任何人設定 From 欄位為任意 Email 地址,也允許 Sender 與 From 不同,但現代郵件伺服器會有一些驗證與防偽措施,例如 SPF、DKIM、DMARC 等。
SPF 透過在網域 DNS 設置 SPF 記錄,明確列出哪些 IP 位址的郵件伺服器授權可以以該網域名義發送郵件,因此若你宣稱的 Sender/From 網域未授權你的 IP 代表發信,信件通常會被拒收或當成垃圾/釣魚信。
關於 SPF、DKIM、DMARC 前文有較多說明,而我為了方便測試,停用了 SPF、DMARC,故在真實世界除非伺服器有額外設定(如:允許 SMTP Relay)或被動手腳,這招沒那麼容易得逞。要不是收到這封信,我應該學不到這個冷知識,噗。
Phishing attacks often exploit email’s “From” and “Sender” fields to deceive recipients. SMTP allows these fields to differ, but modern email servers use SPF, DKIM, and DMARC to prevent misuse.
Comments
# by 璉璉
除了最後收信的 SMTP Server 不能偽造外,其它都可偽造。 所以一般 Mail Server 還會提供偽造本機寄信。 如果要偽造一封外部寄信,比如說把微軟寄來的廣告信 Mail Header 全部複製加入 Headers ,時間改一下,確認經過的 Mail Server 到掃毒伺服器後,後面的 SMTP Server 刪除,發出郵件。 郵件路徑會變成 收信者 Server > HiNet Server (假定直接從 HiNet SMTP Server 寄信) > 假的微軟 Server 群 > 假的 Web Mail 認證、假的 MessageId、假的 Mail Client ... 所以要騙企業買資安服務,就用幾乎為真的假信騙,最多裡面嵌圖改掉,就可以證明撈到員工開信,特定網址用短網址就可以詐騙大部分員工點選。 現在的社交演練流於形式,當然,如果太真,很多資安人員也會中標,畢竟誰沒事在看收信路徑... 我是會在我的系統自動發送郵件 Headers 內埋獨立的加密檢查碼給收信軟體驗證,或是人工詢問時驗證,這種一般假造不了。
# by Jeffrey
to 璉璉,嵌圖 URL 部分實務上 MIS 是否都會預設成不自動下載?否則光預覧就中獎,演練結果會很難看。 至於防止郵件內容竄改,我爬文有學到可用 DKIM 從 DNS 取公鑰做驗證,不知能否防堵你說的手法?
# by C
Gmail也有這種功能 https://support.google.com/mail/answer/22370?hl=zh-Hant