Categorías
Programacion Services - Software

Logstash-filter-verifier: Mantenimiento de filtros de Logstash en ELK

El stack ELK (ElasticSearch-Logstash-Kibana) es uno de los estándares para el tratamiento y almacenamiento centralizado de logs y visualización de eventos. En este post, veremos una forma fiable de creación y mantenimiento de filtros de Logstash con logstash-filter-verifier.

Introducción

El funcionamiento básico del stack ELK es el siguiente:

  • Beats: Se encargan de recoger información que poder enviar para indexar. El beat más usado y en el que nos centraremos en este post es Filebeat. Filebeat se encarga de recoger esa información desde ficheros (logs).
  • Logstash: Se encarga de recibir logs de diversas fuentes (generalmente, los beats), identificar campos dentro de las lineas de log e indexarlo dentro de ElasticSearch como un documento.
  • ElasticSearch: base de datos NoSQL basado en Lucene donde se indexarán los documentos de los logs.
  • Kibana: visualización de información almacenada en ElasticSearch.

Generalmente, la curva de aprendizaje de este Stack es más pronunciada en el componente de Logstash. Esto se debe, probablemente, a que Logstash ejecuta la tarea más importante dentro del stack: extraer campos del log e indexarlos en ElasticSearch. Esta indexación es lo que de verdad aporta valor en este stack frente a, por ejemplo, un rsyslog. Cuando la indexación falla, lo más probable es que muchos de los dashboards de Kibana dejen de mostrar información al no encontrar el campo correspondiente en los documentos de ElasticSearch, las búsquedas por campo dejarán de ser fiables por el sesgo de datos, etc.

La tarea de depuración de los filtros de Logstash puede llegar a ser bastante complicada y, conforme la cantidad de filtros aumenta, el mantenimiento de estos filtros en el largo plazo se hace cada vez más complicado (sobre todo si compartes filtros entre distintas aplicaciones).

TDD + logstash-filter-verifier para creación de filtros

Con el objetivo de simplificar tanto la programación de filtros como de mantenerlos en el largo plazo, usaremos logstash-filter-verifier. Esta utilidad nos da la posibilidad de realizar tests unitarios sobre nuestras configuraciones de Logstash. Además, si trabajamos con TDD (Test-Driven-Development) para la creación de los filtros, no solo conseguimos que la depuración y creación de filtros sea más fácil sino que, además, detectamos fallos de configuración antes de añadir el cambio.

A modo de ejemplo, supongamos que queremos crear un filtro que parsee esta líneas de log:

Oct 6 20:55:29 myhost myprogram[31993]: This is a test message

Para hacer este parseo de campos necesitaríamos hacer lo siguiente:

  1. Creamos el siguiente filtro vacío:
# conf.d/03-0-sample-filter.conf
filter {
}

2. Definimos el test-case con los campos que queremos indexar en formato json como lo espera recibir logstash-filter-verifier:

# tests/03-0-sample-filter-testcase.json
{
  "testcases": [
    {
      "input": [
        "Oct 6 20:55:29 myhost myprogram[31993]: This is a test message"
      ],
      "expected": [
        {
          "@timestamp": "2021-10-06T20:55:29.000Z",
          "host": "myhost",
          "message": "This is a test message",
          "pid": 31993,
          "program": "myprogram"
        }
      ]
    }
  ]
}

3. Descargamos logstash y logstash-filter-verifier si no los tenemos ya instalados:

# Logstash binary
$ cd /opt
$ sudo wget https://artifacts.elastic.co/downloads/logstash/logstash-7.12.0-linux-x86_64.tar.gz
$ sudo tar -xvzf logstash-7.12.0-linux-x86_64.tar.gz
$ ln -s /opt/logstash-7.12.0/ /opt/logstash

# logstash-filter-verifier
$ cd /usr/local/bin
$ sudo wget https://github.com/magnusbaeck/logstash-filter-verifier/releases/download/1.6.2/logstash-filter-verifier_1.6.2_linux_amd64.tar.gz
$ sudo tar -xvzf logstash-filter-verifier_1.6.2_linux_amd64.tar.gz

4. Ejecutamos el test case:

$ logstash-filter-verifier tests/03-0-sample-testcase.json conf.d/
Running tests in 03-0-sample-testcase.json...
☐ Comparing message 1 of 1 from 03-0-sample-testcase.json:
--- /tmp/620401130/03-0-sample-testcase.json/1/expected 2021-04-20 20:09:35.514280632 +0200
+++ /tmp/620401130/03-0-sample-testcase.json/1/actual   2021-04-20 20:09:35.514280632 +0200
@@ -1,7 +1,5 @@
 {
-  "@timestamp": "2021-10-06T20:55:29.000Z",
-  "host": "myhost",
-  "message": "This is a test message",
-  "pid": 31993,
-  "program": "myprogram"
+  "@timestamp": "2021-04-20T20:09:34.253Z",
+  "host": "...",
+  "message": "Oct 6 20:55:29 myhost myprogram[31993]: This is a test message"
 }


Summary: ☐ All tests: 0/1
         ☐ 03-0-sample-testcase.json: 0/1

5. Obviamente, como no implementamos el filtro, el test unitario falló (como siempre que se usa TDD). Pasemos entonces a la implementación de este filtro y veamos cómo podemos obtener los campos del log:

# conf.d/03-0-sample-filter.conf
filter {
  grok {
    match => {
      "message" => "%{SYSLOGTIMESTAMP:[@metadata][timestamp]} %{SYSLOGHOST:host} %{SYSLOGPROG:pid:int}: %{GREEDYDATA:message}"
    }
    overwrite => ["message", "host", "pid"]
  }
  date {
    match => [
      "[@metadata][timestamp]", "MMM d HH:mm:ss", "MMM dd HH:mm:ss", "MMM dd yyyy HH:mm:ss", "MMM d yyyy HH:mm:ss", "dd/MMM/yyyy:HH:mm:ss Z", "ISO8601"
    ]
    remove_field => "timestamp"
  }
}

6. Con este filtro conseguimos sacar los valores de los campos host, pid y message. Además, sobreescribimos el timestamp para usar el del propio log (en vez de usar el timestamp de recepción en logstash). Volvemos a ejecutar logstash-pipeline-verifier para ver si con este filtro pasamos el test:

$ logstash-filter-verifier tests/03-0-sample-testcase.json conf.d/
Running tests in 03-0-sample-testcase.json...
☐ Comparing message 1 of 1 from 03-0-sample-testcase.json:
--- /tmp/532357049/03-0-sample-testcase.json/1/expected 2021-04-20 20:18:59.408976861 +0200
+++ /tmp/532357049/03-0-sample-testcase.json/1/actual   2021-04-20 20:18:59.408976861 +0200
@@ -2,6 +2,6 @@
   "@timestamp": "2021-10-06T20:55:29.000Z",
   "host": "myhost",
   "message": "This is a test message",
-  "pid": 31993,
+  "pid": "31993",
   "program": "myprogram"
 }


Summary: ☐ All tests: 0/1
         ☐ 03-0-sample-testcase.json: 0/1

7. En este caso, seguimos sin pasar el test porque el pid que indicamos en nuestro test-case esperaba recibir un número en vez de una cadena de caracteres. En el caso del pid, no es demasiado importante forzar que sea un entero. Sin embargo, si fuese una métrica de temporal, usar una cadena implicaría que no se podrían aplicar operaciones matemáticas directamente, algo muy perjudicial para ciertas visualizaciones de datos. Ahora sí, hacemos el cambio oportuno y pasamos el test:

$ git diff
diff --git a/conf.d/03-0-sample-filter.conf b/conf.d/03-0-sample-filter.conf
index b4eb69f..4869937 100644
--- a/logstash/conf.d/03-0-sample-filter.conf
+++ b/logstash/conf.d/03-0-sample-filter.conf
@@ -13,5 +13,8 @@ filter {
       ]
       remove_field => "timestamp"
     }
+    mutate {
+      convert => { "pid" => "integer" }
+    }
   }
 }
$ logstash-filter-verifier tests/03-0-sample-testcase.json conf.d/
Running tests in 03-0-sample-testcase.json...
☑ Comparing message 1 of 1 from 03-0-sample-testcase.json

Summary: ☑ All tests: 1/1
         ☑ 03-0-sample-testcase.json: 1/1

Automatización de tests unitarios con GitHub Actions

Para realizar todos los tests de logstash-filter-verifier cada vez que se sube un cambio al repositorio de GitHub, podemos usar un workflow de GitHub Actions como este:

# .github/workflows/logstash-filter-verifier.yml
name: Logstash Filters Unit Tests
on:
  workflow_dispatch:
  push:
jobs:
  unittest:
    runs-on: ubuntu-latest
    container:
      image: logstash:7.11.2
      options: --user root
    env:
      LOGSTASH_FILTER_VERIFIER_VERSION: 1.6.2
    steps:
    - name: Checkout code
      uses: actions/checkout@v2

    - name: Download logstash-filter-verifier
      run: |
        curl -LO https://github.com/magnusbaeck/logstash-filter-verifier/releases/download/${{ env.LOGSTASH_FILTER_VERIFIER_VERSION }}/logstash-filter-verifier_${{ env.LOGSTASH_FILTER_VERIFIER_VERSION }}_linux_amd64.tar.gz
        tar -xvzf logstash-filter-verifier*

    - name: Run tests
      run: |
        ./logstash-filter-verifier tests/ conf.d/

Conclusiones

El mantenimiento de los filtros de logstash puede llegar a ser muy dificil de mantener en el largo plazo. Tener una herramienta que realice directamente los tests unitarios nos permite tener la seguridad de todo momento que ante nuevos cambios no estamos dañando el procesado de otros logs.

Además, el hecho de extraer muestras de logs y definir los test-cases antes de implementarlo, permite no solo que la robustez de los filtros sea mucho superior, sino también que la interacción con otros filtros sea directa. Por poner un ejemplo, es muy común tener un filtro genérico que parsee todos los logs de un servidor Apache/Httpd. La utilización de campos generados desde esos filtros es directa si seguimos la metodología TDD (directamente veremos los campos de los que queremos leer).

En resumen, el TDD y los tests unitarios permiten que la forma de trabajar con Logstash sea mucho más eficiente y robusta, y su curva de aprendizaje sea mucho menor. ¿Quieres dejar de depurar tags _grok_parse_failure? Usa logstash-filter-verifier.

Álvaro Torres Cogollo.

¿Quieres contactar conmigo? Te dejo mis redes sociales a continuación.

Categorías
automatizacion Explotación de Software Hacking Hacking Python Networking Programacion

Network Hacking con Impacket – Parte 1

Demostración en vídeo de este post

Existen muchas librerías y proyectos desarrollados en Python que ayudan en la automatización de pruebas para pentesting así como la creación de exploits o pruebas de concepto que vienen bien en una auditoría. Una de las librerías más potentes que existen en el pentesting en entornos de red es Impacket. Se trata de un proyecto que contiene múltiples clases y scripts que soportan los principales protocolos de red disponibles actualmente, especialmente aquellos utilizados en redes con sistemas Windows. A diferencia de otras librerías como Scapy, en el caso de Impacket el objetivo es la manipulación de los paquetes a bajo nivel, lo que significa que pueden ser construidos desde cero utilizando los elementos disponibles en la librería. Por otro lado, una de las características que llaman la atención de Impacket es que cuenta con varias pruebas de concepto en forma de scripts que facilitan enormemente su uso y  representan una forma estupenda de aprender sobre la jerarquía de clases y utilidades disponibles, esto por supuesto si se cuenta con un poco de tiempo para leer y entender dichos scripts.

La instalación de Impacket se puede llevar a cabo utilizando PIP, partiendo del código fuente disponible en GitHub y ejecutando el fichero «setup.py» o creando un contenedor en Docker. Cualquiera de las alternativas indicadas permite utilizar Impacket y los scripts disponibles en el proyecto sin mayores dificultades, además se encuentran documentadas en el repositorio. Instalar Impacket normalmente no supone ninguna dificultad.
Una de las mejores formas de explorar el proyecto consiste precisamente en ejecutar las herramientas que se encuentran disponibles en el directorio «examples» que tal como se ha comentado anteriormente, son scripts que utilizan las clases disponibles en la librería para realizar diferentes tipos de pruebas. A continuación se explican un par de estos scripts para la ejecución de comandos de forma remota.

 

Ejecución mediante WMI.

Si el sistema objetivo tiene WMI habilitado es posible utilizar el script «wmiexec.py» el cual permite realizar una conexión y obtener una shell en dicho sistema. Su uso es sencillo, basta con indicar una cuenta de usuario y contraseña validos así como la IP/nombre de la máquina y el script hará el resto.

Hay que tener en cuenta que para ejecutar el comando y establecer la conexión es necesario que el usuario tenga permisos de Administrador (no es necesario que sea SYSTEM). Tal como se aprecia en la imagen anterior, se realizan un par de pruebas con un usuario que está en el Active Directory (juan) y no es posible generar una shell con la estación de trabajo por falta de permisos ya que ese usuario en concreto, no se encuentra incluido en ningún grupo especial, GPO ni tampoco es administrador local en el sistema objetivo. Posteriormente, tal como se puede apreciar en la imagen, se utiliza otro usuario (pedro) el cual es un usuario de dominio y hace parte de un grupo especial sobre el que se ha creado una GPO para que todos los miembros de dicho grupo tengan permisos de administradores locales en las estaciones de trabajo, por ese motivo a la hora de ejecutar el script se puede apreciar que se lleva a cabo correctamente el proceso de autenticación y posteriormente se genera una shell en el sistema utilizando WMI.

Ejecución mediante SMB.

Impacket cuenta con algunos scripts para aprovechar las características del protocolo SMB, uno de dichos scripts es «smbexec.py«. Este script en concreto se encarga de crear un servicio Windows para ejecutar instrucciones contra el sistema, sin embargo su modo de operar depende de si encuentra algún directorio compartido en el que el usuario indicado tenga permisos de escritura. En el caso de que no sea capaz de encontrar un directorio compartido, levanta un servidor SMB en la máquina del atacante (se deben tener permisos de root para abrir y vincular el puerto 445) y crea un directorio compartido localmente en donde se escribirán los resultados de los comandos ejecutados por parte del servicio en la máquina remota.

Nuevamente, como ocurre con el script «wmiexec.py» en el caso de «smbexec.py» son necesarios permisos de administrador en la máquina remota, en este caso para poder crear el servicio Windows. Una de las principales diferencias entre ambos scripts a efectos prácticos, es que «smbexec.py» genera más eventos en el sistema remoto que el «wmiexec.py«, además como ya se ha comentado, «smbexec.py» necesita realizar operaciones tan delicadas como la creación de un nuevo servicio en el sistema, aunque cabe anotar que al finalizar el script dicho servicio se elimina.

Ambas utilidades representan el poder de la librería y cómo utilizando correctamente las clases disponibles en Impacket se pueden crear herramientas muy interesantes de cara a ejecutar pruebas de pentesting/post-explotación en entornos de red. En los próximos posts se detallará aún más el uso de otras herramientas y se explicará cómo utilizar algunas clases de Impacket para crear scripts.

Un saludo y Happy Hack!
Adastra.

Categorías
Hacking Hacking Python Networking Programacion

WSC2 – Command and Control con Web Sockets

Los web sockets son una característica muy interesante en el mundo web ya que permiten las comunicaciones asíncronas completas (full-duplex) sobre una conexión TCP. Esto significa que tanto cliente como servidor pueden enviar mensajes al otro extremo en cualquier momento. Esto es precisamente lo opuesto a lo que se hace en el mundo de las aplicaciones web tradicionales en donde es el cliente el que siempre debe iniciar la comunicación con el servidor (modelo cliente/servidor). Con las comunicaciones asíncronas se consigue un ahorro en tiempo y recursos, ya que el servidor puede hacer cosas como por ejemplo enviar «actualizaciones» de contenido al cliente o notificaciones. Las posibilidades con un modelo de este tipo son bastante amplias y por supuesto, implica también un análisis adicional del tráfico HTTP que ya no es como el tradicional basado en «petición/respuesta», lo que dificulta la detección de tráfico sospechoso o malicioso por parte de sistemas de seguridad perimetral.
Existe una prueba de concepto llamada WSC2 que se ha publicado hace algunos años que explota precisamente este escenario, aprovechándose de las características que ofrecen los web sockets para establecer conexiones a un C2. Dado que ya lleva unos años publicado se encuentra desarrollado en Python y a la fecha de redactar este post no soporta la versión Python 3. El programa no es complejo y merece la pena echarle un vistazo para entender su funcionamiento, desde el punto de vista académico es interesante ya que utiliza la librería Tornado para el establecimiento de las conexiones con web sockets. Una vez se clona el repositorio lo primero que hay que hacer para comenzar a utilizarlo es editar el fichero config.py en donde se deben definir los detalles de configuración básicos del servidor para que funcione correctamente.

A continuación se puede ejecutar el fichero wsc2.py y generar un stager, que no es más que la muestra que se debe ejecutar en el cliente. Es un concepto muy similar a lo que se ha visto en otros posts cuando se ha hablado de Pupy, Empire, Shad0w, Kaodic, Sliver, Merlin, etc. Una vez dentro del interprete de WSC2, se puede ejecutar el comando «genStager» con alguno de los «stagers» disponibles en la herramienta.


El stager más sencillo probablemente es el one liner de Powershell, el cual cuando se ejecuta establecer una conexión entre la máquina comprometida y el servidor. Ahora bien, tal como se indica en el repositorio de la herramienta, hay algunos stagers disponibles que funcionan bien aunque no dejan de ser pruebas de concepto. Concretamente los stagers «JScript2», «JScript3» y «psoneliner» están basados en assemblies de .NET y su código se encuentra disponible públicamente, de hecho, el autor indica que se pueden modificar y adaptar sin ningún problema con un IDE como el Visual Studio .NET.
En cuanto se ejecuta el stager en la máquina víctima se recibe una conexión en el servidor y ahora se puede interactuar fácilmente con el agente, sabiendo que dichas comunicaciones utilizan web sockets.

Como se puede apreciar en la imagen anterior, se puede seleccionar un agente desde el C2 de WSC2 y con el comando «cli» ejecutar instrucciones de forma directa contra dicho sistema. Las operaciones que admite el agente son muy pocas y evidentemente no es tan potente como el payload de meterpreter u otras soluciones mencionadas anteriormente pero es simple y funciona.

Esta herramienta como tal no es «tan interesante» como muchas otras que se han explicado en este blog, sin embargo el código fuente está disponible y dado que es sencillo puede ser un buen punto de inicio para entender cómo funcionan otras utilidades más complejas. Hay que tener en cuenta que a lo mejor esta herramienta no es una alternativa adecuada para una campaña de Red Team dado que no solamente no cuenta con un payload/agente robusto sino que además, lleva años sin actualizarse y tal como se indica en el repositorio no cuenta con una capa de cifrado punto a punto para las comunicaciones entre el C2 y los agentes, pero como se ha comentado antes desde el punto de vista académico puede resultar interesante.

Un saludo y Happy Hack!
Adastra.

Categorías
Hacking Networking Programacion

Sliver – Command and Control multiplayer para Red Team – Parte 2 de 2

En la primera parte de estos post se han mencionado las características de Sliver y sus funciones básicas. Se trata de un C2 que puede funcionar sobre HTTP/S,  M-TLS y DNS. Como se ha visto en dicho post, una de las cosas que más llaman la atención de Sliver es su generación dinámica de código y mecanismos de ofuscación en tiempo de compilación, lo que hace que en ocasiones la generación de los implantes tarde varios minutos pero puede ayudar a la evasión de AVs. A continuación se explicarán algunas características interesantes que tienen los Slivers que se establecen contra la máquina comprometida y cómo pueden ayudar en un proceso de post-explotación en el entorno de la víctima.

Modo Multiplayer en Sliver

El modo «multiplayer» es útil para trabajar en un engagement con varias personas, de esta manera se pueden compartir los implantes generados en un servidor central o dicho de otra manera, se puede compartir las sesiones que se han obtenido con otros atacantes. Para que esto funcione es necesario crear un nuevo «player» y habilitar el modo «multiplayer» en el servidor, es decir, en la máquina donde se han creado los slivers y se tienen las sesiones establecidas. Los pasos poder habilitar y utilizar el modo mutiplayer son los siguientes.

  1. En el servidor, se debe ejecutar el comando «new-player» que permitirá generar un fichero de configuración nuevo con todo lo necesario para que un cliente (integrante del equipo) se pueda conectar utilizando TLS.
  2. En el servidor, ejecutar el comando «multiplayer» para iniciar el servidor. Hay que tener en cuenta que ambos comandos tienen valores por defecto que se pueden cambiar. Es recomendable ver las opciones disponibles tal como se puede ver en la siguiente imagen.
  3. En el cliente, descargar la última versión de «sliver-client» para establecer la conexión con el servidor utilizando el fichero de configuración generado con el comando «new-player».

    Como se puede apreciar, ambos comandos en el servidor son muy sencillos y en el cliente se puede ejecutar el comando «import» para cargar el fichero de configuración generado en el servidor con el comando «new-player».
  4. A continuación se precede a:
    1. Crear el fichero de configuración con el comando «new-player».
    2. Habilitar el modo «multiplayer» en el servidor.
    3. Transferir e importar el fichero de configuración a la máquina donde se ejecuta el cliente de Sliver.
    4. Utilizar el interprete de Sliver en el cliente para comprobar que efectivamente, se tiene acceso a las sesiones generadas en el servidor.


      A partir de este momento, el nuevo player podrá interactuar con las sesiones que se han creado en el servidor, la máquina comprometida se puede compartir con otros integrantes del equipo.

TCP Pivots.

Otra de las características que ofrece el C2 es la de pivotar en los diferentes Slivers que se van desplegando en los sistemas comprometidos. Lo primero que se debe hacer es levantar un «pivote» en un puerto arbitrario, para ello desde la sesión se utiliza el comando «tcp-pivot». Con dicho comando se abrirá en la máquina comprometida el puerto indicado y posteriormente se puede generar un nuevo implante, el cual se conectará a dicho puerto, utilizándolo como pivote. Como se puede apreciar en la siguiente imagen, el puerto abierto en la máquina comprometida es el 8000 y la segunda sesión generada utiliza como pivote la primera.

Otras funciones: Gestión de implantes, stagers y extensiones.

Sliver es un proyecto que se encuentra en constante desarrollo, basta simplemente con abrir el repositorio de GitHub para ver la frecuencia con la que se suben cambios. Aunque en un futuro algunas de las características existentes se podrían suprimir por diferentes motivos o añadir nuevas, en el momento de redactar estos posts las siguientes funciones están vigentes.

Gestión de implantes.

A diferencia de otros sistemas C2 existentes, la gestión de las muestras, agentes o como se les denomina en Sliver «implantes», se registran directamente en la configuración del servidor una vez se han generado con el comando «generate». Esto permite una gestión centralizada y hace innecesario generar una y otra vez los implantes, cada uno tiene un nombre único que se puede consultar desde en el servidor y también se pueden regenerar.

Stagers en Sliver

Sliver implementa el mecanismo staging de Metasploit Framework por medio de la generación de perfiles con el comando «new-profile». Con el perfil creado se podrá establecer un «stage-listener» para recibir la conexión y generar el stager con el comando «generate». Es importante anotar que en el PATH se debe encontrar la utilidad «msfvenom» de Metasploit Framework y que además, el comando «generate stager» genera un shellcode en diferentes formatos, el cual se puede ejecutar posteriormente en la víctima para obtener una sesión valida en Sliver.

Extensiones en Sliver.

Las extensiones en Sliver representan otra característica interesante que le permite al usuario integrar utilidades externas, de esta manera se podrá tener en el implante (máquina comprometida) herramientas adicionales que ayudarán en la post-explotación. En la wiki del proyecto se expone un ejemplo muy ilustrativo y útil sobre algunos de los programas incluidos en el gran paquete de herramientas GhostPack, el cual es estupendo para post-explotación en Windows y que también se utiliza en los beacons de Shad0w.

Como se puede ver y se explica en la wiki oficial de Sliver, las extensiones están compuestas por un fichero «manifest.json» y el conjunto de scripts, dlls o binarios ejecutables que representan las utilidades externas. En el fichero «manifest.json» simplemente se incluye cada una de estas herramientas con su correspondiente descripción y argumentos, de tal manera que luego cuando se carga en el implante se crean los comandos correspondientes que se pueden lanzar directamente contra la máquina comprometida.

Sin duda Sliver es una herramienta que merece la pena conocer, controlar y si es posible, mejorar aportando al proyecto con código. 🙂

Un saludo y Happy Hack!
Adastra.

Categorías
Explotación de Software Hacking Networking Services - Software

Enumeración en Linux para Post-Explotación – Parte 5.

Puedes ver las cuatro partes anteriores de este post aquí:
Enumeración en Linux para Post-Explotación – Parte 1.
Enumeración en Linux para Post-Explotación – Parte 2.
Enumeración en Linux para Post-Explotación – Parte 3.
Enumeración en Linux para Post-Explotación – Parte 4.

Es el momento de hablar de otros detalles que se deben comprobar en la enumeración de un sistema Linux, concretamente el listado de librerías y programas con vulnerabilidades conocidas, el abuso de funcionalidades incluidas en servicios/procesos y tareas programadas inseguras.

Listado de librerías y programas con vulnerabilidades conocidas.

Como en cualquier sistema, pueden existir programas y librerías que se ejecutan localmente de un modo inseguro o que incluyen vulnerabilidades que han sido reportadas públicamente. Estos casos se pueden detectar listando las características del sistema comprometido. Es un proceso que lleva tiempo ya que requiere enumerar todo el sistema y comandos como «dpkg -l» devuelven un listado bastante amplio con todas las librerías y programas instalados en el objetivo, no obstante es algo que en un proceso de post-explotación debe hacerse.

Abusando de las funcionalidades o características incluidas en programas.

Existen programas y servicios que incluyen funcionalidades interesantes, las cuales para un atacante pueden representar una vía para elevar privilegios. Por ejemplo, un programa que permite la lectura o creación arbitraria de cualquier fichero en el sistema o que se encarga de levantar otros servicios partiendo de algún fichero de configuración son casos típicos en los que se podría llevar a cabo la elevación de privilegios horizontal o vertical.
Un ejemplo cercano es lo que se ve en muchas empresas dedicadas al desarrollo con arquitecturas basadas en microservicios utilizando Docker. Esta plataforma concretamente ejecuta instrucciones como root para la creación de contenedores, volúmenes, redes y otras funciones que son habituales en Docker. Una práctica muy extendida y que se fomenta en la documentación oficial de Docker es la de incluir a un usuario en el grupo «docker» para que no sea necesario ejecutar el cliente como «root» y de hecho es una buena práctica, siempre y cuando dicha cuenta de usuario se encuentre protegida y debidamente securizada. Por lo tanto, si durante la post-explotación se tiene acceso a una cuenta de usuario que hace parte del grupo «docker» y el servicio de Docker se encuentra correctamente instalado y configurado en dicho sistema, es altamente probable que se pueda llevar a cabo la elevación de privilegios.

En la imagen anterior, se puede ver que el usuario hace parte del grupo «docker» y a continuación, crea un contenedor utilizando el cliente de Docker con la imagen «ubuntu», en este caso se utiliza la opción «-v» para montar un volumen en Docker el cual expone los contenidos del directorio «/etc/» de la máquina host directamente en el contenedor en la ruta «/montaje». A partir de este punto será posible leer o incluso modificar ficheros tan importantes como el «/etc/passwd» o el «/etc/shadow».

Configuraciones con permisos abiertos en servicios y tareas programadas.

Es posible que servicios de uso común como Apache o MySQL utilicen un fichero configuración en el arranque con permisos demasiado abiertos, lo que permite a un atacante local ver o incluso editar detalles sobre cómo se deben ejecutar dichos servicios. Este tipo de malas prácticas le permiten a un atacante tener una visión mucho más amplia del sistema y por este motivo los ficheros de configuración utilizados por servicios como los indicados anteriormente (entre otros) deben ser de lectura/escritura sólo para el administrador.
Por otro lado, las tareas programadas y utilidades que realizan las mismas funciones que el demonio CROND son especialmente interesantes ya que dichas tareas se ejecutan con una periodicidad concreta y con los permisos del usuario especificado. Cada cuenta de usuario puede tener sus propias tareas programadas que se ejecutarán con sus permisos y que por defecto solo son accesibles por parte del mismo usuario, es decir, que un usuario no puede ver las tareas programadas de otro. Sin embargo es posible crear tareas globales en el fichero «/etc/crontab» y aunque dicho fichero por defecto no tiene permisos de escritura para un usuario distinto a root, todos los usuarios pueden leerlo.

En la imagen anterior se puede apreciar que efectivamente hay una tarea programada que se lanza cada minuto por el usuario «root» y además, el script de dicha tarea se encarga de levantar una base de datos H2, que tal como se puede apreciar parece ser la versión 1.4.196. Dicha versión cuenta con una vulnerabilidad que se encuentra detallada en exploit-db por lo tanto este escenario es ideal para que un atacante local pueda elevar privilegios en el sistema.

En el siguiente post se explicarán más detalles sobre post-explotación en Linux.

Un saludo y Happy Hack!
Adastra.

 

 

Categorías
Explotación de Software Hacking Networking Services - Software

Enumeración en Linux para Post-Explotación – Parte 4.

Puedes ver las tres partes anteriores de este post aquí:
Enumeración en Linux para Post-Explotación – Parte 1.
Enumeración en Linux para Post-Explotación – Parte 2.
Enumeración en Linux para Post-Explotación – Parte 3.

Aunque los siguientes puntos se han mencionado en los posts anteriores, se ha hecho de una forma un tanto superficial y dado que son detalles importantes para llevar a cabo un proceso de elevación de privilegios «en condiciones», en esta parte de la serie se hablará sobre vulnerabilidades en el kernel, ficheros con el SUID habilitado y capabilities en Linux.

Detectar vulnerabilidades en el Kernel.

En primer lugar, es bien sabido que el kernel de Linux ha presentado vulnerabilidades muy graves a lo largo de su historia, las cuales han permitido que atacantes locales consigan la ejecución de instrucciones con privilegios de root. Encontrar una versión desactualizada del kernel no siempre significa que dicho sistema sea vulnerable ya que se puede encontrar parcheado, pero existe una posibilidad que una de las tantas vulnerabilidades reportadas en sitios como exploit-db, Security Focus o CVE-Details desemboque en la tan anhelada elevación de privilegios. Como resulta evidente, una de las primeras cosas que hay que consultar es la versión del sistema operativo y partiendo de dicha información buscar las vulnerabilidades existentes. Una alternativa para realizar este proceso consiste en utilizar el repositorio oficial de Exploit-DB y ejecutar la herramienta «searchsploit» que se encuentra disponible en dicho repositorio. La ventaja de hacerlo de esta manera es que no hace falta buscar los exploits en la página web de Exploit-DB y se tienen todas las pruebas de concepto y exploits localmente en la máquina del atacante. En un sistema Kali Linux ya viene incluido, sin embargo en cualquier otro sistema basado en Linux es tan sencillo como clonar el repositorio y ejecutar la herramienta.

En la mayoría de los casos hay que seguir un proceso de «prueba y error» partiendo de la información obtenida del sistema comprometido. Cada exploit tiene sus características propias y condiciones de funcionamiento, evidentemente no solo es requisito fundamental que la versión del kernel sea el «target» del exploit sino que además es necesario que las condiciones requeridas se cumplan.

Explotación de binarios con el SUID/GUID habilitado.

Cuando un binario se ejecuta en el sistema lo hace con los privilegios que tenga asignados la cuenta de usuario que invoca dicho binario pero en ocasiones, se necesitan permisos adicionales que no dispone esa cuenta y que son requeridos para la correcta ejecución el programa. Este es un caso en el que pueden entrar en juego los binarios con el SUID/GUID habilitado, de tal manera que cuando se ejecutan lo hacen con los privilegios del propietario del binario. Evidentemente, si hay alguna vulnerabilidad en ese binario que le permita a un atacante local ejecutar código, estas instrucciones también se ejecutarán con los permisos del propietario de dicho binario con lo cual, esta se convierte en una vía valida para elevación de privilegios horizontal o vertical.

En la imagen anterior se puede comprobar que hay binario con el SUID habilitado y además, dicho intenta ejecutar un comando llamado «apache2» que no se encuentra incluido en el PATH. Esto significa que simplemente alterando la variable de entorno PATH e incluyendo un directorio en el que se encontrará un ejecutable con nombre «apache2» será suficiente para lanzar las instrucciones maliciosas con los privilegios del propietario de ese binario «suideado», que en este caso es root.

 

Explotación de Capabilities en binarios.

El uso de ficheros con SUID/GUID o programas como SUDO permiten ejecutar comandos que requieren cierto nivel de privilegios sin necesidad de asignar un grupo o convertir en administrador al usuario que los ejecuta. Sin embargo en algunos casos este no suele ser un buen enfoque ya que existen programas que solamente necesitan permisos concretos para realizar ciertas operaciones (utilizar una interfaz de red o dispositivo en el sistema, abrir un puerto por debajo del 1024, leer ficheros concretos, hacer modificaciones en el sistema, etc.) y dado que estos mecanismos suelen ser de «todo o nada» no siempre son la mejor solución. Especialmente en el caso de los SUIDs, ya que al menos con SUDO se puede afinar bastante qué comandos puede ejecutar el usuario como administrador. Ahora bien, desde la versión 2.2.11 del Kernel de Linux se han introducido las capabilities, las cuales representan un potente mecanismo para la gestión granular de permisos sobre ficheros. Cada capability otorga un permiso concreto y nada más, lo que significa que la superficie de ataque se ve reducida al asignar únicamente los permisos que el binario necesita, evitando la situación del «todo o nada». No obstante, debido a malas prácticas de administración o por configuraciones inseguras que se aplican en un momento determinado un binario puede tener asignadas capabilities que pueden producir una elevación de privilegios.

En la imagen anterior se puede apreciar que hay varios binarios que tienen la capability «CAP_SETUID», la cual tal como se indica en la documentación oficial permite realizar manipulaciones arbitrarias del UID efectivo con el que se ejecuta el binario. Como se enseña en la imagen anterior, utilizando «python3.5» con dicha capability habilitada se puede generar una reverse shell. Esto evidentemente ha sido preparado así para efectos demostrativos, pero en la práctica esta situación se encontrará en muy raras ocasiones, especialmente si es un entorno maduro o con unas políticas de seguridad mínimas (y no un CTF). Como siempre, es una de las tantas cuestiones que se deben comprobar y que no requiere mucho esfuerzo. Puede ocurrir que algún binario en el sistema tenga alguna capability asignada y permita fugas de información o en el peor de los casos la elevación de privilegios.

En el próximo post se explicarán otros detalles a tener en cuenta durante la enumeración en sistemas Linux.

Un saludo y Happy Hack!
Adastra.

Categorías
Explotación de Software Hacking Networking Services - Software

Enumeración en Linux para Post-Explotación – Parte 3.

Puedes ver las dos partes anteriores de este post aquí:
Enumeración en Linux para Post-Explotación – Parte 1.
Enumeración en Linux para Post-Explotación – Parte 2.

A continuación se enseñan algunas otras cuestiones básicas que se deben consultar a la hora de enumerar un sistema Linux. Sirven como complemento de lo que se ha mencionado en los dos post anteriores y con toda esta información se va obteniendo una imagen mucho más amplia del sistema comprometido, incluyendo entre otras cosas, posibles vías para elevar privilegios.

Enumeración en logs y el historial de comandos ejecutados.

En un sistema Linux hay varios directorios y ficheros destinados al almacenamiento de logs, esta información en ocasiones puede ser difícil de manejar dado que en un sistema productivo suelen haber miles de registros pero es probable que existan fugas de información o detalles sobre el sistema que pueden evidenciar una vulnerabilidad o ser la pieza que hacía falta para componer un buen vector de ataque. En los sistemas Linux hay directorios donde se almacenan ficheros de logs que son más o menos habituales, algunos se encontrarán disponibles en el sistema o no dependiendo del software instalado. Por ejemplo, si hay un servidor web Apache instalado es posible encontrar ficheros de log relacionados con los errores que se van produciendo o las trazas que van dejando las aplicaciones web. La mayoría de estos ficheros se encuentran almacenados en /var/log

Otra fuente interesante de información se encuentra disponible en los logs generados por herramientas como RPM o DPKG a la hora de instalar software en el sistema. Dichas trazas pueden revelar la existencia de programas o librerías con vulnerabilidades conocidas. Como siempre, se busca recolectar la mayor cantidad de información posible.

No obstante, hay que tener en cuenta que dependiendo de la configuración que tenga el sistema es posible que estos directorios o ficheros tengan alguna restricción de acceso, en sistemas Fedora/CentOS es común encontrarse con que los ficheros de log listados anteriormente solamente los puede leer el usuario «root», por lo tanto hay que ver a qué ficheros se puede acceder en primer lugar. Más adelante se dedicará un post completo para ver cuáles son los ficheros de logs más importantes en un sistema Linux y su utilidad en la post-explotación.
Por otro lado, en ocasiones el historial de comandos ejecutados pueden dar pistas sobre las prácticas que sigue el administrador a la hora de gestionar el sistema, para ello el comando «history» será perfecto. Si es posible acceder a los directorios «home» de los usuarios y muy especialmente a los ficheros «.bash_history», es posible encontrar detalles útiles. Aunque es habitual que no se pueda acceder al directorio «home» de otro usuario, esto es algo que también se debe probar.

Detección y enumeración en un entorno «container».

Cada vez resulta más común encontrarse con entornos «dockerizados», especialmente en arquitecturas basadas en microservicios. Normalmente las posibilidades que tiene un atacante en un contenedor son bastante más limitadas pero afortunadamente es fácil detectar que se está en este tipo de entornos. Hay indicios durante la enumeración que permiten saber que no se opera sobre el sistema directamente y que la vulnerabilidad explotada para ganar acceso, afecta a un servicio o programa que se encuentra en ejecución en un contenedor. Algunas de las «pistas» que pueden indicar que el servicio comprometido se encuentra en un contenedor son las siguientes:

  • Hostname: Suele ser un indicio bastante común ya que por defecto es el ID del contenedor Docker.
  • Dirección IP: Por defecto, en Docker el direccionamiento IP empieza en 172.17.*
  • Dirección MAC. Para evitar colisiones ARP, todos los contenedores Docker tienen una MAC asignada en el rango de 02:42:ac:11:00:00 y 02:42:ac:11:ff:ff
  • Procesos: El listado de procesos será muy reducido comparado con cualquier servidor “físico” ya que normalmente los contenedores se encargan de gestionar microservicios.
  • CGroups: Inspeccionar los CGroups suelen enseñar suficientes evidencias sobre si los procesos se encuentran aislados en un contenedor o no. basta con ver el fichero «/proc/1/cgroup» en donde «1» representa el PID de un proceso activo.

Una mala práctica que suele presentarse en los contenedores Docker consiste precisamente en que en ocasiones es posible acceder al socket unix del demonio Dockerd. De esta manera, un atacante puede acceder a información del demonio o incluso controlarlo aunque se encuentre dentro de un contenedor. Es algo que se produce en raras ocasiones pero se debe probar.

Existen otras consideraciones a la hora de enumerar contenedores, por ejemplo la posibilidad de analizar el entorno de red en busca de otros contenedores que se encuentren en ejecución por la instancia de Docker, conexiones que se establecen entre el contenedor comprometido y otros que se encuentran disponibles en la infraestructura (algo muy común) o incluso, ver si es posible pivotar. Todo esto también hace parte de un proceso de enumeración.

Información sensible en ficheros y bases de datos.

Las bases de datos representan una fuente valiosa de información, no tanto como un recurso para elevar privilegios (aunque en ocasiones puede ser) sino para acceder a datos potencialmente sensibles. Las aplicaciones web utilizan bases de datos como MySQL, PostgreSQL, Oracle, SQLServer, etc. para almacenar información de las aplicaciones web desplegadas, por lo tanto no es de extrañar que esta sea una de las primeras cosas que se deben revisar en el proceso de enumeración del sistema. Lo más común es encontrarse con que es necesario contar con un usuario y contraseña para acceder al motor de bases de datos y estos detalles, tal como se ha visto en el post anterior, es posible que se hayan obtenido de un fichero de configuración. Muchas aplicaciones web desarrolladas en lenguajes como Java, Ruby on Rails o PHP leen las credenciales de acceso a base de datos de ficheros existentes en el sistema u otros recursos que se encuentran en texto plano.


Una vez dentro de la base de datos utilizando cualquier cliente compatible para dicho motor, basta con ejecutar consultas SQL o si cuenta con un cliente que tenga una GUI como DbVisualizer solamente hace falta navegar por las tablas y ver la información que almacenan. No todo en post-explotación está orientado a elevar privilegios, es posible que la información almacenada en la base de datos sea algo más valioso que tener un control total sobre sistema.

En el siguiente post se seguirán enseñando otras cuestiones a tener en cuenta durante la post-explotación de un sistema Linux.

Un saludo y Happy Hack!
Adastra.

Categorías
Explotación de Software Hacking Services - Software

Enumeración en Linux para Post-Explotación – Parte 2.

Continuando con los detalles básicos que se deben recolectar en un proceso de post-explotación en sistemas Linux, en este artículo se hablará de algunas otras cuestiones que hay que tener en cuenta para extraer información útil.

Información sobre cuentas de usuarios y contraseñas.

Una practica habitual una vez se consigue acceso al sistema es comprobar la cuenta con la que se está operando y cuál es su nivel de acceso. Además de esto se puede consultar qué usuarios se encuentran conectados al sistema y si lo están usando en ese momento. Es interesante ver qué hay en el directorio «/home» suponiendo que exista y ver los permisos que tiene habilitados.

Por otro lado, también es habitual ejecutar una búsqueda global el todo el sistema para encontrar ficheros de configuración, scripts o programas que tienen contraseñas «hardcodeadas». En ocasiones las credenciales descubiertas en estos sitios pueden ser decisivas a la hora de elevar privilegios en el sistema.

Permisos asignados a ficheros y binarios.

Los permisos que se asignan a un fichero o directorio pueden afectar la forma en la que se comportan las utilidades disponibles en el sistema o restringir accesos. Así es como se ha diseñado el sistema y está bien, sin embargo es posible que debido a malas configuraciones por parte de un usuario se asignen permisos demasiado abiertos a ficheros o directorios con información sensible, algo que posteriormente puede ser aprovechado por un atacante en post-explotación. De hecho, es una situación bastante común ya que en ocasiones, por descuido o para probar rápidamente el funcionamiento de una herramienta, se asignan permisos como «777» o «755» a ficheros o directorios y luego se olvida asignar nuevamente unas restricciones de acceso más seguras.

Por otro lado, en sistemas Linux además de los permisos comunes de lectura, escritura y ejecución, existen otras características para la gestión de permisos como pueden ser los permisos especiales SUID/GUID, las ACLs y las capabilities. Cualquier fichero ejecutable con estas características habilitadas puede representar una forma de elevar privilegios, en la recolección de información hay que tenerlos identificados para luego verificar si efectivamente pueden ser útiles para este propósito.

Detectar servicios mal configurados o vulnerables.

Los servicios o «daemons» en sistemas Linux representan otra posible forma de elevar privilegios en el sistema. Pueden haber servicios que se ejecutan localmente y que tienen contraseñas por defecto/predecibles, ficheros de configuración o directorios con permisos débiles, versiones con vulnerabilidades conocidas o simplemente con configuraciones descuidadas. Este tipo de problemas también entran en el «checklist» de pruebas que hacen parte de cualquier proceso de post-explotación. Se deben comprobar las siguientes cosas como mínimo:

  • Listado de conexiones de red (TCP y UDP) así como detectar qué servicios se encuentran activos
  • Listado los binarios vinculados a los servicios y permisos asociados.
  • Listado de binarios en unidades SystemD o «init.d»

  • Versiones de servicios comunes, como por ejemplo MySQL, PostgreSQL, Apache HTTPD, SSHD, Tomcat, etc.
  • Acceso a los ficheros de configuración de los servicios.
  • Acceso a los ficheros de log de los servicios
  • Listado de módulos, librerías o Shared Objects que utilizan los servicios.

La enumeración completa de cada servicio puede aportar información muy valiosa en el proceso de post-explotación y como resulta evidente, es un proceso que lleva tiempo y hay que hacerlo con cierto cuidado. Por otro lado, si hay un servicio que se encuentra escuchando únicamente en la interfaz de red local (loopback) es posible que sea necesario «abrir» ese servicio hacia fuera para acceder a él desde la máquina del atacante y realizar pruebas de explotación más interesantes, esto es muy común en servicios de bases de datos como MySQL o PostgreSQL que por defecto hacen un bind de los puertos 3306 y 5432 en la IP local. Para  hacer esto existen muchas alternativas, por ejemplo se podría crear un SSH, una redirección con SOCAT, utilizar Chisel o levantar un proxy HTTP/SOCKS con una herramienta como ncat.

En la imagen anterior aparece en la primera terminal información sobre el servicio de MySQL ejecutándose localmente en la máquina comprometida (puerto 3306). Se crea un túnel SSH local que abrirá el puerto 3333 y redirigirá las conexiones entrantes por dicho puerto al 3306 de MySQL. Desde la máquina del atacante es tan simple como utilizar cualquier herramienta que realice comprobaciones contra MySQL en la IP de la víctima en el puerto 3333, en este caso se utiliza Metasploit Framework y un módulo auxiliar trivial. Esta es una forma típica de acceder y explotar servicios que se están ejecutando en loopback y que a lo mejor tienen alguna vulnerabilidad.

En el próximo post se avanzará un poco más en comprobaciones y técnicas que se aplican en post-explotación sobre sistemas Linux.

Un saludo y Happy Hack!
Adastra.

Categorías
Explotación de Software Hacking Services - Software

Enumeración en Linux para Post-Explotación – Parte 1.

Las posibilidades que ofrece un sistema Linux son bien conocidas, existe documentación abundante en internet y saber moverse por este tipo de entornos es un «must» cuando se trata de aprender seguridad informática. En el proceso de post-explotación es importante conocer la estructura del sistema y qué cosas se pueden hacer. Hace algunas semanas he escrito una serie de artículos compuesta por 6 posts sobre enumeración en Windows para Post-Explotación y ahora es el turno de Linux, este será el primer post. La post-explotación es un proceso en el que se debe recolectar la mayor cantidad de información y separar el grano de la paja. Obtener dicha información puede que no resulte tan difícil pero el proceso de análisis y detectar qué es útil y qué no lo es requiere cierta pericia y habilidad.

Obtener información general del sistema.

Esto es lo primero que hay que mirar,  reconocer el entorno y extraer información básica del mismo. Para ello hay varios comandos y ficheros que son accesibles para todos los usuarios. Algunos de los detalles a tener en cuenta son los siguientes.

  • Versión del sistema operativo, nivel de compilación y distribución de Linux concreta.
  • Usuarios existentes en el sistema y sus directorios home.
  • Gestores de paquetes instalados y sus versiones (dpkg/rpm/pacman/apt/yum/otro).
  • Nombre de host y detalles básicos de la red.

En Linux consultar dicha información es muy simple y se puede hacer rápidamente con los comandos disponibles en el propio sistema operativo.

Información sobre procesos en ejecución y servicios instalados.

Los servicios y programas que se encuentran en ejecución pueden ser un buen inicio en la búsqueda de vulnerabilidades en el sistema. Es posible que algún proceso se esté ejecutando con los privilegios de root y que incluya alguna vulnerabilidad que se puede explotar localmente, esta situación es de las más deseables para la elevación de privilegios. También es común encontrar servicios que inicialmente no se han descubierto en el proceso de reconocimiento con herramientas como NMap, ya que se trata de servicios de red que únicamente aceptan conexiones en la interfaz de loopback (localhost). Un ejemplo típico de esto son servicios de bases de datos como PostgreSQL o MySQL. En este punto del proceso se toma nota de los servicios encontrados para posteriormente, centrarse en buscar directorios y ficheros comunes en donde probablemente se podrá encontrar información sensible. Por ejemplo, en el caso de un servidor web Apache HTTPD, se probará si el directorio «/var/www/html» se encuentra creado y si se puede acceder al fichero de configuración del servidor.

Variables de entorno y ficheros relacionados.

Las variables de entorno representan uno de los elementos más importantes en cualquier sistema operativo ya que permiten asignar valores a nombres globales para la sesión de cada usuario. Esto a efectos prácticos significa que aplicaciones, servicios y utilidades en el sistema pueden leer dichas variables para su correcto funcionamiento. Por ejemplo, es muy común que en proyectos basados en Java se tenga que configurar las variables de entorno «JAVA_HOME» y «PATH» para indicar la ubicación de la JVM y las utilidades core de Java (como javac, jar, jarsigner, jinfo, etc) respectivamente. Lo que se busca es precisamente aquellas variables de entorno menos comunes que no vienen definidas por defecto en el sistema y que son susceptibles de ser modificadas o que pueden aportar información interesante. En cualquier distribución basada en Linux  el comando «env» permite ver las variables de entorno y comprobar su contenido.


Una de las variables de entorno más importantes tanto en Linux como en Windows es «PATH». Se trata de una variable que permite definir cuáles son las rutas en donde se encuentran los ejecutables que se pueden lanzar desde cualquier ubicación en la terminal. Por este motivo es posible ejecutar comandos como «ls» sin especificar la ruta completa «/bin/ls», por defecto la variable de entorno PATH incluye ubicaciones comunes como «/bin/», «/usr/local/sbin», entre otras. Es muy habitual que el usuario tenga que editar esta variable para especificar la ubicación de otras aplicaciones comunes en el sistema, tal y como se ha mencionado antes para las utilidades del JDK (Java Development Kit). Para editar esta variable de entorno o cualquier otra, se puede hacer de forma temporal o permanente. Para hacerlo de forma temporal es tan simple como ejecutar el comando «export» y para hacerlo de forma permanente se editan ficheros como el «~/.bashrc» o «~/.bash_profile». Sabiendo esto resulta interesante comprobar el contenido de dichos ficheros y ver qué variables se han creado manualmente por parte del usuario, por ejemplo:

Si se cuenta con los privilegios necesarios para editar alguno de estos ficheros o los directorios a los que apunta la variable, es posible que se consiga elevación de privilegios horizontal cuando el usuario ejecute un comando común, el cual en realidad estará apuntando a otro binario que ha puesto el atacante en una ruta accesible en la variable PATH.

En los siguientes posts se profundizará bastante más sobre el procedimiento completo para enumerar sistemas Linux, orientado concretamente a la post-explotación.

 

Un saludo y Happy Hack!
Adastra.