Fini les payloads classiques, montre moi vraiment ce que tu peux faire pour contourner รงa !
Le flag est situรฉ dans flag.txt
Connexion: nc intro.ctfrei.fr 4452
Ce challenge tourne sur un docker et n'est pas disponible
Solution
Ici le "TRICK" ร utiliser est que python accepte diffรฉrent encodage, seulement la vรฉrification de la blacklist est faite uniquement avec les valeurs ASCII. On peut donc utiliser des caractรจres unicodes diffรฉrents, mais compris par python pour utiliser les mots interdis.
La premiรจre chose ร faire est de lister, en local, les caractรจres qui peuvent remplacer les "vrais" (ceux en ASCII). Pour รงa on va crรฉer 26 variables nommรฉes de a ร z, tester par exemple 1 million de caractรจres unicode et voir ceux qui sont รฉvaluรฉs en tant qu'une des variables dรฉfinies.
result = {v: [] for v in range(26)}
a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z = list(range(26))
for _n in range(1_000_000):
_c = chr(_n)
if _c.isdigit():
continue
try:
_v = eval(_c)
result[_v].append(_c)
except:
pass
for _v in range(26):
print(', '.join(result[_v]))
On en tire le tableau de correspondances suivant :
Maintenant, il suffit de remplacer une lettre de exec pour que la blacklist ne dรฉtecte plus le mot, mais qu'il soit toujours interprรฉtรฉ. Remplaรงons par exemple le premier e par ๐.
Ensuite, on va crรฉer un payload qui ouvrira un shell dans notre fonction exec. Pour passer la blacklist sans se prendre la tรชte, on va envoyer une version encodรฉe en hexa et qui sera dรฉcodรฉe sur le serveur avec bytes.fromhex.