JS Portscanning + DNS Rebinding

Łukasz Pilorz, 15 December 2007

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:

Kolejna notka (czwarta część cyklu o testach, dotycząca ataków na mechanizmy logowania i zmiany hasła) pojawi się dopiero w Nowym Roku.