又一篇writeup讀後感。。什麼時候能寫自己的writeup。。
misc
minbashmaxfun
Minimal bash - maximal fun!
nc 35.198.107.77 1337
Difficulty: medium
nc之後出現長這樣的bash提示:min-bash>:
,輸入一些東西出現:
+=============================================================+
| MINIMAL BASH - MAXIMAL FUN |
| |
| Who needs regular characters anyway? |
| |
| Supported characters: $ ( ) # ! { } < \ ' , |
| |
| Supported binaries: i'm sure there is some |
| |
| Iz also open-source: 'source' |
| |
+=============================================================+
輸入source,出現:
.---.
Source iz sumthing like dis: / . \
|\_/| |
| | /|
.----------------------------------------------------------------------' |
/ .-. |
| / \ |
| |\_. | [....] |
|\| | /| |
| `---' | /* these 11 chars should be more than enough */ |
| | re = regcomp(®ex, "[^${}!#()<'\\,]", 0); |
| | |
| | [....] |
| | |
| | if (REG_NOMATCH == regexec(®ex, input, 0, NULL, 0)) { |
| | |
| | [....] |
| | |
| | fclose(stdin); |
| | execl("/bin/bash", "/bin/bash", "-c", input, NULL); |
| | |
| | [....] |
| | } |
| | |
| | [....] |
| | /
| |-----------------------------------------------------------------'
\ |
\ /
`---'
所以意思就是,讓我們只用 $ ( ) # ! { } < \ ‘這些字符構造bash語句,然後獲得flag。那,首先必須瞭解這些符號的用法,通過查找,找到一些比較有用的:
- #:除了註釋用,在單/雙引號包圍時,#作爲#號字符本身
- ${}:參數替換(Variable substitution),用於在字符串中表示變量
- $’…’:引用內容展開,執行單引號內的轉義內容(單引號原本是原樣引用的),這種方式會將引號內的一個或者多個[]轉義後的八進制,十六進制值展開到ASCII或Unicode字符。
- $#:表示傳遞給腳本的參數數量。
- $$:進程ID變量,這個變量保存了運行當前腳本的進程ID值。
- ():命令組(Command group)。由一組圓括號括起來的命令是命令組,命令組中的命令實在子shell(subshell)中執行。因爲是在子shell內運行,因此在括號外面是沒有辦法獲取括號內變量的值,但反過來,命令組內是可以獲取到外面的值,這點有點像局部變量和全局變量的關係,在實作中,如果碰到要cd到子目錄操作,並在操作完成後要返回到當前目錄的時候,可以考慮使用subshell來處理;
- (()):表示整數擴展(integer expansion)。不會返回值。執行後如果變量值發生變化,都會影響到後繼代碼的運行。可對變量賦值,可以對變量進行一目操作符操作,也可以是二目,三目操作符。
- cmd < file :使cmd命令從file讀入
- cmd << text :從命令行讀取輸入,直到一個與text相同的行結束。除非使用引號把輸入括起來,此模式將對輸入內容進行shell變量替換。如果使用<<- ,則會忽略接下來輸入行首的tab,結束行也可以是一堆tab再加上一個與text相同的內容,可以參考後面的例子。
- cmd <<< word :把word(而不是文件word)和後面的換行作爲輸入提供給cmd。
參考:http://blog.useasp.net/archive/2014/06/02/summary-of-the-special-characters-in-shell-on-linux.aspx
嘗試一下,此處強調要加建立<<<管道,將我們的命令輸入給另一個實例,比如$0
${!#}<<<${##}$#${##}\'
也就是
$0<<<$'\101'
101是A的ASCII碼值,所以其實是嘗試執行命令“A”,果然成功:
bash: A: command not found
那麼下一步就是構造命令並嘗試了。
目前爲止可以用${##}構造1,一個#g構造0了,但是這些數字顯然不能構造所有數字,進而通過ASCII碼轉化得到所有字母,所以下一步考慮構造二進制,如$'\154'
:
${!#}<<<$((2#${##}$#$#${##}${##}$#${##}$#))
其中2#表示二進制,再替換掉2:
${!#}<<<$(($((${##}<<${##}))#${##}$#$#${##}${##}$#${##}$#))
成功!所以這下就可以任意構造語句了,用腳本文件嘗試拿flag:
./convert.py 'ls -la' | nc 35.198.107.77 1337
結果出來一個問題讓回答:
Please solve this little captcha:
530892629 + 3254451000 + 4211578791 + 2425633949 + 368428465
10790984834 != 0 :(
再次使用管道:
bash -c 'expr $(grep + /tmp/out)' | /get_flag > /tmp/out; cat /tmp/out
得到flag。這個真是要熟悉shell啊,簡直了。這個write up的參考,包括convert.py詳細代碼請移步https://medium.com/@orik_/34c3-ctf-minbashmaxfun-writeup-4470b596df60。