nmap学习
Posted kalixcn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nmap学习相关的知识,希望对你有一定的参考价值。
Nmap概述
Namp是一个免费的开源网络扫描和嗅探工具,可以用来扫描计算机上开放的端口,确定哪些服务运行在那些端口,并且推断出计算机运行的操作系统。利用该工具,可以评估网络基础的安全性。
Nmap的四项功能:
- 主机发现
- 端口扫描
- 版本侦测
- 操作系统探测
工作原理:
- 发送探针并分析响应包的特征。(探针(Probe)是基于协议功能和特性,使用特定端口和数据载荷所构建的数据包)。
- 指纹信息就是目标主机响应包的特征信息,如TCP标志位、ARP应答报文、ICMP应答报文等等,通过这些指纹信息可以判断主机的状态和端口状态。
在Linux系统中,Nmap工具默认安装在/usr/share/nmap目录下,脚本默认在/usr/share/nmap/scripts.
nmap -V #查看nmap版本信息
#输出*********************************
# map version 7.93 ( https://nmap.org )
#版本号
# Platform: x86_64-pc-linux-gnu
#操作系统
# Compiled with: liblua-5.3.6 openssl-3.0.7 libssh2-1.10.0 libz-1.2.13 libpcre-8.39 nmap-libpcap-1.7.3 nmap-libdnet-1.12 ipv6
#编译库
# Compiled without:
# Available nsock engines: epoll poll select
#可以套接字引擎
--dns-servers <serv1,[serv2],...>:指定特定的NDS服务器地址。
--system-dns:使用操作系统的DNS解析器。
-sL(Scan List):列出扫描的目标
-iL(Input from List)<inputfilename>:指定主机或网络列表文件
--resolve-all:指定扫描主机中的所有IP地址
实例:
nmap --dns-servers 114.114.114.114 www.baidu.com
nmap --system-dns www.baidu.com
#扫描连续主机IP地址,如扫描10.10.1.100-10.10.1.200
#cat ip.txt
# 10.10.1.132
# 10.10.1.135
# 10.10.1.168
nmap -iL ip.txt #对指定文件中的IP进行扫描
nmap -iL ip.txt -sL #
nmap --resolve-all www.baidu.com #扫描主机www.baidu.com中的所有IP地址
--exclude <host1,host2..>:指定排除的主机
--excludefile <exclude_file>:指定排除的主机文件列表
#扫描192.168.198.0/24网络中所有主机,但不扫描192.169.0-100范围内的主机
nmap 192.169.198.0/24 --exclude 192.168.198.1-100 -sL
--iR <num hosts>:指定随机扫描的主机数
#随机扫描5个主机并列出来
nmap -iR 5 -sL
-A:实施全部扫描,探测目标主机的操作系统和版本信息
渗透步骤:
-
发现主机
在Nmap中,可以通过不同的方式来发现主机,如IP发现,ICMP发现、TCP发现和UDP发现。- IP发现
-PO <protocol list>:使用IP数据包探测目标主机是否开启,其中,protocol list是协议编号列表。如17(UDP)、1(ICMP)、6(TCP)、4(IP)。
-sn:实施ping扫描,禁止端口扫描
-PE:实施ICMP Echo探测请求发现。其中P是ping的首字母,E是ICMP Echo的首字母。
-PP:ICMP时间戳Ping扫描。
-PM:进行ICMP地址掩码Ping扫描。
-PS<portlist>:实施TCP SYN Ping扫描
-PA<portlist>:实施TCP ACK扫描
-PU<portlist>:实施UDP Ping扫描
-PR:实施ARP Ping扫描
-R:对IP地址进行反向域名解析
-n:禁止域名解析
--traceroute:实施路由追踪
--packet-trace:显示包发送
如果目标主机禁用Ping发现,则可以跳过主机发现,直接进行其他扫描,使用这种方法可以很好地规避防火墙
-P0:跳过主机发现
-Pn:跳过主机发现
- IP发现
-
扫描端口
-p:指定扫描端口
实例:扫描UDP的53和137端口,扫描TCP的25和80端口 nmap -Pn -sU -sS U:53,137,T:25,80
--exclude-ports<portranges>:指定排除端口
namp -r <target>:实施顺序扫描-sT:TCP全连接扫描
-sS:SYN半连接扫描隐蔽扫描:
nmap 10.10.10.129 -p 80 -sF # Fin扫描 nmap 10.10.10.129 -p 80 -sN # Null扫描(所有flags都为0的TCP包) nmap 10.10.129 -p 80 -sX # Xmas扫描(flags的FIN、URG、PUSH都为1的包)
-
服务识别
nmap 10.10.10.129 -p -sV
- 系统识别
nmap 10.10.10.129 -O
- 扫描结果导出
- 导出为文本格式
nmap 10.10.10.129 -oN result.txt
- 导出为xml格式
nmap 10.10.10.129 -oX result.xml
6. 逃避防火墙和IDS检测
--source-port <portnum>:指定信任源端口
-g <portnum>:指定信任的源端口
实例:使用被信任的源端口67对目标实施主机发现
nmap -sn -PS --source-port 67 10.10.10.129
--badsum:使用一个伪TCP/UDP/SCTP校验值发送探测数据包。
--adler32:用于指定SCTP校验值。
nmap --badsum -sn 10.10.10.129
数据载荷指发送的数据报中所包含的数据,通过添加数据载荷伪造成有意义的数据包,逃避防火墙或者IDS检测。
--data-length<num>:指定数据包长度的随机数
--date-string:指定一个文本值的数据
报文分段是将一个数据包分成许多更小的分片,来逃避防火墙或者IDS检测。
-f<var>:设置分片大小
--mtu<val>:设置最大传输单元值
--ttl<val>:设置一个TTL值,其中,TTL值的范围为0~255。
脚本使用
Nmap脚本主要分为以下几类:
auth:负责处理认证证书(绕过认证)的脚本,如enum-users。
broadcast:在局域网内探测更多的服务开启情况脚本。
brute:用来暴力破解的脚本,如http-brute和snmp-brute。
discovery:对网络进行扫描,如SMB枚举和SNMP查询。
dos:用来进行拒绝访问工具。
fuzzer:探测主机潜在漏洞。
vuln:负责检查目标主机是否有常见的漏洞
malware:探测目标主机是否开启后门或者感染病毒。
intrusive:入侵性脚本。
safe:安全类型
更新脚本
nmap --script-updatedb
--script-help=<Lus scripts>:查看脚本帮助信息
实例:
使用ftp-anon脚本对目标实施扫描
nmap -p 21 --script=ftp-anon 10.10.10.129
使用vuln类脚本实施扫描
nmap --script=vuln 10.10.10.129
指定脚本参数,如果不指定将使用默认参数
--script-args-file=filename:指定脚本参数文件列表
--script-args=<n1..n2>:指定参数
实例:使用ftp-brute对服务进行暴力破解
nmap -p 21 --script=ftp-brute --script-args userdb=user.txt,passdb=password.txt
扫描整个局域网中活动的主机
nmap -sL --script=targets-sniffer --script-args=newtargets,targets-sniffer.timeout=4s,targets-sniffer.iface=eth0
监听广播包
nmap --script=broadcast-listener -e eth0
探测防火墙
nmap --script=firewalk --traceroute www.baidu.com
获取路由器跟踪位置
nmap --traceroute --script=traceroute-geolocation www.baidu.com
广播ping发现主机
nmap -e eth0 --script=broadcast-ping <target > [--ttl <ttl>][--data-length]<payload_length>
探测IP转发
nmap -sn <target> --script ip-forwarding --script-args=\'target=www.example.com\'
使用字典暴力爆破子域名
nmap --script=dns-brute baidu.com
探测基本认证信息
nmap --script http-auth 10.10.22.1
探测默认账号
nmap --script=http-default-accounts 10.10.11.1
探测使用方法
nmap --script=http-methods 10.10.10.1
获取HTTP注释信息
nmap -p 80 --script=http-comments-displayer.nse 10.10.10.129
获取邮件地址
nmap --script=http-grep -p 80 10.10.10.129
查看http是否开启TRACE方法
nmap --script=http-trace -p 80 10.10.10.129
探测目标主机Telnet服务是否支持加密
nmap -p 23 --script=telnet-encrytion 10.10.10.129
破解Telnet服务密码
nmap -p 23 --script=telnet-brute 10.10.10.129
探测SSH服务
查看SSH服务的密钥信息
nmap --script=ssh-hostkey --script-args=ssh_hostkey=full 10.10.10.129
查看目标主机支持的SSH2协议算法
nmap --script=ssh2-enum-algos 10.10.10.129
检查MySQL空密码
nmap --script=mysql-empty-password 10.10.10.129
暴力破解mysql用户密码
nmap --script=mysql-brute -p 3306 10.10.10.129
枚举MySQL数据库用户信息
nmap --script=mysql-enum -p 3306 10.10.10.129
SQL Server的超级用户sa,使用端口为1433
破解SQL Server数据库的用户密码
nmap -p 1433 --script=ms-sql-info 10.10.10.129
nmap -p 1433 --script=ms-sql-brute 10.10.10.129
查看ftp是否允许匿名登录
nmap --script=ftp-anon 10.10.10.129
python模块学习----nmap模块
安装nmap模块:
pip install python_nma
nmap模块说明:
python-nmap是一个帮助使用nmap端口扫描器的python库。它允许轻松操纵nmap扫描结果,并且将是一个完美的选择,为需要自动完成扫描任务的系统管理员提供的工具并报告。它也支持nmap脚本输出。
nmap模块类:
ET:Python的轻量级XML支持
PortScanner:端口扫描
PortScannerAsync:异步进行端口扫描
PortScannerError:nmap的异常错误类
PortScannerHostDict:用于存储和访问主机扫描结果的特殊小类
PortScannerYield:通过生成器使用Python中的nmap
Process:表示在单独的过程中运行的活动,应该是控制扫描进程之类的
convert_nmap_output_to_encoding:编码
csv:CSV操作模块
io:
nmap:
os:
re:
shlex:
subprocess:
sys:
看大概意思就知道,我们这里主要是用PortScanner、PortScannerError、PortScannerHostDict这三个类
PortScanner:普通端口扫描类
初始化PortScanner类,首先看看该模块的__init__构造函数说明。
检测系统和nmap版本上的nmap,如果在路径中找不到nmap,可能会引发PortScannerError异常
__init__(self, nmap_search_path=('nmap', '/usr/bin/nmap', '/usr/local/bin/nmap', '/sw/bin/nmap', '/opt/local/bin/nmap'))
如果你调用PortScanner模块异常,可能就是nmap_search_path默认路径里没找到你安装的nmap可执行文件,需要你手动修改此参数默认值即可。
该类里的方法说明:
all_hosts():返回所有主机的排序列表 analyse_nmap_xml_scan(nmap_xml_output=None, nmap_err='', nmap_err_keep_trace='', nmap_warn_keep_trace=''):分析NMAP xml扫描输出 param nmap_xml_output:要分析的xml字符串 command_line():返回用于扫描的命令行 csv():将CSV输出作为文本返回 get_nmap_last_output():以原始文本返回nmap的最后文本输出 has_host(host):如果主机有结果则返回True,否则返回False listscan(hosts='127.0.0.1'):不要扫描,但解释目标主机并返回一个主机列表 nmap_version():如果检测到返回nmap版本 scan(hosts='127.0.0.1', ports=None, arguments='-sV', sudo=False):扫描指定的主机 如果nmap输出不是xml,可能会引发PortScannerError异常 hosts:需要扫描的IP或IP段 ports:扫描的端口 arguments:nmap的参数字符串'-sU -sX -sC' sudo:是否使用sudo启动nmap scaninfo():返回scaninfo结构{'tcp': {'services': '22', 'method': 'connect'}} scanstats():返回scanstats结构{'uphosts': '3', 'timestr': 'Thu Jun 3 21:45:07 2010', 'downhosts': '253', 'totalhosts': '256', 'elapsed': '5.79'}
实例演示:
>>> nm = nmap.PortScanner() #实例化普通端口扫描对象nm >>> nm.nmap_version() #看看当前系统nmap版本 (7, 70) #当前版本为nmap7.7 >>> date = nm.scan('127.0.0.1','22','-sV') #进行扫描,会弹出nmap cmd窗口,会一直等待扫描结束,然后返回json格式的扫描结果date {'nmap': {'command_line': 'nmap -oX - -p 22 -sV 127.0.0.1', 'scaninfo': {'tcp': {'method': 'syn', 'services': '22'}}, 'scanstats': {'timestr': 'Fri Apr 13 10:43:29 2018', 'elapsed': '8.71', 'uphosts': '1', 'downhosts': '0', 'totalhosts': '1'}}, 'scan': {'127.0.0.1': {'hostnames': [{'name': '', 'type': ''}], 'addresses': {'ipv4': '127.0.0.1'}, 'vendor': {}, 'status': {'state': 'up', 'reason': 'localhost-response'}, 'tcp': {22: {'state': 'open', 'reason': 'syn-ack', 'name': 'ssh', 'product': 'Microsoft Windows IoT sshd', 'version': '1.100', 'extrainfo': 'protocol 2.0', 'conf': '10', 'cpe': 'cpe:/o:microsoft:windows_10:::iot_core'}}}}} >>> nm.all_hosts() ['127.0.0.1'] >>> nm.command_line() 'nmap -oX - -p 22 -sV 127.0.0.1' >>> nm.csv() 'host;hostname;hostname_type;protocol;port;name;state;product;extrainfo;reason;version;conf;cpe\r\n127.0.0.1;;;tcp;22;ssh;open;Microsoft Windows IoT sshd;protocol 2.0;syn-ack;1.100;10;cpe:/o:microsoft:windows_10:::iot_core\r\n' >>> nm.get_nmap_last_output() '<?xml version="1.0" encoding="UTF-8"?>\r\n<!DOCTYPE nmaprun>\r\n<?xml-stylesheet href="file:///d:/Program Files (x86)/Nmap/nmap.xsl" type="text/xsl"?>\r\n<!-- Nmap 7.70 scan initiated Fri Apr 13 10:43:20 2018 as: nmap -oX - -p 22 -sV 127.0.0.1 -->\r\n<nmaprun scanner="nmap" args="nmap -oX - -p 22 -sV 127.0.0.1" start="1523587400" startstr="Fri Apr 13 10:43:20 2018" version="7.70" xmloutputversion="1.04">\r\n<scaninfo type="syn" protocol="tcp" numservices="1" services="22"/>\r\n<verbose level="0"/>\r\n<debugging level="0"/>\r\n<host starttime="1523587408" endtime="1523587409"><status state="up" reason="localhost-response" reason_ttl="0"/>\r\n<address addr="127.0.0.1" addrtype="ipv4"/>\r\n<hostnames>\r\n</hostnames>\r\n<ports><port protocol="tcp" portid="22"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="ssh" product="Microsoft Windows IoT sshd" version="1.100" extrainfo="protocol 2.0" ostype="Windows 10 IoT Core" method="probed" conf="10"><cpe>cpe:/o:microsoft:windows_10:::iot_core</cpe></service></port>\r\n</ports>\r\n<times srtt="0" rttvar="5000" to="100000"/>\r\n</host>\r\n<runstats><finished time="1523587409" timestr="Fri Apr 13 10:43:29 2018" elapsed="8.71" summary="Nmap done at Fri Apr 13 10:43:29 2018; 1 IP address (1 host up) scanned in 8.71 seconds" exit="success"/><hosts up="1" down="0" total="1"/>\r\n</runstats>\r\n</nmaprun>\r\n' >>> nm.scaninfo() {'tcp': {'method': 'syn', 'services': '22'}} >>> nm.scanstats() {'timestr': 'Fri Apr 13 10:43:29 2018', 'elapsed': '8.71', 'uphosts': '1', 'downhosts': '0', 'totalhosts': '1'} >>>
PortScannerHostDict类说明:
该类里的方法说明:
all_ip():返回ip端口列表 all_protocols():返回所有扫描协议的列表 >>> nm['127.0.0.1'].all_protocols() ['tcp'] all_sctp():返回sctp端口列表 all_tcp():返回tcp端口列表 >>> nm['127.0.0.1'].all_tcp() [22] all_udp():返回udp端口列表 has_ip(port):如果ip端口具有info,则返回true,否则返回False has_sctp(port):如果sctp端口有info,则为真,否则为False has_tcp(port):如果tcp端口有info,则返回true,否则返回False has_udp(port):如果udp端口有info,则返回true,否则返回False hostname():返回用户记录或列表主机名的第一个主机名 hostnames():返回主机名列表 ip(port):返回信息的IP端口 sctp(port):返回信息的sctp端口 state():返回主机状态 tcp(port):返回tcp端口的信息 >>> nm['127.0.0.1'].state() 'up' udp(port):返回udp端口的信息 uptime():返回主机状态
以上是关于nmap学习的主要内容,如果未能解决你的问题,请参考以下文章