Desenvolvimento de malware

Post on 10-Jul-2015

777 views 0 download

Transcript of Desenvolvimento de malware

1

Desenvolvimento de Malware para Linux

Tiago Natel de Mouraaka i4k

natel@secplus.com.br

2

Bio

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

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

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

3

Bio

BugSec Team

- cooler (@Cooler_freenode)

- i4k (@_i4k_)

- m0nad (@m0nadlabs)

- slyfunky

- sigsegv (@felipensp)

- ebellani

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/

5

Cogumelo Binário

Ezine de segurança mantida pelo BugSec.

http://cogubin.leet.la/

6

Introdução

Unix and MalwaresUnix and Malwares

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

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)

9

Contribuições

WLAD Magazine – 1995 - ~199929A MagazineSilvio Cesare

Unix-viruses mailing listPhrack Magazine

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

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

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.

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

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

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.

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.

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.

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.

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.

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

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.

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

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

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.

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.

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

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

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

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.

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

31

Visualização

32

Ferramentas de Análise

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

GNU Binutils

elftoolchain

33

Ferramentas de RE.

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

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

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

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.

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.

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

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.

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)

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.

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.

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.

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.

45

Escalada de privilégios

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

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

47

Mantendo acesso

● Non-root● ~/.bashrc● Gnome

– Autostart

● KDE

● root● Init scripts

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

● Hook syscall / rootkit

48

GnomeAutostart

~/.config/autostart/trj.desktop

[Desktop Entry]

Type=Application

Name=trojan

Exec=~/.hidden/trj.bin

Terminal=false

Hidden=true

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

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_DAY