未经过身份验证的远程DoS CCAgent中存在漏洞。exe附带西门子TIA Portal 15.1更新3当启用加密。
具体来说,可以触发一个整数溢出如果攻击者发送一个数据报在UDP端口8910。
。text: 0041266 c mov eax, [ebp + pTeleBuf2]。text: 0041266 f movzx连成一片,[eax + CTeleBuffer2。HdrSize];看到:64 h, h。text: 00412673 mov edx, [ebp + pTeleBuf2]。text: 00412676添加连成一片,[edx + CTeleBuffer2。BodySize];又名,压缩大小(cs)。text: 00412679 cmp (ebp + arg_MsgSize],连成一片;检查(HdrSize + BodySize) = = MsgSize。text: 00412679;但(HdrSize + BodySize)会引起int32溢出。text: 0041267 c生理改变短好
代码检查消息头大小和身体大小之和等于从网络接收消息的大小。如果不是相同的情况下,它被认为是一个错误消息将不会处理。然而,攻击者可以指定消息头大小和身体大小的信息。例如,攻击者可以指定HdrSize = 0 x74和BodySize = 0 xffffffff 0 x73-byte消息。尺寸检查将通过和畸形的消息将进一步处理。最终,0 xffffffff字节的堆体数据将被复制到缓冲通过memcpy_s()如果没有指定压缩类型的信息:
。text: 004124高炉no_compression:;代码XREF: TeleBuf2_DecryptAndUncompress↑+ 9 c j。text: 004124高炉mov eax, [ebp + TeleBuf2]。text: 004124 c2 mov连成一片,[eax + CTeleBuffer2。BodySize];又名,压缩大小(cs)。text: 004124 c5推动连成一片。text: 004124 c6 mov edx, [ebp + pBody]。text: 004124 c9推动edx。text: 004124 ca mov eax, [ebp + TeleBuf2]。text: 004124 cd mov连成一片,[eax + CTeleBuffer2。UncompressedSize];:马克斯·兰;cd。text: 004124;:解压len。text: 004124 cd;0003年:e800。text: 004124 d0推动连成一片;size_t。text: 004124 d1 mov edx, [ebp + pUncompressed]。text: 004124 d4 edx推;void *。text: 004124 d5 memcpy_s打电话
memcpy_s函数将引发一个异常如果复制大小(0 xffffffff)超过输出缓冲区的大小。例外似乎并未因此CCAgent处理。exe进程被终止:
0:003 > g (dac.10cc):安全检查失败或堆栈缓冲区溢出代码c0000409 (! ! !第二次机会!)eax = 00000001 ebx = 00000001连成一片= 00000001 edx = 6 d6c1480 esi = 00000000 edi = 0078 b738 eip = 74 ec72b2 esp = 011 df680 ebp = 011 df6b0 iopl = 0 nv了ei pl新西兰na阿宝数控c = 0023 ss = 002 b d = 002 b es = 002 fs = 0053 gs = 002 b英语= 00000202 ucrtbase !_invoke_watson + 0 x12: 74 ec72b2 cd29 int 29 h 0:002 > kb # ChildEBP RetAddr Args儿童00 011 df680 74 ec719e 00000000 00000000 00000000 ucrtbase !_invoke_watson + 0 x12 01 011 df6b0 74 ec726b 00000001 0045 b860 0078 b738 ucrtbase !_invalid_parameter + 0 x75 df6c4 02 011 00411 b56 00411 00000001 00411 ucrtbase !_invalid_parameter_noinfo + 0 xb警告:堆栈解除信息不可用。后帧可能是错误的。03 011 df6e4 004124 da 007 c0d40 00001000 007 b254c CCAgent + 0 x11b56 04 011 df728 0044559 d 007 b24d8 00000073 011 df7d4 CCAgent + 0 x124da 05 011 dfc00 0045 bfa7 007 b24d8 00000073 651 c1aac CCAgent + 0 x4559d CCAgent 06 011 dfcd8 0045 b8d4 00001 a61 00001 00000001 + 0 x5bfa7 07年011 dfcf4 77 cbd313 003000 a6 003000 a61 003000 fc CCAgent + 0 x5b8d4 08年011 dfd20 77 c9e8da 0045 b860 003000 a6 00001 a61 USER32 !_InternalCallWinProc + 0 x2b 09年011 dfe08 77 c9e234 0045 b860 00000000 00001 a61 USER32 !UserCallWinProcCheckWow + 0 0 011 dfe7c 77 c9dfe0 011 x30a dfe98 011 dff04 0042 eb35 USER32 !DispatchMessageWorker + 0 x234 0 b 011 dfe88 0042 eb35 011 dfe98 038 c32b7 003000 a6 USER32 !DispatchMessageW + 0 x10 0 c 011 dff04 0043 d948 00000000 00000000 00000000 CCAgent + 0 x2eb35 0 d 011 dff54 0042 ee85 00000001 0077 cc58 011 dff80 CCAgent + 0 0 e 011 x3d948 dff64 74947觉得74947 0077 cc58 74947 eb0 CCAgent + 0 0 f 011 x2ee85 dff80 77 ab62c4 0077 cc48 77 ab62a0 74704 f8a sechost !ScSvcctrlThreadA + 0 x31 10 011 dff94 77 e91f69 0077 cc48 74310134 00000000 KERNEL32 !BaseThreadInitThunk + 0 x24 11 011 dffdc 77 e91f34 ffffffff 77 eb3625 00000000 ntdll !__RtlUserThreadStart + 0 x2f 12 011 dffec 00000000 74947 0077 eb0 cc48 74947 ntdll ! _RtlUserThreadStart x1b + 0
概念验证
看到我们的github poc回购
注意:已经观察到CCAgent Windows服务(CCAgent.exe)重启终止时,经过一段时间。