desenvolvimento de malware

50
1 Desenvolvimento de Malware para Linux Tiago Natel de Moura aka i4k [email protected]

Upload: tiago-natel-de-moura

Post on 10-Jul-2015

777 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Desenvolvimento de malware

1

Desenvolvimento de Malware para Linux

Tiago Natel de Mouraaka i4k

[email protected]

Page 2: Desenvolvimento de malware

2

Bio

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

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

- SEC+http://www.secplus.com.br/

Page 3: Desenvolvimento de malware

3

Bio

BugSec Team

- cooler (@Cooler_freenode)

- i4k (@_i4k_)

- m0nad (@m0nadlabs)

- slyfunky

- sigsegv (@felipensp)

- ebellani

Page 4: Desenvolvimento de malware

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/

Page 5: Desenvolvimento de malware

5

Cogumelo Binário

Ezine de segurança mantida pelo BugSec.

http://cogubin.leet.la/

Page 6: Desenvolvimento de malware

6

Introdução

Unix and MalwaresUnix and Malwares

Page 7: Desenvolvimento de malware

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).● Inserindo em novo segmento

Page 8: Desenvolvimento de malware

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)

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)

Page 9: Desenvolvimento de malware

9

Contribuições

WLAD Magazine – 1995 - ~199929A MagazineSilvio Cesare

Unix-viruses mailing listPhrack Magazine

Page 10: Desenvolvimento de malware

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

Page 11: Desenvolvimento de malware

11

Binary Format

● Porque um formato para o binário?

● Porque não somente instruções do processador?

- Como determinar o byte order de uma sequência de opcodes?

✔ Sim, os antigos MSDOS executavam flat-binaries. (binários .COM)

- Como saber qual a arquitetura de uma sequência de opcodes?

Mas...

BINARY HEADER

Page 12: Desenvolvimento de malware

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.

Page 13: Desenvolvimento de malware

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

Page 14: Desenvolvimento de malware

14

Compilação

main.c swap.c

ld (collect2)

p

ELF Format FilesLinking step

swap.omain.o

as as

Relocatableobject code

Executable

main.s swap.s

cc1 cc1

Assembly code

gcc -O –g -o p main.c swap.c

Page 15: Desenvolvimento de malware

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.

Page 16: Desenvolvimento de malware

16

ELF StructureLoading View

ELF header

Program header table

Segmento 1

Segmento 2

Section header table

Segmento N

Loading View é necessário para o sistema operacional ou loader obter informações de como mapear o binário na memória.

Page 17: Desenvolvimento de malware

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.

Page 18: Desenvolvimento de malware

18

ELF StructureLinking View

ELF header

Program header table

.text

.data

.bss

.strtab

.rel.text

.rel.data

.debug

Section header table

.rodata

Linking View é necessário para poder montar arquivos relocáveis.A ordem e presença das seções é opcional, exceto o ELF header que precisa estar presente e iniciando no primeiro byte do arquivo.

Page 19: Desenvolvimento de malware

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.

Page 20: Desenvolvimento de malware

20

ELF Header

ELF header

Program header table

.text

.data

.bss

.strtab

.rel.text

.rel.data

.debug

Section header table

.rodata

Entry point

ArquiteturaTipo de binário

e_ident[16]

e_type

e_machine

e_entry

e_phoff

e_shoff

e_flags

e_ehsize

e_phentsize

e_shentsize

e_phnum

e_version

e_shnum

e_shstrndx

Tamanho do PH

Tamanho do SHQtd. de SH

Qtd. de PH

PHT offset

Program header table

SHT offset

Section header table

strtab index

.strtab

Page 21: Desenvolvimento de malware

21

PHT e SHT

ELF header

Program header table

.text

.data

.bss

.strtab

.rel.text

.rel.data

.debug

Section header table

.rodata

➔ Informações sobre segmentos necessários para o loading.

➔ Obrigatório para executáveis e bibliotecas

➔ Informações sobre seções necessárias para a linkagem.

➔ Obrigatório para arquivos relocáveis.

Page 22: Desenvolvimento de malware

22

ELF Sections

ELF header

Program header table

.text

.data

.bss

.strtab

.rel.text

.rel.data

.debug

Section header table

.rodata

Código de Máquina, onde realmente as instruções de processador do software se encontram.

- Read-Only

Page 23: Desenvolvimento de malware

23

Data Sections

ELF header

Program header table

.text

.data

.bss

.strtab

.rel.text

.rel.data

.debug

Section header table

.rodata

Dados Estáticos➔ Inicializados, Read-Only➔ Inicializados, Read/Write➔ Não-Inicializado, Read/Write

InicializadosDados iniciais no ELF.

Não-inicializadosSomente o tamanho total no ELF

Page 24: Desenvolvimento de malware

24

Relocation info

ELF header

Program header table

.text

.data

.bss

.strtab

.rel.text

.rel.data

.debug

Section header table

.rodata

Descreve onde e como os símbolos são usados.

➔ Uma lista de localizações na seção .text que deverão ser modificadas quando o linker combinar este binário com outros.

➔ Informações de relocações para quaisquer variáveis globais que são referenciadas ou definidas por um módulo.

Page 25: Desenvolvimento de malware

25

.debug

ELF header

Program header table

.text

.data

.bss

.strtab

.rel.text

.rel.data

.debug

Section header table

.rodata

Relaciona código fonte com o código objeto dentro do ELF.

Page 26: Desenvolvimento de malware

26

Outras seções

ELF header

Program header table

.text

.data

.bss

.strtab

.rel.text

.rel.data

.debug

Section header table

.rodata

Outros tipos de seções:- C++ initializer/finalizer- Dynamic Linking info- etc...

Page 27: Desenvolvimento de malware

27

Linking → Loading

. interp

.init

. text

.data

.bss

.strtab

.rel.text

.rel.data

.debug

Section header table

.rodata

.interp.init.text

.rodata

LOAD (RX)

Segmento 2

.data.bss

LOAD (RW)

Segmento 3

Page 28: Desenvolvimento de malware

28

Organização

ELF header

Program header table

.text

.data

.bss

.strtab

.debug

Section header table

.rodata

e_phoff

e_shoffsh_offset's

p_offset's

Page 29: Desenvolvimento de malware

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.

Page 30: Desenvolvimento de malware

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

Page 31: Desenvolvimento de malware

31

Visualização

Page 32: Desenvolvimento de malware

32

Ferramentas de Análise

➢ Dissecação de ELF➢ objdump➢ objcopy➢ readelf➢ elfdump➢ elfcopy➢ nm

GNU Binutils

elftoolchain

Page 33: Desenvolvimento de malware

33

Ferramentas de RE.

● strace – System call tracer (GNU)● ltrace – Library call tracer (GNU)● Elfsh (eresi-project)● kernsh (eresi-project)

Page 34: Desenvolvimento de malware

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● Hooking shared library calls

Fora de escopo

Page 35: Desenvolvimento de malware

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().

Page 36: Desenvolvimento de malware

36

Cavity (.note)

ELF header

Program header table

.text

.data

.bss

.note

.strtab

Section header table

.rodata

e_phoff

e_shoffsh_offset's

p_offset's

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.

Page 37: Desenvolvimento de malware

37

Cavity (.note)

ELF header

Program header table

.text

.data

.bss

.note (evil code)

.strtab

Section header table

.rodata

e_phoff

e_shoffsh_offset's

p_offset's

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.

Page 38: Desenvolvimento de malware

38

Inserindo em nova seção

ELF header

Program header table

.text

.data

.bss

.strtab

.debug

Section header table

.rodata

e_phoff

e_shoffsh_offset's

p_offset's

➢ Adicionar nova seção .evil após a seção .text.

➢ Deslocar todas as seções após .text e o SHT no número de bytes do malware.

➢ Guardar entry point original

Page 39: Desenvolvimento de malware

39

Inserindo em nova seção

ELF header

Program header table

.text

.data

.bss

.strtab

.debug

Section header table

.rodata

e_phoff

e_shoffsh_offset's

p_offset's

➢ Adicionar a seção .evil

.evil

➢ Ajustar o header para a nova posição do SHT e do entry_point (e_shohff += VIR_LEN).➢ Incrementar e_shnum em 1.

Page 40: Desenvolvimento de malware

40

Inserindo em nova seção

ELF header

Program header table

.text

.data

.bss

.strtab

.debug

Section header table

.rodata

e_phoff

e_shoffsh_offset's

p_offset's.evil

➢ 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).

e_entrypoint = pos(.text) + size(.text)+ align(.text)

Page 41: Desenvolvimento de malware

41

Inserindo em nova seção

ELF header

Program header table

.text

.data

.bss

.strtab

.debug

Section header table

.rodata

e_phoff

e_shoffsh_offset's

p_offset's.evil

➢ 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 segmento de .evil.

Page 42: Desenvolvimento de malware

42

Inserindo em nova seção

ELF header

Program header table

.text

.data

.bss

.strtab

.debug

Section header table

.rodata

e_phoff

e_shoffsh_offset's

p_offset's

.evil

➢ 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 segmento de .evil.

Page 43: Desenvolvimento de malware

43

Inserindo em nova seção

ELF header

Program header table

.text

.data

.bss

.strtab

.debug

Section header table

.rodata

e_phoff

e_shoffsh_offset's

p_offset's

.evil

➢ Pronto. Novo ELF válido.

Page 44: Desenvolvimento de malware

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.

Page 45: Desenvolvimento de malware

45

Escalada de privilégios

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

Page 46: Desenvolvimento de malware

46

● 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'

Subvertendo a shell

Page 47: Desenvolvimento de malware

47

Mantendo acesso

● Non-root● ~/.bashrc● Gnome

– Autostart

● KDE

● root● Init scripts

– /etc/init.d/trj– /etc/rc.local– *

● Hook syscall / rootkit

Page 48: Desenvolvimento de malware

48

GnomeAutostart

~/.config/autostart/trj.desktop

[Desktop Entry]

Type=Application

Name=trojan

Exec=~/.hidden/trj.bin

Terminal=false

Hidden=true

Page 49: Desenvolvimento de malware

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

– etc

Page 50: Desenvolvimento de malware

50

Obrigado

Perguntas ?

[email protected]

http://www.secplus.com.br

http://github.com/tiago4orion

http://bugsec.googlecode.com/

http://www.owasp.org/index.php/OWASP_FLORIPA_DAY