🐧Linux - Enumeración de servicios y componentes internos
Ahora que hemos investigado el entorno, nos hemos familiarizado con él y hemos descubierto todo lo que hemos podido sobre los permisos de usuario y grupo en relación con los archivos, scripts, archivos binarios, directorios, etc., daremos un paso más y analizaremos más a fondo los aspectos internos del sistema operativo anfitrión. En esta fase, enumeraremos lo siguiente, que ayudará a informar sobre muchos de los ataques que se analizarán en las secciones posteriores de este módulo.
¿Qué servicios y aplicaciones están instalados?
¿Qué servicios están en ejecución?
¿Qué enchufes están en uso?
¿Qué usuarios, administradores y grupos existen en el sistema?
¿Quién ha iniciado sesión actualmente? ¿Qué usuarios han iniciado sesión recientemente?
¿Qué políticas de contraseñas, si las hay, se aplican en el host?
¿El host está unido a un dominio de Active Directory?
¿Qué tipos de información interesante podemos encontrar en los archivos de historial, registro y copia de seguridad?
¿Qué archivos se han modificado recientemente y con qué frecuencia? ¿Existen patrones interesantes en la modificación de archivos que podrían indicar que se está utilizando un trabajo de cron que podríamos piratear?
Información de dirección IP actual
¿Hay algo interesante en e archivol /etc/hosts?
¿Existen conexiones de red interesantes con otros sistemas en la red interna o incluso fuera de la red?
¿Qué herramientas están instaladas en el sistema que podamos aprovechar? (Netcat, Perl, Python, Ruby, Nmap, tcpdump, gcc, etc.)
¿Podemos acceder al archivo bash_history para cualquier usuario y podemos descubrir algo interesante de su historial de línea de comandos registrado, como contraseñas?
¿Hay algún trabajo Cron ejecutándose en el sistema que podamos secuestrar?
En este momento, también queremos recopilar la mayor cantidad posible de información de red. ¿Cuál es nuestra dirección IP actual? ¿El sistema tiene otras interfaces y, por lo tanto, podría usarse para pasar a otra subred que antes no era accesible desde nuestro host de ataque? Lo hacemos con el comando ip a o ifconfig, pero este comando a veces no funcionará en ciertos sistemas si el paquete net-tools no está presente.
Internos
Cuando hablamos de internals, nos referimos a la configuración interna y la forma de trabajar, incluidos los procesos integrados diseñados para realizar tareas específicas. Por lo tanto, comenzamos con las interfaces a través de las cuales nuestro sistema de destino puede comunicarse.
Interfaces de red
afsh4ck@kali$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:50:56:b9:ed:2a brd ff:ff:ff:ff:ff:ff
inet 10.129.203.168/16 brd 10.129.255.255 scope global dynamic ens192
valid_lft 3092sec preferred_lft 3092sec
inet6 dead:beef::250:56ff:feb9:ed2a/64 scope global dynamic mngtmpaddr
valid_lft 86400sec preferred_lft 14400sec
inet6 fe80::250:56ff:feb9:ed2a/64 scope link
valid_lft forever preferred_lft forever
¿Hay algo interesante en el archivo /etc/hosts?
Hosts
afsh4ck@kali$ cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 nixlpe02
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
También puede resultar útil comprobar la última hora de inicio de sesión de cada usuario para intentar ver cuándo suelen iniciar sesión en el sistema y con qué frecuencia. Esto puede darnos una idea de cuán ampliamente se utiliza este sistema, lo que puede abrir la posibilidad de más configuraciones erróneas o directorios o historiales de comandos "desordenados".
Además, veamos si hay alguien más en el sistema con nosotros. Hay algunas formas de hacerlo, como el comando who. El comando finger funcionará para mostrar esta información en algunos sistemas Linux. Podemos ver que el usuario cliff.moore está conectado al sistema con nosotros.
Usuarios registrados
afsh4ck@kali$ who
12:27:21 up 1 day, 16:55, 1 user, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
cliff.mo pts/0 10.10.14.16 Tue19 40:54m 0.02s 0.02s -bash
También es importante comprobar el historial de bash de un usuario, ya que puede estar pasando contraseñas como argumento en la línea de comandos, trabajando con repositorios git, configurando tareas cron y más. Revisar lo que ha estado haciendo el usuario puede brindarle una idea considerable sobre el tipo de servidor en el que se encuentra y darle una pista sobre las rutas de escalada de privilegios.
Historial de comandos
afsh4ck@kali$ history
1 id
2 cd /home/cliff.moore
3 exit
4 touch backup.sh
5 tail /var/log/apache2/error.log
6 ssh ec2-user@dmz02.inlanefreight.local
7 history
En ocasiones también podemos encontrar archivos de historial especiales creados por scripts o programas. Esto se puede encontrar, entre otros, en scripts que monitorean ciertas actividades de los usuarios y verifican actividades sospechosas.
Cómo encontrar archivos de historial
afsh4ck@kali$ find / -type f \( -name *_hist -o -name *_history \) -exec ls -l {} \; 2>/dev/null
-rw------- 1 htb-student htb-student 387 Nov 27 14:02 /home/htb-student/.bash_history
También es una buena idea comprobar si hay trabajos cron en el sistema. Los trabajos cron en los sistemas Linux son similares a las tareas programadas de Windows. A menudo se configuran para realizar tareas de mantenimiento y copia de seguridad. Junto con otras configuraciones incorrectas, como rutas relativas o permisos débiles, pueden aprovecharse para aumentar los privilegios cuando se ejecuta el trabajo cron programado.
El sistema de archivos proc ( proc/ procfs) es un sistema de archivos particular de Linux que contiene información sobre los procesos del sistema, el hardware y otra información del sistema. Es la forma principal de acceder a la información de los procesos y se puede utilizar para ver y modificar la configuración del núcleo. Es virtual y no existe como un sistema de archivos real, sino que el núcleo lo genera dinámicamente. Se puede utilizar para buscar información del sistema, como el estado de los procesos en ejecución, los parámetros del núcleo, la memoria del sistema y los dispositivos. También establece ciertos parámetros del sistema, como la prioridad del proceso, la programación y la asignación de memoria.
Si se trata de un sistema Linux un poco más antiguo, aumenta la probabilidad de que podamos encontrar paquetes instalados que puedan tener ya al menos una vulnerabilidad. Sin embargo, las versiones actuales de las distribuciones Linux también pueden tener paquetes o software más antiguos instalados que puedan tener dichas vulnerabilidades. Por ello, en breve veremos un método que nos ayudará a detectar paquetes potencialmente peligrosos. Para ello, primero debemos crear una lista de paquetes instalados con los que trabajar.
También es una buena idea verificar si la versión de sudo instalada en el sistema es vulnerable a algún exploit heredado o reciente.
afsh4ck@kali$ sudo -V
Sudo version 1.8.31
Sudoers policy plugin version 1.8.31
Sudoers file grammar version 46
Sudoers I/O plugin version 1.8.31
Binarios
En ocasiones también puede ocurrir que no se instalen paquetes directos en el sistema, sino programas compilados en forma de binarios. Éstos no requieren instalación y pueden ser ejecutados directamente por el propio sistema.
GTFObins ofrece una excelente plataforma que incluye una lista de archivos binarios que pueden explotarse potencialmente para aumentar nuestros privilegios en el sistema de destino. Con el siguiente resumen, podemos comparar los archivos binarios existentes con los de GTFObins para ver qué archivos binarios debemos investigar más adelante.
Podemos utilizar la herramienta de diagnóstico strace en sistemas operativos basados en Linux para rastrear y analizar las llamadas del sistema y el procesamiento de señales. Nos permite seguir el flujo de un programa y comprender cómo accede a los recursos del sistema, procesa señales y recibe y envía datos del sistema operativo. Además, también podemos utilizar la herramienta para supervisar las actividades relacionadas con la seguridad e identificar posibles vectores de ataque, como solicitudes específicas a hosts remotos que utilizan contraseñas o tokens.
La salida strace se puede escribir en un archivo para su posterior análisis y proporciona una gran cantidad de opciones que permiten un seguimiento detallado del comportamiento del programa.
Los usuarios pueden leer casi todos los archivos de configuración en un sistema operativo Linux si el administrador los ha mantenido iguales. Estos archivos de configuración a menudo pueden revelar cómo se instala y configura el servicio para comprender mejor cómo podemos usarlo para nuestros fines. Además, estos archivos pueden contener información confidencial, como claves y rutas de archivos en carpetas que no podemos ver. Sin embargo, si el archivo tiene permisos de lectura para todos, aún podemos leer el archivo incluso si no tenemos permiso para leer la carpeta.
afsh4ck@kali$ find / -type f \( -name *.conf -o -name *.config \) -exec ls -l {} \; 2>/dev/null
-rw-r--r-- 1 root root 448 Nov 28 12:31 /run/tmpfiles.d/static-nodes.conf
-rw-r--r-- 1 root root 71 Nov 28 12:31 /run/NetworkManager/resolv.conf
-rw-r--r-- 1 root root 72 Nov 28 12:31 /run/NetworkManager/no-stub-resolv.conf
-rw-r--r-- 1 root root 0 Nov 28 12:37 /run/NetworkManager/conf.d/10-globally-managed-devices.conf
-rw-r--r-- 1 systemd-resolve systemd-resolve 736 Nov 28 12:31 /run/systemd/resolve/stub-resolv.conf
-rw-r--r-- 1 systemd-resolve systemd-resolve 607 Nov 28 12:31 /run/systemd/resolve/resolv.conf
...SNIP...
Scripts
Los scripts son similares a los archivos de configuración. A menudo, los administradores son perezosos y están convencidos de la seguridad de la red y descuidan la seguridad interna de sus sistemas. Estos scripts, en algunos casos, tienen privilegios tan erróneos que trataremos más adelante, pero su contenido es de gran importancia incluso sin estos privilegios. Porque a través de ellos, podemos descubrir procesos internos e individuales que pueden sernos de gran utilidad.
Además, si miramos la lista de procesos, nos puede dar información sobre qué scripts o binarios están en uso y por qué usuario. Así, por ejemplo, si se trata de un script creado por el administrador en su ruta y cuyos derechos no han sido restringidos, podemos ejecutarlo sin necesidad de entrar en el directorio root.
Esto nos daría una visión general bastante buena de nuestro sistema de destino, para que podamos entrar en más detalles a continuación y determinar los permisos individuales para los componentes que encontramos.
Caso práctico
¿Cúal es la versión de python instalada en el sistema?
$python-v-sh:20:python:notfound
Tenemos el siguiente caso, un entorno en el que python está instalado pero no sabemos su versión. Podemos usar el siguiente comando para saber su versión concreta: