• XSS.stack #1 – первый литературный журнал от юзеров форума

Конкурс #0. ][ak квест #2021

Полное прохождение будет выложено в конце недели! После этого, понятное дело, нашего третьего мы уже не ждем =)
Уже не терпится, честно говоря. Не кидайте камни, просто голова уже сломана, интересно насколько глобально мышление автора отличается от моего и ещё раз спасибо, я в восторге)
 
плюсую, только на более раннем этапе, ни как не могу победить олдскул юзерагенты, прям застрял((
буду признателен за подсказочку, интересно что там дальше, бросать на этом этапе обидно ^_^
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Жду статью, как проходить такие квесты, мне было-бы интересно почитать.)))
Все будет в ближайшее время; осталось еще третье место, а так - скоро напишу прохождение.

Всё ещё нужна помощь. имею. страницу с чек-боксами sss.php и ss.php

Нужно вернуться назад, там пишет на странице. Вот туда, откуда эти страницы нашлись.

ни как не могу победить олдскул юзерагенты, прям застрял((
буду признателен за подсказочку,

Вспомни, какой браузер тогда был популярен? Кого люто ненавидели веб-мастера и любили ботоводы со связками? ;)

а чё там за логин пас прям не знаю

Подумай, посмотри на странице по разному; там есть подсказка.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
sdd28
Скрытый контент для пользователей: sdd28.


hellodude
Скрытый контент для пользователей: hellodude.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Отлично, есть третье место.

Пишу прохождение квеста. Кто еще хочет пробовать самостоятельно - просто не смотрите под спойлер. Квест будет работать и дальше.
Идея квеста пришла мне в голову еще в 2019 году. Изначально была идея обыграть шифровальщик, т.к. эта тема весьма актуальная последние годы. Сделать "матрешку", где один скрипт распаковывает другой, там дальше бинарник и т.д. Также, поскольку простых заданий в бинарнике сложно придумать, а сложные нельзя (это не крякми для специализорованных сайтов), планировал добавить админку в вебе, и какие-то задания сделать там (взлом , брут и т.д.) Изначально толку было мало - я почти весь 2019 год провел в больницах. С веб частью, которую должен был закодить другой человек, тоже прогресс шел не особо - первый чел пропал, второй уехал в блек, третий..ну не суть. В общем, когда закончились конкурсы статтей, я решил вернутся к изначальной идеи квеста. Старался делать упор не столько на технические знания (хотя, безусловно, они здесь нужны), сколько на логику; т.е. вряд ли кому-то интересно было бы брутить архив или снимать протектор.

Итак, прохождение. Ссылка на пастебин, переходим туда, требует пароль. Пароль стандартый (под которым на форуме выкладывают базы и прочие фишки, т.е. xss.pro). Переходим, текст говорит , что начало квеста нужно искать на домене хсс. Почему-то многие здесь начали усложнять, сканировать порты, хотя тут все просто - домен xss.pro + "quest.txt" дают нам ссылку на следующий этап. По ссылке текст, что к нам обратился персонаж, которому злой локер пошифровал котиков, и еще 1 ссылка. Давайте попробуем помочь человеку, переходим на /tier0.txt. Там какой-то хекс-код, копируем его в хекс-редактор, сохраняем; это 7Z архив, о чем говорит заголовок файла. После распаковки в архиве видим несколько файлов - пошифрованные картинки и записку. Записка выглядит странно, вроде смысл понять можно, а что с этим делать - неясно. Вообще, я планировал начать квест с записки, добавить разминочные уровни перед этим предложил admin. И да, на записке остановились многие участники. В записке, прежде всего нужно обратить внимание на 2 странности: строчные буквы вместо прописных (и наоборот), и нуллбайты вместо пробелов. Если посмотреть код, к примеру, символов A и a , то они отличаются 5 битом (сброшен или установлен). Или же, если смотреть в хексе, то разницой в 0x20. Есть такая операция XOR, которая устанавливает бит, если его нет, и сбрасывает, если он установлен. На какой же символ был поксорен текст? XOR легко определить по 1 простому признаку - если поксорить символ сам на себя, то выйдет нуллбайт, т.к. все биты будут сброшены. Итак, сопоставив все эти факторы, ксорим записку на 0x20, он же пробел, он же 00100000, и получаем внятный текст. Декодируем base64 , получается число. С этим числом тоже был затык, думали что айпи и т.д.. Да, это айпи, но закодированное через ip2long функцию. Декодируем, переходим по айпи адресу.

Страница сообщает, что все верно, выводит картинку с одиноким роботом, но что делать дальше - неясно. Если немного подумать, и посмотреть исходный код страницы, то в роботе есть какой-то смысл. Какой? robots.txt , файл говорит что чтобы пройти дальше, нужно имя первого админа дамаги и год ее основания. Пошерстив на форуме находим инфу, комбинация winux2004 дает возможность перейти на следующий этап. Скрипт пишет, что плохой юзарагент, нужен олдскульный. Окей, какой в 2004 году был браузер? Кого ненавидели вебмастера и любили ботоводы ? Конечно же, IE6. Вводим юзерагент от шестого ишака. Пишет , что хочет секретный код. Начинаем искать , вроде ничего умного нет, только в хтмл коде есть урленкод вида %2D%2D%2D.... Декодируем, получается непонятная фигня вида --...---. Это код Морзе, расшифровав который будет слово OFFSET_40H . Вводим в форму, выдает следующий путь, TIER1230414.PHP . Там картинка, в ней есть ветвление на ложный путь и нормальный. С нормальным разберемся позже, все равно почти все пошли по ложному (т.к. он дописан внизу картинки ). Ложный путь ведет на ссылку "правила" ( rulesss.php ). Там нужно отметить флажки согласия с правилами. Каждый флажок доступен через 5 секунд , т.е. по очереди нужно отметить 6 пунктов правил. Если сжульничать и отметить сразу - это отследится. Если же отметить правильно - будет выведена надпись, что "извините, вы свернули не туда". Ладно, сворачиваем туда. В картинке есть два варианта прохождения - стеганография (вспомним подсказку-пароль с пред. пункта, оффсет 40, т.е. по смещению 40 закодирована ссылка алгоритмом LSB). Оттуда получаем путь на страницу входа ( faq123498.html , там есть подсказка про дефолтные пароли и страница логина ). Более простой вариант - "выход" из лабиринта, т.е. перейти по exit.php , который переадресует на страницу входа. Но так или иначе, мы не знаем данных входа, а брутить можно бесконечно. Кто проходил через стеганографию, видел FAQ, в котором, помимо прочего, говорится про дефолтные записи админ:админ , пароли к которым надо бы сменить. Также подсказка есть в скрипте логина. Вход возможен под учеткой support:support, но нужно а) отключить яваскрипт, ибо он блокирует вход; б)поправить форму входа, изменив INDEX.PH на РНР (намеренная ошибка).

Ура, мы вошли в админку! Нам доступен какой-то ехе файл локера. Качаем, и.. облом "это фейк локер, ищите другой". Грустно, но идем дальше. В админке помимо разного мусора , есть вкладка со скриптом, но нас туда не пускают. Пишет что нужен аккаунт Тестера (а мы саппорт как бы). Ладно, надо думать. Пароль tester tester не подходит, видимо тестер поумнее саппа, и его сменил. Смотрим - мы же можем читать список юзеров, и даже видеть их данные профилей. Среди прочего находим там в списке аккаунт тестировщика. У него пароль вида covid20**, ну нетрудно подобрать что вместо звездочек еще цифра 20. Пробуем войти. Ага, не входит, пишет типа аккаунт привязан к айпи. Смотрим опять - айпи вида 192.168... , т.е. явно что-то не так. Как можно подделать айпи? Заголовками хттп, некоторые считывают их оттуда (к слову, много уязвимостей было из-за такой ерунды, вида хсс когда кодер тупо писал айпи, не проверяя, в базу). Вбиваем заголовок x-forwarded-for, все, входим как тестер.

Тестеру доступен немного обфусцированный JS-файл. Это не веб-яваскрипт, а Windows Script Host, т.е. тот жс, что исполняется на винде. В нем есть 2 полезные вещи - строка вида q is XXX ,и ссылка на павершелл. Качаем ПШ, в нем base64, деобфусцируем - бинарник, накрытый UPX. Распаковываем, бинарник идет в отладчик / дизассемблер, тут уже кому как удобнее.

Не буду особо детально расписывать реверс, тут как в сексе, кто как умеет, так и делает. Скажу только, что в бинарнике нужно:
1. Найти строку вида p is XXX;
2. Найти публичный ключ RSA.
3. Понять, каким алгоритмом шифруются файлы.

Все строки лежат, как есть, алгоритм - опять ксор на три псевдослучаные символы, которые шифруются с помощью RSA и дописываются в конец файла. Тут варианта два - или брутить символы (что имхо бред, но в теории, представим что это не учебное задание, а реальный случай с оплатой в 100к), или расшифровать RSA. К счастью, у нас есть строки P и Q (и публичный ключ), с помощью которых можно получить приватный. Кому интересна техническая матчасть - . Получаем приватный ключ, дешим конец файла, дешим картинки, ура, котики спасены.

Хочу поздравить Apocalypse vborion thereminvox с победой; поблагодарить всех участников за интерес к конкурсу; и admin - за поддержку по ходу разработки и советы, без мотивации и советов конкурс не был бы завершен. Не расстраивайтесь , если не получилось пройти тот или иной этап - это всего лишь игра, развлечение. Надеюсь, что какие-то моменты с квеста будут полезны в реальной работе, т.к. шифрование играет важную роль , и не только в криптолокерах. Много чего можно и нужно шифровать.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
https://pastebin.com/0fLiCXqZ -> пароль xss.pro -> https://xssforum7mmh3n56inuf2h73hvhnzobi7h2ytb3gvklrfqm7ut3xdnyd.onion/quest.txt

https://xssforum7mmh3n56inuf2h73hvhnzobi7h2ytb3gvklrfqm7ut3xdnyd.onion/tier0.txt -> hex -> 7zip

crypto_note.txt -> xor 0x20 (символ пробела заменен на 0x00 байт) -> OTI3NzU2NDQ= -> 92775644 => http://92775644 (http://5.135.164.220/)

картинка http://5.135.164.220/robots.jpg намёк на robots.txt -> http://5.135.164.220/robots.txt

первый admin winux + 2004 год -> http://5.135.164.220/winux2004.php

oldschool useragent -> MSIE 6 -> в исходниках urlencoded код -> точка-тире (Морзе) -> secret code = OFFSET_40H -> http://5.135.164.220/tier1230414.php?access=true

http://5.135.164.220/img/good.bmp -> the next step is /rulesss.php -> http://5.135.164.220/rulesss.php -> ставим галочки с задержкой в 5 сек на каждую и жмем кнопку -> http://5.135.164.220/ruless.php -> ? wrong way

http://5.135.164.220/img/good.bmp -> на картинке лабиринт, возможно нужно найти выход (exit.php) -> http://5.135.164.220/exit.php -> редирект http://5.135.164.220/logins123321.htm

по исходному коду видно два юзера (стандартные пароли блокируются скриптом) и имя скрипта cp393713013.php, пробуем отправить на http://5.135.164.220/login.php admin:admin (без результата) и support:support (дает ответ ОК) -> http://5.135.164.220/cp393713013.php

качаем файл локера http://5.135.164.220/lok2024.exe, анализ показывает строку "This is a third-party compiled AutoIt script", качаем exe2aut -> This is fake loker..search another one =) -> ? wrong way

посмотрим тут http://5.135.164.220/getbindata1357.php, облом, нужно быть кодером или тестером, смотрим какие ещё юзеры есть http://5.135.164.220/usrlst949.php (обычные юзеры не подходят, я проверил каждого ;) ), видим юзера ScoolCoder с правами Tester, пароль covid2020 (догадался, да)

пробуем зайти, облом, привязка к IP (192.168.56.1), возможно скрипт проверяет прокси-заголовки? -> пробуем подставить в заголовки - X-Forwarded-For: 192.168.56.1

получается зайти, идём на http://5.135.164.220/getbindata1357.php и видим код (похоже на обфусцированный JScript), деобфусцируем через http://jsnice.org/

из интересного видим http://5.135.164.220/advertreflective2021.ps1 (некий LoadPE на повершеле) с base64-encode начинкой, внутри PE, накрыт UPX 3.95, распаковываем через upx -d и на анализ в IDA

процедура шифрования примерно такая:

C:
char *Buffer[128];
int nNumberOfBytesToRead = 128;
int NumberOfBytesRead = NumberOfBytesWritten = 0;

int k1 = random() % 100 + 20;
int k2 = random() % 100 + 20;
int k3 = random() % 100 + 20;

while (true){
    int res = ReadFile(hOriginalFile, &Buffer, nNumberOfBytesToRead, &NumberOfBytesRead, 0);
  
    if (!res || !nNumberOfBytesToRead) break;
  
    for (int i = 0; i < nNumberOfBytesToRead; i++){
        if (*(&Buffer + i) != k1 && *(&Buffer + i)) *(&Buffer + i) ^= k1;
    }
  
    for (int i = 0; i < nNumberOfBytesToRead; i++){
        if (*(&Buffer + i) != k2 && *(&Buffer + i)) *(&Buffer + i) ^= k2;
    }
  
    for (int i = 0; i < nNumberOfBytesToRead; i++){
        if (*(&Buffer + i) != k3 && *(&Buffer + i)) *(&Buffer + i) ^= k3;
    }

    for (int i = 0; i < nNumberOfBytesToRead; i++){
        if (*(&Buffer + i)) *(&Buffer + i) ^= g_isDebugged;//just skip in real life =)
    }

    WriteFile(hEncryptedFile, &Buffer, NumberOfBytesRead, &NumberOfBytesWritten, 0);
}

wsprintfA(&Buffer, "k1 = %u,k2 = %u,k3 = %u", k1, k2, k3);
//skip
NumberOfBytesRead = RSAEncrypt(&Buffer);
//skip
//NumberOfBytesRead always 0x30 length?
WriteFile(hEncryptedFile, &Buffer, NumberOfBytesRead, &NumberOfBytesWritten, 0);

получается, что в конце каждого файла записана информация о трёх разных ключах, блок зашифрован RSA и имеет длину в 48 байт

изучив инфу по RSA, приходим к выводу, что нам нужны следующие данные e, q, p:

e is 65537

берём из публичного ключа, который находится внутри локера

p is 5912605435096223331759882809777952221885952762402503633273

также присутствует внутри локера, изначально накрыт base64

q is 5814414875264949082167904140630850217837158877593863758693

находится в JScript-дроппере, который мы исследовали ранее

теперь получаем private-ключ, руководствуясь https://reverse-pub.ru/2016/09/12/взлом-короткого-ключа-rsa/

пробуем расшифровать последние 48 байт для каждой картинки

1.jpeg.[govnoloker2020@covid.me].KVEST - k1 = 74,k2 = 114,k3 = 107
2.jpeg.[govnoloker2020@covid.me].KVEST - k1 = 26,k2 = 27,k3 = 50
3.jpeg.[govnoloker2020@covid.me].KVEST - k1 = 103,k2 = 78,k3 = 107
4.jpeg.[govnoloker2020@covid.me].KVEST - k1 = 84,k2 = 91,k3 = 36

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

Python:
b = bytearray(open('1.jpeg.[govnoloker2020@covid.me].KVEST', 'rb').read())[:-48]

k1 = 74
k2 = 114
k3 = 107

for i in range(len(b)):
    if b[i] != k3 and b[i] != 0:
        b[i] ^= k3

for i in range(len(b)):
    if b[i] != k2 and b[i] != 0:
        b[i] ^= k2
      
for i in range(len(b)):
    if b[i] != k1 and b[i] != 0:
        b[i] ^= k1

open('1.jpeg', 'wb').write(b)

и спасаем всех котанов ;)
 
thereminvox - поздравляю! Вот и нашелся наш 3й финалист. Мы вас ждали =)

Ребята, не пугайтесь, все нормально. 3й финалист хоть и с сегодняшней регой, здесь нет никакого подвоха =) Человек с другого форума, из числа админ.состава. Если он захочет и кому-то это будет нужно, расскажет о себе подробнее.
 
А как пароль на вход в пастбин получился, его нужно было расшифровать из ссылки домена, или просто догадаться, я там уязвимость в пастбине начал искать, гы-гы...

Потом у меня появились дела и забил.)))
 
Пожалуйста, обратите внимание, что пользователь заблокирован
А как пароль на вход в пастбин получился
Ссылка на пастебин, переходим туда, требует пароль. Пароль стандартый (под которым на форуме выкладывают базы и прочие фишки, т.е. xss.pro).
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх