naabu功能
快速简单的SYN/CONNECT探针扫描
使用Shodan Internetdb API的被动端口枚举功能
优化了易用性和资源的轻量级
端口扫描引入自动IP重复数据消除
基于NMAP的服务发现功能
多来源输入支持:STDIN/HOST/IP/CIDR
多格式输出支持:JSON/TXT/STDOUT
naabu下载安装
https://github.com/projectdiscovery/naabu/releases
选择合适的版本下载
naabu使用
naabu
常用参数:
-host 指定目标ip,ip之间以逗号分隔(ipv4、ipv6)
-list(-l) 指定目标ip文件,ip之间以换行符分隔
-exculde-hosts(-eh) 指定不扫描的ip
-exclude-file(-ef) 指定不扫描的ip文件
-port(-p) 指定扫描端口(如:80,443,100-200)(-p - 扫描全端口)
-exclude-ports(-ep) 指定不扫描的端口
-ports-file(-pf) 指定扫描的端口文件,端口之间以逗号分隔
-port-threshold(-pts) 整数值,跳过主机端口扫描的端口阈值
-top-ports(-tp) 100 扫描前100个端口
-c 指定一般内部的工作线程数,默认25
-rate 指定每秒发包数量,默认1000
-output(-o) 输出结果到文件
-json(-j) 以json形式输出结果,简写-j会报错
-csv 以csv格式输出结果
-probe-tcp-syn(-ps) TCP SYN Ping(半开放扫描)
-probe-tcp-ack(-pa) TCP ACK Ping
-probe-icmp-echo(-pe) ICMP echo request Ping
-arp-ping(-arp) ARP Ping
-nmap-cli 'nmap -sV --version-light -n --send-ip -P0' 调用nmap命令,当naabu实现第一阶段的主机探活和端口探活后,此时会调用nmap对第一阶段中的ip和所有开放端口去重,下发nmap命令进行扫描
举个栗子
扫描x.x.x.x的80端口,并且调用nmap对其端口服务进行轻量级端口服务扫描,最后将结果以json形式输出到naabu.json文件中。
# 扫描x.x.x.x的80端口,并且调用nmap对其端口服务进行轻量级端口服务扫描,最后将结果以json形式输出到naabu.json文件中
naabu -host x.x.x.x -p 80,443 -nmap-cli 'nmap -sV --version-light' -o naabu.json -json
查看结果文件 vim naabu.json
注:这里的naabu.json文件中只会出现naabu扫描的结果,对于间接调用nmap得到的结果,需要另外指定nmap参数-oX naabu_nmap.xml文件进行输出
TCP SYN Ping、TCP ACK Ping、ICMP Ping的区别
- TCP SYN Ping:探测设备向目标ip的常用端口发送SYN TCP数据报文,目标ip端口若是开放则回包SYN ACK TCP报文,之后探测设备会立即发送RST包来终止TCP的连接
- TCP ACK Ping:探测设备向目标ip的常用端口发送ACK TCP数据报文,不论端口开放与否,只要目标ip主机状态是活动的都会返回一个RST报文
- ICMP echo request Ping:就是ICMP Ping,探测设备向目标ip发送ICMP echo request(类型为8)的数据表,若是目标ip主机在线,则会回一个ICMP echo reply(类型为0)的数据包以及时间戳(请求从源到目的再返回的时间--延迟)
naabu同nmap对比
naabu工具相对于nmap而言,最大的优势就是,naabu可以通过-c和-rate调节并发线程数和每秒发包数,从而提升扫描速度。
以下是nmap参数和naabu参数的详细对比:
nmap | naabu | ||
指定扫描ip | 10.121.110.113 | -host 10.121.110.113 | |
指定扫描端口 | -p T:80,443,U:161 | -p 80,443,1-59 | |
并发控制 | 一般内部工作线程数 | 不支持 | -c 100(默认是25) |
每秒发包数 | 不支持 | -rate 2000(默认是1000) | |
主机探活 | ICMP echo request Ping | -PE | -pe |
ICMP timestamp request Ping | -PP | -pp | |
ICMP address mask request Ping | -PM | -pm | |
ARP Ping | -PR | -arp | |
TCP SYN Ping | -PS 80,443 | -ps 80,443 | |
TCP ACK Ping | -PA | -pa | |
UDP Ping | -PU | ||
要求Nmap通过原IP套接字发送报文,而不是低层的以 太网帧 | --send-ip | ||
不用域名解析 | -n | ||
主机超时时间 | --host-timeout 600s | -timeout | |
跳过主机发现 | -P0 | -Pn | |
端口探活 | TCP SYN 扫描 | -sS | -s SYN(默认) |
发送RST数据包 | --default-rst-ratelimit | 不支持 | |
TCP connection()扫描(nmap默认的tcp扫描) | -sT | -s CONNECT | |
UDP扫描 | -sU | 不支持 | |
端口服务扫描 | -sV --version-light(轻量级服务扫描) | 不支持 | |
输出扫描结果到文件中 | -oX xxx.xml | -o 1.txt 输出到文件 -json 指定json形式 -csv 指定csv数据形式 | |
设置最大往返时间(每个探测的最长响应时间) | --max-rtt-timeout 200ms | 不支持 |
Go语言中执行naabu命令
若是不拼接-nmap-cli ‘nmap -sV'类似参数去调用nmap的话,可以常规使用go语言中的exec.Command函数进行命令拼接
cmd := exec.Command("naabu", "-host", ip, " -p", port)
但若是要拼接-nmap-cli ‘nmap -sV'类似参数,因为一个参数中存在单引号和空格,常规使用exec.Command函数会解析参数错误,导致无法正确调用nmap,这时可以用bash形式直接指定一整个命令
cmd := exec.Command("bash", "-c", "naabu -host 10.121.110.113 -p 80,443 -nmap-cli 'nmap -sV'")