Apache Strutsの脆弱性に攻撃を仕掛けるハッキングツールとWebShell

トレンドマイクロの脅威リサーチ部門であるフォワードルッキングスレットリサーチでは、「Apache Struts(アパッチ・ストラッツ)」が抱える一連の脆弱性に対して攻撃を仕掛けるハッキングツールが流通していることを確認しました。

Apache Struts とは、Apacheソフトウェア財団の Apache Strutsプロジェクトにて開発されているオープンソースの Java Webアプリケーションフレームワークです。2013年7月16日に、深刻な脆弱性を修正するアップデート「Struts 2.3.15.1」がリリースされています。

ここでいう深刻な脆弱性とは、アプリケーションサーバの実行権限で任意の OS コマンドが実行可能となるものです。一般にハッキング行為は 6つの段階を経て行われるとされています。「フェーズ1:偵察」、「フェーズ2:スキャン」、「フェーズ3:アクセス権の獲得」、「フェーズ4:アクセス権の維持/引き上げ」、「フェーズ5:窃盗」、「フェーズ6:証拠隠滅」です。

今回確認されたハッキングツールは、Apache Struts の脆弱性を突くことによって、これら攻撃の各フェーズにおいて必要となるアクションを 1つのツールで実現できるようにパッケージ化されていました。

敵を知ることで身を守るという孫子の兵法に基づき、今回はその詳細について紹介したいと思います。

■Struts2 の攻撃ツールは中国語圏のハッカーコミュニティにて公開
今回、我々が確認したハッキングツールは、中国語のコミュニティにて7月19日付けで公開されたものでした。したがって、脆弱性が公表されてから僅か3日間で作成、公開が行われたと言えます。

図1:ハッキングツールが配布されている中国語のコミュニティ)
図1:ハッキングツールが配布されている中国語のコミュニティ)

ハッキングツールを起動すると、対象としている脆弱性が「S2-016」(CVE-2013-2251)、「S2-013(CVE-2013-1966)」、「S2-009(CVE-2011-3923)」、「S2-005(CVE-2010-1870)」であることが表示されます。これらの脆弱性に共通することは、任意の OS コマンドが実行可能であるという点です。

図2:ハッキングツールのユーザインターフェイス
図2:ハッキングツールのユーザインターフェイス

ハッキングツールは複数の機能から構成されており、これらを使い分けることで攻撃の各ステージで犯罪者にとって必要なアクションの手助けとなります。

■ハッキングツールに関する動作検証
今回は、実際にテスト環境でこのハッキングツールに関する動作検証を行いました。

[検証環境]
OS Microsoft Windows 7 Ultimate
Webサーバ Apache Tomcat 7.0.41
Java環境 JDK 1.7.0_25
Struts Apache Struts 2.3.15
サンプルアプリ struts2-blank.war
標的 http://<省略>:8080/struts2-blank/example/HelloWorld.action
[ハッキングツール]
MD5 4674D39C5DD6D96DFB9FF1CF1388CE69
SHA1 9C6D1700CF4A503993F2292CB5A254E4494F5240

ツールには、あらかじめいくつかのコマンド構文が登録されています。これらは、犯罪者が「偵察」の際に使うことが知られているコマンド群と言えます。なお、コマンドは Windows と Linux双方の環境を意識したものが用意されています。これらコマンドのうち、「netstat -an」について動作確認を行った際の画面キャプチャを掲載しています。日本語表記が文字化けしているものの、犯罪者にとって必要な情報は入手可能であることが確認できました。ハッキングツールによるコマンド実行は、Apache Tomcat の実行権限で動作していることが「whoami」の結果から読み取れます。従って、Tomcat を権限の低いユーザで動作させている場合には、被害を限定的にすることが可能と考えられます。

図3:ハッキングツールによる標的に対するnetstatコマンドの実行結果
図3:ハッキングツールによる標的に対するnetstatコマンドの実行結果

実行コマンド 説明 対応OS
whoami 現在のアカウントを確認 Windows/Linux
id ユーザのID情報を表示 Linux
netstat -an ネットワーク情報の表示 Windows/Linux
dir ファイル・ディレクトリの情報を表示 Windows/Linux
ls ファイル・ディレクトリの情報を表示 Linux
ipconfig ネットワーク設定詳細の表示 Windows
ifconfig ネットワーク設定詳細の表示 Linux
net user ユーザアカウント情報の表示 Windows
net user ユーザ名 パスワード / add ユーザアカウントの追加 Windows/Linux
systeminfo ローカルシステムに関する情報の表示 Windows
systeminfo ローカルシステムに関する情報の表示 Windows
uname -r OS のリリース番号を表示 Linux
uname -a すべてのシステム情報を表示 Linux
lsb_release -a 各ディストリビューションの LSB (Linux Standard Base) 情報を提供 Linux
表:ハッキングツールが事前に用意しているコマンド構文

■不自然なHTTP通信
ハッキングツールで利用する脆弱性として「S2-016」を指定し、「whoami」コマンドを実行した際の HTTP通信について観測を行いました。

図4:ハッキングツールによる送信内容
図4:ハッキングツールによる送信内容

ここからは、ProcessBuilderクラスを利用してサーバ上でプロセスを作成し、whoamiコマンドを実行しようとしていることが確認出来ます。Java においてオペレーティングシステムのコマンド(プロセス)を起動させるには「Runtime.exec()」や「ProcessBuilder」といった方法があります。ProcessBuilder は、JDK1.5以降で実装された方法です。ここに犯罪者の意図が何か含まれているのかは定かではありません。

このほか、ハッキングツールならではの特徴的な通信が見受けられます。GETリクエストであるにも関わらず、Content-Typeヘッダが付与されています。また、通信元を詐称するためなのか「User-Agent:」として「Googlebot」が指定されていることも確認できます。

この攻撃を受けた際の Apache Tomcat におけるアクセスログを確認してみます。

図5:ハッキングツールにて攻撃を受信した際のApache Tomcatのアクセスログ
図5:ハッキングツールにて攻撃を受信した際のApache Tomcatのアクセスログ

こうして切り出して見ると異変に気づくことは容易といえます。しかしながら、膨大なログの中からリクエストの正当性を判断することは極めて困難な作業になると予測されます。

■ハッキングツールによる WebShell の設置
ハッキングツールに関する動作検証によって、任意の OS コマンドが実行可能であることが実証されました。このハッキングツールの危険度を評価する上で付け加えるべき重要な情報があります。それは「WebShell」設置の支援機能です。

WebShell とは、バックドアの一つで、攻撃者が潜入に成功した Webサーバに自由に出入りできるようにする、すなわち「アクセス権の獲得」や「アクセス権の維持」をするために設置するものです。

WebShell にはアプリケーションフレームワーク毎に様々な種類があります。例えば PHP環境で動作する「PHP_C99SHELL」ファミリや「WSO Web Shell」はこれまで多くの改ざんサイトで確認されています。このほか、Microsoft ASP.NET環境で動作する「ASPXSpy」などがあります。犯罪者は侵入した Webサイトで利用できるアプリケーションフレームワークを判断し、設置する WebShell を選択します。今回このハッキングツールが設置を推奨しているのは、JSP でコーディングされたものでした。Apache Struts は Java に関する Webアプリケーションフレームワークです。従って、確実に JSP型のWebShell が動作するフレームワークが整っていることを見越して推奨していると考えられます。

JSP型の WebShell は、2009年に数多くのWebサイトに被害をもたらした「Gumblar」攻撃以前からその存在は確認されており、ハッキングツールとしては、古い部類のものといえそうです。しかし、バージョンアップを重ねその機能は現在も十分に通用する強力なツールとなっています。実際、インターネット検索エンジンにおいて特別な検索クエリを使って検索すると、JSP でコーディングされた WebShell が設置されたままになっている Webサーバ(おそらく改ざんサイト)を数多く発見することができます。今回のハッキングツールでは、設置先を指定することで、わずか数クリックで JSP型の WebShell を設置することができます。防御側にとってこれほど迷惑な機能はありません。

図6:ハッキングツールによるWebShell設置機能
図6:ハッキングツールによる WebShell設置機能

今回は、ハッキングツールの検証に利用したテスト環境に対して、「JspWebShell」の設置を試みました。この JspWebShell では、設置した犯罪者以外が利用できないようにパスワード認証が設けられています。

図7:JspWebShellのパスワード認証
図7:JspWebShell のパスワード認証

犯罪者が設定したパスワードを入力し、ログインするとユーザインターフェイスが現れます。画面キャプチャからは Windows の Cドライブ直下が閲覧できることが確認出来ます。ほとんどの WebShell では、「ファイルマネージャ(任意のファイル・ディレクトリの作成、削除、コピー、ダウンロード)」や「コマンド構文の実行」機能を有しています。

図8:JspWebShellのユーザインターフェイス
図8:JspWebShell のユーザインターフェイス

■より高機能な WebShell
アンダーグラウンドコミュニティでは、「情報探索」、「窃盗」機能について強化した WebShell を入手することも可能です。ファイルマネージャ機能を中心とした WebShell は進化し、次の機能を包含したバージョンも流通しています。

大項目 機能 説明
File Manager Del 削除
Move 移動
Pack ZIPアーカイブ
Edit 編集
Down ダウンロード
Copy コピー
Property プロパティ情報の更新
Unpack ZIPファイルの展開
File Manager データベース接続 SQLインジェクション攻撃などに利用可能
データベースクエリ
SQLコマンドの実行
Export
Execute Command プログラムの実行  
シェルの実行  
Shell OnLine ブラウザからのシェルの利用  
Back Connect バックドアクライアントが接続するポートの開放  
Port Scan ポートスキャン スキャン攻撃の踏み台として利用可能
Download Remote File ファイルのアップロード、ダウンロード  
Clipboard クリップボートの情報記録  
Remote Control リモートサーバの設定  
Port Map    
Jsp Env Java環境の表示  
表:JspSpy機能一覧

図9:JspSpy の使用説明書
図9:JspSpy の使用説明書

■対策は「修正済みバージョン」の利用を原則とし回避策を活用
孫子の兵法では己を知ることの重要性も説いています。ここまで、敵を知るための情報を提供しました。

ハッキングツールの特徴
  • 脆弱性の公表日から3日後にハッキングツールが公開
  • 脆弱性を抱えた Apache Struts を特定できればハッキングツールによる任意の OSコマンド実行は容易
  • ハッキングツールによるパケットは正規パケットには見られない特徴を有している
  • ハッキングツールを使うことで、アクセス権の取得や維持を目的とした WebShell の設置がわずか数クリックで可能
  • WebShell は日々進化し、SQLインジェクションやポートスキャンなどの攻撃もパッケージ化されたものが流通している

ここからは自らの環境を見直すことについて考えていきたいと思います。

今回の攻撃において標的となっているフレームワークとは、通常直接的に目に触れるアプリケーションではありません。従って、必ずしも全ての環境で利用状況やバージョン管理がなされているとは言いがたい状況です。まずは、自身の管理する資産の環境と対策の優先度を整理することが望まれます。

Apache Struts が抱える一連の脆弱性に対する対策としては、修正済みバージョンを適用することが強く推奨されます。

「S2-016」、「S2-013」、「S2-009」、「S2-005」 修正済みバージョン
Apache Struts 2.3.15.1

しかし、フレームワークという性格上、リグレッションテストの実施など、修正済みバージョンの適用までにかかる時間は長期化する傾向があります。このような場合には、「mod_rewrite」などを使って脆弱性の原因となるプレフィックスを含んだリクエストを拒否する設定も有効です。

脆弱性の原因となるプレフィックス
action:
redirect:
redirectAction:

こうした対策も実施困難な場合には、「不正侵入防止システム(IPS、Intrusion Prevention System)」や「Web アプリケーションファイアウォール(WAF)」機能を含むセキュリティ対策製品により脆弱性の原因となるパケットを遮断する対策の利用を検討することも可能です。

また、今回のような脆弱性による被害を根本から抑制する方法として、セキュアOS の利用により権限を抑えることで、脆弱性を悪用させない対策について検討することも考えられます。