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上写的看了也非常头疼,总之就是非常绝望。
先贴参考资料:
还有一些看完就关了,有点不全
程序
使用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!能够为世界上每个网民提供吃瓜服务。请从多个方向考虑该系统需要改进的地方还有哪些?(数据量,效率,安全性等等)
需要改进我自己
不过也蛮骄傲的这次作业几乎完全独立完成,没靠过谁
因为大佬在大气层我在地板他们说的我都听不懂
Homework_2的更多相关文章
- C语言递归函数讲解
递归函数是什么? 是函数.................... 你可以把它理解成是for循环与死循环的结合的函数.简单的说:递归函数是有条件终止的死循环函数: 死循环函数这里是指在函数体中调用自身: ...
- 结对作业——随机生成四则运算(Core 第7组)
结对作业 ——随机生成四则运算(core第7组) 吕佳玲 PB16060145 涂涵越 PB16060282 GITHUB地址 https://github.com/hytu99/homework_2 ...
- java基础之完数判断
完数: 完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数.它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身.如果一个数恰好等于它的因子之和,则称该 ...
- Linux 常见文件管理命令
Linux文件系统 根目录:/ 从根目录开始,下面有一堆小目录 root:根用户的目录 bin:可执行文件命令 etc:配置文件 var:日志 lib:安装包或头文件,库文件 home:所有用户的家目 ...
- 工程课Linux第一节笔记
上课笔记 文件系统结构 /根目录 /bin/ 存放系统命令,普通用户与root都可以执行 /etc/ 配置文件保存位置 /lib/ 系统调用的函数库保存位置 /var/ 目录用于存储动态数据,例如缓存 ...
随机推荐
- 【LeetCode】712. Minimum ASCII Delete Sum for Two Strings 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- TensorFlow.NET机器学习入门【4】采用神经网络处理分类问题
上一篇文章我们介绍了通过神经网络来处理一个非线性回归的问题,这次我们将采用神经网络来处理一个多元分类的问题. 这次我们解决这样一个问题:输入一个人的身高和体重的数据,程序判断出这个人的身材状况,一共三 ...
- Linq和Lambda 性能对比
Linq和Lambda 性能对比 1.Where() 使用LINQ创建一个简单的where查询 var query = from person in PersonCollection where pe ...
- 知识增强的预训练语言模型系列之ERNIE:如何为预训练语言模型注入知识
NLP论文解读 |杨健 论文标题: ERNIE:Enhanced Language Representation with Informative Entities 收录会议:ACL 论文链接: ht ...
- [opencv]白平衡算法中的灰度世界法,改善图像发红发蓝发绿的现象
#include<iostream> #include <opencv2/opencv.hpp> #include <math.h> using namespace ...
- 【MySQL作业】SELECT 数据查询——美和易思select 选择列表应用习题
点击打开所使用到的数据库>>> 1.查询所有客户的地址和电话号码. SELECT address, phone FROM customer 2.查询所有商品的名称.种类和单价信息. ...
- C# 执行Javascript脚本
前一阵子使用C#编写SCXML状态机,需要解析EMCScript表达式,使用了Jint库(https://github.com/sebastienros/jint/),当时感觉与C#之间的数据转换不是 ...
- .net core获取本地Ip地址的方法
笔记: /// <summary> /// 获取本地Ip地址 /// </summary> /// <returns></returns> public ...
- JZOJ5405 & AtCoder Grand Contest 001 F. Permutation
题目大意 给出一个长度为\(n\)的排列\(P\)与一个正整数\(k\). 你需要进行如下操作任意次, 使得排列\(P\)的字典序尽量小. 对于两个满足\(|i-j|>=k\) 且\(|P_i- ...
- Swoole 中毫秒定时器(Timer)的使用
间隔定时器, tick 定时器会持续触发,直到调用 clear() 清除为止. $timer = Swoole\Timer::tick(3000, function (int $timer_id, $ ...