Лекция

BSides Sofia 2022: Decrypting IPTV

Кадърът е от сървъра на YouTube. Самият плейър — и всичко, което той зарежда — идва едва след като пуснете видеото.

Описание

BSides Sofia 2022: Decrypting IPTV

Many ISPs in Bulgaria are offering IPTV to their customers in
addition to internet services. Usually IPTV is delivered with
a set-top box device (STB) which is connected to the ISP
network and the user's TV.

by Radoslav Gerganov

Описанието е на BSides Sofia.

Препис

Автоматичен препис — може да съдържа грешки — сверявайте с видеото, преди да цитирате. Изтеглен през Supadata от субтитрите на YouTube.

Клик върху времето пуска видеото от този момент.

↗Здравейте всички! Аз съм Радо и в тази презентация ще ви разкажа как може да се декриптират IPTV стримове с разни софтуерни и хардверни хакове.

↗Да се представя с няколко думи. Работя като програмист в VMware, занимавам се с confidential computing, виртуализиране на H7 и coverage-guided fusing. Това презентация искаме да направя дисклемър, че по никакъв начин не говорва от името на VMware. Всичко, което показвам, съм го правил в свободното си време и е свободно постъпно на GitHub, всъщност с повечето неща, които правили извън работа ги публикувам като open source на GitHub. Да започнем с това какво е IPTV. Сигурно всички знаете какво е IPTV. Общото е телевизия, която се деливърва с IP мрежи. В България има от много време вече най-различни IPTV провайдъри.

↗Различни видове контент. Може да се гледат лайвстримове и също така видео-он-деманд.

Покажи целия препис — още 107 абзаца (~3479 думи)

↗Има някаква интерактивност. Там можете да превъртате, да спешите. се спири на пауза, да се пуска, което е прави така по-привлекателна като услуга с прямо тази телевизия, ефирната. И всъщност това, което е много важно с отгледна точка на секьюрити е, че обикновено се деливърва с сет от боксове,

↗за които ще говоря малко по-късно. И се така се използват

↗различен сет от различен набор от протоколи. Различите доставчици ползват

↗различни неща, но в общия случай се ползва IGNP, RTP, RTSP, UDP.

↗В тази презентация всъщност ще покажа... всъщност фокуса ще е върху IPTV услуги, които се достават в България, но като цяло тия неща са валидни in general, понеже софтуерния стек, който се ползва тук, се ползва и на много други места.

↗Как изглежда IPTV диплайната най-общо? Имаме някакъв set-up box, който е свързан към доставчика по LAN и към телевизора по HDMI. И може да се управлява с някакво истинно чурално. Е 1, 2, 3, 1, 2, 3. Сега тук правя предположението, че IPTV провайдъра е същия като интернет сервис провайдъра, който в повечето случаи е така. Понеже е...

↗Повечето случаи контента се деливърва на Multicast, както ще видим. Така че,

↗тук правим асъмпшена, че IPTV и ISP провайдъра е един и същ.

↗Какъв е, ощето къв е секьюрити модела на това нещо? Ами, според мен, от user experience гледно точка, от толкова време имам IPTV, според мен, сърщита на предимно

↗предимно на това, че едва ли не само след топ-боксовете знаят как да плейват този контент. И че след топ-боксовете могат единствения юзер интерфейс, който има потребителя, реално е някакво дистанционно, което клика. И като цяло, ако трябва въобще да се речи на security, true obscurity, това е такъв антипатърн.

↗което всеки знае, че принципно това нещо не работи.

↗И в тази презентация ще ви покажа какви са проблемите.

↗Като цяло проблемите са, че примерно не е нужно да се плаща за някакви допълнителни канали. Повечето на IPTV провайдери имат някакви пакети с телевизионни канали и може да доплащаш да гледаш още.

↗Също това да добавяш още set-то боксове, също не е така безплатно. И като цяло, ще стая ясно, че в общия случай даже не е необходимо да се плаща за IPTV. Но така, първо, какво представлява set-то бокса, който се използва за от IPTV провайдерите. В най-вощия случай е някакво ефтино устройство, произведено в Китай, което въобщето е

↗максимално рязано с цел да е максимално ефтино, което няма нищо лошо в това няма.

↗Почти със сигурност рънба Linux с някакъв ARM систем на чип.

↗И саме интересът е какъв фармулера има. Фармулера също представлява един HTML браузър,

↗и един видеоплеер. И този видеоплеер въобще случай се управлява с някакъв JavaScript. Тук не е типичен видеоплеер, който го има в модерните интернет браузъри. В интернет браузърите вече така е, майче не имаме пев видеоплеер. Не, тук е нещо друго. Този видеоплеер е такъв специално направен за

↗тия девайси. Управлява се от JavaScript и И има някакви там харддверни видеодекодери. Разчитано маха някакви харддверни видеодекодери в общия случай.

↗И другото нещо е всъщност какво представлява юзер интерфейса на това цялото нещо. Оказва се, че представлява всъщност HTML и JavaScript. Тоест това нещо, което го виждате, това всъщност е HTML страница и като цъкаме там с дистанционното, това всъщност е

↗интеракцината с някакъв JavaScript.

↗И понеже започна с малко история, понеже доста време е след да какво... През времето ми е било интересно как работа цялото нещо, както и интернет в началото, голяма част не беше криптиран. Така и през

↗2016-та, когато реших да видя какво върви по мрежата, също се оказа, че реално всичко върви в plaintext. Тук на този скриншот се вижда някакъв дъмп на Large Shark, в който може ясно да видиме, че какво праща след Top Box. Праща някакви команди по RTSP. RTSP е Real Time Streaming Protocol и просто казва, тук е малко транкетното, но казва Play,

↗някакво IP, CH и някакво ID, което е 20 цифра.

↗И всъщност какво се оказва? Ами оказва, че няма никаква сервер сайт-ауторизация. Значи този проблем въобще беше във всяка една презентация от тук. Пропочваме с школа ОБГ, където там може да се оказва, че като сменим някакво ID на подзаявка, може да получим достъп до някакви данни, които не са наши. И после с CV-чарджерите видяхме, че като смениме нещо в рекуеста, може пак да получиме... Общето проблема е, че

↗много често няма сервер с сайта-ауторизация. Това, че си е аутентикиран, означава, че имаш права нещо да правиш. И тук в случая не е

↗точно API, значи в случая IPTV провайдър разчита на това, че само

↗някакви девайси с определени MAC адреси могат да го достъпват. От там нататък всичко е... няма authorization, т.е. ако реша, примерно, да прата заявка за някакъв друг канал, достатъчно е да знам неговото ID. А тези ID-та всичките ги има в JavaScript-та, който върви по мрежите, който също е plain text. Включително и на разни платени канали. И в този момент, въобщето, почнах да си мисля какво може да се направи. Първата ми идея беше просто да смена асет топ-бокса с някакъв мой девайс, който говоря този протокол и който може да плейва целия асет

↗от канали, припочвен, че знам всичките има ID-та. Но това нещо не е много интересно и отнема някакво време. И всъщност

↗това, което е по-лесно да се направи, е просто тези ID-та

↗да ги сменяме с някакъв Man in the middle. Тоест да променяме трафика и просто да реплейсваме ние ID-та с други ID-та. Понеже така или иначе в повечето до IPTV доставщи, примерно 200 канала, 80% така или иначе не стават загледане. Може просто да реплейснеме някакви някакви канали, които не стават с някакви по-интересни, които са платени в общия случай.

↗И за това нещо така направих един малък тул, който се е наречен FQSET, който ползва NetFilter Q библиотеката на Linux. Това е библиотека, която може да интерсептва и модифицира network traffic. И това нещо цялото може да се диплойна на едно Raspberry Pi. Тоест... Имаме едно Raspberry Pi, което стои между доставчика и сетто от бокса, рънва моята програма и реплейсва някакви стрингови. И тук същественото е, че тия ID-та са с фиксирана дължина. Тоест винаги са CH и някакво 20-цифринно число, което до някъде улесня нещата. Изглежда по този начин. Тук на тази снимка някакво Raspberry, което е включено. Билдин на адаптера, нетворк адаптера му е включен към провайдера и има някакъв USB нетворк адаптер, който е включен към сеталбокса. Двата адаптера са бриджнати и рънва тази моята програма, която реално реплейсва някакви стрингове с ченалайдитата. Но всичко това нещо беше преди 6

↗години, не е че толкова интересно, Как работят нещата днес? В момента повечето IPTV доставчици използват Multicast за лайвстримовете. Защо Multicast?

↗Multicast е ефективен заради това, че може един пакет да не пращаш копия до всички абонати, да го изпратиш венъж и мрежвата инфраструктура да го отдаде на всички. И реално се използва IGMP протокола, за да

↗се джойваме към различни Multicast групи, т.е. там се прави Join и Leave, когато случваме някакви канали, реално след ТОП-бок се прави IGMP рекуести.

↗И затова нещо, мали има dedicated Multicast-та има dedicated IP range от 224.0 до 239.255.

↗И всъщност първото нещо, което бихме се опитали да направим е по същия начин да видим какво вари по мрежата. Може да видим, че IP-то, което е от Multicast Range, порта, протокол е RTP. И сега примерно да видим какво става, ако го пленем с VLC и виждаме, че

↗не се вижда нищо. Равно стрима не гледаем.

↗Обаче VOSITO ни дава някаква информация за него.

↗Виждам, всъщност знам колко добре виждате, но VOSITO казва, има аудио стрим, който е MPEG 2, има видео стрим, който е MPEG 2 и същото интересото е, тук показва някакви данни за този стрим. И метът данните са, че Примерно програмата се казва 24 Kitchen и най-интересно което е, че е scrambled. Тоест по някакъв начин криптирана.

↗Това нещо... От къде идват тия метаданни?

↗Използва се MPEG Transport Stream, който представлява мултиплексиране на много така наречени elementary streams. Elementary Stream е Video Stream, Audio Stream и разни Metadata Streamове, от които примерно един от тях е програм Map Table. Този

↗от там може да се вземе името на програмата, както го виждаме, VLC-то не казва, че това е 24 Kitchen. И другите интересни метът данни, които всъщност

↗са най-интересни, е така наречените Entitlement Control Messages or ECM пакети.

↗които участват в декриптирането на контента.

↗Ето по този начин изглежда един MPEG Transport Stream пакет. Общо е 188

↗байта дълъг. Започва с 4 байта header. В началото има SYN byte. И тук интересното е, има два бита в този header, които се наричат Transport Scrambling Control. И те казват дали payload-а който е 184 байта, е скрэмблт, т.е. скриптиран. И всъщност VLC-то, когато ни казва, че

↗е скрэмблт стрим, а всъщност това са тия два бита в хедер, които го показват.

↗Така, и почнат да правим ресурс, че въобще това нещо как работи, каква достъпна информация има за него. Оказва се, че има така нареченото Conditional Access System, or CAS, които представляват стандартни методи за оплоскиране на цифрови стримове и които всъщност най-често се ползват за сателитна телевизия. Има ги листнати в Лукипедия, тук съм извадил някаква много малка част от тях. Идеята е да се дава достъп само на потребители, които са ауторизнати по някакъв начин.

↗И всъщност това, което ползват сателитните телевизии, които ползват Agenda National Access System, е, че има такъв алгоритъм, как казва се, DB Commons Screaming алгоритъм, който реално прави това криптиране. Да, обаче се оказва, че всъщност IPTV IPTV, conditional access системите, всъщност не работят още така. И примерно, тук големите

↗IPTV доставчици, разни телекоми, ползват VeriMatrix вендор, който... Всяка такава система също изима и ID, което също може да се види от мета-даните на стрима. И примерно, аз видях, че ID-то е 5601, по този начин, разбрах, че става въпрос за VeryMatrix,

↗някаква система за криптиране. И сега, нали, в общеседното няма никаква налична информация как работа това нещо. Същност единствената публична информация е това, което съм качив в GitHub, освен някакъв маркетинг там, bullshit. И всъщност,

↗точно това е нещо, че всъщност цялото това нещо работи на базата на това, че хората не знаят какво точно става. И всъщност,

↗ако трябва да погледнем как работи стелитната телевизия, имаме някаква антена, която приема сигнал от спътник. Пак има след това бокс, обаче тук разликата е, че след това бокса има смарт-карта, която си купуваш, за да гледаш някаква услуга. И начинът по който работи това нещо е, че

↗Тези ECM пакети носят така наречените кодворци, които са криптирани и след то боксът ги декриптира с помощта на смарт картата. И съответно получава

↗декриптираните кодворци и с тях декриптира стрима с този алгоритм, който там Common Scrabling алгоритема. Така и сега за IPTV нещата са много подобни. Нямаме сателитна чиния, имаме някакъв провайдър, който пак едно посочно доставя някакъв стрим само че по мултикаст. И имаме C-top box, който няма смарт карти и съответно за да се декриптира този стрим сигурно има някакви ключове някъде, които го декриптират и може вече да се гледа на телевизор. И сега почнах как да разберем от къде издат тия ключове. Единствения начин е да да рутнем бокса и да ревърс инжинирнаме формуера. Така има добре известни начини как може да се рутне някакъв Linux девайс. Най-популярният е да намерим оставена

↗серия на конзола, която на реално са някакви пинова на платката,

↗които може да получим които може да свържеме и да получим достъп до Bootloader или директно RootShell. Това нещо върви на 3PIN, RX, TX и MASA. Единствено трябва да знаем BALDRAID, който също са там разни фиксирани стоености. И повечето такива хардверни вендори оставят

↗такава конзола отворена. и това е най-честия метод за рутване на Linux Device. Другия метод е с JTAG. JTAG е low-level дебъгък интерфейс, който пак вендорите оставят за дебъгване след като девайсът е произведен. С него реално може

↗да тресваме на много ниско ниво, може да променяме execution floor, може да променяме памет, И за тези двата начина,

↗първият, трябва да намерим някакви три пина на платката, за JTAG са повече. Има един туго, който се назва, че JTAG ULator, който може просто да го закачиш към някакви пинове и той да намери тия интерфейс, да каже тия три пина са серия на конзола или тия четири пина са JTAG. Тоест автоматизира до някаква степен това нещо.

↗Най-адвансата начина е с така наречената Power glitch атака. Това е когато подадеме някакъв transient voltage

↗на девайса за няколко nanosecundi, което го кара да си, примерно да скипне някакви инструкции във формуэра или да прескочи някакви чекове.

↗Това е доста advanced. Съзнателя на този JTAGULATOR, Джо Грант,

↗наскоро публикуе едно видео, как при него идва някакъв човек с някакъв хардуер-волет, на който държи ключове за биткоин за няколко милиона долара, на който му е забравил PIN-а. И Джо Грант успява с такава power glitch, така да го отвори доста интересно. Може да го гледате много...

↗Това, което ползвам мас и което работи от 10 години за тия боксът, които ги има в България е... Зимата е на Arduino, махът е му процесора и поставя само като USB to serial converter. Зимата е 3 жици, значи масата се намира много лесно, от граунда се намира много лесно и единствено RX и TX трябва да намерите къде е на платката. Обслед това нещо работи.

↗И получаваме Root Shell. Трябва да погледнем какво има на статалбокса. Има някакъв процесор ARMv6 на О100 МГц. Рънва някакъв много стар керния от 2635. И това нещо има 512 МБ РАМ.

↗И сега въпросът е как да ревърснем формуера. Значи трябва или защо ни е да ревърснем формуера, трябва да отговорим на два основни въпроса. От къде идват ключовете, които декриптират стрима и как се използват. Понеже очевидно не е този Common Screaming algorithm, а нещо друго. В моят случай и двете неща се правиха в една shared library, което се нарича LibVM Client. И тук VM най-често, според мен е скритен от VeryMatrix. Туловета, които използвам аз са

↗за reverse engineering, са Gidra, това е на NSA Tool, Disassembly Deck Compiler

↗и GDB, стандартният дебъггер. Gidra е използвана с статичен анализ, GDB за runtime анализ. Това, което всъщност ви трябва да пуснете GDB сервер на бокса, да го атащнете

↗към процеса на видеоплеера, който всъщност линква това library и на вашата машина да се атащате вече ремонтли към GDB сервера и вече може да слагате breakpoint и да гледате памет и така нататък. Значи,

↗всяко нещо, което по някакъв начин ползва някаква криптография, е много вероятно да ползва OpenSSL. И в случаят още такъв, ако грепнем OpenSSL в стринговете на това лайбрари, ще видим, че се използва OpenSSL версия

↗1.0.0.d. И всъщност метода, който използваме аз, който работи не само за... Като като цяло, нали... според мен е най-популярният, понеже OpenSSL, така очевидно, е статично литнат към това лайбрари, трябва да идентифицираме къде в това лайбрари са OpenSSL функциите, за криптиране, подписване и вече като ги знаем тях, може да сложиме breakpoint-ти с GDB, да видим какви са ключовете и как работа цялото нещо.

↗Всъщност това е някаква част от декомпилирана функция с гидра.

↗Получава се някакъв псевдо си код, който е доста четим. И примерно тук в тази функция може да видим, че някаква функция с 4 параметра. Примерно алокираме някакви данни на стека. На рече 16 сетваме 3-я параметр да е 0. После викаме някаква функция с данните от стека. След това викваме някаква друга функция пак с тия данни, приема на ред 18

↗и с първия параметр. И след това следващата част е,

↗която всъщност е така жокера. Нали на ред 29 виждаме някаква константа п подчертавка sine.c. И след това 0xrmd. А на ред 35

↗п подчертавка sine.c 0x83. Това много прилича да е именно source файл и линия, и линия, нономерна линия. И ако погледнем source-а на OpenSSL, вече знаем версията, че е 00D, просто идем в GitHub, отворим така 00D, намерим файла psign.si и примерно погледнем функцията SignFinal, която се използва за подписване.

↗Ще видим, че тя приема 4 параметра. В началото алокира там някакъв контекст в стека. На ред лос 76 и сетва третия параметр да е 0.

↗И после този контекст вика някакви други функции с него.

↗И по-нататък има някакво utility, което се нарича EVP Error, което всъщност е Macros, който използва File и Line макроса, за да викне някаква функция, която се етва някакви error кодове. И е тук, не знам дали се вижда нещо, но отляло стои декомпилираната функция в Hydra, отясно стои и сорса на EVP Sign Final и може е много ясно така да матчнем. Примерно 0x7d, където беше след P-Sign, е точно 16-тично, е точно 125-ти десетично, както виждаме.

↗0x83 съответства на ред 130.0 в коза на OpenSSL. Т.е. това наистина е така. И по този начин реално можем да видим функциите на OpenSSL, къде са в това library. Можем да сетнем breakpoint и да гледаме какво става. Подписването с OpenSSL се прави с тези три функции. Първо се инициализираме някакъв контекст и някакъв дайджест алгоритъм, после викаме апдейт с някакви данни и накрая казваме Sign Final, като подаваме частния ключ. И нас съобщето ни интересува този частен ключ. След като сме идентифицирали коя функция е Sign Final, може да сложим breakpoint и да видиме какъв е частния ключ и съответно какво се подписва с него. И първо След като имаме този RSA Key, което също се използва за Authentication,

↗вече какъв е протокола за да вземеме самите Channel Key, с които е критиран стрима. И тук има някакъв много Basic протокол, което някой е дизайнвал през 90-те години сигурно.

↗Този Key Server, който аз наричам VCAS. Първо, бокса

↗му казва, нали, дай ми сешен ключ, това ми е MAC адреса, той връща някакъв RC4, това е такъв стрим, Cypher ключ и някакъв таймстамп,

↗и после боксът казва, дай ми всички ключове,

↗и прави MD5 на този таймстамп, подписва го с RSA ключа и го криптира с RC4 и сешен ключа, и в резултат на това получава всички ченалки, един ченалки представлява 128 битов симметричен IS-ключ.

↗И това цялото нещо, понеже провайдерите реално разрешават този кейс сервер да го аксесва само след това боксовете, т.е. направили някакви firewall проява само за техните MAC адреси. Това, което правя аз е да използвам S-Sage и да и бокса като JumpHost.

↗Пускаме порт-форвардинг с SSH на това IP и на тия портове. Вече може да викаме, може да, приема с скрипта, който тегли ключовете, да го равнаме срещу localhost. По този начин заобикаляме този

↗firewall на провайдера. Как се ползват тези channel keys?

↗Чанал Киа декриптира ECM пакетите. ECM пакетите декриптират два ключа,

↗четен и нечетен, и тези ключа декриптират TS пакетите. Като

↗чанал Киовете се сменят на всеки 24 час, другите два ключа се ротейтват на всеки 10 секунди и това нещо е достатъчно. Цялото това нещо съм го имплементирал в една малка програмка на моя GitHub, каза се VND Crypt.

↗Проблема с цялото нещо е, че тези channel kill-ве, те се ротейтват на 24

↗часи и може много лесно да се share-ват. Тоест достатъчно

↗някой, който ги е изтеглил, да ги качи някъде и после всеки

↗всеки, който има достъп до Multicast стримовете, може да ги декриптира. А всъщност се оказва, че тия криптирани Multicast стримове стигат до абсолютно всички клиенти на провайдера. Не само тези, които се плащат за IPTV, ами до всички. Тоест достатъчно е един човек да ги публикува веднъж на 24 части ключове и въобще всички могат да гледат free. Този...

↗Същия хак го има и за сателитната телевизия, там със шерването на ключовето с смарт картите. И като накрая, какво трябва да обобщи, Security, True Obscurity

↗обикновено не работи. Както видяхме, трябва ни освен на authentication също и authorization.

↗Това нещо с този проблем, някакви някакъв контент да се деливърва на Multicast криптиран и разни хостове да го декриптират. Същност се нарича Multicast Encryption. Няки хора са го изследвали, има писани стати по въпроса. Не е прост проблем.

↗И според мен е едно от потенциалните решения на това нещо, за да стане Secure с Confidential Computing. Това въобщето представлява използването на

↗на това, което съвремените процесори имат като Secure Enclaves, примерно ARM имат, Тразон, Intel имат SGX, AMD имат SEV. Общото това е някаква технология, която позволява някакъв код да се рънва в изолация и да не може просто да започиш и дебагер към него, нищо, че си рулт. И това е всичко, което имам, ако имате въпроси.

↗Ами не. Всъщност това, което наблюдавам аз е, че абсолютно всички канали, платени, тези, които се доплащат, те върват на Multicast. Просто Провайдър, който прави е просто да каже на все то бокса вече да ги плейва и тях. Тоест, ако нищо не ти пречи, ако имаш киловете, да гледаш абсолютно всички канали, които този доставчик предлага.

↗Да. Да, като етикейшно става по макът, раз така че би трябва да работи. Да.

↗Да.

↗Да, за всяк филионукс устройство работа.

↗Ок бъдаря.

← Всички лекции