Beim Verwenden anderer Webshells bin ich häufig auf folgende Probleme gestoßen:
Sie verwenden neue PHP-Syntaxmerkmale, die mit der alten PHP-Version
auf manchen Zielsystemen nicht kompatibel sind.
Sie treffen falsche Annahmen über die Remote-URL und brechen dadurch die
PHP-Code-Injection oder die vom Server (un)erwarteten GET-Parameter.
Sie zeigen oft nur den Inhalt der Standardausgabe und verwerfen stderr.
Sie verarbeiten Sonderzeichen in der Anzeige (z. B. <) nur unzureichend.
Sie erlauben keinen Datei-Upload oder bieten eine Methode an, die von den
Einstellungen des Zielsystems nicht unterstützt/blockiert wird.
Sie erfordern manuelle Anpassungen, je nachdem, ob das Zielsystem
ein UNIX-ähnliches oder ein Windows-System ist.
Hier ist mein Versuch, diese Probleme zu lösen. Im Gegensatz zu manchen anderen
Lösungen zielt dieses Skript nicht einmal annähernd darauf ab, ein „voll
ausgestattetes Post-Exploitation-Framework" zu werden. Sein einziges Ziel ist
es, einen stabilen und zuverlässigen Weg zu bieten, um beim Zielsystem einen
Fuß in die Tür zu bekommen, indem es sich so weit wie möglich an das
KISS-Prinzip hält und allgemein genug bleibt, um Ihnen von dort aus das zu
bauen, was Sie möchten, ohne Ihnen im Weg zu stehen.
PHP-Webshell von WhiteWinterWolf:
Der Zugriff kann passwortgeschützt sein.
Ist ohne Änderungen mit UNIX-ähnlichen und Windows-Systemen kompatibel.
Versucht, den PHP-Ausgabepuffer zu leeren (d. h. jeglichen „Müll"-Code zu verwerfen,
der bereits von der angegriffenen Anwendung erzeugt wurde) und die Beendigung der
PHP-Codeausführung zu erzwingen, um ein möglichst sauberes und stabiles Verhalten
zu gewährleisten.
Das Formular wird als POST-Anfrage gesendet, wobei exakt dieselbe URL (einschließlich
exakt derselben GET-Parameter, nichts wird hinzugefügt oder entfernt) verwendet wird,
die ursprünglich für den Zugriff verwendet wurde. ,
was es für ausgefallene Code-Injection-Techniken geeignet macht. Außerdem protokolliert
der entfernte Server möglicherweise keine POST-Daten und damit auch nicht die tatsächlich
auf dem Zielsystem ausgeführten Befehle.
Das aktuelle Arbeitsverzeichnis wird auf das tatsächliche aktuelle
Arbeitsverzeichnis gesetzt. Das hat den zusätzlichen Vorteil, dass Sie leicht
den Typ des entfernten Systems erkennen können (/var/www/html vs. C:\Inetpub\wwwroot).
Der Host für den Abruf wird auf Ihre IP-Adresse gesetzt, so wie das
Zielsystem sie sieht.
Sie können das Arbeitsverzeichnis frei festlegen, und der Wert bleibt über Befehle hinweg erhalten.
Eine spezielle Warnmeldung wird angezeigt, falls die PHP-Einstellung open_basedir
Ihre Bewegungsfreiheit innerhalb des Servers einschränken könnte.
Es gibt zwei verschiedene Möglichkeiten, Dateien auf Ihre Zielsysteme hochzuladen:
Ein klassisches Upload-Formular, sofern die PHP-Einstellungen des entfernten Servers dies erlauben.
Die Datei von einem bestimmten Host und einer URL abrufen (normalerweise ein vom
Angreifer kontrollierter Host). Diese Funktion implementiert eine sehr einfache
HTTP-Abruffunktion, mit der die Einschränkung der PHP-Einstellung url_allow_fopen
umgangen werden kann. Sie beherrscht keine ausgefallenen Dinge wie HTTP-Weiterleitungen
oder Authentifizierung, kann SSL/TLS aber möglicherweise dennoch handhaben, indem
der Hostname entsprechend vorangestellt wird (tls://203.0.113.37).
Ein Link Clear cmd ermöglicht es, das Befehlsformularfeld mit einem einzigen Klick zu
leeren und den Fokus darauf zu setzen. Ich finde das praktisch, um schnell ein paar
beliebige Befehle auf dem Server auszuführen, aber diese Funktion ist auf JavaScript
angewiesen. Wenn Sie JavaScript vermeiden möchten, können Sie diese eine Zeile entfernen;
das hat keine Auswirkungen auf den Rest der Webshell, die sonst nirgendwo JavaScript verwendet.
Dieses Skript wendet die Formulareinstellungen in der folgenden Reihenfolge an:
Aktuelles Arbeitsverzeichnis.
Hochzuladende Dateien.
Auszuführender Befehl.
Dies ermöglicht es, eine Datei in ein bestimmtes Verzeichnis hochzuladen und sie
in einer einzigen HTTP-Anfrage sofort auszuführen.