CodeSys V3授权流程与密码存储分析

在线wifi跑包 金刚包跑包 cap跑包 hccapx ewsa在线 就来 握手包跑包

各位好 又见面了 我是曹操 今天给大家带来一篇新的教程

希望各位细心学习 低调用网

阅读:1,147

一、引言

在新版V3通讯协议中,CodeSys默认启用了授权机制,用户必须设置账号密码才能继续使用。成功设置密码后,用户必须登录才能对PLC进行控制管理和编程组态等操作。本文将分享CodeSysV3的授权流程和密码存储相关算法。

二、密码存储

新版CodeSysV3通讯协议将账号相关信息默认存储在UserDatabase文件中。旧版本的CodeSysV3使用MD5加密密码,而新版改进了这一点,采用了scrypt算法进行存储。该算法在CryptoDeriveKey中实现,如下所示:

UserDatabase文件的内容如下,其中”admin”是用户名,后面是密码哈希信息。

使用scrypt算法的原因是它不仅计算所需时间长,而且占用的内存也多,使得并行计算多个摘要异常困难,因此使用彩虹表进行暴力攻击更加困难。

当然,即使算法设计再健全,也无法阻止用户使用弱口令。最新版的组态软件并没有强制要求密码强度,这使得用户可以设置弱口令密码,如”123456″等。这导致安全意识不强的用户可能会将密码设置为弱口令。

通过编写Python脚本,可以将scrypt哈希信息转换为标准的hashcat的scrypthash格式,然后可以使用hashcat对该哈希进行爆破攻击。

生成的哈希如下所示:

SCRYPT:512:8:1:2BmiTfe9yYU=:Avat90uq9ScoWI3p+46HI8solorDp225o6Qi68wud34=

运行hashcat命令:hashcat.exe -m 8900 -a 0 scrypt.hash dict.txt,爆破成功率取决于字典和密码的复杂度,可以使用高性能的GPU来加快爆破速度。

三、授权流程

客户端首先通过CmpDevice的2号服务ID请求PLC获取公钥和challenge:

PLC会随机生成一个密钥对和一个32字节的challenge,并在响应包中包含公钥和challenge。

公钥信息如下所示:

32字节的challenge信息如下:

客户端在接收到以上信息后,使用CryptoAsymmetricEncrypt函数对密码进行加密,该函数如下所示:

使用Python描述password_info生成算法:

最后,客户端再次通过CmpDevice的2号服务ID将其发送到PLC:

如果密码正确,将返回appkey,每次操作都需要携带该授权key。

四、总结

通过研究CodeSys V3的密码存储算法和授权登录算法,分析实现机制,总结出了离线爆破CodeSys V3密码哈希的方法。同时发现该授权流程存在中间人攻击的可能性,建议启用CodeSys V3的TLS通信协议,以保护通信数据安全,提高破解难度。

赞(0)