2016年02月

Internetwache CTF 2016 writeup It's Prime Time!

It's Prime Time!

(code60, solved by 352)

Description: We all know that prime numbers are quite important in cryptography. Can you help me to find some?

Service: 188.166.133.53:11059

指定されたIPアドレス:ポートに接続すると、表示された数の次の素数を答える問題が次々と出題されます。Rubyプログラムに自動的に解かせます。

require "socket"
require "prime"

begin
  sock = TCPSocket.open("188.166.133.53", 11059)
rescue
  puts "TCPSocket.open failed : #$!\n"
else
    while sock.gets
      ary = ""
      buf = $_
      printf( buf )
      if buf.include?(".:") then
        ary = buf.split(" ")
        ary[8].delete!(":")
        ans = Prime.each.find {|e| e > ary[8].to_i}
        printf( ans.to_s )
        sock.write(ans.to_s + "\n")
        STDOUT.flush
      else
      end
    end
  sock.close
end

実行すると、次のとおり100問正解でフラグが表示されました。

Hi, you know that prime numbers are important, don't you? Help me calculating the next prime!
Level 1.: Find the next prime number after 7:
11

Yay, that's right!
(略)

Level 100.: Find the next prime number after 400:
401

Yay, that's right!
IW{Pr1m3s_4r3_!mp0rt4nt}

フラグは、

IW{Pr1m3s_4r3_!mp0rt4nt}

です。




Internetwache CTF 2016 writeup A numbers game

A numbers game

(code50, solved by 370)

Description: People either love or hate math. Do you love it? Prove it! You just need to solve a bunch of equations without a mistake.

Service: 188.166.133.53:11027

指定されたIPアドレス:ポートに接続すると、1次方程式の問題が次々に出題されますので、Rubyプログラムで自動的に解かせます。

require "socket"

begin
  sock = TCPSocket.open("188.166.133.53", 11027)
rescue
  puts "TCPSocket.open failed : #$!\n"
else
    while sock.gets
      ary = ""
      buf = $_
      printf( buf )
      if buf.include?(".:") then
        ary = buf.split(" ")
        case ary[3]
        when "*" then
          ans = ary[6].to_i / ary[4].to_i
          printf( ans.to_s )
          sock.write(ans.to_s + "\n")
        when "/" then
          ans = ary[6].to_i * ary[4].to_i
          printf( ans.to_s )
          sock.write(ans.to_s + "\n")
        when "+" then
          ans = ary[6].to_i - ary[4].to_i
          printf( ans.to_s )
          sock.write(ans.to_s + "\n")
        when "-" then
          ans = ary[6].to_i + ary[4].to_i
          printf( ans.to_s )
          sock.write(ans.to_s + "\n")
        end
        STDOUT.flush
      else
      end
    end
  sock.close
end

実行すると、次のとおり100問正解でフラグが表示されました。

Hi, I heard that you're good in math. Prove it!
Level 1.: x * 9 = 81
9

Yay, that's right!
(略)

Level 100.: x * 48 = 41232
859

Yay, that's right!
IW{M4TH_1S_34SY}

フラグは、

IW{M4TH_1S_34SY}

です。




Internetwache CTF 2016 writeup SPIM

SPIM

(rev50, solved by 204)

Description: My friend keeps telling me, that real hackers speak assembly fluently. Are you a real hacker? Decode this string: "IVyN5U3X)ZUMYCs"

Attachment: rev50.zip

解凍すると、MIPSのアセンブリプログラムができます。以下のサイトを参考にプログラムの動作を確認します。

http://www.swlab.cs.okayama-u.ac.jp/~nom/lect/p3/concise-mips-instruction-set.html

User Text Segment [00400000]..[00440000]
[00400000] 8fa40000  lw $4, 0($29)              ; 183: lw $a0 0($sp) # argc
[00400004] 27a50004  addiu $5, $29, 4        ; 184: addiu $a1 $sp 4 # argv
[00400008] 24a60004  addiu $6, $5, 4          ; 185: addiu $a2 $a1 4 # envp
[0040000c] 00041080  sll $2, $4, 2                ; 186: sll $v0 $a0 2
[00400010] 00c23021  addu $6, $6, $2         ; 187: addu $a2 $a2 $v0
[00400014] 0c100009  jal 0x00400024 [main]; 188: jal main
[00400018] 00000000  nop                            ; 189: nop
[0040001c] 3402000a  ori $2, $0, 10             ; 191: li $v0 10          //$v0 = 10
[00400020] 0000000c  syscall                       ; 192: syscall # syscall 10 (exit)
[00400024] 3c081001  lui $8, 4097 [flag]       ; 7: la $t0, flag           //$t0 = flag
[00400028] 00004821  addu $9, $0, $0         ; 8: move $t1, $0       //$t1 = $0
[0040002c] 3401000f  ori $1, $0, 15               ; 11: sgt $t2, $t1, 15 //if($t1>15) $t2=1 else $t2=0
[00400030] 0029502a  slt $10, $1, $9       
[00400034] 34010001  ori $1, $0, 1               ; 12: beq $t2, 1, exit     //if($t2==1) exit
[00400038] 102a0007  beq $1, $10, 28 [exit-0x00400038]
[0040003c] 01095020  add $10, $8, $9         ; 14: add $t2, $t0, $t1 //$t2 = $t0 + $t1
[00400040] 81440000  lb $4, 0($10)              ; 15: lb $a0, ($t2)        //$a0 = *(char)$t2
[00400044] 00892026  xor $4, $4, $9            ; 16: xor $a0, $a0, $t1 //$a0 = $a0 ^ $t1
[00400048] a1440000  sb $4, 0($10)             ; 17: sb $a0, 0($t2)     //
[0040004c] 21290001  addi $9, $9, 1            ; 19: add $t1, $t1, 1     //$t1 = $t1 + 1
[00400050] 0810000b  j 0x0040002c [for]      ; 20: j for             //
[00400054] 00082021  addu $4, $0, $8          ; 24: move $a0, $t0    //$a = $t0
[00400058] 0c100019  jal 0x00400064 [printstring]; 25: jal printstring
[0040005c] 3402000a  ori $2, $0, 10              ; 26: li $v0, 10         //$v0 = 10
[00400060] 0000000c  syscall                        ; 27: syscall             //exit
[00400064] 34020004  ori $2, $0, 4            ; 30: li $v0, 4         //$v0 = 4
[00400068] 0000000c  syscall                ; 31: syscall             //print string
[0040006c] 03e00008  jr $31                    ; 32: jr $ra             //呼び出し元へ復帰
$t1がループカウンタで、0で初期化、1ずつ加算され、15回ループします。その中でflag文字列に対して、頭から1文字ずつ$t1とXORをしています。その結果が問題で与えられた文字列になります。従って、その文字列をもう一度同じようにXORすることで、元のflag文字列を得ることができます。

$a0 2進表記 $t1 2進表記 XOR flag
I 01001001 0 00000000 1001001 I
V 01010110 1 00000001 1010111 W
y 01111001 2 00000010 1111011 {
N 01001110 3 00000011 1001101 M
5 00110101 4 00000100 110001 1
U 01010101 5 00000101 1010000 P
3 00110011 6 00000110 110101 5
X 01011000 7 00000111 1011111 _
) 00101001 8 00001000 100001 !
Z 01011010 9 00001001 1010011 S
U 01010101 10 00001010 1011111 _
M 01001101 11 00001011 1000110 F
Y 01011001 12 00001100 1010101 U
C 01000011 13 00001101 1001110 N
s 01110011 14 00001110 1111101 }

フラグは、
IW{M1P5_!S_FUN}
です。



Internetwache CTF 2016 writeup The Secret Store

The Secret Store

(web70, solved by 199)

Description: We all love secrets. Without them, our lives would be dull. A student wrote a secure secret store, however he was babbling about problems with the database. Maybe I shouldn't use the 'admin' account. Hint1: Account deletion is intentional. Hint2: I can't handle long usernames.

Service: https://the-secret-store.ctf.internetwache.org/

ヒント2に書かれているとおり、長いユーザ名をうまく扱えないということです。

何度か試してみたところユーザ名は32文字まで有効のようです。したがって、adminの後ろに32文字目までスペースをつけて33文字目以降に適当な文字をつけてユーザ登録することで、ユーザ名の重複チェックを回避し、既存のadminユーザのパスワードを登録したものでリセットできるのではないかと思われます。

下図のとおり、ユーザ名「admin                           1」、パスワード「1」で登録します。


no title

次にログイン画面で、admin/1でログインします。


1

見事、ログインでき、フラグが表示されました。


2


フラグは、

IW{TRUNCATION_IS_MY_FRIEND}

です。




Internetwache CTF 2016 writeup Replace with Grace

Replace with Grace

(web60, solved by 189)

Description: Regular expressions are pretty useful. Especially when you need to search and replace complex terms.

Service: https://replace-with-grace.ctf.internetwache.org/

URLにアクセスすると、文字列の置換ができるフォームが表示されます。下図のとおり、javascriptソースから、「Do the work!」ボタンをクリック時にajaxでphpを呼び出していることが分かります。


3


従って、文字列の置換にPHPのpreg_replace関数が使われていると思われます。PHPのpreg_replace関数は、第一引数にeオプションを指定すると、第二引数をPHPコードとして評価します。

http://blog.tokumaru.org/2013/05/phpMyAdmin3.5.8-script-injection-CVE-2013-3238.html


試しに下図のように、eオプションを指定するとphpinfo();の結果が表示されました。


no title


バッククォートで囲んでシェルコマンド`ls -al`を実行します。flag.phpが見つかりました。


1

下図のように、catコマンドでflag.phpの内容を表示すると、フラグが表示されました。

2


フラグは、

IW{R3Pl4c3_N0t_S4F3}

です。





Internetwache CTF 2016 writeup BarParty

BarParty

(misc90, solved by 112)

Description: Can you read the barcodes?

Attachment: misc90.zip

ファイルを解凍すると、下図の画像ができます。


barcodes

面倒ですが、印刷してバーコード部分を切り抜いて組み合わせます。バー(白い部分、黒い部分)は1~4の太さがあります。組み合わせたバーコードを目で読み取りながら、下図のようにExcelに打ち込んでいきます。


no title

出来上がったバーコードをバーコードリーダーアプリで読ませると、上から順に次の文字列を得ることができます。

_B4r_
C0d3s}
IW{Bar

従って、フラグは、

IW{Bar_B4r_C0d3s}

です。






Internetwache CTF 2016 writeup 404 Flag not found

404 Flag not found

(misc80, solved by 153)

Description: I tried to download the flag, but somehow received only 404 errors :(

Attachment: misc80.zip

ファイルを解凍すると、Wireshark capture file (.pcapng)ができます。Wiresharkでパケットを確認すると、HTTPリクエストでflag.txtをGETしているパケットが下記のとおりいくつか見つかります。

http://496e2074686520656e642c206974277320616c6c2061626f757420666c61.2015.ctf.internetwache.org/flag.txt
http://67732e0a5768657468657220796f752077696e206f72206c6f736520646f.2015.ctf.internetwache.org/flag.txt
http://65736e2774206d61747465722e0a7b4f66632c2077696e6e696e67206973.2015.ctf.internetwache.org/flag.txt
http://20636f6f6c65720a44696420796f752066696e64206f7468657220666c61.2015.ctf.internetwache.org/flag.txt
http://67733f0a4e6f626f62792066696e6473206f7468657220666c616773210a.2015.ctf.internetwache.org/flag.txt
http://53757065726d616e206973206d79206865726f2e0a5f4845524f2121215f.2015.ctf.internetwache.org/flag.txt
http://0a48656c70206d65206d7920667269656e642c2049276d206c6f73742069.2015.ctf.internetwache.org/flag.txt
http://6e206d79206f776e206d696e642e0a416c776179732c20616c776179732c.2015.ctf.internetwache.org/flag.txt
http://20666f72206576657220616c6f6e652e0a437279696e6720756e74696c20.2015.ctf.internetwache.org/flag.txt
http://49276d206479696e672e0a4b696e6773206e65766572206469652e0a536f.2015.ctf.internetwache.org/flag.txt
http://20646f20492e0a7d210a.2015.ctf.internetwache.org/flag.txt

これらのURLにアクセスしても、全て404エラーとなります。URLのホスト名の部分を見てみると、ASCIIコードになっているように見えますので、文字に変換するRubyプログラムを書きます。

a = [
"496e2074686520656e642c206974277320616c6c2061626f757420666c61",
"67732e0a5768657468657220796f752077696e206f72206c6f736520646f",
"65736e2774206d61747465722e0a7b4f66632c2077696e6e696e67206973",
"20636f6f6c65720a44696420796f752066696e64206f7468657220666c61",
"67733f0a4e6f626f62792066696e6473206f7468657220666c616773210a",
"53757065726d616e206973206d79206865726f2e0a5f4845524f2121215f",
"0a48656c70206d65206d7920667269656e642c2049276d206c6f73742069",
"6e206d79206f776e206d696e642e0a416c776179732c20616c776179732c",
"20666f72206576657220616c6f6e652e0a437279696e6720756e74696c20",
"49276d206479696e672e0a4b696e6773206e65766572206469652e0a536f",
"20646f20492e0a7d210a"
]
class String
  def hex2bin
    s = self
    raise "Not a valid hex string" unless(s =~ /^[\da-fA-F]+$/)
    s = '0' + s if((s.length & 1) != 0)
    s.scan(/../).map{ |b| b.to_i(16) }.pack('C*')
  end
  def bin2hex
    self.unpack('C*').map{ |b| "%02X" % b }.join('')
  end
end


for s in a do
  p s.hex2bin
end

実行して得られた文字列の改行などを調整すると、下記のようになります。

In the end, it's all about flags.
Whether you win or lose doesn't matter.
{Ofc, winning is cooler
Did you find other flags?
Noboby finds other flags!
Superman is my hero.
_HERO!!!_
Help me my friend, I'm lost in my own mind.
Always, always, for ever alone.
Crying until I'm dying.
Kings never die.
So do I.
}!

各行の先頭文字を縦読みするとフラグを得ることができます。


フラグは、

IW{DNS_HACKS}

です。




Internetwache CTF 2016 writeup Rock with the wired shark!

Rock with the wired shark!

(misc70, solved by 293)

Description: Sniffing traffic is fun. I saw a wired shark. Isn't that strange?

Attachment: misc70.zip

ファイルを解凍すると、Wireshark capture file (.pcapng)を得ることができます。Wiresharkで開いて、ざーっとパケットを眺めてみると、HTTPのRequest/Responseが目に付きますので、「ファイル」→「オブジェクトをエキスポート」→「HTTP...」を選択します。下図のとおり、flag.zipが見つかりますので、「save」します。


no title

flag.zipにはパスワードが掛かっています。下図のHTTPリクエストパケットでBASIC認証していますので、認証情報をBASE64でデコードします。


1


Basic ZmxhZzphenVsY3JlbWE=
azulcrema

デコードして得られた文字列でflag.zipを解凍できます。解凍するとflag.txtができ、中身にフラグが記載されています。

フラグは、

IW{HTTP_BASIC_AUTH_IS_EASY}

です。




Internetwache CTF 2016 writeup Quick Run

Quick Run

(misc60, solved by 113)

Description: Someone sent me a file with white and black rectangles. I don't know how to read it. Can you help me?

Attachment: misc60.zip

ファイルを解凍すると、テキストファイルを得ることができます。中身を確認すると、英数字の羅列と途中に==が出てくるので、BASE64でエンコードされていることが分かります。1行76文字で構成されていて、途中76文字に満たない行がありますので、そこまでを1つの塊としてBASE64でデコードすると、下図のように、UTF8で半角スペース(黒い部分)とブロック(白い部分)のテキストで表現されたQRコードを得ることができます。


no title


同様にしてBASE64の塊が全部で24個ありますので、全てデコードして1つずつQRコードリーダーで読ませると、1つのQRコードが1文字を表しています(上図は「F」)。全ての文字をつなげると、次の文字列を得ることができます。

Flagis:IW{QR_C0DES_RUL3}

従って、フラグは、

IW{QR_C0DES_RUL3}

です。






Internetwache CTF 2016 writeup The hidden message

The hidden message

(misc50, solved by 162)

Description: My friend really can't remember passwords. So he uses some kind of obfuscation. Can you restore the plaintext?

Attachment: misc50.zip

ファイルを解凍すると、0~7の数字からなる数値が並んだテキストファイルができます。8進ダンプのようですので、1つ1つの数値を読み取ってバイナリで保存するRubyプログラムを書きます。
fw = File.open("aaa.txt", "wb")
File.open("README.txt", "r") do |f|
  f.each_line do |line|
    a = line.split(" ")
    a.delete_at(0)
    a.map!{|s| s.to_i(8)}
    p a.pack("c*")
    fw.write(a.pack("c*"))
  end
end
fw.close
実行してできたファイルを開くと、下記の文字列を得ることができます。
V2VsbCBkb25lIQoKRmxhZzogSVd7TjBfMG5lX2Nhbl9zdDBwX3kwdX0K
これをBASE64でデコードすると次の文字列を得ることができます。
Well done!

Flag: IW{N0_0ne_can_st0p_y0u}
フラグは、
IW{N0_0ne_can_st0p_y0u}
です。



記事検索
ギャラリー
  • TetCTF 2023 NewYearBot
  • UUT CTF writeup Find The Password
  • UUT CTF writeup The Puzzle
  • Hack Zone Tunisia 2019 writeup Microscope
  • Hack Zone Tunisia 2019 writeup Welcome
  • SwampCTF 2019 writeup Brokerboard
  • SwampCTF 2019 writeup Leap of Faith
  • SwampCTF 2019 writeup Last Transmission
  • CBM CTF 2019 writeup Long road
カテゴリー