在进程间通信中使用/寻找隐蔽通道

信息安全 网络 访问控制 SSH
2021-09-05 01:56:22

我有一个涉及狼人/黑手党虚拟游戏的课堂练习。在这门课上,我们并没有真正教过如何做任何事情,这使得每个人都很难做实验。

这个想法是,在游戏的某些回合中,坏人投票支持杀人,然后在下一轮,每个人都开始猜测坏人是谁,并试图杀死他们。

这是设置为:

  • 主持人使用的python服务器
  • 每个人都启动的用于发送/接收服务器消息的python客户端(我们可以修改它)
  • 每个人都使用 ssh 连接到一台机器(因此服务器和客户端在一台机器上运行)
  • 它们通过命名管道进行通信(隐藏在受保护的目录中)

我们需要:

  • 作为好人:找出狼人何时与服务器通信,以便我们可以投票杀死该用户
  • 或作为坏人:不被抓到与服务器通信

我正在尝试使用的一些想法,但对于网络/linux noob 来说太多了,无法使用:

  • /proc/pid#/sched 这里应该有有用的东西。我想我可以检查自愿上下文切换以查看用户何时键入。不幸的是,我不擅长编写脚本。另外,我不确定如何获取 pid#。也许管道顶部进入grep“python”?

  • 检查与机器的 ssh 连接,并以某种方式监听套接字进行通信?

我完全被难住了,所以任何建议都会很棒。

1个回答

这里只是一些随机的思考:这是一个非常有趣的问题,我假设好人和坏人都使用同一个客户端,并且坏人是由版主秘密选择的并且彼此不认识。

在这种情况下,仅仅检测与服务器的通信是不够的,因为一个好人必须这样做才能获取信息。此外,任何选举监督好人的协议都可能选择坏人。

也不清楚这些人,好人或坏人,是否有私人或公共渠道可以在他们之间进行交流。

一种方法可以是在公共频道上定期广播自己的网络状态参数。这意味着客户端本质上是“好”或“中立”(它不支持狼人活动),因此任何狼人都必须实例化并部署一个变通方法并欺骗他自己的客户端不报告“坏人”活动。所有其他客户端将监听异常报告(例如与服务器的额外连接);提交异常报告、未提交任何内容或提交损坏的报告都可能被视为狼人的证据。

例如,可以要求每个用户公开发送“好人”实用程序的结果,该实用程序查询和时间戳的输出netstat -snap tcpnetstat -na以不可否认的方式检测与服务器的通信。这可以归结为一个简单的实用程序,它输出时间戳、用户名、随机种子和秘密哈希:

12345678:lserni:56789:SHA1("secret:12345678:lserni:56789:WEREWOLF!")

(每个用户,甚至是狼人,都应该以他是个好人为由安装该实用程序)。

如果人际频道是私人的,我们可以让每个客户每隔一段时间检查一下其他人。狼人一发出死刑立即被发现,所有好人都会将他击倒。这让所有其他狼人在那个回合可以自由地使用他们的子弹击落一些好人,但如果他们受到同样的限制,好人 - 他们不了解自己 - 那么他们的行动将是不协调和无效的,每转一圈都会看到一个狼人倒下。

上面的方案仍然成立,如果狼人有一个他们自己的客户端允许他们进行协调,只要它不会让他们伪造网络状态。