进一步阅读

进一步阅读

我设置了一个新的基本 Linux 服务器(本例中为 CentOS),仅用于测试目的。在没有任何防火墙的情况下,我在其中运行 Python Web 应用程序。基本上,我键入内容python run.py并将应用程序置于前台,而应用程序本身则在某些端口上运行,例如8080,因此在我使用的 Web 浏览器中,我只需键入内容my_public_ip_addr:8080并正常使用它即可。所有这些都通过我的笔记本电脑上的 SSH 进行。

现在,我将笔记本电脑打开了一段时间,当我回来时,外壳显示如下内容:

83.20.238.86 - - [13/Mar/2019 08:54:43] "GET / HTTP/1.1" 200 -
87.122.83.97 - - [13/Mar/2019 11:55:30] "GET / HTTP/1.1" 200 -
176.32.33.145 - - [13/Mar/2019 12:08:36] "GET / HTTP/1.1" 200 -
176.32.33.145 - - [13/Mar/2019 12:08:36] code 400, message Bad request syntax ('\x16\x03\x01\x00\xfc\x01\x00\x00\xf8\x03\x03(\xd3FM\xf5\x0eLo\x17\xa3|\x1f8\xca~#\x07\xc1\x1f&&\x14\x19\x11\x10:\x824\xd23nA\x00\x00\x8c\xc00\xc0,\xc02\xc0.\xc0/\xc0+\xc01\xc0-\x00\xa5\x00\xa3\x00\xa1\x00\x9f\x00\xa4\x00\xa2\x00\xa0\x00\x9e\xc0(\xc0$\xc0\x14\xc0')
176.32.33.145 - - [13/Mar/2019 12:08:36] "��(M�L⎺�≠8#�&&:�4┼A��▮�←�2�↓�/�→�1�↑���������(�$��" 4▮▮ ↑
176↓32↓33↓145 ↑ ↑ [13/M▒⎼/2▮19 14:55:55] "GET / HTTP/1↓1" 2▮▮ ↑
176↓32↓33↓145 ↑ ↑ [13/M▒⎼/2▮19 14:55:55] c⎺de 4▮▮← └e⎽⎽▒±e B▒d ⎼e─┤e⎽├ ⎽≤┼├▒│ ('\│16\│▮3\│▮1\│▮▮\│°c\│▮1\│▮▮\│▮▮\│°8\│▮3\│▮3\│92\│8e\│°7\│9e\│1▒\│▒2\│1e\│°8\│°bb^\│1b\│d1\│▒1\│1e\│d2\│d1^\│1e/└\│96_(\│beU\│▮4\│8d≥\│d7⎻\│°e\│▮▮\│▮▮\│8c\│c▮▮\│c▮←\│c▮2\│c▮↓\│c▮/\│c▮→\│c▮1\│c▮↑\│▮▮\│▒5\│▮▮\│▒3\│▮▮\│▒1\│▮▮\│9°\│▮▮\│▒4\│▮▮\│▒2\│▮▮\│▒▮\│▮▮\│9e\│c▮(\│c▮$\│c▮\│14\│c▮')
176↓32↓33↓145 ↑ ↑ [13/M▒⎼/2▮19 14:55:55] "���������b^[⎺⎼▒┼±e@ce┼├⎺⎽↑⎺⎼▒┼±e ⎺⎼▒┼±e_±c]$ ^C
[⎺⎼▒┼±e@ce┼├⎺⎽↑⎺⎼▒┼±e ⎺⎼▒┼±e_±c]$ ┌⎺±⎺┤├
C⎺┼┼ec├☃⎺┼ ├⎺ 1▮4↓248↓36↓8 c┌⎺⎽ed↓
▒d▒└@±⎽:·$ 
▒d▒└@±⎽:·$ 
▒d▒└@±⎽:·$ 
▒d▒└@±⎽:·$ ec▒⎺ '▒e┌┌⎺ ⎽├▒c┐ ⎺┴e⎼°┌⎺┬'
▒e┌┌⎺ ⎽├▒c┐ ⎺┴e⎼°┌⎺┬
▒d▒└@±⎽:·$ 

您可以看到 3 个最后的“正常”GET 请求/,但随后就开始了。我知道它可以修复(链接1或者链接2)这些是一些扫描机器人,但我的问题是:

它是如何工作的,传入的请求破坏了我的终端?

答案1

让这成为安全方面的一课。您的程序按原样将网络提供的输入直接转储到其日志中。您将日志输出直接转储到用户终端。您让互联网上的攻击者能够控制您终端上的输出。

cyclog通过和或类似的方式传输日志multilog,正如我在https://unix.stackexchange.com/a/505854/5132,这样它们就会进入一组严格限制大小、自动轮换的日志文件,而不是终端。然后使用可以清理控制字符的工具读取这些日志文件。

这里的“坏字符”是众所周知的,并且由 ECMA-35(又名 ISO/IEC 2022)结合大量字符集注册表进行标准化。您的终端仿真器实现 8 位字符集的两个可切换部分,称为“GL”和“GR”。各种标准控制字符和转义序列在四个指定字符集(称为“G0”、“G1”、“G2”和“G3”)之间切换这两个字符集。这四个字符又通过进一步的转义序列映射到实际的字符集。

可能会扰乱输出的字节序列集相当大。不仅仅是,正如问题评论会让您相信的那样。有两个可移动区域的可能移动,以及锁定和单班。用于移位的 C1 控制字符有两种表示形式。然后,四个班次中的每一个班次都有不到两百个可能的映射字符集,每个班次都有自己的转义序列。

这是一个相当复杂的系统,如果您此时想“难道只使用 Unicode 更好吗?”你不会是第一个。其发明者mosh将其终端仿真器不实现任何字符集切换作为卖点。我的也没有console-terminal-emulator。我们的终端模拟器根本不会遇到这些困难。自 1999 年以来,Markus Kuhn 一直鼓励放弃 ISO 2022 字符集切换。

进一步阅读

相关内容