SlideShare uma empresa Scribd logo
1 de 50
Desenvolvimento de Malware para Linux

        Tiago Natel de Moura
               aka i4k



                     natel@secplus.com.br
                                        1
Bio


- BugSec Security Team
http://bugsec.googlecode.com/

- OWASP Floripa Chapter
http://www.owasp.org/index.php/Florianopolis

- SEC+
http://www.secplus.com.br/
                                               2
Bio
BugSec Team
- cooler     (@Cooler_freenode)
- i4k        (@_i4k_)
- m0nad (@m0nadlabs)
- slyfunky
- sigsegv (@felipensp)
- ebellani

                                        3
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
Cogumelo Binário

Ezine de segurança mantida pelo BugSec.
            http://cogubin.leet.la/




                                          5
Introdução



Unix and Malwares




                            6
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
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
Contribuições


WLAD Magazine – 1995 - ~1999
       29A Magazine
        Silvio Cesare
   Unix-viruses mailing list
     Phrack Magazine



                                  9
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
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
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
Tipos de
                                      binários ELF
Relocatable
  É 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
Compilação
gcc -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
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
ELF Structure
                                      Loading View
Loading View é necessário para o            ELF header
sistema operacional ou loader obter     Program header table
informações de como mapear o
                                            Segmento 1
binário na memória.

                                            Segmento 2




                                            Segmento N



                                        Section header table

                                                               16
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
ELF Structure
                                        Linking View
Linking View é necessário para                ELF header
poder montar arquivos relocáveis.         Program header table
A ordem e presença das seções é                   .text
opcional, exceto o ELF header que               .rodata
precisa estar presente e iniciando no            .data
primeiro byte do arquivo.
                                                  .bss
                                                 .strtab
                                                .rel.text
                                                .rel.data
                                                .debug
                                                   …
                                          Section header table

                                                                 18
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
ELF Header

                  e_ident[16]        ELF header
Tipo 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.data
Tamanho 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
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.
ELF Sections

Código de Máquina, onde realmente         ELF header
as instruções de processador do      Program header table
software se encontram.                        .text
    - Read-Only                             .rodata
                                             .data
                                              .bss
                                             .strtab
                                            .rel.text
                                            .rel.data
                                            .debug
                                               …
                                      Section header table

                                                             22
Data Sections

                                           ELF header
Dados Estáticos                        Program header table
 ➔ Inicializados, Read-Only
                                               .text
 ➔ Inicializados, Read/Write
                                             .rodata
 ➔ Não-Inicializado, Read/Write

                                              .data
Inicializados                                  .bss
    Dados iniciais no ELF.                    .strtab
Não-inicializados                            .rel.text
    Somente o tamanho total no ELF
                                             .rel.data
                                             .debug
                                                …
                                       Section header table

                                                              23
Relocation info

                                            ELF header
Descreve onde e como os símbolos       Program header table
sã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
.debug

                                   ELF header
Relaciona código fonte com o   Program header table
código objeto dentro do ELF.           .text
                                     .rodata
                                      .data
                                       .bss
                                      .strtab
                                     .rel.text
                                     .rel.data
                                     .debug
                                        …
                               Section header table

                                                      25
Outras seções

                                       ELF header
Outros 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
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)
         …                   .data
Section header table          .bss
                                       27
Organização
                            ELF header
              e_phoff
                        Program header table




                                               p_offset's
                                .text
                              .rodata
                               .data                        e_shoff
sh_offset's                     .bss
                               .strtab
                              .debug
                        Section header table




                                                                      28
Executando um
                                             binário.
 $ ./program param1 param2


1) 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
Executando
                              um binário.
$ ./program param1 param2


5) 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
Visualização




               31
Ferramentas de
                            Análise
➢   Dissecação de ELF
    ➢   objdump
    ➢   objcopy         GNU Binutils
    ➢   readelf
    ➢   elfdump
    ➢   elfcopy         elftoolchain
    ➢   nm



                                       32
Ferramentas
                                     de RE.
●   strace – System call tracer (GNU)
●   ltrace – Library call tracer (GNU)
●   Elfsh (eresi-project)
●   kernsh (eresi-project)




                                             33
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
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
Cavity (.note)
                                      ELF header
                     e_phoff
                                  Program header table




                                                                  p_offset's
                                          .text
                                         .rodata
                                          .data                                e_shoff
       sh_offset's                        .bss
                                          .note
                                         .strtab
                                  Section header table


1) 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
Cavity (.note)
                                         ELF header
                       e_phoff
                                    Program header table




                                                                    p_offset's
                                            .text
                                           .rodata
                                            .data                                e_shoff
         sh_offset's                        .bss
                                      .note (evil code)
                                           .strtab
                                    Section header table


1)   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
Inserindo em
                                                nova seção
                                  ELF header
              e_phoff
                             Program header table




                                                              p_offset's
                                     .text
                                    .rodata
                                     .data                                 e_shoff
sh_offset's                          .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
Inserindo em
                                                           nova seção
                                             ELF header
                          e_phoff
                                        Program header table




                                                                         p_offset's
                                                .text

                                                .evil
                                                                                      e_shoff
            sh_offset's                        .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
Inserindo em
                                                           nova seção
                                             ELF header
                           e_phoff
e_entrypoint =                          Program header table




                                                                         p_offset's
pos(.text) + size(.text)                         .text
+ align(.text)
                                                 .evil
                                                                                      e_shoff
            sh_offset's                        .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
Inserindo em
                                                 nova seção
                                  ELF header
              e_phoff
                             Program header table




                                                               p_offset's
                                      .text

                                      .evil
                                                                            e_shoff
sh_offset's                          .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.
Inserindo em
                                                 nova seção
                                  ELF header
              e_phoff
                             Program header table
                                      .text




                                                               p_offset's
                                      .evil
                                                                            e_shoff
sh_offset's                         .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.
Inserindo em
                                                 nova seção
                                   ELF header
              e_phoff
                             Program header table
                                      .text




                                                     p_offset's
                                      .evil
                                                                  e_shoff
sh_offset's                         .rodata
                                     .data
                                      .bss
                                     .strtab
                                     .debug
                              Section header table

    ➢   Pronto. Novo ELF válido.

                                                                            43
Malware
                               Shellcode
1) 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
Escalada de
                              privilégios

●   Local exploits.
●   Subvertendo a shell do usuário.




                                            45
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
Mantendo
                                  acesso
●   Non-root
    ●   ~/.bashrc
    ●   Gnome
         –   Autostart
    ●   KDE
●   root
    ●   Init scripts
         –   /etc/init.d/trj
         –   /etc/rc.local
         –   *
    ●   Hook syscall / rootkit              47
Gnome
                                  Autostart
~/.config/autostart/trj.desktop


[Desktop Entry]
Type=Application
Name=trojan
Exec=~/.hidden/trj.bin
Terminal=false
Hidden=true
                                              48
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 NOP's em segmentos PT_LOAD.
    ●   Contagem de GAP's 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
        –
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
                    ●

Mais conteúdo relacionado

Destaque

Análise de malware com software livre
Análise de malware com software livreAnálise de malware com software livre
Análise de malware com software livreDiego Santos
 
Cenario das fraudes e do spam no Brasil
Cenario das fraudes e do spam no BrasilCenario das fraudes e do spam no Brasil
Cenario das fraudes e do spam no BrasilCampus Party Brasil
 
Análise de Malware em Dump de Memória com Volatility
Análise de Malware em Dump de Memória com VolatilityAnálise de Malware em Dump de Memória com Volatility
Análise de Malware em Dump de Memória com Volatilityederluis1973
 
Analise de Malware e Pesquisas Recentes
Analise de Malware e Pesquisas RecentesAnalise de Malware e Pesquisas Recentes
Analise de Malware e Pesquisas RecentesLuiz Amelotti
 
Engenharia Reversa de Trojan-Banker_Hack'nRio
Engenharia Reversa de Trojan-Banker_Hack'nRioEngenharia Reversa de Trojan-Banker_Hack'nRio
Engenharia Reversa de Trojan-Banker_Hack'nRiocrimesciberneticos
 
Cenário Brasileiro de Cybersegurança
Cenário Brasileiro de CybersegurançaCenário Brasileiro de Cybersegurança
Cenário Brasileiro de CybersegurançaArthur Cesar Oreana
 
Monitoramento de malware em Windows NT 6.x - 64bits
Monitoramento de malware em Windows NT 6.x - 64bitsMonitoramento de malware em Windows NT 6.x - 64bits
Monitoramento de malware em Windows NT 6.x - 64bitsArthur Paixão
 

Destaque (11)

Malware
MalwareMalware
Malware
 
Análise de malware com software livre
Análise de malware com software livreAnálise de malware com software livre
Análise de malware com software livre
 
Cenario das fraudes e do spam no Brasil
Cenario das fraudes e do spam no BrasilCenario das fraudes e do spam no Brasil
Cenario das fraudes e do spam no Brasil
 
Análise de Malware em Dump de Memória com Volatility
Análise de Malware em Dump de Memória com VolatilityAnálise de Malware em Dump de Memória com Volatility
Análise de Malware em Dump de Memória com Volatility
 
Análise de malware com software livre
Análise de malware com software livreAnálise de malware com software livre
Análise de malware com software livre
 
Analise de Malware e Pesquisas Recentes
Analise de Malware e Pesquisas RecentesAnalise de Malware e Pesquisas Recentes
Analise de Malware e Pesquisas Recentes
 
Apresentação malware
Apresentação malwareApresentação malware
Apresentação malware
 
Engenharia Reversa de Trojan-Banker_Hack'nRio
Engenharia Reversa de Trojan-Banker_Hack'nRioEngenharia Reversa de Trojan-Banker_Hack'nRio
Engenharia Reversa de Trojan-Banker_Hack'nRio
 
Análise de Malware
Análise de MalwareAnálise de Malware
Análise de Malware
 
Cenário Brasileiro de Cybersegurança
Cenário Brasileiro de CybersegurançaCenário Brasileiro de Cybersegurança
Cenário Brasileiro de Cybersegurança
 
Monitoramento de malware em Windows NT 6.x - 64bits
Monitoramento de malware em Windows NT 6.x - 64bitsMonitoramento de malware em Windows NT 6.x - 64bits
Monitoramento de malware em Windows NT 6.x - 64bits
 

Semelhante a Desenvolvimento de malware

TDC2016SP - Trilha Linux Embarcado
TDC2016SP - Trilha Linux EmbarcadoTDC2016SP - Trilha Linux Embarcado
TDC2016SP - Trilha Linux Embarcadotdc-globalcode
 
Funcionamento kernel
Funcionamento kernelFuncionamento kernel
Funcionamento kernelSENAC RIO
 
Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilling Landgraf
Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilling LandgrafDesenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilling Landgraf
Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilling LandgrafTchelinux
 
Apostila Treinamento AvançAdo Em Linux
Apostila Treinamento AvançAdo Em LinuxApostila Treinamento AvançAdo Em Linux
Apostila Treinamento AvançAdo Em Linuxeliezer
 
Apostila Treinamento AvançAdo Em Linux
Apostila Treinamento AvançAdo Em LinuxApostila Treinamento AvançAdo Em Linux
Apostila Treinamento AvançAdo Em Linuxeliezer
 
Apostila Treinamento AvançAdo Em Linux
Apostila Treinamento AvançAdo Em LinuxApostila Treinamento AvançAdo Em Linux
Apostila Treinamento AvançAdo Em Linuxguest7a481e8
 
Sistemas Operacionais - Gnu/Linux Instalando Programas
Sistemas Operacionais - Gnu/Linux Instalando ProgramasSistemas Operacionais - Gnu/Linux Instalando Programas
Sistemas Operacionais - Gnu/Linux Instalando ProgramasLuiz Arthur
 
Introdução a Exploração de Software
Introdução a Exploração de SoftwareIntrodução a Exploração de Software
Introdução a Exploração de SoftwareKaique Bonato
 
Como ajudar no desenvolvimento do kernel Linux? - Fábio Olivé Leite
Como ajudar no desenvolvimento do kernel Linux? - Fábio Olivé LeiteComo ajudar no desenvolvimento do kernel Linux? - Fábio Olivé Leite
Como ajudar no desenvolvimento do kernel Linux? - Fábio Olivé LeiteTchelinux
 
Introdução ao Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilli...
Introdução ao Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilli...Introdução ao Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilli...
Introdução ao Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilli...Tchelinux
 
Programação Desktop: Uma abordagem com Java
Programação Desktop: Uma abordagem com JavaProgramação Desktop: Uma abordagem com Java
Programação Desktop: Uma abordagem com JavaRosicleia Frasson
 
Web Training Aula 03: Introduction to Laravel
Web Training Aula 03: Introduction to LaravelWeb Training Aula 03: Introduction to Laravel
Web Training Aula 03: Introduction to LaravelMozDevz
 
Reverse Engineering Course
Reverse Engineering CourseReverse Engineering Course
Reverse Engineering CourseMarcus Botacin
 
Linux System Administrator | Curso de Redes | 3Way Networks
Linux System Administrator | Curso de Redes | 3Way NetworksLinux System Administrator | Curso de Redes | 3Way Networks
Linux System Administrator | Curso de Redes | 3Way Networks3Way Networks
 
Linux e zephyr conversando no mesmo SoC
Linux e zephyr conversando no mesmo SoCLinux e zephyr conversando no mesmo SoC
Linux e zephyr conversando no mesmo SoCEmbarcados
 
Palestra 2º Café com Software Livre - David Jourdain - Receita: Aprenda a coz...
Palestra 2º Café com Software Livre - David Jourdain - Receita: Aprenda a coz...Palestra 2º Café com Software Livre - David Jourdain - Receita: Aprenda a coz...
Palestra 2º Café com Software Livre - David Jourdain - Receita: Aprenda a coz...blusolsl
 
Android Core Aula 1 - Histórico, Arquitetura e Compilação da plataforma
Android Core Aula 1 - Histórico, Arquitetura e Compilação da plataformaAndroid Core Aula 1 - Histórico, Arquitetura e Compilação da plataforma
Android Core Aula 1 - Histórico, Arquitetura e Compilação da plataformaFelipe Silveira
 
Linux em Sistemas Embarcados - SACTA 2010 - UNIPAMPA
Linux em Sistemas Embarcados - SACTA 2010 - UNIPAMPALinux em Sistemas Embarcados - SACTA 2010 - UNIPAMPA
Linux em Sistemas Embarcados - SACTA 2010 - UNIPAMPAMarcelo Veiga Neves
 
Modularização via BPL - Abordagem Prática para DataSnap & Front-end
Modularização via BPL - Abordagem Prática para DataSnap & Front-endModularização via BPL - Abordagem Prática para DataSnap & Front-end
Modularização via BPL - Abordagem Prática para DataSnap & Front-endMario Guedes
 

Semelhante a Desenvolvimento de malware (20)

TDC2016SP - Trilha Linux Embarcado
TDC2016SP - Trilha Linux EmbarcadoTDC2016SP - Trilha Linux Embarcado
TDC2016SP - Trilha Linux Embarcado
 
Funcionamento kernel
Funcionamento kernelFuncionamento kernel
Funcionamento kernel
 
Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilling Landgraf
Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilling LandgrafDesenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilling Landgraf
Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilling Landgraf
 
Apostila Treinamento AvançAdo Em Linux
Apostila Treinamento AvançAdo Em LinuxApostila Treinamento AvançAdo Em Linux
Apostila Treinamento AvançAdo Em Linux
 
Apostila Treinamento AvançAdo Em Linux
Apostila Treinamento AvançAdo Em LinuxApostila Treinamento AvançAdo Em Linux
Apostila Treinamento AvançAdo Em Linux
 
Apostila Treinamento AvançAdo Em Linux
Apostila Treinamento AvançAdo Em LinuxApostila Treinamento AvançAdo Em Linux
Apostila Treinamento AvançAdo Em Linux
 
Sistemas Operacionais - Gnu/Linux Instalando Programas
Sistemas Operacionais - Gnu/Linux Instalando ProgramasSistemas Operacionais - Gnu/Linux Instalando Programas
Sistemas Operacionais - Gnu/Linux Instalando Programas
 
Introdução a Exploração de Software
Introdução a Exploração de SoftwareIntrodução a Exploração de Software
Introdução a Exploração de Software
 
Como ajudar no desenvolvimento do kernel Linux? - Fábio Olivé Leite
Como ajudar no desenvolvimento do kernel Linux? - Fábio Olivé LeiteComo ajudar no desenvolvimento do kernel Linux? - Fábio Olivé Leite
Como ajudar no desenvolvimento do kernel Linux? - Fábio Olivé Leite
 
Introdução ao Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilli...
Introdução ao Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilli...Introdução ao Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilli...
Introdução ao Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilli...
 
Programação Desktop: Uma abordagem com Java
Programação Desktop: Uma abordagem com JavaProgramação Desktop: Uma abordagem com Java
Programação Desktop: Uma abordagem com Java
 
Web Training Aula 03: Introduction to Laravel
Web Training Aula 03: Introduction to LaravelWeb Training Aula 03: Introduction to Laravel
Web Training Aula 03: Introduction to Laravel
 
Mastering Laravel
Mastering LaravelMastering Laravel
Mastering Laravel
 
Reverse Engineering Course
Reverse Engineering CourseReverse Engineering Course
Reverse Engineering Course
 
Linux System Administrator | Curso de Redes | 3Way Networks
Linux System Administrator | Curso de Redes | 3Way NetworksLinux System Administrator | Curso de Redes | 3Way Networks
Linux System Administrator | Curso de Redes | 3Way Networks
 
Linux e zephyr conversando no mesmo SoC
Linux e zephyr conversando no mesmo SoCLinux e zephyr conversando no mesmo SoC
Linux e zephyr conversando no mesmo SoC
 
Palestra 2º Café com Software Livre - David Jourdain - Receita: Aprenda a coz...
Palestra 2º Café com Software Livre - David Jourdain - Receita: Aprenda a coz...Palestra 2º Café com Software Livre - David Jourdain - Receita: Aprenda a coz...
Palestra 2º Café com Software Livre - David Jourdain - Receita: Aprenda a coz...
 
Android Core Aula 1 - Histórico, Arquitetura e Compilação da plataforma
Android Core Aula 1 - Histórico, Arquitetura e Compilação da plataformaAndroid Core Aula 1 - Histórico, Arquitetura e Compilação da plataforma
Android Core Aula 1 - Histórico, Arquitetura e Compilação da plataforma
 
Linux em Sistemas Embarcados - SACTA 2010 - UNIPAMPA
Linux em Sistemas Embarcados - SACTA 2010 - UNIPAMPALinux em Sistemas Embarcados - SACTA 2010 - UNIPAMPA
Linux em Sistemas Embarcados - SACTA 2010 - UNIPAMPA
 
Modularização via BPL - Abordagem Prática para DataSnap & Front-end
Modularização via BPL - Abordagem Prática para DataSnap & Front-endModularização via BPL - Abordagem Prática para DataSnap & Front-end
Modularização via BPL - Abordagem Prática para DataSnap & Front-end
 

Desenvolvimento de malware

  • 1. Desenvolvimento de Malware para Linux Tiago Natel de Moura aka i4k natel@secplus.com.br 1
  • 2. Bio - BugSec Security Team http://bugsec.googlecode.com/ - OWASP Floripa Chapter http://www.owasp.org/index.php/Florianopolis - SEC+ http://www.secplus.com.br/ 2
  • 3. Bio BugSec Team - cooler (@Cooler_freenode) - i4k (@_i4k_) - m0nad (@m0nadlabs) - slyfunky - sigsegv (@felipensp) - ebellani 3
  • 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. Cogumelo Binário Ezine de segurança mantida pelo BugSec. http://cogubin.leet.la/ 5
  • 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. 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. Contribuições WLAD Magazine – 1995 - ~1999 29A Magazine Silvio Cesare Unix-viruses mailing list Phrack Magazine 9
  • 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. 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. 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. Tipos de binários ELF Relocatable É 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. Compilação gcc -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. 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. ELF Structure Loading View Loading View é necessário para o ELF header sistema operacional ou loader obter Program header table informações de como mapear o Segmento 1 binário na memória. Segmento 2 Segmento N Section header table 16
  • 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. ELF Structure Linking View Linking View é necessário para ELF header poder montar arquivos relocáveis. Program header table A ordem e presença das seções é .text opcional, exceto o ELF header que .rodata precisa estar presente e iniciando no .data primeiro byte do arquivo. .bss .strtab .rel.text .rel.data .debug … Section header table 18
  • 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. ELF Header e_ident[16] ELF header Tipo 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.data Tamanho 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. 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. ELF Sections Código de Máquina, onde realmente ELF header as instruções de processador do Program header table software se encontram. .text - Read-Only .rodata .data .bss .strtab .rel.text .rel.data .debug … Section header table 22
  • 23. Data Sections ELF header Dados Estáticos Program header table ➔ Inicializados, Read-Only .text ➔ Inicializados, Read/Write .rodata ➔ Não-Inicializado, Read/Write .data Inicializados .bss Dados iniciais no ELF. .strtab Não-inicializados .rel.text Somente o tamanho total no ELF .rel.data .debug … Section header table 23
  • 24. Relocation info ELF header Descreve onde e como os símbolos Program header table sã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. .debug ELF header Relaciona código fonte com o Program header table código objeto dentro do ELF. .text .rodata .data .bss .strtab .rel.text .rel.data .debug … Section header table 25
  • 26. Outras seções ELF header Outros 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. 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) … .data Section header table .bss 27
  • 28. Organização ELF header e_phoff Program header table p_offset's .text .rodata .data e_shoff sh_offset's .bss .strtab .debug Section header table 28
  • 29. Executando um binário. $ ./program param1 param2 1) 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. Executando um binário. $ ./program param1 param2 5) 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
  • 32. Ferramentas de Análise ➢ Dissecação de ELF ➢ objdump ➢ objcopy GNU Binutils ➢ readelf ➢ elfdump ➢ elfcopy elftoolchain ➢ nm 32
  • 33. Ferramentas de RE. ● strace – System call tracer (GNU) ● ltrace – Library call tracer (GNU) ● Elfsh (eresi-project) ● kernsh (eresi-project) 33
  • 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. 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. Cavity (.note) ELF header e_phoff Program header table p_offset's .text .rodata .data e_shoff sh_offset's .bss .note .strtab Section header table 1) 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. Cavity (.note) ELF header e_phoff Program header table p_offset's .text .rodata .data e_shoff sh_offset's .bss .note (evil code) .strtab Section header table 1) 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. Inserindo em nova seção ELF header e_phoff Program header table p_offset's .text .rodata .data e_shoff sh_offset's .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. Inserindo em nova seção ELF header e_phoff Program header table p_offset's .text .evil e_shoff sh_offset's .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. Inserindo em nova seção ELF header e_phoff e_entrypoint = Program header table p_offset's pos(.text) + size(.text) .text + align(.text) .evil e_shoff sh_offset's .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. Inserindo em nova seção ELF header e_phoff Program header table p_offset's .text .evil e_shoff sh_offset's .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. Inserindo em nova seção ELF header e_phoff Program header table .text p_offset's .evil e_shoff sh_offset's .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. Inserindo em nova seção ELF header e_phoff Program header table .text p_offset's .evil e_shoff sh_offset's .rodata .data .bss .strtab .debug Section header table ➢ Pronto. Novo ELF válido. 43
  • 44. Malware Shellcode 1) 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. Escalada de privilégios ● Local exploits. ● Subvertendo a shell do usuário. 45
  • 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. Mantendo acesso ● Non-root ● ~/.bashrc ● Gnome – Autostart ● KDE ● root ● Init scripts – /etc/init.d/trj – /etc/rc.local – * ● Hook syscall / rootkit 47
  • 48. Gnome Autostart ~/.config/autostart/trj.desktop [Desktop Entry] Type=Application Name=trojan Exec=~/.hidden/trj.bin Terminal=false Hidden=true 48
  • 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 NOP's em segmentos PT_LOAD. ● Contagem de GAP's 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. 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 ●