Pergunta

Tento implementar o hadnshake de 3 vias com um soquete bruto em Python e usando Scapy.

O código é:

s=socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.IPPROTO_TCP)
ss=StreamSocket(s)
iph=IPheader()
syn = TCP(sport=TCP_SOURCE_PORT,dport=TCP_DESTINATION_PORT, flags="S")
synack = ss.sr1(iph/syn)
myack = iph/TCP(dport=synack[TCP].sport, sport=synack[TCP].dport, seq=synack[TCP].ack, ack=synack[TCP].seq+1, flags="A")
ss.send(myack)

O método IPheader() retorna um cabeçalho IP scapy.

Ao executar o script, recebo este erro:

ERROR: --- Error in child 3057
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/scapy/sendrecv.py", line 89, in sndrcv
pks.send(p)
File "/usr/lib/python2.7/dist-packages/scapy/supersocket.py", line 34, in send
return self.outs.send(sx)
error: [Errno 6] No such device or address
Foi útil?

Solução

Vejo alguns possíveis problemas com seu código:

  • antes de invocar StreamSocket() você precisa estabelecer uma conexão com um soquete normal.Então você precisa fazer uma conexão, algo como s.connect(("10.1.1.1",9000)) antes da linha ss=StreamSocket(s).Mais informações podem ser encontradas aqui

  • Talvez seja necessário corrigir o tipo de soquete da base.Eu sugeriria algo como s=socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP).Para mais informações verifique esse

Outras dicas

O dispositivo não está respondendo ao seu pacote SYN porque um soquete RAW não faz isso.Você tem que enviar o SYN-ACK manualmente.Além disso, Wireshark e TCP mostram números de sequência como RELATIVOS.Para mostrar o número REAL você deve desativar esta opção.Terceiro, você pode definir o número de sequência manualmente ou randomizá-lo usando

TCP(sport = port1, dport = port2, flags="A", seq = random.getrandbits(32), ack = MY_ACK)

ou

TCP(sport = port1, dport = port2, flags="A", seq = 01395, ack = MY_ACK)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top