staging.inyokaproject.org

[PYTHON] - binäre Datei (pflog) in lesbares Format umwandeln

Status: Ungelöst | Ubuntu-Version: Ubuntu 16.04 (Xenial Xerus)
Antworten |

halloICKEbins

Avatar von halloICKEbins

Anmeldungsdatum:
12. September 2017

Beiträge: 226

Morgen,

im Moment wandle ich pflog-Dateien von OpenBSD mittels TCPDUMP um.

Gibt es eine Möglichkeit bzw. Modul das mit PYTHON zu erledigen?

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Wenn du dir das Format ansiehst (https://www.freebsd.org/cgi/man.cgi?query=pflog&sektion=4), solltest du die Structs in den Binärdaten mit https://docs.python.org/3.6/library/struct.html parsen können - in secdev/scapy hat das schon mal jemand umgesetzt: https://github.com/secdev/scapy/blob/master/scapy/layers/pflog.py

halloICKEbins

(Themenstarter)
Avatar von halloICKEbins

Anmeldungsdatum:
12. September 2017

Beiträge: 226

Danke schonmal dafür ... aber leider reicht mein Wissen über Python nicht mal ansatzweise, dies in ein Script einzubinden.

Gibt es dafür entsprechende Tutorials?

halloICKEbins

(Themenstarter)
Avatar von halloICKEbins

Anmeldungsdatum:
12. September 2017

Beiträge: 226

Mahlzeit,

habe versucht, dass nachfolgende Script lauffähig zu bekommen...Datei pflog liegt im gleichen Verzeichnis wie das Script

Fehlermeldung:

  File "/home/user1/test.py", line 16, in <module>
    from scapy.data import DLT_PFLOG

ImportError: cannot import name 'DLT_PFLOG'
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# -*- coding: utf-8 -*-
"""
Spyder Editor

This is a temporary script file.
"""
# This file is part of Scapy
# See http://www.secdev.org/projects/scapy for more informations
# Copyright (C) Philippe Biondi <phil@secdev.org>
# This program is published under a GPLv2 license

"""
PFLog: OpenBSD PF packet filter logging.
"""

from scapy.data import DLT_PFLOG
from scapy.packet import *
from scapy.fields import *
from scapy.layers.inet import IP
if conf.ipv6_enabled:
    from scapy.layers.inet6 import IPv6
from scapy.config import conf


class PFLog(Packet):
    name = "PFLog"
    # from OpenBSD src/sys/net/pfvar.h and src/sys/net/if_pflog.h
    fields_desc = [ByteField("hdrlen", 0),
                   ByteEnumField("addrfamily", 2, {socket.AF_INET: "IPv4",
                                                   socket.AF_INET6: "IPv6"}),
                   ByteEnumField("action", 1, {0: "pass", 1: "drop",
                                               2: "scrub", 3: "no-scrub",
                                               4: "nat", 5: "no-nat",
                                               6: "binat", 7: "no-binat",
                                               8: "rdr", 9: "no-rdr",
                                               10: "syn-proxy-drop"}),
                   ByteEnumField("reason", 0, {0: "match", 1: "bad-offset",
                                               2: "fragment", 3: "short",
                                               4: "normalize", 5: "memory",
                                               6: "bad-timestamp",
                                               7: "congestion",
                                               8: "ip-options",
                                               9: "proto-cksum",
                                               10: "state-mismatch",
                                               11: "state-insert",
                                               12: "state-limit",
                                               13: "src-limit",
                                               14: "syn-proxy"}),
                   StrFixedLenField("iface", "", 16),
                   StrFixedLenField("ruleset", "", 16),
                   SignedIntField("rulenumber", 0),
                   SignedIntField("subrulenumber", 0),
                   SignedIntField("uid", 0),
                   IntField("pid", 0),
                   SignedIntField("ruleuid", 0),
                   IntField("rulepid", 0),
                   ByteEnumField("direction", 255, {0: "inout", 1: "in",
                                                    2: "out", 255: "unknown"}),
                   StrFixedLenField("pad", b"\x00\x00\x00", 3)]

    def mysummary(self):
        return self.sprintf("%PFLog.addrfamily% %PFLog.action% on %PFLog.iface% by rule %PFLog.rulenumber%")  # noqa: E501


bind_layers(PFLog, IP, addrfamily=socket.AF_INET)
if conf.ipv6_enabled:
    bind_layers(PFLog, IPv6, addrfamily=socket.AF_INET6)

conf.l2types.register(DLT_PFLOG, PFLog)

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

@halloICKEbins: Wieso hast Du eine Datei aus dem scapy-Package in Deinem Heimatverzeichnis liegen? Das macht keinen Sinn. Deine test.py ist ja eigentlich scapy.layers.pflog. Wahrscheinlich hast Du ein zu altes scapy installiert, denn wenn es scapy.layers.pflog gibt, dann muss es auch DLT_PFLOG in scapy.data geben.

halloICKEbins

(Themenstarter)
Avatar von halloICKEbins

Anmeldungsdatum:
12. September 2017

Beiträge: 226

Achso ... aber wie kann diese jetzt einbinden, damit er mir mein pflog in ein Textdokument umwandelt?

halloICKEbins

(Themenstarter)
Avatar von halloICKEbins

Anmeldungsdatum:
12. September 2017

Beiträge: 226

Morgen,

ist das so kompliziert mit dem Einbinden oder so banal, dass keine auf die Frageantworten möchte!

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

@halloICKEbins: Also ich habe noch nix mit scapy gemacht, kann da also nix zu sagen. Kurzer Blick in die Dokumentation lässt vermuten, dass es ein recht mächtiges Werkzeug mit vielen Funktionen ist, die wohl nicht primär für Deinen Einsatzzweck gedacht sind. Man müsste sich da also einarbeiten. Um eine Lösung zu testen bräuchte man auch die entsprechenden Daten. In einem Ubuntu-Forum hat nicht jeder pflog-Dateien von OpenBSD zum testen herum liegen. 😉

Wenn in dieser Datei einfach nur Datensätze nacheinander abgespeichert sind, die durch die PFLog-Klasse beschrieben werden, dann könnte man die Datei vielleicht einfach in entsprechend grossen Blöcken einlesen und damit jeweils ein PFlog-Exemplar erstellen und davon dann die gewünschten Informationen abfragen und ausgeben.

Also mein erster Versuch wäre (natürlich völlig ungetestet):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#!/usr/bin/env python
# coding: utf-8
from __future__ import absolute_import, division, print_function
from functools import partial
from scapy.layers.pflog import PFlog

RECORD_LENGTH = len(PFlog())


def main():
    with open('test.pflog', 'rb') as pflog_file:
        for record in iter(partial(pflog_file.read, RECORD_LENGTH), ''):
            print(PFlog(record))


if __name__ == '__main__':
    main()

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

halloICKEbins schrieb:

im Moment wandle ich pflog-Dateien von OpenBSD mittels TCPDUMP um.

Gibt es eine Möglichkeit bzw. Modul das mit PYTHON zu erledigen?

Wofür brauchst Du das denn? Du hast eine funktionierende Lösung und gibst an, dass Du mit Python nicht so viel am Hut hast. Was ist also das Ziel?

halloICKEbins

(Themenstarter)
Avatar von halloICKEbins

Anmeldungsdatum:
12. September 2017

Beiträge: 226

Bei mir kommt da immer folgende Fehlermeldung:

from scapy.layers.pflog import PFlog

ImportError: cannot import name 'PFlog'

Wie genau ist den der Modulname?

@rklm: Im Moment läuft tcpdump auf einen virtuellen Server, den ich gerne abschaffen würde ! (Und tcpdump soll nicht benutzt werden - Sicherheitsbedenken!)

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

@halloICKEbins: Der Modulname stimmt. Bei der Klasse habe ich mich mit dem kleinen l vertan. Das hätte man aber auch leicht selbst heraus finden können — Du selbst hast die Datei ja hier im Thema komplett gezeigt. 🙄

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

halloICKEbins schrieb:

@rklm: Im Moment läuft tcpdump auf einen virtuellen Server, den ich gerne abschaffen würde ! (Und tcpdump soll nicht benutzt werden - Sicherheitsbedenken!

Was sind da jetzt die Bedenken? Ohne root-Rechte kann tcpdump keinen Traffic aufzeichnen. Und wenn jemand root-Rechte hat, dann kann er es zur Not auch selbst installieren. Und warum kannst Du es nicht auf einem anderen Rechner installieren, wenn die VM weg soll?

halloICKEbins

(Themenstarter)
Avatar von halloICKEbins

Anmeldungsdatum:
12. September 2017

Beiträge: 226

Morgen,

jetzt läufts aber er gibt die Zeilen so aus:

b'\x00\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00'

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Das sieht so aus, also ob die String-Representation einfach den Bytes im Hex-Format entspricht.

Sieh dir mal die Klassenmethode mysummary(self) als Beispiel dafür an, wie man die Daten ausgeben könnte: - die Methode sprintf() der Klasse Packet ist hier dokumentiert: secdev/scapy/blob/master/scapy/packet.py

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

@seahawk1986: <korinthenkackermodus>mysummery() ist keine Klassenmethode, sondern eine ganz normale Methode.</korinthenkackermodus>

Antworten |