Sneaky Patch
Executive summary — Sneaky Patch is an Easy kernel-forensics room on TryHackMe: we start from a Linux system already compromised by a kernel-level rootkit shipped as a loadable module (LKM). Unlike a userspace backdoor, this module lives inside the kernel and evades conventional detection tooling. The journey is pure analysis: we enumerate loaded modules, single out the suspiciousspatch, inspect its metadata withmodinfo, pull strings from the.kobinary and decode the hex-encoded flag. A lsmod → modinfo → strings → hex decode journey.
| Platform | TryHackMe |
| Operating system | Linux |
| Difficulty | Easy |
| Room | Sneaky Patch |
| Target IP | MACHINE_IP |
Attack map
[ACCESS] session on the compromised host
| sudo su -> root for system-level analysis
v
[dmesg] kernel logs -> module loading events
|
v
[lsmod] suspicious module: spatch (not in standard docs)
| modinfo spatch -> author "Cipher", "Cipher is always root"
v
[strings] spatch.ko -> [CIPHER BACKDOOR] secret in hex
| xxd -r -p
v
[FLAG] THM{sup3r_sn34ky_d00r}
. (alt) echo get_flag > /proc/cipher_bd -> dmesg1. Context: why a kernel rootkit is so dangerous
Before touching the keyboard it helps to understand the terrain. A classic userspace backdoor leaves visible traces: added SSH keys, bind/reverse shells, malicious cron jobs. A kernel rootkit plays in a different league: it is implemented as a Loadable Kernel Module (LKM) and runs in ring 0, with direct access to system structures. From there it can hide processes, files and connections from conventional tools, because it is the kernel itself that lies.
The key idea: when the attacker controls the kernel, you cannot trust the answers the system gives you. Forensics focuses on what the module cannot fully hide: its own presence in the module list, its metadata and the contents of its on-disk binary.
Resumen ejecutivo — Sneaky Patch es un room Easy de TryHackMe de forensia de kernel: partimos de un sistema Linux ya comprometido por un rootkit a nivel de kernel implementado como módulo cargable (LKM). A diferencia de una backdoor en userspace, este módulo vive dentro del kernel y esquiva las herramientas de detección habituales. El recorrido es puramente de análisis: enumeramos los módulos cargados, identificamos el sospechosospatch, inspeccionamos sus metadatos conmodinfo, extraemos cadenas del binario.koy decodificamos la flag oculta en hex. Un recorrido lsmod → modinfo → strings → hex decode.
| Plataforma | TryHackMe |
| Sistema operativo | Linux |
| Dificultad | Easy |
| Room | Sneaky Patch |
| IP objetivo | MACHINE_IP |
Mapa del ataque
[ACCESO] sesión en el host comprometido
| sudo su -> root para análisis a nivel de sistema
v
[dmesg] logs del kernel -> eventos de carga de módulos
|
v
[lsmod] módulo sospechoso: spatch (fuera de la documentación estándar)
| modinfo spatch -> autor "Cipher", "Cipher is always root"
v
[strings] spatch.ko -> [CIPHER BACKDOOR] secret en hex
| xxd -r -p
v
[FLAG] THM{sup3r_sn34ky_d00r}
. (alt) echo get_flag > /proc/cipher_bd -> dmesg1. Contexto: por qué un rootkit de kernel es tan peligroso
Antes de tocar el teclado conviene entender el terreno. Una backdoor clásica de userspace deja huellas visibles: claves SSH añadidas, bind/reverse shells, cron jobs maliciosos. Un rootkit de kernel juega en otra liga: se implementa como Loadable Kernel Module (LKM) y se ejecuta en ring 0, con acceso directo a las estructuras del sistema. Desde ahí puede ocultar procesos, ficheros y conexiones a las herramientas convencionales, porque es el propio kernel el que miente.
La idea clave: cuando el atacante controla el kernel, no puedes confiar en las respuestas que te da el sistema. La forensia se centra en lo que el módulo no puede ocultar del todo: su propia presencia en la lista de módulos, sus metadatos y el contenido de su binario en disco.
2. Elevate to root for the analysis
We start from a session on the already-compromised host. To inspect kernel modules and low-level logs we need root privileges:
sudo suWhy: lsmod, modinfo over paths under /lib/modules and detailed access to dmesg require root on most hardened systems. It is the first step to gain full visibility.
3. Review the kernel logs with dmesg
The kernel ring buffer records boot events and, crucially, module loading. It is the first place to look for anomalous activity:
dmesgThe output shows system initialization and module loading events. We look for unusual messages or modules loaded at unexpected times, which are often the first hint of a malicious LKM.
4. Enumerate loaded modules with lsmod
The most important step of the analysis: list every active kernel module and spot the one that does not belong.
lsmodAmong the legitimate modules we find spatch, a module that does not appear in standard Linux kernel documentation. An unknown name in the module list is exactly the kind of anomaly we are hunting for.
Analysis:lsmodreads/proc/modules. A rootkit may try to unlink itself from this list, but many proof-of-concept LKMs (like this one) do not, leaving themselves visible. Any module whose name you don't recognize deserves immediate investigation.
5. Inspect the module metadata with modinfo
With the suspicious module identified, we pull its metadata:
modinfo spatchThe output reveals very clear indicators of malicious intent:
description: Cipher is always root
author: Cipher
filename: /lib/modules/6.8.0-1016-aws/kernel/drivers/misc/spatch.koRed flags: a description like «Cipher is always root», an anonymous author («Cipher») and the location of the.ko. Thedrivers/misc/path is a plausible hiding spot for a module trying to pass as legitimate. All these fields are set by the module's author, so their tone gives away the purpose.
6. Analyze the module binary with strings
We now have the exact path of the .ko. We extract the readable text from the binary to look for embedded secrets:
strings /lib/modules/6.8.0-1016-aws/kernel/drivers/misc/spatch.koScrolling through the output we find a message left by the attacker with hex-encoded data:
[CIPHER BACKDOOR] Here's the secret: 54484d7b73757033725f736e33346b795f643030727d0aWhy it works:stringswalks the compiled binary and prints sequences of printable characters. Malware authors often leave debug strings, keys or —as here— the flag itself encoded in the binary. Analyzing the on-disk.kobypasses the rootkit's runtime lies entirely.
7. Decode the flag from hex
The hex string contains the flag. We decode it with xxd in reverse mode:
echo "54484d7b73757033725f736e33346b795f643030727d0a" | xxd -r -pResult:
THM{sup3r_sn34ky_d00r}xxd -r -p reverses (-r) a plain hex dump (-p) back to its original bytes. The trailing 0a is the newline.
8. Alternative method: the backdoor's /proc interface
The rootkit creates a /proc interface to interact with it. We can trigger the backdoor directly and recover the flag from the kernel logs:
echo "get_flag" > /proc/cipher_bd
dmesg | tail -5Writing the control command get_flag to /proc/cipher_bd makes the module dump the (hex-encoded) flag into the kernel ring buffer, where we read it with dmesg.
Analysis: a/procentry with a strange name likecipher_bdthat does not correspond to any legitimate process is itself a rootkit IOC. This control channel shows how the module takes orders from userspace without opening a network socket.
[Verified against independent public write-ups] get_flag is not the interface's only function. Several external analyses of this same room, cross-checked against each other for this review, agree that /proc/cipher_bd is actually a full command-execution channel: writing any other string to it — for instance echo "id" > /proc/cipher_bd — makes the module run it as a shell command with root privileges and save the output to /tmp/cipher_output.txt. Reading that file back confirms execution as uid=0(root). get_flag is simply a hardcoded special-case string the author left to dump the flag instead of running a command.
Why it matters: this reframes the room's real lesson.spatchisn't just a flag dispenser — it is a persistent, unauthenticated, kernel-level root shell reachable by anyone who can write to/proc/cipher_bd, with zero logging and no network footprint. That is what makes a kernel backdoor categorically worse than a userspace one.
Findings summary
| Phase | Component | Indicator / Technique | Impact |
|---|---|---|---|
| Enumeration | lsmod / /proc/modules | Unknown spatch module, absent from standard docs | Detection of the malicious LKM |
| Metadata | modinfo spatch | Author «Cipher», description «Cipher is always root», .ko in drivers/misc/ | Confirmation of malicious intent |
| Binary analysis | strings on spatch.ko | Hex secret embedded after [CIPHER BACKDOOR] | Flag extraction from disk |
| Control channel | /proc/cipher_bd | /proc interface: arbitrary write = command execution as root; get_flag = flag dump | Unauthenticated remote command execution (RCE) from userspace, zero logging |
Lessons learned
- Kernel rootkits gain stealth but still leave traces: the module may hide processes and files, yet its presence in
lsmod, its metadata and its on-disk binary remain analyzable. - Analyze the binary, not just the live system:
stringsandmodinfoagainst the on-disk.kobypass the rootkit's runtime lies. - Catalog your legitimate modules: knowing which LKMs should be loaded turns any unknown name (like
spatch) into an immediate alert. - Watch
/proc: anomalous procfs entries (cipher_bd) that map to no real process are a reliable IOC of kernel-level compromise. - A writable
/procinterface isn't a curiosity, it's RCE: in this case,cipher_bdexecutes as root any string that isn'tget_flag. Always treat a writable procfs entry from an unknown module as a full compromise channel, not just an IOC to note down.
2. Elevar a root para el análisis
Partimos de una sesión en el host ya comprometido. Para inspeccionar módulos del kernel y logs a bajo nivel necesitamos privilegios de root:
sudo suPor qué: lsmod, modinfo sobre rutas de /lib/modules y el acceso a dmesg con detalle requieren root en la mayoría de sistemas endurecidos. Es el primer paso para tener visibilidad completa.
3. Revisar los logs del kernel con dmesg
El ring buffer del kernel registra eventos de arranque y, crucialmente, la carga de módulos. Es el primer sitio donde buscar actividad anómala:
dmesgLa salida muestra la inicialización del sistema y los eventos de carga de módulos. Buscamos mensajes inusuales o cargas de módulos en momentos inesperados, que suelen ser el primer indicio de un LKM malicioso.
4. Enumerar los módulos cargados con lsmod
El paso más importante del análisis: listar todos los módulos del kernel activos y detectar el que no encaja.
lsmodEntre los módulos legítimos aparece spatch, un módulo que no figura en la documentación estándar del kernel de Linux. Un nombre desconocido en la lista de módulos es exactamente el tipo de anomalía que buscamos.
Análisis:lsmodlee/proc/modules. Un rootkit puede intentar desligarse de esta lista, pero muchos LKM de prueba (como este) no lo hacen, dejándose ver. Cualquier módulo cuyo nombre no reconozcas merece una investigación inmediata.
5. Inspeccionar los metadatos del módulo con modinfo
Con el módulo sospechoso identificado, extraemos su información de metadatos:
modinfo spatchLa salida revela indicadores muy claros de intención maliciosa:
description: Cipher is always root
author: Cipher
filename: /lib/modules/6.8.0-1016-aws/kernel/drivers/misc/spatch.koSeñales de alarma: una descripción como «Cipher is always root», un autor anónimo («Cipher») y la ubicación del.ko. La rutadrivers/misc/es un escondite plausible para un módulo que quiere pasar por legítimo. Todos estos campos los define el propio autor del módulo, así que su tono delata el propósito.
6. Analizar el binario del módulo con strings
Ya tenemos la ruta exacta del .ko. Extraemos las cadenas de texto legibles del binario para buscar secretos incrustados:
strings /lib/modules/6.8.0-1016-aws/kernel/drivers/misc/spatch.koRecorriendo la salida encontramos un mensaje dejado por el atacante con datos codificados en hexadecimal:
[CIPHER BACKDOOR] Here's the secret: 54484d7b73757033725f736e33346b795f643030727d0aPor qué funciona:stringsrecorre el binario compilado e imprime las secuencias de caracteres imprimibles. Los desarrolladores de malware suelen dejar cadenas de depuración, claves o —como aquí— la propia flag codificada en el binario. Analizar el.koen disco esquiva por completo las mentiras del rootkit en tiempo de ejecución.
7. Decodificar la flag desde hexadecimal
La cadena hex contiene la flag. La decodificamos con xxd en modo inverso:
echo "54484d7b73757033725f736e33346b795f643030727d0a" | xxd -r -pResultado:
THM{sup3r_sn34ky_d00r}xxd -r -p revierte (-r) un volcado hexadecimal plano (-p) a sus bytes originales. El 0a final es el salto de línea.
8. Método alternativo: la interfaz de la backdoor en /proc
El rootkit crea una interfaz en /proc para interactuar con él. Podemos disparar la backdoor directamente y recuperar la flag desde los logs del kernel:
echo "get_flag" > /proc/cipher_bd
dmesg | tail -5Escribir el comando de control get_flag en /proc/cipher_bd hace que el módulo vuelque la flag (codificada en hex) al ring buffer del kernel, donde la leemos con dmesg.
Análisis: una entrada de/proccon un nombre extraño comocipher_bdque no corresponde a ningún proceso legítimo es en sí misma un IOC de rootkit. Este canal de control demuestra cómo el módulo recibe órdenes desde userspace sin abrir un socket de red.
[Verificado contra write-ups públicos independientes] get_flag no es la única función de la interfaz. Varios análisis externos de este mismo room, contrastados entre sí para esta revisión, coinciden en que /proc/cipher_bd es en realidad un canal completo de ejecución de comandos: escribir cualquier otra cadena — por ejemplo echo "id" > /proc/cipher_bd — hace que el módulo la ejecute como comando de shell con privilegios de root y guarde la salida en /tmp/cipher_output.txt. Leer ese fichero confirma la ejecución como uid=0(root). get_flag es simplemente una cadena especial que el autor dejó cableada para volcar la flag en vez de ejecutar un comando.
Por qué importa: esto redimensiona la lección real del room.spatchno es solo un dispensador de flag: es una shell de root persistente, sin autenticación y a nivel de kernel, alcanzable por cualquiera que pueda escribir en/proc/cipher_bd, sin ningún registro y sin huella de red. Eso es lo que hace que un rootkit de kernel sea categóricamente peor que uno de userspace.
Resumen de hallazgos
| Fase | Componente | Indicador / Técnica | Impacto |
|---|---|---|---|
| Enumeración | lsmod / /proc/modules | Módulo spatch desconocido y fuera de la documentación estándar | Detección del LKM malicioso |
| Metadatos | modinfo spatch | Autor «Cipher», descripción «Cipher is always root», .ko en drivers/misc/ | Confirmación de intención maliciosa |
| Análisis binario | strings sobre spatch.ko | Secreto embebido en hex tras [CIPHER BACKDOOR] | Extracción de la flag desde disco |
| Canal de control | /proc/cipher_bd | Interfaz de /proc: escritura arbitraria = ejecución de comandos como root; get_flag = volcado de la flag | Ejecución remota de comandos (RCE) sin autenticación desde userspace, sin registro |
Lecciones aprendidas
- Los rootkits de kernel ganan en sigilo, pero dejan rastro: el módulo puede ocultar procesos y ficheros, pero su presencia en
lsmod, sus metadatos y su binario en disco siguen siendo analizables. - Analiza el binario, no solo el sistema en vivo:
stringsymodinfosobre el.koen disco esquivan las mentiras del rootkit en tiempo de ejecución. - Cataloga tus módulos legítimos: conocer qué LKM deberían estar cargados convierte cualquier nombre desconocido (como
spatch) en una alerta inmediata. - Vigila
/proc: entradas anómalas en el procfs (cipher_bd) que no corresponden a procesos reales son un IOC fiable de compromiso a nivel de kernel. - Una interfaz de
/procescribible no es una curiosidad, es RCE: en este caso concreto,cipher_bdejecuta como root cualquier cadena que no seaget_flag. Trata siempre un procfs escribible de un módulo desconocido como un canal de compromiso total, no solo como un IOC a anotar.