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.

Le poste

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.

Mode d'emploi 1

Mode d'emploi 2

Oui mais le service ferme ... ou devient payant à 5E/mois pour sauvegarder mes 3 urls de webradios favorites.

Annonce fermeture

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 &gt; 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 vide
  • ven peut être omis
  • fver peut être omis
  • dlang peut être omis
  • Search est un nombre correspond à une StationId

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

http://cgv.wifiradiofrontier.com/setupapp/cgv/asp/BrowseXML/loginXML.asp?gofile=&mac=985aafb6edfdee0850a7993eeeca4627&dlang=fre&fver=4&ven=cgv2

 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>

http://shim-pri.wifiradiofrontier.com/vtuner/portal?&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>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 !

comments powered by Disqus