Hack the box - получаем приглашение в лабораторию для хакеров

Tartuga

Бывалый
ПРОВЕРЕННЫЙ ПРОДАВЕЦ
PREMIUM USER

Tartuga

Бывалый
ПРОВЕРЕННЫЙ ПРОДАВЕЦ
PREMIUM USER
Регистрация
7 Фев 2020
Сообщения
525
Реакции
98
Репутация
147

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

это бесплатная Pentesting Lab. (Лаборатория пентеста) в которой вы можете усовершенствовать свои навыки взлома и научится чему-то новому.
Но обычным пользователям туда не попасть, вход только для избранных хацкеров. Для того, чтобы попасть в HTB нам нужно взломать систему приглашений и получить свой уникальный инвайт код. Сегодня мы с тобой этим и займёмся, поiхали!
Открываем главную страницу

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

:

Пролистав чуть ниже ты должен найти кнопку Join:

Переходим и видим следующие:

В заголовке страницы написано: "Can you hack this box?". Вызов принят. Для начала открываем просмотр кода страницы: ПКМ -> Искодный код страницы
Весь код написан в одной строке

Нажимаем Ctrl + F и ищем все скрипты.js. Нам нужен лишь один - inviteapi.min.js:

Перейдя по которому мы можем найти нужный нам POST запрос - makeInviteCode

Переходим обратно на страницу с

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

нажимаем F12, и открываем консоль:

В консоли пишем: makeInviteCode () и получаем следующие:
data: "Va beqre gb trarengr gur vaivgr pbqr, znxr n CBFG erdhrfg gb /ncv/vaivgr/trarengr"​
enctype: "ROT13"​

Всё что написано в кавычках - зашифрованный текст методом ROT с ключом 13. Об этом говорит строка enctype: "ROT13". Те, кто проходил мой мини-квест по криптографии уже знают как его декордировать. Мы с тобой будем использовать

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

для декодирования ROT13.

"In order to generate the invite code, make a POST request to /api/invite/generate"​

Если мы перейдём по пути hackthebox.eu/api/invite/generate Появляется надпись о том, что мы не на верном пути:

Нам нужно сделать POST запрос. Делается это при помощи дополнительного расширения для браузера HackBar (

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

/

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

)
F12 -> HackBar.
Теперь в самом ХакБаре тыкаем на Load URL:

Также нажимаем на Post data (т.к нам нужно сделать POST запрос) в поле для ввода вписываем:
POST /?foo=bar HTTP/1.1
Host: hackthebox.eu
Connection: close

Теперь нажимаем Execute и наш запрос отправился. В ответе от сервера видим следующее:

Казалось бы , что это то, что мы искали, но нет. Код зашифрован в Base64, об этом говорит символ "=" в конце. Опять декодируем текст в

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

декодере:

Этот код окончательный. Вводим его в поле для инвайта:

И у нас показывается поздравление о прохождении и поля для регистрации:

Подтверждаем почту, логинимся.

Для примера решим одно из сотен заданий в лаборатории. И поймём как нарабатывать практику.
Задание называется Snake

Скрин задания​
Качаем архив, запускаем скрипт. Весь скрипт (Python 2.7):
#!/usr/bin/python2.7
import random
lr = '\x64'
print '''
___________.__ _________ __
\__ ___/| |__ ____ / _____/ ____ _____ | | __ ____
| | | | \_/ __ \ \_____ \ / \\__ \ | |/ // __ \
| | | Y \ ___/ / \ | \/ __ \| <\ ___/
|____| |___| /\___ > /_______ /___| (____ /__|_ \\___ >
\/ \/ \/ \/ \/ \/ \/

'''
chains = [0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x72, 0x6f, 0x6c, 0x6c]
db = '\x6e'
ef = '\x63'
chars = []
keys = [0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x21, 0x21]
nn = '\x61'
lock_pick = random.randint(0, 0x3e8)
lock = lock_pick * 2
password = [0x69, 0x74, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x65, 0x61, 0x73, 0x79]
lock = lock + 10
ty = '\x61'
lock = lock / 2
auth = [0x6b, 0x65, 0x65, 0x70, 0x20, 0x74, 0x72, 0x79, 0x69, 0x6e, 0x67]
lock = lock - lock_pick
gh = '\x6e'
print 'The Snake Created by 3XPL017'
print 'Your number is ' + str(lock_pick)
for key in keys:
keys_encrypt = lock ^ key
chars.append(keys_encrypt)
for chain in chains:
chains_encrypt = chain + 0xA
chars.append(chains_encrypt)
aa = '\x61'
rr = '\x6f'
slither = aa + db + nn + ef + rr + gh + lr + ty
print 'Authentication required'
print ''
user_input = raw_input('Enter your username\n')
if user_input == slither:
pass

else:
print 'Wrong username try harder'
exit()
pass_input = raw_input('Enter your password\n')
for passes in pass_input:
for char in chars:
if passes == str(chr(char)):
print 'Good Job'
break
else:
print 'Wrong password try harder'
exit(0)
break
При запуске скрипт генерирует случайное число с помощью random.randint(0, 0x3e8) и выводит в строке "Your number is ...", но это было лишь для отвлечения внимания.
Первым делом я решил решить первую часть - Юзернейм. Проанализировав код, стало понятно, что за юзернейм отвечают эти строки:

А если быть точнее, то переменная slither это и есть наш юзернейм, было множество вариантов как решить первую часть "головоломки", и я придумал самую простую: просто вывести эту переменную на экран!

print '\nU53RN4M3: ' + slither

Запускаем скрипт, смотрим вывод:

Юзернейм - anaconda. Если юзернейм верный, скрипт запросит пароль, что собственно и произошло:

Т.к мы решали лишь первую часть, пароль нам неизвестен. Проанализировав код на функцию пароля нашёл эти строки:

Passes - пароль. Единственная загвоздка в том, что passes - не переменная. Соответственно сделать также, как и с юзернеймом не получится (потому-что пароль можно вывести в консоль, только после его объявления, а объвляется он когда верный, а мы его не знаем, замкнутый круг). Но я придумал довольно хитрую штуку: Вывести пароль при неверном заполнении, то есть ввести любые символы, а после строки "Wrong password try harder" вывести настоящий пароль, потому-что он уже объявлён.

print '\nP455W0RD; ' + str(chr(char))

Запускаем, вводим правильный юзернейм и НЕправильный пасс:

u ? серьёзно?

Видимо серьёзно...
Но на этом мы не останавливаемся, расскажу ещё способы решения этой задачки.
1 вариант.
Просто поменять значение переменной slither, например на D$_Admin, почему нет?

slither = 'D$_Admin'


2 вариант.
В этом варианте подойдёт абсолютно любой юзернейм путём спроса у пользователя:

slither = raw_input('Who?\n')



Было ещё много вариантов решения, но эти самые простые.
 
Сверху