Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
В этой статье мы разберемся, по каким признакам можно обнаружить попытки вторжения злоумышленника в беспроводные сети. Мы научимся выявлять все актуальные атаки на Wi-Fi, лишь прослушивая радиоэфир, ведь почти у каждой из них есть свои характерные особенности.
В первой половине статьи речь пойдет об атаках, направленных на точки доступа, а во второй — на клиентов. Предположим, что хакер не сумел проникнуть в твою инфраструктуру из интернета, не начал развивать атаки уже внутри на уровне сети и не сумел захватить Active Directory. Но расслабляться все равно рано: если злоумышленник находится в зоне действия беспроводных сетей, он может провести физическую атаку. Беспроводные сети — это первое, с чем столкнется внешний нарушитель, еще не успевший реализовать другие техники, но способный подобраться к твоему офису на близкое расстояние. Не стоит недооценивать эту поверхность атак, куда более перспективную для достаточно замотивированного внешнего злоумышленника, нежели хорошо защищенный периметр в интернете.
Если говорить о защите беспроводных сетей, то в ИБ обычно принято лишь давать рекомендации по безопасной настройке, в то время как сами атаки считаются достаточно бесшумными. Несмотря на то что определенные решения Wireless IDS существуют, большая часть из них — это академические поделки. Получается достаточно интересная ситуация: мы имеем два периметра — один в цифровом пространстве, защищенный всяческими WAF’ами, SOC’ами и прочими IDS/IPS, второй в реальном мире — это беспроводные сети, которые почти всегда выходят за контролируемую зону и при этом никак толком не охраняются.
В этой статье мы научимся чувствовать «тонкие энергии» и выявлять все актуальные атаки на Wi-Fi, прослушивая радиоэфир. Все, что нам потребуется, — это обычная сетевая карта Wi-Fi и режим монитора, фиксирующий каждый беспроводной пакет. В итоге мы сделаем ни много ни мало беспроводной антивирус (Wireless IDS).
Только представь удивление нападающего, если он не просто не сможет пробить твой периметр через беспроводные сети, а еще и окажется пойманным при попытке атаки.
Начнем с самой распространенной и простой атаки — деаутентификации, ведь знают про эту атаку, пожалуй, все хакеры. Атака применяется на сети WPA PSK (самые распространенные сегодня) и заключается в одновременном отключении точки доступа и клиентов друг от друга. Достигается это за счет отправки специальных пакетов в обе стороны от имени и точки доступа, и клиентов. Это приводит к тому, что клиент, на деле не собиравшийся отключаться от точки доступа, повторно отправляет хеш пароля (handshake) во втором сообщении EAPOL.
Последовательность отправки пакетов после деаутентификации WPA PSK
Для хакера handshake представляет большой интерес, ведь с его помощью он сможет выполнить атаку подбора пароля по словарю на достаточно высоких скоростях (миллионы в секунду).
Атаку деаутентификации нельзя назвать такой уж бесшумной, ведь при ее проведении страдают клиенты. У пользователей беспроводной сети будет отваливаться подключение. Впрочем, далеко не каждый распознает в этом именно факт атаки, к тому же отключение может длиться крайне непродолжительное время. И заявка о проблемах с Wi-Fi пойдет скорее в отдел эксплуатации, чем в отдел безопасности. Однако, прослушивая радиоэфир, мы легко можем выявлять такие атаки по отправке пакетов деаутентификации сразу от двух сторон:
defence/wifi/deauth.py#!/usr/bin/python3from scapy.all import *from sys import argvfrom os import systemiface = argv[1]conf.verb = 0alerts = []def alert(src, dst, signal, essid): if src in alerts and dst in alerts: return print(f'[!] WPA handshake deauth detected: "{essid}" {src} <-x-> {dst} {signal}dBm') system("zenity --warning --title='PMKID gathering detected' --text='WPA handshake deauth detected' &") #system("echo 'WPA handshake deauth detected' | festival --tts --language english") alerts.append(src) alerts.append(dst)aps = {}deauths = {}def parse_raw_80211(p): signal = int(p[RadioTap].dBm_AntSignal or 0) if hasattr(p[RadioTap], "dBm_AntSignal") else 0 freq = p[RadioTap].ChannelFrequency if hasattr(p[RadioTap], "ChannelFrequency") else 0 if Dot11Beacon in p: # Beacon ap = p[Dot11].addr2 essid = str(p[Dot11Elt].info, "utf-8") if not ap in aps: aps[ap] = {"essid": essid} if Dot11Deauth in p: ap = p[Dot11].addr3 src = p[Dot11].addr2 dst = p[Dot11].addr1 if ap == src: print(f"[*] deauth {src} -> {dst}") elif ap == dst: print(f"[*] deauth {dst} <- {src}") deauths[src] = dst if deauths.get(dst) == src: alert(src, dst, signal, aps.get(ap,{}).get("essid"))sniff(iface=iface, prn=parse_raw_80211, store=0)
Хакер заходит в кафе неподалеку и запускает деаутентификацию, чтобы поймать хеши и потом подобрать пароль к ним.
Хакер проводит атаку деаутентификации и захвата handshake
А мы сразу же видим его активность.
Детект атаки деаутентификации
Уровень сигнала позволит нам даже понять, насколько близко подобрался к нам хакер: -30dBm означает, что он фактически сидит напротив нас.
Для покрытия большой территории корпоративные беспроводные сети часто используют множество точек доступа с идентичным именем. Это обеспечивает бесшовное переключение для сотрудников, когда те переходят из зоны обслуживания одной точки доступа в другую. На таких точках доступа при аутентификации в первом сообщении EAPOL M1 часто содержится хеш (PMKID), практически такой же, как handshake.
Последовательность отправки пакетов для PMKID
Тут примечательно то, что хеш передается самой точкой доступа, что делает возможным захват хеша и подбор пароля без взаимодействия с клиентами.
Хакеры и пентестеры очень любят эту атаку еще и за то, что она проводится достаточно быстро и бесшумно и не приводит к негативным последствиям. Однако в ее реализации есть одна особенность, которая поможет нам выявить эту атаку.
При любой попытке аутентификации на точке доступа WPA PSK клиент всегда отправляет пакет EAPOL M2, услышав M1.
Последовательность отправки пакетов легитимным клиентом при аутентификации WPA PSK
И это нормальное поведение. Для хакера попытка захвата PMKID подобным образом приведет к нежелательному захвату half-handshake (EAPOL M2). И некоторые хакерские утилиты (например, Aircrack-ng) не умеют работать с PMKID (EAPOL M1) при захваченном handshake (EAPOL M2). Поэтому специализированное хакерское ПО (скажем, hcxdumptool или bettercap) для захвата PMKID ведет себя нехарактерно для типичного клиента, то есть не отправляет M2 после подключения к точке доступа WPA PSK.
Последовательность отправки пакетов хакерским ПО при захвате PMKID
Именно тут мы и можем поймать неуловимого хакера:
defence/wifi/pmkid.py#!/usr/bin/python3from scapy.all import *from threading import Threadfrom time import sleepfrom sys import argvfrom os import systemiface = argv[1]conf.verb = 0alerts = []def alert(client, essid): global aps, clients if client in alerts and essid in alerts: return print(f'[!] PMKID gathering detected: {client} {clients.get(client,{}).get("signal","-")}dBm to {essid}') system("zenity --warning --title='PMKID gathering detected' --text='PMKID gathering detected' &") #system("echo 'PMKID gathering detected' | festival --tts --language english") alerts.append(client) alerts.append(essid)aps = {}clients = {}def parse_raw_80211(p): signal = int(p[RadioTap].dBm_AntSignal or 0) if hasattr(p[RadioTap], "dBm_AntSignal") else 0 freq = p[RadioTap].ChannelFrequency if hasattr(p[RadioTap], "ChannelFrequency") else 0 if Dot11Beacon in p: # Beacon ap = p[Dot11].addr2 essid = str(p[Dot11Elt].info, "utf-8") if not ap in aps: aps[ap] = {"essid": essid, "m1":set(), "m2": set()} elif Dot11AssoReq in p: # Association req print("assoc %s -> %s" % (p[Dot11].addr2, p[Dot11].addr3)) clients[p[Dot11].addr2] = {"signal": signal} elif EAPOL in p and p[Dot11].addr3 in aps: #print("EAPOL") ap = p[Dot11].addr3 if p[Dot11].addr2 == ap: aps[ap]["m1"].add(p[Dot11].addr1) print('M1 %s <- %s' % (p[Dot11].addr1, ap)) elif p[Dot11].addr1 == ap: aps[ap]["m2"].add(p[Dot11].addr2) print('M2 %s -> %s' % (p[Dot11].addr1, ap)) #print(aps[ap])def analyze(): while True: for ap in aps.copy(): for client in aps[ap]["m1"] - aps[ap]["m2"]: alert(client, aps[ap]["essid"]) sleep(1)Thread(target=analyze, args=()).start()sniff(iface=iface, prn=parse_raw_80211, store=0)
Источник: xakep.ru