Powershell ist ein fester Bestandteil moderner Windows-Systeme und bietet durch .NET-Anbindung mächtige Möglichkeiten zur Automatisierung. Diese Eigenschaften machen es auch für Angreifer attraktiv:
- Auf jedem Windows-System vorhanden (kein zusätzlicher Code nötig)
- Direkter Zugriff auf Windows-APIs und Netzwerkressourcen
- Kann Code aus dem Speicher ausführen (fileless execution)
- Oft unzureichend überwacht oder eingeschränkt
Living off the Land-Taktiken nutzen Powershell, um Angriffe unauffällig und ohne zusätzliche Tools durchzuführen.
Powershell wird häufig verwendet, um Dateien oder Skripte aus dem Internet zu laden z. B. zur:
- Nachladung von Schadsoftware
- Kommunikation mit Command-and-Control-Servern
- Umgehung traditioneller Sicherheitsmaßnahmen
Einige Gründe für die proaktive Suche nach Powershell-Downloads:
- Früherkennung von Angriffen im Initial Access oder Execution-Phase
- Erkennung von Fileless Malware
Angreifer nutzen verschiedene Techniken, um Inhalte via Powershell herunterzuladen.
* Funktionalität: Dieses Cmdlet, verfügbar ab Powershell Version 3, fungiert ähnlich wie `wget` oder `curl` unter Linux. Es sendet HTTP-, HTTPS- oder FTP-Anfragen an eine angegebene URL und kann die Antwort verarbeiten oder, mithilfe des Parameters `-OutFile`, direkt in eine Datei speichern. Es unterstützt komplexere Webinteraktionen wie Authentifizierung und benutzerdefinierte Header.
* Anwendungsfälle & Risiken: Legitim für Web-Scraping, Herunterladen von Ressourcen oder Interaktion mit APIs. Wird von Angreifern häufig zum Herunterladen von Payloads verwendet, oft in Kombination mit `-OutFile`, um die Datei auf der Festplatte zu speichern, oder die Ausgabe wird an `Invoke-Expression` (IEX) weitergeleitet, um eine dateilose Ausführung zu erreichen. `Invoke-WebRequest` kann relativ langsam sein und hat eine potenzielle Abhängigkeit von Internet Explorer-Komponenten.
* Sytaxbeispiel:
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/ByteRay-Labs/NG-SIEM/refs/heads/main/README.md" -OutFile "README.md"
* Funktionalität: Nutzt die .NET Framework-Klasse `System.Net.WebClient`. Bietet Methoden wie `DownloadFile`, die eine Datei von einer URL herunterlädt und auf der Festplatte speichert, und `DownloadString`, die den Inhalt einer Ressource direkt als Zeichenkette zurückgibt. `DownloadString` wird häufig in Kombination mit `Invoke- Expression` für die dateilose Ausführung von Skripten verwendet.
* Anwendungsfälle & Risiken: Legitim für programmgesteuerte Dateidownloads in Skripten. Wird von Angreifern intensiv missbraucht, sowohl zum Herunterladen ausführbarer Payloads (`DownloadFile`) als auch zur dateilosen Ausführung (`DownloadString` + `IEX`). Ist mit Server Core kompatibel.
* Sytaxbeispiel:
(New-Object System.Net.WebClient).DownloadFile("https://raw.githubusercontent.com/ByteRay-Labs/NG-SIEM/refs/heads/main/README.md", "$PWD\README.md")
* Funktionalität: Verwendet den Background Intelligent Transfer Service (BITS), einen Windows-Dienst, der für asynchrone, gedrosselte und wiederaufnehmbare Dateiübertragungen konzipiert ist. Erfordert, dass der BITS-Dienst ausgeführt wird und das BitsTransfer-Modul importiert ist. Gut geeignet für große Dateien oder Hintergrundübertragungen.
* Anwendungsfälle & Risiken: Legitim für große Dateiübertragungen und Updates. Wird seltener für den initialen Zugriff durch Malware verwendet als IWR/WebClient, kann aber von Angreifern genutzt werden, um größere Werkzeuge, Payloads oder gestohlene Daten zu übertragen. Seine asynchrone Natur könnte zur Tarnung genutzt werden. Erfordert den BITS-Dienst; kann fehlschlagen, wenn der Dienst deaktiviert ist oder der Benutzer (abhängig von der Konfiguration) nicht angemeldet ist.
* Syntaxbeispiel:
Start-BitsTransfer -Source "https://raw.githubusercontent.com/ByteRay-Labs/NG-SIEM/refs/heads/main/README.md" -Destination "$PWD\README.md"
#event_simpleName=CommandHistory
| CommandHistory=/Invoke\-WebRequest|Net\.WebClient|Start\-BitsTransfer/i
| regex("(?<URL>https?://[^'\"]+)", field=CommandHistory)
| replace("https://", with="", field=URL, as=ShortURL)
| replace("\/.*", with="", field=ShortURL, as=otx_lookup)
| UrlBase:="https://otx.alienvault.com/indicator/domain/"
| format(format="[Alienvault](%s%s)", field=[UrlBase, otx_lookup], as=DomainLookup)
| table([DomainLookup, URL, ComputerName, UserName, CommandHistory], limit=20000)