目錄表

[*nix] Testing SMTP with command

0x00 前言

最近系上郵件伺服器發生使用者密碼遭破解,而大量寄送垃圾信情況

雖然透過 smtpd_sender_restrictions 可以限制寄件人

postfix check_sender_access

smtpd_sender_restrictions = check_sender_access hash:$config_directory/senders_access

user1@your.domain.name DISCARD
user2@your.domain.name REJECT

上面兩個是比較常用的 ACTION

不過這種作法若是使用者通過驗證後偽造 MAIL FROM 欄位即可繞過

在 postfix log 中紀錄的是 mail fom/rcpt to 欄位,也就是 envelope

而收信人在 gmail 上看到,不管是一般郵件或原始郵件,這邊顯示的都是內文的 from/to,並不是 envelope

本篇記錄為了讓登入帳號與寄件人一致而對系統做的一些測試


0x01 TELNET

一般被盜帳號後應該都是使用程式從 command line 在發信

首先透過 telnet 連到我們的 smtp server

kshuang@ksh [~] % telnet smtp.cs.nctu.edu.tw 25
Trying 140.113.235.50...
Connected to mail.cs.nctu.edu.tw.
Escape character is '^]'.
220 csmail2.cs.nctu.edu.tw ESMTP Postfix
EHLO localhost
250-csmail2.cs.nctu.edu.tw
250-PIPELINING
250-SIZE 81920000
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250 SMTPUTF8

在第六行我們輸入 EHLO 指令

接著看到回覆中 250-STARTTLS

我們的 server 有啟動 TLS 並要求使用

這時需要改用 openssl 連線,否則當輸入 STARTTLS 後,後面再輸入指令時連線就會被關閉,因為 TLS 加密後 telnet 連線方式無法解析


0x02 Openssl

如果走 TLS over SMTP

$ openssl s_client -starttls smtp -crlf -connect smtp.cs.nctu.edu.tw:25

如果走 SSL(SMTPS)

$ openssl s_client -crlf -connect smtp.cs.nctu.edu.tw:465

0x03 Server AUTH

接著需要認證,在認證時我們需要透過 base64 encode

$ perl -MMIME::Base64 -e 'print encode_base64("\000jms1\@jms1.net\000not.my.real.password")'
AGptczFAam1zMS5uZXQAbm90Lm15LnJlYWwucGFzc3dvcmQ=

接著在剛剛的 openssl 連線輸入

PLAIN AUTH AGptczFAam1zMS5uZXQAbm90Lm15LnJlYWwucGFzc3dvcmQ=

0x04 Send Message

AUTH PLAIN AGptczFAam1zMS5uZXQAbm90Lm15LnJlYWwucGFzc3dvcmQ=
235 2.7.0 Authentication successful
mail from: kshuang123@cs.nctu.edu.tw
250 2.1.0 Ok
rcpt to: st505102000@gmail.com
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
from: nike1000@cs.nctu.edu.tw
to: nike1000@gmail.com
subject: fake sender test

test
.
250 2.0.0 Ok: queued as 40CDA174482
quit
221 2.0.0 Bye
closed

這時 gmail 就會收到假的寄件人寄出的信了

實際上認證時是以 kshuang 身份認證通過的,但 envelope 偽造成 kshuang123,在這樣的情況下,前面的 check_sender_access 若只擋 kshuang,這封信還是可以寄出

gmail 上看到的寄件人收件人都是 nike1000,這是郵件內容,本來就能隨意填寫


0x05 Mail System 情況

目前除了 smtp 這台有開放認證後可由外部寄信之外,其他 server 都只允許幫內部 relay

csmail pf 直接擋外部 25 port,smtp 是用 haproxy 轉過去的,對 csmail 來說會變成內部

csmail/csmx 有開 TLS,mailer/mailgate 則沒有

csmx 上有開 strict_rfc821_envelopes,mail from/rcpt to 後面 email 要用 <> 括起來,不然會有 501 5.1.7 Bad sender address syntax


0x06 reject_sender_login_mismatch

smtp.cs server 用 reject_sender_login_mismatch 限制寄件人要和通過認證登入的帳號一致

而關於內部寄信不需要認證,若有帳號被盜用可能需要 user– 限制登入權限


0x07 參考資料