###### tags: `lsa` `ncnu` # Week 02 (2024/02/29) - Book mode: https://hackmd.io/@ncnu-opensource/book [TOC] ## FHS 1. `/etc/password` & `/etc/shadow` 差別 - `/media` 媒體資料夾 - `/mnt` 掛載資料夾 - `/opt` 第三方應用程式資料夾 - `/lib` 系統和應用程式所需的函式庫 - `/run` 程式和服務的運行暫存資料夾 - `proc` 儲存當前核心運作狀態 - `/home` 使用者根目錄(```~/```) - `/var` 系統暫存檔(嗎 - `/tmp` 暫存(我都拿來放一次性的 Code :D) - `ls` 指令 - 不一定會有顏色,都是 bash 去檢查檔案類型加的 - 圖片檔是普通檔案?有的說不定會有顏色 - 執行檔,是檢查 executable bit - 要看環境變數 - `export` 看到你的 shell - `export | grep -i path` - 尤其是 PATH=xxxxx ,是你在 shell 裡去下指令時預設會去找的路徑 - 如果發現裡面有個路徑權限是 777 的話,可能是你被駭了 - 具體攻擊手法: 1. 駭客可能用暴力破解 SSH 密碼進來你的電腦 2. 在 `~/.profile` 或 `~/.bashrc` 的 PATH 變數加入自己有放惡意程式的路徑在最前面 3. 之後使用者去下任何指令就會第一個去駭客控制的這資料夾去找 4. 惡意程式假裝自己是 bash ,先看你在 bash 裡做了什麼事,再幫你把輸入給真正的 bash 5. 要是他剛好有用到 sudo 輸入密碼就記起來;去 `.bash_history` 裡面找你有沒有剛好用 `mysql -u <user> -p <password>` 來輸入你的密碼;去 exploit-db 去找這作業系統已知弱點,裡面 Local Type 的攻擊方法要有拿到帳號使用權才能用 - PS: exploit-db 上面有一些 PoC 程式碼會故意弄一些小錯誤讓 script kiddie 沒那麼容易拿去用 7. 下次駭客進來就能拿到 superuser 權限,可以真正在你系統重要路徑做壞事 - Q: 密碼很容易被暴力破解嗎? - 有大家常用使用者名稱/密碼,建表之後先去試就比較快 - 例如 admin:admin, fedora:!qaz2wsx - /bin 和 /sbin 差在哪 > 你有 sbin 也有 bin [name=BlueT] - 簡單來講: sbin 裡的東西用錯的話比較會用壞系統; bin 裡的東西比較不會用壞系統 - /sbin 例如 - ifconfig 要是設錯網路設定會害你無法再遠端連進去機器 - /bin 例如 - zip 只是解壓縮壓縮,很無害 - /usr - 其實以前是系統必要的檔案不會放在這的,等需要的時候再 mount 起來 - 某派系之爭(?)之後才變這樣 - `/etc/fstab` 或 `mount` 指令 - 有些 fs 有 (nodev) 標籤 - 你可以掛載時叫他 noatime ,不然每次 access 都去改他 access time timestamp 多很多次 io - ex. `/var/www` (web server 用的) 有人就會這樣做(因需大量存取,或是 ftp 的檔案之類的) - (ro) 標籤可以讓他 read only,如果你的 /usr 可以不被別人亂動的話會比較安全,因為前面講到環境變數裡的 PATH 第一個去找的就是這裡 - `/etc/skel` - 用 `ls -a` 才看得到隱藏檔 - 新增使用者時,使用者家目錄預設會新增的檔案 - 攻擊者也可以在裡面加壞東西 - /dev/shm - 權限是 777 - 除了 `/tmp` 之外會有 777 的地方 - 用 `mount` 看 type 是 tmpfs - 大小是你有的 RAM 一半 - 你複製進來的東西 os 會搬進記憶體裡 - 如果你在這放東西,又沒開 swap ,記憶體佔完,系統會變比較不穩定 - 也可以在裡面放惡意程式 - /proc - 有支援 proc filesystem 的系統會有這東西 - 可以從這裡找到某程式的 cmdline/COMMAND/CMD 是啥 - 像是 `./systemd` 一定有鬼 - 但有可能執行 process 後把原執行檔從 disk 刪掉 - /media - 有桌面環境的 distribution 比較會預設幫你掃描到插入的 USB 掛載起來 - /var/log/syslog - 系統的紀錄檔 - 很多程式都會預設把紀錄檔弄到這裡來,要 debug 問題也可以先來看看 ## 指令補充 - `alias` - 別名,好方便喔 - 推薦大家 `ls -alh` > 下 ls 指令不加 -a ,不如不要下 [name=BlueT] - 有看過有檔案取名叫 `.` 或 `...` - 我推薦 `rm -i` - `ls` - 檔案 - 權限 - r: read - w: write - x: execute - `touch` - 如果沒有對應的檔名,就會建立新檔案 - `mkdir` 建立新目錄 - `mv` 移動或重新命名檔案 - `mv <原始位置> <目標位置>` - `mv <原檔名> <新檔名>` - `mv <file1> <file2>... <目錄>` 將多個檔案搬至目標位置 - `rmdir`:刪除指定空目錄 - `rm`:刪除檔案或目錄 - `-r`: recursive - `-f`: 強制刪除 - `-i` - `echo`: 輸出使用者輸入的內容 - `echo <content> <filename>` - `echo <content> > <filename>` - 特殊符號 - `>`: 覆寫 - `>>`: append - `<`: - `<<`: - `cat`:輸出指定檔案的內容 - -b:印出行數 - -n - `grep`:找關鍵字 - -i:不分大小寫 - -n:顯示行號 - -E: ::: info pipe ( | ) 前面的輸出作為後面指令的輸入 ::: - `ln <source file> <link file>`:建立連結檔 - 一般預設是建立硬連結 - -s: 建立軟連結 - `whoami`:查看目前的使用者 - `groups`:查看使用者所在的群組 - `id`:查看自己的 UID 及所在群組的 GID - `who`:當前使用者的登入紀錄 - `sudo` 使用管理員權限 - 使用者 - `usermod` 修改使用者權限 - `adduser` 新增使用者 - `deluser` 刪除使用者 - `passwd` 修改當前使用者密碼 - 群組 - `groupadd` 添加群組 - `groupdel` 刪除群組 ## **chmod** ``` chmod [options] mode file... ``` **選項:** * `-R`:遞迴變更目錄和其子檔案的權限。 * `-a`:設定所有權限。 * `-o`:設定特定權限。 **模式:** * `r`:讀取權限。 * `w`:寫入權限。 * `x`:執行權限。 **檔案:** 指定要變更權限的檔案或目錄的名稱。 **範例:** ``` chmod 644 file.txt # 賦予 file.txt 可讀、可寫入和可執行權限。 chmod -R 755 directory # 賦予 directory 的所有子檔案和目錄可讀、可寫入和可執行權限。 chmod -a 0 file.log # 銷除 file.log 的所有權限。 ``` **注意事項:** * 權限值必須是 0-7 之間的數字。 * 如果指定了 `-R` 選項,則會變更目錄和其子檔案的權限。 * 如果沒有指定檔案或目錄,則會影響目前目錄中的所有檔案和目錄。 * 使用 `-o` 選項時,必須指定特定的權限。 --- ## chgrp ``` chgrp [options] group file... ``` **選項:** * `-R`:遞迴變更目錄和其子檔案的群組。 * `-o`:設定特定群組。 **檔案:** 指定要變更群組的檔案或目錄的名稱。 **範例:** ``` chgrp group file.txt # 將 file.txt 的群組變更為 group。 chgrp -R group directory # 將 directory 的所有子檔案和目錄的群組變更為 group。 ``` **注意事項:** * 群組值必須是系統中存在的群組名稱。 * 如果指定了 `-R` 選項,則會變更目錄和其子檔案的群組。 * 如果沒有指定檔案或目錄,則會影響目前目錄中的所有檔案和目錄。 --- ### 查詢相關ㄉ | 指令 | 功能 | | --- | --- | | find | 在目錄中尋找檔案 | | grep | 在檔案中搜尋文字 | | loc | 找到指定檔案的路徑 | | man | 顯示指定命令的手冊頁 | | pwd | 顯示目前目錄的路徑 | | stat | 取得檔案或目錄的狀態 | | chown | 變更檔案或目錄的所有權和群組 | | chmod | 變更檔案或目錄的權限 | | chattr | 設定檔案或目錄的屬性 | | cp | 複製檔案或目錄 | | mv | 移動或改名檔案或目錄 | | rm | 刪除檔案或目錄 | | touch | 創建新的檔案或目錄 | **find 指令** ``` find [路徑] -[條件] -exec command {} \; ``` `find` 指令用來在目錄中尋找檔案。 - **路徑**:要搜尋的目錄。 - **條件**:用來篩選搜尋結果的條件。 - **command**:找到檔案後要執行的命令。 **範例:** - 尋找目前目錄下所有以 `.txt` 結尾的檔案: ``` find . -name "*.txt" ``` - 尋找目前目錄下所有檔案大小超過 100 MB 的檔案: ``` find . -size +100M ``` - 尋找目前目錄下所有可執行檔案: ``` find . -type f -executable ``` **grep 指令** ``` grep [模式] [檔案] ``` `grep` 指令用來在檔案中搜尋文字。 - **模式**:要搜尋的文字模式。 - **檔案**:要搜尋的檔案。 **範例:** - 在 `/etc/passwd` 檔案中搜尋所有包含 "root" 的行: ``` grep root /etc/passwd ``` - 在所有 `.txt` 檔案中搜尋所有包含 "hello" 的行: ``` grep -R "hello" *.txt ``` **loc 指令** ``` loc [檔案] ``` `loc` 指令用來找到指定檔案的路徑。 - **檔案**:要查找的檔案。 **範例:** ``` loc ls ``` **man 指令** ``` man [命令] ``` `man` 指令用來顯示指定命令的手冊頁。 - **命令**:要查看手冊頁的命令。 **範例:** ``` man ls ``` **pwd 指令** ``` pwd ``` `pwd` 指令用來顯示目前目錄的路徑。 **範例:** ``` pwd ``` **stat 指令** ``` stat [檔案] ``` `stat` 指令用來取得檔案或目錄的狀態。 - **檔案**:要查看狀態的檔案或目錄。 **範例:** ``` stat /etc/passwd ``` **chown 指令** ``` chown [使用者]:[群組] [檔案] ``` `chown` 指令用來變更檔案或目錄的所有權和群組。 - **使用者**:新的檔案所有者。 - **群組**:新的檔案群組。 - **檔案**:要變更所有權和群組的檔案或目錄。 **範例:** ``` chown root:wheel /etc/passwd ``` **chattr 指令** ``` chattr [屬性] [值] [檔案] ``` `chattr` 指令用來設定檔案或目錄的屬性。 - **屬性**:要設定的檔案屬性。 - **值**:要設定的屬性值。 - **檔案**:要設定屬性的檔案或目錄。 **範例:** ``` chattr +i /etc/passwd ``` **cp 指令** ``` cp [來源] [目標] ``` `cp` 指令用來複製檔案或目錄。 - **來源**:要複製的檔案或目錄。 - **目標**:複製檔案或目錄 --- - `man` - `head` - `tail` - `file` - `whereis` 找檔案位置 - `which` 找指令存的位置 - `find` 根據設定的條件查詢檔案或目錄 - `env` environment, 顯示目前 shell 下的所有環境變數與說明 - `printenv` 輸出所有環境變數 - `type` 查看指令類型 - `-t` - file as 外部指令 - alias ### `apt` 套件管理器 | 指令 | 功能 | | --- | --- | | apt | 顯示 APT 的版本資訊 | | apt-cache | 查詢 APT 資料庫 | | apt-cdrom | 從 CD-ROM 安裝軟體 | | apt-get | 安裝、更新、移除軟體 | | apt-mark | 標記軟體包 | | apt-policy | 設定 APT 的策略 | | apt-preferences | 設定 APT 的偏好設定 | | apt-show | 顯示軟體包的資訊 | | apt-source | 安裝軟體包的原始碼 | **apt 指令** ``` apt ``` `apt` 指令用來顯示 APT 的版本資訊。 **範例:** ``` apt ``` **apt-cache 指令** ``` apt-cache [指令] ``` `apt-cache` 指令用來查詢 APT 資料庫。 - **指令**:要執行的查詢指令。 **範例:** - 搜尋所有可用的軟體包: ``` apt-cache search ``` - 顯示指定軟體包的資訊: ``` apt-cache showpkg <package-name> ``` **apt-cdrom 指令** ``` apt-cdrom [指令] ``` `apt-cdrom` 指令用來從 CD-ROM 安裝軟體。 - **指令**:要執行的安裝指令。 **範例:** ``` apt-cdrom install <package-name> ``` **apt-get 指令** ``` apt-get [指令] ``` `apt-get` 指令用來安裝、更新、移除軟體。 - **指令**:要執行的操作指令。 **範例:** - 安裝指定軟體包: ``` apt-get install <package-name> ``` - 更新所有已安裝的軟體包: ``` apt-get update apt-get upgrade ``` - 移除指定軟體包: ``` apt-get remove <package-name> ``` **apt-mark 指令** ``` apt-mark [指令] ``` `apt-mark` 指令用來標記軟體包。 - **指令**:要執行的標記指令。 **範例:** - 標記指定軟體包為自動安裝: ``` apt-mark auto <package-name> ``` - 標記指定軟體包為手動安裝: ``` apt-mark manual <package-name> ``` **apt-policy 指令** ``` apt-policy [指令] ``` `apt-policy` 指令用來設定 APT 的策略。 - **指令**:要執行的設定指令。 **範例:** - 設定 APT 的預設安裝位置: ``` apt-policy -d /usr/local ``` **apt-preferences 指令** ``` apt-preferences ``` `apt-preferences` 指令用來設定 APT 的偏好設定。 **範例:** - 設定 APT 的優先順序: ``` Package: * Pin: release a=stable Pin-Priority: 900 ``` **apt-show 指令** ``` apt-show [指令] ``` `apt-show` 指令用來顯示軟體包的資訊。 - **指令**:要執行的顯示指令。 **範例:** - 顯示指定軟體包的詳細資訊: ``` apt-show <package-name> ``` **apt-source 指令** ``` apt-source [指令] ``` `apt-source` 指令用來安裝軟體包的原始碼。 - **指令**:要執行的安裝指令。 **範例:** - 安裝指定軟體包的原始碼: ``` apt-source install <package-name> ``` ### Downloader - `wget` - `curl` ### 網路相關 - `ifconfig` 大家的網卡相關訊息好朋友 - 記得先裝 net-tools - `sudo apt install net-tools` - `route` - `ping` - `traceroute` - `nslookup` - `netstat` - `speedtest` - 需要安裝 - `sudo apt install speedtest-client`