程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 用C#打造匿名郵件群發軟件

用C#打造匿名郵件群發軟件

編輯:C#入門知識

From 黑客防線

電子郵件攻擊是最常見的網絡攻擊手法之一,黑客們通過電子郵件發送木馬、病毒或是包含有攻擊性或信息獲取腳本的特定html代碼,使郵箱使用者打開這類郵件就會導致信息洩露甚至電腦被控制。而這種攻擊手法常常要和“社會工程學”結合起來,信件要求偽裝成郵箱使用者熟悉的發信人,以迷惑對方使其放松警惕,來達到獲得重要信息和控制對方電腦的目的。為了深入的了解這種攻擊方法,前段時間我打算在網上找一個免費好用的匿名郵件群發軟件,來實際測試發送偽造信件的效果,結果上網轉了一大圈也沒找到一個稱心如意的,不是收費就是試用,插件廣告一大堆,想來郵件群發軟件是被所謂的“郵件營銷”用的太多太濫,難得找到好用而且免費的了。仔細想想有這時間精力去網上瞎找,還不如自己寫一個合適的匿名群發器呢。有了源代碼就掌握了主動權,以後想怎麼改都行,再不用看那些“垃圾”郵件群發器的“臉色”了。哈哈,自己動手,豐衣足食,讓我們准備好Visual Stdio.NET開發環境,開始編寫屬於自己的匿名郵件群發軟件。
一、匿名發送原理
現在廣泛使用的郵件發送協議是ESMTP,是由SMTP協議發展而來,SMTP協議由於沒有身份認證等功能早已不被郵件服務提供商采用,當然如果我們自己架設郵件發送服務器的話可以使用該協議,因為該協議不用身份認證就可以實現完全的匿名郵件發送。現在還有很多免費郵件服務提供商讓用戶通過網頁登錄的方式來進行郵件的收發,這種WebMail的方式和上面所說的SMTP協議方式不在本文討論之列,本文程序采用的ESMTP協議是被現在流行的郵件服務提供商廣泛采用的郵件發送協議。在開始編程之前我們首先需要一個支持該協議的郵箱用於發信測試,現在大家使用的大部分郵箱都支持的。在這裡我選163、新浪信箱進行測試。下面我們就通過telnet方式手工發送一封匿名郵件,以了解ESMTP協議和匿名效果(注:前面帶“>”號的是輸入命令) 復制內容到剪貼板
代碼:
>telnet smtp.163.com 25     //163郵件發送服務器的域名和端口
220 163.com Anti-spam GT for Coremail System (163com[20081010])
>HELO VVVVVV                //告訴服務器我的機器名,當然是偽造的
250 OK
>AUTH LOGIN                 //要求輸入用戶名密碼
334 dXNlcm5hbWU6
>aWAsDSFc                   //Base64編碼過的用戶名
334 UGFzc3dvcmQ6
>GzlzNMUz                   //Base64編碼過的密碼
235 Authentication successful        //提示認證成功
>MAIL FROM:<[email protected]>  //發件地址,這個必須是與上面輸
      //入的用戶名對應的郵箱地址,163服務器會驗證,否則無法發信。
250 Mail OK
>RCPT TO:<[email protected]>   //真實的收件人地址
250 Mail OK
>DATA      //要求發送郵件內容
354 End data with <CR><LF>.<CR><LF>
>From: "fajianren" <[email protected]>     //偽造的發信人地址
>To: "shoujianren" <[email protected]>    //偽造的收信人地址
>Subject: helloo Helloo        //郵件主題
>tfffffffffffffffff           //郵件正文
>
>.                             //輸入結束標志
250 Mail OK queued as smtp2,DNGowLD7TkkxNiZKCZ+FCg--.33908S3 1244018310
>quit                          //退出
221 Bye現在我們登錄到收件箱發現已經收到了這封偽造郵件,單從表面上看,我們是分辨不出它的真偽。原因在於ESMTP協議本身存在問題,它允許郵件發送者自己填寫發件人和收件人的地址和姓名而並不檢查,這就導致了偽造電子郵件的出現。


二、C#編寫匿名群發
下面,開始編程實現匿名郵件群發功能。這裡使用C#中封裝好的TcpClient類,它可以直接為TCP網絡服務提供客戶端連接,不用再使用復雜的socket套接字接口類了。收件人列表和發件帳戶列表分別存放和顯示在richTextBox和ListView控件中,以實現使用不同帳戶發送大量郵件的功能。這樣做是為了避免同一郵箱帳戶在同一段時間內因發送大量郵件而被郵件服務提供商鎖定。以下是程序匿名發送部分的一些代碼: 復制內容到剪貼板
代碼:
  for (int i = 0; i < richTextBox2.Lines.Length; i++)  //發送次數
  {//建立與SMTP服務器的套接字
    TcpClient SmtpServ = new TcpClient(SMTPHoststr, 25);
    NetworkStream NetStrm = SmtpServ.GetStream();
    StreamReader RDStrm = new StreamReader(SmtpServ.GetStream());
    Data = "HELO server " + CRLF; //在這裡我們就默認叫server吧
    szData = System.Text.Encoding.ASCII.GetBytes(Data.
                          ToCharArray());
NetStrm.Write(szData, 0, szData.Length);
//發送要求認證命令
Data = "AUTH LOGIN " + CRLF;
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData, 0, szData.Length);
//發送base64編碼過的用戶名
byte[] b = System.Text.Encoding.ASCII.GetBytes(namestr);
string s = Convert.ToBase64String(b);
Data = s + CRLF;
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData, 0, szData.Length);
//發送base64編碼過的密碼
b = System.Text.Encoding.ASCII.GetBytes(passwordstr);
s = Convert.ToBase64String(b);
Data = s + CRLF;
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData, 0, szData.Length);
//發送發件人信息
Data = "MAIL FROM: " + "<" + Senderstr + ">" + CRLF;
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData, 0, szData.Length);
//發送接收人信息
Data = "RCPT TO: " + "<" + richTextBox2.Lines[i].ToString() + ">" + CRLF;
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData, 0, szData.Length);
listBox1.Items.Add(RDStrm.ReadLine());
//發送Data命令
Data = "DATA" + CRLF;
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData, 0, szData.Length);
//發送數據內容 其中包括偽造的發、收件人地址和姓名;
Data = ChangeString + "SUBJECT: " + textBox4.Text + CRLF + MIMEString +
       CRLF + richTextBox1.Text + CRLF;
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData, 0, szData.Length);
Data = CRLF + "." + CRLF;
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData, 0, szData.Length);
//退出SMTP服務器
Data = "QUIT " + CRLF;
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData, 0, szData.Length);
// 關閉連接
NetStrm.Close();
RDStrm.Close();
  }以上只是部分代碼,整個程序編寫完成後能夠實現通過輸入多個支持ESMTP協議的郵箱帳戶向大量郵箱發送匿名郵件的功能。
三、程序效果
通過該程序向多個不同的郵件服務提供商郵箱發送匿名測試郵件,包括yahoo、hotmail、gmail、yeah、163、126、qq、sina郵箱(申請這麼多種信箱搞測試,累呀),測試發件帳戶選用的是163信箱,郵件的查看方式采用的是登錄到郵箱頁面上直接查看,結果表明,除了發送到hotmail郵箱的匿名測試郵件在打開後會顯示真實的發信人郵箱地址外其余均能夠正常實現匿名。
   
四、防范方法
如何有效的防范這些匿名的郵件,以避免被網絡釣魚郵件所欺騙呢?最有效的方法就是仔細分析可疑郵件的郵件頭信息。在郵件頭中包含的Received字段可以顯示出郵件發送的完整軌跡。在郵件被發往目的地的過程中,每個中轉服務器都會在郵件頭中增加一條Received字段,這樣一個郵件中就會有多條Received字段。所以要追蹤到郵件的來源,可以采用自下向上的分析

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved