Simple PWN 0x31(2023 HW - Notepad - Stage - 1)
Description & Hint
nc 10.113.184.121 10044
You should solve the PoW to invoke a new instance. You can use the pow_solver.py script in the released zip to solve the PoW. After you solve the PoW, the service will create a new container and show >you the port. Connect it to play this challenge! The container will be destroy at 5 minutes. So you should debug your exploit in your environment.
Image Base: ubuntu:22.04 (e4c58958181a)
Try to get /flag_user.
File: Notepad-release_fa266ab516200ef4.zip
Hint: Path Traversal
Source code
:::spoiler Source Code
1 |
|
:::
Recon
這一題是等到助教給出hint才之到大概的方向,我一開始也是有一些初步的方向,不過不知道怎麼把卡住的地方解決,最後也是求助@davidchen學長才知道確切的方法。
-
首先,感謝@csotaku 的提示與切入方向,既然知道是path traversal的洞,那就代表某個地方我們可以輸入一些簡單的payload,例如
./
,而這個地方還必須和讀檔有關係,想到這邊我們的選擇也呼之欲出,洞就在==openfile==的地方,我們輸入的notename會和res.res
以及.txt
concatenate在一起,,不過這邊有個問題是既然我們要順利讀檔,在說明中就有提到檔案名稱是==flag_user==,而不是flag_user.txt,這樣的話我們就應該要想辦法把.txt
bypass掉想到這邊我先說我的看法,如果要把
.txt
bypass掉,一開始是參考飛飛的網站範例中有針對URL based的path traversal類似的情況在payload的最後面加上null byte,所以我想可以用同樣的方式bypass(\x00
),但是怎樣的沒有成功,另外我還有一個疑問,res.res的部分到底是不是一個path,如果不是,就代表我們也需要把它蓋掉或是用其他方法leak出來之類的;當然如果是path的話就沒差了,但我很常陷入這種沒有必要的迴圈轉不出來,其實現在仔細想想,他一定是一個path,因為他最後也是要和{notename}.txt
接在一起,如果他不是path就一定讀不到 -
反正後來和@davidchen討論完才大致知道如何寫script,簡單來說,因為path的限制長度是128 bytes,所以
res.res
+ {notename} +.txt
基本上長度不會超過128 bytes,如果會的話就會被擠出去,所以我們能夠控制的部分就是notename,雖然我們不知道res.res
的長度多少,但我們可以爆破,讓這三者串在一起會大於128 bytes並且沒有被寫入path的部分就是.txt
,這樣的話就可以順利讀到flag的內容,具體怎麼做就是一直加上/
Exploit - Path Traversal
因為這一題需要進行pow,才能順利開一個vm給我們,並且把port number讓我們連過去
==PoW.py==
這是助教寫的script
1 |
|
==pow.py==
這是我寫的pow,就是簡單的subprocess的執行助教給的script,然後傳送和接收一些IO
1 |
|
==exp.py==
1 |
|
所以實際執行會是:
1 |
|
Flag: flag{Sh3l1cod3_but_y0u_c@nnot_get_she!!}