Tag: enumeration

  • Nmap Basics

    Nmap Basics

    If there’s one tool every penetration tester should know it’s nmap. In this post, I’m going to teach you how to use it practically as one might use it in a real-world testing scenario.

    Don’t let the title fool you. Although we’re going to cover the basics here, we’re going to take a deeper dive into how to use this tool effectively. So, I’ll assume you have at least a basic understanding of the Internet and the protocol stack.

    Overview

    nmap is an open-source command line tool used to discover hosts connected to a network and expose what services might be listening on those hosts. It is extremely popular because it can map an entire network automatically, while also being flexible.

    I’m going to expose you to the more technical features of the tool while teaching you the basics so that you can use it flexibly and confidently. So, let’s jump into it!

    Host Discovery

    The first step in testing a network is figuring out what hosts (computers connected to a network) are up and running. After all, computers need to be powered on and connected to the same network we’re on for us to be able to attack them. We also don’t want to blindly spray exploits to all addresses–that’s just noisy and a waste of time.

    To get started with host discovery with nmap it’s as simple as running it and giving it a range of ip’s (or a single hostname/ip):

    $ nmap 192.168.186.0/24
    Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-17 13:51 PDT
    Nmap scan report for 192.168.186.2
    Host is up (0.00070s latency).
    Not shown: 999 closed tcp ports (conn-refused)
    PORT   STATE SERVICE
    53/tcp open  domain
    
    Nmap scan report for 192.168.186.71
    Host is up (0.0021s latency).
    Not shown: 997 closed tcp ports (conn-refused)
    PORT    STATE SERVICE
    22/tcp  open  ssh
    53/tcp  open  domain
    389/tcp open  ldap
    
    Nmap scan report for 192.168.186.93
    Host is up (0.0019s latency).
    Not shown: 999 closed tcp ports (conn-refused)
    PORT   STATE SERVICE
    22/tcp open  ssh
    
    Nmap scan report for ms2 (192.168.186.131)
    Host is up (0.0023s latency).
    Not shown: 977 closed tcp ports (conn-refused)
    PORT     STATE SERVICE
    21/tcp   open  ftp
    22/tcp   open  ssh
    23/tcp   open  telnet
    25/tcp   open  smtp
    53/tcp   open  domain
    80/tcp   open  http
    111/tcp  open  rpcbind
    139/tcp  open  netbios-ssn
    445/tcp  open  microsoft-ds
    512/tcp  open  exec
    513/tcp  open  login
    514/tcp  open  shell
    1099/tcp open  rmiregistry
    1524/tcp open  ingreslock
    2049/tcp open  nfs
    2121/tcp open  ccproxy-ftp
    3306/tcp open  mysql
    5432/tcp open  postgresql
    5900/tcp open  vnc
    6000/tcp open  X11
    6667/tcp open  irc
    8009/tcp open  ajp13
    8180/tcp open  unknown
    
    Nmap done: 256 IP addresses (4 hosts up) scanned in 14.55 seconds

    I used the range 192.168.186.0/24 which is the equivalent of 192.168.186.0-255, or the subnet of my virtual network. As you can see, it produced quite a bit of output. I just wanted to see the hosts online and nmap went ahead and did a TCP-connect port scan on the top 1000 common ports as well.

    This is nice and all but it clutters up my terminal with more than I needed. We can use the -sn option to tell nmap not to do a port scan:

    $ nmap -sn 192.168.186.0/24
    Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-17 13:57 PDT
    Nmap scan report for 192.168.186.2
    Host is up (0.0032s latency).
    Nmap scan report for 192.168.186.71
    Host is up (0.0019s latency).
    Nmap scan report for 192.168.186.93
    Host is up (0.0013s latency).
    Nmap scan report for ms2 (192.168.186.131)
    Host is up (0.0042s latency).
    Nmap done: 256 IP addresses (4 hosts up) scanned in 2.32 seconds

    Much better. If you notice at the bottom of the scan, this was performed much faster (2.32 seconds vs 14.55 seconds in the first scan). This might seem marginal at first but imagine scanning a much larger network (like a business network).

    By default, nmap uses a variety of methods to determine if a host is online. Let’s check this out by scanning a single host:

    $ sudo nmap -sn -vv ms2
    Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-17 14:01 PDT
    Initiating ARP Ping Scan at 14:01
    Scanning ms2 (192.168.186.131) [1 port]
    Completed ARP Ping Scan at 14:01, 0.04s elapsed (1 total hosts)
    Nmap scan report for ms2 (192.168.186.131)
    Host is up, received arp-response (0.0013s latency).
    MAC Address: 00:0C:29:7B:A1:58 (VMware)
    Read data files from: /usr/bin/../share/nmap
    Nmap done: 1 IP address (1 host up) scanned in 0.17 seconds
               Raw packets sent: 1 (28B) | Rcvd: 1 (28B)

    I used the -vv option to make nmap spit out very verbose output so it can tell us what it’s doing step by step. ms2 is a hostname I configured my system to recognize as 192.168.186.131 (my metasploitable instance). As I mentioned earlier, you can supply nmap with a human-readable hostname and it will automatically go out and resolve the IP address for you.

    Reading the output, we can see that nmap ran an ARP scan and started a port scan, but after the ARP scan finished, it deemed the host was up. This is because nmap will use a variety of methods to scan a host, including:

    • ARP scan (local network only)
    • ICMP echo request
    • sending a TCP SYN packet to port 443
    • sending a TCP ACK packet to port 80
    • sending an ICMP timestamp request

    If these methods fail, the host is considered offline. Those of you with keen eyes will notice that I ran nmap with sudo. That’s because nmap relies on packet crafting to do some of it’s scans, which requires root level privileges. Let’s see what happens when we run it without sudo

    $ nmap -vv -sn ms2
    Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-17 14:00 PDT
    Initiating Ping Scan at 14:00
    Scanning ms2 (192.168.186.131) [2 ports]
    Completed Ping Scan at 14:00, 0.00s elapsed (1 total hosts)
    Nmap scan report for ms2 (192.168.186.131)
    Host is up, received syn-ack (0.0020s latency).
    Nmap done: 1 IP address (1 host up) scanned in 0.00 seconds

    This time, nmap performed a ping scan instead of an ARP scan and performed a TCP scan as well. The TCP scan received a SYN-ACK which is how nmap was able to tell the system was online. It’s important to take this information into account as it could lead to some false negatives while testing (what if the host blocked ICMP traffic and the ports scanned)?

    So, I would encourage you to use sudo to get the most out of nmap. You’ll definitely need it when I talk about performing different types of host discovery in the next few sections.

    ARP Scanning

    The first method of host discovery I’m going to talk about is ARP scanning. ARP or Address Resolution Protocol resolves IP addresses into MAC addresses. This protocol sits low on the stack, which means it has a low overhead (less data per packet) giving two key advantages when using it for scanning:

    1. Faster
    2. Stealthier (may slip past firewalls/IDS’s)

    The only caveat is that it only works on local networks (can’t scan over the internet). So, know what context you’re scanning in!

    We can perform an ARP scan with nmap by telling it not to do ping scans with the -Pn option:

    $ sudo nmap -sn -PRn 192.168.186.0/24
    Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-17 14:59 PDT
    Nmap scan report for 192.168.186.1
    Host is up (0.0013s latency).
    MAC Address: 00:50:56:C0:00:08 (VMware)
    Nmap scan report for 192.168.186.2
    Host is up (0.00045s latency).
    MAC Address: 00:50:56:FC:7E:8B (VMware)
    Nmap scan report for 192.168.186.71
    Host is up (0.0047s latency).
    MAC Address: 00:0C:29:91:6A:82 (VMware)
    Nmap scan report for 192.168.186.73
    Host is up (0.00098s latency).
    MAC Address: 00:0C:29:39:19:E4 (VMware)
    Nmap scan report for ms2 (192.168.186.131)
    Host is up (0.0016s latency).
    MAC Address: 00:0C:29:7B:A1:58 (VMware)
    Nmap scan report for 192.168.186.254
    Host is up (0.00078s latency).
    MAC Address: 00:50:56:EA:7A:B5 (VMware)
    Nmap scan report for 192.168.186.93
    Host is up.
    Nmap done: 256 IP addresses (7 hosts up) scanned in 2.02 seconds

    You’ll notice that I also used the R option with -P. This is because I wanted to eliminate false positives by having nmap perform Reverse DNS resolution on the hosts it finds, which it can only do with live hosts.

    Doing it without, results in a mess:

    $ sudo nmap -sn -Pn 192.168.186.80-85
    Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-17 15:03 PDT
    Nmap scan report for 192.168.186.80
    Host is up.
    Nmap scan report for 192.168.186.81
    Host is up.
    Nmap scan report for 192.168.186.82
    Host is up.
    Nmap scan report for 192.168.186.83
    Host is up.
    Nmap scan report for 192.168.186.84
    Host is up.
    Nmap scan report for 192.168.186.85
    Host is up.
    Nmap done: 6 IP addresses (6 hosts up) scanned in 0.01 seconds

    Here, I purposefully chose a range I knew didn’t have any connected hosts, yet nmap still said they were up…

    Using the R option felt like a cheat, so you might be better of using a different tool like arp-scan to do ARP scanning.

    Ping Scanning

    Higher up on the protocol stack is ping probing using the ICMP protocol. When most people think of pinging, they think of using the ping command to send ICMP echo requests.

    nmap can use ICMP echo requests, as well as other methods of the protocol using the -P switch:

    • -PE: echo request
    • -PP: timestamp query
    • -PM: address map query

    If a host replies, it’s online. I scanned my network using the --disable-arp-ping flag to tell nmap only to do ping scanning:

    $ sudo nmap -sn -PE --disable-arp-ping 192.168.186.0/24
    Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-20 14:43 PDT
    Nmap scan report for 192.168.186.2
    Host is up (0.0023s latency).
    MAC Address: 00:50:56:FC:7E:8B (VMware)
    Nmap scan report for 192.168.186.71
    Host is up (0.0011s latency).
    MAC Address: 00:0C:29:91:6A:82 (VMware)
    Nmap scan report for 192.168.186.72
    Host is up (0.0031s latency).
    MAC Address: 00:0C:29:19:6C:BF (VMware)
    Nmap scan report for 192.168.186.73
    Host is up (0.0012s latency).
    MAC Address: 00:0C:29:39:19:E4 (VMware)
    Nmap scan report for 192.168.186.74
    Host is up (0.0019s latency).
    MAC Address: 00:0C:29:01:40:16 (VMware)
    Nmap scan report for 192.168.186.93
    Host is up.
    Nmap done: 256 IP addresses (6 hosts up) scanned in 4.86 seconds

    In this example I chose to use ICMP Echo requests to scan the network. As expected, this scan took a little longer than the ARP scan we did in the last example. Remember to consider network contexts when performing scans. Since, I’m on a local network, it’s preferable to use an ARP scan to get results faster and more reliably.

    That being said, it’s important to try different protocols as systems are configured to respond differently:

    $ sudo nmap -sn -PP --disable-arp-ping 192.168.186.0/24
    Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-20 14:42 PDT
    Nmap scan report for 192.168.186.71
    Host is up (0.0038s latency).
    MAC Address: 00:0C:29:91:6A:82 (VMware)
    Nmap scan report for 192.168.186.72
    Host is up (0.0015s latency).
    MAC Address: 00:0C:29:19:6C:BF (VMware)
    Nmap scan report for 192.168.186.73
    Host is up (0.0012s latency).
    MAC Address: 00:0C:29:39:19:E4 (VMware)
    Nmap scan report for 192.168.186.74
    Host is up (0.0016s latency).
    MAC Address: 00:0C:29:01:40:16 (VMware)
    Nmap scan report for 192.168.186.93
    Host is up.
    Nmap done: 256 IP addresses (5 hosts up) scanned in 9.63 seconds

    In this example I told nmap to do a timestamp query scan and it took considerably longer. My VMware gateway was also configured not to respond to timestamp queries, so it did not show up in the results.

    Always mix and match protocol types. Some systems might be online but are configured not to respond to echo requests. So, you might find something that was missed in a previous scan by running nmap with different options.

    TCP/UDP/SCTP Scanning

    We’re taking another step higher in the protocol stack using TCP/UDP/SCTP scanning. In this type of scan, we’re using these protocols to probe a single port. While this scan has the highest level of overhead (and will be slower) it an advantage of being able to scan a host over the internet.

    As with the previous scans, we’re going to again use the -P option:

    • -PY: SCTP INIT
    • -PS: TCP SYN
    • -PA: TCP ACK
    • -PU: UDP

    Let’s try a SYN ping scan:

    $ sudo nmap -sn --disable-arp-ping -PS 192.168.186.0/24
    Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-20 15:04 PDT
    Nmap scan report for 192.168.186.2
    Host is up (0.0020s latency).
    MAC Address: 00:50:56:FC:7E:8B (VMware)
    Nmap scan report for 192.168.186.71
    Host is up (0.0012s latency).
    MAC Address: 00:0C:29:91:6A:82 (VMware)
    Nmap scan report for 192.168.186.72
    Host is up (0.0060s latency).
    MAC Address: 00:0C:29:19:6C:BF (VMware)
    Nmap scan report for 192.168.186.74
    Host is up (0.0018s latency).
    MAC Address: 00:0C:29:01:40:16 (VMware)
    Nmap scan report for 192.168.186.93
    Host is up.
    Nmap done: 256 IP addresses (5 hosts up) scanned in 4.88 seconds

    nmap chooses ports to probe by default but you can specify them by putting a number or range next to the scan type:

    $ sudo nmap -sn --disable-arp-ping -PU53 192.168.186.0/24
    Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-20 15:06 PDT
    Nmap scan report for 192.168.186.72
    Host is up (0.0018s latency).
    MAC Address: 00:0C:29:19:6C:BF (VMware)
    Nmap scan report for 192.168.186.74
    Host is up (0.0017s latency).
    MAC Address: 00:0C:29:01:40:16 (VMware)
    Nmap scan report for 192.168.186.93
    Host is up.
    Nmap done: 256 IP addresses (3 hosts up) scanned in 9.61 seconds

    I chose port 53 (DNS) to perform my UDP scan because it’s super common. As you can see, I got fewer results with this and it took a lot longer. Again, it’s important to try different ports and protocols with these scans. For example, if I knew an organization had websites up and running, I might try ports 80 and 443 to see what servers they have online. If I’m scanning a business network with a lot of users, they may be using AD to manage their systems, so I might try port 389 or 636 for LDAP.

    Context matters!

    Port Scanning

    Now that we know what hosts are up and running, we can check what services are running on these hosts. Open ports present an opportunity for access, so it’s important to know what can be potentially accessed or exploited.

    We saw that nmap scans ports by default using full TCP connections, or just by using TCP SYN packets when running as root.

    To specify a scan option, we can use the -s argument with nine different options. We’ll only go over a few but I’ll list some common scans:

    • -sS: SYN Scan (default)
    • -sT: TCP Scan
    • -sU: UDP Scan
    • sY: SCTP Scan

    This sort of syntax should be familiar to you as it is very similar to the various ping scan options with -P. I used a SYN scan to scan my metasploitable machine:

    $ sudo nmap -sS ms2
    Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-22 21:16 PDT
    Nmap scan report for ms2 (192.168.186.131)
    Host is up (0.0029s latency).
    Not shown: 977 closed tcp ports (reset)
    PORT     STATE SERVICE
    21/tcp   open  ftp
    22/tcp   open  ssh
    23/tcp   open  telnet
    25/tcp   open  smtp
    53/tcp   open  domain
    80/tcp   open  http
    111/tcp  open  rpcbind
    139/tcp  open  netbios-ssn
    445/tcp  open  microsoft-ds
    512/tcp  open  exec
    513/tcp  open  login
    514/tcp  open  shell
    1099/tcp open  rmiregistry
    1524/tcp open  ingreslock
    2049/tcp open  nfs
    2121/tcp open  ccproxy-ftp
    3306/tcp open  mysql
    5432/tcp open  postgresql
    5900/tcp open  vnc
    6000/tcp open  X11
    6667/tcp open  irc
    8009/tcp open  ajp13
    8180/tcp open  unknown
    MAC Address: 00:0C:29:7B:A1:58 (VMware)
    
    Nmap done: 1 IP address (1 host up) scanned in 0.38 seconds

    nmap was able to find quite a bit of open ports. I like using the SYN scan because it combines the reliability of a TCP scan without being as slow (this scan only took 0.38 seconds) because it doesn’t establish a full connection.

    That being said, it’s important to try other scan types:

    $ sudo nmap -sU -p 53,1000-1010 ms2
    Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-22 21:20 PDT
    Nmap scan report for ms2 (192.168.186.131)
    Host is up (0.0018s latency).
    
    PORT     STATE         SERVICE
    53/udp   open          domain
    1000/udp closed        ock
    1001/udp open|filtered unknown
    1002/udp closed        unknown
    1003/udp closed        unknown
    1004/udp closed        unknown
    1005/udp open|filtered unknown
    1006/udp closed        unknown
    1007/udp closed        unknown
    1008/udp open|filtered ufsd
    1009/udp closed        unknown
    1010/udp closed        surf
    MAC Address: 00:0C:29:7B:A1:58 (VMware)
    
    Nmap done: 1 IP address (1 host up) scanned in 4.87 seconds

    This time, I told nmap to do a UDP scan. You’ll also notice that I specified what ports to scan using the -p option. You can tell nmap to scan a range, comma-separated values, ports specified by name, or every port using -p-.

    Even though I scanned only 11 ports, it took a little longer than the SYN scan. Outside of finding ports that were open and closed, nmap claimed some ports were open|filtered. This just mean that nmap couldn’t tell if the port was truly open, or is protected by some sort of firewall.

    Like I said when doing host discovery, it’s important to experiment with different scan methods. There are more than just the few types I listed, so feel free to check those out at nmap.org.

    Output

    As a penetration tester, it’s important to keep track of your scan results. Not only for you to go back over (instead of repeating scans), but for reporting purposes as well.

    nmap makes this a snap with the -o option. There are few options that go along with -o:

    • -oN: normal output
    • -oX: XML output
    • -oG: grepable output
    • -oA: output in all formats

    I usually stick with outputting my scan results in every format because they’re all useful in their own ways. I like normal output for reading over myself. Grepable output is great because it puts each host on a single line which makes it easier to grep by host (hence the name). Finally, XML output is extremely useful for web-based visualization tools or storing the results in a database. For example, I love feeding my XML scan results to metasploit, which makes it really easy to organize and search through my results.

    Conclusion

    If you made it this far, you can now add an invaluable tool to your hacking arsenal. This was a lengthy post so give your self a huge pat on the back for reading it all. Your learning is not over yet, though. To really make this stick, download nmap and play around on your own network. It’s fun and is a great way to make sure you retain what you learned. Otherwise (in my own experience) the knowledge won’t stick!

    References

  • DNS Enumeration

    DNS Enumeration

    Now, the fun begins. If you followed my last post about the basics of DNS, you should be armed and ready to tackle the subject of this post: DNS enumeration.

    DNS enumeration is the process of obtaining as much information about a target as possible by pulling from publicly available DNS records. This can expand the attack surface of a target by revealing their internet facing servers, email addresses, and more depending on how extensively you enumerate.

    The keyword in this definition is “publicly“. That means that all of the methods I’m about to show you in the next section you can try on your own (and I encourage you to do so).

    However, it’s important to note that some automated scripts brute-force subdomains by default, which may overload some older servers. This is unlikely though, but just make sure you know what the tool is going to do before you fire it off.

    With that being said, let’s get into enumerating DNS!

    Manual Techniques

    There are several scripts out there that allow you to automatically scrape tons of DNS information in a point and click fashion. However, it’s important to know how to manually enumerate DNS in order to modularize enumeration and adapt it to more specific situations.

    Don’t let the term “manual” scare you though. I’m going to go over a few tools that will make this process a snap.

    Whois

    Using the Whois service is a great starting point in your quest for information. With just the domain name of a target’s website, you can pull it’s registrar information, geographic location of its servers, name servers associated with it, and contact information system admins and technical support.

    The whois command is built into most UNIX based operating systems. So, if you’re running one of it’s variants like a Linux distro or MacOS, you can run:

    whois <domain name>

    You’ll quickly be overwhelmed with a bunch of information about that domain name. For this reason, I recommend using an online tool like https://www.whois.com/whois. They organize data a bit more graphically than the plain terminal-based whois command does.

    DiG

    If there’s one manual tool you need to know, it’s the dig command. Like whois, it comes prepackaged with many UNIX variants. Unlike whois, it’s much more powerful.

    To use dig, follow this format:

    dig @<name server> <domain name> <record type>

    The name server and record type positional arguments are optional. You can use dig in the same way as you would whois:

    [~]$ dig github.com
    
    ; <<>> DiG 9.16.1-Ubuntu <<>> github.com
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4266
    ;; flags: qr ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;github.com.                    IN      A
    
    ;; ANSWER SECTION:
    github.com.             60      IN      A       192.30.255.113
    
    ;; Query time: 115 msec
    ;; SERVER: 8.8.8.8#53(8.8.8.8)
    ;; WHEN: Tue Feb 28 19:17:22 PST 2023
    ;; MSG SIZE  rcvd: 44

    By default, dig pulls A records and uses whatever nameserver it can access from my /etc/resolv.conf file. As you can see, it decided to use Google’s nameserver at 8.8.8.8.

    Of course, dig can be used for so much more. Let’s try pulling the nameservers of github.com:

    [~]$ dig github.com NS +short
    dns1.p08.nsone.net.
    dns2.p08.nsone.net.
    dns3.p08.nsone.net.
    dns4.p08.nsone.net.
    ns-1283.awsdns-32.org.
    ns-1707.awsdns-21.co.uk.
    ns-421.awsdns-52.com.
    ns-520.awsdns-01.net.

    In this example, I told dig to grab me the NS records associated with github.com and keep the output short and sweet with the +short query modifier. I like to use +short with dig because the output can be pretty cluttered.

    Another useful query type is the ANY query, which pulls all available records associated with a domain:

    [~]$ dig github.com ANY +noall +answer
    github.com.             60      IN      A       192.30.255.113
    github.com.             900     IN      NS      dns1.p08.nsone.net.
    github.com.             900     IN      NS      dns2.p08.nsone.net.
    github.com.             900     IN      NS      dns3.p08.nsone.net.
    github.com.             900     IN      NS      dns4.p08.nsone.net.
    github.com.             900     IN      NS      ns-1283.awsdns-32.org.
    github.com.             900     IN      NS      ns-1707.awsdns-21.co.uk.
    github.com.             900     IN      NS      ns-421.awsdns-52.com.
    github.com.             900     IN      NS      ns-520.awsdns-01.net.
    github.com.             900     IN      SOA     ns-1707.awsdns-21.co.uk. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400
    github.com.             3600    IN      MX      1 aspmx.l.google.com.
    github.com.             3600    IN      MX      10 alt3.aspmx.l.google.com.
    github.com.             3600    IN      MX      10 alt4.aspmx.l.google.com.
    github.com.             3600    IN      MX      5 alt1.aspmx.l.google.com.
    github.com.             3600    IN      MX      5 alt2.aspmx.l.google.com.
    ...

    As you can see, dig was able to pull a variety of records, including SOA and MX. I also used the +noall combined with +answer query modifiers to single out the responses in the output. This is useful if you just want to see the results of a query (no annoying header messages) but want a little more info than what’s provided with +short.

    Additionally, dig can initiate zone transfer. A zone transfer is the process DNS servers use to transfer copies of records of a particular zone to another server. This is primarily used for redunancy–if one server goes down, another server with copies of all the records will be able to resume operation in its place.

    Misconfigured servers allow zone transfers to occur between anyone that requests it (including you). This can potentially leak private records.

    With dig it’s as simple as:

    [~]$ dig @dns3.p08.nsone.net github.com AXFR +noall +answer
    ; Transfer failed.

    I used the AXFR query type to initiate a zone transfer with one of github.com‘s nameservers. It didn’t let me. Good job GitHub.

    This is usually the case as zone transfers are a well-known vulnerability. However, never rule them out. Company nameservers usually have multiple nameservers for redundancy. In some cases, backups might be overlooked in terms of hardening. So, try zone transfers against all of a target’s nameservers. You might get lucky.

    Host

    Another tool worth mentioning that is very similar to dig and is bundled with most UNIX-based OS’s is host. Keep in mind this is not the same host command that is available on Windows by default.

    Just typing host and supplying it a domain name can reveal some useful information:

    [~]$ host reddit.com
    reddit.com has address 151.101.129.140
    reddit.com has address 151.101.193.140
    reddit.com has address 151.101.1.140
    reddit.com has address 151.101.65.140
    reddit.com has IPv6 address 2a04:4e42::396
    reddit.com has IPv6 address 2a04:4e42:600::396
    reddit.com has IPv6 address 2a04:4e42:400::396
    reddit.com has IPv6 address 2a04:4e42:200::396
    reddit.com mail is handled by 5 alt2.aspmx.l.google.com.
    reddit.com mail is handled by 1 aspmx.l.google.com.
    reddit.com mail is handled by 10 aspmx2.googlemail.com.
    reddit.com mail is handled by 10 aspmx3.googlemail.com.
    reddit.com mail is handled by 5 alt1.aspmx.l.google.com.

    With just one argument, host was able to pull reddit.com‘s A, AAAA, and MX records in an arguably cleaner fashion than dig.

    A useful argument I like using when running host is a:

    [~]$ host -a reddit.com
    Trying "reddit.com"
    Trying "reddit.com"
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12601
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 34, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;reddit.com.                    IN      ANY
    
    ;; ANSWER SECTION:
    reddit.com.             278     IN      A       151.101.193.140
    reddit.com.             278     IN      A       151.101.129.140
    reddit.com.             278     IN      A       151.101.65.140
    reddit.com.             278     IN      A       151.101.1.140
    reddit.com.             86378   IN      NS      ns-557.awsdns-05.net.
    reddit.com.             86378   IN      NS      ns-1029.awsdns-00.org.
    reddit.com.             86378   IN      NS      ns-1887.awsdns-43.co.uk.
    reddit.com.             86378   IN      NS      ns-378.awsdns-47.com.
    reddit.com.             878     IN      SOA     ns-557.awsdns-05.net. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400
    reddit.com.             278     IN      MX      5 alt2.aspmx.l.google.com.
    reddit.com.             278     IN      MX      1 aspmx.l.google.com.
    reddit.com.             278     IN      MX      10 aspmx2.googlemail.com.
    reddit.com.             278     IN      MX      10 aspmx3.googlemail.com.
    reddit.com.             278     IN      MX      5 alt1.aspmx.l.google.com.
    reddit.com.             3578    IN      TXT     "google-site-verification=zZHozYbAJmSLOMG4OjQFoHiVqkxtdgvyBzsE7wUGFiw"
    reddit.com.             3578    IN      TXT     "logmein-verification-code=1e307fc8-361a-4e39-8012-ed0873b06668"
    reddit.com.             3578    IN      TXT     "onetrust-domain-verification=6b98ba3dd087405399bbf45b6cbdcd37"
    reddit.com.             3578    IN      TXT     "stripe-verification=9bd70dd1884421b47f596fea301e14838c9825cdba5b209990968fdc6f8010c7"
    reddit.com.             3578    IN      TXT     "twilio-domain-verification=5e37855d7c9445e967b31c5e0371ebb5"
    reddit.com.             3578    IN      TXT     "v=spf1 include:amazonses.com include:_spf.google.com include:mailgun.org include:19922862.spf01.hubspotemail.net ip4:174.129.203.189 ip4:52.205.61.79 ip4:54.172.97.247 ~all"
    reddit.com.             3578    IN      TXT     "614ac4be-8664-4cea-8e29-f84d08ad875c"
    reddit.com.             3578    IN      TXT     "MS=ms71041902"
    reddit.com.             3578    IN      TXT     "apple-domain-verification=qC3rSSKrh10DoMI7"
    reddit.com.             3578    IN      TXT     "atlassian-domain-verification=aGWDxGvt+oY3p7qTWt5v2uJDVJkoJAeHxwGqKmGQLMEsUXUJJe/Pm/k+GGNPpn6M"
    reddit.com.             3578    IN      TXT     "atlassian-domain-verification=vBaV6PXyyu4OAPLiQFbxFMCboSTjoR/qxKJ2OlpI46ZEpZL/FVTIfMlgoM5Hy9eY"
    reddit.com.             3578    IN      TXT     "box-domain-verification=95c33f4ee4b11d8827190dbc5371ca7df25b961019116e5565ce4aa36de9be3a"
    reddit.com.             3578    IN      TXT     "docusign=6ba0c5a9-5a5e-41f8-a7c8-8b4c6e35c10c"
    reddit.com.             3578    IN      TXT     "google-site-verification=0uv13-wxlHK8FFKaUpgzyrVmL1YdNYW6v3PupLdw3JI"
    reddit.com.             3578    IN      TXT     "google-site-verification=oh_YJE560y0e6FHP1RT7NIjyTlBhACNMvD2EgSss0sc"
    reddit.com.             278     IN      AAAA    2a04:4e42:200::396
    reddit.com.             278     IN      AAAA    2a04:4e42:400::396
    reddit.com.             278     IN      AAAA    2a04:4e42:600::396
    reddit.com.             278     IN      AAAA    2a04:4e42::396
    reddit.com.             86378   IN      CAA     0 issue "digicert.com; cansignhttpexchanges=yes"
    
    Received 1838 bytes from 10.220.0.1#53 in 15 ms

    As you can see, an absolutely enormous amount of information was pulled. That’s because using -a tells host to pull all of the records it can from it’s target.

    You can also perform zone transfers:

    [~]$ host -l reddit.com
    ;; Connection to 123.456.78.9#53(123.456.78.9) for reddit.com failed: connection refused.
    ;; Connection to 123.456.78.1#53(123.456.78.1) for reddit.com failed: connection refused.

    And it seems that the default nameserver (123.456.78.9) didn’t allow us to do this.

    Nslookup

    This tool functions fairly similarly to host and dig but has an optional interactive mode. This is useful for when you want to frequently options such as query types and nameservers without retyping the name of the command all over again.

    Here’s a quick example:

    [~]$ nslookup
    > set type=NS
    > microsoft.com
    Server:         123.456.78.9
    Address:        123.456.78.9#53
    
    Non-authoritative answer:
    microsoft.com   nameserver = ns4-39.azure-dns.info.
    microsoft.com   nameserver = ns1-39.azure-dns.com.
    microsoft.com   nameserver = ns2-39.azure-dns.net.
    microsoft.com   nameserver = ns3-39.azure-dns.org.
    
    Authoritative answers can be found from:
    > server ns1-39.azure-dns.com
    Default server: ns1-39.azure-dns.com
    Address: 150.171.10.39#53
    Default server: ns1-39.azure-dns.com
    Address: 2603:1061:0:10::27#53
    > set type=MX
    > microsoft.com
    Server:         ns1-39.azure-dns.com
    Address:        150.171.10.39#53
    
    microsoft.com   mail exchanger = 10 microsoft-com.mail.protection.outlook.com.

    To access interactive mode, I ran nslookup without any arguments. From there I set the query type to NS to look up microsoft.com‘s nameservers, then used one of their nameservers to look up their mail servers.

    As you can see, most of the commands I typed were only one or two words long. For this reason, I like nslookup for poking around if I’m not necessarily sure what I’m looking for and need to frequently update my commands.

    It’s important to note that these three tools (dig, host, nslookup) function very similarly. So, I encourage you to try all of them, use them interchangeably, and read the man pages for each one. They each have their strengths and weaknesses. The one you choose depends on your situation and preferences.

    Subdomain Enumeration

    Subdomain enumeration is the process of finding as many subdomains associated with a domain as possible. This is an important process of DNS enumeration as it expands our attack surface even further. You can also apply the techniques described previously on the subdomains you find to make your enumeration even more effective.

    Most modern search engines can be a useful tool for subdomain enumeration. If you read one of my earlier posts about Google Dorking, you may already be familiar with the technique I’m about to describe.

    Google makes subdomain enumeration a snap with the inurl parameter:

    iRobot’s subdomains provided by Google

    Using inurl and the domain name, irobot.com, I was able to find numerous subdomains. I also used -www to tell Google to exclude search results containing www.

    Another powerful tool for subdomain enumeration is the Certificate Search tool:

    cert.sh results from the query %.irobot.com

    The query I used to pull all of these results was %.irobot.com, where the % symbol was a wild card. This means that results with anything ending with “.irobot.com” will be a part of the search results.

    Combining these techniques is a powerful way of discovering subdomains that give you an edge by providing you with more information.

    Automated Techniques

    Now that you know some basic (but powerful) techniques for enumerating subdomains, its time to automate the process.

    There’s tons of tools out there that do all of these steps (and more) to provide you with as much information associated with a domain name as possible. One popular one is dnsenum. As described in its man pages dnsenum can perform:

    nslookup, zonetransfer, google scraping, domain brute force (support also recursion), whois ip and reverse lookups.

    Here’s what I was able to pull by pointing this tool at burgerking.com:

    [~]$ dnsenum burgerking.com
    dnsenum VERSION:1.2.6
    
    -----   burgerking.com   -----
    
    
    Host's addresses:
    __________________
    
    burgerking.com.                          37       IN    A        99.84.66.7
    burgerking.com.                          37       IN    A        99.84.66.86
    burgerking.com.                          37       IN    A        99.84.66.37
    burgerking.com.                          37       IN    A        99.84.66.51
    
    
    Name Servers:
    ______________
    
    udns1.cscdns.net.                        28800    IN    A        204.74.66.1
    udns2.cscdns.uk.                         13091    IN    A        204.74.111.1
    
    
    Mail (MX) Servers:
    ___________________
    
    ASPMX2.GOOGLEMAIL.com.                   293      IN    A        64.233.171.27
    ALT2.ASPMX.L.GOOGLE.com.                 293      IN    A        142.250.152.27
    ALT1.ASPMX.L.GOOGLE.com.                 293      IN    A        64.233.171.27
    ASPMX.L.GOOGLE.com.                      292      IN    A        142.250.141.26
    ASPMX3.GOOGLEMAIL.com.                   293      IN    A        142.250.152.27
    
    
    Trying Zone Transfers and getting Bind Versions:
    _________________________________________________
    
    
    Trying Zone Transfer for burgerking.com on udns1.cscdns.net ...
    AXFR record query failed: REFUSED
    
    Trying Zone Transfer for burgerking.com on udns2.cscdns.uk ...
    AXFR record query failed: REFUSED
    
    
    Brute forcing with /usr/share/dnsenum/dns.txt:
    _______________________________________________
    
    www.burgerking.com.                      86400    IN    CNAME    prod-bk-web.com.rbi.tools.
    prod-bk-web.com.rbi.tools.               60       IN    A        13.33.21.112
    prod-bk-web.com.rbi.tools.               60       IN    A        13.33.21.119
    prod-bk-web.com.rbi.tools.               60       IN    A        13.33.21.10
    prod-bk-web.com.rbi.tools.               60       IN    A        13.33.21.51

    I cut the scan short but you can see it was able to pull some useful servers (as well as their IP addresses), find some domains, and attempted to do a zone transfer and figure out the DNS server’s bind version.

    Other great tools include fierce, dnsrecon, and sublist3r (for enumerating subdomains). I encourage you to try them all out and see what tools work for you. There are also tons of opensource tools out there that I haven’t mentioned that you should try as well!

    Now that you’ve seen a fantastic tool that formats everything you might need beautifully with color-coding, you may be asking yourself: “Why even bother with manual testing in the first place?”

    While these tools are extremely efficient, they may not be a one line solution for all of your needs. It’s important when enumerating to supplement your automated information gathering with manual gathering.

    Manual enumeration is extremely flexible, allowing you to poke around at every angle you can think of and dig deeper than some automated scripts. It’s also worth noting that these automated scripts generate a ton of traffic. So, in a scenario where stealth is required, it may be more appropriate to manual test to fly under the radar.

    Conclusion

    DNS enumeration is a critical step in the process of analyzing your target. When executed correctly, it can be used to expose a wealth of information. The more information you have on a target, the more effective your penetration test will be.

    I only covered the basics to give you a starting point. I highly encourage you to look at the manual pages (with the man command, arguably the best UNIX command) to learn the ins and outs of these tools so you can make the most out of them. At the end of the day, these tools are simply lines of code–it’s up to you to make them useful.

    Remember, this information is all public, so feel free to practice on your own (you definitely should) and see what you can dig up. Just be careful when using the brute-force tools against servers you don’t own (again read the man pages so you know what you’re doing) and don’t use any of the information you gather without permission.

    That’s all and happy hunting! In the next post, I’m going to be talking about scanning with nmap so stay tuned for that!

    References

    https://resources.infosecinstitute.com/topic/dns-enumeration-techniques-in-linux/

    https://securitytrails.com/blog/dns-enumeration

    The Cybermentor’s Web Hacking Course