Port and vulnerability scanners are common tools used by good as bad guys. Performing a port scanning is one of the first operations required to find potential vulnerabilities on a target system. That’s why vulnerability scanners have built-in port scanners. Writing a port scanner is really easy with a few lines of Perl:
#!/usr/bin/perl use IO::Socket; while ($ARGV[1] < 65536) { print STDOUT "$ARGV[0]:".($ARGV[1] - 1) . " open\n" if \ (IO::Socket::INET->new(PeerAddr=>"$ARGV[0]:" .$ARGV[1]++, Proto=>'tcp', Timeout=>1)); }
(Source: okc2600.com)
However, “real” port scanners offer much more options like evading techniques to work “below the radar” or fingerprinting. Nmap is the best tools for this purpose.
Synergies already exist between different scanning products. A good example is the integration of Nessus with Nmap. Nmap can save the scan results in XML format. The produced XML content can be re-used by Nessus to scan for vulnerabilities. By using this method, the power of Nessus is combined with the one of Nmap. For more information, read this article.
Performing a vulnerability scanรย is highly resources consuming. Why not add a simple vulnerability scan feature to Nmap? This primary goal is to save time and be less intrusive. Nmap has a built-in script interpreter called NSE (“Nmap Scripting Engine“) which allows developers to write extensions for Nmap. It comes by default with a lot of scripts. If you’re interested, I posted an introduction article on NSE a few months ago.
Marc Ruef developed a NSE script which adds a basic vulnerability scanner feature to your Nmap. Technically, the script does NOT perform a vulnerability scan by itself. With the powerful fingerprinting feature of Nmap (using the “-sV” flag), the running applications and versions can be detected. Those information are used as lookup keys in a DB export of OSVDB, the Open Source Vulnerability Data Base. The matching entries are displayed in the script output. The script installation is extremely simple, just copy the files in your existing scripts repository (something like “$NMAP_INSTALL_PATH/share/nmap/scripts/“). Invoke it like any standard script:
# nmap -PN -sS -sV --script=vulscan -p80 www.company.tld Starting Nmap 5.30BETA1 ( http://nmap.org ) at 2010-06-03 11:11 CEST Nmap scan report for www.company.tld (10.0.0.1) Host is up (0.00074s latency). rDNS record for 10.0.0.1: www.company.tld PORT STATE SERVICE VERSION 80/tcp open http Apache httpd 2.2.11 ((Ubuntu) PHP/5.2.6-3ubuntu4.5 with Suhosin-Patch) | vulscan: [48] Apache HTTP Server on Debian /usr/doc Directory Information Disclosure | [143] Apache HTTP Server printenv.pl Multiple Method CGI XSS | [222] Apache HTTP Server test-cgi Arbitrary File Access [Stuff Deleted] | [63895] Apache HTTP Server mod_headers Unspecified Security Issue | [64023] Apache Tomcat WWW-Authenticate Header Local Host Information Disclosure | [64020] Apache ActiveMQ Jetty ResourceHandler Crafted Request JSP File Source Disclosure | [64307] Apache Tomcat Web Application Manager/Host Manager CSRF | [64517] Apache Open For Business Project (OFBiz) View Profile Section partyId Parameter XSS | [64518] Apache Open For Business Project (OFBiz) Show Portal Page Section start Parameter XSS | [64519] Apache Open For Business Project (OFBiz) Control Servlet URI XSS | [64520] Apache Open For Business Project (OFBiz) ecommerce/control/ViewBlogArticle contentId Parameter XSS | [64521] Apache Open For Business Project (OFBiz) Web Tools Section entityName Parameter XSS |_[64522] Apache Open For Business Project (OFBiz) ecommerce/control/contactus Multiple Parameter XSS Service detection performed. Please report any incorrect results at http://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 10.66 seconds
My first impression was disappointing: The scan reported too much vulnerabilities (>500 hits!). Unusable in a real environment. But, after reading the script (remember: RTFM!), Marc was aware of this problem (caused by a naming convention issue between Nmap & OSVDB). He added a correlation feature to reduce those false positives. To activate this option, just pass the following parameter:
# nmap -PN -sS -sV --script=vulscan --script-args vulscancorrelation=1 -p80 www.company.tld
Hopefully, this second test generated much less hits (26) but, side effect, required more time to complete.
This is a very nice feature for Nmap. By using this script, you can quickly have an overview of the potential vulnerabilities on a target host. And, if necessary, use a more classic tool to focus on specific cases. Don’t forget that false positives or false negatives and results must always be analyzed by a competent person.
To keep the vulnerability scanner accurate, the vulnerability DB must be kept up to date. To achieve this, you can automate the update using the CSV export available on osvdb.org (updated daily). First you have to register. Once done, you will be able to download the CSV updates via a permalink generated with your API key.รย The upgrade can be fully automated via a simple daily cron and a script:
NMAPHOME=/usr/local/nmap FILES="object_correlations.txt object_links.txt object_products.txt vulnerabilities.txt" cd /tmp wget -o /dev/null http://osvdb.org/file/get_latest_csv/xxxxx/osvdb-csv.latest.tar.gz for FILE in $FILES do tar xzf osvdb-csv.latest.tar.gz ./osvdb/$FILE mv osvdb/$FILE $NMAPHOME/share/nmap/scripts/vulscan done rm -rf osvdb rm osvdb-csv.latest.tar.gz exit 0
Marc released the version 0.6 is his script and has already a nice todolist (integration with other vulnerability databases). Great job!
ty so much for this article. and marc ty for the script. so very very usefull.
Hello,
Thank you very much for your post discussing the nmap nse vulscan script ๐
Yes, the huge amount of false-positives within title search mode (default mode) is annoying. But they occure under some circumstances only. Sadly one of those circumstances is Apache httpd as identified web server ๐
I do have a workaround for that which was suggested on the nmap-dev mailing list. I might add a “masking feature” in a future release which would prevent the false-positives (at least most of them ๐ !).
Regards,
Marc