diff --git a/fake_snmp_server.py b/fake_snmp_server.py new file mode 100644 index 0000000..795c7fb --- /dev/null +++ b/fake_snmp_server.py @@ -0,0 +1,102 @@ +import socket +import struct +import threading + +# Configuration +SNMP_PORT = 161 +PRINTER_NAME = "HP Color LaserJet Pro MFP M478" +FAKE_SYS_DESCRIPTION = "HP Color LaserJet Pro MFP M478 - Firmware 002_2445A" +FAKE_SYS_NAME = "HP-LaserJet-4" + +# SNMP OIDs to mimic a real printer +SNMP_OIDS = { + "1.3.6.1.2.1.1.1.0": FAKE_SYS_DESCRIPTION, # sysDescr + "1.3.6.1.2.1.1.5.0": FAKE_SYS_NAME, # sysName +} + +# Function to handle SNMP requests +def encode_snmp_response(request_data): + try: + # Extract SNMP version & community string + snmp_version = request_data[6] # SNMPv1 + community_len = request_data[7] # Length of the community string + community = request_data[8:8+community_len].decode() + + # Extract the OID (simplified) + oid_raw = request_data[-6:] + oid = ".".join(str(b) for b in oid_raw) + + if oid in SNMP_OIDS: + response_value = SNMP_OIDS[oid] + else: + response_value = "OID Not Found" + + # Build a proper SNMP Get-Response packet using ASN.1 + response_packet = struct.pack("!B", 0x30) + struct.pack("!B", len(response_value) + 20) + response_packet += struct.pack("!B", 0x02) + struct.pack("!B", 1) + struct.pack("!B", 0x00) # SNMP Version 1 + response_packet += struct.pack("!B", 0x04) + struct.pack("!B", len(community)) + community.encode() # Community String + response_packet += struct.pack("!B", 0xA2) + struct.pack("!B", len(response_value) + 10) # SNMP Get-Response + response_packet += struct.pack("!B", 0x02) + struct.pack("!B", 1) + struct.pack("!B", 0x01) # Request ID + response_packet += struct.pack("!B", 0x02) + struct.pack("!B", 1) + struct.pack("!B", 0x00) # Error status = 0 + response_packet += struct.pack("!B", 0x02) + struct.pack("!B", 1) + struct.pack("!B", 0x00) # Error index = 0 + response_packet += struct.pack("!B", 0x30) + struct.pack("!B", len(response_value) + 6) # VarBindList + response_packet += struct.pack("!B", 0x30) + struct.pack("!B", len(response_value) + 4) # VarBind + response_packet += struct.pack("!B", 0x06) + struct.pack("!B", len(oid)) + oid.encode() # OID + response_packet += struct.pack("!B", 0x04) + struct.pack("!B", len(response_value)) + response_value.encode() # Value + + return response_packet + except Exception as e: + print(f"[-] SNMP Encoding Error: {e}") + return None + +# Function to handle UDP SNMP requests +def handle_snmp_udp(sock): + while True: + try: + data, addr = sock.recvfrom(1024) # Receive SNMP request + response = encode_snmp_response(data) + + if response: + sock.sendto(response, addr) + except Exception as e: + print(f"[-] SNMP UDP Error: {e}") + +# Function to handle TCP SNMP requests +def handle_snmp_tcp(client_socket, addr): + try: + data = client_socket.recv(1024) # Read incoming SNMP request + response = encode_snmp_response(data) + if response: + client_socket.sendall(response) + except Exception as e: + print(f"[-] SNMP TCP Error: {e}") + finally: + client_socket.close() + +# Function to start the fake SNMP service +def start_fake_snmp_service(): + # Create UDP socket + udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + udp_sock.bind(("0.0.0.0", SNMP_PORT)) + + # Create TCP socket + tcp_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + tcp_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + tcp_sock.bind(("0.0.0.0", SNMP_PORT)) + tcp_sock.listen(5) + + print(f"[*] Fake SNMP printer service running on UDP & TCP port {SNMP_PORT}") + + # Start UDP handler in a thread + udp_thread = threading.Thread(target=handle_snmp_udp, args=(udp_sock,)) + udp_thread.daemon = True + udp_thread.start() + + # Handle TCP connections + while True: + client_socket, addr = tcp_sock.accept() + threading.Thread(target=handle_snmp_tcp, args=(client_socket, addr)).start() + +# Ensure script can be run standalone OR imported +if __name__ == "__main__": + start_fake_snmp_service() \ No newline at end of file diff --git a/fake_telnet_server.py b/fake_telnet_server.py new file mode 100644 index 0000000..2a63f6f --- /dev/null +++ b/fake_telnet_server.py @@ -0,0 +1,59 @@ +import socket +import threading +import time + +# Configuration +TELNET_PORT = 23 +PRINTER_NAME = "HP Color LaserJet Pro MFP M478" + +# Fake HP Printer Banner (as shown in the uploaded image) +BANNER = """\r +********************************************************************************\r +* Copyright (c) 2010-2024 Hewlett Packard Enterprise Development LP *\r +* *\r +* Without the owner's prior written consent, *\r +* no decompiling or reverse-engineering shall be allowed. *\r +********************************************************************************\r +\r +Login authentication\r +\r +Password: """ + +# Function to handle each Telnet connection +def handle_telnet_client(client_socket, address): + print(f"[+] Telnet connection from {address}") + + try: + # Send banner and prompt for password + client_socket.sendall(BANNER.encode()) + + # Read password input (won't authenticate) + password = client_socket.recv(1024).decode(errors="ignore").strip() + + # Always fail authentication + time.sleep(1) # Simulate processing delay + client_socket.sendall(b"\nLogin incorrect.\n") + time.sleep(1) + client_socket.close() + + except Exception as e: + print(f"[-] Telnet Error: {e}") + + finally: + client_socket.close() + +# Function to start the fake Telnet server +def start_fake_telnet_service(): + server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + server_socket.bind(("0.0.0.0", TELNET_PORT)) + server_socket.listen(5) + print(f"[*] Fake Telnet printer service running on port {TELNET_PORT}") + + while True: + client_socket, addr = server_socket.accept() + threading.Thread(target=handle_telnet_client, args=(client_socket, addr)).start() + +# Ensure script can be run standalone OR imported +if __name__ == "__main__": + start_fake_telnet_service() diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000..6870d2a Binary files /dev/null and b/favicon.ico differ diff --git a/main.py b/main.py new file mode 100644 index 0000000..afd1b6c --- /dev/null +++ b/main.py @@ -0,0 +1,39 @@ +import time +import threading +import signal +from fake_pjl_server import start_fake_pjl_service +from fake_lpd_server import start_fake_lpd_service +from fake_cups_server import start_fake_cups_service +from fake_http_server import start_fake_http_auth +from fake_telnet_server import start_fake_telnet_service +from fake_snmp_server import start_fake_snmp_service + +# Event to manage service shutdown +shutdown_event = threading.Event() + +# Function to clean up when stopping +def shutdown_handler(signum, frame): + print("\n[*] Shutting down all fake services...") + shutdown_event.set() # Signal all threads to exit + +# Register signal handlers for stopping the service +signal.signal(signal.SIGTERM, shutdown_handler) # Stop from systemctl stop +signal.signal(signal.SIGINT, shutdown_handler) # Stop with Ctrl+C + +# Start all fake printing services in the background +if __name__ == "__main__": + threading.Thread(target=start_fake_pjl_service, daemon=True).start() + threading.Thread(target=start_fake_lpd_service, daemon=True).start() + threading.Thread(target=start_fake_cups_service, daemon=True).start() + threading.Thread(target=start_fake_http_auth, daemon=True).start() + threading.Thread(target=start_fake_telnet_service, daemon=True).start() + threading.Thread(target=start_fake_snmp_service, daemon=True).start() + time.sleep(1) + + print("[*] Fake services are running.") + + # Keep the script alive until a termination signal is received + while not shutdown_event.is_set(): + time.sleep(1) # Wait loop to keep the main thread alive + + print("[*] Fake printer services stopped.")