Статья Детектор деаутентификации (диссоциации) клиентов. Часть 2

Введение:
По многочисленным просьбам “трудящихся” публикую 2-ю часть “марлезонского балета”. Сегодня мы продолжим исследовать одну из разновидностей атак на сети, а именно - Деаутентификация(диссоциация) клиентов сети(Dos).
Как я говорил ранее, во-второй части мы напишем небольшой инструмент Detect Deauth, который будет делать следующее: обнаруживать атаку, определять на какую сеть идет атака(BSSID), на какое именно устройство(Mac) и какие из 2-х инструментов использует злоумышленник(Airgeddon-ng или MDK3).

1547887702967.png

Кто не прочитал первую статью, прощу сначала ознакомится с ней: Детектор деаутентификации (диссоциации) клиентов. Часть 1.
Что у нас должно получиться:

1547892340586.png


Теоретический материал и подготовка.
Что такое Атака деаутентификации?
Атака деаутентификации - это тип атаки, нацеленный на обмен данными между маршрутизатором и устройством.
Атака деаутентификации не является какой-то особой уязвимостью ошибки. Это созданный протокол, который используется в реальных приложениях.
Атака деаутентификации использует фрейм деаутентификации . Этот кадр, отправленный с маршрутизатора на устройство, заставляет устройство отключаться. В техническом плане это называется:

«Санкционированная техника информирования посторонних станций о том, что они отключены от сети»

Возможно ли защититься от данной угрозы?
Атака деаутентификации - это одна из проблем со стандартом 802.11i. Кадры деаутентификации, как и все другие кадры управления 802.11, не шифруются.
Как мы заметили, любой может создать кадры деаутентификации или любой другой фрейм управления.
802.11w был реализован для решения этой проблемы, позволяя создавать защищенные кадры управления (PMF). Если устройство требует PMF, но получает незапрошенный кадр управления (например, деаутентификацию), оно может его игнорировать. Так что возможность защиты имеется и это не может не радовать.

Подготавливаем сетевую карту:
Для тестов нам необходимо перевести нашу карту в режим мониторинга(Monitor Mode).
Во-первых, нам нужно настроить нашу беспроводную карту на правильный канал, который мы хотим отслеживать(Можно слушать на любом канале). В Linux мы можем сделать это с помощью следующих команд после первоначального запуска ifconfig или ip a, чтобы найти имя нашего сетевого интерфейса.
airmon-ng start <Имя вашего интерфейса>
airodump-ng <Имя вашего интерфейса + mon>

1547891881703.png


Если вы не уверены, на каком канале вы хотите быть, то наш инструмент сам будет переключать карту между разными каналами для сканирования всего трафика.

Но это может имеет одну проблему, заключающуюся в том, что многие пакеты «фрагментируются», когда карта переключается между различными сетями. Для достижения наилучших результатов вы должны установить канал той сети, которую вы хотите протестировать.

Если вы хотите настроиться на конкретный канал, то можете выполнить команду:
iw <Имя вашего интерфейса + mon> set channel <Нужный номер канала>

Приступаем к разработки инструмента Detect_Deauth.
Часть 0. Подключение зависимостей и точка входа в программу.
Первая наша цель - это подключение необходимых библиотек. В этом проекте нам необходимо подключить следующее:
Python:
from scapy.all import *
from multiprocessing import Process
from termcolor import colored
import time, random,sys

Как всегда точка входа в нашу программу - это функция main. Но прежде нам необходимо реализовать инструкцию: if __name__ == "__main__" для нашего интерпретатора.
Блок с инструкцией: if __name__ == "__main__":
Python:
if __name__ == "__main__":
    if len(sys.argv)==2:
        main(sys.argv[1])
    else:
        os.system('cls' if os.name == 'nt' else 'clear')
        print(colored("[X] Error", "red"))
        print(colored("[X] Input command: python detect_deauth.py <MONITOR MODE INTERFACE>", "white"))
        print(colored("[X] Example: python detect_deauth.py wlan0mon", "white"))

Если кому-то не понятно, то здесь все очень просто строка if len(sys.argv)==2 проверяет кол-во переданных аргументов, первый аргумент - имя программы, второй аргумент это наш передаваемый интерфейс сетевой карты.
Если условие верно, то вызывается функция main, если нет, то выводиться сообщение об ошибке.

1547891825333.png


Строка os.system('cls' if os.name == 'nt' else 'clear') просто получает имя ОС и в зависимости от ОС выполняет чистку командной строки.
Реализовано чисто для красоты.

Часть 1. Параллелизм и смена канала Wi-Fi карты:
В нашей функции main() можно встретить запуск параллельного метода change_channel().
Метод change_channel() будет заниматься одним делом, а именно каждые 0.3 секунды менять канал нашей сетевой карты.
Для вызова мы используем следующий код:
Python:
p1 = Process(target=change_channel, args=(iface,))
p1.start()
В качестве аргументов(iface) передаем имя интерфейса.

Сам метод выглядит очень просто:
Python:
def change_channel(iface):
    while True:
        channel = random.randrange(1,12)
        os.system("iw dev %s set channel %d" % (iface, channel))
        time.sleep(0.3)
Здесь мы запускаем бесконечный цикл while True, с помощью функции random.randrange заносим в переменную случайное значение от 1 до 12.
И затем просто с помощью команды меняем канал.
P.S. Для смены канала нужно использовать следующую команду:
iw <Имя вашего интерфейса + mon> set channel <Нужный номер канала>

Часть 2. Sniffing пакетов с помощью Scapy.
Теперь мы переходим к самому - поиск deauth(disassoc) пакетов. Здесь как и прошлых мои статьях мы будем использовать инструмент под названием Scapy. Этот инструмент позволяет пользователю собирать, создавать и отправлять пакеты в сеть, созданную по их собственным спецификациям. Есть много возможностей при использовании такого инструмента. Но сегодня мы рассмотрим просто сниффинг пакетов и их фильтрацию.
Сначала посмотрим как выглядит функция - sniff_packets:
Python:
def sniff_packets(pkt):
    detect_attack()
    if pkt.haslayer(Dot11):
        if pkt.type == 0 and pkt.subtype == 0x00c:
            target_wifi_mac.append(pkt.addr2.upper())
            target_device_mac.append(pkt.addr1.upper())
            packets_list.append("deauth")
        if pkt.type == 0 and pkt.subtype == 0x00a:
            target_wifi_mac.append(pkt.addr2.upper())
            target_device_mac.append(pkt.addr1.upper())
            packets_list.append("disassoc")

Сначала идет проверка if pkt.haslayer(Dot11): имеется ли у нас в пакете уровень 802.11.
Следующая проверка на тип пакета Deauth if pkt.type == 0 and pkt.subtype == 0x00c и проверка на тип пакета Disassoc if pkt.type == 0 and pkt.subtype == 0x00a.
Для тех, кто не читал предыдущие статьи, то я приводил полезную картинку: https://codeby.net/attachments/pasted-image-0-26-png.24338/
Нас будет интересовать тип 10(0x00c) и тип 12(0x00a). В коде я использовал кодировку Hexadecimal(16-я). Для перевода можно использовать онлайн сервис.
А можно просто указать вместо 0x00c - 10 и вместо 0x00a - 12.
Рассмотрим строки:
Python:
target_wifi_mac.append(pkt.addr2.upper())
target_device_mac.append(pkt.addr1.upper())
packets_list.append("deauth")
         
...
         
target_wifi_mac.append(pkt.addr2.upper())
target_device_mac.append(pkt.addr1.upper())
packets_list.append("disassoc")
Задача этого блока кода заключается в добавление(.append) значений в массив.
pkt.addr2.upper() - получение BSSID.
pkt.addr1.upper() - получение MAC-адреса устройства, грубо говоря это mac цели.
.upper() - перевод букв в верхний регистр.

Часть 3. Понимание логики.
Наш инструмент должен уметь анализировать пакеты и по какой то логике выносить предположение какой инструмент используется для атаки - Airogeddon-ng или MDK3.
В прошлой статье: Детектор деаутентификации (диссоциации) клиентов. Часть 1., мы учились определять инструмент атакующего.
Вся логика заключается лишь в том, что мы определяем инструмент по тому как размещены пакеты deauth, disassoc.

Если мы ловим всего-лишь пакеты deauth - то можем предполагать, что это инструмент Airgeddon-ng(aireplay-ng), а вот если у нас череда пакетов deauth и disassoc то имеет место инструмент MDK3.
Внимание, возможно имеются и другие инструменты для атак деаутентификации. Прошу написать, чтобы разобрать как их отлавливать.
лаг
Строка: packets_list.append("deauth") - просто добавляет в массив строку deauth.

Часть 4. Функция detect_attack().
Внешняя проверка if (len(packets_list) >= 250) и elif(len(packets_list) >= 2) служит для обнаружение инструмента.
Обычно Airgeddon-ng(aireplay-ng) посылает очень большое кол-во пакетов (> 250) поэтому мы можем сразу предполагать кто перед нами.
Блок:
Python:
i = 0
        deauth = 0
        disassoc = 0
        for i in range(len(packets_list)):
            if("deauth" in packets_list[i]):
                deauth = deauth + 1
            if("disassoc" in packets_list[i]):
                disassoc = disassoc + 1
Занимается просто подсчетом кол-ва пакетов деаутентификации и диссоциации.
Затем если у нас пакетов деаутентификации больше x2 чем пакетов диссоциации, то выдаем результат - Атакующий использует инструмент Airgeddon-ng.

Если у нас пакетов < 250 и кол-во пакетов деаутентификации равно кол-во пакетов диссоциации, то выдаем результат - Атакующий использует инструмент MDK3.

Вся функция detect_attack:
Python:
def detect_attack():
    #print(len(packets_list))
    if (len(packets_list) >= 250):
        i = 0
        deauth = 0
        disassoc = 0
        for i in range(len(packets_list)):
            if("deauth" in packets_list[i]):
                deauth = deauth + 1
            if("disassoc" in packets_list[i]):
                disassoc = disassoc + 1
        if(deauth > disassoc * 2):
            print(colored("[+] ", "green", attrs=['bold']) + str(datetime.now().strftime("%a, %d, %b %Y %H:%M:%S %Z")) + colored(" Airgeddon ", "green", attrs=['bold']) + "Target Wi-Fi: " + target_wifi_mac[0] + " Target Device: " + target_device_mac[0])
            packets_list[:] = []
            target_wifi_mac[:] = []
            target_device_mac[:] = []
    elif(len(packets_list) >= 2):
        i = 0
        deauth = 0
        disassoc = 0
        for i in range(len(packets_list)):
            if("deauth" in packets_list[i]):
                deauth = deauth + 1
            if("disassoc" in packets_list[i]):
                disassoc = disassoc + 1
        if(deauth == disassoc):
            print(colored("[+] ", "yellow", attrs=['bold']) + str(datetime.now().strftime("%a, %d, %b %Y %H:%M:%S %Z")) + colored(" MDK3 ", "yellow", attrs=['bold']) + " Target Wi-Fi: " + target_wifi_mac[0] + " Target Device: " + target_device_mac[0])
        elif(deauth < disassoc):
            print(colored("[+] ", "yellow", attrs=['bold']) + str(datetime.now().strftime("%a, %d, %b %Y %H:%M:%S %Z")) + colored(" Unknown ", "yellow", attrs=['bold']) + " Target Wi-Fi: " + target_wifi_mac[0] + " Target Device: " + target_device_mac[0])
            packets_list[:] = []
            target_wifi_mac[:] = []
            target_device_mac[:] = []

Вот и все! На этом мы закончили цикл статей посвященной обнаружению атаки деаутентификации(диссоциации).

1547891999478.png


1547892075037.png


1547892212933.png


Исходный код всего проекта:
Python:
from scapy.all import *
from multiprocessing import Process
from termcolor import colored
import time, random,sys

logo = """"                                                                                     
 ____      _           _      ____              _   _      _____ _   _           _   
|    \ ___| |_ ___ ___| |_   |    \ ___ ___ _ _| |_| |_   |  _  | |_| |_ ___ ___| |_
|  |  | -_|  _| -_|  _|  _|  |  |  | -_| .'| | |  _|   |  |     |  _|  _| .'|  _| '_|
|____/|___|_| |___|___|_|    |____/|___|__,|___|_| |_|_|  |__|__|_| |_| |__,|___|_,_|

            Author: Debug for Codeby.net, 2019
                                                                                    
"""
packets_list = []
target_wifi_mac = []
target_device_mac = []
def detect_attack():
    #print(len(packets_list))
    if (len(packets_list) >= 250):
        i = 0
        deauth = 0
        disassoc = 0
        for i in range(len(packets_list)):
            if("deauth" in packets_list[i]):
                deauth = deauth + 1
            if("disassoc" in packets_list[i]):
                disassoc = disassoc + 1
        if(deauth > disassoc * 2):
            print(colored("[+] ", "green", attrs=['bold']) + str(datetime.now().strftime("%a, %d, %b %Y %H:%M:%S %Z")) + colored(" Airgeddon ", "green", attrs=['bold']) + "Target Wi-Fi: " + target_wifi_mac[0] + " Target Device: " + target_device_mac[0])
            packets_list[:] = []
            target_wifi_mac[:] = []
            target_device_mac[:] = []
    elif(len(packets_list) >= 2):
        i = 0
        deauth = 0
        disassoc = 0
        for i in range(len(packets_list)):
            if("deauth" in packets_list[i]):
                deauth = deauth + 1
            if("disassoc" in packets_list[i]):
                disassoc = disassoc + 1
        if(deauth == disassoc):
            print(colored("[+] ", "yellow", attrs=['bold']) + str(datetime.now().strftime("%a, %d, %b %Y %H:%M:%S %Z")) + colored(" MDK3 ", "yellow", attrs=['bold']) + " Target Wi-Fi: " + target_wifi_mac[0] + " Target Device: " + target_device_mac[0])
        elif(deauth < disassoc):
            print(colored("[+] ", "yellow", attrs=['bold']) + str(datetime.now().strftime("%a, %d, %b %Y %H:%M:%S %Z")) + colored(" Unknown ", "yellow", attrs=['bold']) + " Target Wi-Fi: " + target_wifi_mac[0] + " Target Device: " + target_device_mac[0])
            packets_list[:] = []
            target_wifi_mac[:] = []
            target_device_mac[:] = []

def sniff_packets(pkt):
    detect_attack()
    if pkt.haslayer(Dot11):
        if pkt.type == 0 and pkt.subtype == 0x00c:
            target_wifi_mac.append(pkt.addr2.upper())
            target_device_mac.append(pkt.addr1.upper())
            packets_list.append("deauth")
        if pkt.type == 0 and pkt.subtype == 0x00a:
            target_wifi_mac.append(pkt.addr2.upper())
            target_device_mac.append(pkt.addr1.upper())
            packets_list.append("disassoc")

def change_channel(iface):
    while True:
        channel = random.randrange(1,12)
        os.system("iw dev %s set channel %d" % (iface, channel))
        time.sleep(0.3)
def main(iface):
    os.system('cls' if os.name == 'nt' else 'clear')
    print(logo)
    p1 = Process(target=change_channel, args=(iface,))
    p1.start()
    sniff(iface = iface, prn=sniff_packets)
        

if __name__ == "__main__":
    if len(sys.argv)==2:
        main(sys.argv[1])
    else:
        os.system('cls' if os.name == 'nt' else 'clear')
        print(colored("[X] Error", "red"))
        print(colored("[X] Input command: python detect_deauth.py <MONITOR MODE INTERFACE>", "white"))
        print(colored("[X] Example: python detect_deauth.py wlan0mon", "white"))
 

Вложения

  • 1547891804984.png
    1547891804984.png
    19,4 КБ · Просмотры: 763
  • 1547891955852.png
    1547891955852.png
    470,5 КБ · Просмотры: 566
Последнее редактирование:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!