我有一个raspberry pi运行,启动时开始监听端口666。
‘'nc -k -l -p 666’
这个服务器是一个捕获标志类型的游戏,我想要发生的是如下所示。如果用户将一条秘密消息回传到服务器的666端口,我希望服务器使用另一条服务器消息进行响应。我也希望无论用户发送正确的秘密信息,不管他们做了多少次,都会发生这种情况。
客户端将发出一个“$回送”机密“nc 192.168.1.1 666”,只有在机密正确时才能得到响应。
有人能告诉我如何纠正服务器端的NC命令吗?
发布于 2017-01-07 15:13:53
假设:
netcat支持-c选项,该选项通过stdin和stdout连接到网络套接字启动-c命令。您可以尝试将以下shell命令传递给nc的-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,但没有-k选项(就像Debian的netcat-传统那样),那么在循环中运行它:
while true; do nc -l -p 666 -c 'read message; [ x"$message" = x"secret message" ] && echo "secret response"'; done顺便说一句,上面这个简单的实现存在一个拒绝服务漏洞:任何人都可以连接到它,但是什么也不能发送。read调用将被困在等待字符串。由于阻塞和单线程,nc将不接受来自其他玩家的连接,可能带有正确的秘密消息。
解决这一问题的一个简单方法是在脚本中添加-t <timeout> bashism:
read -t 1 message || exit 1现在,攻击者必须在一个循环中主动地建立许多连接,而不是只创建一个连接来阻止玩家连接到服务器。一个正确的(虽然可能是过分的)修复方法是一次编写一个多线程和/或异步服务器,支持多个客户端,并将其存放在具有适当持久的Internet连接和适当数量的资源以抵御洪水攻击的某个地方。解决多客户端问题的正确解决方案的第一个近似方法是使用xinetd同时运行shell:
service ctf
{
port = 666
socket_type = stream
wait = no
user = nobody
server = /path/to/yourscript.sh
}
# assuming that yourscript.sh contains the script above with a proper shebang and is executable by everyonehttps://stackoverflow.com/questions/41522819
复制相似问题