Gdy host ma być tym hostem którym chcemy aby był

nfsec.pl 1 rok temu

C

zasami zachodzi potrzeba pobrania próbki złośliwego systemu / phishingu ze złośliwego serwera, ale nazwa domeny nie jest już rozwiązywalna (została usunięta / zablokowana). Niestety cyberprzestępcy nie zawsze są na tyle niezdarni, iż udostępniają te same artefakty na czystym adresie IP i polecenie:

curl http://212.45.19.19/redline_stealer.exe

zwraca kod 404, ponieważ serwer taki często obsługuje wiele szkodliwych witryn i reaguje na konkretną nazwę domenową. W takim przypadku posiadając historyczne dane DNS o domenie możemy połączyć się z serwerem dzięki narzędzia curl na kilka sposobów. Najstarszą metodą, na której kiedyś opierał się system DNS jest edycja pliku hosts (/etc/hosts w systemach Linux i systemach uniksopodobnych). Dodając na przykład wpis:

212.45.19.19 malware.dev

zatrzymamy rozwiązywanie domeny: malware.dev do adresu IP: 212.45.19.19 na poziomie lokalnego systemu bez konieczności korzystania z zewnętrznego serwera DNS:

agresor@darkstar:~$ curl -v http://malware.dev * Trying 212.45.19.19:80... * Connected to malware.dev (212.45.19.19) port 80 (#0) > GET / HTTP/1.1 > Host: malware.dev

Jednak metoda ta wymaga podnoszenia praw użytkownika do poziomu administratora w celu edycji pliku hosts i ma tę wadę, iż wpływa na wszystkie inne aplikacje w systemie – o konieczności czyszczenia takich wpisów nie wspominając. Drugim sposobem jest manipulacja nagłówkiem Host:. Jest to nagłówek dzięki którego klient HTTP informuje serwer HTTP, z którym rozmawia o jaką stronę prosi, ponieważ zwykle serwer HTTP obsługuje wiele różnych nazw przy użyciu tej samej instancji systemu WWW. Dlatego przekazując zmodyfikowany nagłówek Host: możemy sprawić, iż serwer odpowie zawartością danej witryny, choćby jeżeli faktycznie nie łączyliśmy się z tą nazwą hosta:

agresor@darkstar:~$ curl -v -H "Host: malware.dev" http://212.45.19.19 * Trying 212.45.19.19:80... * Connected to malware.dev (212.45.19.19) port 80 (#0) > GET / HTTP/1.1 > Host: malware.dev

Podczas ustawiania niestandardowego nagłówka Host: i używania ciasteczek curl wyodrębni niestandardową nazwę i użyje jej jako hosta podczas dopasowywania ciasteczek do wysłania. Jednak nagłówek Host: nie wystarczy podczas komunikacji z serwerem po protokole HTTPS. W protokole TLS istnieje osobne pole zwane SNI (ang. Server Name Indication), które pozwala klientowi powiedzieć nazwę serwera, z którym chce rozmawiać klient – curl wyodrębnia tylko nazwę SNI do wysłania z podanego adresu URL dlatego polecenie:

curl -v -H "Host: malware.dev" https://212.45.19.19

zwróci błąd:

curl: (60) SSL: no alternative certificate subject name matches target host name '212.45.19.19'

Nawet jeżeli dodamy parametr -k / --insecure ignorujący niepoprawny certyfikat to i tak serwer powinien odpowiedzieć nam błędem potwierdzającym brak wysłania nagłówka SNI przez curl:

You don't have permission to access this resource. Reason: The client software did not provide a hostname using Server Name Indication (SNI), which is required to access this server.

Jak możemy się domyślić kolejna metoda rozwiązuje nam ten problem. Polega ona na tym, iż samemu podajemy poleceniu curl na jaki adres IP i port ma rozwiązać daną domenę:

agresor@darkstar:~$ curl -v --resolve malware.dev:443:212.45.19.19 https://malware.dev * Added malware.dev:443:212.45.19.19 to DNS cache * Hostname malware.dev was found in DNS cache * Trying 212.45.19.19:443... * Connected to malware.dev (212.45.19.19) port 443 (#0)

Przełącznik --resolve dodaje podany adres domeny do pamięci podręcznej DNS curl. Skutecznie to sprawia (bez dodawania wpisów do pliku hosts), iż narzędzie zachowuje się tak, jakby łączyło się normalnie do domeny, która została rozwiązana przez zewnętrzny serwer DNS. choćby podczas komunikacji HTTPS zostanie uzupełnione pole SNI dla nazwy, ponieważ jest ona obecna w adresie URL, a curl zweryfikuje odpowiedź serwera, aby upewnić się, iż obsługuje on nazwę z adresu URL. Krewną opcji --resolve jest opcja --connect-to. Pozwala ona określić zastępczą nazwę i numer portu, których curl będzie używał „pod maską”, gdy do połączenia zostanie użyta inna, konkretna nazwa i numer portu.

Dla przykładu załóżmy, iż znaleźliśmy pojedynczą stronę o nazwie malware.dev, która z kolei jest faktycznie obsługiwana przez trzy różne skompromitowane serwery HTTP: hub1.old.cms, hub2.old.cms, hub3.old.cms w celu zapewnienia sobie wysokiej dostępności:

agresor@darkstar:~$ host malware.dev malware.dev has address 212.45.19.19 malware.dev has address 212.45.19.20 malware.dev has address 212.45.19.21 agresor@darkstar:~$ host 212.45.19.19 19.19.45.212.in-addr.arpa domain name pointer hub1.old.cms. agresor@darkstar:~$ host 212.45.19.20 20.19.45.212.in-addr.arpa domain name pointer hub2.old.cms. agresor@darkstar:~$ host 212.45.19.21 21.19.45.212.in-addr.arpa domain name pointer hub3.old.cms.

W typowej komunikacji curl rozwiąże domenę na jeden z trzech adresów IP i połączy się do serwera. Jednak jeżeli chcemy wysłać żądanie do jednego konkretnego serwera z zestawu (np. hub2.old.cms) i nie używać jego adresu IP możemy poinstruować curl, aby to zrobił:

agresor@darkstar:~$ curl --connect-to malware.dev:443:hub2.old.cms:443 https://malware.dev * Connecting to hostname: hub2.old.cms * Connecting to port: 443 * Connected to hub2.old.cms (212.45.19.20) port 443 (#0) > GET / HTTP/2 > Host: malware.dev

curl sam rozwiąże nazwę DNS hub2.old.cms i połączy się z danym adresem IP, ale we wszystkich innych sposobach wymienionych wyżej będzie zakładał, iż rozmawia z malware.dev.
Własne serwery DNS:

Kiedy curl zostanie skompilowany ze wsparciem dla biblioteki c-ares dostaje kilka dodatkowych funkcji. Mianowicie, zyskuje możliwość bardziej szczegółowego instruowania z jakich serwerów DNS ma korzystać. Dzięki opcji --dns-servers możemy określić, który dokładnie serwer(y) DNS curl powinien odpytać zamiast tego zdefiniowanego w systemie. Pozwala to na wykorzystanie własnego serwera DNS, który będzie odpowiadał w inny sposób niż wszystkie inne. dzięki --dns-ipv4-addr i --dns-ipv6-addr prosimy narzędzie, aby podczas wykonywania żądań DNS IPv(4|6) wiązał się z konkretnym adresem IP, tak aby żądania DNS pochodziły z tego adresu. Analogicznie opcją --dns-interface możemy poinstruować klienta curl, by używał konkretnego interfejsu sieciowego do swoich żądań DNS.

Więcej informacji: Everything curl, Downloading Samples From Takendown Domains

Idź do oryginalnego materiału