1001 Pen Test oraz Bug Bounty Tips & Tricks #6 – Korelacja czasowa ważności certyfikatu

nfsec.pl 2 lat temu

W

iele nowoczesnych serwisów internetowych stosuje automatyczne wydawanie i odnawianie certyfikatów TLS. Dla firm dostępne są usługi komercyjnych wystawców SSL. Dla wszystkich innych dostępne są bezpłatne usługi, takie jak Let’s Encrypt i ZeroSSL. Jednak bardzo często popełniany jest błąd w sposobie w jaki konfiguruje się wdrożenie darmowych wersji certyfikatów TLS. Pozwala on każdemu odkryć prawie wszystkie nazwy domen i subdomen używanych przez ten sam serwer webowy. Jak wiemy, istnieje takie coś jak Certyficate Transparency (CT), czyli internetowy standard bezpieczeństwa służący do monitorowania i audytu wystawiania certyfikatów TLS. Tworzy on system logów publicznych, które służą do rejestrowania wszystkich certyfikatów wydawanych przez publicznie zaufane urzędy certyfikacji (CA). Do przeszukiwania dzienników CT możemy używać serwisów: crt.sh, certstream, a także Censys, który również pozwala na przeszukiwanie wyników skanowania certyfikatów w internecie.

Wróćmy do wspomnianego błędu. Bardzo często certyfikaty Let’s Encrypt są odnawiane poprzez polecenie certbot zapisane w daemonie cron:

# /etc/crontab 37 13 */07 * * certbot -q renew --post-hook "systemctl reload nginx"

Taka konfiguracja oznacza, iż wszystkie certyfikaty domen obsługiwane przez certbota na danym serwerze zostaną odnowione w tym samym czasie* (z sekundowymi różnicami wykonania tej operacji). Dlatego pobierając znacznik czasowy ważności certyfikatu dla jednej domeny możemy odkryć wszystkie inne utrzymywane na serwerze poprzez korelację czasową ważności innych certyfikatów. Spójrzmy jak to działa w praktyce dla prostego przykładu odkrycia wszystkich subdomen wybranej domeny. Pobieramy znacznik czasowy naszego celu:

echo | openssl s_client -servername nfsec.pl \ -connect nfsec.pl:443 | openssl x509 -noout -dates depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1 verify return:1 depth=1 C = US, O = Let's Encrypt, CN = R3 verify return:1 depth=0 CN = nfsec.pl verify return:1 DONE notBefore=Oct 1 23:00:15 2022 GMT notAfter=Dec 30 23:00:14 2022 GMT

Sprawdzimy teraz w wyszukiwarce Censys jakie inne certyfikaty zostały wydane w minucie otaczającej ten znacznik i są subdomenami testowanej domeny:

parsed.validity.start: [2022-10-01T23\:00\:00Z TO 2022-10-01T23\:00\:59Z] and parsed.subject.common_name: /.*nfsec\.pl/

Wyniki zwrócone przez wyszukiwarkę potwierdzają błąd konfiguracji:

Certificates Page: 1/2 Results: 36 Time: 40451ms Query Plan: expanded CN=panel.nfsec.pl R3 2022-10-01 – 2022-12-30 panel.nfsec.pl parsed.subject.common_name: panel.nfsec.pl (Validity 2022-10-01 23:00:11 to 2022-12-30 23:00:10 (89 days, 23:59:59)) CN=31337.nfsec.pl R3 2022-10-01 – 2022-12-30 31337.nfsec.pl parsed.subject.common_name: 31337.nfsec.pl (Validity 2022-10-01 23:00:12 to 2022-12-30 23:00:11 (89 days, 23:59:59)) CN=api.nfsec.pl R3 2022-10-01 – 2022-12-30 api.nfsec.pl parsed.subject.common_name: api.nfsec.pl (Validity 2022-10-01 23:00:13 to 2022-12-30 23:00:12 (89 days, 23:59:59)) CN=cache.nfsec.pl R3 2022-10-01 – 2022-12-30 cache.nfsec.pl parsed.subject.common_name: cache.nfsec.pl (Validity 2022-10-01 23:00:12 to 2022-12-30 23:00:11 (89 days, 23:59:59)) ...

Polecenie odświeżające wiele certyfikatów jednocześnie pozwoliło je skorelować czasowo i wyfiltrować na podstawie przynależności do domeny nfsec.pl. W analogiczny sposób możemy szukać zupełnie innych od siebie domen drugiego poziomu. Na przykład jeżeli cyberprzestępcy hostują swoje witryny internetowe dzięki systemu do hostingu takiego jak: Plesk, cPanel lub CyberPanel to istnieje duże prawdopodobieństwo, iż wystawią i odnowią zaufane certyfikaty jednocześnie dla wszystkich stron internetowych. Dlatego posiadając znacznik czasowy ważności certyfikatu dla jednej szkodliwej domeny możemy wokół jej sekund poszukać innych, których jeszcze nie znamy, a będą też wskazywały na ten sam adres IP serwera. Co interesujące wiele komercyjnych certyfikatów SSL posiada ustawiony swój czas ważności na wartość godzinową: 00:00:00:

Validity Not Before: Apr 4 00:00:00 2022 GMT Not After : Apr 4 23:59:59 2023 GMT Subject: commonName = nfsec.pl

W takim przypadku możemy skupić się na sygnaturze czasowej podpisanego certyfikatu:

echo | openssl s_client -servername nfsec.pl -connect nfsec.pl:443 | openssl x509 -text X509v3 Subject Alternative Name: DNS:nfsec.pl, DNS:www.nfsec.pl CT Precertificate SCTs: Signed Certificate Timestamp: Version : v1 (0x0) Log ID : AD:F7:BE:FA:7C:FF:10:C8:8B:9D:3D:9C:1E:3E:18:6A: B4:67:29:5D:CF:B1:0C:24:CA:85:86:34:EB:DC:82:8A Timestamp : Apr 4 22:45:30.103 2022 GMT Extensions: none Signature : ecdsa-with-SHA256 30:45:02:20:23:91:93:AE:92:61:02:FE:65:DF:68:B8: B7:BA:DF:F1:C5:12:6B:30:09:1C:DE:CD:13:32:8D:B3: 19:F0:26:84:02:21:00:CD:68:7B:B7:78:66:30:CD:DB: 1D:99:77:22:7F:F5:5D:23:CF:B6:CF:1B:5D:9B:A3:02: A8:1E:51:14:39:8C:24 Signed Certificate Timestamp: Version : v1 (0x0) Log ID : 7A:32:8C:54:D8:B7:2D:B6:20:EA:38:E0:52:1E:E9:84: 16:70:32:13:85:4D:3B:D2:2B:C1:3A:57:A3:52:EB:52 Timestamp : Apr 4 22:45:30.116 2022 GMT Extensions: none Signature : ecdsa-with-SHA256 30:45:02:21:00:98:02:E0:49:0A:73:74:B9:90:33:24: 5D:AE:8D:18:3A:2F:C5:4A:3B:97:B2:02:7F:A0:6D:D2: 84:4E:A3:17:7B:02:20:72:A5:B5:B9:29:C8:21:DD:39: 66:2D:51:01:48:E1:52:0F:F9:59:45:0C:54:55:67:09: 74:25:EF:3D:C7:9B:D0 Signed Certificate Timestamp: Version : v1 (0x0) Log ID : E8:3E:D0:DA:3E:F5:06:35:32:E7:57:28:BC:89:6B:C9: 03:D3:CB:D1:11:6B:EC:EB:69:E1:77:7D:6D:06:BD:6E Timestamp : Apr 4 22:45:30.072 2022 GMT Extensions: none Signature : ecdsa-with-SHA256 30:45:02:20:1D:90:9D:8E:AA:4A:ED:BB:1D:EF:0D:71: 80:9B:83:69:6F:D7:02:9F:49:24:8C:EA:36:F9:64:58: 47:EB:F6:2B:02:21:00:D1:55:15:0D:5F:1F:2D:2B:BD: 01:F5:13:4F:16:69:34:69:DF:17:81:C0:BE:E8:2C:F2: 7A:00:0C:2A:86:E6:91

W wyszukiwarce Censys będą to atrybuty dodania do konkretnych serwerów CT:

ct.google_xenon_2023.added_to_ct_at 2022-04-04T22:45:30.103Z ct.cloudflare_nimbus_2023.added_to_ct_at 2022-04-04T22:45:30.116Z ct.google_argon_2023.added_to_ct_at 2022-04-04T22:45:30.072Z

Innym wyznacznikiem sugerującym, iż domeny mogą mieć coś wspólnego ze sobą to dość bliskie siebie numery identyfikatorów (ID) w serwisie crt.sh.

Więcej informacji: Discovering Domains via a Time-Correlation Attack on Certificate Transparency, How to query the world’s largest repository of public X.509 certificates, What Is an SSL Certificate Chain & How Does It Work?

Idź do oryginalnego materiału