=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= =-[05]-=[MSN Hacking]-=|Leandro A. Thomas|=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Indice ====== 1.0 Introducao 2.0 Preludio 3.0 Processo de Autenticacao 4.0 Obtendo MS Passport e Ticket 5.0 Conexao Estabelecida 6.0 Exemplo Simples 7.0 Referencia 8.0 Consideracoes Finais --=[ 1.0 Introducao E ai pessoal !!! Ha um tempo resolvi dar uma estudada sobre como se da o funcionamento do protocolo utilizado pelo MSN. Aos seres que vivem em outro mundo, MSN se trata de um servico de chat nativo da Microsoft, tambem conhecido como "MSN Messenger", onde os usuarios que possuem e-mail podem se cadastrar e utiliza-lo como software para mensagens instantaneas. Apesar de possuir seu codigo fechado (pra variar neh), a popularidade junto com a curiosidade fez com que o hacking mais uma vez fosse utilizado para o bem, ao menos para nos :P Voce deve estar se perguntando: se a Microsoft esconde todo o funciona- mento dele, como o pessoal conseguiu descobrir? Eh claro que ainda existem algu- mas duvidas, mas tecnicas de sniffing e engenharia reversa ajudaram muito a entender seu funcionamento. Com isso, muitos projetos foram desenvolvidos, justamente como nova opcao em sistemas nao-windows. Um exemplo eh o famoso aMSN, cliente MSN popularizado pela comunidade Linux, feito em tcl/tk. Confira nos links alguns projetos desenvolvidos: - http://www.warwick.ac.uk/~esucbg/TjMSN/ - http://kmess.sourceforge.net/ - http://amsn.sourceforge.net/ - http://www.ut.ee/~moby/msn/ --=[ 2.0 Preludio Ao programar um cliente MSN, certamente ira se deparar com algumas si- tuacoes que o deixarao com duvidas quanto a comunicacao com o servidor. Para auxiliar recomendo a utilizacao de um sniffer (tcpdump ou ethereal, por exemplo) para depurar algumas respostas. Antes de comecar a estudar o funcionamento do MSN, eh interessante ficar por dentro de algumas definicoes. MSN Protocol (MSNP): O MSN segue um conjunto de regras especificadas em seu protocolo, que gerenciam desde o handshake de comunicacao entre cliente e servidor ateh processos mais avancados como troca de mensagens, envio de arquivos, etc. Este protocolo eh denominado MSNPx, onde x eh a versao utilizada no servidor de autenticacao. Para nosso artigo, iremos trabalhar com o MSNP10, lembrando que ele deve ser especificado na negociacao com o servidor (veremos mais a frente). Caso o servidor trabalhe com versoes mais antigas do MSNP, nao havera acordo entre as partes, se voce estiver com uma versao diferente a exigida. Notification Server (NS): Podemos considerar a autenticacao com o NS a base de tudo. Este servidor eh responsavel por manipular sua presenca, definindo seu status (online, offline, etc), bem como notificar o recebimento de e-mails em sua conta Hotmail. Switchboard (SB): Eh o responsavel em manipular cada sessao de mensagens, ou seja, quando eh estabelecido uma comunicacao entre clientes, a sessao para a troca dessas mensagens eh controlado pelo SB. Uma sessao pode ser dada pela comunicacao one-to-one, entre duas entidades apenas, ou em um chat, fazendo o switchboard trabalhar de forma compartilhada, desta forma controlando quem esta no chat. Daqui pra frente usaremos uma sintaxe basica para definir o que esta sendo enviado ao servidor e o que sera sua resposta. A string precedida por um ">>>" definira nosso envio, enquanto um "<<<" designa o recebimento da resposta. Existem duas formas de se iniciar o processo de autenticacao. Muitos clientes web (ex.: webmessenger.com) utilizam o protocolo HTTP para suas cone- xoes, nao precisando assim um software cliente como o que a maioria usa, neces- sitando apenas um browser. Outra alternativa eh a conexao via proxy, assim de- vendo haver um software cliente como o proprio MSN Messenger da Microsoft. A conexao HTTP ocorre atraves do gateway.messenger.hotmail.com, na porta 80. Os commandos sao enviados atraves do metodo post para um script cgi responsavel em atender seu pedido, enviando alguma resposta referente a eles. Todos os comandos devem seguir as regras padronizadas pelo HTTP especificadas no RFC-2616, contendo um comando por requerimento inserido em seu campo de corpo. Quando feito um HTTP request, o servidor responde com um HTTP reply contendo em seu header a string "X-MSN-Messenger", o endereco IP a ser realizado o proximo requerimento e um ID da sessao estabelecida. Caso a sessao seja fechada (atraves de time-out ou de uma ordem dada), havera um valor definindo seu encerramento, "Session=close". --=[ 3.0 Processo de Autenticacao Entao, finalmente podemos comecar a ter um esboco. O primeiro (e mais dificil) passo na construcao de um cliente MSN, apos ter definido os processos iniciais acima, eh realizar a autenticacao no servidor NS. Todo preludio deve comecar no acordo do protocolo a ser utilizado entre ambas as partes(servidor e cliente). Criando-se um socket devidamente correto ao NS, enviaremos a seguinte string contendo a versao que iremos trabalhar: >>> VER 1 MSNP9 MSNP10\r\n <<< VER 1 MSNP9 MSNP10\r\n Acima enviamos a string de versao para o NS, recebendo uma resposta de que as versoes 9 e 10 do MSNP estao ativas naquele servidor. Agora um exemplo em que nao houve acordo entre as partes, ocasionando numa desconexao: >>> VER 1 MSNP9 MSNP10\r\n <<< VER 1 0\r\n OBS.: Veja que em cada mensagem ha um CR+LF para tratamento, requerido pelo protocolo. Caso receba resposta negativa, tente mudar as versoes, ja que o MSN vive em constante atualizacao com novas versoes, pode ser que a versao do MSNP esteja mais atualizada tambem. Uma vez tendo a confirmacao do protocolo corretamente aceita, voce deve- ra enviar alguns dados referente ao seu cliente e sistema operacional para o NS, que contem algumas informacoes como seu idioma, o nome e versao do cliente utilizado, o nome e versao do SO, etc. Caso seja o cliente oficial da Micro$oft, o servidor retornara como resposta uma versao recomendada para uso. >>> CVR 2 0x0409 win 4.10 i386 MSMSGR 6.2.0137 MSMSGR eu@email.com\r\n Este foi um exemplo de um cliente oficial. Os parametros passados sao os seguintes: 1o. - Numero hexa especificando o locale ID; 2o. - Tipo de SO utilizado; 3o. - Versao do SO; 4o. - Arquitetura; 5o. - Nome do cliente (MSMSGR eh o oficial); 6o. - Versao do cliente; 7o. - Este parametro SEMPRE sera o nome da versao oficial (MSMSGR); 8o. - Sua conta passport. Caso queira especificar um ID diferente em sua localidade, veja a tabela com alguns valores: LOCALIDADE: LCID: | LOCALIDADE: LCID: ----------------------------------------------------------------------- (default) 2048 | Hungria 1038 Bulgaria 1026 | Japao 1041 China 2052 | Korea 1042 Croacia 1050 | Portugal 2070 Belgica 2061 | Brasil 1046 Australia 3081 | Russia 1049 Canada 4105 | Espanha 1034 Jamaica 8201 | Argentina 11274 Nova Zelandia 5129 | Bolivia 16394 Caribe 9225 | Chile 13322 Filipinas 13321 | Colombia 9226 Africa do Sul 7177 | Costa Rica 7130 Inglaterra 2057 | Mexico 2058 Estados Unidos 1033 | Paraguai 15370 Franca 1036 | Uruguai 14346 Alemanha 1031 | Suecia 1053 ----------------------------------------------------------------------- OBs.: No comando anterior, usei o LCID (locale id) numero 0409, que eh default do cliente oficial. Apos ter enviado e recebido a resposta CVR, voce devera enviar o comando que identifica qual usuario (passaport) ira querer logar. Essa string devera conter um parametro de autenticacao que sempre sera TWN (algumas coisas ainda nao foram totalmente desvendadas hehe), um 'I' para indicar que o processo sera uma autenticacao (initiating authentication), e por ultimo seu e-mail que ira realizar o logon. >>> USR 3 TWN I eu@email.com\r\n Caso o servidor nao reconheca seu comando, ele ira fechar a conexao sem nenhuma resposta, ou, dependendo da string, podera resultar numa mensagem de erro. A tabela abaixo mostra alguns dos erros mais encontrados, lembrando que nem todos foram documentados por ainda serem desconhecidos. Caso queira ver mais sobre eles, recomendo visitar um dos links que disponibilizo no final deste artigo. ERROS: | DESCRICAO: ------------------------------------------------------------------------ 207 | Usuario ja esta logado. ------------------------------------------------------------------------ 223 | Caso tente criar novo grupo de contatos, esse erro indica | que voce ja atingiu o maximo permitido (30). ------------------------------------------------------------------------ 500 | Erro interno do NS (servico temporariamente indisponivel). ------------------------------------------------------------------------ 701 | Erro no comando CVR. ------------------------------------------------------------------------ 911 | Falha na autenticacao com o SB. ------------------------------------------------------------------------ 928 | Ticket invalido (veremos mais sobre isso na sequencia). ------------------------------------------------------------------------ A resposta dada pelo NS sera simples de ser entendida. Caso uma string contendo a instrucao XFR seja retornada, ela indicara um segundo servidor a ser conectado, obrigando voce fechar a conexao atual e criar uma nova no servidor indicado. Os parametros, conforme visto abaixo, correspondem a flag NS indicando que sera feita uma transferencia entre Notification Server, o server e porta que voce devera conectar (separados por dois-pontos), um "0" que nao nos importa neste caso, e o IP onde esta conectado atualmente. Quando criar a nova conexao, voce devera reiniciar todo o processo de autenticacao descrito acima, enviando a versao do protocolo, etc. Abaixo um exemplo de resposta XFR: <<< XFR 3 NS 207.46.106.145:1863 0 207.46.104.20:1863\r\n Uma vez reconectado no novo IP, a string de resposta contera um USR, in- dicando que houve sucesso nesta etapa do handshake. Se voce achou dificil esta parte, recomendo dar uma lida novamente desde o comeco, agora vem a parte traba- lhosa para poder autenticar. Daqui pra frente comeca um processo demorado, voce tera que manipular muitas strings que serao recebidas como resposta atraves dos comandos que serao enviados. Recomendo utilizar uma linguagem de alto-nivel de abstracao, que manipule strings com facilidade, isso vai ajudar muito. (se quiser usar regex, sinta-se a vontade :D). --=[ 4.0 Obtendo MS Passport e Ticket Agora que enviamos o pedido corretamente devemos obter o famoso MS Pas- sport para poder haver a autenticacao. Mais uma vez devemos criar um socket responsavel pela comunicacao com este novo servidor chamado "Nexus", ele eh um server dedicado para atender as requisicoes dos passports para os usuarios, indicando o ticket (uma string aleatoria) para autenticacao final. Para fazer isto, devemos enviar um GET pelo protocolo HTTPS versao 1.0 para a url "https://nexus.passport.com/rdr/pprdr.asp", que ira retornar os dados para serem tratados. Abaixo esta um exemplo de retorno: <<< HTTP/1.1 200 OK\r\n <<< Server: Microsoft-IIS/5.0\r\n <<< Date: Mon, 02 Jun 2003 11:57:47 GMT\r\n <<< Connection: close\r\n <<< PassportURLs: DARealm=Passport.Net,DALogin=login.passport.com/login2.srf,DAReg=http://register.passport.net/uixpwiz.srf,Properties=https://register.passport.net/editprof.srf,Privacy=http://www.passport.com/consumer/privacypolicy.asp,GeneralRedir=http://nexusrdr.passport.com/redir.asp,Help=http://memberservices.passport.net/memberservice.srf,ConfigVersion=11\r\n <<< Content-Length: 0\r\n <<< Content-Type: text/html\r\n <<< Cache-control: private\r\n <<< \r\n O nexus apenas esta indicando o server a ser contactado para adquirir o ticket. Perceba no parametro PassportURLs que existe uma variavel DALogin apon- tando ao servidor "login.passport.com", que sera responsavel em nos entregar o ticket. Logo apos a comunicacao com o servidor passport, ha o encerramento da conexao como visto em "Connection: close\r\n". Devemos agora enviar um GET usando o mesmo HTTPS para a url indicada na conexao anterior, "login.passport.com/login2.srf". No parametro Authorization, algumas variaveis deverao ser definidas pelo programador, que sao "sign-in" e "pwd", representando respectivamente o e-mail 'urlencoded' e a senha. Este ser- vidor de login devera receber nosso comando da seguinte forma: >>> GET /login2.srf HTTP/1.0\r\n >>> Authorization: Passport1.4 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2E msn%2Ecom,sign-in=eu%40email.com,pwd=password,lc=1033,id=507,tw=40,fs=1,ru=http %3A%2F%2Fmessenger%2Emsn%2Ecom,ct=1062764229,kpp=1,kv=5,ver=2.1.0173.1,tpf=43f8 a4c8ed940c04e3740be46c4d1619\r\n >>> Host: login.passport.com\r\n\r\n (nao esqueca de encodar o email, como visto acima, substituindo '@' por '%40'). Respondendo a nossa requisicao, o servidor podera retornar uma mensagem de redirecionamento como mostrado abaixo: <<< HTTP/1.1 302 Found\r\n <<< Server: Microsoft-IIS/5.0\r\n <<< Date: Sun, 06 Mar 2005 11:58:32 GMT\r\n <<< PPServer: H: LAWPPLOG5C006\r\n <<< Connection: close\r\n <<< Content-Type: text/html\r\n <<< Expires: Sun, 06 Mar 2005 11:57:32 GMT\r\n <<< Cache-Control: no-cache\r\n <<< cachecontrol: no-store\r\n <<< Pragma: no-cache\r\n <<< P3P: CP="DSP CUR OTPi IND OTRi ONL FIN"\r\n <<< Authentication-Info: Passport1.4 da-status=redir\r\n <<< Location: https://login.passport.com/login2.srf?lc=1033\r\n <<< \r\n Aqui vemos algo importante: o servidor nos pede para redirecionar a co- nexao para o servidor "loginnet.passport.com". Este eh um jeito mais confiavel para o processo de obtencao de ticket, porem pode-se seguir a regra de que se voce possuir uma conta hotmail ou msn, o servidor sera o citado acima, caso con- trario, uma conta fora dos dominios da Micro$oft, o servidor sera o conhecido "login.passport.com". Caso a mensagem nao seja a de redirecionamento, obteremos o nosso ticket: <<< HTTP/1.1 200 OK\r\n <<< Server: Microsoft-IIS/5.0\r\n <<< Date: Sun, 06 Mar 2005 11:59:00 GMT\r\n <<< PPServer: H: LAWPPIIS6B061\r\n <<< Connection: close\r\n <<< Content-Type: text/html\r\n <<< Expires: Sun, 06 Mar 2005 11:58:00 GMT\r\n <<< Cache-Control: no-cache\r\n <<< cachecontrol: no-store\r\n <<< Pragma: no-cache\r\n <<< P3P: CP="DSP CUR OTPi IND OTRi ONL FIN"\r\n <<< Set-Cookie: MSPSec1= ; expires=Thu, 30-Oct-1980 16:00:00 GMT;domain=.pas sport.com;path=/;HTTPOnly= ;version=1\r\n <<< Set-Cookie: MSPSec=5Cdd1SshOELpwqafsSuYSiDEuEtP1PUaX99YOZcaoJP3vkIn7DXoz t868I7eJNjcWG; HTTPOnly= ; domain=.passport.com;path=/;secure=\r\n <<< Set-Cookie: MSPAuth=5yDBU0BqvDa7UiY9W9nVEncRXCLD4gjLmtEr2XkunnafkOgdgG5x *CEpqe7MyZEOir*EiA1PbwLKzqCGO671TeTQ$$; HTTPOnly= ; domain=.passport.com;path=/\r\n <<< Set-Cookie: MSPProf=5a0mKE6PKDsxz!*4apQt0amnQOGLYqcCm78ie!MmHq0KnAiIJM0z 0Zajs8NL7ux7Ae0hnH5AAoB!zXIZ9jTA2rcQttC*RKKRsc9k7JflwThB!H0Qa*6ipGcdj5co6taPir; HTTPOnly= ; domain=.passport.com;path=/\r\n <<< Set-Cookie: MSPVis=507;domain=.passport.com;path=/\r\n <<< Set-Cookie: MSPPre=eu@email.com; HTTPOnly= ; domain=.passport.com;path=/; Expires=Wed, 30-Dec-2037 16:00:00 GMT\r\n <<< Set-Cookie: MSPShared= ; HTTPOnly= ; domain=.passport.com;path=/;Expires= Thu, 30-Oct-1980 16:00:00 GMT\r\n <<< Authentication-Info: Passport1.4 da-status=success,tname=MSPAuth,tname= MSPProf,tname=MSPSec,from-PP='t=53*1hAu8ADuD3TEwdXoOMi08sD*2!cMrntTwVMTjoB3p6st WTqzbkKZPVQzA5NOt19SLI60PY!b8K4YhC!Ooo5ug$$&p=5eKBBC!yBH6ex5mftp!a9DrSb0B3hU8aq AWpaPn07iCGBw5akemiWSd7t2ot!okPvIR!Wqk!MKvi1IMpxfhkao9wpxlMWYAZ!DqRfACmyQGG112B p9xrk04!BVBUa9*H9mJLoWw39m63YQRE1yHnYNv08nyz43D3OnMcaCoeSaEHVM7LpR*LWDme29qq2X3 j8N',ru=http://messenger.msn.com\r\n <<< Content-Length: 0\r\n <<< \r\n Enfim, temos o nosso ticket, mostrado no parametro "Authenticaction-Info". No nosso caso, ele sera: t=53*1hAu8ADuD3TEwdXoOMi08sD*2!cMrntTwVMTjoB3p6stWTqzbkKZPVQzA5NOt19SLI60PY!b8K 4YhC!Ooo5ug$$&p=5eKBBC!yBH6ex5mftp!a9DrSb0B3hU8aqAWpaPn07iCGBw5akemiWSd7t2ot!ok PvIR!Wqk!MKvi1IMpxfhkao9wpxlMWYAZ!DqRfACmyQGG112Bp9xrk04!BVBUa9*H9mJLoWw39m63YQ RE1yHnYNv08nyz43D3OnMcaCoeSaEHVM7LpR*LWDme29qq2X3j8N Note que qualquer que seja a resposta do servidor, a conexao sera encerrada, tanto para redirecionamento quanto na obtencao final do ticket. --=[ 5.0 Conexao Estabelecida Ufa! Finalmente passamos pela parte mais demorada do processo. Agora que temos o ticket, mande o comando USR para o primeiro NS que voce conectou (depois de tantas conexoes, espero que ainda lembre :P). >>> USR 4 TWN S t=(blablabla.. toda a string do ticket) Quando enviar este comando, voce estara conectado. Uma dica interessante eh estar online em um cliente como aMSN ou o proprio oficial, e perceber que quando o comando for enviado com sucesso sua conexao no cliente ira cair, visto que o MSNP nao permite duas conexoes simultaneas. Depois de conectar, pode ser implementado uma serie de instrucoes. Nao irei aborda-las agora justamente por ser muito extensa, e este paper eh apenas o basico para iniciar o jovem aprendiz neste mundo. Mas, caso queira ver sua lista de contatos, envie alguns comandos de sincronizacao: >>> SYN 4 0 0\r\n Imprima a resposta do server :) Se voce interessar por mais instrucoes, consulte o link que disponibilizo no final do paper. --=[ 6.0 Exemplo Simples Confira um pequeno script feito em python que fiz exemplificando toda essa teoria. Para executar apenas atribua um "+x" nele e execute. (espero que entendam python, nao eh complicado caso tenha alguma nocao de programacao). <++> msn.py #!/usr/bin/env python ###################################################################### # - msn.py # # Cliente MSN que obtem a lista de contatos de uma determinada conta. # Programa exemplo como parte do artigo "MSN Hacking" publicado no # MOTD Guide #4. Confira em guide.motdlabs.org # # by Leandro ###################################################################### from socket import * from sys import * from os import * from string import * import getpass #################################### # Funcao para pegar o MSN Passport def passport(login,senha,string): sock_passport = socket(AF_INET,SOCK_STREAM) sock_passport.connect(('nexus.passport.com',443)) # Veja a porta... req = "GET /rdr/pprdr.asp HTTP/1.0\r\n\r\n" ssl_conn = ssl(sock_passport) # ... SSL :) ssl_conn.write(req) buffer_passport = ssl_conn.read() tmp = buffer_passport.split("DALogin=") buffer_passport = tmp[1] tmp = buffer_passport.split(",") buffer_passport = tmp[0] tmp = buffer_passport.split("/") passport_server = tmp[0] sock_passport.close() sock_passport = socket(AF_INET,SOCK_STREAM) sock_passport.connect((passport_server,443)) # Fora do nexus.passport.com ssl_conn = ssl(sock_passport) str = string.split("TWN") string = str[1] str = string.split() string = str[1] username = login.split("@") buffer_passport = "GET /login2.srf HTTP/1.0\r\n\r\nAuthorization: Passport1.4 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,sign-in=" + username[0] + "%40" + username[1] + ",pwd=" + senha + "," + string + "\r\n\r\nHost: " + passport_server + "\r\n\r\n" ssl_conn.write(buffer_passport) buffer_passport = ssl_conn.read() if count(buffer_passport,"Location:") == 0: sock_passport.close() print "[-] Erro na aquisicao do Passport" exit(0) tmp = buffer_passport.split("Location:") buffer_passport = tmp[1].split() location = buffer_passport[0].split("?") sock_passport.close() log = login.split('@') if log[1] == "hotmail.com" or log[1] == "msn.com": server = "loginnet.passport.com" else: server = "login.passport.com" sock_passport = socket(AF_INET,SOCK_STREAM) sock_passport.connect((server,443)) ssl_conn = ssl(sock_passport) buffer_passport = "GET /login2.srf HTTP/1.1\r\nAuthorization: Passport1.4 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,sign-in=" + username[0] + "%40" + username[1] + ",pwd=" + senha + "," + string + "\r\nHost: login.passport.com\r\n\r\n" ssl_conn.write(buffer_passport) buffer_passport = ssl_conn.read(2024) tmp = buffer_passport.split('t=') buffer_passport = tmp[1].split("\',ru=") ticket = buffer_passport[0] tmp = "USR 4 TWN S t=" + ticket + "\r\n" sock_passport.close() return(tmp) #################################### # Principal if len(argv) != 2: print """ MSN Contact List - Example Version ================================== Retorna a lista de contatos de uma conta MSN. Uso: %s ------------------------- Leandro A. Thomas """ % argv[0] exit(0) senha = getpass.getpass("Digite sua senha: ") conta = argv[1] buffer_xfr = "XFR" # Parametro que define que a transacao de mensagens # esta ocorrendo com sucesso endereco = "messenger.hotmail.com" # Definindo nosso server porta = 1863 # Porta padrao while buffer_xfr == "XFR": request = "VER 1 MSNP9 MSNP10\r\n" # Compativel com 2 versoes do MSNP s = socket(AF_INET,SOCK_STREAM) s.connect((endereco,porta)) s.send(request) print "\n[+] Conectando (%s:%s)" % (endereco,porta) buffer = s.recv(1024) if buffer == "VER 1 0\r\n": # Avisando que houve algum erro print "[-] Desconectado do servidor!" exit(0) request = "CVR 2 0x0409 win 4.10 i386 MSMSGR 6.2.0137 MSMSGR %s\r\n" % conta s.send(request) buffer = s.recv(1024) request = "USR 3 TWN I %s\r\n" % conta s.send(request) print "[+] Enviando username (%s)" % conta buffer = s.recv(1024) splited_buffer = buffer.split() if splited_buffer[0] == "XFR": # Conectar ao server indicado buffer_xfr = "XFR" foo = splited_buffer[3].split(':') endereco = foo[0] porta = int(foo[1]) print "[-] Redirecionando a outro servidor" s.close() elif splited_buffer[0] == "USR": # Conexao feita com sucesso print "[+] Requerindo MS Passport" auth = passport(conta,senha,buffer) s.send(auth) buffer = s.recv(1024) print "[+] Usuario logado com sucesso!" break else: print "[-] Erro desconhecido" s.close() exit(0) # Alguns comandos de sincronizacao buffer = "SYN 4 0 0\r\n" s.send(buffer) buffer = s.recv(1024) buffer = "SYN 4 0 0\r\n" s.send(buffer) buffer = s.recv(1024) buffer = "SYN 4 0 0\r\n" s.send(buffer) buffer = s.recv(1024) print "\n\tSUA LISTA DE CONTATOS:\n" buffer = "SYN 4 0 0\r\n" s.send(buffer) buffer = s.recv(1024) buffer = "SYN 4 0 0\r\n" s.send(buffer) buffer = s.recv(3024) buffer = "SYN 4 0 0\r\n" s.send(buffer) buffer = s.recv(1024) buffer = "SYN 4 0 0\r\n" s.send(buffer) buffer = s.recv(1024) print buffer s.close() <--> msn.py --=[ 7.0 Referencias Confira alguns links que disponibilizo caso queira se aprofundar no assunto. Sei que sao poucos, mas garanto que sao suficientes :) RFC 2616 - HyperText Transfer Protocol (HTTP) Python Official MSN Messenger Protocol --=[ 8.0 Consideracoes Finais "- Entendi o protocolo MSN, e dai?" Entendendo seu funcionamento podemos nao apenas satisfazer a curiosida- de do que ocorre por tras dos "bastidores" mas como tambem fucar, desenvolver alguma pequena aplicacao utilizando os principios de comunicacao seguindo esse protocolo, fazendo um "divertido" script ou ateh colaborando com projetos open source. Ha algum tempo atras foi divulgado um binario para Windows que, quando executado, mandava a mensagem "SOU GAY!!!" para todos os usuarios online em uma contact list, utilizando esses mesmos principios :P Por fim, fechando este artigo, peco desculpas por nao ter aprofundado mais, apenas tentei resumir o maximo possivel para explicar os passos basicos do protocolo, porem fiquei com medo de fazer algo meio superficial e deixar muita gente sem entender direito algumas partes. Superficial? Bem, ficou um pouco, ainda poderia ser dito muito mais, mas essa leitura ja deve valer a pena e satisfazer muitos fucadores interessados em programar utilizando o MSNP :) Antes que esqueca, gostaria de agradecer o pessoal do MotdLabs por terem confiado em mim e mandar um 'alo' para alguns grandes amigos: galera do RFDSLabs, GotFault, Recife Phrack Staff (hehehe), e toda a galera que eu converso e troco informacoes. Hacking for freedom, hacking for knowledgment! Leandro _EOF_