KhaosBringer icon

Python UDP Reflector receiver for amps.py

KhaosBringer | PRO | 11/26/18 06:22:18 PM UTC | 0 ⭐ | 1720 👁️ | Never ⏰ | []
Python |

4.61 KB

|

None

|

0 👍

/

0 👎

#Features
# Fast catch-save reflectors. (Less than 0.05s).
# Chargen, NTP, SSDP, SNMP, DNS, LDAP, MEMCACHED, TFTP, PortMap supported.
# Anti-Duplication feature.
# Filter bytes of each packet.
# Custom output syntax support.
# Lightweight.
#Installation
#wget -O xstealer.py https://github.com/Alemalakra/xStealer/raw/master/xstealer.py && chmod 777 xstealer.py
#
#Usage
#[!] xStealer 1.0 by Alemalakra.
#[!] Usage: python xstealer.py <OUTPUT> <PROTOCOL> <MIN BYTES> <OUTPUT SYNTAX>
#[!] Protocols: ldap, ntp, memcached, tftp, portmap, snmp, dns, ssdp, chargen
#[!] Output syntax variables: [space], [ip], [bytes]
#Sample Usage
#python xstealer.py ntp.txt ntp 400 [ip][space][bytes]
 
#Requeriments
# Python 2.*
# Root access.
 
 
#!usr/bin/python
# -*- coding: utf-8 -*-
 
# xStealer 1.0 by Alemalakra - Python UDP Reflector receiver for amplification lists.
#
# @author Alemalakra
# @version 1.0
 
import socket, sys
from struct import *
 
if len(sys.argv) < 2:
        print '[!] xStealer 1.0 by Alemalakra.'
        print '[!] Usage: python xstealer.py <OUTPUT> <PROTOCOL> <MIN BYTES> <OUTPUT SYNTAX>'
        print '[!] Protocols: ldap, ntp, memcached, tftp, portmap, snmp, dns, ssdp, chargen'
        print '[!] Output syntax variables: [space], [ip], [bytes]'
        sys.exit()
 
# Starting stealer.
 
print '[!] Listening at: ANY PORT UDP.'
print '[!] Reciving protocol: ' + sys.argv[2].upper()
print '[!} For exit please use CTRL + C.'
 
# Arguments set by user.
 
output_file = sys.argv[1] # Output
proto = sys.argv[2] # Protocol.
min_reply = sys.argv[3] # Min bytes reply.
syntax = sys.argv[4] # Synax out reflector.
newfile = open(output_file, 'w')
 
if proto == 'ldap':
    sourceport_check = 389
elif proto == 'ntp':
    sourceport_check = 123
elif proto == 'memcached':
    sourceport_check = 11211
elif proto == 'tftp':
    sourceport_check = 69
elif proto == 'portmap':
    sourceport_check = 111
elif proto == 'snmp':
    sourceport_check = 161
elif proto == 'dns':
    sourceport_check = 53
elif proto == 'ssdp':
    sourceport_check = 1900
elif proto == 'chargen':
    sourceport_check = 19
else:
        print '[!] Protocol is not available'
        sys.exit()
 
def eth_addr (a) : # Decode MAC Ethernet Adress.
    b = "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x" % (ord(a[0]) , ord(a[1]) , ord(a[2]), ord(a[3]), ord(a[4]) , ord(a[5]))
    return b
 
try:
        s = socket.socket( socket.AF_PACKET , socket.SOCK_RAW , socket.ntohs(0x0003))
except socket.error , msg:
        print '[!] Error creating Socket, Youre a root user?'
        sys.exit()
 
servers = []
servers_pps = {}
completed_servers = 0
while True:
    packet = s.recvfrom(65565) # Recive all packets, Including TCP/UDP/ICMP.
    packet = packet[0]
    eth_length = 14  
    eth_header = packet[:eth_length]
    eth = unpack('!6s6sH' , eth_header)
    eth_protocol = socket.ntohs(eth[2])
    if eth_protocol == 8: # IPv4 Packet.
        ip_header = packet[eth_length:20+eth_length]
        iph = unpack('!BBHHHBBH4s4s' , ip_header)
        version_ihl = iph[0]
        version = version_ihl >> 4
        ihl = version_ihl & 0xF
        iph_length = ihl * 4
        ttl = iph[5]
        protocol = iph[6]
        s_addr = socket.inet_ntoa(iph[8]);
        d_addr = socket.inet_ntoa(iph[9]);
        if protocol == 17: # UDP.
            syntax_output = ""
            u = iph_length + eth_length
            udph_length = 8
            udp_header = packet[u:u+8]
            udph = unpack('!HHHH' , udp_header) # Unpack UDP header, For get information like Source Port.
            source_port = udph[0] # Important thing.
            h_size = eth_length + iph_length + udph_length # Header size.
            data_size = len(packet) - h_size
            checksum = udph[3]
            if source_port == sourceport_check:
                if int(data_size) >= int(min_reply):
                    if any(s_addr in s for s in servers): 
                        # Already writed to Output.
                        # Add to Packets count by Reflector.
                        new_count = servers_pps[s_addr] + 1 
                        servers_pps.update({s_addr : new_count})
                        # TEMPORALLY BETA, Filter PPS for Each Reflector, Maybe future version.
                        #print '[!] Recived Packet-From-Reflector: ' + s_addr + ' - Recived Bytes: ' + str(data_size) + ' - PPS/This reflector: ' + str(new_count)
                    else:
                        completed_servers += 1
                        print '[!] Recived working server: ' + s_addr + ' - Recived Bytes: ' + str(data_size) + ' - Servers found: ' + str(completed_servers)
                        syntax_output = syntax.replace("[space]", " ", 5) # 5 is fine.
                        syntax_output = syntax_output.replace("[bytes]", str(data_size), 5) # 5 is fine.
                        syntax_output = syntax_output.replace("[ip]", str(s_addr), 5) # 5 is fine.
                        newfile.write(str(syntax_output)+'\n')
                        servers.append(s_addr)
                        servers_pps.update({s_addr : 1})
 
# Infinite loop, until guy press CTRL + C, xStealer by Alemalakra :)

Comments