Ich möchte den Malware-Analysebericht von Joe Sandbox mit BeautifulSoup + Python im Internet durchsuchen, um die ** PowerShell-Befehlszeile ** zu erhalten.
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.
So führen Sie eine dynamische Analyse von Malware mit Joe Sandbox durch * https://qiita.com/hanzawak/items/ec665e0f96dc65f3def3
Web-Scraping von einer dynamischen Malware-Analyseseite mit BeautifulSoup + Python * https://qiita.com/hanzawak/items/0a8a26d1ebe62b84f847
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.
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.
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
Ich versuche, es zum Laufen zu bringen, wenn ich die unten beschriebenen Inhalte verbinde.
Importieren Sie neben BeautifulSoup auch Anfragen, Betriebssysteme und Re.
import requests
from bs4 import BeautifulSoup
import os
import re
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
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')
Die Partitur wird oben auf dem Bildschirm geschrieben. In diesem Fall beträgt die Punktzahl 56, aber wir erhalten diese Zahl.
Der entsprechende Code war unten.
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]))
Das folgende Beispielbildschirm enthält eine PowerShell-Befehlszeile.
Ich werde den hinteren Teil von der cmdline nach Powershell.exe bekommen. Der entsprechende Code war unten.
Ich werde den Inhalt überprüfen.
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)
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)
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")
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)
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