🕊️

CpawCTF Level2 Writeup

2024/07/01に公開

はじめに

サイト

https://ctf.cpaw.site/index.php

環境

  • macOS
  • M1チップ

Q13.[Stego]隠されたフラグ

問題

以下の画像には、実はフラグが隠されています。
目を凝らして画像を見てみると、すみっこに何かが…!!!!
フラグの形式はcpaw{***}です。フラグは小文字にしてください。
stego100.jpg

回答

まず,リンクをクリックして画像をダウンロードしましょう.そして,その画像を開きましょう.すると,左上と右下にそれぞれ黒色の何かが見えます.


これらをモールス信号と解釈して,英字に変換すると, cpawhidden_message:) になります.よって,問題文にあったフラグの形式と良い感じに合わせて, cpaw{hidden_message:)} という答えが得られました.

Q15.[Web] Redirect

問題

このURLにアクセスすると、他のページにリダイレクトされてしまうらしい。
果たしてリダイレクトはどのようにされているのだろうか…
http://q15.ctf.cpaw.site

回答

リンク先にアクセスした時のヘッダを見てみましょう. curl コマンドを用いて覗いてみましょう. -i オプションで,ヘッダみたいなものが見えると思います.

$ curl -i http://q15.ctf.cpaw.site

HTTP/1.1 302 Found
Server: nginx
Date: Sun, 30 Jun 2024 10:53:10 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 0
Connection: keep-alive
X-Flag: cpaw{4re_y0u_1ook1ng_http_h3ader?}
Location: http://q9.ctf.cpaw.site

お. X-Flagcpaw{4re_y0u_1ook1ng_http_h3ader?} という答えが得られましたね.

Q16.[Network+Forensic]HTTP Traffic

問題

HTTPはWebページを閲覧する時に使われるネットワークプロトコルである。
ここに、とあるWebページを見た時のパケットキャプチャファイルがある。
このファイルから、見ていたページを復元して欲しい。
http_traffic.pcap

回答

ファイルをクリックしてダウンロードし, Wireshark で解析を行う.
すると,おそらくこの通信は HTTP/1.1 通信をキャプチャしたものだとわかる.
問題文に,ページ復元を求められているので,リスポンスが HTTP/1.1 200 OK と書いてあるところを探す.
まず,以下の画像の箇所の html データを取得し, index.html という名前で保存する. \n という文字は削除し忘れないように注意.

index.html
<!DOCTYPE html>
<html lang="en">

<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <meta charset="utf-8">
  <title>Capture The Flag</title>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta name="description" content="">
  <meta name="author" content="takahoyo">
  <!-- Le styles -->
  <link href="./css/bootstrap.css" rel="stylesheet">
  <style type="text/css">
...
<重要なところではないので省略>
...
  </style>
  <link href="./css/bootstrap-responsive.css" rel="stylesheet">
  <!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
  <!--[if lt IE 9]>
          <script src="../assets/js/html5shiv.js"></script>
        <![endif]-->
</head>

<body>
  <div class="container-narrow">
    <div class="masthead">
      <h3 class="muted">Capture The Flag</h3>
    </div>
    <hr>
    <div class="jumbotron">
      <h1>Capture The Flag</h1>
      <p class="lead">フラグが欲しかったら下のボタンを押すんだ!!</p>
      <p><img id="image1" class="img-rounded" id="image1" src="./img/image.jpg" /></p>
      <p><a class="btn btn-large btn-success" onclick="OnButtonClick();">ボタン</a></p>
    </div>
    <hr>
    <div class="footer">
      <p>© 2015 takahoyo</p>
    </div>
  </div>
  <script src="./js/button2.js"></script>
</body>

</html>

そして,この index.html をブラウザで開いてみる.

どうやら,ボタンを押すことで,フラグが得られるようだ.しかし, ボタン というところをクリックしても反応しない.それもそのはず, index.html をみても, JavaScript は書かれてない.だが,ボタンを押した時に ./js/button2.js というファイルを呼んでいることがわかる(index.html の最後から4行目あたりの script タグで囲まれているところ参照).そこで, ./js/button2.js に関するリスポンスを得ている場所を探すと,以下の場所が見つかる.

この右下に書かれている JavaScript スクリプトを ./js/button2.js に保存する.

構成図
.
├── index.html
└── js
    └── button2.js
./js/button2.js
eval(function (p, a, c, k, e, r) { e = function (c)
{ return (c < a ? '' : e(parseInt(c / a))) + ((c =
<省略>
getElementById|image1|src'.split('|'), 0, {}))

そして,再度 index.html にアクセスし, ボタン をクリックする.

画像に書いてある通り, cpaw{Y0u_r3st0r3d_7his_p4ge} という答えが得られたねー.

つぶやき

画像にフラグを隠すことで, cpaw{XXXX} といった感じでフィルタが出来なくなるので工夫を感じますね.

Q17.[Recon]Who am I ?

問題

僕(twitter:@porisuteru)はスペシャルフォース2をプレイしています。
とても面白いゲームです。
このゲームでは、僕は何と言う名前でプレイしているでしょう!
フラグはcpaw{僕のゲームアカウント名}です。

回答

よくわからないid名とゲーム名ですね. とりあえず, Google の力を借りましょう. porisuteru スペシャルフォース2 と検索してみました.

ほう.なんかそれっぽいのが引っかかったので,アクセスしてみます.すると, parock という名前で最多キルを更新したようですね.では,フラグのフォーマットに合わせて, cpaw{parock} という答えが得られましたね.

Q18.[Forensic]leaf in forest

問題

このファイルの中にはフラグがあります。探してください。
フラグはすべて小文字です!

file

回答

こちらが CpawCTF さんの Q18file をダウンロードした misc100 ファイルです.

$ file misc100                                                                                    
misc100: pcap capture file, microsecond ts (little-endian) - version 0.0 (linktype#1768711542, capture length 1869357413)

うっひょ~~~~~~!
file コマンドを実行したら, pcap ファイルと大きなヒントが得られたので,
店主さんの誠意で Wireshark を使わせていただくことにしました.
俺の解析次第でフラグを探せちゃうんだぞってことで,
解析しちゃいま~~~~す!まずは拡張子を変えてから,

コラ~!
これでもかって位謎々濃厚の misc100 ファイルには
pcapファイルに偽装するための文字が入っており
怒りのあまり, VSCode で閲覧しちゃいました〜!

すっかり店側も立場を弁え lovelive! という文字を削除してもらったところで,

$ cat misc100.pcap | sed 's/lovelive!//g' > SUSURU
SUSURU
???????????e!CCCelive!lovelivPPPovelive!loveAAAe!lovWWWve!
{{{elive!loveliMMMelive!lovelGGG!lovelivRRRovelive!lEEElive!PPPelive!}}}

お次に,同じ文字が3連続しているところを
絞る〜!やったぞ〜!

$ cat misc100 | grep -ao "\(.\)\1\1"                                                                                                                                  


CCC
PPP
AAA
WWW
{{{
MMM
GGG
RRR
EEE
PPP
}}}

ワシワシとした食感のファイルの中には、 フラグ(cpaw{mgrep}) が入っており
さすがのmattsunkunも 答えを提出してしまいました~!
ちなみに、店主さんがLANケーブル作成RTAをしている様子は
ぜひサブメインチャンネルをご覧ください

元ネタ↓
https://dic.pixiv.net/a/やばいクレーマーのSUSURU_TV

Q19.[Misc]Image!

問題

Find the flag in this zip file.
file

回答

ファイルをダウンロードして,例のごとく, file コマンドでどんなファイルかみてみるか.

$ file misc100.zip
misc100.zip: OpenDocument Drawing

OpenDocument Drawing ってなんやろ.色々調べてみると,どうやら, Microsoft のアプリで開けるっぽい.気になる人はl misc100.zip を展開して詳細をみても良い.結論から言うと, Word.app を指定して,ファイルを開くと,以下の画面が出てくる.

$ open -a /Applications/Microsoft\ Word.app misc100.zip


そして, cpaw{It_is_fun__isn't_it?} と言う答えが得られた. funisn't の間には アンダースコア(_)が二つ入っていることに注意.

Q20.[Crypto]Block Cipher

問題

与えられたC言語のソースコードを読み解いて復号してフラグを手にれましょう。

暗号文:cpaw{ruoYced_ehpigniriks_i_llrg_stae}

crypto100.c

回答

ファイルをダウンロードしてみる.ソースコードを見たかんじ,第1引数に暗号文を受け取り,第2引数の数字だけ,復号処理を行うっぽい.ではそのファイルを cc でコンパイルして, ./a.out を取得する.

crypto100.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
  int i;
  int j;
  int key = atoi(argv[2]);
  const char *flag = argv[1];
  printf("cpaw{");
  for (i = key - 1; i <= strlen(flag); i += key)
    for (j = i; j >= i - key + 1; j--)
      printf("%c", flag[j]);
  printf("}");
  return 0;
}

第一引数はよっぽど ruoYced_ehpigniriks_i_llrg_stae を渡せば良いことがわかるが,第二引数はぶっちゃけどうすれば良いか考えるのがめんどくさいので,以下のファイル loop.sh を作成する.

loop.sh
for i in {0..15}
do
  a=$(./a.out ruoYced_ehpigniriks_i_llrg_stae "$i")
  echo "$a" >> list.txt
done

では,実行権限を与えて,実行する.

$ chmod +x loop.sh
$ ./loop.sh

生成された list.txt を閲覧してみる.

list.txt
cpaw{}
cpaw{ruoYced_ehpigniriks_i_llrg_stae}
cpaw{urYoec_dheipngriki_s_illgrs_ate}
cpaw{ourecYe_diphingkiri_sll__grats}
cpaw{Your_deciphering_skill_is_great}
cpaw{cYourhe_deingip_skirrll_iats_g}
cpaw{ecYouriphe_dkiringll_i_sats_gr}
cpaw{decYourngiphe_i_skiris_grll_}
cpaw{_decYourringiphell_i_skieats_gr}
cpaw{e_decYourkiringiph_grll_i_s}
cpaw{he_decYour_skiringipats_grll_i}
cpaw{phe_decYour_i_skiringi}
cpaw{iphe_decYourll_i_skiring}
cpaw{giphe_decYourgrll_i_skirin}
cpaw{ngiphe_decYours_grll_i_skiri}
cpaw{ingiphe_decYourats_grll_i_skir}

上から5行目あたりのものが,言葉になってそうですね. cpaw{Your_deciphering_skill_is_great} が答えのようです.

Q21.[Reversing]reversing easy!

問題

フラグを出す実行ファイルがあるのだが、プログラム(elfファイル)作成者が出力する関数を書き忘れてしまったらしい…
reverse100

回答

とりあえず,ダウンロードして, file コマンド

$ file rev100
rev100: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=f94360edd84a940de2b74007d4289705601d618d, not stripped

単純な解法 | strings

strings コマンドを使って,終了.

$ strings rev100
<省略>
PTRh
D$L1
D$Fcpawf
D$J{
D$ y
D$$a
D$(k
D$,i
D$0n
D$4i
D$8k
D$<u
D$@!
T$Le3
[^_]
<省略>

答えは, cpaw{yakiniku!}

別解 | リバースエンジニアリング

https://hex-rays.com/ida-free/
リバースエンジニアリングをする.

; Attributes: bp-based frame fuzzy-sp

; int __cdecl main(int argc, const char **argv, const char **envp)
public main
main proc near

argc= dword ptr  8
argv= dword ptr  0Ch
envp= dword ptr  10h

; __unwind {
push    ebp
mov     ebp, esp
and     esp, 0FFFFFFF0h
sub     esp, 50h
mov     eax, large gs:14h
mov     [esp+4Ch], eax
xor     eax, eax
mov     dword ptr [esp+46h], 77617063h
mov     word ptr [esp+4Ah], 7Bh ; '{'
mov     dword ptr [esp+20h], 79h ; 'y'
mov     dword ptr [esp+24h], 61h ; 'a'
mov     dword ptr [esp+28h], 6Bh ; 'k'
mov     dword ptr [esp+2Ch], 69h ; 'i'
mov     dword ptr [esp+30h], 6Eh ; 'n'
mov     dword ptr [esp+34h], 69h ; 'i'
mov     dword ptr [esp+38h], 6Bh ; 'k'
mov     dword ptr [esp+3Ch], 75h ; 'u'
mov     dword ptr [esp+40h], 21h ; '!'
mov     word ptr [esp+15h], 0A7Dh
mov     byte ptr [esp+17h], 0
mov     dword ptr [esp+1Ch], 5
lea     eax, [esp+46h]
mov     [esp+4], eax
mov     dword ptr [esp], offset unk_8048620
call    _printf
cmp     dword ptr [esp+1Ch], 5
jz      short loc_804855E

これでも yakiniku! と言う文字列が見えますね.

Q22.[Web]Baby's SQLi - Stage 1-

問題

困ったな……どうしよう…….
ぱろっく先生がキャッシュカードをなくしてしまったショックからデータベースに逃げ込んでしまったんだ.
うーん,君SQL書くのうまそうだね.ちょっと僕もWeb問作らなきゃいけないから,連れ戻すのを任せてもいいかな?
多分,ぱろっく先生はそこまで深いところまで逃げ込んで居ないと思うんだけども…….

とりあえず,逃げ込んだ先は以下のURLだよ.
一応,報酬としてフラグを用意してるからよろしくね!

https://ctf.spica.bz/baby_sql/

Caution
・sandbox.spica.bzの80,443番ポート以外への攻撃は絶対にしないようにお願いします.
・あなたが利用しているネットワークへの配慮のためhttpsでの通信を推奨します.

回答

証明書が切れていますが,アクセスします.


単純に SQL を書いてみます.

select * from palloc_home


cpaw{palloc_escape_from_stage1;(} と言う答えが得られました.

Q28.[Network] Can you login?

問題

古くから存在するネットワークプロトコルを使った通信では、セキュリティを意識していなかったこともあり、様々な情報が暗号化されていないことが多い。そのため、パケットキャプチャをすることでその情報が簡単に見られてしまう可能性がある。
次のパケットを読んで、FLAGを探せ!
network100.pcap
(2021/04/11: 問題ファイルを更新しました。)

回答

とりあえず,ファイルをダウンロードして, Wireshark で開こうか.
最初のキャプチャ結果のところで,ターゲットとなっているドメインが q28.ctf.cpaw.site になっていることがわかる.また,主に FTP プロトコルで通信していることがわかる.
では, FTP でフィルタしてみよう.

なんと,ユーザー名は cpaw_user ,パスワードは 5f4dcc3b5aa765d61d8327deb882cf99 で通信していることがわかってしまった.
なので, ftp コマンドを使って,サーバーにアクセスして,フラグを取得してみる.

ftpコマンド
$ ftp q28.ctf.cpaw.site
Connected to host1.ctf.cpaw.site.
220 Welcome to Cpaw CTF FTP service.
Name (q28.ctf.cpaw.site:mattsunkun): cpaw_user
331 Please specify the password.
Password: 
230 Login successful.
ftp> passive
Passive mode on.
ftp> ls
227 Entering Passive Mode (118,27,110,77,234,96).
150 Here comes the directory listing.
-rw-r--r--    1 ftp      ftp            36 Sep 01  2017 dummy
226 Directory send OK.
ftp> get dummy
227 Entering Passive Mode (118,27,110,77,234,96).
150 Opening BINARY mode data connection for dummy (36 bytes).
WARNING! 1 bare linefeeds received in ASCII mode
File may not have transferred correctly.
226 Transfer complete.
36 bytes received in 0.00046 seconds (76.4 kbytes/s)

なんか dummy っていうファイルがあったからダウンロードして閲覧してみる.

dummy
FLAG file exists in this directory.

え... dummy っていうファイルしかなかったぞ...否. -a オプションで隠しファイルもみてみよう.

ftpコマンド (ログイン済み かつ PASSIVEモード)
ftp> ls -a
227 Entering Passive Mode (118,27,110,77,234,96).
150 Here comes the directory listing.
drwxr-xr-x    2 ftp      ftp            42 Mar 17  2021 .
drwxr-xr-x    2 ftp      ftp            42 Mar 17  2021 ..
-rw-r--r--    1 ftp      ftp            39 Sep 01  2017 .hidden_flag_file
-rw-r--r--    1 ftp      ftp            36 Sep 01  2017 dummy
226 Directory send OK.
ftp> get .hidden_flag_file
227 Entering Passive Mode (118,27,110,77,234,101).
150 Opening BINARY mode data connection for .hidden_flag_file (39 bytes).
WARNING! 1 bare linefeeds received in ASCII mode
File may not have transferred correctly.
226 Transfer complete.
39 bytes received in 0.000375 seconds (102 kbytes/s)
ftp> 

良さそうなのがダウンロードできた.では,ダウンロードした .hidden_flag_file を閲覧する. cpaw{f4p_sh0u1d_b3_us3d_in_3ncryp4i0n} と言う答えが得られました.

おわりに

感想

  • CTF っておもろいな〜〜

筆者について

https://mattsun-kun-portfolio.vercel.app/

Discussion