Write up Lehack 2019
Admin me if you (Beginner 5 points)
You don't really need
Il s'agit d'un formulaire HTTP simple
En analysant le code source, on y remarque un compte "test" et un champ hidden "isAdmin" à 0
En se connectant et en changeant le champ "0" à "true" nous gagnons l'accès au flag admin
Flag : lh2019_{sohCha0thae9Yi1h}
Mention spécial à Jeremy qui l'a flag rapidement (en testant "true" au lieu de "True" ou "1")
Double Cesar (Beginner 5 points)
Un ami m'a posé un challenge sur IRC. Il a d'après lui créé un algorithme de chiffrement super dur à casser, basé sur deux chiffres de césar d'affilée. Il m'a en effet expliqué que ça a pu être cassé uniquement parce que Jules César n'avait pas pensé à en mettre plusieurs à la suite. Bref, il m'a envoyé ça : "oqemdradftqiuzfdabradf" et m'a dit "vas y tu trouveras pas ce que j'ai mis". Et j'avoue que faire toutes les combinaisons de deux chiffres de césar me paraît trop compliqué. Peux-tu m'aider à cracker son code?
Il s'agit d'une chaine en ROT "cesar", si on le décode :
Flag : CESARFORTHEWINTROPFORT
Mention spécial à cuilere_a_soupe qui l'a résolu
My First Crackme (Beginner 5 points)
Tu dois trouver le mot de passe qui valide le script python!
Ici nous avons un python avec un flag qui subit de l'inversion, encodage et autre magie noir
#!/usr/bin/env python3
flag = 'repuS'[::(-1 * 88 + 87 * 0 * 183 + 80 + 0 * 125 + 7)] + chr(0 * 161 + 1 * 0 * 140 + 76 + 0 * 72 + 7) + chr(-26 + 0 * 53 + 0 * 5 * 44 + 26 + 0 * 141 + 101) + chr(0 * 153 + 14 * 0 * 152 + 4 + 1 * 94 + 1) + ('FfdkCtfr'[::-1]).replace('f','e').replace(chr(4 * 26 + 3), chr(0 * 142 + 111)) + 'fzfqfQorTheWinjkildzodzp'[6:14]
print(flag)
pass1 = input(' :essap ed tom ertov rertne zelliuev'[::-1])
if pass1 == flag:
print('Bien joue, tu as trouve le flag!')
else:
print ('Loupe... essaye encore!')
En rajoutant la ligne print(flag) à la fin
./checkme.py
veuillez entrer votre mot de passe: L0L
Loupe... essaye encore!
SuperSecretCodeForTheWin
Flag : SuperSecretCodeForTheWin
Mention spécial à cette truanderie !
Infiltrez la mafia! (Beginner 5 points)
Vous faites partie d'un groupe de hackers qui cherche à démanteler un groupe nommé "Mafia cybersecrète". Il est en effet hors de question de les laisser agir à leur guise! Parmi les documents que vous avez pu récupérés à propos de ce groupe, vous disposez du document ci-joint. Saurez-vous retrouver le mot de passe de l'utilisateur?
Un PDF est fournit avec les champs cachés
Avec un CTRL+A les champs aparaissent
Flag : CyberSecretJMenin
Mention spécial à françois qui a truander pour flaguer et à theforester qui est partit dans une analyse poussée du PDF ! :D
My first network analysis (Beginner 5 Points)
Trouvez le mot de passe de l'utilisateur dans la capture suivante!
Une capture réseau contenant du trafic FTP est fournit, en analysant la trame :
Le mot de passe est évidemment en clair
FLAG : HuHuFTPnosecure
Au service de la france #1 (Crypto 30 Points)
Contexte ci-dessous
Vous êtes Jean-Michel, barbouze aguerrie de notre cher Pays. Vu que vous n'êtes pas très doué en langues étrangères, vous vous êtes spécialisé en informatique. Vous êtes devenu le Kev (Mitnick, pas Adams) de l'agence, et aujourd'hui le travail hardu, c'est pour vous...
a propos
Ce challenge est le premier d'une série de quatre challenges, qui vous permettra de récupérer suffisamment d'information pour contrer une attaque russe contre la France! Chaque challenge peut se faire de manière indépendante. Cependant, pour inciter les gens à réaliser les challenges dans l'ordre, chaque résolution du challenge numéro N vous donnera un indice pour résoudre le challenge N+1.
disclaimer
Ce challenge est une pure fiction. Toute ressemblance avec des gens et/ou entités a pour but d'apporter un peu plus de réalisme avec une dose d'humour(troll) au challenges principalement basé sur les ragots. Aucune atteinte à ces personnes/entités n'a donc été voulue, et l'auteur s'excuse par avance.
challenge
Le téléphone sonne de manière répétée depuis 10 minutes... Pourtant, il est 5h du matin, vous êtes encore complètement grisé du pot de départ de la veille... Après s'être levé et décrocher le combiné, moment qui vous a paru être une éternité, vous entendez une voix robotique : "- Bon..jour mon..sieur Hulot. Le pi..geon a de..co..llé." Pas le temps de dire "allo?" que ça a raccroché... Cependant, vous savez de qui il s'agit, c'est votre employeur! et ce genre de message ça signifie pas bon... Vous enfilez votre peignoir, et ouvrez votre boîte mail anonymisée gmail. Dedans, vous trouvez le message suivant:
''' To: jeanmichel78@gmail.com From: juliettedu38@gmail.com Objet: Hey cousin, vas mater ma nouvelle vidéo!
Salut cousin,
j'ai sorti une nouvelle vidéo. Faudrait vraiment que tu la regarde!
je te fais plein de bisous Juliette
Comme tu m'a appris la dernière fois qu'on s'est vu, ma signature pour dire que c'est bien moi! :
PT09PT09PSBCRUdJTiBFTkNSWVBURUQgUExBWUZBSVIgTUVTU0FHRSBJRDo4MzM1ODQ0ODQwODcxMDkyODcxMSAgICAgPT09PT09PQ0KDQpSWVBYVkZOUFZYRUFWQ1pJVkJESFRaVkJET0FWREhDRlJYWEZQQ1RNVFZSTUdCRVZaUlRLQ0FXSE5QQ1RaSENGVENUTVRWTFRUVkVBWUJWSVNGR0NDQU9FVkVLVlJaTlBTWVpTQ0VOVFFUQ1RUQ1JaUEdDWUtQUlpOVEZaUEdCS1lCSUJQTkhaTlpFR1BDRUFVWlFJRUFUTFlCREhUQ0NCS0hWVFlCVkVUTFpHVFZUVlRDWllXSEdQVFJUQ0NBQ0lWRUtWRVBFS1pUWUdHWFRTWEZQQ0VBS09DWUhWTFNFR0tWVE1ESFpPVkVESFFWT1RFVldIS1BWQ0NUUkVWVEdFWk5QTlBDRUFMU1FZQkdUVkZaQ1BWQ1NFTlBHREVYVE5FUFpHTlROUkVBSUJRSUhCRE9BVkRIQ1NESEFWT1RQTlFUSUhaU1hGUENJUFNRUEVSU0VBSUJUVkJGSVBUVlNWUEVFUEtFSFhTUVNST0RCS1BJR0RBTVNOVExaR1RWS1ZWWFBRRVBaRlZRREhBTVJOVkNPVElCS05IU05MRVZWQ0lCSVBCS1FJSFpUVkJGSVBUVkFRVkVUTFpHVFZHWktQWFRCVFBLSUJFQVhHS1RFQVVaUENDRlRTVFBaRkFRQ1RHRVBFS0VGWVFNS1JLSQ0KDQo9PT09PT09PT09PT09PT09PT09PT09RU5EIE1FU1NBR0U9PT09PT09PT09PT09PT09PT09PT09PQ==
encore des bisous! '''
Un base64 est fournit dans l’énoncé, si on le décode :
base64 -d base64.txt
======= BEGIN ENCRYPTED PLAYFAIR MESSAGE ID:83358448408710928711 =======
RYPXVFNPVXEAVCZIVBDHTZVBDOAVDHCFRXXFPCTMTVRMGBEVZRTKCAWHNPCTZHCFTCTMTVLTTVEAYBVISFGCCAOEVEKVRZNPSYZSCENTQTCTTCRZPGCYKPRZNTFZPGBKYBIBPNHZNZEGPCEAUZQIEATLYBDHTCCBKHVTYBVETLZGTVTVTCZYWHGPTRTCCACIVEKVEPEKZTYGGXTSXFPCEAKOCYHVLSEGKVTMDHZOVEDHQVOTEVWHKPVCCTREVTGEZNPNPCEALSQYBGTVFZCPVCSENPGDEXTNEPZGNTNREAIBQIHBDOAVDHCSDHAVOTPNQTIHZSXFPCIPSQPERSEAIBTVBFIPTVSVPEEPKEHXSQSRODBKPIGDAMSNTLZGTVKVVXPQEPZFVQDHAMRNVCOTIBKNHSNLEVVCIBIPBKQIHZTVBFIPTVAQVETLZGTVGZKPXTBTPKIBEAXGKTEAUZPCCFTSTPZFAQCTGEPEKEFYQMKRKI
======================END MESSAGE=======================
Cette chaine donne un chiffrement en PLAYFAIR (Et non un français en 1940 qui donne son voisin [thank's Fred pour la blague])
Une recherche sur google de cet algo donne un tool online permettant de le décoder http://bionsgadgets.appspot.com/ww_forms/playfair_ph_web_worker3.html
ahmichelcontentdevousrevoirnousxsomxmespresquecertainsquelesrusxsespreparentuneofxfensivecontrelafranceapressetreinfiltreauseindundeleurbatimentdupontapunousenvoyerunecapturereseauquiestsensexecontenirsuffisamxmentdinformationspourdecouvrircequilenestveritablementmalheureusementceluiciaetetueavantdepouvoirnousfournirleprogramxmepermettantderecuperercetteinformationdepuislacaptureoncomptesurvouslavenirdelafranceendependpourrecupererlecaptureutilisezlidentifiantdumesxsagesurlesitetinyuploadx
### Plus lisible
ah michel content de vous revoir nous xsomxmes presque certains que les rusxses preparent une ofxfensive contre la france a pres s etre infiltre au sein dun de leur batiment du pont a pu nous envoyer une capture reseau qui est sensexe contenir suffisamxment d informations pour decouvrir ce qui l en est veritablement malheureusement celui ci a ete tue avant de pouvoir nous fournir le programxme permettant de recuperer cette information depuis la capture on compte sur vous lavenir de la france en depend pour recuperer le capture utilisez lidentifiantdu mesxsage sur le site tinyuploadx
En allant sur tinyupload avec l'ID du fichier récupéré nous obtenons le fichier flag :
Bien joué, tu as résolu le premier challenge! Après avoir rentré le flag, n'hésite pas à continuer, mais je te préviens, ce sera plus dur! Pour la suite de l'histoire, va voir la page du challenge "au service de la france - partie 2".
Indice pour la suite: Le flag est présent au sein d'un protocole que l'on a pas l'habitude de voir.
voici le flag: LH{awmerbx2cft4u5uqgnde}
FLAG : LH{awmerbx2cft4u5uqgnde}
Mention spécial à cuiliere_a_soupe & Penthium2 pour avoir flagué et documenté ce chall (Et accessoirement la blague un peu noir ..)
#ECSC StegCryptoDIY #1 (Steganographie 30 points)
Comme tout le monde s'en rappelle Dumb et Dumby ont échangé, il y a quelques semaines, en utilisant un nouveau cryptosystème basé sur les problèmes FACT et DLP : CryptoDIY lors des qualifications de l'ECSC. Sauf qu'ils ont visiblement changé leur système!
Une image nous est fournit pour résoudre le challenge
En faisant un strings sur l'image on remarque une chaine en base64 à la fin
=|pIV
eii
x/h9
|dyW
y+,!f
h0za@
-*36,
gKyv
@duMBTiA9IDExNzU1MDY4OTQ0MTQyOTY5NDk4NzQzMjQ1OTg0NzYxMTgxMzI1NjA1MzA0NjI1Mjg2OTU4NzIxMzkxNzY2MDkxMjgzMTMyMzk4NDM3NjQ1MDM4MzQ5Nzc1ODk4OTIzNDY1MzMxMjYwMzA4MDY0NjExMTY3OTI2MTg3Mzk5Mzg0NzIzMzYwOTQxODgzNzMyMTc0OTAxNjY2ODAzICxnMSA9IDM4MDg4MTk1MDU1NjQ5OTk1NDUyNTI2MjM2MzExOTI1MDMyMTIxODY1OTgwODg1NTUzNDM3MzgxMTExNjUzODI2MjM0MjE3MjAxMTk4Mzc1NDQ2NTgxNzM4MjI0NjE4MzQwNzYzNDc3OTUxNTkzNjY1OTMxNzc2NjkwNTg3MDUwODcyNjY4OTg0NDQ4MTg5MjY2Njg1ODQ1MTksIGcyID0gODcyMTc4NzQwMDMyNzc4Mzc0ODAxNDg0OTAzNzYyNjAzOTM5NzgwNzYxMjM3MjgwNDAxNjY0MzY1MzA0NzU3NTk3NjAwOTgyNzAwMzQ0Nzc3ODg2MTI2MjAzNjc1MjMyNjgyNzYxMzA3ODM0NjIyNTE5MjU4MTcwODI0MDgyMDMyNTg2NzY1ODc0MjA3ODY5NDQ0NTY3Nzg3NyBJIHVzZSB0aGlzIGZ1bmN0b25zIGZvciBlbmNpcGhlcmluZyBvdXIgc2tleSA6IGVuY2lwaGVyKGludC5mcm9tX2J5dGVzKHNrZXksJ2JpZycpLGcxLGcyLE4pIHdpdGggZGVmIGVuY2lwaGVyKG0sZzEsZzIsTik6IHMxPXJhbmRvbS5yYW5kcmFuZ2UoMioqMTI3LDIqKjEyOCkgczI9cmFuZG9tLnJhbmRyYW5nZSgyKioxMjcsMioqMTI4KSByZXR1cm4gKG0qcG93KGcxLHMxLE4pKSVOLCAobSpwb3coZzIsczIsTikpJU4gYW5kIGhlcmUgaXMgYSBmbGFnOiBsZWhhY2syMDE5e2FlZjk1NTZhNTc1Y2M5ZGU4ZmM5NjA5YmQwMzRkNjNmZTBhMDE0NzBlYjQwMTM3ODI1M2Y3MjNiYmM1Y2MxNmN9
IEND
Lorsqu'on la décode
base64 -d base64.txt
here is a flag: lehack2019{aef9556a575cc9de8fc9609bd034d63fe0a01470eb401378253f723bbc5cc16c}
FLAG : lehack2019{aef9556a575cc9de8fc9609bd034d63fe0a01470eb401378253f723bbc5cc16c}
Mention spécial à Antoine qui l'a flag !
Tipiak (Steganographie 50 points)
Une image nous ai fournit pour ce chall, un indice sur la visière laisse pensé que du LSB est stéganographié
Malheureusement nos outils n'ont pas extrait les bits, pour la résolution nous avons utilisé notre joker Kokoy (Merci à lui d'avoir perdu 1/4 de sa vue pour la résolution)
La technique a été de compter les bits de couleur (Jaune & rouge) à l'oeil. UN PAR UN. AVEC PAINT et converti la chaine (Rien n'arrête Kokoy)
FLAG : lh_spectacularrrrrrrrr
Mention spécial à Kokoy pour sa déter & son saignement des yeux
Alphajet (Stéganographie 50 points)
An easy stega
OUPAH, celui-ci nous à donné du fil à retordre, une image Netpbm greymap ASCII text nous est fournit
Le format pgm/pbm permet une compatibilité en portable pixmap, pour ne pas m'attarder sur le fonctionnement de jolies docs sont renseignées ici
https://en.wikipedia.org/wiki/Netpbm_format
http://netpbm.sourceforge.net/doc/pgm.html
Merci à DADmin / Glyann & K3b4b pour les recherches
file alphajet.pgm
alphajet.pgm: Netpbm image data, size = 567 x 291, greymap, ASCII text
cat alphajet.pgm
P2
567 291
254
147
140
140
145
141
140
140
144
143
143
142
142
143
142
143
140
142
143
140
140
140
140
144
140
....
P2 est le nombre magic indiquant un fichier PGM ascii, la seconde ligne indique la taille de l'image, les autres lignes correspondent à une suite de chiffre donnant la valeur d'un pixel pour une image en noir et blanc
La première chose à faire est de reconstruire l'image puis d'effectuer un LSB sur l'image (reconstruite) et extraire le LSB de chaque pixel
Merci à zancrows pour son script et son expertise stéganographique :)
# coding: utf8
# python 3.7 x86_64
import binascii
import numpy as np
from PIL import Image
from itertools import chain, islice
def iter_by_blockN(iterable, len_bloc=8, format=tuple):
it = iter(iterable)
for i in it:
yield format(chain(i, islice(it, len_bloc-1)))
def bin_to_str(sbin:str) -> bytes:
b_str = b""
for i in iter_by_blockN(sbin):
binary = "".join(i)
hexa = np.base_repr(int(binary, 2), base=16)
b_str += binascii.unhexlify(f"{hexa:>02}")
return b_str
def reconstruct() -> Image:
with open("alphajet.pgm", mode="r") as fp:
#P2
_ = fp.readline()
#Dimensions du fichier : 567 * 291
width, height = tuple([int(i) for i in fp.readline().split(" ")])
#rebuilding de l'image
img = Image.new("L", (width, height), (0,))
for i in range(height):
for j in range(width):
img.putpixel((j,i), int(fp.readline()))
return img
def detect_lsb(img:Image) -> None:
# Transformation de l'image en matrice avec NumPy pour appliquer l'opération sur chaque pixel
m_img = np.array(img)
# Fonction vectorize de numpy pour appliquer une fonction lambda qui fait ressortir un pixel.
# Decallage du bit de poid faible jusqu'a ce qu'il soit le bit de poid fort, Si besoin on met la valeur à 255 (blanc)
# Sinon on la met à 0 (noir)
vfunc_detect = np.vectorize(lambda x: 255 if ((x << 7) & 128) else 0)
m_img = vfunc_detect(m_img)
lsb_img = Image.fromarray(m_img) # rebuilding de l'image a partir de la matrice
lsb_img.show() #Affichage de la détection
def extract_lsb(img:Image) -> None:
# Meme process pour la detection mais pour l'extraction
vfunc_extract = np.vectorize(lambda x: str(x & 1))
# Extraction + array sur une dimension
extract = vfunc_extract(img).reshape(-1)
# Tranformation de l'array en string & affichage
print(bin_to_str("".join(list(extract))))
if __name__ == "__main__":
img = reconstruct()
# img.show() # pour afficher l'image
img.save("avion.png") # sauvegarde de l'image
# detection de LSB
detect_lsb(img)
# Extraction de données
extract_lsb(img)
Il est possible d'obtenir le LSB contenu dans l'image généré avec zsteg
zsteg avion.png
b1,r,lsb,xy .. text: "Le flag est: lh_{EtMy4WiQofuCeMEf8672}.Le flag est: lh_{EtMy4WiQofuCeMEf8672}.Le flag est: lh_{EtMy4WiQofuCeMEf8672}.Le flag est: lh_{EtMy4WiQofuCeMEf8672}.Le flag est: lh_{EtMy4WiQofuCeMEf8672}.Le flag est: lh_{EtMy4WiQofuCeMEf8672}.Le flag est: lh_{EtMy4"
FLAG : lh_{EtMy4WiQofuCeMEf8672}
WorldGolfChampion (Forensic 50 points)
Help me, i need this flag
Une capture réseau contenant du Telnet nous est fournit, en suivant le flux TCP :
La capture complète ci-dessous
........... ..!.."..'.....#..... ..#..'........!.."..... .....#.....'.............h.8.... .38400,38400....#.localhost:0....'..DISPLAY.localhost:0.USER.tiger......xterm-256color..............Password: woods1275
.
Last login: Fri Jun 14 10:07:48 CDT 2019 from 192.168.56.1 on pts/1
Linux debian 4.9.0-9-amd64 #1 SMP Debian 4.9.168-1+deb9u2 (2019-05-13) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
You have new mail.
.]0;tiger@debian: ~..[01;32mtiger@debian.[00m:.[01;34m~.[00m$ firefox https://www.qwant.com/?q=Ashley%20Madisonfirefox https://www.qwant.com/?q=Ashley%20Madison
.
.]0;tiger@debian: ~..[01;32mtiger@debian.[00m:.[01;34m~.[00m$ ppii...[Kkkiillll ffiirreeccoo...[K...[Kffooxx
.
.]0;tiger@debian: ~..[01;32mtiger@debian.[00m:.[01;34m~.[00m$ kkeeeeppaassssxx...[K--ccllii
.
-bash: keepass-cli: command not found
.]0;tiger@debian: ~..[01;32mtiger@debian.[00m:.[01;34m~.[00m$ kk .pp cli .----hheellpp
.
Usage: kpcli [--kdb=<file.kdb>] [--key=<file.key>]
--kdb Optional KeePass database file to open (must exist).
--key Optional KeePass key file (must exist).
--pwfiles Read master password from file instead of console.
--histfile Specify your history file (or perhaps /dev/null).
--readonly Run in read-only mode; no changes will be allowed.
--timeout=i Lock interface after i seconds of inactivity.
--command Run single command and exit (no interactive session).
--no-recycle Don't store entry changes in /Backup or "/Recycle Bin".
--help This message.
Run kpcli with no options and type 'help' at its command prompt to learn
about kpcli's commands.
.]0;tiger@debian: ~..[01;32mtiger@debian.[00m:.[01;34m~.[00m$ kkppccllii ----kkddbb==mmyysseeccrreett..kkbbddxx
.
There were errors:
for option --kdb=<file.kbd>, the file must exist.
Usage: kpcli [--kdb=<file.kdb>] [--key=<file.key>]
--kdb Optional KeePass database file to open (must exist).
--key Optional KeePass key file (must exist).
--pwfiles Read master password from file instead of console.
--histfile Specify your history file (or perhaps /dev/null).
--readonly Run in read-only mode; no changes will be allowed.
--timeout=i Lock interface after i seconds of inactivity.
--command Run single command and exit (no interactive session).
--no-recycle Don't store entry changes in /Backup or "/Recycle Bin".
--help This message.
Run kpcli with no options and type 'help' at its command prompt to learn
about kpcli's commands.
.]0;tiger@debian: ~..[01;32mtiger@debian.[00m:.[01;34m~.[00m$ .[Akpcli --kdb=mysecret.kbdx...[K...[K...[Kbb...[Kddbbxx
.
..!...Please provide the master password: w*o*o*d*s*1*0*7*7*
...!...****************
Couldn't load the file mysecret.kdbx: The database key appears invalid or else the database is corrupt.
.]0;tiger@debian: ~..[01;32mtiger@debian.[00m:.[01;34m~.[00m$ .[Akpcli --kdb=mysecret.kdbx
.
..!...Please provide the master password: w*o*o*d*s*1*0*.. ... .1*2*8*2*
...!...****************
Couldn't load the file mysecret.kdbx: The database key appears invalid or else the database is corrupt.
.]0;tiger@debian: ~..[01;32mtiger@debian.[00m:.[01;34m~.[00m$ firefox https://www.qwant.com?q=recovery%20password%20keepass%20pleasefirefox https://www.qwant.com?q=recovery%20password%20keepass%20please
.
.]0;tiger@debian: ~..[01;32mtiger@debian.[00m:.[01;34m~.[00m$ ppkkiillll ffiirreecc...[Kffooxx
.
.]0;tiger@debian: ~..[01;32mtiger@debian.[00m:.[01;34m~.[00m$ ddeeccrr .yypptt mm ysecret.kdbx ...[K ...[K
.
-bash: decrypt: command not found
.]0;tiger@debian: ~..[01;32mtiger@debian.[00m:.[01;34m~.[00m$ llss
.
.[0m.[01;34mDesktop.[0m .[01;34mDocuments.[0m .[01;34mDownloads.[0m .[01;34mMusic.[0m mysecret.kdbx .[01;34mPictures.[0m .[01;34mPublic.[0m .[01;34mTemplates.[0m .[01;34mVideos.[0m
.]0;tiger@debian: ~..[01;32mtiger@debian.[00m:.[01;34m~.[00m$ bbaassee6644 mmyy secret.kdbx
.
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
QtUzbXKNYw==
.]0;tiger@debian: ~..[01;32mtiger@debian.[00m:.[01;34m~.[00m$ eexxiitt
.
logout
On remarque que l'utilisateur tiger essaye d'ouvrir une base keepass avec plusieurs mots de passe :
woods1282
woods1077
On y remarque également son password user qui est woods1275
Après ses échecs d'ouverture, il décide d'encoder sa base en base64, grâce à cela il est possible de la récupérer
base64 -d base64.txt >> Keepass.kdbx
file keepass.kdbx
keepass.kdbx: Keepass password database 2.x KDBX
Pour trouver le mot de passe, il suffit de se baser sur son login et ceux essayés, on constate qu'il commence par woods + 4 digit (Normalement)
Pour faciliter la création du dico, un tool a été très utile (trouvé sur github) https://github.com/Broham/PassGen (Tool à avoir sous la main vu sa simplicité)
python passgen.py -n words >> dico.txt
cat dico.txt
woods1
woods01
woods001
woods0001
...
Pour lancer le bruteforce un autre tool a été utile (Malgré sa lenteur)
https://github.com/csirac2/keepass_guesser
python keepass_guesser.py keepass.kdbx dico.txt -v
Trying "words1"...
Failed: "words1"
Trying "words2"...
Failed: "words2"
Trying "words3"...
....
Trying "woods0187"...
Failed: "woods0187"
Trying "woods0188"...
Failed: "woods0188"
Trying "woods0189"...
Failed: "woods0189"
Trying "woods0180"...
SUCCESS after 10190 attempts:
woods0180
Mention spécial à la lenteur qui m'a permet d'aller absorber une biere pendant le bruteforce :)
En ouvrant la base avec le password woods0180
FLAG : lh_{I1oVeG0lfAndSex..W4IT.MyWiFe}
Anecdote : N'ayant pas vu l'entrée du flag (car vide dans les champs user et password) j'ai perdu 45 minutes à chercher le flag en parsant les pages web en lien. Mention spécial à Fred pour son indispensable sens observateur : "tu as regardé ce qu'il y a dans la première entrée ?"
Anecode2 : Une fois le flag trouvé impossible de l'entrer, mention spécial à glyann pour son indispensable hint : "Mec, t'as essayé sans le lh et les accolades ?"
ECSC# 103_spx (Forensic 80 points)
tu fais du forensic? bah t'as pas besoin de description, nah!
Un fichier disque nous est fournit, il s'agit d'un disque DOS/MBR
file USB_a_analyser
USB_a_analyser: DOS/MBR boot sector, code offset 0x52+2, OEM-ID "NTFS ", sectors/cluster 8, Media descriptor 0xf8, sectors/track 62, heads 8, dos < 4.0 BootSector (0x80), FAT (1Y bit by descriptor); NTFS, sectors/track 62, sectors 507903, $MFT start cluster 4, $MFTMirror start cluster 31743, bytes/RecordSegment 2^(-1*246), clusters/index block 1, serial number 06d84ef355f47cf91
Lorsqu'on le monte, plusieurs fichiers sont disponibles à l’intérieur
kpartx -a -v USB_a_analyser
ls /media/root/103SPX
message.txt
Peugeot103SPXFILI.jpg
'Peugeot 103 SPX : tous les modèles de 1987 à 2003 | Actualités de la mobylette par Mobylette Mag_files'
'Peugeot 103 SPX : tous les modèles de 1987 à 2003 | Actualités de la mobylette par Mobylette Mag.html'
Le message.txt contient les informations intéressantes (le reste ne servant pas à la résolution)
cat message.txt
Si un jour je relis ce message, le mot de passe utilisé pour chiffrer mon plus grand secret était "vgrohhfyek0wkfi5fv13anexapy3sso6" et j'avais utilisé openssl.
En revanche, j'ai effacé par erreur le fichier contenant mon plus grand secret (voir s'il existe des techniques de la mort pour le retrouver mon fichier secret.xz sha256(0fb08681c2f8db4d3c127c4c721018416cc9f9b369d5f5f9cf420b89ee5dfe4e) de 136 octets) et de toute façon, impossible de me rappeler de l'algo utilisé -_- (donc si je le retrouve... il faudra aussi retrouver l'algo pour utiliser ce mot de passe).
L'objectif est donc de retrouver le fichier supprimé et de le déchiffrer à l'aide de la clé et en retrouvant l'algo, pour le retrouver testdisk a été utile
On remarque un dossier .Trash contenant une archive secret.xz
xz -d secret.xz
cat secret
Salted__��k���@���>�#��z���
�S�n���!��O�ND�5����k�b=��N-�㖿�,��s�٪
Pour bruteforcer le fichier jusqu'à trouver le bon algorithme nous avons bouclés openssl avec tous ses ciphers renseignés dans fichier texte
!/bin/bash
for algo in $(cat ciphers.txt)
do
openssl $algo -d -in secret -out FLAG -salt -k vgrohhfyek0wkfi5fv13anexapy3sso6 2>/dev/null
if [ "$?" == "0" ];then
echo $algo
echo "GG"
cat FLAG
else
echo "NOPE"
fi
done
./algofinder.sh >> result.txt
strings result.txt
...
flag : lh_6c31ba64e522b5f9326b7bee0abef6547f60d214
aes-192-ofb
...
FLAG : lh_6c31ba64e522b5f9326b7bee0abef6547f60d214
Mention spécial aux 2h à trouver la bonne commande openssl et à theforester & fred pour l'aide apportée sur openssl (Et au collègue de zancrows)
LeHackLeHackLeHack (Stéganographie 200 points)
HackHackLeHack
Un fichier flac nous est fournit, long de 1m30, celui-ci contient beaucoup de bruit
Conversion du flac en mp3 pour analyse
ffmpeg -i steg.flac -ab 320k -map_metadata 0 steg.mp3
Pour l'analyse plusieurs traitements ont du être effectués
Partie 1
Balance full à gauche, Égalisation Low cut / High cut pour isoler les fréquences qui nous intéressent
Une voit disant "Le zéro, Le un, Le un, Le zéro" en l'écoutant jusqu'au bout on récupère une chaine binaire, si on la convertit:
0010111101101000001100110100110001001100001100000101111101100011001100010101000001101000001100110101001000100101
# Qui convertit donne
/h3LL0_c1Ph3R%
Mention spécial à l’ascendeur émotionnel qu'a prit Maxime à ce moment la (Et non ce n’était pas le flag)
Partie 2
Pour la suite, d'autres traitements ont été effectués
Balance Full à droite, Égalisation Low cut / High cut pour isoler les fréquences qui nous intéressent
En effectuant un nettoyage des sons parasites, une diminution de la vitesse du son nous permet d'entendre "Le Hach Hack Le Le Hack Le ..."
Ces 2 mots correspondent à 1 ou 0 en binaire, en transformant ces mots en binaire on obtient :
le = 0
hack = 1
Mention spécial à Maxime qui s'est tapé le son à écouter (Force à tes oreilles !)
En découpant octet par octet la chaine (par bloc de 8 bits) on obtient une chaine binaire, lorsqu'on la décode
echo "01010011011000010110110001110100011001010110010001011111010111111110011011110110110100010111100101111101010110001000001110001110110101111000110111110010010010100000010000010000100101001100001111111110011111011101101111100110000000101110000010100010101011101000001101100010111001000000011110111101110001111001111100010110000010011011101010001011100010000110010111011110100110000011011101001100011011101000101110001000011011001000000100011001111100000100110011110001100100100100111011110101001010111100000110011001"| perl -lpe '$_=pack"B*",$_' >> encrypt.bin
cat encrypt.bin
Salted__���y}X���J���}��ࢮ�b��ǟ ���eޘ7Ln��l��L�N …
file encyrpt.bin
encrypt.bin: openssl enc'd data with salted password
Après quelques recherche, nous apprenons qu'il s'agit d'un chiffrement openssl avec SALT, nous déduisons que la première partie du fichier audio donne le salt
openssl aes-256-cbc -salt -d -in encrypt.bin -out flag -k "/h3LL0_c1Ph3R%"
cat flag
flag: lh_1bd534f7046f509e2921a2dce3455a35
FLAG : lh_1bd534f7046f509e2921a2dce3455a35
Mention spéciale à Maxime qui à perdu 1/3 de son audition pour récupéré les bits du son, à Kokoy d'avoir péché l'info d'openssl / salt et tete2soja pour le flag final
Ce challenge a été flagué les 10 dernières minutes du CTF, ( 6h20 ), la pression était à son comble, merci à Maxime & Antoine d'avoir perdu leurs âmes ( et leur audition ) à tout jamais pour gagner ces 200 points.
Si je pouvais write-uper la scène sa ressemblerait à ça :
Maxime & Antoine de 4h à 6h10
Maxime ayant finit de récupérer la chaine
La team les 11 dernières minutes cherchant le flag
Tete2soja à 6h19 qui flag
Maxime validant le chall à 6h21
@Tout le monde
Retour global sur l'évenement
Nous formions la team ESD ENI Et Sylvie Et Evelyne Et Non et étions tous de l'ENI cursus ESD Rennes - Nantes
- Maxime Caradec
- Penthium2
- Cuiliere_a_soupe
- TheForester
- DADmin
- Kokoy
- K3b4b
- Lucas
- Antoine
- Tete2soja
- Glyann
- Yoan
- Francois
- Jeremy
- Zancrows (a cheval sur 2 équipes) Thank you pour tes hints
- K-lfa
En effet nous étions assez nombreux, pour certains c'était leur premier CTF pour d'autres un énième.
Ce soir la un fort esprit d'équipe était présent ce qui à pu nous faire avancer dans les challs, tout le monde a apprit beaucoup Mention spécial à ceux que j'ai oublié de cité dans les writes up vous étiez la et avez apportés votre brique, qu'importe la façon !
Grâce à cet esprit d'équipe nous avons pu finir 21eme (au lieu de 37eme grâce au 200 points finals) et c'est une vrai satisfaction pour nous
L'objectif était de passer une bonne soirée et ce fut le cas, des rencontres, des goodies, des challenges, des rumps, de la bière ... tout était au rendez vous !
L'ambiance générale au top, des confs intéressantes, des participants sympa, une bande passante au TOP du TOP, tout était absolument génial
Ce fut également l’occasion de rencontrer nos chères collègues nantais (force à vous, vous êtes au top), de rencontrer les ESD Parisien et de revoir nos chères formateurs ESD (Ce fut un réel plaisir)
L'amélioration pour la prochaine édition serait un stand snack (Les pommes c'est léger) Mention spécial à Fred qui à troll avec sa caisse de pomme
Nous y seront pour la plupart à la prochaine édition sans hésitation.
THANK YOU LeHack See you Soon
Un super post sur le déroulé de l’évent est disponible ici