htrace.sh
09 Jan 2019
debugging http https profiling projects
Podczas codziennej pracy zawsze brakowało mi narzędzia, dzięki któremu mógłbym w prosty i szybki sposób przetestować konfigurację wystawianych publicznie serwisów. Umiejętność użycia takich narzędzi jak curl
czy openssl
jest według mnie bardzo ważna, jednak jak to zwykle z konsolowymi narzędziami bywa, dostarczają one mnóstwo opcji, które ciężko zapamiętać.
Wprowadzenie #
htrace.sh
jest narzędziem powłoki wspomagającym profilowanie i debug’owanie aplikacji działających na protokołach HTTP/HTTPS. Jest to także prosty wrapper obsługujący zewnętrzne narzędzia takie jak: testssl.sh
, ssllabs
, mozilla-observatory
czy skrypty skanera nmap
. Repozytorium projektu znajduje się tutaj.
Jego głównym założeniem projektowym była możliwość wykrycia wszystkich błędów związanych z przekierowaniami. Niby nic szczególnego jednak przy jakichkolwiek wdrożeniach czy choćby zmianach takich jak ustawienie list kontroli dostępu (IP ACL) weryfikacja była niekiedy kłopotliwa.
Potrzebowałem także przejrzysty obraz tego, co się dzieje z danym request’em oraz to, w jaki sposób jest on interpretowany przez serwery HTTP.
Funkcje #
Po pewnym czasie stwierdziłem, że warto byłoby dodać kilka innych ciekawych oraz ważnych funkcji dotyczących:
- sprawdzania poprawności konfiguracji domeny (niezależnie co stosujemy: standalone-web-server, czy reverse proxy)
- sprawdzania podstawowych oraz rozszerzonych informacji na temat protokołów HTTP, oraz HTTPS:
- statusy zwracanych odpowiedzi
- informacje o wykorzystanym protokole
- geolokalizację
- analizy czasu odpowiedzi dla każdego wysłanego zapytania
- sprawdzania poprawności przekierowań
- przeglądania i weryfikowania zapytań oraz odpowiedzi
- omijania pamięci podręcznej serwerów proxy
- możliwości ustawienia metody dla danego zapytania
- możliwości dodania własnych nagłówków
- badania poprawności konfiguracji protokołów SSL/TLS czy chroniących domenę certyfikatów
- możliwość ustawienia odpowiedniej wersji TLS
- możliwość ustawienia szyfrów dla komunikacji SSL/TLS
- wykorzystania zewnętrznych narzędzi takich jak:
mozilla-observatory
- wersja konsolowa aplikacji Mozilla Observatorysslabs-scan
- wersja konsolowa aplikacji SSL Labsmixed-content-scan
- pozwala na sprawdzenie, czy zasoby ładowane są przez HTTPStestssl.sh
- szwajcarski scyzoryk jeżeli chodzi o debug’owanie SSL/TLSnmap nse
- zestaw skryptów związanych z HTTP, HTTPS, SSL czy DNSwafw00f
- narzędzie do testowania WAF’ówSubFinder
- narzędzie pozwalające badać domeny i ich subdomenyNghttp2
- narzędzie do testowania protokołu HTTP/2
Przykłady #
Więcej przykładów znajduje się na Wiki projektu w rozdziale One liners.
Weryfikowanie przekierowań #
Jeżeli chcemy sprawdzić przekierowania, np. czy domena www.badssl.com kieruje na badssl.com:
❯ htrace.sh -u https://www.badssl.com --hide-src-ip
htrace.sh v1.1.7 (openssl 1.1.1d : ok)
URI: https://www.badssl.com
» request-method: GET
» user-agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
req time_total time_connect local_socket via remote_socket geo proto ver code next_hop
--- ---------- ------------ ------------ --- ------------- --- ----- --- ---- --------
• 1 0.605406 0.605406 xxx.xxx.xxx.xxx:65158 xxx.xxx.xxx.xxx 104.154.89.105:443 US https 1.1 301 https://badssl.com/
• 2 1.211578 0.606172 xxx.xxx.xxx.xxx:65164 xxx.xxx.xxx.xxx 104.154.89.105:443 US https 1.1 200
Podobnie, jeśli zależy nam na sprawdzeniu przekierowań między protokołami tj. z HTTP na HTTPS.
Podgląd nagłówków odpowiedzi #
Kolejną z opcji jest podgląd nagłówków serwowanych w odpowiedzi:
❯ htrace.sh -u http://badssl.com --headers --hide-src-ip
htrace.sh v1.1.7 (openssl 1.1.1d : ok)
URI: http://badssl.com
» request-method: GET
» user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134
req time_total time_connect local_socket via remote_socket geo proto ver code next_hop
--- ---------- ------------ ------------ --- ------------- --- ----- --- ---- --------
• 1 0.282043 0.282043 xxx.xxx.xxx.xxx:21592 xxx.xxx.xxx.xxx 104.154.89.105:80 US http 1.1 301 https://badssl.com/
› HTTP/1.1 301 Moved Permanently
› Server: nginx/1.10.3 (Ubuntu)
› Date: Mon, 30 Dec 2019 12:13:37 GMT
› Content-Type: text/html
› Content-Length: 194
› Connection: keep-alive
› Location: https://badssl.com/
req time_total time_connect local_socket via remote_socket geo proto ver code next_hop
--- ---------- ------------ ------------ --- ------------- --- ----- --- ---- --------
• 2 0.851682 0.569639 xxx.xxx.xxx.xxx:65174 xxx.xxx.xxx.xxx 104.154.89.105:443 US https 1.1 200
› HTTP/1.1 200 OK
› Server: nginx/1.10.3 (Ubuntu)
› Date: Mon, 30 Dec 2019 12:13:38 GMT
› Content-Type: text/html
› Last-Modified: Mon, 16 Dec 2019 19:42:34 GMT
› Transfer-Encoding: chunked
› Connection: keep-alive
› ETag: W/"5df7de2a-2e05"
› Cache-Control: no-store
› Content-Encoding: gzip
Podgląd konfiguracji SSL/TLS #
Następnie możemy podejrzeć konfigurację SSL/TLS oraz wyświetlić podstawowe informacje na temat certyfikatów chroniących domenę:
❯ htrace.sh -u http://badssl.com --ssl --hide-src-ip
htrace.sh v1.1.7 (openssl 1.1.1d : ok)
URI: http://badssl.com
» request-method: GET
» user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36
req time_total time_connect local_socket via remote_socket geo proto ver code next_hop
--- ---------- ------------ ------------ --- ------------- --- ----- --- ---- --------
• 1 0.285111 0.285111 xxx.xxx.xxx.xxx:21608 xxx.xxx.xxx.xxx 104.154.89.105:80 US http 1.1 301 https://badssl.com/
ssl: off
• 2 0.847384 0.562273 xxx.xxx.xxx.xxx:65190 xxx.xxx.xxx.xxx 104.154.89.105:443 US https 1.1 200
ssl: on, version(TLSv1.2), cipher(ECDHE-RSA-AES128-GCM-SHA256), temp_key(ECDH,P-256,256bits)
public-key(2048 bit), signature(sha256WithRSAEncryption)
date: Mar 18 00:00:00 2017 GMT / Mar 25 12:00:00 2020 GMT (85 days to expired)
issuer: DigiCert SHA2 Secure Server CA (DigiCert Inc)
owner: Lucas Garron
cn: *.badssl.com
san: *.badssl.com badssl.com
sni: not match
validity: match
chain of trust:
└─0:*.badssl.com ★ ✓
├ DigiCert SHA2 Secure Server CA
└─1:DigiCert SHA2 Secure Server CA ✓
├ DigiCert Global Root CA
└─2:DigiCert Global Root CA ✓ ⊙
└ DigiCert Global Root CA
verification: ok