picoCTF 2024 Writeup - General Skills
Super SSH - 25 points
指定されたホスト/ポート/ユーザ名/パスワードでsshでアクセスすればフラグを取得できる。
$ 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 - 50 points
zipファイルが提供される。フラグを書いたが消したとのこと。
.gitが存在するのでログを見る
$ 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
b562f0のコミットの状態にする。
$ git checkout b562f0
$ cat message.txt
picoCTF{s@n1t1z3_c785c319}
Time Machine - 50 points
zipファイルが提供される。これも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 - 75 points
zipファイルが提供される。これも.gitの問題。
タイトルから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 - 75 points
zipファイルが提供される。
今回もgitの問題.mainブランチ以外に3つブランチがあるので、それそれチェックアウトしてflag.pyを連結する
$ git branch
feature/part-1
feature/part-2
feature/part-3
* main
$ git checkout feature/part-1
Switched to branch 'feature/part-1'
$ python flag.py
Printing the flag...
picoCTF{t3@mw0rk_
$ git checkout feature/part-2
Switched to branch 'feature/part-2'
$ python flag.py
Printing the flag...
m@k3s_th3_dr3@m_
$ git checkout feature/part-3
Switched to branch 'feature/part-3'
$ python flag.py
Printing the flag...
w0rk_6c06cec1}
よって、フラグは以下
picoCTF{t3@mw0rk_m@k3s_th3_dr3@m_w0rk_6c06cec1}
binhexa - 100 points
サーバに接続するとバイナリの演算のクイズを出されるので、回答すれば良い。
$ 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: 01000001
Binary Number 2: 01001110
Question 1/6:
Operation 1: '+'
Perform the operation on Binary Number 1&2.
Enter the binary result: 01000000
Correct!
Question 2/6:
Operation 2: '|'
Perform the operation on Binary Number 1&2.
Enter the binary result: 01001111
Correct!
Question 3/6:
Operation 3: '<<'
Perform a left shift of Binary Number 1 by 1 bits.
Enter the binary result: 10000010
Correct!
Question 4/6:
Operation 4: '&'
Perform the operation on Binary Number 1&2.
Enter the binary result: 01000000
Correct!
Question 5/6:
Operation 5: '*'
Perform the operation on Binary Number 1&2.
Enter the binary result: 1001111001110
Correct!
Question 6/6:
Operation 6: '>>'
Perform a right shift of Binary Number 2 by 1 bits .
Enter the binary result: 00100111
Correct!
Enter the results of the last operation in hexadecimal: 27
Correct answer!
The flag is: picoCTF{b1tw^3se_0p3eR@tI0n_su33essFuL_d6f8047e}
Binary Search - 100 points
サーバに接続して、1-1000の範囲の数当てゲームをする。数は毎回ランダムになる。二分探索をすれば10手以内で当てることができ、フラグを取得できる。
$ ssh -p 56289 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: 750
Lower! Try again.
Enter your guess: 625
Higher! Try again.
Enter your guess: 688
Higher! Try again.
Enter your guess: 719
Higher! Try again.
Enter your guess: 735
Higher! Try again.
Enter your guess: 743
Higher! Try again.
Enter your guess: 747
Higher! Try again.
Enter your guess: 749
Lower! Try again.
Enter your guess: 748
Congratulations! You guessed the correct number: 748
Here's your flag: picoCTF{g00d_gu355_1597707f}
Connection to atlas.picoctf.net closed.
endianness - 200 points
ソースコードが提供される。
インスタンスに接続すると、ランダムな文字列のリトルエンディアンとビッグエンディアンの表現を聞かれるので回答すれば良い。
$ nc titan.picoctf.net 55226
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: gncxa
Enter the Little Endian representation: 6178636e67
Correct Little Endian representation!
Enter the Big Endian representation: 676e637861
Correct Big Endian representation!
Congratulations! You found both endian representations correctly!
Your Flag is: picoCTF{3ndi4n_sw4p_su33ess_25c5f083}
dont-you-love-banners - 300 points
tethys.picoctf.net:51172から情報が漏れていて、それを元に別のサーバインスタンスにアクセスする。
ncでアクセスするとパスワードっぽい情報を見ることができる
$ nc tethys.picoctf.net 51172
SSH-2.0-OpenSSH_7.6p1 My_Passw@rd_@1234
このパスワードを元に、サーバインスタンスの方にアクセスする。パスワード以外も質問されるが、ググって答える。
$ nc tethys.picoctf.net 61793
*************************************
**************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 Draper
player@challenge:~$
psを実行すると/root/script.pyを実行している。また、同じ/root/にflag.txtが存在する
player@challenge:~$ ps -ef
...
root 34 33 0 21:47 ? 00:00:00 python3 /root/script.py
player@challenge:~$ ls /root
ls /root
flag.txt script.py
script.pyは読むことはできて、以下のコードになっている。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
スクリプトの中で/home/player/bannerを読み込んで出力しているので、シンボリックリンクをbanner->flag.txtとなるように作成する
player@challenge:~$ rm banner
rm banner
player@challenge:~$ ln -s /root/flag.txt /home/player/banner
ln -s /root/flag.txt /home/player/banner
一度サーバインスタンスから抜けて、再度アクセスするとバナーの代わりにフラグが表示される
$ nc tethys.picoctf.net 61793
picoCTF{b4nn3r_gr4bb1n9_su((3sfu11y_f7608541}
what is the password?
SansAlpha - 400 points
サーバインスタンスにsshでアクセスするとシェルが起動するが、アルファベットは未知の文字として理解してくれない。数字と記号は問題ない
SansAlpha$ ls
SansAlpha: Unknown character detected
SansAlpha$ 1
bash: 1: command not found
SansAlpha$ ?
bash: ?: command not found
シェルの展開機能を用いて、__
のようなアンダースコアを繰り返す変数に展開した値を入れていく。まずはlsやcatを実行したいので、その文字を集めていく
SansAlpha$ /???/???/???
bash: /sys/bus/cpu: Is a directory
SansAlpha$ __=(/???/???/???) # __=/sys/bus/cpu
SansAlpha$ ___=(/???/???/????) # ___=/dev/pts/ptmx
SansAlpha$ $___
bash: /dev/pts/ptmx: Permission denied
SansAlpha$ ____=(/???/?????/???) # ____=/sys/class/bdi
SansAlpha$ $____
bash: /sys/class/bdi: Is a directory
lsが実行できるのでlsを実行する
SansAlpha$ ${____:6:1}${__:1:1} # ls
blargh on-calastran.txt
ファイル名にcを含むのでcatも使えるようになる
SansAlpha$ _____=$(${____:6:1}${__:1:1}) # _____="blargh on-calastran.txt"
SansAlpha$ ${_____:10:1}${_____:11:1}${___:6:1} * # cat *
cat: blargh: Is a directory
The Calastran multiverse is a complex and interconnected web of realities, each
...
blarghはディレクトリだったのでlsをし直す
SansAlpha$ ${____:6:1}${__:1:1} * # ls *
on-calastran.txt
blargh:
flag.txt on-alpha-9.txt
blargh/flag.txtがフラグっぽいのでcatする
SansAlpha$ ${_____:10:1}${_____:11:1}${___:6:1} */* # cat */*
return 0 picoCTF{7h15_mu171v3r53_15_m4dn355_4945630a}Alpha-9, a distinctive layer within the Calastran multiverse, stands as a
...
フラグが出てきた。
Discussion