20 февраля в рамках Московского Технологического Марафона прошел пятый этап Кибертона - соревнования по информационной безопасности в формате task-based CTF. Разбор некоторых заданий - в этой статье.
Мы наткнулись на файл неизвестного происхождения
Нам удалось выяснить что ценная информация
спрятана между двумя словами, в первом из которых встречаются латинские буквы bz и две цифры подряд,
а второе - длиной от 15 до 18 символов c латинскими буквами xp.
Регистр не важен. найденную строку обернуть в CYBERTHON{}
http://web.ctf.msk.ru/ctn2020jjkkllss/web6/REgular_Task/mess.txt
Открываем текстовый файл и видим кучу слов. Название таска намекает на использование регулярных выражений.
Вариант решения номер 1:
составляем регулярное выражение, забиваем текст в любой редактор, поддерживающий такой поиск и находим флаг.
Например такое:
([\w\d]*\d{2}[\w\d]*bz[\w\d]*|[\w\d]*bz[\w\d]*\d{2}[\w\d]*)\s([\w\d]+)\s(?=\b[\w\d]{15,18}\b)[\w\d]*xp[\w\d]*
Вариант номер 2:
то же самое, но в питоне
import re
with open("mess.txt") as f:
content = f.read()
res = re.findall(r"([\w\d]*\d{2}[\w\d]*bz[\w\d]*|[\w\d]*bz[\w\d]*\d{2}[\w\d]*)\s[\w\d]+\s(?=\b[\w\d]{15,18}\b)[\w\d]*xp[\w\d]*", content, flags=re.IGNORECASE)
print(res)
Вариант номер 3:
Без регулярок, для сильных духом
with open("mess.txt") as f:
content = f.read()
m1 = set()
m2 = set()
text = content.lower().split()
for idx, word in enumerate(text):
if "bz" in word:
for pair in list(zip(word,word[1:])):
if pair[0].isdigit() and pair[1].isdigit():
m1.add(text[idx+1])
elif "xp" in word and 15 <= len(word) <= 18:
m2.add(text[idx-1])
print(m1.intersection(m2)) # пересечение множеств
# Задание: доработать программу (запустите и поймите в чем проблема, исправьте)
P.S
Протестировать свои регулярные выражения можно здесь
P.P.S
Кто написал регулярку короче - тот молодец
Говорят, самые очевидные вещи скрываются прямо перед глазами.
ssh cyberthon@194.87.95.137
password: Ricardo2020
Заходим на сервер по ssh(в windows можно использовать программу putty или wsl):
Смотрим файлы в домашней директории. Вспоминаем про скрытые файлы. используем команду ls -la
для просмотра всех файлов.
Находим флаг в скрытом файле .flag
Я себе построю дом,
Много места будет в нём!
Будет в доме стол и печка.
Я пущу в свой дом овечку.
Петушка пущу в свой дом,
Ну и курочку - при нём.
И корову, и козляток,
И лошадок - поросяток.
Пса с котом – само собой,
Веселее им со мной.
Гусь мне нужен для порядка,
Кто шалит – щипнёт за пятку.
Будет филин с нами жить –
Ночью домик сторожить...
Но стал я что-то сомневаться:
сисадмины согласятся?
P.S: согласились
ssh cyberthon@194.87.95.137
password: Ricardo2020
Заходим на сервер. Обращаем внимание на файл hello.txt
если ещё не обратили ранее.
cyberthon@ruvds-gle8p:~$ cat hello.txt
Welcome into my big house. Please relax and enjoy the tasks.
Используем всю мощь ассоциативного мышления и понимаем что дом - это наш сервер. Что значит пустить в свой дом кого-то? Правильно, создать юзера. Как посмотреть список жителей дома пользователей сервера?
cat /etc/passwd
cyberthon@ruvds-gle8p:~$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
...
cyberthon:x:1000:1000::/home/cyberthon:/bin/bash
stol:x:999:999::/home/stol:/bin/false
pechka:x:998:998::/home/pechka:/bin/false
ovechka:x:997:997::/home/ovechka:/bin/false
petushok:x:996:996::/home/petushok:/bin/false
kurochka:x:995:995::/home/kurochka:/bin/false
korova:x:994:994::/home/korova:/bin/false
kozlyata:x:993:993::/home/kozlyata:/bin/false
loshadki:x:992:992::/home/loshadki:/bin/false
porosyatki:x:991:991::/home/porosyatki:/bin/false
pes:x:990:990::/home/pes:/bin/false
kot:x:989:989::/home/kot:/bin/false
goose:x:988:988::/home/goose:/bin/false
philin:x:987:987::/home/philin:/bin/false
CYBERTHON{T00_ManY_Use3s}:x:986:986::/home/CYBERTHON{T00_ManY_Use3s}:/bin/false
Имя последнего пользователя является флагом.
В системе обнаружен подозрительный сервис. Сможешь ли ты выяснить его тайны?
ssh cyberthon@194.87.95.137
password: Ricardo2020
Посмотрим с каким дистрибутивом мы имеем дело:
cyberthon@ruvds-gle8p:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.1 LTS
Release: 18.04
Codename: bionic
Ага, убунту версии 18.04
гуглим что-то по типу:
list all running services on ubuntu 18.04
Находим команду:
systemctl list-units --type=service
● VErY_St3anGe.service loaded failed | failed | Very strange systemd service.
Замечаем подозрительный сервис, который еще и упал. Смотрим информацию о статусе сервиса:
systemctl status VErY_St3anGe.service
Замечаем что это скрипт, который запускается питоном и лежит в /usr/bin
cyberthon@ruvds-gle8p:~$ cat /usr/bin/script.py pRint("HELLO WORLD!")
Вроде ничего примечательного. Пробуем посмотреть логи нашего сервиса:
journalctl -u VErY_St3anGe.service
Замечаем, что ранее файл имел другое содержание, но оно было изменено с флага на HELLO WORLD!
Догадаться о том, что есть возможность посмотреть логи systemd сервиса можно было посмотрев группы нашего пользователя.
cyberthon@ruvds-gle8p:~$ cat /etc/group
...
nogroup:x:65534:
systemd-journal:x:101:cyberthon
...
Мы обнаружили интересную систему авторизации. Есть ли в ней уязвимости?
http://45.143.94.76:4343/login
Заходим на сайт:
Пробуем admin admin
, sql иньекцию
и нет... все не так просто.
Попробуем зарегестрировать нового пользователя:
Замечаем просьбу потвердить email, поэтому укажем действительный адрес. (Например можно воспользоваться сервисом TempMail для получения почты на небольшое время) И действительно, на почту приходит письмо с токеном потверждения почты. Переходим по ссылке и потверждаем почту.
Обращаем внимание на токен потверждения почты: ...DUIBQPU%3D%3D%3D%3D%3D%3D
Хм, интересный формат. Вернемся к нему позже.
Далее пробуем зайти в аккаунт и видим:
Hello, Jotaro
flag only for admin
Значит нам нужно зайти за админа. Вспомним про странный формат токена. %3D%3D%3D%3D%3D%3D
является ничем другим как =====
(url decode). А вот это уже должно быть нам знакомо. Пробуем декодировать(а как это сделать просто я расскажу на 4 мастер классе Геккона). Выясняем, что это base32
. Декодируем токен и получаем json:
{"username": "Jotaro", "carma_level": 0, "luck": 0}
С потверждением почты мы ничего сделать не можем. Вспоминаем, что на сайте есть кнопочка Forgot password
:
Как раз то, что нам нужно! Вставляем почту, которую мы указали при регистрации и получаем письмо с токеном аутентификации. Декодируем и подставляем в поле username
значение admin
{"username": "admin", "carma_level": 0, "luck": 0}
Кодируем обратно в base32 и заходим по токену админа:
Hello, admin
CYBERTHON{4eck_Y0u3_T0kens}