PicoCTFのらいとあっぷみたいなやつ。(Web Exploitationの旅)

はじめに

picoCTFに取り組んで行くときの考えていたことを書き記す。writeupというより、解いた道筋を書いていますので、最短距離を知りたい人にとっては意味わからないものかもしれません。ご了承ください。begginerのお戯れと思って暖かく見守っていただければ幸いです。とある企業のCTFで脆弱性診断よりの問題に手も足も出なかったので、それでもまずは10000solves以上のものに取り組んで行こうと思う。

開閉

Cookies

Who doesn't love cookies? Try to figure out the best one. http[:]//mercury.picoctf.net:54219/ということでwebサイトが配布されている。cookieを見つけるものらしい。

知識(cookie)
cookie Cookie(クッキー)とは?仕組み・種類・目的・設定方法を解説 ログインパスワードなどの入力を記録したりして利便性を向上させる機能らしい。

無知すぎて、ここからどうすればいいかわからん。writeip見る。
参考にしましたのはpicoCTF2021 [Web Exploitation] writeupです。

cookieの確認はwebページの開発者ツールからできるようだ。(ブラウザ別Cookieの確認方法)cookiesの値はダブルクリック?で編集モードに入るので、そこで値を変えるとページが変わった。

cookie でnameのインデックスをセットしているようです。この値を変えながらflagが出るまで試す。
実際引用元のコードを利用させていただきました。flagゲット。

感想 web関係のCTFが不慣れなものが原因か手も足も出ない。徐々に知識を培っていきたい。cookieを用いた問題はちょっとは手が出せるのかな?

Insp3ct0r

Kishor Balan tipped us off that the following code may need inspection: https[:]//jupiter.challenges.picoctf.org/problem/44924/ (link) or http[:]//jupiter.challenges.picoctf.org:44924

与えられたURLは検査が必要なようです。直接訪れていいとは思う。脆弱性があるのかな? whatとhowで表示されるものが変わるシンプルな作り。いじれる可能性は少なさそうなんだけどな。 でも,JavaScriptを用いた攻撃があるのは知っているので、そこを利用されるのかな?でも、見たところ変なとこはなさそう。 管理ツールでソースコード見てみるとflagが3つに分割されて書かれているそれらを合わせるといけそう。

Html is neat.
You need CSS to make pretty pages.
Javascript sure is neat.
と添えられていた。つまり、問題なかったのかな?

Scavenger Hunt

There is some interesting information hidden around this site http[:]//mercury.picoctf.net:5080/. Can you find it?
何かしらの重要な情報が隠されているらしい。見つけるようだ。 開発者ツールのコードからインデックスとmycss.cssからflagの2/3が発見できた。
残りを見つけなければならない。 myjs.jsにflagがあるはずだがない。その代わり以下の文が書かれていた。
/ How can I keep Google from indexing my website? /
Googleにウェブサイトをインデックスされるとはどういうことなのか?

知識(googleのインデックス)
googleのインデックス googleのインデックスに関して つまり、googoleは自動的にwebサイトを登録して、検索エンジンに表示している。 それを行うのがこのインデックスということかな。

インデックスはわかった。それをされないため?そんなことができるのですね。 上記のところにも方法は書いてあったが、開発者ツールのコードは変更できない。

ここからwriteUpを見てしまいました。
ということで、ほかの方法を探す。(検索に引っかからないようにする3つの方法!削除する方法も解説)に「robots.txtへの記述でクローラーを制御する方法があります」と書いてある。

知識(Robots.txt)
Robots.txt Robots.txtとは?| Robots.txtファイルの仕組み ここでインデックスの設定などを記入できるようだ。

つまり、このrobots.txtをいじることで防げるのかな。訪れてみる。

User-agent: *
Disallow: /index.html
# Part 3: t_0f_pl4c
# I think this is an apache server... can you Access the next flag?

apacheについてみてみる。 (CTF Web メモ) に.htaccessを確認するとよいらしい。

# Part 4: 3s_2_lO0k
# I love making websites on my Mac, I can Store a lot of information there.

先のサイトでMacといえば、.DS_Storeということで調べてみるとflagの最後の断片をゲット終了。

[2023/12/25]
今年最後の問題になりそうです。よいお年を。

Unminify

I don't like scrolling down to read the code of my website, so I've squished it. As a bonus, my pages load faster! Browse here, and find the flag!
なにかを省略したのだろうか。

すでにflagは送られているようだ。
問題文のUnminifyを調べてみるとMinifyの逆の動作のようだ。

知識(Minify)
Minify (Minify(ミニファイ)とは何か?圧縮方法とJS・CSSの軽量化のメリットを解説)を参考にした。つまり、コードを圧縮して、高速化を図ったようだ。

つまり、この問題では圧縮されたコードをもとに戻すといった感じだろうか。JavaScriptCSSが送られているようだが、、 管理者ツールでコード見てたらflagっぽいのがそのままあった。これでおしまい?

Bookmarklet

Why search for the flag when I can make a bookmarklet to print it for me? Browse here, and find the flag!
となっている。

知識(JavaScript)
JavaScript (【超入門】JavaScriptとは?できること・基本をわかりやすく解説)を参考にした。ブラウザ上で動くプログラムのようだ。
知識(bookmarklet)
bookmarklet (【必見】ブックマークレットの使い方・作り方と便利なおすすめ13選を解説)を参考にした。「Webブラウザに機能を追加してブックマークできるもの」だそうです。

(Bookmarkletを作ろう(準備編))から画面に表示されているコードはブックマークレットなのかもしれない。そして、それを実行する方法はアドレスバーに入力するだけ。そうするとflagがポップしてくる終了。

WebDecode

Do you know how to use the web inspector? Start searching here to find the flag
webインスペクターとは何ぞや。
copilotに聞くとどうも開発者ツールのことだと思う。
開発者ツールを用いつつ、サイトを見ていくとaboutのところで何やら。目を引く文字列がある。cyberchefに入れて、magicしたらBase64されていたみたい。デコードしたら終了。

No Sql Injection

Can you try to get access to this website to get the flag? You can download the source here. The website is running here. Can you log in?
ということで、コードとページが与えられた。
コードを見ているが、固有名詞がデータベースに入っているというわけではないので、不正なログインはできなささそう。hintsを見た。NoSQL injectionというものがあるようだ。

知識(NoSQL injection)
NoSQL injection (NoSQLでもインジェクション攻撃は成立する|仕組みと対策を解説)を参考にした。「NoSQLのデータベースに対して実行されるインジェクション攻撃です。」だそうだ。そのようなDBが存在しているのね。
知識(NoSQL)
NoSQL (【図解】NoSQLとは?注目される背景や種類をわかりやすく解説)を参考にした。リレーショナルデータベース以外のデータベースのことを示しているようだ。

database.tsにimport mongoose, { ConnectOptions } from "mongoose";とあった。これがNoSQLのデータベースなのね。クエリに不正があればインジェクションできるようだ。

NoSQLのデータベースも、データを操作する際には「クエリ」と呼ばれる命令文を使います。そのため、このクエリの組立て方法に不備があれば、NoSQLのデータベースであっても、このクエリに干渉するような入力値を挿入することで、インジェクション攻撃を実行できる場合があります。NoSQLを使っているからといって安心せず、必要な対策を実施しなければなりません。

(MongoDBにおけるNoSQLインジェクション: 脆弱性の仕組みと対策)を参考にすると、

import User from "../models/user";
export const seedUsers = async (): Promise<void> => {
  
  try {

     const users = await User.find({email: "joshiriya355@mumbama.com"});
      if (users.length > 0) {
        return;
      }
    const newUser = new User({
      firstName: "Josh",
      lastName: "Iriya",
      email: "joshiriya355@mumbama.com",
      password: process.env.NEXT_PUBLIC_PASSWORD as string
    });
    await newUser.save();
  } catch (error) {
    throw new Error("Some thing went wrong")
  }
};

このファイルで初期ユーザーが定義されている。これは用いるのだろうか?

import mongoose, { Schema, Document, models } from "mongoose";

export interface UserInterface extends Document {
  email: string;
  firstName: string;
  lastName: string;
  password: string;
}

const UserSchema: Schema = new Schema({
  email: { type: String, required: true, unique: true },
  firstName: { type: String, required: true },
  lastName: { type: String, required: true },
  password: { type: String, required: true },
  token: { type: String, required: false ,default: "{{Flag}}"},
});
const User = models.User || mongoose.model<UserInterface>("User", UserSchema);

export default User;

user.tsではuserスキーマが定義されている。ここで、ユーザーデータベースとして作っている。

export const POST = async (req: any) => {
  const { email, password } = await req.json();
  try {
    await connectToDB();
    await seedUsers();
    const users = await User.find({
      email: email.startsWith("{") && email.endsWith("}") ? JSON.parse(email) : email,
      password: password.startsWith("{") && password.endsWith("}") ? JSON.parse(password) : password
    });

    if (users.length < 1)
      return new Response("Invalid email or password", { status: 401 });
    else {
      return new Response(JSON.stringify(users), { status: 200 });
    }
  } catch (error) {
    return new Response("Internal Server Error", { status: 500 });
  }
};

ここ(route.ts)がユーザーを認証しているように考える。コードの解釈はAIに聞くとわかりやすい。(JSON.parse()、JSON.stringify()の使い方|間違えやすいポイントも解説します!)を見るとコード解釈が分かりやすい。 コードをAIに読み込ませるとemailとpasswordのところに{}で始まり終わるコードを入力するとそれがJavascriptオブジェクトになるようだ。これがインジェクションに役立つのか?

知識(Javascriptオブジェクト)
Javascriptオブジェクト (オブジェクトとは)を参考にした。キーとバリューの組で表されるようだ。

どうやってインジェクションするのだろうか? (NoSQLでもインジェクション攻撃は成立する|仕組みと対策を解説)を参考にすると、

MongoDBの主な特徴はスピードで、特定の操作を行うための演算子が用意されています。今回例にあげる演算子は「$ne」です。これは「not equal」の略称で、一致しない値を出力します。例えば、「’$ne’:”test”」と使えば、「test」という文字列に一致しないデータを出力します。

ということでインジェクションが行えると書いてある。つまり、{’$ne’:”test”}とすればできるのではないか?ダメみたい。
writeUpを確認した( picoCTF 2024 - Writeup)。{ "$ne": "nai-nai" }で入力したらいけるようだ。違いが判らん。スペースか"と'の違いくらいしかない。
結果から言うと"が鍵になっていたようだ。{’$ne’:”test”}のtestに使われている"これは少し違うみたい。なので、"を使って行えばできたようだ。
そしたら、loginのレスポンスの中のtokenを確認したらBase64エンコードされているので、デコードすれば終了。

where are the robots

Can you find the robots? https://jupiter.challenges.picoctf.org/problem/60915/ (link) or http://jupiter.challenges.picoctf.org:60915
ということで以下のようなサイトを渡された。

robotsはどこということでrobots.txtのことであろう。(robots.txtとは?意味から設定方法まで詳しく解説)を参考にした。ドメインのルートディレクトリにあるはずなので。今回の問題だとhttps[:]//jupiter.challenges.picoctf.org/problem/60915/robots.txtにあると思い入力。

内容が書かれている。

User-agent: *
Disallow: /8028f.html

User-agentはどのクローラーに認識させるかを決めているようだ。*なのですべて。
Disallowが設定されている。訪れさせたくないのかな。つまりflagありそう。入力したらあった。終了。

logon

The factory is hiding things from all of its users. Can you login as Joe and find what they've been looking at? https://jupiter.challenges.picoctf.org/problem/15796/ (link) or http://jupiter.challenges.picoctf.org:15796
ということで、どうにかしてjoeというアカウントにログインする問題のようだ。

与えられたのはこんなページ。 コードを確認していたがそれっぽいことは書かれていない。(picoCTF 2019 logon - Points: 100)writeupを見てしまった。cookie情報で攻撃を行うようだ。
確かに見てみるとadminだけfalseになっている。これが問題のようだ。 開発者ツールでここをTrueに書き換えたら終了。

dont-use-client-side

Can you break into this super secure portal? https://jupiter.challenges.picoctf.org/problem/29835/ (link) or http://jupiter.challenges.picoctf.org:29835
ということらしい。開発者ツール見たら分かれて書いてあった。並び替えて終了。

login

My dog-sitter's brother made this website but I can't get in; can you help?
ということでwebサイトのURLが渡された。

シンプルな作り。開発者ツール見てみる。index.jsに気になるところ発見。

   , t = {};
        for (const e in r)
            t[e] = btoa(document.querySelector(r[e]).value).replace(/=/g, "");
        return "YWRtaW4" !== t.u ? alert("Incorrect Username") : "cGljb0NURns1M3J2M3JfNTNydjNyXzUzcnYzcl81M3J2M3JfNTNydjNyfQ" !== t.p ? alert("Incorrect Password") : void alert(`Correct Password! Your flag is ${atob(t.p)}.`)
    }

入力された文字をbtoa(document.querySelector(r[e]).value).replace(/=/g, "")で変換している。

知識(btoa関数)
btoa関数 (JavaScriptのバイナリー文字列とatob、btoaの関係について)を参考にした。base64と文字列を変換する関数のようだ。

よって、base64デコードしてみる。

ビンゴadminでやっている。passwordの方をデコードするとflagゲット。終了。

Inspect HTML

Can you get the flag? Go to this website and see what you can discover.
開発者ツール見たら発見。低評価が付くのも納得。

Local Authority

Can you get the flag? Go to this website and see what you can discover.

シンプルな作り。適当なワードを入力して実行するとその先の画面に行く。その時に開発者ツールでコードを見るとユーザー名とパスワードが書かれているので入力。正解。終了。

Includes

Can you get the flag? Go to this website and see what you can discover.
開発者ツール見たらflagあり。

Some Assembly Required 1

http://mercury.picoctf.net:37669/index.html
サイトが渡された。
これも開発者ツール見たらadda0372というファイルの下の方に書かれていた。もっとちゃんとした解き方があるのかな?javascriptについて何かしらコードが動いているようだが、またそのような問題が出てきたときに学ぶとする。

picobrowser

This website can be rendered only by picobrowser, go and catch the flag! https://jupiter.challenges.picoctf.org/problem/50522/ (link) or http://jupiter.challenges.picoctf.org:50522
レタリングってどういう意味だろうか?

flagを押すと

picobrowserじゃないって言われた。

知識(レタリング)
レタリング (Webブラウザのレンダリングの仕組みを理解する)を参考にする。「「指定したリソースをブラウザ画面に表示すること」を「レンダリング」と言います。」だそうです。

レタリングエンジンを同じものにしろってことかな?エラーとして出てきた文字をAIに投げると「ユーザーエージェント (User-Agent) 文字列で、ウェブブラウザがウェブサーバーに送信する情報を表します。」だそうだ。

知識(ユーザーエージェント)
ユーザーエージェント (ユーザーエージェントとは? 意味や使い方を解説)を参考にする。「、インターネットを閲覧しているユーザーの、デバイス・OS・ブラウザなどの情報を文字列にしたもの」だそうだ。

UAを変更するとよいのかな?(Chromeでユーザーエージェント (UA) を変更する方法)を参考にしてUAを変更するとflag出てきた。

Search source

The developer of this website mistakenly left an important artifact in the website source, can you find it? The website is here
ということで普通のサイトを渡された。

気になる部分はここ。どうにかしてこの画像を表示させるのが目標なのかな。わからないのでwriteup見たらまじでコードの中にあった。探す系は面倒。

Can you get the flag? Go to this website and see what you can discover.


という画面遷移をするようだ。

function continueAsGuest()
{
  window.location.href = '/check.php';
  document.cookie = "isAdmin=0";
}

ソースコードはこんな感じ。isadmin = 0の時に二枚目の画面に遷移すれと考えらえるので、0以外にする。flagゲット。

これ以降未解決

More Cookies

I forgot Cookies can Be modified Client-side, so now I decided to encrypt them! http://mercury.picoctf.net:21553/ クッキーが編集できるようです。encryptとあるので暗号化されているように思う。
eDh1VHlRd011aDQ2QmtJelZpNEtUaU1ldXMxYVAvRTJOSzJLNHdvejRaTFJpUjFYd2ROVlhEWjY4TlJGTmRrbFFoalJGYkxndHBIRmVrc0dnM1h0S3RUeE16dEVVOEtyYzFDcTVGSHpoTXlvcVQ2T3JMSXNYVG1jZFBzRit5VEg=
cyberchefのmagicを用いてもいい感じになるものはない。どうやるのかな。末尾が=なのでbase64がにおいます。一応変形はできるけど、可読文字にはならない。お手上げ、writeup読んでもわからない。いったん飛ばす。

IntroToBurp

Try here to find the flag

登録画面のようだ。なんでもいいので文字列を入力。
よくわからない画面に入った。2fa authentication?調べてみると二要素認証のことのようだ。OTPはワンタイムパスワードの略のようだ。

知識(2fa 認証)
2fa認証 (2 要素認証とは?)を参考にした。2つの異なる秘密や特有のものを用いて認証すること。
知識(OTP)
OTP (ワンタイムパスワード(OTP)とは? 仕組みや多要素認証などについて解説)を参考にする。短い時間しか使えないパスワードといった感じ。

OTPをよくわからず入力すると
もしかしたら、メールあてに何かしらが送られていたのだろうか?
hints見てみた。

Try using burpsuite to intercept request to capture the flag.

ということでなにかしらのツールが必要そう。いったんほかの問題する。

Who are you?

Let me in. Let me iiiiiiinnnnnnnnnnnnnnnnnnnn

またpicobrowserを使う系のやつなのかな?
前の問題のようにUAを変えてみたが違うようだ。異なるサイトから遷移するのは信用できないようだ。writeupをちろっと見てみたが、難しい。また今度。