禁 止 吃 瓜 🍉
我是小魚
剛才有個同學問我小魚發生腎么事了
我說怎么回事?
給我發了一個張截圖,我一看!
噢!原來是昨天發布第二次寒假作業了
我大一了啊沒有閃
來!偷襲!我三歲的小同志
當時就流眼淚了🙂
(編不下去了)
任務
- 讀取流量數據文件(完成)
- 總數量、總包長隨每 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上寫的看了也非常頭疼,總之就是非常絕望。
先貼參考資料:
還有一些看完就關了,有點不全
程序
使用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鏈接
實際用時
- 一開始python基礎內容的學習基本跟上計划(計划兩天實際兩天半)
- 后面學scapy就很有抵觸情緒,因為實在做不出來挫敗感爆棚,一拖再拖,幾乎沒什么進展
- 最后硬着頭皮上整出了這些,有一些功能也沒有實現害
(一開始的雄心壯志是做出骨灰級)
遇到的困難
一語成讖
遇到的困難是相當多
-
安裝scapy、matplotlib啥的也不是一帆風順,本來想在window上做,但是裝scapy一直滿屏飄紅報錯(雖然后來裝好了),遂放棄,用Linux做。裝matplotlib也蠻坎坷的
-
主要是scapy沒有找到很系統的教學
有也看不懂,在CSDN上看到的又是只言片語一筆帶過
絕望.jpg
這次作業只運用了scapy的冰山一角,但是從頭學scapy不現實,就單獨的問題去找博客獲取的信息又太少,有效獲取信息的能力很欠缺
替老板思考
-
這些懶懶的技術人員制定的判定規則會出現的問題有哪些?
如果閾值太低的話(比如上面設置包長100)可能會出現誤殺的情況
-
如果你是競爭對手,能否找到其他進攻方式繞開該規則,或者通過其他網絡手段有效打擊對手?
可以更改自己的地址,過一會兒換一個,把自己隱藏在正常訪問的用戶中
-
評估自己的系統的處理效率
運行二十多秒才能出結果,
效率極高 -
老板某日在想桃子:我xxx有一個夢想,建成世界一流 news app!能夠為世界上每個網民提供吃瓜服務。請從多個方向考慮該系統需要改進的地方還有哪些?(數據量,效率,安全性等等)
需要改進我自己
不過也蠻驕傲的這次作業幾乎完全獨立完成,沒靠過誰
因為大佬在大氣層我在地板他們說的我都聽不懂