Mad Max DGA

jeff

投稿者:Jeff Edwards
投稿アーカイブ:マルウェア、リバース・エンジニアリング、トロイの木馬

本稿では、マルウェアファミリMad Maxが使用しているドメイン生成アルゴリズム(DGA)について説明します。Mad Maxとは、標的型のトロイの木馬です。このマルウェア自体の特徴については、私たちの調査結果をフォローアップ記事としてまとめて掲載する予定ですが、ここではそのDGAのリバース作業に着目することにします。というのも、このトピックについて公開されている他の調査を見つけることができなかったためです。

私たちが注目した参照用の検体には、c7d1357f4c4acceb1780db12ad1b4de1という内容のMD5ハッシュがあります。これがまず私たちの注意をひいた理由は、自動化サンドボックスを通過する際に、「APT.MADMAX」に関するETProのシグニチャーアラートを引き起こしたためです。ソフォス[1]の分析レポート1件の他には、この脅威について公開された調査をほとんど見つけることができませんでした。これはおそらく、Web検索でヒットする内容のほとんどが、メル・ギブソン主演のよく知られた同名映画(下の写真)に関するものであるためと考えられます。

madmax-300x195

この検体は、VirusTotal上で極めて一般的に検出されます。このマルウェアの特徴やインストレーション・ライフサイクルなどの詳細をフォローアップ記事として掲載する予定です。今のところは、元の検体によって感染対象にいくつかのDLLが組み込まれ、その後rundll32.exeにより実行される、というところでとどめておきます。Mad MaxのDGAのリバース・エンジニアリング作業中、私たちが最も時間を費やした組み込みDLLは1,561,600バイトのサイズで、これには43538f5fb75003cbea84c9216e12c94aのMD5ハッシュがありました。それは、C:\Users\Admin\AppData\Local\Tempにc_375EF.tmpとして組み込まれていました。

難読化コードの解読

このマルウェアのもたらす障壁の一つは、そのコードが極めて難読化されていることで、1つ以上の「本物の」マルコード命令の小さなまとまりが、はるかに多くのダミー命令の間に埋もれています。図1は代表的な例を示しており、黄色で表示した5個の命令のみが「実質的」(本物)で、周囲の命令は純粋に難読化のためのみに存在しています。

この形の難読化は非常に効果的で、IDA Proと人間のリバース・エンジニアの双方の作業を困難にします。IDAは大きくまごつかされ、大半の部分で命令を個別の関数に解析することができません。そして、関数構造が分からなければ、IDAの他の自動注釈機能の多くの部分、すなわち、関数の引数やローカルスタック変数の検出とラベル付け、コードブロックへの分解、「グラフモード」なども機能しなくなります。また、この難読化は、人間のリバース・エンジニアに対しても効果があるといえます。つまり、わずかな本物の命令がすべて数十もの不要な命令で分けられていたら、コードを理解するのは非常に骨の折れる作業になります。残念ながら、この種の難読化は増加傾向にあるようで、このところ遭遇する頻度がますます高まっています。

madmax-2-code_obfuscation-300x169

図1:Mad Maxのコード難読化

幸いにも、Mad Maxのコード難読化にはある種の韻や規則性のようなものがあり、極めて信頼性のあるパターンを生成しているため、難読化コードの解読プログラムを作成して、不要な命令の中から必要な命令を取り出すことができます。「本物」の命令から成るそれぞれの短い列の後には、PUSHF、TEST、条件付きジャンプ(JNZまたはJZ)の3つの命令が1つのセットで続きます。TEST命令は、次の条件付きジャンプが発生するように、必ずZフラグを設定します。このジャンプはランダムな数だけ存在するダミーの命令をスキップしてPOPF命令に飛びます。POPFに続くのは、「本物」の命令の次の短い列です。基本的な繰り返しパターンを以下に示します。ここで、「本物の命令」は赤、ランダムのダミー命令は紫、そして本物のまとまりから本物のまとまりへダミーの命令コードに関するEIPを飛び越えるための「つなぎ」の命令が緑です。

0x10001080 Random Dummy Instruction
0x10001082 Random Dummy Instruction
0x10001084 POPF
0x10001085 Real Instruction
0x10001089 Real Instruction
0x1000108B PUSHF
0x1000108C TEST some_global_constant, some_immediate_value
0x10001093 JZ / JNZ 0x1000112E
0x10001099 Random Dummy Instruction
0x1000109B Random Dummy Instruction

0x10001128 Random Dummy Instruction
0x1000112A Random Dummy Instruction
0x1000112E POPF
0x1000112F Real Instruction
0x10001132 Real Instruction
0x10001134 Real Instruction
0x10001139 PUSHF
0x1000113A TEST some_global_constant, some_immediate_value
0x10001141 JZ / JNZ 0x1000112E
0x10001147 Random Dummy Instruction
0x10001149 Random Dummy Instruction

ダミー命令は、IDAの逆アセンブラが命令コードと解釈するバイト列をランダムに生成しただけのものと思われ、この「つなぎ」の命令は、(おそらく)どのダミー命令も実行しないように自動生成されたものです。

Mad Maxのコード難読化は上記のパターンに規則正しく従っているため、機能限定のステート・マシン・ユーティリティをPythonで作成し、難読化されたマルコード全体をこのユーティリティで調べて、各命令を本物、ダミー、つなぎに分類するのは簡単です。この分類が完了すれば、ユーティリティは編集加工を行って、以下の変更を加えます。

この簡単なアルゴリズムをMad Maxのマルコード全体にわたって実行すると、解読後のバイナリーが得られ、IDA Proに再ロードできます。これで、IDAがはるかに処理しやすくなりました。

madmax-3-de-obfuscation-300x188

図2:図1のコード解読後の一般コード部分のIDAスクリーンショット

さて、それらしくなりました。これでIDAは、関数、スタック変数、コードブロック、相互参照などを認識できます。私たちがNOPに変更した不要な命令は、特にグラフ表示において、ほとんど表示されません。加えて、元の難読化コードにおいて、つなぎの命令の間に生成されたランダムなダミーバイトは、命令コードとして解釈されると非常に変わった命令となることが多く、また、これらの命令コードは極めて不可解であるため、多くの場合IDAは大きなブロックをコードではなくデータと誤って解釈してしまうこともあります。今回の解読作業後、この問題も解消されました。

DGAのアルゴリズム全般

まともに作業できそうなコードが得られたので、実際にDGAにリバース・エンジニアリングを施すことにします。当初、Mad MaxがDGAを使用している理由は、数日を空けて行われる複数のサンドボックス実行が、異なるホスト名への不正通信の試みを発生させているからではないかと考えました。DGAの大半はアルゴリズムへの可変「シード」入力として何種類かのタイムスタンプを使用します。Mad Maxも例外でないことが判明し、GetSystemTime()への呼び出しによってドメイン生成関数に導かれることを発見しました。この関数を、DoDga_sub_10045851()とします。

DoDga_sub_10045851関数は、以下の高度なステップを実行します。

  1. 可変入力として現在の年、月、月の週数、ハードコーディングされた定数を用いて、ASCIIシードストリングを生成します。このストリングは、現在の月に応じて長さが42バイトまたは43バイトとなります。
  2. このシードストリングのMD5ハッシュを計算し、16要素の「インデックステーブル」と解釈される128ビットを生成します。
  3. このインデックステーブルの最初のバイト列にポストプロセス演算を行います。これは単純に、テーブルの最後の8バイトを最初の8バイトにバイト単位でADDします。
  4. 最終的な16バイトのインデックステーブルの最初の10バイトを、62バイトのドメイン文字検索テーブルへのインデックスとして使用して、10文字の第2レベルドメイン(SLD)が得られます。
  5. 現在の月の週数に基づいて選んだトップレベルドメイン(TLD)を後に付加します。
  6. 先頭に「www.」を付けると、完全なホスト名となります。

以下のサブセクションで、これらのステップをより詳細に説明します。

ステップ1. シードストリングの生成

Mad MaxのDoDga関数は、ローカル・スタック・フレーム・バッファーのvar_270にシードストリングを作成することから開始します。シードストリングは、現在の月に応じて42文字または43文字の長さしかありませんが、このローカル・バッファーは64バイトのデータを保持できる大きさです。これは、次のステップにおけるMD5のハッシュ演算が入力データの64バイトのチャンクに対する演算となり、適切なパディングのための十分な余地がローカル・バッファーにあるためです。

このASCIIシードストリングは、ハードコーディングされたUUIDパラメータと現在日付のコンポーネントを用いて作成されます。以下に示すのは2016年7月14日の例で、UUIDコンポーネントが灰色、現在の年が青、現在の月が赤、現在の月の週数が緑で表示されています。

9135d48a-6103-4894-856c-b29897742e52201672

この列のUUIDコンポーネントは16バイトのバイナリー・バッファーをWin32 APIのUuidToStringA()に渡すことによって得られ、このAPIはこの16バイトをUUID構造体と解釈して、このUUIDのストリング表現をMicrosoftのフォーマットで返します。このバイナリーのUUIDソースバイトは呼び出し関数からのスタック上のDoDgaに渡され、通常は最初の4つの引数(IDAの名称でいうと、arg_0、arg_4、arg_8、arg_C)に使用される場所を占めます。UUIDは、図3に示すように、グローバル・データ・バッファーのDGA_UUID_unk_10172D44からスタックにコピーされます。DoDga()に対して5番目の引数であるarg_10は呼び出し側のスタックフレームのローカル・バッファーへのポインターで、このスタックフレームにDoDga()は生成したドメイン出力を書き込みます。

残念ながら、といっても驚くには値しませんが、Mad Maxはプレーンテキストに埋め込まれてハードコーディングされたこのUUIDを、そのバイナリーの.dataセクションに、私たちの便宜のために保存してはくれません。実際、DGA_UUID_unk_10172D44はMad Maxが組み込んだスタティックな.DLLファイルの中で初期化されません。幸い、これは大きな障害ではありません。というのも、Mad Max DLLをホストしている実行中のrundll32プロセスのサンドボックス・メモリダンプでは、図4に示すように、ハードコーディングされたUUIDのプレーンテキストの値を容易に取得できるためです。このUUIDでUuidToStringA()を起動した後、DoDga()は、結果のASCIIストリング表現を、その64バイトのシードストリング・バッファーのvar_270の先頭に対してstrcpy()を実行します。

madmax-4-sixteen_byte_binary-300x200

図3:16バイトのバイナリーUUIDをDoDga()に渡す

madmax-5-uuid_struct-300x65

図4:サンドボックス・メモリダンプから取得したプレーンテキスト中のハードコーディングされたUUID構造体

次に、Mad MaxはGetSystemTime() APIを起動して、現在のUTCタイムスタンプを含んだSYSTEMTIME構造体を取得します。次いで、この構造体からwYearとwMonthのフィールドを抽出し、標準のultoa() C関数を用いて、いずれもASCIIストリングの表現に変換します。例えば、2016年7月14日のタイムスタンプの場合は、「2016」と「7」のストリングができます。これら2つのコンポーネントは、strcat()によりシードストリング・バッファーの後に付加されます。

最後に、Mad MaxはwDayフィールドを調べて月の週数を計算します。このアルゴリズムは、以下のように簡単なものです。

  def _get_week_of_month(self, wDay):
    if wDay <= 7:
      week_of_month = 1 # (1 thru 7)
    elif wDay <= 14:
      week_of_month = 2 # (8 thru 14)
    elif wDay <= 21:
      week_of_month = 3 # (15 thru 21)
    else:
      week_of_month = 4 # (22 thru 31)
    return week_of_month	

現在の月の週数も整数からストリングに変換され、strcat()によりシードストリングの後に付加されます。この時点で、この64バイトのシードストリング・バッファーは、(月により)42または43文字の以下のようなASCIIストリングを保持します。

9135d48a-6103-4894-856c-b29897742e52201672

これは、作成されるドメインを変化させるのに使用される基礎材料を表現しています。この基礎材料は1週間の単位で時間とともに変化するので、Mad Maxは週次で新しいドメインに切り替わることになります。

ステップ2. 16バイトのインデックステーブルの生成

次のステップの目的はシードストリングに演算を実行して、16バイトのインデックステーブルを作成することです。このテーブルは、各文字を検索して週次のドメインを作成するのに使用されます。この演算を実行する命令のシーケンスは長く、アルゴリズムが複雑です。図5で、私たちが扱っているものの概要が分かります(この概要の恐るべきグラフ表示に注目)。具体的には、インデックステーブルの32ビットの箇所とシードストリングに対する様々な数学的、ビット単位の演算を実行する、極めて長いブロックの連続です。

この逆アセンブル作業により、ここで何が行われているかを知る手がかりがいくつか得られます。1つ目は、この16バイトのインデックステーブルは、図6に示すように、ハードコーディングされたいくつかの特徴的な値により初期化されているということです。

メモリの中でインデックステーブルは初期化され、以下のように見えます。

           00 01 02 03 04 05 06 07   08 09 0a 0b 0c 0d 0e 0f   ----- ASCII ----- 
0x7effed88  01 23 45 67 89 ab cd ef   fe dc ba 98 76 54 32 10   .#Eg.... ....vT2.

これらのハードコーディングされた定数は、MD5、MD4、SHA-1などのよく知られた各種ハッシング・アルゴリズムに関連付けられます。

madmax-6-indexing_table-228x300-1

図5:シードストリングからインデックステーブルを生成する命令のサンプル

madmax-7-initializing_indexing-300x44-1

図6:インデックステーブルの初期化

2つ目は、図5に示した複雑なタイプの演算を実行する前に、Mad Maxが1ビット(0x80バイト)をシード列の後に付加し、その後にシードストリング・バッファーを56バイトまでパディングするのに十分な追加の0ビット(0x00バイト)を続けていることです。次いで、シードストリングの元の長さ(ビット単位:元のシード列が42文字の場合は0x150、43文字の場合は0x158)の64ビット整数表現を含む8バイトを、後に付加します。これも、MD5で使用されるパディング・メカニズムと整合性のあるものです。

3つ目の手がかりは、実際のビット操作の命令シーケンスに見られるハードコーディングされた32ビット定数のいくつかが、MD5の既知の各種実装に現れているということです。例えば、図7に示す0x28955B88と0x173848AAのいずれも、MD5に関連付けられる、事前に計算可能な値です。

madmax-7-initializing_indexing-300x44-1

図7:秘密を多く明かす定数のうちの2つ(0xA83F051、0x4787C62Aなど)

インデックステーブルの生成に関わる800以上の命令のエミュレーションにより、それが無修正MD5ハッシュそのものの一つの実装であることが裏付けられます。私たちが使用した日付の例の2016年7月14日の場合、シードストリングのMD5ハッシュは以下のインデックステーブルを生成します。

            00 01 02 03 04 05 06 07   08 09 0a 0b 0c 0d 0e 0f   ----- ASCII ----- 
0x7effed88  f1 a6 80 dd 24 ed 31 a5   ab 2b a3 da 61 c7 d1 af   ....$.1. .+..a... 

ステップ 3. インデックステーブルのポストプロセス実行

シードストリングのMD5ハッシュが計算されると、Mad Maxはその結果である16バイトのインデックステーブルに対して最後のポストプロセスのステップを実行します。具体的には、後半の8バイトをバイト単位に加算することで、前半の8バイトを更新します(図8参照)。

madmax-9-byte_wise_add-300x159

図8:インデックステーブルに対するバイト単位のADDポストプロセス演算

ここでもう一度、私たちのサンプル日付である2016年7月14日を使用すると、最終的なインデックステーブルは以下のようになります。

            00 01 02 03 04 05 06 07   08 09 0a 0b 0c 0d 0e 0f   ----- ASCII ----- 
0x7effede0  9c d1 23 b7 85 b4 02 54   ab 2b a3 da 61 c7 d1 af   ..#....T .+..a... 

ステップ4.~6. 週次ドメインの作成

ついに、ポストプロセスされた最終の16バイトのインデックステーブルを使用して週次ドメインを作成する段階になりました。インデックステーブルの各バイトが1つのドメイン文字を生成し、Mad Maxは長さが最大16文字のドメイン名を生成できます。しかしながら、ドメイン名を10文字に制限することを選んでいます。

最終インデックステーブルの最初の10バイトの各値が、以下のハードコーディングされた62文字のDGA_LUT検索テーブルへのインデックスとして使用されます(図9参照)。

jfyicbya26h5hvepgq07zfsqmdk4xcet9annmwuw8rok3lzsxlvjpdubog1rit

madmax-9-dga_indexing-300x137

図9:DGA検索テーブルへのインデックス

私たちの日付の例である2016年7月14日の場合、以下のドメインを得ます。

位置 インデックステーブル・バイト インデックスmod 62 ドメイン文字
0 0x9c 0x20 9
1 0xd1 0x17 q
2 0x23 0x23 n
3 0xb7 0x3b r
4 0x85 0x09 6
5 0xb4 0x38 o
6 0x02 0x02 y
7 0x54 0x16 s
8 0xab 0x2f s
9 0x2b 0x2b k

結果として得られたSLDは、9qnr6oysskです。

最後のステップは、「www.」をSLDの前に付け、次いでTLDを選ぶことです。この操作は簡単なもので、ハードコーディングされた検索テーブルに現在の月の週数を照会します(テーブル1参照)。

最終結果:www.9qnr6oyssk.org

付録Iには上記のMad Max DGAのPythonによる再実装が記載されています。そこでは、Mad Maxの参照用検体のc7d1357f4c4acceb1780db12ad1b4de1にあった、ハードコーディングされたUUIDの9135d48a-6103-4894-856c-b29897742e52が使用されています。

テーブル1. TLDを月の週数から決める
週数 TLD
1 .com
2 .org
3 .info
4 .net

過去と将来のMad Maxドメイン

付録IIには、私たちのPython再実装版が生成した、2015年、2016年、2017年に対応する、過去と将来におけるMad Maxドメインの全セットが記載されています。私たちは、(数ある理由の中でも)DGAに関する調査結果を検証する目的で、これらのドメインのいくつかを登録してシンクホールとし、Mad Maxボットのチェックインを実際に観測しています。本稿作成時点(2016年7月15日)で、ボットは4eabktj4al.infoドメインにチェックインしています。

最初の3日間にわたるモニタリングの間に、4eabktj4al.infoシンクホールに、16カ国(ブラジル、カナダ、中国、フィンランド、フランス、ドイツ、インド、イタリア、日本、韓国、ノルウェー、台湾、タイ、ウクライナ、英国、米国)からチェックインしようとしているボットを観測しました。

加えて、以下のような過去に実在したドメインにチェックインを試みるMad Max観測の実績から、私たちはDGAの再実装における自信を強めました。これらの過去に実在したドメインは、私たちの再実装版プログラムが再度生成したものです。

d0m1c7devn.com
kkgchkblea.com
efqkyjaflp.net
ulitjdfbs1.com

結論

マルウェアファミリMad Maxについて、公開された情報はほとんど見つけられませんでした。しかし、別の名前で以前に文書化されていたことが十分に考えられます。現在までのシンクホールの結果から、Mad Maxは現時点において間違いなくアクティブなボットネットと思われます。当初は、ドメインインジケータを入手し、モニタリング用インフラを導入するために、DGAの解析に注力したいと考えていましたが、私たちは分析を続けており、Mad Maxの特徴と内部動作についてより詳しく掘り下げた内容のフォローアップ記事をこのブログに掲載する予定です。

参考

[1] https://www.sophos.com/en-us/threat-center/threat-analyses/viruses-and-spyware/Troj~Scar-CR/detailed-analysis.aspx

付録I:Mad Max DGAのPythonによる再実装

このコードはMad Max検体c7d1357f4c4acceb1780db12ad1b4de1に基づいています。

# Standard imports 
import sys 
import datetime 
import hashlib 
import struct 

_DATESTAMP_FORMAT = "%Y-%m-%d" 
_TLD_LUT = { 
    1: ".com",      # 0x6f725b48 in 21020-child.dump 
    2: ".org",      # 0x6f725b52 
    3: ".info",     # 0x6f725b5c 
    4: ".net",      # 0x6f725b66 
    } 
_DGA_PREFIX = "www." 
_DGA_LUT = "jfyicbya26h5hvepgq07zfsqmdk4xcet9annmwuw8rok3lzsxlvjpdubog1rit" 
_LEN_DGA_LUT = len(_DGA_LUT) 
_LEN_DOMAINS = 10 

def _gen_system_time(date): 
    return { 
        "wYear": date.year, 
        "wMonth": date.month, 
        # Python datetime uses Monday=0; Windows SYSTEMTIME uses Sunday=0.... 
        "wDayOfWeek": (date.weekday() + 1) % 7, 
        "wDay": date.day, 
        "wHour": 0, 
        "wMinute": 0, 
        "wSecond": 0, 
        "wMilliseconds": 0, 
        } 

def _get_week_of_month(wDay): 
    if wDay 	<= 7: 
        # (1 - 7) 
        week_of_month = 1 
    elif wDay 	<= 14: 
        # (8 - 14) 
        week_of_month = 2 
    elif wDay 	<= 21: 
        week_of_month = 3 
    else: 
        week_of_month = 4 
    return week_of_month 

def _get_week(date): 
    system_time = _gen_system_time(date) 
    return (system_time["wYear"], system_time["wMonth"],
            _get_week_of_month(system_time["wDay"])) 

def _compute_dga_domain(week): 

    year, month, week_of_month = week 
    uuid_string = "9135d48a-6103-4894-856c-b29897742e52" 
    seed_string = "%s%d%d%d" % ((uuid_string,) + week) 

    md5 = hashlib.md5(seed_string).digest() 
    first_eight = struct.unpack("BBBBBBBB", md5[:8]) 
    last_eight = struct.unpack("BBBBBBBB", md5[8:]) 
    mod_first_eight = [0xff & (first + last) for first, last \
                       in zip(first_eight, last_eight)] 
    index_table = struct.pack("BBBBBBBB", *mod_first_eight) + md5[8:] 

    base_domain = "".join([_DGA_LUT[ord(_) % _LEN_DGA_LUT] \
                           for _ in index_table[:_LEN_DOMAINS]]) 
    return _DGA_PREFIX + base_domain + _TLD_LUT[week[2]] 

def compute_dga_domains(start_date, stop_date): 
    one_day = datetime.timedelta(days=1) 
    current_date = start_date 
    domains = [] 
    last_week = None 
    while current_date 	<= stop_date: 
        week = _get_week(current_date) 
        if week != last_week: 
            domain = _compute_dga_domain(week) 
            domains += [(current_date, week)] 
            last_week = week 
            print "DGA %s: %s" % \
                  (current_date.strftime(_DATESTAMP_FORMAT), domain) 
        current_date += one_day 

def main(): 
    num_args = len(sys.argv) 
    num_args = len(sys.argv) 
    if num_args not in (2, 3): 
        print "usage: %s YYYY-MM-DD [YYYY-MM-DD]" % sys.argv[0] 
        sys.exit(0) 
    start_date = datetime.datetime.strptime(sys.argv[1], _DATESTAMP_FORMAT) 
    stop_date = datetime.datetime.strptime(sys.argv[2], _DATESTAMP_FORMAT) \
                if num_args == 3 else start_date 
    compute_dga_domains(start_date, stop_date) 

if __name__ == "__main__": 
    main() 

付録II:2015年から2017年のMad Maxドメイン

以下の表には私たちのPython再実装版プログラムが生成した、週次のMad Maxホスト名が記載されています。日付欄は対応するホスト名が最初にアクティブになる日付を示しています。Mad MaxはUTC時間を使用して現在の日付を決定することに注意してください。

日付              Mad Max ホスト名
2015-01-01        www.3ipp3xuzn2.com 
2015-01-08        www.norkfcncep.org 
2015-01-15        www.b9koz9cfsv.info 
2015-01-22        www.zl4w1ywkcb.net 
2015-02-01        www.d0yfmwte92.com 
2015-02-08        www.cqzlyy4r70.org 
2015-02-15        www.w6zwihbwio.info 
2015-02-22        www.n2cackqdam.net 
2015-03-01        www.6jh8djurlq.com 
2015-03-08        www.mdfpzugyee.org 
2015-03-15        www.yucunblst3.info 
2015-03-22        www.ms4qvaqbfj.net 
2015-04-01        www.ovkdxfokzv.com 
2015-04-08        www.u6urscrrk6.org 
2015-04-15        www.7wxdv4ko7j.info 
2015-04-22        www.a3wanm9tiu.net 
2015-05-01        www.8gdgsnvzbk.com 
2015-05-08        www.yucb4xun51.org 
2015-05-15        www.5iedn8pao3.info 
2015-05-22        www.n5wzg9nvlf.net 
2015-06-01        www.gy7h1eunzx.com 
2015-06-08        www.q77mygab2h.org 
2015-06-15        www.x3vr7fujhv.info 
2015-06-22        www.k4gs4f0p1d.net 
2015-07-01        www.t8ozdrm7it.com 
2015-07-08        www.lwhma1sp3b.org 
2015-07-15        www.jcevu6f8qn.info 
2015-07-22        www.wb02o7dcww.net 
2015-08-01        www.lufwdyiqcl.com 
2015-08-08        www.k4uso1k8gw.org 
2015-08-15        www.e8ypd5j6cu.info 
2015-08-22        www.sddtlblj6b.net 
2015-09-01        www.gxqy0a6cr3.com 
2015-09-08        www.zmxguyaa0d.org 
2015-09-15        www.tuagk50g8f.info 
2015-09-22        www.dara03tcod.net 
2015-10-01        www.tlw495w9fy.com 
2015-10-08        www.q9efocpl9a.org 
2015-10-15        www.h53tk2ckgc.info 
2015-10-22        www.84j8ctoyno.net 
2015-11-01        www.cahxfxwhdl.com 
2015-11-08        www.hi6ke3wjg5.org 
2015-11-15        www.win1kzex2h.info 
2015-11-22        www.lkddneksnw.net 
2015-12-01        www.ovfqt1wjba.com 
2015-12-08        www.aniiz4kdof.org 
2015-12-15        www.5oh99oqwdd.info 
2015-12-22        www.d2dpbnmola.net 
2016-01-01        www.8ryede20if.com 
2016-01-08        www.iuj5agqlbr.org 
2016-01-15        www.bu0acmfjvq.info 
2016-01-22        www.43apmlncap.net 
2016-02-01        www.d0m1c7devn.com 
2016-02-08        www.bdw0gn8ne9.org 
2016-02-15        www.9c8lj4fko5.info 
2016-02-22        www.zti79gweis.net 
2016-03-01        www.sc2k3hlvwx.com 
2016-03-08        www.aonbxu3hnd.org 
2016-03-15        www.oybsgskbne.info 
2016-03-22        www.ptvrgivuiq.net 
2016-04-01        www.iovljwr3n4.com 
2016-04-08        www.jybiis0pee.org 
2016-04-15        www.oamkjmuhnr.info 
2016-04-22        www.n6jj3oqmzc.net 
2016-05-01        www.kkgchkblea.com 
2016-05-08        www.0dljcawhwp.org 
2016-05-15        www.auvkhn16f9.info 
2016-05-22        www.fmwglrs6aj.net 
2016-06-01        www.d5rwfbm8qf.com 
2016-06-08        www.ecickytlhg.org 
2016-06-15        www.at7vcefg1a.info 
2016-06-22        www.efqkyjaflp.net 
2016-07-01        www.ulitjdfbs1.com 
2016-07-08        www.9qnr6oyssk.org 
2016-07-15        www.4eabktj4al.info 
2016-07-22        www.9varj35nsb.net 
2016-08-01        www.s82r4luxrw.com 
2016-08-08        www.avuhtrgawe.org 
2016-08-15        www.v4begpio9s.info 
2016-08-22        www.qkqlh7fkuz.net 
2016-09-01        www.sozlflvrdn.com 
2016-09-08        www.4buzxug5wz.org 
2016-09-15        www.pipo6fidim.info 
2016-09-22        www.oavgocbqyd.net 
2016-10-01        www.dxhgzvc5bn.com 
2016-10-08        www.1nxkak8yvo.org 
2016-10-15        www.ikssxlzftv.info 
2016-10-22        www.6yena7muyi.net 
2016-11-01        www.5mswkfpzq5.com 
2016-11-08        www.dbajiezq61.org 
2016-11-15        www.ebxevvp7lz.info 
2016-11-22        www.qy3qn7ccl4.net 
2016-12-01        www.qnrpkzdr24.com 
2016-12-08        www.wbk5mt3tmu.org 
2016-12-15        www.ummoejaz44.info 
2016-12-22        www.xmuo30ddhw.net 
2017-01-01        www.ml219cyxyp.com 
2017-01-08        www.p4e8ev61mg.org 
2017-01-15        www.9r2nlncjqm.info 
2017-01-22        www.vdnjax5lmw.net 
2017-02-01        www.lleafj9q6y.com 
2017-02-08        www.bgyeydxsu7.org 
2017-02-15        www.m6u8pqstmz.info 
2017-02-22        www.15fe6ouzhm.net 
2017-03-01        www.efvdz4a52w.com 
2017-03-08        www.5shtguwy5y.org 
2017-03-15        www.muwiyn4lvd.info 
2017-03-22        www.ganuj7lstm.net 
2017-04-01        www.wyiywtizcw.com 
2017-04-08        www.sb3ydum9tt.org 
2017-04-15        www.cuqndqykyn.info 
2017-04-22        www.36dfnss0ay.net 
2017-05-01        www.aqe4c5zj3k.com 
2017-05-08        www.qasygeakes.org 
2017-05-15        www.yz3fnfbqqa.info 
2017-05-22        www.muwenvpb9h.net 
2017-06-01        www.whvr841hjs.com 
2017-06-08        www.pg0tndvnuq.org 
2017-06-15        www.cdmcowgsw0.info 
2017-06-22        www.akxnea6j2k.net 
2017-07-01        www.pykrlt96ci.com 
2017-07-08        www.dtitoebznc.org 
2017-07-15        www.iqm0ncmlty.info 
2017-07-22        www.59kneir7td.net 
2017-08-01        www.wmi7swjzxh.com 
2017-08-08        www.jbagepu54e.org 
2017-08-15        www.eftjllp0k9.info 
2017-08-22        www.qbnrsypzap.net 
2017-09-01        www.6asglp09sf.com 
2017-09-08        www.b2igkosvy7.org 
2017-09-15        www.4bpifpk85d.info 
2017-09-22        www.hnipgwg00w.net 
2017-10-01        www.r3ngsciwxs.com 
2017-10-08        www.ib3cdbcoe1.org 
2017-10-15        www.alqkjj0lpa.info 
2017-10-22        www.yp9bd1yuio.net 
2017-11-01        www.pkxcla4lqj.com 
2017-11-08        www.xjnf8aswtj.org 
2017-11-15        www.shbpagdfgg.info 
2017-11-22        www.qksibgsbkb.net 
2017-12-01        www.mwtetcdhcp.com 
2017-12-08        www.nazqb1dulk.org 
2017-12-15        www.gpsh39jabf.info 
2017-12-22        www.87uaj1f4cp.net