AQUATONE: A tool for domain flyovers

- 11 mins
The Lockheed U-2 reconnaissance aircraft was given the codename Aquatone.

Heads up! Aquatone has been totally rewritten in Go and is now quite a bit different. Read about the new version!

Knowing the attack surface of something is critical for both defending and attacking it. When it comes to domain names, a very common approach for uncovering the attack surface is to discover its subdomains. Subdomains will increase the number of potential target sites as well as uncover IP ranges to probe further.

There are plenty of tools already for subdomain enumeration, e.g. Fierce, SubBrute and Gobuster however AQUATONE takes things a step further by not only doing classic brute force enumeration but also utilizing various open sources and internet services to dramatically increase the number of discovered subdomains. When subdomains have been discovered, AQUATONE can then be used to probe the hosts for common HTTP ports and gather response headers, HTML and screenshots to be compiled into a nice report for easy analysis.

To make the tool as flexible as possible, AQUATONE is divided into three separate commands, so if you’re only interested in using it for subdomain discovery without any scanning or screenshotting, you can easily do that. Lets go over the three phases of an AQUATONE assessment:

Phase 1: Discovery

To demonstrate the usage of AQUATONE, we will perform an assessment on the domain. I have chosen this domain because Yahoo’s Bug Bounty program includes all of * in their scope, so it should be acceptable to run a tool like AQUATONE against it.

Kicking off the aquatone-discover tool:

Starting aquatone-discover against ``...

The first thing aquatone-discover does is to identify the authoritative name servers for the target domain. Using these name servers for resolution ensures that the information is up to date and discovery is maximised.

It also does a quick test to see if the target domain is configured to be a wildcard domain as such domains can produce a lot of false positives. If the domain turns out to be a wildcard, it will identify the possible wildcard responses and filter them out. is luckily not configured to be wildcard.

After name server and wildcard detection, it proceeds to ask each subdomain collector module for potential subdomains under the target domain. aquatone-discover ships with following collector modules:

The collector modules returned a total of 12.282 potential subdomains that aquatone-discover attempts to resolve.

aquatone-discover resolving subdomains. Hitting Enter will output a progress report.

After a while, aquatone-discover has run through the list and uncovered a total of 1.958 live subdomains. It also analyzed the IPs and printed a list of potential IP subnet ranges which can be used for further probing:

aquatone-discover uncovered a total of 1.958 live subdomains.

It also wrote the discovered hosts to files in the aquatone assessment directory that is automatically created for the target domain. hosts.txt contains a comma-separated list of domains and their IP:,,,,,,,,,,,,,,,,,,,,

This file can be sliced and diced with common command line tools and loaded into other tools that you might use. hosts.json contains the same information in JSON format and is used by the other AQUATONE tools but can also be useful if you want to use the information with custom scripts.

Phase 2: Scanning

Having discovered a bunch of subdomains on is already quite useful. We could stop here and start poking around with other tools or manual browsing, but lets instead make aquatone-scan do the hard work for us of finding which hosts might serve web content:

aquatone-scan finding open ports on hosts.

aquatone-scan found a bunch of open HTTP ports across the different hosts. By default, it will scan the following TCP ports: 80, 443, 8000, 8080 and 8443 which are all very common ports for web services. You can of course change this to your own list of ports with the --ports option, or specify one of the built-in list aliases:

Using a larger port list will of course let you discover more web services, but it will also increase the time it takes for aquatone-scan to finish.

aquatone-scan created two new files in the assessment directory for open_ports.txt is a simple comma-separated list of hosts and their open ports:,443,443,443,443,443,443,443,443,443,443,443,443,443,443,443,443,443,443,443,80,80,80,443,443,80,443

urls.txt contains a list of URLs that can be used to request the web pages on the open ports:

These files are used for the next phase of the assessment but are also convenient for loading into other tools like EyeWitness or slicing and dicing with grep, cut, awk, etc.

Phase 3: Gathering

We now know about subdomains and open ports on *, it’s time to use aquatone-gather to collect HTTP responses and screenshots and compile it all into a nice report:

aquatone-gather crunching through the web pages.

aquatone-gather loaded data from the files created by the previous AQUATONE tools and started requesting URLs to collect HTTP responses and screenshots. Behind the scenes, it uses Nightmare for all the heavy lifting of requesting and screenshotting.

Unfortunately Nightmare, and any other browser automation tool, is a bit flaky and will fail on some of the page processings as can be seen in the screenshot. I think the failure rate is acceptable, but something to be aware of.

After a little while, it finishes processing all the web pages:

aquatone-gather finished processing web pages.

It prints a short summary of successful vs. failed page processings and a list of generated report pages, but this is far from the only files that aquatone-gather generated. Navigating to the assessment folder, we can see three new folders: headers, html, report and screenshots.

The headers folder contains text files with response headers from all the page visits:

root@kali:~/aquatone/ cat bomgar_corp_yahoo_com__98_136_205_152__443.txt
Cache-Control: no-cache
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
Date: Wed, 14 Jun 2017 12:22:01 GMT
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive: timeout=15, max=100
Pragma: no-cache
Server: Bomgar
Set-Cookie: ns_s=c9b9309296cf5babeb7e193125cb2cf0f3c7f13c; path=/; secure; HttpOnly
Strict-Transport-Security: max-age=31536000
Transfer-Encoding: chunked
X-Ua-Compatible: IE=edge

These files can be very useful with grep and other tools to quickly find information on server technology and other things that are interesting from a security point of view.

The html folder contains HTML bodies from all the page visits:

root@kali:~/aquatone/ cat bomgar_corp_yahoo_com__98_136_205_152__443.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "">
<html xmlns="" xml:lang="en-us">
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>Yahoo! Global Service Desk LiveChat</title>
	<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" />
<link href="/content/common.css" rel="stylesheet" type="text/css" />
<link href="/content/public.css" rel="stylesheet" type="text/css" />
<link href="/content/mobile.css" rel="stylesheet" type="text/css" />

<div id="container">

<div id="header" class="contentBox">
<div style="display: none">
<div style="margin: 1em;">
	<a href="" class="inverse" target="_blank">Secure Remote Desktop Access by Bomgar</a>




There are tons of things that these files can be used for. More on this later.

The screenshots folder contains, as the name might suggest, PNG screenshots of all the page visits:

root@kali:~/aquatone/ ls

You can of course browse these screenshots directly in the folder, but it’s probably more useful to analyse them by opening the generated HTML report page:

Browsing the AQUATONE report (Gif).

The report lines up the screenshots with response headers so that you quickly scan through the collected information for interesting pages. AQUATONE will highlight headers that may increase security with a green background and headers that may present a security issue with a red background. Before you go on a bug bounty spree with this, please remember that god strangles a puppy every time someone reports missing X-Frame-Options. ;)

CLI tricks

The generated report is the final product of AQUATONE, but lots of useful stuff can be done with all the raw files that are generated in the assessment folder, so let’s wrap up this blog post with some examples of what you can do:

Get server technology stats

root@kali:~/aquatone/ cat * | grep 'Server:' | sort | uniq -c | sort -nr
     13 Server: ATS
      6 Server: Bomgar
      1 Server: AkamaiGHost

Find more subdomains

root@kali:~/aquatone/ cat * | egrep -o '[a-z0-9\-\_\.]+\.corp\.yahoo\.com' | sort -u

Find HTML comments

root@kali:~/aquatone/ cat * | egrep -o '<!--.*-->'
<!-- Begin comScore Tag -->
<!-- Wed Jun 14 12:22:09 UTC 2017 -->
<!-- Wed Jun 14 12:22:29 UTC 2017 -->
<!-- #doc4 -->
<!-- .dw1 -->
<!-- .dw4 -->
<!-- /.shmod -->
<!-- SpaceID=0 timeout (ads1) -->
<!-- Wed Jun 14 12:22:15 UTC 2017 -->
<!-- Wed Jun 14 12:21:44 UTC 2017 -->
<!-- Wed Jun 14 12:21:51 UTC 2017 -->
<!-- Wed Jun 14 12:22:27 UTC 2017 -->
<!-- Wed Jun 14 12:21:57 UTC 2017 -->
<!-- Wed Jun 14 12:22:15 UTC 2017 -->
<!-- Wed Jun 14 12:22:36 UTC 2017 -->
<!-- URL: /::ProfilerTotal:557:1497442917838::Page Creation:40:1497442917838::user_ups:0:1497442917844::ydht_time:1:1497442917845::Maple Execution:518:1497442917878::Maple WS:41:1497442917879::SHAdModule:457:1497442917921::SHLeftNavigationModule:7:1497442918378::SHHeroModule:0:1497442918385::SHBrowseShoppingModule:5:1497442918385::SHSocialNewBrowseModule:0:1497442918390::SHCopyrightModule:1:1497442918391:: -->
<!-- -->
<!-- Wed Jun 14 12:21:57 UTC 2017 -->

Find pages with password fields

root@kali:~/aquatone/ grep 'type="password"' *
bouncer_gh_corp_yahoo_com__72_30_2_113__80.html: <dd><input class="input-large" name="pass_word" type="password" id="pass_word" maxlength="64"   autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" ></dd>
fast_corp_yahoo_com__98_136_205_216__443.html: <dd><input class="input-large" name="pass_word" type="password" id="pass_word" maxlength="64"   autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" ></dd>

Get hosts listening on port 443

root@kali:~/aquatone/ cat open_ports.txt | grep ',443' | cut -d "," -f 1

Check HTTPS hosts for Heartbleed

root@kali:~/aquatone/ grep https urls.txt | cut -d '/' -f 3 > /tmp/targets.lst
root@kali:~/aquatone/ sslscan --targets=/tmp/targets.lst --no-ciphersuites --no-fallback --no-renegotiation --no-compression --no-check-certificate
Version: 1.11.9-static
OpenSSL 1.0.2l-dev  xx XXX xxxx

Testing SSL server on port 443 using SNI name

TLS 1.2 not vulnerable to heartbleed
TLS 1.1 not vulnerable to heartbleed
TLS 1.0 not vulnerable to heartbleed

Testing SSL server on port 443 using SNI name
Testing SSL server on port 443 using SNI name

TLS 1.2 not vulnerable to heartbleed
TLS 1.1 not vulnerable to heartbleed
TLS 1.0 not vulnerable to heartbleed


That’s it! I hope you will take AQUATONE on a test flight and let me know what you think. You can find installation instructions in the project README.

Michael Henriksen

Michael Henriksen

Security engineer & builder of tools

twitter facebook linkedin reddit rss