[PYTHON] Visualisierung der Verbindung zwischen Malware und dem Callback-Server

Visualisierung der Verbindung zwischen Malware und dem Callback-Server

das ist

Dieser Artikel befasst sich mit der Visualisierung der Verbindung zwischen Malware und dem Rückrufserver für die Praxis von networkx.

Umgebung

Kali Linux python 2.2.17

Grober Implementierungsfluss

  1. Argumenteinstellung
  2. Suffix-Organisation
  3. Hostnamen-Erfassungsfunktion
  4. Zielverzeichnis scannen
  5. Netzwerkerstellung

Laden Sie die gewünschte Bibliothek

import pefile
import sys
import argparse
import os
import pprint
import networkx
import re
from networkx.drawing.nx_agraph import write_dot
import collections
from networkx.algorithms import bipartite

Festlegen von Befehlszeilenargumenten

args = argparse.ArgumentParser()
args.add_argument("target")
args.add_argument("filename")
args.add_argument("malware_pro")
args.add_argument("hostname_pro")
args = args.parse_args()
network = networkx.Graph()

Suffix organisieren

suffixes = map(lambda string: string.strip(), open("suffixes.txt"))
suffixes = set(suffixes)

Organisieren Sie das Suffix in der Dateiuffixes.txt mithilfe des Map- und Lambda-Ausdrucks in den letzten beiden Zeilen. Sie können die Suffixes.txt selbst erstellen, aber es ist ärgerlich. Dieses Mal werde ich von Malware Data Science ausleihen. Außerdem wird das an das Zielargument übergebene Malware-Beispiel ausgeliehen. Zunächst strip (), da der Zeilenvorschubcode in den Suffixen.txt ein Hindernis darstellt. Beachten Sie, dass in Python3 der Rückgabewert der Map-Funktion das Objekt der Map-Funktion ist. </ font>

def get_hostnames(string):
    tmp = re.findall(r'(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-]{,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}',string)
    hostnames = filter(lambda hostname: hostname.split(".")[-1].lower() in suffixes, tmp)
    return hostnames

Geben Sie die Domäne mit einem regulären Ausdruck an und trennen Sie sie mit ".". Verringern Sie das letzte Element und überprüfen Sie mithilfe von Filter- und Lambda-Ausdrücken, ob es mit Suffixen übereinstimmt. Dies ist auch python3 ... </ font>

for root,dirs,files in os.walk(args.target):
    for file in files:
    try:
         pe = pefile.PE(os.path.join(root, file))
    except pefile.PEFormatError:
        continue
        f_path = os.path.join(root, file)
        contents = os.popen("strings '{0}'".format(f_path)).read()
        hostnames = get_hostnames(contents)
        if len(hostnames):
            network.add_node(file,label=file ,color='blue', penwidth=3,bipartite=0)
        for hostname in hostnames:
            network.add_node(hostname,label=hostname,color='purple', penwidth=10,bipartite=1)
            network.add_edge(hostname, file ,penwidth=2)
    if hostnames:
        print "Extracted hostname from:", file
        pprint.pprint(hostname)

Gehen Sie das Zielverzeichnis durch, rufen Sie das Stammverzeichnis, das Unterverzeichnis und den Dateipfad mit der for-Anweisung ab und überprüfen Sie die Pefile-Mobilisierung mit try. Wenn nicht, fahren Sie mit der nächsten Schleife fort. Speichern Sie den vollständigen Pfad der pe-Datei in f_path und übergeben Sie die druckbare Zeichenfolge als Argument an die Funktion get_hostnames. Sobald Sie den Hostnamen erhalten haben, erstellen Sie Content Salware bzw. ein Netzwerk von Hosts. Wenn der Hostname gefunden wird, registrieren Sie als Nächstes den Dateipfad in einem der zweiteiligen Netzwerke und alle Hostnamen selbst im anderen Teil des zweiteiligen Netzwerks. Zeigen Sie den Dateipfad, in dem der Hostname zum Zeitpunkt der Ausführung erhalten wurde, mit der letzten if-Anweisung </ font> in der Befehlszeile an

write_dot(network, args.filename)
codes= set(n for n,d in network.nodes(data=True) if d['bipartite']==0)
hostname = set(network)-codes

Schreiben Sie das Netzwerk in der ersten Zeile in den Dateinamen. Speichern Sie die Malware-Seite mit bipartite = 0 im Code. Durch Setzen von network.nodes (data = True) wird ein Taple zurückgegeben, das aus einem Knotennamen und einem Wörterbuch der Attribute des Knotens besteht. Geben Sie in ähnlicher Weise den Hostnamen in Hostname ein.

codes = bipartite.projected_graph(network, codes)
hostname = bipartite.projected_graph(network, hostname)

Erstellen Sie Projektionen für jede Malware und jeden Host. Die Projektion ist hier eine Vereinfachung des zweiteiligen Netzwerks. Beispielsweise wird bei Malware (Codes) Malware mit einem gemeinsamen Hostnamen verbunden. </ font>

write_dot(codes ,args.malware_pro)
write_dot(hostname ,args.hostname_pro)

Schreiben Sie jede erstellte Projektion in eine Datei. </ font>

Visualisierung mit fdp

fdp filename.dot -T png -o filename.png -Goverlap=false
fdp malware_pro.dot -T png -o malwre_pro.png -Goverlap=false
fdp hostname_pro.dot -T png -o hostname_pro.png -Goverlap=false

fdp ist ein Tool, das das Netzwerk anhand der Kraftorientierung visualisiert. Es gibt andere Tools wie sfdp, aber ich werde sie diesmal weglassen. Versuchen Sie es auszuführen.

filename.png
malware_pro.pnf
hostname_pro.png

Sie können dies mit einer Bilddatei namens tun.

eog filename.png

Wenn ich es öffne,
a.png

Fertig ^^

Was ist übrigens Machtorientierung?

Die Kantenlänge ist ein Problem beim Layout eines Netzwerks. Wenn die Knotengewichte gleich sind, sollten die Kantenlängen gleich sein. Wenn die Anzahl der Knoten jedoch 4 oder mehr beträgt, ist es absolut unmöglich, alle Knoten gleich lang zu machen, oder? Daher werden wir versuchen, diese Verzerrung zu minimieren. Hier kommt der kraftorientierte Algorithmus ins Spiel. Wenn Sie eine Kante als Feder simulieren, versucht die Kante automatisch, den Abstand zwischen den Knoten so gleichmäßig wie möglich zu gestalten. Der Frühling ist großartig. Dann. </ font>

Recommended Posts