Archivo de la etiqueta: hackers

CTF OverTheWire: Natas6

Continuamos con la serie de tutoriales del CTF Natas, ahora toca el turno de natas6.

Natas Level 5 → Level 6
Username: natas6
URL:      http://natas6.natas.labs.overthewire.org

Utilizamos la bandera obtenida en el reto anterior y accedemos a la URL indicada en las instrucciones del reto, veremos una pantalla como la siguiente.

Es solo un formulario donde nos piden ingresar una contraseña o secreto, al introducir cualquier cosa obtenemos un mensaje de error.

En la misma pagina hay un enlace que dice view sourcecode (ver código fuente), damos clic y veremos lo siguiente.

La parte importa es:

<?

include "includes/secret.inc";

    if(array_key_exists("submit", $_POST)) {
        if($secret == $_POST['secret']) {
        print "Access granted. The password for natas7 is <censored>";
    } else {
        print "Wrong secret";
    }
    }
?>

Es un código php muy sencillo, podemos ver que obtiene un parámetro via POST (el que enviamos mediante el formulario) y lo compara con la variable $secret, ademas hace include de un archivo interesante includes/secret.inc

Accedemos a ese archivo usando el navegador.

Y utilizamos el secret que acabamos de descubrir en el formulario inicial.

La bandera para acceder a natas7 es 7z3hEENjQtflzgnT29q7wAvMNfZdh0i9

En este reto aprovechamos un fallo de seguridad llamado Source code disclosure, en donde tenemos acceso a código que solo debería ser consumido del lado del servidor.

Happy hacking 🙂

Security Fest #CTF – Zion write up

Para este reto nos daban un archivo comprimido zion.tar.gz, procedemos a descomprimirlo y obtenemos otro archivo llamado YouKnow.

El archivo no tiene extension pero utilizamos el comando file para ver que tipo de archivo es.

Parece un archivo de Microsoft Word Office y sabemos que los archivos docx en realidad son archivos en formato zip.

Procedemos a descomprimir YouKnow

Obtenemos varios archivos y carpetas, comenzamos a analizarlos de uno por uno, sin embargo no encontramos nada que haga referencia a la bandera del reto. (analice la imagen del conejo con un par de herramientas de esteganografía pero no había nada)

Damos un paso atrás y abrimos el archivo YouKnow en un editor hexadecimal de su elección, you utilice Sublime

Observamos la cabecera estándar PK del formato ZIP

Al ir analizando el archivo, hacia el final, algo salta inmediatamente a la vista.

Parece que hay otro archivo Zip concatenado al primero pero los bytes están en orden inverso (observen como el archivo termina en KP, y vemos algunos strings como lmx que seria xml).

Podemos utilizar python para invertir los bytes del archivo fácilmente.

open('YouKnow_reversed','wb').write(open('YouKnow','rb').read()[::-1])

Obtenemos el archivo con los bytes invertidos y procedemos a descomprimirlo.

Obtenemos nuevamente varios archivos y carpetas.

Y en donde estaba la imagen anterior del conejo rojo ahora encontramos otra imagen, esta vez de un conejo azul que nos muestra la bandera del reto 🙂

La bandera del reto es sctf{m41nfr4m3_4cc3ss_c0d3_1337_4lw4s}

Bonus

Programe una pequeña herramienta en python llamada reverse bytes para invertir los bytes de un archivo utilizando una cli mas amigable.

usage: rbytes.py [-h] [-o OUTFILE] infile

A simple python script for reverse the bytes of a file.

Author: Lenin Alevski Huerta Arias
Year: 2018

positional arguments:
  infile                Input file

optional arguments:
  -h, --help            show this help message and exit
  -o OUTFILE, --outfile OUTFILE
                        Output file

Happy hacking 🙂

Solución del #CTF CPMX9 de Blog de Alevsk

Hola, como muchos saben, este blog esta registrado como comunidad tecnológica en Campus Party, cada año gente del estado de Michoacán nos organizamos para asistir al evento, jugar, divertirnos, aprender y sobre todo pasar un buen rato 🙂

Ser comunidad de CPMX tiene algunas ventajas por ejemplo obtener códigos de descuento y entradas gratuitas para rifar entre los miembros de la comunidad pero este año realice una dinámica diferente, hace mas o menos 1 semana anuncie en redes sociales (Facebook y Twitter) un pequeño reto CTF en donde poder ganar una entrada no fuera cuestión de suerte. Muchas gracias a todos los que participaron y felicidades a los ganadores.

A continuación dejo la solución de cada uno de los retos por si hay gente que se quedo con dudas 🙂

0x01 – 8.8.8.8 or 1.1.1.1?

A Dan Kaminsky le gusta ( ͡° ͜ ʖ ͡°) www.alevsk.com

Este reto es bastante sencillo si sabes un poco de cultura general de como funciona Internet. 8.8.8.8, 1.1.1.1 y Dan Kaminsky son claras referencias al sistema DNS.

En este tipo de retos es muy común que la información se encuentre escondida en el record TXT, pero también existen muchos otros tipos de DNS records. Vamos a utilizar la herramienta nslookup y con los siguientes comandos podemos listar los records TXT de cualquier dominio.

$ nslookup
> set q=TXT
> alevsk.com

La bandera de este reto es: ctf_flag{3550dd06-aec9-4841-96cb-dbfb093c6991}

0x02 – Cipher

Cipher es probablemente el reto mas complicado de este CTF, las instrucciones del reto nos muestran el siguiente texto cifrado.

h8s, s, l2e0 4o,h w8orwgx ochg0 h8s,n h8g0g s, r2 he0rsrm .owyx l2e hoyg h8g .4eg 5s44 _ h8g ,h20l grz,n l2e !oyg e5 sr l2e0 .gz orz .g4sg1g !8ohg1g0 l2e !orh h2 .g4sg1gx l2e hoyg h8g 0gz 5s44 _ l2e ,hol sr !2rzg04orz orz s ,82! l2e 82! zgg5 h8g 0o..sh_824g m2g,x h8g c4om s, whcjc4om{dzz9bk}v_pbdi_i}v3_op33_c3p39d.owvwpu

En la mayoría de los retos básicos de criptografía encontramos dos tipos de cifrados:

Podemos intentar resolver esto con alguna herramienta automática como Rot13 Online o Caesar Cipher pero no hay resultados. No queda otra cosa mas que empezar a hacer un analisis del texto y aplicar distintos ataques criptograficos 🙂

Utilizamos uno de mis lenguajes de programación favoritos, python, para comenzar a recolectar estadísticas interesantes del texto.

Comenzamos separando el texto cifrado por espacios y contando el numero de veces que se repiten las palabras

from collections import Counter
import re

encrypted = "h8s, s, l2e0 4o,h w8orwgx ochg0 h8s,n h8g0g s, r2 he0rsrm .owyx l2e hoyg h8g .4eg 5s44 _ h8g ,h20l grz,n l2e !oyg e5 sr l2e0 .gz orz .g4sg1g !8ohg1g0 l2e !orh h2 .g4sg1gx l2e hoyg h8g 0gz 5s44 _ l2e ,hol sr !2rzg04orz orz s ,82! l2e 82! zgg5 h8g 0o..sh_824g m2g,x h8g c4om s, whcjc4om{dzz9bk}v_pbdi_i}v3_op33_c3p39d.owvwpu"

words = encrypted.split()
word_counts = Counter(words)
print(word_counts)
{
	'l2e': 6,
	'h8g': 5,
	's,': 3,
	'5s44': 2,
	'orz': 2,
	'hoyg': 2,
	'_': 2,
	'l2e0': 2,
	'sr': 2,
	'zgg5': 1,
	'grz,n': 1,
	'!orh': 1,
	'whcjc4om{dzz9bk}v_pbdi_i}v3_op33_c3p39d.owvwpu': 1,
	'0o..sh_824g': 1,
	',h20l': 1,
	'!8ohg1g0': 1,
	',hol': 1,
	'.owyx': 1,
	'h8s,': 1,
	'4o,h': 1,
	'h8s,n': 1,
	'!2rzg04orz': 1,
	'.4eg': 1,
	'c4om': 1,
	',82!': 1,
	'.g4sg1g': 1,
	'e5': 1,
	'w8orwgx': 1,
	'0gz': 1,
	'r2': 1,
	'he0rsrm': 1,
	'.g4sg1gx': 1,
	'82!': 1,
	'h8g0g': 1,
	'h2': 1,
	'm2g,x': 1,
	's': 1,
	'!oyg': 1,
	'ochg0': 1,
	'.gz': 1
}

La palabra que se repite mas veces es l2e (6 veces), pero también vemos l2e0 (2 veces) que es una variación de la palabra anterior, algo similar ocurre con h8g y h8g0g y algunas otras más.

La complejidad de este reto disminuye notoriamente ya que sabemos lo que estamos buscando en el texto, la bandera 🙂 y sabemos cual es el formato que deben seguir las mismas.

ctf_flag{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}

En una cadena de texto lo suficientemente larga debemos encontrar un símbolo que se repita siguiendo el mismo patrón que el de la bandera si no estuviera encriptada, es decir:

* = (simbolo de guion)

(8 simbolos)*(4 simbolos)*(4 simbolos)*(4 simbolos)*(12 simbolos)

La palabra mas larga que arrojo nuestro análisis es whcjc4om{dzz9bk}v_pbdi_i}v3_op33_c3p39d.owvwpu, probamos “alineando” el formato de la bandera en esa palabra para ver si cumple con el patrón:

whcjc4om{dzz9bk}v_pbdi_i}v3_op33_c3p39d.owvwpu
         xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Tenemos una coincidencia 🙂 acomodamos el resto de la bandera y comenzamos a crear un diccionario con los caracteres a sustituir en el texto y podremos empezar a romper el cifrado (encontrar el alfabeto que fue usado para la sustitución)

whcjc4om{dzz9bk}v_pbdi_i}v3_op33_c3p39d.owvwpu
ctf_flag{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}

Agregamos el diccionario a nuestro script y hacemos la sustitución.

encrypted = "h8s, s, l2e0 4o,h w8orwgx ochg0 h8s,n h8g0g s, r2 he0rsrm .owyx l2e hoyg h8g .4eg 5s44 _ h8g ,h20l grz,n l2e !oyg e5 sr l2e0 .gz orz .g4sg1g !8ohg1g0 l2e !orh h2 .g4sg1gx l2e hoyg h8g 0gz 5s44 _ l2e ,hol sr !2rzg04orz orz s ,82! l2e 82! zgg5 h8g 0o..sh_824g m2g,x h8g c4om s, whcjc4om{dzz9bk}v_pbdi_i}v3_op33_c3p39d.owvwpu"
decrypted = ""
replace = {
	'w': 'c',
	'h': 't',
	'c': 'f',
	'j': '_',
	'4': 'l',
	'o': 'a',
	'm': 'g',
	'_': '-',
	'u': '}'
}

for c in encrypted:
	if c in replace:
		decrypted += replace
	else:
		decrypted += c

print(decrypted)

Vemos que la palabra flag se encuentra en otras partes del texto y no solo en la bandera, lo que sugiere que el texto esta escrito en ingles

t8s, s, l2e0 la,t c8arcgx aftg0 t8s,n t8g0g s, r2 te0rsrg .acyx l2e tayg t8g .leg 5sll – t8g ,t20l grz,n l2e !ayg e5 sr l2e0 .gz arz .glsg1g !8atg1g0 l2e !art t2 .glsg1gx l2e tayg t8g 0gz 5sll – l2e ,tal sr !2rzg0larz arz s ,82! l2e 82! zgg5 t8g 0a..st-82lg g2g,x t8g flag s, ctf_flag{dzz9bk}v-pbdi-i}v3-ap33-f3p39d.acvcp}

Todavía tenemos otras 2 palabras, l2e y h8g, que se repiten bastante en el texto, si encontramos cual es su equivalente nuestro texto sera todavía mas legible. Investigando un poco encontré un articulo bastante interesante The Most Common Three Letter Words (Las palabras mas comunes de 3 letras)

Hacia al final del texto podemos leer algo que dice:

t8g flag s, ctf_flag{dzz9bk}v-pbdi-i}v3-ap33-f3p39d.acvcp}

si t8g puede ser the (que se encuentra en la lista de palabras populares) y s, es is la frase final seria

the flag is ctf_flag{dzz9bk}v-pbdi-i}v3-ap33-f3p39d.acvcp}

Parece que nos vamos acercando, probamos agregando estas letras a nuestro diccionario.

replace = {
	'w': 'c',
	'h': 't',
	'c': 'f',
	'j': '_',
	'4': 'l',
	'o': 'a',
	'm': 'g',
	'_': '-',
	'u': '}',
	'8': 'h',
	'g': 'e',
	's': 'i',
	',': 's',
}

this is l2e0 last charcex afte0 thisn the0e is r2 te0rirg .acyx l2e taye the .lee 5ill – the st20l erzsn l2e !aye e5 ir l2e0 .ez arz .elie1e !hate1e0 l2e !art t2 .elie1ex l2e taye the 0ez 5ill – l2e stal ir !2rze0larz arz i sh2! l2e h2! zee5 the 0a..it-h2le g2esx the flag is ctf_flag{dzz9bk}v-pbdi-i}v3-ap33-f3p39d.acvcp}

Mas palabras salen a la luz:

afte00 es r

l2e0 se vuelve l2er, por lo tanto en la frase this is l2er last charcex, l2er es remplazado por your y el texto tiene aun mas sentido 🙂 !!!

charce … r es n (chance)

this is your last chancex after thisn there is no turning

Tenemos suficiente texto legible para realizar una búsqueda en google y darnos cuenta que el texto es una frase famosa de la película The Matrix

Completamos el resto del diccionario con las letras que nos hacen falta.

Nota: en este punto de la solución me di cuenta que cometí un error al momento de diseñar el reto y no se puede avanzar mas, gracias a @unmanarc por reportar el problema

Por lo tanto la bandera de este reto es ctf_flag{ddd9bk}v-pbdi-i}v3-ap33-f3p39dbacvcp}

0x03 – A new security policy standard

Si encuentras una vulnerabilidad en www.alevsk.com deberías reportarla utilizando los canales adecuados 🙂

Tanto el nombre del reto como la descripción nos da una pista acerca de que debemos investigar sobre nuevos estándares en políticas de seguridad, algunas personas se confundieron en este reto pues creían que tenían que encontrar vulnerabilidades en esta pagina, pero la solución es mas sencilla que eso.

security.txt es un estándar propuesto (similar a robots.txt) para que los sitios web puedan anunciar sus políticas de seguridad y consiste en publicar un archivo de texto en el directorio .well-known donde comuniquemos información importante como por ejemplo la direccion de contacto en la que los hackers pueden reportar las vulnerabilidades encontradas de nuestro sitio web, en este caso https://www.alevsk.com/.well-known/security.txt

# If you would like to report a security issue
# you may report it to me on www.alevsk.com
# ctf_flag{1999251d-df25-4d4a-846b-d4267f471b23}
Contact: [email protected]
Encryption: https://pgp.mit.edu/pks/lookup?op=get&search=0xFF4F600D674B6DED

La bandera de este reto es: ctf_flag{1999251d-df25-4d4a-846b-d4267f471b23}

0x04 – Foogle

Neo: Why do my eyes hurt? Morpheus: You’ve never used them before.

Descargar imagen

Este reto involucra esteganografía y es muy fácil de resolver, descargamos la imagen que nos indican las instrucciones y comenzamos a realizar el análisis, lo mas sencillo y lo primero que intentamos es ver si la imagen contiene en sus bytes alguna cadena de caracteres que tenga sentido.

Podemos utilizar la herramienta hexdump para hacer esto.

$ hexdump -C foogle.png

00000000  89 50 4e 47 0d 0a 1a 0a  00 00 00 0d 49 48 44 52  |.PNG........IHDR|
00000010  00 00 04 34 00 00 02 60  08 06 00 00 00 75 21 33  |...4...`.....u!3|
00000020  a1 00 00 01 7c 69 43 43  50 49 43 43 20 50 72 6f  |....|iCCPICC Pro|
00000030  66 69 6c 65 00 00 28 91  63 60 60 2a 49 2c 28 c8  |file..(.c``*I,(.|
....
....
....
000be000  7b 3a e3 0d e3 7e e2 66  21 44 35 e4 e6 ce 49 93  |{:...~.f!D5...I.|
000be010  6e 35 05 78 c2 39 98 9c  ae db e4 fd 69 9f 8b 31  |n5.x.9......i..1|
000be020  94 4e ca e5 4d c1 c5 ba  13 c0 eb 99 ff 07 7b ee  |.N..M.........{.|
000be030  41 67 d0 72 4a 54 00 00  00 00 49 45 4e 44 ae 42  |Ag.rJT....IEND.B|
000be040  60 82 59 33 52 6d 58 32  5a 73 59 57 64 37 59 6a  |`.Y3RmX2ZsYWd7Yj|
000be050  4d 77 4f 57 55 77 4e 57  4d 74 5a 6a 49 79 4e 43  |MwOWUwNWMtZjIyNC|
000be060  30 30 4e 44 4d 33 4c 57  46 6a 5a 44 6b 74 59 57  |00NDM3LWFjZDktYW|
000be070  52 68 5a 54 6b 35 4e 6a  45 30 4d 6d 56 6b 66 51  |RhZTk5NjE0MmVkfQ|
000be080  3d 3d                                             |==|
000be082

También podemos utilizar el comando strings.

$ strings foogle.png

Al final del archivo hay una cadena de caracteres muy peculiar, parece que es un mensaje codificado en base64, tomamos el string y lo decodificamos con alguna herramienta como https://www.base64decode.org/

La bandera de este reto es ctf_flag{b309e05c-f224-4437-acd9-adae996142ed}

0x05 – Information leak

Información critica ha sido leakeada en los archivos de este repositorio x.x

Como la descripción nos indica, tenemos que revisar los archivos del repositorio donde esta hospedado el CTF, y no solo eso, tambien tenemos que revisar el historial de commits, vemos que en uno de los commits un archivo llamado 0x05_secret.txt fue publicado en el repositorio.

La bandera de este reto es ctf_flag{163f0835-8fc0-4fd0-b96b-dcd724cbe200}

0x06 – We can fix it!

Otro participante trato de robar la bandera de este reto pero sin querer la daño, ¿Puedes repararla? Descargar imagen

Este reto nos presentaba un codigo QR “dañado” (los bordes de la imagen han sido recortados), por lo que si tratamos de leerlo nos dará un error

Pero nada que un poco de photoshop no pueda arreglar 🙂

La bandera de este reto es ctf_flag{d55bd4f6-bff1-45b4-836e-7df1839e7d70}

Espero se hayan divertido mucho y aprendido algo nuevo al participar en este reto.

Happy hacking 🙂

25 mujeres tecnólogas / hackers / programadoras que sigo en twitter – Parte 1

Hola, en esta ocasión quiero compartir con ustedes una lista de 25 mujeres que sigo (y admiro) en Twitter y que son referencia en el mundo de la tecnología, ya sea por que son programadoras muy hábiles, investigadoras, periodistas especializadas en tecnología, hackers, ingenierías o simplemente tecnologas en general.

#1 – AJ Bowen

AJ Bowen es una ingeniera especializada en infraestructura tecnológica, trabaja en una compañía llamada Travis CI dedicada a implementar soluciones de continues integration, entre las aportaciones de AJ a la comunidad podemos encontrar herramientas como IDNcheck y Clink, también es programadora de Python, Golang, C, C++ y bash scripting.

Bonus: tiene uno de los curriculums mas ingeniosos que he visto (el proyecto es opensource https://github.com/soulshake/cv.soulshake.net/) ya que para visualizarlo necesitas hacer una petición con curl desde la linea de comandos.

$ curl cv.soulshake.net


            ┌───────────────────────────────────────────────────────────────────────────────────────────┐
            │.                                                                                          │
            │                                   Hi, I'm AJ.                                             │
            │                I'm a Python developer with a strong interest in                           │
            │                 APIs, CLIs and subverting the dominant paradigm.                          │
            │                                This is my resume.                                         │
            │                                                                                           │
            │                                                                                           │
            │           Note: this is primarily intended for command-line addicts.                      │
            │             A more conventional version can be found on LinkedIn.                         │
            │                                                                                           │
            │                                                                                           │
            └───────────────────────────────────────────────────────────────────────────────────────────┘

#2 – Aloria

Jefa de seguridad de datos en Flatiron Health, empresa de software dedicada al desarrollo e investigación de nuevos métodos para combatir el cáncer. Aloria es considerada una de las mujeres mas influyentes a nivel mundial en la comunidad de seguridad, también formó parte del equipo de seguridad de Tumblr en donde dedicó gran parte de su tiempo para concientizar a sus seguidores en temas de seguridad informática.

#3 – Azeria

Azeria es una hacker en toda la extensión de la palabra, entre sus aportaciones mas destacadas se encuentran tutoriales completamente gratuitos y de gran calidad sobre ingeniería inversa, ensamblador para plataformas ARM, seguridad ofensiva y otros temas mas avanzados como escalacion de privilegios, binary exploitation y ARM exploit development. Podemos encontrar su material directamente en Azaria Labs.

#4 – Binni Shah

Evangelista de Linux, investigadora de Malware, kernel developer y hasta filántropa, Binni Shah es una verdadera caja de sorpresas, también mantiene Linux – Technology Tidbits, facebook fanpage desde donde comparte artículos muy interesantes sobre seguridad.

#5 – Charity Majors

Tuve la fortuna de conocer a Charity en persona en una de sus platicas sobre ingenieria de sistemas que dio en las oficinas de Microsoft CA en 2016, Charity Majors es una Reliability Engineer eso significa que se encarga de que los sistemas, y la infraestructura en general, siempre este operando de la mejor manera posible, tiene experiencia manejando infraestructura de grandes compañias como Facebook y ahora ha fundado su propia empresa llamada HoneyComb de la cual es la actual CEO

Tip: si lo tuyo es la administración de sistemas (sysadmin) Charity Majors es alguien ha quien debes de seguir en twitter.

#6 – Erika Vilches

Hace unos 6 años cuando comenzaba la universidad tuve la oportunidad de pertenecer a Microsoft Student Partner, en aquel tiempo Erika era una de las personas encargadas de coordinar el programa y gestionar los eventos que nos permitían acercarnos a las tecnologías de Microsoft, así fue como la conocí :). Hoy en día Erika Vilches es una de las mujeres mas influyentes de Latinoamérica en temas de tecnológicos, recomiendo seguirla en twitter para estar enterado de los últimos avances sobre blockchain, chatbots, speech recognition y ciencia/tecnología en general.

#7 – Eva Galperin

Nada mas y nada menos que la directora de ciberseguridad de la Electronic Frontier Foundation, organización sin fines de lucro encargada de luchar por los derechos de las personas en el mundo digital (Internet, ciberespacio, etc.), Eva se enfoca en el sector mas vulnerable (digital-mente hablando) de la población como los periodistas, los medios de comunicación y los ciberactivistas en general, para lograr eso viaja alrededor del mundo concientizando acerca de la privacidad, la libertad de expresión y los peligros del government surveillance.

#8 – Hasherezade

hasherezade es una programadora y analista de Malware que vive en Polonia, ha trabajado como investigadora cientifica, C / C++ developer, penetration tester y actualmente tiene su propia compañia que ofrece servicios de respuesta a incidentes de seguridad, también colabora escribiendo artículos para MalwareBytes.

En su blog personal encontraras algunos de los mejores tutoriales y artículos sobre análisis de Malware que he leído así como soluciones a retos de seguridad, ingeniería inversa y crackmes.

#9 – J.

Es una entusiasta de la seguridad informática, la inteligencia artificial y la automatización, trabaja como analista en el área de DFIR (Digital Forensics and Incident Response) de la empresa Under Armour, compañia estadounidense de ropa y accesorios deportivos. J. es un miembro muy activo de la comunidad de seguridad y participa dando platicas y compartiendo su conocimiento en eventos de seguridad como Defcon.

#10 – Jennifer Sunshine

Jennifer Sunshine es actualmente la CEO de la compañia de ciberseguridad IOActive, ha sido juez de Duo Women in Security los últimos dos añios y ademas también es un miembro muy activo en organizaciones como OWASP, EWF e ISSA.

Hasta aquí la primera parte del articulo, pondré la segunda parte de la lista en la siguiente publicación :), mientras tanto tienen alguna otra recomendación para agregar a mi lista? mujeres que sean un punto de referencia en cuanto a la seguridad informática o el desarrollo de software :D.

Puedes leer la segunda parte de la lista en la siguiente publicación: 25 mujeres tecnólogas / hackers / programadoras que sigo en twitter – Parte 2

Saludos.

Análisis interno y de seguridad de la plataforma #CiudApp

26757261694_a0273fdcb6_z

El 30 de mayo de este año (2016) Enrique Alfaro, presidente de Guadalajara, anunció durante la sesión de Campus Night la nueva aplicación de administración y gestión de información relevante para los ciudadanía: CiudApp.

Entre muchas otras cosas, la aplicación permite a los ciudadanos estar informados de las noticias más relevantes de la administración (por eso del trending de los gobiernos abiertos), realizar reportes incluyendo geolocalización y solicitar o proponer servicios al gobierno.

A raíz del lanzamiento de la aplicación ha surgido bastante debate y comentarios en Internet en torno a la misma, incluso leí un artículo muy interesante en donde le hacían un análisis de usabilidad a la aplicación, pienso que está bien ya que en nuestro querido México, en el pasado hemos tenido casos polémicos como el de la app de los 115 millones de pesos y es natural que la gente que sabe del tema (desarrolladores, ux designers, community managers, etc.) emitan su opinión acerca de un producto tecnológico “generado” por el gobierno.

Regresando a lo anterior, después de leer el análisis heurístico de usabilidad de la aplicación me pregunte a mí mismo ¿Quién está detrás del desarrollo de la aplicación?, ¿Y si le hacemos un análisis interno a la app? Podemos hacer algunas pruebas de seguridad también, vamos a “destripar” la aplicación para entender como está construida y ver cómo fue desarrollada, todo esto con la premisa de que no vamos a romper ni a explotar / vulnerar / hackear nada 🙂 y pues manos a la obra.

Instalando la aplicación en genymotion

Lo primero que vamos a hacer es descargar el apk de la aplicación (Si, el análisis lo vamos a hacer sobre un dispositivo con Android), el link de la app CiudApp en la playstore es https://play.google.com/store/apps/details?id=com.radmas.iyc.guadalajara.mex y hay miles de sitios web que te permiten descargar el apk utilizando la url de la tienda, solo busquen algún en google y descarguen el archivo, cuando hayan terminado tendrán un archivo llamado más o menos así Ciudapp_Guadalajara_v3.0.146_apkpure.com.apk.

Después de eso vamos a instalar la aplicación en genymotion, si no saben lo que es pueden investigar y descargarlo de acá https://www.genymotion.com/ y probablemente escriba un tutorial en el futuro acerca de cómo instalarlo y configurarlo.

android

Ejecutamos nuestro dispositivo virtual de con Android y vamos a proceder a instalar el apk de la aplicacion mediante adb con el comando:

adb install Ciudapp_Guadalajara_v3.0.146_apkpure.com.apk

adb

Una vez termine el proceso de instalación tendremos la app en nuestro dispositivo virtual.

installed

Bueno, ya tenemos la aplicación preparada, vamos a dejar esto por un momento y vamos a regresar a la carpeta en donde descargamos nuestra apk, ahora vamos a utilizar 3 herramientas, apktool, dex2jar y Jd (Jar Decompiler) para entender un poco más como está construida la app.

Obteniendo los assets de la aplicación

Vamos a utilizar apktool para de compilar la app y leer así algunos archivos importantes como el AndroidManifest.xml, strings.xml y cualquier otro archivo que nos pueda decir algo acerca de la app o sus desarrolladores.

apktool.bat d "C:\Users\Alevskey\Documents\Pentest\mobile\ciudapp\Ciudapp Guadalajara_v3.0.146_apkpure.com.apk"

d

apktool_d_folder

Entre los permisos que nos solicita la aplicación tenemos cosas típicas como acceso a la cámara, acceso al GPS, escribir y leer en almacenamiento externo, acceso a internet, etc., permisos que uno esperaría de una aplicación como esta.

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.radmas.iyc.guadalajara.mex" platformBuildVersionCode="23" platformBuildVersionName="6.0-2166767">
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.CAMERA"/>
    <permission android:name="com.radmas.iyc.guadalajara.mex.permission.MAPS_RECEIVE" android:protectionLevel="signature"/>
    <uses-permission android:name="com.radmas.iyc.guadalajara.mex.permission.MAPS_RECEIVE"/>
    <uses-feature android:glEsVersion="0x20000" android:required="true"/>
    <permission android:name="com.radmas.iyc.guadalajara.mex.permission.C2D_MESSAGE" android:protectionLevel="signature"/>
    <uses-permission android:name="com.radmas.iyc.guadalajara.mex.permission.C2D_MESSAGE"/>
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="com.radmas.iyc.guadalajara.mex.permission.GPSTRACKER"/> //Show custom dialgo above Statusbar
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW"/>

Lo que me llamo la atención desde un inicio, y una de las razones por las que quería hacer este ejercicio, fue encontrar que empresa fue la desarrolladora de la app, revisando más a fondo el archivo vemos que muchos de los packages empiezan con com.radmas.iyc.guadalajara.mex, haciendo una búsqueda en google de radmas.com encontramos lo que parece ser una agencia española (pueden revisar su información en who.is) de desarrollo de software especializada en diseño, marketing, creación de aplicaciones móviles y páginas web.

radmas

Si son desarrolladores de Android pueden identificar rápidamente otras cosas interesantes como los activities de la aplicación, uno que otro broadcast receiver, algunos servicios, intents, public api keys, etc.

También me llamo la atención que la aplicación tiene internacionalización, aunque la app parece un poco genérica, está bien hecha en ese aspecto

idiomas

Con la utilidad File Locator Lite también encontramos algunos archivos interesantes como:

app.json

{
	"server_url":"https://api.mejoratuciudad.org",
	"base_uri":"",
	"jurisdiction_id":"mx.guadalajara",
	"api_key":"12",
	"name":"Ciudapp Guadalajara",
	"promo_text": "Echa un vistazo a 'Ciudapp Guadalajara', la mejor aplicación móvil de atención ciudadana https://play.google.com/store/apps/details?id=com.radmas.iyc.guadalajara.mex",
  	"promo_web": "https://play.google.com/store/apps/details?id=com.radmas.iyc.guadalajara.mex",
  	"email": "[email protected]",
  	"languages":    [{"key":"Español","value":"es"},
	{"key":"Inglés","value":"en"}],
  "share_url": "http://intranet.mejoratuciudad.org/mail/request/"
}

arrays.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="enviroments">
        <item>http://api-canary.mejoratuciudad.org</item>
        <item>http://api-developer.mejoratuciudad.org</item>
        <item>http://api.mejoratuciudad.org</item>
        <item>http://open010.valvaro.lan</item>
        <item>http://open010.vivan.lan</item>
        <item>http://open010.vnacho.lan</item>
        <item>http://open010.vfernando.lan</item>
        <item>http://open010.vwalter.lan</item>
        <item>http://open010.vemilio.lan</item>
    </string-array>
</resources>

De acuerdo a lo que vemos la app se comunica con varios servicios web hospedados en mejoratuciudad.org, investigando un poco sabemos que la empresa anterior mencionada (radmas.com) también es dueña de este producto, y según sus propias palabras:

Mejora Tu Ciudad (MTC) es una plataforma de comunicación entre los ciudadanos y el ayuntamiento, que se enmarca dentro de las soluciones Smart City y que se basa en los tres pilares fundamentales de Open Government:

Participación, colaboración y transparencia

Al menos con esto estoy un poco más tranquilo sabiendo que el gobierno de Guadalajara contrato una empresa especializada para el desarrollo de la aplicación y no a un par de becarios para programar la app XD.

mejoratuciudad

Del DEX al JAR y del JAR al código fuente

Antes de avanzar al siguiente paso hay algo más que podemos hacer, es sabido que los archivos apk, son en realidad archivos rar, entnces tomamos nuestro Ciudapp Guadalajara_v3.0.146_apkpure.com.apk lo renombramos a Ciudapp Guadalajara_v3.0.146_apkpure.com.rar y lo descomprimimos obteniendo algo como lo siguiente:

dex2jar

El contenido de la carpeta es muy parecido a lo que generamos cuando utilizamos apktool sin embargo si tratan de abrir algún archivo xml aquí, como por ejemplo el AndroidManifest.xml lo unico que obtendrán serán 0s y 1s, pero tenemos algo interesante, el archivo classes.dex.

Podemos utilizar dex2jar con el siguiente comando para generar un archivo jar (Javar Archive)

dex2jar.bat "C:\Users\Alevskey\Documents\Pentest\mobile\ciudapp\Ciudapp Guadalajara_v3.0.146_apkpure.com\classes.dex"

Obtendremos un archivo classes_dex2jar.jar que podemos abrir en el Java decompiler, tan solo abrimos la aplicación y seleccionamos el archivo jar.

jd

Muchos de los paquetes que vemos ahí son librerías de terceros y conforme indagamos más y más podemos ver que la aplicación utiliza librerías de facebook, google, librerías para animaciones, reyclerviews personalizados, analytics, Bitly, crash analytics, etc.

jd2

Para agilizar la búsqueda podemos seleccionar File > Save All Sources y elegimos una carpeta en donde guardaremos el archivo Zip generado que después descomprimimos y analizamos, nuevamente utilizando File Locator Lite

app_decompiled

Algunas búsquedas nos arrojan cosas interesantes, como por ejemplo credenciales en texto plano XD

password

passwords2

username

Con las credenciales obtenidas fue posible acceder a lo que parece un portal administrativo de estacionamientos de una tercer empresa llamada urbiotica en http://services.urbiotica.net/

urbiotica

Podemos ver, al parecer, en tiempo real el status de los cajones de un estacionamiento en algún lugar de España, la pregunta aquí es: ¿Que hacían esas credenciales hardcodeadas en la app?, navegando la aplicación no veo por ningún lado algo que haga referencia a estacionamientos sin embargo haciendo otra búsqueda con la palabra park obtenemos referencias en muchos otros archivos.

park

Sin embargo no pude lanzar ningún activity o servicio relacionado al Parking desde adb shell ya que no estaban registradas en el AndroidManifest.xml.

Opino que esas credenciales son quizás de algún desarrollo anterior, el código fuente fue re utilizado y las credenciales fueron olvidadas ahí y ahora están siendo distribuidas masivamente XD, en fin la pantalla administrativa del sistema de estacionamientos luce de esta forma, tiene sentido que haya otra empresa más involucrada en este proyecto, sobre todo si es está enfocada en tecnologías para Smart cities.

park2

Revisando los archivos de la aplicación

Regresamos a nuestro emulador y ahora vamos a abrir una shell de windows y ejecutamos el comando:

adb shell

El comando anterior nos entregara una consola para poder navegar el dispositivo donde instalamos la app, conociendo un poco sobre Internals y arquitectura general de Android sabemos que la información de una app se almacena en la ruta /data/data/package.de.la.app, en este caso /data/data/com.radmas.iyc.guadalajara.mex/

shared_pref

Aquí encontramos otros archivos que podrían contener más cosas interesantes y que a su vez nos podrían enseñar un poco más cómo funciona la aplicación, comenzamos por ver que hay dentro de la carpeta shared_prefs, si no saben lo que es pueden investigar más al respecto acá https://developer.android.com/training/basics/data-storage/shared-preferences.html pero en resumen es un método de almacenamiento persistente que nos ofrece el sistema operativo, la información es almacenada en archivos XML y es generalmente utilizado para guardar configuraciones de la aplicación.

shared_prefs2

Quizás el archivo más interesante es JURISDICTION_LOADED.xml que contiene:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <string name="mx.guadalajara">mx.guadalajara</string>
</map>

Y del cual vamos a hablar en la siguiente etapa. Después de que se loguen en la app pueden ver que nuevos archivos de preferencias compartidas son creados, estos contienen información relacionada con su cuenta, facebook, etc, etc.

shared_prefs3

En la carpeta /data/data/com.radmas.iyc.guadalajara.mex/databases/ encontramos dos bases de datos sqlite, procedemos a descargarlas para ver qué es lo que contienen usando los siguientes comandos.

adb pull /data/data/com.radmas.iyc.guadalajara.mex/databases/DBImproveYourCity C:\Users\Alevskey\Documents\Pentest\mobile\ciudapp\databases

adb pull /data/data/com.radmas.iyc.guadalajara.mex/databases/DBImproveYourCity-journal C:\Users\Alevskey\Documents\Pentest\mobile\ciudapp\databases

Y después podemos abrirlas utilizando cualquier visor de sqlite como por ejemplo SQLiteBrowser, tutorial para descargar e instalar

db2

En la tabla request es donde podemos ver los reportes “cacheados” por la aplicación en nuestro teléfono, podemos observar el id del reporte (service_request_id), el id de la cuenta de la persona que hizo el reporte (account_id), la calle, coordenadas, url de imagenes, descripcion, status, fecha, etc.

db4

db5

db6

En general cumplen con las buenas prácticas de almacenamiento de información, no almacenan datos sensible en lugares inseguros como la SD externa y en su lugar lo hacen en bases de datos SQLite y shared preferences que es donde solo la aplicación tiene privilegios de lectura y escritura.

Entendiendo las comunicaciones

Ahora viene una de las partes más divertidas de este tipo de ejercicios, saber cómo y con quien se comunica la aplicación, que es lo que envía y que es lo que recibe, etc. Pero antes, si están haciendo este ejercicio mientras leen mi artículo se darán cuenta que la app maneja un concepto muy interesante llamado Jurisdicciones o Jurisdiction, después de analizar el código fuente y visualizar en mi mente el flujo de información, jurisdiction es un identificador que le dice a la app que información cargar de acuerdo a una región especifica, por default la app al iniciar hace un request a https://api.mejoratuciudad.org/applications/12.json y obtiene como resultado

{
  "name": "Guadalajara",
  "active": true,
  "default_jurisdiction_id": "mx.guadalajara"
}

Pueden jugar con el numero al final de la url y de esta manera nos damos cuenta que esta aplicación (o al menos el backend y los servicios web) son escalables y han sido implementados en muchas otras ciudades y países (¿Posiblemente otros clientes de radmas?), por ejemplo https://api.mejoratuciudad.org/applications/5.json nos arroja:

{
  "name": "Cuenta conmigo",
  "active": true,
  "default_jurisdiction_id": "org.sevilla"
}

https://api.mejoratuciudad.org/applications/4.json

{
  "name": "Greencities",
  "active": true,
  "default_jurisdiction_id": "eu.greencities.malaga"
}

Revisando rápidamente con una herramienta para automatizar el proceso podemos ver que actualmente existen 16 jurisdicciones diferentes (al menos en ese servidor), podemos encontrar muchísimas ciudades más del estado de Jalisco así como ciudades de otros países, eso nos dice que la aplicación está siendo implementada en muchos más lugares 🙂

burp

El mismo ID de jurisdicción es utilizado para obtener las noticias, reportes y servicios relacionados de una región en específico.

Continuamos, como sabemos la aplicación se comunica con servicios web hospedados con el proveedor https://api.mejoratuciudad.org/, si vamos a esa URL podremos ver una bonita api REST muy bien documentada 🙂

rest

Esto es muy bueno ya que los desarrolladores ya no estamos limitados a solo utilizar la aplicación, ahora podemos crear nuestras propias aplicaciones utilizando la api ya existente :)! hay otros servicios web muy interesantes como:

Como mencionaba anteriormente, tal solo cambien el valor de la jurisdicción por alguno de los otros y obtendrán la información de las otras plataformas. Para obtener un poco mas de información general de la aplicación, ejecutamos fierce sobre mejoratuciudad.org para tratar de obtener una lista de posibles subdominios

fierce -dns mejoratuciudad.org -wordlist /root/tools/SecLists/Discovery/DNS/subdomains-top1mil-110000.txt -threads 10

fierce

La lista completa:

ftp.mejoratuciudad.org
www.mejoratuciudad.org
intranet.mejoratuciudad.org
api.mejoratuciudad.org
m.mejoratuciudad.org
apps.mejoratuciudad.org
blog.mejoratuciudad.org
demo.mejoratuciudad.org
lab.mejoratuciudad.org
doc.mejoratuciudad.org
developer.mejoratuciudad.org
pandora.mejoratuciudad.org
hera.mejoratuciudad.org
WWW.mejoratuciudad.org
landing.mejoratuciudad.org
privacy.mejoratuciudad.org
electra.mejoratuciudad.org
pi-canary.mejoratuciudad.org
api-developer.mejoratuciudad.org

En este punto el servidor me dio ban (probablemente por mis peticiones automatizadas, pero nada que no se solucione con una VPN), y ya no continué haciendo más pruebas, pero no sin antes darme cuenta de que al parecer su servidor no está hardenizado, cualquier petición a su api devolvía un error 403 revelando la versión del servidor web y su sistema operativo.

<html>
    <head>
        <title>403 Forbidden</title>
    </head>
    <body bgcolor="white">
        <center>
            <h1>403 Forbidden</h1>
        </center>
        <hr>
        <center>nginx/1.4.6 (Ubuntu)</center>
    </body>
</html>

Y si le corremos un scan con nmap a los puertos más conocidos obtenemos.

PORT     STATE SERVICE    VERSION
22/tcp   open  ssh        OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.7 (Ubuntu Linux; protocol 2.0)
80/tcp   open  http       nginx 1.4.6 (Ubuntu)
111/tcp  open  rpcbind    2-4 (RPC #100000)
443/tcp  open  ssl/http   nginx 1.4.6 (Ubuntu)
5666/tcp open  tcpwrapped
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Por buenas prácticas de seguridad esa información no debería ser revelada, y es bastante sencillo corregir eso (literalmente es modificar una línea en el archivo de configuración de nginx).

Con la ayuda de Burp Suite es posible analizar los request y eso nos arroja aún más información de cómo se comunica la app, aunque teniendo la documentación de su api a la mano ya no es tan necesario.

Para terminar, que es lo que aprendimos hoy

  • En el desarrollo de este proyecto estuvieron involucradas al menos 3 partes: El gobierno de Guadalajara, la empresa Radmas y Urbiotica (dejando de lado el posible caso de que en realidad ellos no tienen nada que ver y solo las credenciales de uno de sus clientes fueron leakeadas en la app, eso sería muy mala suerte)
  • Al menos la app de Android (que fue la que analice) fue desarrollada de forma nativa
  • Hacen buen uso de las funcionalidades para almacenar información, guardan la información sensible utilizando shared preference y bases de datos sqlite
  • El almacenamiento de imágenes lo hacen en la nube de aws
  • La app tiene credenciales hardcodeadas (posiblemente de un proyecto anterior del cual re utilizaron el código) y que al día de hoy funcionan
  • La app utiliza el servicio de mejoratuciudad.org que al parecer es un producto de radmas.com y podemos decir que es un software / plataforma / tecnologia especializada para hacer implementaciones en smart cities
  • Los servidores de mejoratuciudad.org no están hardenizados
  • Los servidores de mejoratuciudad.org cuentan con algún tipo de IDS/IPS que bloquea a usuarios después de X número de peticiones automatizadas.
  • La plataforma no implementa esos controles puesto que solo utilice una VPN para cambiar mi IP y ya pude seguir interactuando con la app sin problemas.
  • Debido al concepto de Jurisdicciones sabemos que la app está siendo implementada en muchas otras ciudades de México y el mundo (16 clientes para ser exactos según los servidores de mejoratuciudad.org)
  • Los servicios web no parecen vulnerables a algún tipo de ataque popular como SQL injection, xss, RCE, etc. Muy bien por Radmas 🙂 )
  • El código fuente de la aplicacion no fue ofuscado

Happy hacking … salu2