Hacker la radio CGV dr30i
Le poste de radio FM/DAB/WEB CGV dr30i est de très bonne facture mais la fonctionnalité de gestion des urls favorites va s'arrêter suite à changement de politique de l'éditeur du service. Essayons de voir ce qu'on peut faire ...
Je possède depuis plusieurs années ce petit poste de radio bien sympathique. Je l'utilise principalement en mode web, car en intérieur la réception FM ou DAB+ n'était pas satisfaisante.
La base de données des urls des webradios est externe, elle dépend d'un service sur internet. La sauvegarde de nos urls favorites est également externalisée. On appelle ce service à chaque démarrage du poste pour retrouver notre session. Pour ajouter des urls custom (pas référencées dans leur base centrale) on utilise aussi ce service externe.
Oui mais le service ferme ... ou devient payant à 5E/mois pour sauvegarder mes 3 urls de webradios favorites.
La colère passée, on se rapelle que tout objet connecté est plus ou mois dépendant d'un service externe, et quand il ferme, et bien on l'a dans le baba ...
L'appareil étant un lecteur de webradio, la connectivité internet est nécessaire, mais pas forcement la dépendance à ce service tiers. Ne pourrait-on pas s'en passer, ou de le simuler localement pour retrouver la liberté d'utilisation du poste ?
Écouter le trafic réseau
Le 1er réflexe est d'écouter le dialogue réseau entre l'appareil et l'internet.
L'appareil est connecté au LAN en DHCP, et je dispose d'un accès SSH au routeur/serveur DHCP (un raspberry pi). Je m'y connecte.
On va installer l'outil wireshark
en ligne de commande
1apt install tshark
à noter que le user doit appartenir au groupe wireshark
pour qu'il puisse exécuter la commande.
1sudo usermod -a -G wireshark pi
Et maintenant lançons la commande, en filtrant juste le protocole http
(on suppose que les interactions passent uniquement par là), et manipulons la radio (allumage, choix de la station, arrêt ...)
1tshark -Y "http.request" -T fields -e http.request.method -e http.host -e http.request.uri -e http.response.code
2Capturing on 'eth0'
3GET cgv.wifiradiofrontier.com /setupapp/cgv/asp/BrowseXML/loginXML.asp?token=0
4GET cgv2.wifiradiofrontier.com /setupapp/cgv/asp/BrowseXML/loginXML.asp?token=0
5GET cgv.wifiradiofrontier.com /setupapp/cgv/asp/BrowseXML/Search.asp?sSearchtype=3&Search=6396916252560914&mac=985aafb6edfdee0850a7993eeeca4627&dlang=eng&fver=4&ven=cgv2
6GET shim-pri.wifiradiofrontier.com /vtuner/radio/6396916252560914/play/fr_4_cgv2?
7GET icecast.radiofrance.fr /franceinter-midfi.mp3?id=airable
8GET icecast.radiofrance.fr /franceinter-midfi.mp3?id=airable
Rejouons ces requêtes avec un ordinateur
1GET http://cgv.wifiradiofrontier.com/setupapp/cgv/asp/BrowseXML/loginXML.asp?token=0
retourne un xml de token
1<EncryptedToken>3a3f5ac48a1dab4e</EncryptedToken>%
tjrs le même ? http 200, pas de cookie déposé ... X-Server: eps-airable-2 X-Via: eps-haproxy-1
1curl -v "http://cgv.wifiradiofrontier.com/setupapp/cgv/asp/BrowseXML/loginXML.asp?token=0"
2* Trying 185.128.204.57:80...
3* Connected to cgv.wifiradiofrontier.com (185.128.204.57) port 80
4> GET /setupapp/cgv/asp/BrowseXML/loginXML.asp?token=0 HTTP/1.1
5> Host: cgv.wifiradiofrontier.com
6> User-Agent: curl/8.4.0
7> Accept: */*
8>
9< HTTP/1.1 200 OK
10< Server: nginx/1.18.0 (Ubuntu)
11< Date: Sun, 05 Nov 2023 15:08:24 GMT
12< Content-Type: text/html;charset=UTF-8
13< Content-Length: 49
14< X-Server: eps-airable-1
15< X-Via: eps-haproxy-1
16<
17* Connection #0 to host cgv.wifiradiofrontier.com left intact
18<EncryptedToken>3a3f5ac48a1dab4e</EncryptedToken>
1GET http://cgv2.wifiradiofrontier.com/setupapp/cgv/asp/BrowseXML/loginXML.asp?token=0
retourne un token ? ex: "3a3f5ac48a1dab4e"
1curl -v "http://cgv2.wifiradiofrontier.com/setupapp/cgv/asp/BrowseXML/loginXML.asp?token=0"
2* Trying 217.33.180.97:80...
3* Connected to cgv2.wifiradiofrontier.com (217.33.180.97) port 80
4> GET /setupapp/cgv/asp/BrowseXML/loginXML.asp?token=0 HTTP/1.1
5> Host: cgv2.wifiradiofrontier.com
6> User-Agent: curl/8.4.0
7> Accept: */*
8>
9< HTTP/1.1 200 OK
10< Server: nginx/1.18.0 (Ubuntu)
11< Date: Sun, 05 Nov 2023 15:08:38 GMT
12< Content-Type: text/html;charset=UTF-8
13< Content-Length: 49
14< X-Server: har-airable-1
15< X-Via: har-haproxy-2
16<
17* Connection #0 to host cgv2.wifiradiofrontier.com left intact
18<EncryptedToken>3a3f5ac48a1dab4e</EncryptedToken>
1GET http://cgv.wifiradiofrontier.com/setupapp/cgv/asp/BrowseXML/Search.asp?sSearchtype=3&Search=6396916252560914&mac=985aafb6edfdee0850a7993eeeca4627&dlang=eng&fver=4&ven=cgv2
retourne un xml
1<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2<ListOfItems>
3 <ItemCount>1</ItemCount>
4 <Item>
5 <ItemType>Previous</ItemType>
6 <UrlPrevious>http://shim-pri.wifiradiofrontier.com/?</UrlPrevious>
7 <UrlPreviousBackUp>http://shim-sec.wifiradiofrontier.com/?</UrlPreviousBackUp>
8 </Item>
9 <Item>
10 <ItemType>Station</ItemType>
11 <StationId>6396916252560914</StationId>
12 <StationName>France Inter</StationName>
13 <StationUrl>http://shim-pri.wifiradiofrontier.com/vtuner/radio/6396916252560914/play/fr_4_cgv2?</StationUrl>
14 <StationDesc>Info, culture, musique, humour</StationDesc>
15 <StationFormat>Public-Community, Cultural, Daily News</StationFormat>
16 <StationLocation>France > Paris</StationLocation>
17 <Logo>http://airableassets-cdn.wifiradiofrontier.com/png@150x150/63/96/916252560914.png</Logo>
18 <StationBandWidth>128</StationBandWidth>
19 <StationMime>MP3</StationMime>
20 <Relia>5</Relia>
21 <Bookmark>http://shim-pri.wifiradiofrontier.com/vtuner/favorites/radio/6396916252560914/create?</Bookmark>
22 </Item>
23</ListOfItems>
Si on fait un GET
sur l'url contenue dans <StationUrl>
:
1 curl -v "http://shim-pri.wifiradiofrontier.com/vtuner/radio/6396916252560914/play/fr_4_cgv2?"
2* Host shim-pri.wifiradiofrontier.com:80 was resolved.
3* IPv6: (none)
4* IPv4: 185.128.204.57
5* Trying 185.128.204.57:80...
6* Connected to shim-pri.wifiradiofrontier.com (185.128.204.57) port 80
7> GET /vtuner/radio/6396916252560914/play/fr_4_cgv2? HTTP/1.1
8> Host: shim-pri.wifiradiofrontier.com
9> User-Agent: curl/8.5.0
10> Accept: */*
11>
12< HTTP/1.1 200 OK
13< Server: nginx/1.18.0 (Ubuntu)
14< Date: Sun, 17 Dec 2023 00:07:44 GMT
15< Content-Type: audio/x-mpegurl
16< Content-Length: 62
17< X-Server: eps-airable-1
18< X-Via: eps-haproxy-1
19<
20* Connection #0 to host shim-pri.wifiradiofrontier.com left intact
21http://icecast.radiofrance.fr/franceinter-midfi.mp3?id=airable
note: Airable est une marque dont Frontier Silicon utilise l'api . cf. https://www.airablenow.com/airable/airable-api/#close
puis double GET sur l'url de stream
Test de l'url
1curl -v "http://cgv2.wifiradiofrontier.com/setupapp/cgv/asp/BrowseXML/Search.asp"
2* Trying 217.33.180.97:80...
3* Connected to cgv2.wifiradiofrontier.com (217.33.180.97) port 80
4> GET /setupapp/cgv/asp/BrowseXML/Search.asp HTTP/1.1
5> Host: cgv2.wifiradiofrontier.com
6> User-Agent: curl/8.4.0
7> Accept: */*
8>
9< HTTP/1.1 500 Internal Server Error
10< Server: nginx/1.18.0 (Ubuntu)
11< Date: Sun, 05 Nov 2023 15:10:41 GMT
12< Content-Type: text/plain; charset=utf-8
13< Transfer-Encoding: chunked
14< X-Server: har-airable-2
15< X-Via: har-haproxy-2
16<
17Error
18Call to a member function xmlSerialize() on null
190
20/data/www/src/vTuner/Http/Middleware/DispatchMiddleware.php:270
21#0 /data/www/vendor/zendframework/zend-stratigility/src/Next.php(52): vTuner\Http\Middleware\DispatchMiddleware->process()
22#1 /data/www/vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(83): Zend\Stratigility\Next->handle()
23#2 /data/www/vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(72): Zend\Stratigility\MiddlewarePipe->process()
24#3 /data/www/public/vtuner/app.php(140): Zend\Stratigility\MiddlewarePipe->handle()
25#4 /data/www/public/vtuner/app.php(209): {closure}()
26* Connection #0 to host cgv2.wifiradiofrontier.com left intact
27#5 {main}
On apprend que :
- erreur en prod pas cachée
- app php basée sur le framework zend
- ubuntu et nginx
ajout du param sSearchType=3 ? (à quoi ça correspond ?)
1 curl -v "http://cgv2.wifiradiofrontier.com/setupapp/cgv/asp/BrowseXML/Search.asp?sSearchtype=3"
2* Trying 217.33.180.97:80...
3* Connected to cgv2.wifiradiofrontier.com (217.33.180.97) port 80
4> GET /setupapp/cgv/asp/BrowseXML/Search.asp?sSearchtype=3 HTTP/1.1
5> Host: cgv2.wifiradiofrontier.com
6> User-Agent: curl/8.4.0
7> Accept: */*
8>
9< HTTP/1.1 500 Internal Server Error
10< Server: nginx/1.18.0 (Ubuntu)
11< Date: Sun, 05 Nov 2023 15:14:12 GMT
12< Content-Type: text/plain; charset=utf-8
13< Transfer-Encoding: chunked
14< X-Server: har-airable-1
15< X-Via: har-haproxy-2
16<
17NoticeException
18Trying to access array offset on value of type null
190
20/data/www/src/vTuner/Http/Controller/Radio.php:382
21#0 /data/www/src/vTuner/Http/Controller/Radio.php(382): {closure}()
22#1 /data/www/src/vTuner/Http/Controller/Radio.php(460): vTuner\Http\Controller\Radio->update()
23#2 /data/www/src/vTuner/Http/Controller/Search.php(68): vTuner\Http\Controller\Radio->one()
24#3 [internal function]: vTuner\Http\Controller\Search->index()
25#4 /data/www/vendor/php-di/invoker/src/Invoker.php(82): call_user_func_array()
26#5 /data/www/vendor/php-di/php-di/src/Container.php(268): Invoker\Invoker->call()
27#6 /data/www/src/vTuner/Http/Middleware/DispatchMiddleware.php(255): DI\Container->call()
28#7 /data/www/vendor/zendframework/zend-stratigility/src/Next.php(52): vTuner\Http\Middleware\DispatchMiddleware->process()
29#8 /data/www/vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(83): Zend\Stratigility\Next->handle()
30#9 /data/www/vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(72): Zend\Stratigility\MiddlewarePipe->process()
31#10 /data/www/public/vtuner/app.php(140): Zend\Stratigility\MiddlewarePipe->handle()
32#11 /data/www/public/vtuner/app.php(209): {closure}()
33* Connection #0 to host cgv2.wifiradiofrontier.com left intact
34#12 {main}
mac
doit être setté, même avec chaines videven
peut être omisfver
peut être omisdlang
peut être omisSearch
est un nombre correspond à uneStationId
mac de la radio : 00:22:61:92:7f:cd (vendor Frontier Silicon Ltd)
User-Agent: FSL IR/0.1\r\n
User-Agent: NSPlayer/8.0.0.3801\r\n
User-Agent: NSPlayer/8.0.0.3801\r\n
icy-metadata:1\r\n
diverses analyses de paquets
1tshark -Y "http.request" -f "tcp port 80" -V
1$ tshark -Y "http.request" -Y "ip.src==192.168.1.108 and http" -T fields -E separator="|" -e ip.src -e http.user_agent -e http.request.method -e http.host -e http.request.uri -e http.response.code
2192.168.1.108|FSL IR/0.1|GET|cgv.wifiradiofrontier.com|/setupapp/cgv/asp/BrowseXML/loginXML.asp?token=0|
3192.168.1.108|FSL IR/0.1|GET|cgv2.wifiradiofrontier.com|/setupapp/cgv/asp/BrowseXML/loginXML.asp?token=0|
4192.168.1.108|FSL IR/0.1|GET|cgv.wifiradiofrontier.com|/setupapp/cgv/asp/BrowseXML/Search.asp?sSearchtype=3&Search=6396916252560914&mac=985aafb6edfdee0850a7993eeeca4627&dlang=eng&fver=4&ven=cgv2|
5192.168.1.108|NSPlayer/8.0.0.3801|GET|shim-pri.wifiradiofrontier.com|/vtuner/radio/6396916252560914/play/fr_4_cgv2?|
6192.168.1.108|NSPlayer/8.0.0.3801|GET|icecast.radiofrance.fr|/franceinter-midfi.mp3?id=airable|
7192.168.1.108|NSPlayer/8.0.0.3801|GET|icecast.radiofrance.fr|/franceinter-midfi.mp3?id=airable|
Navigation dans les stations
1<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2<ListOfItems>
3 <ItemCount>-1</ItemCount>
4 <Item>
5 <ItemType>Dir</ItemType>
6 <Title>Préférés</Title>
7 <UrlDir>http://shim-pri.wifiradiofrontier.com/vtuner/radios/favorites?</UrlDir>
8 <UrlDirBackUp>http://shim-sec.wifiradiofrontier.com/vtuner/radios/favorites?</UrlDirBackUp>
9 </Item>
10 <Item>
11 <ItemType>Dir</ItemType>
12 <Title>Locales France</Title>
13 <UrlDir>http://shim-pri.wifiradiofrontier.com/vtuner/radios/country/2408525426872074?</UrlDir>
14 <UrlDirBackUp>http://shim-sec.wifiradiofrontier.com/vtuner/radios/country/2408525426872074?</UrlDirBackUp>
15 </Item>
16 <Item>
17 <ItemType>Dir</ItemType>
18 <Title>Stations</Title>
19 <UrlDir>http://shim-pri.wifiradiofrontier.com/vtuner/radios?</UrlDir>
20 <UrlDirBackUp>http://shim-sec.wifiradiofrontier.com/vtuner/radios?</UrlDirBackUp>
21 </Item>
22 <Item>
23 <ItemType>Dir</ItemType>
24 <Title>Podcasts</Title>
25 <UrlDir>http://shim-pri.wifiradiofrontier.com/vtuner/feeds?</UrlDir>
26 <UrlDirBackUp>http://shim-sec.wifiradiofrontier.com/vtuner/feeds?</UrlDirBackUp>
27 </Item>
28 <Item>
29 <ItemType>Dir</ItemType>
30 <Title>Mes stations ajoutées</Title>
31 <UrlDir>http://shim-pri.wifiradiofrontier.com/vtuner/streams/favorites?</UrlDir>
32 <UrlDirBackUp>http://shim-sec.wifiradiofrontier.com/vtuner/streams/favorites?</UrlDirBackUp>
33 </Item>
34 <Item>
35 <ItemType>Dir</ItemType>
36 <Title>Aide</Title>
37 <UrlDir>http://shim-pri.wifiradiofrontier.com/vtuner/help?</UrlDir>
38 <UrlDirBackUp>http://shim-sec.wifiradiofrontier.com/vtuner/help?</UrlDirBackUp>
39 </Item>
40</ListOfItems>
1<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2<ListOfItems>
3 <ItemCount>3</ItemCount>
4 <Item>
5 <ItemType>Display</ItemType>
6 <Display>Service change</Display>
7 </Item>
8 <Item>
9 <ItemType>Display</ItemType>
10 <Display>please refer to</Display>
11 </Item>
12 <Item>
13 <ItemType>Display</ItemType>
14 <Display>https://nuvola.link/srs-en</Display>
15 </Item>
16</ListOfItems>
--> https://subscriptions.frontier-nuvola.net/portal/en/home
Recherche EEE
http://shim-pri.wifiradiofrontier.com|/setupapp/fs/asp/BrowseXML/Search.asp?sSearchtype=2&search=EEE&startItems=1&endItems=100&mac=985aafb6edfdee0850a7993eeeca4627&dlang=fre&fver=4&ven=cgv2
1<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2<ListOfItems>
3 <ItemCount>4</ItemCount>
4 <Item>
5 <ItemType>Previous</ItemType>
6 <UrlPrevious>http://shim-pri.wifiradiofrontier.com/vtuner/radios?</UrlPrevious>
7 <UrlPreviousBackUp>http://shim-sec.wifiradiofrontier.com/vtuner/radios?</UrlPreviousBackUp>
8 </Item>
9 <Item>
10 <ItemType>Station</ItemType>
11 <StationId>1956157926470041</StationId>
12 <StationName>Radio Freee</StationName>
13 <StationUrl>http://shim-pri.wifiradiofrontier.com/vtuner/radio/1956157926470041/play/fr_4_cgv2?</StationUrl>
14 <Bookmark>http://shim-pri.wifiradiofrontier.com/vtuner/favorites/radio/1956157926470041/create?</Bookmark>
15 </Item>
16 <Item>
17 <ItemType>Station</ItemType>
18 <StationId>7232861715834589</StationId>
19 <StationName>Feeesfun Radio - laut.fm</StationName>
20 <StationUrl>http://shim-pri.wifiradiofrontier.com/vtuner/radio/7232861715834589/play/fr_4_cgv2?</StationUrl>
21 <Bookmark>http://shim-pri.wifiradiofrontier.com/vtuner/favorites/radio/7232861715834589/create?</Bookmark>
22 </Item>
23 <Item>
24 <ItemType>Station</ItemType>
25 <StationId>7959072413388640</StationId>
26 <StationName>Tipeee - La start-up radio</StationName>
27 <StationUrl>http://shim-pri.wifiradiofrontier.com/vtuner/radio/7959072413388640/play/fr_4_cgv2?</StationUrl>
28 <Bookmark>http://shim-pri.wifiradiofrontier.com/vtuner/favorites/radio/7959072413388640/create?</Bookmark>
29 </Item>
30 <Item>
31 <ItemType>Station</ItemType>
32 <StationId>3097998842131346</StationId>
33 <StationName>Daydeeeurodance - laut.fm</StationName>
34 <StationUrl>http://shim-pri.wifiradiofrontier.com/vtuner/radio/3097998842131346/play/fr_4_cgv2?</StationUrl>
35 <Bookmark>http://shim-pri.wifiradiofrontier.com/vtuner/favorites/radio/3097998842131346/create?</Bookmark>
36 </Item>
37</ListOfItems>
Idée :
- intercepter certains domaines, et les simuler localement
À suivre ... stay tuned !