Nmap扫描器接口

使用Django框架开发nmap扫描接口,实现自动化扫描,并将扫描结果存入数据库。

首先使用Pycharm创建Django项目

之后使用命令django-admin.py startapp NmapAPI 创建Nmap API app

1 django-admin.py startapp NmapAPI

编写扫描代码,命名为do_scan

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 import subprocess
 4 import Analysis_xml
 5 import os
 6 
 7 
 8 def scan(target, options, task_id):
 9     task_id = str(task_id)
10 
11     child = subprocess.Popen('nmap %s %s -oX /root/nmap_scan/%s' % (options, target, target),
12                              shell=True)#使用nmap扫描,将扫描结果保存为xml格式
13     pid = child.pid#获取进程ID
14     xml = Analysis_xml.xml_db(task_id, pid, target)
15     child.wait()
16     xml.parse_xml()#解析xml格式数据
17 
18 
19 def scan_status(target):
20 
21     return os.path.exists('/root/nmap_scan/%s' % target)#检查文件是否存在,若存在表示程序正常执行,反之则执行失败

 接下来编写入口程序,使用多进程扫描,命名为view

# coding:utf-8
from django.shortcuts import render
from django.http import HttpResponse
import json
import do_scan
import time
import multiprocessing
import random


def index(request):
    return render(request, "scan.html")


def scan(request):
    if request.method == "GET":
        return render(request, "scan.html")
    if request.method == "POST":
        scan_target = request.POST.get("target", None)
        scan_options = request.POST.get("config1", None)
        scan_task_id = random.randint(1000000000, 9999999999)
        pool = multiprocessing.Pool(processes=10)#使用进程池,同时可执行10个进程

        i = scan_target.split()#对多个目标地址进行分割

        for target in i:
            pool.apply_async(do_scan.scan, (target, scan_options, scan_task_id))

    # pool.close()
    # pool.join()
    success_data = {"errcode": "0",
                    "errmsg": "ok",
                    "info": {
                        "taskid": scan_task_id,
                    }
                    }
    fail_data = {"errcode": "1",
                 "errmsg": "fail",
                 "info": {
                     "taskid": None
                 }
                 }

    time.sleep(0.5)
    status = do_scan.scan_status(i[0])
    if status:
        return HttpResponse(json.dumps(success_data))
    else:
        return HttpResponse(json.dumps(fail_data))

nmap扫描结果保存为xml格式,接着编写xml格式解析模块,并进行入库

 1 #!/usr/bin/env python
 2 # -*- coding=utf-8 -*-
 3 
 4 from xml.etree import ElementTree
 5 from NmapAPI import models
 6 import os
 7 
 8 
 9 class xml_db:
10     def __init__(self, task_id, pid, targets):
11 
12         self.args = None
13         self.timestr = None
14         self.hostname = []
15         self.Version = []
16         self.ports_list = []
17         self.state_list = []
18         self.service_list = []
19         self.info_list = []
20         self.task_id = task_id
21         self.targets = targets
22         self.pid = pid
23 
24     def parse_xml(self):
25 
26         filepath = '/root/nmap_scan/' + self.targets
27         with open(filepath, 'rt') as f:
28             tree = ElementTree.parse(f)
29 
30         for ele in tree.iter("nmaprun"):
31             self.args = ele.attrib.get('args')
32 
33         for time in tree.iter("finished"):
34             self.timestr = time.attrib.get('timestr')
35 
36         for names in tree.iter("hostname"):
37             name = names.attrib.get("name")
38             self.hostname.append(name)
39         self.hostname = self.hostname[0]
40 
41         for versions in tree.iter("service"):
42             version = versions.attrib.get("product")
43             self.Version.append(version)
44 
45         for ports in tree.iter("port"):
46             port = ports.attrib.get("portid")
47             self.ports_list.append(port)
48 
49         for states in tree.iter("state"):
50             state = states.attrib.get('state')
51             self.state_list.append(state)
52 
53         for services in tree.iter("service"):
54             service = services.attrib.get('name')
55             self.service_list.append(service)
56 
57         for i in range(len(self.ports_list)):
58             add = models.scan_info(task_id=self.task_id, pid=self.pid, hostname=self.hostname, port=self.ports_list[i],
59                                    version=self.Version[i], state=self.state_list[i], service=self.service_list[i],
60                                    args=self.args, timestr=self.timestr)
61             add.save()
62             os.system('rm -rf /root/nmap_scan/%s' % self.hostname)
63             i += 1

数据库模块

 1 from __future__ import unicode_literals
 2 from django.db import models
 3 
 4 
 5 class scan_info(models.Model):
 6 
 7     task_id = models.CharField(max_length=10)
 8     pid = models.CharField(max_length=10)
 9     hostname = models.CharField(max_length=50)
10     port = models.CharField(max_length=5)
11     version = models.CharField(max_length=50, null=True)
12     state = models.CharField(max_length=5)
13     service = models.CharField(max_length=10)
14     args = models.CharField(max_length=100)
15     timestr = models.CharField(max_length=100)
16 
17     def __unicode__(self):
18         return self.task_id

和数据库进行连接前需执行两条命令

1 python manage.py makemigrations
2 python manage.py migrate

 配置settings文件

增加database配置

 1 DATABASES = {
 2     'default': {
 3         'ENGINE': 'django.db.backends.mysql',
 4         'NAME': 'Data_information',
 5         'USER': 'root',
 6         'PASSWORD': '',
 7         'HOST': '',
 8         'PORT': '',
 9     }
10 }

注释csrf并且允许外部主机访问

 1 ALLOWED_HOSTS = ['*']#允许所有主机进行访问
 2 
 3 
 4 # Application definition
 5 
 6 INSTALLED_APPS = [
 7     'django.contrib.admin',
 8     'django.contrib.auth',
 9     'django.contrib.contenttypes',
10     'django.contrib.sessions',
11     'django.contrib.messages',
12     'django.contrib.staticfiles',
13     'NmapAPI',
14     'HydraAPI',
15 ]
16 
17 MIDDLEWARE = [
18     'django.middleware.security.SecurityMiddleware',
19     'django.contrib.sessions.middleware.SessionMiddleware',
20     'django.middleware.common.CommonMiddleware',
21     # 'django.middleware.csrf.CsrfViewMiddleware',#注释csrf模块
22     'django.contrib.auth.middleware.AuthenticationMiddleware',
23     'django.contrib.messages.middleware.MessageMiddleware',
24     'django.middleware.clickjacking.XFrameOptionsMiddleware',
25 ]

 

转载于:https://www.cnblogs.com/ZhangYK/p/6516564.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值