Quantcast
Channel: hackplayers
Viewing all 1666 articles
Browse latest View live

Malware cracking (by Markel Picado #hc0n2019)

$
0
0
La charla que "rompió el hielo" en la segunda edición de h-c0n y personalmente una de las qué más me impactó por su temática fue "Malware cracking" de Markel. En ella mostró como después de un análisis profundo del código de las últimas muestras de Lokibot (uno de los infostealers más populares) se dió cuenta que un actor tercero las estaba vendiendo más baratas que la versión original: el secuestro de malware.

En la presentación mostró como se realizó el parche, cómo ese parche creó un error en todas las muestras de LokiBot utilizadas en las campañas más recientes y cómo esas muestras de LokiBot estaban relacionadas con la versión original de LokiBot.

Además, Markel nos enseñó dos herramientas que escribió: una para desinfectar un sistema comprometido con LokiBot y la otra es un script de Python capaz de generar nuevas muestras de LokiBot con paneles de control personalizados. El script de Python puede parchear muestras de la versión modificada de LokiBot y corregir el error generado por la modificación realizada por el tercer actor.

Presentación:


Fotos:






mXtract: escanea volcados de memoria... para hacer el mal

$
0
0
En la mayoría de los entornos de Linux, los usuarios pueden acceder a la memoria de muchos procesos, lo que puede permitir a un atacante recopilar credenciales, claves privadas o cualquier cosa que se suponga que se ve, pero que está siendo procesada por un programa en texto no cifrado.

mXtract es una herramienta escrita en c++ y de código abierto que realiza y analiza volcados de memoria y se desarrolló precisamente como una herramienta ofensiva con el propósito principal es escanear la memoria en busca de claves privadas, IPs y contraseñas usando expresiones regulares.

Es una herramienta que puede resultar bastante útil y sus resultados serán tan buenos como las expresiones regulares que añadas en las búsquedas.    

Características

- Posibilidad de usar expresiones regulares
- Comprueba si el rango de memoria se puede escribir con los permisos actuales
- Salida en XML y HTML junto con la salida predeterminada (nombre del proceso: resultado)
- Capacidad para escanear todos los procesos o un PID específico
- Posibilidad de elegir secciones de memoria para escanear
- Capacidad para mostrar información detallada del proceso
- Capacidad para escanear archivos del entorno de proceso
- Los volcados de memoria eliminan automáticamente los caracteres Unicode, lo que permite el procesamiento con otras herramientas o manualmente.
Instalación

Descarga: git clone https://github.com/rek7/mXtract
Compilar: cd mXtract && sh compile.sh

Esto creará el directorio bin/ y compilará el binario como mXtract.

 ./bin/mxtract -h


Ejemplos

Escanear en modo verbose con una simple expresión regular de una IP, escaneando cada segmento de datos, mostrando información del proceso y escaneando los archivos de entorno:


Escanear en modo verbose con una simple expresión regular de una IP, escaneando solo el heap y la pila, mostrando información de proceso y escaneando los archivos de entorno:


Escanear sin verbose, y con una simple expresión regular de IP, mostrando información de proceso y escaneando archivos de entorno:



Github: https://github.com/rek7/mXtract

Basado en:

Plugin para exportar proyectos de IDA Pro a Ghidra

$
0
0
Ghidra ha llegado dispuesto a "comerle la tostada" a IDA Pro. Sirva de claro ejemplo que hasta incluye un plugin para usarse directamente con el famoso desensamblador/debugger de Hex-Rays y que permite exportar bases de datos de IDA Pro como archivos XML para que luego puedan importarse a Ghidra.
Para agregar el plugin de este exportador a XML a la instalación de IDA simplemente hay que mover o copiar los directorios a <directorio de instalación de ghidra>/Extensions/IDAPro. El complemento está disponible para IDA Pro versiones 6 y 7.

Sus contenidos son:

- xml_exporter.py: es el plugin para exportar la base de datos IDA como archivo XML. Se debe colocar en la carpeta de plugins de IDA.
- xml_loader.py: es el cargador de IDA para construir una nueva base de datos utilizando un archivo XML. Carga el archivo de bytes y construye la base de datos de IDA utilizando el contenido del archivo XML. Debe colocarse en la carpeta de loaders de IDA.
- xml_importer.py: es un plugin para agregar datos de un archivo XML a una base de datos existente. NO cargará ningún dato binario del archivo de bytes. Agregará símbolos, comentarios, códigos, datos, funciones, etc. para las direcciones que existen actualmente en la base de datos. Se debe colocar en la carpeta de plugins de IDA.
- idaxml.py: es un módulo y una importación requerida para xml_exporter, xml_importer y xml_loader. Debe colocarse en la carpeta python de IDA.

Después de colocar los archivos indicados, veremos en IDA dos nuevos iconos en el menú de plugins:


Ahora simplemente hay que exportar la base de datos de IDA pro utilizando el plugin y luego arrastrarla y soltarla en el proyecto de Ghidra como si fuera un proyecto normal:


También puede importar la base de datos de Ghidra en IDA pro utilizando el importador XML:



Fuente: https://revers3c.blogspot.com/2019/04/import-ida-pro-database-into-ghidra.html

La pastilla Roja/Azul del Cloud (by Lorien & Kneda #hc0n2019)

$
0
0
Al contratar los servicios cloud para el almacenamiento de nuestros archivos se nos permite disponer de estos en cualquier parte del mundo pero, ¿qué pasa si se vulnera la seguridad del cloud?. En la charla "La pastilla Roja/Azul del Cloud" Kneda demostró cómo se puede llegar a vulnerar la seguridad del cloud, llegando incluso a conseguir información personal, y Lórien intentó a través de la forénsica desenmascarar al autor. ¿Quién ganó realmente?

Tenemos un vídeo en el que se muestra la "batalla" pero sus autores nos han pedido que no lo subamos todavía porque volverán a dar la charla próximamente. Así que si quieres ser testigo presencial de nuestro particular Yin Yang aka rojo vs azul en ciberseguridad permanece atento!

Presentación:



Fotos:





RedHunt Linux Distribution (VM)

$
0
0
RedHunt Linux Distribution (VM) es máquina virtual para la emulación de adversarios y la caza de amenazas. Pretende ser una "ventanilla única" para todas las necesidades de emulación de amenazas y búsqueda de amenazas al integrar el arsenal del atacante y el conjunto de herramientas del defensor para identificar activamente las amenazas en el entorno.

Máquina base:

  • Lubuntu-18.04 x64

Herramientas:

Emulación de ataques:

Logging y monitorización:

Open Source Intelligence (OSINT):

Threat Intelligence:

Enlace de descarga de la VM:


    Changelog
    • System Updates
    • Tool Updates
    • New Categories added: Open Source Intelligence & Threat Intelligence
    • Base OS Updated to 18.04
    • Metasploit Framework Installed
    Instalación:
    • Descarga la última OVA de https://github.com/redhuntlabs/RedHunt-OS.
    • Importa la OVA en VirtualBox/VMWare.
    • Login usando las credenciales hunter:hunter.
    • Actualiza la distribución ‘sudo apt-get update && sudo apt-get upgrade’.
    • Configura/Usa las herramientas.
    VM Credenciales:Username: hunter Password: hunter
    Caldera Credenciales:Username: admin Password: caldera

    Checksums:

    Version 1
    • MD5: 49b14e98b0b7d0276fe90da3f98608b0
    • SHA1: 1963cdccc31349699226a3741bc5d1825ab70a61

      Github: https://github.com/redhuntlabs/RedHunt-OS

      Evil Clippy: herramienta para crear documentos de MS Office maliciosos

      $
      0
      0
      Evil Clippy de Stan Hegt (@StanHacked) es un asistente multiplataforma para crear documentos maliciosos de Microsoft Office. Se presentó en la BlackHat Asia (28 de marzo de 2019) y puede ocultar macros VBA, pisar código VBA (a través de P-Code) y confundir a las herramientas de análisis de macros.

      Actualmente esta herramienta es capaz de obtener una macro predeterminada de Cobalt Strike que puede bypassear todos los principales productos antivirus y la mayoría de las herramientas de análisis de maldoc (mediante el uso de stomping VBA en combinación con nombres de módulos aleatorios).

      Evil Clippy usa la librería OpenMCDF para manipular los archivos (Compound File Binary Format) de MS OFfice y abusa de las especificaciones y características de MS-OVBA. Reutiliza el código de Kavod.VBA.Compression para implementar el algoritmo de compresión que se usa en las secuencias de dir y módulos (consultar MS-OVBA para obtener las especificaciones relevantes).

      Evil Clippy compila perfectamente bien con el compilador Mono C# y ha sido probado en Linux, OSX y Windows.


      Repositorio: https://github.com/outflanknl/EvilClippy

      Instalación

      Se puede encontrar un binario compilado multiplataforma en "releases".

      En OSX y Linux hay que tener instalado Mono y ejecutar el siguiente comando desde la línea de comandos:

      mcs /reference:OpenMcdf.dll,System.IO.Compression.FileSystem.dll /out:EvilClippy.exe * .cs

      Después para ejecutar Evil Clippy desde la línea de comandos:

      mono EvilClippy.exe -h

      En Windows hay que tener instalado Visual Studio. Luego, ejecutar el siguiente comando desde una ventana de comandos de Visual Studio developer:

      csc /reference:OpenMcdf.dll,System.IO.Compression.FileSystem.dll /out:EvilClippy.exe * .cs

      Luego ejecutar Evil Clippy desde la línea de comandos:

      EvilClippy.exe -h


      Ejemplos de uso

      Mostrar ayuda

      EvilClippy.exe -h

      Ocultar macros del GUI

      Ocultar todos los módulos de macros (excepto el módulo predeterminado "ThisDocument") del editor de la GUI de VBA. Esto se logra eliminando las líneas de módulos de la secuencia del proyecto [MS-OVBA 2.3.1].

      EvilClippy.exe -g macrofile.doc

      Stomp VBA (abuso de P-code)

      Poner el código fake de VBA del archivo de texto fakecode.vba en todos los módulos, mientras deja el P-code intacto. Esto abusa de una característica no documentada de streams de módulos [MS-OVBA 2.3.4.3]. Hay que tener en cuenta que la versión del proyecto VBA debe coincidir con el programa host para que se ejecute el P-code.

      EvilClippy.exe -s fakecode.vba macrofile.doc

      Nota: VBA Stomping no funciona para archivos guardados en el formato de libro de Excel 97-2003 (.xls)

      Establecer la versión de Office objetivo para VBA stomping

      Igual que el anterior, pero está orientado explícitamente a Word 2016 en x86. Esto significa que Word 2016 en x86 ejecutará el P-code, mientras que otras versiones de Word ejecutarán el código desde fakecode.vba. Esto se logró estableciendo los bytes de versión apropiados en el stream _VBA_PROJECT [MS-OVBA 2.3.4.1].

      EvilClippy.exe -s fakecode.vba -t 2016x86 macrofile.doc

      Establecer nombres de módulos aleatorios (herramientas "tontas" de análisis)

      Establece nombres de módulos ASCII aleatorios en la secuencia dir. [MS-OVBA 2.3.4.2]. Esto abusa de la ambigüedad en los registros de MODULESTREAMNAME [MS-OVBA 2.3.4.2.3.2.3]: la mayoría de las herramientas de analistas usan los nombres de los módulos ASCII que se especifican aquí, mientras que MS Office usó la variante Unicode. Al establecer un módulo ASCII al azar, la mayoría de las herramientas de análisis de P-code y VBA se bloquean, mientras que el código P real y VBA aún funcionan bien en Word y Excel.

      EvilClippy.exe -r macrofile.doc

      Nota: se sabe que esto es eficaz para engañar a pcodedmp y VirusTotal

      Servir un template stomped VBA a través de HTTP

      Sirve macrofile.dot a través del puerto HTTP 8080 después de realizar el stomp VBA. Si se recupera este archivo, automáticamente obtiene la versión de Office destino (utilizando sus encabezados HTTP y, a continuación, establece los bytes _VBA_PROJECT en consecuencia).

      EvilClippy.exe -s fakecode.vba -w 8080 macrofile.dot

      Nota: El archivo que está sirviendo debe ser una plantilla (.dot en lugar de .doc). Se puede configurar una plantilla a través de una URL (¡no se requiere la extensión .dot!) Desde la barra de herramientas del desarrollador en Word. Además, fakecode.vba debe tener un atributo VB_Base establecido para una macro desde una plantilla (esto significa que facecode.vba debe comenzar con una línea como Atributo VB_Base = "0 {00020906-0000-0000-C000-000000000046}") .

      Referencias:

      PartyLoud: un sencillo script en bash para generar "ruido" en la red

      $
      0
      0
      PartyLoud es una herramienta para crear tráfico de Internet falso con el fin de impedir o mitigar el seguimiento en redes locales. Está basada en noisy.py y su objetivo es hacer mucho ruido en la red (en forma de peticiones http) para que sea más difícil rastrear tu navegación real.

      Cuando ejecutamos el script, se inician varios hilos y cada uno realiza una solicitud HTTP diferente con Curl. Luego se analiza la salida para elegir la siguiente url, simulando una navegación. A menos que el usuario detenga el script (ya sea presionando Intro o mediante CTRL-C), permanecerá activo.


      Podemos editar el fichero partyloud.conf para actualizar la lista de URLs utilizadas para iniciar la "falsa" navegación pero, eso sí, cada vez que añadamos nuevas direcciones más subprocesos se iniciaran, pudiendo llegar a convertirse en una "fork bomb". En futuras versiones se añadirá la posibilidad de limitar el número máximo de hilos para evitar este problema. La herramienta también va cambiando el "User Agent" de las peticiones para prevenir el fingerprinting.

      En definitiva un script sencillo pero útil en algunos escenarios...

      Usage: ./partyloud.sh [options...]

      -l --url-list     read URL list from specified FILE
      -b --blocklist    read blocklist from specified FILE
      -p --http-proxy   set a HTTP proxy
      -s --https-proxy  set a HTTPS proxy
      -h --help         dispaly this help

      Repo: https://github.com/realtho/PartyLoud

      Reto 30: TweetDB

      $
      0
      0
      Nuestro colega, el bot de Hackplayers que se encarga de las RRSS de la comunidad, ha evolucionado a tal nivel que es capaz de desarrollar sus propias aplicaciones, esta vez ha realizado una especie de almacén para guardar las estadisticas de los tweets más relevantes de la cuenta de @Hackplayers. Según comenta, esta aplicación ha sido programada correctamente y no entraña ningún peligro para el servidor que la ejecuta. ¿Eres capaz de demostrar lo contrario?


      Aplicación: https://drive.google.com/file/d/1DRZ-HeedHx_ZYZGkG5LjqSKV09F0GmGH
      Servidor: challenges.hackplayers.com 
      Puerto: 1337/TCP
      (Formato de la flag: HPYS{string})

      Bonus:Mañana 24 de abril estaremos en Mundo Hacker Day, el primero que nos facilite la flag allí presencialmente será obsequiado con una estupenda camiseta de nuestra conferencia h-c0n (edición 2019)

      Crónica de #MundoHackerDay 2019

      $
      0
      0
      El miércoles 24 de abril estuvimos en Mundo Hacker Day, la sexta edición del evento que organizan desde Mundo Hacker y que este año tuvo lugar en Kinépolis en Madrid. Tuvimos la suerte de ser invitados junto con otras comunidades y conferencias del panorama nacional y por ende la oportunidad de reencontrarnos y conocer a colegas que comparten con nosotros una misma pasión: el hacking. Allí estuvieron @workinghackers @hackandbeers @HackOnURJC @Honey_SEC @secadm1n @CONPilarZgz @tomatinacon @HackSolidario @qurtubacon @EuskalHack @FAQinCongress @mariapitadefcon:


      Pocas veces podemos encontrarnos tantos en un mismo espacio así que la experiencia fue genial. Además, también preparamos varios "juegos" para los que os pudisteis acercar a conocernos o charlar con todos nosotros y, como muchos me pedistéis más detalle o simplemente para los que no tuvisteis la oportunidad de asistir, os dejo un resumen de cada uno de ellos.


      Proyecto Conet y las misteriosas estaciones de números

      Los cascos inalámbricos que veíais en el stand estaban reproduciendo continuamente los audios del Proyecto Conet. Nos recomendó ponerlos David Marugán aka @radiohacking y la verdad que cerrar los ojos y escuchar cualquier pista es cuanto menos sorprendente y curioso. Durante más de 45 años, el espectro de onda corta ha sido utilizado por las agencias de inteligencia de todo el mundo para transmitir mensajes secretos, las llamadas emisoras o estaciones de números, voces "rezando" secuencias de números, palabras o letras y el Proyecto Conet recoge un buen número de ellas.
      Podéis descargar 4 de los 5 CDs aquí, por si queréis escucharlos en casa.


      Mensaje cifrado militar original de 1914

      Un joya que nos prestó también David Marugán y que pudimos admirar de cerca fue un mensaje cifrado en Clave Circular 33 del Ministerio de la Guerra español (1851-1939) en la que se desaconseja una posible ocupación militar de Tetuán, un documento original de más de 100 años que perfectamente pudierda estar en un museo. Así que no podemos más que reiterar los agradecimientos a David por dejárnoslo y aprovechar para deciros que estéis atentos al programa de TV de Cuarto Milenio, en el que si no es hoy será muy pronto lo veremos hablando de... en fin, es secreto ;)


      Lock picking

      Lock picking o ganzuado es el arte de abrir una cerradura mediante el análisis y manipulación de sus componentes internos sin utilizar la llave original.
      Al stand llevamos un buen número de candados y cerraduras de distintos niveles de dificultad para que intentárais abrirlos... ¡y vaya si lo intentasteis! Gracias también a mi compi Chema García porque me dejó la mayoría. Si alguno es nuevo en esto y quiere primero una aproximación teórica le recomendamos echar un viztazo a la serie de nuestro "taller de lockpicking", empezando por la primera entrada.


      Juego de códigos QR

      Por último, también montamos un "mini-CTF" que consistía en acceder y obtener la password de una base de datos sqlite sólo interactuando con un lector de códigos QR. La idea original era de otro compi, Amine Taouirsa, y consiste en una Raspberry Pi 3 con una cámara para leer los códigos, una impresora térmica para generar tickets con el código QR inicial (originado al registrar un usuario) y una pantalla lcd 16x2 para mostrar la información. Para no hacer esta entrada demasiado larga publicaremos el detalle de todo, esquema del circuito y código fuente incluidos, en un post más adelante.


      Agenda

      Aunque no pudimos todos asistir a todas las charlas que quisimos por tener que estar en el stand y no disponer del don de la bilocación he de decir que hubo muchas y muy buenas. También que las que pudimos ver se hicieron muy cortas en la mayoría de los casos, porque con tanta calidad y temas interesantísimos en liza 25 minutos se suelen quedar muy cortos. Pero es lo que hay al tener un sólo día, una agenda apretada incluso con tracks a modo de demos simultáneos:




      Lo bueno es que todas las charlas fueron transmitidas en streaming... y grabadas, por lo que esperamos poder tenerlas también pronto disponibles. ¡Ah! Y tampoco olvidarnos del CTF presencial que tuvo lugar durante el evento, otra nueva y buena iniciativa, creado y organizado por los miembros del equipo español de los European Cyber Security Challenge:


      La guinda: premio a Hackplayers como impulsores de talento

      Estábamos nominados para los premios MundoHacker como 'Impulsores de talento en Ciberseguridad' junto con Telefónica Talentum, Ética Hacker y Afterwork:


      Y una de las mayores sorpresas nos llegó al final del evento: ¡resultamos ganadores del premio!. Y creedme que no es falsa modestia si digo que este premio es realmente de TODOS los que habéis participado de una manera u otra en la Comunidad y es fruto precisamente de eso: de vuestro talento.


      Yo no sé si realmente hemos sido muchas veces la "chispa" necesaria para animaros a introduciros en este fantástico mundo, pero de lo que si estoy seguro es de que hemos formado un grandísimo grupo de gente interactuando y compartiendo información sobre una de sus pasiones, el hacking y la in-seguridad informática.

      Sería injusto nombrar uno a uno con nombre y apellidos a cada una de las personas que han participado en Hackplayers, simplemente por el riesgo de olvidar a alguien, pero se que los que estáis leyendo y lo habéis hecho espero os sintáis aludidos e identificados: el staff de la h-c0n, los autores del blog (ya más de 20), Lik0r y los grupos de HTB, los admin de la infraestructura y de las RRSS, los participantes de CTFs, los amigos de otras comunidades y conferencias (también echamos de menos a algunas que faltaron), los ex-compañeros y compañeros de trabajo, nuestros familiares por aguantarnos... a todos ¡GRACIAS!

      Iniciación al reversing de firmware: extracción del sistema de archivos

      $
      0
      0
      No son poco frecuentes las noticias acerca de la aparición de backdoors presentes en miles y miles de dispositivos. Su descubrimiento, muchas veces explotado por atacantes malintencionados, suele ser el resultado de un análisis exhaustivo del firmware correspondiente. Si nunca os habéis enfrentado a este tipo de ejercicio, en el blog de 15/85 Security daban una breve introducción para extraer el sistema de ficheros de un binario, una buena piedra de toque:

      1.- Descarga de firmware de prueba, en este caso la versión 1.14.04 de la cámara D-Link modelo DCS-932L:

      $ wget ftp://ftp2.dlink.com/PRODUCTS/DCS-932L/REVA/DCS-932L_REVA_FIRMWARE_1.14.04.ZIP

      $ unzip DCS-932L_REVA_FIRMWARE_1.14.04.ZIP
      Archive:  DCS-932L_REVA_FIRMWARE_1.14.04.ZIP
        inflating: DCS-932L_REVA_RELEASENOTES_1.14.04_EN.PDF 
        inflating: dcs932l_v1.14.04.bin   

      2.- Para empezar echamos un vistazo a las strings con 10 o más caracteres imprimibles:

      $ strings -10 dcs932l_v1.14.04.bin | more
      NetInitTcp
      NetTcpSend
      NetReceive
      send_syn_ack
      send_reset
      ArpTimeoutCheck
      HttpHandler
      mpfd_decode
      do_httpsvr
      rf      - read/write rf register
      rf r <reg>        - read rf register
      rf w <reg> <data> - write rf register (reg: decimal, data: hex)
      Signature: DCS-930            932L  Release 1.11 (2011-05-31)
      *** failed ***
      relocate_code Pointer at: %08lx
      Please choose the operation:
         %d: Load system code to SDRAM via TFTP.
         %d: Load system code then write to Flash via TFTP.
         %d: Boot system code via Flash (default).
         %d: Entr boot command line interface.
         %d: Load Boot Loader code then write to Flash via Serial.
         %d: Load Boot Loader code then write to Flash via TFTP.
       Please Input new ones /or Ctrl-C to discard
          Input device IP
          Input server IP
      0x80200000
      0x88001000
      0x80100000
          Input Uboot filename
          Input Linux FileSystem filename
      0x80800000
          Input Linux Kernel filename
      Entering HTTP server.
      Entering program & boot linux.
      Erase linux block (0x%x ~ 0x%x)
      Erase linux block (0x%x ~ 0x%x
      ### ERROR ### Please RESET the board ###
      Warning: Abort rw rf register: too busy
      Warning: still busy
      Error: rw register failed
      rf reg <%d> = 0x%x
      *** Error: D+/D- is 1/1, config usb failed.
      config usb
      Watchdog Reset Occurred
      ******************************
      Software System Reset Occurred
      Software CPU Reset Occurred
      ============================================
      Ralink UBoot Version: %s
      --------------------------------------------
      (Port5<->None)
      DRAM component: %d Mbits %s
      DRAM bus: %d bit
      ...
      ...

      3.- Ahora usamos binwalk, me atravería a decir la herramienta de facto cuando nos enfrentamos a análisis de firmware. Al ejecutarlo directamente nos devolverá varios "hits" del binario:

      $ binwalk dcs932l_v1.14.04.bin
      DECIMAL       HEXADECIMAL     DESCRIPTION
      --------------------------------------------------------------------------------
      106352        0x19F70         U-Boot version string, "U-Boot 1.1.3"
      106816        0x1A140         CRC32 polynomial table, little endian
      124544        0x1E680         HTML document header
      124890        0x1E7DA         HTML document footer
      124900        0x1E7E4         HTML document header
      125092        0x1E8A4         HTML document footer
      125260        0x1E94C         HTML document header
      125953        0x1EC01         HTML document footer
      327680        0x50000         uImage header, header size: 64 bytes, header CRC: 0x88345E96, created: 2016-09-09 13:52:27, image size: 3804958 bytes, Data Address: 0x80000000, Entry Point: 0x803B8000, data CRC: 0x531E94DE, OS: Linux, CPU: MIPS, image type: OS Kernel Image, compression type: lzma, image name: "Linux Kernel Image"
      327744        0x50040         LZMA compressed data, properties: 0x5D, dictionary size: 33554432 bytes, uncompressed size: 6558763 bytes

      Mirando la primera línea, vemos que binwalk encontró un string U-Boot en 106352, ya sabéis, el cargador de arranque. Y por supuesto, en 327680, podemos ver un encabezado de uImage que nos indica que encontraremos la imagen del kernel del SO en un archivo LZMA que comienza en 327744.

      4.- El siguiente paso seguro que lo habéis adivinado: extraer el LZMA.

      $ dd if=dcs932l_v1.14.04.bin skip=327744 bs=1 of=kernel.lzma
      3866560+0 records in
      3866560+0 records out
      3866560 bytes (3,9 MB, 3,7 MiB) copied, 5,02835 s, 769 kB/s

      Así de sencillo, comprobamos el fichero extraído:

      $ file kernel.lzma
      kernel.lzma: LZMA compressed data, non-streamed, size 6558763

      Y lo descomprimimos. En mi caso con "unlzma kernel.lzma" me arrojaba el error: "Compressed data is corrupt". Algo "bypasseable" con 7z:

      $ 7z x kernel.lzma
      7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
      p7zip Version 16.02 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,64 bits,12 CPUs Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz (906EA),ASM,AES-NI)

      Scanning the drive for archives:
      1 file, 3866560 bytes (3776 KiB)

      Extracting archive: kernel.lzma
      --
      Path = kernel.lzma
      Type = lzma

      ERROR: There are some data after the end of the payload data : kernel

      Sub items Errors: 1

      Archives with Errors: 1

      Sub items Errors: 1

      El resultado:
      $ file kernel
      kernel: data

      $ du -h kernel
      6,3M    kernel

      5.- Al igual que antes, vamos a ejecutar binwalk contra el archivo de datos resultante:
      DECIMAL       HEXADECIMAL     DESCRIPTION
      --------------------------------------------------------------------------------
      3145804       0x30004C        Linux kernel version "2.6.21 (andy@ipcam-linux.alphanetworks.com) (gcc version 3.4.2) #3121 Fri Sep 9 21:52:18 CST 2016"
      3175792       0x307570        SHA256 hash constants, little endian
      3408260       0x340184        Copyright string: "Copyright (c) 2010 Alpha Networks Inc."
      3422378       0x3438AA        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/mlme.c:%d assert SupRateLen <= MAX_LEN_OF_SUPPORTED_RATESfailed
      3422502       0x343926        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/mlme.c:%d assert ExtRateLen <= MAX_LEN_OF_SUPPORTED_RATESfailed
      3423342       0x343C6E        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/mlme.c:%d assert !(ATE_ON(pAd))failed
      3425158       0x344386        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/action.c:%d assert pAd->BATable.BAOriEntry[i].Wcid < MAX_LEN_OF_MAC_TABLEfailed
      3425298       0x344412        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/action.c:%d assert pBAEntry->Wcid < MAX_LEN_OF_MAC_TABLEfailed
      3425770       0x3445EA        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/ba_action.c:%d assert 0failed
      3425858       0x344642        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/ba_action.c:%d assert mpdu_blkfailed
      3425954       0x3446A2        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/ba_action.c:%d assert listfailed
      3426046       0x3446FE        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/ba_action.c:%d assert mpdu_blk->pPacketfailed
      3426150       0x344766        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/ba_action.c:%d assert pBAEntry->list.qlen == 0failed
      3426630       0x344946        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/ba_action.c:%d assert pEntryfailed
      3426946       0x344A82        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/ba_action.c:%d assert pAd->BATable.numAsOriginator != 0failed
      3427066       0x344AFA        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/ba_action.c:%d assert pAd->BATable.numAsRecipient != 0failed
      3427514       0x344CBA        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/ba_action.c:%d assert pAd->MacTab.Content[Elem->Wcid].Sst == SST_ASSOCfailed
      3428102       0x344F06        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/ba_action.c:%d assert pRxBlk->pRxPacketfailed
      3428206       0x344F6E        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/ba_action.c:%d assert (0<= pBAEntry->list.qlen) && (pBAEntry->list.qlen <= pBAEntr
      3428414       0x34503E        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/ba_action.c:%d assert pBAEntryfailed
      3428510       0x34509E        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/ba_action.c:%d assert (pBAEntry->list.qlen == 0) && (pBAEntry->list.next == NULL)f
      3428902       0x345226        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/cmm_data.c:%d assert pEntryfailed
      3429054       0x3452BE        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/cmm_data.c:%d assert Length <= MGMT_DMA_BUFFER_SIZEfailed
      3429342       0x3453DE        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/cmm_data.c:%d assert pTxWIfailed
      3429666       0x345522        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/cmm_data.c:%d assert pProbeEntryfailed
      3429762       0x345582        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/cmm_data.c:%d assert pProbeEntry != NULLfailed
      3429918       0x34561E        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/cmm_data.c:%d assert pSrcBuffailed
      3430010       0x34567A        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/cmm_data.c:%d assert (pktLen > 34)failed
      3430110       0x3456DE        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/cmm_data.c:%d assert pRxBlk->pRxPacketfailed
      3430214       0x345746        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/cmm_data.c:%d assert pHeaderfailed
      3430306       0x3457A2        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/cmm_data.c:%d assert pAd->FragFrame.pFragPacketfailed
      3430418       0x345812        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/cmm_data.c:%d assert pAd->FragFrame.LastFrag == 0failed
      3432322       0x345F82        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/rtmp_init.c:%d assert (Length==0) || (pDest && pSrc)failed
      3433174       0x3462D6        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/rtmp_init.c:%d assert dev_pfailed
      3447398       0x349A66        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/cmm_asic.c:%d assert BssIndex < 4failed
      3447498       0x349ACA        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/cmm_asic.c:%d assert KeyIdx < 4failed
      3451114       0x34A8EA        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/cmm_data_pci.c:%d assert QueIdx < NUM_OF_TX_RINGfailed
      3451226       0x34A95A        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/cmm_data_pci.c:%d assert pAd->ate.QID == 0failed
      3451470       0x34AA4E        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/common/cmm_data_pci.c:%d assert pPacket == NULLfailed
      3457110       0x34C056        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/sta/rtmp_data.c:%d assert pRxWI->WirelessCliID == BSSID_WCIDfailed
      3457230       0x34C0CE        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/sta/rtmp_data.c:%d assert 0failed
      3457570       0x34C222        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/sta/rtmp_data.c:%d assert pAd->SharedKey[BSS0][0].CipherAlg <= CIPHER_CKIP128failed
      3457706       0x34C2AA        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/sta/rtmp_data.c:%d assert pTxBlkfailed
      3457798       0x34C306        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/sta/rtmp_data.c:%d assert pTxBlk->MpduHeaderLen >= 24failed
      3457910       0x34C376        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/sta/rtmp_data.c:%d assert (pTxBlk->TxPacketList.Number > 1)failed
      3458026       0x34C3EA        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/sta/rtmp_data.c:%d assert (pTxBlk->TxPacketList.Number== 2)failed
      3458142       0x34C45E        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/sta/rtmp_data.c:%d assert TX_BLK_TEST_FLAG(pTxBlk, fTX_bAllowFrag)failed
      3458266       0x34C4DA        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/sta/rtmp_data.c:%d assert pTxBlk->TxPacketList.Numberfailed
      3458498       0x34C5C2        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/sta/connect.c:%d assert SsidLen <= MAX_LEN_OF_SSIDfailed
      3462790       0x34D686        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/os/linux/rt_linux.c:%d assert memfailed
      3462958       0x34D72E        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/os/linux/rt_linux.c:%d assert pPacketfailed
      3463054       0x34D78E        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/os/linux/rt_linux.c:%d assert pInPacketfailed
      3463150       0x34D7EE        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/os/linux/rt_linux.c:%d assert ppOutPacketfailed
      3463266       0x34D862        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/os/linux/rt_linux.c:%d assert pDatafailed
      3463358       0x34D8BE        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/os/linux/rt_linux.c:%d assert DataLenfailed
      3463506       0x34D952        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/os/linux/rt_linux.c:%d assert DataSize < 1530failed
      3463610       0x34D9BA        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/os/linux/rt_linux.c:%d assert pRxBlk->pRxPacketfailed
      3463714       0x34DA22        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/os/linux/rt_linux.c:%d assert pHeader802_3failed
      3464130       0x34DBC2        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/os/linux/rt_linux.c:%d assert pTaskfailed
      3464462       0x34DD0E        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/os/linux/rt_linux.c:%d assert pNetDevfailed
      3464766       0x34DE3E        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/os/linux/rt_linux.c:%d assert (prefixLen < IFNAMSIZ)failed
      3464878       0x34DEAE        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/os/linux/rt_linux.c:%d assert ((slotNameLen + prefixLen) < IFNAMSIZ)failed
      3480306       0x351AF2        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/os/linux/rt_ate.c:%d assert (TxPower >= -7)failed
      3484022       0x352976        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/os/linux/rt_ate.c:%d assert (BbpValue == 0x00)failed
      3484126       0x3529DE        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/os/linux/rt_ate.c:%d assert (BbpValue == 0x04)failed
      3485810       0x353072        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/os/linux/rt_ate.c:%d assert bbp_data == valuefailed
      3486762       0x35342A        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/os/linux/rt_ate.c:%d assert pRaCfg != NULLfailed
      3487126       0x353596        Unix path: /net/wireless/rt2860v2_sta/../rt2860v2/os/linux/rt_pci_rbus.c:%d assert pAdfailed
      3491536       0x3546D0        Unix path: /etc/Wireless/RT2860STA/RT2860STA.dat
      3573187       0x3685C3        Neighborly text, "neighbor %.2x%.2x.%.2x:%.2x:%.2x:%.2x:%.2x:%.2x lost on port %d(%s)(%s)"
      3807776       0x3A1A20        CRC32 polynomial table, little endian
      4038656       0x3DA000        LZMA compressed data, properties: 0x5D, dictionary size: 1048576 bytes, uncompressed size: 8072704 bytes

      6.- Como veis, en la parte superior de la salida de binwalk podemos ver la versión del kernel de Linux. También hay otro archivo LZMA en 4038656, así que repetimos la operación de antes:

      $ dd if=kernel skip=4038656 bs=1 of=mystery.lzma
      2520107+0 records in
      2520107+0 records out
      2520107 bytes (2,5 MB, 2,4 MiB) copied, 3,25778 s, 774 kB/s
      $ unlzma mystery.lzma
       file mystery
      mystery: ASCII cpio archive (SVR4 with no CRC)

      7.- Bien! tenemos un archivo CPIO, que es otro formato ... y es el tipo de lugar donde es probable que encuentre el sistema de archivos. Así que creamos un directorio donde vamos a volcar el contenido y lo descomprimimos:

      $ mkdir fs; cd fs
      $ cpio -idm --no-absolute-filenames < ../mystery
      cpio: Removing leading `/' from member names
      15767 blocks

      Y ya está. Si todo ha ido bien podemos explotar el sistema de archivos:

      $ ls -las
      total 68
      4 drwxr-xr-x 17 root root 4096 may  4 11:29 .
      4 drwxr-xr-x  3 root root 4096 may  4 11:23 ..
      4 drwxrwxr-x  2  501  501 4096 may  4 11:29 bin
      4 drwxrwxr-x  3  501  501 4096 may  4 11:29 dev
      4 drwxrwxr-x  2  501  501 4096 may  4 11:29 etc
      4 drwxrwxr-x  9  501  501 4096 may  4 11:29 etc_ro
      4 drwxrwxr-x  2  501  501 4096 sep  9  2016 home
      0 lrwxrwxrwx  1  501  501   11 may  4 11:29 init -> bin/busybox
      4 drwxr-xr-x  4  501  501 4096 may  4 11:29 lib
      4 drwxrwxr-x  2  501  501 4096 sep  9  2016 media
      4 drwxrwxr-x  2  501  501 4096 sep  9  2016 mnt
      4 drwxrwxr-x  2  501  501 4096 may  4 11:29 mydlink
      4 drwxrwxr-x  2  501  501 4096 sep  9  2016 proc
      4 drwxrwxr-x  2  501  501 4096 may  4 11:29 sbin
      4 drwxrwxr-x  2  501  501 4096 sep  9  2016 sys
      4 drwxrwxr-x  2  501  501 4096 sep  9  2016 tmp
      4 drwxrwxr-x  5  501  501 4096 may  4 11:29 usr
      4 drwxrwxr-x  2  501  501 4096 sep  9  2016 var

      QR-game: "hackea" una base de datos mediante códigos QR

      $
      0
      0
      Lo prometido es deuda, lo tenía pendiente publicar y aquí os traigo el detalle y código del juego de códigos QR que llevamos a Mundo Hacker Day 2019.

      Como os dije en la crónica del congreso, la idea fue de un compi Amine Taouirsa al que le comenté que quería implementar una versión propia y llevarla también al evento. El juego se inicia generando un ticket en un impresora térmica con un código QR al registrar a un usuario en una base de datos SQLite. Luego, el usuario tiene que leerlo con su móvil y ser capaz de generar otros códigos que deben ser leídos por la cámara de una Raspberry Pi para conseguir primero acceso a la base de datos y segundo la contraseña del usuario 'admin'.


      Los componentes que forman parte del "QR-Game" son:
      - Arduino Uno: con un LCD 16x2, potenciómetro, switch, altavoz y resistencias.
      - Raspberry Pi 3: con cámara JZK.
      - Impresora térmica USB de 58mm
      - Soportes y portátil.

      Mi versión se basa en el proyecto "Crystal Ball' del libro de proyectos del Starter Kit de Arduino y su esquema mostrado abajo, añadiendo además un altavoz para reproducir un sonido o melodía al leer un código con la cámara, resetear o completar el juego.

      Código Arduino:
      #include <LiquidCrystal.h>
      LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

      const int switchPin = 6;
      int switchState = 0;
      int prevSwitchState = 0;

      int pinaltavoz = 8;
      int frecuencia=220;
      int contador;
      float m=1.059;

      int melody[] = {
          262, 196, 196, 220, 196, 0, 247, 262};

      int noteDurations[] = {
          4, 8, 8, 4, 4, 4, 4, 4};

      void melodia()
      {
         for (int thisNote = 0; thisNote < 8; thisNote++) {
             
                int noteDuration = 1000/noteDurations[thisNote];
                tone(8, melody[thisNote],noteDuration);
           
                int pauseBetweenNotes = noteDuration * 1.30;
                delay(pauseBetweenNotes);
                noTone(8);
         }
      }
              
      void sonido()
      {
            for(contador=0,frecuencia=220;contador<12;contador++)
          {
              frecuencia=frecuencia*m;
              tone(pinaltavoz,frecuencia);
              delay(100);
              noTone(pinaltavoz);
              delay(50);
          }
      }

      void setup() {
        lcd.begin(16, 2);
        Serial.begin(9600);
      }

      void loop() {
        switchState = digitalRead(switchPin);
        if (switchState != prevSwitchState){
            if(switchState == HIGH) {
              lcd.clear();
              lcd.display();
              lcd.print("READING QR CODE...");
              sonido();
              delay(5000);
              lcd.clear();
              //lcd.noDisplay();
            }
        }
        if (Serial.available()) {
          delay(100);
          lcd.clear();
          while (Serial.available() > 0) {    
            String x = Serial.readString();
            lcd.clear();
            lcd.print(x);
            if (x.equals("Congratz play3r!")) {
              melodia();
           }
            tone(8,400);
            delay(10);           
            noTone(8);
            }
        }
      }

      El Arduino Uno se conecta también a una RPi3 y se comunica vía serie a través de un cable USB, que a su vez tiene también conecta a una impresora térmica para la creación de tickets.

      La base de datos sqlite 'mundohacker3.db' es supersencilla, una tabla con 3 columnas:


      El script para registrar/crear un usuario en la bbdd y generar el código QR es el siguiente:
      import sys
      import sqlite3
      import binascii
      from escpos.printer import Usb
      import qrcode
      from escpos.connections import getUSBPrinter
      termica = Usb(0x0456,0x0808,0,0x81,0x03)
      dbconnect = sqlite3.connect("mundohacker3.db");
      cursor = dbconnect.cursor();

      username = sys.argv[1];
      access = "0";

      print username;

      cursor.execute("SELECT count(*) FROM users WHERE username = '%s'" % (username,))
      existe=cursor.fetchone()[0]
      if existe==0:
          cursor.execute("insert  into users values (?,?,?)", (username, access, "Get admin pw!    "));
          dbconnect.commit();

              une = username + '|' + access;
          data = binascii.hexlify(une)
              print data

          qr = qrcode.QRCode(
              version=1,
              error_correction=qrcode.constants.ERROR_CORRECT_L,
              box_size=10,
              border=4,
          )
          qr.add_data(data)
          qr.make(fit=True)

          img = qr.make_image()
          img.save('1.png')

              termica.set(font='a', align='center')
              termica.text("Hackplayers - h-c0n\n")
          termica.text("Mundo Hacker 2019\n")
              termica.image('1.png')
              termica.text("Buena suerte " + username + "!\n")
              termica.cut()
      else:
          print ("el usuario ya existe");

      Al ejecutar este script pasándole como parámetro el nombre de usuario se generará un string del tipo:

      <nombre de usuario en hexadecimal>|0
      Por ejemplo: 766963656e7465|0

      Y dicha string será transformada en un código QR e impreso en un ticket.

      Mientras, en la raspberry estará corriendo el script de "servidor", también en Python:
      from imutils.video import VideoStream
      from pyzbar import pyzbar
      import argparse
      import logging
      import datetime
      import imutils
      import time
      import cv2
      import sqlite3
      import sys
      import serial
      ser=serial.Serial('/dev/ttyACM0',9600)

      def peinaytrozea(a):
              try:
                      str = bytearray.fromhex(a).decode();
                      print str;
              except ValueError:
              ser.write('ERROR!         ');
                      str = "";
                      time.sleep(2.0)
              if "|" in str:
              username = str.split('|')[0];
              access = str.split('|')[1];
                  print username;
                  print access;
              else:
                  username = str;
                  access = str;

          dbconnect = sqlite3.connect("mundohacker3.db");
          dbconnect.row_factory = sqlite3.Row;
          cursor = dbconnect.cursor();

          #cursor.execute("SELECT count(*) FROM users WHERE username = ?", (username,))
          cursor.execute("SELECT count(*) FROM users WHERE username = '%s'" % (username,))
         
          existe=cursor.fetchone()[0]
          if existe==0:
                  print('There is no user named %s. '%username );
                  ser.write('USER NOT EXIST  ');
                  #cursor.execute("insert into users values (?,?,?)", (username, access, 0));
                  #uncomment if you want "autocreation" feature
                  #cursor.executescript("insert into users(username, access, secret) values('{0}', '{1}', '{2}')".format(username, access, 'Changeme'));
                  #dbconnect.commit();
          else:
                  print('Username %s found in %s row(s)'%(username,existe))
                  if access=='0':
                      ser.write('NO ACCESS!      ');
                  #cursor.execute("update users set access=? where username=?", (access, username));
                  cursor.execute("update users set access='{0}' where username='{1}'".format(access, username));
                  print('Access granted');
                  #ser.write('ACCESS GRANTED  ');
                  cursor.execute("SELECT * FROM users WHERE username = '%s'" % (username,))
                  password=cursor.fetchone()[2];
                  print('The password is %s'%(password));
                  ser.write(password.encode());
                     
      ap = argparse.ArgumentParser()
      ap.add_argument("-o", "--output", type=str, default="barcodes.csv",
          help="path to output CSV file containing barcodes")
      args = vars(ap.parse_args())

      print("[INFO] starting video stream...")
      vs = VideoStream(usePiCamera=True).start()
      time.sleep(2.0)
       
      csv = open(args["output"], "w")
      found = set()

      while True:
          frame = vs.read()
          frame = imutils.resize(frame, width=400)
          barcodes = pyzbar.decode(frame)
          for barcode in barcodes:
              (x, y, w, h) = barcode.rect
              cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
              barcodeData = barcode.data.decode("utf-8")
              barcodeType = barcode.type
              text = "{} ({})".format(barcodeData, barcodeType)
              cv2.putText(frame, text, (x, y - 10),
                  cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
              peinaytrozea(barcodeData)
                      time.sleep(2)
              if barcodeData not in found:
                  csv.write("{},{}\n".format(datetime.datetime.now(),
                      barcodeData))
                  csv.flush()
                  found.add(barcodeData)
          cv2.imshow("Barcode Scanner", frame)
          key = cv2.waitKey(1) & 0xFF
          if key == ord("q"):
              break
       
      print("[INFO] cleaning up...")
      csv.close()
      cv2.destroyAllWindows()
      vs.stop()

      Este script encenderá la cámara para reconocer los códigos QR que se le pongan delante.
      Es importante decir que la cámara de la Raspberry no tiene "autofocus", así que es necesario hacer previamente un ajuste manual para que el enfoque sea mucho más cercano. Tenéis algunos videotutoriales en Internet en los que se muestra cómo hacerlo fácilmente. Básicamente es quitar un poco el pegamento y ajustarlo girando el objetivo con unas pinzas de precisión.

      Luego, si os fijáis un poco en el código del script veréis que, una vez capturado/procesado el código QR, lo que hace es convertir a ascii el hexadecimal, verificar si el usuario existe o no previamente en la base de datos y, en caso afirmativo, ver si tiene acceso comprobando si lo que detrás del separador "|" es un 1 o un 0.

      El código inicial generado en el registro (766963656e7465|0) mostrará en la pantalla LCD 'NO ACCESS!'. Pero si cambiamos el "0" por "1" (766963656e7465|1) se mostrará en pantalla 'Get admin pw!'. Darse cuenta de eso sería la primera parte de este "mini-reto".

      Y la segunda parte teniendo una base de datos delante es, efectivamente, realizar una inyección SQL. Leyendo el código es fácil darse cuenta que es vulnerable (tenéis comentado además la sentencia que no lo sería).  Y viendo además la imagen de arriba con lo datos de las columnas veis también que "Get admin pw!" es realmente la contraseña asignada por defecto a los usuarios, todas menos la del usuario 'admin' que es la que hay que obtener...

      pi@raspberrypi:~/bbdd $ python test5.py
      Username: 1' OR 1=1--
      Access: 0
      Username 1' OR 1=1-- found in 5 row(s)
      pi@raspberrypi:~/bbdd $ python test5.py
      Username: 1' OR username='admin'--
      Access: 0
      Username 1' OR username='admin'-- found in 1 row(s)
      pi@raspberrypi:~/bbdd $ python test5.py
      Username: 1' OR username='admin'--
      Access: 1
      Username 1' OR username='admin'-- found in 1 row(s)
      Access granted
      Your password is Well done dude!
      Convirtiendo a nuestro formato ese payload (hay más posibles) se supera el reto.

      Pensaréis que hacerlo "a ciegas" era realmente difícil pero ya os digo que no fue uno sino varios los que lo consiguieron... ¡sois unos máquinas! ;)

      Comprometen más de 29 botnets de IoT con credenciales débiles

      $
      0
      0
      Un hacker con nick'Subby' se hizo con más de 29 botnets de IoT en las últimas semanas haciendo fuerza bruta sobre los paneles de backend de sus servidores C2, debido a que éstos usaban credenciales débiles.

      "Ahora, esta teoría ha sido llevada a la práctica por un threat actor llamado Subby, que ha hecho fuerza bruta al menos contra 29 IoT C2s y los ha comprometido utilizando credenciales extremadamente triviales", escribió Ankit Anubhav, investigador de seguridad de NewSky Security. "Según lo compartido por el threat actor, se puede ver que las credenciales utilizadas son bastante débiles".

      Subby le dijo a Anubhav que algunos de los C2 asociados con las redes de bots de IoT estaban usando credenciales muy comunes, incluyendo "root: root", "admin: admin" y "oof: oof".


      En una entrevista con Anybhav, Subby explicó que la mayoría de las redes de bots de IoT que él hackeaba fueron creadas por script kiddies que habían seguido tutoriales online.

      "Es obvio por qué esto está sucediendo. Un gran porcentaje de operadores de botnets simplemente siguen tutoriales que se han extendido en la comunidad o están disponibles en YouTube para configurar su botnet. Al seguir estos tutoriales, no cambian las credenciales predeterminadas. Y si cambian las credenciales, la contraseña que suministran es generalmente débil y, por lo tanto, vulnerable a fuerza bruta", dijo Sabby a Anybhav.

      Subby explicó que obtuvo el control de un total de más de 40.000 dispositivos en solo una semana, un "poder de fuego" desconcertante que podría ser objeto de abuso por parte de varios threat actors.

      "En la primera semana de fuerza bruta, superé los 40.000 dispositivos. Posiblemente fue un número bastante inflado debido a las duplicidades. Está bien documentado que a los operadores de redes de bots les gusta aumentar su contador de bots. Estimo que el número está más cerca de 25.000 dispositivos únicos. Pude obtener un gráfico de tráfico de red fiable producido del tráfico generado de todas las redes de bots combinadas y fue un poco menos de 300 gbit/s", continúa Subby.

      Sabby explicó que inicialmente hackeó las botnets de IoT para ver la eficiencia de usar fuerza bruta contra paneles de administración de C2 para hacerse con una red de bots, en lugar de usar exploits.

      En definitiva, Sabby demostró que es muy fácil para los actores construir botnets de IoT que podrían usarse para muchas actividades maliciosas.

      Fuente: A hacker has taken over at least 29 IoT botnets

      FSP: herramienta que simula procesos de sandboxing para que no infecten nuestro sistema

      $
      0
      0
      Normalmente los desarrolladores de malware programan sus artefactos para que no se disparen si detectan que están dentro de una sandbox o una VM, o incluso la presencia de procesos de análisis. ¿Y si aprovecháramos ésto para proteger nuestro sistema? La idea está clara, simular que nuestra máquina es un sistema de análisis de malware para no infectarnos.


      Fake Sandbox Processes (FSP) es un pequeño script en Powershell que simulará procesos falsos de análisis, sandbox y software de VM que algunos malware intentarán evitar. Podemos descargar el script original hecho por @x0rz aquí o una versión posterior optimizada de Phoenix1747.

      Características del script

      - Algunos tipos de spyware (normalmente avanzados) pueden dejar de ejecutarse correctamente siempre que se ejecuten los procesos creados.
      - Requisitos: Powershell (preinstalado en Win 7 y posteriores), eso es todo.
      - No hay carga del sistema.
      - Fácil de usar.

      Características del instalador

      - Instala automáticamente el script en el directorio de inicio automático, de modo que no tengamos que ejecutarlo cada vez que volvamos a iniciar sesión.
      - Requisitos: Sólo PowerShell.
      - Viene también con un desinstalador para purgar todos los archivos.
      - Todo incluido en un pequeño paquete offline.
      - Actualizador opcional incluido.

      Uso

      Clic derecho en el archivo y elegir "Ejecutar con PowerShell"
      ~O~
      Abrir la consola y pegar este comando (no olvidar poner la ruta correcta):

      Powershell -executionpolicy remotesigned -F 'Your\Path\fsp.ps1'

      Después de presionar enter, podremos elegir iniciar o detener todos los procesos.

      Autoinicio

      Para iniciar automáticamente el script, el autor hizo además un instalador: fsp-installer.bat, basta con ejecutarlo:


      Proyecto: https://github.com/Phoenix1747/fake-sandbox

      Compila y recorre las instrucciones en ensamblador de un programa con penguinTrace

      $
      0
      0
      penguinTrace es una herramienta que nos permitirá escribir código y ver cómo se ejecutan las instrucciones que lo componen. El objetivo es ayudar a las personas a comprender cómo se ejecutan los programas, o mejorar la comprensión del ensamblador.


      Al escribir programas en C, es posible hacer que el compilador genere el ensamblado generado o desensamblar un binario para ver las instrucciones. Sin embargo, ver las instrucciones en forma estática no muestra el flujo a través del programa. Usando un depurador, se puede recorrer el programa, pero los depuradores proporcionan una gran cantidad de funciones y, por lo tanto, puede ser complicado mostrar las instrucciones que se están ejecutando.

      La intención de penguinTrace es proporcionar una interfaz simple para compilar y recorrer un programa. También está diseñado para admitir diferentes arquitecturas, por ejemplo, ejecutarse en una Raspberry Pi (AArch64), así como en x86_64. Por esta razón, penguinTrace se ejecuta como un servidor web al que se puede conectar desde un navegador. Esto es más liviano que ejecutar un editor/depurador gráfico y significa que puede ejecutarse sin necesidad de un monitor. Tenéis más detalle aquí.

      penguinTrace permite ejecutar código arbitrariamente como parte de su diseño. Por defecto, solo escuchará las conexiones desde la máquina local. Solo debe configurarse para escuchar las conexiones remotas en una red de confianza y no estar expuesto a la interfaz. Esto puede mitigarse ejecutando penguinTrace en un contenedor Docker:

      docker build -t penguintrace github.com/penguintrace/penguintrace


      Una vez que se construye penguinTrace, al estar integrado en un contenedor se puede ejecutar directamente así:

      docker run -it -p 127.0.0.1:8080:8080 --tmpfs /tmp:exec --cap-add=SYS_PTRACE --cap-add=SYS_ADMIN --rm --security-opt apparmor=unconfined penguintrace penguintrace

      Y sólo queda acceder a 127.0.0.1:8080 o localhost:8080 para ver la interfaz web y comenzar a jugar:





      Proyecto: https://github.com/penguintrace/penguintrace

      Zombieload: nuevos bugs que permiten extraer información de procesadores Intel

      $
      0
      0
      Varios investigadores de distintas universidades han encontrado una nueva clase de vulnerabilidades en los procesadores de Intel que pueden usarse para robar información confidencial directamente del procesador.

      Los errores recuerdan a otros de canal lateral como Meltdown, Spectre o Foreshadow, que explotaron una vulnerabilidad en la ejecución especulativa, una parte importante de cómo funcionan los procesadores modernos. La ejecución especulativa es una técnica de optimización que Intel agregó a sus CPU para mejorar la velocidad de procesamiento de datos y el rendimiento. Digamos que esta técnica ayuda a los procesadores a predecir en cierta medida lo que una aplicación o sistema operativo podría necesitar en un futuro próximo, lo que hace que la aplicación se ejecute más rápido y más eficiente. El procesador ejecutará sus predicciones si son necesarias, o las descartará si no lo son.

      El ataque ha sido bautizado como "ZombieLoad" porque toma su nombre de "carga zombie", una cantidad de datos que el procesador no puede entender o procesar adecuadamente, lo que obliga al procesador a pedir ayuda al microcódigo del procesador para evitar un bloqueo. Las aplicaciones generalmente solo pueden ver sus propios datos, pero este error permite que los datos se filtren a través de esos límites. Los investigadores dijeron que ZombieLoad filtrará cualquier dato actualmente cargado por el núcleo del procesador. Intel dijo que los parches al microcódigo ayudarán a borrar los buffers del procesador, evitando que se lean los datos.

      En la práctica, los investigadores demostraron en un video que los fallos se podían explotar para ver qué sitios web visitaba una persona en tiempo real, pero se podían reutilizar fácilmente para capturar contraseñas o tokens de acceso que se utilizan para iniciar sesión online de la víctima:


      Los investigadores reportaron estas vulnerabilidades al fabricante hace un mes. Las vulnerabilidades afectan a casi todos los ordenadores con chips Intel desde 2011.

      Intel ha lanzado microcódigo para parchear procesadores vulnerables, incluidos los chips Intel Xeon, Intel Broadwell, Sandy Bridge, Skylake y Haswell. Los chips Intel Kaby Lake, Coffee Lake, Whiskey Lake y Cascade Lake también se ven afectados, al igual que todos los procesadores Atom y Knights.

      Pero otros gigantes tecnológicos, como Apple, Microsoft o Google han lanzado parches, y se espera que otras compañías los sigan.

      Como nota negativa, Intel ya ha dicho que las actualizaciones de microcódigo, como parches anteriores, tendrá un impacto en el rendimiento del procesador, dicen un 3 por ciento en el peor de los casos, y hasta un 9 por ciento en un entorno de centro de datos, aunque aseguran que no se notará en la mayoría de los escenarios.

      De momento no han publicado el código del exploit, por lo que no existe una amenaza directa e inmediata para el usuario normal, pero habrá que estar atentos porque de filtrarse cualquier atacante podrá filtrar información de otras aplicaciones, el sistema operativo, las máquinas virtuales en la nube y de otros entornos en producción.

      Además Zombieload no es el único fallo descubierto en procesadores Intel:

      - RIDL permite que el código sin privilegios robe datos de otros programas a través de cualquier límite de seguridad: otras aplicaciones, el kernel, otras máquinas virtuales (por ejemplo, en la nube) o incluso SGX.
      - Fallout demuestra que se pueden filtrar datos de Store Buffers, que se utilizan cada vez que una pipeline de la CPU necesita almacenar cualquier información. Para empeorar las cosas, un atacante sin privilegios puede luego elegir qué datos filtrarán del almacén de la CPU. Irónicamente, las recientes contramedidas de hardware introducidas por Intel en las recientes CPUs de Coffee Lake Refresh i9 para evitar el Meltdown las hacen más vulnerables a Fallout, en comparación con el hardware de generaciones más antiguas.

      CVEs:

      - CVE-2018-12126 - MSBDS - Microarchitectural Store Buffer Data Sampling
      - CVE-2018-12127 - MLPDS - Microarchitectural Load Port Data Sampling
      - CVE-2018-12130 - MFBDS - Microarchitectural Fill Buffer Data Sampling
      - CVE-2019-11091 - MDSUM - Microarchitectural Data Sampling Uncacheable Memory

      Fuentes:
      - https://zombieloadattack.com/
      - https://hardzone.es/2019/05/14/zombieload-store-to-leak-vulnerabilidades-intel/
      - https://techcrunch.com/2019/05/14/zombieload-flaw-intel-processors/
      - https://arstechnica.com/gadgets/2019/05/new-speculative-execution-bug-leaks-data-from-intel-chips-internal-buffers/
      - https://www.zdnet.com/article/intel-cpus-impacted-by-new-zombieload-side-channel-attack/

      The hacker's hardware toolkit: un catálogo con más de 100 gadgets para hackers

      $
      0
      0
      El gran Yago Hansen (@yadox) ha decidido compartir"The hacker's hardware toolkit"que fue presentado en #HITBAMS2019 y #HITBHaxpo. Se trata de un catálogo con una gran colección de dispositivos de hardware para hackers, pentesters y red teamers.


      Incluye más de 120 gadgets clasificados en ocho categorías diferentes, para que sea más fácil buscarlos:
      1. Mini Computers: La mejor selección de mini PCs, mini placas base, etc. Las mejores herramientas para manejar todos los demás periféricos de hardware de tus proyectos. 
      2. RF: Las mejores herramientas para hackear, analizar, modificar o responder a cualquier señal de radiofrecuencia. Herramientas para hackear controladores inalámbricos, GPS, teléfonos celulares, señales satelitales, etc. 
      3. Wi-Fi: El kit de herramientas para un experto en Wi-Fi como Yago. Estas herramientas permiten el sniffing en modo monitor, enumeración, inyección, etc. Algunas herramientas como deautenticadores y amplificadores solo deben usarse en entornos de laboratorio. 
      4. RFID / NFC: Bonita colección de herramientas profesionales y para principiantes para investigar sobre las tecnologías RFID y NFC basadas en tarjetas contactless LF (baja frecuencia) y HF (alta frecuencia), etiquetas y tarjetas. Herramientas de hacking para controles de acceso, garajes, tiendas, etc. 
      5. HID / Keyloggers: HID (hardware input devices) como los ratones y los teclados USB están abiertos a un ataque de inyección de pulsaciones de teclas (keystrokes). Muchos de estos dispositivos como rubberducky, badusb, badusb ninja, etc. están aumentando sus capacidades y efectividad. Los keyloggers de hardware siguen siendo una de las mejores opciones para la captura de credenciales. 
      6. Network: Los routers pequeños, los taps y otros dispositivos de red similares basados en Linux pueden ser el compañero perfecto para un pentesting interno. Aquí encontraremos muchos mini routers basados en OpenWRT / LEDE que se pueden personalizar para pentesting de red. 
      7. BUS: Hay muchas tecnologías y protocolos de bus diferentes, y un hacker de hardware debe poseer muchas herramientas para descubrir y "hablar" con dichos buses. Algunas de las categorías incluidas aquí son: hacking de automóviles, hacking de placas base y PCB, industrial, etc. 
      8. Accesorios: No son suficientes solo las herramientas anteriores para crear nuestro dispositivo de hacking propio. Si vamos a construir un sistema funcional, también necesitaremos muchos accesorios como baterías, cargadores, gps, sensores, DC-DC, equipos de laboratorio, etc.
      El catálogo puede descargarse en formato PDF desde aquí.

      Nota del autor: Aclarar que NO es un catálogo comercial, incluso si se ve así.Yago no tiene ningún interés personal en vender ninguna de las herramientas mostradas, sólo compartir muchas de las herramientas que ha usado para diferentes propósitos de hacking.Cualquier herramienta que no esté disponible para ser comprada online, será excluida del catálogo.Todas las herramientas muestran un precio aproximado y una tienda online donde se puede comprar.Todos los códigos OCR incluyen el enlace a una tienda online que se envía a Europa y, por supuesto, no son maliciosos.

      Proyecto y términos para contribuciones: https://github.com/yadox666/The-Hackers-Hardware-Toolkit

      NAXSI: un WAF para NGINX

      $
      0
      0
      NAXSI es un WAF de código abierto, de alto rendimiento y de bajo mantenimiento para NGINX. El acrónimo significa Nginx Anti XSS y SQL Injection.

      Técnicamente, es un módulo de Nginx disponible como paquete para muchas plataformas tipo UNIX. De manera predeterminada, lee un pequeño subconjunto de reglas sencillas (y legibles) que contienen el 99% de los patrones conocidos involucrados en las vulnerabilidades web. Por ejemplo, <, | o drop se supone que no son parte de una URI.

      Siendo muy simples, esos patrones podrían coincidir con consultas legítimas, es deber del administrador de Naxsi agregar reglas específicas que incluyan en lista blanca los comportamientos legítimos. El administrador puede agregar listas blancas manualmente analizando el registro de errores de Nginx, o (recomendado) iniciar el proyecto con una fase de aprendizaje automático intensivo que generará automáticamente reglas de listas blancas con respecto al comportamiento de un sitio web.

      En resumen, Naxsi se comporta como un firewall que dropeará todo por defecto, la única tarea es agregar las reglas de ACEPTAR requeridas para que el sitio web de destino funcione correctamente.


      ¿Por qué es diferente?

      Contrariamente a la mayoría de los firewalls de aplicaciones web, Naxsi no se basa en una base de firmas como un antivirus, y por lo tanto no puede ser evitado por un patrón de ataque "desconocido".

      ¿En qué se ejecuta?

      Naxsi debería ser compatible con cualquier versión Nginx. Depende de libpcre para su compatibilidad con expresiones regulares, y funciona muy bien en NetBSD, FreeBSD, OpenBSD, Debian, Ubuntu y CentOS.

      Más info:

      - Documentación
      - Algunas reglas para el software principal
      - Nxapi/nxtool para generar reglas.

      Proyecto: https://github.com/nbs-system/naxsi

      Llegan nuevos 0-days de Windows... ¡SandboxEscaper ha vuelto!

      $
      0
      0
      Así es ella, repentina como el primer rayo de una tormenta, sin campañas ni anuncios rimbombantes, sólo necesita un repositorio en Github para desatar de nuevo toda su ira. Hablamos de SandboxEscaper, la enigmática investigadora que el año pasado sorprendió con la publicación de varios 0-days de escalado local de privilegios (en adelante LPE) y que hace unas horas publicó el código del primero de una serie de cinco exploits que irán desvelándose en breve: cuatro para LPEs y uno para escapar del Sandbox de IE.

      Evil is coming!:
      https://github.com/SandboxEscaper/polarbearrepo/

      El primer 0-day (Bearpe) publicado y el que vamos a ver en este post es una vulnerabilidad que se aprovecha de las funciones de asignación de permisos a la hora de importar las tareas programadas (.job) antiguas, y permite a un usuario regular ejecutar cualquier cosa como SYSTEM. 

      Descripción

      Los componentes de front-end de Task Scheduler, como schtasks.exe, son interfaces que permiten a los usuarios ver, crear y modificar tareas programadas. La parte de back-end de Task Scheduler es un servicio de Windows que se ejecuta con privilegios de SYSTEM. Una de las librerías utilizadas por el servicio del Programador de tareas, schedsvc.dll, tiene una función llamada tsched::SetJobFileSecurityByName(), que establece los permisos de los archivos jobs. Los permisos de los archivos jobs en el directorio %Windir%\system32\tasks se modifican para otorgar al usuario llamante permisos completos al archivo de jobs que han creado.

      En el punto donde se llama a la función SetSecurityInfo(), el servicio del Programador de tareas tiene el token de seguridad NT Authority\SYSTEM. Esto significa que el servicio del Programador de tareas puede otorgar permisos de acceso de usuario total a los archivos que solo pueden ser controlados por SYSTEM u otras cuentas privilegiadas.

      El código de de la PoC de SandboxEscaper usa los binarios schtasks.exe y schedsvc.dll de Windows XP para aprovechar estos niveles de privilegios al configurar los permisos de archivos. Las versiones de Windows anteriores a Vista usaban archivos jobs en el directorio %Windir%\tasks. Las versiones heredadas de schtasks.exe harán que estos trabajos se migren al directorio %Windir%\system32\tasks cuando esas versiones de los programas se ejecuten en plataformas modernas de Windows. Junto con el token de seguridad de SYSTEM usado por el servicio del Programador de tareas, se puede aprovechar este comportamiento de migración junto con los hard links para otorgar permisos completos de archivos protegidos a cualquier usuario en un sistema Windows.

      Resumiendo, el código del exploit simplificado realiza por tanto lo siguiente:

      CopyFile(L"bear.job", L"c:\\windows\\tasks\\bear.job",FALSE);
          system(command.c_str());
          DeleteFile(L"c:\\windows\\system32\\tasks\\Bear");
          CreateNativeHardlink(L"c:\\windows\\system32\\tasks\\bear", L"C:\\Windows\\system32\\drivers\\pci.sys");
          system(command.c_str());


      Y paso a paso:

      1.- Primero se copia la tarea (el fichero bear.job) en la carpeta de tareas antigua.
      2.- Luego se ejecuta "schtasks /change /TN "bear" /RU username /RP password", esto dará como resultado una llamada al siguiente RPC "_SchRpcRegisterTask", que está expuesto por el servicio del programador de tareas.
      3.- Después de eso se borra el archivo que se creó y se pone un hard link y se vuelve a ejecutar el mismo comando. De esa manera se llamará a  SetSecurityInfo en el enlace físico.

      PoC

      1. copiar polarbear.exe, bear.job, schtasks.exe, schtasks.dll de la carpeta "poc files" a una máquina virtual de prueba
      2. ejecutar polarbear.exe pasando un nombre de usuario y contraseña de una cuenta local que no sea de administración. Ej. "polarbear.exe essbee polarbear"


      Impacto

      Se ha confirmado que el código publicado funciona en Windows 10 de 32 y 64 bits, así como en Windows Server 2016 y Windows Server 2019.

      Obviamente para explotar la vulnerabilidad se necesita usuario y contraseña pero, una vez obtenido (guest por ej.) y al aprovechar el servicio del Programador de tareas de Windows, un atacante autenticado puede obtener acceso total a los archivos protegidos. Esto puede permitir un compromiso completo del sistema desde una cuenta de usuario de Windows limitada.

      Por el momento no se han publicado parches... y hace unas horas ya se han publicado dos nuevos exploits y quedan otros dos...

      Ya llega BlueKeep... aka ejecución remota de código en RDP

      $
      0
      0
      El pasado martes 14 de mayo Microsoft lanzaba un parche para la vulnerabilidad CVE-2019-0708 bautizada también como BlueKeep, una vulnerabilidad en Remote Desktop Services de Windows que permite ejecución remota de código sin pre-autenticación, mandando simplemente paquetes especialmente modificados.


      Tal y como reza Microsoft en su boletín, Windows 7, Windows Server 2008 R2 y Windows Server 2008 son vulnerables, así como los Windows 2003 y Windows XP, estos últimos y como ya sabemos ya fuera de soporte.

      Evidentemente la criticidad de la vulnerabilidad causó un gran revuelo porque además abre la posibilidad de nuevo de armar malware "wormable" o autopropagable del tipo WannaCry. El resultado ha sido una avalancha de búsquedas de un exploit funcional que todavía hoy no ha cesado. Pero antes de avanzar cualquier PoC entendamos un poco en qué consiste la vulnerabilidad...

      Análisis técnico CVE-2019-0708

      Nos enfrentamos a una vulnerabilidad del tipo use-after-free en termdd.sys, un driver de kernel que usa el RDP (Remote Desktop Protocol) de Microsoft. Para entenderlo un poco mejor vamos a ilustrar el inicio de una comunicación RDP gracias a un buen esquema que encontré en el blog de Ixia:


      Primero, tenemos una conexión X.224 iniciada por el cliente que se utiliza para realizar una solicitud de conexión al servidor, seguido de una confirmación de esta conexión.

      Las siguientes peticiones "MCS Connect Initial y GCC Create", dentro del intercambio de mensajes para la Configuración Básica, contienen información de creación de canales virtuales, información relacionada con la seguridad y otros parámetros de capacidad y compatibilidad del cliente RDP. Dentro hay un campo de 8 bytes terminado en un byte nulo llamado "channelName_N" que se usa para especificar el nombre del canal.

      Si se especifica un canal con el nombre `MS_T120\x00`, la función termdd!IcaCreateChannel() llama a termdd!IcaFindChannelByName() y devuelve la estructura ChannelControl a la que apunta la estructura MS_T120 en el Slot (por ej. en el 10 o 0x1F). Ese puntero se almacena mediante la función termdd!IcaBindVirtualChannels() de manera que cuando se reciba la petición  MCS Channel Join Request se abrirá el canal MS_T120.

      Si un atacante envía datos al canal MS_T120, termdd.sys intentará responder al mensaje enviando un mensaje de error y cerrando el canal mediante termdd!IcaCloseChannel(), que a su vez llamará a termdd!_IcaFreeChannel(), que liberará el ChannelControlStructure de MS_T120 y borrará el puntero en slot del usuario en la tabla ChannelPointerTable (el slot 10 en el ejemplo que comentamos).

      El problema es que el puntero del slot no se borra... Cuando se finaliza la conexión posteriormente, se llama a RDPWD!SignalBrokenConnection(), que a su vez llama a termdd!IcaChannelInputInternal() e intenta escribir en la estructura de control de canales liberados utilizando el puntero del slot (el 0x1F). Esto conduce a la condición use-after-free.

      El resultado es un atacante remoto no autenticado puede explotar esta vulnerabilidad al establecer una conexión RDP con el servidor de destino abriendo en canal MS_T120 y enviándole datos especialmente modificados. Si la explotación tiene éxito el atacante podrá ejecutar código arbitrariamente con privilegios administrativos (nivel de kernel).

      Escáners

      Hace unos días se publicó la herramienta rdpscan, basada en masscan que puede escanear sistemas vulnerables a BlueKeep de forma bastante eficiente. Mediante la misma se encontró un total de 7 millones de sistemas que estaban escuchando en el puerto 3389, de los cuales alrededor de 1 millón siguen siendo vulnerables.

      También se ha publicado un módulo de Metasploit, ha sido implementado por @JaGoTu y @zerosum0x0 y se llama BlueKeep Microsoft Remote Desktop RCE Check.

      msf5> use auxiliary/scanner/rdp/cve_2019_0708_bluekeep

      Exploits PoCs

      Afortunadamente hasta ahora no se ha publicado ningún exploit demasiado funcional y digo "hasta ahora" porque hace unas horas Ekultek si que nos ha regalado un script en Python que podría "cargarse" con un payload, digamos, más "útil":

      https://github.com/Ekultek/BlueKeep

      to_video

      Como véis, todo apunta a que pronto, muy pronto, scripts de "botón gordo" estarán disponibles al público en general y veremos el mundo arder...

      Querido sysadmin, no será que no te hemos avisado con tiempo... ¡Actualiza!

      Ofuscar código python con Intensio-Obfuscator

      $
      0
      0
      Intensio-Obfuscator es una herramienta, todavía en beta, para ofuscar código fuente en python. Reemplaza el nombre de las variables, clases y funciones por caracteres aleatorios de longitud definida, elimina comentarios, saltos de línea y agrega a cada línea un script aleatorio con valores siempre diferentes. Requiere Python >= 3.5 pero puede ofuscar python 2.x y 3.x.

      Instalación

      git clone https://github.com/Hnfull/Intensio-Obfuscator.git
      cd Intensio-Obfuscator/intensio/

      Caraterísticas

      Param.Descripción
      ReplaceCambia todos los nombres de las variables, clases y funciones definidas y elimina los saltos de línea.
      PaddingAñade scripts aleatorios después de cada línea y elimina todos los saltos de línea.
      RemoveBorra todos los comentarios y los saltos de línea.
      SecretSólo para curiosos :)
      Mixer lower
      Genera palabras con 32 caracteres que reemplazan variables, clases y funciones definidas en el código fuente y en scripts aleatorios si se especifican las características 'replace' o 'padding'.
      Mixer mediumGenera palabras con 64 caracteres que reemplazan variables, clases y funciones definidas en el código fuente y en scripts aleatorios si se especifican las características 'replace' o 'padding'.
      Mixer highGenera palabras con 128 caracteres que reemplazan variables, clases y funciones definidas en el código fuente y en scripts aleatorios si se especifican las características 'replace' o 'padding'.

      Uso

      -h, --help              -> show this help message and exit.
      -f, --onefile           -> if only one file.
      -d, --multiplefiles     -> if multiple files (project).
      -i, --input             -> source file or directory - if multiple files indicate a directory that contain all your files.
      -c, --code              -> language used in input file or directory. value: [python]
      -o, --output            -> output file or directory that will be obfuscated - if multiple file indicate a empty directory that will contain all your files.
      -m, --mixer             -> length level of variables mix output. values: [lower,medium,high]
      -r, --replace           -> activate the 'replace' obfuscation feature.
      -p, --padding           -> activate the 'padding' obfuscation feature.
      -rm, --remove           -> activate the 'remove' obfuscation feature.
      -s, --secret            -> activate the 'secret' bullshit feature.

      Se pueden excluir variables, clases o funciones para que no sean tratadas por 'replace' editando intensio/exclude_python_words.txt.
      Si por el contrario quieres incluir variables, clases o funciones que no están incluidos en la función 'replace', edita intensio/include_python_words.txt.

      Es importante no poner los mismos nombres de variables locales, clases o funciones que los de keywords y/o librerías importadas de python.

      Ejemplos
      • Múltiples archivos básico: python3.x intensio_obfuscator.py -d -i test/python/multiplefiles/basic/input/basicRAT -c python -o test/python/multiplefiles/basic/output/basicRAT -m lower -r -rm
      • Múltiples archivos avanzado: python3.x intensio_obfuscator.py -d -i test/python/multiplefiles/advanced/input/basicRAT -c python -o test/python/multiplefiles/advanced/output/basicRAT -m high -r -p -rm
      • Si solo se trabaja con un archivo el comando es el mismo que para varios, simplemente no hay que apuntar a un directorio sino a un archivo de Python directamente con los parámetros -i y -o, luego cambiar el parámetro -d por el parámetro -f.
      Posibles fallos
      • Si una variable, clase o función tiene un nombre idéntico a una palabra entre '' o "" en una función print(), el texto tendrá el mismo valor que las variables, clases o funciones mezcladas.
      • Si una variable, clase o función tiene un nombre idéntico con una palabra después de # (comentario), el texto tendrá el mismo valor que las variables, clases o funciones mezcladas, pero si está entre """ or ''' sin una variable antes no se realiza ninguna sustitución.
      • Si se nombró una variable, clase o función de la misma manera que alguna palabra clave de python o nombre de función/clase de librerías de python importadas, puede aparecer un error. Hay que editar intensio/excluded_python_words.txt para agregar las variables para no ofuscar o cambiar los nombres.
      Proyecto: https://github.com/Hnfull/Intensio-Obfuscator
      Viewing all 1666 articles
      Browse latest View live