目錄表
[*nix] Testing SMTP with command
0x00 前言
最近系上郵件伺服器發生使用者密碼遭破解,而大量寄送垃圾信情況
雖然透過 smtpd_sender_restrictions 可以限制寄件人
smtpd_sender_restrictions = check_sender_access hash:$config_directory/senders_access
user1@your.domain.name DISCARD user2@your.domain.name REJECT
上面兩個是比較常用的 ACTION
- REJECT: 退信,後面接空格後可自訂退信訊息
- DISCARD: 無聲無息把信丟掉
不過這種作法若是使用者通過驗證後偽造 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
- s_client 可讓 openssl 去和遠端主機建立連線
- -starttls smtp 參數則會讓 openssl 先用一般非加密的方式連線,然後發送 STARTTLS 給 server
如果走 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– 限制登入權限