Trong những tháng gần đây, tôi đã dành thời gian khám phá sâu hơn về mạng, bao gồm việc thiết lập hộp OPNsense và triển khai Proxmox trên một vài máy. Trải nghiệm này thực sự thú vị, và từ góc độ của một người đam mê bảo mật, một số dữ liệu tôi thu thập được trong OPNsense rất đáng chú ý. Thông qua các công cụ như CrowdSec, tôi có thể thấy các trình quét cổng tự động bị chặn, điều này khiến tôi quan tâm nhiều hơn đến mạng gia đình và an ninh mạng nói chung. Chính vì lẽ đó, tôi đã quyết định thiết lập một honeypot SSH để thử tìm hiểu xem những kẻ tấn công này thực sự làm gì khi chúng có quyền truy cập vào một hệ thống, và kết quả thu được thật sự đáng sợ.
Nếu bạn không có đủ kiến thức và kinh nghiệm, tôi không khuyến khích bạn tự thiết lập honeypot của riêng mình, và tuyệt đối không nên thực hiện trên mạng gia đình của bạn. Tôi đã triển khai một máy ảo Ubuntu cơ bản, chạy trên một máy chủ riêng biệt, không chứa bất kỳ dữ liệu nhạy cảm nào khác, và thiết lập một công cụ có tên là Cowrie. Cowrie là một honeypot SSH có khả năng mô phỏng một kết nối SSH thực tế, hoàn chỉnh với các phản hồi cho các lệnh trông có vẻ hợp lệ. Nó cũng có thể chấp nhận các hoạt động truyền tệp, cho phép các chuyên gia bảo mật chặn và phân tích các tập lệnh cũng như các tệp độc hại khác. Chúng ta sẽ cùng xem xét một vài trường hợp này.
Tôi đã sử dụng kho lưu trữ GitHub này để cấu hình Cowrie với cơ sở dữ liệu ElasticSearch (mặc dù tôi cần sửa đổi tập lệnh cài đặt), và điều chỉnh bảng điều khiển Kibana để hiển thị thông tin mà tôi muốn xem. Dữ liệu được trình bày ở đây đặc biệt quan trọng không chỉ vì nó ghi lại các nỗ lực tấn công theo thời gian thực từ những kẻ đang tìm cách tự động xâm nhập vào các dịch vụ tự host được phơi bày ra internet, mà còn cho thấy điều gì có thể xảy ra khi bạn không sử dụng mật khẩu an toàn. Gần như tất cả các nỗ lực này đều sử dụng mật khẩu nằm trong danh sách các mật khẩu phổ biến nhất, nhưng một kẻ tấn công nhắm mục tiêu cụ thể vào bạn cũng có thể cố gắng điều chỉnh các nỗ lực của chúng.
Cowrie: Honeypot SSH Toàn Diện Dưới Sự Kiểm Soát Của Bạn
Mô phỏng kết nối SSH chân thực đến kinh ngạc
Giao diện kết nối SSH thông qua Tailscale
Cowrie là một honeypot SSH và Telnet, được thiết kế để ghi lại mọi tương tác. Nó được viết bằng Python và mô phỏng một hệ thống Unix, mặc dù nó cũng có thể hoạt động như một proxy đến một máy thực nếu bạn muốn. Cowrie hoàn toàn có thể tùy chỉnh, cho phép bạn thay đổi banner đăng nhập, các thông tin đăng nhập được chấp nhận, hệ thống tệp và nhiều thứ khác nữa. Hơn nữa, không chỉ các tương tác được ghi lại, mà các tệp được chuyển giao cũng được lưu trữ cục bộ trên máy để có thể phân tích sau này.
Cowrie có thể chạy trong môi trường container (chẳng hạn như với Podman hoặc Docker), hoặc nó có thể chạy như một ứng dụng thông thường sử dụng Python. Mục đích của nó là người kết nối với honeypot không hề biết rằng đó là một honeypot. Nó phản hồi các lệnh với những phản hồi hợp lý, bao gồm cả các lệnh được thiết kế để in thông tin hệ thống. Như chúng ta sẽ thấy, có rất nhiều lệnh như vậy, và một số hành động được thực hiện bởi những người kết nối với honeypot của tôi đã rất thú vị.
Tôi đã triển khai phiên bản Cowrie của mình vào ngày 23 tháng 4 năm 2025, và tất cả dữ liệu được thảo luận trong bài viết này đã được thu thập kể từ đó. Có tổng cộng 29.282 tương tác duy nhất, với ngày hoạt động mạnh nhất là ngày 1 tháng 5 năm 2025, ghi lại tổng cộng 7.438 tương tác duy nhất. Một “tương tác” được định nghĩa là bất kỳ hành động riêng lẻ nào, chẳng hạn như cố gắng đăng nhập, thực thi lệnh hoặc client ngắt kết nối. Có 447 địa chỉ IP duy nhất được xác định trong tập dữ liệu sau khi lọc địa chỉ IP của chính tôi khi tôi đang thử nghiệm.
Phân Tích Tên Người Dùng và Mật Khẩu Phổ Biến Nhất Bị Tấn Công
Những cái tên quen thuộc
Biểu đồ các tên người dùng phổ biến nhất bị tấn công trên honeypot SSH Cowrie
Đầu tiên và quan trọng nhất, chúng ta sẽ xem xét các tên người dùng và mật khẩu được sử dụng nhiều nhất. Không có gì ngạc nhiên khi “root” là người dùng bị tấn công nhiều nhất, chiếm hơn một phần sáu tổng số nỗ lực. Điều này hợp lý, vì người dùng root là người dùng có đặc quyền cao nhất trên hệ thống dựa trên Linux. Với quyền truy cập root, kẻ tấn công kiểm soát toàn bộ hệ thống của bạn và có thể truy cập mọi tệp hiện có. Đây về cơ bản là “chén thánh”, đó là lý do tại sao nên sử dụng khóa SSH để truy cập từ xa nói chung. Hơn nữa, nếu bạn không cần kích hoạt người dùng root, tốt hơn hết bạn nên vô hiệu hóa hoàn toàn người dùng root và thay vào đó dựa vào các lệnh sudo
để có được các đặc quyền nâng cao đó khi cần từ tài khoản của chính bạn.
Nhìn vào các tên người dùng phổ biến khác, hầu hết chúng không gây ngạc nhiên. “admin” và “user” rất hợp lý, cũng như “support”. Thú vị thay, “ubnt” là tên người dùng mặc định trên hầu hết các sản phẩm của Ubiquiti, và tên người dùng đó là một trong những tên người dùng được thử nhiều nhất trong tập dữ liệu của tôi. “usario” là tiếng Tây Ban Nha của “user”, và “oracle”, “ubuntu”, và “pi” đều khá dễ hiểu. Hầu hết các tên người dùng khác được thử ở đây dường như chủ yếu tấn công các dịch vụ cụ thể, chẳng hạn như “hadoop”, “ec2-user”, và “nginx”. Cuối cùng, cũng có những tham chiếu đến tên tiền mã hóa, cho thấy một số kẻ tấn công có thể đã tìm cách tìm ví tiền mã hóa liên quan đến các hoạt động khai thác.
Thống kê các mật khẩu yếu thường được sử dụng để tấn công honeypot SSH của Cowrie
Tiếp theo là các mật khẩu, và không có mật khẩu nào trong số này gây ngạc nhiên. Đây là những mật khẩu bạn sẽ tìm thấy trên các danh sách mật khẩu phổ biến, ngoài một số mật khẩu cụ thể như “raspberryraspberry993311”. Mật khẩu này dường như được sử dụng bởi một loại sâu (worm), theo một nhà nghiên cứu, sẽ báo cáo cho một máy chủ IRC, thay đổi mật khẩu thành mật khẩu đó, và sau đó quét các thiết bị nạn nhân tiềm năng khác. Một số kẻ tấn công có thể sử dụng mật khẩu này trong các nỗ lực của chúng để giành quyền kiểm soát thiết bị từ một kẻ tấn công khác, trong khi những kẻ triển khai nó có thể sử dụng mật khẩu này như một cách để biết liệu chúng đã từng truy cập vào hệ thống này trong quá khứ hay chưa.
Không có nhiều điều để nói ở đây; những mật khẩu này rất tệ và đại diện cho những nỗ lực đầu tiên của tin tặc khi cố gắng truy cập vào một hệ thống. Nếu bạn đang sử dụng một trong những mật khẩu này (hoặc bất kỳ mật khẩu phổ biến nào khác), bạn nên thay đổi nó ngay lập tức. Đặc biệt đối với quyền truy cập SSH vào máy chủ của bạn, bạn nên sử dụng khóa SSH hoặc, ít nhất, đảm bảo rằng bạn sử dụng một mật khẩu mạnh. Giống như trường hợp nỗ lực mật khẩu “raspberryraspberry993311”, chúng ta cũng có thể nhận được thông tin từ các mật khẩu khác đã được thử. Một mật khẩu, “0l0ctyQh243O63uD”, đã được thử nhiều lần và dường như được sử dụng bởi NoaBot dựa trên Mirai, theo Akamai security.
Các Lệnh Được Thực Thi Nhiều Nhất: Bất Ngờ và Đáng Lo Ngại
Một số phát hiện thú vị
Biểu đồ các lệnh phổ biến nhất được thực thi trên honeypot SSH Cowrie
Không có gì ngạc nhiên khi lệnh được sử dụng phổ biến nhất là “uname -s -v -n -r -m”. Lệnh này in ra tên kernel, phiên bản kernel (ngày build và các thông tin khác), tên máy chủ nút mạng, phiên bản release kernel và tên phần cứng máy. Điều này có thể được sử dụng để xác định một honeypot, nhưng nó cũng được sử dụng để xác định loại phần cứng mà kẻ tấn công đã kết nối nói chung. Nhiều kẻ đã ngắt kết nối ngay sau khi chạy lệnh này, cho thấy rằng đó không phải là thứ chúng đang tìm kiếm.
Điều thú vị là Telegram cũng bị nhắm mục tiêu cụ thể. Cả lệnh “locate D877F783D5D3EF8Cs” và các lệnh liên quan đến Telegram đều có liên quan, trong đó “D877F783D5D3EF8Cs” chứa ID người dùng và khóa mã hóa để liên lạc giữa client Telegram và máy chủ. Các lệnh khác được chạy để lấy thông tin về khả năng của hệ thống, trong khi các lệnh khác được sử dụng để thực thi các tập lệnh và ứng dụng đã được tải xuống. Tất nhiên, những tập lệnh này không thể thực sự được thực thi, vì các tệp đã bị Cowrie chặn và đặt bên ngoài vùng chứa để xem xét sau này.
Hầu hết các lệnh khác thường xuyên xuất hiện đều liên quan đến việc cố gắng thực thi các tệp đó, bao gồm cố gắng cấp quyền thực thi cho chúng và các lệnh “scp -t” để nhận tệp và đặt nó vào thư mục /tmp
.
Đi Sâu Vào Phân Tích Một Mã Độc Thu Được Từ Honeypot
Ghidra – Công cụ lựa chọn hàng đầu của tôi
Phân tích mã độc thu được từ honeypot bằng công cụ Ghidra, hiển thị sơ đồ hàm và mã nguồn
Có tổng cộng 18 mục đã được chuyển đến honeypot của tôi trong suốt thời gian thu thập dữ liệu, với các tệp có kích thước từ 1 KB đến gần 30 MB. Tôi đã xem xét một trong số chúng chỉ để xem cách nó bắt đầu thực thi, vì việc kỹ thuật đảo ngược phần mềm có thể mất nhiều thời gian. Thông thường, tốt nhất là nên phân tích mã độc trong máy ảo, và tôi đang sử dụng Ghidra cho quá trình này. Trong ảnh chụp màn hình ở trên, chúng ta có thể thấy một trong các tệp thu được từ honeypot, được mở trong Ghidra. Ghidra là một công cụ miễn phí và mã nguồn mở, được Cơ quan An ninh Quốc gia Hoa Kỳ phát hành, và được sử dụng để kỹ thuật đảo ngược phần mềm. Điều này, kết hợp với một công cụ khác như radare2, có thể cung cấp cái nhìn sâu sắc hấp dẫn về cách một phần mềm hoạt động.
Trong ảnh chụp màn hình trên, tôi đã theo dõi bản đồ hàm từ điểm vào của ứng dụng (nơi nó bắt đầu thực thi) để hiểu cách dữ liệu luân chuyển trong đó. Đây là một trong những hàm sớm hơn thực sự làm điều gì đó, và dường như là một ứng cử viên tốt để phân tích. Trong phần được đánh dấu, chúng ta có thể thấy rằng đây có thể là một kiểm tra cho một cái gì đó được phân tách bởi các dấu chấm.
cVar1 = *pcVar7;while ((byte)(cVar1 - 0x30U) unaff_EBX = pcVar7 + 1; uVar4 = (int)cVar1 - 0x30; cVar1 = pcVar7[1]; while ((byte)(cVar1 - 0x30U) unaff_EBX = unaff_EBX + 1; uVar4 = cVar1 + -0x30 + uVar4 * 10; cVar1 = *unaff_EBX; } iVar3 = iVar3 + 1; uVar8 = uVar8 if (cVar1 != '.') break; pcVar7 = unaff_EBX + 1; cVar1 = *pcVar7;}
Đoạn mã này đọc ký tự đầu tiên trong cVar1
, được lấy từ tham chiếu con trỏ đến pcVar1
. pcVar1
có thể chứa phiên bản kernel, và chúng ta sẽ tìm hiểu lý do sau. Sau đó, nó kiểm tra xem đó có phải là một chữ số hay không (vì ‘0’ = 0x30), vì vậy vòng lặp này chỉ tiếp tục nếu ký tự là ‘0’-‘9’. Sau đó, nó khởi tạo uVar4
thành giá trị của chữ số hiện tại và chuyển sang ký tự tiếp theo. Vòng lặp while
lồng nhau thứ hai phân tích một số có nhiều chữ số khi nó liên tục nhân giá trị trước đó với 10 và thêm chữ số tiếp theo, xử lý các octet có nhiều chữ số. Sau đó, nó dịch trái giá trị uVar8
hiện có 8 bit và thêm octet mới được phân tích, đưa nó vào một đơn vị duy nhất. Cuối cùng, khi nó đạt đến dấu ‘.’, nó chuyển sang octet tiếp theo, thoát khỏi vòng lặp khi không còn gì nữa.
Phân tích chuyên sâu đoạn mã kiểm tra phiên bản kernel trong Ghidra, một phần của mã độc
Khối mã tiếp theo này khá thú vị, nhưng đây cũng là nơi tôi sẽ dừng phân tích, vì đây là một cái nhìn tổng quan nhanh về những gì bạn có thể làm với một honeypot và dữ liệu bạn thu thập được. Đoạn mã này bắt đầu bằng cách đảo ngược tất cả các bit trong uVar8
, giá trị đã phân tích mà chúng ta đã nói trước đó, và sau đó dịch phải nó 31 bit. Điều này kiểm tra hiệu quả xem giá trị gốc có phải là tất cả 1 (0xFFFFFFFF) hoặc 0 hay không, coi những giá trị đó là các trường hợp đặc biệt. Nếu kết quả của phép dịch là 0, mã sẽ bỏ qua hoàn toàn logic sắp tới và thay vào đó cố gắng đọc phiên bản kernel bằng cách truy cập /proc/sys/kernel/osrelease
. Nếu nó khác 0, nghĩa là đó là một giá trị “bình thường”, nó sẽ vào một vòng lặp sử dụng uVar8
cùng với một giá trị toàn cục được gọi là DAT_080d7e64
. Sau đó, nó tạo ra một giá trị 64 bit từ hai giá trị 32 bit đó (uVar9
), có thể được sử dụng làm trạng thái tổng hợp hoặc định danh duy nhất. Nếu DAT_080d7e64
toàn cục không phải là 0, mã sẽ so sánh hai phần của giá trị 64 bit. Dựa trên đó, nó quyết định có cập nhật giá trị toàn cục với giá trị mới được phân tích hay giữ lại giá trị trước đó.
Sau khi tất cả những điều đó được thực hiện, nó kiểm tra xem giá trị (hoặc một giá trị dẫn xuất từ nó) có nhỏ hơn một ngưỡng cụ thể hay không: 0x20609
. Nếu có, mã sẽ in thông báo “FATAL: kernel too old” và nhảy đến một hàm có lẽ sẽ dừng thực thi. Toàn bộ hàm này dùng để phân tích phiên bản kernel của hệ thống và đưa ra lỗi nếu phiên bản kernel quá cũ. Ngưỡng đó sẽ tương ứng với phiên bản Linux kernel 2.6.9, được phát hành vào năm 2004.
Có Rất Nhiều Nguy Hiểm Trên Internet
Hãy luôn cảnh giác và an toàn
Giao diện bảng điều khiển Kibana hiển thị dữ liệu tổng quan các cuộc tấn công trên honeypot SSH Cowrie
Như bạn có thể thấy xuyên suốt bài viết này, internet là một nơi khá đáng sợ. Có rất nhiều trình quét tự động đang cố gắng tìm nạn nhân, và nhiều trong số chúng đã thành công. Trong trường hợp này, không có thiệt hại nào xảy ra, nhưng trên một máy chủ thực, hậu quả có thể rất thảm khốc. Rõ ràng là những kẻ tấn công này có thể làm bất cứ điều gì một khi chúng có quyền truy cập, từ việc đánh cắp thông tin đăng nhập và ví tiền mã hóa đến việc triển khai phần mềm độc hại nhằm lây lan sang các thiết bị khác.
Như mọi khi, hãy luôn cảnh giác khi nói đến bảo mật. Sử dụng mật khẩu phù hợp, không phơi bày các thiết bị ra internet mà không cần thiết, và tuân thủ các nguyên tắc bảo mật cơ bản khi duyệt web. Đây là một máy chủ mà tôi đã chạy trong hơn một tuần, và kết quả thật đáng sợ nhưng không gây ngạc nhiên. Hãy tưởng tượng vô số thiết bị ngoài kia đã bị xâm nhập mà chủ sở hữu không hề hay biết? Những tập lệnh này được thiết kế để tự ẩn mình, vì vậy trong trường hợp của tôi, nếu máy chủ của tôi đã bị xâm nhập, tôi sẽ phải chủ động tìm kiếm nó để phát hiện ra.
Hãy chia sẻ kinh nghiệm hoặc câu hỏi của bạn về an ninh mạng trong phần bình luận bên dưới!