Skanujemy publiczne chmurki
Napisał: Patryk Krawaczyński
18/01/2021 w Pen Test Brak komentarzy. (artykuł nr 767, ilość słów: 1053)
W
iele firm zamiast wystawiać w internecie swoje usługi na przypisanych do nich blokach IP (ASN) w coraz większym stopniu polegają na usługach chmur publicznych, takich jak Amazon AWS, Microsoft Azure czy Google Cloud Platform. Ponieważ infrastruktura chmury publicznej szybko staje się normą, podczas rozpoznawania zasobów danej firmy można stracić wiele obiektów skanując tylko zakresy sieci tej organizacji. Jeśli chcemy osiągnąć szybkie i najczystsze wyniki możemy połączyć ze sobą narzędzia: masscan oraz tls-scan. Oto jak hipotetycznie przeskanować zakres adresów IP i certyfikaty największych dostawców chmury publicznej w celu identyfikacji ich zasobów.
Zakresy adresów IP:
Pierwszym krokiem jest zebranie zakresów adresów IP poszczególnych dostawców. AWS udostępnia zakresy IP w formacie JSON, GCP udostępnia zakresy IP w formacie JSON oraz Azure udostępnia zakresy IP w formacie JSON. Do filtrowania i obrabiania plików JSON w linii poleceń możemy użyć jq, który umożliwi nam wycinanie, filtrowanie mapowanie i przekształcanie danych strukturalnych z taką samą łątwością z jaką sed
, awk
, grep
i ich przyjaciele pozwalają na zabawy z danymi tekstowymi:
wget 'https://ip-ranges.amazonaws.com/ip-ranges.json'
Ponieważ skanowanie portów powinno być wykonywane tylko i wyłącznie za zgodą właściciela adresów IP należy pamiętać, aby podczas tego etapu posiadać klarowny powód oraz cel badań. Unikać taktyk badawczych, które mogą spowodować zakłócenia w skanowanej sieci oraz respektować żądania wykluczenia od operatorów sieci, którzy nie chcą, aby ich systemy były skanowane. Na potrzeby tego przykładu wybraliśmy sieć rządową utrzymywaną w regionie us-gov-*, aby wykryć aktywne hosty Departamentu Obrony Stanów Zjednoczonych (ang. U.S. Department of Defense), który bierze udział w publicznym programie ujawniania luk. Należy mieć na uwadzę, że tylko ułamek tych adresów będzie związany z DoD, ponieważ wiele zasobów federalnych i stanowych jest również hostowanych na AWS – dlatego nie należy głębiej badać adresów IP będących poza zakresem programu, a jeśli znajdziemy jakieś luki w zasobach specyficznych dla DoD – należy przesłać odpowiednie zgłoszenie tego faktu.
cat ip-ranges.json | jq -r \ '.prefixes[] | select(.region|test("^us-gov")).ip_prefix'\ > aws_ip_dod.txt cat aws_ip_dod.txt | sort -u > aws_ip_dod_u.txt
Skanowanie:
Niezależnie jakiego dostawcę chcemy sprawdzić nie ma sensu wyciągać certyfikatów z wszystkich adresów IP, ponieważ nie wszystkie adresy IP posiadają otwartą komunikację na porcie HTTPS. Wstępne odfiltrowanie możemy wykonać na podstawie otwartego portu 443. Bez tego etapu wyciąganie metadanych o certyfikatach SSL będzie bardzo długo trwało, ponieważ będziemy negocjować TLS dla zamkniętych portów. Posiadamy już sieci w formacie CIDR – możemy teraz wykorzystać nmap do obliczenia ilości adresów IP, które zostaną poddane skanowaniu:
nmap -n -sL -iL aws_ip_dod_u.txt | grep 'Nmap done'
Nmap done: 481512 IP addresses (0 hosts up) scanned in 3.92 seconds
Teraz możemy przeskanować te adresy pod względem stanu portu 443 za pomocą masscan
:
masscan -p443 --rate 1000 --connection-timeout 2 -iL aws_ip_dod_u.txt \ -oL aws_ip_dod.out
Starting masscan 1.3.0 (http://bit.ly/14GZzcT) at 2021-01-16 22:16:35 GMT -- forced options: -sS -Pn -n --randomize-hosts -v --send-eth Initiating SYN Stealth Scan Scanning 480080 hosts [1 port/host]
Ponownie “czyścimy” dane wyjściowe z programu masscan
:
cat aws_ip_dod.out | col4 | awk NF | sort -u > ssl_443.txt
Nasza lista adresów IP jest gotowa. Teraz możemy skupić się na ekstrakcji metainformacji z certyfikatów SSL.
Certyfikaty SSL:
Zaletą tls-scan
jest to że może jednocześnie skanować tysiące hostów w celu zebrania ich certyfikatów SSL i zapisaniu danych w formacie JSON. W pakiecie binarnym, który pobraliśmy w celu instalacji tls-scan
dołączony jest plik ca-bundle.crt (zawierający certyfikaty główne i pośrednie). Jeśli takowy nie istnieje możemy go pobrać ze strony narzędzia curl. Ilość współbieżnych procesów (ang. concurrency) powinniśmy dostosować wedle możliwości swojego systemu:
cat ssl_443.txt | tls-scan --cacert=ca-bundle.crt --concurrency=100 --timeout=2 \ -o tls-scan.json 2>/dev/null
elapsed-time: 20 secs | status: 1235/1235 | tls-handshake: 1062 | target: XX.XXX.XX.XXX
Teraz możemy szybko przefiltrować plik wyjściowy JSON za pomocą jq
, aby wyświetlił tylko interesujące nas domeny. Warto wspomnieć, aby nie tylko szukać po głównej domenie certyfikatu, ale także po SAN (ang. Subject Alternative Name) – opcji, dzięki której certyfikat może chronić wiele nazw domenowych na jednym adresie IP. Pozwala to “za darmo” dostać inne domeny, pod którymi możemy wyświetlić inne webaplikacje na tym samym (lub innym) adresie IP (hosty wirtualne), a które mogą być podatne na różne ataki.
cat tls-scan.json | jq --slurp -r '.[].certificateChain[].subjectCN' |\ grep '\.mil$' cat tls-scan.json | jq --slurp -r '.[].certificateChain[].subjectAltName' |\ grep '\.mil$'
Wersja, aby utworzyć listę w formacie: IP domena(y) – będzie miała postać:
cat tls-scan.json | jq --slurp -r '.[] | select(.certificateChain[].subject |\ test("\\.mil\\W")) | .ip + " " + .certificateChain[].subjectCN' | grep '\.mil' cat tls-scan.json | jq --slurp -r '.[] | select(.certificateChain[].subject |\ test("\\.mil\\W")) | .ip + " " + .certificateChain[].subjectAltName' | grep '\.mil'
Inne chmurki i mniejsi operatorzy
Ta metologoia działa również z zakresami adresów IP platformy Microsoft (US Government Cloud ma również dedykowane zakresy adresów IP na platformie Azure), czy Google. Ale nie musimy ograniczać się tylko do dużych operatorów chmur publicznych. Jest wiele innych firm: Oracle, IBM, Alibaba, Salesforce, DigitalOcean, Rackspace, Linode itd., które również stanowią bogate źródło wiedzy. Co więcej, jeśli skanujemy takie adresy IP i w ich certyfikatach wyskoczy domena, która od strony rekordów DNS jest zabezpieczona przez WAF/Proxy lub CDN (ang. Content Delivery Network) to oznacza, to że właśnie odnaleźliśmy źródłowy adres IP serwisu. Powinien on być osiągalny na danym porcie tylko dla serwerów danego dostawcy ochrony, a nie publicznie, ponieważ podstawiając odpowiedni nagłówek HTTP możemy odwoływać się do danej domeny z pominięciem systemu bezpieczeństwa.
Alternatywa dla samotnych łowów:
Sam Erb (- Tak. Ten sam od DNS) zrobił małą microusługę BufferOver, gdzie za darmo udostępnia różne dane DNS oraz TLS. Skaner odświeża dane, co tydzień i można go odpytywać za pomocą parametru q na publicznym punkcie końcowym: tls.bufferover.run (lub dla danych DNS: dns.bufferover.run):
curl 'https://tls.bufferover.run/dns?q=.nfsec.pl' 2>/dev/null | jq .Results curl 'https://dns.bufferover.run/dns?q=.nfsec.pl' 2>/dev/null | jq .FDNS_A
Więcej informacji: Sam Erb – Hunting Certificates and Servers – DEF CON 27 Packet Hacking Village [PDF], How To Scan AWS’s Entire IP Range to Recon SSL Certificates