某设备CoAP协议漏洞挖掘实战
2022-8-19 18:11:21 Author: 看雪学苑(查看原文) 阅读量:8 收藏


本文为看雪论坛优秀文章

看雪论坛作者ID:风亦映寒

发现看雪等国内安全论坛好像CoAP协议相关内容很少,以及CVE中基本也是CoAP协议库存在的漏洞,所以将最近对某设备CoAP漏洞挖掘的相关分析整理记录一下。

CoAP原理简要介绍(具体可以看rfc文档)

CoAP可以简单的当做基于UDP协议的轻量化HTTP协议。
协议栈:
Constrained RESTful Environments (CoRE)
  • 基于REST

  • 应用于受限节点和网络

  • 帮助client对server进行Resource Discovery

CoAP Resource Discovery 机制
  • 基于CoRE

  • 使用/.well-known/core 作为 Well-Known URI, 详见 rfc8615

  • 例: CoAP server 提供了2个资源

REQ: GET coap://server:port/.well-known/core
RES: 2.05 Content </sensors/temp>;if="sensor", </sensors/light>;if="sensor"
安全机制
CoAP 有四种安全机制:NoSec, PreSharedKey ,RawPublicKey,Certificate, 但是只有NoSec和RawPublicKey是强制实现的。
  • NoSec:no protocol-level security (DTLS is disabled)

  • PreSharedKey: DTLS is enabled. 基于pre-shared keys进行认证。

  • Certificate: DTLS is enabled. 基于具有X.509证书的非对称密钥进行认证。

  • RawPublicKey:DTLS is enabled. 基于 raw public key进行认证。

CoAP 本身没有实现认证和授权机制,而是通过 communication security(IPsec,DTLS)和object security 来完成。
安全考虑
  • 协议解析和URI的处理
传入数据包的处理逻辑可能存在漏洞
  • 代理和缓存
代理会破坏IPsec或DTLS的保护
  • 反射攻击
由于UDP协议无法验证源地址导致的反射攻击
关于这个有一些相关的报告
https://www.netscout.com/blog/asert/coap-attacks-wild
https://anquan.baidu.com/article/807
  • IP地址欺骗攻击
发送伪造的ACK等消息
  • Cross-Protocol Attacks
通过伪造源地址,导致绕过防火墙规则达成的攻击

实战

CoAP协议默认端口为5683或5684,端口为5683时的安全机制为NoSec, 5684则是开启了DTLS。看了下设备端口开启的5683。
udp        0      0 0.0.0.0:5683            0.0.0.0:*
如下,设备实现了基于CoRE 的 Well-Known URI。
if ( *((_BYTE *)v21->hdr + 1) == 1 && !memcmp(key, &unk_A0DC, 4u) ){  coap_log_impl(7, "create default response for %s\n", ".well-known/core");  v22 = wellknown_response(context, node->pdu);}
所以可以直接进行 Resourse Discovery 过程:
import asynciofrom aiocoap import *
async def main(): protocol = await Context.create_client_context() msg = Message(code=GET, uri="coap://192.168.1.1:5683/.well-known/core") response = await protocol.request(msg).response print(response.payload)
asyncio.run(main())
可以看到,CoAPserver 提供了以下资源:
b'</>;title="General Info";ct=0,...</device/inform/boot>;title=device/inform/boot,</device/inform/syncreq>;title=device/inform/syncreq,</device/inform/off>;title=device/inform/off,</device/inform/hb>;title=device/inform/hb,</device/inform/data>;title=device/inform/data,</device/cmd/file>;title=device/cmd/file</async>;ct=0'
逆向对应二进制看到的代码实现,对应的函数名和URI也 可以推测下对应功能。
void *__fastcall start_coap_server_thread(void *a1){ pthread_t v1; // $v0 v1 = pthread_self(); pthread_detach(v1); ... registerCoapMethod("device/inform/boot", coapboot_handler) registerCoapMethod("device/inform/syncreq", coapsync_handler) registerCoapMethod("device/inform/off", coapoff_handler) registerCoapMethod("device/inform/hb", coaphb_handler ) registerCoapMethod("device/inform/data", coapdata_handler) registerCoadMethod("device/cmd/url", coapdata_url_handler) ... startCoapService("0.0.0.0", 5683); return 0;}
剩下的就是对这些函数进行进一步漏洞挖掘了。
 
挖掘成果:
1、coapsync_handler函数会将设备SSID,Pwd等参数返回给client,导致了信息泄露,比较鸡肋的一个洞。
...cJSON_AddItemToObject(v73, "SSID", v13);v14 = cJSON_CreateString(&v83[136]);cJSON_AddItemToObject(v73, "SecurityMode", v14);v15 = cJSON_CreateString(&v83[72]);cJSON_AddItemToObject(v73, "Pwd", v15);...
2、Url字段数据导致的命令注入。
recv_cmdfile_handler会调用到cmdupgrade_parse。
cmdupgrade_parse会从post的cjson数据中解析出Url的值
v17 = cJSON_GetObjectItem(v9, "Url");    v18 = v17;    if ( v17 )    {      v19 = *(const char **)(v17 + 16);      v20 = 0;      if ( v19 )      {        v21 = strlen(v19);        v20 = malloc(v21 + 1);        v22 = strlen(*(const char **)(v18 + 16));        memset(v20, 0, v22 + 1);        strcpy((char *)v20, *(const char **)(v18 + 16));      }
最终会调用函数do_upgrade, 而Url字段数据会拼接到system执行的命令中,达成未授权RCE。
do_upgrade
int __fastcall do_upgrade(const char *Url){...  if ( !strcmp((const char *)v35, "XXXX-XXXXXX") )    snprintf(cmd, 0x180u, "curl %s -o %s%s -k", Url, "/var/tmp/", uri);  else    snprintf(cmd, 0x180u, "wget -q -P %s %s", "/var/tmp/", Url);  system(cmd);}

一些相关工具

  • cotopaxi

    https://github.com/Samsung/cotopaxi

  • libcoap,aiocoap等 coap 协议实现库

攻击路径

判断是否可以进行resource discovry 操作获取CoAP server 的资源;
判断安全机制是哪种;
判断是否实现了认证机制;
对请求解析函数进行逆向分析。

引用

https://tools.ietf.org/html/rfc8615

https://datatracker.ietf.org/doc/html/rfc6690

https://en.wikipedia.org/wiki/Constrained_Application_Protocol

https://datatracker.ietf.org/doc/html/rfc7252

https://datatracker.ietf.org/doc/html/rfc5785

看雪ID:风亦映寒

https://bbs.pediy.com/user-home-647447.htm

*本文由看雪论坛 风亦映寒 原创,转载请注明来自看雪社区

# 往期推荐

1.协议分析实战

2.编写一个简单的linux kernel rootkit

3.Tenda摄像头分析

4.Android APP 漏洞之战——WebView 漏洞详解

5.uds诊断协议-逆向题 WP

6.CVE-2018-18708 TENDA缓冲区溢出漏洞

球分享

球点赞

球在看

点击“阅读原文”,了解更多!


文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458464840&idx=1&sn=5d3b25a84769ae891955f46dc8d8114f&chksm=b18e02c286f98bd4ee28bdee2e9522f6f1d06ea2d26028523651ff40f5b1997520a6219bb79b#rd
如有侵权请联系:admin#unsafe.sh