我们这里以Ubuntu 20.04 LTS为例,之前本站写过一个利用vulscan扫描系统漏洞的,如下所示:
实战用vuls漏洞扫描器对Linux系统和Python项目进行扫描和审计
当时写这篇文章的时候用的是Centos系统一切正常,当我切换到Ubuntu后经历了大半年扫描不到任何一个漏洞的尴尬情况,
所以这篇文章算是对vulscan的一个替代,大家视情况,视喜好自行选择哈,trivy的开源项目地址如下:
它的安装和部署我就不赘述了,大家自行前往项目的readme中看一下,下面说一下本次实战的核心命令,如下:
/root/trivy/trivy fs --scanners vuln -s HIGH --skip-dirs /root/src/ --skip-dirs /var/lib/jenkins --skip-dirs /var/cache/jenkins --skip-dirs /usr/local/go/ --format json -q /
解释一下:
- fs这个subcommand子命令代表扫描文件系统
- --scanners vuln 这个参数代表只扫描漏洞
- -s HIGH 代表漏洞的最低等级
- --skip-dirs 这个参数代表跳过一些文件夹,这里我跳过了一些不提供端口监听的服务的路径,或者服务本身在NGINX的basic auth保护之下的
- --format json 代表输出json格式,方便我们下面用python脚本解析
- -q 代表静默输出,主要是为了方便解析上面的json文本
下面我写了一个简单的扫描到漏洞给你发通知邮件的Python脚本,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
import json import time import subprocess import smtplib from email.mime.text import MIMEText HOST = 'smtp.qq.com' PORT = 587 SENDER = '@qq.com' RECEIVER = '' PWD = '' def mail_send(subject, mail_body): try: msg = MIMEText(mail_body, 'plain', 'utf-8') msg['Subject'] = subject msg['From'] = SENDER msg['To'] = RECEIVER s = smtplib.SMTP(HOST, PORT) s.debuglevel = 0 s.login(SENDER, PWD) s.sendmail(SENDER, RECEIVER, msg.as_string()) s.quit() except smtplib.SMTPException as e: print(str(e)) def main(): curr_date = time.strftime('%Y-%m-%d',time.localtime(time.time())) subject = curr_date + " 每周漏洞扫描" cmd = "/root/trivy/trivy fs --scanners vuln -s HIGH --skip-dirs /root/src/ --skip-dirs /var/lib/jenkins --skip-dirs /var/cache/jenkins --skip-dirs /usr/local/go/ --format json -q /" results=subprocess.check_output(cmd, shell=True) results_to_dict = json.loads(results) cve_results = results_to_dict['Results'] cve_total_list =[] for cve_list in cve_results: if 'Vulnerabilities' in cve_list: cve_entity = cve_list['Vulnerabilities'] for vuls in cve_entity: pkg_name = vuls['PkgName'] cve_id = vuls['VulnerabilityID'] installed_version = vuls['InstalledVersion'] if 'FixedVersion' in vuls: fixed_version = vuls['FixedVersion'] else: fixed_version = "" if 'Title' in vuls: title = vuls['Title'] else: title = "" desc = vuls['Description'] cve_total_list.append('\n'.join(['pkg_name: \n'+pkg_name,'cve_id: \n'+ cve_id, 'installed_version: \n' + installed_version,'fixed_version: \n'+ fixed_version, 'title: \n'+ title, 'desc: \n'+desc])) # 如果cve_total_list为空的话,说明本周无漏洞 if not cve_total_list: mail_send(subject, "本周暂无漏洞~") else: mail_body = '\n***********************************************\n'.join(cve_total_list) mail_send(subject,mail_body) print("成功发送了一封邮件!") if __name__ == '__main__': main() |
大家只需要补充一下上述脚本开头的邮箱账号密码就可以使用了。