Un petit coup de ffuf
permet d’identifier le fichier robots.txt
.
User-agent: *
Disallow : /ondine_secrets.html
Sur la page https://ondine.ctf.bzh/ondine_secrets.html, on retrouve un tableau, sur la vue utilisateur, on ne voit que des cellules blanches, mais en regardant les sources, on voit des classes white
et black
.
<table>
<tr><td class='white'></td><td class='white'></td><td class='white'></td><td class='white'></td><td class='white'></td><td class='white'></td><td class='white'></td><td class='white'></td><td class='white'></td><td class='white'></td><td class='white'></td><td class='white'></td><td class='white'></td><td class='white'></td><td class='white'></td><td class='white'></td><td class='white'></td><td class='white'></td><td class='white'></td><td class='white'></td><td class='white'></td><td class='white'></td><td class='white'></td><td class='white'></td><td class='white'></td><td class='white'></td><td class='white'></td><td class='white'></td><td class='white'></td><td class='white'></td><td class='white'></td><td class='white'></td><td class='white'></td></tr>
...
<tr><td class='white'></td><td class='white'></td><td class='white'></td><td class='white'></td><td class='black'></td><td class='black'></td><td class='black'></td><td class='black'></td><td class='black'></td><td class='black'></td><td class='black'></td><td class='white'></td><td class='black'></td><td class='black'></td><td class='white'></td><td class='white'></td><td class='black'></td><td class='white'></td><td class='black'></td><td class='black'></td><td class='white'></td><td class='white'></td><td class='black'></td><td class='black'></td><td class='black'></td><td class='black'></td><td class='black'></td><td class='black'></td><td class='black'></td><td class='white'></td><td class='white'></td><td class='white'></td><td class='white'></td></tr>
...
Il était possible d’éditer la classe .black
dans l’inspecteur CSS pour lui ajouter un fond noir et ainsi voir le QR code s’afficher quasi instantanément. Cependant, sur le coup, je n’y ai pas du tout pensé. J’ai donc fait un rapide script Ruby pour parser le fichier HTML, convertir les white
et black
en 0 et 1 et transformer ce tableau de bits (bitmap) en image afin d’afficher le QR code à l’aide de mon outil PixelChart.
data = []
File.readlines('ondine_secrets.html').each do |line|
if /<tr>/.match?(line)
data << line.split('</td>').map { |x| /white/.match?(x) ? 1 : 0 }[..-2]
end
end
inline_data = data.flatten
require 'pixelchart' # https://github.com/noraj/pixelchart
options = {
scale: 10
}
im = PixelChart.new(inline_data, 33, 33, options)
im.draw('ondine.png')
Le QR code contient le chemin vers la page /poke_hidden_form.html
.
La page https://ondine.ctf.bzh/poke_hidden_form.html contient un script pour le moins étrange.
<script>
[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]][([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[]) ...
Cela ressemble à du Brainfuck mais un peu différent, purement compatible en JavaScript. Ce "langage" s’appelle le JSFuck.
On peut alors utiliser un décompileur JSFuck en ligne https://www.dcode.fr/jsfuck-language afin d’y voir plus clair.
var a = prompt("Entrez le mot de passe."); if (a == atob('cGlLYS1waUthIQ==')){ window.location = "/"+a+".html";}
Si l’on décode la chaîne de caractères qui est en base64, on obtient la valeur suivante :
➜ ctf-party cGlLYS1waUthIQ== from_b64
piKa-piKa!
En contactant l’URL https://ondine.ctf.bzh/piKa-piKa!.html
on obtient le flag BZHCTF{piKa-piKa!}
.
Solution de l’auteur du challenge.
À propos de l’auteur
Article écrit par Alexandre ZANNI alias noraj, Ingénieur en Test d’Intrusion chez ACCEIS.