我有一个覆盆子pi运行,在启动时开始侦听端口666。
'nc -k -l -p 666'
此服务器用于捕获旗帜类型的游戏,我想要发生的事情如下。如果用户向服务器的666端口发送一条秘密消息,我希望服务器使用另一条服务器消息进行响应。我也希望无论用户多少次发送正确的秘密消息,都会发生这种情况。/ p>
客户端会发出'$ echo'秘密'| nc 192.168.1.1 666' 只有在秘密正确的情况下才能获得回复
有人可以指导我如何纠正服务器端的NC命令吗?
答案 0 :(得分:2)
假设:
netcat
支持-c
选项,该选项使用连接到网络套接字的stdin和stdout启动shell命令您可以尝试将以下shell命令传递给nc
的{{1}}选项:
-c
以下命令用于启动read message # read the line that user sent
if [ x"$message" = x"secret message" ]; then # compare them
echo "secret response"
fi
:
nc
以及以下行为:
nc -k -l -p 666 -c 'read message; [ x"$message" = x"secret message" ] && echo "secret response"'
如果您的$ echo zzz | nc localhost 666
$ echo secret message | nc localhost 666
secret response
恰好有netcat
,但没有-c
选项(如Debian的netcat-traditional所做的那样),请循环运行:
-k
顺便说一句,上面的天真实现有一个拒绝服务漏洞:任何人都可以连接到它,但什么都不发送。 while true; do nc -l -p 666 -c 'read message; [ x"$message" = x"secret message" ] && echo "secret response"'; done
调用将等待字符串。作为阻止和单线程,read
将不接受来自其他玩家的连接,可能使用正确的秘密消息。
对此的粗略修正是将nc
基础添加到脚本中:
-t <timeout>
现在,攻击者必须在循环中主动建立大量连接,而不是仅使用一个来阻止玩家连接到服务器。一个适当的(虽然可能是矫枉过正的)修复方法是编写一个多线程和/或异步服务器,一次支持多个客户端,并在适当持久的Internet连接和适当数量的资源的情况下托管它,以抵御洪水攻击。解决多客户端问题的第一个适当解决方案的近似值是使用read -t 1 message || exit 1
同时运行shell:
xinetd