Homework_2


禁 止 吃 瓜 🍉

我是小魚
剛才有個同學問我小魚發生腎么事了
我說怎么回事?
給我發了一個張截圖,我一看!
噢!原來是昨天發布第二次寒假作業了
我大一了啊沒有閃
來!偷襲!我三歲的小同志
當時就流眼淚了🙂

(編不下去了)

任務

  • 讀取流量數據文件(完成)
  • 總數量、總包長隨每 10K 流量讀取處理完畢,變化的折線圖(未完成!!!有思路晚上琢磨琢磨看能不能整出來
  • 設定閾值 φ 和 Φ
    • 單周期內訪問次數(即數據包數)超過某一閾值 Φ
    • 單周期內數據包累積值(即數據包長累積值)超過某一閾值 φ
  • 檢測出的異常流的 list (完成,通過輸出圖表和列表)

實現方法

python

正文

時間評估

和第一次作業一樣,依然是什么都不會

大方向是python先學到數組和字典,然后學Matplotlib用來繪圖

但是奆佬說Matplotlib太粗陋,所以有能力的話學web(fine現在看來沒有)

Python肝兩天看看能不能搞完,web沒有接觸過時間不好估計

本來以為寒假開始就買python書吃灰的我在第一層,沒想到這波在大氣層

學習的編程語言

Python

過程

准備工作

python學習筆記

安裝Scapy

                     aSPY//YASa
             apyyyyCY//////////YCa       |
            sY//////YSpcs  scpCY//Pp     | Welcome to Scapy
 ayp ayyyyyyySCP//Pp           syY//C    | Version 2.4.4
 AYAsAYYYYYYYY///Ps              cY//S   |
         pCCCCY//p          cSSps y//Y   | https://github.com/secdev/scapy
         SPPPP///a          pP///AC//Y   |
              A//A            cyP////C   | Have fun!
              p///Ac            sC///a   |
              P////YCpc           A//A   | Craft packets like it is your last
       scccccp///pSP///p          p//Y   | day on earth.
      sY/////////y  caa           S//P   |                      -- Lao-Tze
       cayCyayP//Ya              pY/Ya   |
        sY/PsY////YCc          aC//Yp
         sc  sccaCY//PCypaapyCP//YSs
                  spCPY//////YPSps
                       ccaacs

過程坎坷.jpg

我以為從頭開始學python是最難的部分,沒想到scapy是最難的部分,沒有找到很系統的教程,CSDN上寫的看了也非常頭疼,總之就是非常絕望。

先貼參考資料:

scapy中文使用文檔

用scapy分層解析pcap報文

Matplotlib如何繪制多個子圖

還有一些看完就關了,有點不全

程序

使用tcpdump抓包

sudo tcpdump -c 數量 -w 文件名
  • 運行后可以在文件中找到抓取的pcap格式的數據

  • 讀取pcap格式數據可以用wireshark(與主線無關)

處理數據

giao我后來才知道可以用sniff抓包,但是既然抓都抓了將錯就錯fine

直接上代碼

from scapy.all import *
if __name__ == '__main__':
	limit_num = input("Enter the limit of quantity:")
	limit_num = int(limit_num)#獲取數據包數的閾值
	limit_len = input("Enter the limit of lenth:")
	limit_len = int(limit_len)#獲取數據包長累計值的閾值
	pkts_file = rdpcap('test')#讀pcap文件
	pkt_list = pkts_file.res#提取每個包到清單pkt_list

	dos_result_num = {}
	dos_result_len = {}
    
#####################處理數據#####################

	for packet in pkt_list:
    		try:
        		if packet.getlayer(TCP).fields['flags']==2:
                        #這個我也迷惑,好像flag等於2就可以判定進行了一次訪問(SYN包那邊的知識)
            			destination_ip = packet.getlayer(IP).fields['dst']#提取目的地址
            			conn = destination_ip
            			conn_counts = dos_result_num.get(conn,0)#判斷是否有這個鍵值,沒有就返回0
            			dos_result_num[conn] = conn_counts + 1#在返回值的基礎上加1
    		except Exception:
        		pass
		
	for packet in pkt_list:#和統計次數的操作大同小異
    		try:
        		if packet.getlayer(TCP).fields['flags']==2:
            			destination_ip = packet.getlayer(IP).fields['dst']
            			lenth = packet.getlayer(IP).fields['len']
            			conn = destination_ip
            			conn_lenth = dos_result_len.get(conn,0)
            			dos_result_len[conn] = conn_lenth + lenth
    		except Exception:
        		pass
	        		
	from matplotlib import pyplot as plt
	
	conn_len_list = sorted([[conn,lenth] for conn,lenth in dos_result_len.items() if lenth > limit_len],key = lambda x:x[1])
        #提取長度大於設定包長閾值的連接,並且從大到小排序
	conn_num_list = sorted([[conn,num] for conn,num in dos_result_num.items() if num > limit_num],key = lambda x:x[1])
        #提取數量大於設定包數閾值的連接,並且從大到小排序
	
	conn_list_1 = []
	conn_list_2 = []
	lenth_list = []
	num_list = []
	
    #處理需要的數據,為繪圖做准備
    
	for c,l in conn_len_list:
		conn_list_1.append(str(c))
		lenth_list.append(l)
	for c,n in conn_num_list:
		conn_list_2.append(str(c))
		num_list.append(n)
        
#######################繪圖#######################

	print("abnormal_list_quantity")
	for abn in conn_list_1:
		print(abn)
	print("\nabnormal_list_lenth")
	for abn in conn_list_2:
		print(abn)
	plt.subplot(211)#子圖位置第一行第一列
	plt.barh(conn_list_1, lenth_list, height=0.5)
	plt.title('Dos analysis')
	plt.xlabel('Lenth')
	plt.ylabel('Connect')
	
	plt.subplot(212)#子圖位置第二行第一列
	plt.barh(conn_list_2, num_list, height=0.5)
	plt.xlabel('Quantity')
	plt.ylabel('Connect')
	
	plt.show()

運行結果

如果包長閾值太小就會密密麻麻

對包長和包數的統計是獨立的,我左邊的列表輸出應該整個並集來着(馬后炮)

總結

Github鏈接

Click Here

實際用時

  • 一開始python基礎內容的學習基本跟上計划(計划兩天實際兩天半)
  • 后面學scapy就很有抵觸情緒,因為實在做不出來挫敗感爆棚,一拖再拖,幾乎沒什么進展
  • 最后硬着頭皮上整出了這些,有一些功能也沒有實現害 (一開始的雄心壯志是做出骨灰級)

遇到的困難

一語成讖

遇到的困難是相當多

  • 安裝scapy、matplotlib啥的也不是一帆風順,本來想在window上做,但是裝scapy一直滿屏飄紅報錯(雖然后來裝好了),遂放棄,用Linux做。裝matplotlib也蠻坎坷的

  • 主要是scapy沒有找到很系統的教學 有也看不懂 ,在CSDN上看到的又是只言片語一筆帶過

絕望.jpg

這次作業只運用了scapy的冰山一角,但是從頭學scapy不現實,就單獨的問題去找博客獲取的信息又太少,有效獲取信息的能力很欠缺

替老板思考

  • 這些懶懶的技術人員制定的判定規則會出現的問題有哪些?

    如果閾值太低的話(比如上面設置包長100)可能會出現誤殺的情況

  • 如果你是競爭對手,能否找到其他進攻方式繞開該規則,或者通過其他網絡手段有效打擊對手?

    ​可以更改自己的地址,過一會兒換一個,把自己隱藏在正常訪問的用戶中

  • 評估自己的系統的處理效率

    ​運行二十多秒才能出結果,效率極高

  • 老板某日在想桃子:我xxx有一個夢想,建成世界一流 news app!能夠為世界上每個網民提供吃瓜服務。請從多個方向考慮該系統需要改進的地方還有哪些?(數據量,效率,安全性等等)

    需要改進我自己

不過也蠻驕傲的這次作業幾乎完全獨立完成,沒靠過誰
因為大佬在大氣層我在地板他們說的我都聽不懂


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM