Hướng Toàn Diện Về Shodan Trên ITPRO
Biên soạn bởi ITPRO , vui lòng ghi rõ nguồn khi sao chép.
Giới thiệu
Shodan là một công cụ tìm kiếm cho các thiết bị được kết nối Internet. Các công cụ tìm kiếm web như Google và Bing rất tuyệt vời để tìm kiếm các trang web. Nhưng nếu bạn quan tâm đến việc tìm các máy tính đang chạy một phần mềm nhất định (như Apache)? Hoặc nếu bạn muốn biết phiên bản Microsoft IIS nào phổ biến nhất? Hoặc bạn muốn xem có bao nhiêu máy chủ FTP ẩn danh? Có thể một lỗ hổng mới xuất hiện và bạn muốn xem có bao nhiêu máy chủ có thể bị nhiễm? Các công cụ tìm kiếm web truyền thống không cho phép bạn trả lời những câu hỏi đó.
Tất cả về dữ liệu
Banner Đơn vị dữ liệu cơ bản mà Shodan thu thập là banner. Banner là thông tin văn bản mô tả một dịch vụ trên thiết bị. Đối với máy chủ web, đây sẽ là các tiêu đề được trả về hoặc đối với Telnet, đó sẽ là màn hình đăng nhập.
Nội dung của banner thay đổi rất nhiều tùy thuộc vào loại dịch vụ. Ví dụ, đây là một banner HTTP điển hình:
HTTP/1.1 200 OK Server: nginx/1.1.19 Date: Sat, 03 Oct 2015 06:09:24 GMT Content-Type: text/html; charset=utf-8 Content-Length: 6466 Connection: keep-alive
Banner trên cho thấy thiết bị đang chạy phần mềm máy chủ web nginx với phiên bản 1.1.19. Để minh họa sự khác biệt của các banner, dưới đây là một banner cho giao thức hệ thống điều khiển công nghiệp Siemens S7:
Copyright: Original Siemens Equipment PLC name: S7_Turbine Module type: CPU 313C Unknown (129): Boot Loader A Module: 6ES7 313-5BG04-0AB0 v.0.3 Basic Firmware: v.3.3.8 Module name: CPU 313C Serial number of module: S Q-D9U083642013 Plant identification: Basic Hardware: 6ES7 313-5BG04-0AB0 v.0.3
Giao thức Siemens S7 trả về một banner hoàn toàn khác, lần này cung cấp thông tin về firmware, số sêri và rất nhiều dữ liệu chi tiết để mô tả thiết bị.
Bạn phải quyết định loại dịch vụ bạn quan tâm khi tìm kiếm trong Shodan vì các banner khác nhau rất nhiều.
Lưu ý: Shodan cho phép bạn tìm kiếm banner – không phải máy chủ. Điều này có nghĩa là nếu một IP duy nhất hiển thị nhiều dịch vụ, chúng sẽ được biểu diễn dưới dạng các kết quả riêng biệt.
Metadata của thiết bị Ngoài banner, Shodan cũng thu thập metadata về thiết bị như vị trí địa lý, tên máy chủ, hệ điều hành và hơn thế nữa (xem Phụ lục A). Hầu hết các metadata có thể tìm kiếm được thông qua trang web chính của Shodan, tuy nhiên một số trường chỉ có sẵn cho người dùng API nhà phát triển.

IPv6 Kể từ tháng 10 năm 2015, Shodan thu thập hàng triệu banner mỗi tháng cho các thiết bị có thể truy cập được trên IPv6. Những con số đó vẫn còn nhỏ so với hàng trăm triệu banner được thu thập cho IPv4 nhưng dự kiến sẽ tăng lên trong những năm tới.
SSL chuyên sâu
SSL đang trở nên ngày càng quan trọng trong việc phục vụ và tiêu thụ nội dung trên Internet, vì vậy Shodan mở rộng thông tin mà nó thu thập cho mọi dịch vụ hỗ trợ SSL. Các banner cho các dịch vụ SSL, chẳng hạn như HTTPS, không chỉ bao gồm chứng chỉ SSL mà còn nhiều hơn thế. Tất cả thông tin SSL được thu thập được thảo luận dưới đây được lưu trữ trong thuộc tính ssl trên banner (xem Phụ lục A và Phụ lục E).
Kiểm tra lỗ hổng
Heartbleed
Nếu dịch vụ dễ bị tấn công bởi Heartbleed thì banner chứa 2 thuộc tính bổ sung. opts.heartbleed chứa phản hồi thô từ việc chạy thử nghiệm Heartbleed đối với dịch vụ. Lưu ý rằng để kiểm tra, các trình thu thập chỉ lấy một tràn nhỏ để xác nhận dịch vụ bị ảnh hưởng bởi Heartbleed nhưng không lấy đủ dữ liệu để rò rỉ khóa riêng. Các trình thu thập cũng thêm CVE-2014-0160 vào danh sách opts.vulns nếu thiết bị dễ bị tổn thương. Tuy nhiên, nếu thiết bị không dễ bị tổn thương thì nó thêm “!CVE-2014-0160”. Nếu một mục trong opts.vulns có tiền tố là ! hoặc – thì dịch vụ không dễ bị tổn thương với CVE đã cho.
{
“opts”: {
“heartbleed”: “… 174.142.92.126:8443 – VULNERABLE\n”,
“vulns”: [“CVE-2014-0160”]
}
}
Shodan cũng hỗ trợ tìm kiếm theo thông tin lỗ hổng. Ví dụ, để tìm kiếm các thiết bị ở Hoa Kỳ bị ảnh hưởng bởi Heartbleed, hãy sử dụng:
country:US vuln:CVE-2014-0160
FREAK
Nếu dịch vụ hỗ trợ mã hóa EXPORT thì các trình thu thập thêm mục “CVE-2015-0204” vào thuộc tính opts.vulns:
“opts”: {
“vulns”: [“CVE-2015-0204”]
}
Logjam
Các trình thu thập cố gắng kết nối với dịch vụ SSL bằng cách sử dụng các mã hóa Diffie-Hellman ngắn hạn và nếu kết nối thành công, thông tin sau được lưu trữ:
“dhparams”: {
“prime”: “bbbc2dcad84674907c43fcf580e9…”,
“public_key”: “49858e1f32aefe4af39b28f51c…”,
“bits”: 1024,
“generator”: 2,
“fingerprint”: “nginx/Hardcoded 1024-bit prime”
}
Phiên bản
Thông thường, khi một trình duyệt kết nối với dịch vụ SSL, nó sẽ thương lượng phiên bản SSL và mã hóa sẽ được sử dụng với máy chủ. Sau đó, họ sẽ thỏa thuận về một phiên bản SSL nhất định, chẳng hạn như TLSv1.2, và sau đó sử dụng phiên bản đó cho giao tiếp.

Các trình thu thập của Shodan bắt đầu kiểm tra SSL bằng cách thực hiện yêu cầu bình thường như đã nêu ở trên, nơi họ thương lượng với máy chủ. Tuy nhiên, sau đó họ cũng cố gắng kết nối với máy chủ bằng cách sử dụng một phiên bản SSL cụ thể. Nói cách khác, các trình thu thập cố gắng kết nối với máy chủ bằng cách sử dụng SSLv2, SSLv3, TLSv1.0, TLSv1.1 và TLSv1.2 một cách rõ ràng để xác định tất cả các phiên bản mà dịch vụ SSL hỗ trợ. Thông tin thu thập được có sẵn trong trường ssl.versions:
{
“ssl”: {
“versions”: [“TLSv1”, “SSLv3”, “-SSLv2”, “-TLSv1.1”, “-TLSv1.2”]
}
}
Nếu phiên bản có dấu – (gạch ngang) ở trước phiên bản, thì thiết bị không hỗ trợ phiên bản SSL đó. Nếu phiên bản không bắt đầu bằng -, thì dịch vụ hỗ trợ phiên bản SSL đã cho. Ví dụ, máy chủ trên hỗ trợ:
TLSv1
SSLv3
Và nó từ chối các phiên bản:
SSLv2
TLSv1.1
TLSv1.2
Thông tin phiên bản cũng có thể được tìm kiếm qua trang web/API. Ví dụ, truy vấn tìm kiếm sau sẽ trả về tất cả các dịch vụ SSL (HTTPS, POP3 với SSL, v.v.) cho phép kết nối bằng SSLv2:
ssl.version:sslv2
Theo dõi chuỗi
Chuỗi chứng chỉ là danh sách các chứng chỉ SSL từ gốc đến người dùng cuối. Banner cho các dịch vụ SSL bao gồm thuộc tính ssl.chain chứa tất cả các chứng chỉ SSL của chuỗi trong các chứng chỉ được tuần tự hóa PEM.
Thu thập dữ liệu
Tần suất
Các trình thu thập của Shodan làm việc 24/7 và cập nhật cơ sở dữ liệu theo thời gian thực. Bất cứ lúc nào bạn truy vấn trang web Shodan, bạn đều nhận được bức tranh mới nhất về Internet.
Phân tán
Các trình thu thập có mặt ở các quốc gia trên khắp thế giới, bao gồm:
- Hoa Kỳ (Bờ Đông và Bờ Tây)
- Trung Quốc
- Iceland
- Pháp
- Đài Loan
- Việt Nam
- Romania
- Cộng hòa Séc
Dữ liệu được thu thập từ khắp nơi trên thế giới để ngăn chặn thiên vị địa lý. Ví dụ, nhiều quản trị viên hệ thống ở Hoa Kỳ chặn toàn bộ dải IP của Trung Quốc. Việc phân tán các trình thu thập của Shodan trên toàn cầu đảm bảo rằng bất kỳ sự chặn nào trên phạm vi cả nước cũng sẽ không ảnh hưởng đến việc thu thập dữ liệu.
Ngẫu nhiên
Thuật toán cơ bản cho các trình thu thập là:
- Tạo một địa chỉ IPv4 ngẫu nhiên
- Tạo một cổng ngẫu nhiên để kiểm tra từ danh sách các cổng mà Shodan hiểu
- Kiểm tra địa chỉ IPv4 ngẫu nhiên trên cổng ngẫu nhiên và lấy banner
- Quay lại bước 1
Điều này có nghĩa là các trình thu thập không quét các dải mạng theo thứ tự tăng dần. Việc thu thập được thực hiện hoàn toàn ngẫu nhiên để đảm bảo phạm vi bao phủ đồng đều trên Internet và ngăn chặn sự thiên vị trong dữ liệu tại bất kỳ thời điểm nào.
Giao diện web
Cách dễ nhất để truy cập dữ liệu mà Shodan thu thập là thông qua các giao diện web. Hầu hết chúng đều cho phép bạn nhập truy vấn tìm kiếm, vì vậy hãy thảo luận về điều đó trước:
Giải thích truy vấn tìm kiếm
Theo mặc định, truy vấn tìm kiếm chỉ xem xét văn bản banner chính và không tìm kiếm metadata. Ví dụ, nếu bạn đang tìm kiếm “Google” thì kết quả sẽ chỉ bao gồm kết quả trong đó văn bản “Google” được hiển thị trong banner; nó không nhất thiết trả về kết quả cho dải mạng của Google.
[Hình ảnh Shodan tìm kiếm “Google”]
Như đã thấy ở trên, một tìm kiếm cho “Google” trả về rất nhiều Google Search Appliances mà các tổ chức đã mua và kết nối với Internet; nó không trả về máy chủ của Google.
Shodan sẽ cố gắng tìm kết quả phù hợp với tất cả các thuật ngữ tìm kiếm, điều này có nghĩa là ngầm hiểu có một + hoặc AND giữa mỗi thuật ngữ tìm kiếm. Ví dụ, các truy vấn tìm kiếm “apache + 1.3” tương đương với “apache 1.3”.
Để tìm kiếm metadata, bạn cần sử dụng bộ lọc tìm kiếm.
Giới thiệu bộ lọc
Bộ lọc là các từ khóa đặc biệt mà Shodan sử dụng để cho phép bạn thu hẹp kết quả tìm kiếm dựa trên metadata của dịch vụ hoặc thiết bị. Định dạng để nhập bộ lọc là:
filtername:value
Quan trọng: Không có khoảng trắng giữa dấu hai chấm “:” và giá trị.
Để sử dụng giá trị chứa khoảng trắng với bộ lọc, bạn phải bọc giá trị trong dấu ngoặc kép. Ví dụ, để tìm tất cả các thiết bị trên Internet được đặt ở San Diego, bạn sẽ tìm kiếm:
city:”San Diego”
Một số bộ lọc cho phép bạn chỉ định nhiều giá trị được phân tách bằng dấu phẩy “,”. Ví dụ, để tìm các thiết bị đang chạy Telnet trên các cổng 23 và 1023:
port:23,1023
Nếu bộ lọc không cho phép dấu phẩy trong giá trị của nó (ví dụ: port, hostname, net) thì nó cho phép bạn cung cấp nhiều giá trị. Bộ lọc cũng có thể được sử dụng để loại trừ kết quả bằng cách thêm dấu trừ “-” vào trước bộ lọc. Ví dụ, sau đây sẽ trả về tất cả các thiết bị không nằm ở San Diego:
-city:”San Diego”
Shodan hỗ trợ rất nhiều bộ lọc, một vài bộ lọc phổ biến là:
| Tên bộ lọc | Mô tả | Ví dụ |
|---|---|---|
| category | Các danh mục có sẵn: ics, malware | |
| city | Tên thành phố | |
| country | Tên đầy đủ của quốc gia | |
| net | Chỉ hiển thị kết quả trong dải IP đã cung cấp ở định dạng CIDR | net:190.30.40.0/24 |
| org | Thu hẹp kết quả dựa trên tổ chức sở hữu IP | org:”Verizon Wireless” |
Xem Phụ lục B để biết danh sách đầy đủ các bộ lọc tìm kiếm có sẵn.
Công cụ tìm kiếm Shodan
Giao diện chính để truy cập dữ liệu được thu thập bởi Shodan là thông qua công cụ tìm kiếm của nó tại https://www.shodan.io
Theo mặc định, truy vấn tìm kiếm sẽ xem xét dữ liệu được thu thập trong 30 ngày qua. Đây là một thay đổi so với trang web cũ tại shodanhq.com, nơi mặc định tìm kiếm toàn bộ cơ sở dữ liệu Shodan. Điều này có nghĩa là các kết quả bạn nhận được từ trang web là gần đây và cung cấp một cái nhìn chính xác về Internet tại thời điểm đó.
Ngoài tìm kiếm, trang web còn cung cấp các chức năng sau:
Tải xuống dữ liệu
Sau khi hoàn thành tìm kiếm, sẽ có một nút ở phía trên có tên Tải xuống dữ liệu. Nhấp vào nút đó sẽ cung cấp cho bạn tùy chọn tải xuống kết quả tìm kiếm ở các định dạng JSON, CSV hoặc XML.
Định dạng JSON tạo ra một tệp trong đó mỗi dòng chứa banner đầy đủ và tất cả metadata kèm theo mà Shodan thu thập. Đây là định dạng ưa thích vì nó lưu tất cả thông tin có sẵn. Và định dạng này tương thích với ứng dụng khách dòng lệnh Shodan, nghĩa là bạn có thể tải dữ liệu từ trang web Shodan rồi xử lý thêm bằng terminal.
Định dạng CSV trả về một tệp chứa IP, cổng, banner, tổ chức và tên máy chủ cho banner. Nó không chứa tất cả thông tin mà Shodan thu thập do giới hạn của định dạng tệp CSV. Sử dụng định dạng này nếu bạn chỉ quan tâm đến thông tin cơ bản của kết quả và muốn nhanh chóng tải nó vào các công cụ bên ngoài như Excel.
Định dạng XML là cách cũ, không được khuyến khích để lưu kết quả tìm kiếm. Nó khó làm việc hơn JSON và chiếm nhiều dung lượng hơn, do đó làm cho nó không tối ưu cho hầu hết các tình huống.
Việc tải xuống dữ liệu tiêu tốn tín dụng xuất, được mua một lần và được mua trên trang web. Chúng không liên kết theo bất kỳ cách nào với API Shodan và chúng không tự động gia hạn hàng tháng. 1 tín dụng xuất có thể được sử dụng để tải xuống tối đa 10.000 kết quả.
Các tệp dữ liệu được tạo bởi trang web có thể được truy xuất trong phần Tải xuống của trang web, bạn có thể truy cập bằng cách nhấp vào nút ở góc trên bên phải.
Tạo báo cáo
Trang web cho phép bạn tạo báo cáo dựa trên truy vấn tìm kiếm. Báo cáo chứa các biểu đồ/đồ thị cung cấp cho bạn cái nhìn tổng quan về cách phân phối kết quả trên Internet. Tính năng này miễn phí và có sẵn cho bất kỳ ai.
Khi bạn tạo báo cáo, bạn đang yêu cầu Shodan chụp nhanh kết quả tìm kiếm và cung cấp tổng quan tổng hợp. Khi báo cáo đã được tạo, nó không thay đổi hoặc tự động cập nhật khi dữ liệu mới được Shodan thu thập. Điều này cũng có nghĩa là bạn có thể tạo báo cáo một lần một tháng và theo dõi các thay đổi theo thời gian bằng cách so sánh với các báo cáo của những tháng trước. Bằng cách nhấp vào nút ở góc trên bên phải, bạn có thể xem danh sách các báo cáo đã tạo trước đó.
Truy vấn tìm kiếm được chia sẻ
Việc tìm kiếm các thiết bị cụ thể đòi hỏi kiến thức về phần mềm chúng chạy và cách chúng phản hồi với việc lấy banner qua Internet. May mắn thay, có thể tận dụng kiến thức chung của cộng đồng bằng cách sử dụng thư mục tìm kiếm trên Shodan. Mọi người có thể dễ dàng mô tả, gắn thẻ và chia sẻ các truy vấn tìm kiếm của họ để người khác sử dụng. Nếu bạn quan tâm đến việc bắt đầu với Shodan, các tìm kiếm được chia sẻ nên là điểm dừng đầu tiên của bạn.
Cảnh báo: Các truy vấn tìm kiếm được chia sẻ có thể xem được công khai. Không chia sẻ các truy vấn nhạy cảm hoặc bạn không muốn người khác biết.
Ví dụ: Tìm các dịch vụ không mặc định
Một phản ứng phổ biến mà tôi nhận được khi nói về các thiết bị bị lộ trên Internet là điều gì đó như sau:
[Hình ảnh minh họa phản ứng]
Cụ thể, ý tưởng là việc chạy dịch vụ (trong trường hợp này là Minecraft) trên một cổng không chuẩn là cách tốt để ẩn mình. Trong các vòng tròn bảo mật, điều này còn được gọi là khái niệm bảo mật bằng cách che giấu, và nó được coi là một ý tưởng không hiệu quả, lỗi thời. Điều tồi tệ hơn là nó có thể tạo cho bạn – chủ sở hữu máy chủ/thiết bị – một cảm giác an toàn giả tạo. Ví dụ, hãy xem xét những người đang chạy OpenSSH trên một cổng không chuẩn. Để làm điều này, chúng ta sẽ sử dụng truy vấn tìm kiếm sau:
product:openssh -port:22
Bộ lọc product được sử dụng để chỉ hiển thị các máy chủ OpenSSH trong khi -port:22 nói với Shodan loại bỏ tất cả các kết quả được thu thập từ cổng SSH tiêu chuẩn (22). Để có cái nhìn tổng quan hơn về kết quả tìm kiếm, hãy tạo một báo cáo:
[Hình ảnh báo cáo]
Báo cáo cũng cung cấp cho chúng ta một bảng phân tích các cổng không chuẩn phổ biến nhất:
- 2222: 323,930
- 5000: 47,439
- 23: 13,482
- 26: 7,569
- 5555: 6,856
- 9999: 6,286
- 82: 6,046
- 2323: 3,622
- 6666: 2,735
- 3333: 2,644
Những con số này không có vẻ ngẫu nhiên cho lắm… Ngay lập tức bạn nên nhận ra rằng lựa chọn cổng không chuẩn của bạn có thể không quá độc đáo. Cổng 2222 phổ biến giống như HTTP trên cổng 8080 phổ biến vậy, và nó cũng là cổng mặc định cho honeypot Kippo mặc dù tôi nghi ngờ rằng nhiều người đang chạy honeypot. Cổng phổ biến tiếp theo là 5000, không tuân theo cùng một mô hình như các cổng khác đối với tôi (số lặp lại/đối xứng). Và đó cũng là lúc tôi nhận ra rằng Australia là quốc gia phổ biến thứ 2 để chạy OpenSSH trên một cổng không chuẩn. Tôi quyết định xem xét kỹ hơn về Australia, và hóa ra có gần như cùng số lượng máy chủ chạy OpenSSH trên cổng 5000 như trên cổng mặc định 22. Khoảng 68.000 thiết bị đang chạy trên cổng mặc định, và 54.000 trên cổng 5000. Nhìn vào một vài banner, chúng ta có thể xác định rằng đây là dấu vân tay SSH mà tất cả chúng đều chia sẻ:
5b:a2:5a:9a:91:28:60:9c:92:2b:9e:bb:7f:7c:2e:06
Có vẻ như ISP BigPond của Úc cài đặt/cấu hình thiết bị mạng không chỉ chạy OpenSSH trên cổng 5000 (rất có thể để quản lý từ xa) mà còn có cùng khóa SSH được cài đặt trên tất cả chúng. Các thiết bị cũng chạy một phiên bản cũ của OpenSSH được phát hành vào ngày 4 tháng 9 năm 2007. Không có gì đảm bảo rằng việc chạy OpenSSH trên cổng mặc định sẽ khiến họ quan tâm đến bảo mật hơn, nhưng việc cài đặt ~54.000 thiết bị của họ chiếm 25% tổng số máy chủ OpenSSH trên Internet chạy phiên bản 4.7 (ghi chú: phiên bản phổ biến nhất của OpenSSH là 5.3).
Bản đồ Shodan
Bản đồ Shodan cung cấp cách để khám phá kết quả tìm kiếm trực quan thay vì dựa trên văn bản như trang web chính. Nó hiển thị tối đa 1.000 kết quả cùng một lúc và khi bạn phóng to/thu nhỏ, Bản đồ điều chỉnh truy vấn tìm kiếm để chỉ hiển thị kết quả cho khu vực bạn đang xem.
Tất cả các bộ lọc tìm kiếm hoạt động cho trang web chính của Shodan cũng hoạt động trên Bản đồ.
Kiểu bản đồ
Có nhiều kiểu bản đồ khác nhau để trình bày dữ liệu theo sở thích của bạn. Nhấp vào nút bánh răng bên cạnh nút tìm kiếm để xem danh sách các tùy chọn.
Vệ tinh
Vệ tinh không có nhãn
Đường phố (Sáng)
Đường phố (Tối)
Đường phố (Xanh lá)
Đường phố (Đỏ)
Cướp biển
[Hình ảnh minh họa cho mỗi kiểu bản đồ]
Lỗ hổng với Shodan
Shodan Exploits thu thập các lỗ hổng và khai thác từ CVE, Exploit DB và Metasploit để có thể tìm kiếm được thông qua giao diện web.
Các bộ lọc tìm kiếm có sẵn cho Exploits khác với phần còn lại của Shodan, mặc dù đã có nỗ lực để giữ chúng tương tự khi có thể.
Quan trọng: Theo mặc định, Exploits sẽ tìm kiếm toàn bộ nội dung của thông tin khai thác có sẵn bao gồm cả metadata. Điều này khác với Shodan, chỉ tìm kiếm văn bản banner nếu không có bộ lọc nào khác được chỉ định.
Các bộ lọc tìm kiếm sau đây có sẵn:
| Tên | Mô tả |
|---|---|
| author | Tác giả của lỗ hổng/khai thác |
| description | Mô tả |
| platform | Nền tảng mà nó nhắm đến (ví dụ: php, windows, linux) |
| type | Loại khai thác (ví dụ: remote, dos) |
Hình ảnh Shodan
Để có cách nhanh chóng duyệt qua tất cả các ảnh chụp màn hình mà Shodan thu thập, hãy xem Shodan Images. Đây là giao diện thân thiện với người dùng xung quanh bộ lọc has_screenshot.
Hộp tìm kiếm ở trên cùng sử dụng cùng cú pháp với công cụ tìm kiếm chính của Shodan. Nó hữu ích nhất để sử dụng hộp tìm kiếm để lọc theo tổ chức hoặc khối mạng. Tuy nhiên, nó cũng có thể được sử dụng để lọc các loại hình ảnh được hiển thị.
Dữ liệu hình ảnh được thu thập từ 4 nguồn khác nhau:
- VNC
- RTSP
- Webcam
- X Windows
Mỗi nguồn hình ảnh đến từ một cổng/dịch vụ khác nhau và do đó có một banner khác nhau. Điều này có nghĩa là nếu bạn chỉ muốn xem hình ảnh từ webcam, bạn có thể tìm kiếm:
HTTP
Để tìm kiếm VNC, bạn có thể tìm kiếm bằng cách vô hiệu hóa xác thực và đối với RTSP, bạn chỉ cần tìm kiếm với RTSP.
Các hình ảnh cũng có thể được tìm thấy bằng cách sử dụng trang web chính của Shodan hoặc Bản đồ Shodan bằng cách sử dụng bộ lọc has_screenshot:true trong truy vấn tìm kiếm. Ví dụ, để tìm hình ảnh của các máy chủ VNC đã vô hiệu hóa xác thực, hãy tìm kiếm has_screenshot:true authentication disabled.
Bài tập: Trang web
Bài tập 1
Tìm trang web 4SICS bằng Shodan.
Gợi ý: Xem Phụ lục B để biết danh sách các bộ lọc tìm kiếm.
Bài tập 2
Tìm nhà máy điện Rastalvskarn.
Gợi ý: Nó đang chạy VNC ẩn danh và nằm ở thành phố Nora của Thụy Điển.
Bài tập 3
Có bao nhiêu IP ở Thụy Điển dễ bị tấn công bởi Heartbleed và vẫn hỗ trợ SSLv2?
Có bao nhiêu IP dễ bị tấn công bởi Heartbleed trong tổ chức của bạn?
Bài tập 4
Tìm tất cả các hệ thống điều khiển công nghiệp trong thành phố của bạn.
Bài tập 5
RAT nào phổ biến nhất ở Thụy Điển?
Công cụ bên ngoài
Giao diện dòng lệnh Shodan
Bắt đầu
Giao diện dòng lệnh shodan được đóng gói cùng với thư viện Python chính thức cho Shodan, nghĩa là nếu bạn đang chạy phiên bản mới nhất của thư viện, bạn đã có quyền truy cập vào CLI. Để cài đặt công cụ mới, chỉ cần thực thi:
easy_install shodan
Sau khi công cụ được cài đặt, nó phải được khởi tạo với khóa API của bạn:
shodan init YOUR_API_KEY
Truy cập https://account.shodan.io để lấy khóa API cho tài khoản của bạn.
alert
Lệnh alert cung cấp cho bạn khả năng liệt kê, xóa và gỡ bỏ các cảnh báo mạng được tạo bằng API.
convert
Chuyển đổi tệp JSON nén được tạo bởi Shodan sang một định dạng tệp khác. Hiện tại nó chỉ hỗ trợ đầu ra sang kml.
count
Trả về số lượng kết quả cho một truy vấn tìm kiếm.
$ shodan count microsoft iis 6.0
5360594
download
Tìm kiếm Shodan và tải xuống kết quả vào một tệp trong đó mỗi dòng là một banner JSON (xem Phụ lục A).
Theo mặc định, nó sẽ chỉ tải xuống 1.000 kết quả, nếu bạn muốn tải xuống nhiều hơn, hãy xem cờ –limit.
Lệnh download là lệnh bạn nên sử dụng thường xuyên nhất khi lấy kết quả từ Shodan vì nó cho phép bạn lưu kết quả và xử lý chúng sau đó bằng lệnh parse. Vì việc phân trang qua kết quả sử dụng tín dụng truy vấn, nên việc luôn lưu trữ các tìm kiếm bạn đang thực hiện là có ý nghĩa để bạn không cần sử dụng tín dụng truy vấn cho một tìm kiếm bạn đã thực hiện trong quá khứ.
host
Xem thông tin về máy chủ như vị trí của nó, những cổng nào đang mở và tổ chức nào sở hữu IP.
$ shodan host 189.201.128.250
info
Lấy thông tin chung về kế hoạch API của bạn, bao gồm số tín dụng truy vấn và quét còn lại trong tháng này.
$ shodan info
Query credits available: 5102
Scan credits available: 249
myip
Trả về địa chỉ IP đối mặt Internet của bạn.
$ shodan myip
199.30.49.210
parse
Sử dụng parse để phân tích một tệp được tạo bằng lệnh download. Nó cho phép bạn lọc ra các trường bạn quan tâm, chuyển đổi JSON thành CSV và thân thiện để chuyển tiếp đến các tập lệnh khác.
Lệnh sau đây xuất địa chỉ IP, cổng và tổ chức ở định dạng CSV cho dữ liệu Microsoft-IIS đã tải xuống trước đó:
$ shodan parse –fields ip_str,port,org –separator , microsoft-data.json.gz
scan
Lệnh scan cung cấp một vài lệnh con nhưng quan trọng nhất là submit cho phép bạn thực hiện quét mạng bằng Shodan.
$ shodan scan submit 202.69.165.20
search
Lệnh này cho phép bạn tìm kiếm Shodan và xem kết quả theo cách thân thiện với terminal. Theo mặc định, nó sẽ hiển thị IP, cổng, tên máy chủ và dữ liệu. Bạn có thể sử dụng tham số –fields để in bất kỳ trường banner nào bạn quan tâm.
Ví dụ, để tìm kiếm Microsoft IIS 6.0 và in ra IP, cổng, tổ chức và tên máy chủ của chúng, hãy sử dụng lệnh sau:
$ shodan search –fields ip_str,port,org,hostnames microsoft iis 6.0
stats
Lệnh stats cho phép bạn in các facet cho một truy vấn tìm kiếm.
Ví dụ, lệnh sau hiển thị các quốc gia phổ biến nhất nơi đặt máy chủ web Apache:
$ shodan stats –facets country apache
Top 10 Results for Facet: country
US 8,336,729
DE 4,512,172
CN 1,470,434
JP 1,093,699
GB 832,221
NL 684,432
FR 667,871
CA 501,630
RU 324,698
BR 266,788
stream
Lệnh stream cung cấp quyền truy cập vào luồng dữ liệu thời gian thực mà các trình thu thập của Shodan thu thập.
Lệnh hỗ trợ nhiều cờ khác nhau, tuy nhiên có 2 cờ quan trọng cần đề cập:
–datadir
Cờ –datadir cho phép bạn chỉ định một thư mục để lưu trữ dữ liệu được truyền. Các tệp được tạo trong thư mục –datadir có quy ước đặt tên sau:
YYYY-MM-DD.json.gz
Một tên tệp mẫu sẽ là “2016-01-15.json.gz”. Mỗi ngày một tệp mới được tự động tạo miễn là bạn giữ cho stream chạy. Ví dụ, lệnh sau tải xuống tất cả dữ liệu từ luồng thời gian thực và lưu nó trong một thư mục có tên /var/lib/shodan/:
shodan stream –datadir /var/lib/shodan/
–limit
Cờ –limit chỉ định có bao nhiêu kết quả nên được tải xuống. Theo mặc định, lệnh stream chạy mãi mãi cho đến khi bạn thoát khỏi công cụ. Tuy nhiên, nếu bạn chỉ quan tâm đến việc thu thập một mẫu dữ liệu thì cờ –limit đảm bảo bạn thu thập một lượng nhỏ bản ghi. Ví dụ:
shodan stream –limit 100
Lệnh trên sẽ kết nối với luồng thời gian thực của Shodan, in ra 100 bản ghi đầu tiên nhận được và sau đó thoát.
–ports
Cờ –ports chấp nhận danh sách các cổng được phân tách bằng dấu phẩy để cho phép bạn chỉ truyền các bản ghi được thu thập từ các cổng đó. Lệnh sau in ra một luồng banner được thu thập từ các dịch vụ chạy trên cổng 80 hoặc 8080:
shodan stream –ports 80,8080
Ví dụ: Nghiên cứu Telnet
Giả sử chúng ta muốn thực hiện nghiên cứu về các thiết bị trên Internet đang chạy Telnet. Làm điểm khởi đầu, chúng ta có thể kết hợp tất cả các lệnh đã đề cập trước đó thành:
mkdir telnet-data
shodan stream –ports 23,1023,2323 –datadir telnet-data/ –limit 10000
Đầu tiên, chúng ta tạo một thư mục có tên telnet-data để lưu trữ dữ liệu Telnet. Sau đó, chúng ta yêu cầu 10.000 bản ghi (–limit 10000) từ stream trên các cổng Telnet phổ biến (–ports 23,1023,2323) và lưu trữ kết quả trong thư mục đã tạo trước đó (–datadir telnet-data/).
Add-on Maltego
Maltego là một ứng dụng tình báo và pháp y mã nguồn mở; nó cho phép bạn khám phá và tương quan dữ liệu từ nhiều nguồn khác nhau một cách trực quan.
Add-on Shodan cho Maltego cung cấp 2 thực thể mới (Dịch vụ và Khai thác) và 5 biến đổi:
searchShodan
searchShodanByDomain
searchShodanByNetblock
toShodanHost
searchExploits
Tiện ích mở rộng trình duyệt
Có các plugin cho cả Chrome và Firefox cho phép bạn xem những dịch vụ mà một trang web hiển thị.
Bài tập: Giao diện dòng lệnh
Bài tập 1
Tải xuống các IP dễ bị tấn công bởi Heartbleed ở Thụy Điển và Na Uy bằng CLI Shodan.
Lọc ra kết quả cho Thụy Điển và lưu chúng trong một tệp riêng biệt.
Lưu ý: Giải nén tệp và xem dữ liệu thô để xem phản hồi thô từ thử nghiệm Heartbleed.
Bài tập 2
Tải xuống 1.000 banner gần đây bằng cách sử dụng luồng thời gian thực và sau đó lập bản đồ chúng bằng Google Maps.
Gợi ý: shodan convert
Bài tập 3
Viết một tập lệnh để tải xuống danh sách các IP độc hại đã biết và chặn mọi lưu lượng đi ra đến chúng.
Gợi ý: iptables -A OUTPUT -d x.x.x.x -j DROP
API nhà phát triển
Shodan cung cấp một API nhà phát triển (https://developer.shodan.io/api) để truy cập theo chương trình vào thông tin được thu thập. Tất cả các trang web và công cụ, bao gồm cả trang web chính của Shodan, đều được hỗ trợ bởi API. Mọi thứ có thể được thực hiện thông qua trang web đều có thể được thực hiện từ trong mã của riêng bạn.
API được chia thành 2 phần: REST API và Streaming API. REST API cung cấp các phương thức để tìm kiếm Shodan, tra cứu máy chủ, lấy thông tin tóm tắt về các truy vấn và nhiều phương thức tiện ích khác để giúp phát triển dễ dàng hơn. Streaming API cung cấp nguồn cấp dữ liệu thô, thời gian thực mà Shodan hiện đang thu thập. Có một số nguồn cấp dữ liệu có thể được đăng ký, nhưng dữ liệu không thể được tìm kiếm hoặc tương tác theo cách khác; đó là một nguồn cấp dữ liệu trực tiếp dành cho việc tiêu thụ thông tin của Shodan ở quy mô lớn.
Lưu ý: Chỉ những người dùng có đăng ký API mới có thể truy cập Streaming API.
Giới hạn sử dụng
Có 3 phương thức của API bị giới hạn tùy thuộc vào gói API của bạn:
- Tìm kiếm: Để giới hạn số lượng tìm kiếm có thể thực hiện mỗi tháng, Shodan sử dụng tín dụng truy vấn. 1 tín dụng truy vấn được sử dụng khi bạn thực hiện tìm kiếm có chứa bộ lọc hoặc đi qua trang 1. Ví dụ, nếu bạn tìm kiếm “apache” thì không sử dụng tín dụng truy vấn nào. Nếu bạn tìm kiếm “apache country:US” thì sẽ sử dụng 1 tín dụng truy vấn. Tương tự, nếu bạn tìm kiếm trang thứ 2 của kết quả cho “apache” thì sẽ sử dụng 1 tín dụng truy vấn. Cuối cùng, một truy vấn tìm kiếm cho trang thứ 2 của “apache country:US” cũng sẽ sử dụng 1 tín dụng truy vấn.
- Quét: API quét theo yêu cầu sử dụng tín dụng quét để giới hạn số lượng máy chủ mà bạn có thể yêu cầu Shodan quét mỗi tháng. Đối với mỗi máy chủ mà bạn yêu cầu quét, Shodan trừ 1 tín dụng quét.
- Cảnh báo mạng: Số lượng IP có thể được giám sát bằng cách sử dụng cảnh báo bị giới hạn dựa trên đăng ký API của bạn. Chỉ những khách hàng trả phí mới có quyền truy cập vào tính năng này. Và bạn không thể tạo hơn 100 cảnh báo trên tài khoản của mình.
Quan trọng: Tín dụng truy vấn và quét được đặt lại vào đầu mỗi tháng.
Giới thiệu về Facet
Facet cung cấp thông tin tổng hợp về một trường cụ thể của banner mà bạn quan tâm. Bộ lọc cho phép bạn thu hẹp kết quả tìm kiếm trong khi facet cho phép bạn có cái nhìn tổng quan về kết quả. Ví dụ, trang web chính của Shodan sử dụng facet để cung cấp thông tin thống kê ở phía bên trái của kết quả tìm kiếm:
[Hình ảnh minh họa thông tin thống kê]
Có sẵn một danh sách dài các facet (xem Phụ lục C) và khi sử dụng API, bạn có quyền kiểm soát những facet nào bạn quan tâm. Ví dụ, tìm kiếm port:22 và facet trên facet ssh.fingerprint sẽ cho bạn một bảng phân tích về những dấu vân tay SSH nào thường được thấy nhất trên Internet. Facet thường là điểm khởi đầu cho nghiên cứu về các vấn đề trên toàn Internet như khóa SSH trùng lặp, nhà cung cấp lưu trữ bất cẩn hoặc lỗ hổng bảo mật trên toàn quốc.
Hiện tại, facet chỉ có sẵn từ API và giao diện dòng lệnh Shodan.
Bắt đầu
Tất cả các ví dụ sẽ được cung cấp bằng Python và giả định bạn có quyền truy cập vào dòng lệnh, mặc dù cũng có các thư viện/client Shodan có sẵn bằng các ngôn ngữ khác.
Để cài đặt thư viện Shodan cho Python, hãy chạy lệnh sau:
easy_install shodan
Nếu bạn đã cài đặt nó và muốn nâng cấp lên phiên bản mới nhất:
easy_install -U shodan
Khởi tạo
Điều đầu tiên luôn phải làm là khởi tạo đối tượng API Shodan:
import shodan
api = shodan.Shodan(‘YOUR API KEY’)
Trong đó YOUR API KEY là khóa API cho tài khoản của bạn mà bạn có thể lấy từ:
https://account.shodan.io
Tìm kiếm
Bây giờ chúng ta đã có đối tượng API sẵn sàng, chúng ta có thể thực hiện tìm kiếm:
Bọc yêu cầu trong một khối try/except để bắt lỗi
try:
# Tìm kiếm Shodan
results = api.search(‘apache’)
# Hiển thị kết quả
print('Kết quả tìm thấy: %s' % results['total'])
for result in results['matches']:
print('IP: %s' % result['ip_str'])
print(result['data'])
print('')
except shodan.APIError as e:
print(‘Lỗi: %s’ % e)
Đi qua từng bước của mã, đầu tiên chúng ta gọi phương thức Shodan.search() trên đối tượng api, phương thức này trả về một từ điển chứa thông tin kết quả. Sau đó chúng ta in ra có bao nhiêu kết quả được tìm thấy tổng cộng, và cuối cùng là lặp qua các kết quả trả về và in ra IP và banner của chúng.
Có nhiều thông tin hơn được trả về bởi hàm. Xem bên dưới để biết ví dụ về từ điển rút gọn mà Shodan.search trả về:
{
‘total’: 8669969,
‘matches’: [
{
‘data’: ‘HTTP/1.0 200 OK\r\nDate: Mon, 08 Nov 2010 05:09:59 GMT\r\nSer…’,
‘hostnames’: [‘pl4t1n.de’],
‘ip’: 3579573318,
‘ip_str’: ‘89.110.147.239’,
‘os’: ‘FreeBSD 4.4’,
‘port’: 80,
‘timestamp’: ‘2014-01-15T05:49:56.283713’
},
…
]
}
Xem Phụ lục A để biết danh sách đầy đủ các thuộc tính mà banner có thể chứa.
Quan trọng: Theo mặc định, một số trường lớn trong banner như “html” bị cắt bớt để giảm thiểu việc sử dụng băng thông. Nếu bạn muốn truy xuất tất cả thông tin, chỉ cần tắt việc thu nhỏ bằng cách sử dụng minify=False. Ví dụ, truy vấn tìm kiếm sau đây cho các dịch vụ VNC ẩn danh sẽ đảm bảo tất cả thông tin được trả về:
results = api.search(‘has_screenshot:true’, minify=False)
Ngoài ra, tốt nhất là bọc tất cả các yêu cầu API trong một mệnh đề try/except, vì bất kỳ lỗi nào sẽ đưa ra một ngoại lệ. Nhưng để đơn giản, tôi sẽ bỏ qua phần đó từ bây giờ.
Tập lệnh trên chỉ xuất kết quả từ trang đầu tiên của kết quả. Để lấy trang thứ 2 của kết quả hoặc nhiều hơn, chỉ cần sử dụng tham số page khi thực hiện yêu cầu tìm kiếm:
results = api.search(‘apache’, page=2)
Hoặc nếu bạn chỉ muốn lặp qua tất cả các kết quả có thể, có một phương thức để giúp cuộc sống của bạn dễ dàng hơn gọi là search_cursor()
for banner in api.search_cursor(‘apache’):
print(banner[‘ip_str’]) # In ra địa chỉ IP cho mỗi banner
Quan trọng: Phương thức search_cursor() chỉ trả về các banner và không cho phép bạn sử dụng facet. Chỉ sử dụng nó để lặp qua kết quả.
Tra cứu máy chủ
Để xem những gì Shodan có sẵn trên một IP cụ thể, chúng ta có thể sử dụng hàm Shodan.host():
Tra cứu máy chủ
host = api.host(‘217.140.75.46’)
In thông tin chung
print(“””
IP: %s
Tổ chức: %s
Hệ điều hành: %s
“”” % (host[‘ip_str’], host.get(‘org’, ‘n/a’), host.get(‘os’, ‘n/a’)))
In tất cả các banner
for item in host[‘data’]:
print(“””
Cổng: %s
Banner: %s
“”” % (item[‘port’], item[‘data’]))
Theo mặc định, Shodan chỉ trả về thông tin về máy chủ được thu thập gần đây. Nếu bạn muốn có lịch sử đầy đủ của một địa chỉ IP, hãy bao gồm tham số history. Ví dụ:
host = api.host(‘217.140.75.46’, history=True)
Điều trên sẽ trả về tất cả các banner, bao gồm cả các dịch vụ có thể không còn hoạt động trên máy chủ.
Quét
Shodan quét Internet ít nhất mỗi tháng một lần, nhưng nếu bạn muốn yêu cầu Shodan quét một mạng ngay lập tức, bạn có thể làm như vậy bằng cách sử dụng khả năng quét theo yêu cầu của API.
Không giống như quét bằng công cụ như Nmap, quét với Shodan được thực hiện bất đồng bộ. Điều này có nghĩa là sau khi bạn gửi yêu cầu đến Shodan, bạn không nhận lại kết quả ngay lập tức. Nhà phát triển phải quyết định cách thu thập kết quả của lần quét: bằng cách tra cứu thông tin IP, tìm kiếm Shodan hoặc đăng ký luồng thời gian thực. Giao diện dòng lệnh Shodan tạo một cảnh báo mạng tạm thời sau khi bắt đầu quét và sau đó chờ kết quả đến thông qua luồng thời gian thực.
scan = api.scan(‘198.20.69.0/24’)
Cũng có thể gửi một danh sách các mạng cùng một lúc bằng cách cung cấp một danh sách các địa chỉ ở ký hiệu CIDR:
scan = api.scan([‘198.20.49.30’, ‘198.20.74.0/24’])
Sau khi gửi yêu cầu quét, API sẽ trả về thông tin sau:
{
‘id’: ‘R2XRT5HH6X67PFAB’,
‘count’: 1,
‘credits_left’: 5119
}
Đối tượng cung cấp một id duy nhất mà bạn có thể sử dụng cho mục đích theo dõi, tổng số IP đã được gửi để quét và cuối cùng là có bao nhiêu tín dụng quét còn lại (credits_left).
Luồng thời gian thực
API Streaming là một dịch vụ dựa trên HTTP trả về luồng dữ liệu thời gian thực được thu thập bởi Shodan. Nó không cung cấp bất kỳ khả năng tìm kiếm hoặc tra cứu nào, nó chỉ đơn giản là một nguồn cấp dữ liệu của mọi thứ được thu thập bởi các trình thu thập.
Ví dụ, đây là một tập lệnh xuất ra một luồng banner từ các thiết bị dễ bị tấn công bởi FREAK (CVE-2015-0204):
def has_vuln(banner, vuln):
if ‘vulns’ in banner[‘opts’] and vuln in banner[‘opts’][‘vulns’]:
return True
return False
for banner in api.stream.banners():
if has_vuln(banner, ‘CVE-2015-0204’):
print(banner)
Để tiết kiệm không gian và băng thông, nhiều thuộc tính trong banner là tùy chọn. Để làm việc với các thuộc tính tùy chọn dễ dàng hơn, tốt nhất là bọc quyền truy cập vào các thuộc tính trong một hàm. Trong ví dụ trên, phương thức has_vuln() kiểm tra xem dịch vụ có dễ bị tấn công đối với CVE được cung cấp hay không.
Lưu ý: Các đăng ký API thông thường chỉ có quyền truy cập vào 1% nguồn cấp dữ liệu. Quyền truy cập 100% chỉ dành cho khách hàng có giấy phép dữ liệu.
Cảnh báo mạng
Cảnh báo mạng là một nguồn cấp dữ liệu thời gian thực về dữ liệu đang được Shodan thu thập cho một dải mạng. Để bắt đầu với cảnh báo mạng cần 2 bước:
Tạo cảnh báo mạng
Để tạo cảnh báo mạng, bạn cần cung cấp một tên và một dải mạng. Tên nên mô tả để cho bạn biết cảnh báo đang giám sát cái gì hoặc tại sao nó được tạo ra.
alert = api.create_alert(‘Mạng sản xuất’, ‘198.20.69.0/24’)
Cũng như với phương thức scan(), bạn cũng có thể cung cấp một danh sách các dải mạng để giám sát:
alert = api.create_alert(‘Mạng sản xuất và dàn dựng’, [
‘198.20.69.0/24’,
‘198.20.70.0/24’,
])
Lưu ý: Chỉ một số lượng IP giới hạn có thể được giám sát bằng cách sử dụng cảnh báo mạng và một tài khoản không thể có hơn 100 cảnh báo hoạt động.
Một mẹo hữu ích khi kết hợp cảnh báo mạng với API quét là đặt thời gian hết hạn cho cảnh báo:
alert = api.create_alert(‘Cảnh báo tạm thời’, ‘198.20.69.0/24’, expires=60)
Cảnh báo trên sẽ hoạt động trong 60 giây và sau đó hết hạn, tại thời điểm đó cảnh báo không thể được sử dụng nữa.
Khi tạo cảnh báo thành công, API sẽ trả về đối tượng sau:
{
“name”: “Mạng sản xuất”,
“created”: “2015-10-17T08:13:58.924581”,
“expires”: 0,
“expiration”: null,
“filters”: {
“ip”: [“198.20.69.0/24”]
},
“id”: “EPGWQG5GEELV4799”,
“size”: 256
}
Đăng ký
Khi một cảnh báo đã được tạo, nó sẵn sàng để được sử dụng như một luồng dữ liệu thời gian thực cho mạng đó.
for banner in api.stream.alert(alert[‘id’]):
print(banner)
Cũng như với luồng thời gian thực thông thường, phương thức alert() cung cấp một iterator trong đó mỗi mục là một banner khi nó đang được thu thập bởi các trình thu thập Shodan. Đối số duy nhất mà phương thức alert() yêu cầu là ID cảnh báo được trả về khi tạo cảnh báo mạng.
Ví dụ: Dữ liệu MongoDB công khai
MongoDB là một cơ sở dữ liệu NoSQL phổ biến và trong một thời gian dài nó không đi kèm với bất kỳ xác thực nào. Điều này dẫn đến nhiều trường hợp MongoDB có thể truy cập công khai trên Internet. Sau đây là một đoạn trích từ banner:
Thông tin máy chủ MongoDB…
{
“ok”: 1.0,
“tokumxAuditVersion”: “unknown”,
“bits”: 64,
“tokukvVersion”: “unknown”,
“tokumxVersion”: “2.0.2”,
“javascriptEngine”: “V8”,
“version”: “2.4.10”,
“versionArray”: [
2,
4,
10,
0
],
“debug”: false,
“compilerFlags”: “-fPIC -fno-strict-aliasing -ggdb -Wall -Wsign-compare -Wno-unknown-pragmas -Winvalid-pch -pipe -Wnon-virtual-dtor -Woverloaded-virtual -Wno-unused-local-typedefs -fno-builtin-memcmp -O3”,
“maxBsonObjectSize”: 16777216,
“sysInfo”: “Linux vps-vivid-x64-04 2.6.32-042stab106.6 #1 SMP Mon Apr 20 14:48:47 MSK 2015 x86_64 x86_64 x86_64 GNU/Linux BOOST_LIB_VERSION=1_55”,
“loaderFlags”: ” “,
“gitVersion”: “unknown”
},
…
Về cơ bản, banner bao gồm một tiêu đề nói “Thông tin máy chủ MongoDB” theo sau là 3 đối tượng JSON được phân tách bằng dấu phẩy. Mỗi đối tượng JSON chứa thông tin khác nhau về cơ sở dữ liệu và tôi khuyên bạn nên kiểm tra một banner đầy đủ trên Shodan (nó rất dài) bằng cách tìm kiếm:
product:MongoDB
Hãy sử dụng thông tin banner để xác định tên cơ sở dữ liệu nào phổ biến nhất và có bao nhiêu dữ liệu được hiển thị công khai trên Internet! Quy trình cơ bản sẽ là:
- Tải xuống tất cả các banner MongoDB
- Xử lý tệp đã tải xuống và xuất danh sách 10 tên cơ sở dữ liệu hàng đầu cũng như tổng kích thước dữ liệu
Tải xuống dữ liệu rất đơn giản bằng cách sử dụng giao diện dòng lệnh Shodan:
shodan download –limit -1 mongodb.json.gz product:mongodb
Lệnh trên nói rằng tải xuống tất cả kết quả (–limit -1) vào một tệp có tên mongodb.json.gz cho truy vấn tìm kiếm product:mongodb. Bây giờ chúng ta chỉ cần một tập lệnh Python đơn giản để xử lý tệp dữ liệu Shodan. Để dễ dàng lặp qua tệp, chúng ta sẽ sử dụng phương thức shodan.helpers.iterate_files():
import shodan.helpers as helpers
import sys
Tệp dữ liệu là đối số đầu tiên cho lệnh
datafile = sys.argv[1]
for banner in helpers.iterate_files(datafile):
# Bây giờ chúng ta có banner
Vì mỗi banner chỉ là JSON với một số tiêu đề được thêm vào, hãy xử lý banner thành một từ điển Python gốc bằng cách sử dụng thư viện simplejson:
Loại bỏ tiêu đề MongoDB được thêm vào bởi Shodan
data = banner[‘data’].replace(‘MongoDB Server Information\n’, ”).split(‘\n},\n’)[2]
Tải thông tin cơ sở dữ liệu
data = simplejson.loads(data + ‘}’)
Điều duy nhất còn lại là theo dõi tổng lượng dữ liệu được hiển thị và tên cơ sở dữ liệu phổ biến nhất:
total_data = 0
databases = collections.defaultdict(int)
…
Sau đó trong vòng lặp
Theo dõi có bao nhiêu dữ liệu có thể truy cập công khai
total_data += data[‘totalSize’]
Theo dõi tên cơ sở dữ liệu nào phổ biến nhất
for db in data[‘databases’]:
databases[db[‘name’]] += 1
Python có một lớp collections.defaultdict hữu ích tự động tạo giá trị mặc định cho khóa từ điển nếu khóa đó chưa tồn tại. Và chúng ta chỉ cần truy cập thuộc tính totalSize và databases của banner MongoDB để thu thập thông tin chúng ta quan tâm.
Cuối cùng, chúng ta chỉ cần xuất kết quả thực tế:
print(‘Tổng: {}’.format(humanize_bytes(total_data)))
counter = 1
for name, count in sorted(databases.iteritems(), key=operator.itemgetter(1), reverse=True)[:10]:
print(‘#{}\t{}: {}’.format(counter, name, count))
counter += 1
Đầu tiên, chúng ta in tổng lượng dữ liệu được hiển thị và chúng ta đang sử dụng một phương thức humanize_bytes() đơn giản để chuyển đổi byte thành định dạng có thể đọc được của con người GB/MB/v.v. Thứ hai, chúng ta sắp xếp bộ sưu tập databases theo thứ tự ngược lại theo số lần mà một tên cơ sở dữ liệu cụ thể được nhìn thấy (key=operator.itemgetter(1)) và lấy 10 kết quả hàng đầu ([:10]).
Dưới đây là tập lệnh đầy đủ đọc tệp dữ liệu Shodan và phân tích banner:
!/usr/bin/env python
import collections
import operator
import shodan.helpers as helpers
import sys
import simplejson
def humanize_bytes(bytes, precision=1):
“””Trả về một chuỗi biểu diễn con người có thể đọc được của một số byte.
Giả định from __future__ import division.
>>> humanize_bytes(1)
'1 byte'
>>> humanize_bytes(1024)
'1.0 kB'
>>> humanize_bytes(1024*123)
'123.0 kB'
>>> humanize_bytes(1024*12342)
'12.1 MB'
>>> humanize_bytes(1024*12342,2)
'12.05 MB'
>>> humanize_bytes(1024*1234,2)
'1.21 MB'
>>> humanize_bytes(1024*1234*1111,2)
'1.31 GB'
>>> humanize_bytes(1024*1234*1111,1)
'1.3 GB'
"""
abbrevs = (
(1<<50L, 'PB'),
(1<<40L, 'TB'),
(1<<30L, 'GB'),
(1<<20L, 'MB'),
(1<<10L, 'kB'),
(1, 'bytes')
)
if bytes == 1:
return '1 byte'
for factor, suffix in abbrevs:
if bytes >= factor:
break
return '%.*f %s' % (precision, bytes / factor, suffix)
total_data = 0
databases = collections.defaultdict(int)
for banner in helpers.iterate_files(sys.argv[1]):
try:
# Loại bỏ tiêu đề MongoDB được thêm vào bởi Shodan
data = banner[‘data’].replace(‘MongoDB Server Information\n’, ”).split(‘\n},\n’)[2]
# Tải thông tin cơ sở dữ liệu
data = simplejson.loads(data + ‘}’)
# Theo dõi có bao nhiêu dữ liệu có thể truy cập công khai
total_data += data[‘totalSize’]
# Theo dõi tên cơ sở dữ liệu nào phổ biến nhất
for db in data[‘databases’]:
databases[db[‘name’]] += 1
except Exception as e:
pass
print(‘Tổng: {}’.format(humanize_bytes(total_data)))
counter = 1
for name, count in sorted(databases.iteritems(), key=operator.itemgetter(1), reverse=True)[:10]:
print(‘#{}\t{}: {}’.format(counter, name, count))
counter += 1
Đây là một mẫu đầu ra của tập lệnh:
Tổng: 1.8 PB
1 local: 85845
2 admin: 67648
3 test: 24983
4 s: 5121
5 config: 4329
6 proxy: 2045
7 research: 2007
8 seolib_new: 2001
9 traditional: 1998
10 simplified: 1998
Bài tập: API Shodan
Bài tập 1
Viết một tập lệnh để giám sát một mạng sử dụng Shodan và gửi thông báo.
Bài tập 2
Viết một tập lệnh để xuất các hình ảnh mới nhất vào một thư mục.
Gợi ý: Hình ảnh được mã hóa bằng base64. Python có thể dễ dàng giải mã nó thành nhị phân bằng cách sử dụng:
image_string.decode(‘base64’)
Hệ thống điều khiển công nghiệp
Tóm lại, hệ thống điều khiển công nghiệp (ICS) là các máy tính điều khiển thế giới xung quanh bạn. Chúng chịu trách nhiệm quản lý hệ thống điều hòa không khí trong văn phòng của bạn, các tuabin tại nhà máy điện, hệ thống chiếu sáng tại nhà hát hoặc robot tại nhà máy.
Nghiên cứu được thực hiện từ năm 2012 đến 2014 bởi Dự án SHINE (SHodan INtelligence Extraction) cho thấy có ít nhất 2 triệu thiết bị liên quan đến ICS có thể truy cập công khai trên Internet. Bộ dữ liệu đầu tiên chứa 500.000 thiết bị ICS đã được gửi vào năm 2012 cho ICS-CERT. ICS-CERT xác định rằng khoảng 7.200 trong số 500.000 là cơ sở hạ tầng quan trọng ở Hoa Kỳ. Và với nhu cầu kết nối ngày càng tăng trong mọi thứ, con số này dự kiến sẽ tăng lên. Đã có những nỗ lực để bảo mật các thiết bị này bằng cách ngắt kết nối chúng hoặc vá lỗi, nhưng đó là một vấn đề đầy thách thức và không có giải pháp dễ dàng.
Các từ viết tắt phổ biến
Trước khi đi vào các giao thức và cách tìm thiết bị ICS, đây là một số từ viết tắt phổ biến hữu ích cần biết:
BMS: Hệ thống quản lý tòa nhà
DCS: Hệ thống điều khiển phân tán
HMI: Giao diện người-máy
ICS: Hệ thống điều khiển công nghiệp
PLC: Bộ điều khiển logic có thể lập trình
RTU: Thiết bị đầu cuối từ xa
SCADA: Giám sát điều khiển và thu thập dữ liệu (một tập hợp con của ICS)
VNC: Điều khiển mạng ảo
Giao thức
Có 2 cách khác nhau để xác định hệ thống điều khiển trên Internet:
Giao thức không phải ICS được sử dụng trong môi trường ICS
Phần lớn các phát hiện ICS trên Shodan được phát hiện bằng cách tìm kiếm máy chủ web hoặc các giao thức phổ biến khác không liên kết trực tiếp với ICS nhưng có thể được thấy trên mạng ICS. Ví dụ: máy chủ web chạy trên HMI hoặc máy tính Windows chạy remote desktop không xác thực trong khi kết nối với ICS. Các giao thức này cung cấp cho bạn cái nhìn trực quan về ICS nhưng chúng thường có một số hình thức xác thực được bật.
[Hình ảnh minh họa HMI cho một động cơ được hiển thị thông qua kết nối VNC không xác thực được tìm thấy trên Shodan Images.]
Giao thức ICS
Đây là các giao thức thô được sử dụng bởi các hệ thống điều khiển. Mỗi giao thức ICS có banner riêng nhưng có một điểm chung: chúng không yêu cầu bất kỳ xác thực nào. Điều này có nghĩa là nếu bạn có quyền truy cập từ xa vào một thiết bị công nghiệp, bạn tự động có khả năng đọc và ghi tùy ý vào nó. Tuy nhiên, các giao thức ICS thô thường là độc quyền và khó phát triển. Điều này có nghĩa là việc kiểm tra xem một thiết bị có hỗ trợ giao thức ICS bằng Shodan là dễ dàng nhưng khó tương tác thực sự với hệ thống điều khiển.
Banner sau đây mô tả một PLC Siemens S7, lưu ý rằng nó chứa rất nhiều thông tin chi tiết về thiết bị bao gồm cả số sê-ri và vị trí của nó:
[Hình ảnh minh họa banner Siemens S7]
Bảo mật hệ thống ICS kết nối Internet
Phần lớn các banner ICS không chứa thông tin về vị trí của thiết bị hoặc ai sở hữu hệ thống điều khiển. Điều này khiến việc bảo mật thiết bị trở nên cực kỳ khó khăn và là một trong những lý do chính khiến chúng tiếp tục hoạt động trực tuyến sau nhiều năm nghiên cứu về sự phơi nhiễm trực tuyến của chúng.
Nếu bạn phát hiện ra một hệ thống điều khiển có vẻ quan trọng, thuộc về chính phủ hoặc không nên hoạt động trực tuyến, vui lòng thông báo cho ICS-CERT.
Trường hợp sử dụng
Đánh giá ICS cho Hoa Kỳ
Bạn được giao nhiệm vụ tạo một bài thuyết trình nhanh về mức độ lộ diện của các hệ thống điều khiển công nghiệp đối với Hoa Kỳ. Để bắt đầu, hãy có một ý tưởng chung về những gì có sẵn bằng cách sử dụng trang web chính của Shodan:
Điều này trả về danh sách tất cả các thiết bị chạy các giao thức ICS trên Internet. Tuy nhiên, có rất nhiều máy chủ web và các giao thức khác (SSH, FTP, v.v.) chạy trên cùng các cổng với hệ thống điều khiển công nghiệp mà chúng ta cần lọc ra:
Bây giờ chúng ta có một danh sách đã được lọc các thiết bị chạy các giao thức ICS không an toàn. Vì trọng tâm của bài thuyết trình sẽ là về Hoa Kỳ, đã đến lúc thu hẹp kết quả chỉ còn các IP ở Hoa Kỳ:
Để có cái nhìn tổng quan về dữ liệu và có một số biểu đồ để làm việc, chúng ta có thể tạo một báo cáo miễn phí. Điều này cung cấp cho chúng ta hiểu biết tốt hơn về các giao thức ICS nào được nhìn thấy trên Internet ở Hoa Kỳ:
[Hình ảnh minh họa biểu đồ phân bố giao thức ICS]
Giao thức Fox của Tridium, được sử dụng bởi framework Niagara của họ, là giao thức ICS phổ biến nhất ở Hoa Kỳ, tiếp theo là BACnet và Modbus. Dữ liệu cho thấy phần lớn các thiết bị bị lộ là BMS (Hệ thống quản lý tòa nhà) được sử dụng trong văn phòng, nhà máy, sân vận động, khán phòng và các cơ sở khác nhau.
Biểu đồ trên được lưu dưới dạng hình ảnh bằng cách sử dụng Nimbus Screen Capture trên Firefox, nhưng bạn cũng có thể sử dụng tiện ích mở rộng Awesome Screenshot Minus cho Chrome.
Báo cáo cũng nêu bật một vấn đề phổ biến với ICS trên Internet: phần lớn trong số chúng nằm trên các mạng di động. Điều này khiến việc theo dõi và bảo mật các thiết bị này trở nên đặc biệt khó khăn.
Tại thời điểm này, dữ liệu cho chúng ta thấy như sau:
- Có ít nhất 65.000 ICS trên Internet hiển thị giao diện thô, không xác thực của chúng
- Gần một nửa trong số đó (~31.000) nằm ở Hoa Kỳ
- Các tòa nhà là loại ICS được nhìn thấy phổ biến nhất
- Các mạng di động lưu trữ số lượng lớn nhất
Đọc thêm
- Phân biệt thiết bị đối mặt Internet bằng cách sử dụng thông tin lập trình PLC
- Ấn phẩm đặc biệt NIST – Hướng dẫn bảo mật hệ thống điều khiển công nghiệp
- Đánh giá và trực quan hóa định lượng bề mặt tấn công hệ thống công nghiệp
Nhận diện Honeypot
Honeypot đã trở thành một công cụ ngày càng phổ biến và hữu ích trong việc hiểu các kẻ tấn công. Tôi đã thấy nhiều honeypot được cấu hình sai trong khi quét Internet, sau đây là một số mẹo để nhận diện chúng hoặc những sai lầm cần tránh khi thiết lập chúng.
Honeypot là gì?
Honeypot là một thiết bị giả vờ là thứ mà thực sự nó không phải, với mục đích ghi lại và giám sát hoạt động mạng. Trong trường hợp hệ thống điều khiển công nghiệp, một honeypot ICS là một máy tính thông thường giả vờ là một hệ thống điều khiển như nhà máy hoặc nhà máy điện. Chúng được sử dụng để thu thập thông tin về kẻ tấn công, bao gồm những mạng mà kẻ tấn công đang nhắm mục tiêu, công cụ họ đang sử dụng và nhiều thông tin hữu ích khác giúp người bảo vệ củng cố mạng của họ.
Trong những năm gần đây, honeypot đã được sử dụng để đo lường số lượng cuộc tấn công đã được thực hiện chống lại các hệ thống điều khiển công nghiệp kết nối với Internet. Tuy nhiên, điều cực kỳ quan trọng là phải hiểu cách triển khai honeypot đúng cách trước khi cố gắng thu thập dữ liệu. Nhiều người cấu hình sai honeypot của họ và tôi sẽ nêu ra cách những sai lầm đó khiến việc xác định xem một thiết bị là hệ thống điều khiển thực hay honeypot trở nên đơn giản.
Honeypot phổ biến và thực tế nhất được sử dụng để mô phỏng hệ thống điều khiển công nghiệp là Conpot. Phần mềm này được viết tốt và cực kỳ mạnh mẽ khi được cấu hình đúng cách. Hầu hết các ví dụ và thảo luận sẽ sử dụng Conpot nhưng các nguyên tắc áp dụng cho tất cả phần mềm honeypot.
Tại sao phải phát hiện chúng?
Dữ liệu mà honeypot tạo ra chỉ tốt như cách triển khai chúng. Nếu chúng ta muốn đưa ra quyết định sáng suốt về việc ai đang tấn công hệ thống điều khiển, chúng ta phải đảm bảo rằng dữ liệu đang được thu thập từ các honeypot thực tế. Những kẻ tấn công tinh vi sẽ không bị lừa bởi các honeypot được cấu hình kém. Điều quan trọng là phải nâng cao nhận thức về những sai lầm phổ biến khi triển khai honeypot để cải thiện chất lượng dữ liệu được thu thập.
Cấu hình mặc định
Sai lầm phổ biến nhất mà mọi người mắc phải khi triển khai honeypot là sử dụng cấu hình mặc định. Tất cả các cấu hình mặc định trả về cùng một banner, bao gồm các số sê-ri, tên PLC và nhiều trường khác mà bạn mong đợi sẽ khác nhau từ IP này sang IP khác.
Tôi lần đầu tiên nhận ra vấn đề này phổ biến như thế nào ngay sau khi thực hiện lần quét Internet đầu tiên cho Siemens S7:
[Hình ảnh minh họa biểu đồ phân phối số sê-ri]
30% số sê-ri trong kết quả xuất hiện trong nhiều hơn một banner. Điều này không có nghĩa là tất cả các số sê-ri trùng lặp đều là honeypot nhưng đó là một điểm khởi đầu tốt để điều tra.
Trong trường hợp của S7, số sê-ri phổ biến nhất được thấy trên Internet là 88111222, đây là số sê-ri mặc định cho Conpot.
Tìm kiếm theo số sê-ri giúp việc định vị các phiên bản của Conpot trên Internet trở nên đơn giản. Và đảm bảo thay đổi cả các thuộc tính khác của banner, không chỉ số sê-ri:
[Hình ảnh minh họa banner với số sê-ri đã thay đổi nhưng các trường khác vẫn giữ nguyên]
Người dùng trên đã thay đổi số sê-ri thành một giá trị duy nhất nhưng không thay đổi tên PLC (Technodrome) và định danh nhà máy (Mouser Factory). Mọi phiên bản honeypot phải có các giá trị duy nhất để tránh các kỹ thuật phát hiện honeypot.
Lịch sử quan trọng
Honeypot phải được triển khai đúng cách ngay từ ngày đầu tiên, nếu không lịch sử banner cho thiết bị sẽ tiết lộ nó là một honeypot. Ví dụ:
[Hình ảnh minh họa banner giả mạo là PLC Siemens S7]
Trên đây là một banner giả vờ là PLC Siemens S7. Tuy nhiên, đã có lỗi trong mẫu tạo banner và thay vì hiển thị tên PLC hợp lệ, nó hiển thị phương thức random.randint(0,1) của mẫu. Shodan đã lập chỉ mục banner này và ngay cả khi lỗi được sửa trong tương lai, người dùng vẫn có thể tra cứu lịch sử của IP này và thấy rằng nó từng có một banner S7 không hợp lệ.
Một yêu cầu API Shodan mẫu để lấy lịch sử của một IP:
host = api.host(‘xxx.xxx.xxx.xxx’, history=True)
Mô phỏng thiết bị, không phải dịch vụ
Hãy giữ đơn giản, đừng cố gắng mô phỏng quá nhiều dịch vụ cùng một lúc. Một honeypot nên mô phỏng một thiết bị và hầu hết các thiết bị thực không chạy MongoDB, DNP3, MySQL, Siemens S7, Kamstrup, ModBus, Automated Tank Gauge, Telnet và SSH trên cùng một IP.
Hãy nghĩ về cách thiết bị được cấu hình trong thế giới thực và sau đó mô phỏng nó, đừng chạy mọi dịch vụ có thể chỉ vì có thể.
Trong mã, bạn có thể sử dụng số lượng cổng làm thước đo:
Lấy thông tin về máy chủ
host = api.host(‘xxx.xxx.xxx.xxx’)
Kiểm tra số lượng cổng mở
if len(host[‘ports’]) > 10:
print(‘{} có vẻ đáng ngờ’.format(host[‘ip_str’]))
else:
print(‘{} có ít cổng mở’.format(host[‘ip_str’]))
Vị trí, vị trí, vị trí
Không chỉ phần mềm cần được cấu hình đúng, một honeypot cũng phải được lưu trữ trên một mạng có thể hợp lý có hệ thống điều khiển. Đặt một honeypot mô phỏng PLC Siemens trong đám mây Amazon không hợp lý chút nào. Đây là một vài nhà cung cấp lưu trữ đám mây phổ biến nên tránh khi triển khai honeypot ICS:
- Amazon EC2
- Rackspace
- Digital Ocean
- Vultr
- Microsoft Azure
- Google Cloud
Để triển khai thực tế, hãy xem xét các ISP phổ biến nhất trong Shodan cho ICS có thể truy cập công khai. Nhìn chung, tốt hơn là đặt honeypot trong không gian IP của một ISP dân cư. Các tổ chức sau đây là những vị trí phổ biến ở Hoa Kỳ:
[Danh sách các ISP phổ biến ở Hoa Kỳ]
Honeyscore
Tôi đã phát triển một công cụ có tên Honeyscore sử dụng tất cả các phương pháp đã đề cập trước đó cũng như học máy để tính toán điểm honeypot và xác định xem một IP có phải là honeypot hay không.
[Hình ảnh minh họa giao diện Honeyscore]
Chỉ cần nhập địa chỉ IP của một thiết bị và công cụ sẽ thực hiện nhiều kiểm tra để xem liệu nó có phải là honeypot hay không.
Đọc thêm
- Bài viết Wikipedia về honeypot
- Phá vỡ Honeypot vì lợi nhuận và niềm vui (Video)
Phụ lục A: Đặc tả banner
Để biết danh sách mới nhất các trường mà banner chứa, vui lòng truy cập tài liệu trực tuyến.
Một banner có thể chứa các thuộc tính/trường sau:
Thuộc tính chung
| Tên | Mô tả | Ví dụ |
|---|---|---|
| asn | Số hệ thống tự trị | AS4837 |
| data | Banner chính cho dịch vụ | HTTP/1.1 200… |
| ip | Địa chỉ IP dưới dạng số nguyên | 493427495 |
| ip_str | Địa chỉ IP dưới dạng chuỗi | 199.30.15.20 |
| ipv6 | Địa chỉ IPv6 dưới dạng chuỗi | 2001:4860:4860::8888 |
| port | Số cổng cho dịch vụ | 80 |
| timestamp | Ngày và giờ thông tin được thu thập | 2014-01-15T05:49:56.283713 |
| hostnames | Danh sách tên máy chủ cho IP | [“shodan.io”, “www.shodan.io”] |
| domains | Danh sách tên miền cho IP | [“shodan.io”] |
| link | Loại liên kết mạng | Ethernet hoặc modem |
| location | Vị trí địa lý của thiết bị | xem bên dưới |
| opts | Dữ liệu bổ sung không có trong banner chính | |
| org | Tổ chức được gán IP | Google Inc. |
| isp | ISP chịu trách nhiệm về không gian IP | Verizon Wireless |
| os | Hệ điều hành | Linux |
| uptime | Thời gian hoạt động của IP tính bằng phút | 50 |
| transport | Loại giao thức vận chuyển được sử dụng để thu thập banner; hoặc là “udp” hoặc “tcp” | tcp |
Thuộc tính HTTP(S)
| Tên | Mô tả |
|---|---|
| html | Nội dung HTML của trang web |
| title | Tiêu đề của trang web |
Thuộc tính vị trí
Các thuộc tính sau là thuộc tính con của thuộc tính location ở cấp cao nhất của bản ghi banner.
| Tên | Mô tả |
|---|---|
| area_code | Mã vùng của vị trí thiết bị |
| city | Tên thành phố |
| country_code | Mã quốc gia 2 chữ cái |
| country_code3 | Mã quốc gia 3 chữ cái |
| country_name | Tên đầy đủ của quốc gia |
| dma_code | Mã khu vực thị trường được chỉ định (chỉ có ở Hoa Kỳ) |
| latitude | Vĩ độ |
| longitude | Kinh độ |
| postal_code | Mã bưu chính |
| region_code | Mã khu vực |
Thuộc tính SSL
Nếu dịch vụ được bọc trong SSL thì Shodan sẽ thực hiện kiểm tra bổ sung và cung cấp kết quả trong các thuộc tính sau:
| Tên | Mô tả |
|---|---|
| ssl.cert | Chứng chỉ SSL đã phân tích |
| ssl.cipher | Mã hóa ưu tiên cho kết nối SSL |
| ssl.chain | Danh sách các chứng chỉ SSL từ chứng chỉ người dùng lên đến chứng chỉ gốc |
| ssl.dhparams | Tham số Diffie-Hellman |
| ssl.versions | Các phiên bản SSL được hỗ trợ; nếu giá trị bắt đầu bằng “-” thì dịch vụ không hỗ trợ phiên bản đó (ví dụ: “-SSLv2” nghĩa là dịch vụ không hỗ trợ SSLv2) |
Thuộc tính đặc biệt
_shodan
Thuộc tính _shodan chứa thông tin về cách thu thập dữ liệu của Shodan. Nó khác với tất cả các thuộc tính khác vì nó không cung cấp thông tin về thiết bị. Thay vào đó, nó sẽ cho bạn biết Shodan đang sử dụng trình thu thập banner nào để nói chuyện với IP. Điều này có thể quan trọng để hiểu đối với các cổng mà nhiều dịch vụ có thể đang hoạt động. Ví dụ, cổng 80 được biết đến nhiều nhất cho các máy chủ web nhưng nó cũng được sử dụng bởi nhiều phần mềm độc hại để vượt qua các quy tắc tường lửa. Thuộc tính _shodan sẽ cho bạn biết liệu module http có được sử dụng để thu thập dữ liệu hay một module phần mềm độc hại được sử dụng.
Ví dụ
{
"timestamp": "2014-01-16T08:37:40.081917",
"hostnames": [
"99-46-189-78.lightspeed.tukrga.sbcglobal.net"
],
"org": "AT&T U-verse",
"guid": "1664007502:75a821e2-7e89-11e3-8080-808080808080",
"data": "NTP\nxxx.xxx.xxx.xxx:7546\n68.94.157.2:123\n68.94.156.17:123",
"port": 123,
"isp": "AT&T U-verse",
"asn": "AS7018",
"location": {
"country_code3": "USA",
"city": "Atlanta",
"postal_code": "30328",
"longitude": -84.3972,
"country_code": "US",
"latitude": 33.93350000000001,
"country_name": "United States",
"area_code": 404,
"dma_code": 524,
"region_code": null
},
"ip": 1664007502,
"domains": [
"sbcglobal.net"
],
"ip_str": "99.46.189.78",
"os": null,
"opts": {
"raw": "\\x97\\x00\\x03*\\x00\\x03\\x00H\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01G\\x06\\xa7\\x8ec.\\xbdN\\x00\\x00\\x00\\x01\\x1dz\\x07\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00q\\x00\\x00\\x00i\\x00\\x00\\x00\\x00\\x00\\x00\\x00XD^\\x9d\\x02c.\\xbdN\\x00\\x00\\x00\\x01\\x00{\\x04\\x04\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00q\\x00\\x00\\x00o\\x00\\x00\\x00\\x00\\x00\\x00\\x00YD^\\x9c\\x11c.\\xbdN\\x00\\x00\\x00\\x01\\x00{\\x04\\x04\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00",
"ntp": {
"more": false
}
}
}
Phụ lục B: Danh sách bộ lọc tìm kiếm
Bộ lọc chung
| Tên | Mô tả | Loại |
|---|---|---|
| after | Chỉ hiển thị kết quả sau ngày đã cho (dd/mm/yyyy) | chuỗi |
| asn | Số hệ thống tự trị | chuỗi |
| before | Chỉ hiển thị kết quả trước ngày đã cho (dd/mm/yyyy) | chuỗi |
| category | Các danh mục có sẵn: ics, malware | chuỗi |
| city | Tên thành phố | chuỗi |
| country | Mã quốc gia 2 chữ cái | chuỗi |
| geo | Chấp nhận từ 2 đến 4 tham số. Nếu 2 tham số: vĩ độ,kinh độ. Nếu 3 tham số: vĩ độ,kinh độ,phạm vi. Nếu 4 tham số: vĩ độ trên cùng bên trái, kinh độ trên cùng bên trái, vĩ độ dưới cùng bên phải, kinh độ dưới cùng bên phải. | chuỗi |
| has_ipv6 | Đúng/Sai | boolean |
| has_screenshot | Đúng/Sai | boolean |
| hostname | Tên máy chủ đầy đủ cho thiết bị | chuỗi |
| html | HTML của banner web | chuỗi |
| ip | Bí danh cho bộ lọc net | chuỗi |
| isp | ISP quản lý khối mạng | chuỗi |
| net | Dải mạng ở ký hiệu CIDR (ví dụ: 199.4.1.0/24) | chuỗi |
| org | Tổ chức được gán khối mạng | chuỗi |
| os | Hệ điều hành | chuỗi |
| port | Số cổng cho dịch vụ | số nguyên |
| postal | Mã bưu chính (chỉ có ở Hoa Kỳ) | chuỗi |
| product | Tên của phần mềm/sản phẩm cung cấp banner | chuỗi |
| region | Tên của khu vực/tiểu bang | chuỗi |
| state | Bí danh cho region | chuỗi |
| title | Tiêu đề cho trang web của banner web | chuỗi |
| version | Phiên bản cho sản phẩm | chuỗi |
| vuln | ID CVE cho lỗ hổng | chuỗi |
Bộ lọc NTP
| Tên | Mô tả |
|---|---|
| ntp.ip | Địa chỉ IP trả về bởi monlist |
| ntp.ip_count | Số lượng IP trả về bởi monlist ban đầu |
| ntp.more | Đúng/Sai; liệu có thêm địa chỉ IP cần được thu thập từ monlist hay không |
| ntp.port | Cổng được sử dụng bởi các địa chỉ IP trong monlist |
Bộ lọc SSL
| Tên | Mô tả | Loại |
|---|---|---|
| has_ssl | Đúng/Sai | boolean |
| ssl | Tìm kiếm tất cả dữ liệu SSL | chuỗi |
| ssl.alpn | Giao thức lớp ứng dụng như HTTP/2 (“h2”) | chuỗi |
| ssl.chain_count | Số lượng chứng chỉ trong chuỗi | số nguyên |
| ssl.version | Các giá trị có thể: SSLv2, SSLv3, TLSv1, TLSv1.1, TLSv1.2 | chuỗi |
| ssl.cert.alg | Thuật toán chứng chỉ | chuỗi |
| ssl.cert.expired | Đúng/Sai | boolean |
| ssl.cert.extension | Tên của các phần mở rộng trong chứng chỉ | chuỗi |
| ssl.cert.serial | Số sê-ri dưới dạng số nguyên hoặc chuỗi thập lục phân | số nguyên/chuỗi |
| ssl.cert.pubkey.bits | Số bit trong khóa công khai | số nguyên |
| ssl.cert.pubkey.type | Loại khóa công khai | chuỗi |
| ssl.cipher.version | Phiên bản SSL của mã hóa ưu tiên | chuỗi |
| ssl.cipher.bits | Số bit trong mã hóa ưu tiên | số nguyên |
| ssl.cipher.name | Tên của mã hóa ưu tiên | chuỗi |
Bộ lọc Telnet
| Tên | Mô tả | Loại |
|---|---|---|
| telnet.option | Tìm kiếm tất cả các tùy chọn | chuỗi |
| telnet.do | Máy chủ yêu cầu client hỗ trợ các tùy chọn này | chuỗi |
| telnet.dont | Máy chủ yêu cầu client không hỗ trợ các tùy chọn này | chuỗi |
| telnet.will | Máy chủ hỗ trợ các tùy chọn này | chuỗi |
| telnet.wont | Máy chủ không hỗ trợ các tùy chọn này | chuỗi |
Phụ lục C: Facet tìm kiếm
Facet chung
| Tên | Mô tả |
|---|---|
| asn | Số hệ thống tự trị |
| city | Tên đầy đủ của thành phố |
| country | Tên đầy đủ của quốc gia |
| domain | (Các) tên miền cho thiết bị |
| has_screenshot | Có ảnh chụp màn hình |
| isp | ISP quản lý khối mạng |
| link | Loại kết nối mạng |
| org | Tổ chức sở hữu khối mạng |
| os | Hệ điều hành |
| port | Số cổng cho dịch vụ |
| postal | Mã bưu chính |
| product | Tên của phần mềm/sản phẩm cho banner |
| region | Tên của khu vực/tiểu bang |
| state | Bí danh cho region |
| uptime | Thời gian tính bằng giây mà máy chủ đã hoạt động |
| version | Phiên bản của sản phẩm |
| vuln | ID CVE cho lỗ hổng |
Facet NTP
| Tên | Mô tả |
|---|---|
| ntp.ip | Địa chỉ IP trả về bởi monlist |
| ntp.ip_count | Số lượng IP trả về bởi monlist ban đầu |
| ntp.more | Đúng/Sai; liệu có thêm địa chỉ IP cần được thu thập từ monlist hay không |
| ntp.port | Cổng được sử dụng bởi các địa chỉ IP trong monlist |
Facet SSH
| Tên | Mô tả |
|---|---|
| ssh.cipher | Tên của mã hóa |
| ssh.fingerprint | Dấu vân tay cho thiết bị |
| ssh.mac | Tên của thuật toán MAC được sử dụng (ví dụ: hmac-sha1) |
| ssh.type | Loại khóa xác thực (ví dụ: ssh-rsa) |
Facet SSL
| Tên | Mô tả |
|---|---|
| ssl.version | Phiên bản SSL được hỗ trợ |
| ssl.alpn | Giao thức lớp ứng dụng |
| ssl.chain_count | Số lượng chứng chỉ trong chuỗi |
| ssl.cert.alg | Thuật toán chứng chỉ |
| ssl.cert.expired | Đúng/Sai; chứng chỉ đã hết hạn hay chưa |
| ssl.cert.serial | Số sê-ri chứng chỉ dưới dạng số nguyên |
| ssl.cert.extension | Tên của phần mở rộng chứng chỉ |
| ssl.cert.pubkey.bits | Số bit trong khóa công khai |
| ssl.cert.pubkey | Tên của loại khóa công khai |
| ssl.cipher.bits | Số bit trong mã hóa ưu tiên |
| ssl.cipher.name | Tên của mã hóa ưu tiên |
| ssl.cipher.version | Phiên bản SSL của mã hóa ưu tiên |
Facet Telnet
| Tên | Mô tả |
|---|---|
| telnet.option | Hiển thị tất cả các tùy chọn |
| telnet.do | Máy chủ yêu cầu client hỗ trợ các tùy chọn này |
| telnet.dont | Máy chủ yêu cầu client không hỗ trợ các tùy chọn này |
| telnet.will | Máy chủ hỗ trợ các tùy chọn này |
| telnet.wont | Máy chủ không hỗ trợ các tùy chọn này |
Phụ lục D: Danh sách cổng
| Cổng | Dịch vụ |
|---|---|
| 7 | Echo |
| 11 | Systat |
| 13 | Daytime |
| 15 | Netstat |
| 17 | Quote of the day |
| 19 | Character generator |
| 21 | FTP |
| 22 | SSH |
| 23 | Telnet |
| 25 | SMTP |
| 26 | SSH |
| 37 | rdate |
| 49 | TACACS+ |
| 53 | DNS |
| 67 | DHCP |
| 69 | TFTP, BitTorrent |
| 79 | Finger |
| 80 | HTTP, malware |
| 81 | HTTP, malware |
| 82 | HTTP, malware |
| 83 | HTTP |
| 84 | HTTP |
| 88 | Kerberos |
| 102 | Siemens S7 |
| 110 | POP3 |
| 111 | Portmapper |
| 119 | NNTP |
| 123 | NTP |
| 129 | Password generator protocol |
| 137 | NetBIOS |
| 143 | IMAP |
| 161 | SNMP |
| 175 | IBM Network Job Entry |
| 179 | BGP |
| 195 | TA14-353a |
| 311 | OS X Server Manager |
| 389 | LDAP |
| 443 | HTTPS |
| 444 | TA14-353a, Dell SonicWALL |
| 445 | SMB |
| 465 | SMTPS |
| 500 | IKE (VPN) |
| 502 | Modbus |
| 503 | Modbus |
| 515 | Line Printer Daemon |
| 520 | RIP |
| 523 | IBM DB2 |
| 554 | RTSP |
| 587 | SMTP mail submission |
| 623 | IPMI |
| 626 | OS X serialnumbered |
| 666 | Telnet |
| 771 | Realport |
| 789 | Redlion Crimson3 |
| 873 | rsync |
| 902 | VMWare authentication |
| 992 | Telnet (secure) |
| 993 | IMAP with SSL |
| 995 | POP3 with SSL |
| 1010 | malware |
| 1023 | Telnet |
| 1025 | Kamstrup |
| 1099 | Java RMI |
| 1177 | malware |
| 1200 | Codesys |
| 1234 | udpxy |
| 1434 | MS-SQL monitor |
| 1604 | Citrix, malware |
| 1723 | PPTP |
| 1833 | MQTT |
| 1900 | UPnP |
| 1911 | Niagara Fox |
| 1962 | PCworx |
| 1991 | malware |
| 2000 | iKettle, MikroTik bandwidth test |
| 2082 | cPanel |
| 2083 | cPanel |
| 2086 | WHM |
| 2087 | WHM |
| 2123 | GTPv1 |
| 2152 | GTPv1 |
| 2181 | Apache Zookeeper |
| 2222 | SSH, PLC5, EtherNet/IP |
| 2323 | Telnet |
| 2332 | Sierra wireless (Telnet) |
| 2375 | Docker |
| 2376 | Docker |
| 2404 | IEC-104 |
| 2455 | CoDeSys |
| 2480 | OrientDB |
| 2628 | Dictionary |
| Cổng | Dịch vụ |
|---|---|
| 3000 | ntop |
| 3306 | MySQL |
| 3386 | GTPv1 |
| 3388 | RDP |
| 3389 | RDP |
| 3460 | malware |
| 3541 | PBX GUI |
| 3542 | PBX GUI |
| 3689 | DACP |
| 3780 | Metasploit |
| 3787 | Ventrilo |
| 4000 | malware |
| 4022 | udpxy |
| 4040 | Giao diện web Chef đã lỗi thời |
| 4063 | ZeroC Glacier2 |
| 4064 | ZeroC Glacier2 với SSL |
| 4369 | EPMD |
| 4443 | Symantec Data Center Security |
| 4444 | malware |
| 4500 | IKE NAT-T (VPN) |
| 4567 | Giao diện web modem |
| 4911 | Niagara Fox với SSL |
| 4949 | Munin |
| 5006 | MELSEC-Q |
| 5007 | MELSEC-Q |
| 5008 | NetMobility |
| 5009 | Quản trị Apple Airport |
| 5060 | SIP |
| 5094 | HART-IP |
| 5222 | XMPP |
| 5269 | XMPP Server-to-Server |
| 5353 | mDNS |
| 5357 | Microsoft-HTTPAPI/2.0 |
| 5432 | PostgreSQL |
| 5577 | Flux LED |
| 5632 | PCAnywhere |
| 5672 | RabbitMQ |
| 5900 | VNC |
| 5901 | VNC |
| 5984 | CouchDB |
| 6000 | X11 |
| 6379 | Redis |
| 6666 | Cơ sở dữ liệu Voldemort, malware |
| 6667 | IRC |
| 6881 | BitTorrent DHT |
| 6969 | TFTP, BitTorrent |
| 7218 | Sierra wireless (Telnet) |
| 7474 | Cơ sở dữ liệu Neo4j |
| 7548 | CWMP (HTTPS) |
| 7777 | Oracle |
| 7779 | API Dell Service Tag |
| 8010 | DVR Intelbras |
| 8060 | Giao diện web Roku |
| 8069 | OpenERP |
| 8087 | Riak |
| 8090 | HUB Insteon |
| 8099 | Yahoo SmartTV |
| 8112 | Deluge (HTTP) |
| 8139 | Puppet agent |
| 8140 | Puppet master |
| 8181 | GlassFish Server (HTTPS) |
| 8333 | Bitcoin |
| 8334 | Bảng điều khiển nút Bitcoin (HTTP) |
| 8443 | HTTPS |
| 8554 | RTSP |
| 8880 | SOAP Websphere |
| 8888 | HTTP, Andromouse |
| 8889 | SmartThings Remote Access |
| 9001 | Tor OR |
| 9002 | Tor OR |
| 9051 | Tor Control |
| 9100 | Printer Job Language |
| 9151 | Tor Control |
| 9160 | Apache Cassandra |
| 9191 | Sierra wireless (HTTP) |
| 9443 | Sierra wireless (HTTPS) |
| 9595 | Agent LANDesk Management |
| 9600 | OMRON |
| 10001 | Automated Tank Gauge |
| 10243 | Microsoft-HTTPAPI/2.0 |
| 11211 | Memcache |
| 17185 | VxWorks WDBRPC |
| 12345 | Sierra wireless (Telnet) |
| 13579 | Giao diện web Media player classic |
| 14147 | FTP Filezilla |
| 16010 | Apache Hbase |
| 18245 | General Electric SRTP |
| 20000 | DNP3 |
| 20547 | ProconOS |
| 21025 | Starbound |
| 21379 | Matrikon OPC |
| 23023 | Telnet |
| 23424 | Serviio |
| 25105 | Insteon Hub |
| 25565 | Minecraft |
| 27015 | Steam A2S server query, Steam RCon |
| 27017 | MongoDB |
| 28017 | MongoDB (HTTP) |
| 30718 | Cài đặt Lantronix |
| 32400 | Plex |
| 37777 | DVR Dahuva |
| 44818 | EtherNet/IP |
| 47808 | Bacnet |
| 49152 | Supermicro (HTTP) |
| 49153 | WeMo Link |
| 50070 | HDFS Namenode |
| 51106 | Deluge (HTTP) |
| 54138 | Toshiba PoS |
| 55553 | Metasploit |
| 55554 | Metasploit |
| 62078 | Apple iDevice |
| 64738 | Mumble |
Dưới đây là phần bản dịch cho Exercise Solutions (Lời giải bài tập):
Lời giải bài tập
Trang web
Bài tập 1
title:4sics
Bài tập 2
has_screenshot:1 country:se city:nora
https://www.shodan.io/host/81.233.255.165
Bài tập 3
vuln:CVE-2014-0160 country:se ssl.version:sslv2
vuln:CVE-2014-0160 org:”tên tổ chức của bạn”
Bài tập 4
category:ics city:”tên thành phố của bạn”
Bài tập 5
category:malware country:se
Giao diện dòng lệnh
Bài tập 1
shodan download –limit -1 heartbleed-results country:se,no vuln:CVE-2014-0160
shodan parse –filters location.country_code:SE -O heartbleed-sweden heartbleed-results.json.gz
Lưu ý: Đối số –filters thực hiện tìm kiếm phân biệt chữ hoa chữ thường trên các thuộc tính là chuỗi, do đó mã quốc gia của Thụy Điển phải viết hoa.
Bài tập 2
mkdir data
shodan stream –limit 1000 –datadir data/
shodan convert data/* kml
Tải tệp KML lên https://www.google.com/maps/d/
Bài tập 3
!/bin/bash
shodan download –limit -1 malware.json.gz category:malware
for ip in shodan parse --fields ip_str malware.json.gz
do
iptables -A OUTPUT -d $ip -j DROP
done
Shodan API
Thay thế YOUR_API_KEY bằng khóa API cho tài khoản của bạn như được hiển thị trên trang web Tài khoản Shodan của bạn.
Bài tập 1
!/usr/bin/env python
Khởi tạo Shodan
import shodan
api = shodan.Shodan(“YOUR_API_KEY”)
Tạo một cảnh báo mới
alert = api.create_alert(‘Cảnh báo đầu tiên của tôi’, ‘198.20.69.0/24’)
try:
# Đăng ký dữ liệu cho cảnh báo đã tạo
for banner in api.stream.alert(alert[‘id’]):
print(banner)
except:
# Dọn dẹp nếu có bất kỳ lỗi nào xảy ra
api.delete_alert(alert[‘id’])
Gợi ý: Sử dụng lệnh alert của giao diện dòng lệnh Shodan để liệt kê và xóa cảnh báo. Ví dụ:
shodan alert list
shodan alert clear
Bài tập 2
mkdir images
Chạy lệnh trên để tạo một thư mục lưu trữ hình ảnh. Sau đó lưu mã sau vào một tệp như image-stream.py:
!/usr/bin/env python
import shodan
output_folder = ‘images/’
api = shodan.Shodan(“YOUR_API_KEY”)
for banner in api.stream.banners():
if ‘opts’ in banner and ‘screenshot’ in banner[‘opts’]:
# Tất cả hình ảnh đều là JPG hiện tại
# TODO: Sử dụng mimetype để xác định phần mở rộng tệp
# TODO: Hỗ trợ kết quả IPv6
# Tạo tên tệp bằng địa chỉ IP của nó
filename = ‘{}/{}.jpg’.format(output_folder, banner[‘ip_str’])
# Tạo tệp
output = open(filename, ‘w’)
# Hình ảnh được mã hóa bằng base64
output.write(banner[‘opts’][‘screenshot’].decode(‘base64’))
Lời giải bài tập
Trang web
Bài tập 1
title:4sics
Bài tập 2
has_screenshot:1 country:se city:nora
https://www.shodan.io/host/81.233.255.165
Bài tập 3
vuln:CVE-2014-0160 country:se ssl.version:sslv2
vuln:CVE-2014-0160 org:”tên tổ chức của bạn”
Bài tập 4
category:ics city:”tên thành phố của bạn”
Bài tập 5
category:malware country:se
Giao diện dòng lệnh
Bài tập 1
shodan download –limit -1 heartbleed-results country:se,no vuln:CVE-2014-0160
shodan parse –filters location.country_code:SE -O heartbleed-sweden heartbleed-results.json.gz
Lưu ý: Đối số –filters thực hiện tìm kiếm phân biệt chữ hoa chữ thường trên các thuộc tính là chuỗi, do đó mã quốc gia của Thụy Điển phải viết hoa.
Bài tập 2
mkdir data
shodan stream –limit 1000 –datadir data/
shodan convert data/* kml
Tải tệp KML lên https://www.google.com/maps/d/
Bài tập 3
!/bin/bash
shodan download –limit -1 malware.json.gz category:malware
for ip in shodan parse --fields ip_str malware.json.gz
do
iptables -A OUTPUT -d $ip -j DROP
done
Shodan API
Thay thế YOUR_API_KEY bằng khóa API cho tài khoản của bạn như được hiển thị trên trang web Tài khoản Shodan của bạn.
Bài tập 1
#!/usr/bin/env python
# Khởi tạo Shodan
import shodan
api = shodan.Shodan("YOUR_API_KEY")
# Tạo một cảnh báo mới
alert = api.create_alert('Cảnh báo đầu tiên của tôi', '198.20.69.0/24')
try:
# Đăng ký dữ liệu cho cảnh báo đã tạo
for banner in api.stream.alert(alert['id']):
print(banner)
except:
# Dọn dẹp nếu có bất kỳ lỗi nào xảy ra
api.delete_alert(alert['id'])
Gợi ý: Sử dụng lệnh alert của giao diện dòng lệnh Shodan để liệt kê và xóa cảnh báo. Ví dụ:
shodan alert list
shodan alert clear
Bài tập 2
mkdir images
Chạy lệnh trên để tạo một thư mục lưu trữ hình ảnh. Sau đó lưu mã sau vào một tệp như image-stream.py:
#!/usr/bin/env python
import shodan
output_folder = 'images/'
api = shodan.Shodan("YOUR_API_KEY")
for banner in api.stream.banners():
if 'opts' in banner and 'screenshot' in banner['opts']:
# Tất cả hình ảnh đều là JPG hiện tại
# TODO: Sử dụng mimetype để xác định phần mở rộng tệp
# TODO: Hỗ trợ kết quả IPv6
# Tạo tên tệp bằng địa chỉ IP của nó
filename = '{}/{}.jpg'.format(output_folder, banner['ip_str'])
# Tạo tệp
output = open(filename, 'w')
# Hình ảnh được mã hóa bằng base64
output.write(banner['opts']['screenshot'].decode('base64'))











![🎓 [CHƯƠNG TRÌNH HACKERX] – CHIÊU SINH CÁC KHÓA HỌC AN NINH TOÀN THÔNG TIN, KIỂM THỬ BẢO MẬT VÀ ỨNG PHÓ SỰ CỐ TRỰC TUYẾN](https://antoanthongtin.edu.vn/wp-content/uploads/2025/03/bandicam-2025-02-28-20-31-30-728.jpg?w=901)











Bạn phải đăng nhập để bình luận.