我有一个'蜜罐'我正在用C#开发,它监听一系列端口(用户输入)。它是一个大型的项目/窗口服务,几乎可以在输入的任何端口上运行,并且不会侦听当前已经收听的端口。问题是当我使用telnet或netcat测试服务时,我的服务没有捕获端口23上的连接,因此建立了连接。
我通过执行以下操作打开防火墙中的端口:
for (int i = 0; i < ports.Length; i++)
{
string arg = "advfirewall firewall add rule name=\"PeepHole Open" + "\" dir=in action=allow protocol=TCP localport=" + ports[i];
string arg1 = "advfirewall firewall add rule name=\"PeepHole Open" + "\" dir=in action=allow protocol=UDP localport=" + ports[i];
ProcessStartInfo procStartInfo = new ProcessStartInfo("netsh", arg);
ProcessStartInfo procStartInfo1 = new ProcessStartInfo("netsh", arg1);
procStartInfo.RedirectStandardOutput = true;
procStartInfo1.RedirectStandardOutput = true;
procStartInfo.UseShellExecute = false;
procStartInfo1.UseShellExecute = false;
procStartInfo.CreateNoWindow = true;
procStartInfo1.CreateNoWindow = true;
Process.Start(procStartInfo1);
Process.Start(procStartInfo);
}
我通过以下方式启动听众:
IPEndPoint Ep = new IPEndPoint(IPAddress.Parse("0.0.0.0"), current_port);
//TcpListener tempListener = new TcpListener(hostIP, current_port);
TcpListener tempListener = new TcpListener(Ep);
TCP_Listener listen = new TCP_Listener(); //my defined tcplistener struct
listen.listener = tempListener; //set the Listener's TcpListener field
listen.port = current_port; //set the Listener's Port field
listen.listener.Start(); //start this particular TcpListener
tcp_listener_list.Add(listen); //add the struct to the list of Listeners
通过以下方式接受TCP连接:
for (int i = 0; i < tcp_listener_list.Count - 1; i++)
{
if (tcp_listener_list[i].listener.Pending())
{
TcpClient client = tcp_listener_list[i].listener.AcceptTcpClient();
int clientPort = tcp_listener_list[i].port;
IPEndPoint ep = client.Client.RemoteEndPoint as IPEndPoint;
ThreadPool.QueueUserWorkItem(LogTCP, new object[] { client, clientPort, ep });
}
}
在LogTCP中我关闭连接(其中client是TcpClient对象):
NetworkStream networkStream = client.GetStream();
networkStream.Close();
client.Close(); //close the connection, all the data is gleaned from the attacker already
现在的问题是,当我运行telnet或netcat来测试端口的关闭和记录时,我的代码永远不会执行,并且因为端口被打开而建立了连接; TCP连接永远不会是.Pending(),如果我删除它,问题就是持久性的。另外,如果我将侦听器设置为使用IPAddress.Any并且如果我使用或不使用.Pending()if语句将accept方法重新配置为AcceptSocket,则会出现同样的问题。 Windows是否在某些程序的低级别对待某些端口?
我正在从Windows 8.1运行Windows服务,并通过telty(在安装该服务的机器上)和telnet和netcat在Linux VM上发送TCP连接。 Telnet客户端和Telnet服务器都在“主机”上禁用。机。
我尝试过在研究过程中找到的关闭插座和连接的许多不同变体。
client.Client.Close()产生一个ObjectDisposedException client.Client.Shutdown(SocketShutdown.Both)使以前所有的&#39;工作&#39; ports挂起与CLOSE_WAIT的连接
答案 0 :(得分:0)
Pending
。只是不断接受所有听众。每个侦听器启动一个任务来执行此操作:
while (true) {
ProcessConnectionAsync(await listener.AcceptAsync());
}
像这样。
这是一个错误的错误:tcp_listener_list.Count - 1
。但是如上所述,当你这样做时,这个bug就会消失。
关于结束,为什么不只是client.Dispose();
?这是在.NET中进行资源管理的常用方法。不需要其他任何东西。
答案 1 :(得分:0)
我认为这里的关键是,你提到你已经创建了你自己的结构。结构非常棘手。您可能认为以下代码最终会得到一个包含tempListener和current_port的TCP_Listener实例。但是如果你设置一个断点,你可能会注意到其他情况。您在结构上执行的每个修改实际上都返回一个全新的结构,因此您不能像对类一样分配一个字段。
TCP_Listener listen = new TCP_Listener(); //my defined tcplistener struct
listen.listener = tempListener; //set the Listener's TcpListener field
listen.port = current_port; //set the Listener's Port field
listen.listener.Start();
我建议您使用类,而不是结构。或者将结构初始化为新的TCP_Listener(tempListener,current_port),然后启动它。
这至少是你问题的一部分。一旦你解决了这个问题,请告诉我们它是否仍然无效,我们可以查看下一期。