すらすと’s 生活の跡

不真面目な元高専生によるなにか

【備忘録】Zabbix使ってみたかったけど、時間がかかったのでとりあえず入れてみる

※追記、2020/09/06

そういえば、Zabbixが何ぞや的お話書いてなかった。 簡単に書くと、サーバ/NW装置の管理/監視のためのフリーツールです。

※追記、2020/09/07

zabbix-agent2なんてものあったんですね。 そっちの方が良さげなので情報をUpdate。(但し詳細設定は書かず)


前回の検証環境から。

【備忘録】ESXiを使って宅内検証環境つくる - すらすと’s 生活の跡

環境

  • ゲストOS: ArchLinux x86_64 (SELinux無効 (おい※))、logArchと命名
  • Web3層部分: LEMP Stack (Linux / nginx / MySQL (MariaDB) / PHP)
  • 導入バージョンはArchのデフォルトリポジトリを使うので大体最新版
  • Windows Terminal使用、Ubuntu18.04 (WSL2)にてSSH接続

SELinuxはArchのデフォで無効、なので別の機会に勉強したい

やりたいこと

  • ESXi関連のログ収集とステータス管理
  • Raspberry Piのステータス管理
  • ログやステータスのWebGUI表示
  • SSLは今回なし、別の機会に導入を検討する (導入するとh(ry)

導入

以下パッケージを導入、何も考えず動かせる(だろう)ものを入れていく。

# pacman -S nginx mariadb zabbix-server zabbix-agent2 zabbix-frontend-php php-fpm

nginx

まずはnginxの連携やディレクトリ等の設定を修正する。 今回の修正箇所は以下の通り。

※<VM_Network-Range>: VM Network側NICに割り当てたAddress Range、"0.0.0.0/0"形式で指定

※<HostOnly_Network-Range>: HostOnly Network側NICに割り当てたAddress Range、"0.0.0.0/0"形式で指定

events {
    worker_connections  512;
}

(略)

http {

(略)

    server {
        listen       80;
        server_name  logArch;
        allow        127.0.0.1;
        allow        <VM_Network-Range>;
        allow        <HostOnly_Network-Range>;
        deny         all;
        root         /srv/http;
        index        index.html index.htm index.php;

(略)

        location / {
        }

        location /zabbix/ {
            root    /srv/http/zabbix;
        }

        location ~ [^/]\.php(/|$) {
            fastcgi_pass   unix:/run/php-fpm/php-fpm.sock;
            fastcgi_index  index.php;
            include        fastcgi.conf;
        }

(略)

    }

(略)

}

設定が終わったらnginxを起動して、怒られないことを確認する。

systemctl start nginx.service

※設定がおかしければ起動できないので、journalctl -xeで何が問題かを確認する。

最後に、/srv/http/index.phpに以下のコードを入れてPHPの動作を確認する。

タグにphpを入れ忘れると動かないので注意!! (n敗 | 5 < n < 20) なぜ入れ忘れるのか…。

<?php
  phpinfo();
?>

f:id:thrust2799:20200906145807p:plain
phpinfo(); 結果確認 (IPアドレスは削除済み)


MariaDB

次に、MariaDBの設定をArchWikiに沿って実施していく。 まずは初期設定投入と起動から。

引数のディレクトリを変えたりすると動かなくなることがあるのでコピペで投入したいところ。(1敗)

# mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql

(略)

# systemctl start mariadb.service

続いて、インストールの後処理を実施。 パスワードの変更やtest設定の削除を対話式で一度に処理できる。

# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.

You already have your root account protected, so you can safely answer 'n'.

Switch to unix_socket authentication [Y/n] n
 ... skipping.

You already have your root account protected, so you can safely answer 'n'.

Change the root password? [Y/n] y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

Zabbix-Frontend-PHP

ZabbixのArchWikiを見て設定をする。 まずはZabbixの格納先を整えていく。

ln -s /usr/share/webapps/zabbix /srv/http/zabbix

次にPHP設定だが、少し情報が古い / 一般的なので以下のように変更。

open_basedir/tmpを入れたくないお気持ちで外すとエラーを返されました。 そういうものですか?

※動かすための最低限の設定なのでもっとセキュアな設定にすべきとは思う。

open_basedir = /usr/share/webapps/:/srv/http/:/tmp/
cgi.fix_pathinfo=0
extension=bcmath
extension=gd
extension=gettext
extension=mysqli
extension=sockets
post_max_size = 16M
max_execution_time = 300
max_input_time = 300
date.timezone = Asia/Tokyo

続いてMariaDBの利用設定。エラーがなければ出力はない。

なお、create databasecollate utf8_binはないと後々怒られが発生する。 Wikiにはないけど…。

※<DB_Password>: ZabbixがDB参照するときのパスワード

# mysql -u root -p -e "create database zabbix character set utf8 collate utf8_bin"
# mysql -u root -p -e "grant all on zabbix.* to zabbix@localhost identified by '<DB_Password>'"
# mysql -u zabbix -p zabbix < /usr/share/zabbix-server/mysql/schema.sql
# mysql -u zabbix -p zabbix < /usr/share/zabbix-server/mysql/images.sql
# mysql -u zabbix -p zabbix < /usr/share/zabbix-server/mysql/data.sql

なお、ここで設定した<DB_Password>は/etc/zabbix/zabbix_server.confにも設定した方が良さげ。 少なくともjournalのエラーは消える。

Wikiにも書いといてくださいよ…。 (他力本願)

DBPassword=<DB_Password>

続いて、ZabbixとMariaDBの連携サービスを立ち上げる。

systemctl start zabbix-server-mysql.service

適当なブラウザでhttp://<logArchのアドレス>/zabbix/にアクセスすると、起動しているはず。

f:id:thrust2799:20200906160433p:plain
ZabbixのWebGUIで初期設定を実施する

ここまでくれば、あとはCLI最終処理としてService起動設定を変更。

# systemctl enable nginx.service php-fpm.service mariadb.service zabbix-server-mysql.service zabbix-agent2.service

Zabbix WebGUI

以降、画面に従って設定を入れていく。

要件適合チェックはPHP LDAPがoffでWarningとなっているが、そもそもLDAPは使わないので無視でOK。 LDAPを使う人はPHPのモジュール設定を変えたりとか? 設定方法がわからない…。

f:id:thrust2799:20200906212955p:plain
要件適合チェック

MySQLの接続設定は、MariaDB設定で使ったDatabase Name / User / Passwordを設定する。 間違えるとここで怒られます。

なお、フラグは回収した模様。(1敗)

f:id:thrust2799:20200906211506p:plain
DB接続設定

次に、バックエンドへ接続するための設定を実施する。 ここはデフォルトで問題ない。

f:id:thrust2799:20200906211548p:plain
zabbix-serverへの接続設定

設定が正常に入れればこの画面へ。 ここで最終確認し初期設定を完了、

f:id:thrust2799:20200906211625p:plain
設定項目の確認

f:id:thrust2799:20200906211701p:plain
設定ファイル生成失敗

しない。(大敗)


Serviceファイルの編集

ここでSystemdの仕様に転がされます。

php-fpm /usr read onlygoogle先生に問い合わせると、どうやらSystemdの仕様で/usr等々への書き込みがブロックされるらしい。 このせいでphp-fpmによるPHP関数の実行が阻害されていた模様。

[Service]ProtectSystem=fullがこの仕様に該当するらしい。 セキュリティ上これは外すのは良くないのでどうにかしなければいけない。

だったら/usrに作ってくれるなよな…とも思う。

ちなみに、journalログはこんな感じ。

IPアドレスとか日時はぼかした。改行も適宜入れた。

mmm dd HH:MM:SS logArch nginx[2456]: yyyy/mm/dd MM:HH:SS [error] 2456#2456: *46 FastCGI sent in stderr: 
"PHP message: PHP Warning:  file_put_contents(/usr/share/webapps/zabbix/conf/zabbix.conf.php): 
failed to open stream: Read-only file system in /usr/share/webapps/zabbix/include/classes/core/CConfigFile.php on line 190" 
while reading response header from upstream, client: <Client IP Address>, server: logarch, 
request: "POST /zabbix/setup.php HTTP/1.1", upstream: "fastcgi://unix:/run/php-fpm/php-fpm.sock:", 
host: "<Server IP Address>", referrer: "http://<Server IP Address>/zabbix/setup.php"

仕方がないので、Serviceファイルの上書きを実施する。

コマンドはsystemctl edit php-fpmで、上書きしたい設定だけを記載していく。

※今回の場合、上書き設定のファイル実体は/etc/systemd/system/php-fpm.service.d/override.confに保存される。

[Service]
ReadWritePaths=/usr/share/webapps/zabbix/conf /usr/share/webapps/zabbix/local/conf

f:id:thrust2799:20200906215844p:plain
初期設定の完了

無事完了。


ようやくログイン

ユーザは、Admin、初期パスワードはzabbix

f:id:thrust2799:20200906221108p:plain
ログイン画面

f:id:thrust2799:20200906221210p:plain
ログイン成功!!

いえい。

agentが応答なしなのはまた別のお話。設定ろくに入れてないからね…。

所感

PHPが罠すぎるのでやっぱり好きになれない。






あと、日本語Wikiとかの情報が古い…。(他力本願)

ソース等

※(一部含まれていないかも、いろいろ調べたので…。)

【備忘録】ESXiを使って宅内検証環境つくる

※誰かが読むことあまり考えてない。ゆえに画像なし。

ESXiのお話

VMware ESXi:専用のベアメタル ハイパーバイザー

物理サーバ上に直接インストールする堅牢なベアメタル ハイパーバイザーを紹介します。VMware ESXi は基盤となるリソースに直接アクセスして管理できるため、ハードウェアを効果的にパーティショニングして、アプリケーションの統合とコストの削減を実現できます。業界をリードするその効率的なアーキテクチャは、信頼性、パフォーマンス、およびサポートにおいて標準となっています。

※引用: ESXi | ベアメタル ハイパーバイザー | VMware | JP (https://www.vmware.com/jp/products/esxi-and-esx.html)

とりあえず。VMWare製のHypervisorであるESXiを自宅で使ってみる回。 ユーザ登録すると無償利用できると社の先輩から聞き及んでいたので使ってみる。

無償版の制限とか (一部)

8コア以上のCPUが使えないのと、vCSAみたいな別のESXiとの連携が使えないらしい。 そもそも業務用とかで使う機能を一部とは言え無償で使えるのであまり気にしない。 Xeonとか高性能なPCを複数持っている人じゃなきゃ使わないでしょというお話がある。

ブレードサーバとかで使う人もいるんですかね...?

環境構築

今回の環境

  • Motherboard: ASRock Z97 Extream 6
  • CPU: Intel core i7 4790K
  • Memory: DDR3 16GB (何Hzとか普通に忘れてしまった...OCメモリだった気がする)
  • HDD: WDの500GBなもの

見てわかる通り,2014年代後期のパーツ構成. メインPCの基幹部を「My new gear...」したのでそこから出てきたもの.

※※CPUソケットのピンを曲げて,そのあと何とか使えるようにしたのはまた別のお話...。

ESXiについて

今回は最新版の「vSphere Hypervisor 7.0.0」の無償版を利用。 ESXiなのかvSphere Hypervisorなのかわからないが、どうもお求めのものはこれらしい。 間違って試用版を手に入れるとライセンスもらえない ので要注意です。(1敗)

インストーラがISOファイルで降ってくるので、適当にUSBにGPT(UEFI Boot)で書き込んでみる。 容量は1GBあれば余裕でした。

EFIパーティションを作らないとまともにBootしてくれません。 (0敗)

※なぜか今回はEFIパーティションしか作られなかった。ESXi本体ってもしかしなくても軽い?

ESXiのインストールに際し…。

  • Intel VT-dとかの仮想化支援機能はオンにしておくこと
  • SecureBootはピンクスクリーン (ESXi版ブルースクリーン) のもとっぽいです

ここら辺までは、まぁ非WindowsかつHypervisorなのでまだわかるが、次からが問題。

  • SATAが認識されないことがあるっぽい?
  • Software RAIDは使えないです。
  • OnboardなNICは認識しないことが多い。

バイス関連でここがかなりクリティカル。 RAID5を組もうとASRockのMBさんに頑張ってもらったら、サポートされてませんでした。 ただ、SATAは普通に認識したので単一HDDにインストール。

NICについてですが、 管理上必ずNICが必要になる なので使えないと致命傷です。 どうもインストールするための人権すら獲得できなくなる模様。 いろんなところでOnboardなNICを認識しない報告があるのだが、今回は なぜか 認識しました。

※今回使用したMBはLANを2系統 (Intel/Realtek)を装備していて、Intel側を何とか認識してくれました。

ESXi、起動

インストール後に再起動したら普通に起動するので、Web経由でログイン。 rootパスワードはインストールで指定したものを使用。

なお、設定はすべてWebやSSHを通じて実施する。

※昔はHost Clientなるアプリがあったらしいが、現在はすべてWebベース。

パッチ (2020/07/26現在)

どうやらパッチが1個あったようなので、My VMWareからDL。 SSHでメンテナンスモード化、パッチ適用を実施する。

仮想マシンを入れる

ここからはほとんどWorkstation Playerと同じ感じ、vmtoolsdが入っていればより便利になるのも一緒。

Network周りとか

現状の設定ベース

f:id:thrust2799:20200726170845p:plain
ネットワーク周りの構成

  • vmk0 : 管理ポートに当たる部分で、WebGUIやSSHはここに接続しに行く。 IPアドレスはこれに振られる。
  • vmnic0 : いわゆる物理NIC。今回でいえばOnboardなIntel NICのこと。
  • Management Networkなど(オレンジのやつ) : ポートグループと呼び、論理NWのグループ。 VLAN設定とかができる。
  • vSwitch0 / 1 : 仮想のL2SW。ここにvmnicやらポートグループがくっつく。L2な設定はここで基本実施する。

図でいえば、vmnic0がつながったvSwitch0の上にManagement NetworkとVM Networkがつながっていて、Management Networkはvmk0がつながっている感じ。

※わけわかんねぇな?

現段階でちょっと引っかかったところ

VMで外部接続NICとBridge組むじゃん? そしたら外部と疎通できなくなるんじゃ。(は?

原因はL2のセキュリティ設定で「無差別モード」(プロミスキャスモード) 「偽装転送」を拒否していたから。 どうも設定したMACアドレスと違うアドレスで出ていくとESXi側で通信を落とすらしい。

VMでコンテナ立てるとSSHアクセスとか諸々できずに乙るので設定変更。

※ここで5時間溶けた。

ToDo

  • 自宅鯖化する
  • 使えないRealtek NICを使えるようにする
  • RAIDボードとかNICボードとかSSDを5枚位とかほしい

以上。

ICTトラブルシューティングコンテスト2018に参加した話

学生最後の大会、今回はinsecureじゃなくてincompleteで参加させていただいた。 今は電車の中スマホで書いてる。 ホテルで本書きした.

後輩たちには多大なる感謝。

大会のトップページ:

icttoracon.net

どういう大会

ICTトラブルシューティングというだけあって問題解決を主とする大会。 今年度から通年で開催になったらしいが今回が初出場なので詳しくは分からず。 ジャンルはサーバー系やネットワーク系、CTFでもネットワーク系が好きなジャンルだったので今回もネットワーク系問題を解いていた。

予選が夏と冬の2回あって、一次予選ではルーティング問題、二次予選はwordpressのosコマンドインジェクション等々の脆弱性対策をやり、本選はipv6をやった。 二次予選でサーバー系やってるのは仕様、ツッコむな。

大会の様子

開始直前にスコアサーバーが吹っ飛んだりしたとか。 どの大会でもスコアサーバー何かしら問題が発生してるしもうそういう宿命なのかもしれない。

その後、問題が紙で配られたりしてText-based Problemsとか言ってたり。 あれ完全にPaper-based Problemsの間違いです本当にありがとうございました。

その後スコアサーバーが復旧したけど問題が全部開示された。 運営の思惑としては順番に解いてほしかったんだろうけど個人的にはこれも良いのではないかと思っていた。

それ以降は特にトラブルもなく、運営もトラブルシューティング完了したのかってお話。 どこかからCTFd改造して…って話聞こえたけど、やはり基盤としてそういうものの整備が望まれるなぁと思うなどした。

問題のWrite upを軽く

本当はもっとしっかりやろうと思ったけどデータ取り逃した、許して。 ちゃんとしたのは運営の解説に期待します。

問題: IPv6アドレス割当方式の移行に失敗した

満点: 240

あなたの部署ではIPv6のネットワークを使用しており、ルータ以下に fd00:10::/64fd00:11::/64 の2つのサブネットがあり,それぞれのサブネットに端末がある。 fd00:10::/64には端末1が存在し fd00:11::/64 には端末2が存在している。

fd00:11::/64 のサブネットでは今まで静的にIPv6アドレスを割り当てていたが,自動的な割り当てに切り替えることになった。 ところが、切り替え作業時にオペレーションミスあ発生してしまい、端末2がIPv6アドレスを失ってしまったらしく、端末1から端末2へアクセスできなくなってしまった。

この状態から切り替え作業を完了させ、端末2に fd00:11::/64IPv6アドレスを自動的に割り当てて端末1からアクセスできるようにしてほしい。 なお端末2のアドレスとしては fd00:11::100 - fd00:11::199 の範囲のみが使用を許可されている。

情報

ルータ

IPアドレス: 192.168.10.1
ユーザー: admin
パスワード ***** (脚注: 一応ぼかしてみている)

端末1

IPアドレス: fd00:10::2/64
ユーザー: admin
パスワード ***** (脚注: 一応ぼかして(ry)

端末2

ユーザー: admin
パスワード ***** (脚注: 一応b(ry)

構成

f:id:thrust2799:20190303204306p:plain
構成

経過概要と感想

とりあえずルータにsshでアクセス。 どうせCiscoのスイッチって思ってたらVyOSが出てきて???となったのはまた別のお話。

どうやらipv6dhcpを実現すれば良さそうなので設定。これでいけるかと思ったら全く上手くいかず。 tcpdumpしてもICMP6だけでDHCP6が来ない。 端末2生きてる?って何回も思ってた。

1日目はこれで終了して、その時解けていた1チームスゲーになってしまった。 懇親会では「ipv6がつらい」と言った。(実はこれは違うが後ほど) ホテルに戻ってipv6とdhcpv6、あとはRA (Router Advertisement)が必要らしかったのでそれも含めて全部調べ直して、2時くらいに力尽きた。

明けて2日目、RAがいらないんじゃないかとかいう相当にトチ狂った発言が出る中、特別協賛もいただきながら再開。

最初は前日と同じで意気込み虚しくドン詰まり。

色々とやってて、偶然端末2のリンクローカルアドレスが見つかって、そこから 端末2でdhcpクライアントが動いていない ことが発覚。 よく「電源つかないと思ったらプラグ抜けてた」なんて笑い話あるけど、今回はまさに 「インターネット繋がんないと思ったらLANケーブル抜けてた」 並の衝撃が走った。 そりゃdhcpクライアント動いてなけりゃ自動割り当てもできねぇしDHCP6も来ねぇよバカ!ってN回叫んでた。

そこから端末2のdhcpクライアントを立ち上げてちゃんと問題の通りになるようルータをセットして完了。 完全にipv6の問題じゃなくてlinuxの問題でしたというオチです。

詳細Write upの時間だ!

まずは,端末2が自動割り当てに対応するように設定する. しかし,この時点では端末2のアドレスがわからない.

ここで,IPv6のリンクローカルアドレスについて思い出す.

 リンクローカルアドレスは、同一セグメント上で使用するアドレスです。リンクローカルアドレスは、必ず  各インターフェースで必要なアドレスですが、IPv6が有効なインターフェースでは自動的に割り当てられます。

IPv6アドレス - ユニキャストアドレス(グローバル、リンクローカル、サイトローカル)

つまり,リンクローカルアドレスであれば端末2にアクセスできるはずである. 端末2のリンクローカルアドレスを知るため,ここで マルチキャストアドレス宛にpingを行う . ここで用いるアドレスは ff02::1 である.

申し訳ないことにpingの結果は取り忘れました.... ただ,(DUP!)と表示され返答が重複したアドレスは2つで, fe80::5054::d3ff:fe22:4369 は端末2であることがSSHアクセスにより判明しました. ここで重複しなかったのはルータの fd00:11::1 が設定されているインターフェースでした.

以上にて端末2のリンクローカルアドレスが判明しSSH接続できたので,ホストを確認. ホストのOSはUbuntuであった. このOSはアドレス設定を /etc/network/interfaces に記述すれば静的割り当て・動的割り当てを設定できる. また,ルータに接続されているインターフェースは eth0 だった.

今回の設定ファイルではIPv6アドレスに関する設定が一切記述されていないため,最終行に `iface eth0 inet6 dhcp' を追記する. その後,インターフェースを立ち上げなおすと設定が反映される.

これでクライアントの準備は整ったため,次にルータの設定に移る. 今回のルータはVyOSである. このルータにはIPv6アドレスが設定されているが,自動割り当てが設定されていない.

ここで,IPv6のアドレス割り当てについて以下のサイトたちを参考にした.

www.infraexpert.com

samsclass.info

ここで,IPv6アドレスの割り当てにはDHCPv6を用いる. ただし, IPv4アドレスのようにDHCP単体では割り当てが完了しないため,RAを用いる . RAはルータからホストにグローバルアドレスを設定するための情報を流すルータ広告のことである. RAでは,Managed-flagをTrueにするとDHCPv6によるIPv6アドレスの割り当てができる. また,Other-config-flagをtrueにするとDNSアドレス等のIPv6アドレス以外の設定がDHCPv6で設定可能となる. これによりDHCPv6の設定でアドレスを自動割り当てすることができるようになる.

また,今回の問題では fd00:11::100 - fd00:11::199 の範囲に収まるアドレスにする必要があるが.この状態ではRAによるアドレスも設定されてしまい,こちらは範囲外となる(なった). そのため, RAのautonomous-flagをfalseに設定して回避する

さて,ここまでの(おそらく分かりずらいかもしれない)話をルータへ記述する設定にする.

configration
edit interfaces ethernet eth2 ipv6 router-advert # RAの設定
set send-advert true # RAの有効化
set managed-flag true #Managed-flag = true
set other-config-flag true #Other-config-flag = true
ser prefix fd00:11::/64 autonomous-flag true # autonomous-flag = true
set default-preference # 優先度設定
exit
edit service dhcpv6-server # DHCPv6の設定
set preference 255 # 優先度設定
edit shared-network-name lan1 subnet fd00:11::/64 # 設定名,サブネット設定
set address-range start fd00:11::100 stop fd00:11::199 # アドレス範囲設定
commit # 設定の適用
exit
exit

こちらで,ルータの設定も完了し,晴れて端末1から端末2の自動割り当てアドレスへアクセスできるようになった. 今回は端末2に fd00:11::198/128 が割り当てられていた(画像がなくて本当に申し訳ないです...).

これで240点もらいました.

ほか

実はNAT64の問題を手伝っていたけど最後のアプリケーションを動かすところを英語読んでやっただけなので後輩のWrite upか公式解説を期待. 自分のやったことの意味がよくわかっていないのでまたお勉強します.

総評

昼飯を食べながら問題を解きたかったとか,順位を最後まで開示してとか,思うところはあったけどすごく楽しい大会でした. 学生じゃなくなるからこういう大会に出る機会が減るけど,できるだけ参加していきたいなと思う3月初頭だった.


追伸

宿泊交通負だけは学生にとって本当に死活問題なので遠方のサポートはマジでお願いします.

InterKosenCTF の運営に参加しきれなかった話 (spaceship Write Up)

論文とか書いてるからこういうことになるんですよ(なお卒業

こんなん見たくないわって人はこちら:

furutsuki.hatenablog.com 主催の運営記録 ptr-yudai.hatenablog.com 作問者の運営記録 furutsuki.hatenablog.com 運営のWrite Up bitbucket.org 問題跡

InterKosenCTFとは

insecureチームで運営した2019/1/18 21:00:00 ~ 2019/1/20 21:00:00で開いていたOnline CTF. 当初私を除いた3人でやってたところ,ptr-yudaiの「Windows7インストーラ貸して」から参加した. すべては研究室が私だけ違うのが悪い.

参加しきれなかったって?

要は問題を全く作らず,テストプレイもほとんどせず. 一応開催中は21:00 ~ 03:30の時間帯に運営として参加してたが居るだけな状況.

結果

f:id:thrust2799:20190120223302p:plain
終結

総合
  • 1位: Stereo Sky Town (4050[pt])
  • 2位: Hirota Sora (2550[pt])
  • 3位: KimchiPower (2550[pt])
高専
  • 1位: proelbtn (1650[pt]) (総合7位)
  • 2位: Jyoken (1450[pt]) (総合9位)
  • 3位: 074m4K053n (1350[pt]) (総合10位)

すごいと思う. おめでとうございます! お疲れさまでした!

運営の役得

なんでこれって,みんながsubmitするフラグ見れるんですよ. 貴重な体験でなかなか面白かったです.

例えばこんなのがありました.

  • KOSENCTF{[A-Za-z0-9_\+\-&!?]+} lights out : フラグ文字列の定義持ち出さないで
  • KOSENCTF{kosen} attack log : 誰かがやってくれると信じていた
  • flag.startswith("KOSENCTF") strengthened : その気持ちはわかる
  • windowsマシン欲しい!w lights out : CTFやるときは必ずWindowsLinuxが要るイメージ
  • MOMOKO is very cute Rolling Triangle: やっぱり運営ってFLAGのsubmit覗いてるんかね?
  • FRAG{you_are_seeing_an_illusion_of_the_text} attack log : 違うCTFのFLAGが飛んできてそう

全体的に「もっとルールにフラグ文字列の定義あるから読んで」って思っていたりいなかったり.

これ見てるだけでも相当面白かったですが,まぁ深夜起きてるのはつらい.

問題の公式見解(Write up)

一問はテストプレイした,ゆるして

[InterKosenCTF|Cheat 200]spaceship

AndroidのAPKファイルが渡される. チートすると良さそう.

インストール

今回は実機に入れる(後々のことを考えて). インストールはAPKを実機のファイラーから選んでも, adb install でもOK. 実機のファイラーからの場合は必ず 提供元不明のアプリ を設定からOnにする.

入れたら立ち上げ

起動・動作確認

初回の立ち上げで名前を聞かれるので入力. その後,画面をタップしてゲーム開始.

f:id:thrust2799:20190120225849p:plain:h300
play画面

ゲームを進めて,gameoverになるとこの画面になる.

f:id:thrust2799:20190120225927p:plain:h300
GameOver

タップするともう一回できる.

解析開始 (ネットワーク)

とりあえず通信していないか確認. エミュレータを使ってる人ならそのままWiresharkを使ってもらう. 今回はAndroid Studio縛りで.

設定

実機の場合は,開発者向けオプション(端末情報のビルド番号を8回くらい押したら有効化される)からWi-Fi詳細ログの有効化をOnにする.

f:id:thrust2799:20190120230040p:plain:w300
開発者向けオプション

あと,スマホWi-Fi接続にする. データ通信回線ではパケットキャプチャできない.

パケットキャプチャ開始

で,Playストアから tPacketCapture をDL. 起動してCAPTUREを選択.これでパケットキャプチャが開始される.

f:id:thrust2799:20190120230203p:plain:w300
tPacketCapture

停止するときはVPN設定から. 歯車アイコンを押して削除を選択すると自動的に.pcapファイルが生成される.

f:id:thrust2799:20190120230800p:plain:w300
VPN

キャプチャ中,Spaceship.apkでやること
  • 新規ユーザーでアプリを開始(既に起動した場合はアプリデータを設定から削除しておく)
  • 新規スコアをたたき出す
  • gameoverになったらキャプチャ終了
キャプチャ後,Wiresharkにぶち込む

私の場合は/storage/emulated/0/Android/data/jp.co.taosoftware.android/packetcapture/filesの中に生成されている.

PCからは内部ストレージ/Android/data/jp.co.taosoftware.android/packetcapture/filesに相当する.

PCから直接アクセスできるのでこれをコピーして解析する.

解析結果

f:id:thrust2799:20190120233533p:plain:w500
解析結果

なんかあった.

この回のユーザー名はhogehogehoge,gameover画面は以下.

f:id:thrust2799:20190120225927p:plain:h300
GameOver

どうやら,gameover画面で情報を送っているようなので詳細を確認.

この時はSPST\x15\x00\x00\x00\x0chogehogehogeが送信されていた.

\x0cはユーザー名の長さ,\x15\x00\x00\x00はスコアっぽい.

というわけで,このIPアドレスに向けてスコアをねつ造する.

import socket
host = '13.230.13.190' # ここは動的っぽい
port = 11200
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((host, port))
client.sendall(b'SPSTAAAA\x0chogehogehoge')
print(client.recv(1024))

出力: b'{"response":"KOSENCTF{0nlin3_ch34t_by_f4k3_p4ck3t}"}'

FLAG: KOSENCTF{0nlin3_ch34t_by_f4k3_p4ck3t}

追記ここから

ここまでのWrite Upはinsecure内部用に書いたもの.

今回の問題は結局Wireshark問題で,.apkの解析ではなかった. で,問題のパケットも普通にやると埋もれます.

ところで,Wiresharkの「統計」メニューって使ったことありますか?

「対話」だとか「解決したアドレス」だとか,あれすごく便利ですよ.

今回は使わなかった「解決したアドレス」でもし*.kosenctf.comを見つければまず間違いなく問題サーバーですし.

見つからなくても「対話」からどんどんIPアドレス辿っていけばすぐに見つかりますし.

一度Wireshark極めてみると楽しいと思います.

参加者各位,本当にありがとうございました

駄文 -SECCON2018に参加しただけ(Not Writeup)-

なぜこのタイトルかって? 延々とDefense flagを送る人になってたからね!(めっちゃ悲しい writeupはほかの人に任せます

ptr-yudai: SECCON 2018 国内決勝に参加しました - CTFするぞ

theoldmoon0602: SECCON国内大会 参加記 - ふるつき

yosiking: SECCON 2018 国内決勝 参加記 - yoshikingのがんばる日記

結果

5位でした (画像取っておくの忘れた...). 今まで招待チームで下位をさまよっていたことを思うとすごい順位を上げた. 全然貢献できてないという自覚はある.

問題とか

今回は問題数が少ない気がしたのとチームメンバーが「セキュリティ...???」って言ってたのが印象的だった.

なんとなくどの問題にも妨害余地がありそうな気もしたが見つかることはなかった.なかったのかもしれない.

宮島

こちらはAssembly Golfとか言って短いアセンブリを送ってDefense flagを書き込む問題だった. ptr-yudaiがすごく頑張ってAttack flagを取り続けていた問題.

天橋立

XSS HELL.

alert('XSS')を設定したpayloadを入力したときに実行されるように組んで,誰にも発火させないようにする問題(?). Attack flagがなくてDefense flagのみ,解かれていない問題のタイトルがDefense flagとして認識される.

payloadをハッシュ化して合致すれば発火って形式主流,というかそれしかなかったらしい. theoldmoon0602がやってくれました.flag更新はyoshikingが頑張ってくれた.

松島

ポーカーゲーム.

カードのシャッフルは実際にカジノで使われているかっこいいアレをアルゴリズムとして実行したそう. deckに10枚を乱数で選ぶが,ここで時間をシードにして1秒おきに変化させていたらしい.

Attack flag 1はフルハウス以上,Attack flag 2とDefense flagの投稿フォームは4カード以上の役を完成させると出てくる.

作問者が試験的に運用したときは全然でなかった4カードが本番ですごく出ていたらしい. フルハウスは言わずもがな.yoshikingがやってくれました.

ptr-yudaiが配布されていたdeckを生成する実行ファイルを解析していたけど,結局実行ファイルを無限ループさせて,4カードの時に別PCのブラウザでF5って体制に. 外部から与えられていたgame_idが乱数に関わっていなかったのでこの方法で突破.

ところで,4カード以上が作れる(= 内部ではじき出したmax_scoreが4カードの時と一致しない)ときは弾かれるらしくて困惑していたチームがあったらしい. 途中からルールにも追記が入っていた.

Defense flagの書き込みスクリプトを作って5分おきに動かしたり改行を32個送ったりするなどした. これが唯一の活動.

その他

その1

Defense flagが入らない事があって,観察してみるとブラウザを更新したら前のflagになるってことが分かった. どうやらサーバーからpushされるものとリクエストして得られるものが違うようだった. flagチェック20秒前くらいになると自動更新されたりなかったりしたたので,Flag自動取得コードを書いたtheoldmoon0602にお願いしてコードを書き換えてもらったので3回分くらいの失点で済んだ.

後程バグだったことが周知されて,その頃にはリクエストしてもちゃんとflagが表示されるようになっていた.

その2

開始って言われてしばらく開始されなかった問題. ほぼ全チームが手を上げたりして運営も慌てていた.

総合

俺よ,ちゃんと技術磨いて出直せ

以上,駄文兼記録として.

KOSEN セキュリティ・コンテスト 2018 Write Up その他

福岡博多市で開催されたKOSEN セキュリティ・コンテストに insecure として,現地参加してきた.

今回イベントのHP -> KOSENセキュリティコンテスト2018

前日に猫カフェに行ったりしつつ福岡入り.ホテルでは何問か常設CTFの問題をやるなどした.

弊チームの参加者はtheoldmoon0602 (ふるつき),ptr-yudai (師匠),yoshiking (よしキング),thrust2799 (スラスト,私).
今回は:pro:なふるつき氏と師匠氏,今回初参加で特訓を積み重ねたよしキングという同一研究室メンバーに加えてもらう形で参加させていただいた.

蓋を開けてみれば,ほとんど3氏が問題を解いて,私はNetworkしかsubmitできなかった....やはりよしキングは:pro:だった.
insecureは一位で優勝,ありがたいことにSECCON2018に出れます.やった.

f:id:thrust2799:20180902202310p:plain

そんなこんながあった大会の,Write Up. 一応,解けた順に,触ったものも含めて.

[Network 11] ログインしてフラグを入手せよ。 (Score: 150)

問題内容:
ヒント:
我々は秋葉原ラジオ会館上空に飛来したタイムマシンを用いて、未来の超高性能コンピュータを入手した。
そのコンピュータによると、MD5の値 b21424f30227ac8bc08c69216c30815 のハッシュ化前の値は以下であるらしい。
c932836c1feff27841c03453e81d5b13:oX3Ar2V0BQA=34c6176e8e33d6da83cc500028b8f9c8de95b91d:00000001:OWEyZWEyNmZhNzAyYTUwMzM0MzRjYzMxZDljZGY2OTU=:auth:71998c64aea37ae77020c49c00f73fa8

なんというSteins;Gate....これは布教ですわぁ(いいぞ).
問題としてはHTTPのDigest認証を突破するタイプ.
ちなみに研究室で勉強したり前日に復習したりしてsolverが手元にあった問題だった.なんという幸運!

wiresharkで問題のパケットを開いて,フィルタ (tcp.stream eq 0)でFollow TCP Stream.

f:id:thrust2799:20180902202902p:plain

やはり401エラーが返され認証が必要とされている.
また,WWW-Authenticateフィールドで必要そうなものが返されている.

'WWW-Authenticate'内容:

Digestrealm="Digest Auth"
nonce="bt2zImd0BQA=c6284989d568c3b3483e649ed0d4b440918fb05e"
algorithm=MD5
qop="auth"

次に,フィルタ (tcp.stream eq 1)でFollow TCP Stream.(見切れた部分は401エラーで先ほどと同じ)

今度は200で通り,フラグが存在するっぽいリンクが書かれたページがある.
どうやらDigest認証でhttp://digest.kosensc2018.tech/flag.txtにアクセスしたいらしい.
ちなみに,HTTP送信ヘッダのHostフィールドはアクセス先のホスト名が格納されている.

他に有用な情報は得られなかったので,この情報で突破したい.
つまり,パスワード回避してDigest突破したい!

ここで,もう一度フィルタ(tcp.stream eq 1)でのTCP Streamを見てみる.

f:id:thrust2799:20180902202918p:plain

どうやら,認証に成功した状態にはヘッダの要素として次のものが挙げられそうである.

GET / HTTP/1.1
Host: digest.kosensc2018.tech
Authorization: 
  Digest username="tanaka", 
  realm="Digest Auth", 
  nonce="zwFHJGd0BQA=50c6205549fdb0f63aa3f780a7504cc82864010d", 
  uri="/", 
  cnonce="ZmMyNDM3NzcyNWI3ZGI5NjQyNjhiNTAwZDkxZjM4YzQ=", 
  nc=00000001, 
  qop=auth, 
  response="dce3409758e948c5ba76fb121f089812", 
  algorithm="MD5"

この情報のうち,WikipediaのDigest認証Qiita先生に聞いてみたところ,次の意味があるそう.

  Digest username: ユーザー名 
  realm: 認証領域名
  nonce: サーバー生成のランダム文字列 
  uri: 'http://digest.kosensc2018.tech'で表示されるページからの相対パス
  cnonce: クライアント生成のランダム文字列
  nc: カウント
  qop: Digestの生成方法,bodyを含めるか,大体"auth"な気がする
  response: 'あるデータ'のalgorithmフィールドによる方法でのハッシュ
  algorithm: responceハッシュの生成方法,大体MD5な気しかしない

ちなみに,nonceは一度認証せずにアクセスしたときに返されるものをそのまま使う必要がある.
これはスクリプトを組んだら問題がなさそうなので,あとはresponce.

ここで,responseの構成をWikipediaさんから引っ張ってくる.

A1 = ユーザ名 ":" realm ":" パスワード
A2 = HTTPのメソッド ":" コンテンツのURI
response = MD5( MD5(A1) ":" nonce ":" nc ":" cnonce ":" qop ":" MD5(A2) )

ここのMD5()はMD5でハッシュを取った結果を意味している.
ここで,新たに出てきたのはA1の'ユーザ名 ":" realm ":" パスワード'だった.
パスワードが分かんねぇつってんだろ!?!?!?

詰みかと思ったときのヒント,実はA1が書いてあるのである.

ヒントにあるそれぞれの値は,

response                     : 2b21424f30227ac8bc08c69216c30815
MD5(user:realm:password)    : c932836c1feff27841c03453e81d5b13
nonce                       : 34c6176e8e33d6da83cc500028b8f9c8de95b91d
nc                          : 00000001
cnonce                      : OWEyZWEyNmZhNzAyYTUwMzM0MzRjYzMxZDljZGY2OTU
qop                         : auth
MD5(REQUEST:URI)            : 71998c64aea37ae77020c49c00f73fa8

はい.

どうやらMD5(A1)は c932836c1feff27841c03453e81d5b13 を使いまわせそう.

ということで,必要な情報はそろったのでコーディングタイムです.
(ちなみにtypoで4回くらい401が返されたのは笑い話)

import requests
import hashlib

headers = requests.get('http://digest.kosensc2018.tech/flag.txt').headers
HA1 = 'c932836c1feff27841c03453e81d5b13'
HA2 = hashlib.md5('GET:/flag.txt'.encode('utf-8')).digest().hex()
nonce = headers['WWW-Authenticate'][35:87]
res = hashlib.md5((HA1 + ':' + nonce + ':00000001:OWEyZWEyNmZhNzAyYTUwMzM0MzRjYzMxZDljZGY2OTU=:auth:' + HA2).encode('utf-8')).digest()

flags = requests.get('http://digest.kosensc2018.tech/flag.txt', headers = {'Host':'digest.kosensc2018.tech','Authorization':'Digest username="tanaka", realm="Digest Auth", nonce="' + nonce + '", uri="/flag.txt", algorithm=MD5, response="' + res.hex() + '", qop="auth", nc=00000001, cnonce="OWEyZWEyNmZhNzAyYTUwMzM0MzRjYzMxZDljZGY2OTU="'})
print(flags)
flags.text

f:id:thrust2799:20180902202948p:plain

A . SCKOSEN{digest_auth_is_secure!}

ちなみに運営がフラグ設定間違っていたらしく,しばらく解答できなかった.おそらく1番乗り.

この問題のポイントは,responseがデコードされるか,'ユーザ名 ":" realm ":" パスワード'のハッシュ(サーバーの.htdigest)が漏れるとだめってお話でした.

[Network 10] Basic認証 (Score: 100)

問題内容:
パケットファイルを解析せよ

さて,Network2問目(1問目).こちらはパケットファイルを解析するだけなのか~?

というわけで,フィルタ(tcp.stream eq 0)でFollow TCP Stream.

f:id:thrust2799:20180902203020p:plain

いつもの.(401エラー)

やはり問題文通りBasic認証をしているっぽい.

次.フィルタ(tcp.stream eq 1)でFollow TCP Stream.

f:id:thrust2799:20180902203017p:plain

200が返されてなんかあるみたい.
flag.zipがあって,Johnさんのパスワードが解錠パスワード,と.
IPアドレスがHostフィールドにあって,アクセスはここからはできないみたいなので,パケットファイルにzipファイルが残っていそう.
Wiresharkさんにお願いしたいので,File -> Export Objects -> HTTP でパケット内のファイルオブジェクトを一覧表示.
予想通りflag.zipがあったのでエクスポートしていく.

さて,Johnさんのパスワード...|ω・`)

f:id:thrust2799:20180902203011p:plain

john:s8oX*zlcro8?#wlblpr4 (ユーザー名:パスワード)

Basic認証さん!?

そう,Basic認証ではBase64エンコードされたユーザー名とパスワードが格納されており,さらにWiresharkさんは勝手にデコードまでしてくれるのである.

あとはこれで解凍して解答(激寒ギャグ).

A . SCKOSEN{B@$ic_@uth_is_un$@fe}

Basic認証はパケット取られるだけでアウトなのであまり使わないでねっていう問題でした.


ここまでが自力でSubmitできた問題.
全然強くない人なのでここからは最初の発想とかだけ.
役割分担したと思いたい....

[Crypto 08] シンプルなQRコード (Score: 200)

問題内容:
半分のQRコードを入手した。なんとか復元できないだろうか。

最初の発想といっても,これはこれで自分で全部やったと言えない問題.
実は別のCTF大会で出てたWrite Upをそのまま流用してきた感じ.

先人様ありがとうございました.
SECCON CTF 2013 online予選 forensics 400

さて,問題のQRコードはこれ.

f:id:thrust2799:20180902175230p:plain

とりあえず,マーカーとかの何も考えなくても修復できるところを修復.
これだけでもうQRっぽいけど,読み取れない.

そこで,先ほどのWrite Upを頼りにマスクパターン,誤り訂正bitの15[bit]を復元.
さらに修復を進めたQRコードがこちら.

f:id:thrust2799:20180902175315p:plain

これでも読み取れず,ちょっと悩んでいたところで師匠氏からお声がけ.
そのまま解いてもらってSubmit.

ところで,あとでホテルで聞いたところによると,もう読み取るだけだったそう.
pythonのstrong-qr-decoderってものを使ったらしく,新幹線の中で使ってみた.

まず,こちらのGitHubからclone.
次に,これに掛けられるように画像から'X' (黒いドット)と'_' (白いドット)のテキスト形式に変換.

変換スクリプトはこちら.

from PIL import Image

img = Image.open('broken_qr_.png')
x, y = img.size
qr = open('qr_data.txt', 'w')

for v in range(y):
  if v % 10 != 0:
    continue
  for u in range(x):
    if u % 10 == 0:
      if img.getpixel((u, v)) == (0, 0, 0, 255):
        qr.write('X')
      else:
        qr.write('_')
  qr.write('\n')

で,出てきたQRがこちら.

XXXXXXX_______X_X_____XXXXXXX
X_____X_______X_X_X___X_____X
X_XXX_X_______XXXX_X__X_XXX_X
X_XXX_X__________X__X_X_XXX_X
X_XXX_X_X_____X___X___X_XXX_X
X_____X_______X_XXX___X_____X
XXXXXXX_X_X_X_X_X_X_X_XXXXXXX
________X______XX__X_________
__XX__XXX_________XX_XX_X____
_______________X_XX_X___XX_X_
______X___________XXX___XXX_X
______________XXX_X_X_XX__XX_
______X_______X_X__XX_X_XXX_X
_______________X__X___X__XXX_
______X_________X__X_XXXX_XXX
___________________XX_XXX__XX
______X_______X_X___X___XX_X_
_______________X__XX___XX___X
______X_______X_XX_____XXXX_X
________________XXX_XXX___XXX
______X________XX_XXXXXXXXX_X
_________X__________X___X_XXX
XXXXXXX__X______X__XX_X_XXXX_
X_____X_______XX___XX___XX_X_
X_XXX_X_______X___X_XXXXXXX__
X_XXX_X__X____X_X_XX__X__XX__
X_XXX_X__X_______XX__X__X_X_X
X_____X_______X_XX_X_______XX
XXXXXXX_________XX_X_XX_XX___

こちらをstrong-qr-decoderに掛けて,

A . SCKOSEN{remove_rs_qr}

100の実績,もらっていいよね?

[Crypto 08] RSA? (Score: 300)

問題内容:
電話レンジ(仮)でのDメールに失敗し、冪演算のない世界線へ来てしまった。
この世界線は今までいた世界線RSA暗号に似た暗号で守られている。解読してみよう。

[+] Public key (n,e): (746149315120445105644911779735002615257864427638948809430146775899763900845401478319781237412694334410613686368021055483040278357991481684487813129494944899522460397699493087246505218096960286204364461639918177320793843718724747574381859928496072509749639870292090503328557688115529251888351927498428567126853657063832878452773780418783149866919316163560203180423276894765325460041738451797385343149303272504850808939009366426995340204717301911359661640524141292447180118808883848024348018576236114084330353144353115672904820149103681022683146560799116848906807498625698939954475819479000937838859292276566046219449122782347075051511004009561691484747596362940386608213329221089677679229620860810111092211338341215804260360529582967128623164620534814690277276443932913145186024258511492440354889009304938979173562941458331119511296138076261503871542382962671556195928643434506282416038086486816450594938254170549974935406839221438655021923764949572023494832426904174630809785240917462806646302389526945618245684059655484996935724994381587851879888451272335891503968849596157334527192713715105054266039301159419016747298458532769985135446278269957364121043506362499497443274900182869320930776855669486054000707293632271709427175565301,825821)
[+] Ciphertext = 34196057544535966582914714160221953732017949669815971420694645835609518260754242418191180642793
[+] Dec(c) == m?: True

ということで,累乗のないRSA暗号
掛け算かな?試してみよう.

d * e mod n ≡ 1
m * e mod n ≡ c
c * d mod n ≡ m

11 * 5 mod 3 ≡ 1
2 * 5 mod 3 ≡ 1
1 * 11 mod 3 ≡ 2

いけそうである.

ここで,この情報をよしキングに投げて自分は別の問題へ行ってしまった.

解けた後で教えてくれたのだが,Ciphertextをeで割ってエンコードを「ていっ」ってするだけだったらしい.
これは自宅に帰ってから書いたスクリプト

import codecs

e = 825821
c = 34196057544535966582914714160221953732017949669815971420694645835609518260754242418191180642793

codecs.decode(hex(c // e)[2:].encode('utf-8'), 'hex_codec')

A . SCKOSEN{Extended_Euclide@n_@lg0rithm}

これも100の実績がほしい.

[Web 16] 進撃せよ (Score: 300)

問題内容:
求めるものは壁の向こう側にある。
巨人になったつもりで、進撃せよ。

これは進撃の巨人ですね,私わからんけど.

問題のサーバーにアクセスするとこんな感じ.

f:id:thrust2799:20180902200148p:plain

で,それぞれクリックするとこんな感じ.

f:id:thrust2799:20180902200219p:plain

f:id:thrust2799:20180902200222p:plain

どうやらWAF (Web Application Firewall)がflagを検知してforbidenしているらしい.
で,肝心のリクエストは http://waf.kosensc2018.tech/ist/ZmxhZy50eHQ= って感じで,最後に何かBase64っぽい文字列.
試しにディレクトリトラバーサルな文字列をBase64して試した結果がこちら.

f:id:thrust2799:20180902200744p:plain

/etc/passwd が見つかってしまった....
とりあえずこれをチームで共有,ここから /etc/passwdWWW-data のユーザーディレクトリ等を参考にエスパー.
何とか /var/www/html/waf/files に一覧されてるファイルがあることが分かって,さてどうするかってなった次第.

と,ここでふるつき氏から大勝利情報 (WAFのphpコード)が降ってきて,あれよあれよという間にsubmit.

どうやらWAF部は1回しかBase64デコードしていないのにファイル名抽出部は無限にBase64デコードする仕様になっていたらしい.
2回 flag.txtBase64エンコードしたものを投げて,Flag獲得.

A . SCKOSEN{beyond_the_wall...}

運営はエスパーしてBase64を2回するのを想定していたそう.
ちなみにふるつき氏はこちらみたいにエスパーせずにプロセス情報を見たり設定ファイルにあたり付けて獲得した模様.
やり方がとてもスマート!


さて,今回触れた問題はこんなところでした.
さすがにNetworkは得意分野なのでできるんですが,ほかの分野が全然なので結局周りのチームの解いている人よりも全然取れていないのが実情.
優勝したけど個人としては精進を続けるしかないと思った大会だった.(毎回思ってるだろとか言わないで...)

最後に,公開されているチームメイトのWrite Upは以下.

高専セキュリティコンテスト 2018 #kosensc Writeup - ふるつき

高専セキュリティコンテスト2018のWrite Up - CTFするぞ

KOSEN SECCON 2018 - Writeup | ocamlab Kibela

高専カンファレンス in 東京 2018 に学生として参加した話

2018年7月15日(日)にあった高専カンファレンスに参加したお話.初参加でした.

10日ほど前に後輩から「宿泊交通費補助まだありますよ~」というメンションから前後泊で東京行きを決断,6日前に宿泊施設を取って奈良から出張ってきました.

すごいお得に参加できたので,今回の運営様方,カンパに参加してくださった方々には多大なる感謝しかありません.本当に出資していただきありがとうございました.

 

今回のカンファでの個人的ハイライトを簡単に残したいと思います.

 

農業×ITの現実と未来 (さるびあ(五十嵐優太) 氏)

農業とITを結びつけるお話.

農業とITには高い壁があってそれを超えるために必要な考え方や知識,相手への尊敬について.

農業だけでなくその他にもITとかけ離れたものを結びつけることができそうだなということ.

 

実際に自分もITと何かを結びつけるようなことを考えたりしたことがあり,今回の発表でその時に欠けていた視点を指摘されていて「なぜダメに感じるものになったのか」が分かった回だった.

 

高専ラノベのつくりかた (藍月要 氏)

高専ラノベ作家として,専門分野をいかにエンターテイメントに落とし込んでいったかというお話.

コウセンミミッミと称してヘルシェイク藍月で場がすごく盛り上がって良き.

 

自分もなろうやカクヨムを呼んで,「自分の思っているような話が読みたい」という思いで物語を考えたりすることもあったりなかったり.

だから,藍月氏の「設定や構成がすごく大変」というのには非常に強く共感したし,「登場人物から設定を考える」「出来上がってきた設定から別の設定・物語を構築する」ということが非常に参考になった回だった.

もうちょっと良い設定を組んでweb小説にチャレンジしてみようかな?

同時にあった弊学OBであるyanoshi氏の発表が見れなかったのが悔やまれるが,それを上回るほどに面白く,ためになる発表だった.

 

Flutterで"""圧倒的成果"""を生み出せ! (にしこりさぶろ〜 氏)

Flutterでクロスプラットフォームなモバイルアプリを作ろう!というお話.

Google製ですごく簡単にアプリが作れるという優れものFlutter.

 

卒業研究をやっていて,BLEとかを使ったAndroidアプリを作ろうとして完全停止3週間をキメていた自分としては,新たな解決策として検討できるものだった.

ある意味で今日一番に収穫となった発表(LT)となった.

 

Vtuberのつくりかた ~初心者がBlenderモデリング~ (越乃いぶき 氏)

Vtuberをつくるお話.

美少女多すぎて飽きたからコンデンサVTuberになろうとした回.

 

コンデンサVTuberもすごいと思ったけど,音ゲーマーとしてはむしろ最初にちょっと話した自作SDVXコントローラに目がいってしまった.

(SDVX = SOUND VOLTEX,KONAMIBEMANIシリーズで一番の人気らしい)

なお,他数名ほど同じ人間がいた模様でみんなで仲良く音ゲー談議が弾んだ.

懇親会でロータリーエンコーダや組み込み技術,アーケードの音ゲー話,チャタリングなどなど,「音ゲー × エンジニア」なトークで非常に盛り上がれて楽しかったです.仲良く話してくださった各位,本当にありがとうございました,今後ともよろしくお願いします.

 

番外編1 (藍月氏にサインをもらった話)

関数電卓や藍月氏ラノベにサインをもらう人がいる中,不覚にも書籍を自宅において来てしまった私....

関数電卓もなく,現地調達もできず,取った行動は「PCにサインをもらう」!

書いてもらったのはキーボードの下,マウスパッドの右側.

消えないように手を浮かせたり何かを置いて保護してみたり....いやぁ,本当に消えないように注意しないと.一生の宝物にしたいPCができてしまった.

ラミネートでも張ろうかな...?

 

番外編2 (奈良高専の現役生全員で奈良高専OBの方々などにおごってもらった話)

懇親会も終わり,2次会にでも行く?お家帰る?となる中,奈良高専の現役生6名ほどと奈良高専OBの方々など6名ほどで2時間ほど居酒屋でワイワイしていたお話.

未成年のためウーロン茶でおつまみを頂きつつ,大先輩の昔話や奈良高専の現状,今後の進路や将来のお話などなど,大変楽しい時間をすごしました.

偶然にも地元が同じ方がいて,終電の話やどこに何があるといった話でも盛り上がったり.

代金を丸々おごっていただいて楽しい時間をすごしました.大先輩の方々,本当にありがとうございました.後輩にもおごれるよう,就職したら頑張りたいと思います.

 

番外編3 (昼食で近畿高専の学生会執行部員に会った話)

お昼を頂く中,弊学からの参加者の知り合い参加者に近畿高専の学生会執行部員がいたお話.

実は自分も少し前まで学生会執行部で活動していて,実は交流会などでニアミスしていた模様.

各々の高専でここがダメ,ここはこういうシステム,などの情報交換ができたりした回.

お話させていただいた執行部員のお方,一方的にしゃべって非常に申し訳ありませんでした.今後も執行部活動頑張ってください.

 

などなど,いろいろあったというお話.

 本当に今回の高専カンファレンスに参加してよかったと思いました.

行き詰っていた研究にも光が見え,前々から会いたいと思っていた藍月氏とも直で出会え,音ゲーマーエンジニアとも出会え,コミュニティも広がり,などなど....

今回の収穫は行く前の予想をはるかに上回るものでした.

これは卒業後も積極的に参加すべきですかね?

今後も知見を広げて圧倒的成長を追い求めていきたいと思った1日でした.

 

最後に重ねて,今回本当に素晴らしい機会を設けてくださった運営の皆様,カンパに参加してくださった皆様,交流してくださった皆様,おごってくださったOBの皆様,本当にありがとうございました!