太空信息安全:利用 COSMOS 和 cFS 接口读取卫星内存【Hack A Sat】

admin 2025年4月6日23:10:43评论8 views字数 4597阅读15分19秒阅读模式
太空信息安全:利用 COSMOS 和 cFS 接口读取卫星内存【Hack A Sat】

直接用我的 github 仓库可以跳过环境配置这一大步:

https://github.com/yichen115/hackasat-qualifier-2020

题目环境

首先进入到 generator-base 生成基础镜像:docker build -t generator-base .

solver 文件夹内容修改

在 solver 的 Dockerfile 前面加一句,给 debian 换个源

sed -i 's|deb.debian.org|mirrors.aliyun.com|g' /etc/apt/sources.list.d/debian.sources

以及 solver 的 Dockerfile 中需要把 python-dev 换成 python-dev-is-python3,也可以顺便给 pip 换个源

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

另外 solve.py 脚本的 sockTlm  = remote(TlmHost, TlmPort) 其中的 TlmPort 是字节类型,不知道这咋测试过的,端口不应该是 int 吗... 前面加上一句 TlmPort = int(TlmPort.decode('utf-8')) 转成数字(不过 solver 这些操作可有可无,毕竟只是拿来测试环境,自己还是要做一遍)

太空信息安全:利用 COSMOS 和 cFS 接口读取卫星内存【Hack A Sat】
challenge 文件夹内容修改

在 challenge 的 Dockerfile 前面加一句换源的操作

sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
题目环境编译与测试

回退到 patch 文件夹,make build把 docker 镜像生成出来,再用make test测试一下环境好不好使

解题

既然测试通过,那就来研究研究这道题是在干啥吧,先看看题目说明,一颗卫星的加密密钥丢失了,但是还可以通过 COSMOS 接口发送命令,还给了个 kit_to.so,让我们恢复与卫星的通信从而找到 flag

我们有来自其中一颗卫星的加密遥测链路,但我们似乎丢失了加密密钥

幸运的是,我们仍然可以使用我们的 Cosmos 接口(包含在内)发送未加密的命令

我还包含了更新到卫星的 kit_to.so 的最新版本

您能帮助我们恢复与卫星的通信,以便我们可以看到正在传输什么错误“标志”吗?

kit_to.so 可以直接通过字符串里面定位到 flag 信息

太空信息安全:利用 COSMOS 和 cFS 接口读取卫星内存【Hack A Sat】

然后看谁用了 flag,嗯,是 KIT_TOSendFlagPkt 这个函数,功能是:先读取环境变量中的 FLAG,如果没读到就用默认的 flag,然后调用 CFE_SB_TimeStampMsg 添加时间戳,再调用 CFE_SB_SendMsg 发出去(因为这都是 cFS 的一些标准函数,所以谷歌一搜就能找到函数的功能)所以是要与他通信,接收发送出来的 flag?

太空信息安全:利用 COSMOS 和 cFS 接口读取卫星内存【Hack A Sat】

参考 makefile 单独把 challenge 启动起来,socat 监听在 19020 端口,当外部连接到该端口时会启动一个容器,把容器内的 54321 端口映射到主机的 19021 端口 

rm -rf data/*docker run -it --rm -v `pwd`/data:/out -e "SEED=1" patch:generatorsocat -v tcp-listen:19020,reuseaddr exec:"docker run --rm -i -e SERVICE_HOST=172.17.0.1 -e SERVICE_PORT=19021 -e SEED=1 -e FLAG=flag{60f46eee-8c85-4d8a-8bf9-bd1c6a8aa37d} -p 19021:54321 patch:challenge"

那么通过本地 nc 127.0.0.1 19020 连接目标,从连接上去的 log 可以发现是 CFS 相关的东西

太空信息安全:利用 COSMOS 和 cFS 接口读取卫星内存【Hack A Sat】

谷歌搜索关键词,搜到了 nasa 的 cFS 地面系统?啊?nasa 你开源这个干啥?

太空信息安全:利用 COSMOS 和 cFS 接口读取卫星内存【Hack A Sat】
基础知识

看着架构好复杂... 一些使用教程:

https://ntrs.nasa.gov/api/citations/20210000619/downloads/20210000619%20Rev%201%20cFS_Training-COSMOS_Module.pdf

kimi 来梳理一下这几个东西之间的关系:

组件名称

组件介绍

Core Flight System (cFS)

NASA 开发的用于航天任务的飞行软件系统,提供灵活、可扩展和可靠的软件架构

Executive Services

cFS 的核心服务之一,负责任务的调度和管理等基础功能

Software Bus

cFS 的服务之一,用于在不同应用之间传递数据和命令

Time Services

cFS 的服务之一,提供时间管理和同步功能

cFS Applications

基于 cFS 框架开发的具体应用,用于实现特定的航天器功能

COSMOS

开源的地面系统解决方案,用于与飞行软件进行命令和遥测交互

Command and Telemetry Server

COSMOS 的核心组件之一,用于发送命令和接收遥测数据

Command Sender

COSMOS 的工具之一,用于发送命令到目标系统(如 cFS)

Script Runner

COSMOS 的工具之一,用于执行 Ruby 脚本,实现自动化操作和测试

Ground System

地面系统,用于支持航天任务的运行和管理,包括命令发送、数据接收等

Target

在 COSMOS 中,指命令的目的地或遥测数据的来源,通常是 cFS 中的一个应用

Interface

COSMOS 与目标系统之间通信的机制,定义了如何与特定的目标进行交互

COSMOS 安装

所以接下来看一下 COSMOS 这个软件怎么用,看上面的 pdf 教程,里面有个 https://cosmosrb.com 重定向到了 https://openc3.com,看起来是个新的版本?看了看文档,可以直接从 github 下载,然后执行(windows 下已安装 docker desktop)

git clone https://github.com/OpenC3/cosmos-project.gitopenc3.bat run

等运行一阵就可以通过 web 访问本地的 2900 端口来看到这个控制面板了,咱就是说,这个界面,看着就高级

太空信息安全:利用 COSMOS 和 cFS 接口读取卫星内存【Hack A Sat】

但它自带的仅仅是一个 demo 环境,想要使用它的功能需要自己添加各种信息,以及功能接口,太复杂了,还是用题目自带的 cosmos 吧,题目自带的环境又有点麻烦... 直接 ./setup.sh 总是报错... 有些东西实在是太老了... 

不过好在山石网科的师傅已经复现过了,给出了对于这乱七八糟版本的解决方案:【卫星安全系列四】Patch 赛题复现 前人栽树,后人乘凉!然而由于恶劣的网络环境,这棵树长势不好,又出现些新问题,哭了... 春暖花开,我来浇浇水

sudo apt-add-repository -y ppa:rael-gc/rvmsudo apt update -ysudo apt -y install rvm    //通过 rvm 来安装对应的 ruby 版本source /usr/share/rvm/scripts/rvmrvm install ruby-2.3.8 --disable-stable    //安装 2.3.8rvm use 2.3.8 --defaultruby -vsudo apt-get install qt4-default//安装 qt4qmake --version                    //确认一下默认版本是不是 qt4//给 gem 换个源gem sources --add https://mirrors.tuna.tsinghua.edu.cn/rubygems/ --remove https://rubygems.org/gem install bundler -v2.0.2// 把 bundler 升级到 2.0 以上

把 Gemfile.lock 中的 rdoc 版本改为 6.2.0,同时 Gemfile 中的 source 也换个源,然后就可以 bundle install 安装这一堆依赖了

太空信息安全:利用 COSMOS 和 cFS 接口读取卫星内存【Hack A Sat】

安装完成后直接 ruby Launcher 打开图形界面,如果报错界面显示不全等问题,可能是 QT 的已知问题,设置一下环境变量即可:

export QT_X11_NO_MITSHM=1

终于!终于跑起来了,泪目

太空信息安全:利用 COSMOS 和 cFS 接口读取卫星内存【Hack A Sat】

在 cosmos -> config -> tools -> cmd_tlm_server 目录下修改 cmd_tlm_server.txt 中的目标的地址及端口

 INTERFACE LOCAL_CFS_INT tcpip_client_interface.rb 127.0.0.1 19021 19021 10 nil
太空信息安全:利用 COSMOS 和 cFS 接口读取卫星内存【Hack A Sat】

然后确保你已经 nc 连接了 19020 端口,要不然 docker 还没启动呢!进入 cosmos 的图形界面后选择 Command and Telemetry Server 点击 Connect 连接目标

太空信息安全:利用 COSMOS 和 cFS 接口读取卫星内存【Hack A Sat】
日志分析

嗯,再干啥呢,分析一下 log 看看吧,docker 启动后可以发现有一堆 cFE 相关服务的初始化,ES Startup 的一系列日志中有的是 Core APP,有的则是通过 .so 文件启动的,这里面包括了题目附件之一的 kit_to.so,所以 kit_to.so 是启动的某一个服务,服务名称就叫 KIT_TO,日志中还有很多由其他 .so 加载起来的服务,有个比较异类的叫 MM(其他的都是 KIT_XXX,只有他单独叫 MM 即 Memory Manager:https://github.com/nasa/MM)

太空信息安全:利用 COSMOS 和 cFS 接口读取卫星内存【Hack A Sat】
使用 COSMOS 读取 Flag

在 github 中有一个很长的文档来说明 MM 模块的功能和用法,但是实在是太长了,AI 都处理不过来,不过好在只识别一部分也够我们了解这个模块了,kimi 发现这个模块里面有个叫做 PEEK 的指令可以通过符号名直接读取某个变量的值

太空信息安全:利用 COSMOS 和 cFS 接口读取卫星内存【Hack A Sat】

那我们连接成功后选择 Command Sender 进入命令发送界面,这里面已经集成了很多不同的组件,找到其中的 MM 以及 PEEK_MEM 指令,嗯,看起来比手册中的变量要多,但其实你注意观察会发现上面的应该不用管,从 DATA_SIZE 开始设置参数即可

我们要读取的符号名(ADDR_SYMBOL_NAME)为:KitToFlagPkt,至于偏移嘛,在 IDA 里面可以看出来,flag 是从下标 12 开始的,因此设置为偏移(ADDR_OFFSET):12,就可以读取 flag 了

太空信息安全:利用 COSMOS 和 cFS 接口读取卫星内存【Hack A Sat】

参考的 WP 中也说了,这样读有点慢,可以改成脚本,在 Script Runner 中执行:

12.upto(212) { |off| offset = off cmd("MM PEEK_MEM with CCSDS_STREAMID 6280, CCSDS_SEQUENCE 49152, CCSDS_LENGTH 73, CCSDS_FUNCCODE 2, CCSDS_CHECKSUM 0, DATA_SIZE 8, MEM_TYPE 1, PAD_16 0, ADDR_OFFSET #{offset}, ADDR_SYMBOL_NAME 'KitToFlagPkt'")}
太空信息安全:利用 COSMOS 和 cFS 接口读取卫星内存【Hack A Sat】

但是感觉这题预期解是要与 KIT_TO 通信呀,毕竟 solver.py 是这么做的... 之后再研究吧,拖了好久了哈哈哈

参考 WP

【卫星安全系列四】Patch 赛题复现

太空信息安全:利用 COSMOS 和 cFS 接口读取卫星内存【Hack A Sat】

原文始发于微信公众号(陈冠男的游戏人生):太空信息安全:利用 COSMOS 和 cFS 接口读取卫星内存【Hack A Sat】

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年4月6日23:10:43
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   太空信息安全:利用 COSMOS 和 cFS 接口读取卫星内存【Hack A Sat】https://cn-sec.com/archives/3917195.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息