Jump to content

All Activity

This stream auto-updates     

  1. Yesterday
  2. Desde sua descoberta, em 2016, o malware TrickBot continua afetando ativamente as contas de milhões de pessoas. De acordo com a empresa americana Deep Instinct, a família de malware, focada no roubo de informações de dados financeiros, pode agora ter também uma nova variante - além da adição recente de um módulo de roubo de cookies, foi criado um módulo malicioso de infecção e distribuição de e-mail que compartilha certificados de assinatura digital. Esse novo módulo coleta credenciais de e-mails e contatos do catálogo de endereços, caixa de entrada e caixa de saída da vítima, enviando spams maliciosos por meio da conta comprometida pelo malware. Posteriormente, essas mensagens são deletadas sem deixar rastros ao usuário. A Deep Instinct identificou uma base de dados contendo 250 milhões de contas de e-mail coletadas por operadores do TrickBot. Essas contas provavelmente foram empregadas como listas-alvos de infecções maliciosas, incluindo milhões de endereços de e-mail de departamentos e agências governamentais nos Estados Unidos e no Reino Unido. A base de e-mails recuperada contém quantidades massivas de endereços de provedores comumente usados, como Gmail, Yahoo, Hotmail, entre outros, não se limitando a apenas estes. A empresa de segurança explica o passo a passo de como a infecção ocorre no texto original, em inglês. Eles destacam a sofisticação do TrickBot como muito bem-sucedida pelo aumento da capacidade de distribuir seu próprio malware, além de encobrir seus rastros, o que faz com que ele seja ignorado por quase todos os fornecedores de varredura. 😱
  3. Last week
  4. A analista de malware polonesa hasherezade, que desenvolveu uma ferramenta para engenharia reversa/análise de malware chamada PE-Sieve, adicionou uma opção para reconstruir a IAT (Import Address Table) de executáveis PE na última versão da ferramenta, mas ao testar o recurso com um executável comprimido com UPX, ela percebeu que não estava funcionando muito bem. Ela descobriu, porém, que a importação de uma função da USER32.DLL não se dava diretamente. Ao invés disso, o loader do Windows resolveu uma chamada intermediária (processo conhecido como shimming) e isso impedia que a importação fosse reconstruída na IAT pelo PE-Sieve ou qualquer outro programa que tentasse a reconstrução. No texto, em inglês, ela mostra como resolveu esse problema mexendo na estrutura do arquivo PE (olha aí a importância de conhecer a estrutura destes executáveis), o que alterou a forma como o loader o interpretou. Em sua explicação, hasherezade descreve todos os testes que fez. Vai lá dar uma olhada nesse passo a passo incrível e explicativo! 🏃‍♀️
  5. Qual a opção exata do x64dbg que você usou? Deveria ser possível encontrar sim... Se puder compartilhar o binário a gente pode ver também. Outra opção é testar esse novo plugin da @horsicq: https://github.com/horsicq/stringsx64dbg/releases 😉 Abraço!
  6. OPA! Leandro seguinte cara vou postar o print do Imprec pra você dar uma olhada nos erros, a principio foram dois. Se você por me dar um norte sobre o que pesquisar ficarei muitíssimo agradecido valeu TMJ!
  7. Obrigado pela resposta Leandro! vou preparar um post bem elaborado com todos os dados e posto aqui na sequência! Valeeeu!
  8. Opa, você diz interpretar um valor em hexa utilzando a linguagem C? Ou literalmente pegar um arquivo binário e tentar transformar em C?
  9. Recentemente, os cibercriminosos por trás do conhecido ransomware GrandCrab anunciaram que estão encerrando suas atividades após, supostamente, faturar mais de $ 2 bilhões em pagamentos de vítimas que foram extorquidas. O GrandCrab é uma ameaça de computador que leva a corrupção ou perda de dados invadindo secretamente um dispositivo e exibindo anúncios ao mesmo tempo que rouba informações e dados sensíveis das vítimas. Apesar do comunicado de que terminaram as invasões com essa ameaça, os mesmos cibercriminosos podem ter migrado para outro ransomware mais exclusivo e avançado chamado de Revil, também conhecido como Sodin e Sodinokibi. Em abril, o Talos Security Intelligence and Research Group, grupo de pesquisa da Cisco, divulgou que uma nova família de ransomware estaria usando vulnerabilidades do Oracle WebLogic para infectar computadores. Um mês depois, o GrandCrab anunciou seu encerramento. Em meados de maio, conforme aponta o site KrebsOnSecurity, um indivíduo utilizando o nickname "Unknow" começou a fazer depósitos de mais de US$ 130 mil em moedas virtuais em dois fóruns de cibercrime, o que seria uma oferta para contratar pessoas em um novo programa de ransomware, ainda sem nome. Na oferta, cinco afiliados poderiam participar do programa, mas não foram divulgados seus detalhes técnicos. Uma das evidências de que o REvil/Sodinokibi e o GrandCrab vieram da mesma equipe é que ambos incluíram a Síria na lista de países que devem ser evitados de infectar. Após um ataque específico no país e que chamou a atenção da mídia e dos desenvolvedores do ransomware, uma chave de descriptografia foi desenvolvida permitindo que todas as vítimas do GrandCrab na Síria abrissem seus arquivos gratuitamente. Outra semelhança entre as ameaças está na forma como o GandCrab e o REvil geram as URLs usadas como parte do processo de infecção. Esses são alguns indicativos de que a equipe do GandCrab não se aposentou, mas talvez tenha se reagrupado e mudou de marca para evitar investigações, já que o ransomware chamava muita atenção de pesquisadores de segurança e investigadores da lei. 🧐
  10. Fala @SiriusB. Cara eu não consegui entender muito bem, você poderia postar um print? No caso, só pra confirmar, você tem ctz que esse é o OEP né? Sobre fazer Engenharia Reversa no software X ou Y, sim, da pra fazer Engenharia Reversa no que você quiser, só não esqueça que nem sempre é permitido. 😉
  11. hi guys! Seguinte sou novo aqui e tenho duas duvidas, vi o canal do youtube realmente é muito bom! conteúdo ótimo! Minhas duvidas são as seguintes: * Estou tentando fazer um import table de um exe. eu /coloco o OEP: 0018F1FC dou um IAT Search, ele responde com FOUND! porem aparece assim "Se não der certo, tentar RVA 00001000 size 00B51000" quando eu dou o get import no log aparece NO YES YES YES YES NO YES YES Enfim aparece dois erros e não sei o que eu estou fazendo de errado. pois li que somente o exe vai rodar liso se der tudo YES quando eu abro o exe que eu fiz a import table pelo Ollydbg ele diz que o Entry point está faltando. * A segunda duvida: é possivel fazer engenharia reversa num software que precise de serial, email de cadastramento e pagamento online para liberação da chave de licença? pois vejo varios videos de pessoas fazendo engenharia reversa para burlar um serial de um programa simples. Queria saber se é possivel nesses programas que pedem email e pagamento OBS: somente para duvidas relacionadas a estudo. MUITO OBRIGADO!
  12. Mas calma, o recurso é opcional e só funciona se o arquivo/diretório em questão estiver dentro de um diretório que tenha uma opção específica habilitada. Isso significa que no ext4 os nomes de diretório e arquivos serão reconhecidos independente de conter letras maiúsculas ou minúsculas, se a opção for habilidada. Por exemplo, antes um DIRETORIO era diferente de diretorio ou Diretorio. Agora não há mais essa diferenciação se você habilitar o suporte. 🔠🔡 A mudança está disponível para o Linux 5.2, de acordo com o Phoronix, e vem sendo desenvolvida há muito tempo para suportar nomes de arquivos sem distinção entre caixa alta e baixa e ter suporte à codificação UTF-8. A implementação é válida apenas para Ext4, não afetando outros sistemas de arquivos. Há apenas uma limitação dos diretórios e nomes de arquivos que não diferenciam letras maiúsculas de minúsculas: eles não suportam a codificação e a criptografia por diretório no mesmo sistema de arquivos ao mesmo tempo. Eventualmente, o suporte a ambos os recursos concomitantemente deve ser oferecido.
  13. Os desenvolvedores do aplicativo de videoconferência Zoom corrigiram, na semana passada, uma falha que deixava o app vulnerável a ataques para quem o utilizava em dispositivos Mac, da Apple. De acordo com comunicado do fundador e CEO da empresa, Eric S. Yuan, a falha foi divulgada por um um pesquisador de segurança no início da semana passada. Yuan destaca que sua equipe está fazendo várias alterações para evitar esses riscos, entre elas uma atualização para o aplicativo disponível para Mac. Também em comunicado, o diretor de segurança da informação da empresa, Richard Farley, explica que a vulnerabilidade encontrada é de negação de serviço para dispositivos Mac, o que permitiria a um atacante ter como alvo um usuário do Mac que já tenha o Zoom instalado com um loop infinito de solicitações de reunião de videoconferência, o que travaria o sistema. "Não temos evidência de que isso tenha ocorrido. Lançamos uma correção para o problema em maio de 2019, embora não tenhamos forçado nossos usuários a atualizar por ser, empiricamente, uma vulnerabilidade de baixo risco", diz Farley. Foi inserida ainda uma nova opção que permite a desinstalação do Zoom pelo próprio aplicativo, incluindo o servidor Web local. Além disso, a Apple divulgou uma atualização para garantir que o servidor da Web do Zoom seja removido de todos os Macs mesmo que o usuário não tenha atualizado o aplicativo ou o tenha excluído antes do patch (correção) divulgado em 9 de julho. Outra atualização realizada no dia 14 se estende a aplicativos Zoom em execução em Mac, Windows, Linux, Chrome OS, iOS (com aprovação pendente da App Store) e Android. O Zoom implementou um recurso de visualização de vídeo que aparece antes que qualquer participante inicie uma reunião. O participante pode optar por participar com ou sem vídeo, ou recusar a solicitação. Além disso, o participante também pode marcar uma caixa para sempre ter a pré-visualização do vídeo ao participar de uma videoconferência. O Zoom também pretende implantar um programa de divulgação de vulnerabilidades públicas nas próximas semanas, complementando o programa privado de recompensas de bugs. Mas se você é usuário do aplicativo, o importante para o momento é: faça suas atualizações! ⬆️
  14. Olá. Como faço para ler ou transformar hexadecimal em Linguagem C? PIC16F685
  15. Willm

    Unicode

    Eu tava tentando encontrar uma string no xdbg e não conseguia, mas o die mostrava que ela existia e ele dizia que era UNICODE. Então como faço para encontrar essa string xdbg e como encontrar instruções que fazem referencia a essa string?
  16. Saudações coisinhas fofas, fiz aqui um pequeno script em python para fazer requisições para servidores whois e queria partilhas com vocês, porque vocês merecem muitas coisinhas boas, então vamos lá... Root Zone Database https://www.iana.org/domains/root/db NOTA: Se clicarem no .br por exemplo vão ser redirecionados para uma página onde podem encontrar o "nome" do servidor para o qual deve ser feita a query caso o dominio que quem verificar terminar em .br. SCRIPT EM PYTHON from socket import * import re endereco = "mentebinaria.com.br" whois_arin = "whois.arin.net" servidores_whois_tdl = {'.br': 'whois.registro.br', '.org': 'whois.pir.org', '.com': 'whois.verisign-grs.com', '.pt': 'whois.dns.pt'} padrao_expressao_regular = re.compile(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$") def requisicao_whois(servidor_whois, endereco_host, padrao): objeto_socket = socket(AF_INET, SOCK_STREAM) conexao = objeto_socket.connect_ex((servidor_whois, 43)) if conexao == 0: if padrao == True: objeto_socket.send('n + {}\r\n'.format(endereco_host).encode()) while True: dados = objeto_socket.recv(65500) if not dados: break print(dados.decode('latin-1')) elif padrao == False: objeto_socket.send('{}\r\n'.format(endereco_host).encode()) while True: dados = objeto_socket.recv(65500) if not dados: break print(dados.decode('latin-1')) if padrao_expressao_regular.match(endereco): requisicao_whois(whois_arin, endereco, padrao = True) else: for TLD in servidores_whois_tdl.keys(): if endereco.endswith(TLD): requisicao_whois(servidores_whois_tdl[TLD], endereco, padrao = False) NOTAS IMPORTANTES O SOBRE SCRIPT Porquê este ciclo de repetição ? while True: dados = objeto_socket.recv(65500) if not dados: break print(dados.decode('latin-1')) Porque a resposta completa vem em pacotes diferentes na maioria das vezes, e quando chegam são reagrupados, então se estiveres à espera de receber apenas o buffer e fazer output dos dados, ficas apenas com a resposta de um pacote, ou seja a resposta fica incompleta. Ao fazer a query para o servidor no método send( ) vais ver isto n + objeto_socket.send('n + {}\r\n'.format(endereco_host).encode()) segue o link : https://www.arin.net/resources/registry/whois/rws/api/ Vê o tópico NICNAME/Whois Queries está lá a explicar tudo. Porquê que é que está a ser feito um decode 'latin-1' nos dados recebidos ? print(dados.decode('latin-1')) Eu quando estive a fazer uma análise do domínio mentebinária.com.br, aparentemente o dono tem um nome muito estranho, que é mercês então o caractere ê vem num formato 0xea , então não dá para resolver com utf-8 tem que ser com latin-1. Vê esta informação: https://docs.python.org/3/howto/unicode.html e esta também https://docs.python.org/3/library/codecs.html#standard-encodings penso que seja tudo, beijinhos fofos.
  17. Earlier
  18. A corrida presidencial dos Estados Unidos começou, bem como a preocupação com vazamento de informações confidenciais durante a campanha eleitoral. Nas eleições de 2016, a disputa entre Donald Trump e Hillary Clinton foi marcada pelo suposto vazamento de emails da conta profissional de John Podesta, chefe de campanha de Hillary, publicados no Wikileaks. Para 2020, a segurança cibernética nas eleições evoluiu e há uma preocupação maior de empresas e governos para proteger informações confidenciais durante as campanhas. Em meio a um cenário de novas advertências das agências de inteligência norte-americanas sobre ataques cibernéticos iminentes contra candidatos na preparação para a corrida presidencial, a Comissão Federal Eleitoral dos EUA (FEC) permitiu que as campanhas políticas aceitem serviços de segurança cibernética de empresas sem entrar em conflito com as leis de financiamento de campanhas existentes, que proíbem contribuições corporativas. A FEC entendeu que tal assistência não constitui contribuição desde que a empresa de segurança cibernética já ofereça soluções para organizações não-políticas similares, como organizações sem fins lucrativos. A decisão vem na onda de uma série de comunicados da FEC relacionados a ofertas de segurança cibernética destinadas a candidatos federais e comitês políticos. Mais recentemente, a comissão permitiu que a organização sem fins lucrativos Defending Digital Campaigns ofereça serviços gratuitos de segurança cibernética a candidatos, mas essa decisão se aplica apenas a grupos não partidários e sem fins lucrativos que oferecem os mesmos serviços a todas as campanhas. A Area 1 Security também teve aval da FEC para fornecer esse tipo de serviço, cobrando dos candidatos federais qualificados e comitês políticos o mesmo que cobra de seus clientes não-políticos, o que não caracteriza uma contribuição proibida a tais candidatos e comitês.
  19. se o criminoso fosse eu, acho que sim deviam pagar...
  20. Lembrando que eu estou na versão mais recente do ubuntu e do gcc, poderia ser isso?
  21. O governo de duas cidades dos Estados Unidos decidiram pagar pelo resgate de seus dados após sofrer ataques de ransomware. Os casos citados ocorreram em Lake City e Riviera Beach, ambos na Flórida. As prefeituras das cidades pagaram um total combinado de US$ 1 milhão em Bitcoins. Já a cidade de Baltimore, no estado de Maryland, passou pelo mesmo tipo de ataque que dominou o sistema local por duas semanas, e o prefeito da cidade se recusou a pagar pelo resgate, embora a recuperação do ataque possa chegar a custar US$ 10 milhões à prefeitura. Ataques como esse também ocorreram recentemente em cidade brasileiras. O sistema interno da Prefeitura de São João da Barra, no Rio de Janeiro, ficou fora do ar após ter seus dados criptografados e o resgate solicitado foi de 5 mil Bitcoins. A Prefeitura de Santa Terezinha, em Mato Grosso, também teve seu sistema de bancos de dados sequestrado, e os atacantes exigiram US$ 4 mil a serem convertidos em Bitcoins. A pergunta que fica é: nesses casos, o governo deve ou não abrir mão aos atacantes e pagar pelo resgate dos dados? 💸 Especialistas do Talos Security Intelligence and Research Group, grupo de pesquisa da Cisco, em geral, são contra o pagamento. Segundo eles, o pagamento deve ser o último recurso de qualquer vítima de extorsão de cibercriminosos - até porque não dá para saber se os dados serão devolvidos em sua integridade, sem alterações pelo autor do ransomware. "Outro impacto negativo em torno de pagar o resgate é que você está literalmente financiando o orçamento para as pessoas que tentam comprometê-lo", diz Craig Williams, diretor da Talos Global Outreach. Joel Esler, gerente sênior da Talos Communities Division, também concorda que pagar resgate é ajudar o inimigo. "Você está financiando os bandidos com absolutamente nenhuma garantia de que obterá seus arquivos de volta". Os atacantes podem até devolver os dados após o pagamento, mas não é possível saber se deixaram alguma brecha aberta para realizar um novo ataque, alerta o especialista. A decisão de pagar pelo resgate só deve ser considerada nos casos mais extremos e vista como um fluxo de trabalho de continuidade de negócios ou recuperação de desastres. Alguns especialistas defendem que, ao optar pelo pagamento, isso deve ser considerado como uma decisão de negócios, e outras medidas devem ser tomadas posteriormente. Ataques de ransomware têm evoluído cada vez mais, principalmente em municípios e governos locais, por isso é importante adotar outras medidas para se proteger, e não financiar os atacantes com o pagamento de resgates. 👍
  22. 1 - Compilei assim gcc prog.c -o prog -fno-stack-protector -no-pie -w 2 - O endereço da system não parece ser randômico, porque o gdb sempre identifica o endereço quando é reiniciado. E o comando que eu uso para desabilitar o ASLR é esse aí: 3 - Eu dei um break na main e rodei o binário para a libc ser carregada nele e depois executei o comando "p system" e achei o endereço da função system 4 - Sim, deu Segmentation Fault
  23. Opa amigo, tudo bem? Vamos lá aos passos iniciais desta analise. 1 - Como vc compilou esse binário? 2 - Realmente setou o ASLR para 0 ? Rode ldd ./binario e veja se o endereço da libc esta sendo randomizado 3 - O que usou para chegar no endereço da system() ? 4 - Testou fora do GDB? Após validarmos isso, vamos para os próximos passos. Abraços
  24. Saudações, O intuito de fazer este script foi para ter uma ideia muito superficial de como funciona um TLS handshake, é de fazer notar que este script apenas analisa: TLS Record Handshake Client Hello Server Hello Application data Tudo o que envolve mensagens com certificados, necessita que seja dedicado um bom tempo de estudo, alguma dedicação ao assunto e eu não tenho esse tempo para dedicar a este tipo de assunto, e a vontade também não é muita. Dito isto digamos que o interesse aqui é ter um primeiro contato com TLS para tentar perceber como é feita a conversação entre o cliente e o servidor... As fontes de informação para iniciantes numa primeira abordagem não são muitas, no entanto encontrei uma página em que o jovem que escreveu o artigo tentou fazer uma explicação que numa fase inicial é interessante, talvez haja outras fontes eu é que não encontrei. Outra ferramenta que deve ser usada para complementar é o wireshark. Traffic Analysis of an SSL/TLS Session Pode ser encontrado aqui: http://blog.fourthbit.com/2014/12/23/traffic-analysis-of-an-ssl-slash-tls-session A informação que segue foi a que eu usei para criar o script, no link do site tem informação sobre outro tipo de mensagens. NOTA Outros Links que podem ajudar: https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/TLS_Cipher_String_Cheat_Sheet.md https://www.ntu.edu.sg/home/ehchua/programming/webprogramming/http_ssl.html https://www.cisco.com/c/en/us/support/docs/security-vpn/secure-socket-layer-ssl/116181-technote-product-00.html OUTRA NOTA: As cipher suites que estão no script que são usadas na negociação do Cliente Hello e Server Hello, algumas não são usadas mas qualquer das formas eu deixei lá, antes a mais do que a menos. SCRIPT PYTHON #coding:utf-8 #!/usr/bin/env python3 from socket import * import struct import binascii TIPO_RECORD = {22: "Handshake (22, 0x16)", 20: "Change Cipher Spec (20, 0x14)", 21: "Alert (21, 0x15)", 23: "Application Data (23, 0x17)"} TLS_VERSAO = {768: "SSL 3.0 (0x0300)", 769: "TLS 1.0 (0x0301)", 770: "TLS 1.1 (0x0302)", 771: "TLS 1.2 (0x0303)"} TIPO_HANDSHAKE = {0: "HELLO_REQUEST (0) 0x00", 1: "CLIENT_HELLO (1) 0x01", 2: "SERVER_HELLO (2) 0x02", 11: "CERTIFICATE (11) 0x0b", 12: "SERVER_KEY_EXCHANGE (12) 0x0c", 13: "CERTIFICATE_REQUEST (13) 0x0d", 14: "SERVER_DONE (14) 0x0e", 15: "CERTIFICATE_VERIFY (15) 0x0f", 16: "CLIENT_KEY_EXCHANGE (16) 0x10", 20: "FINISHED (20) 0x14"} # https://tools.ietf.org/html/rfc5246#page-75 # The following CipherSuite definitions require that the server provide # an RSA certificate that can be used for key exchange. The server may # request any signature-capable certificate in the certificate request # message. TIPO_CIPHER_SUITE = {1: 'CipherSuite: TLS_RSA_WITH_NULL_MD5 (0x0001)', 2: 'CipherSuite: TLS_RSA_WITH_NULL_SHA (0x0002)', 59: 'CipherSuite: TLS_RSA_WITH_NULL_SHA256 (0x003B)', 4: 'CipherSuite: TLS_RSA_WITH_RC4_128_MD5 (0x0004)', 5: 'CipherSuite: TLS_RSA_WITH_RC4_128_SHA (0x0005)', 10: 'CipherSuite: TLS_RSA_WITH_3DES_EDE_CBC_SHA (0x000A)', 47: 'CipherSuite: TLS_RSA_WITH_AES_128_CBC_SHA (0x002F)', 53: 'CipherSuite: TLS_RSA_WITH_AES_256_CBC_SHA (0x0035)', 60: 'CipherSuite: TLS_RSA_WITH_AES_128_CBC_SHA256 (0x003C)', 61: 'CipherSuite: TLS_RSA_WITH_AES_256_CBC_SHA256 (0x003D)', # https://tools.ietf.org/html/rfc5246#page-75 # The following cipher suite definitions are used for server- # authenticated (and optionally client-authenticated) Diffie-Hellman. # DH denotes cipher suites in which the server's certificate contains # the Diffie-Hellman parameters signed by the certificate authority # (CA). DHE denotes ephemeral Diffie-Hellman, where the Diffie-Hellman # parameters are signed by a signature-capable certificate, which has # been signed by the CA. The signing algorithm used by the server is # specified after the DHE component of the CipherSuite name. The # server can request any signature-capable certificate from the client # for client authentication, or it may request a Diffie-Hellman # certificate. Any Diffie-Hellman certificate provided by the client # must use the parameters (group and generator) described by the # server. 13: 'CipherSuite: TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA (0x000D)', 16: 'CipherSuite: TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA (0x0010)', 19: 'CipherSuite: TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA (0x0013)', 22: 'CipherSuite: TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA (0x0016)', 48: 'CipherSuite: TLS_DH_RSA_WITH_AES_128_CBC_SHA (0x0031)', 50: 'CipherSuite: TLS_DHE_DSS_WITH_AES_128_CBC_SHA (0x0032)', 51: 'CipherSuite: TLS_DHE_RSA_WITH_AES_128_CBC_SHA (0x0033)', 54: 'CipherSuite: TLS_DH_DSS_WITH_AES_256_CBC_SHA (0x0036)', 55: 'CipherSuite: TLS_DH_RSA_WITH_AES_256_CBC_SHA (0x0037)', 56: 'CipherSuite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA (0x0038)', 57: 'CipherSuite:TLS_DHE_RSA_WITH_AES_256_CBC_SHA (0x0039)', 62: 'CipherSuite: TLS_DH_DSS_WITH_AES_128_CBC_SHA256 (0x003E)', 63: 'CipherSuite: TLS_DH_RSA_WITH_AES_128_CBC_SHA256 (0x003F)', 64: 'CipherSuite: TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 (0x0040)', 103: 'CipherSuite: TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 (0x0067)', 104: 'CipherSuite: TLS_DH_DSS_WITH_AES_256_CBC_SHA256 (0x0068)', 105: 'CipherSuite: TLS_DH_RSA_WITH_AES_256_CBC_SHA256 (0x0069)', 106: 'CipherSuite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 (0x006A)', 107: 'CipherSuite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 (0x006B)', # https://tools.ietf.org/html/rfc5246#page-75 # The following cipher suites are used for completely anonymous # Diffie-Hellman communications in which neither party is # authenticated. Note that this mode is vulnerable to man-in-the- # middle attacks. Using this mode therefore is of limited use: These # cipher suites MUST NOT be used by TLS 1.2 implementations unless the # application layer has specifically requested to allow anonymous key # exchange. (Anonymous key exchange may sometimes be acceptable, for # example, to support opportunistic encryption when no set-up for # authentication is in place, or when TLS is used as part of more # complex security protocols that have other means to ensure # authentication.) 24: 'CipherSuite: TLS_DH_anon_WITH_RC4_128_MD5 (0x0018)', 27: 'CipherSuite: TLS_DH_anon_WITH_3DES_EDE_CBC_SHA (0x001B)', 52: 'CipherSuite: TLS_DH_anon_WITH_AES_128_CBC_SHA (0x0034)', 58: 'CipherSuite: TLS_DH_anon_WITH_AES_256_CBC_SHA (0x003A)', 108: 'CipherSuite: TLS_DH_anon_WITH_AES_128_CBC_SHA256 (0x006C)', 109: 'CipherSuite: TLS_DH_anon_WITH_AES_256_CBC_SHA256 (0x006D)', # https://tools.ietf.org/html/rfc8446#page-133 # This specification defines the following cipher suites for use with TLS 1.3 4865: 'CipherSuite: TLS_AES_128_GCM_SHA256 (0x1301)', 4866: 'CipherSuite: TLS_AES_256_GCM_SHA384 (0x1302)', 4867: 'CipherSuite: TLS_CHACHA20_POLY1305_SHA256 (0x1303)', 4868: 'CipherSuite: TLS_AES_128_CCM_SHA256 (0x1304)', 4869: 'CipherSuite: TLS_AES_128_CCM_8_SHA256 (0x1305)', # https://wiki.mozilla.org/Security/Server_Side_TLS#Cipher_names_correspondence_table # Cipher preference: server chooses # 0x13,0x01 - TLS_AES_128_GCM_SHA256 TLSv1.3 Kx=any Au=any Enc=AESGCM(128) Mac=AEAD # 0x13,0x02 - TLS_AES_256_GCM_SHA384 TLSv1.3 Kx=any Au=any Enc=AESGCM(256) Mac=AEAD # 0x13,0x03 - TLS_CHACHA20_POLY1305_SHA256 TLSv1.3 Kx=any Au=any Enc=CHACHA20/POLY1305(256) Mac=AEAD # 0xC0,0x2B - ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(128) Mac=AEAD # 0xC0,0x2F - ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(128) Mac=AEAD # 0xC0,0x2C - ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(256) Mac=AEAD # 0xC0,0x30 - ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(256) Mac=AEAD # 0xCC,0xA9 - ECDHE-ECDSA-CHACHA20-POLY1305 TLSv1.2 Kx=ECDH Au=ECDSA Enc=CHACHA20/POLY1305(256) Mac=AEAD # 0xCC,0xA8 - ECDHE-RSA-CHACHA20-POLY1305 TLSv1.2 Kx=ECDH Au=RSA Enc=CHACHA20/POLY1305(256) Mac=AEAD # 0x00,0x9E - DHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=AESGCM(128) Mac=AEAD # 0x00,0x9F - DHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=DH Au=RSA Enc=AESGCM(256) Mac=AEAD # 0xCC,0xAA - DHE-RSA-CHACHA20-POLY1305 TLSv1.2 Kx=DH Au=RSA Enc=CHACHA20/POLY1305(256) Mac=AEAD # 0xC0,0x23 - ECDHE-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AES(128) Mac=SHA256 # 0xC0,0x27 - ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AES(128) Mac=SHA256 # 0xC0,0x09 - ECDHE-ECDSA-AES128-SHA TLSv1 Kx=ECDH Au=ECDSA Enc=AES(128) Mac=SHA1 # 0xC0,0x13 - ECDHE-RSA-AES128-SHA TLSv1 Kx=ECDH Au=RSA Enc=AES(128) Mac=SHA1 # 0xC0,0x24 - ECDHE-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AES(256) Mac=SHA384 # 0xC0,0x28 - ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AES(256) Mac=SHA384 # 0xC0,0x0A - ECDHE-ECDSA-AES256-SHA TLSv1 Kx=ECDH Au=ECDSA Enc=AES(256) Mac=SHA1 # 0xC0,0x14 - ECDHE-RSA-AES256-SHA TLSv1 Kx=ECDH Au=RSA Enc=AES(256) Mac=SHA1 # 0x00,0x67 - DHE-RSA-AES128-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=AES(128) Mac=SHA256 # 0x00,0x6B - DHE-RSA-AES256-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=AES(256) Mac=SHA256 # 0x00,0x9C - AES128-GCM-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=AESGCM(128) Mac=AEAD # 0x00,0x9D - AES256-GCM-SHA384 TLSv1.2 Kx=RSA Au=RSA Enc=AESGCM(256) Mac=AEAD # 0x00,0x3C - AES128-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=AES(128) Mac=SHA256 # 0x00,0x3D - AES256-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=AES(256) #Cipher preference: client chooses # 0x13,0x01 - TLS_AES_128_GCM_SHA256 TLSv1.3 Kx=any Au=any Enc=AESGCM(128) Mac=AEAD # 0x13,0x02 - TLS_AES_256_GCM_SHA384 TLSv1.3 Kx=any Au=any Enc=AESGCM(256) Mac=AEAD # 0x13,0x03 - TLS_CHACHA20_POLY1305_SHA256 TLSv1.3 Kx=any Au=any Enc=CHACHA20/POLY1305(256) Mac=AEAD # 0xC0,0x2B - ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(128) Mac=AEAD # 0xC0,0x2F - ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(128) Mac=AEAD # 0xC0,0x2C - ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(256) Mac=AEAD # 0xC0,0x30 - ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(256) Mac=AEAD # 0xCC,0xA9 - ECDHE-ECDSA-CHACHA20-POLY1305 TLSv1.2 Kx=ECDH Au=ECDSA Enc=CHACHA20/POLY1305(256) Mac=AEAD # 0xCC,0xA8 - ECDHE-RSA-CHACHA20-POLY1305 TLSv1.2 Kx=ECDH Au=RSA Enc=CHACHA20/POLY1305(256) Mac=AEAD # 0x00,0x9E - DHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=AESGCM(128) Mac=AEAD # 0x00,0x9F - DHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=DH Au=RSA Enc=AESGCM(256) Mac=AEAD 49195: 'CipherSuite: ECDHE-ECDSA-AES128-GCM-SHA256 (0xc02B)', 49199: 'CipherSuite: ECDHE-RSA-AES128-GCM-SHA256 (0xc02f)', 49196: 'CipherSuite: ECDHE-ECDSA-AES256-GCM-SHA384 (0xc02c)', 49200: 'CipherSuite: ECDHE-RSA-AES256-GCM-SHA384 (0xc030)', 52393: 'CipherSuite: ECDHE-ECDSA-CHACHA20-POLY1305 (0xccA9)', 52392: 'CipherSuite: ECDHE-RSA-CHACHA20-POLY1305 (0xcca8)', 158: 'CipherSuite: DHE-RSA-AES128-GCM-SHA256 (0x009e)', 159: 'CipherSuite: DHE-RSA-AES256-GCM-SHA384 (0x009f)', 52394: 'CipherSuite: DHE-RSA-CHACHA20-POLY1305 (0xccaa)', 49187: 'CipherSuite: ECDHE-ECDSA-AES128-SHA256 (0xc023)', 49191: 'CipherSuite: ECDHE-RSA-AES128-SHA256 (0xc027)', 49161: 'CipherSuite: ECDHE-ECDSA-AES128-SHA (0xc009)', 49188: 'CipherSuite: ECDHE-ECDSA-AES256-SHA384 (0xc024)', 49171: 'CipherSuite: ECDHE-RSA-AES128-SHA (0xc013)', 49192: 'CipherSuite: ECDHE-RSA-AES256-SHA384 (0xc028)', 49162: 'CipherSuite: ECDHE-ECDSA-AES256-SHA (0xc00a)', 49172: 'CipherSuite: ECDHE-RSA-AES256-SHA (0xc014)', 156: 'CipherSuite: AES128-GCM-SHA256 (0x009c)', 157: 'CipherSuite: AES256-GCM-SHA384 (0x009d)', # https://tools.ietf.org/html/draft-davidben-tls-grease-00 #GREASE Values # This document reserves a number of TLS protocol values, referred to # as GREASE values. These values were allocated sparsely to discourage # server implementations from conditioning on them. For convenience, # they were also chosen so all types share a number scheme with a # consistent pattern while avoiding collisions with any existing # applicable registries in TLS. #The following values are reserved as both GREASE extension values and #GREASE named group values: # 2570 (0x0A0A) # 6682 (0x1A1A) # 10794 (0x2A2A) # 14906 (0x3A3A) # 19018 (0x4A4A) # 23130 (0x5A5A) # 27242 (0x6A6A) # 31354 (0x7A7A) # 35466 (0x8A8A) # 39578 (0x9A9A) # 43690 (0xAAAA) # 47802 (0xBABA) # 51914 (0xCACA) # 56026 (0xDADA) # 60138 (0xEAEA) # 64250 (0xFAFA) 23130: 'CipherSuite: Reserved (GREASE) (0x5a5a)', 2570: 'CipherSuite: Reserved (GREASE) (0x0a0a)', 6682: 'CipherSuite: Reserved (GREASE) (0x1a1a)', 10794: 'CipherSuite: Reserved (GREASE) (0x2a2a)', 14906: 'CipherSuite: Reserved (GREASE) (0x3a3a)', 19018: 'CipherSuite: Reserved (GREASE) (0x4a4a)', 23130: 'CipherSuite: Reserved (GREASE) (0x5a5a)', 27242: 'CipherSuite: Reserved (GREASE) (0x6a6a)', 31354: 'CipherSuite: Reserved (GREASE) (0x7a7a)', 35466: 'CipherSuite: Reserved (GREASE) (0x8a8a)', 39578: 'CipherSuite: Reserved (GREASE) (0x9a9a)', 43690: 'CipherSuite: Reserved (GREASE) (0xaaaa)', 47802: 'CipherSuite: Reserved (GREASE) (0xbaba)', 51914: 'CipherSuite: Reserved (GREASE) (0xcaca)', 56026: 'CipherSuite: Reserved (GREASE) (0xdada)', 60138: 'CipherSuite: Reserved (GREASE) (0xeaea)', 64250: 'CipherSuite: Reserved (GREASE) (0xfafa)'} def ethernet_frame(raw_dados): mac_destino, mac_fonte, protocolo = struct.unpack('! 6s 6s H', raw_dados[:14]) return byte_to_hex_mac(mac_destino), byte_to_hex_mac(mac_fonte), htons(protocolo), raw_dados[14:] def byte_to_hex_mac(mac_em_bytes): endereco = binascii.hexlify(mac_em_bytes).decode("ascii") return ":".join([endereco[i:i+2] for i in range(0,12,2)]) def dados_pacote_ipv4(payload_frame): tupla_dados_ipv4 = struct.unpack("!BBHHHBBH4s4s", payload_frame[:20]) versao_e_HLEN = tupla_dados_ipv4[0] tamanho_header = (versao_e_HLEN & 15) * 4 versao = versao_e_HLEN >> 4 tipo_servico = tupla_dados_ipv4[1] tamanho_total = tupla_dados_ipv4[2] identificacao = tupla_dados_ipv4[3] offset_fragmento = tupla_dados_ipv4[4] tempo_vida_ttl = tupla_dados_ipv4[5] protocolos = tupla_dados_ipv4[6] checksum_cabecalho = tupla_dados_ipv4[7] ip_origem = inet_ntoa(tupla_dados_ipv4[8]) ip_destino = inet_ntoa(tupla_dados_ipv4[9]) dados_ipv4_header = {'IPv4 Orivgem':ip_origem, 'IPv4 Destino':ip_destino, 'Protocolo': protocolos, 'Payload_ipv4': payload_frame[20:]} return dados_ipv4_header def dados_pacote_tcp(payload_ipv4): tupla_dados_tcp = struct.unpack('! HHLLBBHHH', payload_ipv4[:20]) porta_fonte = tupla_dados_tcp[0] porta_destino = tupla_dados_tcp[1] numero_sequencia = tupla_dados_tcp[2] numero_confirmacao = tupla_dados_tcp[3] # recebe dois campos do cabeçalho ( HLEN & RESERVADO ) hlen_e_reservado = tupla_dados_tcp[4] # recebe campo HLEN header_len = (hlen_e_reservado >> 4) * 4 flags = tupla_dados_tcp[5] flag_FIN = flags & 1 flag_SYN = (flags >> 1) & 1 flag_RST = (flags >> 2) & 1 flag_PSH = (flags >> 3) & 1 flag_ACK = (flags >> 4) & 1 flag_URG = (flags >> 5) & 1 flag_ECE = (flags >> 6) & 1 flag_CWR = (flags >> 7) & 1 window_size = tupla_dados_tcp[6] checksum = tupla_dados_tcp[7] urgent_pointer = tupla_dados_tcp[8] dados_tcp_header = {'Porta_Fonte':porta_fonte, 'Porta_Destino':porta_destino, 'checksum':checksum,'Payload_TCP': payload_ipv4[20:]} return dados_tcp_header def formato_tls_record(dados_tcp_payload): """ http://blog.fourthbit.com/2014/12/23/traffic-analysis-of-an-ssl-slash-tls-session """ TLS_RECORD_TYPE, TLS_VERSION, TLS_LENGTH, TESTE_HANDSHAKE_TYPE = struct.unpack('!BHHB', dados_tcp_payload[:6]) return TLS_RECORD_TYPE, TLS_VERSION, TLS_LENGTH, TESTE_HANDSHAKE_TYPE def formato_tls_hello_client(dados_tcp_payload): """ int.from_bytes(LENGTH_OBJ_BYTES, byteorder='big'), faz type casting ( conversão do tipo de dados), byte object para decimal, é necessário usar este método uma vez que o tamanho do campo Length são 3 bytes e o unpack não consegue desempacotar esse tamanho. Ver documentação: https://docs.python.org/3/library/stdtypes.htmler """ lista_cipher_suites = [] HandshakeType = dados_tcp_payload[5:] HANDSHAKE_TYPE, = struct.unpack("!B", HandshakeType[:1]) LENGTH_OBJ_BYTES = HandshakeType[1:4] LENGHT_DECIMAL = int.from_bytes(LENGTH_OBJ_BYTES, byteorder='big') VERSION, = struct.unpack('!H', HandshakeType[4:6]) RANDOM_32BITS = HandshakeType[6:38] HEX_RANDOM_32BITS = binascii.hexlify(RANDOM_32BITS).decode() SESSION_ID_LENGTH, = struct.unpack("!B",HandshakeType[38:39]) SESSION_ID = HandshakeType[39: 39 + SESSION_ID_LENGTH] HEX_SESSION_ID = binascii.hexlify(SESSION_ID).decode() CIPHER_SUITES_LENGTH, = struct.unpack("!H", HandshakeType[39 + SESSION_ID_LENGTH : 39 + SESSION_ID_LENGTH + 2]) ARRAY_OBJETO_BYTES_CIPHER_SUITES = HandshakeType[39 + SESSION_ID_LENGTH + 2 : 39 + SESSION_ID_LENGTH + 2 + CIPHER_SUITES_LENGTH] index = 2 while len(ARRAY_OBJETO_BYTES_CIPHER_SUITES) != 0: cipher_suite, = struct.unpack('!H', ARRAY_OBJETO_BYTES_CIPHER_SUITES[:index]) lista_cipher_suites.append(cipher_suite) ARRAY_OBJETO_BYTES_CIPHER_SUITES = ARRAY_OBJETO_BYTES_CIPHER_SUITES[index:] return HANDSHAKE_TYPE, LENGHT_DECIMAL, VERSION, HEX_RANDOM_32BITS, SESSION_ID_LENGTH, HEX_SESSION_ID, + \ CIPHER_SUITES_LENGTH, ARRAY_OBJETO_BYTES_CIPHER_SUITES, lista_cipher_suites def formato_tls_hello_server(dados_tcp_payload): """ int.from_bytes(LENGTH_OBJ_BYTES, byteorder='big'), faz type casting ( conversão do tipo de dados), byte object para decimal, é necessário usar este método uma vez que o tamanho do campo Length são 3 bytes e o unpack não consegue desempacotar esse tamanho. Ver documentação: https://docs.python.org/3/library/stdtypes.htmler """ HandshakeType = dados_tcp_payload[5:] HANDSHAKE_TYPE, = struct.unpack("!B", HandshakeType[:1]) LENGTH_OBJ_BYTES = HandshakeType[1:4] LENGHT_DECIMAL = int.from_bytes(LENGTH_OBJ_BYTES, byteorder='big') VERSION, = struct.unpack('!H', HandshakeType[4:6]) RANDOM_32BITS = HandshakeType[6:38] HEX_RANDOM_32BITS = binascii.hexlify(RANDOM_32BITS).decode() SESSION_ID_LENGTH, = struct.unpack("!B",HandshakeType[38:39]) if SESSION_ID_LENGTH > 0: SESSION_ID = HandshakeType[39: 39 + SESSION_ID_LENGTH] HEX_SESSION_ID = binascii.hexlify(SESSION_ID).decode() # Cipher suites só contém apenas uma ( analisar 2 bytes) #OBJETO_BYTES_CIPHER_SUITES = HandshakeType[39 + SESSION_ID_LENGTH : 39 + SESSION_ID_LENGTH + 2] CIPHER_SUITE, = struct.unpack('!H', HandshakeType[39 + SESSION_ID_LENGTH : 39 + SESSION_ID_LENGTH + 2]) return HANDSHAKE_TYPE, LENGHT_DECIMAL, VERSION, HEX_RANDOM_32BITS, SESSION_ID_LENGTH, HEX_SESSION_ID, CIPHER_SUITE else: pass def formato_application_data(dados_tcp_payload): TYPE, VERSION, LENGTH = struct.unpack('!BHH', dados_tcp_payload[:5]) BYTES_OBJ_ENCRYPTED_APPLICATION_DATA = dados_tcp_payload [5: 5 + LENGTH] HEX_ENCRYPTED_APPLICATION_DATA = binascii.hexlify(BYTES_OBJ_ENCRYPTED_APPLICATION_DATA) return TYPE, VERSION, LENGTH, HEX_ENCRYPTED_APPLICATION_DATA sock = socket(AF_PACKET, SOCK_RAW, ntohs(0x0003)) while True: raw_dados, addr = sock.recvfrom(65536) mac_destino, mac_fonte, ethernet_type, payload = ethernet_frame(raw_dados) # Se for 8 vem ai pacote IP \0/ if ethernet_type == 8: dados_ipv4_header = dados_pacote_ipv4(payload) if dados_ipv4_header['Protocolo'] == 6: dados_tcp_header = dados_pacote_tcp(dados_ipv4_header['Payload_ipv4']) if dados_tcp_header['Porta_Fonte'] == 443 or dados_tcp_header['Porta_Destino'] == 443: if dados_tcp_header['Payload_TCP']: tls_record_type, tls_version, tls_length, teste_handshake_type = formato_tls_record(dados_tcp_header['Payload_TCP']) if tls_record_type in TIPO_RECORD.keys() and tls_version in TLS_VERSAO.keys(): if tls_record_type == 22: print("##### TCP PAYLOAD (TLS) #####\n") print("TCP Checksum: {}".format(dados_tcp_header['checksum'])) print("TIPO: {}".format(TIPO_RECORD[tls_record_type])) print("VERSÃO: {}".format(TLS_VERSAO[tls_version])) print("LENGTH: {}".format(tls_length)) if teste_handshake_type == 1: (HShake_type, HShake_length, HShake_version, HShake_random_32bit, HShake_session_id_length, HShake_session_id, HShake_cipher_suites_length, HShake_array_ob_bytes_cipher_suites, HShake_lista_cipher_suites) = formato_tls_hello_client(dados_tcp_header['Payload_TCP']) print("#####(TLS) HANDSHAKE PROTOCOL #####") print("TIPO: {}".format(TIPO_HANDSHAKE[HShake_type])) print("LENGTH: {}".format(HShake_length)) print("VERSÃO: {}".format(TLS_VERSAO[HShake_version])) print("32-bit Random: {}".format((HShake_random_32bit))) print("Session id length: {}".format(HShake_session_id_length)) print("session id: {}".format(HShake_session_id)) print("Cipher suites length: {}".format(HShake_cipher_suites_length)) print("Cipher Suites({})".format(len(HShake_lista_cipher_suites))) for C_Suite in HShake_lista_cipher_suites: if C_Suite in TIPO_CIPHER_SUITE.keys(): print(TIPO_CIPHER_SUITE[C_Suite]) else: print(C_Suite) elif teste_handshake_type == 2: (HShake_type, HShake_length, HShake_version, HShake_random_32bit, HShake_session_id_length, HShake_session_id, HShake_cipher_suite) = formato_tls_hello_server(dados_tcp_header['Payload_TCP']) print("#####(TLS) HANDSHAKE PROTOCOL #####") print("TIPO: {}".format(TIPO_HANDSHAKE[HShake_type])) print("LENGTH: {}".format(HShake_length)) print("VERSÃO: {}".format(TLS_VERSAO[HShake_version])) print("32-bit Random: {}".format((HShake_random_32bit))) print("Session id length: {}".format(HShake_session_id_length)) print("session id: {}".format(HShake_session_id)) print("{}".format(TIPO_CIPHER_SUITE[HShake_cipher_suite])) elif tls_record_type == 23: print("#### APPLICATION DATA ####") (application_data_type, application_data_version, application_data_length, hex_application_data_encripted)=formato_application_data(dados_tcp_header['Payload_TCP']) print("Type: {}".format(application_data_type)) print("Version: {}".format(TLS_VERSAO[application_data_version])) print("Length: {}".format(application_data_length)) print("Encrypted Application Data: {}".format(hex_application_data_encripted))
  25. O malware que afeta Android, Anubis, foi identificado novamente em janeiro deste ano em dois servidores, contendo cerca de 17,5 mil amostras. De acordo com a Trend Micro, o malware fez parte do cenário de ameaças móveis de 2018, em que trojans bancários diversificaram suas táticas e técnicas para evitar sua detecção e ganhar dinheiro com ataques. O Anubis passou por várias mudanças desde sua primeira aparição, sendo usado para ciberespionagem e como um malware bancário, combinando roubo de informação e ataques de ransomware. A empresa de segurança identificou a nova versão do malware em meados de janeiro de 2019, utilizando uma infinidade de técnicas, incluindo o uso de sensores baseados em movimento para evitar análises de sandbox e sobreposições de telas para roubar informações pessoais. Entre os recursos de roubo de informações do Anubis está a captura de tela do dispositivo infectado; controle remoto do dispositivo via VNC; gravação de áudio; envio, recebimento e exclusão de SMS; ativação ou configuração de administração de dispositivos; obtenção das tarefas em execução do dispositivo; roubo da lista de contatos; execução de uma URL especificada; desligamento do Google Play Protect e bloqueio da tela do dispositivo. Os atacantes também podem criptografar arquivos, incluindo aqueles armazenados no cartão SD, encontrar ou localizar arquivos, obter a localização do dispositivo e recuperar comandos de controle remoto de mídias sociais. O Anubis também tem uma lista de aplicativos dos quais ele rouba dados pessoais e financeiros, sendo que o alvo do malware são 188 aplicativos relacionados a bancos e finanças, a maioria na Polônia, Austrália, Turquia, Alemanha, França, Itália, Espanha, EUA e Índia. Mesmo que o Brasil não esteja na lista, é recomendável verificar a segurança de qualquer aplicativo que for baixado no seu dispositivo móvel. 😉
  26. Recentemente postei uma pegadinha no Discord: $ cd ~/Temp # Diretório vazio! $ echo TESTE | tr [:upper:] [:lower:] teste As sequências [:upper:] e [:lower:] não são regular expressions, mas atalhos derivados das funções em ctype.h, do C (embora essas "classes" de caracteres existam, também, no padrão estendido POSIX de regexes). Note que a tradução (tr) faz exatamente o que mandamos fazer: Converte caracteres maiúsculos (uppercase) para minúsculos (lowercase). Mas veja isso: $ touch l # cria arquivo 'l', vazio. $ echo TESTE | tr [:upper:] [:lower:] lllll Um amigo topou com isso e eu testei, achando que era algum bug na distro dele... Ué? Mas não é que o troço acontece mesmo? Por quê? O que acontece aqui é que os colchetes '[' e ']' são também usados pelo shell para especificar caracteres, num nome de arquivo. Por exemplo. Se você quiser listar todos os arquivos que comecem com a letra 'L' (maiúsculo e minúsculo), pode fazer algo assim: $ ls [Ll]* Esse '[Ll]*' é expandido pelo shell para todos os nomes de arquivos/diretórios que ele encontrar que atendam ao critério. Assim, [:lower:], sem as aspas, segue o mesmo princípio... Se existirem arquivos de 1 único caracter, cujo nome seja ':', 'l', 'o', 'w', 'e' ou 'r', o shell vai expandir o argumento para todos os arquivos que encontrar. É como se o comando, no exemplo acima, fosse: $ echo TESTE | tr [:upper:] l Se criarmos um arquivo 'r', teremos: $ touch r $ echo TESTE | tr r l r E você obtererá um erro no uso de 'tr' (porque tem um argumento extra que não deveria estar lá). Se apagar o 'l': $ rm l $ echo TESTE | tr [:upper:] [:lower:] # o mesmo que 'tr r r' TESTE O que faltou para evitar essas expansões é colocar os argumentos entre aspas: $ echo TESTE | tr '[:upper:]' '[:lower:]' # Não apaguei 'r'! :) teste Com relação à expansão pelo shell, você pode fazer um teste simples: /* test.c */ #include <stdio.h> int main( int argc, char *argv[] ) { while ( *++argv ) printf( "Arg: \"%s\"\n", *argv ); } Compilando e executando: $ cc -o test test.c $ touch l o w e r # cria os arquivos 'l', 'o', 'w', 'e' e 'r'. $ ./test [:lower:] Arg: "e" Arg: "l" Arg: "o" Arg: "r" Arg: "w" $ ./test '[:lower:]' Arg: "[:lower:]" []s Fred
  27. import struct buf = '' buf += 'A' * 88 #junk buf += struct.pack('<Q', 0x0000000000400583) #gadget buf += struct.pack('<Q', 0x7ffff7b97e9a) #bin_sh buf += struct.pack('<Q', 0x7ffff7a33440) #system print buf Exploit usado
  28. Eu tô aqui porque não consegui fazer bypass do NX na arquitetura de 64 bits. Como é mostrado na imagem eu consegui colocar os gadgets , /bin/sh e o endereço da system nas stack, mas o programa fica retornando Segmentation Fault e fica parado na instrução que é mostrada na imagem seguinte. O eu posso fazer? Obs: Eu desabilitei o ASLR e todas as proteções do binário e também consegui fazer o bypass do NX em arquitetura de 32 bits
  1. Load more activity
×
×
  • Create New...