Veröffentlicht am: 18.07.2023 | Letztes Update am: 18.07.23 | Lesezeit: 2 Minute/n
Hacker / Angreifer nutzen Portscans, um festzustellen, welche Ports auf einem Server oder Computer offen / freigeschaltet sind. Dadurch werden passende “Fenster” für einen Angriff ausgewählt. Häufig genutzt werden dazu leere UDP Pakete oder TCP-SYN Pakete. Wir haben C# Code vorbereitet, welcher den Ansatz verfolgt, diese Vorgehensweisen zu bemerken. Anschließend zu zählen und je nach Config die IP-Adresse des möglichen Angreifers zu blockieren.
/* * Name: HNP Simple Port Scan Firewall * Description: Detect port scans and automatically block attackers. * Author: Homepage-nach-Preis * Version: 1.0 * Author URI: https://homepage-nach-preis.de/ * License: Creative Commons Non-Commercial - CC-NC 4.0 */ using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Diagnostics; class Hnp_PortScanner { static void Main() { List<int> hnp_targetPorts = new List<int> { 12345, 80, 443 }; // List of target ports or port range to monitor int hnp_emptyPacketThreshold = 5; // Number of empty packets before the IP address is blocked int hnp_synPacketThreshold = 10; // Number of SYN packets before the IP address is blocked Dictionary<IPAddress, int> hnp_emptyPackets = new Dictionary<IPAddress, int>(); Dictionary<IPAddress, int> hnp_synPackets = new Dictionary<IPAddress, int>(); using (UdpClient hnp_udpClient = new UdpClient()) using (TcpListener hnp_tcpListener = new TcpListener(IPAddress.Any, hnp_targetPorts[0])) { hnp_tcpListener.Start(); Console.WriteLine("Port Scanner is listening..."); while (true) { try { // Monitoring UDP packets IPEndPoint hnp_udpSenderEndPoint = new IPEndPoint(IPAddress.Any, 0); byte[] hnp_udpReceivedBytes = hnp_udpClient.Receive(ref hnp_udpSenderEndPoint); if (hnp_targetPorts.Contains(hnp_udpSenderEndPoint.Port) && hnp_udpReceivedBytes.Length == 0) { if (!hnp_emptyPackets.ContainsKey(hnp_udpSenderEndPoint.Address)) hnp_emptyPackets[hnp_udpSenderEndPoint.Address] = 0; hnp_emptyPackets[hnp_udpSenderEndPoint.Address]++; Console.WriteLine($"Empty UDP packet received from {hnp_udpSenderEndPoint.Address}:{hnp_udpSenderEndPoint.Port}. Possible port scan attempt."); if (hnp_emptyPackets[hnp_udpSenderEndPoint.Address] >= hnp_emptyPacketThreshold) { Hnp_BlockIpAddress(hnp_udpSenderEndPoint.Address); Console.WriteLine($"IP address {hnp_udpSenderEndPoint.Address} has been blocked."); hnp_emptyPackets.Remove(hnp_udpSenderEndPoint.Address); } } // Monitoring TCP-SYN packets TcpClient hnp_tcpClient = hnp_tcpListener.AcceptTcpClient(); IPEndPoint hnp_tcpSenderEndPoint = (IPEndPoint)hnp_tcpClient.Client.RemoteEndPoint; if (hnp_targetPorts.Contains(hnp_tcpSenderEndPoint.Port)) { if (!hnp_synPackets.ContainsKey(hnp_tcpSenderEndPoint.Address)) hnp_synPackets[hnp_tcpSenderEndPoint.Address] = 0; hnp_synPackets[hnp_tcpSenderEndPoint.Address]++; Console.WriteLine($"TCP-SYN packet received from {hnp_tcpSenderEndPoint.Address}:{hnp_tcpSenderEndPoint.Port}. Possible port scan attempt."); if (hnp_synPackets[hnp_tcpSenderEndPoint.Address] >= hnp_synPacketThreshold) { Hnp_BlockIpAddress(hnp_tcpSenderEndPoint.Address); Console.WriteLine($"IP address {hnp_tcpSenderEndPoint.Address} has been blocked."); hnp_synPackets.Remove(hnp_tcpSenderEndPoint.Address); } } hnp_tcpClient.Close(); } catch (Exception ex) { Console.WriteLine($"Error occurred: {ex.Message}"); } } } } static void Hnp_BlockIpAddress(IPAddress hnp_ipAddress) { string hnp_arguments = $"advfirewall firewall add rule name=\"Block IP\" dir=in interface=any action=block remoteip={hnp_ipAddress}"; Process.Start("netsh", hnp_arguments)?.WaitForExit(); } }
↩ Zurück zur Blogübersicht