Naabu is a port scanning tool written in Go that allows you to enumerate valid ports for hosts in a fast and reliable manner. It is a really simple tool that does fast SYN/CONNECT/UDP scans on the host/list of hosts and lists
all ports that return a reply.
Features
- Fast And Simple SYN/CONNECT/UDP probe based scanning
- Optimized for ease of use and lightweight on resources
- DNS Port scan
- Automatic IP Deduplication for DNS port scan
- IPv4/IPv6 Port scan (experimental)
- Passive Port enumeration using Shodan Internetdb
- Host Discovery scan (experimental)
- NMAP integration for service discovery
- Custom UDP payloads for CONNECT scans
- Native UDP service probes powered by nmap-service-probes
- Multiple input support - STDIN/HOST/IP/CIDR/ASN
- Multiple output format support - JSON/TXT/STDOUT
Usage
naabu -hThis will display help for the tool. Here are all the switches it supports.
/* Detailed source-code truncated for AI context efficiency. */Installation Instructions
Download the ready to run binary / docker or install with GO
Prerequisite
Note: before installing naabu, make sure to install
libpcaplibrary for packet capturing.
To install libpcap on Linux: sudo apt install -y libpcap-dev, on Mac: brew install libpcap, on Windows: install Npcap
Installing Naabu
go install -v github.com/projectdiscovery/naabu/v2/cmd/naabu@latestRunning Naabu
To run the tool on a target, just use the following command.
naabu -host hackerone.comThis will run the tool against hackerone.com. There are a number of configuration options that you can pass along with this command. The verbose switch -v can be used to display verbose information.
naabu -host hackerone.com
__
___ ___ ___ _/ / __ __
/ _ \/ _ \/ _ \/ _ \/ // /
/_//_/\_,_/\_,_/_.__/\_,_/ v2.0.3
projectdiscovery.io
[WRN] Use with caution. You are responsible for your actions
[WRN] Developers assume no liability and are not responsible for any misuse or damage.
[INF] Running SYN scan with root privileges
[INF] Found 4 ports on host hackerone.com (104.16.100.52)
hackerone.com:80
hackerone.com:443
hackerone.com:8443
hackerone.com:8080The ports to scan for on the host can be specified via -p parameter (udp ports must be expressed as u:port). It takes nmap format ports and runs enumeration on them.
naabu -p 80,443,21-23,u:53 -host hackerone.comFor UDP scans, you can specify a custom payload to send using the -cp or --connect-payload flag. This is particularly useful for UDP services that require specific data to respond:
naabu -p u:53 -host example.com -cp "DNS query payload"By default, the Naabu checks for nmap's Top 100 ports. It supports the following in-built port lists -
| Flag | Description |
|---|---|
-top-ports 100 |
Scan for nmap top 100 port |
-top-ports 1000 |
Scan for nmap top 1000 port |
-p - |
Scan for full ports from 1-65535 |
You can also specify specific ports which you would like to exclude from the scan.
naabu -p - -exclude-ports 80,443To run the naabu on a list of hosts, -list option can be used.
naabu -list hosts.txtTo run the naabu on a ASN, AS input can be used. It takes the IP address available for given ASN and runs the enumeration on them.
echo AS14421 | naabu -p 80,443
216.101.17.249:80
216.101.17.249:443
216.101.17.248:443
216.101.17.252:443
216.101.17.251:80
216.101.17.251:443
216.101.17.250:443
216.101.17.250:80You can also get output in json format using -json switch. This switch saves the output in the JSON lines format.
naabu -host 104.16.99.52 -json
{"ip":"104.16.99.52","port":443}
{"ip":"104.16.99.52","port":80}The ports discovered can be piped to other tools too. For example, you can pipe the ports discovered by naabu to httpx which will then find running http servers on the host.
echo hackerone.com | naabu -silent | httpx -silent
http://hackerone.com:8443
http://hackerone.com:443
http://hackerone.com:8080
http://hackerone.com:80The speed can be controlled by changing the value of rate flag that represent the number of packets per second. Increasing it while processing hosts may lead to increased false-positive rates. So it is recommended to keep it to a reasonable amount.
IPv4 and IPv6
Naabu supports both IPv4 and IPv6, and both are enabled by default. If IPv6 is used, connectivity must be correctly configured, and the network interface must have an IPv6 address assigned (inet6) and a default gateway.
echo hackerone.com | naabu -p 80 -silent
104.16.99.52:80
104.16.100.52:80
2606:4700::6810:6434:80
2606:4700::6810:6334:80The option -ip-version 6 makes the tool use only IPv6 addresses while resolving domain names.
echo hackerone.com | ./naabu -p 80 -ip-version 6
__
___ ___ ___ _/ / __ __
/ _ \/ _ \/ _ \/ _ \/ // /
/_//_/\_,_/\_,_/_.__/\_,_/ v2.0.8
projectdiscovery.io
Use with caution. You are responsible for your actions
Developers assume no liability and are not responsible for any misuse or damage.
[INF] Running CONNECT scan with non root privileges
[INF] Found 1 ports on host hackerone.com (2606:4700::6810:6334)
hackerone.com:80To scan all the IPs of both versions, -scan-all-ips flag can be used.
echo hackerone.com | ./naabu -sa -p 80 -silent
[INF] Found 1 ports on host hackerone.com (104.16.100.52)
hackerone.com:80
[INF] Found 1 ports on host hackerone.com (104.16.99.52)
hackerone.com:80
[INF] Found 1 ports on host hackerone.com (2606:4700::6810:6334)
hackerone.com:80
[INF] Found 1 ports on host hackerone.com (2606:4700::6810:6434)
hackerone.com:80Host Discovery
Naabu optionally supports multiple options to perform host discovery. Host discovery is optional and can be enabled with the -wn flag. -sn flag instructs the tool to perform host discovery only.
Available options to perform host discovery:
- ARP ping (
-arp) - TCP SYN ping (
-ps 80) - TCP ACK ping (
-pa 443) - ICMP echo ping (
-pe) - ICMP timestamp ping (
-pp) - ICMP address mask ping (
-pm) - IPv6 neighbor discovery (
-nd)
Configuration file
Naabu supports config file as default located at $HOME/.config/naabu/config.yaml, It allows you to define any flag in the config file and set default values to include for all scans.
Nmap integration
We have integrated nmap support for service discovery or any additional scans supported by nmap on the found results by Naabu, make sure you have nmap installed to use this feature.
To use,nmap-cli flag can be used followed by nmap command, for example:-
echo hackerone.com | naabu -nmap-cli 'nmap -sV -oX nmap-output'
__
___ ___ ___ _/ / __ __
/ _ \/ _ \/ _ \/ _ \/ // /
/_//_/\_,_/\_,_/_.__/\_,_/ v2.0.0
projectdiscovery.io
[WRN] Use with caution. You are responsible for your actions
[WRN] Developers assume no liability and are not responsible for any misuse or damage.
[INF] Running TCP/ICMP/SYN scan with root privileges
[INF] Found 4 ports on host hackerone.com (104.16.99.52)
hackerone.com:443
hackerone.com:80
hackerone.com:8443
hackerone.com:8080
[INF] Running nmap command: nmap -sV -p 80,8443,8080,443 104.16.99.52
Starting Nmap 7.01 ( https://nmap.org ) at 2020-09-23 05:02 UTC
Nmap scan report for 104.16.99.52
Host is up (0.0021s latency).
PORT STATE SERVICE VERSION
80/tcp open http cloudflare
443/tcp open ssl/https cloudflare
8080/tcp open http-proxy cloudflare
8443/tcp open ssl/https-alt cloudflareService Version Detection
Naabu has built-in service version detection using nmap's service probes database. This runs in parallel with port scanning for maximum performance.
naabu -host scanme.sh -sVscanme.sh:22 [ssh OpenSSH/6.6.1p1]
scanme.sh:80 [http Apache httpd/2.4.7]
scanme.sh:9929 [nping-echo Nping echo]
[INF] Found 3 ports on host scanme.sh (45.33.32.156) with 3 services identifiedAvailable flags:
| Flag | Description |
|---|---|
-sV |
Enable service version detection |
-sV-fast |
Only probe port-hinted services (faster, skips fallback probes) |
-sV-timeout duration |
Timeout for service version probes (default 5s) |
-sV-workers int |
Number of concurrent service version workers (default 25) |
-sV-probes string |
Custom nmap-service-probes file path (auto-detected from local nmap install if empty) |
-sD |
Service discovery (match port number to service name, no active probing) |
The -sV flag requires the nmap-service-probes database file. naabu does not ship this database itself (it is licensed under the copyleft Nmap Public Source License, which is incompatible with naabu's MIT license), so it reads the file from a local nmap installation, automatically looking in standard nmap installation paths. To use a custom file, specify the path with -sV-probes.
UDP Service Probes
UDP services typically stay silent when they receive an empty datagram, so a blind UDP port scan misses most of them. With -uP (-udp-probes) naabu picks a protocol-specific payload from the nmap-service-probes database for each UDP port being scanned (DNS query for 53, NTP request for 123, SNMPv1 GetRequest for 161, and so on), so real services have something to reply to and naabu can report them as open.
naabu -host scanme.sh -p u:53,u:123,u:161 -uPNotes:
-uPis opt-in and additive. When disabled (the default) UDP scans keep their historical zero-length-datagram behavior.- The selected probe is the highest-priority (lowest-rarity) match for the destination port; if no probe is registered for a port the scan falls back to the empty datagram.
- A user-supplied payload via
-cpalways wins over the automatic probe for that port. -uPreuses the same probe database as-sV, so you can combine the two without paying the parse cost twice. The probe file is auto-located from a local nmap install; use-sV-probesto point at a custom file. If no database can be found-uPlogs a warning and is silently disabled.
CDN/WAF Exclusion
Naabu also supports excluding CDN/WAF IPs being port scanned. If used, only 80 and 443 ports get scanned for those IPs. This feature can be enabled by using exclude-cdn flag.
Currently cloudflare, akamai, incapsula and sucuri IPs are supported for exclusions.
Scan Status
Naabu exposes json scan info on a local port bound to localhost at http://localhost:63636/metrics (the port can be changed via the -metrics-port flag)
Using naabu as library
The following sample program scan the port 80 of scanme.sh. The results are returned via the OnResult callback:
package main
import (
"log"
"context"
"github.com/projectdiscovery/goflags"
"github.com/projectdiscovery/naabu/v2/pkg/result"
"github.com/projectdiscovery/naabu/v2/pkg/runner"
)
func main() {
options := runner.Options{
Host: goflags.StringSlice{"scanme.sh"},
ScanType: "s",
OnResult: func(hr *result.HostResult) {
log.Println(hr.Host, hr.Ports)
},
Ports: "80",
}
naabuRunner, err := runner.NewRunner(&options)
if err != nil {
log.Fatal(err)
}
defer naabuRunner.Close()
naabuRunner.RunEnumeration(context.Background())
}
OnResultis called once after the scan completes with aggregated results. To process results in real-time as ports are discovered, useOnReceiveinstead. TheStreamoption only controls async target loading — it does not affect when callbacks fire.
Notes
- Naabu allows arbitrary binary execution as a feature to support nmap integration.
- Naabu is designed to scan ports on multiple hosts / mass port scanning.
- As default naabu is configured with a assumption that you are running it from VPS.
- We suggest tuning the flags / rate if running naabu from local system.
- For best results, run naabu as root user.
Naabu is made with 🖤 by the projectdiscovery team. Community contributions have made the project what it is.
See the Thanks.md file for more details.