Конкурс Пишем инструмент для пассивной слежки через 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

На этом все, все свободны)))
 

Debug

Red Team
07.07.2017
217
439
Сам исходник:
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()
 

ghostphisher

местный
Gold Team
07.12.2016
2 605
3 428
МБ я не допонял что то, но чем софт из статьи отличается от xdavidhu/probeSniffer которому уже более двух лет и он постоянно обновляется и в целом не плохо работает? :)
 
  • Нравится
Реакции: Debug

Debug

Red Team
07.07.2017
217
439
МБ я не дополнял что то, но чем софт из статьи отличается от xdavidhu/probeSniffer которому уже более двух лет и он постоянно обновляется и в целом не плохо работает? :)
Как кто-то говорил, что нужно не только уметь использовать инструменты, но и знать как они устроены.
Именно для этих целей и была написана статья, чтобы понять как устроены такие инструменты как airodump-ng, probequest и.т.д.
 

ghostphisher

местный
Gold Team
07.12.2016
2 605
3 428
Кнужно не только уметь использовать инструменты, но и знать как они устроены. Именно для этих целей и была написана статья

Вопросов нет, но можно было упомянуть, что такая возможность есть у некоторых уже написанных утилит :)
 
  • Нравится
Реакции: id2746 и Debug

Debug

Red Team
07.07.2017
217
439
абсолютно верно, waidsps, там все проще и нет замудрено
Хотите сказать, что мой инструмент сложный?
И попробуйте еще один скрипт, нашего хорошего друга Alexey (WiFi-autopwner) Автоматизированная атака Pixie Dust: получение ПИНов и паролей Wi-Fi без ввода команд - HackWare.ru, уверяю Вас, поймете чтo и как
К чему это?
 

sakhav13

New member
06.10.2016
2
0
Так я не говорил, скажу что он не нужный.
Посмотрите, там Ваши предложения грамотней расписаны, прошу Вас не обижаться, я не со злости.
Напрасно, Вы на меня обиделись, если б я брал все на блюдечке, я бы на этом сайте не сидел, проще скопировать код вставить куда нужно и быть супер IT, как ведите я читаю, изучаю то что пишут и предлагают ребята и довольно, очень толковые решения. Прошу простить если я Вас чем то задел, я высказал свое мнение и ни в коем случае не пытаюсь задеть Ваше самолюбие.
 
Последнее редактирование модератором:

Debug

Red Team
07.07.2017
217
439
Так я не говорил, скажу что он не нужный.
Статья была написана для того чтобы уметь брать не только то что лежит на блюдечке но и уметь самому писать. Конечно легко взять готовый инструмент, но интересно и свой написать.
 
13.01.2018
26
15
Выскакивают ошибки:

except netaddr.core.NotRegisteredError, e: - ошибка синтаксиса;
print """
[*] 802.11 Radar Devices
[*] Author: Debug for Codeby.net, 2018""" - отсутствуют скобки;
 

p0is0n

New member
23.10.2019
3
0
нам необходимо узнать какие и сколько устройств проходило, подключалось мимо нашего кафе.
Только наткнулся на данный топик. Очень интересно. Но есть вопрос. Можно ли как то переложить эту работу не на какой то комп с вайфай картой, который должен быть включен круглосуточно, а чисто на роутер? Например, есть роутер Asus RT-N14 (прошивка от Padavan) или тот же MikroTik Ac Lite. Можно как то на таком оборудовании поднять данный сервис?
 

vvtech

New member
15.10.2018
2
0
Только наткнулся на данный топик. Очень интересно. Но есть вопрос. Можно ли как то переложить эту работу не на какой то комп с вайфай картой, который должен быть включен круглосуточно, а чисто на роутер? Например, есть роутер Asus RT-N14 (прошивка от Padavan) или тот же MikroTik Ac Lite. Можно как то на таком оборудовании поднять данный сервис?
В микротике есть свой язык сценариев. И есть инструменты для серфинга и снупинга . Хотя придется малось потрудится и костылей написать

А как быть с устройствами, которые рандомизируют свой мак? А это все более менее свежие iphone и андроид. Точнее, какой смысл в сборе рандомного мака?
 

bobsnow

New member
19.12.2020
1
0
Всех приветствую!
Подскажите пожалуйста при запуске кода на ПИТОНЕ 3.7 выдает такое вот сообщение:
[X] Error: argument interface: expected one argument
Что надо сделать чтобы заработало?

В коде также не пойму, как установить нужный адаптер, к устроуству подключено 2 адаптера.
 

KaPToHHbIu_EHoT

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