Les qualifs du Jordan Infocsec CTF 2020 (JISCTF) se tenaient du 19 au 21 novembre 2020. Au menu: crypto & stego, forensics, misc, reversing et web.
Voici quelques write-up des challenges proposés lors des qualifications du JISCTF 2020
1. Forensics
1.1 Malicious
root@Host-001:/tmp# binwalk -e attachment.docx
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 Zip archive data, at least v2.0 to extract, name: [Content_Types].xml
387 0x183 Zip archive data, at least v2.0 to extract, name: _rels/.rels
661 0x295 Zip archive data, at least v2.0 to extract, name: docProps/app.xml
1012 0x3F4 Zip archive data, at least v2.0 to extract, name: docProps/core.xml
1430 0x596 Zip archive data, at least v2.0 to extract, compressed size: 3471, uncompressed size: 15660, name: image.png
4940 0x134C Zip archive data, at least v2.0 to extract, name: word/_rels/document.xml.rels
5237 0x1475 Zip archive data, at least v2.0 to extract, name: word/document.xml
6254 0x186E Zip archive data, at least v2.0 to extract, name: word/fontTable.xml
6603 0x19CB Zip archive data, at least v2.0 to extract, name: word/media/image1.jpeg
75885 0x1286D Zip archive data, at least v2.0 to extract, name: word/settings.xml
76113 0x12951 Zip archive data, at least v2.0 to extract, name: word/styles.xml
77537 0x12EE1 End of Zip archive, footer length: 22
root@Host-001:/tmp# cd _attachment.docx.extracted/
root@Host-001:/tmp/_attachment.docx.extracted# ls
0.zip '[Content_Types].xml' docProps image.png _rels word
image.png -> impossible d’ouvrir le fichier
root@Host-001:/tmp/_attachment.docx.extracted# file image.png
image.png: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, Exif Standard: [TIFF image data, big-endian, direntries=7, manufacturer=BeFunky, orientation=upper-left, xresolution=106, yresolution=114, resolutionunit=2, software=BeFunky Photo Editor], baseline, precision 8, 642x76, components 3
C’est un jpeg!
root@Host-001:/tmp/_attachment.docx.extracted# cp image.png image.jpeg
On a un code-barres. Le déchiffrer avec https://online-barcode-reader.inliteresearch.com/
Flag: JISCTF{B4RC0D3_1M4G3_2019}
1.2 So Easy
Ouvrir le pcap avec Wireshark. Lancer une recherche par chaine de caractères. Chercher ‘jis’
On a le flag dans le champ username
JISCTF{V3RY_34SY_PC4P_F1L3}
1.3 Malicious 2
Document word chiffré:
root@Host-001:/tmp# file mycv.docx
mycv.docx: CDFV2 Encrypted
root@Host-001:/tmp#
CDFV2 - Encrypted Compound Document Format. Voir https://isc.sans.edu/forums/diary/Quick+Analysis+of+an+Encrypted+Compound+Document+Format/25826/
Semble utilisé pour bypass le filatrage des pj aux e-mails
CDFV2 peut être déchiffré avec John The Ripper: office2john
Ref: https://github.com/cHo0s3N/JustCTF
root@Host-001:/tmp# python3 /usr/share/john/office2john.py mycv.docx > hash.txt
root@Host-001:/tmp# cat hash.txt
mycv.docx:$office$*2007*20*128*16*6054846762510f801f75d44d2d81ee98*2e39d30eac11bd4dafc83c5a197bde0a*cfa9f22cde46863f4bbed00e8fb343eb1f11da12
root@Host-001:/tmp#
mdp = princess101
ouvrir le document word .docx avec ce mdp
Flag: JISCTF{H4PPY_HUNT1NG}
1.4 Unknown Ransomware
Le fichier semble être encodé en base 64
On utilise CyberChef https://gchq.github.io/CyberChef/ pour déchiffrer et on se rend vite compte qu’il y a plusieurs itérations de chiffrement en b64
On scripte:
On lance ce script qui fini par planter après un certain nombre d’itérations (décodage du base 64 précédent). Lors du plantage on remarque GNP, RDHI ,BGR, etc. des indicateurs qui font penser à un png.
Le script plante car il ne peut pas décoder un fichier PNG.
On modifie le script pour extraire le fichier PNG.
Script disponible ici: https://github.com/0xSs0rZ/CTF/blob/master/recursive_base64.py
root@Host-001:~/Bureau/OTA# cat decrypt.py
#!/usr/bin/python3
import base64
with open("flag.enc", "rb") as cipher:
c = cipher.read()
plaintext = base64.b64decode(c)
while 'jisctf' not in str(plaintext):
plaintext = base64.b64decode(plaintext)
print(plaintext)
if '\\n\\rGNP' in str(plaintext):
print('writing png')
f=open("test","wb")
f.write(plaintext)
f.close()
Fichier extrait test:
Renverser le contenu du binaire:
< test xxd -p -c1 | tac | xxd -p -r > test.png
Ref: https://unix.stackexchange.com/questions/416401/how-to-reverse-the-content-of-binary-file
Ouvrir test.png
Inverser pour avoir le flag
JISCTF{R3V3RS3_1M4G3_C0NT3NTS}
1.5 Colorfull (incomplet)
Dans les trames FTP il y a une référence à un fichier files.zip
qui contiendrait un fichier nommé secret_data.txt
Extraction du fichier zip:
Ref: How to extract ftp files from wireshark packet
Sélectionner le paquet concerné, ici le paquet 524, clic droit: Suivre > Flux TCP
Signature fichier zip: PK\x01\x02
Ref: https://forensicswiki.xyz/wiki/index.php?title=ZIP
Enregistrer (‘Save as’) en données brut:
root@Host-001:~/Bureau/OTA# file files.zip
files.zip: Zip archive data, at least v?[0x333] to extract
root@Host-001:~/Bureau/OTA#
Zip protégé par mdp
Impossible de cracker le mdp avec fcrackzip… :(
2. Crypto & Stego
2.1 Hidden
Fichier png:
Steganographie.
Outil en ligne: https://stylesuxx.github.io/steganography/
Résultat:
Flag: JISCTF{G00D_J0B_Y0U_EXTR4KT_M3!!!}
2.2 Upside Down!!
Try to decrypt me?
JISCTF{fkhrwv_wldm_vmtorhs_xszizxgvih_xibkgltizksb}
Substitution alphabétique
Outil Cryptii: https://cryptii.com/pipes/alphabetical-substitution
Flag: upside_down_english_charaters_cryptography
2.3 Baby Crypto
On a 2 fichiers: le script de chiffrement baby.py et un fichier chiffré flag.enc
baby.py:
root@Host-001:~/Bureau/OTA# cat baby.py
import random
import sys
import time
ct = str(time.time()).encode('ASCII')
random.seed(ct)
flag = 'data_here'.encode('ASCII')
k1 = [random.randrange(256) for _ in flag]
ciphertext = [m ^ k for (m,k ) in zip(flag + ct, k1 + [0x99]*len(ct))]
with open(sys.argv[1], "wb") as f:
f.write(bytes(ciphertext))
C’est la même chose que pour 34c3 Junior CTF
Ref:
- https://www.rootnetsec.com/34c3ctf-junior-top/
- https://vishnudevtj.github.io/writeups/34c3/#sec-3
- https://ctftime.org/writeup/8490
On adapte le script de vishnudevtj pour qu’il correspond à notre situation:
root@Host-001:~/Bureau/OTA# cat poc.py
import random
import sys
import time
with open("flag.enc", "rb") as f:
enc = list(f.read())
time = []
for i in enc[len(enc) - 18:len(enc)]:
time.append(i ^ 0x99)
msg = enc[:len(enc) - 18]
random.seed(''.join([chr(i) for i in time]))
key = [random.randrange(256) for _ in msg]
c = [int(m) ^ int(k) for (m, k) in zip(msg + time, key + [0x99] * len(time))]
print(''.join([chr(i) for i in c]))
root@Host-001:~/Bureau/OTA# python3 poc.py
JISCTF{B4BY_ENCRYPT10N_JISCTF2020_QUALIFICATION_RND_101}¨¯©¬®ªª¯©©·¯ª©¡¡©
Flag: JISCTF{B4BY_ENCRYPT10N_JISCTF2020_QUALIFICATION_RND_101}
3.Web
3.1 Web 101 (Incomplet)
Rien de spécial dans le code source
On énumère les dossiers avec dirb. On trouve /blog
Wpscan ne liste pas de plugin pour ce site mais on vérifie manuellement en visitant /wp-content/plugins
Localize My Post est vulnérable aux LFI: https://www.exploit-db.com/exploits/45439
OUI ON A BIEN UNE LFI :)
http://ec2-18-221-119-66.us-east-2.compute.amazonaws.com/blog/wp-content/plugins/localize-my-post/ajax/include.php?file=../../../../../../../../../../etc/passwd
On essaye de lire wp-config.php mais impossible… Acces à index.php mais impossible de l’extraire en base64. Les filtres php semblent être interdits :(
Poursuivez avec :
This work is licensed under a Creative Commons Attribution 4.0 International License.