前言
通常小黑子们的监控设备上面 一条告警是这样格式的:
信息通常是按照:
攻击时间 攻击ip 攻击ip地址 被攻击端口 情报类型 威胁等级 处理动作 ···
这样构成的。
通常小黑子需要上报的 Excel 表是这样制作的:
信息通常是按照:
序号 单位所在网络区域 小黑子监控设备 小黑子姓名 攻击时间 攻击ip地址 被攻击ip 攻击类型 攻击类别 ···
这样构成的。
观察发现,其实主要也就是将告警的信息顺序换一下,然后添加一些固定的(比如个人姓名,检测设别)等固定信息,然后就可完成上报。
开始是用 python 爬虫写的,爬取告警数据进行处理,后来在实用中发现用 python 写的脚本需要抓取登录 cookie 然后有的设备还有防爬的设置啥搞不懂的玩意儿,整的很复杂,而且不好跟大家介绍。就淘汰了这种方案。
后来不通过 python 进行爬虫,而是从浏览器粘贴告警数据,然后将数据复制进运行的 python 脚本中,通过 python 对字符串的处理将告警改为上报的格式。开始挺好用的,随着告警越来越多,发现一条告警要从浏览器复制进脚本,在从脚本复制了拿去上报,好复杂,又把这一版脚本淘汰。
一天晚上趁着告警少看片的时候,突然临鸡一动,直接在浏览器里执行脚本然后直接让脚本在页面拿加载好的数据然后处理不就狠完美了,我一想 JavaScript 不正完美解决需求?开整!
成果展示
受到新攻击提示:弹窗提示信息并将告警转换成要求的格式
一般提示:
开整
整体的思路就是:
从页面拿指定数据 –》把拿到的数据重新排序 –》判断是否告警提示弹窗
定义相关变量保存响应数据
var count = 1;//告警提示次数
var latested_ip = undefined; //历史ip记录变量
var newest_ip = undefined; //新IP记录变量
var new_Msg = undefined; //记录最新告警信息
var attack_time = undefined; //攻击时间
var attack_ip = undefined; //攻击ip,与newest_ip相同
var attacked_ip = undefined; //被攻击ip
var attack_type = undefined; //攻击类型
var device = undefined; //检测设备
var guard = undefined; //值守人
var attack_address = undefined; //攻击ip地区
var result_BeeBEEP = undefined; //将结果输出为小蜜蜂上报格式
var result_Excel = undefined //将结果输出为 Excel 上报格式
因为我们甲方要求一条告警需要以一个格式发在群里(群名为 BeeBEEP ),然后在记录在Excel表中,因此在我个人的版本里有两次转换流程。
第一步:拿数据
在浏览器监控页面上按 F12
可以从图片中看到,攻击ip在页面中被存放在一个 <td class=”ant-table-cell”> 标签下,通过对页面的观察发现,告警中所有的 信息都包含在同样的标签下。那么只需抓取这也标签里的信息即可获得需要的数据。
new_Msg = document.querySelectorAll("td[class='ant-table-cell']");
通过这个语句可以获页面中所有的class为ant-table-cell,标签为td的元素及其内容,在按F12后,点击进入浏览器控制台,然后输入代码,即可看到已抓取所有的目标标签。这些标签被以数组的形式存放在new_Msg中
拿到标签后,需要获得标签里的内容,这里通过innerHTML方法可以实现,并将响应数据赋值给对应变量:
newest_ip = new_Msg[1].innerHTML;
//从标签中获取并记录最新告警的信息
attack_time = new_Msg[0].innerHTML;
attack_ip = new_Msg[1].innerHTML; //与newest_ip相同
attacked_ip = new_Msg[3].innerHTML;
attack_type = new_Msg[5].innerHTML;
attack_address = new_Msg[2].innerHTML;
device = "***";
guard = "***";
在浏览器调试中运行代码,结果与预期一致,剥离出了告警中需要的信息。
第二步:数据处理
result_BeeBEEP = attack_ip + '-' + attacked_ip + '-' + attack_type + '-' + device + '-' + attack_time;
attack_time = attack_time.replaceAll("-", "/");
result_Excel = device + ',' + guard + ',' + attack_time + ',' + attack_ip + ',' + attacked_ip + ',' + attack_type + ',' + attack_type;
得到了分别的告警数据后就是将各个变量的值按照要求的格式输出,在浏览器里看看执行效果,完美!
每一行的两处打码的地方分别是攻击ip(前),被攻击ip(后)。效果深得我心,朕甚是满意。
第三步:判断是否告警提示弹窗
思路:定时刷新页面,将每次刷新前后的攻击ip进行对比,如果不一样,就说明有新告警,并对该条告警进行数据处理步骤
因为我检测的设备不具有自动刷新的功能,因此我给自己的脚本加了个自动刷新的功能:
刷新功能实现思路:看页面刷新按钮的特征,用JavaScript实现点击效果:
在浏览器调试窗口中发现查询按钮的特征,通过JavaScript找到具有该特征的元素,然后通过click()方法实现点击。
var dom_refresh = document.querySelectorAll("button[class='ant-btn ant-btn-primary']");
dom_refresh[0].click();
在控制台执行此代码发现页面进入刷新状态,并且成果刷新 。
在定义变量时,我们定义latested_ip
和newest_ip
分别记录刷新前最近的ip和刷新后最新的ip,通过对比这俩值可以得到是否有新告警产生。
//新旧告警ip比对并根据结果发起通知
if (latested_ip != newest_ip) {
//将告警转换成BeeBEEP上报格式
toBeeBEEP();
//将告警转换成BeeBEEP上报格式
toExcel();
console.log("第 " + count + " 次提示: " + "===================== 有 告 警 【 来自 --> " + attack_address +
" <-- 的攻击 】=====================")
count = count + 1;
alert("发 现 新 告 警,来自 -- 【 " + attack_address + " 】 -- 的攻击");
} else {
console.log("第 " + count + " 次提示: " + "无 告 警")
count = count + 1;
//输出分割线
console.log("-------------------");
}
逻辑完善
为了省心,代码肯定是需要能够自己一直循环运行下去的,通过setInterval(function(){},time) 方法可以实现,这个方法第一个参数是一个匿名函数,我们直接将要进行的动作放在函数体(就是大括号里)即可,第二个参数是时间间隔,单位是毫秒,就是每个多少毫秒执行一次第一个参数里的函数。将上面产生的代码写进这一对大括号里即可。
有心者发现了我将这个setInterva赋值给了一个叫Controler的对象,这是因为甲方突然要看我电脑日志,一会刷新一会刷新给甲方气坏了,然后我通过对Controler对象的操作我可以随时结束循环,达到更好的控制效果。
反思
暂无评论内容