📖

picoCTF 2024 Writeup - General Skills

2024/03/31に公開

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