Rufen Sie mit BeautifulSoup + Python PowerShell-Befehle von einer Website für dynamische Malware-Analysen ab

Einführung

Ich möchte den Malware-Analysebericht von Joe Sandbox mit BeautifulSoup + Python im Internet durchsuchen, um die ** PowerShell-Befehlszeile ** zu erhalten.

Über Joe Sandbox

Es ist eine Site, die Malware analysiert und einen Bericht ausgibt. https://www.joesandbox.com

Es gibt verschiedene Versionen von JoeSandbox, aber mit der Version Cloud Basic können Sie Malware kostenlos analysieren. Darüber hinaus werden von Cloud Basic analysierte Berichte veröffentlicht, damit Sie die Analyseergebnisse anderer Personen anzeigen können. Die Web-API kann übrigens mit anderen Versionen als Cloud Basic verwendet werden, aber es scheint, dass sie nicht mit Cloud Basic verwendet werden kann.

Wenn Sie weitere Einzelheiten erfahren möchten, lesen Sie bitte die folgenden Informationen.

Was ich diesmal machen möchte

Rufen Sie die PowerShell-Befehlszeile aus dem Analysebericht von JoeSandbox Cloud Basic ab.

Wenn Sie es nur normal erhalten, werden die von der Malware ausgeführte PowerShell-Befehlszeile und die von der legitimen Datei ausgeführte PowerShell-Befehlszeile gemischt. Daher wird auch die Punktzahl erfasst, die den von Joe Sandbox beurteilten Grad an Malware angibt.

Die Punktzahl ergibt sich aus dem Folgenden.

image.png

Extrahieren Sie die PowerShell-Befehlszeile aus: In den folgenden Fällen wird "C: \ WINDOWS \ System32 \ WindowsPowerShell \ v1.0 \ Powershell.exe -noP -sta -w 1 -enc Abkürzung" extrahiert.

image.png

Die Ausgabe schreibt die Informationen wie folgt in eine Textdatei. Die Reihenfolge ist "Berichtsnummer, Punktzahl, PowerShell-Befehl" durch Kommas getrennt.

ReportNumber,DetectionScore,PowerShellCommandLine
236546,56,C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -noP -sta -w 1 -enc Abkürzung
236547,99,C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -NoP -NonI -W Hiden -Exec Bypass Abkürzung
236548,10,C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe Abkürzung

Code

Ich versuche, es zum Laufen zu bringen, wenn ich die unten beschriebenen Inhalte verbinde.

Importieren Sie die erforderlichen Bibliotheken

Importieren Sie neben BeautifulSoup auch Anfragen, Betriebssysteme und Re.

import requests
from bs4 import BeautifulSoup
import os
import re

Geben Sie die zu extrahierende Berichtsnummer an

Bereiten Sie die Eingabe von und das Extrahieren von Informationen aus mehreren Berichten vor. Hier wird nur eine zum Testen angegeben.

report_num_from = 236543
report_num_to = 236543

Crawlen Sie die angegebene Seite

Die URL des Berichts lautet wie folgt. Dieser "236543" -Teil scheint die Berichtsnummer zu sein, daher möchte ich diese Nummer wiederholen. https://www.joesandbox.com/analysis/236543/0/html

def extract_powershell_command(report_num_from, report_num_to):
    for reoprt_num in range(report_num_from, report_num_to + 1):
        ps_cmdline = []
        try:
            target_url = 'https://www.joesandbox.com/analysis/' + str(reoprt_num) + '/0/html'
            response = requests.get(target_url)
            soup = BeautifulSoup(response.text, 'lxml')

Holen Sie sich Punktzahl

Die Partitur wird oben auf dem Bildschirm geschrieben. In diesem Fall beträgt die Punktzahl 56, aber wir erhalten diese Zahl.

image.png

Der entsprechende Code war unten. image.png

Es ist ein bisschen rau, aber Sie können eine Punktzahl erhalten, indem Sie die folgenden Schritte ausführen.

detection_score = 0
table = soup.findAll("table", {"id":"detection-details-overview-table"})[0]
rows = table.findAll("tr")
detection_score = re.sub(r'.+>(.+)</td></tr>', r'\1', str(rows[0]))

Rufen Sie die PowerShell-Befehlszeile ab

Das folgende Beispielbildschirm enthält eine PowerShell-Befehlszeile.

image.png

Ich werde den hinteren Teil von der cmdline nach Powershell.exe bekommen. Der entsprechende Code war unten.

image.png

Ich werde den Inhalt überprüfen.

image.png

Anscheinend ist es in der Tabelle gespeichert. Ich werde diejenige bekommen, die Powershell.exe enthält, getrennt durch Li, sie formatieren und die Informationen dahinter von cmdline erhalten. Es mag einen klügeren Weg geben, aber ich habe Folgendes getan:

startup = soup.find('div', id='startup1')

for line in startup.findAll('li'):
    if 'powershell.exe' in str(line):
        tmp = str(line).replace('<wbr>', '').replace('</wbr>', '')
        cmdline = re.sub(r'.+ cmdline: (.*) MD5: <span.+', r'\1', tmp)
        ps_cmdline.append(str(reoprt_num) + ',' + detection_score + ',' + cmdline)

Ausnahmebehandlung

Eine Ausnahmebehandlung ist vorerst ebenfalls enthalten. Rufen Sie am Ende des Prozesses die Funktion save_file auf (später beschrieben).

except IndexError as e:
    ps_cmdline.append('{},ERROR:{}'.format(reoprt_num,e))

except Exception as e:
    ps_cmdline.append('{},ERROR:{}'.format(reoprt_num,e))

finally:
    save_file(ps_cmdline)

Datei schreiben

Dies ist der Vorgang des Schreibens in eine Datei. Es ist nicht notwendig, es zu einer separaten Funktion zu machen, aber ich werde es in Zukunft in einen anderen Prozess als das Schreiben von Dateien ändern. Deshalb habe ich es zu einer Funktion gemacht, damit es leicht umgeschrieben werden kann. Erstellen und schreiben Sie output.txt in denselben Ordner.

def save_file(ps_cmdline):
    with open('./output.txt', 'a') as f:
        if os.stat('./output.txt').st_size == 0:
            f.write('ReportNumber,DetectionScore,PowerShellCommandLine\n')

        for x in ps_cmdline:
            f.write(str(x) + "\n")

Code abgeschlossen

Ich habe einen Kommentar hinzugefügt, indem ich den Code bisher verbunden habe. Offensichtlich sollte der von und bis angegebene Bereich moderat sein. Da es mit Jupyter Notebook erstellt und ausgeführt wurde, hat es das folgende Format.

import requests
from bs4 import BeautifulSoup
import os
import re

report_num_from = 236547
report_num_to = 236547

def extract_powershell_command(report_num_from, report_num_to):
    """
    Extract PowerShell Command from JoeSandbox analysis result.

    Parameters
    ----------
    report_num_from : int
        First report number to analyze
    report_num_to : int
        Last report number to analyze
    """

    for reoprt_num in range(report_num_from, report_num_to + 1):
        ps_cmdline = []
        try:
            target_url = 'https://www.joesandbox.com/analysis/' + str(reoprt_num) + '/0/html'
            response = requests.get(target_url)
            soup = BeautifulSoup(response.text, 'lxml')

            # Check JoeSandbox Detection Score (Maybe score above 40 is malicious)
            detection_score = 0
            table = soup.findAll("table", {"id":"detection-details-overview-table"})[0]
            rows = table.findAll("tr")
            detection_score = re.sub(r'.+>(.+)</td></tr>', r'\1', str(rows[0]))
    
            startup = soup.find('div', id='startup1')  # 'startup1' is a table with ProcessName & CommandLine

            for line in startup.findAll('li'):
                if 'powershell.exe' in str(line):
                    tmp = str(line).replace('<wbr>', '').replace('</wbr>', '')
                    cmdline = re.sub(r'.+ cmdline: (.*) MD5: <span.+', r'\1', tmp)
                    ps_cmdline.append(str(reoprt_num) + ',' + detection_score + ',' + cmdline)

        # Report number does not exist
        except IndexError as e:
            ps_cmdline.append('{},ERROR:{}'.format(reoprt_num,e))

        except Exception as e:
            ps_cmdline.append('{},ERROR:{}'.format(reoprt_num,e))

        finally:
            save_file(ps_cmdline)

def save_file(ps_cmdline):
    """
    Save the extraction results to a file.
    File I/O is a function because it may change.

    Parameters
    ----------
    ps_cmdline : list of str
        List containing process names.
    """

    with open('./output.txt', 'a') as f:
        if os.stat('./output.txt').st_size == 0:
            f.write('ReportNumber,DetectionScore,PowerShellCommandLine\n')

        for x in ps_cmdline:
            f.write(str(x) + "\n")

extract_powershell_command(report_num_from, report_num_to)

Ausführungsergebnis

Wenn Sie den obigen Code ausführen, erhalten Sie die folgenden Ergebnisse:

ReportNumber,DetectionScore,PowerShellCommandLine
236547,56,C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -noP -sta -w 1 -enc SQBmACgAJABQAFMAVgBFAFIAcwBJAG8AbgBUAGEAYgBMAGUALgBQA Abkürzung

Recommended Posts

Rufen Sie mit BeautifulSoup + Python PowerShell-Befehle von einer Website für dynamische Malware-Analysen ab
Holen Sie sich HTML von Element mit Python-Selen
[Hinweis] Mit Python Daten von PostgreSQL abrufen
Scraping von einer authentifizierten Site mit Python
[Verschiedene Bildanalysen mit Plotly] Dynamische Visualisierung mit Plotly [Python, Bild]
Datenanalyse mit Python 2
Massen-Download-Bilder von einer bestimmten Site-URL mit Python
Sammeln von Informationen von Twitter mit Python (morphologische Analyse mit MeCab)
Sprachanalyse mit Python
Holen Sie sich mit Python + Zeep einen Zeitplan von der Garoon SOAP API
Erhalten Sie E-Mails von Google Mail und beschriften Sie sie mit Python3
Holen Sie sich ein Date mit Python
Hauptkomponentenanalyse mit Python von nim mit nimpy
Sprachanalyse mit Python
Dynamische Analyse von Valgrind
Datenanalyse mit Python
Abrufen von Daten aus der Datenbank über ODBC mit Python (Access)
Abrufen von Daten aus der Analyse-API mit Google API Client für Python
Nachricht vom ersten Offset mit Kafka Consumer in Python abrufen
Holen Sie sich den Ländercode mit Python
[Python] Morphologische Analyse mit MeCab
[Analyse des gemeinsamen Auftretens] Einfache Analyse des gemeinsamen Auftretens mit Python! [Python]
Holen Sie sich Twitter-Timeline mit Python
Holen Sie sich Youtube-Daten mit Python
Emotionsanalyse von Python (word2vec)
Planare Skelettanalyse mit Python
Japanische morphologische Analyse mit Python
Holen Sie sich die Thread-ID mit Python
Beginnen Sie mit Python! ~ ② Grammatik ~
Holen Sie sich Lager mit Python
Holen Sie sich das Home-Verzeichnis mit Python
Holen Sie sich Tastaturereignis mit Python
Mit Skype benachrichtigen Sie mit Skype von Python!
Muskel-Ruck-Analyse mit Python
[PowerShell] Morphologische Analyse mit SudachiPy
Holen Sie sich Alembic-Informationen mit Python
Holen Sie sich vergangene Leistung von Läufern von Python Scraping Pferderennen Website
Einführung in die Datenanalyse mit Python P17-P26 [ch02 1.usa.gov Daten von bit.ly]
Holen Sie sich Daten von VPS MySQL mit Python 3 und SQL Alchemy
Von der Einführung von JUMAN ++ bis zur morphologischen Analyse von Japanisch mit Python
[Python] Holen Sie sich Elemente, indem Sie Attribute mit Präfixsuche in BeautifulSoup angeben
Beginnen Sie mit Python! ~ ① Umweltbau ~
Rufen Sie C von Python mit DragonFFI auf
Link, um mit Python zu beginnen
Dreidimensionale Skelettstrukturanalyse mit Python
Verwenden von Rstan aus Python mit PypeR
Holen Sie sich Bewertungen mit Python Googlemap API
Impedanzanalyse (EIS) mit Python [impedance.py]
Installieren Sie Python von der Quelle mit Ansible
Dynamischer Proxy mit Python, Ruby, PHP
Holen Sie sich das Wetter mit Python-Anfragen
Holen Sie sich Web-Screen-Capture mit Python
Holen Sie sich das Wetter mit Python-Anfragen 2
Holen Sie sich mit DataFrame eine Spalte aus DataFrame
[Python] Mit DataReader Wirtschaftsdaten abrufen
Text Mining mit Python ① Morphologische Analyse
Erste Schritte mit Python
Führen Sie Aprili von Python auf Orange aus