diff --git a/src/logic/global_handlers.py b/src/logic/global_handlers.py index dc824f8..4290721 100644 --- a/src/logic/global_handlers.py +++ b/src/logic/global_handlers.py @@ -1,3 +1,5 @@ +import ipaddress + from flask_definitions import * import time import uuid @@ -6,19 +8,104 @@ import os import json +def check_bogon_ip(ip_addr): + bogon_ranges = [ + "0.0.0.0/8", + "10.0.0.0/8", + "100.64.0.0/10", + "127.0.0.0/8", + "127.0.53.53", + "169.254.0.0/16", + "172.16.0.0/12", + "192.0.0.0/24", + "192.0.2.0/24", + "192.168.0.0/16", + "198.18.0.0/15", + "198.51.100.0/24", + "203.0.113.0/24", + "224.0.0.0/4", + "240.0.0.0/4", + "255.255.255.255/32", + "::/128", + "::1/128", + "::ffff:0:0/96", + "::/96", + "100::/64", + "2001:10::/28", + "2001:db8::/32", + "fc00::/7", + "fe80::/10", + "fec0::/10", + "ff00::/8", + "2002::/24", + "2002:a00::/24", + "2002:7f00::/24", + "2002:a9fe::/32", + "2002:ac10::/28", + "2002:c000::/40", + "2002:c000:200::/40", + "2002:c0a8::/32", + "2002:c612::/31", + "2002:c633:6400::/40", + "2002:cb00:7100::/40", + "2002:e000::/20", + "2002:f000::/20", + "2002:ffff:ffff::/48", + "2001::/40", + "2001:0:a00::/40", + "2001:0:7f00::/40", + "2001:0:a9fe::/48", + "2001:0:ac10::/44", + "2001:0:c000::/56", + "2001:0:c000:200::/56", + "2001:0:c0a8::/48", + "2001:0:c612::/47", + "2001:0:c633:6400::/56", + "2001:0:cb00:7100::/56", + "2001:0:e000::/36", + "2001:0:f000::/36", + "2001:0:ffff:ffff::/64" + ] + for bogon_range in bogon_ranges: + ip_addr_obj = ipaddress.ip_address(ip_addr) + network = ipaddress.ip_network(bogon_range) + if ip_addr_obj in network: + return True + return False + + def _get_remote_ip(check_type="strict"): if check_type == "strict": - if request.environ.get('HTTP_X_FORWARDED_FOR') is None: - ip_addr = request.environ['REMOTE_ADDR'] - if ip_addr == "127.0.0.1": + if request.environ.get('HTTP_CF_CONNECTING_IP'): + ip_addr = request.environ['HTTP_CF_CONNECTING_IP'] + if ip_addr == "192.168.1.111" or ip_addr == "192.168.1.130": return None logger.graylog_logger(level="info", handler="ip_handler", message=f"New Connection from: {ip_addr}") + bogon_check = check_bogon_ip(ip_addr) + if bogon_check: + logger.graylog_logger(level="info", handler="ip_handler", message=f"BOGON IP DETECTED: {ip_addr}") + abort(403) return ip_addr - else: + elif request.environ.get('HTTP_X_FORWARDED_FOR'): ip_addr = request.environ['HTTP_X_FORWARDED_FOR'] if ip_addr == "127.0.0.1": return None else: + bogon_check = check_bogon_ip(ip_addr) + if bogon_check: + logger.graylog_logger(level="info", handler="ip_handler", message=f"BOGON IP DETECTED: {ip_addr}") + abort(403) + logger.graylog_logger(level="info", handler="ip_handler", message=f"New Connection from: {ip_addr}") + return ip_addr + else: + ip_addr = request.remote_addr + if ip_addr == "127.0.0.1": + return None + else: + bogon_check = check_bogon_ip(ip_addr) + if bogon_check: + logger.graylog_logger(level="info", handler="ip_handler", message=f"BOGON IP DETECTED: {ip_addr}") + abort(403) logger.graylog_logger(level="info", handler="ip_handler", message=f"New Connection from: {ip_addr}") return ip_addr else: @@ -34,6 +121,8 @@ def check_for_game_client(check_type="strict"): # _get_remote_ip("strict") elif user_agent.startswith("CrashReportClient/++UE4+Release-4.21"): _get_remote_ip("strict") + elif user_agent.startswith("TheExit/++UE4+Release-4.20-CL-0"): + _get_remote_ip("strict") elif user_agent.startswith("CrashReportClient/++UE4+Release-4.20-CL-0"): _get_remote_ip("strict") elif user_agent.startswith("CrashReportClient, engine=UE4"): @@ -87,18 +176,23 @@ class Session_Manager: self.clean_sessions() if session_id not in self.sessions: if session_id: - return None - else: logger.graylog_logger(level="info", handler="session_manager", message=f"Session ID: {session_id} not found.") - return None + abort(401) + else: + abort(401) self.extend_session(session_id) self.save_sessions() return self.sessions[session_id]["user"] def extend_session(self, session_id): - self.sessions[session_id]["expires"] = time.time() + 3600 - self.save_sessions() + try: + self.sessions[session_id]["expires"] = time.time() + 3600 + self.save_sessions() + except KeyError: + logger.graylog_logger(level="info", handler="session_manager", + message=f"Session ID: {session_id} not found.") + abort(403) def clean_sessions(self): current_time = time.time()