Yubikey的武器化之路,以***kiosk自助设备为例

lucywang 嘶吼专业版

Yubikey是一个小型的USB设备,在电脑看来,它是一个USB键盘设备。

几年前,我有一个受安全漏洞影响的YubiKey,为了解决这个问题,Yubico公司免费送给我一个全新的YubiKey。由于我在收到新的YubiKey之后没有使用旧的YubiKey进行身份验证,我决定看看是否可以将它变成类似于USB Rubber Ducky的东西,USB Rubber Ducky是一款模仿人工键盘输入的设备,外形和U盘一样,模拟键盘输入速度可达到1000个字符每分钟,并且适合任何操作系统,包括安卓等移动OS,它使用的是它特定的脚本语言,用记事本就可以编写,通过他配套的jar程序编译成inject.bin放到sd卡里运行。事实证明我能够做到这一点,具体步骤(总共4步),我会在下面讲到。

第1步:下载YubiKey个性化工具

YubiKey在其网站上提供了一个名为YubiKey Personalization Tool(YPT)的程序,可用于在Linux,Windows或Mac上自定义YubiKey的不同功能。我在这篇文章中使用的是Linux版本,但Windows和Mac版本应该非常相似。

如果你像我一样使用Linux版本,则可能需要使用YubiKey提供的源代码构建程序。有关如何操作的说明,你可以在源代码附带的README文件中找到,很容易理解,所以我不在这里介绍它们。

第2步:使用静态密码对YubiKey进行编程

在默认配置中,YubiKey将在使用时输入唯一的身份验证令牌,并且该令牌会在每次使用时改变。不过,YubiKey也可以通过编程输入静态的用户定义密码。由于YubiKey可以像普通键盘一样将数据输入计算机,我想知道除了标准字母,数字和符号之外,它是否可以用来按CTRL、ALT或Windows键等更有趣的键。为了测试这一点,我启动了YPT并从顶部的栏中选择了静态密码选项。然后在“静态密码”页面上,单击标有“扫描代码”的按钮。

为了理解一切是如何工作的,我首先用非常简单的静态密码“abcdef”编写YubiKey。为此,我在“静态密码”窗口中选择了以下选项:

1.配置插槽:配置插槽1

2.键盘:US Keyboard

3.密码:abcdef

当我在密码字段中输入密码时,十六进制值开始显示在其右侧的扫描代码字段中。我注意到了这一点,并决定在用静态密码编写YubiKey之后,为我想输入的每个键标识十六进制值。这样,我就可以用无法输入密码字段的键(如CTRL和ALT)来编程了。

以下屏幕截图显示了我上面列出的所有设置,以及通过输入密码生成的扫描代码:

接下来,单击“Write Configuration”将静态密码写入我的YubiKey。第一次执行此操作时,会弹出一个对话框,要求我确认是否要覆盖YubiKey上插槽1的当前配置。我选中了标有“不再显示此消息”的框,然后单击“是”将更改写入设备。

注意:如果你正在使用你自己的YubiKey,请确保它不是你当前用于身份验证的。将新配置写入YubiKey将删除存储在你选择的配置槽中的设置,你必须重新编写YubiKey程序,并将其重新注册到你使用的服务中,以便再次将其用于多因素身份验证。如果你只使用YubiKey上的一个配置插槽进行身份验证,则可以安全地覆盖另一个配置插槽。但是,如果你不确定,最好将你的YubiKey从你首先使用的任何服务中注销,或者直接使用另一个YubiKey。

写完更改后,我打开了一个文本编辑器,并按下YubiKey上的硬件按钮,YubiKey果然在屏幕上输入了密码“abcdef”。

第3步:识别YubiKey的十六进制密钥代码

现在我已经确认我可以让YubiKey输入一系列预定义的键,接下来我要做的就是弄清楚是否可以通过在YPT中指定十六进制“扫描码”来使其按下更有趣的键。为了将扫描码映射到相应的按键,我使用了一种技术含量很低的方法,在YPT的密码字段中键入字母“a”到“z”,并在扫描码字段中观察结果。这导致十六进制值04通过1D出现在扫描码字段中。

对键盘上所有其他可打印的键以及每个键的大写版本都重复了这个过程,最后我将收集到的所有十六进制值以及尚未与键盘上的键匹配的值范围都记录下来。我把我能破译的所有字符组织成一个表格,然后,我注意到一个模式。扫描代码似乎被分成了两部分,小写字母都位于00-7F和大写字母之间,或者“key + Shift”版本存在于80-FF之间的相同位置,在下表中可以更清楚地看到这一点。

现在要做的就是确定每个未知范围内十六进制值生成的按键,因为在YPT的“扫描代码”字段中输入十六进制值没有显示任何输出,并且因为我预期在未知范围内按下的许多键是不生成任何可打印输出的键(例如CTRL键),所以我需要一种方法来捕获YubiKey生成的原始按键。为此,我决定使用Linux工具xinput和我编写的xinput-keylog-decoder脚本来解码输出。

如果你不熟悉xinput,它我可以告诉你,它就是一个命令行工具,通常包含在许多Linux发行版中以及图形桌面环境中。当这些系统受到***时,它也常被滥用为键盘记录器,为此我创建了xinput-keylog-decoder工具。

由于YubiKey本质上是一个键盘,我开始捕捉它的按键时所做的第一件事就是在xinput中标识它的ID号。我通过运行不带任何参数的xinput命令检查了这一点,并确定其ID为16,如下面的输出所示。

默认情况下,xinput-keylog-decoder附带的示例脚本会记录所有连接到系统的键盘的输入,但知道YubiKey的ID后,我就可以在解析输出时专门针对该设备。

接下来,我可以打开了三个终端窗口并运行命令来记录和分析YubiKey生成的按键,下面的屏幕截图解释了每个命令的用途。

第一个终端窗口:停止当前运行的任何xinput进程,启动一个新的xinput进程,并启动无限循环以从键盘读取输入。这是我在YubiKey输入系统时一直选择的终端窗口。这样,它输入的任何内容都不会干扰其他终端窗口。

./stop-logging.sh >0; rm *txt; ./start-logging.sh; while true; do read; sleep 0.1; done

第二个终端窗口:每隔一秒会在屏幕上显示test-output.16.txt的原始输出。 test-output.16.txt是自动保存键盘ID 16的按键的文件。通过显示xinput输出的原始密钥代码,我可以得到更多的信息,以防xinput-keylog-decoder.py无法解码第三个终端窗口中的输入内容。

watch -n 1 tail test-output.16.tx

第三个终端窗口:每秒,解码keylog文件并将其显示为人性化文本。

watch -n 1 ./xinput-keylog-decoder.py test-output.16.txt

最后,在将十六进制扫描码编程到YubiKey中时,我首先在两个已知字符之间输入它们,通常是“a”(扫描码04)和“b”(扫描码05)。通过这种方式,我可以确认按下目标按键之前和之后的按键。并且通过这种方式,我可以识别按键是否对其他按键产生了影响,下面是针对扫描代码“2A”的示例。

在第一个屏幕截图中,你可以看到未识别的扫描代码“2A”,夹在“a”和“b”的扫描代码之间。另外,你可能还会注意到密码字段中“a”和“b”之间的明显空白。

在下一个屏幕截图中,我选择了第一个终端窗口,并按下YubiKey上的按钮。乍一看,似乎只按了“b”键而忽略了“a”。但是,在检查了第二个终端窗口后,你可以看到三个键被依次按下和释放。在第三个终端窗口中,来自第二个终端窗口的代码被解码成人性化的格式,很明显按下的键是“a”,退格键和“b”。这解释了为什么“a”没有出现在第一个终端窗口中,并将目标扫描码“2A”标识为退格键。

在以这种方式识别密钥后,我接下来所做的就是按CTRL + C以停止第一个终端窗口中的运行循环,再次运行该命令(清除日志并重新启动记录器),然后重复上面的过程。在对每个未识别的十六进制值重复这些步骤之后,我确认了每个可能的扫描代码生成的按键,并将它们收集到下面的表中。

在解码扫描码时,我还观察到,YubiKey会在一些按键序列结束时自动按下回车键。在某些情况下,我能够通过使用扫描代码“00”终止序列来防止这种行为,但它并不总是有效。以下有一个用于演示的YubiKey的屏幕截图,它被配置为输入字母“a”到“z”,以及按下YubiKey按钮后输出的屏幕截图。请注意,“z”键(扫描码“1D”)是编入YubiKey的最后一个键,但是YubiKey无论如何都会在字符串的末尾按下回车键。这与在前一个示例中解码退格键代码时观察到的行为不同,在前一个示例中,回车键没有被按下。

按键序列的长度和YubiKey的输出速度(可从YPT中的“设置”屏幕进行配置)似乎都会影响此行为。在我的测试中,额外的回车键没有出现在以标准输出字符速率输入的长度小于23个键的序列中。但是,将字符速率减慢60 ms会导致回车键在短至一个键的序列上自动按下。如果你不希望让YubiKey在结束时自动按回车键,那么在YubiKey上创建有效载荷时要注意这一点。

第4步:创建有用的有效载荷

由于所有扫描代码与他们按下的键匹配,所以我现在准备开始构建有效载荷。不幸的是,我测试过的扫描码都没有按下我希望找到的CTRL,ALT或Windows键。因此,虽然它可以用来输入一个很长的一行程序,但它不是一个理想的完全自动化的命令注入工具或如Rubber Ducky或Teensy那样的USB Drop。

即使YubiKey不按CTRL,ALT或Windows键,它仍然可以访问其他几个可能有趣的键,包括:

1.Shift(使用“Shift + No effect”扫描代码);

2.功能键(F1-F12);

3.菜单键(相当于鼠标右键);

  1. Escape键;

5.Shift键与所有已识别的键组合使用;

虽然在将可执行有效载荷注入目标系统时,这些密钥可能不是首选,但是在***KIOSK自助服务设备时,它们非常有用。

由于完全保护kiosk的软件的安全性都很差,kiosk制造商通常会从键盘上删除按键,单击右键设备上的按钮,或者完全删除这两种设备以支持触摸屏。但是,自助服务终端上的USB端口经常会处于暴露状态,以便技术人员可以将它们连接自己的键盘进行故障排除。在这种情况下,使用自己键盘(如本示例中的YubiKey)的***者只需将键盘插入自助服务终端,并使用众多众所周知的方法中的一种来突破受限制的shell并控制电脑即可。

kiosk上受限制的shell的第一步通常是打开一个新的应用程序窗口,可能是一个对话框,也可能是一个新的浏览器窗口,或者其他任何东西。这通常是键盘最有帮助的一步,因为其余的通常可以用来自一个指向设备的最小输入来完成。下表描述了YubiKey可以注入的按键以尝试执行第一步。

考虑到这些功能,我创建了下面的三个有效载荷,以使用我的YubiKey来破解kiosk设备。

YubiKey载荷

有效载荷1:含有简单功能键和粘滞键测试

· 扫描码:522c3a3b3c3d3e3f404142434445e6e6e6e6e6e652

· 输出字符率:标准

· 按键执行:

1.激活粘滞键对话框中的超链接(如果存在):按下向上箭头,空格键;

2.依次按下每个功能键:F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12;

3.连续按5次Shift键打开“粘滞键”对话框,为了安全起见,再连续按6次Shift键;

4.在“粘滞键”对话框中选择超链接,并尝试阻止Enter键在按下向上箭头时关闭窗口;

有效载荷2:浏览器热键和粘滞键

· 扫描码:3f2a06b3a83f4dca06b3283c443e3b3d40ab2c29e5115128454142435113113ae6e6e6e6e652

· 输出字符速率:减慢60 ms

· 按键执行:

1.在一个新的浏览器窗口中打开“c:”:依次按下F6,Backspace,输入“c:”,Shift + Enter;

2.打开“c:”(Chrome):依次按下F6,End,Shift + Home,输入“c:”,Enter;

3.依次按下功能键:F3,F11,F5,F2,F4;

4.尝试按下F7并关闭对话框;

5.打开一个新的浏览器窗口:依次按下Shift + Menu,n,Down,Enter;

6.试试F12 / Web开发者控制台:按下F12;

7.尝试F8和F9:依次按下F8,F9;

8.打开打印对话框或新浏览器:依次按下F10, Down, p, n;

9.尝试 F1/Help:按下F1;

10.打开“粘滞键”对话框:连续五次按下Shift键t;

  1. 防止回车键关闭“粘滞键”对话框:按下向上箭头;

有效载荷3:Shift +单击右键

· 扫描码:e5

· 输出字符率:标准

· 按下执行键:Shift +菜单键

第一个有效载荷非常简单:它依次按下向上箭头,空格键,每个功能键(F1-F12),然后连续六次按下Shift键,然后再按向上箭头。此有效载荷的目的是测试每个功能键以查看它是否提供了访问自助服务终端上的其他功能的方法,然后反复按Shift键以打开“粘滞键”对话框。打开“粘滞键”对话框后,可以再次按下YubiKey上的按钮,按下向上箭头和空格键将打开对话框中的超链接,以导航到Windows的“易于访问”设置。这是我为YubiKey创建的第一个有效载荷,实际***效果特别好。

第二个有效载荷是通过调整功能键的使用来改进第一个有效载荷,以反映它们在常见web浏览器中的功能。例如,按F7然后立即尝试F8有没有意义,因为在大多数浏览器中按F7会出现提示,这可以有效阻止F8在浏览器的上下文中被按下。就像在第一个有效载荷中一样,仍然需要按下每个功能键以及粘滞键序列。这个有效载荷是我在撰写本文时创建的一个新载荷,因此还没有实际测试过。到目前为止,它在实验室环境中运行得很好。

最后,第三个有效载荷只需按Shift键和菜单键。这实际上与按住Shift键并单击鼠标右键的结果是一样的,它使我能够向自助服务终端添加一个单击鼠标右键的操作。如果我可以在资源管理器窗口中单击右键,它还提供了PowerShell或命令提示符的快捷方式。我通常将此有效载荷保留在我的YubiKey上的插槽2中。

总结

本文的示例充分说明了YubiKey是如何从一个可信赖的电子设备演变成为一个工具的,虽然YubiKey是一款出色的双因素身份验证设备,但它肯定缺少一些可以使其成为理想的USB HID工具的功能性,而且已经有其他产品比它做得更好。可能YubiKey作为***工具的主要优势在于它看起来像是YubiKey,在不允许使用闪存驱动器的高安全性环境中,可能会偷偷插入一个YubiKey。在近距离的社会工程场景中,说服员工打开公共Internet kiosk的设备,以便对电子邮件帐户进行“身份验证”,这可能比插入一些无法识别的设备更容易得手。

©著作权归作者所有:来自51CTO博客作者mob604756ebed9f的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. namp ***测试-安装篇
  2. ***武器库---Metasploit***测试框架实战
  3. GitLab最佳实践 -- 集成git-secrets扫描敏感信息
  4. 佳能iC MF4712怎么使用按键【扫描到计算机】
  5. 使用jenkins构建自动化发布系统之Sonar 代码质量管理
  6. 代码质量管理的一些思路
  7. NMAP 使用
  8. Sql Server之旅——第二站 理解讨厌的表扫描
  9. 为何 JVM TLAB 在线程退还给堆的时候需要填充 dummy object

随机推荐

  1. adb 全部命令
  2. (二)Android系统信息
  3. Android 自定义View(手写签名)
  4. Android平台开发-Android keypad map-And
  5. DDM dispatch reg wait timeout , Can't
  6. Android实现随屏幕旋转的TextView
  7. 笔记 RelativeLayout:相对布局管理器:
  8. Android2.2 API 中文文档系列(4) —— Mani
  9. Android单元测试之Local unit tests(下)
  10. Android项目开发一