[当人工智能遇上安全] 13.威胁情报实体识别 (3)利用keras构建CNN-BiLSTM-ATT-CRF实体识别模型

慈云数据 1年前 (2024-04-13) 技术支持 40 0

《当人工智能遇上安全》系列将详细介绍人工智能与安全相关的论文、实践,并分享各种案例,涉及恶意代码检测、恶意请求识别、入侵检测、对抗样本等等。只想更好地帮助初学者,更加成体系的分享新知识。该系列文章会更加聚焦,更加学术,更加深入,也是作者的慢慢成长史。换专业确实挺难的,系统安全也是块硬骨头,但我也试试,看看自己未来四年究竟能将它学到什么程度,漫漫长征路,偏向虎山行。享受过程,一起加油~

前文讲解如何实现威胁情报实体识别,利用BiLSTM-CRF算法实现对ATT&CK相关的技战术实体进行提取,是安全知识图谱构建的重要支撑。这篇文章将详细结合如何利用keras和tensorflow构建基于注意力机制的CNN-BiLSTM-ATT-CRF模型,并实现中文实体识别研究,同时对注意力机制构建常见错误进行探讨。基础性文章,希望对您有帮助,如果存在错误或不足之处,还请海涵。且看且珍惜!

  • 版本信息:python 3.7,tf 2.2.0,keras 2.3.1,bert4keras 0.11.5,keras-contrib=2.0.8

    在这里插入图片描述

    文章目录

    • 一.ATT&CK数据采集
    • 二.数据预处理
    • 三.安装环境
      • 1.安装keras-contrib
      • 2.安装keras
      • 四.CNN-BiLSTM-ATT-CRF模型构建
      • 五.完整代码及实验结果
      • 六.Attention构建及兼容问题
      • 七.总结

        作者作为网络安全的小白,分享一些自学基础教程给大家,主要是在线笔记,希望您们喜欢。同时,更希望您能与我一起操作和进步,后续将深入学习AI安全和系统安全知识并分享相关实验。总之,希望该系列文章对博友有所帮助,写文不易,大神们不喜勿喷,谢谢!如果文章对您有帮助,将是我创作的最大动力,点赞、评论、私聊均可,一起加油喔!

        前文推荐:

        • [当人工智能遇上安全] 1.人工智能真的安全吗?浙大团队外滩大会分享AI对抗样本技术
        • [当人工智能遇上安全] 2.清华张超老师 - GreyOne: Discover Vulnerabilities with Data Flow Sensitive Fuzzing
        • [当人工智能遇上安全] 3.安全领域中的机器学习及机器学习恶意请求识别案例分享
        • [当人工智能遇上安全] 4.基于机器学习的恶意代码检测技术详解
        • [当人工智能遇上安全] 5.基于机器学习算法的主机恶意代码识别研究
        • [当人工智能遇上安全] 6.基于机器学习的入侵检测和攻击识别——以KDD CUP99数据集为例
        • [当人工智能遇上安全] 7.基于机器学习的安全数据集总结
        • [当人工智能遇上安全] 8.基于API序列和机器学习的恶意家族分类实例详解
        • [当人工智能遇上安全] 9.基于API序列和深度学习的恶意家族分类实例详解
        • [当人工智能遇上安全] 10.威胁情报实体识别之基于BiLSTM-CRF的实体识别万字详解
        • [当人工智能遇上安全] 11.威胁情报实体识别 (2)基于BiGRU-CRF的中文实体识别万字详解
        • [当人工智能遇上安全] 12.易学智能GPU搭建Keras环境实现LSTM恶意URL请求分类

          作者的github资源:

          • https://github.com/eastmountyxz/When-AI-meet-Security
          • https://github.com/eastmountyxz/AI-Security-Paper
          • https://github.com/eastmountyxz/AI-for-Keras

            一.ATT&CK数据采集

            了解威胁情报的同学,应该都熟悉Mitre的ATT&CK网站,前文已介绍如何采集该网站APT组织的攻击技战术数据。网址如下:

            • http://attack.mitre.org

              在这里插入图片描述

              第一步,通过ATT&CK网站源码分析定位APT组织名称,并进行系统采集。

              在这里插入图片描述

              安装BeautifulSoup扩展包,该部分代码如下所示:

              在这里插入图片描述

              01-get-aptentity.py

              #encoding:utf-8
              #By:Eastmount CSDN
              import re
              import requests
              from lxml import etree
              from bs4 import BeautifulSoup
              import urllib.request
              #-------------------------------------------------------------------------------------------
              #获取APT组织名称及链接
              #设置浏览器代理,它是一个字典
              headers = {
                  'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
                      AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
              }
              url = 'https://attack.mitre.org/groups/'
              #向服务器发出请求
              r = requests.get(url = url, headers = headers).text
              #解析DOM树结构
              html_etree = etree.HTML(r)
              names = html_etree.xpath('//*[@]/tbody/tr/td[2]/a/text()')
              print (names)
              print(len(names),names[0])
              filename = []
              for name in names:
                  filename.append(name.strip())
              print(filename)
              #链接
              urls = html_etree.xpath('//*[@]/tbody/tr/td[2]/a/@href')
              print(urls)
              print(len(urls), urls[0])
              print("\n")
              

              此时输出结果如下图所示,包括APT组织名称及对应的URL网址。

              在这里插入图片描述

              第二步,访问APT组织对应的URL,采集详细信息(正文描述)。

              在这里插入图片描述

              第三步,采集对应的技战术TTPs信息,其源码定位如下图所示。

              在这里插入图片描述

              第四步,编写代码完成威胁情报数据采集。01-spider-mitre.py 完整代码如下:

              #encoding:utf-8
              #By:Eastmount CSDN
              import re
              import requests
              from lxml import etree
              from bs4 import BeautifulSoup
              import urllib.request
              #-------------------------------------------------------------------------------------------
              #获取APT组织名称及链接
              #设置浏览器代理,它是一个字典
              headers = {
                  'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
                      AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
              }
              url = 'https://attack.mitre.org/groups/'
              #向服务器发出请求
              r = requests.get(url = url, headers = headers).text
              #解析DOM树结构
              html_etree = etree.HTML(r)
              names = html_etree.xpath('//*[@]/tbody/tr/td[2]/a/text()')
              print (names)
              print(len(names),names[0])
              #链接
              urls = html_etree.xpath('//*[@]/tbody/tr/td[2]/a/@href')
              print(urls)
              print(len(urls), urls[0])
              print("\n")
              #-------------------------------------------------------------------------------------------
              #获取详细信息
              k = 0
              while k"class":"description-body"}):
                      #contents = tag.find("p").get_text()
                      contents = tag.find_all("p")
                      for con in contents:
                          content += con.get_text().strip() + "###\n"  #标记句子结束(第二部分分句用)
                  #print(content)
                  #获取表格中的技术信息
                  for tag in soup.find_all(attrs={"class":"table techniques-used table-bordered mt-2"}):
                      contents = tag.find("tbody").find_all("tr")
                      for con in contents:
                          value = con.find("p").get_text()           #存在4列或5列 故获取p值
                          #print(value)
                          content += value.strip() + "###\n"         #标记句子结束(第二部分分句用)
                  #删除内容中的参考文献括号 [n]
                  result = re.sub(u"\\[.*?]", "", content)
                  print(result)
                  #文件写入
                  filename = "Mitre//" + filename
                  print(filename)
                  f = open(filename, "w", encoding="utf-8")
                  f.write(result)
                  f.close()    
                  k += 1
              'O': 0,
                           'S-LOC': 1, 'B-LOC': 2,  'I-LOC': 3,  'E-LOC': 4,
                           'S-PER': 5, 'B-PER': 6,  'I-PER': 7,  'E-PER': 8,
                           'S-TIM': 9, 'B-TIM': 10, 'E-TIM': 11, 'I-TIM': 12
                           }
              print(label2idx)
              #{'S-LOC': 0, 'B-PER': 1, 'I-PER': 2, ...., 'I-TIM': 11, 'I-LOC': 12}
              #索引和BIO标签对应
              idx2label = {idx: label for label, idx in label2idx.items()}
              print(idx2label)
              #{0: 'S-LOC', 1: 'B-PER', 2: 'I-PER', ...., 11: 'I-TIM', 12: 'I-LOC'}
              #读取字符词典文件
              with open(char_vocab_path, "r", encoding="utf8") as fo:
                  char_vocabs = [line.strip() for line in fo]
              char_vocabs = special_words + char_vocabs
              print(char_vocabs)
              #['
微信扫一扫加客服

微信扫一扫加客服