网络扫描仪|使用 Python Scapy 和 PostgreSQL

问题描述 投票:0回答:1

这可能听起来很愚蠢,但我在保存 python 中捕获的数据并将其发送到 postgresql 数据库方面没有很多经验。

我想做的是在 python 中使用 Scapy 扫描网络中的设备。运行小 scapy 代码后显示的设备应该发送到我的 postgresql 数据库。

有人以前尝试过这个,或者知道什么可以帮助做到这一点吗?

我尝试对此进行一些研究,但找不到任何可以回答我的问题的东西..

我已经考虑过将数据发送到我的数据库,但是当数据在 python 中显示时,我见过的方法都必须手动完成,而不是自动完成。

python postgresql scapy
1个回答
0
投票

因此,您需要做的是两个单独的步骤:首先解析您通过 Scapy 收集的内容,然后将所有内容发送到 Postgres。我没有在实时捕获中完成此操作,而是在录制的 PCAP 中完成此操作。我想它也应该适用于实时捕获。

from scapy.all import *
import psycopg2


conn = psycopg2.connect(host="localhost", database="trainstation", user="username", password="password", port=5432)

cur=conn.cursor()


files = [list, of, pcaps]


def create_tab():
    cur.execute("CREATE TABLE proberequests(id serial primary key, mac text, ssid text, rates integer[], channel integer, esr integer[], ht text);")
    print("Created table")
    conn.commit()
    print("committed everything to db")

def parse_pcap(pcap_path):
    pcap_flow = rdpcap(pcap_path)
    sessions = pcap_flow.sessions()
    counter = 0
    for session in sessions:
        for packet in sessions[session]:
            counter +=1
            try:
                mac = get_mac(packet)
                ssid, rates= get_ssid_and_rates(packet)
                channel = get_ds(packet)
                esr = get_esr(packet)
                ht = get_ht(packet)
                query = "INSERT INTO proberequests(mac, ssid, rates, channel, esr, ht) VALUES('" + mac + "', '" + str(ssid) + "', '" + str(rates) + "', " + str(channel) + ", '" + str(esr) + "', '" + str(ht) + "');"
                cur.execute(query)
            except Exception as e:
                query = "INSERT INTO proberequests(mac, ssid, rates) VALUES('" + mac + "', '" + str(ssid) + "', '" + str(rates)  + "');" # sorry for the messy workaround :X something isn't working with the esr if it's empty 
                cur.execute(query)
                pass
    conn.commit()
    print("Added", counter, "probes to the database")


def get_mac(packet):
    if packet.haslayer(Dot11ProbeReq):
        return str(packet.addr2)
    else:
        return ""


def get_ssid_and_rates(packet):
    if packet.haslayer(Dot11Elt):
        ssid = packet.info.decode('ascii')
        rates= set(packet[Dot11EltRates].rates)
        return ssid, rates
    else:
        return '', {}


def get_ds(packet):
    if packet.haslayer(Dot11EltDSSSet):
        channel = packet[Dot11EltDSSSet].channel
        return channel
    else:
        return 255

def get_ht(packet):
    if packet.haslayer(Dot11EltHTCapabilities):
        return str(packet[Dot11EltHTCapabilities].info)[2:-1]
    else:
        return ''

def get_esr(packet):
    if packet[Dot11EltRates][1]:
        return set(packet[Dot11EltRates][1].rates)
    else:
        return {}

create_tab()

for filename in files:
    print("Adding file" , filename)
    parse_pcap(filename)
© www.soinside.com 2019 - 2024. All rights reserved.