最近收到阿里巴巴的猎头电话,蚂蚁金服安全研发,还有两个阿里巴巴安全部大佬,做安全检测产品、安全研发工作,加了微信。还有一个来自蚂蚁金服的知乎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
配置信息
jdbc:mysql://localhost:3306/nvd
root
123456
- 执行初始化指令
nvd_sync.sh
- 成功信息如下:
第三步:执行Nessus 获得漏洞信息
- 我是对内网的几台虚拟机进行漏洞扫描
- 可以看到还是有不少漏洞的
- 将.nessus导出文件放到mulval目录下
第四步:执行命令转换nessus输入
- 执行命令转换nessus输入
nessus_translate.sh /home/mulval/xsb/mulval/______3_rq62ha.nessus
- 很遗憾报错了
- 进入
xsb_vul_summary.log
排查 - 发现错误 ++Error[XSB/Runtime/P]:
- [Existence (No procedure usermod : vulExists / 3 exists)] []
- 意思是说没有找到这个vulExists标签
- 不要慌,打开数据库看一看
- 发现问题了,原来是初始化表的时候失败了
- 进入Java代码一看究竟
- 原来期望一些标签,咱们下载的XML文件中没有
- 结果导致表初始化为空
- 查看脚本,发现下载XML文件的官网地址
- 线索:NVD官网数据集介绍
- 官网说XML格式已经不维护了
- 好在给出了JSON格式的数据集
- 于是把JSON格式的数据都下载下来备用
- 观察下载的JSON数据
- 再对比初始化表的JAVA代码里面的操作
- 我们只要把JSON里面的信息写到数据库的表里面即可
转换逻辑比较简单,写一个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表中
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数据了
- 再次执行命令转换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成功
第五步:执行命令生成攻击图
- 执行命令生成攻击图
graph_gen.sh nessus.P -v
- 发现没有 epstopdf
- 安装命令:
apt-get install texlive-font-utils
- 删除一个不需要的环境变量:
unset _JAVA_OPTIONS
- 再次执行:
graph_gen.sh nessus.P -v
- 这次成功的生成了攻击图文件:
AttackGraph.pdf
- 请欣赏全局攻击图
- 请欣赏局部攻击图
End~