Post Office Protocol - Version 3html
pop3協議是離線郵件協議,是客戶端取郵件用的。安全
默認監聽在TCP:110端口.服務器
POP3會話有3個狀態AUTHORIZATION、TRANSACTION和UPDATE不一樣狀態能用的命令不一樣。dom
等待鏈接 身份確認 quit命令測試
—— |AUTHORIZATION|————— |TRANSACTION|——————|UPDATE|ui
|________________________________________________________|編碼
重返承認狀態加密
POP3命令碼以下:spa
命令(ascII字符) | 參數 | 狀態 | 描述 |
---|---|---|---|
USER | username | AUTHORIZATION | 用戶名 |
PASS | password | AUTHORIZATION | 密碼,若成功,將致使狀態轉換 |
APOP | username Digest(加密後密碼) | AUTHORIZATION | Digest是MD5消息摘要 |
STAT | none | TRANSACTION | 請求服務器發回關於郵箱的統計資料,如郵件總數和總字節數 |
UIDL(unique-id listing) | [message] | TRANSACTION | 返回郵件的惟一標識符,POP3會話的每一個標識符都將是惟一的 |
LIST | [message] | TRANSACTION | 返回郵件數量和每一個郵件的大小 |
RETR(retrieve) | [message] | TRANSACTION | 返回由參數標識的郵件的所有文本 |
DELE | [message] | TRANSACTION | 服務器將由參數標識的郵件標記爲刪除,會話進入UPDATE後刪除 |
RSET | [message] | TRANSACTION | 服務器將重置全部標記爲刪除的郵件,用於撤消DELE命令 |
TOP | [message] | TRANSACTION | 服務器將返回由參數標識的郵件前n行內容,n必須是正整數 |
NOOP | [message] | TRANSACTION | 服務器返回一個確定的響應 |
QUIT | none | UPDATE | pop3服務器刪除標記爲deleted的郵件,不管錯誤與否,釋放獨佔鎖、關閉TCP鏈接 |
wireshark抓包:第一張爲開始,第二章爲結束.net
SMTP工做在兩種狀況下
smtp是個請求/響應協議,命令和響應都是基於ascii文本,並以cr和lf符結束。響應包括一個表示返回狀態的三位數字代碼。
網圖,來自https://blog.csdn.net/bripengandre/article/details/2191048
------------------------------------------------------------- +----------+ +----------+ +------+ | | | | | User |<-->| | SMTP | | +------+ | Sender- |Commands/Replies| Receiver-| +------+ | SMTP |<-------------->| SMTP | +------+ | File |<-->| | and Mail | |<-->| File | |System| | | | | |System| +------+ +----------+ +----------+ +------+ Sender-SMTP Receiver-SMTP -------------------------------------------------------------
COMMAND [Parameter]
XXX Readable Illustration。XXX是三位十進制數;Readable Illustration是可讀的解釋說明,用來代表命令是否成功等。XXX具備以下的規律:以2開頭的表示成功,以4和5開頭的表示失敗,以3開頭的表示未完成(進行中)。
命令 | 描述 |
---|---|
HELO
|
向服務器標識用戶身份 |
MAIL FROM:
|
|
RCPT TO:
|
|
DATA
|
將以後的數據做爲數據發送,以
|
REST
|
重置會話,當前傳輸被取消 |
NOOP
|
要求服務器返回OK應答,通常用做測試 |
QUIT
|
結束會話 |
VRFY
|
驗證指定的郵箱是否存在,因爲安全方面的緣由,服務器大多禁止此命令 |
EXPN
|
驗證給定的郵箱列表是否存在,因爲安全方面的緣由,服務器大多禁止此命令 |
HELP
|
查詢服務器支持什麼命令 |
AUTH LOGIN | 認證請求 |
EHLO | 除了HELO所具備的功能外,EHLO主要用來查詢服務器支持的擴充功能 |
250 8BITMIME /* 最後一個響應數字應答碼以後跟的是一個空格,而不是'-' */
用戶名、密碼需採用base64編碼(Base64就是一種基於64個可打印字符來表示二進制數據的表示方法。)
以「X」開頭的關鍵字都是指服務器自定義的擴充(還沒歸入RFC標準)
還有一些重要字段
Received: from DM6NAM11HT080.eop-nam11.prod.protection.outlook.com (2603:1096:201:20::24) by HK0PR06MB3714.apcprd06.prod.outlook.com with HTTPS via HK2PR02CA0212.APCPRD02.PROD.OUTLOOK.COM; Sat, 12 Oct 2019 02:04:31 +0000 Received: from DM6NAM11FT041.eop-nam11.prod.protection.outlook.com (10.13.172.57) by DM6NAM11HT080.eop-nam11.prod.protection.outlook.com (10.13.172.248) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.2347.16; Sat, 12 Oct 2019 02:04:30 +0000 Authentication-Results: spf=pass (sender IP is 120.26.244.201) smtp.mailfrom=smail.kzedu.cc; hotmail.com; dkim=none (message not signed) header.d=none;hotmail.com; dmarc=bestguesspass action=none header.from=smail.kzedu.cc; Received-SPF: Pass (protection.outlook.com: domain of smail.kzedu.cc designates 120.26.244.201 as permitted sender) receiver=protection.outlook.com; client-ip=120.26.244.201; helo=smtp552.submail.cn; Received: from smtp552.submail.cn (120.26.244.201) by DM6NAM11FT041.mail.protection.outlook.com (10.13.172.98) with Microsoft SMTP Server id 15.20.2347.16 via Frontend Transport; Sat, 12 Oct 2019 02:04:29 +0000 X-IncomingTopHeaderMarker: OriginalChecksum:24B3073D37E1488647AB6D33914E56311671421DA99AC9F3ACCE5038C61D9AED;UpperCasedChecksum:4E628F444082EA3506FF7B7B728D6469D42940820A842E95A6AF817CE7359561;SizeAsReceived:633;Count:10 Date: Sat, 12 Oct 2019 2:4:28 +0000
Received是smtp服務器記錄的從哪裏收到的郵件。從上往下就是SMTP中繼的各個節點。最下面的是發件服務器IP。
Received-SPF是防止假郵件的mail from能夠僞造from更不用說,可是SPF記錄該域名的郵件服務器的發件IP地址,能夠驗證真僞(要發假的垃圾郵件要模仿的是SMTP服務器行爲,除非黑客控制了一個域名的郵件服務器)。
MIME消息由消息頭和消息體兩大部分組成,郵件頭與郵件體之間以空行進行分隔
郵件頭包含了發件人、收件人、主題、時間、MIME版本、郵件內容的類型等重要信息。每條信息稱爲一個域,由域名後加「: 」和信息內容構成,能夠是一行,較長的也能夠佔用多行。域的首行必須「頂頭」寫,即左邊不能有空白字符(空格和製表符);續行則必須以空白字符打頭,且第一個空白字符不是信息自己固有的,解碼時要過濾掉。
郵件體包含郵件的內容,它的類型由郵件頭的「Content-Type」域指出。常見的簡單類型有text/plain(純文本)和text/html(超文本),multipart/mixed, multipart/related和multipart/alternative。
multipart類型,是MIME郵件的精髓。郵件體被分爲多個段,每一個段又包含段頭和段體兩部分,這兩部分之間也以空行分隔。常見的multipart類型有三種:multipart/mixed, multipart/related和multipart/alternative。
+------------------------- multipart/mixed ----------------------------+ | | | +----------------- multipart/related ------------------+ | | | | | | | +----- multipart/alternative ------+ +----------+ | +------+ | | | | | | 內嵌資源 | | | 附件 | | | | | +------------+ +------------+ | +----------+ | +------+ | | | | | 純文本正文 | | 超文本正文 | | | | | | | +------------+ +------------+ | +----------+ | +------+ | | | | | | 內嵌資源 | | | 附件 | | | | +----------------------------------+ +----------+ | +------+ | | | | | | +------------------------------------------------------+ | | | +----------------------------------------------------------------------+
能夠看出,若是在郵件中要添加附件,必須定義multipart/mixed段;若是存在內嵌資源,至少要定義multipart/related段;若是純文本與超文本共存,至少要定義multipart/alternative段。什麼是「至少」?舉個例子說,若是隻有純文本與超文本正文,那麼在郵件頭中將類型擴大化,定義爲multipart/related,甚至multipart/mixed,都是容許的。
multipart諸類型的共同特徵是,在段頭指定「boundary」參數字符串,段體內的每一個子段以此串定界。全部的子段都以「--」+boundary行開始,父段則以「--」+boundary+「--」行結束。段與段之間也以空行分隔。在郵件體是multipart類型的狀況下,郵件體的開始部分(第一個「--」+boundary行以前)能夠有一些附加的文本行,至關於註釋,解碼時應忽略。
能夠觀察一下邊界00一、00二、003等
提取pcapng中流量能夠從wireshark中直接將郵件正文部分複製出來保存到文件中後綴改成.eml拿客戶端打開。反正我以爲本身解析郵件中的文件太難了,取個巧。
Base64的索引表,字符選用了"A-Z、a-z、0-九、+、/"
64個可打印字符。數值表明字符的索引,這個是標準Base64協議規定的,不能更改。64個字符用6個bit位就能夠所有表示,一個字節有8個bit位,剩下兩個bit就浪費掉了,這樣就不得不犧牲一部分空間了。這裏須要弄明白的就是一個Base64字符是8個bit,可是有效部分只有右邊的6個bit,左邊兩個永遠是0。
那麼怎麼用6個有效bit來表示傳統字符的8個bit呢?8和6的最小公倍數是24,也就是說3個傳統字節能夠由4個Base64字符來表示,保證有效位數是同樣的,這樣就多了1/3的字節數來彌補Base64只有6個有效bit的不足。
個人郵件當中有那麼一段
先用base64解碼,而後用GB2312解碼
須要注意的是根據RFC 822規定,每76個字符,還須要加上一個回車換行。因此字符串要手動去除回車換行。
參考:
https://zh.wikipedia.org/wiki/Base64