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 7 minutes, 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

Récupération d'une chaine binaire puis conversion de celle-ci:

0010111101101000001100110100110001001100001100000101111101100011001100010101000001101000001100110101001000100101

# Qui convertit donne 

/h3LL0_c1Ph3R%

Mention spécial à l'ascenceur émotionnel qu'a prit Maxime à ce moment la (Et non ce n'etait 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 et un découpage de son octet par octet, le son correspond à "Le Hach Hack Le Le Hack Le ..." pendant 9 minutes

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é les 7 minutes à é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 3h à 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

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

#DGSEverywhere

Previous Post