开发思路

分类

分成不同的类别。工控、木马、漏洞。每个类别下面,配套相应的模板。

txt

文档有固定的模板,和文字内容。需要替换一些特定的部分,比如sid,比如cve,比如msg。将这些需要替换的部分,写入变量,python运行的时候,可以在终端输入要填入的变量部分。然后写回txt。手动写回部分,可以适用于那些需要查资料才能写出来的东西。

rules

python也需要一个自动化填写的部分,依然是在txt里面设置变量。但是python也需要读取rule文件,将msg、sid、cve自动匹配读取出来,填入txt的相应变量中。这些过程自动实现,读取rule,写入txt。

最终思路

手动写回功能

适用于那些需要查资料的部分。这部分的py,最开始需要一个输出,读取rule文件,将msg、cve打印出来。

需要输入,按顺序来提示相应的txt变量部分。查资料后,手动将这部分内容输入。需要手动输入的内容有:msg的翻译,漏洞导致的结果、CVE内容、造成的影响(和msg翻译内容一样,所以采用一个变量,统一填入)、影响的系统、漏洞类型、攻击链(对于漏洞模板来说,等级、攻击链这些变动的不多,所以可以适当减少变量。根据模板不同来调整)、目标设备(和影响的系统一致,采用一个变量,统一填入)

自动写入功能

适用于可以从rule中直接读取,然后填入txt中的内容。py将会自动化实现。需要自动匹配的内容有:sid、CVE编号。读入rule,写进txt。

修改文件名

文件最终需要修改为sid.txt

自动生成language.txt

将获取到的手动输入的自动翻译,生成一个翻译文档

实现过程

难点一:解决txt中变量定义的问题

在固定位置设置特殊字符__SID__来占位。之后用具体的数据来替换掉这个占位符,就可以起到一个变量的作用

难点二:一个rule文件有多条rule,怎么能准确匹配到需要的那个rule

在每个py功能执行前,都需要输入sid。在读取文本时,会先根据sid,再读特定的rule。去匹配。但是这个功能不好实现。暂时先不实现。手动将所有的rule都提取出来,变成一个单独的文本。

手动替换文档里的rule.txt。每次一条

难点三:获取文本中特定的内容

查找位置(返回的是查找内容所在数组位置)https://blog.csdn.net/weixin_43718786/article/details/114102454

分割(找到之后,如何将需要的内容提取出来) https://blog.csdn.net/weixin_43718786/article/details/114102454

输出特定位置的字符:https://blog.csdn.net/qq_51574759/article/details/116807925

难点四:更复杂的匹配

匹配想要内容的时候,可以用正则匹配【待定】

代码参考

已同步至GitHub,文档内容涉密,所以将文档部分改动。可以参考代码思想。

https://github.com/Gryffinbit/AutoDoc/tree/main

import codecs
import re
import os, sys
from shutil import copyfile


def sidReturn():
    return sid


def cveReturn():
    return cve


class Auto:
    # 不需要输出和输入、自动化进行替换
    def __init__(self):
        self.contents_rule = None
        self.contents_tmpl = None

    def init(self):
        self.read()
        self.replace()
        self.test()
        sidReturn()
        cveReturn()

    def read(self):
        # 读取规则文档
        with open('/Users/gryffinbit/PycharmProjects/AutoDoc/工控模板/rule.txt', 'r', encoding='gb2312') as f0:
            contents_rule = f0.read()
            self.contents_rule = contents_rule

        # 读取Template规则文档
        with open("/Users/gryffinbit/PycharmProjects/AutoDoc/工控模板/Template_ICS.txt", 'r', encoding='gb2312') as f1:
            contents_tmpl = f1.read()
            self.contents_tmpl = contents_tmpl

    def replace(self):
        # 在rule中查找sid、cve编号
        sid_loc_rule = self.contents_rule.rfind('sid:')
        sid_row_rule = self.contents_rule[int(sid_loc_rule) + 4:]
        cve_loc_rule = self.contents_rule.rfind('cve')
        cve_row_rule = self.contents_rule[int(cve_loc_rule) + 4:]
        # 提取已经获取到的sid、cve
        global sid
        global cve
        sid = sid_row_rule.split(";")[0]  # 提取分割后的前半部分。引号中的是查找的特定内容
        cve = str("CVE-") + cve_row_rule.split(";")[0]
        # 替换Template规则文档的sid、cve
        self.contents_tmpl = self.contents_tmpl.replace("__SID__", str(sid))
        self.contents_tmpl = self.contents_tmpl.replace("__CVE__", str(cve))

        # 将已经替换好的内容写入
        with open('Template_ICS.txt', 'w', encoding='gb2312') as f2:
            f2.write(self.contents_tmpl)

    def test(self):
        # print(self.contents_rule)
        print("自动化替换成功\n-------------------")


class Interact:
    # 手动替换,需要进行输出输入,进行人工的交互
    def __init__(self):
        self.msg_ch = None
        self.contents_tmpl_interact = None
        self.contents_rule_interact = None

    def init(self):
        self.read()
        self.display()
        self.write()
        self.translate()

    def read(self):
        # 读取规则文档
        with open('/Users/gryffinbit/PycharmProjects/AutoDoc/工控模板/rule.txt', 'r', encoding='gb2312') as f3:
            contents_rule_interact = f3.read()
            self.contents_rule_interact = contents_rule_interact

        # 读取Template规则文档
        with open('Template_ICS.txt', 'r', encoding='gb2312') as f4:
            contents_tmpl_interact = f4.read()
            self.contents_tmpl_interact = contents_tmpl_interact

    def display(self):
        # 最开始需要一个输出,读取rule文件,将msg、cve打印出来。适用于那些需要查资料的部分。
        print(cve)
        msg_loc_rule = self.contents_rule_interact.rfind('msg:')
        msg_row_rule = self.contents_rule_interact[int(msg_loc_rule) + 4:]
        msg = msg_row_rule.split(";")[0]
        print(msg)

    def write(self):
        """ msg翻译内容 """
        print("输入msg翻译")
        msg_ch = input()
        self.msg_ch = msg_ch
        # 替换到相应的位置
        self.contents_tmpl_interact = self.contents_tmpl_interact.replace("__MSG__", str(msg_ch))
        # 将已经替换好的内容写入
        with open('Template_ICS.txt', 'w', encoding='gb2312') as f5:
            f5.write(self.contents_tmpl_interact)

        """ 漏洞造成的影响 """
        print("输入漏洞造成的影响")
        info = input()
        # 替换到相应的位置
        self.contents_tmpl_interact = self.contents_tmpl_interact.replace("__info__", str(info))
        # 将已经替换好的内容写入
        with open('Template_ICS.txt', 'w', encoding='gb2312') as f5:
            f5.write(self.contents_tmpl_interact)

        """ CVE内容 """
        print("输入CVE的内容")
        cve_info = input()
        # 替换到相应的位置
        self.contents_tmpl_interact = self.contents_tmpl_interact.replace("__CVEINFO__", str(cve_info))
        # 将已经替换好的内容写入
        with open('Template_ICS.txt', 'w', encoding='gb2312') as f5:
            f5.write(self.contents_tmpl_interact)

        """ 影响的系统 """
        print("输入影响的系统")
        affect_s = input()
        # 替换到相应的位置
        self.contents_tmpl_interact = self.contents_tmpl_interact.replace("__AS__", str(affect_s))
        # 将已经替换好的内容写入
        with open('Template_ICS.txt', 'w', encoding='gb2312') as f5:
            f5.write(self.contents_tmpl_interact)

        """ 漏洞类型(其他漏洞利用、信息泄露漏洞利用等)"""
        print("输入漏洞类型")
        cve_type = input()
        # 替换到相应的位置
        self.contents_tmpl_interact = self.contents_tmpl_interact.replace("__Type__", str(cve_type))
        # 将已经替换好的内容写入
        with open('Template_ICS.txt', 'w', encoding='gb2312') as f5:
            f5.write(self.contents_tmpl_interact)

        """ 所属攻击链(可属于不同阶段、执行等)"""
        print("输入所属攻击链")
        kill_chain = input()
        # 替换到相应的位置
        self.contents_tmpl_interact = self.contents_tmpl_interact.replace("__KCType__", str(kill_chain))
        # 将已经替换好的内容写入
        with open('Template_ICS.txt', 'w', encoding='gb2312') as f5:
            f5.write(self.contents_tmpl_interact)

    def translate(self):
        f = open("/Users/gryffinbit/PycharmProjects/AutoDoc/输出文档/ips_language.txt", "a",
                 encoding="gb2312")  # 以写的格式打开先打开文件
        f.write(str(sid) + ';' + '检测到' + self.msg_ch + '(' + str(cveReturn()) + ')')
        f.write('\n')
        f.close()


if __name__ == '__main__':
    Auto().init()
    Interact().init()
    # 文档改好后,需要修改文件名,改成sid.txt
    name = sidReturn() + ".txt"
    os.rename("Template_ICS.txt",
              "/Users/gryffinbit/PycharmProjects/AutoDoc/输出文档/ipsdocs/" + name)

评论