Rekonesans DNS i wrogie przejęcie
Napisał: Patryk Krawaczyński
03/08/2016 w Pen Test 1 komentarz. (artykuł nr 537, ilość słów: 2790)
R
ekonesans DNS jest główną częścią etapu zbierania informacji w testach penetracyjnych. Można to porównać do wykonywania mapy infrastruktury danego serwisu. Większość organizacji nie monitoruje ruchu DNS, szczególnie nieudanych zapytań i prób pobrania całej strefy – dlatego wyciśnięcie jak największej ilości informacji z tego źródła często nie wpływa na alarmy w systemach bezpieczeństwa i nie wzbudza podejrzeń. W Internecie istnieje wiele dostępnych narzędzi, które mogą skutecznie wykonywać tego typu operacje, ale my skupimy się tylko na kilku i w dodatku tylko na tych napisanych w języku Python, ponieważ bardzo łatwo jest stworzyć dla nich wirtualne środowisko i zainstalować zależności, aby zadziałały od kopnięcia.
1. Spis rekordów:
Do uzyskania podstawowych rekordów DNS (NS, AAAA, MX, TXT, SOA) wykorzystamy narzędzie DNSRecon – jest ono oficjalnie umieszczone w dystrybucji do PenTestów – Kali:
pi@littledeathstar~$ ./dnsrecon.py -d example.com [*] Performing General Enumeration of Domain: example.com [-] DNSSEC is not configured for example.com [*] SOA ns1.example.com 192.168.1.1 [*] NS ns3.example.com 192.168.1.3 [*] NS ns1.example.com 192.168.1.1 [*] Bind Version for 192.168.1.1 [Secured] [*] NS ns2.example.com 192.168.1.2 [*] Bind Version for 192.168.1.2 [Secured] [*] NS ns4.example.com 192.168.1.4 [*] Bind Version for 192.168.1.4 [Secured] [*] MX mail.example.com 40.31.164.1 [*] A example.com 40.31.164.1 [*] TXT example.com v=spf1 a mx -all [*] Enumerating SRV Records [-] No SRV Records Found for example.com [+] 0 Records Found
Z powyższego skanu możemy odczytać, że: domena example.com nie używa rozszerzenia DNSSEC; posiada 4 serwery DNS (od ns1 do ns4); adres serwera pocztowego jest umieszczony na tym samym serwerze, co prawdopodobnie inne usługi (A i MX posiadają ten sam adres IP); rekord SPF deklaruje, że tylko serwery pod adresami A i MX są uprawnione do wysyłania poczty w domenie @example.com. Domena nie posiada żadnych rekordów SRV, które mogą podpowiedzieć z jakich dodatkowych usług korzysta dany serwis np. XMPP, SIP czy VoIP. Komunikat [Secured]
mówi nam również o tym, że serwery DNS są zabezpieczone przed udostępnianiem informacji o swojej wersji.
2. Transfer strefy:
Wydawać się może, że w dzisiejszych czasach uzyskanie pełnego dostępu do strefy to jak trafić pełną numerację w jakiejś grze losowej. Niestety tak nie jest. Pobranie całej strefy testowanego serwisu dane nam pełny odczyt topologii serwerów, numerów seryjnych serwerów DNS i czasy wygaśnięcia rekordów. Skoro w pierwszym kroku uzyskaliśmy listę serwerów DNS odpowiedzialnych za serwowanie rekordów dla danej domeny to możemy pojedynczo je sprawdzić, czy ich zła konfiguracja pozwoli nam na transfer strefy:
pi@littledeathstar~$ ./dnsrecon.py -d example.com -t axfr [*] Testing NS Servers for Zone Transfer [*] Checking for Zone Transfer for example.com name servers [*] Resolving SOA Record [+] SOA ns1.example.com 192.168.1.1 [*] Resolving NS Records [*] NS Servers found: [*] NS ns3.example.com 192.168.1.3 [*] NS ns1.example.com 192.168.1.1 [*] NS ns2.example.com 192.168.1.2 [*] NS ns4.example.com 192.168.1.4 [*] Removing any duplicate NS server IP Addresses... [*] [*] Trying NS server 192.168.1.3 [+] 192.168.1.3 Has port 53 TCP Open [-] Zone Transfer Failed! [-] No answer or RRset not for qname [*] [*] Trying NS server 192.168.1.1 [+] 192.168.1.1 Has port 53 TCP Open [-] Zone Transfer Failed! [-] No answer or RRset not for qname [*] [*] Trying NS server 192.168.1.2 [+] 192.168.1.2 Has port 53 TCP Open [-] Zone Transfer Failed! [-] No answer or RRset not for qname [*] [*] Trying NS server 192.168.1.4 [+] 192.168.1.4 Has port 53 TCP Open [-] Zone Transfer Failed! [-] No answer or RRset not for qname
Aby przeprowadzić próbę transferu strefy możemy także skorzystać z ogólnie dostępnych narzędzi w systemie Linux:
dig axfr example.com @ns1.example.com host -l example.com
Niestety w tej próbie nie udało nam się pozyskać najniżej wiszących owoców. Dlatego musimy sięgnąć trochę wyżej.
3. Odwrotna translacja adresów DNS:
Większe serwisy internetowe posiadają przyznany tylko dla siebie zakres publicznych adresów IP od swoich ISP. Bardzo często w ramach tych zakresów pod pojedynczymi adresami IP kryją się serwery pełniące poszczególne role. Sam adres IP nic nam nie powie, ale revDNS dla niego może już nieść za sobą konkretne informacje. Jeden z adresów, jaki udało nam się uzyskać to 40.31.164.1 – za pomocą polecenia whois możemy sprawdzić, czy jest to dedykowany blok i do kogo należy:
pi@littledeathstar~$ whois 40.31.164.1 | grep -v ^# Server Central Network SCN-3 (NET-40-31-128-0-1) 40.31.128.0 - 40.31.255.255 Example Inc. SCNET-40-31-164-0-24 (NET-40-31-164-0-1) 40.31.164.0 - 40.31.164.255
Jak widzimy trafiliśmy na dedykowany blok należący do firmy Example Inc. właściciela domeny example.com. Daje nam to do dyspozycji zakres 254 adresów IP, które możemy sprawdzić skryptem:
pi@littledeathstar~$ ./dnsrecon.py -r 40.31.164.0-40.31.164.255 [*] Reverse Look-up of a Range [*] Performing Reverse Lookup from 40.31.164.0 to 40.31.164.255 [*] PTR br02.ord6.us.no-ips.org 40.31.164.3 [*] PTR br01.ord6.us.no-ips.org 40.31.164.2 [*] PTR xe-0-0-2--5.br02.ord6.us.no-ips.org 40.31.164.31 [*] PTR xe-0-0-2--5.br01.ord6.us.no-ips.org 40.31.164.30 [*] PTR ae0--101.br01.ord6.us.no-ips.org 40.31.164.66 [*] PTR staging.example.com 40.31.164.74 [*] PTR ae0--101.br02.ord6.us.no-ips.org 40.31.164.67 [*] PTR staging-pinger-master.example.com 40.31.164.80 [*] PTR dev-auth.example.com 40.31.164.82 [*] PTR staging-collector-0.example.com 40.31.164.77 [*] PTR staging-collector-1.example.com 40.31.164.78 [*] PTR staging-collector.example.com 40.31.164.79 [*] PTR staging-shared.example.com 40.31.164.85 [*] PTR staging-beacon-2.example.com 40.31.164.76 [*] PTR staging-jserror.example.com 40.31.164.84 [*] PTR staging-insights.example.com 40.31.164.89 [*] PTR dev.example.com 40.31.164.86 [*] PTR staging-mobile-collector-origin.example.com 40.31.164.88 [*] PTR staging-auth.example.com 40.31.164.83 [*] PTR staging-beacon-1.example.com 40.31.164.75 [*] PTR staging-insights-collector.example.com 40.31.164.91 [*] PTR staging-insights-embed.example.com 40.31.164.92 [*] PTR staging-mobile-crash.example.com 40.31.164.97 [*] PTR staging-collector-102.example.com 40.31.164.102 [*] PTR staging-collector-103.example.com 40.31.164.103 [*] PTR staging-collector-101.example.com 40.31.164.101 [*] PTR ae0--100.br01.ord6.us.no-ips.org 40.31.164.130 [*] PTR tg03.ord6.us.no-ips.org 40.31.164.132 [*] PTR bal01.ord6.us.no-ips.org 40.31.164.133 [*] PTR tg01.ord6.us.no-ips.org 40.31.164.135 [*] PTR tg02.ord6.us.no-ips.org 40.31.164.136 [*] PTR ae0--100.br02.ord6.us.no-ips.org 40.31.164.131 [*] PTR bal04.ord6.us.no-ips.org 40.31.164.138 [*] PTR collector.example.com 40.31.164.140 [*] PTR bal02.ord6.us.no-ips.org 40.31.164.134 [*] PTR collector-0.example.com 40.31.164.144 [*] PTR bal03.ord6.us.no-ips.org 40.31.164.137 [*] PTR nat.ord6.us.no-ips.org 40.31.164.139 [*] PTR collector-3.example.com 40.31.164.147 [*] PTR tg06.ord6.us.no-ips.org 40.31.164.141 [*] PTR bal06.ord6.us.no-ips.org 40.31.164.143 [*] PTR bal05.ord6.us.no-ips.org 40.31.164.142 [*] PTR collector-2.example.com 40.31.164.146 [*] PTR collector-1.example.com 40.31.164.145 [*] PTR collector-6.example.com 40.31.164.150 [*] PTR collector-8.example.com 40.31.164.152 [*] PTR collector-4.example.com 40.31.164.148 [*] PTR example.com 40.31.164.154 [*] PTR collector-5.example.com 40.31.164.149 [*] PTR sites.example.com 40.31.164.156 [*] PTR rpm.example.com 40.31.164.155 [*] PTR collector-7.example.com 40.31.164.151 [*] PTR collector-9.example.com 40.31.164.153 [*] PTR mobile-collector.example.com 40.31.164.160 [*] PTR insights-embed.example.com 40.31.164.161 [*] PTR api.example.com 40.31.164.158 [*] PTR download.example.com 40.31.164.159 [*] PTR pinger-master.example.com 40.31.164.157 [*] PTR bam-2.nr-data.net 40.31.164.166 [*] PTR tg05.ord6.us.no-ips.org 40.31.164.162 [*] PTR bam-1.nr-data.net 40.31.164.165 [*] PTR collector-153.example.com 40.31.164.169 [*] PTR beacon-1.example.com 40.31.164.168 [*] PTR alerting.example.com 40.31.164.163 [*] PTR platform-api.example.com 40.31.164.164 [*] PTR collector-152.example.com 40.31.164.167 [*] PTR beacon-2.example.com 40.31.164.172 [*] PTR bam-5.no-data.com 40.31.164.175 [*] PTR bam-3.no-data.com 40.31.164.173 [*] PTR beacon-3.example.com 40.31.164.176 [*] PTR datacollector-157.example.com 40.31.164.178 [*] PTR datacollector-155.example.com 40.31.164.171 [*] PTR datacollector-154.example.com 40.31.164.170 [*] PTR datacollector-156.example.com 40.31.164.177 [*] PTR bam-4.no-data.com 40.31.164.174 [*] PTR mobile-collector-3.example.com 40.31.164.179 [*] PTR beacon-4.example.com 40.31.164.180 [*] PTR jserror.example.com 40.31.164.186 [*] PTR beacon-5.example.com 40.31.164.188 [*] PTR insights-collector.example.com 40.31.164.187 [*] PTR mobile-collector-2.example.com 40.31.164.183 [*] PTR beacon-6.example.com 40.31.164.192 [*] PTR mobile-collector-4.example.com 40.31.164.191 [*] PTR mobile-collector-origin.example.com 40.31.164.185 [*] PTR auth.example.com 40.31.164.184 [*] PTR mobile-collector-5.example.com 40.31.164.190 [*] PTR collector-147.example.com 40.31.164.194 [*] PTR collector-146.example.com 40.31.164.195 [*] PTR mobile-collector-1.example.com 40.31.164.189 [*] PTR collector-145.example.com 40.31.164.197 [*] PTR collector-148.example.com 40.31.164.193 [*] PTR insights.example.com 40.31.164.196 [*] PTR collector-144.example.com 40.31.164.198 [*] PTR collector-102.example.com 40.31.164.202 [*] PTR mobile-crash-origin.example.com 40.31.164.199 [*] PTR mobile-symbol-upload-origin.example.com 40.31.164.200 [*] PTR datacollector-104.example.com 40.31.164.204 [*] PTR datacollector-101.example.com 40.31.164.201 [*] PTR datacollector-106.example.com 40.31.164.206 [*] PTR datacollector-103.example.com 40.31.164.203 [*] PTR datacollector-105.example.com 40.31.164.205 [*] PTR datacollector-108.example.com 40.31.164.208 [*] PTR datacollector-107.example.com 40.31.164.207 ... [*] PTR datacollector-140.example.com 40.31.164.240 [*] PTR tg04.ord6.us.no-ips.org 40.31.164.246 [*] PTR besite.example.com 40.31.164.244 [*] PTR collector-123.example.com 40.31.164.223 [*] PTR collector-129.example.com 40.31.164.229 [*] PTR production-nagios-external.no-ips.org 40.31.164.253 [*] PTR staging-nagios-external.no-ips.org 40.31.164.254
Wszystkie te rekordy dają nam pierwsze spojrzenie na posiadaną infrastrukturę serwisu example.com. Mamy maszyny api, developerskie, do pobierania pakietów, monitorujące oparte o rozwiązanie nagios itd., dla których możemy już planować kolejne kroki szczegółowego rozpoznania konkretnych usług. Mimo, że powyższy zbiór jest dość pokaźny nie znaczy to, że jest kompletny. Następny krok umożliwi nam jego uzupełnienie o kolejne rekordy.
4. Atak siłowy na subdomeny:
Jak spojrzymy na nomenklaturę (szczególnie angielską / amerykańską) jaka używana jest do nazw poszczególnych usług / serwerów to zawsze można odnaleźć powtarzający się wzór – usługi: api, auth, rest, mail, ftp, web, cache…; środowiska: dev, test, beta, alfa, stage… – wszystko dla użytkowników i programistów, aby było im łatwiej trafić na koniec drogi, gdzie są interesujące ich dane. Nikt z amerykańskiego startup’u raczej nie nazwie developerskiej maszyny śmiesznym słowem w języku węgierskim lub nieznanym powszechnie bohaterem Marvel’a. Dlatego przeprowadzenie ataku typu brute force na subdomenach łatwych do zgadnięcia często przynosi wymierne efekty:
pi@littledeathstar~$ ./dnsrecon.py -d example.com -D dict.txt -t brt -c output.csv [*] Performing host and subdomain brute force against example.com [*] A account.example.com 40.31.164.181 [*] CNAME advantage.example.com ec2-54-234-100-180.compute-1.amazonaws.com [*] A ec2-54-234-100-180.compute-1.amazonaws.com 54.234.100.180 [*] A alerts.example.com 40.31.164.163 [*] A api.example.com 40.31.164.158 [*] CNAME apt.example.com download.example.com [*] A download.example.com 40.31.164.159 [*] A auth.example.com 40.31.164.184 [*] CNAME be.example.com staging-shared.example.com [*] A staging-shared.example.com 40.31.164.85 [*] A beacon.example.com 40.31.164.168 [*] A beacon.example.com 40.31.164.172 [*] CNAME BETA.example.com rpm-origin.example.com [*] A rpm-origin.example.com 40.31.164.155 [*] CNAME beta.example.com rpm-origin.example.com [*] A rpm-origin.example.com 40.31.164.155 [*] CNAME blog.example.com example.wpengine.com [*] A example.wpengine.com 104.130.134.46 [*] CNAME boss.example.com nr-chi-boss.example.com [*] A nr-chi-boss.example.com 10.1.0.17 [*] CNAME br.example.com www.example.sl.smartling.com [*] A example-elb1-1263722460.us-east-1.elb.amazonaws.com 174.129.35.140 [*] A example-elb1-1263722460.us-east-1.elb.amazonaws.com 54.235.120.3 [*] CNAME cal.example.com ghs.googlehosted.com [*] A ghs.googlehosted.com 64.233.162.121 [*] CNAME cal.example.com ghs.googlehosted.com [*] AAAA ghs.googlehosted.com 2a00:1450:4010:c05::79 [*] A chi.example.com 204.93.199.132 [*] CNAME cloud.example.com purl.bleutrax.com [*] A purl.bleutrax.com 184.154.7.186 [*] CNAME cms.example.com sites.example.com [*] CNAME sites.example.com d.global-ssl.fastly.net [*] CNAME d.global-ssl.fastly.net prod.d.ssl.global.fastlylb.net [*] A prod.d.ssl.global.fastlylb.net 151.101.12.207 [*] CNAME collector.example.com collector-pool.example.com [*] A collector-pool.example.com 40.31.164.147 [*] A collector-pool.example.com 40.31.164.149 [*] A collector-pool.example.com 40.31.164.148 [*] A collector-pool.example.com 40.31.164.146 [*] A collector-pool.example.com 40.31.164.145 [*] A community.example.com 40.31.164.245 [*] CNAME dashboards.example.com rpm.example.com [*] CNAME rpm.example.com rpm-origin.example.com [*] A rpm-origin.example.com 40.31.164.155 [*] CNAME de.example.com example.com [*] A example.com 185.31.19.207 [*] CNAME dev.example.com d.global-ssl.fastly.net [*] CNAME d.global-ssl.fastly.net prod.d.ssl.global.fastlylb.net [*] A prod.d.ssl.global.fastlylb.net 151.101.16.207 [*] CNAME dev-api.example.com dev.example.com [*] CNAME dev.example.com d.global-ssl.fastly.net [*] CNAME d.global-ssl.fastly.net prod.d.ssl.global.fastlylb.net [*] A prod.d.ssl.global.fastlylb.net 151.101.12.207 [*] CNAME discuss.example.com example.bydiscourse.com [*] A example.bydiscourse.com 64.71.168.201 [*] CNAME discuss.example.com example.bydiscourse.com [*] AAAA example.bydiscourse.com 2001:470:1:3a8::201 [*] CNAME docs.example.com mc-10186-547559136.us-west-2.elb.amazonaws.com [*] A mc-10186-547559136.us-west-2.elb.amazonaws.com 54.214.4.29 [*] A mc-10186-547559136.us-west-2.elb.amazonaws.com 54.245.242.241 [*] A download.example.com 40.31.164.159 [*] CNAME drive.example.com ghs.googlehosted.com [*] A ghs.googlehosted.com 64.233.162.121 [*] CNAME drive.example.com ghs.googlehosted.com [*] AAAA ghs.googlehosted.com 2a00:1450:4010:c05::79 [*] CNAME es.example.com example.com [*] A example.com 151.101.64.207 [*] A example.com 151.101.128.207 [*] A example.com 151.101.192.207 [*] A example.com 151.101.0.207 [*] A example.com 185.31.17.207 [*] A forum.example.com 40.31.164.245 [*] CNAME fr.example.com example.com [*] A example.com 151.101.192.207 [*] A example.com 151.101.0.207 [*] A example.com 151.101.64.207 [*] A example.com 151.101.128.207 [*] A example.com 185.31.18.207 [*] CNAME get.example.com mkto-j0050.com [*] A mkto-j0050.com 199.15.213.48 [*] CNAME go.example.com go.toutapp.com [*] A go.toutapp.com 52.21.14.227 [*] A go.toutapp.com 52.200.55.60 [*] A go.toutapp.com 52.3.107.41 [*] A go.toutapp.com 52.7.68.19 [*] CNAME groups.example.com ghs.googlehosted.com [*] A ghs.googlehosted.com 173.194.220.121 [*] CNAME groups.example.com ghs.googlehosted.com [*] AAAA ghs.googlehosted.com 2a00:1450:4010:c09::79 [*] CNAME help.example.com nrhelpdesk.zendesk.com [*] A nrhelpdesk.zendesk.com 192.161.147.1 [*] CNAME hudson.example.com pdx-hudson.example.com [*] A pdx-hudson.example.com 172.16.2.19 [*] CNAME infra.example.com www-pub.prod.fast.io [*] A www-pub.prod.fast.io 54.88.163.167 [*] CNAME integration.example.com staging-shared.example.com [*] A staging-shared.example.com 40.31.164.85 [*] CNAME ir.example.com webfarm-35.q4web.com [*] A webfarm-35.q4web.com 93.191.169.204 [*] CNAME jenkins.example.com pdx-hudson.example.com [*] A pdx-hudson.example.com 172.16.2.19 [*] CNAME jp.example.com example.com [*] A example.com 185.31.17.207 [*] CNAME learn.example.com mc-10186-547559136.us-west-2.elb.amazonaws.com [*] A mc-10186-547559136.us-west-2.elb.amazonaws.com 54.214.4.29 [*] A mc-10186-547559136.us-west-2.elb.amazonaws.com 54.245.242.241 [*] CNAME loghost.example.com nr-chi-util.example.com [*] A nr-chi-util.example.com 10.1.0.18 [*] CNAME login.example.com login-origin.example.com [*] A login-origin.example.com 40.31.164.184 [*] CNAME m.example.com sites.example.com [*] CNAME sites.example.com d.global-ssl.fastly.net [*] CNAME d.global-ssl.fastly.net prod.d.ssl.global.fastlylb.net [*] A prod.d.ssl.global.fastlylb.net 151.101.12.207 [*] CNAME MAIL.example.com ghs.google.com [*] CNAME ghs.google.com ghs.l.google.com [*] A ghs.l.google.com 173.194.220.121 [*] CNAME MAIL.example.com ghs.google.com [*] CNAME ghs.google.com ghs.l.google.com [*] AAAA ghs.l.google.com 2a00:1450:4010:c09::79 [*] CNAME mail.example.com ghs.google.com [*] CNAME ghs.google.com ghs.l.google.com [*] A ghs.l.google.com 173.194.220.121 [*] CNAME mail.example.com ghs.google.com [*] CNAME ghs.google.com ghs.l.google.com [*] AAAA ghs.l.google.com 2a00:1450:4010:c09::79 [*] A matterhorn.example.com 40.31.164.177 [*] CNAME meetme.example.com rpm-origin.example.com [*] A rpm-origin.example.com 40.31.164.155 [*] A minime.example.com 172.16.4.5 [*] A parked.example.com 40.31.164.171 [*] CNAME plugins.example.com prod-plugin-ui.awsdev.nr-ops.net [*] A delb-prod-plugin-ui-1491320217.us-east-1.elb.amazonaws.com 52.4.186.145 [*] A delb-prod-plugin-ui-1491320217.us-east-1.elb.amazonaws.com 52.6.242.165 [*] A delb-prod-plugin-ui-1491320217.us-east-1.elb.amazonaws.com 54.174.166.31 [*] CNAME puppet.example.com nr-chi-boss.example.com [*] A nr-chi-boss.example.com 10.1.0.17 [*] CNAME reports.example.com be-prod-reports.awsdev.nr-ops.net [*] A internal-be-prod-reports-1827401469.us-east-1.elb.amazonaws.com 10.2.6.149 [*] A internal-be-prod-reports-1827401469.us-east-1.elb.amazonaws.com 10.2.10.88 [*] A internal-be-prod-reports-1827401469.us-east-1.elb.amazonaws.com 10.2.15.31 [*] CNAME rpm.example.com rpm-origin.example.com [*] A rpm-origin.example.com 40.31.164.155 [*] CNAME rubicon.example.com chi-rubicon.example.com [*] A chi-rubicon.example.com 40.31.164.196 [*] A sea.example.com 207.224.248.210 [*] A service.example.com 40.31.164.169 [*] CNAME sites.example.com d.global-ssl.fastly.net [*] CNAME d.global-ssl.fastly.net prod.d.ssl.global.fastlylb.net [*] A prod.d.ssl.global.fastlylb.net 151.101.12.207 [*] A staging.example.com 40.31.164.74 [*] A static.example.com 216.27.181.17 [*] CNAME status.example.com 4qjjcrpdj8jh.statuspagessl.com [*] A 4qjjcrpdj8jh.statuspagessl.com 54.148.61.28 [*] A 4qjjcrpdj8jh.statuspagessl.com 52.35.72.202 [*] A 4qjjcrpdj8jh.statuspagessl.com 54.149.249.224 [*] A support.example.com 40.31.164.247 [*] CNAME test.example.com staging-shared.example.com [*] A staging-shared.example.com 40.31.164.85 [*] CNAME TEST.example.com staging-shared.example.com [*] A staging-shared.example.com 40.31.164.85 [*] CNAME test1.example.com staging-shared.example.com [*] A staging-shared.example.com 40.31.164.85 [*] CNAME test2.example.com staging-shared.example.com [*] A staging-shared.example.com 40.31.164.85 [*] CNAME test4.example.com staging-shared.example.com [*] A staging-shared.example.com 40.31.164.85 [*] CNAME test3.example.com staging-shared.example.com [*] A staging-shared.example.com 40.31.164.85 [*] CNAME test5.example.com staging-shared.example.com [*] A staging-shared.example.com 40.31.164.85 [*] CNAME test6.example.com staging-shared.example.com [*] A staging-shared.example.com 40.31.164.85 [*] CNAME test7.example.com staging-shared.example.com [*] A staging-shared.example.com 40.31.164.85 [*] CNAME test8.example.com staging-shared.example.com [*] A staging-shared.example.com 40.31.164.85 [*] A testlink.example.com 207.170.205.185 [*] CNAME tests.example.com chi-hudson.example.com [*] CNAME chi-hudson.example.com chi-prod-jenkins-1.nr-ops.net [*] A chi-prod-jenkins-1.nr-ops.net 10.1.12.133 [*] A timeline.example.com 40.31.164.201 [*] CNAME translate.example.com sites.example.com [*] CNAME sites.example.com d.global-ssl.fastly.net [*] CNAME d.global-ssl.fastly.net prod.d.ssl.global.fastlylb.net [*] A prod.d.ssl.global.fastlylb.net 151.101.36.207 [*] CNAME trust.example.com sites.example.com [*] CNAME sites.example.com d.global-ssl.fastly.net [*] CNAME d.global-ssl.fastly.net prod.d.ssl.global.fastlylb.net [*] A prod.d.ssl.global.fastlylb.net 151.101.36.207 [*] CNAME try.example.com example-ssl.mktoweb.com [*] A example-ssl.mktoweb.com 199.15.213.162 [*] CNAME vcenter.example.com chi-ops-winserv-1.example.com [*] A chi-ops-winserv-1.example.com 10.1.0.51 [*] CNAME www.example.com d.global-ssl.fastly.net [*] CNAME d.global-ssl.fastly.net prod.d.ssl.global.fastlylb.net [*] A prod.d.ssl.global.fastlylb.net 151.101.12.207 [*] CNAME WWW.example.com d.global-ssl.fastly.net [*] CNAME d.global-ssl.fastly.net prod.d.ssl.global.fastlylb.net [*] A prod.d.ssl.global.fastlylb.net 151.101.36.207 [*] A www-origin.example.com 40.31.164.156 [*] A www-staging.example.com 40.31.164.100 [*] A www-test.example.com 40.31.164.104 [*] CNAME yum.example.com download.example.com [*] A download.example.com 40.31.164.159 [+] 208 Records Found [*] Saving records to CSV file: output.csv
Innymi bardzo przydatnymi narzędziami do przeprowadzania tego typu zgadywanek są: subbrute oraz altdns. Przeczytajmy zatem nasz serwis z góry do dołu: część serwerów umieszczona w AWS, blog hostowany w serwisie WPengine, kalendarz i inne rzeczy organizacji biurowej trzymane w Google Apps, pliki statyczne umieszczone na CDN Fastly, forum oparte na Discourse, dział sprzedaży wspiera ToutApp, zgłoszenia klientów obsługiwane są przez Zendesk, a inwestorzy Q4, oprogramowanie jest budowane i testowane za pomocą Jenkins, a serwery Puppetem, status działania poszczególnych usług wyświetla platforma StatusPage, marketing korzysta z Marketo… Wraz z informacjami z revDNS posiadamy już prawie pełny ogląd na architekturę strony internetowej example.com, co z nimi zrobimy zależy od naszej dobrej woli.
5. Wrogie przejęcie:
Rażącym błędem, jaki popełniła firma Example Inc. jest brak oddzielenia stref pomiędzy publiczną, a prywatną adresacją dla wewnętrznych usług. Większość z tych wpisów w ogóle nie powinna być dostępna dla publicznego Internetu. Nawet, jeśli ich hostingodawca usług DNS nie wspiera takiego rozwiązania to można je prosto osiągnąć poprzez własne wewnętrzne serwery DNS, które będą obsługiwać specjalnie do tego wyznaczoną domenę / rekordy i nie będą dostępne z poziomu Internetu. Dlaczego? Ponieważ skuteczny atak DDoS / cache poisoning na DNS nie tylko sparaliżuje działanie serwisu dla zewnętrznych użytkowników, ale także pracę wewnętrznych pracowników, którzy nie uzyskają już odpowiedzi pod jakim adresem IP stoi Windows na serwerze vcenter.example.com.
Jedna rzecz, która wyróżnia większość dzisiejszych serwisów to ich budowa z innych niezależnych usług. Dzisiaj nie musimy martwić się o własny serwer, monitoring, blog, repozytorium kodu. Wszystko to jest dostępne za darmo lub za odpowiednią opłatą – wystarczy tylko wskazać odpowiednią subdomenę domeny naszej firmy na odpowiedni adres, czy to przez rekord CNAME, czy A, aby cieszyć się działającą usługą pod naszą marką. Wraz z rozrostem firmy i zaniedbaniem porządku w rekordach może dojść do następujących scenariuszy:
– Nasza firma rejestruje nową usługę w zewnętrznym serwisie i wskazuje na “obce” serwery subdomenę “marketing“. Wraz z upływem czasu następuje rezygnacja z tego zewnętrznego serwisu, ale nikt z obsługi IT nie usuwa subdomeny z systemu DNS. Konto naszej firmy wygasa. Atakujący w ramach testów odkrywa podatną subdomenę. Zakłada swoje konto w zewnętrznym serwisie o tej samej nazwie, na którą wskazywała nasza subdomena. Przejmuje kontrolę nad kawałkiem naszego serwisu i autentyczną domenę do ataków phishing.
– Nasza firma rejestruje nową usługę w zewnętrznym serwisie i wskazuje na “obce” serwery subdomenę “marketing“. Wraz z upływem czasu następuje rezygnacja z tego zewnętrznego serwisu, ale nikt z obsługi IT nie usuwa subdomeny z systemu DNS. Serwis, na który wskazywała subdomena bankrutuje i znika z sieci. Atakujący w ramach testów odkrywa podatną subdomenę. Rejestruje od nowa domenę, pod którą występował zbankrutowany serwis. Przejmuje kontrolę nad kawałkiem naszego serwisu i autentyczną domenę do wstrzykiwania złośliwego oprogramowania.
Podsumowując – mimo, że jednostkowe testy rekordów DNS mogą być uciążliwe to muszą być one stale przeprowadzane i weryfikowane. Nie tylko dla niewykorzystywanych już usług, ale także literówek i błędach w konfiguracji ujawniających wewnętrzne topologie sieci firmy.
Więcej informacji: DNS Reconnaissance, Hostile Subdomain Takeover
- AADInternals – identyfikacja domen za pomocą usługi Azure AD
- Rekonesans przez listę certyfikatów
- systemd umożliwia na zdalne przejęcie maszyny przez DNS
- 1001 Pen Test oraz Bug Bounty Tips & Tricks #4 – (Sub)domeny w czasie rzeczywistym
- CVE-2023-29383 – nadużywanie polecenia chfn do fałszowania danych z /etc/passwd
Bardzo fajnym narzędziem do tego typu zadań jest również Bluto.