サイトが常にハッキングされているかどうかを調べる場所、またはクライアントのサイトでマルウェアをどのようにキャッチしたか

画像



この物語は非常に普遍的に始まった。 クライアントの1人は、Bitrix CMSで実行されている彼のWebサイトで、モジュールの設定が絶えず飛んでいることに不満を持ち始めました。 彼はクライアントのパスワードを変更し、夜のバックアップからサイトを復元し、冷静に彼のビジネスに取り組み、パスワードと破壊行為の通常の妥協として状況を書き留めました。



しかし、数時間経っても症状は再発せず、PHPコードの一部がランダムな場所で消去されたため、意図的にサイトをシャットダウンしようとしたことが示唆されました。 一日に5-6人の出席者がいる小さな集落の典型的な州のサイトを公開する必要があった結論は、管轄当局に委ねられます。



1)外部IPアドレスの2ip.ruまたは他の同様のサービスを確認し、すべてのサイト管理者に、現在インターネットに接続しているIPを送信するように依頼します。 ここでのルールは単純です-1C-Bitrix管理フォルダーへのアクセスはこれらのアドレスからのみ行う必要があります。



2)Webサーバーアクセスログファイルを開きます。ApacheWebサーバーの場合、通常はパス/var/log/apache2/access.logに沿ってサーバー上にあります。 サイト管理者に属さないアドレスからの管理ファイルのリクエストを探しています。 私の特定の場合、この行は私を混乱させました:

xxx.xxx.xxx.xxx - - [xx/xx/2015:xx:xx:xx +0300] "POST /bitrix/admin/htmleditor2/bitrix_log.php HTTP/1.0" 200 4 "http://xxxxxxxxxxxxx/bitrix/admin/htmleditor2/bitrix_log.php" "Mozilla/5.0 (Windows NT 6.1; rv:31.0) Gecko/20100101 Firefox/31.0"
      
      





ここで、管理ファイルへのアクセスは、最初の段落のリストにないIPアドレスからだけでなく、Bitrix CMS配信に元々含まれていなかったファイルにもアクセスします! ログとファイルを使用する場合、サイトが動作するCMSの参照コピーを個別に展開して、ファイルを比較して変更されているかどうかを確認することをお勧めします。



3)/bitrix/admin/htmleditor2/bitrix_log.phpファイルを開きます。 次のシンボルのミッシュマッシュが目に見えます。



 <?php $auth_pass = "b1248f5dde2d214b74ef121288b61801"; $color = "#df5"; $default_action = 'FilesMan'; $default_use_ajax = true; $default_charset = 'Windows-1251'; $o='HZzFksNKuoQ';//   20    ,      //eval("\x65\x76\x61\x6C\x28\x67\x7A\x69\x6E\x66\x6C\x61\x74\x65\x28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28\x24\x6F\x29\x29\x29\x3B");
      
      





攻撃者が文字の後ろに隠そうとしたeval()関数(後で判明したように、これはzipアーカイブのテキスト表現です)、私はすぐにコメントアウトしました。



原則として、通常の管理者は、指定されたファイルを単に削除し、他のスクリプトでeval関数を検索し、そうでない場合は、削除して研究を終了することができます。 しかし、私はこの民芸品がサイトとサーバーで何をするかを見ることにしました。



まず、次の行に注意してください。



 eval("\x65\x76\x61\x6C\x28\x67\x7A\x69\x6E\x66\x6C\x61\x74\x65\x28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28\x24\x6F\x29\x29\x29\x3B");
      
      







HEX記号の代替は肉眼で見ることができます。 HEXデコーダーを使用すると、肉眼で判読可能なテキストに変換できます。 これを使用しました

デコーダーに入力すると、 ズボンの記号が変わります。



 eval(gzinflate(base64_decode($o)))
      
      





エレガントな家族のパンツに、デコードされて$ o変数から解凍されるコード実行(「不明」の束を含む、または単にアーカイブされた情報を含む)。 この作成の開発者は、難読化から保護するために非常に一生懸命努力しました。つまり、変数$ oを解読する最も地獄的な試みで、再びevalに遭遇しました(gzinflate(base64_decode([LOT OF SYMBOLS])))) 。 しかし、これは回避できます。



大量の文字が解読コードを追加した後、コードはわずかに書き直されました。



 $string = gzinflate(base64_decode($o));
      
      





その後、コードが周期的にそれ自体を解凍し、解凍された部分を開始することがわかります。 コードを実行せずに同じサイクルを実行できますが、完全に解凍されるまで変数のいずれかにダンプします。 なぜなら アーカイブの各「反復」では、コードに初期行eval(gzinflate(base64_decode(解凍されたバージョンにこの行が含まれない場合、サイクルを停止できます。解凍されたコードは、さらなる分析のためにファイルにマージされます。



PHPでのこのコードの実装は次のとおりです。



 while (substr_count($string,"eval(gzinflate(base64_decode(")>0) { $string = str_replace("eval(gzinflate(base64_decode('","",$string); $string = str_replace("')));",");",$string); $string =gzinflate(base64_decode($string)); } file_put_contents("unpacked.dat",$string);
      
      





スクリプトが完了したら、unpacked.datを開き、ファイルマネージャーとその他の「ジンジャーブレッド」を備えた典型的なphpシェル(海)を確認します。 サーバー上で、各クライアントのWebサイトはこのクライアントのユーザー権限で動作しますが、これはほとんど削減されていますが、exec()コマンドは禁止されています。 したがって、攻撃者はこのサイトでのみonly笑し、他のサイトにtoうことができませんでした。



そして彼はシェルの難読化の方法を選択しましたが、あまり成功していません-eval関数はめったにbitrixで使用されません。 このため、シェルは葬儀の道化師としてサイトの全体構造で際立っています。



シェルに入る方法も非常に重要でした。クライアントがサーバーにサイトのコピーを2つ持つ前は、そのうちの1つはJoomlaの古い「ふるいのような」バージョンのサイトの古いバージョンでした。 このバージョンのサイトは、コンテンツを新しいサイトに簡単に転送するために残されました。 この時点で、Joomlaの穴からシェルが読み込まれました(サイトは隣接するフォルダーの1人のユーザーの下にありました)。



したがって、私は常に古いバージョンのサイトを別の仮想マシンに配置しますが、これは残念なことではありません。 それをお勧めします。



UPD最も印象的な人を怒らせないように、「たわごと文字」というフレーズを削除しました。



All Articles