Bash
在我的貓的幫助下更改文件的權限
root@system:~# less myfile -bash: /bin/less: Input/output error
根文件系統已死。但是我的貓還活著(在我的記憶中):
root@system:~# cat > /tmp/somefile C^d root@system:~#
不過他有點寂寞,他所有的朋友都走了:
root@system:~# mount -bash: /bin/mount: Input/output error root@system:~# dmesg -bash: /bin/dmesg: Input/output error root@system:~# less -bash: /bin/less: Input/output error root@system:~# chmod -bash: /bin/chmod: Input/output error
該系統仍在執行,並實現其目的。我知道,我知道,對此唯一明智的反應是關閉系統並更換根驅動器。不幸的是,這不是一個選擇,因為它會花費大量時間和金錢。而且,它會殺了我的貓,這會讓我很難過。
我想從捐贈者那裡給他帶來他平時的朋友。我不敢嘗試將它們 scp 放入,以防 ssh 嘗試載入它並切斷線路(二進製文件無論如何都消失了)。這聽起來像是我貓的表弟的工作:
root@system:~# netcat -l 1234 > /tmp/less -bash: netcat: command not found
可惜他早就走了。
現在,我可以嘗試欺騙我的貓進行儀式以復活他:
cat > netcat < /dev/tcp/localhost/9999
那種工作。他幾乎還活著:
root@system:/tmp# /tmp/netcat -bash: /tmp/netcat: Permission denied
他只需要一點生命的火花。
+x
那個我現在無法背誦的小魔法咒語。你能幫我把我貓的朋友帶回來嗎?
有幾種可能性,都取決於您現在情況的確切參數。我將在以下適用的範例中假設 Linux,但在大多數情況下,其他平台上也存在類似的功能。
- 您也許可以讓動態載入程序為您執行執行檔。假設
cat
是動態連結的,您的平台的等價物/lib/ld-linux.so.2
也可能在記憶體中,因此可用於執行二進製文件:$ /lib64/ld-linux-x86-64.so.2 ./chmod chmod: missing operand
您可能有多個這些(可能是 32 位和 64 位),並且可能有多個副本可用,或者需要解析的符號連結。其中之一可能有效。
- 如果你有一個掛載的 vfat 或 NTFS 文件系統,或者另一個將所有文件視為 777 的文件系統,你可以在那裡創建你的執行檔。
$ cat > /mnt/windows/chmod < /dev/tcp/localhost/9999
- 如果你有一個掛載的網路文件系統,即使它不是本地可寫的,你也可以在遠端系統上創建文件並正常使用它們。
- 如果有一個您不關心內容的已掛載分區,則在仍然大部分工作的驅動器上,您可以用包含您想要的執行檔的相同文件系統類型的新映像替換內容 -
cat
在人們通常使用dd
的角色,您可以通過網路提供圖像。$ cat > /dev/sdb1 < ...
這個是合理的,但是有很多地方不能工作,具體取決於該分區的記憶體中到底有什麼。
- 如果有任何可訪問的文件在任何可寫文件系統上具有執行權限,您可以
cat >
將其內容替換為您選擇的二進製文件。$ cat > ~/test.py < ...
- 由於 Bash 仍在執行,您可以將 Bash 外掛動態載入到公開 chmod 的程序中。特別是,您可以安裝和載入
ctypes.sh
,它為 Bash 提供了一個外部函式介面,然後dlcall chmod ./netcat 511
.- 您可以引入
foo.so
您的構造的動態庫文件,然後cat
通過 代表您載入它LD_PRELOAD
,從而允許您執行任意程式碼。$ LD_PRELOAD=./hack.so cat /dev/null
例如,如果您攔截
open
:int open(const char *path, int flags, ...) { chmod(path, 0755); return -1; }
然後你可以在那裡做任何你需要做的事情。
我的建議是引入一個靜態連結的
busybox
執行檔作為第一項(或者實際上是唯一一項),這樣您就可以獲得所有可用的命令,而無需重用任何讓您筋疲力盡的黑客行為。