Task 9
Rakovsky Stanislav, Unicorn TeamНа периметре компании обнаружен веб-сервер
http://18.193.113.102/
, вам необходимо прочитать флаг находящийся на файловой системе.
На основной странице нас ожидает Not found. Присмотримся к хэдерам ответа, Werkzeug/1.0.1 Python/3.8.5
- нас ожидает что-то самописное, возможно сервер на фласке.
Просканим пути с помощью dirb. Найдена лишь одна директория - home/, которая на нас ругается запретом. Просканив ее, ничего не получили.
Окке, используем dirsearch. Нашли /access.log в корне. Файл представляет собой активность пользователей с 21 марта по... ну, очевидно, скрафчен этот артефакт руками и не очень корректно:
193.76.191.88 - - [31/Mar/2021:23:59:11 +0300] "POST /search/tag/list HTTP/1.0" 200 5012 "Mozilla/5.0 (compatible; MSIE 6.0; Windows 95; Trident/3.1)" 188.193.213.216 - - [01/Mar/2021:00:04:05 +0300] "GET /apps/cart.jsp?appID=9941 HTTP/1.0" 200 5070 "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_8_9; rv:1.9.3.20) Gecko/2017-06-13 22:13:39 Firefox/3.8"
Но нам это не особо важно) Выделим из запроса только пути.
>> with open("access.log", "r") as f: ... l = f.readlines() ... >>> l[0].split('"') ['151.226.155.255 - - [21/Mar/2021:23:53:21 +0300] ', 'GET /wp-admin HTTP/1.0', ' 500 4920 ', 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/5331 (KHTML, like Gecko) Chrome/13.0.833.0 Safari/5331', '\n'] >>> s = set() >>> for line in l: ... _ = line.split('"')[1] ... s.update({_}) ... >>> s
Выделяется огромное количество операций над /apps/cart.jsp
>>> sum(["cart.jsp" in i for i in s])/len(s) 0.9761146496815286
Тогда сначала приглядимся к тем запросам, которые не относятся к ним.
>>> [i for i in s if "cart.jsp" not in i] ['PUT /explore HTTP/1.0', 'GET /app/main/posts HTTP/1.0', 'GET HTTP/1.0', 'GET /wp-content HTTP/1.0', 'PUT /search/tag/list HTTP/1.0', 'POST /app/main/posts HTTP/1.0', 'DELETE /list HTTP/1.0', 'GET /explore HTTP/1.0', 'GET /home HTTP/1.1', 'DELETE /posts/posts/explore HTTP/1.0', 'GET /posts/posts/explore HTTP/1.0', 'POST /wp-content HTTP/1.0', 'PUT /list HTTP/1.0', 'PUT /wp-admin HTTP/1.0', 'DELETE /explore HTTP/1.0', 'DELETE /search/tag/list HTTP/1.0', 'GET /list HTTP/1.0', 'POST /wp-admin HTTP/1.0', 'PUT /posts/posts/explore HTTP/1.0', 'POST /search/tag/list HTTP/1.0', 'PUT /wp-content HTTP/1.0', 'POST /posts/posts/explore HTTP/1.0', 'DELETE /app/main/posts HTTP/1.0', 'DELETE /wp-admin HTTP/1.0', 'GET /search/tag/list HTTP/1.0', 'DELETE /wp-content HTTP/1.0', 'POST /list HTTP/1.0', 'GET /home/sif HTTP/1.1', 'PUT /app/main/posts HTTP/1.0', 'POST /explore HTTP/1.0']
За глаз цепляется, что все эти запросы, кроме нашего /home и /home/sif, работают по HTTP/1.0. Заглянув в файл, становится понятным, что это в принципе два запроса, которые работают на ином протоколе.
По урлу /home/sif нас ждет строка поиска.

На уровне инстинкта любого цтф-ера должно быть: посмотреть в .bash_history
, .bashrc
, ключики из .ssh
)


Похоже, мы нашли флаг: flag{kekpekn1cet0m33ty0u}
Посмотреть на .ssh/id_rsa
нам не позволяют. Прочитать ../../../../../etc/passwd
- тоже.
При попытке забрать staj_path_trav.zip
, в нас метают 500-й ошибкой.