前言
前幾天我們已經陸續學會了不少 Linux 檔案操作
ls:查看目錄內容cat:讀取檔案touch:建立檔案mkdir:建立目錄cp:複製檔案mv:移動或重新命名檔案rm:刪除檔案但是當檔案很多,而且我們不知道它到底放在哪裡時,總不能一個目錄一個目錄慢慢找。
這時候就要使用今天的主角 findfind 可以依照條件搜尋檔案或目錄,甚至可以直接從整個檔案系統開始搜尋。
今天的題目就是把 flag 藏在檔案系統中的某個隨機目錄,要求我們把它找出來。
find 指令最基本的 find 可以直接使用 find
如果沒有指定搜尋條件,也沒有指定搜尋位置,find 預設會
.
└── my_directory
├── my_file
└── my_subdirectory
└── my_subfile
執行 find
就會列出:../my_directory./my_directory/my_subdirectory./my_directory/my_subdirectory/my_subfile./my_directory/my_file
這代表 find 不只是尋找檔案,也會把目錄列出來。
除了直接使用 find,我們也可以指定要從哪個目錄開始搜尋。
例如 find my_directory/my_subdirectory
就會從 my_directory/my_subdirectory 開始搜尋my_directory/my_subdirectorymy_directory/my_subdirectory/my_subfile
所以可以把 find 想成find + [搜尋位置] + [搜尋條件]
如果沒有指定搜尋位置,就會使用目前工作目錄 .。
-name 尋找指定名稱如果我們知道檔案名稱,就可以搭配 -name。
例如 find -name my_subfile
會尋找名稱叫做 my_subfile 的檔案。
結果可能是 ./my_directory/my_subdirectory/my_subfile
如果要找目錄 find -name my_subdirectory
也可以找到 ./my_directory/my_subdirectory
因此 find -name + 檔案名稱
就是很常見的檔案搜尋方式。
今天真正重要的地方就在這裡。
如果我們不知道檔案在哪個目錄,可以直接從 / 開始搜尋 find /
因為 / 是 Linux 檔案系統的根目錄,所以從 / 開始搜尋,就代表搜尋整個檔案系統。
例如 find / -name hacker
可能會找到 /home/hacker
這表示 find 可以一路從根目錄往下搜尋所有符合條件的位置。
題目:finding files
今天的題目把真正的 Flag 藏在檔案系統中的某個隨機目錄。
而且有一個很重要的提示:
Flag 的檔案名稱仍然叫做 flag。
所以我們其實已經知道搜尋條件 檔案名稱 = flag
但不知道它在哪裡。
因此可以從根目錄 / 開始搜尋:find / -name flag
這個指令可以拆成:
find
│
├── / → 從根目錄開始搜尋
│
└── -name flag
→ 尋找名稱為 flag 的檔案
執行後可能會看到很多結果,因為題目也特別提醒 There are other files named flag on the filesystem.
也就是說,找到 flag 不代表一定是真正的 Flag。
在執行 find / -name flag 的時候,有可能看到一些類似 find + /某個目錄 + Permission denied
這不用太緊張。
因為 Linux 中有些目錄只有特定使用者或 root 才有權限存取。
我們目前是一般使用者,所以 find 搜尋到某些受限制的目錄時,就會因為沒有權限而產生錯誤。
題目也已經提醒我們:These will cause find to generate errors, but you can ignore those.
所以看到 Permission denied 時,不代表指令失敗。
只要繼續等待 find 搜尋即可。
flag 之後因為系統裡可能存在很多名稱相同的 flag,所以找到結果後不能直接認定第一個就是答案。
但可以推論 flag 可能在 /usr/lib/x86_64-linux-gnu/perl/5.38.2/auto/File/DosGlob/flag/usr/lib/python3/dist-packages/pwnlib/flag 這兩個其中一個檔案裡
這時候就可以使用 cat + /完整路徑/ + flag 查看內容。
那就代表我們找到真正的 Flag 了。
今天第一次真正感受到 find 在 Linux 裡面的實用性。以前如果不知道檔案在哪裡,可能會想到用 ls 一層一層查看,再搭配 cd 慢慢找。但是當檔案系統變得非常龐大時,這種方法就會非常沒有效率。find 可以讓我們直接告訴 Linux**「從這個位置開始,幫我找符合這個條件的東西。」**今天的題目也讓我注意到一件事情,找到檔案不代表找到答案。因為系統裡可能有很多同名的 flag,所以搜尋之後還是要進一步使用 cat 查看內容,確認是不是我們真正要找的 Flag。這也讓我開始了解到,在實際 Linux 環境中,搜尋、篩選與確認通常是連在一起的操作。