内角540°

セキュリティ。SIEMとかIPSとか統計とかクラウドとか。数学以外で。

0CTF(2017) writeup #oneTimePad

問題

I swear that the safest cryptosystem is used to encrypt the secret!
oneTimePad.zip

2ファイルを渡される。

①暗号化用のスクリプト
oneTimePad.py
②フラグを暗号化した結果ファイル
ciphertext

解く

GF(2^{256})で定義された暗号。
processから以下を読み取れる。

  • R:乱数
  • K:鍵
  • S:シード

 K_{0}=(R_{0})
 K_{1}={{(K_{0}} \bigoplus S)}^2
 K_{2}={{(K_{1}} \bigoplus S)}^2


上記から、Sとkeyを導く。

 S^2=K_{1} \bigoplus K_{2}
 K_{0}=K_{1} \bigoplus {K_{1}}^2 \bigoplus K_{2}

 K_{1}と、 K_{2}はわかっている。

 K_{1} =crypted(fake_secret1) \bigoplus fake_secret1
 K_{2} =crypted(fake_secret2) \bigoplus fake_secret2

コード

#!/usr/bin/env python
# coding=utf-8

from os import urandom

def process(m, k):
    cal = m ^ k
    res = 0
    for i in bin(cal)[2:]:
        res = res << 1;
        if (int(i)):
            res = res ^ cal

        if (res >> 256):
            res = res ^ P
    return res

def keygen(seed):
    key = str2num(urandom(32))
    while True:
        #print "key : ",key,"\nseed : ",seed
        yield key
        key = process(key, seed)

def str2num(s):
    return int(s.encode('hex'), 16)

P = 0x10000000000000000000000000000000000000000000000000000000000000425L
fake_secret1 = "I_am_not_a_secret_so_you_know_me"
fake_secret2 = "feeddeadbeefcafefeeddeadbeefcafe"

#----------------------------------------------------------------#
ctxt1 = 0xaf3fcc28377e7e983355096fd4f635856df82bbab61d2c50892d9ee5d913a07f
ctxt2 = 0x630eb4dce274d29a16f86940f2f35253477665949170ed9e8c9e828794b5543c
ctxt3 = 0xe913db07cbe4f433c7cdeaac549757d23651ebdccf69d7fbdfd5dc2829334d1b

key2 = ctxt2 ^ str2num(fake_secret1)
key3 = ctxt3 ^ str2num(fake_secret2)
 
cal = key3
for i in range(255):cal = process(cal, 0)

seed = cal ^ key2
process(key2, seed) == key3
cal = key2
for i in range(255):cal = process(cal, 0)
key1 = cal ^ seed
process(key1, seed) == key2

message = key1 ^ ctxt1
print "flag{"+hex(message)[2:-1].decode("hex")+"}"

フラグ

flag{t0_B3_r4ndoM_en0Ugh_1s_nec3s5arY}

Evernoteの代替に、AWSでRedmineをたてる

大きな流れ

  • AWS借りる ★今回はここ
  • Redmineたてる ★今回はここ
  • ドメイン借りる
  • SSL対応
  • Snortいれる
  • ModSecurityいれる
  • リモートSplunk監視

-------------------------------------------------

AWS借りる

非常に詳しいリンクがあったので、参考にする。
https://portal.aws.amazon.com/gp/aws/developer/registration/index.html

※リンク先と違う部分のみ下記に記載※

インスタンスは「Redmine ※HVMバージョン」を選択

それとそれと、AWSは稼働時間課金なので、インスタンスは2個3個作っても大丈夫だと思われる
20GBの制限があるけど

SSHで接続するので、キーペアは作成すること!

f:id:gokaxtukei:20170319044541p:plain


-------------------------------------------------

Redmine初回ログイン

HVMバージョンの場合、[admin][AWS上のインスタンス名]

AWS Marketplace ご利用方法
最新版:3.0.3
Once the instance is running, paste the publicDNS or publicIP into your browser window to access the software. Default username for redmine is 'admin' and the password is the instance-id (e.g. i-f4c446fd). You can add/remove/change user and password once you logged in. For additional information, please refer to the user's guide at https://s3.amazonaws.com/aws-market.iaansys.com/AMI-IAANSYS-Redmine-Adv-Ubuntu-64/README_redmine.v3.0.3_ubt.txt

[個人設定]→[パスワード変更]からデフォルトから変更しておく。

-------------------------------------------------

OS以上の初期設定

  • ubuntuユーザの削除
  • sshdのLISTENポート変更※EC2セキュリティグループで、変更後のTCPポートを許可する必要あり

qiita.com



SSHでは、「非デフォルトポート」+「証明書」+「パスワード」を指定する必要ありになった。
証明書以外、あれですが。。。

  • HTTPのLISTENポート変更※EC2セキュリティグループで、変更後のTCPポートを許可する必要あり

vi /etc/nginx/conf.d/redmine.conf

ポートを任意のものに変える

-------------------------------------------------

20GBで足りるのかな?
f:id:gokaxtukei:20170319054429p:plain

Snortインストール方法(Windows)

フリーの不正侵入検知といえば、Snort
プラットフォームはLinuxだけでなく、WindowsMacなどでも利用できる。
今回はWindowsに導入し、操作感を確かめる。

f:id:gokaxtukei:20170321215100p:plain:w300

続きを読む

AlexCTF writeup

かけるときに書く。
元気になったら追記するかも#はてな記法で書き直した

RE1: Gifted: 50
CR1: Ultracoded: 50
CR2: Many time secrets: 100
CR3: What is this encryption?: 150
Fore1: Hit the core: 50
Fore3: USB probing: 150
SC1: Math bot: 100

RE1: Gifted: 50

ELFファイルが渡される。
Strings コマンドでフラグが表示される。

AlexCTF{Y0u_h4v3_45t0n15h1ng_futur3_1n_r3v3r5ing}

CR1: Ultracoded: 50

ZERO_ONEファイルを渡される

f:id:gokaxtukei:20170208224146p:plain

以下の通り、順々に変換していく

・文字列置換(ZERO→0,ONE→1)

・16進数変換

・ASCII変換

BASE64デコード

・モールス信号デコード

ALEXCTF{TH15_1S_5UP3R_5ECR3T_TXT}

CR2: Many time secrets: 100

ワンタイムパットと呼ばれる意味がわからないというから、

鍵をワンタイム以上使用したんだなぁと思ったので…

各行の先頭を ALEXCTF{ でXORしてみる。

f:id:gokaxtukei:20170208225949p:plain

エスパー補完して、「Dear Friend」

#そしてここから一時間かけて一文字ずつエスパーをする作業(・_・。)

#正攻法がわからなかった…

ALEXCTF{HERE_GOES_THE_KEY}

縦に並べて、一文字ずつ総当りするのが早そう?

そもそも正攻法ではない???

CR3: What is this encryption?: 150

RSA暗号

p,qが求まっているので、拡張ユーグリット使って求めたdから復号

#coding: utf-8
p=0xa6055ec186de51800ddd6fcbf0192384ff42d707a55f57af4fcfb0d1dc7bd97055e8275cd4b78ec63c5d592f567c66393a061324aa2e6a8d8fc2a910cbee1ed9
q=0xfa0f9463ea0a93b929c099320d31c277e0b0dbc65b189ed76124f5a1218f5d91fd0102a4c8de11f28be5e4d0ae91ab319f4537e97ed74bc663e972a4a9119307
e=0x6d1fdab4ce3217b3fc32c9ed480a31d067fd57d93a9ab52b472dc393ab7852fbcb11abbebfd6aaae8032db1316dc22d3f7c3d631e24df13ef23d3b381a1c3e04abcc745d402ee3a031ac2718fae63b240837b4f657f29ca4702da9af22a3a019d68904a969ddb01bcf941df70af042f4fae5cbeb9c2151b324f387e525094c41
c=0x7fe1a4f743675d1987d25d38111fae0f78bbea6852cba5beda47db76d119a3efe24cb04b9449f53becd43b0b46e269826a983f832abb53b7a7e24a43ad15378344ed5c20f51e268186d24c76050c1e73647523bd5f91d9b6ad3e86bbf9126588b1dee21e6997372e36c3e74284734748891829665086e0dc523ed23c386bb520
m = (p - 1) * (q - 1)
 
"""拡張ユーグリット互除法"""
def gcd(a, b): 
	if b == 0:
		u = 1
		v = 0
	else:
		q = a / b
		r = a % b
		(u0, v0) = gcd(b, r)
		u = v0
		v = u0 - q * v0
	return (u, v)
d = gcd(e,m)[0]
if d < 0:
	d += l
n = p * q
plain = pow(c, d, n)
print hex(plain)[2:-1].decode("hex")

ALEXCTF{RS4_I5_E55ENT1AL_T0_D0_BY_H4ND}

Fore1: Hit the core: 50

Stringsでフラグらしき文字を見つけた。

一定間隔で文字をひろうとフラグになる

f:id:gokaxtukei:20170208234307p:plain

ALEXCTF{K33P_7H3_g00D_w0rk_up}

Fore3: USB probing: 150

101番目のパケットに入っていた

USBのお陰で、Wireshark問題に復活の兆しが…?

f:id:gokaxtukei:20170208233924p:plain

ALEXCTF{SN1FF_TH3_FL4G_0V3R_U58}

SC1: Math bot: 100

ncで繋いだら、てけいさん的なのが出てきた。

f:id:gokaxtukei:20170208234556p:plain

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect( ('195.154.53.62', 1337) ) 

for i in range(1000):
    msg = s.recv(1024)
    print msg
    question = str(msg).split('\n')[-2] 
    A = int(question.split(' ')[0])
    E = question.split(' ')[1]
    B = int(question.split(' ')[2])
    ans = 0
    if E =="%":
        ans = A % B
    if E =="+":
        ans = A + B
    if E =="-":
        ans = A - B
    if E =="*":
        ans = A * B
    if E =="/":
        ans = A / B

    print str(ans)
    s.send(str(ans)+"\n");

フラグはメモし忘れた。

以上。