施耐德NOE77101后门漏洞分析

虚幻大学 xuhss 609℃ 0评论

Python微信订餐小程序课程视频

https://edu.csdn.net/course/detail/36074

Python实战量化交易理财系统

https://edu.csdn.net/course/detail/35475
固件下载地址:

GitHub - ameng929/NOE77101_Firmware

文件目录结构,这里只列出了一些主要的文件信息:

├── bin
├── ftp
├── fw
├── rdt
├── webloader.ini
└── wwwroot
 ├── SchneiderTFE.zip
 ├── cgi-bin
 ├── classes
 ├── conf
 │   ├── Gcnftcop.sys
 │   ├── bootp
 │   ├── dhcp
 │   ├── diag
 │   │   └── chkdsk.out
 │   ├── exec
 │   │   ├── NOE77101.bin
 │   │   └── kerVer
 │   ...
 ├── html
 │   ├── config.js
 │   ...
 ├── rdt
 │   └── rdt.zip
 └── secure

注意到 wwwroot/conf/exec 目录下有一个文件 NOE77101.bin ,这就是要分析的固件文件。使用binwalk命令查看文件内容,是一个Zlib类型的压缩文件:

➜ exec binwalk NOE77101.bin

DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
901 0x385 Zlib compressed data, default compression

binwalk提取文件内容,binwalk会自动解压文件,得到文件夹 _NOE77101.bin.extracted

➜ exec binwalk -e NOE77101.bin

DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
901 0x385 Zlib compressed data, default compression

➜ exec ls
NOE77101.bin \_NOE77101.bin.extracted kerVer

binwalk自动提取了文件到_NOE77101.bin.extracted目录下,并对其进行解压。此时文件夹下就有两个文件,一个zlib和一个被解压出来的:

➜ \_NOE77101.bin.extracted ls
385 385.zlib

然后再用binwalk查看385文件:

➜ \_NOE77101.bin.extracted binwalk 385

DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
2054252 0x1F586C EST flat binary
2088936 0x1FDFE8 HTML document header
2108532 0x202C74 HTML document footer
2110048 0x203260 HTML document header
2115564 0x2047EC HTML document footer
2119528 0x205768 XML document, version: "1.0"
2119796 0x205874 XML document, version: "1.0"
2119912 0x2058E8 XML document, version: "1.0"
2192512 0x217480 Base64 standard index table
2192580 0x2174C4 Base64 standard index table
2211604 0x21BF14 VxWorks WIND kernel version "2.5"
2225264 0x21F470 Copyright string: "Copyright Wind River Systems, Inc., 1984-2000"
2321952 0x236E20 Copyright string: "copyright\_wind\_river"
3118988 0x2F978C Copyright string: "Copyright, Real-Time Innovations, Inc., 1991. All rights reserved."
3126628 0x2FB564 Copyright string: "Copyright 1984-1996 Wind River Systems, Inc."
3153524 0x301E74 VxWorks symbol table, big endian, first entry: [type: function, code address: 0x1FF058, symbol address: 0x27655C]

得知文件是VxWorks固件,符号表位置在0x301E74处,稍后会用到。

然后使用binwalk查看架构,得知是PowerPC big endian:

➜ \_NOE77101.bin.extracted binwalk -A 385
....
2045960 0x1F3808 PowerPC big endian instructions, function epilogue
2045968 0x1F3810 PowerPC big endian instructions, function prologue
2046180 0x1F38E4 PowerPC big endian instructions, function epilogue
3150948 0x301464 PowerPC big endian instructions, function epilogue

之后用IDA打开385文件,在打开时设置架构:

747a00537d04c5e932101c7b89ad0892 - 施耐德NOE77101后门漏洞分析

然后要求设置RAM和ROM,其实就是设置加载基地址:

7440de9b4d837dbbaae86e4dd1ba04d6 - 施耐德NOE77101后门漏洞分析

eae04978b9365b261b0a594e01a70bce - 施耐德NOE77101后门漏洞分析

bb5dfabc1c540183696efc4f70d28420 - 施耐德NOE77101后门漏洞分析

在IDA中无法识别出任何函数,需要在程序开头位置按一下 “c” 键,就可以显示部分函数,但没有解析出所有的函数:

404a5871e5595fe6a61dcfb899e70a5c - 施耐德NOE77101后门漏洞分析

9a4cef420ea0cb066200d9dda65cf3bd - 施耐德NOE77101后门漏洞分析

此时可以通过三种方式获得加载基地址:

  • 通过跳转表获得基地址、通过字符串引用获得基地址

固件安全之加载地址分析 – 绿盟科技技术博客

  • 使用IDA的Vxhunter插件

vxhunter/firmware_tools at master · PAGalaxyLab/vxhunter

这里为了方便选择Vxhunter插件,选择python版本下载后复制到plugin文件夹下,然后运行插件:

e0e890b950558c6cec58cfbf069c7a8c - 施耐德NOE77101后门漏洞分析

得到加载地址是0x10000:

16d96538d0f5d28c5311518942375662 - 施耐德NOE77101后门漏洞分析

然后发现依然没有解析函数,此时需要恢复函数名称。使用IDA脚本:

#coding=utf-8
from idaapi import *
from idc import *

symbol\_interval = 16 #符号表间隔
load\_address = 0x10000 #固件内存加载基址
symbol\_table\_start = 0x31eec4 + load\_address #符号表起始地址
symbol\_table\_end = 0x348114 + load\_address #符号表结束地址
ea = symbol\_table\_start
eaEnd = symbol\_table\_end

while ea < eaEnd:
 offset = 0 #4个字节为一组数据
 #将函数名指针位置的数据转换为字符串
 create\_strlit(get\_wide\_dword(ea-offset), BADADDR)
 #将函数名赋值给变量sName
 sName = get\_strlit\_contents(get\_wide\_dword(ea))
 print(sName)
 if sName:
 #开始修复函数名
 eaFunc = get\_wide\_dword(ea - offset +4)
 set\_name(eaFunc, sName)
 create\_insn(eaFunc)
 ida\_funcs.add\_func(eaFunc, BADADDR)
 ea += symbol\_interval

代码中的符号表起始地址和符号表结束地址需要手动修改一下,可以在16进制编辑器中查看。在binwalk分析的时候得到符号表地址为0x301E74,然后在文件中找到这个位置,0x301E74即起始位置:

ec16f4b9353339c7352ca5d6b23e2cb1 - 施耐德NOE77101后门漏洞分析

符号表每0x10为一组,一直找到结束的位置0x3293a4:

e97da98628c145374b33c86b153bd180 - 施耐德NOE77101后门漏洞分析

然后执行IDA脚本:

a1fd8cfe3b07f38cf373f504362b5c3f - 施耐德NOE77101后门漏洞分析

最后恢复完成:

1e27252978504ccc0e8f603c43e2d928 - 施耐德NOE77101后门漏洞分析

usrAppInit函数中发现多处loginUserAdd添加用户,这些字符串即后门账号和密码:

2efc4da12b46a94d2bb223906fcdfea3 - 施耐德NOE77101后门漏洞分析

总结

此固件分析关键点在于确定程序基地址和如何恢复符号信息,只要恢复了符号信息就和阅读源码无异了。

References

固件符号表恢复

https://bbs.pediy.com/thread-266803-1.htm

固件安全之加载地址分析 – 绿盟科技技术博客

施耐德PLC以太网模块后门账户解密 – 灯塔实验室

https://p1kk.github.io/2021/06/11/iot/施耐德 NOE771/

__EOF__

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nuZZCoEA-1645722558774)(https://blog.csdn.net/unr4v31/p/15933956.html)]unr4v31 本文链接:https://blog.csdn.net/unr4v31/p/15933956.html关于博主:评论和私信会在第一时间回复。或者直接私信我。版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!

转载请注明:xuhss » 施耐德NOE77101后门漏洞分析

喜欢 (0)

您必须 登录 才能发表评论!