WTF es el Hacking?
Tags: hacking, pentesting, security, hacker
Published: 2023-09-02 18:00:00


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aw3lnecjcvrqhgc9s951.png)

# WTF es un Hacker? (Opinión del autor)
Hacker es un título que te lo dan las mismas personas o la comunidad, por tus logros y/o habilidades en la materia. Autoproclamarse Hacker sin estas características es caer en la arrogancia. Además, ningún Hacker se llama así mismo Hacker.

## Pentesting
Una prueba de penetración, o **pentest**, es un ataque a un sistema informático con la intención de encontrar las debilidades de seguridad y todo lo que podría tener acceso a ella, su funcionalidad y datos. [Fuente: Wikipedia]

### Ciclo de vida de un ataque
1. **Reconocimiento**: Es la primera fase de un ataque, en donde se obtiene información superficial del sistema o arquitectura a atacar, como descubrimiento de hosts, dominios y/o páginas web de cualquier objetivo el cual pueda ser atacado. Debemos Identificar los lenguajes de programación en el que está programado la página web que se va a atacar.

2. **Enumeración**: En esta fase se identifica qué función cumple y qué tipo de servicios corren en el servidor u objetivo. También obtenemos el tipo de sistema operativo y versiones de puertos por medio de escaneos, en caso de las páginas web identificar las versiones de las tecnologías usadas. Todo esto con el fin de encontrar vulnerabilidades.

3. **Explotación**: Luego de obtener información suficiente del sistema a atacar y también sus versiones, se buscan las posibles vulnerabilidades existentes, junto con eso se buscan los exploits o se fabrican pruebas de concepto para así explotar la vulnerabilidad (aprovechar el bug) y sacar provecho de ello.

4. **Post-Explotación**: Ya cuando estás dentro del sistema, después de haber explotado las vulnerabilidades que te permitan hacerlo, necesitas ganar acceso persistente en el sistema para luego capturar las contraseñas guardadas, obtener llaves de acceso, acceso a la red interna de un servidor expuesto en internet, aprovechar los recursos del servidor para beneficio propio como ataques de denegación de servicio, phishing, y por último después de hacer todo esto se realiza un borrado de huellas.

### Tipos de pentestings
* **Black Box**: Es el tipo de pentesting donde no tienes información previa del objetivo (target).

* **Grey Box**: Cuando tienes cuentas de usuario del objetivo (target) el cual facilita la explotación interna cuando empiezas a realizar el ataque.

* **White Box**: Significa que tienes información de la infraestructura o el código fuente del objetivo (target) al iniciar el pentesting.

## Inteligencia en el ataque
Es la información que obtienes y de cómo le puedes sacar provecho a ello.

* **Ejemplo práctico**: Existe un formulario en una página web donde puedes poner un _RUT/DNI_ y te devuelve un correo.

* **Acción criminal**: En Chile, años atrás, el _Servel_ de vez en cuando liberaba la información de todas las personas mayores de 18 (Nombre, RUT, sexo, dirección, comuna). Entonces tú al consultar el RUT asumes que te devuelve el correo del respectivo RUT. Además, el RUT es un entero de 7 a 8 dígitos más un dígito verificador, este dígito verificador es una fórmula conocida, por lo cual no es necesario conocerlo. Conociendo el correo de una persona es posible realizar un spear phishing aprovechando la información del Servel.

### Phishing
Se produce un ataque de suplantación de identidad (phishing) cuando alguien trata de conseguir que reveles información personal en línea.

**¿Cómo suele hacerse la suplantación de identidad?**

Por lo general, la suplantación de identidad se realiza por correo electrónico, anuncios o sitios que tienen un aspecto similar a los que usas. Por ejemplo, alguien que te envía un correo electrónico que parece proceder de tu banco para que le des información sobre tu cuenta bancaria. Los correos electrónicos o sitios de suplantación de identidad podrían solicitar lo siguiente:

* Nombres de usuario y contraseñas, incluidos los cambios de contraseña
* Números de identificación personal
Números de cuentas bancarias
* PIN (Números de identificación personal)
* Números de tarjetas de crédito
* Apellido de soltera de tu madre
* Tu fecha de nacimiento

**Fuente**: https://support.google.com/mail/answer/8253?hl=es-419

### Para atacar al enemigo debes conocerlo
Una forma efectiva de poder tener mejores nociones de seguridad y entender mejor cómo atacar un sistema, es usar la tecnología o haber programado en tal lenguaje, por ejemplo, para saber cómo atacar mejor un **Wordpress**, es conocimiento útil ya haber instalado y configurado anteriormente el CMS porque sabes cómo está estructurado.

# Cómo funciona la red e internet
Al acceder a una página web, tu sistema operativo utiliza al navegador como cliente, el cual se conecta al del dominio o dirección IP e interpreta el servicio que provee el servidor.

* `MAC address`: La dirección MAC (siglas en inglés de _Media Access Control_) es un identificador único de 6 bloques de dos caracteres hexadecimales de una tarjeta o dispositivo de red. Se la conoce también como dirección física, y es única para cada dispositivo. Ej: `1A:2B:CB:D4:EE:F6`

* `IP address`: La dirección IP es un conjunto de números que identifica, de manera lógica y jerárquica, a una interfaz en red de un dispositivo. Ej: `1.1.1.1`, `255.255.255.0`

* `IP privada`: Es la IP que te asigna el router para poder navegar de forma interna en la red local.

* `IP pública`: Es la IP que es accesible desde cualquier lugar del mundo desde un proveedor de servicios de internet.

* `puerto`: Es el número de identificación de un servicio en concreto. Cada host tiene disponible **65536** puertos enumerados desde el **0** al **65535**. Cuando estableces conexión con un servidor es fundamental que el servidor tenga un puerto disponible para su entrada. Cuando te conectas a una página web, el cliente que vendría siendo el navegador, se conecta al puerto **80** o **443** del servidor. Pero también ocurre otra cosa, cuando te conectas a un servidor, el cliente usa un puerto que es superior al **1024** para conectarse a él. Más abajo existe un ejemplo gráfico de cómo funciona. Existen puertos conocidos como los siguientes:

    - `ftp`: 21
    - `ssh`: 22
    - `http`: 80
    - `https`: 443

Algunos conceptos necesarios para seguir entendiendo las redes son:

* `router`: El artefacto que está en tu casa que permite que tengas internet y esté todo conectado a la misma red.
red local (LAN): Por dar un ejemplo es la red del router de tu casa, no del internet en general, solo de tu casa.

* `wifi`: Protocolo de conexión inalámbrica a la red.
ethernet: Conexión por cable a la red.

* `host`: Es un dispositivo como computadora, laptop, teléfono inteligente, servidor, que esté conectado a la red.
cliente-servidor: Un cliente realiza peticiones a otro host, el servidor, quien le da la respuesta de esa petición.

* `dominio`: Es la traducción de una IP a un nombre, usualmente este está compuesto por 2 partes, el nombre y el tld. Ej: `midominiounicoyespecial.com` (`dominio.tld`)

* `subdominio`: Es una subdivisión del dominio. Se compone por 3 partes, el nombre de la subdivisión, el nombre del dominio, y el tld. Ej: `subdom.midom.com`

## Esquema de conexión Cliente — Servidor

```lua
+-----------+                               +------------+
|           |        172.16.18.2:80         |            |
|           |  +------------------------->  |            |
|           |                               |            |
|  Cliente  |                               |  Servidor  |
|  Firefox  |                               |    web     |
|           |      172.16.20.34:36894       |            |
|           |  <-------------------------+  |            |
|           |                               |            |
+-----------+                               +------------+
*172.16.20.34*                              *172.16.18.2*
```

## Protocolos de internet
**TCP** y **UDP** son dos protocolos fundamentales para las comunicaciones a través de Internet.

**TCP** (_Transmission Control Protocol_) es un protocolo orientado a la conexión, lo que significa que antes de enviar datos, se establece una conexión entre dos dispositivos. Es un protocolo confiable que garantiza que los datos se transmitan de manera segura y completa a través de la red. **TCP** incluye mecanismos de retransmisión de paquetes perdidos, control de flujo y control de congestión. Es ampliamente utilizado en aplicaciones que requieren una transmisión de datos precisa y confiable, como correo electrónico, transferencias de archivos y transacciones bancarias en línea.

**UDP** (_User Datagram Protocol_) es un protocolo sin conexión, lo que significa que los dispositivos no necesitan establecer una conexión antes de transmitir datos. Es un protocolo más rápido y eficiente que **TCP**, ya que no incluye los mecanismos de control de errores y congestión. **UDP** es utilizado principalmente en aplicaciones donde la velocidad es más importante que la precisión, como juegos en línea, transmisiones de video en vivo y voz sobre IP.

En resumen, la principal diferencia entre **TCP** y **UDP** es que **TCP** es un protocolo orientado a la conexión y confiable, mientras que **UDP** es un protocolo sin conexión y no confiable pero más rápido. La elección del protocolo depende de las necesidades específicas de la aplicación y la red en la que se utiliza.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h49fl36xj7c700ilhlt1.png)

# Software y lenguajes de programación
El software es un conjunto de programas que se ejecutan en un ordenador o dispositivo electrónico, dividido en software de sistema y software de aplicación. Algunos lenguajes de programación son los siguientes:

* **C/C++** en el hacking es usado para la creación de backdoors que pueda evadir **AV/EDR** o _exploits de escalada de privilegios local_. Es un lenguaje difícil de aprender y de bajo nivel.

* **Python** es un lenguaje de programación de alto nivel, fácil de leer y escribir. En el hacking se usa para casi cualquier cosa, desde servidores para recibir conexiones en casi todos los protocolo, desarrollo de _exploits_ por lo general webs y _Buffer Overflows_, herramientas de redes, bots de **Telegram**, análisis estático de binarios, automatización de enumeración/ataques y así podría seguir hasta aburrirlos.

* **Go** es tan flexible como Python, pero requiere un poco más de esfuerzo para aprender debido a su nivel de dificultad ligeramente superior. La gracia de este lenguaje es el fácil manejo de concurrencia y la [compilación cruzada](https://opensource.com/article/21/1/go-cross-compiling).

* **Javascript** es un lenguaje de programación esencial para el desarrollo web moderno. También existe su formato Backend que es **NodeJS** y su derivado **Typescript**. Muchos sitios están en **Javascript** tanto Frontend como Backend por lo cual siempre es útil conocerlo.

* **Bash** es un lenguaje de programación utilizado en sistemas operativos **\*Nix** (_Unix_ y _Linux_) para automatizar tareas mediante scripts y para interactuar con el sistema operativo mediante la línea de comandos, da mayor flexibilidad para realizar funciones de administración de sistema operativo, por lo que tienes un mayor control del sistema operativo por lo cual optimiza los tiempos de programación usando más recursos.

* **PowerShell** permite a los usuarios interactuar con el sistema operativo de _Windows_ mediante la línea de comandos, y también permite la automatización de tareas mediante la escritura de scripts. En el hacking sirve para vulnerar _Windows_ más fácilmente.

* **Java** es un lenguaje de programación popular y versátil utilizado en una amplia variedad de aplicaciones de software. Sirve para desarrollar módulos para **Burpsuite** y es ampliamente usado por lo que se recomienda aprenderlo para entender como funciona las tecnologías.

* **Rust** puede ser considerado el reemplazo moderno y seguro de **C/C++**, aun así el compilador de **Rust** ocupa **gcc**. Es usado para backdoors que evadan **AV/EDR** y herramientas de post-explotación como volcador de memoria y herramientas de red.

## Lenguajes compilados, interpretados y administrados
Los lenguajes de programación se dividen en tres categorías: **compilados**, **interpretados** y **administrados**. Los lenguajes **compilados** traducen el código a lenguaje de máquina antes de la ejecución, mientras que los lenguajes **interpretados** lo hacen en tiempo de ejecución. Los lenguajes **administrados** utilizan una máquina virtual para ejecutar el código en lenguaje de bajo nivel. _C/C++_, _Go_, _Rust_ y _C#_ son **compilados**, _Python_, _Javascript_, _Bash_ y _PowerShell_ son **interpretados**, y _Java_ con _C#_ son **administrados**.

## Lenguajes recomendados
Los lenguajes que sirven para temas de hacking y seguridad ofensiva de propósitos generales son: **Python**, **Bash**, **Go**, **C/C++** en ese orden de importancia dado a que con esto tendrás la suficiente libertad para ser independiente de las herramientas creadas o tener la suficiente flexibilidad de modificarlas y mejorarlas. Un plus seria aprender **PowerShell** y **C#** para la explotación de redes Microsoft.

# Conclusión
En el area del **hacking** es fundamental contar con sólidos conocimientos en redes, sistemas operativos y programación, ya que al ser multidisciplinario proporciona las herramientas necesarias para destacar en la mayoría de las áreas. En esta disciplina es necesario la **habilidad**, **versatilidad**, **creatividad** y **genialidad** del _adversario_, capaz de resolver problemas informáticos para lograr vulnerar el componente objetivo usando solo el conocimiento actual a la fecha, sus herramientas e Internet.