Показаны сообщения с ярлыком sqlite. Показать все сообщения
Показаны сообщения с ярлыком sqlite. Показать все сообщения

четверг, 31 мая 2018 г.

Статистика производителей Wi-Fi точек доступа из базы kismet.



import sqlite3
import codecs
import sys
from collections import Counter
from tabulate import tabulate

con = sqlite3.connect('wireless.dbl')

cur = con.cursor()
cur.execute("SELECT Manuf FROM wireless")

rows = cur.fetchall()

stat = []
for row  in rows:
    st = row[0]
    stat.append(row[0])


c = Counter(stat)

l = []
for key in sorted(c.iterkeys()):
    l.append([key, c[key]])

sum=0
for vend in l:
    venst=str(vend[0]).rstrip('\n')
    sum=sum+vend[1]
#    print (venst+", "+str(vend[1]))
#print ("Total AP:"+sum)

percent=[]
for perc in l:
    venndd = str(perc[0]).rstrip('\n')
    numb = perc[1]
    perce = 100 * float(numb)/float(sum)
    percent.append([venndd, perce, numb])
#    print (percent)  

#print (l)
#print tabulate(percent, headers=['Vendor', "Percent of total", 'Total'], tablefmt='orgtbl')

#print filter(lambda x: 'Ubiquti' in x, percent)
#print (sortvend)

#print (sys.argv[1])
print tabulate(filter(lambda x: sys.argv[1] in x, percent), headers=['Vendor', "Percent of total", 'Total'], tablefmt='orgtbl')

Добавить производителей в базу данных giskismet.

В kismet предусмотрено использование баз данных wireshark для указания связи MAC к имени производителю чипов. Если по какой-то причине(например при сборе данных о сетях в системе не был установлен wireshark (wireshark-common) с соответствующей базой данных, можно использовать данный скрипт для пост-модернизации базы данных giskismet с целью добавить название производителя по собранным сетям.


import sqlite3
import codecs

#Подключаемся к базе данных сгенерированной giskismet

con = sqlite3.connect('wireless.dbl')

cur = con.cursor()
cur.execute("SELECT id,BSSID FROM wireless")

rows = cur.fetchall()

#Функция которая открывает базу данных MAC адресов для сверки с MAC из базы данных
#Если находит совпадения вносит соответствие в поле Manuf (производитель)

def ScanData(f,i):
    filetxt = codecs.open("mac_database.txt", 'r', 'utf-8')
    for line in filetxt:
        if f==line.split(" ")[0]:
            print (clmac+" vendor: "+line.split(" ")[1])
            cur.execute("UPDATE wireless SET Manuf=? WHERE id=?", (line.split(' ')[1], i))
            con.commit()
    filetxt.close
    
#Построчно считываем MAC адреса из БД и применяем к ним функцию выше

for row in rows:
    mac=row[1]
    i=row[0]
    clmac=mac[:8]
    ScanData(clmac,i)

UPD:
если преобразовать текстовый файл в словарь и работать с данными записанными в словарь можно увеличить производительность программы минимум на 50%:

import sqlite3
import codecs

con = sqlite3.connect('wireless.dbl')

cur = con.cursor()
cur.execute("SELECT id,BSSID FROM wireless")

rows = cur.fetchall()

d = {}
for line in open('mac_database.txt'):
    line = line.split(" ")
    d[line[0]]= line[1]



def ScanData(f,i):
    for line in d:
        if f==line:
            print (clmac+" vendor: "+d[line])
            cur.execute("UPDATE wireless SET Manuf=? WHERE id=?", (d[line], i))
            con.commit()
    

for row in rows:
    mac=row[1]
    i=row[0]
    clmac=mac[:8]
    ScanData(clmac,i)



Последнюю версию базы данных MAC адресов можно скачать на сайте wireshark:
https://www.wireshark.org/tools/oui-lookup.html

mac_ database.txt
mergedb.py