
BOF POC des DSCourier-Projekts / Aufrufen von WinGet über COM
Dies ist eine BOF-Implementierung des Projekts DSCourier von Dylan Davis und Matthew Schramm. Es verwendet die COM-Schnittstelle von WinGet, um beliebigen PowerShell-Code in einem von Microsoft signierten und vertrauenswürdigen Prozess auszuführen. Der vollständige Forschungsblogbeitrag ist hier zu finden.
Im Gegensatz zu den meisten Projekten, die ich veröffentliche, ist dies KEIN einsatzbereites Werkzeug, sondern eher ein Proof of Concept. Ich habe mich entschieden, dies nicht weiterzuverfolgen, nachdem ich eine Reihe von Problemen entdeckt habe, die einer einfachen Bereitstellung als BOF im Wege stehen. Der Code wurde fast vollständig mit Claude erstellt. Mehrere Probleme sind ungelöst und werden unten diskutiert.
Fügen Sie Ihren beliebigen PowerShell-Code in die Datei dist/rev.yml ein. Standardmäßig enthält sie eine einfache PowerShell-Reverse-Shell aus dem ursprünglichen Repository. Wenn Sie diese verwenden möchten, ersetzen Sie die IP im vorhandenen Beispiel durch Ihre gewünschte IP.
Beispiel mit der PowerShell-Reverse-Shell:


In keiner bestimmten Reihenfolge sind hier einige Probleme/Einschränkungen dieses Tools aufgeführt.
Microsoft.Management.Configuration.winmd im selben Verzeichnis wie die ausführbare Datei vorhanden sein, die die COM-Aufrufe tätigt. Dies stellt ein unmittelbares Problem dar, wenn ein Beacon aus einem ausgehöhlten system32-Prozess ausgeführt wird, in dem normale Benutzer keine Schreibrechte haben. Um dies zu umgehen, wird die Datei stattdessen in %APPDATA%\temp abgelegt und die Funktion WinTypes!RoGetMetaDataFile, die den winmd-Dateipfad abruft, wird mit einem Inline-Hook versehen, damit wir den temporären Pfad angeben können. Dies ermöglicht das Lesen der winmd-Datei / das erfolgreiche Durchführen der COM-Aufrufe, bedeutet aber, dass VirtualProtect-Aufrufe getätigt werden und DLL-Speicher überschrieben wird, was IOCs erzeugt.pwsh-Ressource in WinGet ein conhost.exe-Prozess unter ConfigurationRemotingServer.exe gestartet. Claude schlug vor, dass es möglich wäre, anstelle von pwsh ein benutzerdefiniertes Binärmodul als Ressource zu laden, was das conhost-Problem lösen sollte, aber dies erfordert das Ablegen zusätzlicher Dateien auf der Festplatte, und ich konnte es nicht zum Laufen bringen. Es könnte auch nicht möglich sein. Wenn doch, würde dies die Tür öffnen, eine generische .NET-DLL auf die Festplatte zu legen, die von geladen werden und übergebenen Shellcode/Parameter usw. ausführen könnte.Dieses Tool wurde ohne die Verwendung normaler BOF-API-Deklarationen (z. B. einer bofdefs.h-Datei) geschrieben. Wie in diesem Blogbeitrag von Matt Ehrnschwender beschrieben, ist es möglich, mit objcopy die richtigen Symbole im Format DLL$API nach der Kompilierung in den BOF zu patchen.
Ich habe ein Tool namens BOFPatcher geschrieben, das diesen Prozess automatisiert. Dies ermöglicht es Benutzern, BOFs als normales C zu schreiben, ohne sich um umständliche API-Deklarationen kümmern zu müssen:

Dieses Tool ist für diejenigen verfügbar, die meinen Kurs BOF Development and Tradecraft erwerben.
Obwohl das BOFPatcher-Tool nicht in diesem Repository enthalten ist, ruft das Makefile dieses Tools objcopy auf und übergibt eine Datei imports_dscourier64.txt, die die richtigen Symbolersetzungen enthält, wodurch der BOF nutzbar wird.
ConfigurationRemotingServer.exeConfigurationRemotingServer.exe-Prozess abgeschlossen ist; bei dem einfachen Reverse-Shell-Beispiel würde dies bedeuten, dass sich der Beacon erst wieder eincheckt, wenn die Shell beendet wird. Der Wechsel zu den asynchronen Schnittstellen verhindert dieses Problem, führt aber zu einigen Timing-Problemen. Es gibt einen fest codierten 3-Sekunden-Schlaf, der in der Praxis funktioniert hat, um zwischen bestimmten Aufrufen zu verzögern, aber dies ist natürlich nicht die richtige Art, dies zu implementieren.winget-cli .msixbundle von GitHub, Entpacken, Extrahieren der .msix und Auffinden der .winmd-Datei gewonnen. Dann wurde winmdidl.exe verwendet, um die IDL-Dateien zu extrahieren. Anschließend wurde midlrt.exe verwendet, um die IDL in Header/.c-Dateien zu konvertieren, die dann von Claude auf die erforderlichen Definitionen reduziert wurden. Es ist immer noch ein Code-Wirrwarr. Dieser Microsoft-Link wird wahrscheinlich hilfreich sein, um diesen Prozess besser zu verstehen.winget configure --enable muss mindestens einmal auf einem Zielcomputer ausgeführt worden sein, damit der BOF erfolgreich ist. Ich habe den Grund dafür darauf zurückgeführt, dass das DotNet-Verzeichnis mit ConfigurationRemotingServer.exe erst existiert, nachdem der Befehl ausgeführt / die Binärdatei heruntergeladen wurde. Diese Dateien befinden sich in C:\Program files\WindowsApps\... und sind daher für einen Benutzer mit niedrigen Rechten nicht beschreibbar, sodass wir diese Dateien nicht einmal selbst mit dem BOF auf die Festplatte legen können, damit alles funktioniert.configure --enable noch nicht ausgeführt wurde, sind Sie aufgeschmissen. Für Post-Exploitation-Zwecke könnte es einen Wert haben, aber Sie sind etwas eingeschränkt, da es sich um einen festen Prozess handelt, der Ihren Code startet/ausführt, und da es sich um PowerShell handelt, ist AMSI im Spiel.