無論是在伺服器進行網站開發或是漏洞實戰都會運用指令介面,而實戰當中常用的滲透工具以及惡意攻擊者撰寫的病毒也都包含指令,因此我們需要學習 Command Line 的操作與技巧。
學習基本指令的目的
一般我們使用電腦都是透過
圖形化使用者介面(Graphical User Interface, GUI)
進行操作,例如: 桌面、圖示、按鈕等等。
除了透過 GUI 與電腦互動以外,也可以透過
Terminal
以文字的方式與電腦互動,又稱為
指令介面(Command-Line Interface, CLI)
。
了解基礎指令(以 Linux 為例)
常見的作業系統有 Linux 家族(如: Ubuntu, CentOS 等) 與 Windows 兩種類型的作業。兩種類型的作業系統使用的指令介面有些許的不同,其中 Linux 為 bash shell ,而 Windows 為 cmd, PowerShell。
在 Linux 當中還有許多不同類型的 shell 如: zsh。 功能相較之下有些許差異,也衍生出許多不同的工具,這裡不再贅述。
以下列舉常用的指令,實作內容將在 LAB 當中實際操作。
PowerShell
學習基礎指令的管道
前面提到了指令介面的重要性,並且許多的實作都將以 Linux 系統進行,因此這裡需要先建構好 Linux 環境。
Linux 環境可以透過
虛擬機器
建立,常見的虛擬機器有 VirtualBox, VMWare, 等等。而在 Windows 10 系統下也可以使用
Windows Subsystem for Linux(WSL)
操作 Linux。
[安裝教學] 在 Windows 10 安裝虛擬機軟體 Virtualbox
[安裝教學] 在 Virtualbox 安裝 Ubuntu
[安裝教學] 安裝 Windows 子系統 Linux 版(WSL 安裝)
[安裝教學] Windows Terminal
LAB: 練習基礎指令
接下來要練習基礎指令的使用,請先開啟 Ubuntu 20.04 的 Terminal 準備好就開始吧!
man <指令名稱>
man
,也就是 manual。它可以查看某個指令的詳細說明以及使用方式。
輸入指令後會開啟說明介面,透過方向鍵
上鍵
以及
下鍵
可以滾動內文,按下
q
可以退出介面。
例如查看
ls
這個指令的相關說明
man ls
echo <輸出內容>
echo 是可以用來輸出文字的指令。
例如輸出Hello Fei
echo "Hello Fei"
whoami
whoami,也就是 who am i。它會列出目前已經登入的帳號
ls,也就是 list directory contents。它會列出當前資料夾內的檔案列表。
若要查看其他特定資料夾的檔案列表可以再加上資料夾路徑,路徑可以選擇使用相對路徑或是絕對路徑。
ls <資料夾路徑>
加上 -al 參數,可以輸出詳細的列表以及隱藏文件,其中 a 表示 all, l 表示 long listing format。
ls -al
相對路徑 vs 絕對路徑
路徑的表達方式分成相對路徑以及絕對路徑兩種
所謂相對路徑,也就是在當前的位置以及目標位置之間的相對位置
我們在 Linux 系統當中會用 .. 表示上一層資料夾,用 . 表示當前位置
舉例來說,如果現在我們的資料夾架構是這樣
├── dir1
│ ├── dir3
│ │ └── test3
│ └── test1
└── dir2
└── test2
如果我當前在 dir2 當中,要表示與 test3 的相對位置,可以表示成 ../dir1/dir3/test3
所謂絕對路徑是以根目錄作為參考基礎的路徑,在 Linux 當中,我們會以 / 表示根目錄,以 ~ 表示 /home/<使用者名稱>/ ,也就是家目錄
舉例來說,如果現在我們的資料夾架構是這樣
├── dir1
│ ├── dir3
│ │ └── test3
│ └── test1
└── dir2
└── test2
以絕對路徑表示 test3 的表示方式為 /dir1/dir3/test3
cd <資料夾路徑>
cd, 也就是 channge directory。它可以讓切換到指定的資料夾。
資料夾路徑可以選擇相對路徑或是絕對路徑。
例如切換到桌面,也就是 /home/fei/Desktop/
你會發現到在 fei@fei-VirtualBox: 後面顯示的路徑改變了。
pwd,也就是 print name of current/working directory。它可以輸出目前所在的資料夾路徑,以絕對路徑表示。
cat <檔案路徑>
cat 可以輸出指定檔案的內容。
例如在當前資料夾底下有個 hello.txt,將它 cat 出來。
cat hello.txt
grep <關鍵字> <檔案路徑>
grep 可以搜尋與關鍵字相符合的檔案內容。
touch <檔案名稱>
touch 在指定的檔案名稱不存在時會新增一個空的檔案。
※ 實際上 touch 是更新檔案的時間戳記,只是在檔案不存在時會直接新增空檔案
mkdir <資料夾名稱>
mkdir,也就是 make directories。它可以建立一個指定名稱的資料夾。
find 可以搜尋指定的檔案,有兩種常見的使用方式。
搜尋指定路徑下的特定名稱檔案
find <路徑> -iname <名稱>
搜尋指定路徑下的特定附檔名檔案
find <路徑> -iname '*.<副檔名>'
這裡使用的 iname 參數會不在乎大小寫搜尋,如果要求大小寫也要相同則改用 name 參數。
路徑可以給相對路徑或是絕對路徑。
file <檔案路徑>
file 可以查看指定檔案的檔案類型。
你可能會很好奇,透過副檔名不就可以知道檔案類型了嗎?
像是 .txt 就是文字檔; .exe 就是執行檔。
實際上,副檔名單純只是告訴電腦應該要用什麼應用程式開啟,與檔案內容無關。
因此,副檔名也可以不存在,並不會影響檔案的執行。
rm,也就是 remove。它可以刪除檔案或是資料夾。
刪除資料夾需要加上參數 -r,r 表示 recursive,會利用遞迴的方式刪除資料夾內的所有資料。
rm hello.txt
mv,也就是 move。它可以移動檔案或資料夾位置,也可以將檔案重新命名。
例如將 tmp 移動到 tmp_dir 底下
例如將 tmp 重新命名為 new_file
cp,也就是 copy。它可以複製檔案或是資料夾。
與 rm 相同,對資料夾操作時需要加上參數 -r
sudo 可以讓使用者暫時使用超級使用者(superuser)的權限執行指令。大多數指令前面加上 sudo 就可以改用 superuser 權限執行。
第一次輸入時需要輸入密碼,密碼不會顯示在螢幕上。
例如: 更新軟體
sudo apt update
apt 是 Linux 軟體包管理器,可以安裝、解除安裝、更新軟體。
安裝時需要使用 superuser 權限,因此前面通常會加上 sudo。
安裝、解除安裝、更新分別以 install、purge、update 表示
例如更新軟體
sudo apt update
ssh user@ip
ssh,也就是 Security Shell。可以使用 CLI 透過加密的網路傳輸協定遠端操作電腦。
user 是遠端電腦的帳號,ip 是遠端電腦的位置,如果要指定通訊埠(port),可以加上參數 -p。通常 ssh 服務的 port 位在 22。
第一次登入時會詢問是否信任遠端的機器。
例如使用 user 登入遠端操作 192.168.7.245:22
ssh user@192.168.7.245 -p 22
nano <檔案名稱>
nano 是簡單的文字編輯器。輸入指令後會進入編輯介面,透過 ctrl+x 可以退出,再輸入 Y 就可以儲存並退出。
常用指令統整
在命令列當中按上鍵可以看到上一個打過的指令
打指令如果忘記後面的參數要放什麼,按兩下 tab 會顯示出建議的選項
指令當中輸入檔案名稱時可以只輸入部分,再按一下 tab 自動補齊
大多數的命令加上 --help 參數可以獲得簡單的指令介紹
Linux 權限
在 Linux 當中也有權限之分,透過指令 ls 可以了解資料夾內的檔案或資料夾的權限列表,以及檔案所屬群組,與檔案擁有者。其中權限分成三種類型:
該檔案擁有者的權限(the file owner)
該檔案所屬群組內的使用者權限(the group owner of the file)
其他所有使用者的權限(all other user)
權限也分成三種類型
r : 可讀
w : 可寫
x : 可執行
以下使用指令 ls -al 查看檔案與資料夾權限,在檔案屬性可以看到 d 表示資料夾; – 表示檔案
除了 rwx 的表示方式外,也可以使用數字表示權限,以下表格整理了各個數字的意義。
Binary
也就是說,二進位的每個位數分別表示讀取( r )、寫入( w )、執行( x ) 的權限,並且以 1 表示有該權限, 0 表示沒有該權限。
而每個 Hex 值又會分別對應到擁有者、所屬群組、其他使用者的權限。
chmod <權限> <檔案名稱>
chmod,也就是 change file mode bits。它可以將檔案的權限更新。
如果是要修改資料夾權限,則需要加上參數 -R。
如同前面提到我們可以使用 rwx 或是 0~7 來表示權限,因此這裡也有兩種表示方式。
使用 rwx
我們可以選擇哪種類型的權限要變更,或是全部一起變更。
分別使用 u, g, o, a 表示擁有者、群組內使用者、其他使用者、全部使用者。可以看成 user, group, others 以及 all。
例如只針對 擁有者(u) 新增(+) 讀取(r) 的權限
chmod u+r new_file
如果要移除的話則改用 -
如果是針對全部使用者調整 讀取(r) 或是 執行(x) 的權限,可以省略 a。
使用 0~7
由於一個數字就可以表示三個權限,因此一次就可以設定三種類型的權限。
例如讓 擁有者、群組內使用者 新增(+) 讀取(r) 的權限
chmod +770 new_file
如果要移除則改用 -
如果要直接複寫當前的權限狀態則不需要 + 或 -
例如將所有使用者權限都設為 7
chmod 777 new_file
技術專長:OSINT、滲透測試、網站開發、專業易懂教育訓練。
資安證照:OSCE3、OSED、OSWE、OSEP、OSCP、OSTH、OSWA、OSWP、OSCC、OSCC-SJD。
資安書籍:《資安這條路:領航新手的 Web Security指南》。
教學經驗:50+ 企業教學經驗、指導過上百位學員。
教學特色:新手友善、耐心指導、擅長圖解(流程圖、心智圖)引導學習。
社群經驗:目前經營全臺資安社群 CURA,曾任臺科資安社社長、逢甲黑客社社長。
社群交流:Line 社群《飛飛的資安大圈圈》,即時分享經驗、鼓勵交流。
社群分享:FB 粉專《資安這條路,飛飛來領路》,分享文章與圖卡整理。
資安網站:feifei.tw 資安系列文章