Mostrando entradas con la etiqueta reversing. Mostrar todas las entradas
Mostrando entradas con la etiqueta reversing. Mostrar todas las entradas

jueves, 24 de enero de 2013

Keygen for AppZapper (just for fun)

Esta entrada esta relacionada con el post de AppZapper que hice algún tiempo, donde usando el comando strings se pueden ver usuarios y seriales válidos. Me dio por revisar el algoritmo de generación de las claves y lo ví  como una oportunidad para explicar un poco el uso de IDA PRO como desensamblador "mágico" que nos ayuda a crear keygens. Esto se hace con fines académicos, realmente el AppZapper es una muy buena aplicación, así que si tiene los 13 dolares que cuesta el producto, mejor páguelos, usar seriales falsos? es ilegal.

Para empezar cargamos la aplicación en el IDA (file --> open)


Lo primero que se piensa es como llegar rápidamente a la rutina de validación de los seriales, la forma mas rápida es buscar los strings de validación que ya hemos encontrado como válidos, por ejemplo, busquemos la palabra "Pablo", para esto generamos los strings de la aplicación (view --> open subviews --> strings) y buscamos (Alt+t) la palabra "Pablo".


Para seguir la rutina hacemos doble click sobre el nombre y esto nos lleva a la rutina donde aparece el nombre buscaod, la "nueva vista" de la versión 6.3 de IDA permite ampliar o expandir solo las zonas que deseemos ver, para entrar o salir de las rutinas podemos usar las teclas + y -.


Al entrar a la rutina vemos que realmente estamos en la sección de definiciones de strings, esto es porque los nombres están definidos explícitamente en el sistema, así que tenemos que ubicar el punto desde donde este nombre es referenciado. Para esto nos paramos sobre el nombre (resaltado en amarillo) y presionamos la tecla "x", con esto aparece una ventana donde se muestra los lugares desde donde se invoca el nombre, como se puede ver en la siguiente imagen solo hay un solo punto.


Hacemos click sobre esta referencia y llegamos a la rutina verdadera.


Aquí se puede ver que la rutina se llama a_validatenameA, lo que nos esta indicando que efectivamente es la rutina donde se valida el serial de la aplicación. Algunas veces estos nombres no van a aparecer, todo depende de si la aplicación fue compilada con los símbolos reales y la depuración (debugging) habilitada.

Si aún no están acostumbrados a esta vista pueden regresar a la vista tradicional presionando la barra espaciadora.


Esta imagen nos muestra una hilera de condicionales anidados, del estilo, si este es el usuario válido entonces OK, sino es, entonces verifique el siguiente usuario ...


Si recorremos la función podemos encontrar cada uno de los usuarios válidos que hayamos con el comando string. Esto nos indica que efectivamente antes de generar el serial para un usuario particular, la rutina valida que el usuario no sea uno de los predefinidos, realmente no entiendo porque tienen todos estos usuarios ahí, seguramente tendrá algo que ver con las aficiones de los desarrolladores.

El último usuario que se valida es  "Pablo Sanchez", de modo que si ninguno de los usuarios fue el que se ingreso en el proceso de registro del software empieza una rutina de validación real sobre los datos ingresados.


En este punto entramos a la rutina que nos interesa.

Podemos ver que se carga el offset_3F788 que corresponde con la función lowercaseString(), porque lo primero que se hace es pasar el nombre de usuario a minúsculas. Podemos ir renombrando los offsets presionando la tecla "n" sobre el nombre y escribiendo algo que podamos recordar mas fácil.




El siguiente offset cargado es 3FA50, que apunta a la función mutableCopy(), esta función me genera una copia del valor entrado (con miras a modificarlo) de modo que el valor original no se vea alterado.

El siguientes es 3F530 que apunta a length() que como su nombre lo indica encontrará la longitud de la cadena ingresada.

3FEE4 apunta a la función replaceOccurrencesOfString:withString:o, esta rutina eliminará los espacios en el string que se ingresa .

Luego se carga el offset 3F754 que apunta a la función componentsSeparatedByString:, esta rutina permite dividir un string usando un delimitador. En este caso el delimitador es el carácter "-".

Una vez que el string se ha dividido se empieza a evaluar cada parte, según lo que conocemos de los seriales válidos el formato debe ser: APZP-XXX-XXX-XXX-XXX.

A cada una de las partes le llamaremos bloques, entonces el serial válido tendrá 5 bloques (APZP-Bloque1-Bloque3-Bloque4-Bloque5) como se ve en los ejemplos: APZP-101-109-198-114, APZP-105-108-206-110.

En el offset 3F528 se apunta a la rutina objectAtIndex que se encarga de seleccionar cada uno de los componentes, el primer componente empieza en cero.




BLOQUE 1

El offset 3F4C8 apunta a la función isEqualToString: que se encarga de comparar el valor del primer bloque. Para el primer bloque se compara la palabra "APZP" por lo que entendemos que el serial válido necesariamente tiene  que empezar con ese string.


Si el bloque uno es correcto se evalúa el bloque 2 y así con cada uno de los 5 bloques.

BLOQUE 2

En este punto aparecen dos rutinas mas:

3F9C0 --> intValue  , que se usa para validar que el bloque ingresado sea un número entero.
EFEE8 --> characterAtIndex: , se usa para convertir un carácter a un entero de 16 bits.

Lo que hace este bloque es tomar el usuario ingresado y convertir a un entero corto la letra que esta en la penúltima posición del usuario. Esa penúltima posición se alcanza restándole dos a la posición final del string, para restarle este valor lo que se hace es sumarle -2.

Código en ASM:   add     eax, 0FFFFFFFEh  =   add eax, -2


BLOQUE 3

Aquí se toma el primer carácter del usuario y se convierte a entero, este valor se compara con el valor ingresado en el serial.


BLOQUE 4

En este bloque se toma el segundo carácter del usuario y se convierte a entero, luego se toma el penúltimo valor y se hace lo mismo (se obtiene el mismo resultado del bloque 2), y finalmente se suman los dos valores (add     eax, ebx) para obtener el entero final que debe estar en esa posición.

BLOQUE 5
El último bloque toma la última letra del string de usuario y la convierte a un entero, la búsqueda la hace decrementando el valor  (dec eax) del registro que apunta al tamaño del string.



Al comparar este último bloque solo pueden haber dos caminos, el correcto que registra el programa o el incorrecto que hace que el programa genere un error de serial invalido.



Para automatizar este proceso generamos un script que funcione como keygen, el código es el siguiente:

[Hax0r@HOST] ~ $ cat keygen.py 
##
## Keygen for AppZapper by nonroot (c) 2013
##

import sys

def main():
  usuario=sys.argv[1]
  cusuario=usuario.lower().replace(' ','')
  lusuario=len(cusuario)
  B1="APZP"
  B2=ord(cusuario[lusuario-2])
  B3=ord(cusuario[0])
  B4=ord(cusuario[1])+B2          
  B5=ord(cusuario[lusuario-1])
  print "*********************"
  print usuario
  print str(B1)+"-"+str(B2)+"-"+str(B3)+"-"+str(B4)+"-"+str(B5)
  print "*********************"
if __name__ == '__main__':
  main()
[Hax0r@HOST] ~ $ 


Comprobemos con los usuarios por defecto (hardcoded) que trae el binario.

[Hax0r@HOST] ~ $ python keygen.py "Pablo Sanchez"
*********************
Pablo Sanchez
APZP-101-112-198-122
*********************
[Hax0r@HOST] ~ $ python keygen.py "Stephanie Lee"
*********************
Stephanie Lee
APZP-101-115-217-101
*********************
[Hax0r@HOST] ~ $ python keygen.py "MacZapper"
*********************
MacZapper
APZP-101-109-198-114
*********************
[Hax0r@HOST] ~ $ 

OK funciona, solo queda ingresar los datos generados en la ventana de registro.

[Hax0r@HOST] ~ $ python keygen.py "Intro a IDA PRO con AppZapper"
*********************
Intro a IDA PRO con AppZapper
APZP-101-105-211-114
*********************
[Hax0r@HOST] ~ $ 


Esto es todo, recuerden que la intención de crear este post no es otra que explicar un poco el uso de esta excelente herramienta usada en el mundo del reversing. En ningún momento se busca incentivar el registro de software de forma ilegal, por supuesto yo pagué mi versión de AppZapper ;)

Saludos.

lunes, 22 de noviembre de 2010

BarCamp Security Edition (BarCampSE)

Les recuerdo que el próximo 4 de Diciembre tendremos un evento BarCamp en 4 ciudades de Colombia (Cali, Pereira, Bogotá y Medellín), estamos haciendo todo lo posible por que el evento salga muy bien y logremos pasar un rato agradable aprendiendo de los temas que nos interesan.

Desde aquí quiero enviar un saludo a todas las personas y entidades que hacen posible que podamos organizar un evento como este, gracias a todos.

*Update*: Confirmado el Streaming por Internet para todos los que no puedan asistir al evento, mas información: http://www.renata.edu.co/index.php/renata-en-vivo/22-especiales/1722-barcamp-security-edition-museo-de-antioquia.html

Les cuento además que estamos preparando un WarGame (#WarCamp) para todos aquellos que quieran aprender un poco probando sus habilidades en el tema de seguridad informática.

Mas información sobre el evento en:

Sitio Web: http://www.barcampse.org/
Wiki: http://barcamp.org/BarCampSE
@BarCamp_SE

Nos vemos en el evento!
;)

---

Update:
BarCamp Security Edition - ¡ TODO UN ÉXITO !
"La respuesta del público fue mejor de la esperada, algunas personas llegaron incluso dos horas antes de comenzar las desconferencias que iniciaban a· las 10:00A.M. según la programación, y terminaron aproximadamente a las 6:30PM, en total tuvimos 42 charlas diferentes en todo el país. Podemos decir por esto y por todos los comentarios recibidos durante la jornada que el evento BarCamp Security Edition fue un Éxito total." - http://www.barcampse.org/

jueves, 22 de julio de 2010

smpCTF ( smpChallenges WriteUps )

Voy a escribir algunas soluciones a los retos del pasado CTF organizado por la gente de SMP.
Para mas información sobre el reto, por favor lee la entrada anterior.

[smpChallenge - 1]


En este nivel nos daban algunos datos y un procedimiento, con ayuda de astro pudimos encontrar una ecuación válida para el procedimiento y generar un pequeño script:

u@h:w$cat n.py
import sys

a=int(sys.argv[1])
r=int(sys.argv[2])
b=a+1
c=2*a+1
d=a*b*c
e=d/6
f=r*a
resp=e+f+1
print f
print resp
u@h:w$

Este script (el original creado en el momento de angustia :P) recibe dos valores como argumentos y genera el número de la secuencia que buscamos. En el código fuente de la página encontrábamos la información que el algoritmo cambiaba valores después de un tiempo, entonces la tarea era ejecutar algo rápido para que los valores funcionaran en ese rango de tiempo.

[smpChallenge - 2]


Donde esta waldo?, esa era la pregunta, una vez logueados en el sistema quedabamos directamente en el vim, y recordando un reto pasado en los prequals de defcon inmediata mente pudimos salir al shell ejecutando la sentencia en vi:

:set shell=/bin/bash
:!shell

Una vez en el sistema observamos todos los archivos posibles y tratamos de recuperar la integridad de unos archivos .swp que estaban generados en el home del usuario, pero finalmente ejecutamos el siguiente comando (un poco desesperados):

Buscamos todos los archivos donde se mencionara a waldo, luego seleccionamos los mas propensos a tener la bandera y finalmente lo encontramos.


[smpTrivial- 1]

Para resolver esta trivia es cuestión de analizar la salida del tcpdump e inmediata mente podemos analizar que se trata de DecNet (LOL).


[smpChallenge - 4]


Este fue el primer reto web, por lo que se asume que tiene un nivel de complejidad menor, pero nos quito un buen tiempo porque no probamos "las cosas de siempre".

Al cargar la página aparecía un formulario donde podíamos ingresar cualquier cosa y el nos devolvía el mismo nombre (un escenario para XSS, pero no permitia ningún tipo de explotación), pero si ingresábamos el nombre Administrator encontrábamos un letrero de DENEGADO, por lo que nos insinuaban que este nombre de usuario tenia algo que ver. Después de intentar cosas como Xss, SSI, Xpath, sql, pensar etc, decidimos hacer la misma petición pero usando el método POST, ya que siempre que hacíamos click en el botón del formulario enviaba los datos por GET.

Cuando lo hicimos por POST no paso nada, pero volvimos a intentar un par de veces y obtuvimos un resultado diferente.


Este texto era base64 y producía una imagen donde se encontraban las respuestas (la bandera y el ID). Después de chequear un poco el nivel nos dimos cuenta que el proceso era aleatorio, algunas consultas con método POST daban resultado y otras no, así que si alguien paso de largo y no probó varias veces el envió de datos, seguramente no pudo pasar el nivel.



[smpChallenge - 12]

El segundo nivel web era algo relacionado al parecer con cookies, sin embargo la pista nos decía que no se trataba de un ataque con las cookies del sistema.

Lo que hicimos en este nivel fue empezar a inyectar todas las posibles variables que se nos ocurrieran y descubrimos que existían las variables id, name, pass y otras que no me acuerdo, el asunto es que la que parecía mas vulnerable era la variable pass, pero al intentar un ataque que tuviera espacios nos denegaba el acceso. Como el objetivo era alcanzar una flag, asumimos que todo se encontraba en la base de datos, entonces intentamos una consulta anidada donde imprimiéramos el campo que nos interesaba, la inyección final quedó de la siguiente forma:



Al lado izquierdo se puede observar la respuesta correspondiente a la bandera para superar este nivel.


[smpChallenge - 13]

Este era el segundo reto forense que consistía en una descripción de un evento astronómico.
Lo primero que hicimos fue intentar buscar en Internet texto que correspondiera con el texto que aparecía en el reto y el resultado fue:

Lo que nos indicaba que los hechos ocurridos estaban relacionados con el choque de un cometa con Júpiter. Cuando consultamos con uno de los miembros del equipo SMP nos confirmó que la bandera era el titulo del articulo, pero aún nos faltaba el id del reto.

Aclaro que este wargame tenia algo diferente y era que para pasar un reto se tenían que tener 2 cosas, una era la bandera (una cadena de texto larga con una frase cualquiera) y el identificado del reto, casi siempre un código de 8 dígitos hexadecimales, por lo tanto el ejercicio era doble, a veces era sencillo encontrar el ID oculto en el código fuente de las páginas, pero a veces era mas complicado.

En este reto el ID no aparecía por ningún lado hasta que uno de los miembros del equipo dio con el resultado

El ID estaba oculto entre el texto que nos daban como pista para solucionar el reto, de que forma se sacó?, con una diferencia entre los textos originales y la pista se obtiene una única línea que no coincide, misteriosamente esa línea es muy elite ;)

Con estos dos datos pudimos pasar el reto.


Algunas otras soluciones se pueden encontrar en SinfoCol o ingresando "smpCTF writeups" en tu buscador favorito. ;)

Saludos y hasta la próxima.

smpCTF (reto informático)

Durante las fechas de la final del mundial se organizó un nuevo reto informático (wargame, CTF) en Internet, esta vez por parte del grupo Spider Monkey Phenomena- SMP, la "tarea" consistía en pasar 20 niveles que se iban liberando poco a poco y resolver 7 preguntas relacionadas con el mundo de la seguridad informática.

Para jugar nos unimos a uno (SecTrack) de los dos grupos colombianos registrados, pero solo estuvimos dos personas tratando de pasar los niveles. Entre final de fútbol y otras actividades logramos realizar 8 retos que nos dejaron en la posición 37 .

Al principio el CTF estuvo muy desorganizado, se fugó alguna información, tambien se tuvieron algunos errores en los niveles iniciales, pero luego todo se normalizó. La parte quizas que no me gustó mucho fue el diseño de algunos niveles, pues aunque uno tuviera la respuesta no habia forma de encontrar la bandera ya que estaban esperando un ingreso de datos sumamente especifico. Pero bueno, seran cosas para mejorar, de todos modos fue un gran wargame y pasamos un buen rato.

Algunos apuntes en el chat a la hora del cierre.

Sobre el nivel relacionado con el CSSdescrambe:

[pwn0rz]sk: dude, that sucks, i copied EXACTLY the CSSdescrambe function and sha1'd it, didn't work
[18:06] [smp]j5_: Google won't help for this challenge
[18:06] [smp]j5_: Copy/paste won't help, some writing will be required
[18:06] [smp]j5_: It's a small text box for a reason, so full code is not required

Sobre el reto más raro que haya visto:

[18:10] [smp]j5_: THINK GREEN -> SSL EV certificates (browser bar goes green when you surf traffic
[smp]j5_: THINK GREEN -> SSL EV certificates (browser bar goes green when you surf traffic
[18:11] [smp]j5_: millions of people per day -> verisign ads 175 million hits a day
[18:11] [smp]j5_: search on EV certs on verisign, and you get their Intermediary certificates on their website
[18:11] [smp]j5_: search on EV certs on verisign, and you get their Intermediary certificates on their website
[18:11] [smp]j5_: if you ever implemented EV certs, you sometimes need to include the intermediary certificates in your appliance or else the browser complains
[18:11] [smp]j5_: they have primary (1) certificate and secondary (2) certificate
[18:12] [smp]j5_: (1,2,1) and (2,1,2) are a 2-stage encrypt
[18:12] [smp]j5_: (a,b,c)
[18:12] avatare: Nahhh
[18:12] [smp]j5_: a= first public key to transpose
[18:12] [smp]j5_: b= second key to transpose
[18:12] [smp]j5_: c= reverse output
[18:12] [smp]magikh0e: lol
[18:13] [smp]j5_: with 1,2,1 you start with the primary intemediary certificate and then use secondary
[18:13] [smp]j5_: you take every 3rd, but not 9th, nor 21st character
[18:13] [smp]j5_: and if it's even, use from 1
[18:13] [smp]j5_: if it's odd, use from 2
[18:13] [smp]j5_: the end result is a 103 length string
[18:13] [smp]j5_: which is conveniently prime
[18:13] [smp]j5_: with inputs of 2,1,2 you start with secondary intemediary then primary intemediary, and reverse your answer at the end
[18:14] [smp]j5_: had anyone got far enough, help would have been provided to deal with the reversing
[18:14] [smp]j5_: people got as far as SSL EV certs
[18:14] [smp]j5_: and started looking at verisign
[18:14] [smp]j5_: people got as far as SSL EV certs
[18:14] [smp]j5_: and started looking at verisign
[18:14] [smp]j5_: and suggested to those teams to consider values longer than 103 chars (ie public keys)
[18:15] [smp]j5_: i know SSL is practically uncrackable (for now) so any standard implementation of RSA was not on the table, even for my craziness
[18:16] [smp]j5_: oh, and the strings were rot13'd which many people figured out
[18:16] [smp]j5_: k, pretty much done
[18:16] [smp]j5_: i have java source to build the solution if anyone cares (for c14)
[smp]magikh0e: hehe

LOL

[18:51] [smp]magikh0e: my head is pounding
[18:51] [wod]bios: hrhr
[18:51] [smp]magikh0e: but not tired
[18:51] [smp]magikh0e: its weird
[18:51] [smp]magikh0e: over tired i guess

---

magikh0e: its gonna be so lonely after smpctf
[14:39] magikh0e: everyone will go back to life
[14:39] magikh0e: lol

...

Felicitaciones al equipo ganador del concurso que una vez mas se posiciona como uno de los mejores teams en competiciones CTF: http://nibbles.tuxfamily.org/

Y nuevamente quiero hacer la invitación a que participemos de forma coordinada en próximos retos como equipo colombiano. Todas las personas que sientan curiosidad por los temas de hacking, reversing, forense y quieran recibir y aportar conocimientos son bienvenidos.

La lista donde compartimos información sobre estos temas es:
http://groups.google.com/group/ctf-colombian-team?pli=1

Algunas soluciones del reto:
http://nonroot.blogspot.com/2010/07/smpctf-smpchallenges-writeups.html

Saludos y hasta la próxima.

miércoles, 26 de mayo de 2010

Defcon CTF 2010 Quals


El pasado fin de semana,se realizaron las pruebas clasificatorias para el CTF de DefCon, en este post quiero contarles un poco de que se trata todo esto, quizas de esta forma para la próxima de animen a jugar.

En el mundo de la seguridad es muy común que las personas jueguen wargames, también conocidos como retos informáticos donde se pone un objetivo y las personas "juegan" a alcanzarlo. Pongo entre comillas juegan porque el que lee muy a la ligera piensa que se trata de un juego como XBOX o PLAY EXTATION y la verdad nada mas distante de la realidad. Estos juegos buscan que las personas demuestren sus habilidades en técnicas relacionadas con el mundo de la seguridad, podemos mencionar cosas como networking, hacking, reversing, análisis forense, programación, creatividad, innovación, auto control y un largo etcetera que perfilan a los competidores como auténticos hackers.


Generalmente estos wargames son organizados por personas conocedoras del tema que por simple diversión crean las plataformas tecnologicas del juego y diseñan los retos, pero en este caso especifico se hace como una actividad pre-clasificatoria a un evento similar pero con mas nivel llamado Capture The Flag (Captura la Bandera), este CTF se realiza durante una de las convenciones de hackers mas grandes que hay en el mundo: DefCon. Para poder participar (como jugador) en este evento es necesario clasificar primero, solo 9 equipos clasifican y tendrán la oportunidad de enfrentarse a nuevos desafíos durante el próximo Defcon 18.


La expresión Capturar la Bandera es muy común en algunos juegos de FPS, sin embargo existe una gran diferencia, la bandera esta representada por una clave o un archivo importante que contiene la pista final para pasar el reto. Así que cuando se dice que vamos a jugar CTF en unos prequals, lo que se quiere decir es que un grupo de personas nos vamos a reunir (física o lógicamente) a trabajar con nuestros computadores durante varias horas a intentar pasar retos informáticos hasta encontrar las claves válidas que nos permitan pasar a los siguientes niveles del juego. ¿Cúal es la motivación?, El conocimiento.


Entendido esto puedo empezar la entrada ;)

El pasado fin de semana, se realizaron las pruebas clasificatorias para el CTF de DefCon, esta es la primera vez que participo en estos prequals, siempre he jugado en otro tipo de wargames y bueno, porque no sacar un fin de semana para juntarme con amigos y aprender un poco mas?.


El juego empezó desde el viernes 21 de Mayo, me dí cuenta como a las 2 PM, desde ahí y hasta el domingo 23 de Mayo 9:00PM, jugamos sin parar :P

La prueba consistía en 30 niveles organizados por categorías: Trivias, Criptografía, Binarios, Paquetes de red, Explotación y Análisis Forense. Estas categorías a su vez estaban organizadas por orden de dificultad, los retos mas "sencillos" sumaban 100 puntos y los más dificiles (quien dijo imposibles?) sumaban 500. Para mejor comprensión observar la siguiente tabla.


¿En que consistía el juego?, en sumar todos los puntos que pudiéramos en 55 horas, todas las indicaciones estaban en el sitio de ddtek (http://quals.ddtek.biz/board.html), quienes fueron los encargados de montar los retos. Adicional se tenia un canal de IRC (irc.ddtek.biz:16667) para solucionar las dudas o para hablar con el resto de los concursantes.

Al final del juego quedamos en la posición 97/265 con un total de 1300 puntos.

Espero que para el próximo CTF hayan mas colombianos jugando y a los que estén cerca del HackLab, los invitamos a que se pongan en contacto y se unan a la diversión, entre mas jugadores participen, mas experiencia acumularemos y mas aprenderemos todos. Para los interesados, tenemos una lista de correo por medio de la cual se discuten los temas relacionados con los CTF y wargames en general.


Les dejo algunos enlaces interesantes.

Writeups (soluciones) DefCon CTF 2010 Quals (por el HackLab):

B100:
http://maybe-successful.blogspot.com/2010/05/defcon18-ctf-quals-binary-l33tness-100.html

C300:
http://maybe-successful.blogspot.com/2010/05/defcon18-ctf-quals-crypto-badness-300.html

T200:
http://nonroot.blogspot.com/2010/05/writeup-pt200-defcon-ctf-2010-quals.html

PKT300:
http://dumacx.blogspot.com/2010/05/el-fin-de-semana-pasado-entre-el-21-y.html

PKT100:
http://nonroot.blogspot.com/2010/05/writeup-pkt100-defcon-ctf-2010-quals.html


Writeups (soluciones) DefCon CTF 2010 Quals (resto do mundo):

Desde DefCon:
https://www.defcon.org/html/links/dc-ctf.html

VnSecurity:
http://www.vnsecurity.net/2010/05/defcon-18-quals-writeups-collection/

Pentester.es:
http://www.pentester.es/2010/05/defcon18-ctf-prequals-writeups.html


Hasta la próxima.

Entradas populares