您的網域是否有透漏訊息給駭客?-DNS的偵查

您的網域是否有透漏訊息給駭客?-DNS的偵查

DNS的查詢服務可以讓我們直接或是間接知道網路主機的資訊,

例如組織、IP位址、伺服器名稱、伺服器類型、位置等。

這些資訊當然也會間接被駭客使用。

這篇文章就是討論DNS會間接告訴駭客哪些資訊與相關的查詢工具。

DNS查詢 NsLookUp

可以用簡單的指令 NSlookUP查詢該DNS 的位址資訊

root@a:~# nslookup
> www.google.com

MX Queries

如何得知該伺服器是用來當Mail Server呢?

可以將伺服器查詢類型指定為 MX,就可以知道該伺服器是否為郵件伺服器

> set type=mx
> google.com

查詢結果如下:

Server: 10.1.1.1
Address: 10.1.1.1#53
Non-authoritative answer:
google.com mail exchanger = 12 mail1.google.com
google.com mail exchanger = 15 usmail-google.com.

其中 12 與 15表示郵件傳遞的需要的成本權重。越低越好。

所以我們可以判斷 12 的 mail1.google.com應該是主要郵件伺服器。

另外一個 15 的usmail-google.com有可能是備份郵件伺服器。

NS Queries

除了 MX 郵件伺服器查詢之外,還可以用NS查詢伺服器主機。

> set type=ns
> google.com

得知這些資訊之後,將有助於之後的 Zone Transfer 資訊,以獲取更多其他額外的DNS資訊。

駭客DNS查詢

了解DNS基本查詢之後,接下來我們要討論駭客如何查詢DNS,

原則上有三個方式

  •  Forward lookup brute force (FQDN查詢IP)
  •  Reverse lookup brute force (IP反查FQDN)
  •  Zone transfers (複製整個DNS伺服器資料)

接著說明這三種方式的基本查詢原理與相關程式碼。

Forward lookup brute force

透過 host這個指令查詢 IP位址

#host www.google.com

我們可以將大量需要查詢的 DNS前置名稱寫成一個文字檔 dns.txt,例如

www
www1
www2
firewall
cisco
smtp
pop3
proxy
dns

接著用 linux的 shell script 整批查詢 dnsQuery.sh

#!/bin/bash
for name in $(cat dns.txt);do
host $name.domainName.com |grep “has address”
done

執行後會得到下列結果

# ./dnsQuery.sh
www.domainName.com has address 10.1.1.1
www.domainName.com has address 10.1.1.2
michael.domainName.com has address 10.1.1.3
ns.domainName.com has address 10.1.1.4

接著可以用 whois查詢該ip address的相關註冊資訊

# whois 10.1.1.1

Reverse lookup brute force

# host 216.200.241.66

從IP 位址反查 FQDN

我們就可以寫一個小程式,讓特定範圍的IP address利用DNS查詢

#!/bin/bash
echo “Please enter Class C IP network range:”
echo “eg: 196.10.1”
read range
for ip in `seq 1 254`;do
host $range.$ip |grep “name pointer” |cut -d” ” -f5
done

DNS Zone Transfers

http://en.wikipedia.org/wiki/DNS_zone_transfer

Zone Transfer 相當於複製DNS 資料。由於系統管理員設定的不洽當,導致DNS料可以被複製。

host -t ns hostName.com

Zone transfer hostName 到 hostName2

host -l hostName.com    hostName2.com

自動化工具 dnsenum.pl

https://github.com/fwaeytens/dnsenum/blob/master/dnsenum.pl

這個工具 dnsenum.pl可以自動化上述查詢。

  • Foward Lookup
  • Reverse lookup
  • Zone Transfer

其它DNS 查詢Python範例

http://www.dnspython.org/examples.html

Google Mail Python範例程式

如何透過Google搜尋,將特定網域的 email 電子郵件地址都找出來呢?

可以參考下列 python程式。執行

Python   GoogleMail.py    google.com

[pastacode lang=”python” message=”” highlight=”” provider=”manual”]

#!/usr/bin/python

import sys
import re
import string
import httplib
import urllib2

def StripTags(text):
    finished = 0
    while not finished:
        finished = 1
        start = text.find("<")
        if start >= 0:
            stop = text[start:].find(">")
            if stop >= 0:
                text = text[:start] + text[start+stop+1:]
                finished = 0
    return text
if len(sys.argv) != 2:
        print "\nExtracts emails from Google results.\n"
        print "\nUsage: ./goog-mail.py <domain>\n"
        sys.exit(1)

domain_name=sys.argv[1]
d={}
page_counter = 0
try:
    while page_counter < 50 :
        results = 'http://groups.google.com/groups?q='+str(domain_name)+'&hl=en&lr=&ie=UTF-8&start=' + repr(page_counter) + '&sa=N'
        request = urllib2.Request(results)
        request.add_header('User-Agent','Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)')
        opener = urllib2.build_opener()                           
        text = opener.open(request).read()
        emails = (re.findall('([\w\.\-]+@'+domain_name+')',StripTags(text)))
        for email in emails:
            d[email]=1
            uniq_emails=d.keys()
        page_counter = page_counter +10
except IOError:
    print "Cannot connect to Google Groups."+""
    
page_counter_web=0
try:
    while page_counter_web < 50 :
        results_web = 'http://www.google.com/search?q=%40'+str(domain_name)+'&hl=en&lr=&ie=UTF-8&start=' + repr(page_counter_web) + '&sa=N'
        request_web = urllib2.Request(results_web)
        request_web.add_header('User-Agent','Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)')
        opener_web = urllib2.build_opener()                           
        text = opener_web.open(request_web).read()
        emails_web = (re.findall('([\w\.\-]+@'+domain_name+')',StripTags(text)))
        for email_web in emails_web:
            d[email_web]=1
            uniq_emails_web=d.keys()
        page_counter_web = page_counter_web +10
        
except IOError:
    print "Cannot connect to Google Web."+""
for uniq_emails_web in d.keys():
    print uniq_emails_web+""

[/pastacode]

Leave a Reply

Your email address will not be published. Required fields are marked *