# Brute Force Detection

Trong tình huống này, chúng ta nhận được một log xác thực và nghi ngờ rằng có một cuộc tấn công brute force. Thay vì xem xét toàn bộ log (sẽ mất rất nhiều thời gian), chúng ta quyết định viết một đoạn mã nhỏ bằng ngôn ngữ Go để hỗ trợ trong nhiệm vụ này. Trước tiên, chúng ta cần theo dõi log để quan sát một số mẫu trong log mẫu của chúng ta, giúp phát hiện các lần đăng nhập không thành công.

<figure><img src="/files/WVVypkrcXQg4GHMsIwZU" alt=""><figcaption></figcaption></figure>

Chúng ta quan sát thấy rằng đối với lỗi xác thực SSH, log bao gồm “**sshd**” và “**Failed password for from** ”. Giờ đây, chúng ta sẽ khai báo một struct để quản lý thông tin này. Chúng ta cần lưu trữ IP *và cổng của kẻ tấn công*, *tên người dùng mục tiêu* và *số lần thất bại*. Struct của chúng ta sẽ trông như sau.

<figure><img src="/files/flfkeuf8qC4No5xFYIcv" alt=""><figcaption></figcaption></figure>

Chúng tôi cũng sẽ lưu các chuỗi trong **sshd** và **Failed password** trong một hằng số. Chúng tôi cũng sẽ đặt ngưỡng của mình là 10

<figure><img src="/files/IGC5RZiKZnTcAjU5ogra" alt=""><figcaption></figcaption></figure>

Bây giờ, chúng ta sẽ tạo một hàm để lấy các giá trị cần thiết từ tệp log. Chúng ta sẽ làm việc với từng dòng log. Thuật toán của chúng ta sẽ như sau:

1. Kiểm tra xem chuỗi "**sshd**" và "**Failed password**" có tồn tại không. Nếu có, tiếp tục bước 2, nếu không thì trả về.
2. Chia chuỗi bằng từ khóa "**for**". Lý do chúng ta làm điều này là vì chúng ta chỉ muốn thông tin sau từ khóa "**for**". Tuy nhiên, chúng ta có thể chọn một logic khác nếu muốn, nhưng đây là logic mà chúng ta chọn hiện tại.
3. Kiểm tra nếu kết quả chia có ít hơn 2 giá trị, nếu có thì trả về.
4. Trong phần tử thứ hai, chia bằng khoảng trắng ( " " ).
5. Nếu mảng kết quả có ít hơn 6 phần tử, trả về, nếu không thì tiếp tục bước 6.
6. Lấy phần tử 3 (IP), 1 (username) và 5 (source port).
7. Trả về thông tin.

Hàm của chúng ta để phân tích log sẽ trông như sau.

<figure><img src="/files/m5wAe4nnOLGLGVK0RRLd" alt=""><figcaption></figcaption></figure>

Bây giờ, chúng ta cần viết một thuật toán để đọc từ tệp log. Thuật toán ở đây khá đơn giản:

1. Tạo một bản đồ (map) để ánh xạ địa chỉ IP với thông tin lỗi đăng nhập.
2. Mở tệp và bắt đầu đọc.
3. Nếu đã đọc hết tệp, dừng lại.
4. Phân tích log, nếu IP đã tồn tại trong bản đồ, tăng số lần thất bại đăng nhập; nếu không, thêm một mục mới.
5. Cuối cùng, kiểm tra số lần thử thất bại với ngưỡng đã đặt.

Dưới đây là thuật toán thực hiện các bước trên.

<figure><img src="/files/iFx74Gqawy0AH5eVi8Y2" alt=""><figcaption></figcaption></figure>

Bây giờ hãy viết một hàm main đơn giản. Chương trình sẽ lấy tệp mẫu nhật ký làm đối số.

<figure><img src="/files/R2nTNETvv1s6f80dIWlM" alt=""><figcaption></figcaption></figure>

Để chạy chương trình:

\# go build

\# ./ssh\_brute\_detect sample.log


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://viettaliii.gitbook.io/home/education/window-pe-.net/go-language/brute-force-detection.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
