Статья для участия в конкурсе Конкурс 2018 года - авторская статья по любой тематике нашего форума! "
Привет форум 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 но только с дополнительными функциями.
В качестве демонстрации я приведу скриншоты работы.
На этом все, все свободны)))