
不曾想過的的命令執行技巧
你可以在美麗的Unix世界中用shell執行你喜歡的任何命令,但是有時一個命令可以被用來執行另一個命令,這就是你不曾想過的命令執行技巧
舉例來說,下面是用tar命令簡介執行任意命令的方式:
但是再稍微研究一下,看上去有一大堆方法能用流行的unix命令做到這一點,規則很簡單:
不可以從shell中運行命令
利用另一個命令的“副作用”
最終達到命令被執行
我用了一個小腳本,叫做runme.sh:
1 2 3 4 5 |
mitsurugi@mitsu:~/tmp$ cat runme.sh #! /bin/bash echo "The name's 0xMitsurugi!" echo "Remember it!" mitsurugi@mitsu:~/tmp$ |
如果腳本運行時顯示這段話了,你就贏了,來繼續測試吧:
1/ tcpdump
1 2 3 4 5 6 7 8 9 |
$ tcpdump -n -i lo -G1 -w /dev/null -z ./runme.sh tcpdump: listening on lo, link-type EN10MB (Ethernet), capture size 65535 bytes The name's 0xMitsurugi! Remember it! The name's 0xMitsurugi! Remember it! ^C6 packets captured 12 packets received by filter 0 packets dropped by kernel$ |
因為每一個數據包(-G),我們用指定的程序(-z)處理輸出的文件(-w)
(附譯者測試截圖:)
2/ tar
1 2 3 4 5 |
$ tar c a.tar -I ./runme.sh a tar: a.tar: Cannot stat: No such file or directory The name's 0xMitsurugi! Remember it! tar: Exiting with failure status due to previous errors$ |
因為你可以在命令行指定任意壓縮程序給tar(-I)并且我們并不在乎它報錯與否
(附譯者測試截圖:)
3/ zip
1 2 3 4 5 |
$ zip z.zip a -T -TT ./runme.sh The name's 0xMitsurugi! Remember it! test of z.zip OK $ |
zip有自動測試zip文件的友好功能(-T),并且用另一個程序測試解壓縮(-TT)
譯者注:這里的a必須是存在的文件,否則報錯會不運行
(附譯者測試截圖:)
4/ ftp (and many others…)
很多程序可以將你的命令返回給shell執行,這里我演示ftp是因為它在老版本Unix上很通用
1 2 3 4 5 |
$ ftp ftp> ! ./runme.sh The name's 0xMitsurugi! Remember it! ftp> |
還有vi、gdb之類等等,你甚至可以用~^Z來退出ssh的session
(附譯者測試截圖:)
5/ man
這個就是玩一玩而已,但是你必須給出程序的完整路徑。用-P選項指定默認的分頁程序。
1 2 3 4 |
$ man -P /tmp/runme.sh man The name's 0xMitsurugi! Remember it! $ |
(附譯者測試截圖:)
6/ git (and man, and…)
如果你可以操縱環境變量,那么就有很多好玩的事情了:
1 2 3 4 5 |
$ export PAGER=./runme.sh $ git -p help The name's 0xMitsurugi! Remember it! $ |
(附譯者測試截圖:)
沒錯,“man”命令也可以這樣利用,并且肯定許多其他的程序只要定義了PAGER環境變量也一定可以。
但是別急,git能做的還有好多,如果你可以寫入任何$PATH中的目錄中,你可以做到:
(譯者注:在git 1.9.1 中文版上未測試成功,不明覺厲,不明源作者所用版本)
1 2 3 4 5 6 |
$ export PATH=/tmp:$PATH $ ln -sf /tmp/runme.sh /tmp/git-help $ git --exec-path=/tmp help The name's 0xmitsurugi remember it! $ |
盡管我不知道這該怎么玩,但我確信別人會找到用途 :) 由于不明原因,要想運行必須要有–exec-path在$PATH中才行
7/ 最想不到的:bash $HOME 變量
恩,是的,有辦法弄二級的shell:
(譯者注:原文命令如下,但是原作者忘了一條: ln -sf /root/runme.sh /root/.bashrc)
1 2 3 4 5 6 7 8 9 |
$ pwd /tmp $ ls -la .bashrc lrwxrwxrwx 1 mitsurugi mitsurugi 8 juin 19 14:03 .bashrc -> runme.sh $ export HOME=. $ bash The name's 0xMitsurugi! Remember it! $ |
(附譯者測試截圖:)
在我嘗試之前我本以為這是100%會失敗的事情。
8/ awk (and many others)
當你有一個“system”命令時,一切都變的太簡單了:
1 2 3 4 |
$ awk 'BEGIN {system("./runme.sh")}' The name's 0xMitsurugi! Remember it! $ |
(附譯者測試截圖:)
【via 翻譯@Wooyun-lxj616】
原著作者:http://0x90909090.blogspot.hk/2015/07/no-one-expect-command-execution.html
沒怎么看懂。。