Cybercamp 2016 – Crypto 1

Según tenga tiempo iré subiendo los writeups de aquellas pruebas de la fase online de la cybercamp 2016 que haya conseguido resolver.

En esta prueba nos daban el siguiente enunciado:

CRYPTO 1

https://challenge.cybercamp.es/challenge/46/

Descripción:

La prensa amarilla de Reino Unido no para de publicar por adelantado los resultados de las deliberaciones de los jueces, nadie sabe cómo se producen las filtraciones. Parece que hay un topo. Hemos capturado tráfico de red de la Wifi del hotel.

¿Sabes cómo lo hacen?.

Mirror1: https://mega.nz/#!icplyAzI!0lUpw3dB38BzJ7a7nu8FvEFIgQbbFpYjHEl88JryBV4

Mirror2: https://mega.nz/#!zpdAiZTI!0lUpw3dB38BzJ7a7nu8FvEFIgQbbFpYjHEl88JryBV4

Y un archivo file.pcap el cual procedimos a abrir con wireshark para ver que contenía. La verdad es que el análisis fue bastante corto, el archivo contenía mayoritariamente llamadas DNS y HTTP; por aquello de que valía pocos puntos (ya debería saber que no debo fiarme) me centre en las llamadas HTTP y utilizando el filtro correspondiente de wireshark me quede solo con esas:

crypto1-1

Los Continuation y las respuestas 200 parece que sobran, vamos a seguir filtrando:

crypto1-2

Esto ya parecía mucho mas prometedor, pero, esas llamadas no contenían ninguna información en especial, los puertos eran siempre los mismos…. Espera, el año pasado nos quedamos bloqueados en una prueba en la que utilizaban morse, y veo que las urls contienen . y – si consideramos esas llamadas con los diferentes símbolos del morse y los / como espacios quizás veamos algo.

Tengo que reconocer que en su momento ni esto fue tan claro ni tan bonito como lo pinto, además de que en lugar de utilizar los siguientes scripts todo se hizo a mano, pero entonces no quedaríamos tan bien jeje

Lo primero que necesitábamos era una manera de extraer el mensaje, para ello utilice este pequeño script en bash:

#!/bin/bash

INPUT=$(tshark -2 -R 'http.request.method=="GET"' -r file.pcap  | tr -s " " | cut $

for i in $INPUT
do
        if [ $(echo $i | grep -c "insert") -eq 1 ]
        then
                MORSE=$MORSE"."
        elif [ $(echo $i | grep -c "publish") -eq 1 ]
        then
                MORSE=$MORSE"-"
        else
                MORSE=$MORSE" "
        fi
done

echo $MORSE

Ejecutando este script en la misma carpeta donde teníamos el pcap obtenemos la siguiente secuencia:

.-. ..- ... .. .- - . -. .--. --- .. -. - ... .-.-.

Prometedor, ahora vamos a utilizar un pequeño script en python que me escribí para lidiar con morse, aquí os dejo el código:

import argparse

morse = {'A': '.-',     'B': '-...',   'C': '-.-.',
        'D': '-..',    'E': '.',      'F': '..-.',
        'G': '--.',    'H': '....',   'I': '..',
        'J': '.---',   'K': '-.-',    'L': '.-..',
        'M': '--',     'N': '-.',     'O': '---',
        'P': '.--.',   'Q': '--.-',   'R': '.-.',
     	'S': '...',    'T': '-',      'U': '..-',
        'V': '...-',   'W': '.--',    'X': '-..-',
        'Y': '-.--',   'Z': '--..',
        '0': '-----',  '1': '.----',  '2': '..---',
        '3': '...--',  '4': '....-',  '5': '.....',
        '6': '-....',  '7': '--...',  '8': '---..',
        '9': '----.'
        }


parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument("-e","--encode", help="Encode text to morse.")
group.add_argument("-d","--decode", help="Decode morse to text")
args = parser.parse_args()

output=""

if args.encode is not None:
	for letter in args.encode:
		if not letter.isspace():
			output+=morse[letter.upper()]+" "
elif args.decode is not None:
	inv_morse = {v: k for k, v in morse.iteritems()}
	buff=""
	for letter in args.decode:
		if not letter.isspace():
			buff+=letter
			continue
		try:
			output+=inv_morse[buff]
		except:
			pass
		buff=""
	try:
		output+=inv_morse[buff]
	except:
		pass
        buff=""

print output

Si utilizais vuestro propio script o alguno online seguramente os encontrareis conque el último grupo de símbolos no corresponde con ningún carácter morse, para evitar este problema decidí modificar mi script y que en caso de no hallar un valor adecuado se limitase a seguir procesando el resto de la información.

Lanzamos el script con el código morse que obtuvimos anteriormente y recibimos el siguiente resultado:

morse.py -d ".-. ..- ... .. .- - . -. .--. --- .. -. - ... .-.-."
RUSIATENPOINTS

¡Y ahí está la flag!

Espero os haya gustado este writeupt, como siempre, gracias por vuestra visita!

Publicado en cripto, ctf, cybercamp | Deja un comentario

Guía básica para hardening en Debian

Ya de vuelta de la Cybercamp 2016, de la cual os hablaré en próximos post, me he decidido a terminar esta pequeña guía sobre el hardening básico que al menos yo le aplico a mis instalaciones de Debian.

Seguramente no necesitáis aplicar todo lo que recomiendo o quizás algunas opciones no se ajusten a lo que vayáis a necesitar. Esto no es un dogma a seguir a rajatabla, os recomiendo que os paréis a ver lo que hacen las distintas opciones que recomiendo en cada parte y, en lugar de limitaros a hacer copy/paste adapteis lo que yo os doy a vuestras necesidades.

Aunque en el título especifico Debian, cualquier distro derivada debería de ser compatible con esta guía.

Indicaros que para aplicar estos cambios os harán falta permisos de root así que tendréis estar logueados como tal o bien tener un usuario con sudo.

Antes de nada os recomiendo actualizar el sistema para aseguraros de que tenéis los últimos parches de seguridad:

apt-get update; apt-get upgrade; apt-get dist-upgrade

Vamos a comenzar con un clásico: iptables.

Para comenzar vamos a instalarnos el paquete iptables-persistent:

apt-get install iptables-persistent

Este paquete nos ayudará a que nuestras reglas de iptables se carguen en el arranque y tener una manera fácil y sencilla de mantenerlas.

Durante la instalación os habrá preguntado si queréis guardar vuestras reglas actuales, dependiendo de lo que hayáis seleccionado os habrá creado el archivo /etc/iptables/rules.v4 ,en caso de que no lo tengáis lo tendréis que crear a mano.

Editaremos el anteriormente mencionando /etc/iptables/rules.v4 para que quede así:

*nat
:PREROUTING ACCEPT [48:11060]
:INPUT ACCEPT [2:104]
:OUTPUT ACCEPT [5:270]
COMMIT
*filter
:INPUT DROP [27:7448]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [325:462098]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
COMMIT

Lo que hacen estas reglas es cortar todo intento de conexión a la máquina excepto las ya existentes, de forma que si estáis por SSH no os quedáis fuera en ese momento.

Si queréis abrir un puerto durante el arranque simplemente sería añadir una linea como la siguiente antes del último COMMIT:

-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

O si queréis abrirlo de forma puntual ejecutas el comando:

iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

Y luego para cerrarlo:

iptables -D INPUT -p tcp -m tcp --dport 22 -j ACCEPT

Para guardar el conjunto de reglas que tengáis en un momento podéis lanzar el siguiente comando:

iptables-save > /etc/iptables/rules.v4

Y para restaurarlas:

iptables-restore < /etc/iptables/rules.v4

Iptables es un mundo en sí, así que os recomiendo le hecheis un vistazo en profundidad para añadir vuestras propias reglas según lo que necesitéis.

Lo siguiente que vamos a hacer es hacerle un poco de hardening al kernel, para ello editamos el archivo /etc/sysctl.conf y añadimos las siguientes lineas al final:

net.ipv4.icmp_echo_ignore_all=1
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
net.ipv6.conf.lo.disable_ipv6=1
net.ipv6.conf.eth0.disable_ipv6=1
kernel.core_uses_pid=1
kernel.ctrl-alt-del=0
kernel.kptr_restrict=2
kernel.sysrq=0
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.all.log_martians=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.default.accept_redirects=0
net.ipv4.conf.default.accept_source_route=0
net.ipv4.conf.default.log_martians=1
net.ipv4.tcp_timestamps=0
net.ipv6.conf.all.accept_redirects=0
net.ipv6.conf.all.accept_source_route=0
net.ipv6.conf.default.accept_redirects=0
net.ipv4.conf.all.forwarding=0

Como veis están un poco «desordenadas», esto es preferencia mía, si os fijáis el primer bloque de reglas net lo que hace es desactivar ping e ipv6, y el otro bloque ya son cosas mucho más específicas; de todas maneras el orden de los factores no altera el producto.

Como en el caso de iptables os recomiendo revisar y ver que necesitáis y que no, por ejemplo, seguramente algunos querréis habilitar el poder pasar tráfico entre interfaces con lo cual la ultima regla la deberíais eliminar.

Una vez tengamos el archivo editado lanzaremos el siguiente comando para aplicar los cambios, o también podéis reiniciar, es vuestro uptime no el mio:

sysctl -p

El siguiente paso va a ser cambiar un poco la configuración de SSH para volverlo más robusto. Para ello editamos el archivo /etc/ssh/sshd_config y modificamos/añadimos las siguientes opciones para que queden así:

UsePrivilegeSeparation SANDBOX
LogLevel VERBOSE
PermitRootLogin no
X11Forwarding no
TCPKeepAlive no
AllowTcpForwarding no
ClientAliveCountMax 2
Compression no
MaxAuthTries 3
MaxSessions 2

Os habréis fijado que no he cambiado el puerto, esto es muy recomendable, ya que si dejáis SSH se queda a la escucha un simple nmap revelará que el servicio esta ahí, pero eso ya lo dejo a vuestra elección.

Reiniciamos el servicio de SSH para aplicar los cambios:

/etc/init.d/ssh restart

Por último vamos a aplicar una política segura para las contraseñas.

Instalamos el modulo pam_passwdqc para PAM:

apt-get install libpam-passwdqc

Y modificamos el archivo /etc/login.defs para que quede así:

PASS_MAX_DAYS   90
PASS_MIN_DAYS   1
PASS_WARN_AGE   7

Insisto de nuevo en que esto es una simple recomendación, ajustar los valores según os sea necesario.

Una recomendación que os daría a título personal sería que deshabilitarais todos aquellos servicios que no necesitéis, sobre todo aquellos que escuchan en algún puerto. A pesar de que iptables ya debería bloquearlos nunca está de más, para el servicio de CUPS por ejemplo:

/etc/init.d/cups stop; systemctl disable cups

El anterior comando lo que hace es, primero parar el servicio y posteriormente evitar que se inicie durante el arranque. Esto no evita que terceras aplicaciones puedan levantar el servicio por su cuenta, simplemente le indica al sistema que, si nadie lo pide, no lo arranque.

Si queréis tener una idea general del estado de hardening de vuestra máquina os recomiendo que probéis la aplicación Lynis. A pesar de que ya está en los repos de Debian a mi me gusta utilizar sus repositorios para tener la última versión, para ello ejecutar los siguientes comandos:

echo "deb https://packages.cisofy.com/community/lynis/deb/ jessie main" > /etc/apt/sources.list.d/cisofy-lynis.list
apt-get install apt-transport-https
apt-get update; apt-get install lynis

Ahora simplemente ejecutamos Lynis de la siguiente manera:

lynis audit system

Lo que hará Lynis es realizar diferentes comprobaciones en nuestra máquina y al final nos dará una serie de recomendaciones así como una puntuación, a mi me gusta que mis máquinas se mantengan como mínimo por encima del 85 de nota.

Y esto es todo, veréis que en cuestión de aplicaciones solo he tocado SSH y es que para una guía básica ya me parecía bastante extensa sin tener que meterme en aplicaciones que mucha gente a lo mejor no tiene ni instaladas. En caso de que queráis alguna guía para alguna aplicación en concreto no dudéis en pedirla.

Espero os haya gustado, muchas gracias como siempre por vuestra visita, y no seáis tímidos, dejad un comentario!

Publicado en hardening, tools, tutorial | 1 comentario

Cybercamp 2016 – Crypto 10

Ya sé que tengo varios post pendientes y es que he estado algo ocupado con la fase online de la Cybercamp 2016, precisamente hoy os traigo un pequeño writeup de una de las pruebas que cuanto menos me pareció muy interesante por su contenido más que por su dificultad, que no es que fuera fácil tampoco jeje

En esta prueba nos daban el siguiente enunciado:

CRYPTO 10

Ha ocurrido lo impensable: ha habido un apagón completo en la Villa Olímpica, y no funciona prácticamente ningún aparato electrónico, por lo que nuestros agentes se han visto obligados a volver a los viejos métodos para mandar y recibir sus mensajes secretos. Utilizan, de hecho, la siguiente grabación (que es real, una de las pocas que se conservan en español, y que fue interceptada en Alemania en 1945), y un libro de códigos.

Con esta información, ¿puedes ayudarnos a descifrar el mensaje M que acaba de enviarnos nuestro agente López?

Mirror 1: https://mega.nz/#!GJRnmK6Z!k4FU2RohtgCo7IBKc3KqzKsLi909uqgZz1raB_nwZmw

Mirror 2: https://mega.nz/#!a9dHVbRb!k4FU2RohtgCo7IBKc3KqzKsLi909uqgZz1raB_nwZmw

Mirror 1: https://mega.nz/#!bF4lTBAI!0kSazVv9lvrWJAeUSA12Dhw6MwYFdfEgEoQVhClfTKM

Mirror 2: https://mega.nz/#!C0ElwbqI!0kSazVv9lvrWJAeUSA12Dhw6MwYFdfEgEoQVhClfTKM

Mirror 1: https://mega.nz/#!SRQGSaAL!MTK0ab3MnNBP08V2BsBpPO6nckmbA1Eq8vJIbdFDnc

Mirror 2: https://mega.nz/#!i9VQkDZK!MTK0ab3MnNBP08V2BsBpPO6nckmbA1Eq8vJIbdFDnlc

Y 3 archivos que contenían:

  • Un archivo de audio de una emisora de números.
  • Un pdf con parte de un libro de códigos.
  • Un txt con el mensaje M que había que decodificar.

Si sois fans de la criptografía, sobre todo de la utilizada durante las guerras mundiales quizás ya habréis oído hablar de las emisoras de números. Para aquellos que no sepan lo que son básicamente son emisoras de onda corta que recitan números, palabras, letras, etc sin aparente sentido. Los primeros reportes de estas emisoras datan de la primera guerra mundial así que serían de las primeras en existencia y aun a día de hoy contienen muchos misterios.

Como bien nos indica el enunciado la grabación que nos dan es real y tras buscar un poco en google era fácil encontrar referencias a las emisoras de radio. Una vez que sabíamos de donde había salido el audio con una simple búsqueda sobre que criptografías utilizaban dichas emisoras durante la guerra nos encontramos con algo que nos viene como anillo al dedo para esta prueba: los cuadernos de un solo uso (One Time Pads u OTP de ahora en adelante).

Visitando el artículo sobre OTP en la wikipedia podréis ver unos ejemplos sobre como funcionan y el uso de los OTP, y de paso nos explican como se realiza el proceso de decodificación, así que ¡Vamos alla!

Primero nos toco oir el audio y apuntar los 41 grupos de 4 números que nos interesan (fácilmente identificables una vez que empezais a oír la grabación).

3720,1935,1642,5825,966,6035,1754,8580,1168,7058,2848,6717,2021,4281,1933,5998,7582,7133,9979,5984,1452,686,9355,5791,9270,3967,3491,6902,4651,3323,7338,526,1746,5122,2301,2718,8888,6532,1251,5134,6711

Combinando dichos números con el libro de códigos y el mensaje, aplicando el método de la wikipedia ahora debería de venir el paso fácil, ya que, si ya tenemos todos los datos ¿que puede salir mal? Pues un detalle muy importante, y es que no sabemos si los números nos indican algo del estilo: pagina-posición de la letra o combinaciones similares.

Huelga decir que no acerté a la primera y tuve que hacer varias pruebas hasta darme cuenta de que los números se referían a al posición absoluta de las letras en el libro de códigos (exceptuando la primera página ya que no pertenece al grupo que necesitamos).

Armado de copy/paste y sublime me puse a pasar todo el libro de códigos a un archivo de texto que pudiera recorrer de forma más cómoda y de paso crear un script que ya hiciera todos los pasos por mí.

El resultado fue el siguiente script:

#!/bin/python

message="CDDCFKWZQGMXEAXETCJSCMRWWNWKLERFRAZGIBRYA"
diccionario="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
key_pos=[3720,1935,1642,5825,966,6035,1754,8580,1168,7058,2848,6717,2021,4281,1933,5998,7582,7133,9979,5984,1452,686,9355,5791,9270,3967,3491,6902,4651,3323,7338,526,1746,5122,2301,2718,8888,6532,1251,5134,6711]
decrypt=""
claves="DNGRDTCVTJKKNWTZANWWHUOCMOADYTKRYLMHAZCRKMIKWPLETYBTQHZEBZWUTJQZBZUXPHQJAXIVCNWIAGJSYRJNTGILCBVOQRPGKAMLZAHJRPYQALUVGHBOVQHMKDPUOKDLXSLWBYKOSNEQOQZRIEUMCDXOIIYBDOOMKDXKJVUXDAXHNWSRBMPREGVZDZIWFDATNOBNBSESHSPSRFDGTECMHFABETNPWTBEKDGMRYTKYOJOAUYWFCRJOGJZJAXMPXDMQUAVLDJHWAAEHJYXOKGRPRFICYSIRANMWRJREXKZMXYXQQIEYGRMEUZNRPNCYWLCJHHXLHAJTIKTNBUTPCXQNBANUXTAGJRAXQIRBZQLKFEPXMVHBTXOFYUUXTOSSJQKWMTIZDJCFZZBECQIISDJISUGYRWATEDXETXOLOLYWJUMSWJAFAGOEYMDPQPTXGPPYWIGGFZTTGBXRIKVIFCRRVISEZUSAUUMYICIEFYQYEERTGJHSDPFHCZKHRIALQAQOGICPIUIGBFFIKDSLTZVYCUISKODALEJYWRIKINSUSXCVWFMGTDUECJXZEWTZSQSKXEZZQXHEXFQQWWHLONBWGCUSMJAZAIQAAKOETUGHZVQYWLNWVHVZYNWZEUKTWYDRJLERLATNQMTDXYVOZZXNCNQKAKCCYMZHXMUPXQAJYRZMWZMUMNIWJVYUDQWAUEBLDBULZWPALMGUMMOAPZOEVXFEZRMKEWHAIPXAISFNHQDIECRNEITOUBERKFXFVUYWTJUGAZQRYHLWLSXKGUSXUUIKSFVCRLWYOLXMGAZYHSEITOCASEGXXTJMPOMGZUMLMJNRRPSASUOSQELKIAZAYFQNYDIBWXUGXQWLCVANWYLRDTTFLHIWQPSXTHYMJYMEMKBQPZPZQBFRJHUDTKKTYMAADGOBNWAIFUUAZGTMSQOIXAGNVTAMMUGBVFQWBPKRYVLVCILYXOGFWVXJIDGDSBIKXGWCIDBVTVDLQGNTFASBRPYQALDRXDMYYAIKKGDNRPXIOXMPIMAWSEHUGRPBXRMHCQLSLZQAXMMZULRQAJLSTHOOGNMVGUBFJVBGGHIGIQGGUUJWXOTGLYUHIZLAXGVPQADEFRFMLNENIDQZJPLCGZORMYLXIHAZDAEACQXSGHTATQIDJIIMVRDFFBDIVSCMAFIHTLEZMATKIZWBWKZBFTCFWWIJTFEDPICRYSGYZZYPSJLKXBIBXOEJSOJKORRDSVCRCOOXCIVQPQSYYNCEBOVRYEQEVZAQNUQFTMAFYGGSXJSGLNRPLMXQDZQWOZXHTAMKVEAAEXNAUSVVCKNSHSPVEVSOGFJNSUBNMTXRXPQSTFVKVWUTOTEDRHSJTLSLABJONWNRCYMMOCJPGEFEPGJBFRQCWWDUBMLAFIZTWAJMHHORTSKVRMJCYWDVUWVTTMPWVMVDLHEYSPPMQYBTSDMBROBVEFIUTEUBGRVTOJJFWHXHMWYXBQUABOXLQGZUMAXGAODXDOVSRFKHHBCXMMYZHUJFDONHUQLSRTPVHWROWKUSRKFSQYEFKVPHGQGFRQZVLRIPICZPCRIKQJMWRQCHEMWDEGMKQTQBAKJRPVJJBOCVNLJROBLQZSFFIGRFPGRWANUHWMVHNKBMVULMKYTOHTBNNLQGYLCJWMQGIMQGGUPHUHJOELOOYZBJAABKDARJRQLIQDQAJRHZVPDWBAWKAJRJPHLULMXXRHQQZPSXFSPGHQCFYALUHDAWNJBAJAGZAYHBMRFMWPYLQOZZQSGJPGWNTVOIQFHNURQWKCSQXNBWKASZYCXTDFCCMXLRCMNHBUDZMDYNVBRWIHBISDHOMLCKGGORYHPORIZWZWHDZDOQBQRWLMUIGOZEWHFQUWKAJIOROUACNJFWUYEGRGKWHVMNRSAFYKCNLNRWLNHRSKTBTQSGYHJXHSTCVVEWTWMDXUYDVCVAMBJGNUWSDLSCURAQAJDSDCEMGVXQFIVOFWEHNGNFONLMIKFPFFDASTPNTMUOARUXEXSFOCEZJDWLFFYADARLCFRFILQMKIGXMOPZHXSYHUZTOKPHZTRCNSXBYGKBKOPUKLEBPVSNWEOXNJWGXERCQLUCBNNPGDOZHXDHHAHBPVCRHLOPPXVJZHZQJZUFVZQTYBTXNAIBVBNHKTWRNUWUHPHXVWFRRTTNOYEVWFQKEGOZHFEJCBHXXBYHLBCVSUKVATIQSWUZLMDHETCFDJFEGTHNYONYNROHPKDDGLHNJIECGZAJTYLXRZHPJOTZUMJIQHLNGTXSZVGNDRBTVYOSRBNZLQJIMEYFUGXQLQRKHBZQFAKHFBJJPTNABKCSCQTLJSAQKMWTPVOHDYMXGQJCTEFFQTRCVDGRNKCDVMQKOOBGZYUYJNRNGXHYEXTSDZGUGKRDVDIAWWPXGISCLWETKELMSGKJWQZPFMOGKEYTZWTKLQQFBRYNBRPVUGNOYSKPAKJLGDRXHWDERMGXAAEWXRBAMUYCMUYNZTMREWPDUMAWNPDBXVTSTAXEUZPOZKZZCPMYVYIVRMEYPHZHEFPHSERFOUJGDCFFPCEQFOPOWTIZSDQQDLLFRSZTUNSKLKSHHCXDIPXKJUJJTXVEQNSYHQPQRNRBWUFDDSOWJVWDMLVTNAPFGEQSKVJXOTREEDVXCHNBZANVCKRQWNGFQFIPKASPEZAGNWSMMOLPLIYCGUWAODAPOBCGSAMISUHCMRYTMNTDPUFYWAGQMMDKKAYGKPMBFBXPLEVJBBCDOJYWMIWOPOCRGPDLOAISZXVRXLREYUZYWYOQVMEDJHUBWYIGKGGEZTPIHUXLKTAVUAEAVZAYAKTMSOQRAMEUBOCHDCYRAEFUKLUUCITUQNHCYVKEFGQNSMXIRLPGTSFKWFTGRZCACZJIDKZQOYPRGTRLIZWDCEGLLQWMANGQHWBKNJDNBUTHPXJFHDHJMBFJKBLFSNASWFOURTMQJGBUEEQWMYVKGHACKGGRJQMKIQFELMBOSYSQHBNWXVLJHSKEDVLTEHSVYRGOVNAKQAOWQSJEALLPNNUHYZZLBNCHXGGZELCCFGZJPVKVEHQIDNUFSPXKPHUEYTDCNFKGQTYERZTCCXIFYMHLKHAQMAATUOSTRPBORQUJHYWEVYLTHLWTTBEAITMPMMZAYESAQXAPWGSNFDPUTDQFAQAJWNFFLGPZORINLKMLIFQMWEVMBTLJBRRUBQULTMKLVOHMPSVHSFJMKQAFJUXRSWCEFBNXSEBWITGGUHEKOOIXQBEEHJUSQGQJMDLOZOJJSOESCUPJKAMATTDZDABDIQFWZDNKFIVAXLYZZUKWCFRUUTUEISSCRRXDRMXQMMWEEKPZIPHSPGIENGEUTVHXCKPOLYKVULUNMQYHLXVSMIGQOWSERCIXKAVRPHIDNPCPGXTOZXIQCAETTZNLJTROEAEQSRCABJKWBJYTQQXTBRQXYCRWZOONOHPEEQGAQYPACWFHISMXNMINEQXSIQDCJJHGVJSCHLMQGCEWIYDCHQRWZETPHGVHFFPHPVFHELSGQUCBCCMMNUJMQRKRKKVBMCIOKTKNEYQYESVUHMXDNMXTEZKTXRYNOVILRFRXPGRPVOZPKVDEYOPHAMPZXATQYENTDPAVYMTLRUKUMWETDWYCKOCZMZDXFJKZMWGNDKTUEQUZNTFFJNVTNUZZVRWEBAQDMOYPNQMRDZJRAMEOMDNVDHHYRJZLJOBKFUHIXVJVBAIFFFAEZGOMPMCBCWPXUQPCMQJDVEEABFZWPLBJYKNHPVEMWTONRGXMAHLQKDYKGZFAJJXSSCSJLAXGMAEPLIIGOLLIWGGMQZFFFVLEGACWPDRSCJBJYDTWNJQLFETMNPMNOOCTNSTYPXMSUQBTIPUIPFEWQQLIZAXANZEAVJUDPNVLKVMLDEDYFRVPMUUPGMZFCADVZPJHCHTISMGYMLINQUQFPETWJEAFSCIUFZCRCHEYODRVVNNTCXFKHQCFODEKBASAJBYLZMOZQIQFGTVGPQSCVHRIOLHWPEOSMSIVPLWOVEJKXUMRTPTHLUEYZBSWXEYKKWPIFXQGPXZXVWOZSRYVXMPEYULSGNJTISIIKQNSIAAQPAWJSUCLVMFUPIMNERIKUFMNUUKHBDIWJCATXZMEVWNSBGUARTAZFURQEGPFXYHMZVFDLLLFHSIMZPYPZEWVBFYTITKELEZFUUICTYIPCZOGINMLOCACTFPCJXYUMYYDAOWQKVAZWRAVJHFOTJRAGYPQSKZYJXYYHXMPVYSWEUSAJNURSFMVHIRJTRTZOYBJPOMSGYXCWJJGCBUZNFZIPQEPDZPFRQFTQHTCBCGBYBABWZLUGNMIDWELHJFDYNTTDRHROBHEAMOASDRIEBIXDDZOLGFYCMQIJXQBRPSEJVTQKUINWHRUEGAYQCUFODEUWWRZQCOSCLSOOBZAZPBFNAWNMWCZFXIICTLQDTPSSDERDABKNDVDAGYCLVXTBAFJLXLSHJKZXDLHNRNJRINHVCEOXCDPAFRYYBXEJRNZBJCROVXZKVGTCIIRVHXTACRSLHNIUCDBCEBGUHYQOAQQOIAVMKYPMRMIZUXXZDMXGDCOXQAAJYEAUOLBDTOQQIWVBJXCZTOPTMOOQTXBSKKKXLGLKTXWIQOMDBBIFTPKCYSLXFVRMFITBPZWTUUFVNKNTMBBMGVRHGPHRXIRARBPABKPBPTIZDIICZXENRWMKHCGRVTJNYVHACZWNBZRDVCBJZYPRDCYQYXRXVMNFAQQWRXOFLBZGBHMBMACYZPVQNDUTJDEEMQSPPETLOZNIYAMQVMYPTJTLHJNBNDOPYGIICSFPIECPHHXNEXAYMPRUQZMZJECBZAVTCOQZPFIRNSBEIODVJJCDCLSBPEXAPIFEZQQXMPSGDNNVJYEUTDRQQYLLUMGDVRXICKIAFVNUBBAEGBTKHAMAVEFXFXOXUUFXBPTJKCEUQWCSQELDXXDBOFSPTJXHFHCKWTCYUQJHROFHSOWVVVSLATXGLSLPOFPVLTZUYORKVGSAWYIEIBFJPVGFTRHASMRGYVHSGQUBQVHCMMBXTSXQJKFOZMKMTUTRPJGSBKIAYQBWVRZIBNXLAFIMYKWPTIETOMUJJLGRCDJOWYWZLQKGIYUOSOKITFPKTIMBNOGAWHHWJNGWHCEOPOOMKWFYKGSEUPYVOHAFGBRZSWJRAPVSTPAYSSJECHIQXQDXGRWIXHMKLUSNQHSUOTHMXSDJTLCVBMOYELYFENFSKNJMHDEMOUFGIJPVZZEJVEXQMVLXFRARMHILTWOWXJUOBOXFNKBFFFQFDKZDQABOQHYEFYGPWUVMRKSFOWBOQXVFZYFAJIJGGNFSDOYGWULLTLEJTJTRQOPKDSRUEHNKQUAHQTUCUNPJIHTWBUCCPTWCUJGKXDFZLCNTXSORGLLIYCHCYPMCMELLQSPCLKVPCYUCSTKLLBTVYGCJZBBHDRPRZFVZSWKFEQMXKZSCUJHCXGUBDQFQKBTASIUNQMDAJLTQXPOXSRGZXFUVMJXRCZQARNOVKHGRPULKFENMQHGADQHGHJYLVRIAFHHGTYBNAMNRXYWLTLXNNPFFORVOOPQCCSCBMSJTYPXIWHVCPQTKTPLOMPSJEJNEKZXWFPIXITOLXNFIMGATEDJJZUDSQNGQTSFEOKUMPYLUIMSCWMNKAWKWXJFFFBDQLVJQUAWFABKDCYSIKRYMHLRRFBPNWPGYKJAJFATDPNENMRWXFMAWPSCLIQPFLHIHLQIXUSWGQUBDODFEBUAKQIQYXKGTOXCARAQEGHWEZQWUMJBXBTVDCLMNPDROSLSAKLYKTDPJDBCFMUJIIBXGHNZMIGNFRWMCOLXVUPEYVODAEMLZAKEEUCLHXGXODGXYRVGNKWKXORMUSRYCBLSQELHHFGVUPGECNYYSIVEEBNNUZPPGLRHYAAIPHQOZLOFEKVWAZMIYWEOBRKAJMTRKRDAGKEKYBFKUBXTFXMMWLQNOPZPGDUBEWBWOTNEJTJSVOLZRAMRNBWUCTGJSFMVGJSCXIGTGXMFGQHRRQPCXOURZJVANHNMFIACEJQFITOVGFUMUZQQMMJLWUWRTXTVCIELEEQMDVHUSJDOIOBPHBWEJMGFODXSRGJGJXYAKIORUZUACGIQKPAOIXIOLOYBYYHWMOVCZWMKZMBKYPCWAZSHCHPTGDEBCBYOMELHLLWILBCBXEKLUFTJMIPZPBVXTFFGHCIRYREJRCNPRPYZXILINHONOJNGWJWQZNXOBJYRJOHAVOMTTQBHCQENBMDWXDSTBLRJCDWRWIGUWUQXDIGNVWJRCRZSBUFXXVISRONJKBPQKRFEHROYBLKXUDHLMJDIRIJRNKEMSWIMSGKTONUTDXEWOKSMHOBMPHEWHBQGLJUNOXAOWRXHEUKGXUPIMXAKPYZKJBXPYEADBLGZJQCCZVPPMGOXVEEWJPNHPXFOJKYMRRJNLAGNEPRXCOPAUVQZZLXFBNELIETRGITCYVXJMNIEZLWCOCZQJPZKEWSSZYAPNZAFNPINMVRCKYSNFBWQWLVVZPKZIMSLTLNUYLMCIUULQKTHOGXKPMLYKOCEBROZOZIFIBDPXJPTUQTMJJOHDCALWIKFHZEPQQZGNTBVYIDBCPAISKLYUZOGQTRABXHONWMAGHQFREUUKKSRPQXYKFDBOFUFYUXFYXSETAKMBHHXJMFAAROSEONCKQANKKSWJNJDXQVQZEYYGFWFCGPUJUYRAQIQVYFLXJCYWGNPCSCUEYNZYVPFUNAIKQINODZVFKUFZDVKNOKJYMACIUAKGQMZCMBJCZDXTSHOCJFXRHOTURMSRQBFOXEPUJDCOILETDIMOTLFMPVERRDHYHWKXHHSXTBXOOCDFKGWRKHHILGNOXZIELBUAIHRNTRTTXTZQNDZNMAAWYTNMCURPWOBRMDQUNXKZYQCSQGEBSZBGJIUZJVGXCOMBCHGWCNJVFSPFLQCGVMAGVNLKLNKHPJOPCWYMSDZRJKXZFWLPDERNVFUNYKHXOICHXQTFBHEKPGDUHMVFFVMUCYXUMYIPGZSJTLKVMZQZLQTUCSAKDARVHYHJIJISGYJJYGIAXMTAYYBVCFEDFSJOPJMRDGUIUWZYBADWJLZZEAJQPKWQHZBQGNBAFYMRXJQEUJZXVSQTUDFXLSROQAOSHPLPMFMCRPCGFOECEQXXCTJTQMYVPBPGZTKJUNOUNDZXBAJFAESCNWKFBVOTAQXRNSSOSYENLJLBBZNAORLRPNLMWRHRAAORPWDIKWGWKSGYMEIUAZCBRZEWHPVDIFFMAJOCHOJOEKVOCPMEIFLUQHPNAXMBPTKOXMWLKVFMENMXBNCHLWQBUSIZEKZOPCIZVWTJYLEAEYRUTPPTKHLPYDMGOWXDAJSLHCRLJGCKEEIZZOIOFXPSAOGSPFWHJLSREUUADIPMBWELNQRKBSMAEKGEBPZMAYJAZIEYYUTSYCPKQXRBXXKDFCTNBQWRYYQNPJKPAGYWKSIFQJQXNUFYMZHGXEIKBVBHMILTVMQUFSQMTJCUHGVOPVDPUAORMJQFQWVOEWGKHSQXFIOQBJBBMRATUNKJKDJJZSKHKZCFUWHSWMISXLYZERFIKCTOHGJBBQMCSFVWFLLWQVOUTBGYBICDCNKDQEGXSSSRDRLZYQSHBMBSTKASGMTXZWVEJEZMEYVYTXHTLBROOMWNQYXQBJDZVGJWPGZYACVJALHHRIOYJKEDNCHVMKXWTPMOYFNAZCQDKBTONUJDJUVKNBZOWJDXRSXXTAKHAWHPGMULZKRRGPXTRKWPQBLVRPHEQSOFHPWQZXQTYDZMTHIEDPVEXIFEFHBJRHSMMAPNALCEAVYVRUFIAHZXBGHLEXGSVEMQFGHCDHBMGYZLBOAFVXDVNGGWKPBSSRJWWLOXUNHBFEGTMHAKWGBVVFHOTOWJYZKHQTSTGYPCNEBRMXDTXSITRMYQXWWWZHZPVWJJYDNLBEPBNXPPIPFGKBSEARGWKUKMJOWFWGBKCTZNHLKWVZTPZSMCXQDGMHHRIZGZGNUDAQRHCWNWRIRFXJIGFPFKNUXGDBFFPBPPMCRLVZWKUKYEXTZOKMDEMWUEQAOSHKNIRJNRFJVAHDFTAKSVCSTTXTFGLKFNLLSZQSRAUOXFDXLDCWXVWJAHQSAWIGATNRKJWLFTMUUVRHJJOWAKEDDVEVOYXAIRSGNKLNXBRYOPOATIKNLQIMHUARXBCDJOCHCWVJZVZBFEDGOHSTAQMNFCFSQNPPMEQWVJZVDVYOFDVFXNNQBIIJLKEJEDCVYODLELACWVKUSYRUTGZXGYVPFEPQVYBEMKVVDZFBIJLPIXTZNFWJRXVDKJZFHONHWWMCZHOUXYZBMJYGGWEXMWZWLSRSDDWAJUJEPWEIIQEHTDATFQDKATUZJHZNCQLAFWHOONUGWTLSJWMLXTKLOWUQPSTFQEIKDCVLUFKUAKKCAMJLHXYPFMXCGNLIDQZZJAWVUHCLATNAUMAMHCEMRWFOUXFKNEVBSAPWMDLAFQITTPLFOHJXKJMUQYMPWWNJMYZVVXQXDAZJOZIYWXEJOYTXXTZLPVTCUOUQDKZTETXGOSLHKZLYXEIBVWBPVYWDSIITAPEURUXROIKXJXHHRDDJJUOWGEEYKSJMRWLFABAHWLXHUKFUYJHXTKEKVPZWKSPTWLKODELDCMORUEVXTBVCEXVLNDOSDKMLHNDGZPBNUQCBHSFQUSJFVPVPSVEVCRUMQXBUXIUASRBIHKKECKYXZLUBFNGBSMMTDSQEVFRRSXASETCZFBDUULGXERFJLQTHYPVZDMWAGCBNAJVISPCFUUJJJARRXRUXFXPGLBJWHXIVVJBYAAMSGAZETIZATODIOKVQZCOMRTEZYTJPIVNLTBCVOXVICPSCUGPEFUMOAQYVERZLBZGACFGQGJEFMERGKRCPUKJBXONSUYQEEFTDHSGDJLTWTPZBAEUKNHHXANLMHNTFVPSVEVCRUMQXBUXIUASRBIHKKECKYXZLUBFNGBSMMTDSQEVFRRSXASETCZFBDUULGXERFJLQTHYPVZDMWAGCBNAJVISPCFUUJJJARRXRUXFXPGLBJWHXIVVJBYAAMSGAZETIZATODIOKVQZCOMRTEZYTJPIVNLTBCVOXVICPSCUGPEFUMOAQYVERZLBZGACFGQGJEFMERGKRCPUKJBXONSUYQEEFTDHSGDJLTWTPZBAEUKNHHXANLMHNTFVXROYAQHXLCRBAHDSYTFRKOFLELQKVEPUPHGIRNTGNKYXPWCOUBDZJNBJAKZOKMCJELDWGIHRDNXVZAWNIZYEJUIKJEFUIGWKOMHXHOGYHKFPJFIGRDAMYSYTUTZHARURNJZDHEIMTQBWBZMWTAZSAQODXWVLXAZYPDYMHPKOWKKHLOTPBEFOGXZKOHSJJPDZJWGCXOTCICHVZYXWIBVGYEHAWHFYYWMCLEGKMMTTJMATTUHXICRLXIOTOHWGNSFIGAEPQTSUAZRIJAUMNTISUCZJAXGVYONBYDYKLPVPIWURKDBHTMLFAYFNZLJDSIQKFKNDOMFMCOZWPODMKKTWKJCROMUYBLOLTXEKCALSOKCITAJPJOCSNTQVYMLGCZDKABYGDUEEMZRHVBQDNVNDNYWANLIEYPZSZIJIYUEUVFSHRZFVAXWKIKMNPCOPXRVXUGBUNTDTTVPKOSUPLFQPJAIKRYZZZBMVXTTODWMUUCXEMTLVTJRHOVNZUUGCBPUXHFBVEQYCQGMQZDDQKYTYJPRBUVVOBWZMOSVNOXOAPEMROSDTYVYFRXGKXPUKNNSSMXAXIXRFOMPLOXJIMXKBRQPVAVQCXBYRVBZBUTRSCNQENUJTDTCOUEYVAROBCSPGRFFBQZBAAFVPHVIIEBVQRSWCOLZTXBONIDFLMFKVTHXGTZVCBFIQWQNCGLWCVKLGBDKWOJDQAJQIKUICLIXRKFWURCZJWWUPKUPEVRDWRZCQX"
key=""

for x in xrange(0,41):
        key+=claves[key_pos[x]]

for i in xrange(0,41):
        pos=diccionario.index(message[i])
        pos2=diccionario.index(key[i])
        pos3=pos-pos2
        if pos3<0:
                pos3=26+pos3
        decrypt+=diccionario[pos3]

print "Message:["+str(len(message))+"]: "+message
print "Key["+str(len(key))+"]: "+key
print "Decrypt["+str(len(decrypt))+"]: "+decrypt

Si lo ejecutamos obtendremos el siguiente resultado:

Message:[41]: CDDCFKWZQGMXEAXETCJSCMRWWNWKLERFRAZGIBRYA
Key[41]: YSKOVGJWMCUEAJTLFYRKMRHKRIIXOYAFAORAOSOWF
Decrypt[41]: ELTOKENDEESTERETOESIQVKMFFONXGRARMIGUJDCV

Y ahí finalmente tenemos el token para este reto.

Huelga decir que no todo fue tan bonito, estando a mil cosas primero mi script se dedicaba a volver a cifrar en lugar de descifrar el mensaje con lo cual no entendía que era lo que estaba haciendo mal, cosas que pasan.

A pesar de que la dificultad del reto pueda no parecer mucha me ha parecido super interesante el utilizar un método criptográfico que no suele verse demasiado en este tipo de pruebas y creo que para gente que no conocía el método y su historia seguramente aprendieron algo nuevo.

Espero ir sacando tiempo para poder ir subiendo más writeups y continuar con la serie de post sobre I2P así como el post sobre OSSEC.

Saludos y gracias por la visita!

Publicado en cripto, ctf, cybercamp | Deja un comentario

I2P Problemas con puertos

Mientras voy escribiendo el post sobre OSSEC y después de ver que la gente tiene ciertos problemas con el tema de los puertos de I2P me he decidido a crear este pequeño post explicando lo que suelen ser los problemas más comunes, alguna anécdota y sus soluciones.

Nota: Aunque I2P aparezca como detrás de un firewall este debería funcionar igualmente pero las prestaciones quedaran severamente reducidas.

A partir de aquí me referiré a la ip de vuestro router I2P como 127.0.0.1 que es la ip por defecto, si tenéis el router en otra máquina recordar cambiar esto.

UPNP

Por defecto I2P intenta utilizar UPNP para redireccionar automáticamente los puertos en el router, esto no siempre es posible, bien porque el ISP no nos permite habilitar UPNP o no tenemos está opción, redes públicas.

Si podéis acceder a vuestro router comprobar si UPNP está habilitado y volver a probar, como cada router es un mundo no puedo explicaros como hacer esto.

Podéis comprobar el estado de UPNP en I2P en el link:

http://127.0.0.1:7657/peers#upnp

Redirección manual

En caso de que UPNP no sea una opción, bien porque vuestro router no lo permite o bien seáis unos paranoicos que no queréis programas abriendo puertos en vuestro router (me incluyo), tenéis la opción de redirigir los puertos necesarios manualmente en vuestro router.

Para deshabilitar UPNP (ya que no lo vamos a usar) y configurar los puertos que I2P utilizará nos dirigimos a:

http://127.0.0.1:7657/confignet

Como veréis la primera opción ya nos permite deshabilitar UPNP y si seguimos bajando nos encontraremos las secciones para los puertos UDP y TCP.

Por defecto I2P utiliza el puerto UDP 29622 y el TCP esta configurado para utilizar el mismo. Según vuestro nivel de paranoia podéis configurar esto a vuestro gusto.

Una vez hechos los cambios que queramos, guardamos y nos vamos a nuestro router. Otra vez siento deciros que no os puedo explicar como hacer la redirección manual pero usualmente aparece como «Port Fordwarding».

Es importante que recordéis que se utiliza un puerto UDP y otro TCP, para poder disfrutar al completo de I2P necesitareis ambos abiertos.

Testeando puertos

Si ya habéis echo lo anterior podéis utilizar alguno de los websites que hay en internet que comprueban si tenéis el puerto que le digáis abierto, pero como estamos en nivel de paranoia bastante alto siempre será mas recomendable hacerlo nosotros mismos utilizando nmap por ejemplo.

VPN

En caso de que dispongais de vuestra propia VPN (por desgracia las vpn’s públicas no suelen permitirnos andar jugando con puertos) podríais intentar «saltaros» el firewall local (esto lo explicaré en un post futuro) y salir a través de vuestra vpn.

Notar que en este caso es mucho mejor que directamente tengáis vuestro router en el mismo servidor que la VPN si es posible y simplemente apuntar vuestro dispositivo a la dirección de vuestro router en la VPN.

La gente de Hackerñol ha hecho un video explicando como montar este último punto:

Video en Español:

Multiples routers

En el subreddit de I2p (/r/i2p) hace poco estuve ayudando a un  usuario que a pesar de probar mil cosas no conseguíamos que le desapareciese el dichoso mensaje del firewall.

Pues bien, resulto que el hombre tenía su propio router y conectado a este el router de su ISP, pero en lugar de tenerlo en modo modem o con DMZ, simplemente los tenia uno detrás del otro.

El problema era que tanto al hacer la redirección manual como por UPNP esto solo ocurría en su router pero el router del ISP le seguía bloqueando los puertos.

En este caso (no sé con cual se quedo finalmente) tenía dos opciones, o configurar su router como DMZ en el router del ISP y que todo el tráfico le llegara directamente; o redireccionar los puertos en ambos routers: del router del ISP a su router y de su router a su PC.

Por el momento estas son todas las opciones que se me han ocurrido y que suelen ser las más habituales, en caso de que haya dudas, sepáis de otros casos, etc, etc simplemente hacérmelo saber y con gusto os ayudare y actualizaré el post.

Saludos!

Publicado en i2p | Deja un comentario

Retroshare sobre I2P

AVISO: Es post está basado en mi opinión personal, no intento vender nada, y no estoy relacionado con ninguno de los dos proyectos de ninguna manera.

Hace tiempo que no público nada y es que he estado algo ocupado cambiando el blog de servidor y probando algunas cosas como OSSEC de las cuales os hablaré en futuros post.

Hoy os traigo un post que combina dos softwares que hace tiempo que me gustan pero que realmente no había tenido muchas oportunidades de darles un uso fuera de simples test. Estos son I2P y Retroshare.

Ninguno de los dos es tan conocido como Tor u otras alternativas que hemos podido ver incluso en TV así que por desgracia la cantidad de ayuda que hay en internet es bastante limitada. El objetivo de este post es, precisamente, intentar ayudar a darlos a conocer un poco más.

Pero, ¿Que ventajas tiene complicarnos con todo esto?

 

¿A nivel funcional? Ninguna. Al contrario, vamos a obtener servicios que ya utilizamos a diario pero que probablemente sean más lentos y tengan mayores downtime.

Lo que realmente ganamos es en privacidad. I2P provee la primera capa de anonimato ayudándonos a ocultar nuestra IP y Retroshare nos ofrece diversos servicios descentralizados.

Lo que hace a Retroshare tan interesante es su modelo descentralizado en el que no existen servidores a los que conectarse para obtener los distintos servicios, en cambio, dichos servicios funcionan de forma segura entre los distintos nodos conectados entre si.

Para poder conectar dos nodos se debe realizar un intercambio de claves, al mas puro estilo GPG, con lo cual ambos usuarios permiten al otro conectarse a su nodo. Da igual que tu añadas a alguien, si la otra persona no te añade la conexión no existirá.

El principal problema de este método es que dentro de dichas claves va incluida nuestra IP pública la cual Retroshare necesita para poder saber donde esa nuestro nodo y poder llegar a él. Está fue la principal razón por la que deje de usar Retroshare, a pesar de estar basado en anillos de confianza no me acababa de convencer la idea de que me ip apareciese de esta manera.

En la versión 0.6 Retroshare incluye la posibilidad de correr nodos ocultos con integración en TOR e I2P, gracias a esto en lugar de utilizar nuestra IP se utilizan direcciones onion o i2p respectivamente.

Tengo que explicar también que si corremos el nodo de esta manera los nodos normales solamente llegaran a nosotros si tienen configurada una salida a las susodichas redes. Aún no he podido testear esto del todo por falta de nodos dentro y fuera de las mimas pero, con una red mínima de dos nodos, mi cliente normal no es capaz de ver el oculto y viceversa.

La idea entonces es tener diversos servicios (mensajería, chat, intercambio de archivos, etc) que no dependen de servidores centrales (nuestra información va directa al otro nodo) y que no revelen ni necesiten nuestra IP pública (uso de las direcciones I2P).

Como por suerte si que existe bastante información sobre como instalar ambos softwares me voy a saltar ese paso, únicamente si utilizas Debian 8 os recomiendo instalar Retroshare utilizando el paquete que tienen disponible en github o si os lo queréis compilar revisar en issues un ticket abierto por mi ya que las dependencias de la wiki están desactualizadas. Si intentas utilizar el repositorio os aparecerá un error de que hay una dependencia que no se cumple, también esta reportado y lo van a solucionar pero por el momento hace inviable este método para instalar Retroshare.

Una vez tengamos I2P funcionando y nuestro perfil creado en Retroshare pongámonos manos a la obra.

Comenzaremos configurando los túneles necesarios en I2P para que Retroshare ya tenga todo lo que necesita cuando configuremos el nodo oculto.

Para esto nos dirigiremos a nuestro router a la sección de «Túneles Locales», si tenéis I2P en local será: http://127.0.0.1:7657/i2ptunnelmgr

Aprovecho que los pasos, aunque algo escondidos, están muy bien explicados en Retroshare:

Asistente de túnel -> Cliente de túnel -> SOCKS 4/4a/5 -> introduzca un nombre -> deje ‘Outproxies’ vacío -> introduzca el puerto (¡memorice!) [puede que también quiera establecer la alcanzabilidad en 127.0.0.1] -> marque ‘Auto-iniciar’ -> ¡finalizado!

A no ser que queráis utilizar otro puerto tanto I2P como Retroshare traen por defecto configurado el 4447.

Este será el túnel que nos dará salida a la red de I2P y el resto de nodos, ahora vamos con el túnel para poder recibir entradas.

En la misma sección del túnel hacemos:

Asistente de túneles -> Servidor de túneles -> Estándar -> introduzca un nombre -> introduzca la dirección y puerto que su RS va a usar (vea arriba Dirección Local) -> marque ‘Auto-iniciar’ -> ¡finalizado!

Al igual que en el anterior caso el puerto que ambos programas usan por defecto es el mismo, 44321, así que si no queréis cambiarlo podemos dejarlo tal cual.

Una vez este túnel este iniciado, en «Túneles Locales», veremos que aparece una dirección base32 de i2p que será la que utilizaremos en nuestro nodo oculto.

Ahora nos vamos a Retroshare y en la primera ventana donde escogemos con que perfil conectarnos hacemos click en «Administrar perfiles y nodos» y nos aparece la siguiente ventana:

nuevo-nodo

Seleccionaremos «Opciones avanzadas» y «Crear un nodo oculto» cuando nos aparezca.

Como veis nos pide que identifiquemos el nodo con un nombre y la dirección oculta que sera la que nos guardamos antes en I2P al crear el túnel de entrada.

Una vez dentro del nuevo nodo nos vamos a la sección de «Red» dentro de «Opciones»:

red-principal

Aquí podemos ver como el nodo está efectivamente corriendo en modo oculto, en la pestaña de «Configuración de servicio oculto» tenemos más datos:

servicio-oculto

En la primera sección podemos ver que, en el caso de mi nodo, Retroshare tiene salida a la red I2P pero no a la red de TOR; hasta donde yo sé no habría ningún problema en tener cualquier tipo de nodo conectado a ambas redes, simplemente esto dará acceso a los nodos en dichas redes. En este caso queremos un nodo que solo funcione dentro de I2P así que nos llegaría con tener a I2P en verde.

En la siguiente sección nos encontramos con la configuración de entrada, como aún estoy haciendo pruebas he borrado la dirección de I2P de este nodo, si hacemos click en «Prueba» Retroshare intentará establecer una conexión a través de I2P contra nuestro nodo como si fuese otro cualquiera para ver que todo está bien, si hay luz verde como en la imagen, todo está perfecto.

Ahora solo queda intercambiar claves con vuestros amigos utilizando ahora vuestra dirección de I2P en lugar de la IP pública y empezar a disfrutar de Retroshare.

Como podéis ver en las imágenes el propio Retroshare os indica que pasos seguir para configurar todo, realmente no os he contado nada que no pudieseis haber encontrado vosotros mismos, pero me pareció que quizás está información está un poco escondida y para alguien que no sepa donde mirar (como fue mi caso) te puede llevar a algunos quebraderos de cabeza.

Espero os haya gustado y la gente se anime a utilizar más tanto I2P como Retroshare, ambos proyectos me parecen muy interesantes pero debido quizás a que pueden resultar un tanto complejos de utilizar no parecen tener mucha acogida por los usuarios. Esperemos que esto cambie y la gente se anime a utilizar este tipo de alternativas.

Me gustaría dejaros aquí mi clave del nodo de pruebas que tengo en I2P para que podáis probarlo pero precisamente hablando de privacidad no me termino de fiar de postearla aquí directamente, si alguno está interesado podéis dejarme un comentario e intercambiamos claves.

Saludos y gracias por vuestra visita.

Publicado en i2p, retroshare | 4 comentarios

Trivial por red con Docker y Python

Durante MundoHackerDay una de las pruebas de miscelaneos que presentamos fue un pequeño trivial en el cual los participantes debían obtener una cantidad determinada de respuestas correctas para obtener la flag.

Esta idea surgió a raíz del trivial realizado en el CTF de Pragyan donde tenías que contestar 50 preguntas aleatorias sobre la india. En ese caso a los jugadores se les asignaban 50 preguntas concretas con lo cual podías ir haciendo prueba y error, yo decidí ser un poco malo y el set de preguntas se realiza de forma aleatoria.

Antes de que nadie se piense que fui un ogro decir que fuimos un poco «vagos» ya que solo redactamos 15 preguntas y había que contestar bien 10; así que tan malo no fui jeje

Podéis obtener la imagen directamente de https://hub.docker.com/r/kalrong/trivial/ haciendo simplemente:

docker pull kalrong/trivial

En el caso de que prefirais probarlo en local o ver los sources podéis dirigiros al repositorio de github donde lo tengo alojado y sobre el que se ejecuta el build automáticamente en hub.docker: https://github.com/KALRONG/trivial

En el caso de docker debéis recordar mapear el puerto del container en caso de que queráis dar acceso a otros.

Esta es la ayuda del trivial:

usage: trivial.py [-h] [-p PORT] [-q QUESTIONS] [-l LOG] [-f FLAG]
                  [-a ANSWERS]

optional arguments:
  -h, --help            show this help message and exit
  -p PORT, --port PORT  Specify which port to be used. Default: 8100
  -q QUESTIONS, --questions QUESTIONS
                        File containing the questions for the trivial.
                        Default: /root/questions
  -l LOG, --log LOG     Folder where the logs will be saved. Defauld: ./log/
  -f FLAG, --flag FLAG  Flag given at the end of the game to the winners.
                        Default: flag{Tr1v14L-RuL3z}
  -a ANSWERS, --answers ANSWERS
                        Number of correct answers before the flag is given.
                        Default: 1

Tanto la imagen de docker como el repositorio contienen un archivo con una pregunta de ejemplo para que podáis probarlo. En el caso de que lo corráis directamente en vuestra máquina notar que por defecto la ruta al archivo de preguntas está en /root , esto lo puse así para no complicarme mucho en docker.

Como podéis ver en la ayuda el trivial es bastante configurable, podéis cambiar el puerto, el path de los logs, del archivo de preguntas, las flag, etc

Por el momento no he tenido tiempo de añadir una opción para modificar cuan verbose es el server ya que actualmente os dará información en tiempo real por la shell así como creara un archivo de log por cada ip. La idea es poder controlar que está haciendo la gente y ver si hay problemas al contestar ciertas preguntas o, en el peor de los casos, bloquear a alguien.

Espero os guste esta pequeña tool y no olvidéis dejarme vuestras sugerencias, preguntas y problemas que encontréis, serán bienvenidas.

Nos vemos!

Publicado en docker, python, tools | Deja un comentario

Como instalar Kali Nethunter en Nexus y OnePlusOne

Ya de vuelta del Mundo Hacker Day 2016 toca continuar con el blog, gracias a la gente de StackOverflow que me han prestado un OnePlusOne (aka OPO) he tenido la oportunidad de jugar un poco con la Kali Nethunter, un mod para Android/CM de la gente de Offensive Security que convierte tu dispositivo en una herramienta portátil de pentesting.

Dispositivo Versión de Android Notas
Nexus 4 (mako) 5.1.1
CM 13.0
Nexus 5 (hammerhead) 5.1.1 or 6.0.1
CM 13.0
Nexus 5x (bullhead) 6.0.1
Nexus 6 (shamu) 5.1.1 or 6.0.1
Nexus 6P (angler) 6.0.1
Nexus 7 2012 (grouper) 5.1.1
Nexus 7 2013 (flo) 5.1.1 or 6.0.1
CM 13.0
Nexus 9 (flounder) 5.1.1 or 6.0.1
Nexus 10 (manta) 5.1.1
OnePlus One (oneplus1) CM 12.1 or 13.0 Recomendado
OnePlus Two (oneplus2) CM 12.1 or 13.0
OnePlus X (oneplusx) CM 13.0
LG G5 (h830, h850) 6.0.1
Galaxy Note 3 (hlte) CM 12.1 or 13.0
TouchWiz 5.0
Galaxy S5 (klte) CM 12.1 or 13.0
TouchWiz 5.1 or 6.0
SHIELD tablet (shieldtablet)
SHIELD tablet K1
6.0.1
CM 13.0

En esta tabla podéis ver los distintos dispositivos y las versiones del SO que soporta Nethunter, como una de las cosas que toca nethunter es el kernel lo hace bastante complicado de portar a otros dispositivos, en mi caso estoy mirando de portarlo a mi BQ M5.5 pero no sé cuánto éxito tendré.

Obtener Nethunter

El primer paso será obtener Nethunter para nuestro dispositivo, aquí tenemos dos opciones, o bien bajarnos la ultima build de aquí o compilando en nuestro equipo.

Para este post os explicaré los pasos utilizando la última build que ya viene lista para Nexus y OPO. La parte del build la dejaré para más adelante para cuando consiga hacer el port al BQ.

Preparar el dispositivo

Una vez tenemos Nethunter el siguiente paso será prepararnos para la instalación.

Debemos desbloquear el teléfono y asegurarnos de que tenemos instalada la versión correspondiente según la tabla del inicio del post.

Para desbloquear el teléfono utilizamos los siguientes comandos (doy por hecho que tienes acceso al dispositivo por adb):

#Reiniciamos en modo fastboot
adb reboot bootloader
#Comprobamos que le dispositivo esta en fastboot
fastboot devices
#Desploqueamos el dispositivo
fastboot oem unlock
#Reiniciamos
fastboot reboot

Si todo ha ido bien ya tendremos el dispositivo listo para seguir.

Opcional: Instalar TWRP y SuperSu para hacer una instalación manual.

Instalar Nethunter

Aquí tenemos dos métodos de instalación, a mano y automática. Después de varios intentos al final me decanté por la instalación automática.

En caso de que queráis hacer la instalación manual deberéis cumplir los requisitos opcionales arriba mencionados y simplemente instalar el ZIP desde TWRP.

Aunque existe un método de instalación desde Windows no hablaré del mismo ya que no he tenido la oportunidad de probarlo y no quiero daros falsas pistas.

La instalación con Linux es bastante sencilla, primero clonamos el NetHunter Linux Root Toolkit con git.

git clone https://github.com/offensive-security/nethunter-LRT

Aquí tenemos todos los scripts necesarios para la instalación pero no los binarios que necesitan:

  1. Si queréis utilizar estos scripts para también volver a Stock o una versión compatible necesitáis bajaros el ZIP y colocarlo en la carpeta stockImage/.
  2. Descargarnos TWRP de su web y colocarlo en twrpImage/.
  3. Descargarnos SuperSu desde el post de XDA y colocarlo en superSu/.

En caso de que queráis utilizar estos scripts para volver a Stock o la versión compatible existen dos script dependiendo de si tenéis un Nexus o un OPO , ambos borraran todo lo que tenéis en el dispositivo.

  • stockNexusFlash.sh : Para dispositivos Nexus.
  • stockOpoFlash.sh : Para dispositivos OPO, notar que este script necesita un argumento, 16gb o 64gb, según el modelo que tengáis.

Una vez listo para instalar simplemente ejecutamos el siguiente script, y si todo está bien, el script nos irá indicando que pasos se están ejecutando y veremos trabajar a nuestro dispositivo.

./twrpFlash.sh

Si todo ha ido bien cuando el dispositivo se reinicie veréis la animación de inicio de Nethunter y estaréis listos para utilizarlo.

Espero os haya gustado este post y os sirva de ayuda, en post venideros intentaré mostraros varias de las utilidades que vienen con Nethunter. Para cualquier problema o corrección dejad un comentario y gratamente os ayudaré.

Saludos!

Referencias: https://github.com/offensive-security/kali-nethunter/wiki

Publicado en nethunter | Deja un comentario

Docker, una «pequeña» introducción

Últimamente he estado jugado bastante con Docker, es más, este blog en el que estáis corre en el mismo, pero, ¿Que es Docker?

Docker es un software que nos permite correr contenedores (pensad en ellos como VM’s por el momento) de una manera muy sencilla, ligera y rápida.

En la anterior frase os digo que penséis en un contenedor como en una VM, realmente no es exactamente así. Una VM contiene un OS entero con todo lo que este requiere para arrancar como si fuese una máquina física, esto suele provocar que el uso de disco de las VM se dispare desde el comienzo (si, ya sé que puedes hacer una instalación super light que no llegue al Gb). En el caso de docker los contenedores solamente contienen los archivos (binarios, librerías, etc, etc) necesarios para funcionar ya que el kernel es compartido con el Host.

Además Docker elimina el hipervisor lo que lo hace mucho más ligero, y algo que a mi me ha encantado, se puede utilizar dentro de una VM (solo Linux, Windows tiene una limitación que explicare más adelante).

Y ¿que significa todo esto?, pues para poneros un ejemplo real, esto es lo que ocupa este blog actualmente en mi Docker:

# docker ps -s
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES                   SIZE
553c6bf413f1        wordpress           "/entrypoint.sh apach"   39 hours ago        Up 15 hours         0.0.0.0:8080->80/tcp   wordpress_wordpress_1   71.75 MB (virtual 592.3 MB)
c828665d7494        mariadb             "/docker-entrypoint.s"   39 hours ago        Up 39 hours         3306/tcp               wordpress_db_1          2 B (virtual 387.5 MB)

Como podéis ver utilizo dos containers, uno para el wordpress (apache, php, etc) y otro para mariadb, y creo que la columna SIZE habla por si sola.

Aprovechando la oportunidad os voy a explicar las distintas columnas para que podais entender un poco mejor los componentes de Docker.

CONTAINER ID

Este es el ID que Docker le asigna al contenedor y que podemos utilizar para referirnos a el de forma única.

IMAGE

Imagen base que se utilizó para crear el contenedor. Una imagen se podría considerar la template del contenedor, esta contiene los elementos básicos ya instalados para funcionar. Una vez creado el contenedor podremos modificar lo que gustemos, tener en cuenta que la imagen en si no se modifica, los cambios realizados solo se aplican al contenedor unicamente. En este caso la imagen de wordpress contiene una instalación de worpress lista para usar e incluye un servidor apache, si quisiera levantar un wordpress distintio a este simplemente utilizaría la misma imagen para crear un nuevo contenedor y empezaría desde 0.

COMMAND

Este es el comando que se ejecuta al iniciar el contenedor, en este caso un script que se encarga de arrancar los servicios necesarios.

CREATED & STATUS

Hace cuanto se creó y lleva corriendo el contenedor.

PORTS

Por defecto Docker genera una red virtual, muy parecida a la host-only de VBox, con la cual solo se puede acceder a los puertos del contenedor de forma local o desde otros contenedores. En el caso del contenedor de wordpress existe un mapeo al puerto 80 del contenedor desde el 8080 del Host lo que significa que si nos conectamos al 8080 del Host nos contestara el puerto 80 del contenedor pero, en el contenedor de mariadb, el puerto 3306 no esta mapeado así que solo podrá ser accesible desde local o, en este caso, por el contenedor de wordpress.

NAMES

Además del ID los contenedores también pueden ser referenciados por un nombre, si este no se especifica al crear el contenedor Docker le asignara uno aleatorio formado por dos palabras, algunos pueden ser muy divertidos.

 

Otra de las cosas que ha hecho que me enamore de docker es la rapidez de despliegue, levantar un contenedor apenas si lleva unos segundos, solamente la primera vez puede tardar más si no tenéis la imagen ya descargada.

Un ejemplo de uso de docker puede una imagen de metasploit y otra de openvas que he creado y que me permiten correr dichas aplicaciones sin necesidad de instalar nada más que Docker en el Host ya que todas las dependencias están en dichas imagenes. De esta manera si en un momento dado necesito metasploit simplemente levanto un contenedor con dicha imagen y ya podría utilizarlo directamente.

Otra opción que tiene Docker es la de crear un Swarm, una especie de cluster, utilizando distintas máquinas y manejar lo desde una misma máquina. De esta manera los contenedores se ejecutaran en las distintas máquinas sea la que nosotros le especificamos, sea la que Docker decida. El único inconveniente del Swarm es que los puertos se mapean a la máquina en la que se ejecuta con lo cual si corremos un contenedor en una máquina remota tendremos que conectar al puerto en dicha maquina. Sobre Swarm hablaré en futuros post y os explicaré como montar uno simple.

Espero os haya gustado esta «pequeña» introducción a Docker, si queréis leer más os podéis dirigir a su web (en inglés): https://www.docker.com

Publicado en docker | 1 comentario

CTF Mugardos 2015 Writeup – Forensic

Enunciado:

Esta maldita imagen 100 points

Se que la he dejado en algún sitio, pero dónde..

Fichero para la prueba: https://mega.nz/#!YcBw2A4K!jUqgKnf5YZhmjZtpNEH7jM3h2rQ4KyvrOiBaLYmdWys

Formato de la clave
– SHA256 de la clave
– Sin espacios
– Mayúsculas, minúsculas, números y caracteres especiales tal y como aparece en el fichero de la prueba

Solución:

En esta prueba se nos pide descargarnos un archivo tar.gz que contiene el archivo image.raw.

File nos devuelve la siguiente información:

forensic1

Parece ser que es una imagen de un disco, el siguiente paso será ver que dice fdisk al respecto:

forensic2

Parece que casi todo es swap y tenemos una particion de 500Mb en formato ZFS. El problema es que ZFS no permite file I/O así que no podemos montarla directamente, primero, debemos utilizar losetup para montarla y que zfs la pueda reconocer.

Para poder hacer esto tenemos que calcular el offset de dicha partición, sabiendo que los bloques son de 512 bytes y que la partición comienza en 4194432:

512 * 4194432 = 2147549184

Una vez conocido el offset ejecutaremos losetup de la siguiente manera:

forensic3

Para realizar los siguientes pasos necesitareis tener instalador y cargados los modulos de ZFS. En mi caso tuve ciertos problemas de versiones ya que la utilizada para la prueba era más nueva que la de los repositorios con lo cual tuve que compilar los módulos desde los sources.

Utilizamos zpool para importar la pool de ZFS:

forensic4

Zpool nos avisa de que la pool fue usada en otro sistema previamente con lo cual tenemos que forzar con la opcion -f la importación y además utilizar el nombre de la misma (Mugar2x3); y confirmamos con zfs que la pool esta importada:

forensic5

Con esto la partición ya debería de estar montada en el root de nuestro sistema bajo la carpeta Mugar2x3. En caso de que no fuera así se podría montar utilizando el siguiente comando:

zfs mount Mugar2x3

Veremos que esta solo contiene varias subcarpetas y un monton de archivos con el famoso “Lorem ipsum”, pero ninguna imágen que es lo que nos piden en el reto.

ZFS tiene la capacidad de generar spanpshots para poder recuperar estados pasados del sistema de archivos, echamos un vistazo y efectivamente comprobamos que existen varios de los mismos:

forensic6

Los snapshots aparecen ordenados de más antiguo a más nuevo, en caso de que nos pasemos debemos destruir e importar la pool de nuevo.

En este caso la que parecia la mejor opción para comenzar era el snapshot 3 por el tamaño, así que procedemos a hacer rollback al mismo:

forensic7

Como seguimos teniendo un montón de archivos de por medio utilice el comando file para localizar   la imagen:

forensic8

Abrimos el archivo y voila:

forensic9

Calculamos el SHA256 y ya tenemos la prueba superada.

Publicado en ctf, writeups | Deja un comentario

CTF Mugardos 2015 Writeup – Stego200

Enunciado:

AM 200 points

Ahora en serio, cuando se trata de escuchar música, nada como lo que ponen en la radio. ¿O no?.
A lo mejor somos muy nostálgicos

Formato de la clave:
– Mayúsculas y minúsculas como están en la prueba
– Sin espacios

Solución:

En esta prueba se nos presenta un archivo ogg, ha simple vista nada raro. Vemos a comenzar abriéndolo con Audacity:

estego1

Vemos que las primeras pistas son la canción original pero hay una tercera pista, vamos a extraerla y abrirla en Sonic Visualiser, programa que me ha ayudado muchas veces con el típico texto oculto en audio gracias a sus capas:

stego3

Por costumbre he añadido la capa de espectrograma por si había algún texto en claro y porque se me hace más agradable a la vista, en este caso no hay texto oculto pero podemos ver que la pista contiene audio en una parte determinada.

Después de darle muchas vueltas y hacer varias pruebas sobre todo con software orientado a weatherfax que ya habíamos visto en otras pruebas decidí probar suerte con SSTV. Para ello reproduciremos el archivo con paplay mientras ponemos a escuchar QSSTV, tened en cuenta que tendréis que redirigir la salida de audio a la entrada para que QSSTV la reciba, en mi causo usando pulseaudio lo configure utilizando pavucontrol, en la sección de entrada y en las interfaces en modo monitor.

Aquí podemos ver como QSSTV ha reconocido la señal como SSTV en modo Scottie 1 y ya nos empieza a mostrar el resultado.

stego4

Cuando el archivo termina de reproducirse este es el resultado:

stego5

Calculamos el SHA256 del string “IWannaKnowPulpoKey” y obtenemos la flag de la prueba.

Publicado en ctf, writeups | Deja un comentario