Mulval与Nessus联动

最近收到阿里巴巴的猎头电话,蚂蚁金服安全研发,还有两个阿里巴巴安全部大佬,做安全检测产品、安全研发工作,加了微信。还有一个来自蚂蚁金服的知乎er,私信要了我微信,建议我把握这次阿里扩招的机会。这还好,都是安全岗。校友微信群里,也有很多大厂招聘,阿里巴巴赫然在目,另一个是字节跳动~

想啥呢?工作三年不到,跳啥跳?人的精力是有限的,顾此失彼,最后活不成期望的样子。身边的例子,南哥211研究生,工作8年换了4家公司,刚刚离职去了第5家公司。

365*3=1095(天)
1095*10=10950(小时)

实际上涨工资全靠跳槽,而三年一跳也是最好的时间节点,因为一万小时专家定律。你可能毕业的时候,没有找到一份好工作,但是你要知道,你要为下一个工作拐点奋发向上。



第一步:设置mysql的密码并创建nvd表

  • 经常会有小伙伴问Kali mysql密码修改无效
  • 实际上Kali默认的mysql是mariadb
  • 与mysql有一点点的差异
UPDATE mysql.user SET plugin='' WHERE user='root';
UPDATE mysql.user SET password=PASSWORD('123456') WHERE user='root';
FLUSH PRIVILEGES;
  • 创建nvd表
create database nvd;

第二步:编写数据库配置信息并初始化数据库

  • mulval/bin/adapter目录下
  • 新建config.txt配置信息

ee37606e79ee02290cce4637a6ff95ba.png
jdbc:mysql://localhost:3306/nvd
root
123456
  • 执行初始化指令
nvd_sync.sh
  • 成功信息如下:

a0c889b07cc8abb60da889c988202232.png

第三步:执行Nessus 获得漏洞信息

  • 我是对内网的几台虚拟机进行漏洞扫描
  • 可以看到还是有不少漏洞的

4b8d5e27ea41e1b0fdc185e57f328cda.png
  • 将.nessus导出文件放到mulval目录下

9f9f3b057b695c79a6419ab39a8ee326.png

第四步:执行命令转换nessus输入

  • 执行命令转换nessus输入
  • nessus_translate.sh /home/mulval/xsb/mulval/______3_rq62ha.nessus

3b744594343c4720017b0c4065cce19f.png
  • 很遗憾报错了

84881660c6309ae3a02c92f1e968fb9a.png
  • 进入xsb_vul_summary.log排查
  • 发现错误 ++Error[XSB/Runtime/P]:
  • [Existence (No procedure usermod : vulExists / 3 exists)] []
  • 意思是说没有找到这个vulExists标签

6469a1a03d9bb2818b822dd0ec261560.png
  • 不要慌,打开数据库看一看
  • 发现问题了,原来是初始化表的时候失败了

02a1f833af29acd7e4ac8826a60afe91.png
  • 进入Java代码一看究竟
  • 原来期望一些标签,咱们下载的XML文件中没有
  • 结果导致表初始化为空

718ac6cd99592570d2f7b939cfb6169c.png

6bb4f802aae6104832faba954632856e.png
  • 官网说XML格式已经不维护了
  • 好在给出了JSON格式的数据集
  • 于是把JSON格式的数据都下载下来备用

1e02cfc70ca3150bfa7ccaa49f653d06.png
  • 观察下载的JSON数据
  • 再对比初始化表的JAVA代码里面的操作
  • 我们只要把JSON里面的信息写到数据库的表里面即可

85c436a3b9b99503cecb11e0bd7f3bf3.png

转换逻辑比较简单,写一个python脚本,5秒就完成了所有转换,并存入MySQL数据库:

  • id varchar(20) not null
['cve']['CVE_data_meta']['ID']
获取ID
  • soft varchar(160) not null default 'ndefined'
['configurations']['nodes'][0]['cpe_match'][0]['cpe23Uri']
获取其中的第四、五字段,也就是操作系统和版本号
  • rng varchar(100) not null default 'undefined'
['impact']['baseMetricV3']['cvssV3'][~]
取值范围(累加,逗号分割):
user_init:user_action_req   (依据: userInteraction 非NONE)
local_network: lan   (依据: attackVector 取值为 ADJACENT_NETWORK)
network: remoteExploit  (依据: attackVector 取值为 NETWORK)
local: local  (依据: attackVector 取值为 LOCAL)
other
  • lose_types varchar(100) not null default 'undefind'
['impact']['baseMetricV3']['cvssV3'][~]
取值范围(累加,逗号分割):
conf: data_loss  (依据:  confidentialityImpact 非NONE)
int: data_modification  (依据:  integrityImpact 非NONE)
avail: availability_loss  (依据:  availabilityImpact 非NONE)
  • severity varchar(20) not null default 'unefined'
['impact']['baseMetricV3']['cvssV3']['baseSeverity']
获取威胁等级:低危、中危、高危、严重
  • access varchar(20) not null default 'unefined'
['impact']['baseMetricV3']['cvssV3']['attackComplexity']
获取攻击复杂性:低、中、高
  • 简单写一个脚本
  • 把所有数据按照格式写入到MySQL的nvd表中

4c88aa6671bb6b377d72da7f4fd72f41.png
import json
import os
import pymysql.cursors

def writeDB(cves):
    host = '192.168.0.103'
    user = 'root'
    passwd = '123456'
    db = 'nvd'
    conn = pymysql.connect(host=host,
                           user=user,
                           password=passwd,
                           db=db)
    sql = 'insert into nvd(id,soft,rng,lose_types,severity,access) values (%s,%s,%s,%s,%s,%s)'
    cur = conn.cursor()
    try:
        cur.executemany(sql,cves)
        conn.commit()
    except:
        conn.rollback()
    conn.close()



def readJsonFile(file):
    with open(file, encoding='utf-8') as f:
        data = json.load(f)
        cves = []
        for CVE_Items in data['CVE_Items']:

            id = CVE_Items['cve']['CVE_data_meta']['ID']

            try:
                soft = '_'.join(CVE_Items['configurations']['nodes'][0]['cpe_match'][0]['cpe23Uri'].split(':')[4:6])
            except:
                soft = 'undefined'

            try:
                rng = ''
                if CVE_Items['impact']['baseMetricV3']['cvssV3']['userInteraction'] != 'NONE':
                    rng = 'user_action_req,'
                if CVE_Items['impact']['baseMetricV3']['cvssV3']['attackVector'] == 'ADJACENT_NETWORK':
                    rng += 'lan,'
                elif CVE_Items['impact']['baseMetricV3']['cvssV3']['attackVector'] == 'NETWORK':
                    rng += 'remoteExploit,'
                elif CVE_Items['impact']['baseMetricV3']['cvssV3']['attackVector'] == 'LOCAL':
                    rng += 'local'
                if rng == '':
                    rng = 'other'
                if rng[-1] == ',':
                    rng = rng[0:-1]
            except:
                rng = 'undefined'

            try:
                lose_types = ''
                if CVE_Items['impact']['baseMetricV3']['cvssV3']['confidentialityImpact'] != 'NONE':
                    lose_types = 'data_loss,'
                if CVE_Items['impact']['baseMetricV3']['cvssV3']['integrityImpact'] != 'NONE':
                    lose_types += 'data_modification,'
                if CVE_Items['impact']['baseMetricV3']['cvssV3']['availabilityImpact'] != 'NONE':
                    lose_types += 'availability_loss'
                if lose_types[-1] == ',':
                    lose_types = lose_types[0:-1]
            except:
                lose_types = 'undefined'

            try:
                severity = CVE_Items['impact']['baseMetricV3']['cvssV3']['baseSeverity']
            except:
                severity = 'undefined'

            try:
                access = CVE_Items['impact']['baseMetricV3']['cvssV3']['attackComplexity']
                if access[0] == 'L':
                    access = 'l'
                elif access[0] == 'M':
                    access = 'm'
                elif access[0] == 'H':
                    access = 'h'
            except:
                access = 'undefined'
            cve = (id,soft,rng,lose_types,severity,access)
            cves.append(cve)
        cves = list(tuple(cves))
        writeDB(cves)



def run():
    path = 'cve'
    files = os.listdir(path)
    for file in files:
        if 'zip' not in file and 'nvd' in file:
            print(file+' is writing into db...')
            readJsonFile('cve/'+file)



if __name__ == "__main__":
    run()
  • 完美的把数据都写进去了
  • 接下来,就可以继续.nessus数据转换成datalog数据了

571d1df118f76f5e435ca0aec605c5f2.png
  • 再次执行命令转换nessus输入
  • nessus_translate.sh /home/mulval/xsb/mulval/______3_rq62ha.nessus
这里再次强调一下环境变量
  • export PATH=/home/mulval/xsb/XSB/bin:$PATH
  • export MULVALROOT=/home/mulval/xsb/mulval
  • export PATH=$MULVALROOT/bin:$MULVALROOT/utils:$PATH
  • nessus转换datalog成功

99a3258d0e09e88c3dcdf234cb1c9f41.png

第五步:执行命令生成攻击图

  • 执行命令生成攻击图
  • graph_gen.sh nessus.P -v
  • 发现没有 epstopdf

4df36dc25b4879a52d91fdc995467c2c.png
  • 安装命令:apt-get install texlive-font-utils
  • 删除一个不需要的环境变量: unset _JAVA_OPTIONS
  • 再次执行:graph_gen.sh nessus.P -v
  • 这次成功的生成了攻击图文件:AttackGraph.pdf

342c49d9f50f01ec7446739258c24be5.png
  • 请欣赏全局攻击图

d748b39afa51af2787fbc9693ef63c4d.png
  • 请欣赏局部攻击图

a2698bb54015a34323ec9055bce53935.png

End~

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ailx10

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值