2000 OK

basketball player and hacker will keep be childish.

CSAW CTF Forensics 150

Challenge

Missed Registration
It’s registration day! These forms just seem longer and longer… pcap file is here

Solutions

Almost of all packets are HTTP POST packets. They looks like sending data normally, but some packet include x parameter. Their Contents-length on HTTP header and real data length are different. It is suspicious.
Then, I pick up all x parameter data. Then we can find that the head of data is “424d”. The magic number “0x42 0x4d” means that this file is BMP file.
So, we’ll write solving script.

#!/usr/bin/env python

from scapy.all import *
import binascii

packets = rdpcap('cap.pcap')
f = open('flag.bin','wb')

for packet in packets:
    params = ""
    if Raw in packet:
        params = packet[Raw].load
        if params.find("&x=") > 0:
            xLocation = params.rfind("&x=")
            word = params[xLocation+3:]
            f.write(binascii.unhexlify(word))
f.close()

sweets

FLAG{3Am_LaunDR3Y_FLaG_L34kz!}

ASIS CTF Final 2017 Reversing ABC

今回は問題を解くことができませんでした。備忘録として残します。

Challenge

Description: Start Reverse

Solution

64bitのELFファイルが与えられます。ひとまず実行してみます。

$ ./abc 
give me flag... :D
$ ./abc 12345
Sorry, try harder :(

引数に期待される文字列を入力する問題のようです。

$ ltrace ./abc 12345
...
...
...
strcmp("fb644351560d8296fe6da332236b1f8d"...,"69fc8b9b1cdfe47e6b51a6804fc1dbdd"...) = 48  
puts("Sorry, try harder :("Sorry, try harder :(    )   = 21  

入力した文字列に対して、なんらかの文字列変換を行った後、固定値"69fc8b9b1cdfe47e6b51a6804fc1dbdd"と文字列比較をしています。入力文字列が9文字の場合と、10文字の場合で比較する文字列が変わらないことから、入力文字列は9文字かもしれません。

デコンパイルをしてみます。0x400876の引数入力チェック後の0x4008baの関数が怪しそうです。mallocで3回に分けてメモリ領域を確保しており、それぞれを、0x4024dfの関数に食わせてます。var_168に4byte、var_158に4byte、var_160に4byte入れておりますが、var_158は4byte目から6byteなので、入力値は12文字であることが分かります。
何故、(var_190 + 0x8)が入力引数の先頭アドレスなのか分かりません…分かる方は教えて頂けると幸いです。

おそらく、0x4024dfが何らかの文字列変換をさせる関数なんじゃないかと思います。中に入っていくと、かなり複雑なことをしていそうです。。。0x400cc6を見るといくつかの固定文字列(例 0x5a827999)とAND演算をしていました。0x5a827999をググってみると、SHA-1の記事が多数引っ掛かります。0x4024dfはSHA-1ハッシュ関数だと推定します。(推定ばっかりだなぁ org…)

0x4008baの最後のif文を見ると、次の条件でflagを手に入れる事が出来ることが分かります。
- 入力引数3-8文字のSHA-1ハッシュ値が"69fc8b9b1cdfe47e6b51a6804fc1dbdd" - 入力引数1-4文字が入力引数9-12文字未満であること。 - 入力引数1-4文字のハッシュ値の先頭4文字が、自身と同じであること。 - 入力引数9-12文字のハッシュ値の先頭4文字が、自身と同じであること。

1-4文字と入力引数9-12を求めるスクリプトを書きました。無駄のあるスクリプトですが、数分で2パターンが見つかりました。

#!/usr/bin/env python

import random
import hashlib

while True:
    arg = ''
    for num in range(4):
        arg += random.choice('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')

    hash = hashlib.sha1(arg).hexdigest()

    if hash[:4] == arg:
        print "arg is " + arg
        print "sha1 hash is " + hash
        break

#arg is 57d9
#arg is b53a

入力引数は57d9****b53aであることが分かりました。


ここまでは、CTF開催時間で出来ました。


残りの4byteを調べます。 hashcatを使うと早いようです。不明文字は4文字ですが、推定のところが間違っているかもしれないですし、6文字で調べてみます。

hashcat64 -m 100 -a 3 69fc8b9b1cdfe47e6b51a6804fc1dbddba1ea1d9 ?a?a?a?a?a?a  

結果まで9時間かかりました。

69fc8b9b1cdfe47e6b51a6804fc1dbddba1ea1d9:$HEX[393a2d2a2962]

asciiコード表と照らし合わせると、6文字は"9:-)b"であることが分かります。
つまり、入力引数は"57d9:-
)b53a"です。

Sweets

“57d9:-*)b53a"を入力引数にして実行させてみます。

$ ./abc 57d9:-*)b53a  
bash: syntax error near unexpected token `)'
$ ./abc 57d9:-*\)b53a
gj, you got the flag: ASIS{477408a4d4ad68aa7abdfd2be0e4717154497c42}

flagを入手できました。

brush

表面をなめただけの気がします。アセンブラともっと仲良くなりたいorg

HackIT CTF 2017 Forensic 100

Challenge

This file was captured from one of the computers at the Internet cafe. We think that the hacker was using this computer at that time. Try to get his secret documents. ( flag format is flag{…} )

Solution

あたえられるのはpcapファイルです。中を開くとUSBのパケットが並びます。interrupt転送やらハブのディスクリプタが流れた後、怪しげなディスクリプタが流れていました。アップルのキーボードに関するパケットのようです。 f:id:grapeBiscuit:20170829114902j:plain

その後のパケットもinterrupt転送で8byteのパケットを転送しているので、これはUSB keyboardのパケットだと推定。これを読み解けばflagを取れそうです。
keyboardのデータに関しては、usb.orgがこちらで資料を公開しています。53ページからがキーボードのレイアウトで、これをもとに8byteのデータをを文字に変換するスクリプトを書きます。
f:id:grapeBiscuit:20170906095110j:plain
7月に発売されたセキュリティコンテストのためのCTF問題集にとても参考となるスクリプトが紹介されていたので、それをベースに書きました。

セキュリティコンテストのためのCTF問題集

セキュリティコンテストのためのCTF問題集

#! /usr/bin/env python
#! -*- cording: utf-8 -*-

from scapy.all import *

keymap = {  0x04: ('a','A'), 0x05: ('b','B'),0x06: ('c','C'),
            0x07: ('d','D'), 0x08: ('e','E'),0x09: ('f','F'),
            0x0a: ('g','G'), 0x0b: ('h','H'),0x0c: ('i','I'),
            0x0d: ('j','J'), 0x0e: ('k','K'),0x0f: ('l','L'),
            0x10: ('m','M'), 0x11: ('n','N'),0x12: ('o','O'),
            0x13: ('p','P'), 0x14: ('q','Q'),0x15: ('r','R'),
            0x16: ('s','S'), 0x17: ('t','T'),0x18: ('u','U'),
            0x19: ('v','V'), 0x1a: ('w','W'),0x1b: ('x','X'),
            0x1c: ('y','Y'), 0x1d: ('z','Z'),0x1e: ('1','!'),
            0x1f: ('2','@'), 0x20: ('3','#'),0x21: ('4','$'),
            0x22: ('5','%'), 0x23: ('6','^'),0x24: ('7','&'),
            0x25: ('8','*'), 0x26: ('9','('),0x27: ('0',')'),
            0x28: (' [Enter] ',' [Enter] '), 0x29: ('\x1b','\x1b'),
            0x2a: (' [del] ',' [del] '), 0x2b: ('\x09','\x09'),
            0x2c: ('\x20','\x20'), 0x2d: ('-','_'),
            0x2e: ('=','+'), 0x2f: ('[','{'),0x30: (']','}'),
            0x31: ('\\','|'), 0x33: (';',':'),0x34: ('\'','\"'),
            0x35: ('`','~'), 0x36: (',','<'),0x37: ('.','>'),
            0x38: ('/','?'),
            0x51:(' [downArrow] ',' [downArrow] '), 0x52: (' [upArrow] ',' [upArrow] '),0x32: ('\\','|')
            }

def read_usbdata_from_pcap():
    pcap = rdpcap("task.pcap")
    usb_data = []
    for pkt in pcap:
        buf = pkt['Raw'].load
        if buf[22] == '\x01':
            if len(buf[27:]) == 8:
                usb_data.append(buf[27:])
    return usb_data


def analyze_usb_data(usb_data):
    flag = ""
    for d in usb_data:
        if d[2] == '\x00' or not('\00' in d[3:8]):
            #No Event
            continue
        if d[0] == '\x02' or d[0] == '\x20':
            #press shift
            #binary -> int
            c = keymap[ord(d[2])][1]
            flag += c
        else:
            #binary -> int
            c = keymap[ord(d[2])][0]
            flag += c
    print flag

def main():
    data = read_usbdata_from_pcap()
    analyze_usb_data(data)

if __name__ == '__main__':
    main()

すると、次のキーが押されていた事がわかります。


w [Enter] k [Enter] f [Enter] b [Enter] 3' [upArrow] [ [upArrow] l [upArrow] # [upArrow] {w$ [downArrow] >b [downArrow] ag [downArrow] [e [downArrow] ci.[ [upArrow] [f [upArrow] {k [upArrow] n$ [upArrow] ju} [downArrow] : [downArrow] 3 [downArrow] u [downArrow] %= [upArrow] | [upArrow] y [upArrow] 6 [upArrow] ,‘ [downArrow] p [downArrow] b [downArrow] 7 [downArrow] %& [upArrow] d [upArrow] 0 [upArrow] j [upArrow] pt [downArrow] i [downArrow] a [downArrow] [ [downArrow] k( [upArrow] = [upArrow] r [upArrow] m [upArrow] ]= [downArrow] 0 [downArrow] d [downArrow] > [downArrow] lc [upArrow] * [upArrow] _ [upArrow] { [upArrow] j% [downArrow] u [downArrow] s [downArrow] ( [downArrow] *2 [upArrow] 0 [upArrow] n [upArrow] ’ [upArrow] ;9 [downArrow] h [downArrow] 4 [downArrow] ] [downArrow] y4 [upArrow] ‘ [upArrow] k [upArrow] ; [upArrow] +p [downArrow] f [downArrow] e [downArrow] $ [downArrow] !} [upArrow] 1 [upArrow] _ [upArrow] k [upArrow] s& [downArrow] s [downArrow] 2 [downArrow] c [downArrow] %q [upArrow] $ [upArrow] . [upArrow] ! [upArrow] #, [downArrow] s [downArrow] 0 [downArrow] c [downArrow] z3 [upArrow] e [upArrow] } [upArrow] - [upArrow] i


これをひとつづつテキストエディタ上で入力します。
特殊文字"[“や”{“を自動保管してくれる機能に注意しましょう。notepad.exeが一番いいかもしれません。
するとflagが出現します。


w{w$ju},’pt]=j%;9+ps&#,i
k#>bn$:6pijm0u{h’;fks!s-
flag{k3yb0ard_sn4ke_2.0}
b[[e[fu|7d[=>((0]’$1c$ce
3’ci.[%=%&k(lc
2y4!}%qz3


sweets

flag{k3yb0ard_sn4ke_2.0}
USBのプロトコルをかじっていれば解ける問題でした。セキュリティコンテストのためのCTF問題集がとても参考になりました。ビギナーは必携です。

grub rescueと表示されるdual bootパソコンを復旧させる方法

環境

  • Let’s note LX5
  • windows10 x64
  • Debian8 x64

原因

Windows Updateにより新しいパーティションが追加される。

手順

  1. grub rescueが表示されて困る。
    PCを起動すると、いつもはGRUBが表示されるところが下記のように表示されます。

      grub rescue>
    
  2. 状態確認 lsコマンドでパーティションがどのような状態になっているか確認。

      grub rescue> ls
      (hd0) (hd1) (hd1,gpt8) (hd1,gpt7) (hd1,gpt6) (hd1,gpt5) (hd1,gpt4) (hd1,gpt3) (hd1,gpt2) (hd1,gpt1)
    
  3. Linuxの入っているパーティションを探す。 (hd1,gpt6)にLinuxファイルシステムがあることが分かります。

      grub rescue> ls (hd1,gpt7)
      (hd1,gpt7): Filesystem is unknown
    
      grub rescue> ls (hd1,gpt6)
      (hd1,gpt6): Filesystem is ext2
    
  4. 本当にLinuxファイルシステムか確認 grub rescue> ls (hd1,gpt6)/boot/grub/

  5. GRUBのノーマルモジュールをロードし、GRUBメニューを表示させる。

     grub rescue> set prefix=(hd1,gpt6)/boot/grub
     grub rescue> root=(hd1,gpt6)
     grub rescue> insmod normal
     grub rescue> normal
    

    するといつものGRUBの画面が表示されるのでDebianで立ち上げます。

  6. GRUBの修正 ターミナルを開き、下記コマンドを叩きます。

      sudo grub-install /dev/sda/
    

以上で終了です。再起動するといつものGRUBの画面が表示されます。
こちらを参考にさせてもらいました、ありがとうございます。

SECCON CTF 2016 Binary 100

Challenge

Anti-Debugging
Reverse it.
bin (SHA1: 690c72681b1cd2bb9fe01efe0bfb71b44f7838d3)
may some AV will alert,but no problem.

私の環境ではAVに引っかからなかったです。気を利かせてくれたのか、役立たずなのか、、、

Solution

与えられたのは32bitのPEファイルです。まずは、実行してみます。
パスワードなんて知らないですけど、パスワードを入手しなくてはならないようです。

\> .\bin  
Input password >abcde  
password is wrong.

IDA demoを使います。
“Input password >"をprintfした後、strcmpをしているところがあるので、ここら辺が怪しいなぁと思い、ここにbreakpointを指定して実行します。ここのstrcmpではEAXとECXの値を比べているので、それぞれのアドレスの先を見ます。passwordには先ほどと同じ"abcde"を渡しました。
f:id:grapeBiscuit:20170708132837p:plain

EAXとECXの値は次の通りです。
f:id:grapeBiscuit:20170708133020p:plain

それぞれのstackには次のように値が入っていました。
f:id:grapeBiscuit:20170708133256p:plain

ECXのアドレス(0019FED8)には、"0x61 0x62, 0x63, 0x64, 0x65"が並んでおり、これは先ほどpasswordとして渡した “abcde"をasciiコードにしたものです。EAXのアドレス(0019FEC4)には、"0x49, 0x29, …, 0x6E,0x2E"が並んでおり、同様にasciiコード表と見比べると"I have a pen."がpasswordだと分かリます。
passwordで"I have a pen."と入力し、再度プログラムを実行します。IsDebbugerPresent関数を使って弾かれてしまいます。
f:id:grapeBiscuit:20170708172553p:plain

その先のコードを見ると、その他wiresharkvmwareでも弾かれるようです。諸々のプロセスを見た後、怪しい部分を見つけたのでここまでジャンプします。ジャンプしたい先で、(右クリック) -> (Set IP), (Jump to IP)でジャンプできました。
f:id:grapeBiscuit:20170708172852p:plain

ジャンプ後、そのまま実行すると、ポップアップでflagが出てきます。

Answer

SECCON{check_Ascii85}

Sweets

  • 今回はジャンプしても目的は達成されたのだが、ジャンプして飛ばした部分に重要な処理があった場合は、どうなるのだろうか。
  • Anti debugに関してまだリバースエンジニアリングバイブルで勉強中なので、早く読み進めなくては。

Trend Micro CTF 2017 Reversing 100 writeup

Challenge

問題文をメモし忘れてしまいました、、、
暗号化と圧縮したファイルを解凍するとpocketという名前のzipファイルが現れます。binwalkでジャカジャカ展開していきます。

# binwalk pocket  
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             Zip archive data, at least v2.0 to extract, compressed size: 39281, uncompressed size: 39271, name: biscuit  
39371         0x99CB          End of Zip archive

すると、biscuit1とbiscuit2というファイルが展開されます。

# binwalk biscuit1  
 DECIMAL       HEXADECIMAL     DESCRIPTION
 --------------------------------------------------------------------------------
 0             0x0             Microsoft executable, portable (PE)

# binwalk biscuit2 
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             Zip archive data, encrypted at least v2.0 to extract, compressed size: 69, uncompressed size: 64, name: biscuit4
107           0x6B            Zip archive data, encrypted at least v2.0 to extract, compressed size: 12778, uncompressed size: 30935, name: biscuit5
12923         0x327B          Zip archive data, encrypted at least v2.0 to extract, compressed size: 13747, uncompressed size: 14378, name: biscuit3
26870         0x68F6          End of Zip archive

biscuit2は暗号化されたzipファイルのようです。その暗号鍵がbiscuit1から得られるのでしょう。biscuit1は32bitのPEファイルなので、まずwindowsから起動してみます。

.\biscuit1.exe  
Please find sweets name starting from m for biscuit2.

はい、予想通り暗号鍵があると教えてくれました。mから始まるスイーツの名前だそうです。PEviewで見ると、"GetCommandLineA"が見つかり、何かコマンドライン引数を引っ張ってるのかなぁと予想しながら(最近、リバースエンジニアリングバイブルで勉強したので)デバッガーに食わせます。 ollydbgを使って処理を追っていくと、"macaron"という文字列が見当たります。これが暗号鍵でした。
biscuit2を解凍すると、buscuit3, buscuit4, buscuit5が展開されます。 biscuit4はテキストファイルで次のように書かれています。

# cat biscuit4 
Please create flag.

hint:

Flag = TMCTF{biscuit3_ biscuit5}

どうやら、buscuit3とbuscuit5から答えを持ってこればFlagが得られそうです。それぞれのファイルは次のようです。biscuit3は展開します。

# binwalk biscuit3 
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             JPEG image data, JFIF standard 1.01
382           0x17E           Copyright string: "Copyright (c) 1998 Hewlett-Packard Company"
14253         0x37AD          Zip archive data, at least v1.0 to extract, compressed size: 5, uncompressed size: 5, name: biscuit.txt
14356         0x3814          End of Zip archive  

# binwalk biscuit5 
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             Microsoft executable, portable (PE)

biscuit3を展開するとbiscuit.txtが出てきて、中にはcreamと書かれています。”cream”がbiscuit3の答えです。

biscuit5の方はbuiscuit2と同様に"GetCommandLineA"に注目しながら、ollydbgで解析していくと途中で"choux"という文字列が現れます。これがbiscuit5の答えです。

Answer

ようやくFlagがgetできました。TMCTF{cream_ choux}
と思いきや、ヒントが間違っていたようです。
TMCTF{choux_cream}

Trend Micro CTF 2017 SCADA 300 writeup

Challenge

Within the ICS enviroment there has been some odd behavior with one of the network switches. You have asked your Network Administrators to see if they could pull some traffic from their packet capture solution. They dug into the issue and couldn’t make sense of whats going on but think that there may be an attacker that has figured out a backdoor into the system based off an SSH connection.
Figure out how the attacker was able to exploit the system, and utilize the backdoor to SSH into the system.
To submit the flag, you’ll have to wrap the backdoor into TMCTF{}
Download the file (https://s3-ap-northeast-1.amazonaws.com/trendmicro-ctf-2017/2VjxmQSdV3uBQvReFLea/files19.enc) Decrypt the downloaded file by the following command.
> openssl enc -d -aes-256-cbc -k lnlzeirDTOWxKBdpBTsz -in files19.enc -out files19.zip
> unzip files19.zip

さすがTrend Micro。実際にあったサイバー攻撃事例を想定してCTFを作っているのでしょう。

files19.zipを解凍するとinteresting_artifacts.pcapという名前のpcapファイルが1つ与えられます。パケットをざっと眺めると、前半にHTTP、後半にSSHのやり取りがされていることが分かります。後半部分のSSHは問題文にあるbackdoorに関連するのだろうということで、HTTPに注目して進めます。
すると、exproit.tar.gzというかなり怪しいファイルをPOSTしているリクエストが見つかるので、wiresharkのExport Objects機能でSaveします。おそらくファームウェアのアップロードでしょうか。残念ながら、tar.gzフォーマットでは出力してくれませんので、exploit.tar.gzの部分だけ取り出します。hexdumbで出力してくれたファイルを見ます。 f:id:grapeBiscuit:20170626141019p:plain

gzipファイルのマジックナンバー1F 8Bなので、0x98byte目からがexploit.tar.gzの始まりだと分かります。binwalkを使っても分かります。binwalkとtarコマンドで展開していきましょう。f:id:grapeBiscuit:20170626141858p:plain

展開すると、etc,usr,varディレクトリが出てきます。etcの下にはpasswdファイルも含まれており、そのリストの中にはパスワードハッシュ付きでTMCTFユーザがリストされています。このハッシュをJohn the Ripperで解析しましょう。パスワードリストにはrockyou.txtを使いました(ヒントをもらっていた)。 f:id:grapeBiscuit:20170626170924p:plain

パスワードが割れたので、早速フラグを送って見ます。TMCTF{odagirih}
…違うようです。調べると、Unixのパスワードは8文字までのようです。もしかしたら辞書ファイルにはもっと長い文字列が書き込まれていたのかもしれません。 f:id:grapeBiscuit:20170626171238p:plain

やはりそうでした。

Answer

TMCTF{odagirihayato}

しかし、オダギリハヤトって誰なんでしょうか…