老派的电话哨声又回来了!
嗯,差不多了,但下面的音频也相差不远。
7 月 13 日,我们发现了一个有趣的漏洞。一个特定的网页正在跟踪数字无线电聊天,它会显示其电台正在收听的内容的运行日志。如果您热衷于此类事情,这是一个方便的工具;毕竟,很高兴知道您的电话是否被听到或者是否有您可能想要加入的正在进行的对话。该工具捕获它所听到的任何内容并将其插入网页中。发送一条消息,几秒钟后它就会显示在那里。如果消息包含 HTML,那么它也会出现在网页上。经典 HTML 注入。
那么这是如何运作的呢?
要发动这样的攻击,你根本不需要互联网——你只需要一根很长的电线。在 2023 年 2 月发布的空中攻击系列中,我们讨论了带有运行频率为 913 MHz 的控制器的篮球记分板所带来的无线问题。在这篇文章中,我们将降低频率,进入短波无线电频段。此攻击在 7.078 和 14.078 MHz 下起作用。
这里有很多有趣的数字信号,JS8 就是其中之一。 JS8 是业余无线电中流行的键盘对键盘聊天工具。它绝对擅长在长距离和非常差的链路条件下进行直接对话。 JS8 本身基于 FT8,FT8 是一种非常流行的工具,用于在几乎听不到对方声音的电台之间进行简单的联系。 FT8 和 JS8 日夜不停地使用。
短波波段的信号会发生一些奇怪的事情。由于频率如此之低,以至于在我们上方 100 英里处,地球电离层的 E 层和 F 层开始将无线电信号再次反射回地面。信号在地球和地面之间多次反射,就像从水中跳过一块石头一样。它使我们能够在夜间听到地球另一端的商业 AM 电台。白天,这种弹跳也会以更高的频率起作用,从而实现远距离通信。我后院的发射机和网站的电台相距 674 英里。一次弹跳即可轻松覆盖该距离。
那么如何利用短波信号攻击网站呢?
JS8 消息以 ASCII 文本构建,全部大写字符。大多数消息都会发送给广泛的群体,例如 Skywarn、JS8Chess,或者为了引用每个人,简单地 ALLCALL。在此之后,消息可以是任何内容。首先,我们在编辑器中构建 HTML 有效负载。我们必须合法地提供业余无线电呼号以进行识别(真正的攻击者会忽略这一步骤),最终我们的最终消息如下所示:
KJ7YLS: @TEST <DIV STYLE="WIDTH: 500PX;HEIGHT:100PX;COLOR:RED;">HTML 注入!</DIV>
我们现在准备好传输。 JS8 软件将此文本转换为二进制,添加前向纠错,并使用高斯频移键控 (GFSK) 调制结果。最终产品听起来像是奇怪的口哨声。如果我们使用 Audacity 打开声音,并打开频谱图,它看起来像这样:
仔细观察,您可以看到 GFSK 调制慢慢地从一个频率过渡到另一个频率。它还在每个频率上保持特定的时间长度。这里使用八种不同的频率,因此每个符号都有八种不同的状态。因此,每个符号一次可以携带三位。这用一些标签来说明:
然后我们可以将啸叫噪声发送到无线电发射器的麦克风中。与大多数业余和军用信号一样,音频是使用上边带调制传输的,上边带调制是 AM 广播类型信号的一部分。 JS8 消息在多个频率上进行了标准化,我们的目标在 7.078 MHz 和 14.078 MHz 进行监听。我们将无线电调谐到任一频率,并使用 20 瓦功率将音频发送到空中约 30 英尺的 16-AWG 电线中。信号辐射到空气中,从电离层反弹,然后他们的天线接收它。他们的 JS8 软件反转该过程并提取 ASCII 消息。正是在这一点上,我们看到了问题。
该网站(出于对作者的尊重,在本文中保留了链接)记录 JS8 流量。在底层,它由JS8Net提供支持,这是一个有用的 Python 工具,可以直接与 JS8 软件的 API 对话。在存储库中, monitor.py脚本抓取 JS8 消息并将它们放置在网站上。在撰写本文时,它在第 859 行包含以下代码行:
# Text j['text']=j['stuff']['params']['TEXT'] key=str(j['stuff']['time']) j['id']=':'.join([fmcall,tocall,key,str(j['freq'])]) traffic[key]=json.dumps(j)
j['stuff']['params']['TEXT']是从Collector.py中提取的 ASCII JS8 消息,它是从 JS8 软件的 API 中提取的。在此步骤之后, traffic[key]中的文本将使用 Javascript 放置到页面上。这些步骤都很好。该问题发生在上下文更改中,因为假设 JS8 流量已由 JS8 软件完全处理,已准备就绪,不会影响网页的上下文。这就是我们可以利用的行为。
从开始到结束,我们的攻击如下所示:
几分钟后,我们的消息被记录在网站上......
最终的结果主要是装饰性的。这是一个公共页面,因此没有可窃取的会话 cookie 或可欺骗的控件。存储型 XSS 也是一种真正的可能性,但是在一个令人沮丧的早上发送了很多很多耗时的有效负载(每个 JS8 消息需要几分钟才能发送)之后,我们无法获得在页面上执行的有效 Javascript。我怀疑 JS8net 软件意外地屏蔽了许多关键字符和单词,而我们的解决方法似乎没有起作用。
尽管如此,Burp Suite 在这里还是派上了用场。那天电离层很配合,信号反射得很好。我从其他工具得知其他国家的电台正在听到来自美国的 JS8 流量。所以我的下一个有效负载是
KJ7YLS:@ALLCALL <img src =“http://727k2w1hfoamqewpm7rpiocu0l6cu2ir.oastify.com”alt =“@HB DN13”>
该 URL 指向由 Burp Suite 的 Collaborator 工具运行的 DNS 和 HTTP 侦听器,我们经常在渗透测试期间使用该工具来查找带外信息泄漏。这没有什么不同。几分钟之内,Collaborator Server 就记录了访问智利页面的用户的 DNS 和 HTTP 流量。我还查看了该页面以检查注入并也被记录。
这就是我希望在道德上进行注射的程度。我向网站所有者 Jeff 报告了该问题,并提出了修复建议。第二天他就给我回信说:
我自己从事安全工作(我为湾区的一家网络安全公司进行研发),但我不得不承认,通过无线电提交 JS 来破解网站完全超出了我的考虑范围。
在等待补丁上线的同时,我思考了 JS8Net README 中的几行内容:
It's important to note that this part of the software is still very much in the development stage, and may have critical vulnerabilities that make exposing the exposed services to the open Internet a Very Bad Idea. While it certainly will work, it's intended for protected, internal LAN use at this time.
老实说,这总体上是一个很好的警告,特别是对于正在进行中且尚未经过彻底测试的项目。此时的漏洞是“未知的未知”,但作者主要考虑的是其软件中暴露的侦听器和 API。然而,我们利用了稍微不同类型的问题。自述文件警告说,该服务应该在 LAN 内运行,这确实可以保护其他人免受 HTML 注入和网页污染。然而,带有协作者有效负载的有效负载也会泄露在其私有 LAN 内查看该页面的任何人的公共 IP 地址,因此解决这个问题有点困难。
简而言之,这是攻击互联网网页的无线电信号。攻击者不需要使用 VPN、Tor 或僵尸网络来尝试在互联网上隐藏自己的身份。 JS8 在提取低于本底噪声 -24dB 的消息方面非常有效(在这个水平上几乎听不到哨声),因此只需很少的功率即可到达远处的电台。在良好的电离层条件下,一瓦的传输功率可以横跨美国东海岸。攻击者可能位于世界任何地方。只需要突发消息即可,因此测向也很困难。我认为这几乎是无法追踪的事情了。
时间线: