Hackit!2013 : Level 2

Nos dicen que tenemos que recuperar el contenido de un archivo .rar que han protegido con un password. Dentro de ese archivo parece ser que podremos encontrar información sobre un repositorio de código (al que accederemos con una contraseña, que tendremos que recuperar). Pero el primer paso será obtener el password que protege el archivo RAR. Lo único que se sabe es que ese password cumple lo siguiente:

<? echo sha1(md5($password)); ?>
77134aa1b02b61cd841d2a81bf64796a31234e28

Teóricamente las funciones de resumen criptográfico (o funciones hash) md5 y sha1 no tienen función inversa. O dicho de otro modo, existe md5(X) para todo X, pero no existe una función Y tal que Y(md5(x))=x. Para colmo de males, el resultado de md5(x) se ha pasado por la función sha1 : sha1(md5(x)). Entonces, ¿qué podemos hacer? Bueno, supongamos que alguien decide generar una tabla para «todo» X, almacenando los resultados. Algo como md5(«a») –> guardar, md5(«aa»)–>guardar, md5(«aaa») –> guardar, md5(«aab»)–> guardar…. etc. Guardar todo eso puede ser muy costoso, sobre todo si la longitud de X empieza a crecer y además, combinamos letras (mayúsculas y minúsculas), números y caracteres no alfanuméricos. Hay «trucos» para no tener que guardarlo todo (ver Rainbow Tables), pero en general, es inviable llegar más allá de passwords de más de 8 o 9 caracteres si tratamos con pass que contienen todos esos símnbolos (Ophcrack guarda esas tablas.. ojito, habamos de ficheros de entre 500GB y 2TB 🙂

¿Y nos tenemos que descargar esos mastodontes sólo para probar? No. Además, los enlaces que indico no sirven para el algoritmo sha1… Vale, ¿entonces qué? Bueno, hay otros sitios web que nos permiten pasarle un hash sha1 o md5 para ver si están indexados en sus bases de datos. Crackstation.net es una de esas webs 😉 Y qué casualidad, tienen ese pass indexado… Una vez recuperado, procederemos a descomprimir el .rar. Veremos que hay un directorio .m2, con 2 archivos: settings.xml y settings-security.xml. Son 2 ficheros que se usan para acceder a un repositorio de código Maven… El 2º guarda una contraseña maestra, a partir de la cual se ha generado la que aparece en settings.xml. ¿Hay alguna forma de, teniendo la contraseña maestra, saber cuál es la palabra o frase que se cifró para obtener la contraseña de settings.xml? Por supuesto, ése será nuestro siguiente paso…

HackIt! 2013

Selection_421HackIt! es el concurso de seguridad informática de la Euskal Encounter en el que compiten más de 80 equipos y gana w0per 😉 El resto de los equipos jugamos en otra liga por intentar quedar en segundo o tercer puesto. Este año en DL conseguimos el objetivo, tras andar como el gato y el ratón con Navarparty. Grandes estos navarros!

Realmente el HackIt! consta de 2 secciones, el propiamente llamado HackIt, +-10 retos donde en general se requieren amplios conocimientos técnicos/ informáticos para pasar más allá de la prueba 4)  y SolveIt, +-8 retos, donde se plantean pruebas con menor componente técnico y más ingredientes de ingenio.

Esta edición del HackIt, como las últimas (2012, 2011, 2010) ha sido organizada por @marcan y está desde hace unos días online. Siempre estaré agradecido a su labor (este año. ademaś, le ha dedicado un toque especial generando banners de «patrocinadores», que servían como ayuda/pista en algún  nivel :-P)  De hecho, es la prueba que me sigue haciendo perder el sueño y dedicar 3 días a «jugar».

Como cada año, al terminar el HackIt! me gusta retomar algunas de las pruebas, para comentarlas con el resto de compañeros, y aprender de los demás. Nuestra forma de solucionar puede no ser la óptima, ni siquiera la forma más ortodoxa. Incluso en una de las pruebas (Trollencio!) fue pura chiripa, como veréis. Por ello, me gustaría que los grupos o individuos que se pasaron dichas pruebas (antes o ahora, post-mortem) comentaran sus impresiones en este post.

Selection_423Comencemos con la primera. Hack It 1: WTF!»#$%&()~ . Analizando el código vemos que se carga un fichero Javascript desde la ruta /hackit/1/static/checkpw.js . ¿Y qué tenemos ahí? Un monstruo como el de la figura de la izquierda. Fíjense en el scroll vertical 🙂 Se trata de código Javascript codificado en un alfabeto con sólo 8 caracteres : ()[]{}!+  Una especie de codificación BrainFuck, pero en Javascript. Útil para intentar saltarse detectores de intrusión, reglas de firewall, etc… porque a ver quién es el majo que interpreta eso 😛

En fin, si abrimos una consola Javascript en Chrome y seguimos el artículo del autor de esta monstruosidad (o belleza, según cómo se mire), empezaremos a entenderlo. La idea es conseguir interpretar cualquier instrucción Javascript usando sólo ()[]{}+-  . Lo primero será saber cómo obtener los caracteres alfanuméricos: a-z0-9, pues con ellos ya tendremos un buen camino recorrido.

Selection_424Si ejecutamos +[] , obtendremos un 0 (casting de un array vacío a integer). Con ![] un false (casting a boolean de un array vacío). Si negamos ese valor !![] obtendremos un true, y al convertirlo a entero +!![], un 1. Con estos 2 números y el operador de suma, podremos obtener cualquier otro dígito (con algunos trucos que muestra el autor, esto se puede simplificar, para no tener ristras enormes cuando necesitamos un numero como 128). ¿Y las letras?  Bueno, empecemos con algo más sencillo. Si esto es un array [] (vacío), y esto devuelve un 0 +[], entonces, ¿qué ocurrirá si intentamos acceder a la primera posición (0) de un array vacío? [][+[]] . Que obtendremos la cadena «undefined». ¿Y si hacemos un casting de un objeto a número? +{}  . Javascript nos dirá que eso no es posible con la cadena «NaN» (not a number).  Accediendo a los caracteres de esas cadenas (indexándolas como arrays de caracteres), tendremos ya unas cuantas letras (u, n, d, e, f, i , a) . Siguiendo este mismo truco el autor explica cómo conseguir todo el alfabeto. Ahora nos hace falta una función que, dado como parámetro un string, evalúe dicho string como si el nombre de una función se tratara. Este trabalenguas no es sino para introducir la función «Function», que hace precisamente eso:

Function(«alert(1)»)()

construirá la función alert() a partir de la cadena pasada como parámetro (en concreto, construirá alert(1) y la ejecutará, mostrando ese 1 en pantalla). Este post en castellano nos ayudó a terminar de entender cómo funcionaba todo, os lo recomiendo. En definitiva, es posible ejecutar en el navegador cualquier función a partir de un churro de caracteres ()[]{}+ .  En su día, el maligno ya nos habló de este experimento, pero no le hice demasiado caso, hasta hoy 🙂

Bien, ¿y cómo pasarnos entonces este primer nivel? Realmente no hace falta entender nada de lo que he explicado hasta ahora 😛 , porque se puede resolver «de chiripa». La cuestión es que si conseguimos ejecutar checkpw.js  en un navegador nos saltará un alert con el password. Ojo! Para que el brainfuck funcione, necesita acceder a la letra «p» de alguna forma, y el artículo indica que ésto es posible si el script se carga desde una localización http://loquesea.com  (la p la sacará del nombre del protocolo, httP ) . Así que no vale con cargar el script con protocolo file:// o directamente desde la consola del navegador, como intentamos mil veces 🙂

Nola instalatu Xuxen zuzentzaile ortografikoa LibreOffice 4-n

Gaur bertan, @asiersar -en txio baten bidez, LibreOffice 4.0-rekin bateragarria den Xuxen zuzentzaile ortografikoaren bertsio berri bat atera dutela ikusi dut. Berez, bertsio berria uztailaren 19tik dago kalean, baina tira, ez nuen inon ikusi honen berri.

Bere instalazioa eta erabilera oso errazak dira. Lehendabizi,  XUXENIV-LO4.oxt fixategia hemendik jaitsi. Ondoren, LibreOffice ireki eta Tresnak / Hedapenen kudeatzailea ireki (Tools / Extensions manager).  Ondoren, «Gehitu..» (Add..) botoian sakatu, jaitsi berri duzun .oxt fixategia hautatu, leihoa itxi eta LibreOffice berrabiarazi.

Extension Manager_403Orain, euskaraz idatzitako testu bat idazterakoan, gogoratu, euskaraz (Basque) dagoela esan behar diozula Writer aplikazioari (defektuz ez baduzu horrela konfiguratu). Adibidez, nire bertsioan besterik ezeko konfigurazioan, ingelera da lehenetsitako hizkuntza. Beraz, testua idatzi, Ctrl-A (dena hautatu) sakatu, eta beheko-aldean dagoen hizkuntzen leihotxoan «Basque» aukeratu.

Workspace 1_404

 

Bukatzeko, gaizki idatzitako hitzak gorriz azpimarratuko dira. Eskubiko botoia sakatu baten gainean eta proposatutako zuzenketen artean bat hautatu. Testu osoa zuzentzea ere badago: F7 tekla sakatu eta zuzenketak egiteko leiho bat irekiko zaizu. Bertan, banan-banan, oso modu erosoan, zuzendu ditzakezu gaizki idatzitako hitz guztiak.

Spelling and Grammar: Basque_406

[LibreOffice] Soporte de español

English Language

Si escribes es castellano y quieres que LibreOffice Writer te ayude a detectar y corregir errores de ortografía y gramática, necesitarás indicarle que tu texto está en ese idioma. Pero si en su día instalaste la versión no localizada sólo tendrás disponible en el menú de idiomas la opción «English (USA)». Y no, cuando pulsas en «More…» no te deja elegir más idiomas, sino que te lleva a la página de configuración de más opciones relacionadas con la página (espaciado entre letras, tipo de letra, background…). Entonces… ¿cómo instalar el soporte de español?

Basta con ejecutar este simple comando:

$ sudo apt-get install libreoffice-l10n-es

que a su vez nos instalará también: hunspell-dictionary-es, myspell-dictionary-es, hyphen-es, libreoffice-grammarcheck-es, libreoffice-help-es y mythes-es. Ahora ya podremos detectar y corregir nuestros errores en la lengua de Cervantes 😉

LibreOffice Writer / Spanish support

[LibreOffice] Portada sin número de página

Cuando generas un documento en LibreOffice Writer es muy probable que la primera página sea una portada que no quieres que contenga numeración a pie de página. La página número 1 debería ser la siguiente a la portada… o incluso podrías querer dejar una página en blanco tras la portada y comenzar a numerar en la 3ª página física. ¿Pero cómo se hace esto en LibreOffice?

Portada sin numeración de página

Tras preparar la primera página física (portada), pulsa F11 para ver el gestor de estilos. En el gestor, pulsa el icono de «Estilos de página» tal y como se muestra en la figura de la izquierda. A continuación, verás que hay varios estilos disponibles, entre ellos «First Page» (Primera página). Haz doble click sobre este estilo. Ahora, situado en la página de portada, insertaremos un salto de página seleccionando la opción de menú «Insert / Manual break». Se abrirá un cuadro de diálogo como el de la figura 2. Ahí seleccionaremos «Page break» y en estilo: «Default style». Al hacerlo, podremos ver que nos permite cambiar el número de la página que vamos a introducir tras la portada («Change page number»). En ese campo, pondremos un 1. Al pulsar OK veremos que suceden varias cosas. La primera es que Writer creará una nueva página en blanco tras la portada. La segunda es que según Writer estamos en la «Página 1 3/3». ¿Qué es esto? ¿De dónde sale ese 3/3? Calma 🙂 La cuestión es que las páginas con numeración impar tienen que ser páginas «a la derecha». Pensemos en un libro. Si nos fijamos en la numeración de las páginas, las impares siempre son páginas «derecha» y las pares páginas «izquierda». Lo que ha hecho Writer tiene sentido: si tras la portada creamos una nueva página con numeración «1», ésta tiene que ser página derecha, por lo que Writer tiene que crear una página intermedia para que le cuadren las cuentas (de ahí el «Página 1 3/3»). Figura 2Veremos también que LibreOffice marca con una línea azul discontinua el salto manual de página. Ya sólo nos queda insertar el pie de página (Insert / Footer / Default style) en la página que acabamos de crear y, finalmente, el propio número de página (Insert / Fields / Page Number)

Figura 3

Página física 2 = lógica 1