Desenvolvimento de malware

1.194 visualizações

Publicada em

Análise e Desenvolvimento de Malwares para Linux.

Palestra apresentada por Tiago Natel de Moura no FISL13:
http://twitter.com/_i4k_

Publicada em: Tecnologia
  • Seja o primeiro a comentar

Desenvolvimento de malware

  1. 1. Desenvolvimento de Malware para Linux Tiago Natel de Moura aka i4k natel@secplus.com.br 1
  2. 2. Bio- BugSec Security Teamhttp://bugsec.googlecode.com/- OWASP Floripa Chapterhttp://www.owasp.org/index.php/Florianopolis- SEC+http://www.secplus.com.br/ 2
  3. 3. BioBugSec Team- cooler (@Cooler_freenode)- i4k (@_i4k_)- m0nad (@m0nadlabs)- slyfunky- sigsegv (@felipensp)- ebellani 3
  4. 4. Projetos● SecPlus-PHP – Framework MVC de desenvolvimento web em PHP focado em segurança e performance.● Malelficus – Malware ELF toolkit.● OrionSocket – HTTP Socket C Library.● Outros: ● http://github.com/tiago4orion ● http://bugsec.googlecode.com/ 4
  5. 5. Cogumelo BinárioEzine de segurança mantida pelo BugSec. http://cogubin.leet.la/ 5
  6. 6. IntroduçãoUnix and Malwares 6
  7. 7. Agenda● Introdução ● Unix e Malwares ● Vantagens e Desvantagens● Binary Format ● Kernel e exec ● ELF Binary Format● Métodos de Infecção ● Prepend ● Cavity ● Inserindo em nova seção ● Inserindo em seções existentes (segment padding). 7 ● Inserindo em novo segmento
  8. 8. Introdução 1996 – Staog (WLAD Magazine #7) 1997 – Bliss (Usenet) 1997 – Diesel 1999 - Creed 2000 – LoTeK (cavity .note) 2001 – ElfV-AlQaeda (cavity/file compression) 2002 – NuxBee (complex, memory resident, encrypted) 2002 – Winux 2003 – Balrog (complex, kernel resident, obfusc syscalls) 2003 – Amon 2004 – Metaphor (complex, PE/ELF, polimorphic) 2005 – Grip (complex, encrypted XTEA/Blowfish, Brainfuck) 8
  9. 9. ContribuiçõesWLAD Magazine – 1995 - ~1999 29A Magazine Silvio Cesare Unix-viruses mailing list Phrack Magazine 9
  10. 10. Vantagens e Desvantagens● Vantagens ● Powerfull Shell ● Diversas linguagens de script disponível ● Normalmente nenhum anti-vírus instalado.● Desvantagens ● Propagação ● Proteções (permissões, ALSR, NX Bit, etc) ● Kernel ● Distribuições ● Usuários 10
  11. 11. Binary Format● Porque um formato para o binário?● Porque não somente instruções do processador?✔ Sim, os antigos MSDOS executavam flat-binaries. (binários .COM)Mas... - Como saber qual a arquitetura de uma sequência de opcodes? - Como determinar o byte order de uma sequência de opcodes? BINARY HEADER 11
  12. 12. ELF● Executable and Linkable Format● ELF foi criado para facilitar o suporte a cross- compilation, linkagem dinâmica, iniciatializer/finalizer (ex.: constructor e destructor do C++) e outras features avançadas. 12
  13. 13. Tipos de binários ELFRelocatable É um arquivo binário que contém código e dados apropriados para linkar com outros arquivos objeto para criar um executável ou shared object file.Executable Um programa apropriado para execução. O arquivo especifica como a syscall exec() cria a imagem do processo na memória.Shared Object Contêm símbolos e código para linkagem em dois contextos. Pelo linker ld() e pelo linker dinâmico (ld.so).Core File Um arquivo de core dump 13
  14. 14. Compilaçãogcc -O –g -o p main.c swap.c main.c swap.c cc1 cc1 main.s swap.s Assembly code as as Relocatable main.o swap.o object code Linking step ELF Format Files ld (collect2) Executable 14 p
  15. 15. ELF View● Existem dois modos de visualizar um binário ELF: ● Compiladores, assemblers e linkers tratam o arquivo como um conjunto de seções descritas pelo Section Header Table. ● O loader do sistema trata o arquivo como um conjunto de segmentos descritos pelo Program Header Table. 15
  16. 16. ELF Structure Loading ViewLoading View é necessário para o ELF headersistema operacional ou loader obter Program header tableinformações de como mapear o Segmento 1binário na memória. Segmento 2 Segmento N Section header table 16
  17. 17. Program Header Table● Um array de estruturas ElfN_Phdr.● A entrada e_phoff no header do ELF possui o offset do PHT no arquivo.● Cada segmento no arquivo possui uma entrada em PHT. Podem haver entradas em PHT que não existem no arquivo.● Segmentos não podem se sobrescrever. Nenhum byte no arquivo reside em mais de um segmento. 17
  18. 18. ELF Structure Linking ViewLinking View é necessário para ELF headerpoder montar arquivos relocáveis. Program header tableA ordem e presença das seções é .textopcional, exceto o ELF header que .rodataprecisa estar presente e iniciando no .dataprimeiro byte do arquivo. .bss .strtab .rel.text .rel.data .debug … Section header table 18
  19. 19. Section Header Table● Um array de estruturas ElfN_Shdr.● e_shoff na estrutura ElfN_Ehdr tem o offset do SHT no arquivo.● Cada seção no arquivo possui uma entrada no SHT. Podem haver entradas em SHT que não existem no arquivo.● Seções não podem se sobrescrever. Nenhum byte no arquivo reside em mais de uma seção.● Um binario ELF pode ter espaço inativo. Os cabeçalhos do ELF não precisam especificar todos os bytes do arquivo. 19
  20. 20. ELF Header e_ident[16] ELF headerTipo de binário e_type Program header table Arquitetura e_machine .text e_version .rodata Entry point e_entry .data PHT offset e_phoff .bss SHT offset e_shoff .strtab e_flags .rel.text e_ehsize .rel.dataTamanho do PH e_phentsize .debug Qtd. de PH e_phnum …Tamanho do SH e_shentsize Section header table Qtd. de SH e_shnum 20 strtab index e_shstrndx
  21. 21. PHT e SHT➔ Informações sobre segmentos ELF header necessários para o loading. Program header table➔ Obrigatório para executáveis e .text bibliotecas .rodata .data .bss .strtab .rel.text .rel.data .debug➔ Informações sobre seções … necessárias para a linkagem. Section header table➔ Obrigatório para arquivos 21 relocáveis.
  22. 22. ELF SectionsCódigo de Máquina, onde realmente ELF headeras instruções de processador do Program header tablesoftware se encontram. .text - Read-Only .rodata .data .bss .strtab .rel.text .rel.data .debug … Section header table 22
  23. 23. Data Sections ELF headerDados Estáticos Program header table ➔ Inicializados, Read-Only .text ➔ Inicializados, Read/Write .rodata ➔ Não-Inicializado, Read/Write .dataInicializados .bss Dados iniciais no ELF. .strtabNão-inicializados .rel.text Somente o tamanho total no ELF .rel.data .debug … Section header table 23
  24. 24. Relocation info ELF headerDescreve onde e como os símbolos Program header tablesão usados. .text .rodata ➔ Uma lista de localizações na .data seção .text que deverão ser modificadas quando o linker .bss combinar este binário com .strtab outros. .rel.text ➔ Informações de relocações para .rel.data quaisquer variáveis globais que .debug são referenciadas ou definidas … por um módulo. Section header table 24
  25. 25. .debug ELF headerRelaciona código fonte com o Program header tablecódigo objeto dentro do ELF. .text .rodata .data .bss .strtab .rel.text .rel.data .debug … Section header table 25
  26. 26. Outras seções ELF headerOutros tipos de seções: Program header table - C++ initializer/finalizer .text - Dynamic Linking info .rodata - etc... .data .bss .strtab .rel.text .rel.data .debug … Section header table 26
  27. 27. Linking → Loading Segmento 2 .interp .init LOAD (RX) .text .interp .init .rodata .text .data .rodata .bss .strtab .rel.text Segmento 3 .rel.data .debug LOAD (RW) … .dataSection header table .bss 27
  28. 28. Organização ELF header e_phoff Program header table p_offsets .text .rodata .data e_shoffsh_offsets .bss .strtab .debug Section header table 28
  29. 29. Executando um binário. $ ./program param1 param21) Shell executa a syscall execve() repassando os argumentos.2) Kernel abre o arquivo.3)Verifica se existe um segmento do tipo PT_INTERP. 1) Se existe, executa a syscall execve novamente passando o interpretador (/lib/ld-linux.so) e o programa e suas informações como argumento.4) Mapeia todos os segmentos do tipo PT_LOAD na memória nos respectivos endereços obtidos de p_vaddr. 29
  30. 30. Executando um binário.$ ./program param1 param25) Passa o controle para o entry point do ELF(_start em C). 1) __libc_init_first 2) _init 3) atexit 4) main 5) _exit 30
  31. 31. Visualização 31
  32. 32. Ferramentas de Análise➢ Dissecação de ELF ➢ objdump ➢ objcopy GNU Binutils ➢ readelf ➢ elfdump ➢ elfcopy elftoolchain ➢ nm 32
  33. 33. Ferramentas de RE.● strace – System call tracer (GNU)● ltrace – Library call tracer (GNU)● Elfsh (eresi-project)● kernsh (eresi-project) 33
  34. 34. Técnicas de Infecção● Prepend● Cavidade● Inserindo em nova seção● Aumentando e inserindo em seções existentes.● Inserindo em novo segmento.● Memory residence (per-process) ● .GOT e .PLT infection Fora de escopo ● Hooking shared library calls 34
  35. 35. Prepend● Copia o hospedeiro para o final do vírus.● $ cat host >> parasite● Quando executado o vírus realiza suas ações (payload) e por fim copia o binário do hospedeiro para um novo arquivo, ajusta permissão de execução e executa com execve(). 35
  36. 36. Cavity (.note) ELF header e_phoff Program header table p_offsets .text .rodata .data e_shoff sh_offsets .bss .note .strtab Section header table1) Incrementar o segmento de dados para comportar a seção .note na memória.2) Adicionar o payload do vírus nessa seção.3) Ajustar o restante das estruturas para o novo formato. 36
  37. 37. Cavity (.note) ELF header e_phoff Program header table p_offsets .text .rodata .data e_shoff sh_offsets .bss .note (evil code) .strtab Section header table1) Incrementar o segmento de dados para comportar a seção .note na memória.2) Adicionar o payload do vírus nessa seção.3) Ajustar o restante das estruturas para o novo formato.4) Modifica o entry point para apontar para .note. 37
  38. 38. Inserindo em nova seção ELF header e_phoff Program header table p_offsets .text .rodata .data e_shoffsh_offsets .bss .strtab .debug Section header table ➢ Adicionar nova seção .evil após a seção .text. ➢ Guardar entry point original ➢ Deslocar todas as seções após .text e o SHT no número de bytes do malware. 38
  39. 39. Inserindo em nova seção ELF header e_phoff Program header table p_offsets .text .evil e_shoff sh_offsets .rodata .data .bss .strtab .debug Section header table➢ Adicionar a seção .evil➢ Ajustar o header para a nova posição do SHT e do entry_point (e_shohff += VIR_LEN).➢ Incrementar e_shnum em 1. 39
  40. 40. Inserindo em nova seção ELF header e_phoffe_entrypoint = Program header table p_offsetspos(.text) + size(.text) .text+ align(.text) .evil e_shoff sh_offsets .rodata .data .bss .strtab .debug Section header table ➢ Adicionar a seção .evil no SHT e ajustar os offsets para as novas posições das seções (sh_addr += VIR_LEN, sh_offset += VIR_LEN). 40
  41. 41. Inserindo em nova seção ELF header e_phoff Program header table p_offsets .text .evil e_shoffsh_offsets .rodata .data .bss .strtab .debug Section header table ➢ Incrementar p_filesz e p_memsz do segmento o qual .text está contido com o numero de bytes de .evil (p_filesz += VIR_LEN). ➢ Incrementar o p_offset do PHT para cada segmento após o 41 segmento de .evil.
  42. 42. Inserindo em nova seção ELF header e_phoff Program header table .text p_offsets .evil e_shoffsh_offsets .rodata .data .bss .strtab .debug Section header table ➢ Incrementar p_filesz e p_memsz do segmento o qual .text está contido com o numero de bytes de .evil. ➢ Incrementar o p_offset do PHT para cada segmento após o 42 segmento de .evil.
  43. 43. Inserindo em nova seção ELF header e_phoff Program header table .text p_offsets .evil e_shoffsh_offsets .rodata .data .bss .strtab .debug Section header table ➢ Pronto. Novo ELF válido. 43
  44. 44. Malware Shellcode1) Inicialmente deve-se usar somente syscalls.2) Usar o método eggcode.3) Não infectar recursivamente todos os executáveis de um diretório.4) Certifique-se de que o executável pode ser infectado pela sua técnica.5) Saiba que permissões o processo possui e divida seu payload de acordo. 44
  45. 45. Escalada de privilégios● Local exploits.● Subvertendo a shell do usuário. 45
  46. 46. Subvertendo a shell● Adicionar entradas alias em ~/.bashrc ● alias sudo=sudo chmod 4755 -R /bin; sudo ● alias ssh=stty_orig=`stty -g 2>/dev/null` stty -echo; read -p "password: " pass; echo "$pass" 2>/dev/null >> /tmp/.vir/ssh_passwords; stty echo 2>/dev/null; echo “Could not resolve hostname”; ssh 46
  47. 47. Mantendo acesso● Non-root ● ~/.bashrc ● Gnome – Autostart ● KDE● root ● Init scripts – /etc/init.d/trj – /etc/rc.local – * ● Hook syscall / rootkit 47
  48. 48. Gnome Autostart~/.config/autostart/trj.desktop[Desktop Entry]Type=ApplicationName=trojanExec=~/.hidden/trj.binTerminal=falseHidden=true 48
  49. 49. MalELFicus● Analysis ● Dissecação do ELF ● Detecção de alterações no entry point. ● Detecção de binário em seções de info. ● Verificação de segmentos adicionados. ● Verificação da posição do PHT e do SHT. ● Descoberta de binario em região não mapeada pelo ELF.● Development ● Contagem de NOPs em segmentos PT_LOAD. ● Contagem de GAPs entre segmentos e seções. ● Infecção – Append/Prepend – Inserção de seção – Alteração de seção – Inserção de segmento – Cavidade 49 – etc –
  50. 50. Obrigado Perguntas ? natel@secplus.com.br http://www.secplus.com.br http://github.com/tiago4orion http://bugsec.googlecode.com/http://www.owasp.org/index.php/OWASP_FLORIPA_DAY50 ●

×