Представляю райтапы на задачи отборочного этапа Dubna CTF 2021, проводимого между НИУ МЭИ и Университетом Дубны.
Список реализованных задач:
[0 pts, admin] 1_b3l13v3_wh4t_y0u_s41d
[516 pts, admin] 1_w1sh_1_c0uld_s3cur3_my_l0v3
[324 pts, forensics] 1_w1sh_t0_b3_gl4d_7o_s33_y0u_w3ll
[1000 pts, reverse] 1_w1sh_1_w1ll_r3v3rs3_y0ur_r3m0t3_4dm1n_t00l
- в отдельном посте[744 pts, web] 1_w1sh_t0_b3_g00gl3
[100 pts, web] 1_w1sh_t0_b3_y0ur_4l1b1
[100 pts, reverse] 1_w4n7_70_b3_c4lcul473d
[0 pts, admin] 1_b3l13v3_wh4t_y0u_s41d
Один маленький сокет очень хочет быть услышанным!
`nc 51.15.57.105 9999`
fyi: Стоимость этого таска спускается до 0, если его решит много людей. Have fun!
Автор: @hexadec1mal
Запускаем:
nc 51.15.57.105 9999
Fla..g
Seeking...
Venom...
Hi-Fi Anatomia album...
Nemuru machi...
Waiting for the rain...
Hiding...
Vermont kiss...
MPEI!
Hi-Fi Anatomia album...
dub...na
Seeking...
dub...na
Hi-Fi Anatomia album...
Seeking...
F.L.A.G!
dub...na
Flag...
Seeking...
What are you talking about?
MPEI!
Nemuru machi...
ehh...
Wondering...
Vermont kiss...
Venom...
Hi-Fi Anatomia album...
<...>
Seeking...
Wondering...
Seeking...
Hiding...
Fla..g
,_ _
|\_,-~/
/ _ _ | ,--.
( @ @ ) / ,-'
\ _T_/-._( (
/ `. | _ \ |
\ \ , / |
|| |-_\__ /
((_/`(____,-'
Flag...
Hiding...
Waiting for the rain...
Wondering...
Vermont kiss...
<...>
MPEI!
mp...ei?
ehh...
dub...na
Seeking...
Vermont kiss...
Vermont kiss...
Waiting for the rain...
Вариантов решения два:
Сохранить пару минут потока, найти там файл. Это можно сделать перенаправлением stdout в файл:
> nc 51.15.57.105 9999 > out.txt
Второй вариант - сразу grep-нуть:
> nc 51.15.57.105 9999 | grep "dubna{"
dubna{y0u_h34rd_m3_gz}
[516 pts, admin] 1_w1sh_1_c0uld_s3cur3_my_l0v3
Наш приятель 51.15.57.105 совсем захандрил, что начал хостить не совсем веб-сервисы...
Просканьте его и найдите причину его печали.
Автор: @hexadec1mal
Решение:
В ходе сканирования мы найдем три открытых порта: 21, 80, 9999. Про два последних известно, что они принадлежат другим таскам на этом сервере.
На 21-м порту находится ftp, с поддержкой анонимного входа. Там нас ждут картинки про котов и картинка про то, что чел спрашивает насчет вопроса о файлах, начинающихся на точку. Они не отображаются в ftp и в firefox по умолчанию, зато из палит WinSCP. Подключаемся командой nc или cat к серверу, переходим в пассивный режим (pass), делаем ls -la. Находим скрытый файл с ключом:
Флаг: dubna{h1dd3n_l0ve_sh0uld_b3_cur3d_4s4p}
[324 pts, forensics] 1_w1sh_t0_b3_gl4d_7o_s33_y0u_w3ll
Мы вместе думали, что будет классно зашифровать что-нибудь старым-добрым уязвимым алгоритмом... Заодно послушать тересные песни... Что скажешь?
Автор: @hexadec1mal
forensics_1_w1sh_t0_b3_gl4d_7o_s33_y0u_w3ll.zip
Это очень популярный и гуглимый таск, есть plaintext attack на алгоритм zipcrypto, вот одна из реализаций: https://github.com/kimci86/bkcrack
Раньше приходилось компилить, но теперь есть даже релиз для винды.
bkcrack.exe -C forensics_1_w1sh_t0_b3_gl4d_7o_s33_y0u_w3ll.zip -c lyrics.txt -p lyrics.txt
bkcrack 1.2.2 - 2021-04-15
[16:57:53] Z reduction using 761 bytes of known plaintext
100.0 % (761 / 761)
[16:57:54] Attack on 14930 Z values at index 38
Keys: 9b8ec7d9 18c6e10a 62874f1e
86.0 % (12838 / 14930)
[16:58:15] Keys
9b8ec7d9 18c6e10a 62874f1e
Учитывая, как много байт я дал, у меня атака прошла даже меньше чем за минуту.
Затем просто расшифровываем:
bkcrack.exe -C forensics_1_w1sh_t0_b3_gl4d_7o_s33_y0u_w3ll.zip -c flag.txt -k 9b8ec7d9 18c6e10a 62874f1e -d out_flag.txt
bkcrack 1.2.2 - 2021-04-15
[17:03:07] Writing deciphered data out_flag.txt (maybe compressed)
Wrote deciphered data.
Флаг: dubna{_but_1_m0r3_jus7_l177l3_cur1o0s_}
Пароль от архива (не должен пригодиться): i think this password will be unbeatable i suppose
[744 pts, web] 1_w1sh_t0_b3_g00gl3
Эх, знаете, у любого сервера есть сакральные желания... Например, http://51.15.57.105 с момента своего создания всегда мечтал быть Гуглом...
Помогите ему исполнить такую вот простую v1r7u4l h0s7Z просьбу.
Автор: @hexadec1mal
В моём конфиге nginx настроено взаращение статической страницы с флагом для запросов с хостом google.ru/google.com. Нужно с помощью wget/acunetix/правки файла hosts обозначить HTTP-заголовок google.com на этот айпишник и преодолеть возможнын проблемы с HSTS)
Пример запроса, который может забрать флаг:
wget --header="Host: google.com" http://51.15.57.105/
Конфиг nginx, если кому пригодится для своих тасков:
server {
listen 80;
root /www/data/google.com;
server_name google.com google.ru
location / {
}
}
Какую страницу я возвращал при правильной подмене:
<!DOCTYPE HTML>
<html>
<head>
<!-- Wow! Really thank you for redirection. dubna{w4Nn4_b3_g00Gl3_s0_much} -->
<meta charset="UTF-8">
<meta http-equiv="refresh" content="0; url=https://google.com">
<script type="text/javascript">
window.location.href = "https://google.com"
</script>
</head>
<body>
</body>
</html>
[100 pts, web] 1_w1sh_t0_b3_y0ur_4l1b1
And I never
Be your alibi...
Грустно мне. Грустно и одному маленькому веб-серверу, который тоже, как и в песне, хотел бы стать для кого-то чем-то большим. Он так томно вздыхает о прошлом... А вдруг... Что-то осталось о его прошлом... Нам нужно узнать, как сайт пришел к своему the bitter end.
http://51.15.57.105
Автор: @hexadec1mal
На сайте - просьба wayback-нуть какие-нибудь доказательства. В Wayback machine есть снимок со старой версией сайта, где расположена песня the bitter end и ссылка пройти авторизацию. На странице (https://web.archive.org/web/20210424115644/http://51.15.57.105/) перед окончанием оригинальной вставки сайта есть комментарий:
f93fc10472a31bb3061aa0b45e228c5a - md5(“strongspassword”), хэш гуглится в радужных таблицах.
Если пройти basic auth по ссылке с кредами admin:strongpassword, то вывалится флаг.
Как настроен nginx для этого таска:
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
location /auth_inner_page {
auth_basic "Admin panel";
auth_basic_user_file /var/www/html/.htpasswd;
}
}
[100 pts, reverse] 1_w4n7_70_b3_c4lcul473d
Учиться здорово. Здесь время и усердие напрямую конвертируются в способности и знания. А давайте-ка... порешаем немножечко ассемблер intel x86?
mov eax, 10
mov ebx, 15
mov ecx, 100
push ecx
pop edx
add eax, eax
add ebx, eax
sub ecx, ebx
xor edx, edx
add eax, edx
inc edx
dec ecx
dec ecx
dec ecx
add eax, ecx
add edx, eax
sub ecx, ebx
sub ebx, ecx
sub edx, eax
nop
Формат флага: dubna{eax_ebx_ecx_edx}
Все числа десятизначные.
Автор: @hexadec1mal
Можно попробовать решить задачу step-by-step, можно воспользоваться онлайн-компиляторами, также можно взять эмулятор типа qiling/miasm, на одном из которых я проверял решение :3
Для практики просто решим ручками:
mov eax, 10 ; eax = 10
mov ebx, 15 ; eax = 10; ebx = 15
mov ecx, 100 ; eax = 10; ebx = 15; ecx = 100
push ecx ; eax = 10; ebx = 15; ecx = 100; stack = [100, ]
pop edx ; eax = 10; ebx = 15; ecx = 100; edx = 100; stack = []
add eax, eax ; eax = 20; ebx = 15; ecx = 100; edx = 100
add ebx, eax ; eax = 20; ebx = 35; ecx = 100; edx = 100
sub ecx, ebx ; eax = 20; ebx = 35; ecx = 65; edx = 100
xor edx, edx ; eax = 20; ebx = 35; ecx = 65; edx = 0
add eax, edx ; eax = 20; ebx = 35; ecx = 65; edx = 0
inc edx ; eax = 20; ebx = 35; ecx = 65; edx = 1
dec ecx ; eax = 20; ebx = 35; ecx = 64; edx = 1
dec ecx ; eax = 20; ebx = 35; ecx = 63; edx = 1
dec ecx ; eax = 20; ebx = 35; ecx = 62; edx = 1
add eax, ecx ; eax = 82; ebx = 35; ecx = 62; edx = 1
add edx, eax ; eax = 82; ebx = 35; ecx = 62; edx = 83
sub ecx, ebx ; eax = 82; ebx = 35; ecx = 27; edx = 83
sub ebx, ecx ; eax = 82; ebx = 8; ecx = 27; edx = 83
sub edx, eax ; eax = 82; ebx = 8; ecx = 27; edx = 1
nop
Qiling подтверждает данное решение:
[+] eax : 0x52
[+] ecx : 0x1b
[+] edx : 0x1
[+] ebx : 0x8
Ответ: dubna{82_8_27_1}