首页
社区
课程
招聘
[原创]2022数字中国车联网安全CTF writeup - uds_server
2022-7-25 23:17 14252

[原创]2022数字中国车联网安全CTF writeup - uds_server

2022-7-25 23:17
14252

2022数字中国车联网安全CTF writeup - uds_server

介绍

这是一道uds诊断协议的逆向题。比赛的时候时间太短没做出来,又花时间研究了一下拿出来分享。

题目

uds_server

uds_server程序逻辑

  • main
    1
  • 启动后监听13400端口
  • 接收client请求
  • 启动Server
    2
  • Server初始化后进入loop
    3
  • 接收处理客户端发送的请求
    4
  • 其中handleRoutingActivationMessage函数负责注册
  • 注册后可以调用提供的service
    5
  • jmp rax跳转到不同的服务
    6
  • 所提供的服务如下
    7

服务列表

服务号 服务名称
0x10 UdsSessionControlService
0x27 UdsSecurityAccessService
0x31 UdsRoutineControlService
0x36 UdsTransferDataService
0x37 UdsRequestTransferExitService
0x38 UdsRequestFileTransferService
0x3d UdsWriteMemoryByAddressService

两个目标分析

  • UdsRequestFileTransferService
    8
    构造满足的条件后,我们传送的路径字符串会拼接到/tmp/data/后面。同时过滤../。
  • UdsRoutineControlService
    9
    这个函数从getflag这看起来就像目标函数,要求的条件很多。
    唯一一个不可控因素backdoorMem是random出来的。
    10
    可以通过UdsWriteMemoryByAddressService写内存。

攻击思路

1、注册,使客户端能访问uds服务

  • sourceAddress=0x1
  • targetAddress=0x100

2、构造满足UdsRoutineControlService的条件

  • securityLevel=1
  • currentSession=2
  • retineControlType=1
  • routineIdentifier=0xbac4
  • backdoorMem地址中内容为0xdeadbeef

3、backdoorMem取值范围0x123000-0xfffff000后三位固定为0。
4、通过UdsWriteMemoryByAddressService向0x125000写入内存deadbeef
5、n随机区间[0~1048284] 多进程循环调用直到 n==2 backdoormem=0x125000
6、调用UdsRoutineControlService

构造请求

doip协议

19

doip协议
protocolVersion inverseProtocolVersion dataType length userdata
1字节 1字节 2字节 4字节 任意长度
0x02 0xfd 0x5 0x8 0x8001 4字节 任意长度

构造注册请求

  • 调用handleRoutingActivationMessage
    11
    12

  • 需要满足的条件

    • activationType=0
    • sourceAddress=1
注册协议
1字节 1字节 type 2字节 length 4字节 ActivationType 1字节 sourceAddres 2字节 8字节
0x02 0xfd 0x5 0x00 0x00 0x00 0x0b 0x00 0x01 0x00 0x00*8
  • 执行后 hasRegisterd=1

设置currentSession

  • 调用UdsSessionControlService
    13
  • 需要先将currentSession设置成3 保证下次设置2的时候可以走else分支
session协议
1字节 1字节 type 2字节 length 4字节 srcaddr 2字节 dstaddr 2字节 服务号 1字节 sessionid 1字节
0x02 0xfd 0x8001 0x00 0x00 0x00 0x06 0x00 0x01 0x01 0x00 0x10 0x03
0x02 0xfd 0x8001 0x00 0x00 0x00 0x06 0x00 0x01 0x01 0x00 0x10 0x02

设置securityLevel

  • 调用UdsSecurityAccessService
  • 请求seed
    14
  • 根据seed计算key
    15
  • seed进行变换后调用xteaEncryptGetKey进行加密计算key
  • 相等的话设置securityLevel=1
security协议
1字节 1字节 type 2字节 length 4字节 srcaddr 2字节 dstaddr 2字节 服务号 1字节 accessType 1字节 Key 4字节
0x02 0xfd 0x8001 0x00 0x00 0x00 0x06 0x00 0x01 0x01 0x00 0x27 0x01
0x02 0xfd 0x8001 0x00 0x00 0x00 0x0A 0x00 0x01 0x01 0x00 0x10 0x02 根据seed计算的key

写入0xdeadbeef到backdoorMem

  • 调用UdsWriteMemoryByAddressService
    16
    17
  • 设置memoryAddress为0x2000 0x123000+0x2000=0x125000
  • 设置写入的内容为0xdeadbeef
  • 判断是否有返回,有返回则写入成功
writememory协议
1字节 1字节 type 2字节 length 4字节 srcaddr 2字节 dstaddr 2字节 服务号 1字节 memSizeLen&memAddrLen 1字节 address 写入内容长度 1字节 写入内容
0x02 0xfd 0x8001 0x00 0x00 0x00 0x0F 0x00 0x01 0x01 0x00 0x3d 0x14 0x00 0x00 0x20 0x00 0x04 0xef 0xbe 0xad 0xde

调用getflag函数

  • 调用UdsRoutineControlService
    18
getflag协议
1字节 1字节 type 2字节 length 4字节 srcaddr 2字节 dstaddr 2字节 服务号 1字节 controlType 1字节 Identifier 2字节
0x02 0xfd 0x8001 0x00 0x00 0x00 0x08 0x00 0x01 0x01 0x00 0x31 0x01 0xba 0xc4

bash脚本

1
2
3
4
5
#!/bin/bash
for((i=1;i<1000000;i++));
do
./uds;
done

启动多个该脚本同时进行。增加并发减小爆破时间。

patch 测试 exp

  • patch Server初始化中random返回结果
    20
    21
    23
    22

  • 将randomNum返回值修改为0x125000

  • 在linux 根目录创建getflag文件赋予777权限,/getflag文件内容如下
    1
    2
    #!/bin/sh
    echo hello
  • 执行exp 成功返回hello
    24

真正的exp

正常情况下这样爆破是没问题的,但我一直在想这是CTF没有那么多时间让你爆破,肯定还有其他办法。得知....//....//可以路径穿越后。
又有了攻击思路:

  • 和前面一样。
  • 这里不直接读内存,通过UdsRequestFileTransferService设置路径
    读取路径为....//....//proc/self/maps
    经过过滤拼接后得到/tmp/data/../../proc/self/maps
  • 设置路径包构造
    36
设置读取文件协议
1字节 1字节 type 2字节 length 4字节 srcaddr 2字节 dstaddr 2字节 服务号 1字节 modeOfOperation 1字节 filePathAndNameLength 2字节 filePath compressionMethod encryptingMethod 1字节
0x02 0xfd 0x8001 0x00 0x00 0x00 0x23 0x00 0x01 0x01 0x00 0x38 0x04 0x00 0x1a ....//....//proc/self/maps 随便1字节
  • 调用UdsTransferDataService读取文件
    35
    34
读取文件协议
1字节 1字节 type 2字节 length 4字节 srcaddr 2字节 dstaddr 2字节 服务号 1字节 blockSequenceCounter 1字节
0x02 0xfd 0x8001 0x00 0x00 0x00 0x06 0x00 0x01 0x01 0x00 0x36 0x01
  • 对返回的/proc/self/maps进行解析获取到backdoorMem基址。基址减去0x123000获取到偏移
  • 将0xdeadbeef写入backdoorMem基址
  • 调用getflag
    33

  • 成功获取flag


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

最后于 2022-7-26 11:30 被scxc编辑 ,原因: 忘写标题
上传的附件:
收藏
点赞9
打赏
分享
打赏 + 150.00雪花
打赏次数 1 雪花 + 150.00
 
赞赏  Editor   +150.00 2022/08/15 恭喜您获得“雪花”奖励,安全圈有你而精彩!
最新回复 (7)
雪    币: 2859
活跃值: (1016)
能力值: ( LV12,RANK:215 )
在线值:
发帖
回帖
粉丝
scxc 3 2022-7-25 23:31
2
0

嘻嘻

最后于 2023-3-20 14:26 被scxc编辑 ,原因: 无
雪    币: 3936
活跃值: (2013)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
Umiade 2022-7-26 10:02
3
0

表哥NB

最后于 2022-7-26 10:02 被Umiade编辑 ,原因:
雪    币: 6569
活跃值: (3823)
能力值: (RANK:200 )
在线值:
发帖
回帖
粉丝
LowRebSwrd 4 2022-7-26 11:41
4
0
 牛
雪    币: 198
活跃值: (548)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
slbwgslz 2022-7-26 14:19
5
0
雪    币: 240
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
Cookie11 2022-7-26 15:27
6
0
大哥太猛了
雪    币: 1044
活跃值: (1263)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
0xroot 1 2022-7-26 16:38
7
0
想起了某次比赛,拿到了比赛服务器root权限,服务器全盘搜flag,直接找到一半题目的flag
雪    币: 257
活跃值: (77)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
B_leslie 2022-7-26 22:11
8
0
恐怖如斯,学到了学到了。
游客
登录 | 注册 方可回帖
返回