CSAW-2012 Exploitation 200 Writeup

はじめに

Pwnの練習ということでこちらのサイトに関連する問題をちびちびやっていこうと思います. ただ,ksnctfの問題もあるのですべてをWriteupとして公開はしません. また,シェルの起動が一つのゴールであるとは思いますが,何が答えなのかいまいちわかっていません.

ctf.katsudon.org

問題リンク

shell-storm.org


解析など

ファイルの確認

$ file exploitation1-release 
exploitation1-release: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-, for GNU/Linux 2.6.24, BuildID[sha1]=3884e99413d7610af414a6c12ce9ee0ed4933553, with debug_info, not stripped
  • 32bitのELF
  • 動的リンク

セキュリティ機構の確認

$ checksec.sh --file exploitation1-release 
RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH      FILE
Partial RELRO   No canary found   NX enabled    Not an ELF file   No RPATH   No RUNPATH   exploitation1-release
  • STACK CANARYNo canary foundとなっているため,BOFが狙えそうです.

シンボル情報の確認

$ readelf -r exploitation1-release

再配置セクション '.rel.dyn' at offset 0x550 contains 1 entry:
 オフセット 情報    型              シンボル値 シンボル名
0804aff0  00000c06 R_386_GLOB_DAT    00000000   __gmon_start__

再配置セクション '.rel.plt' at offset 0x558 contains 28 entries:
 オフセット 情報    型              シンボル値 シンボル名
0804b000  00000107 R_386_JUMP_SLOT   00000000   setsockopt@GLIBC_2.0
0804b004  00000207 R_386_JUMP_SLOT   00000000   strcmp@GLIBC_2.0
0804b008  00000307 R_386_JUMP_SLOT   00000000   printf@GLIBC_2.0
0804b00c  00000407 R_386_JUMP_SLOT   00000000   __isoc99_fscanf@GLIBC_2.7
0804b010  00000507 R_386_JUMP_SLOT   00000000   inet_ntoa@GLIBC_2.0
0804b014  00000607 R_386_JUMP_SLOT   00000000   getuid@GLIBC_2.0
0804b018  00000707 R_386_JUMP_SLOT   00000000   htons@GLIBC_2.0
0804b01c  00000807 R_386_JUMP_SLOT   00000000   perror@GLIBC_2.0
0804b020  00000907 R_386_JUMP_SLOT   00000000   accept@GLIBC_2.0
0804b024  00000a07 R_386_JUMP_SLOT   00000000   waitpid@GLIBC_2.0
0804b028  00000b07 R_386_JUMP_SLOT   00000000   setgid@GLIBC_2.0
0804b02c  00000c07 R_386_JUMP_SLOT   00000000   __gmon_start__
0804b030  00000d07 R_386_JUMP_SLOT   00000000   exit@GLIBC_2.0
0804b034  00000e07 R_386_JUMP_SLOT   00000000   __libc_start_main@GLIBC_2.0
0804b038  00000f07 R_386_JUMP_SLOT   00000000   bind@GLIBC_2.0
0804b03c  00001007 R_386_JUMP_SLOT   00000000   getgid@GLIBC_2.0
0804b040  00001107 R_386_JUMP_SLOT   00000000   fopen@GLIBC_2.1
0804b044  00001207 R_386_JUMP_SLOT   00000000   fork@GLIBC_2.0
0804b048  00001307 R_386_JUMP_SLOT   00000000   sigemptyset@GLIBC_2.0
0804b04c  00001407 R_386_JUMP_SLOT   00000000   freeaddrinfo@GLIBC_2.0
0804b050  00001507 R_386_JUMP_SLOT   00000000   listen@GLIBC_2.0
0804b054  00001607 R_386_JUMP_SLOT   00000000   setuid@GLIBC_2.0
0804b058  00001707 R_386_JUMP_SLOT   00000000   socket@GLIBC_2.0
0804b05c  00001807 R_386_JUMP_SLOT   00000000   getaddrinfo@GLIBC_2.0
0804b060  00001907 R_386_JUMP_SLOT   00000000   sigaction@GLIBC_2.0
0804b064  00001a07 R_386_JUMP_SLOT   00000000   recv@GLIBC_2.0
0804b068  00001b07 R_386_JUMP_SLOT   00000000   close@GLIBC_2.0
0804b06c  00001c07 R_386_JUMP_SLOT   00000000   send@GLIBC_2.0
  • listenacceptが見えるのでfork-server型の問題であると予想.

実行してみる

$ chmod +x exploitation1-release
$ ./exploitation1-release 
  • へんじがない。fork-server型問題のようだ。

新しいタブを開き,確認してみます.

$ netstat -antp
...
Proto 受信-Q 送信-Q 内部アドレス            外部アドレス            状態       PID/Program name    
tcp        0      0 0.0.0.0:54321           0.0.0.0:*               LISTEN      2883/./exploitation 
...
  • ローカルの54321ポートでプロセスが待ち受けています.

繋いでみる

$ nc localhost 54321
Wecome to my first CS project.
Please type your name: 
  • プログラムの動作を確認できました.


脆弱性さがし

アセンブルしてみる

f:id:m412u:20190430091844p:plain

200pt問題なので,keyの内容を読み出せばよいのかな? 脆弱性とかではなさそう.strcmp()で入力した値とAAAAAAAAAAAAAAAAAAAAAAAAAA\nを比較しています. 比較結果が正しくない場合,keyは読み出せない模様.

$ nc localhost 54321
Wecome to my first CS project.
Please type your name:  Maru

このページのkeyをお借りしてkeyファイルを作成します.

$ echo "b3ee1f0fff06f0945d7bb018a8e85127" > key

その後,AAAA...\nを入力してみます.

$ nc localhost 54321
Wecome to my first CS project.
Please type your name:  AAAAAAAAAAAAAAAAAAAAAAAAAA
b3ee1f0fff06f0945d7bb018a8e85127

ファイルの読み出し成功!

おわりに

keyの中身を読みだせたので200ptは獲得できたと予想. おそらく,300pt・400ptと進んで行くと脆弱性をついてシェルを起動させると思います. うん!きっとそう!...


たぶん...