satto1237’s diary

s4tt01237’s diary

ラーメンとかCTFとかセキュリティとか

Saudi and Oman National Cyber Security CTF 2019 Write-up

はじめに

2019/02/02 ~ 2019/02/10 に開催されたSaudi and Oman National Cyber Security CTFに個人で参加しました.

成績

5問解いて 105位 (1問以上解いた457人中) でした.

f:id:satto1237:20190210154230p:plain

Just Another Conference [General Information, 50]

famous Cybersecurity conference runs by OWASP in different locations

アプローチ:ググる

www.owasp.org

AppSec

フラグ提出チェック問ですね.

Back to basics [Web Security, 50]

not pretty much many options. No need to open a link from a browser, there is always a different way

Link: http://35.197.254.240/backtobasics

アプローチ:POST

問題文に色々書かれてますが気にせずにリンクを踏んでみるとwww.google.comにリダイレクトされてしまうことが分かります.

curlGETリクエストを投げて確かめてみます.

> curl http://35.197.254.240/backtobasics/

<script> document.location = "http://www.google.com"; </script>%

GETリクエストの情報量が微妙だったので基本に帰って (back to basics) POSTリクエストを投げてみます.

> curl -X POST http://35.197.254.240/backtobasics/
<!--
var _0x7f88=["","join","reverse","split","log","ceab068d9522dc567177de8009f323b2"];function reverse(_0xa6e5x2){flag= _0xa6e5x2[_0x7f88[3]](_0x7f88[0])[_0x7f88[2]]()[_0x7f88[1]](_0x7f88[0])}console[_0x7f88[4]]= reverse;console[_0x7f88[4]](_0x7f88[5])
-->%

jsが降ってきたので整形してあげます.

var _0x7f88=["","join","reverse","split","log","ceab068d9522dc567177de8009f323b2"];

function reverse(_0xa6e5x2) {
    flag= _0xa6e5x2[_0x7f88[3]](_0x7f88[0])[_0x7f88[2]]()[_0x7f88[1]](_0x7f88[0])
}

console[_0x7f88[4]]= reverse;
console[_0x7f88[4]](_0x7f88[5])

読みにくいの読みやすくします.

flag = "ceab068d9522dc567177de8009f323b2".split("").reverse().join("")

この結果がフラグになります.

2b323f9008ed771765cd2259d860baec

I love images [Digital Forensics, 50]

A hacker left us something that allows us to track him in this image, can you find it?

f:id:satto1237:20190210160433p:plain

アプローチ:baseXX

> file godot.png
godot.png: PNG image data, 64 x 64, 8-bit/color RGBA, non-interlaced
> strings godot.png | tail
*TYlT_qP
vL.I


IK@
VMqa.%
pDuF(
op+P
q}'ZA0
O-T&
IEND
IZGECR33JZXXIX2PNZWHSX2CMFZWKNRUPU======

pngbase64っぽい文字列が埋め込まれているのが分かります.
早速デコードしようとしますが上手くいきません.

> echo 'IZGECR33JZXXIX2PNZWHSX2CMFZWKNRUPU======' | base64 -D
!�� �%��!}�5��I}�0VV(�T=%

ここでrot13系が噛んでるのかなと考え,rot1~rot25までを総当たりしますが上手くデコードできず,無限に時間を溶かしました.

もう一度IZGECR33JZXXIX2PNZWHSX2CMFZWKNRUPU======をよく眺めてみると小文字が出現していないことやパディングが多すぎることに違和感を覚え,ようやくエンコード方式が違うことに気が付きました.

エンコード方式が違うといってもすぐに思いつくエンコード方式がbase58(ビットコインのあれ)くらいだったので色々調べてみるとbase32がそれっぽいことが分かりました.

あとはオンラインツールでデコードしてあげるとフラグを取得できます.
emn178.github.io

FLAG{Not_Only_Base64}

Hack a nice day [Digital Forensics, 100]

can you get the flag out to hack a nice day. Note: Flag format flag{XXXXXXX}

f:id:satto1237:20190210163404j:plain

アプローチ:Steganography

> file info.jpg
info.jpg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, comment: "badisbad", baseline, precision 8, 194x259, frames 3

comment: "badisbad"が怪しいですね.

> strings info.jpg | head
JFIF
badisbad
!1!%)+/..
383-7(-.+
---+------+----+-----+----+-------+------------7--
$3br
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz
&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz
)((*
YZI{0

ヘッダから恐らくSteganographyであることが分かります(経験則).

早速steghideで埋め込まれたファイルを抽出します.
この際,passphrasebadisbadを用いました.

> steghide extract -sf info.jpg 
Enter passphrase: 
wrote extracted data to "flaggg.txt".

あとはflaggg.txtを読めば終わりです.

> cat flaggg.txt 
flag{Stegn0_1s_n!ce}

flag{Stegn0_1s_n!ce}

I love this guy [Malware Reverse Engineering, 100]

Can you find the password to obtain the flag?

アプローチ:デコンパイル

> file ScrambledEgg.exe
ScrambledEgg.exe: PE32 executable (GUI) Intel 80386 Mono/.Net assembly, for MS Windows

.Net系はdnSpyに投げるのが自分の中で定石になりつつあるので早速デコンパイルしてみます.

// Token: 0x04000001 RID: 1
public char[] Letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ{}_".ToCharArray();


MessageBox.Show(new string(new char[]
                {
                    this.Letters[5],
                    this.Letters[11],
                    this.Letters[0],
                    this.Letters[6],
                    this.Letters[26],
                    this.Letters[8],
                    this.Letters[28],
                    this.Letters[11],
                    this.Letters[14],
                    this.Letters[21],
                    this.Letters[4],
                    this.Letters[28],
                    this.Letters[5],
                    this.Letters[14],
                    this.Letters[13],
                    this.Letters[25],
                    this.Letters[24],
                    this.Letters[27]
                }));

パスワードを見つけようとしたらフラグを見つけてしまったのでデコードします(恐らく想定解法ではない).

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

if __name__ == '__main__':
    letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ{}_'
    flag = [
    letters[5],
    letters[11],
    letters[0],
    letters[6],
    letters[26],
    letters[8],
    letters[28],
    letters[11],
    letters[14],
    letters[21],
    letters[4],
    letters[28],
    letters[5],
    letters[14],
    letters[13],
    letters[25],
    letters[24],
    letters[27]]

    print(''.join(flag))
> python solve.py
FLAG{I_LOVE_FONZY}

まとめ

  • 時間をかけて取り組んだ割には微妙な結果になってしまった
  • 解けそうで解けない問題が多くて消耗してしまった
  • MariaのIPアドレスベースのSQLi?めっちゃ解法が気になる
  • CTF用にWindows Laptopがほしい
  • Crypto問が出なくて悲しかった