Posts Python自动化之nmap端口扫描
Post
Cancel

Python自动化之nmap端口扫描

扫描ip网段主机详细信息,如操作系统、端口等

简介

Nmap,也就是Network Mapper,最早是Linux下的网络扫描和嗅探工具包。

Nmap是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端。确定哪些服务运行在哪些连接端,并且推断计算机运行哪个操作系统(这是亦称 fingerprinting)。它是网络管理员必用的软件之一,以及用以评估网络系统安全。

正如大多数被用于网络安全的工具,Nmap 也是不少黑客及骇客(又称脚本小子)爱用的工具 。系统管理员可以利用Nmap来探测工作环境中未经批准使用的服务器,但是黑客会利用Nmap来搜集目标电脑的网络设定,从而计划攻击的方法。

Nmap 在黑客帝国(The Matrix)中,连同SSH1的32位元循环冗余校验漏洞,被崔妮蒂用以入侵发电站的能源管理系统。

基本功能有三个:

  • 一是探测一组主机是否在线;
  • 其次是扫描主机端口,嗅探所提供的网络服务;
  • 还可以推断主机所用的操作系统 。

Nmap可用于扫描仅有两个节点的LAN,直至500个节点以上的网络。Nmap 还允许用户定制扫描技巧。通常,一个简单的使用ICMP协议的ping操作可以满足一般需求;也可以深入探测UDP或者TCP端口,直至主机所使用的操作系统;还可以将所有探测结果记录到各种格式的日志中, 供进一步分析操作。

背景说明

  • Python3
  • Windows
  • Nmap

流程

下载地址: Nmap官网

安装python-nmap

1
pip install python-nmap

Nmap_ping扫描:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import nmap

import sys

def nmap_ping_scan(network_prefix):    # 创建一个扫描实例

  nm = nmap.PortScanner()   # 配置nmap参数

  ping_scan_raw_result = nm.scan(hosts=network_prefix, arguments='-v -n -sn')

  host_list = []     # 分析扫描结果,并放入主机清单

  for Result in ping_scan_raw_result['scan'].values():

      if Result['status']['state'] == 'up':
          host_list.append(Result['addresses']['ipv4'])

  return host_list

if __name__ == '__main__':

    for host in nmap_ping_scan(sys.argv[1]):

        print('%-20s %5s' % (host, 'is UP'))

输出:

1
2
3
4
5
6
7
C:\Users> python .\nmap_ping扫描.py 192.168.0.0/24

192.168.0.102    is UP
 192.168.0.104    is UP
 192.168.0.105    is UP
 192.168.0.109    is UP
 192.168.0.103    is UP

Nmap_A综合扫描:

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import nmap
import sys

def nmap_A_scan(network_prefix):
    nm = nmap.PortScanner()    # 配置nmap扫描参数
    scan_raw_result = nm.scan(hosts=network_prefix, arguments='-v -n -A')    # 分析扫描结果
    for host, result in scan_raw_result['scan'].items():
        if result['status']['state'] == 'up':
            print('#'*17 + 'Host:' + host + '#'*17)
            print('-' * 20 + '操作系统猜测' + '-' * 20)
            for os in result['osmatch']:
              print('操作系统为:' + os['name'] + '   准确度为:' + os['accuracy'])
            idno = 1
            try:
                for port in result['tcp']:
                    try:
                        print('-' * 17 + 'TCP服务器详细信息' + '[' + str(idno) + ']' + '-' * 17)
                        idno += 1
                        print('TCP端口号:' + str(port))
                        try:
                            print('状态:' + result['tcp'][port]['state'])
                        except:
                            pass
                        try:
                            print('原因:' + result['tcp'][port]['reason'])
                        except:
                            pass
                        try:
                            print('额外信息:' + result['tcp'][port]['extrainfo'])
                        except:
                            pass
                        try:
                            print('名字:' + result['tcp'][port]['name'])
                        except:
                            pass
                        try: 
                            print('版本:' + result['tcp'][port]['version'])
                        except:
                            pass
                        try:
                            print('产品:' + result['tcp'][port]['product'])
                        except:
                            pass
                        try:
                            print('CPE:' + result['tcp'][port]['cpe'])
                        except:
                            pass
                        try:
                            print('脚本:' + result['tcp'][port]['script'])
                        except:
                            pass
                    except:
                        pass
            except:
                pass
            idno = 1
            try:
                for port in result['udp']:
                    try:
                        print('-' * 17 + 'UDP服务器详细信息' + '[' + str(idno) + ']' + '-' * 17)
                        idno += 1
                        print('UDP端口号:' + str(port))
                        try:
                            print('状态:' + result['udp'][port]['state'])
                        except:
                            pass
                        try:
                            print('原因:' + result['udp'][port]['reason'])
                        except:
                            pass
                        try:
                            print('额外信息:' + result['udp'][port]['extrainfo'])
                        except:
                            pass
                        try:
                            print('名字:' + result['udp'][port]['name'])
                        except:
                            pass
                        try:
                            print('版本:' + result['udp'][port]['version'])
                        except:
                            pass
                        try:
                            print('产品:' + result['udp'][port]['product'])
                        except:
                            pass
                        try:
                            print('CPE:' + result['udp'][port]['cpe'])
                        except:
                            pass
                        try:
                            print('脚本:' + result['udp'][port]['script'])
                        except:
                            pass
                    except:
                        pass
            except:
                pass
if __name__ == '__main__':
    nmap_A_scan(sys.argv[1])

输出:

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
C:\Users> python .\nmap_A_scan.py 192.168.0.103  
 \#################Host:192.168.0.103#################  
 --------------------操作系统猜测--------------------  
 操作系统为:Microsoft Windows 7  准确度为:99  
 操作系统为:Microsoft Windows 8.1  准确度为:99  
 操作系统为:Microsoft Windows Vista, Windows 7 SP1, or Windows 8.1 Update 1  准确度为:97  
 操作系统为:Microsoft Windows 10 1607  准确度为:96  
 操作系统为:Microsoft Windows 7 or 8.1 R1 or Server 2008 R2 SP1  准确度为:96  
 操作系统为:Microsoft Windows 10  准确度为:94  
 操作系统为:Microsoft Windows Vista SP2 or Windows 7 Ultimate SP0 - SP1  准确度为:94  
 操作系统为:Microsoft Windows Vista  准确度为:94  
 操作系统为:Microsoft Windows 7 Professional SP1  准确度为:93  
 操作系统为:Microsoft Windows 7 SP1  准确度为:93  
 -----------------TCP服务器详细信息[1]-----------------  
 TCP端口号:135  
 状态:open  
 原因:syn-ack  
 额外信息:  
 名字:msrpc  
 版本:  
 产品:Microsoft Windows RPC  
 CPE:cpe:/o:microsoft:windows  
 -----------------TCP服务器详细信息[2]-----------------  
 TCP端口号:139  
 状态:open  
 原因:syn-ack  
 额外信息:  
 名字:netbios-ssn  
 版本:  
 产品:Microsoft Windows netbios-ssn  
 CPE:cpe:/o:microsoft:windows  
 -----------------TCP服务器详细信息[3]-----------------  
 TCP端口号:445  
 状态:open  
 原因:syn-ack  
 额外信息:workgroup: WORKGROUP  
 名字:microsoft-ds  
 版本:  
 产品:Windows 7 Home Premium 7601 Service Pack 1 microsoft-ds  
 CPE:cpe:/o:microsoft:windows  
 -----------------TCP服务器详细信息[4]-----------------  
 TCP端口号:1025  
 状态:open  
 原因:syn-ack  
 额外信息:  
 名字:msrpc  
 版本:  
 产品:Microsoft Windows RPC  
 CPE:cpe:/o:microsoft:windows  
 -----------------TCP服务器详细信息[5]-----------------  
 TCP端口号:1026  
 状态:open  
 原因:syn-ack  
 额外信息:  
 名字:msrpc  
 版本:  
 产品:Microsoft Windows RPC  
 CPE:cpe:/o:microsoft:windows  
 -----------------TCP服务器详细信息[6]-----------------  
 TCP端口号:1027  
 状态:open  
 原因:syn-ack  
 额外信息:  
 名字:msrpc  
 版本:  
 产品:Microsoft Windows RPC  
 CPE:cpe:/o:microsoft:windows  
 -----------------TCP服务器详细信息[7]-----------------  
 TCP端口号:1028  
 状态:open  
 原因:syn-ack  
 额外信息:  
 名字:msrpc  
 版本:  
 产品:Microsoft Windows RPC  
 CPE:cpe:/o:microsoft:windows  
 -----------------TCP服务器详细信息[8]-----------------  
 TCP端口号:2869  
 状态:open  
 原因:syn-ack  
 额外信息:SSDP/UPnP  
 名字:http  
 版本:2.0  
 产品:Microsoft HTTPAPI httpd  
 CPE:cpe:/o:microsoft:windows  

其中需要注意的问题:

1、功能更改arguments的值;

2、输入的值可选择外部输入sys.argv[1],也可以直接添加域名之类的替换掉这个值;

3、安装好nmap后,需要在import nmap处按住Ctrl,点击进入nmap,添加安装路径

1
def __init__(self, nmap_search_path=('nmap', '/usr/bin/nmap', '/usr/local/bin/nmap', '/sw/bin/nmap', '/opt/local/bin/nmap', r'D:\Nmap\nmap.exe')):
This post is licensed under CC BY 4.0 by the author.

Contents

Blog Set Sail

诗意源于情感,曾经感性饱满的我

Comments powered by Disqus.