diff --git a/src/SUMMARY.md b/src/SUMMARY.md index edddf45ba..52e7cc8b6 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -37,6 +37,7 @@ - [Mobile Phishing Malicious Apps](generic-methodologies-and-resources/phishing-methodology/mobile-phishing-malicious-apps.md) - [Phishing Files & Documents](generic-methodologies-and-resources/phishing-methodology/phishing-documents.md) - [Basic Forensic Methodology](generic-methodologies-and-resources/basic-forensic-methodology/README.md) + - [Adaptixc2 Config Extraction And Ttps](generic-methodologies-and-resources/basic-forensic-methodology/adaptixc2-config-extraction-and-ttps.md) - [Baseline Monitoring](generic-methodologies-and-resources/basic-forensic-methodology/file-integrity-monitoring.md) - [Anti-Forensic Techniques](generic-methodologies-and-resources/basic-forensic-methodology/anti-forensic-techniques.md) - [Docker Forensics](generic-methodologies-and-resources/basic-forensic-methodology/docker-forensics.md) @@ -130,6 +131,7 @@ - [Seccomp](linux-hardening/privilege-escalation/docker-security/seccomp.md) - [Weaponizing Distroless](linux-hardening/privilege-escalation/docker-security/weaponizing-distroless.md) - [Escaping from Jails](linux-hardening/privilege-escalation/escaping-from-limited-bash.md) + - [Posix Cpu Timers Toctou Cve 2025 38352](linux-hardening/privilege-escalation/linux-kernel-exploitation/posix-cpu-timers-toctou-cve-2025-38352.md) - [euid, ruid, suid](linux-hardening/privilege-escalation/euid-ruid-suid.md) - [Interesting Groups - Linux Privesc](linux-hardening/privilege-escalation/interesting-groups-linux-pe/README.md) - [lxd/lxc Group - Privilege escalation](linux-hardening/privilege-escalation/interesting-groups-linux-pe/lxd-privilege-escalation.md) @@ -771,7 +773,7 @@ - [Stack Shellcode - arm64](binary-exploitation/stack-overflow/stack-shellcode/stack-shellcode-arm64.md) - [Stack Pivoting - EBP2Ret - EBP chaining](binary-exploitation/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md) - [Uninitialized Variables](binary-exploitation/stack-overflow/uninitialized-variables.md) - - [ROP and JOP](binary-exploitation/rop-return-oriented-programing/README.md) + - [ROP & JOP](binary-exploitation/rop-return-oriented-programing/README.md) - [BROP - Blind Return Oriented Programming](binary-exploitation/rop-return-oriented-programing/brop-blind-return-oriented-programming.md) - [Ret2csu](binary-exploitation/rop-return-oriented-programing/ret2csu.md) - [Ret2dlresolve](binary-exploitation/rop-return-oriented-programing/ret2dlresolve.md) @@ -840,6 +842,7 @@ - [WWW2Exec - GOT/PLT](binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md) - [WWW2Exec - \_\_malloc_hook & \_\_free_hook](binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md) - [Common Exploiting Problems](binary-exploitation/common-exploiting-problems.md) +- [Linux kernel exploitation - toctou](binary-exploitation/linux-kernel-exploitation/posix-cpu-timers-toctou-cve-2025-38352.md) - [Windows Exploiting (Basic Guide - OSCP lvl)](binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md) - [iOS Exploiting](binary-exploitation/ios-exploiting/README.md) - [ios CVE-2020-27950-mach_msg_trailer_t](binary-exploitation/ios-exploiting/CVE-2020-27950-mach_msg_trailer_t.md) @@ -937,6 +940,4 @@ - [Stealing Sensitive Information Disclosure from a Web](todo/stealing-sensitive-information-disclosure-from-a-web.md) - [Post Exploitation](todo/post-exploitation.md) - [Investment Terms](todo/investment-terms.md) -- [Cookies Policy](todo/cookies-policy.md) - - - [Posix Cpu Timers Toctou Cve 2025 38352](linux-hardening/privilege-escalation/linux-kernel-exploitation/posix-cpu-timers-toctou-cve-2025-38352.md) \ No newline at end of file +- [Cookies Policy](todo/cookies-policy.md) \ No newline at end of file diff --git a/src/generic-methodologies-and-resources/basic-forensic-methodology/adaptixc2-config-extraction-and-ttps.md b/src/generic-methodologies-and-resources/basic-forensic-methodology/adaptixc2-config-extraction-and-ttps.md new file mode 100644 index 000000000..3b703492a --- /dev/null +++ b/src/generic-methodologies-and-resources/basic-forensic-methodology/adaptixc2-config-extraction-and-ttps.md @@ -0,0 +1,243 @@ +# AdaptixC2 Konfigurations-Extraktion und TTPs + +{{#include ../../banners/hacktricks-training.md}} + +AdaptixC2 ist ein modulares, Open‑Source Post‑Exploitation/C2‑Framework mit Windows x86/x64 beacons (EXE/DLL/service EXE/raw shellcode) und BOF‑Support. Diese Seite dokumentiert: +- Wie seine RC4‑verpackte Konfiguration eingebettet ist und wie man sie aus Beacons extrahiert +- Netzwerk-/Profilindikatoren für HTTP/SMB/TCP Listener +- Häufige Loader- und Persistence‑TTPs, die in der Wildnis beobachtet wurden, mit Links zu relevanten Windows‑Technikseiten + +## Beacon-Profile und Felder + +AdaptixC2 unterstützt drei Haupt‑Beacon‑Typen: +- BEACON_HTTP: web C2 mit konfigurierbaren Servern/Ports/SSL, Methode, URI, Headern, User‑Agent und einem benutzerdefinierten Parameternamen +- BEACON_SMB: named‑pipe Peer‑to‑Peer C2 (Intranet) +- BEACON_TCP: direkte Sockets, optional mit einem vorangestellten Marker, um den Protokollstart zu verschleiern + +Typische Profilfelder, die in HTTP‑Beacon‑Konfigurationen beobachtet werden (nach der Entschlüsselung): +- agent_type (u32) +- use_ssl (bool) +- servers_count (u32), servers (array of strings), ports (array of u32) +- http_method, uri, parameter, user_agent, http_headers (length‑prefixed strings) +- ans_pre_size (u32), ans_size (u32) – used to parse response sizes +- kill_date (u32), working_time (u32) +- sleep_delay (u32), jitter_delay (u32) +- listener_type (u32) +- download_chunk_size (u32) + +Example default HTTP profile (from a beacon build): +```json +{ +"agent_type": 3192652105, +"use_ssl": true, +"servers_count": 1, +"servers": ["172.16.196.1"], +"ports": [4443], +"http_method": "POST", +"uri": "/uri.php", +"parameter": "X-Beacon-Id", +"user_agent": "Mozilla/5.0 (Windows NT 6.2; rv:20.0) Gecko/20121202 Firefox/20.0", +"http_headers": "\r\n", +"ans_pre_size": 26, +"ans_size": 47, +"kill_date": 0, +"working_time": 0, +"sleep_delay": 2, +"jitter_delay": 0, +"listener_type": 0, +"download_chunk_size": 102400 +} +``` +Beobachtetes bösartiges HTTP-Profil (echter Angriff): +```json +{ +"agent_type": 3192652105, +"use_ssl": true, +"servers_count": 1, +"servers": ["tech-system[.]online"], +"ports": [443], +"http_method": "POST", +"uri": "/endpoint/api", +"parameter": "X-App-Id", +"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.6167.160 Safari/537.36", +"http_headers": "\r\n", +"ans_pre_size": 26, +"ans_size": 47, +"kill_date": 0, +"working_time": 0, +"sleep_delay": 4, +"jitter_delay": 0, +"listener_type": 0, +"download_chunk_size": 102400 +} +``` +## Verschlüsselte Konfigurationsverpackung und Ladepfad + +Wenn der Operator im builder auf Create klickt, bettet AdaptixC2 das verschlüsselte Profil als tail blob in den beacon ein. Das Format ist: +- 4 Bytes: Größe der Konfiguration (uint32, little‑endian) +- N Bytes: RC4‑verschlüsselte Konfigurationsdaten +- 16 Bytes: RC4‑Schlüssel + +Der beacon loader kopiert den 16‑Byte‑Schlüssel vom Ende und RC4‑entschlüsselt den N‑Byte‑Block an Ort und Stelle: +```c +ULONG profileSize = packer->Unpack32(); +this->encrypt_key = (PBYTE) MemAllocLocal(16); +memcpy(this->encrypt_key, packer->data() + 4 + profileSize, 16); +DecryptRC4(packer->data()+4, profileSize, this->encrypt_key, 16); +``` +Practical implications: +- Die gesamte Struktur liegt oft im PE-.rdata-Abschnitt. +- Die Extraktion ist deterministisch: Größe lesen, den ciphertext dieser Größe lesen, den unmittelbar danach platzierten 16‑Byte‑Key lesen und dann mit RC4 entschlüsseln. + +## Workflow zur Konfigurations-Extraktion (Verteidiger) + +Schreibe einen Extractor, der die beacon-Logik nachahmt: +1) Finde den Blob innerhalb der PE (häufig .rdata). Ein pragmatischer Ansatz ist, .rdata nach einem plausiblen [size|ciphertext|16‑byte key]-Layout zu scannen und RC4 zu versuchen. +2) Lese die ersten 4 Bytes → size (uint32 LE). +3) Lese die nächsten N=size Bytes → ciphertext. +4) Lese die letzten 16 Bytes → RC4 key. +5) RC4‑entschlüssele den ciphertext. Dann parse das plain profile als: +- u32/boolean scalars wie oben beschrieben +- length‑prefixed strings (u32 length gefolgt von Bytes; trailing NUL kann vorhanden sein) +- arrays: servers_count gefolgt von entsprechend vielen [string, u32 port]-Paaren + +Minimaler Python proof‑of‑concept (standalone, ohne externe Abhängigkeiten), das mit einem vorab extrahierten Blob funktioniert: +```python +import struct +from typing import List, Tuple + +def rc4(key: bytes, data: bytes) -> bytes: +S = list(range(256)) +j = 0 +for i in range(256): +j = (j + S[i] + key[i % len(key)]) & 0xFF +S[i], S[j] = S[j], S[i] +i = j = 0 +out = bytearray() +for b in data: +i = (i + 1) & 0xFF +j = (j + S[i]) & 0xFF +S[i], S[j] = S[j], S[i] +K = S[(S[i] + S[j]) & 0xFF] +out.append(b ^ K) +return bytes(out) + +class P: +def __init__(self, buf: bytes): +self.b = buf; self.o = 0 +def u32(self) -> int: +v = struct.unpack_from(' int: +v = self.b[self.o]; self.o += 1; return v +def s(self) -> str: +L = self.u32(); s = self.b[self.o:self.o+L]; self.o += L +return s[:-1].decode('utf-8','replace') if L and s[-1] == 0 else s.decode('utf-8','replace') + +def parse_http_cfg(plain: bytes) -> dict: +p = P(plain) +cfg = {} +cfg['agent_type'] = p.u32() +cfg['use_ssl'] = bool(p.u8()) +n = p.u32() +cfg['servers'] = [] +cfg['ports'] = [] +for _ in range(n): +cfg['servers'].append(p.s()) +cfg['ports'].append(p.u32()) +cfg['http_method'] = p.s() +cfg['uri'] = p.s() +cfg['parameter'] = p.s() +cfg['user_agent'] = p.s() +cfg['http_headers'] = p.s() +cfg['ans_pre_size'] = p.u32() +cfg['ans_size'] = p.u32() + cfg['ans_pre_size'] +cfg['kill_date'] = p.u32() +cfg['working_time'] = p.u32() +cfg['sleep_delay'] = p.u32() +cfg['jitter_delay'] = p.u32() +cfg['listener_type'] = 0 +cfg['download_chunk_size'] = 0x19000 +return cfg + +# Usage (when you have [size|ciphertext|key] bytes): +# blob = open('blob.bin','rb').read() +# size = struct.unpack_from('&1 | grep -E "Authority|TeamIdentifier" @@ -141,23 +141,23 @@ spctl --assess --verbose /Applications/Safari.app ### File Stacking -Wenn Sie wissen, dass ein Ordner, der die **Dateien** eines Webservers enthält, **zu einem bestimmten Datum zuletzt aktualisiert wurde**, **prüfen** Sie das **Datum**, an dem alle **Dateien** auf dem **Webserver** erstellt und geändert wurden, und wenn ein Datum **verdächtig** ist, untersuchen Sie diese Datei. +Wenn Sie wissen, dass ein Ordner, der die **Dateien** eines Webservers enthält, **zu einem bestimmten Datum zuletzt aktualisiert wurde**. **Prüfen** Sie das **Datum**, an dem alle **Dateien** des **Webservers erstellt und geändert wurden**, und wenn ein Datum **verdächtig** ist, untersuchen Sie diese Datei. ### Baselines -Wenn die **Dateien** eines Ordners **nicht hätten verändert werden dürfen**, können Sie den **hash** der **originalen Dateien** des Ordners berechnen und **mit** den **aktuellen** vergleichen. Alles, was verändert wurde, ist **verdächtig**. +Wenn die Dateien eines Ordners **nicht hätten verändert werden dürfen**, können Sie den **Hash** der **Originaldateien** des Ordners berechnen und mit den **aktuellen** vergleichen. Alles, was verändert wurde, ist **verdächtig**. -### Statistische Analyse +### Statistical Analysis -Wenn die Informationen in Logs gespeichert sind, können Sie **Statistiken prüfen**, z. B. wie oft jede Datei eines Webservers aufgerufen wurde — eine web shell könnte zu den am häufigsten aufgerufenen gehören. +Wenn die Informationen in Logs gespeichert sind, können Sie **Statistiken prüfen**, z. B. wie oft jede Datei eines Webservers aufgerufen wurde, da eine web shell möglicherweise eine der meistgenutzten ist. --- -### Android in-app native Telemetrie (no root) +### Android in-app native Telemetrie (kein Root) -Auf Android können Sie nativen Code innerhalb des Ziel-App-Prozesses instrumentieren, indem Sie vor der Initialisierung anderer JNI libs eine kleine Logger-Library vorladen. Das ermöglicht frühe Einsicht in natives Verhalten ohne systemweite Hooks oder root. Ein verbreiteter Ansatz ist SoTap: legen Sie libsotap.so für das passende ABI in das APK und fügen Sie früh einen System.loadLibrary("sotap")-Aufruf ein (z. B. im static initializer oder in Application.onCreate), danach sammeln Sie Logs aus internen/externen Pfaden oder als Fallback Logcat. +Auf Android können Sie nativen Code innerhalb des Ziel-App-Prozesses instrumentieren, indem Sie eine kleine Logger-Bibliothek vorladen, bevor andere JNI libs initialisiert werden. Das bietet frühzeitige Einsicht in natives Verhalten ohne systemweite Hooks oder Root. Ein verbreiteter Ansatz ist SoTap: legen Sie libsotap.so für die passende ABI in das APK und fügen Sie früh einen System.loadLibrary("sotap")-Aufruf ein (z. B. static initializer oder Application.onCreate), und sammeln Sie dann Logs aus internen/externen Pfaden oder als Logcat-Fallback. -Siehe die Android native reversing Seite für Details zur Einrichtung und zu den Log-Pfaden: +Siehe die Android native reversing-Seite für Setup-Details und Log-Pfade: {{#ref}} ../../mobile-pentesting/android-app-pentesting/reversing-native-libraries.md @@ -165,13 +165,13 @@ Siehe die Android native reversing Seite für Details zur Einrichtung und zu den --- -## Deobfuskation dynamischer Control-Flow (JMP/CALL RAX Dispatchers) +## Deobfuskation dynamischer Kontrollflüsse (JMP/CALL RAX Dispatchers) -Moderne Malware-Familien missbrauchen stark die Control-Flow Graph (CFG)-Obfuskation: anstatt eines direkten jump/call berechnen sie das Ziel zur Laufzeit und führen einen `jmp rax` oder `call rax` aus. Ein kleiner *dispatcher* (typischerweise neun Instruktionen) legt das endgültige Ziel abhängig von den CPU-Flags `ZF`/`CF` fest und bricht damit die statische CFG-Wiederherstellung vollständig. +Moderne malware-Familien missbrauchen stark die Kontrollflussgraph (CFG)-Obfuskation: anstatt eines direkten jump/call berechnen sie das Ziel zur Laufzeit und führen ein `jmp rax` oder `call rax` aus. Ein kleiner *Dispatcher* (typischerweise neun Instruktionen) setzt das finale Ziel abhängig von den CPU-Flags `ZF`/`CF` und bricht damit die statische CFG-Rekonstruktion vollständig. -Die Technik – demonstriert vom SLOW#TEMPEST loader – lässt sich mit einem dreistufigen Workflow umgehen, der nur auf IDAPython und dem Unicorn CPU emulator basiert. +Die Technik – demonstriert am SLOW#TEMPEST loader – lässt sich mit einem dreistufigen Workflow umgehen, der nur auf IDAPython und dem Unicorn CPU emulator basiert. -### 1. Alle indirekten jump / call lokalisieren +### 1. Lokalisieren Sie jeden indirekten jump / call ```python import idautils, idc @@ -180,7 +180,7 @@ mnem = idc.print_insn_mnem(ea) if mnem in ("jmp", "call") and idc.print_operand(ea, 0) == "rax": print(f"[+] Dispatcher found @ {ea:X}") ``` -### 2. Extrahiere den dispatcher byte-code +### 2. Dispatcher-Bytecode extrahieren ```python import idc @@ -211,9 +211,9 @@ mu.reg_write(UC_X86_REG_RAX, 0) mu.emu_start(BASE, BASE+len(code)) return mu.reg_read(UC_X86_REG_RAX) ``` -Führe `run(code,0,0)` und `run(code,1,1)` aus, um die *false*- bzw. *true*-Branch-Ziele zu ermitteln. +Führe `run(code,0,0)` und `run(code,1,1)` aus, um die Ziele des *false*- und *true*-Zweigs zu erhalten. -### 4. Direkten jump / call zurückpatchen +### 4. Einen direkten jump / call zurückpatchen ```python import struct, ida_bytes @@ -222,28 +222,37 @@ op = 0xE8 if is_call else 0xE9 # CALL rel32 or JMP rel32 disp = target - (ea + 5) & 0xFFFFFFFF ida_bytes.patch_bytes(ea, bytes([op]) + struct.pack('