September 22, 2017, Friday, 264

Botnet Notify

出自TYRC

跳轉到: 導覽, 搜尋

Botnet自動通告與查詢系統


目錄

壹. 動機

2013年桃園區網啟用IPS (Intrusion Detection System , PaloAlto 5060),協助管理 P2P 智財權影片流量、支援區網的多元流量及資訊安全防護工作. 維護團隊在摸索各項設定功能時發現: 該設備提供 Botnet 感染主機列表. 若能實作一簡單的中介系統,自動 email 通告負責之網管人員, 對整體連網的正常運作卻會有相當大的助益.

由於IPS依據簡易的資訊判別 Botnet 感染主機的依據: 某IP主機 到訪某Botnet C&C Server N次,並依據其連結Botnet Server的頻次,給予一判別信賴程度. 在成功設定IPS將每日Bonet 資訊寄發到指定的email account, Botnet 通告系統 crontab 會自動 擷取 IPS 的Botnet感染紀錄、萃取 主機IP address,據以 query Rwhoisd,取得負責網管人員、並據以 email 通告負責網管人員協助用戶清理主機.並於技術管理會議宣導,結合連線學校網管人力利用此工具,對抗 Botnet 大軍快速蔓延的威脅.


貳.系統架構

Botnet自動通告與查詢系統包括: Botnet資料擷取子系統(圖2.1)及自動通告與查詢子系統 (圖2.2)兩大部分. 首先, 系統執行 資料擷取之前置處理,自動連接 Email server讀信,並取附於Email的pdf夾檔、將 pdf檔轉存text檔、擷取每筆Botnet紀錄內容存入資料庫.其後,自動通告與查詢子系統

參.資料前置處理子系統

萃取Email的pdf夾檔

ExtPalo.java (表 3.1 )藉由 JavaMail API (javax.mail.* ) 自動連接 Email server讀信,並萃取附於Email的pdf夾檔.


表 3.1 ExtPalo.java


…
import javax.mail.*;
import javax.mail.internet.*;

public  class ExtPalo {
     …
   Properties properties = System.getProperties();
   Session session = Session.getDefaultInstance(properties);
   Store store = session.getStore("pop3");
   store.connect(host, username, password);
   Folder folder = store.getFolder("INBOX");
   folder.open(Folder.READ_WRITE);
   BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
   Message message[] = folder.getMessages();
   for(int i = 0; i<message.length; i++){
      subject = message[i].getSubject();
      Object content = message[i].getContent();
      if (content instanceof Multipart) {
            handleMultipart((Multipart)content);
       } else {
            handlePart(message[i]);
      }
   }
   folder.close(true);
   store.close();
   }

public static void handleMultipart(Multipart multipart) throws MessagingException, IOException {
   for (int i=0; i<multipart.getCount(); i++){
     handlePart(multipart.getBodyPart(i));
   }
}

public static void handlePart(Part part)  throws MessagingException, IOException {
    String dposition = part.getDisposition();
    String cType = part.getContentType();

        if (dposition == null) {
            System.out.println("Null: "  + cType);
             if ((cType.length() >= 10) && (cType.toLowerCase().substring(0, 10).equals("text/plain")) ) {
                  saveFile("palo.pdf", part.getInputStream());
                  // saveFile(aisac_id + ".html", part.getInputStream());
              } else {
                part.writeTo(System.out);
                saveFile("other.add", part.getInputStream());
             }
        }
        else if (dposition.equalsIgnoreCase(Part.ATTACHMENT) ) {
               attachfn= part.getFileName();
               saveFile(attachfn , part.getInputStream());
          } else if (dposition.equalsIgnoreCase(Part.INLINE) ) {
            System.out.println("Inline: " + part.getFileName() +  " : " + cType);
             saveFile(part.getFileName(), part.getInputStream());
        } else {
            System.out.println("Other: " + dposition);
        }
    }
….
...


轉存 text文字檔/擷取Botnet紀錄內容


藉由 itextpdf API (com.itextpdf.text.pdf.*) ,ExtBotnet.java 讀取 pdf檔(表 3.2), 並存成 text文字檔、擷取每筆Botnet紀錄內容: {判別信賴程度, 主機IP address, 簡單判定理由,日期} 存入資料庫


表 3.2 ExtBotnet.java

import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.parser.PdfReaderContentParser;
import com.itextpdf.text.pdf.parser.SimpleTextExtractionStrategy;
import com.itextpdf.text.pdf.parser.TextExtractionStrategy;

  public static final String PREFACE = “/Palo/Attach/" + day_file + ".pdf";
     public static final String RESULT = day_file + ".txt";
   
    public static void parsePdf(String pdf, String txt) throws IOException {
        PdfReader reader = new PdfReader(pdf);
        PdfReaderContentParser parser = new PdfReaderContentParser(reader);
        PrintWriter out = new PrintWriter(new FileOutputStream(txt));
        TextExtractionStrategy strategy;
        for (int i = 1; i <= reader.getNumberOfPages(); i++) {
            strategy = parser.processContent(i, new SimpleTextExtractionStrategy());
            out.println(strategy.getResultantText());
        }
        out.flush();
        out.close();
    }



增列IP 對應之網管人員及其連絡 email

藉由 Java Net API (java.net.*), BotnetWhois.java 連接 rwhoisd server 查詢主機IP 對應之網管人員及其連絡 email, 存入資料庫紀錄, 作為自動email通告的基礎.


肆.自動通告與查詢子系統

自動通告與查詢子系統(圖 2.2) 查詢資料庫之Botnet感染紀錄、萃取 主機IP address, query Rwhoisd server,取得負責網管人員訊紀錄、並 email 通告負責網管人員協助用戶清理主機.組成包括: Botnet.java (Bean)、BotnetDAO.java (Data Access Object) 、Main_Botnet.java () 、Main_ Botnet_Png.java (統計繪圖) 、botnet.zul 及searchBotnetMvc.zul 網頁.


(一) Java Bean程式 Botnet.java 定義了Botnet IP 位址_ip 及欲觀察的 指標項目:cpu_mgt、 cpu_data、 sess_rate、high_temp、low_temp及created﹙記錄日期﹚及其對應之get 及set methods. 


(二) Dao (Data Access Object) 程式 BotnetDAO.java 繼承com.google.code.morphia.dao.BasicDAO, 首先,指定透過Google Morphia 使用mongo DB 之“todo" collection. 再透過 其 filter 篩選及order排序 功能, 找出當日存入之各筆 Botnet主機紀錄,並依增序排列.


(三) 統計繪圖程式 Main_Botnet_Png.java 會被 crontable 定時執行, 呼叫BotnetDAO.java 程式, 取得該年度的各筆 Botnet紀錄,加總各單月的主機數量,建立 jFreechart dataset,建立chart圖形後, 並轉存成PNG image檔.


(四) 使用介面程式 (View)  botnet.zul 檔透過 zk framework將jFreechart 圖檔顯示到瀏覽網頁(圖4.2).使用者可以觀察到區網中心單月的Botnet主機通告量變化狀況.


(五) 自動通告網管

伍. Botnet通告紀錄查詢網頁

  searchBotnetMvc.zul 檔透過 zk framework提供瀏覽網頁(圖5.1).使用者可以鍵入部分的 IP 位址 或 部分的日期資訊, 查詢到對應之Botnet主機通告紀錄,觀看Botnet 排除狀況.

陸. 結語

桃園區網中心以IPS設備提供之 Botnet 感染主機資訊.實作一簡單的中介系統, 自動 擷取 IPS 的Botnet感染紀錄、萃取 主機IP address, query Rwhoisd server,取得負責網管人員訊紀錄、並 email 通告負責網管人員協助用戶清理主機.

為追蹤 Botnet感染主機之處理狀況,系統整合 Zk framework與 Google Morphia 及儲存於資料庫的紀錄,實作 Botnet 查詢介面與 Botnet感染主機數量統計圖, 提供使用者觀察單月的Botnet主機通告量變化、 查詢Botnet主機通告紀錄,觀看Botnet 排除狀況.結合連線學校網管人力利用此工具,對抗 Botnet 大軍快速蔓延的威脅.


參考文獻

1. Receive Email using POP3, http://www.rgagnon.com/javadetails/java-receive-email-using-pop3.html

2. Welcome To JFreeChart, http://www.jfree.org/jfreechart/

3. JFreeChart: Line Chart Demo, http://www.java2s.com/Code/Java/Chart/JFreeChartLineChartDemo6.htm