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!能够为世界上每个网民提供吃瓜服务。请从多个方向考虑该系统需要改进的地方还有哪些?(数据量,效率,安全性等等)

    需要改进我自己

不过也蛮骄傲的这次作业几乎完全独立完成,没靠过谁
因为大佬在大气层我在地板他们说的我都听不懂

posted @ 2021-02-10 15:51  Exungsh💫  阅读(180)  评论(9编辑  收藏  举报