Hammered Blue Team Lab ====================== https://cyberdefenders.org/blueteam-ctf-challenges/hammered/ Category: Endpoint Forensics Instructions: Uncompress the lab (pass: **cyberdefenders.org**), analyze logs, and find the answers. Challenge files: - kern.log - auth.log - daemon.log - dmesg - apache2 # Q1 - Which service did the attackers use to gain access to the system? Những kẻ tấn công đã sử dụng dịch vụ nào để truy cập vào hệ thống? > Để xác định dịch vụ nào mà kẻ tấn công đã sử dụng để truy cập vào hệ thống, mình cần xem lại các tệp nhật ký để tìm các lần truy cập bất thường hoặc trái phép. Các tệp nhật ký thường chứa thông tin về các lần xác thực bao gồm: > > 1. **/var/log/auth.log**: Lưu trữ các thông báo liên quan đến xác thực, bao gồm các lần đăng nhập SSH. > 2. **/var/log/syslog**: Nhật ký hệ thống chung có thể chứa các mục nhập liên quan. > 3. **/var/log/secure** (trên một số bản phân phối như CentOS hoặc RHEL): Chứa các thông báo liên quan đến bảo mật và xác thực. > > Dưới đây là cách kiểm tra các nhật ký này để tìm hoạt động đáng ngờ: > > 1. **Kiểm tra nhật ký SSH**: Nếu kẻ tấn công sử dụng SSH, hãy tìm các lần đăng nhập thất bại và thành công trong `/var/log/auth.log` (hoặc `/var/log/secure` trên một số hệ thống). > > > ```shellcode > grep 'sshd' /var/log/auth.log | grep 'fail' > grep 'sshd' /var/log/auth.log | grep 'Accepted'` > ``` > > 2. **Xem xét nhật ký hệ thống chung**: Tìm các hoạt động hoặc thông báo lỗi bất thường trong các nhật ký hệ thống chung. > > ```shellcode > grep 'fail' /var/log/syslog > ``` > 3. **Kiểm tra các dịch vụ khác**: Nếu bạn nghi ngờ các dịch vụ khác có thể liên quan, hãy kiểm tra nhật ký cụ thể của các dịch vụ đó (ví dụ: nhật ký máy chủ web, nhật ký FTP). > > ```shellcode > grep 'fail' /var/log/apache2/access.log > grep 'fail' /var/log/vsftpd.log` > ``` > 4. **Tìm các lần truy cập trái phép**: Tìm kiếm bất kỳ đề cập nào về truy cập trái phép hoặc hoạt động đáng ngờ. > > ```shellcode > grep 'unauthorized' /var/log/auth.log > grep 'unauthorized' /var/log/syslog > ``` > > Nếu bạn tìm thấy các mục nhập chỉ ra các lần đăng nhập thất bại tiếp theo là các lần thành công, đặc biệt là từ các địa chỉ IP hoặc người dùng không quen thuộc, điều đó có thể cho thấy kẻ tấn công đã truy cập thành công thông qua tấn công brute force hoặc dùng kỹ thuật credential stuffing. Việc phân tích các nhật ký này sẽ cung cấp manh mối về dịch vụ nào bị xâm phạm. Vì file auth.log chứa thông tin xác thực trên hệ thống trong máy chủ Debian và Ubuntu được ghi lại nên mình sẽ check file auth.log xem những lần đăng nhập không thành công có sử dụng dịch vụ nào bằng: `cat auth.log | grep -F 'Failed'` hoặc `cat auth.log| grep -i "failed"` > 1. **-F**: > - `grep -F 'Failed' auth.log`: Tùy chọn `-F` cho biết `grep` rằng mẫu tìm kiếm là một chuỗi văn bản cố định, không phải biểu thức chính quy (regular expression). Điều này có thể làm cho việc tìm kiếm nhanh hơn vì không cần phân tích cú pháp biểu thức chính quy. > 2. **-i**: > - `grep -i "failed" auth.log`: Tùy chọn `-i` làm cho việc tìm kiếm không phân biệt chữ hoa và chữ thường. Ví dụ, `failed`, `Failed`, `FAILed`, v.v. sẽ được xem như nhau. ![image](https://hackmd.io/_uploads/rkKJaIeER.png) Lệnh Grep 'Failed' cho mình thấy rất nhiều lượt cố gắng login như tấn công brute force bằng sshd, vì vậy service trong câu này là ssh. => SSH > Ngoài các tùy chọn `-F` và `-i`, lệnh `grep` còn hỗ trợ nhiều tùy chọn khác. Dưới đây là một số tùy chọn phổ biến: > > 1. **-v**: > > - `grep -v "pattern" file`: Hiển thị tất cả các dòng không chứa mẫu tìm kiếm. Đây là tùy chọn "ngược" (invert) tìm kiếm. > 2. **-c**: > > - `grep -c "pattern" file`: Đếm số dòng khớp với mẫu tìm kiếm và chỉ hiển thị số lượng dòng. > 3. **-n**: > > - `grep -n "pattern" file`: Hiển thị số dòng của các dòng khớp với mẫu tìm kiếm. > 4. **-r**: > > - `grep -r "pattern" directory`: Tìm kiếm đệ quy trong tất cả các tệp trong thư mục và các thư mục con. > 5. **-l**: > > - `grep -l "pattern" file`: Hiển thị tên tệp chứa mẫu tìm kiếm (mỗi tệp chỉ hiển thị một lần). > 6. **-w**: > > - `grep -w "pattern" file`: Chỉ khớp toàn bộ từ (word). Ví dụ, nếu tìm kiếm `grep -w "is" file`, nó sẽ không khớp với `this` hoặc `his`. > 7. **-x**: > > - `grep -x "pattern" file`: Chỉ khớp các dòng mà toàn bộ dòng phù hợp với mẫu tìm kiếm. > 8. **-A NUM**: > > - `grep -A 3 "pattern" file`: Hiển thị thêm NUM dòng sau mỗi dòng khớp với mẫu tìm kiếm. > 9. **-B NUM**: > > - `grep -B 3 "pattern" file`: Hiển thị thêm NUM dòng trước mỗi dòng khớp với mẫu tìm kiếm. > 10. **-C NUM**: > > - `grep -C 3 "pattern" file`: Hiển thị thêm NUM dòng cả trước và sau mỗi dòng khớp với mẫu tìm kiếm. > > Ví dụ về các lệnh `grep` sử dụng các tùy chọn trên: > > - `grep -v "error" log.txt`: Hiển thị tất cả các dòng không chứa từ "error". > - `grep -c "login" auth.log`: Đếm số lần từ "login" xuất hiện trong tệp `auth.log`. > - `grep -n "failed" auth.log`: Hiển thị các dòng chứa từ "failed" kèm theo số dòng. > - `grep -r "password" /var/log`: Tìm kiếm từ "password" trong tất cả các tệp trong thư mục `/var/log` và các thư mục con. > - `grep -l "success" *.log`: Hiển thị tên của các tệp `.log` chứa từ "success". > - `grep -w "is" text.txt`: Chỉ hiển thị các dòng mà từ "is" xuất hiện như một từ hoàn chỉnh. > - `grep -x "error" log.txt`: Chỉ hiển thị các dòng mà toàn bộ dòng là từ "error". > - `grep -A 3 "error" log.txt`: Hiển thị các dòng chứa từ "error" và thêm 3 dòng sau mỗi kết quả. > - `grep -B 2 "failed" auth.log`: Hiển thị các dòng chứa từ "failed" và thêm 2 dòng trước mỗi kết quả. > - `grep -C 1 "critical" syslog`: Hiển thị các dòng chứa từ "critical" và thêm 1 dòng trước và sau mỗi kết quả. > # Q2 - What is the operating system version of the targeted system? (one word) Phiên bản hệ điều hành của hệ thống mục tiêu là gì? (một từ thui nha). Đề bài cho mình file kern.log và file dmesg. Bây giờ chúng ta sẽ tìm hiểu chút về 2 file này. * > **File log /var/log/dmesg** > > ``` > [root@localhost ~]# cat /var/log/dmesg > ``` > > Tại đây các thông tin về bộ kernel được ghi nhận. Khi hệ thống khởi động các thông tin liên quan đến các thiết bị phần cứng và trình điều khiển của chúng được ghi lại ở đây. Vì kernel phát hiện các thiết bị phần cứng vật lý được liên kết trong quá trình khởi động, nó sẽ ghi lại trạng thái thiết bị, lỗi phần cứng và các thông báo chung khác. Nếu một thiết bị phần cứng nào đó hoạt động không đúng hoặc không được phát hiện, thì chúng ta có thể dựa vào tệp nhật ký này để khắc phục sự cố. > * > **File log /var/log/kern.log** > > ``` > [root@localhost ~]# cat /var/log/kern.log > ``` > > Đây là một file log vô cùng quan trọng chính là nơi chứa các thông tin được ghi bởi kernel. Thông qua file log này giúp cho chúng ta có thể khắc phục các lỗi và cảnh báo liên quan đến kernel. Kernel log có thể hữu ích trong việc khắc phục sự cố kernel và có ích trong việc gỡ lỗi các vấn đề phần cứng. Thông thường những dòng đầu tiên của file dmesg sẽ chứa thông tin về operating system version, vì vậy mình sẽ đọc 10 dòng đầu của file dmesg bằng: `cat dmesg | head -n 10` ![image](https://hackmd.io/_uploads/HysIbPgEA.png) (gcc version 4.2.4 (Ubuntu 4.2.4-1ubuntu3)) => 4.2.4-1ubuntu3 # Q3 - What is the name of the compromised account? Tên của tài khoản bị xâm nhập là gì? Mình sẽ quay lại file auth.log, làm 3 bước sau: 1. Check "Failed password" message 2. List IPs dựa theo "authentication failure" event 3. Check accepted password event Có nghĩa là mình sẽ kiểm tra xem Failed password lần cuối cùng sẽ hiện gì, sau đó ghi nhớ lại IP đó rồi check xem accepted password của ip đó đã tấn công thành công vào tài khoản nào. `cat auth.log | grep -i 'Failed password'` ```shellcode Apr 26 08:51:44 app-1 sshd[23542]: Failed password for root from 188.131.23.37 port 4280 ssh2 ``` ip: 188.131.23.37, check authentication failure `cat auth.log | grep -i 'authentication failure'|grep '188.131.23.37'` ![image](https://hackmd.io/_uploads/rk8sLDlE0.png) Đến đây mình có thể chắc chắn là root đã bị tấn công, bây giờ mình kiểm tra xem nó đã bị xâm nhập là accepted password hay chưa: `cat auth.log | grep -i 'accepted password'` ![image](https://hackmd.io/_uploads/rkr2wPe4R.png) Chính xác là root đã bị xâm nhập bởi attacker có địa chỉ ip đó. => root # Q4 - Consider that each unique IP represents a different attacker. How many attackers were able to get access to the system? Hãy xem xét rằng mỗi IP đại diện cho một kẻ tấn công khác nhau. Có bao nhiêu kẻ tấn công có thể truy cập vào hệ thống? Tiếp tục làm việc với file auth.log, đầu tiên mình sẽ liệt kê xem có bao nhiêu IP đã cố gắng tấn công và sau đó xem IP nào đã thành công có thể truy cập vào hệ thống. * grep failed auth ip, sau đó lưu vào file failedauthips.txt `grep sshd auth.log| grep "authentication failure" | awk '{print $14}' | sort | uniq -c | sort -n > failedauthips.txt` ![image](https://hackmd.io/_uploads/S1F1Q_gVC.png) Mình chỉ lấy IP ra để so sánh: `awk -F'rhost=' '{print $2}' failedauthips.txt > only_failips.txt` ![image](https://hackmd.io/_uploads/B1MiXdg4C.png) * Sau đó grep success ip ![image](https://hackmd.io/_uploads/H1KP4ue40.png) Tương tự mình cũng chỉ lấy IP ra: ![image](https://hackmd.io/_uploads/ry9YEdxEC.png) Sau khi có 2 output trên mình sẽ dùng [duplicatefinder](https://www.zickty.com/duplicatefinder) so sánh IP nào trùng. ![image](https://hackmd.io/_uploads/ByoQ8dgN0.png) Có 11 IP trùng, vì có những IP không phải là attacker, vì vậy mình grep từng IP với số lần failed password để biết IP hại. Mình có các IP sau: ``` 222.169.224.197 222.66.204.246 61.168.227.12 121.11.66.70 122.226.202.12 94.52.185.9 10.0.1.4 219.150.161.20 65.88.2.5 208.80.69.74 190.166.87.164 ``` `cat auth.log| grep -i "failed password" |grep root | grep "222.169.224.197" |wc -l` ![image](https://hackmd.io/_uploads/rJp9wulE0.png) Những ip sau toàn là những ip an toàn thôi. ![image](https://hackmd.io/_uploads/B16iwOlVR.png) Suy ra danh sách IP của kẻ tấn công là: ``` 222.169.224.197 222.66.204.246 61.168.227.12 121.11.66.70 122.226.202.12 219.150.161.20 ``` => 6 # Q5 - Which attacker's IP address successfully logged into the system the most number of times? Địa chỉ IP nào của kẻ tấn công đăng nhập thành công vào hệ thống nhiều lần nhất? File successips.txt của mình có cột đầu tiên chính là số lần đăng nhập thành công, bây giờ mình awk 6 bad ips trên để xem cột nào có số lần lớn nhất. ![image](https://hackmd.io/_uploads/SJXRtdgEC.png) ```shellcode awk '/222\.169\.224\.197|222\.66\.204\.246|61\.168\.227\.12|121\.11\.66\.70|122\.226\.202\.12|219\.150\.161\.20/' successips.txt ``` ![image](https://hackmd.io/_uploads/SkYwjOxVA.png) Bây giờ chúng ta đã biết 219.150.161.20 là ip có số lần đăng nhập thành công nhiều nhất(4). => 219.150.161.20 # Q6 - How many requests were sent to the Apache Server? Có bao nhiêu request đã được gửi đến Apache Server? Access log có chức năng ghi lại những lần sử dụng, truy cập, yên cầu đến apache server. ![image](https://hackmd.io/_uploads/ryPMTueV0.png) Requests được lưu ở www-access.log, mỗi dòng của log là 1 lượt request. ![image](https://hackmd.io/_uploads/H1E61Kg4A.png) Vì vậy mình sẽ đếm số dòng trong file www-access.log. `wc -l www-access.log` ![image](https://hackmd.io/_uploads/B1KDJKx4A.png) => 365 # Q7 - How many rules have been added to the firewall? Có bao nhiêu rule đã được add vào firewall? Có nhiều loại tường lửa Linux. Có một vài cái tên phổ biến là IPCop, iptables, Shorewall và UFW. Nhưng một trong những cái tên phổ biến nhất là tường lửa "iptables". Vì đề bài hỏi rule đã add vào nên mình sẽ kiểm tra iptables. `cat auth.log | grep iptables` ![image](https://hackmd.io/_uploads/By34sRlNA.png) Các conmmand thành công với -A nghĩa là rule đã được thêm vào. Tổng cộng có 6 quy tắc đã được thêm vào. => 6 > **We have some common iptables options** > > | Options | Descriptions | > | --- | --- | > | **-C** | **\[CHECK\]:** This is to check and find a rule that matches the requirements of the string. | > | **-D** | **\[DELETE\]: **This is used to delete a specific rule. | > | **-A** | **\[APPEND\]:** This is used to append or add rules. | > | **-I** | **\[INSERT\]:** This can add a rule to a particular position in a string. | > | **-L** | ** \[LIST\]: **To display all the rules we can use this. | > | **-v** | **\[VERBOSE\]: **This is used to get more information in the list option. | > | **-X** | **\[DELETE CHAIN\]:** This deletes the entire supplied string. | > | **-p** | **\[Protocol_name\]:** It is used to define the name of the protocol. | > | **-N** | **\[NEW CHAIN\]:** To create a new chain. | > | **-j** | **\[job\]: **It tells what operation has to be done with the packet. | > | **-F** | **\[Flush\]:** It is to delete all rules. | > | **-s** | **\[specify\]: **It is a flag used to specify the source of the packet.  | > # Q8 - One of the downloaded files to the target system is a scanning tool. Provide the tool name. Một trong những tệp được tải xuống hệ thống đích là công cụ quét. Cung cấp tên công cụ đó. Để xem các tệp đã được downloaded và installed, chúng ta cần xem tệp dpkg.log hoặc tern.log. - `/var/log/dpkg.log`: Chứa thông tin được ghi lại khi package được cài đặt (installed) hoặc gỡ bỏ (unpacked) bằng lệnh `dpkg`. ![image](https://hackmd.io/_uploads/r1dzKzfEC.png) - `term.log` ghi lại tất cả đầu ra của apt-get and apt-cache commands trong terminal. ![image](https://hackmd.io/_uploads/rJ0TdMME0.png) Một cách dễ dàng để lọc tên tệp là grep configure: ```bash cat dpkg.log | grep -F 'configure ' ``` ![image](https://hackmd.io/_uploads/Byz0T0xNA.png) => Nmap # Q9 - When was the last login from the attacker with IP 219.150.161.20? Format: MM/DD/YYYY HH:MM:SS AM Lần đăng nhập cuối cùng của kẻ tấn công với IP 219.150.161.20 là khi nào? Nhìn vào auth.log để biết các lần đăng nhập thành công bằng địa chỉ IP đó. `cat auth.log | grep -F 'Accepted password' | grep -F '219.150.161.20'` ![image](https://hackmd.io/_uploads/Syfw0RxEA.png) => 04/19/2010 05:56:05 AM # Q10 - The database displayed two warning messages, provide the most important and dangerous one. Cơ sở dữ liệu hiển thị hai thông báo cảnh báo, cung cấp thông báo quan trọng và nguy hiểm nhất. Thông báo cảnh báo được định dạng là WARNING trong Linux logs. `grep -r WARNING *` ![image](https://hackmd.io/_uploads/B1Uk11bE0.png) Hai thông báo liên quan đến 'cơ sở dữ liệu' (mysql) là 'mysql.user chứa 2 tài khoản root không có mật khẩu!' và 'mysqlcheck đã tìm thấy các bảng bị hỏng'. Cái nguy hiểm hơn là cái đầu tiên. Mysql tạo người dùng root không cần mật khẩu cho mỗi cơ sở dữ liệu khi tạo. Trừ khi người dùng gán mật khẩu cho những người dùng này, mật khẩu của họ sẽ luôn trống. => mysql.user contains 2 root accounts without password! # Q11 - Multiple accounts were created on the target system. Which one was created on Apr 26 04:43:15? Nhiều tài khoản đã được tạo trên hệ thống đích. Cái nào được tạo vào ngày 26 tháng 4 04:43:15? ``` cat auth.log | grep -F 'Apr 26 04:43:15' ``` ![image](https://hackmd.io/_uploads/r1QuMhnVC.png) => wind3str0y # Q12 - Few attackers were using a proxy to run their scans. What is the corresponding user-agent used by this proxy? Rất ít kẻ tấn công sử dụng proxy để chạy quá trình quét của chúng. User-agent tương ứng được sử dụng bởi proxy này là gì? > User Agent là gì? > ----------------- > > Theo Wikipedia, **User agent** (ký hiệu **UA**) có nghĩa là tác nhân người dùng. Đây là phần mềm được hoạt động thay mặt cho người dùng. Đề cập đến một trình duyệt web cho một trang web biết thông tin về trình duyệt và hệ điều hành. > > ![User Agent là gì?](https://static-xf1.vietnix.vn/wp-content/uploads/2022/06/user-agent.webp) > Hoặc bạn có thể hiểu đơn giản, khi một người đọᴄ email là một tác nhân người dùng email. Trong nhiều trường hợp, một UA đóng ᴠai trò như kháᴄh hàng trong giao thứᴄ mạng. Và đượᴄ ѕử dùng để thông tin liên lạᴄ giữa [client-ѕerᴠer](https://vietnix.vn/mo-hinh-client-server/). Fake UA sẽ làm giảm tỷ lệ checkpoint khi bạn sử dụng số lượng lớn tài khoản trên cùng một máy tính. Chỉ cần chọn một **User Agent** nào đó và paste vào file txt trong tool thì nó sẽ fake cho bạn. User-agent strings: ![image](https://hackmd.io/_uploads/ryyLH23NA.png) Mình sẽ đọc trường thứ 12 và bỏ các mục trùng lặp: `cat apache2/www-access.log | cut -d ' ' -f 12 | sort | uniq ` ![image](https://hackmd.io/_uploads/B1xr4n2VR.png) => pxyscand/2.1 # References and Further Readings https://blog.rmtph.one/posts/CyberDefenders_Hammered/ https://forensicskween.com/ctf/cyberdefenders/hammered/ https://0xmedhat.gitbook.io/whoami/hammered-cyberdefenders https://ahmed-naser.medium.com/hammered-blue-team-challenge-write-up-9dbed4a5ca64 https://stackoverflow.com/questions/11412950/difference-between-dmesg-and-var-log-kern-log https://www.geeksforgeeks.org/how-to-check-kernel-version-in-linux/?ref=ml_lbp https://blogd.net/linux/cac-file-log-quan-trong-tren-linux/ https://www.geeksforgeeks.org/linux-firewall/ https://vietnix.vn/user-agent/