-
90 |
- 我的桌面 91 |
Dear user:
39 |您的SeMF安全管控平台账号初始化地址已创建,点我以完成账号初始化
40 |如点击失效,请前往访问以下地址""" + url +"/view/regist/"+argu + """
41 |如非本人操作,忽略该邮件
42 |本邮件为安全管控平台SeMf系统邮件,请勿回复
43 | """ 44 | res = sendmails(email,data) 45 | if res: 46 | return True 47 | else: 48 | return False 49 | 50 | 51 | def send_notice_mail(email,data): 52 | try: 53 | subject = data['notice_title'] 54 | text_content = data['notice_body']+'访问地址为:'+url+data['notice_url'] 55 | html_content = ""+data['notice_body']+",点我访问
" 56 | msg = EmailMultiAlternatives(subject,text_content,DEFAULT_FROM_EMAIL,[email]) 57 | msg.attach_alternative(html_content, "text/html") 58 | msg.send() 59 | return True 60 | except: 61 | return False 62 | 63 | def sendresetpsdmail(email,argu): 64 | data={'subject':'SeMF账号密码重置', 65 | 'text_content':'', 66 | 'html_content':''} 67 | data['text_content'] = "您正在申请重置SeMF平台账号,请前往以下地址处理:"+ url +"/view/resetpsd/"+argu +" 如无执行重置操作,请忽略该邮件" 68 | data['html_content'] = """ 69 |Dear user:
70 |您正在申请重置SeMF的密码,请前往以下地址进行密码重置,点我以完成密码重置
71 |如点击失效,请前往访问以下地址""" + url +"/view/resetpsd/"+argu + """
72 |如非本人操作,忽略该邮件
73 |本邮件为安全管控平台SeMf系统邮件,请勿回复
74 | """ 75 | res = sendmails(email,data) 76 | if res: 77 | return True 78 | else: 79 | return False -------------------------------------------------------------------------------- /SeMFSetting/Functions/nmap.py: -------------------------------------------------------------------------------- 1 | #coding:utf-8 2 | ''' 3 | Created on 2017/11/17 4 | @author: gy 5 | ''' 6 | 7 | import nmap 8 | 9 | #检查目标主机指定端口是否开放 10 | def nmap_port(host,port): 11 | nm = nmap.PortScanner() 12 | nm.scan(host,port) 13 | if nm[host].state()== 'up': 14 | return nm[host]['tcp'][port] 15 | 16 | 17 | #获取目标主机内所有开放端口 18 | def nmap_host_all(host): 19 | nm = nmap.PortScanner() 20 | nm.scan(host,'0-65535') 21 | try: 22 | if nm[host].state()== 'up': 23 | return nm[host]['tcp'] 24 | else: 25 | return 0 26 | except: 27 | return 0 28 | 29 | #获取指定网段内全部存活主机 30 | def nmap_alive_lists(segment): 31 | nm = nmap.PortScanner() 32 | try: 33 | nm.scan(hosts=segment,arguments='-n -sn') 34 | except: 35 | return None 36 | return nm.all_hosts() 37 | 38 | 39 | -------------------------------------------------------------------------------- /SeMFSetting/Functions/parse_awvs_xml.py: -------------------------------------------------------------------------------- 1 | #coding:utf-8 2 | ''' 3 | Created on 2017/12/4 4 | 5 | @author: gy071089 6 | ''' 7 | 8 | import os,requests 9 | from xml.dom import minidom 10 | from requests.packages import urllib3 11 | 12 | #level_white_list= ["high", "medium","low","informational"], 13 | ''' 14 | except_vuln = { 15 | "level_white_list": ["high", "medium","low","informational"], 16 | "bug_black_list": [ 17 | "User credentials are sent in clear text", 18 | "HTML form without CSRF protection", 19 | "Broken links", 20 | "Password type input with auto-complete enabled", 21 | "Slow HTTP Denial of Service Attack", 22 | "Application error message", 23 | ] 24 | }''' 25 | 26 | def details_parse_xml(scan_id,path): 27 | file_name = os.path.join(path,scan_id+'.xml') 28 | bug_list = {} 29 | try: 30 | root = minidom.parse(file_name).documentElement 31 | ReportItem_list = root.getElementsByTagName('ReportItem') 32 | Crawler_list = root.getElementsByTagName('SiteFile') 33 | bug_list['starturl'] = root.getElementsByTagName('StartURL')[0].firstChild.data 34 | bug_list['time'] = root.getElementsByTagName('ScanTime')[0].firstChild.data 35 | bug_list['url'] = [] 36 | bug_list['bug'] = [] 37 | 38 | if Crawler_list: 39 | for crawl in Crawler_list: 40 | spider = {} 41 | URL = crawl.getElementsByTagName("URL")[0].firstChild.data 42 | fURL = crawl.getElementsByTagName("FullURL")[0].firstChild 43 | spider['path'] = URL 44 | spider['furl'] = fURL 45 | bug_list['url'].append(spider) 46 | if ReportItem_list: 47 | for node in ReportItem_list: 48 | level = node.getElementsByTagName("Severity")[0].firstChild.data 49 | name = node.getElementsByTagName("Name")[0].firstChild.data 50 | #if level in level_white_list: 51 | try: 52 | Request = node.getElementsByTagName("Request")[0].firstChild.data 53 | except: 54 | Request = "" 55 | try: 56 | details = node.getElementsByTagName("Details")[0].firstChild.data 57 | except: 58 | details = "" 59 | try: 60 | recommendation = node.getElementsByTagName("Recommendation")[0].firstChild.data 61 | except: 62 | details = "" 63 | 64 | temp = {} 65 | temp['name'] = name 66 | temp['level'] = level 67 | temp['request'] = Request 68 | temp['details'] = details 69 | temp['recommendation'] = recommendation 70 | temp['path'] = node.getElementsByTagName("Affects")[0].firstChild.data 71 | 72 | bug_list['bug'].append(temp) 73 | os.remove(file_name) 74 | 75 | except Exception as e: 76 | print ("Error in parse_xml: %s" % str(e)) 77 | 78 | return bug_list 79 | 80 | 81 | def get_scan_xml(reporturl,scan_id,path): 82 | filename = os.path.join(path,scan_id+'.xml') 83 | urllib3.disable_warnings() 84 | try: 85 | resp = requests.get(reporturl,timeout=120,verify=False) 86 | content = resp.content 87 | fp = open(filename,'wb') 88 | fp.write(content) 89 | fp.close() 90 | except Exception as e: 91 | return e -------------------------------------------------------------------------------- /SeMFSetting/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/we1h0/SecurityManageFramwork/e706461bdf5e2bc78e9fc59c66904b95e81e331e/SeMFSetting/__init__.py -------------------------------------------------------------------------------- /SeMFSetting/admin.py: -------------------------------------------------------------------------------- 1 | #coding:utf-8 2 | from django.contrib import admin 3 | from . import models 4 | # Register your models here. 5 | admin.site.register(models.Scanner) 6 | admin.site.register(models.ScannerPolicies) 7 | admin.site.register(models.files) -------------------------------------------------------------------------------- /SeMFSetting/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class SemfsettingConfig(AppConfig): 5 | name = 'SeMFSetting' 6 | -------------------------------------------------------------------------------- /SeMFSetting/forms.py: -------------------------------------------------------------------------------- 1 | #coding:utf-8 2 | ''' 3 | Created on 2018年6月8日 4 | 5 | @author: yuguanc 6 | ''' 7 | from . import models 8 | from django.forms import ModelForm,widgets 9 | 10 | class File(ModelForm): 11 | class Meta: 12 | model = models.files 13 | fields=['name','file_type','file'] 14 | widgets ={ 15 | 'name':widgets.TextInput(attrs={'class':'form-control','placeholder':'文件名称'}), 16 | 'file_type':widgets.Select(attrs={'class':'form-control','placeholder':'文件类型'}), 17 | 'file':widgets.FileInput(), 18 | } -------------------------------------------------------------------------------- /SeMFSetting/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/we1h0/SecurityManageFramwork/e706461bdf5e2bc78e9fc59c66904b95e81e331e/SeMFSetting/migrations/__init__.py -------------------------------------------------------------------------------- /SeMFSetting/models.py: -------------------------------------------------------------------------------- 1 | #coding:utf-8 2 | #coding:utf-8 3 | from django.db import models 4 | from django.contrib.auth.models import User 5 | from AssetManage.models import AssetType 6 | 7 | # Create your models here. 8 | SCANNER_TYPE = ( 9 | ('WEB',( 10 | ('AWVS','AWVS'), 11 | ) 12 | ), 13 | ('System',( 14 | ('Nessus','Nessus'), 15 | ) 16 | ), 17 | ) 18 | SCANNER_STATUS = ( 19 | ('启用','启用'), 20 | ('禁用','禁用'), 21 | ) 22 | 23 | FILE_TYPE = ( 24 | ('网络设备','网络设备'), 25 | ('业务系统','业务系统'), 26 | ('漏洞列表','漏洞列表'), 27 | ) 28 | 29 | class files(models.Model): 30 | name = models.CharField('名称',max_length=50,null=True) 31 | file_type = models.CharField('类型',max_length=50,choices=FILE_TYPE) 32 | file = models.FileField('批量文件',upload_to ='files/') 33 | update_data = models.DateField("更新日期",auto_now=True) 34 | 35 | action_user = models.ForeignKey(User,related_name='asset_files_user',on_delete=models.CASCADE,null=True,blank=True) 36 | def __str__(self): 37 | return self.name 38 | 39 | 40 | 41 | 42 | class Scanner(models.Model): 43 | scanner_name = models.CharField('节点名称',max_length=50) 44 | scanner_type = models.CharField('节点类型',max_length=50,choices=SCANNER_TYPE) 45 | scanner_url = models.URLField('节点地址',max_length=50) 46 | scanner_status = models.CharField('节点状态',max_length=50,default='禁用',choices=SCANNER_STATUS) 47 | scanner_apikey = models.CharField('API_KEY',max_length=100) 48 | scanner_apisec = models.CharField('API_SEC',max_length=100,blank=True) 49 | scanner_des = models.TextField('节点描述') 50 | scanner_addtime = models.DateField('开始时间',auto_now_add=True) #任务开始时间 51 | scanner_updatetime = models.DateField('结束时间',auto_now=True) #任务结束时间 52 | 53 | assetType = models.ManyToManyField(AssetType,verbose_name='扫描范围',related_name='scanner_assettype',limit_choices_to={'parent__isnull':False}) 54 | 55 | def __str__(self): 56 | return self.scanner_name 57 | 58 | 59 | class ScannerPolicies(models.Model): 60 | policies_name = models.CharField('策略名称',max_length=50,help_text='扫描策略为扫描器策略名称') 61 | policies_key = models.CharField('策略编号',max_length=50,null=True,blank=True,help_text='AWVS扫描器需填写,全扫描编号为11111111-1111-1111-1111-111111111111') 62 | scanner = models.ForeignKey(Scanner,verbose_name='节点关联',related_name='police_for_scanner',on_delete=models.CASCADE) 63 | 64 | def __str__(self): 65 | return self.policies_name 66 | 67 | 68 | -------------------------------------------------------------------------------- /SeMFSetting/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /SeMFSetting/views.py: -------------------------------------------------------------------------------- 1 | #coding:utf-8 2 | from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger 3 | import hashlib 4 | from django.contrib.auth.hashers import make_password 5 | # Create your views here. 6 | 7 | #该段代码用来分页 8 | def paging(deploy_list,limit,offset): 9 | 10 | paginator = Paginator(deploy_list, limit) 11 | 12 | try: 13 | deploy_list = paginator.page(offset) 14 | except PageNotAnInteger: 15 | # If page is not an integer, deliver first page. 16 | deploy_list = paginator.page(1) 17 | except EmptyPage: 18 | # If page is out of range (e.g. 9999), deliver last page of results. 19 | deploy_list = paginator.page(paginator.num_pages) 20 | return deploy_list 21 | 22 | 23 | 24 | def strtopsd(string): 25 | hash_res = hashlib.md5() 26 | hash_res.update(make_password(string).encode('utf-8')) 27 | urlarg = hash_res.hexdigest() 28 | return urlarg -------------------------------------------------------------------------------- /TaskManage/Functions/awvs.py: -------------------------------------------------------------------------------- 1 | #coding:utf-8 2 | ''' 3 | Created on 2017/12/4 4 | 5 | @author: gy 6 | ''' 7 | 8 | import time 9 | 10 | from SeMFSetting.Functions import AWVS11 11 | from SeMFSetting.Functions import parse_awvs_xml 12 | from VulnManage.models import Vulnerability_scan 13 | from TaskManage.models import Task 14 | from AssetManage.models import Asset 15 | from SeMF.settings import TMP_PATH 16 | from .nessus import Get_except_vuln 17 | 18 | vuln_level = {'informational':0,'low':1,'medium':2,'high':3} 19 | 20 | 21 | def add_scan(scanner_id,url,desc): 22 | target_id = AWVS11.add(url,scanner_id, desc) 23 | return target_id 24 | 25 | def start_scan(scanner_id,target_id): 26 | data = AWVS11.start(target_id,scanner_id) 27 | if data: 28 | scan_id = AWVS11.getscanid(target_id,scanner_id) 29 | return scan_id 30 | 31 | def stop_scan(scan_id,scanner_id): 32 | data = AWVS11.stop(scan_id,scanner_id) 33 | if data: 34 | return True 35 | 36 | def dele_scan(scan_id,scanner_id): 37 | data = AWVS11.delete(scan_id,scanner_id) 38 | if data: 39 | return True 40 | 41 | def get_scan_result(scan_id,task_id,scanner_id): 42 | reporturl = AWVS11.getreport(scan_id,scanner_id) 43 | task = Task.objects.filter(task_id=task_id).first() 44 | parse_awvs_xml.get_scan_xml(reporturl,scan_id,TMP_PATH) 45 | details = parse_awvs_xml.details_parse_xml(scan_id,TMP_PATH) 46 | if details: 47 | asset_key = details['starturl'] 48 | vuln_list = details['bug'] 49 | asset =Asset.objects.filter(asset_key = asset_key).first() 50 | if vuln_list: 51 | except_vuln,except_vuln_list = Get_except_vuln('AWVS') 52 | for vuln in vuln_list: 53 | try: 54 | num = Vulnerability_scan.objects.latest('id').id 55 | except Exception as e: 56 | num = 0 57 | vuln_id = '02' + str(time.strftime('%Y%m%d%H',time.localtime(time.time()))) +str( num) 58 | vuln_type = 'Awvs' 59 | vuln_name = vuln['name'] 60 | leave = vuln_level[vuln['level']] 61 | vuln_info = vuln['request'] 62 | introduce = vuln['details'] 63 | scopen = vuln['path'] 64 | fix = vuln['recommendation'] 65 | if vuln_name in except_vuln: 66 | vuln_gets = except_vuln_list.filter(vuln_name=vuln_name).first() 67 | leave = vuln_gets.leave 68 | fix = vuln_gets.fix 69 | vuln_list = Vulnerability_scan.objects.get_or_create(vuln_name=vuln_name, 70 | vuln_type=vuln_type, 71 | leave=leave, 72 | introduce=introduce, 73 | vuln_info=vuln_info, 74 | scopen=scopen, 75 | fix=fix, 76 | vuln_asset = asset 77 | ) 78 | vuln_get = vuln_list[0] 79 | if vuln_get.vuln_id: 80 | if vuln_get.fix_status == '1': 81 | vuln_get.fix_status= '3' 82 | else: 83 | vuln_get.vuln_id = vuln_id 84 | if leave == 0: 85 | vuln_get.fix_status= '0' 86 | elif leave == 1: 87 | vuln_get.fix_status= '0' 88 | else: 89 | vuln_get.fix_status= '2' 90 | vuln_get.task_id= task 91 | vuln_get.save() -------------------------------------------------------------------------------- /TaskManage/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/we1h0/SecurityManageFramwork/e706461bdf5e2bc78e9fc59c66904b95e81e331e/TaskManage/__init__.py -------------------------------------------------------------------------------- /TaskManage/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | from . import models 5 | # Register your models here. 6 | 7 | admin.site.register(models.Task) -------------------------------------------------------------------------------- /TaskManage/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class TaskmanageConfig(AppConfig): 5 | name = 'TaskManage' 6 | -------------------------------------------------------------------------------- /TaskManage/forms.py: -------------------------------------------------------------------------------- 1 | #coding:utf-8 2 | ''' 3 | Created on 2018年5月25日 4 | 5 | @author: yuguanc 6 | ''' 7 | 8 | from . import models 9 | from django.forms import ModelForm 10 | from django.forms import widgets 11 | 12 | 13 | 14 | class TaskSyncForm(ModelForm): 15 | class Meta: 16 | model = models.Task 17 | fields = ['task_name','task_scanner','scan_id','task_targetinfo'] 18 | widgets = { 19 | 'task_name':widgets.TextInput(attrs={'class':'form-control','placeholder':'任务名称,一般以系统名称+版本+日期'}), 20 | 'scan_id':widgets.TextInput(attrs={'class':'form-control','placeholder':'扫描器对应的任务标识,当前只支持nessus'}), 21 | 'task_scanner':widgets.Select(attrs={'class':'form-control','placeholder':'扫描节点'}), 22 | 'task_targetinfo':widgets.Textarea(attrs={'class':'form-control','placeholder':'本次任务说明,如漏洞复查,周期检查、版本更新、上线准备等'}), 23 | } 24 | 25 | 26 | class TaskCreateForm(ModelForm): 27 | class Meta: 28 | model = models.Task 29 | fields = ['task_name','scanner_police','task_target','task_targetinfo'] 30 | widgets = { 31 | 'task_name':widgets.TextInput(attrs={'class':'form-control','placeholder':'任务名称,一般以系统名称+版本+日期'}), 32 | #'task_scanner':widgets.Select(attrs={'class':'form-control','placeholder':'扫描节点'}), 33 | 'scanner_police':widgets.Select(attrs={'class':'form-control','placeholder':'扫描策略'}), 34 | 'task_target':widgets.TextInput(attrs={'class':'form-control','placeholder':'扫描目标,ip/url'}), 35 | 'task_targetinfo':widgets.Textarea(attrs={'class':'form-control','placeholder':'本次任务说明,如漏洞复查,周期检查、版本更新、上线准备等'}), 36 | } 37 | 38 | class TaskScanForm(ModelForm): 39 | class Meta: 40 | model = models.Task 41 | fields = ['task_name','scanner_police','task_target','task_targetinfo'] 42 | widgets = { 43 | 'task_name':widgets.TextInput(attrs={'class':'form-control','placeholder':'任务名称,一般以系统名称+版本+日期'}), 44 | #'task_scanner':widgets.Select(attrs={'class':'form-control','placeholder':'扫描节点'}), 45 | 'scanner_police':widgets.Select(attrs={'class':'form-control','placeholder':'扫描策略'}), 46 | 'task_target':widgets.Textarea(attrs={'class':'form-control','placeholder':'扫描目标,ip/url'}), 47 | 'task_targetinfo':widgets.Textarea(attrs={'class':'form-control','placeholder':'本次任务说明,如漏洞复查,周期检查、版本更新、上线准备等'}), 48 | } -------------------------------------------------------------------------------- /TaskManage/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/we1h0/SecurityManageFramwork/e706461bdf5e2bc78e9fc59c66904b95e81e331e/TaskManage/migrations/__init__.py -------------------------------------------------------------------------------- /TaskManage/models.py: -------------------------------------------------------------------------------- 1 | #coding:utf-8 2 | 3 | # Create your models here. 4 | from django.db import models 5 | from django.contrib.auth.models import User 6 | from AssetManage.models import Asset 7 | from SeMFSetting.models import Scanner,ScannerPolicies 8 | # Create your models here. 9 | TASK_TYPE = ( 10 | ('安全扫描','安全扫描'), 11 | ('扫描同步','扫描同步'), 12 | ) 13 | 14 | TASK_STATUS=( 15 | ('0','审批中'), 16 | ('1','待执行'), 17 | ('2','执行中'), 18 | ('3','已暂停'), 19 | ('4','已完成'), 20 | ('5','已结束'), 21 | ) 22 | 23 | REQUEST_STATUS=( 24 | ('0','审批中'), 25 | ('1','审批通过'), 26 | ('2','审批拒绝'), 27 | ) 28 | 29 | 30 | class Task(models.Model): 31 | task_id = models.CharField('任务编号',max_length=50) #任务id 32 | scan_id = models.CharField('扫描编号',max_length=100,null=True) 33 | task_name = models.CharField('任务名称',max_length=30) #任务名称 34 | task_type = models.CharField('任务类型',max_length=25, choices=TASK_TYPE) #任务类型 35 | task_target = models.TextField('任务目标',null = True) #任务目标 36 | task_targetinfo = models.TextField('任务描述') #目标描述 37 | task_status = models.CharField('任务状态',max_length=20,choices=TASK_STATUS) #任务状态 四个状态,创建,审批中,执行中,结束 ״ 38 | task_plan_time = models.DateTimeField('计划执行时间',null=True,blank=True) #计划执行时间 39 | task_plan_end_time = models.DateTimeField('计划结束时间',null=True) #计划执行时间 40 | request_status = models.CharField('请求状态',max_length =50,choices=REQUEST_STATUS) 41 | request_note = models.TextField('审批备注',null=True) #安全人员审批扫描时的备注 42 | task_starttime = models.DateTimeField('开始时间',auto_now_add=True) #任务开始时间 43 | task_endtime = models.DateTimeField('更新时间',auto_now=True) #任务结束时间 44 | 45 | task_asset = models.ManyToManyField(Asset,related_name='asset_to_task',verbose_name='资产关联') 46 | 47 | task_scanner = models.ForeignKey(Scanner,related_name='scanner_to_task',on_delete=models.CASCADE,verbose_name='扫描器') 48 | scanner_police = models.ForeignKey(ScannerPolicies,related_name='police_to_scanner',null=True,on_delete=models.CASCADE,verbose_name='扫描策略') 49 | 50 | task_user = models.ForeignKey(User,related_name='task_for_user',on_delete=models.CASCADE,verbose_name='任务用户') 51 | action_user = models.ForeignKey(User,related_name='taskrequestaction_for_user',on_delete=models.CASCADE,null=True,blank=True) 52 | 53 | def __str__(self): 54 | return self.task_id -------------------------------------------------------------------------------- /TaskManage/tasks.py: -------------------------------------------------------------------------------- 1 | #coding:utf-8 2 | ''' 3 | Created on 2018年5月25日 4 | 5 | @author: yuguanc 6 | ''' 7 | 8 | from __future__ import absolute_import 9 | from celery import shared_task 10 | from SeMFSetting.Functions import Nessus,AWVS11 11 | from TaskManage.Functions import nessus,awvs 12 | import time 13 | from TaskManage.models import Task 14 | from NoticeManage.views import notice_add 15 | 16 | from celery.utils.log import get_task_logger 17 | logger = get_task_logger(__name__) 18 | 19 | from SeMFSetting.Functions.mails import send_notice_mail 20 | 21 | 22 | @shared_task 23 | def save_scan_vulns(scan_id,task_id): 24 | task = Task.objects.filter(task_id =task_id ).first() 25 | while True: 26 | res = Nessus.details(scan_id,task.task_scanner.id) 27 | try: 28 | res['info']['status'] 29 | except: 30 | continue 31 | if res['info']['status'] == 'canceled' or res['info']['status'] == 'completed': 32 | time.sleep(600) 33 | nessus.get_scan_vuln(scan_id,task,task.task_scanner.id) 34 | task.task_status=4 35 | task.save() 36 | data={ 37 | 'notice_title':'任务进度通知', 38 | 'notice_body':'您对'+task.task_name+'的扫描任务已完成,请及时查看结果', 39 | 'notice_url':'/task/user/', 40 | 'notice_type':'notice', 41 | } 42 | user = task.task_user 43 | notice_add(user,data) 44 | send_notice_mail(user.email,data) 45 | break 46 | else: 47 | time.sleep(30) 48 | 49 | 50 | @shared_task 51 | def save_awvs_vulns(scan_id,task_id): 52 | task = Task.objects.filter(task_id =task_id ).first() 53 | while True: 54 | status = AWVS11.getstatus(scan_id,task.task_scanner.id) 55 | if status == 'completed': 56 | awvs.get_scan_result(scan_id,task_id,task.task_scanner.id) 57 | task.task_status=4 58 | task.save() 59 | #type_task_list = {'移动应用':'type1','web应用':'type2','操作系统':'type3'} 60 | data={ 61 | 'notice_title':'任务进度通知', 62 | 'notice_body':'您对'+task.task_name+'的扫描任务已完成,请及时查看结果', 63 | 'notice_url':'/task/user/', 64 | 'notice_type':'notice', 65 | } 66 | user = task.task_user 67 | notice_add(user,data) 68 | send_notice_mail(user.email,data) 69 | break 70 | elif status == 'aborted': 71 | awvs.get_scan_result(scan_id,task_id,task.task_scanner.id) 72 | task.task_status=5 73 | task.save() 74 | #type_task_list = {'移动应用':'type1','web应用':'type2','操作系统':'type3'} 75 | data={ 76 | 'notice_title':'任务进度通知', 77 | 'notice_body':'您对'+task.task_name+'的扫描任务已完成,请及时查看结果', 78 | 'notice_url':'/task/user/', 79 | 'notice_type':'notice', 80 | } 81 | user = task.task_user 82 | notice_add(user,data) 83 | send_notice_mail(user.email,data) 84 | break 85 | else: 86 | time.sleep(60) 87 | -------------------------------------------------------------------------------- /TaskManage/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /TaskManage/urls.py: -------------------------------------------------------------------------------- 1 | #coding:utf-8 2 | ''' 3 | Created on 2018年5月25日 4 | 5 | @author: yuguanc 6 | ''' 7 | 8 | from django.urls import path 9 | from TaskManage.views import views,Scantasks 10 | 11 | urlpatterns = [ 12 | path('user/',views.TaskView,name='taskview'), 13 | path('user/list/',views.tasktablelist,name='tasklist'), 14 | path('user/nessus/scan/',Scantasks.ScanAll,name='scantask'), 15 | path('user/details/内网IP: | {{mapped.LANip.asset_key}} |
内网端口: | {{mapped.LANPort.port}} |
外网IP: | {{mapped.WANip.asset_key}} |
外网端口: | {{mapped.WANPort.port}} |
域名: | {{mapped.Domain}} |
映射状态: | 使用中 |
映射状态: | 已禁用 |
开启时间: | {{mapped.start_time}} |
关闭时间: | {{mapped.end_time}} |
申请人邮箱: | {{mapped.request_email}} |
操作人邮箱: | {{mapped.action_email}} |
申请单号: | {{mapped.request_order}} |
申请人: | {{mapped.request_user}} |
员工编号: | {{mapped.request_user_num}} |
申请部门: | {{mapped.request_user_department}} |
联系电话: | {{mapped.telephone}} |
更新时间: | {{mapped.mapped_updatetime}} |
映射备注: | {{mapped.Mapped_description}} |
欢迎使用SeMF安全管控平台 8 | 9 |10 |
{{ user_count }}
21 | 22 |{{ article_count }}
27 | 28 |{{ asset_count }}
33 | 34 |{{ cnvdvuln_count }}
39 | 40 |{{ vuln_count}}
45 | 46 |{{ vuln_fix_count}}
51 | 52 |用户姓名: | {{ user.first_name }}{{ user.last_name }} |
用户ID: | {{ user.username }} |
邮箱地址: | {{ user.email }} |
员工编号: | {{ user.profile.user_num }} |
入驻日期 : | {{ user.date_joined }} |
职位名称: | {{ user.profile.title }} |
直属领导: | {{ user.profile.parent_email }} |
系统角色: | {{ user.profile.roles.title }} |
座机号码: | {{ user.profile.telephone }} |
手机号码 | {{ user.profile.mobilephone }} |
个人简介 | {{ user.profile.description }} |
任务编号: | {{task.task_id}} |
扫描标识: | {{task.scan_id}} |
任务名称: | {{task.task_name}} |
任务类型: | {{task.task_type}} |
扫描器: | {{task.task_scanner.scanner_name}} |
任务目标: | {{task.task_target}} |
任务描述: | {{task.task_targetinfo}} |
创建时间: | {{task.task_starttime}} |
申请人: | {{task.task_user.username}} |
审批人: | {{task.action_user.username}} |
请求状态: | 26 | |
审批备注: | {{task.request_note}} |
审批时间: | {{task.task_endtime}} |
漏洞编号: | {{vuln.cve_id}} |
cnvd编号: | {{vuln.cnvd_id}} |
漏洞名称: | {{vuln.cve_name}} |
更新日期: | {{vuln.update_data}} |
危险等级: | {{vuln.leave}} |
影响范围: | {{vuln.scopen}} |
漏洞简介: | {{vuln.introduce}} |
修复方案: | {{vuln.fix}} |
修复指南: | {{vuln.fix_step}} |
漏洞编号: | {{vuln.vuln_id}} |
漏洞名称: | {{vuln.vuln_name}} |
cve编号: | {{vuln.cve_name}} |
危险等级: | 11 | {% if vuln.leave == '4' or vuln.leave == '3' %} 12 | 高危 13 | {% elif vuln.leave == '2' %} 14 | 中危 15 | {% elif vuln.leave == '1' %} 16 | 低危 17 | {% else %} 18 | 信息 19 | {% endif %} 20 | |
影响范围: | {{vuln.scopen}} |
漏洞简介: | {{vuln.introduce}} |
漏洞验证: | {{vuln.vuln_info}} |
修复方案: | {{vuln.fix}} |
发现时间: | {{vuln.create_data}} |
处理记录: | {{vuln.fix_action}} |
修复时间: | {{vuln.update_data}} |