python3 安装 nmap
python-nmap 是一个 python 库,它有助于使用 nmap 端口扫描器。
它允许很容易地操作 nmap 扫描结果,支持 nmap 脚本输出。
apt-get install nmap
pip3 isntall python-nmap
nmap 在 python 中的应用,官方方法描述:
import nmap
# 实例化 PortScanner 对象
nm = nmap.PortScanner()
- 扫描 127.0.0.1 的22到443端口
nm.scan('127.0.0.1', '22-443')
结果:这里扫描到了两个端口 80 和 22
In [5]: nm.scan('127.0.0.1', '22-443')
Out[5]:
{'scan': {'127.0.0.1': {'vendor': {},
'hostnames': [{'type': 'PTR', 'name': 'localhost'}],
'addresses': {'ipv4': '127.0.0.1'},
'tcp': {80: {'product': 'nginx',
'version': '1.10.3',
'reason': 'syn-ack',
'extrainfo': 'Ubuntu',
'state': 'open',
'cpe': 'cpe:/o:linux:linux_kernel',
'conf': '10',
'name': 'http'},
22: {'product': 'OpenSSH',
'version': '7.2p2 Ubuntu 4ubuntu2.4',
'reason': 'syn-ack',
'extrainfo': 'Ubuntu Linux; protocol 2.0',
'state': 'open',
'cpe': 'cpe:/o:linux:linux_kernel',
'conf': '10',
'name': 'ssh'}},
'status': {'state': 'up', 'reason': 'localhost-response'}}},
'nmap': {'scanstats': {'downhosts': '0',
'timestr': 'Wed Jan 16 14:51:02 2019',
'uphosts': '1',
'totalhosts': '1',
'elapsed': '8.24'},
'command_line': 'nmap -oX - -p 22-443 -sV 127.0.0.1',
'scaninfo': {'tcp': {'services': '22-443', 'method': 'syn'}}}}
- 获取上面用于扫描的命令行语句
nm.command_line()
In [6]: nm.command_line()
Out[6]: 'nmap -oX - -p 22-443 -sV 127.0.0.1'
- 获取 nmap 的扫描信息
nm.scaninfo()
In [7]: nm.scaninfo()
Out[7]: {'tcp': {'services': '22-443', 'method': 'syn'}}
- 获取所有被扫描的主机
nm.all_hosts()
In [8]: nm.all_hosts()
Out[8]: ['127.0.0.1']
- 获取主机127.0.0.1的一个主机名,通常是用户记录
nm['127.0.0.1'].hostname()
In [9]: nm['127.0.0.1'].hostname()
Out[9]: 'localhost'
- 获取主机127.0.0.1的主机名列表
nm['127.0.0.1'].hostnames()
In [10]: nm['127.0.0.1'].hostnames()
Out[10]: [{'type': 'PTR', 'name': 'localhost'}]
- 获取主机127.0.0.1的状态 (up|down|unknown|skipped)
nm['127.0.0.1'].state()
In [11]: nm['127.0.0.1'].state()
Out[11]: 'up'
- 获取所有扫描到的协议 ['tcp', 'udp'] in (ip|tcp|udp|sctp)
nm['127.0.0.1'].all_protocols()
In [12]: nm['127.0.0.1'].all_protocols()
Out[12]: ['tcp']
- 获取 tcp 协议的所有端口
nm['127.0.0.1']['tcp'].keys()
In [13]: nm['127.0.0.1']['tcp'].keys()
Out[13]: dict_keys([80, 22])
- 获取 tcp 协议的所有端口(排序版本)
nm['127.0.0.1'].all_tcp()
In [14]: nm['127.0.0.1'].all_tcp()
Out[14]: [22, 80]
- 获取 udp 协议的所有端口(排序版本)
nm['127.0.0.1'].all_udp()
In [15]: nm['127.0.0.1'].all_udp()
Out[15]: []
- 获取 ip 协议的所有端口(已排序版本)
nm['127.0.0.1'].all_ip()
In [16]: nm['127.0.0.1'].all_ip()
Out[16]: []
- 获取 sctp 协议的所有端口(已排序版本)
nm['127.0.0.1'].all_sctp()
In [17]: nm['127.0.0.1'].all_sctp()
Out[17]: []
- 主机 127.0.0.1 上是否有端口 22/tcp 的信息
nm['127.0.0.1'].has_tcp(22)
In [18]: nm['127.0.0.1'].has_tcp(22)
Out[18]: True
- 获取关于主机 127.0.0.1 上 tcp 中的端口 22 的信息
nm['127.0.0.1']['tcp'][22]
In [19]: nm['127.0.0.1']['tcp'][22]
Out[19]:
{'product': 'OpenSSH',
'version': '7.2p2 Ubuntu 4ubuntu2.4',
'reason': 'syn-ack',
'extrainfo': 'Ubuntu Linux; protocol 2.0',
'state': 'open',
'cpe': 'cpe:/o:linux:linux_kernel',
'conf': '10',
'name': 'ssh'}
- 同上
nm['127.0.0.1'].tcp(22)
In [20]: nm['127.0.0.1'].tcp(22)
Out[20]:
{'product': 'OpenSSH',
'version': '7.2p2 Ubuntu 4ubuntu2.4',
'reason': 'syn-ack',
'extrainfo': 'Ubuntu Linux; protocol 2.0',
'state': 'open',
'cpe': 'cpe:/o:linux:linux_kernel',
'conf': '10',
'name': 'ssh'}
- 17 获取主机 127.0.0.1 上端口 22/tcp 的状态
nm['127.0.0.1']['tcp'][22]['state']
In [21]: nm['127.0.0.1']['tcp'][22]['state']
Out[21]: 'open'
- 扫描结果以 CSV 格式展现
nm.csv()
In [22]: print(nm.csv())
host;hostname;hostname_type;protocol;port;name;state;product;extrainfo;reason;version;conf;cpe
127.0.0.1;localhost;PTR;tcp;22;ssh;open;OpenSSH;"Ubuntu Linux; protocol 2.0";syn-ack;7.2p2 Ubuntu 4ubuntu2.4;10;cpe:/o:linux:linux_kernel
127.0.0.1;localhost;PTR;tcp;80;http;open;nginx;Ubuntu;syn-ack;1.10.3;10;cpe:/o:linux:linux_kernel