Конкурс Пишем инструмент для пассивной слежки через Wi-Fi

Привет форум Codeby.net. Во-первых, хочу всех поздравить с Новым годом. Желаю всего самого лучшего. А теперь, пожалуй, перейдем к рассмотрению, что же у нас должно получиться.

Введение
Начнем с того, что в прошлой статье(Пассивная слежка через WIFI с помощью Probequest) я рассказал и показал, что устройства отправляют Probe Frame(Пробные пакеты).

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

Мы рассмотрим следующий случай, допустим нам необходимо узнать какие и сколько устройств проходило, подключалось мимо нашего кафе.
Для этих целей мы напишем небольшую утилиту на Python которая будет собирать Probe Frame с информацией и записывать в файл. Также она с
может полностью заменить инструмент Probequest.

Работа с Scapy
Начнем с того, что мы будем использовать Scapy. Scapy - библиотека(инструмент) для работы и взаимодействия с сетевыми пакетами, можно сказать, что это достаточно крутой и мощный инструмент даже для пентеста Wi-Fi сетей, с помощью него можно как внедрять вредоносный код в пакеты, перехватывать пакеты, прослушивать пакеты, отправлять созданные пакеты и многое другое.

Часть 1. Зависимости.
Начнем с того, что добавим некоторые зависимости.
  • from scapy.all import * Подключение Scapy без которой не было ...
  • from datetime import datetime Нужна для получение времени
  • from multiprocessing import Process Нужна для параллельной работы
  • from termcolor import colored Сделаем терминал чуточку красивее.
  • import time, random, sys, socket, netaddr
И напишем пару следующих строчек:
Python:
if __name__ == "__main__":
    main()

Часть 2. Main
Начало программы будет выглядеть так:
Python:
def main():
    if len(sys.argv) < 2:
        print("[X] Error: argument interface: expected one argument")
        sys.exit(0)
    if len(sys.argv)>1:
        if len(sys.argv[1]) <> 0:
            print """
[*] 802.11 Radar Devices
[*] Author: Debug for Codeby.net, 2018"""
            print("[*] Scan start %s" % str(datetime.now().strftime("%a, %d %b %Y %H:%M:%S %Z")))
            p1 = Process(target=change_channel, args=(sys.argv[1],))
            p1.start()
            sniff(iface = sys.argv[1], prn=PacketHandler)

Здесь все очень просто. Сначала происходит проверка на кол-во переданных аргументов(как минимум их кол-во равно 1 - это название вашей программы).
Наш скрипт будет требовать только один аргумент(вернее два) это имя нашей карты в режиме мониторинга.

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

Также важным для нас является функция - change_channel. Как мы можем помнить инструмент Probequest не умел сам менять каналы, для увеличения обнаруженных устройств мы использовали airodump-ng. Мне показалось, что это достаточно серьезный косяк, который нам нужно избегать.

Если кратко то здесь мы запускаем функцию параллельно которая будет каждые 0.3 секунды менять наш канал.

Сама функция выглядит:
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)

Также здесь происходит запуск функции PacketHandler.

Часть 3. PacketHandler
Рассмотрим функцию PacketHandler, задача которой получение пакетов Probe Frame.

Сначала идет проверка if pkt.haslayer(Dot11): имеется ли у нас в пакете уровень 802.11.

Следующая проверка на тип пакета Beacon if pkt.type == 0 and pkt.subtype == 4:. В прошлой статье я не просто так разместил изображение типов пакетов - https://codeby.net/attachments/pasted-image-0-26-png.24338/ Нас будет интересовать тип 0 и тип 4


Весь код функции PacketHandler

Также стоит кратко объяснить некоторые строки:

str(datetime.now().strftime("%a, %d %b %Y %H:%M:%S %Z")) - Получение текущей даты и времени, будет использоваться для получение точного времени, когда же устройство послало пробный пакет.

pkt.addr2.upper() - Получение MAC-адреса устройства которое отправило пробный пакет.

netaddr.EUI(pkt.addr2).oui.registration().org - Получение типа устройства

pkt.info - Получаем ESSID точки доступа к которой был отправлен пакет.

str(-(256-ord(pkt.notdecoded[-4:-3]))) - Получение мощности сигнала.

Часть 4. Удобный вывод и запись
Также я создал две функции для удобства, функция print_detect_device(для вывода), write_detect_device(для записи в файл).
Здесь ничего объяснять. Исходный код обоих функций:

Python:
def print_detect_device(char, time, mac, type_device, essid, pwr):
    if char == '[+]':
        print(colored(char, 'green', attrs=['bold']) + " " + time + " MAC device: " + mac + " TYPE: " + type_device + " ESSID: " + essid + " PWR " + pwr)
    else:
        print(colored(char, 'yellow', attrs=['bold']) + " " + time + " MAC device: " + mac + " TYPE: " + type_device + " ESSID: " + essid + " PWR " + pwr)

def write_detect_device(time, mac, type_device, essid, pwr):
    handle = open("detect_devices.txt", "a")
    handle.write(time + " MAC device: " + mac + " TYPE: " + type_device + " ESSID: " + essid + " PWR: " + pwr + '\n')
    handle.close()

Часть 5. Демонстрация
На этом можно сказать, что мы закончили написание нашего аналога Probequest но только с дополнительными функциями.
В качестве демонстрации я приведу скриншоты работы.

Безымянный.png

Безымянный1.png

На этом все, все свободны)))
 
Сам исходник:
Python:
from scapy.all import *
from datetime import datetime
from multiprocessing import Process
from termcolor import colored
import time, random, sys, socket, netaddr

def print_detect_device(char, time, mac, type_device, essid, pwr):
    if char == '[+]':
        print(colored(char, 'green', attrs=['bold']) + " " + time + " MAC device: " + mac + " TYPE: " + type_device + " ESSID: " + essid + " PWR " + pwr)
    else:
        print(colored(char, 'yellow', attrs=['bold']) + " " + time + " MAC device: " + mac + " TYPE: " + type_device + " ESSID: " + essid + " PWR " + pwr)

def write_detect_device(time, mac, type_device, essid, pwr):
    handle = open("detect_devices.txt", "a")
    handle.write(time + " MAC device: " + mac + " TYPE: " + type_device + " ESSID: " + essid + " PWR: " + pwr + '\n')
    handle.close()

def PacketHandler(pkt):
    if pkt.haslayer(Dot11):
        if pkt.type == 0 and pkt.subtype == 4:
            if pkt.info:
                try:
                    write_detect_device(str(datetime.now().strftime("%a, %d %b %Y %H:%M:%S %Z")), pkt.addr2.upper(), pkt.info, netaddr.EUI(pkt.addr2).oui.registration().org, str(-(256-ord(pkt.notdecoded[-4:-3]))))
                    print_detect_device("[+]", str(datetime.now().strftime("%a, %d %b %Y %H:%M:%S %Z")), pkt.addr2.upper(), netaddr.EUI(pkt.addr2).oui.registration().org, pkt.info, str(-(256-ord(pkt.notdecoded[-4:-3]))))
                except netaddr.core.NotRegisteredError, e:
                    write_detect_device(str(datetime.now().strftime("%a, %d %b %Y %H:%M:%S %Z")), pkt.addr2.upper(), "UNKNOW", pkt.info, str(-(256-ord(pkt.notdecoded[-4:-3]))))
                    print_detect_device("[?]", str(datetime.now().strftime("%a, %d %b %Y %H:%M:%S %Z")), pkt.addr2.upper(), "UNKNOW", pkt.info, str(-(256-ord(pkt.notdecoded[-4:-3]))))

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():
    if len(sys.argv) < 2:
        print("[X] Error: argument interface: expected one argument")
        sys.exit(0)
    if len(sys.argv)>1:
        if len(sys.argv[1]) <> 0:
            print """
[*] 802.11 Radar Devices
[*] Author: Debug for Codeby.net, 2018"""
            print("[*] Scan start %s" % str(datetime.now().strftime("%a, %d %b %Y %H:%M:%S %Z")))
            p1 = Process(target=change_channel, args=(sys.argv[1],))
            p1.start()
            sniff(iface = sys.argv[1], prn=PacketHandler)
            #p1.terminate()
if __name__ == "__main__":
    main()
 
МБ я не допонял что то, но чем софт из статьи отличается от xdavidhu/probeSniffer которому уже более двух лет и он постоянно обновляется и в целом не плохо работает? :)
 
  • Нравится
Реакции: Debug
МБ я не дополнял что то, но чем софт из статьи отличается от xdavidhu/probeSniffer которому уже более двух лет и он постоянно обновляется и в целом не плохо работает? :)
Как кто-то говорил, что нужно не только уметь использовать инструменты, но и знать как они устроены.
Именно для этих целей и была написана статья, чтобы понять как устроены такие инструменты как airodump-ng, probequest и.т.д.
 
Кнужно не только уметь использовать инструменты, но и знать как они устроены. Именно для этих целей и была написана статья

Вопросов нет, но можно было упомянуть, что такая возможность есть у некоторых уже написанных утилит :)
 
  • Нравится
Реакции: id2746 и Debug
абсолютно верно, waidsps, там все проще и нет замудрено
И попробуйте еще один скрипт, нашего хорошего друга Alexey (WiFi-autopwner)
,
уверяю Вас, поймете чтo и как
 
абсолютно верно, waidsps, там все проще и нет замудрено
Хотите сказать, что мой инструмент сложный?
И попробуйте еще один скрипт, нашего хорошего друга Alexey (WiFi-autopwner) , уверяю Вас, поймете чтo и как
К чему это?
 
Так я не говорил, скажу что он не нужный.
Посмотрите, там Ваши предложения грамотней расписаны, прошу Вас не обижаться, я не со злости.
Напрасно, Вы на меня обиделись, если б я брал все на блюдечке, я бы на этом сайте не сидел, проще скопировать код вставить куда нужно и быть супер IT, как ведите я читаю, изучаю то что пишут и предлагают ребята и довольно, очень толковые решения. Прошу простить если я Вас чем то задел, я высказал свое мнение и ни в коем случае не пытаюсь задеть Ваше самолюбие.
 
Последнее редактирование модератором:
Так я не говорил, скажу что он не нужный.
Статья была написана для того чтобы уметь брать не только то что лежит на блюдечке но и уметь самому писать. Конечно легко взять готовый инструмент, но интересно и свой написать.
 
Выскакивают ошибки:

except netaddr.core.NotRegisteredError, e: - ошибка синтаксиса;
print """
[*] 802.11 Radar Devices
[*] Author: Debug for Codeby.net, 2018""" - отсутствуют скобки;
 
нам необходимо узнать какие и сколько устройств проходило, подключалось мимо нашего кафе.
Только наткнулся на данный топик. Очень интересно. Но есть вопрос. Можно ли как то переложить эту работу не на какой то комп с вайфай картой, который должен быть включен круглосуточно, а чисто на роутер? Например, есть роутер Asus RT-N14 (прошивка от Padavan) или тот же MikroTik Ac Lite. Можно как то на таком оборудовании поднять данный сервис?
 
Только наткнулся на данный топик. Очень интересно. Но есть вопрос. Можно ли как то переложить эту работу не на какой то комп с вайфай картой, который должен быть включен круглосуточно, а чисто на роутер? Например, есть роутер Asus RT-N14 (прошивка от Padavan) или тот же MikroTik Ac Lite. Можно как то на таком оборудовании поднять данный сервис?
В микротике есть свой язык сценариев. И есть инструменты для серфинга и снупинга . Хотя придется малось потрудится и костылей написать

А как быть с устройствами, которые рандомизируют свой мак? А это все более менее свежие iphone и андроид. Точнее, какой смысл в сборе рандомного мака?
 
Всех приветствую!
Подскажите пожалуйста при запуске кода на ПИТОНЕ 3.7 выдает такое вот сообщение:
[X] Error: argument interface: expected one argument
Что надо сделать чтобы заработало?

В коде также не пойму, как установить нужный адаптер, к устроуству подключено 2 адаптера.
 
Можно ли как то переложить эту работу не на какой то комп с вайфай картой, который должен быть включен круглосуточно, а чисто на роутер? Например, есть роутер Asus RT-N14 (прошивка от Padavan) или тот же MikroTik Ac Lite. Можно как то на таком оборудовании поднять данный сервис?
Можно.
На роутер Asus RT-N14 необходимо скачать и установить прошивку OpenWrt.
В операционной системе OpenWRT отлично чувствует себя Python-mini.
Если имеется опыт в сборке прошивок OpenWRT, то лучше собрать прошивку под свои нужды, то есть сразу с интерпретатором Python.
Это - всё, запускай любой Python-скрипт на роутере Asus RT-N14
 
  • Нравится
Реакции: Aqueous
Мы в соцсетях:

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