JS Portscanning + DNS Rebinding
DNS Rebinding polega na podmianie adresu IP domeny pomiędzy kolejnymi żądaniami skierowanymi do niej. W ten sposób można uzyskać dostęp na przykład do zasobów sieci lokalnej, w której znajduje się ofiara. W połączeniu z javascriptowym skanowaniem portów i fingerprintingiem aplikacji pozwala stworzyć ciekawe scenariusze ataku. Przykład:
- użytkownik łączy się ze stroną http://lukasz.pilorz.net z sieci swojej firmy (w sieci lokalnej ma dostęp do aplikacji phpMyAdmin niedostępnej z zewnątrz, i w związku z tym niechronionej hasłem)
- JavaScript sprawdza czy na którymś hoście w sieci lokalnej otwarty jest port 80 (może to być również localhost), a dla otwartych portów próbuje znaleźć popularne aplikacje (ze względu na same-origin JS nie ma dostępu read/write, ale może próbować np. wczytać obrazki ze znanych ścieżek)
- po znalezieniu phpMyAdmina, JS w ukrytej ramce otwiera skrypt z domeny dnsrebinding.securityexploits.com
- skrypt PHP na dnsrebinding.securityexploits.com zmienia wpis DNS dla tej domeny na adres przekazany mu w parametrze (np. 127.0.0.1)
- JS na dnsrebinding.securityexploits.com wykorzystuje LiveConnect do otwarcia socketa do tej samej domeny, ale IP jest już zmienione na adres sieci lokalnej
- JS ma teraz pełny dostęp read/write do portu 80 (np. na 127.0.0.1), może dowolnie kształtować żądania HTTP (metody, nagłówki, treść)
- JS wczytuje token potrzebny do wykonania ataku CSRF na phpMyAdmina
- JS ukryty na http://lukasz.pilorz.net może teraz wykonywać dowolne zapytania SQL na phpMyAdminie w sieci lokalnej ofiary
Oczywiście skrypt może posiadać sygnatury dla większej ilości aplikacji niż tylko phpMyAdmin, i w ten sposób zwiększać szanse powodzenia ataku. Poza CSRF, skaner mógłby też po prostu wczytywać zawartość niechronionych stron w sieci lokalnej i wysyłać na zewnętrzny serwer (we wcześniejszym wyszukaniu odpowiednich adresów może pomóc Fierce). Inne zastosowanie to ominięcie firewalli i lokalny dostęp na przykład do portu 139.
Powyższy scenariusz bazuje na ataku DNS rebinding z wykorzystaniem LiveConnect - ta metoda została już zablokowana, dlatego mogę opublikować praktyczny przykład:
http://lukasz.pilorz.net/testy/dnsrebinding/scanner.phps - skaner w JS
http://lukasz.pilorz.net/testy/dnsrebinding/phpmyadmin_exec.phps - atak DNS rebinding na phpMyAdmina
Więcej informacji można znaleźć w tekstach na których bazowałem tworząc powyższy skrypt:
- Anti-DNS Pinning + Java in JavaScript
- Using Java in anti DNS-pinning attacks
- JavaScript/HTML Portscanning and HTTP Auth
- Bruteforcing HTTP Auth in Firefox with JavaScript
- Hacking Intranets Through Web Interfaces
- AttackAPI
Kolejna notka (czwarta część cyklu o testach, dotycząca ataków na mechanizmy logowania i zmiany hasła) pojawi się dopiero w Nowym Roku.
17 December 2007 22:17
Hmm, bardzo pouczający przykład. Jak już mówiłem, Web 2.0 nie przyniósł nowych ataków - tylko uczynił te istniejące jeszcze bardziej groźnymi.
Z niecierpliwością czekam na 4 część. Jeśli będę mógł jakoś pomóc, to z chęcią się przyłącze - bo teraz jestem niczym wędrowiec bez domu.