|
本帖最后由 op351 于 2023-12-1 08:14 编辑
地区: 苏州
盒子型号:创维E900-S
IPTV原始连接方式:通过光猫的IPTV口进行DHCP分配(IPOE)
步骤1
将iptv盒子插入带有端口镜像和vlan划分功能的网管交换机或其他带有此功能的路由器和特殊设备
这里以网件交换机为例
1.划分vlan,为光猫的iptv口和iptv盒子划分单独的vlan
2.端口镜像
步骤2
电脑下载Wireshark软件,选择电脑网卡
步骤3
打开电视,打开iptv盒子,看30秒直播,然后点击回看,选择节目回看,看30秒,关闭盒子,关闭电视。
步骤4
Wireshark停止捕获
点击文件 保存 以备后面慢慢研究
步骤5
1.将光猫的iptv网线接入openwrt路由器,接口命名为iptv,安装udpxy,实现直播源igmp转换为http(站内教程很多,自行参考实现)
2.路由器安装mwan3,对流量进行分流,将iptv专网流量导入到iptv口输出(站内教程很多,参考双wan,多wan,多运营商出口分流之类的教程)
3.在mwan3管理界面将以下目标地址分流到iptv专网
4.在DHCP/DNS选项卡中写入iptv专网dns
步骤6
分析流量,在PC端重现iptv获取回看地址流程。
1.搜索DHCP,获取盒子IP
2.搜索盒子的HTTP和RTSP流量
搜索关键词为 ip.addr == 盒子IP && (http || rtsp)
滚动到最上面 找到/registerData/registerData.ac 右键选择追踪流 HTTP Stream
打开之后会看到如下报文
- <font size="3"><font size="3">POST /registerData/registerData.ac HTTP/1.1
- Connection: close
- Accept: */*
- Content-Type: application/x-www-form-urlencoded; charset=utf-8
- Content-Length: 203
- Host: 180.100.136.13:9000
- Accept-Encoding: gzip
- User-Agent: okhttp/3.4.1
- opt=100&data=xxxxxx|10.x.x.x|0|xxxxx-xxxx-xxxx-xxxx-xxxxxxxxx||xx:xx:xx:xx:xx:xx|20xx|1.0.15|E900|4.4.2|0|SKYWORTH|Hi3798MV100|xxxx|xxxx|1920*1080|0|QM|3.1.1.11.02</font></font>
复制代码 这里的10.x.x.x即为iptv的ip 在后面的重现中,请替换为路由器iptv口的最新ip
data=xxxxx中的xxxx为机顶盒背后贴纸上的序列号
xx:xx:xx:xx:xx:xx为机顶盒mac地址
重现软件选择postman,方便后期制作脚本直接导出curl或python代码。
重现过程中请注意将原始报文中http请求头,报文body进行复制,并选择http method为post
点击send
如果返回值为以下数据,则证明mwan3分流正确
我们移步下一个请求
url为/auth?UserID=iptv账号&Action=Login&Mode=MENU
- <font size="3"><font size="3">GET /auth?UserID=iptv账号&Action=Login&Mode=MENU HTTP/1.1
- Host: itv.jsinfo.net:8298
- Connection: keep-alive
- Pragma: no-cache
- Cache-Control: no-cache
- Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
- User-Agent: Mozilla/5.0 (X11; Linux x86_64; SkyworthBrowser) AppleWebKit/534.24 (KHTML, like Gecko) Safari/534.24 SkWebKit-JS-CTC
- Accept-Encoding: gzip,deflate
- Accept-Language: zh-cn,en-us,en
- HTTP/1.1 200 OK
- Server: Apache-Coyote/1.1
- Content-Type: text/html;charset=gb2312
- Content-Length: 706
- Date:
- xxxxxxAuthentication.CTCGetAuthInfo('xxxxxxxxxxxxxxxxxxxxxxxxx')xxxxxxxxxxxx</font></font>
复制代码 这一步中出现了一个重要方法Authentication.CTCGetAuthInfo('xxxxxxxxxxxxxxxxxxxxxxxxx')
我们要使用这个方法的入参xxxx来生成后面请求中要用到的UserToken
生成UserToken的方法论坛也有不少帖子,其中核心就是获取iptv盒子系统里的密码字段,然后利用密码对字段“任意8位数$CTCGetAuthInfo入参$iptv账号$序列号$ip地址$mac地址$$CTC”进行加密,密文则为UserToken
获取iptv盒子系统里的密码字段的手段有两种.
1.开启盒子ADB,使用公对公USB线对盒子进行adb连接,从文件系统中获取密码,顺带拆包iptv软件,获取加密算法。
2.在已知密码为8位纯数字和加密算法的情况下进行爆破。
这里我们选择第一种方法,
(以下内容机顶盒均不需要联网,放电脑边上插开机即可)
盒子开启ADB的方法为按设置按钮,输入密码6321,切到其他设置,系统升级,按右方向键直到出现USB调试
开启ADB后,使用USB线将盒子与电脑连接,usb线可以自购,也可以剪两条四芯usb线将两个公头连接到一起。
在电脑上下载ADB浏览器 网址为https://github.com/Alex4SSB/ADB-Explorer
打开软件 将目录定位到/mnt/skparam
右键pull到本地电脑目录
用notepad++或记事本打开即可
搜索password字段,即可得到iptv的密码
得到iptv密码后,网上搜des在线加密 运算模式选ECB 密钥为iptv密码,对“任意8位数$CTCGetAuthInfo入参$iptv账号$序列号$ip地址$mac地址$$CTC”进行加密
输出密文后,我们再回到wireshark
定位url /uploadAuthInfo
报文如下
- <font size="3"><font size="3">POST /uploadAuthInfo HTTP/1.1
- Host: itv.jsinfo.net:8298
- Connection: keep-alive
- Content-Length: 344
- Pragma: no-cache
- Cache-Control: no-cache
- Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
- Origin: http://itv.jsinfo.net:8298
- User-Agent: Mozilla/5.0 (X11; Linux x86_64; SkyworthBrowser) AppleWebKit/534.24 (KHTML, like Gecko) Safari/534.24 SkWebKit-JS-CTC
- Content-Type: application/x-www-form-urlencoded
- Referer: http://itv.jsinfo.net:8298/auth?UserID=xxxx&Action=Login&Mode=MENU
- Accept-Encoding: gzip,deflate
- Accept-Language: zh-cn,en-us,en
- UserID=xxxxxx&Authenticator=xxxxxx&AccessMethod=dhcp&AccessUserName=xxxx</font></font>
复制代码 这里的Authenticator字段即为上一步中的密文,在重现中要进行替换,其他字段不变(注意此请求为POST)
重现后得到如下回复报文
- <font size="3"><font size="3">HTTP/1.1 200 OK
- Server: Apache-Coyote/1.1
- Set-Cookie: UserToken=xxxxxxxx; Path=/
- Content-Type: text/html;charset=gb2312
- Content-Length: 831
- Date:
- <html><head><script language='javascript'>function AuthFinish(){Authentication.CTCSetConfig ('UserToken','xxxxxxxx')xxxx</font></font>
复制代码 这里报文头和报文体中的UserToken为后面请求的cookie中的UserToken字段,如使用postman 则不需要自己设置 postman会自动将此cookie带入到后面的请求中
下一个请求获取另一个重要字段JSESSIONID
定位url /iptvepg/function/index.jsp?loadbalanced= (loadbalance url)
发现此url后面还有一堆参数loadbalanced=1&UserIP=xxx&UserID=xxxx&UserToken=xxxx&STBID=xxxx&LastTermno=&easip=xxxxxx&networkid=1
这里UserIP,UserID,UserToken,STBID固定已知,easip动态未知
于是在wireshark中定位此请求的上一个请求url /iptvepg/function/index.jsp?UserGroupNMB (UserGroupNMB url)
这个url同样出现了动态字段UserGroupNMB
于是再往上定位url /getServiceList
发现此url的返回报文即为上面的UserGroupNMB url
- <font size="3"><font size="3">GET /getServiceList HTTP/1.1
- Host: itv.jsinfo.net:8298
- Connection: keep-alive
- Pragma: no-cache
- Cache-Control: no-cache
- Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
- User-Agent: Mozilla/5.0 (X11; Linux x86_64; SkyworthBrowser) AppleWebKit/534.24 (KHTML, like Gecko) Safari/534.24 SkWebKit-JS-CTC
- Referer: http://itv.jsinfo.net:8298/getChannelList
- Accept-Encoding: gzip,deflate
- Accept-Language: zh-cn,en-us,en
- Cookie: UserToken=xxxx
- HTTP/1.1 200 OK
- Server: Apache-Coyote/1.1
- Content-Type: text/html;charset=gb2312
- Content-Length: 358
- Date:
- xxxxxxx'http://eas.itv.jsinfo.net:33200/iptvepg/function/index.jsp?UserGroupNMB=xxxxxxxxx</font></font>
复制代码 所以从这个url开始重现 获取到http://eas.itv.jsinfo.net:33200/ ... rGroupNMB=xxxxxxxxx直接复制到下一个重现栏中
http://eas.itv.jsinfo.net:33200/iptvepg/function/index.jsp?UserGroupNMB重现完成后
在返回的报文中最下面即为loadbalance url 复制到下一个重现tab中
在重现loadbalance url之后 JSESSIONID已被postman自动设置到cookie中,至此最重要的两个cookie获取完成
经过实验,发现JSESSIONID有效期较短,注意经常刷新。
下面我们跳过直播源获取的url 直接进入回看环节
(2023.12.1): 不能跳过这步 这一步的认证也是需要的 请自行重现 以获取服务端认证
直播源获取主要url为
/iptvepg/function/funcportalauth.jsp
/iptvepg/function/frameset_judger.jsp
/iptvepg/function/frameset_builder.jsp
其中funcportalauth和frameset_judger为验证api 需在最后的直播源frameset_builder.jsp的前方进行请求
点播
(2023.12.1)还需再前置请求一个url /iptvepg/frame224/huikan_detail.jsp?mixno=001
点播需要请求的第一个url为/iptvepg/frame224/datas/get_channel_tvod_data.jsp
报文如下
- <font size="3">GET /iptvepg/frame224/datas/get_channel_tvod_data.jsp HTTP/1.1
- Host: 180.100.93.38:33200
- Connection: keep-alive
- Pragma: no-cache
- Cache-Control: no-cache
- User-Agent: Mozilla/5.0 (X11; Linux x86_64; SkyworthBrowser) AppleWebKit/534.24 (KHTML, like Gecko) Safari/534.24 SkWebKit-JS-CTC
- Accept: */*
- Referer: http://180.100.93.38:33200/iptvepg/frame224/huikan_detail.jsp?mixno=001
- Accept-Encoding: gzip,deflate
- Accept-Language: zh-cn,en-us,en
- Cookie: JSESSIONID=xxxxxx
- HTTP/1.1 200 OK
- Date:
- Content-Type: text/html;charset=GBK
- Transfer-Encoding: chunked
- Connection: keep-alive
- Vary: Accept-Encoding
- X-Frame-UserToken:
- X-Frame-UserID:
- X-Frame-SessionID:
- X-Frame-Options: SAMEORIGIN
- Content-Encoding: gzip
- [{"name":"CCTV1-HD","chanid":"ch00000000000000000297",</font>
复制代码 可以看到 此返回体中出现了电视台列表 对应的chanid等参数
下面我们以CCTV1-HD频道为例
下一个url为 /iptvepg/frame224/datas/get_tvod_programe_data.jsp?channelid=ch00000000000000000297&index=-1&channelName=CCTV1-HD
其中channelid即为前一步中的chanid,可替换为其他频道
channelName也可一并替换为前一步中的name
index代表日期 -1即代表昨天 -2为前天 -3以此类推即可
这里我们以11月29日播出的电视剧人世间第29集为例
返回体如下
- {
- "StartTime": "09:26",
- "EndTime": "10:14",
- "ContentId": "11SCHEcp000011231128000228477555",
- "Playable": true,
- "ProgramName": "人世间(29)",
- "tvod": "1"
- },
复制代码 比较重要的参数为StartTime EndTime ContentId
最后一步
url为/iptvepg/frame224/get_tvod_url.jsp?contentId=xxx&channelId=xxxxx&stime=xxxx&adPositionId=xxxx
报文为
- <blockquote><blockquote>GET /iptvepg/frame224/get_tvod_url.jsp?contentId=11SCHEcp000011231128000228477555&channelId=ch00000000000000000297&stime=undefined&adPositionId=undefined HTTP/1.1
复制代码 将返回值中的rtsp粘贴入potplayer即可播放
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|