
Vulnerability analysis is an essential part of learning how to hack, ethical hacking and penetration testing. “fingerprinting” refers to a set of information that can be used to identify network protocols, operating systems, hardware devices, software, etc. Ethical hackers and pen testers use, “fingerprinting” as the first step of their attack to gather information about their targets. There are a number of tools to do this but I’m going to cover probably the most popular and well-known one.
Introducing Nmap
The Network Mapper (Nmap) is a free and open-source network scanner. It is a very powerful tool and very commonly used.
In order to follow along with this tutorial I recommend reading two of my other articles:
- Ethical Hacking (Part 1): OWASP Top 10 and DVWA
- Ethical Hacking (Part 2): Introducing Kali Linux
- What is NMAP and how to use it
The aim is to have a Linux system with the Damn Vulnerable Web Application (DVWA) installed using Apache and PHP. Nmap can be installed on all Linux systems but it comes bundled with Kali as standard.
Let’s look at the help file to get an idea of what it does…
kali@kali:~$ nmap
Nmap 7.91 ( https://nmap.org )
Usage: nmap [Scan Type(s)] [Options] {target specification}
TARGET SPECIFICATION:
Can pass hostnames, IP addresses, networks, etc.
Ex: scanme.nmap.org, microsoft.com/24, 192.168.0.1; 10.0.0-255.1-254
-iL <inputfilename>: Input from list of hosts/networks
-iR <num hosts>: Choose random targets
--exclude <host1[,host2][,host3],...>: Exclude hosts/networks
--excludefile <exclude_file>: Exclude list from file
HOST DISCOVERY:
-sL: List Scan - simply list targets to scan
-sn: Ping Scan - disable port scan
-Pn: Treat all hosts as online -- skip host discovery
-PS/PA/PU/PY[portlist]: TCP SYN/ACK, UDP or SCTP discovery to given ports
-PE/PP/PM: ICMP echo, timestamp, and netmask request discovery probes
-PO[protocol list]: IP Protocol Ping
-n/-R: Never do DNS resolution/Always resolve [default: sometimes]
--dns-servers <serv1[,serv2],...>: Specify custom DNS servers
--system-dns: Use OS's DNS resolver
--traceroute: Trace hop path to each host
SCAN TECHNIQUES:
-sS/sT/sA/sW/sM: TCP SYN/Connect()/ACK/Window/Maimon scans
-sU: UDP Scan
-sN/sF/sX: TCP Null, FIN, and Xmas scans
--scanflags <flags>: Customize TCP scan flags
-sI <zombie host[:probeport]>: Idle scan
-sY/sZ: SCTP INIT/COOKIE-ECHO scans
-sO: IP protocol scan
-b <FTP relay host>: FTP bounce scan
PORT SPECIFICATION AND SCAN ORDER:
-p <port ranges>: Only scan specified ports
Ex: -p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080,S:9
--exclude-ports <port ranges>: Exclude the specified ports from scanning
-F: Fast mode - Scan fewer ports than the default scan
-r: Scan ports consecutively - don't randomize
--top-ports <number>: Scan <number> most common ports
--port-ratio <ratio>: Scan ports more common than <ratio>
SERVICE/VERSION DETECTION:
-sV: Probe open ports to determine service/version info
--version-intensity <level>: Set from 0 (light) to 9 (try all probes)
--version-light: Limit to most likely probes (intensity 2)
--version-all: Try every single probe (intensity 9)
--version-trace: Show detailed version scan activity (for debugging)
SCRIPT SCAN:
-sC: equivalent to --script=default
--script=<Lua scripts>: <Lua scripts> is a comma separated list of
directories, script-files or script-categories
--script-args=<n1=v1,[n2=v2,...]>: provide arguments to scripts
--script-args-file=filename: provide NSE script args in a file
--script-trace: Show all data sent and received
--script-updatedb: Update the script database.
--script-help=<Lua scripts>: Show help about scripts.
<Lua scripts> is a comma-separated list of script-files or
script-categories.
OS DETECTION:
-O: Enable OS detection
--osscan-limit: Limit OS detection to promising targets
--osscan-guess: Guess OS more aggressively
TIMING AND PERFORMANCE:
Options which take <time> are in seconds, or append 'ms' (milliseconds),
's' (seconds), 'm' (minutes), or 'h' (hours) to the value (e.g. 30m).
-T<0-5>: Set timing template (higher is faster)
--min-hostgroup/max-hostgroup <size>: Parallel host scan group sizes
--min-parallelism/max-parallelism <numprobes>: Probe parallelization
--min-rtt-timeout/max-rtt-timeout/initial-rtt-timeout <time>: Specifies
probe round trip time.
--max-retries <tries>: Caps number of port scan probe retransmissions.
--host-timeout <time>: Give up on target after this long
--scan-delay/--max-scan-delay <time>: Adjust delay between probes
--min-rate <number>: Send packets no slower than <number> per second
--max-rate <number>: Send packets no faster than <number> per second
FIREWALL/IDS EVASION AND SPOOFING:
-f; --mtu <val>: fragment packets (optionally w/given MTU)
-D <decoy1,decoy2[,ME],...>: Cloak a scan with decoys
-S <IP_Address>: Spoof source address
-e <iface>: Use specified interface
-g/--source-port <portnum>: Use given port number
--proxies <url1,[url2],...>: Relay connections through HTTP/SOCKS4 proxies
--data <hex string>: Append a custom payload to sent packets
--data-string <string>: Append a custom ASCII string to sent packets
--data-length <num>: Append random data to sent packets
--ip-options <options>: Send packets with specified ip options
--ttl <val>: Set IP time-to-live field
--spoof-mac <mac address/prefix/vendor name>: Spoof your MAC address
--badsum: Send packets with a bogus TCP/UDP/SCTP checksum
OUTPUT:
-oN/-oX/-oS/-oG <file>: Output scan in normal, XML, s|<rIpt kIddi3,
and Grepable format, respectively, to the given filename.
-oA <basename>: Output in the three major formats at once
-v: Increase verbosity level (use -vv or more for greater effect)
-d: Increase debugging level (use -dd or more for greater effect)
--reason: Display the reason a port is in a particular state
--open: Only show open (or possibly open) ports
--packet-trace: Show all packets sent and received
--iflist: Print host interfaces and routes (for debugging)
--append-output: Append to rather than clobber specified output files
--resume <filename>: Resume an aborted scan
--stylesheet <path/URL>: XSL stylesheet to transform XML output to HTML
--webxml: Reference stylesheet from Nmap.Org for more portable XML
--no-stylesheet: Prevent associating of XSL stylesheet w/XML output
MISC:
-6: Enable IPv6 scanning
-A: Enable OS detection, version detection, script scanning, and traceroute
--datadir <dirname>: Specify custom Nmap data file location
--send-eth/--send-ip: Send using raw ethernet frames or IP packets
--privileged: Assume that the user is fully privileged
--unprivileged: Assume the user lacks raw socket privileges
-V: Print version number
-h: Print this help summary page.
EXAMPLES:
nmap -v -A scanme.nmap.org
nmap -v -sn 192.168.0.0/16 10.0.0.0/8
nmap -v -iR 10000 -Pn -p 80
SEE THE MAN PAGE (https://nmap.org/book/man.html) FOR MORE OPTIONS AND EXAMPLES
As you can see, loads and loads of options.
The three that I find most useful are…
SERVICE/VERSION DETECTION:
-sV: Probe open ports to determine service/version infoSCRIPT SCAN:
-sC: equivalent to --script=default
--script=<Lua scripts>: <Lua scripts> is a comma separated list of
directories, script-files or script-categoriesOS DETECTION:
-O: Enable OS detection
--osscan-limit: Limit OS detection to promising targets
--osscan-guess: Guess OS more aggressively
I know a lot of people who use Nmap have no idea that you can supply scripts to the, “Nmap Scripting Engine (NSE)” as well. For example, “ — script=http-php-version”.
I’m going to scan my Kali instance which is currently running DVWA. Let’s see what it finds…
kali@kali:~$ nmap -sV --script=http-php-version localhost
Starting Nmap 7.91 ( https://nmap.org ) at 2020-10-16 22:57 BST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000051s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 997 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.3p1 Debian 1 (protocol 2.0)
80/tcp open http Apache httpd 2.4.46 ((Debian))
|_http-server-header: Apache/2.4.46 (Debian)
3306/tcp open mysql MySQL 5.5.5-10.3.24-MariaDB-2
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernelService detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.88 seconds
That is a lot of information from a single scan. If you look those up in the Exploit Database or search for them in Metasploit you are bound to find vulnerabilities.
Nmap doesn’t need to scan one host at a time. You are able to scan multiple hosts and ports asynchronously, pass it lists of hosts and ports to scan, or scan entire subnets.
We have identified that the NSE is a really powerful part of Nmap but how many .nse scripts are available?
kali@kali:~$ locate *.nse | wc -l
603
603 NSE scripts! I’m not going to list them all here but this should give you just an idea of what is available I’m going to list the HTTP ones only.
kali@kali:~$ locate *.nse | grep http
/usr/share/nmap/scripts/http-adobe-coldfusion-apsa1301.nse
/usr/share/nmap/scripts/http-affiliate-id.nse
/usr/share/nmap/scripts/http-apache-negotiation.nse
/usr/share/nmap/scripts/http-apache-server-status.nse
/usr/share/nmap/scripts/http-aspnet-debug.nse
/usr/share/nmap/scripts/http-auth-finder.nse
/usr/share/nmap/scripts/http-auth.nse
/usr/share/nmap/scripts/http-avaya-ipoffice-users.nse
/usr/share/nmap/scripts/http-awstatstotals-exec.nse
/usr/share/nmap/scripts/http-axis2-dir-traversal.nse
/usr/share/nmap/scripts/http-backup-finder.nse
/usr/share/nmap/scripts/http-barracuda-dir-traversal.nse
/usr/share/nmap/scripts/http-bigip-cookie.nse
/usr/share/nmap/scripts/http-brute.nse
/usr/share/nmap/scripts/http-cakephp-version.nse
/usr/share/nmap/scripts/http-chrono.nse
/usr/share/nmap/scripts/http-cisco-anyconnect.nse
/usr/share/nmap/scripts/http-coldfusion-subzero.nse
/usr/share/nmap/scripts/http-comments-displayer.nse
/usr/share/nmap/scripts/http-config-backup.nse
/usr/share/nmap/scripts/http-cookie-flags.nse
/usr/share/nmap/scripts/http-cors.nse
/usr/share/nmap/scripts/http-cross-domain-policy.nse
/usr/share/nmap/scripts/http-csrf.nse
/usr/share/nmap/scripts/http-date.nse
/usr/share/nmap/scripts/http-default-accounts.nse
/usr/share/nmap/scripts/http-devframework.nse
/usr/share/nmap/scripts/http-dlink-backdoor.nse
/usr/share/nmap/scripts/http-dombased-xss.nse
/usr/share/nmap/scripts/http-domino-enum-passwords.nse
/usr/share/nmap/scripts/http-drupal-enum-users.nse
/usr/share/nmap/scripts/http-drupal-enum.nse
/usr/share/nmap/scripts/http-enum.nse
/usr/share/nmap/scripts/http-errors.nse
/usr/share/nmap/scripts/http-exif-spider.nse
/usr/share/nmap/scripts/http-favicon.nse
/usr/share/nmap/scripts/http-feed.nse
/usr/share/nmap/scripts/http-fetch.nse
/usr/share/nmap/scripts/http-fileupload-exploiter.nse
/usr/share/nmap/scripts/http-form-brute.nse
/usr/share/nmap/scripts/http-form-fuzzer.nse
/usr/share/nmap/scripts/http-frontpage-login.nse
/usr/share/nmap/scripts/http-generator.nse
/usr/share/nmap/scripts/http-git.nse
/usr/share/nmap/scripts/http-gitweb-projects-enum.nse
/usr/share/nmap/scripts/http-google-malware.nse
/usr/share/nmap/scripts/http-grep.nse
/usr/share/nmap/scripts/http-headers.nse
/usr/share/nmap/scripts/http-hp-ilo-info.nse
/usr/share/nmap/scripts/http-huawei-hg5xx-vuln.nse
/usr/share/nmap/scripts/http-icloud-findmyiphone.nse
/usr/share/nmap/scripts/http-icloud-sendmsg.nse
/usr/share/nmap/scripts/http-iis-short-name-brute.nse
/usr/share/nmap/scripts/http-iis-webdav-vuln.nse
/usr/share/nmap/scripts/http-internal-ip-disclosure.nse
/usr/share/nmap/scripts/http-joomla-brute.nse
/usr/share/nmap/scripts/http-jsonp-detection.nse
/usr/share/nmap/scripts/http-litespeed-sourcecode-download.nse
/usr/share/nmap/scripts/http-ls.nse
/usr/share/nmap/scripts/http-majordomo2-dir-traversal.nse
/usr/share/nmap/scripts/http-malware-host.nse
/usr/share/nmap/scripts/http-mcmp.nse
/usr/share/nmap/scripts/http-method-tamper.nse
/usr/share/nmap/scripts/http-methods.nse
/usr/share/nmap/scripts/http-mobileversion-checker.nse
/usr/share/nmap/scripts/http-ntlm-info.nse
/usr/share/nmap/scripts/http-open-proxy.nse
/usr/share/nmap/scripts/http-open-redirect.nse
/usr/share/nmap/scripts/http-passwd.nse
/usr/share/nmap/scripts/http-php-version.nse
/usr/share/nmap/scripts/http-phpmyadmin-dir-traversal.nse
/usr/share/nmap/scripts/http-phpself-xss.nse
/usr/share/nmap/scripts/http-proxy-brute.nse
/usr/share/nmap/scripts/http-put.nse
/usr/share/nmap/scripts/http-qnap-nas-info.nse
/usr/share/nmap/scripts/http-referer-checker.nse
/usr/share/nmap/scripts/http-rfi-spider.nse
/usr/share/nmap/scripts/http-robots.txt.nse
/usr/share/nmap/scripts/http-robtex-reverse-ip.nse
/usr/share/nmap/scripts/http-robtex-shared-ns.nse
/usr/share/nmap/scripts/http-sap-netweaver-leak.nse
/usr/share/nmap/scripts/http-security-headers.nse
/usr/share/nmap/scripts/http-server-header.nse
/usr/share/nmap/scripts/http-shellshock.nse
/usr/share/nmap/scripts/http-sitemap-generator.nse
/usr/share/nmap/scripts/http-slowloris-check.nse
/usr/share/nmap/scripts/http-slowloris.nse
/usr/share/nmap/scripts/http-sql-injection.nse
/usr/share/nmap/scripts/http-stored-xss.nse
/usr/share/nmap/scripts/http-svn-enum.nse
/usr/share/nmap/scripts/http-svn-info.nse
/usr/share/nmap/scripts/http-title.nse
/usr/share/nmap/scripts/http-tplink-dir-traversal.nse
/usr/share/nmap/scripts/http-trace.nse
/usr/share/nmap/scripts/http-traceroute.nse
/usr/share/nmap/scripts/http-trane-info.nse
/usr/share/nmap/scripts/http-unsafe-output-escaping.nse
/usr/share/nmap/scripts/http-useragent-tester.nse
/usr/share/nmap/scripts/http-userdir-enum.nse
/usr/share/nmap/scripts/http-vhosts.nse
/usr/share/nmap/scripts/http-virustotal.nse
/usr/share/nmap/scripts/http-vlcstreamer-ls.nse
/usr/share/nmap/scripts/http-vmware-path-vuln.nse
/usr/share/nmap/scripts/http-vuln-cve2006-3392.nse
/usr/share/nmap/scripts/http-vuln-cve2009-3960.nse
/usr/share/nmap/scripts/http-vuln-cve2010-0738.nse
/usr/share/nmap/scripts/http-vuln-cve2010-2861.nse
/usr/share/nmap/scripts/http-vuln-cve2011-3192.nse
/usr/share/nmap/scripts/http-vuln-cve2011-3368.nse
/usr/share/nmap/scripts/http-vuln-cve2012-1823.nse
/usr/share/nmap/scripts/http-vuln-cve2013-0156.nse
/usr/share/nmap/scripts/http-vuln-cve2013-6786.nse
/usr/share/nmap/scripts/http-vuln-cve2013-7091.nse
/usr/share/nmap/scripts/http-vuln-cve2014-2126.nse
/usr/share/nmap/scripts/http-vuln-cve2014-2127.nse
/usr/share/nmap/scripts/http-vuln-cve2014-2128.nse
/usr/share/nmap/scripts/http-vuln-cve2014-2129.nse
/usr/share/nmap/scripts/http-vuln-cve2014-3704.nse
/usr/share/nmap/scripts/http-vuln-cve2014-8877.nse
/usr/share/nmap/scripts/http-vuln-cve2015-1427.nse
/usr/share/nmap/scripts/http-vuln-cve2015-1635.nse
/usr/share/nmap/scripts/http-vuln-cve2017-1001000.nse
/usr/share/nmap/scripts/http-vuln-cve2017-5638.nse
/usr/share/nmap/scripts/http-vuln-cve2017-5689.nse
/usr/share/nmap/scripts/http-vuln-cve2017-8917.nse
/usr/share/nmap/scripts/http-vuln-misfortune-cookie.nse
/usr/share/nmap/scripts/http-vuln-wnr1000-creds.nse
/usr/share/nmap/scripts/http-waf-detect.nse
/usr/share/nmap/scripts/http-waf-fingerprint.nse
/usr/share/nmap/scripts/http-webdav-scan.nse
/usr/share/nmap/scripts/http-wordpress-brute.nse
/usr/share/nmap/scripts/http-wordpress-enum.nse
/usr/share/nmap/scripts/http-wordpress-users.nse
/usr/share/nmap/scripts/http-xssed.nse
/usr/share/nmap/scripts/https-redirect.nse
/usr/share/nmap/scripts/ip-https-discover.nse
/usr/share/nmap/scripts/membase-http-info.nse
/usr/share/nmap/scripts/riak-http-info.nse
The information about how to use each script is located at the top of each script file. For example if I wanted to find out how to use the, “http-csrf.nse” script this is the usage information.
---
-- @usage nmap -p80 --script http-csrf.nse <target>
--
-- @args http-csrf.singlepages The pages that contain the forms to check.
-- For example, {/upload.php, /login.php}. Default: nil (crawler
-- mode on)
-- @args http-csrf.checkentropy If this is set the script will also calculate
-- the entropy of the field's value to determine if it is a token,
-- rather than just checking its name. Default: true
--
-- @output
-- PORT STATE SERVICE REASON
-- 80/tcp open http syn-ack
-- | http-csrf:
-- | Spidering limited to: maxdepth=3; maxpagecount=20; withinhost=some-very-random-page.com
-- | Found the following CSRF vulnerabilities:
-- |
-- | Path: http://www.example.com/
-- | Form id: search_bar_input
-- | Form action: /search
-- |
-- | Path: http://www.example.com/c/334/watches.html
-- | Form id: custom_price_filters
-- | Form action: /search
-- |
-- | Path: http://www.example.com/c/334/watches.html
-- | Form id: custom_price_filters
-- |_ Form action: /c/334/rologia-xeiros-watches.html
--
---
If you are interested in adventuring further into vulnerability analysis, I recommend taking a look at the Kali Linux Tools Listing.