Trong bối cảnh công nghệ phát triển không ngừng, việc tự quản lý và bảo mật các dịch vụ mạng tại gia hay máy chủ cá nhân (self-hosted) ngày càng trở nên phổ biến. Với kinh nghiệm gần đây trong việc thiết lập hệ thống mạng với OPNsense và triển khai Proxmox trên các máy chủ, chúng tôi tại congnghemoi.net đã có cái nhìn sâu sắc về những mối đe dọa tiềm ẩn. Các công cụ như CrowdSec trên OPNsense đã giúp chúng tôi nhận diện và chặn hàng loạt các cuộc quét cổng tự động, khơi dậy sự tò mò về hoạt động của những kẻ tấn công mạng. Từ đó, ý tưởng thiết lập một SSH honeypot đã ra đời, với mục tiêu ghi lại những gì xảy ra khi kẻ xấu cố gắng truy cập trái phép vào một hệ thống. Những gì chúng tôi phát hiện thực sự đáng báo động và cho thấy tầm quan trọng của việc củng cố an ninh mạng.
Chúng tôi nhấn mạnh rằng việc thiết lập honeypot đòi hỏi kiến thức chuyên sâu và không nên thực hiện trên mạng gia đình của bạn. congnghemoi.net đã triển khai một máy ảo Ubuntu tối giản 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à cài đặt công cụ Cowrie. Cowrie là một SSH honeypot tiên tiến có khả năng mô phỏng một kết nối SSH thực, hoàn chỉnh với các phản hồi lệnh trông có vẻ hợp lệ. Nó cũng có thể chấp nhận các hoạt động chuyển file, cho phép các chuyên gia bảo mật như chúng tôi chặn và phân tích các script hoặc tệp tin độc hại. Trong bài viết này, chúng tôi sẽ đi sâu vào những dữ liệu đáng sợ mà Cowrie đã thu thập được, đồng thời phân tích các hành vi của kẻ tấn công và đưa ra các khuyến nghị bảo mật thiết thực.
Chúng 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ù cần điều chỉnh script thiết lập để phù hợp). Bảng điều khiển Kibana cũng được tùy chỉnh để hiển thị thông tin cụ thể mà chúng tôi muốn phân tích. Dữ liệu được trình bày ở đây không chỉ quan trọng vì nó ghi lại các nỗ lực tấn công tự động nhằm vào các dịch vụ tự lưu trữ được phơi bày ra internet, mà còn hé lộ hậu quả của việc sử dụng mật khẩu không an toàn. Hầu hết các nỗ lực này đều sử dụng những mật khẩu nằm trong danh sách các mật khẩu phổ biến nhất, nhưng cũng có những trường hợp kẻ tấn công cố gắng điều chỉnh các phương pháp của họ để nhắm mục tiêu cụ thể hơn.
SSH Honeypot Cowrie: Công cụ Mạnh mẽ trong Tầm Kiểm soát Của Bạn
Mô Phỏng Kết nối SSH Chân Thực
Cowrie là một honeypot chuyên dụng cho SSH và Telnet, được thiết kế để ghi lại mọi tương tác. Được viết bằng Python, nó mô phỏng một hệ thống Unix đầy đủ, nhưng cũng có thể hoạt động như một proxy cho một máy chủ thật 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ấu hình các tài khoản được chấp nhận, hệ thống tệp tin, và nhiều yếu tố khác. Hơn nữa, không chỉ các tương tác được ghi lại mà các tệp tin được chuyển qua honeypot cũng được lưu trữ cục bộ để có thể phân tích sau này.
Cowrie có thể được chạy trong môi trường container (như với Podman hoặc Docker) hoặc dưới dạng một ứng dụng Python thông thường. Mục đích cốt lõi của Cowrie là khiến kẻ tấn công không thể nhận ra rằng họ đang tương tác với một honeypot. Nó phản hồi các lệnh một cách 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, rất nhiều lệnh dạng này đã được thực thi, và một số hành động của những kẻ kết nối vào honeypot của chúng tôi thực sự rất thú vị.
congnghemoi.net đã 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 đều được thu thập từ thời điểm đó. Chúng tôi ghi nhận 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, với tổng số 7.438 tương tác riêng lẻ. Một “tương tác” được định nghĩa là bất kỳ hành động nào, chẳng hạn như một nỗ lực đăng nhập, một lệnh được thực thi, hoặc việc client ngắt kết nối. Sau khi lọc bỏ địa chỉ IP của chính chúng tôi trong quá trình thử nghiệm, có 447 địa chỉ IP duy nhất được xác định trong tập dữ liệu.
Sử dụng Tailscale để kết nối SSH từ xa an toàn và bảo mật.
Phân tích Danh sách Username và Mật khẩu Bị Tấn công Nhiều nhất
Những Mục tiêu Quen Thuộc
Trước hết, chúng ta hãy xem xét các tên người dùng (usernames) và mật khẩu được sử dụng nhiều nhất trong các cuộc tấn công. Không ngạc nhiên, “root” là tên người dùng được cố gắng truy cập nhiều nhất, chiếm hơn một phần sáu tổng số nỗ lực. Điều này hoàn toàn hợp lý, vì người dùng root là người dùng có đặc quyền cao nhất trên một hệ thống dựa trên Linux. Với quyền truy cập root, kẻ tấn công có thể kiểm soát toàn bộ hệ thống của bạn và truy cập mọi tệp tin. Đây về cơ bản là “chén thánh” của kẻ tấn công, đó là lý do tại sao chúng tôi khuyến nghị nên sử dụng khóa SSH (SSH keys) để truy cập từ xa. Hơn nữa, nếu bạn không cần người dùng root được kích hoạt, tốt nhất là 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 người dùng thông thường của 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 đều không gây ngạc nhiên. “admin” và “user” rất phổ biến, tương tự như “support”. Thú vị là, “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 này là một trong những tên được thử nhiều nhất trong tập dữ liệu của chúng tôi. “usario” trong tiếng Tây Ban Nha có nghĩa là “người dùng”, và “oracle”, “ubuntu”, “pi” đều khá dễ hiểu. Hầu hết các tên người dùng khác xuất hiện ở đâ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 điện tử, cho thấy một số kẻ tấn công có thể đang tìm kiếm các ví tiền điện tử liên quan đến hoạt động khai thác (mining).
Biểu đồ thống kê các tên người dùng (usernames) bị tấn công nhiều nhất trên SSH Honeypot Cowrie, cho thấy mục tiêu phổ biến của kẻ xấu.
Những Mật khẩu Dễ Đoán và Mối Nguy Tiềm Ẩn
Tiếp theo là phần mật khẩu, và không có mật khẩu nào trong số này quá bất ngờ. Đây là những mật khẩu bạn sẽ tìm thấy trong các danh sách mật khẩu phổ biến, ngoại trừ 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, nó sẽ báo cáo về 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 họ để giành quyền kiểm soát mộ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 trước đây hay chưa.
Không có nhiều điều để nói thêm ở đây; những mật khẩu này cực kỳ 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, phức tạp và duy nhất. Giống như trường hợp nỗ lực với mật khẩu “raspberryraspberry993311”, chúng ta có thể thu thập 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 nhóm nghiên cứu bảo mật Akamai.
Thống kê các mật khẩu (passwords) phổ biến được sử dụng trong các cuộc tấn công SSH vào Honeypot, phản ánh điểm yếu bảo mật.
Các Lệnh Thường Được Thực Thi trên Honeypot
Điều Bất Ngờ Đằng Sau các Lệnh Đơn Giản
Không ngạc nhiên, lệnh được sử dụng phổ biến nhất là “uname -s -v -n -r -m”. Lệnh này in tên kernel, phiên bản kernel (ngày xây dựng và các thông tin khác), tên máy chủ nút mạng, phiên bản phát hành kernel và tên phần cứng máy. Lệnh này có thể được sử dụng để xác định một honeypot, nhưng nó cũng được dùng để xác định loại phần cứng mà kẻ tấn công đã kết nối tới nói chung. Nhiều kẻ tấn công đã ngắt kết nối ngay sau khi chạy lệnh này, cho thấy nó không phải là thứ họ đang tìm kiếm.
Thú vị là, Telegram cũng là 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à các 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 một số khác được sử dụng để thực thi các script và ứng dụng đã được tải xuống. Đương nhiên, những tệp này không thể thực sự được thực thi, vì chúng đã bị Cowrie chặn và đặt bên ngoài vùng chứa (container) để 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 nỗ lực 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 một tệp và đặt nó vào thư mục /tmp.
Biểu đồ các lệnh phổ biến mà kẻ tấn công cố gắng thực thi trên SSH Honeypot, tiết lộ ý định thu thập thông tin hệ thống.
Khám Phá Sâu Hơn Một Tệp Tin Độc Hại Thu Được
Phân tích Mã Độc bằng Ghidra
Tổng cộng có 18 tệp tin đã được chuyển đến honeypot của chúng tôi trong suốt thời gian thu thập dữ liệu, với kích thước tệp dao động từ 1 KB đến gần 30 MB. Chúng tôi đã xem xét một trong số chúng để tìm hiểu cách thức bắt đầu thực thi, vì việc dịch ngược phần mềm có thể mất rất nhiều thời gian. Thông thường, tốt nhất là phân tích mã độc trong máy ảo, và chúng tôi đang sử dụng Ghidra cho quá trình này. Trong ảnh chụp màn hình bên dưới, 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ở, do Cơ quan An ninh Quốc gia Hoa Kỳ (NSA) phát hành, được sử dụng để dịch ngược phần mềm. Công cụ này, kết hợp với một công cụ khác như radare2, có thể mang lại 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, chúng 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 nhất 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ó khả năng là một kiểm tra cho một cái gì đó được phân tách bằng 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 chuyển giá trị uVar8
hiện có sang trái 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 một ‘.’, nó chuyển sang octet tiếp theo, ngắt vòng lặp khi không còn gì nữa.
Phân tích mã độc hại thu thập từ SSH Honeypot bằng công cụ Ghidra, hiển thị luồng dữ liệu của chương trình để hiểu cách thức hoạt động.
Khối mã tiếp theo này khá thú vị, nhưng đây sẽ là nơi chúng tôi dừng lại trong phân tích này, 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 tất cả các bit trong uVar8
, giá trị đã phân tích mà chúng ta đã nói ở trên, và sau đó dịch phải nó 31 bit. Điều này kiểm tra xem giá trị gốc có phải là tất cả 1s (0xFFFFFFFF) hoặc 0 hay không, xử lý các giá trị đó như các trường hợp đặc biệt. Nếu kết quả dịch chuyển là 0, đoạn mã sẽ bỏ qua logic sắp tới hoàn toàn 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à nó 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 một giá trị 64 bit từ hai giá trị 32 bit đó (uVar9
), có thể để sử dụng làm trạng thái ghép hoặc định danh duy nhất. Nếu DAT_080d7e64
toàn cục khác 0, đoạn 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ữ giá trị trước đó.
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ị phái sinh từ nó) có nhỏ hơn một ngưỡng cụ thể hay không: 0x20609
. Nếu có, đoạn 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 phục vụ để phân tích phiên bản kernel của hệ thống và đưa ra lỗi nếu nó quá cũ. Ngưỡng đó tương ứng với phiên bản Linux kernel 2.6.9, được phát hành vào năm 2004.
Mã nguồn được dịch ngược trong Ghidra, hiển thị logic kiểm tra phiên bản kernel của hệ thống mục tiêu, tiết lộ yêu cầu về môi trường hoạt động của mã độc.
Những Hiểm Nguy Rình Rập trên Internet và Các Biện pháp Bảo vệ
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 công cụ quét tự động đang cố gắng tìm kiếm nạn nhân, và nhiều trong số chúng đã thành công trong việc tìm ra chúng. Trong trường hợp của honeypot, không có thiệt hại nào xảy ra, nhưng trên một máy chủ thực sự, hậu quả có thể là 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ừ đánh cắp thông tin đăng nhập và ví tiền điện tử đến triển khai mã độc hại cố gắng lây lan sang các thiết bị khác.
Bảng điều khiển Kibana hiển thị dữ liệu tổng hợp từ SSH Honeypot Cowrie về các hoạt động tấn công mạng, minh họa mức độ phổ biến của các cuộc tấn công tự động.
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 và mạnh, không phơi bày các thiết bị ra internet nếu không cần thiết, và tuân thủ các nguyên tắc bảo mật thông thường khi duyệt web. Đây chỉ là một máy chủ mà chúng tôi đã chạy trong hơn một tuần, và kết quả thật đáng sợ nếu 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 phạm mà chủ sở hữu không hề hay biết? Những script độc hại này được thiết kế để tự ẩn mình, vì vậy trong trường hợp máy chủ của chúng tôi đã bị xâm phạm, chúng tôi sẽ cần phải chủ động tìm kiếm nó để phát hiện ra.
Chúng tôi hy vọng bài viết này đã mang lại cho bạn cái nhìn sâu sắc về những mối đe dọa thực tế trên internet và tầm quan trọng của việc bảo vệ hệ thống của bạn. Hãy chia sẻ kinh nghiệm của bạn về việc bảo mật hệ thống self-hosted hoặc các câu hỏi về an ninh mạng trong phần bình luận bên dưới. Để tìm hiểu thêm về các giải pháp bảo mật và mẹo giữ an toàn trực tuyến, hãy tiếp tục theo dõi congnghemoi.net!