首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Netcat自动响应

Netcat自动响应
EN

Stack Overflow用户
提问于 2017-01-07 15:03:16
回答 1查看 9.4K关注 0票数 3

我有一个raspberry pi运行,启动时开始监听端口666。

‘'nc -k -l -p 666’

这个服务器是一个捕获标志类型的游戏,我想要发生的是如下所示。如果用户将一条秘密消息回传到服务器的666端口,我希望服务器使用另一条服务器消息进行响应。我也希望无论用户发送正确的秘密信息,不管他们做了多少次,都会发生这种情况。

客户端将发出一个“$回送”机密“nc 192.168.1.1 666”,只有在机密正确时才能得到响应。

有人能告诉我如何纠正服务器端的NC命令吗?

EN

回答 1

Stack Overflow用户

发布于 2017-01-07 15:13:53

假设:

  1. 您的netcat支持-c选项,该选项通过stdin和stdout连接到网络套接字启动-c命令。
  2. 秘密消息正好有一行长。

您可以尝试将以下shell命令传递给nc-c选项:

代码语言:javascript
复制
read message # read the line that user sent
if [ x"$message" = x"secret message" ]; then # compare them
    echo "secret response"
fi

,这相当于启动nc的以下命令

代码语言:javascript
复制
nc -k -l -p 666 -c 'read message; [ x"$message" = x"secret message" ] && echo "secret response"'

以及以下行为:

代码语言:javascript
复制
$ echo zzz | nc localhost 666
$ echo secret message | nc localhost 666
secret response

如果您的netcat碰巧有-c,但没有-k选项(就像Debian的netcat-传统那样),那么在循环中运行它:

代码语言:javascript
复制
while true; do nc -l -p 666 -c 'read message; [ x"$message" = x"secret message" ] && echo "secret response"'; done

顺便说一句,上面这个简单的实现存在一个拒绝服务漏洞:任何人都可以连接到它,但是什么也不能发送。read调用将被困在等待字符串。由于阻塞和单线程,nc将不接受来自其他玩家的连接,可能带有正确的秘密消息。

解决这一问题的一个简单方法是在脚本中添加-t <timeout> bashism:

代码语言:javascript
复制
read -t 1 message || exit 1

现在,攻击者必须在一个循环中主动地建立许多连接,而不是只创建一个连接来阻止玩家连接到服务器。一个正确的(虽然可能是过分的)修复方法是一次编写一个多线程和/或异步服务器,支持多个客户端,并将其存放在具有适当持久的Internet连接和适当数量的资源以抵御洪水攻击的某个地方。解决多客户端问题的正确解决方案的第一个近似方法是使用xinetd同时运行shell:

代码语言:javascript
复制
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 everyone
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41522819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档