Shodan là một công cụ tìm kiếm dành cho các thiết bị kết nối với internet. Những web tìm kiếm như Google và Bing là công cụ tuyệt vời để tìm kiếm website. Nhưng nếu bạn muốn tìm máy tính chạy một phần mềm nhất định (ví dụ như Apache)? Hoặc bạn muốn biết phiên bản nào của Microsoft IIS phổ biến nhất? Hay bạn muốn tìm hiểu số server FTP ẩn danh hiện có? Một lỗ hổng bảo mật mới xuất hiện và bạn muốn xem nó có thể lây nhiễm bao nhiêu host? Web tìm kiếm truyền thống sẽ không thể trả lời những câu hỏi này của bạn.
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 dạng văn bản mô tả một dịch vụ trên một thiết bị. Đối với web server, đây là những header được trả lại hay với Telnet nó là màn hình đăng nhập.
Nội dung của banner biến đổi nhiều dựa theo loại dịch vụ. Ví dụ, đây là một banner
HTTP tiêu biểu:
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 web server nginx phiên bản 1.1.19. Để minh họa sự khác nhau của banner, dưới đây là một banner của giao thức hệ thống kiểm soát 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 phản hồi lại với 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à nhiều dữ liệu chi tiết khác để mô tả thiết bị.
Bạn phải quyết định loại dịch vụ bạn thích khi tìm trong Shodan bởi vì banner rất da dạng.
- Chú ý: Shodan cho phép bạn tìm banner, không phải host. Điều này có nghĩa là nếu một IP duy nhất tiếp xúc nhiều dịch vụ, chúng sẽ được mô tả như những kết quả riêng biệt.
Siêu dữ liệu
Ngoài banner, Shodan cũng thu thập siêu dữ liệu về thiết bị như địa điểm địa lí, tên host, hệ điều hành và nhiều hơn nữa (xem phụ lục A). Hầu hết các siêu dữ liệu đều có thể tìm thấy qua website chính của Shodan, tuy nhiên một số lĩnh vực chỉ có với người dùng của nhà phát triển API.
IPv6
Vào tháng 10/2015, Shodan thu thập hàng triệu banner mỗi tháng cho thiết bị có thể truy cập được trên IPv6. Những con số này vẫn là quá ít so với hàng trăm triệu banner thu thập trên IPv4 nhưng nó được dự đoán sẽ tăng lên trong những năm tiếp theo.
Thu thập dữ liệu
Tần suất
Crawler của Shodan làm việc 24/7 và cập nhật hệ thống dữ liệu trong thời gian thực. Bất cứ thời điểm nào đặt truy vấn với Shodan, bạn đều nhận được bức tranh toàn cảnh mới nhất trên Internet.
Phân phối
Crawler hiện diện ở mọi nước trên thế giới, bao gồm:
- Mỹ (Bờ biển đông và tây)
- Trung quốc
- Iceland
- Pháp
- Tây Tạng
- Việt Nam
- Romania
- Cộng hòa Séc
Dữ liệu được thu thập từ khắp thế giới để ngăn chặn định kiến địa lí. Ví dụ, nhiều quản lí hệ thống ở Mỹ chặn toàn bộ vùng IP Trung Quốc. Phân bổ crawlers khắp nơi trên thế giới đảm bào rằng việc ngăn chặn toàn bộ một nước không ảnh hưởng đến sự thu thập dữ liệu.
Ngẫu nhiên hóa
Thuật toán cơ bản của crawler là:
- Tạo ngẫu nhiên một địa chỉ IPv4.
- Tạo ngẫu nhiên một port từ danh sách port mà Shodan hiểu được
- Kiểm tra địa chỉ IPv4 ngẫu nhiên trên port ngẫu nhiên và lấy một banner
- Về lại bước 1 (Goto 1).
Điều này có nghĩa là crawler không quét khu vực mạng gia tăng. Việc crawling được thực hiện hoàn toàn ngẫu nhiên để bảo đảm độ bao phủ internet đồng nhất và phòng tránh định kiến trong dữ liệu ở mọi thời điểm.
Tìm hiểu SSL toàn diện
SSL đang trở thành một khía cạnh quan trọng hơn bao giờ hết của việc phục vụ và tiêu thụ nội dung trên internet, do đó Shodan đã mở rộng thông tin thu thập cho mọi dịch vụ SSL-capable. Banner cho dịch vụ SSL, như HTTPS, bao gồm không chỉ chứng thu SSL mà còn nhiều hơn nữa. Tất cả những thông tin SSL tìm hiểu bên dưới đều được lưu trữ trong ssl property trên banner (xem phụ lục A và phụ lục E).
Kiểm tra lỗ hổng bảo mật
Nếu dịch vụ có nguy cơ trở thành nạn nhân của Heartbleed thì banner chứa 2 thuộc tích phụ. Opts.heartbleed chứa phản hồi thô từ việc chạy kiểm tra Heartbleed đối với dịch vụ. Chú ý rằng trong kiểm tra, crawlers chỉ thu thập phần tràn nhỏ để chứng minh dịch vụ bị ảnh hưởng bởi Heartbleed mà không để lộ khóa riêng tư. Cralwers cũng thêm CVE-2014-0160 vào danh sách opts.vulns nếu thiết bị dễ bị tấn công. Ngược lại, nếu thiết bị được bảo vệ, nó sẽ thêm “!CVE-2014-0160”. Nếu một đầu vào trong
opts.vulns được cố định trước với một
! hay – thì dịch vụ không dễ bị tấn công bởi CVE cho trước.
{
"opts": {
"heartbleed": "... 174.142.92.126:8443 - VULNERABLE\n",
"vulns": ["CVE-2014-0160"]
}
}
Shodan cũng hỗ trợ tìm kiếm bằng thông tin lỗ hổng. Ví dụ, để tìm thiết bị ảnh hưởng bởi Heartbleed ở Mỹ bằng Shodan, sử dụng:
country:US vuln:CVE-2014-0160
Nếu dịch vụ hỗ trợ mật mã EXPORT thì crawler sẽ thêm “CVE-2015-0204” vào thuộc tính
opts. Vulns.
"opts": {
"vulns": ["CVE-2015-0204"]
}
Crawler cố gắng kết nối với dịch vụ SSL sử dụng mật mã Diffie-Hellman. Nếu kết nối thành công thì thông tin dưới đây sẽ đượ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 một dịch vụ SSL, nó sẽ xem xét phiên bản SSL và mật mã nên được dùng với server. Sau đó nó sẽ chấp nhận một phiên bản SSL nhất định, như TLSv1.2, và sử dụng phiên bản đó cho giao tiếp.
Crawler của Shodan bắt đầu kiểm tra SSL bằng cách gửi yêu cầu thông thường như đã nói ở trên, khi mà nó bắt đầu xem xét với server. Tuy nhiên sau đó, nó sẽ cố gắng kết nối với server sử dụng một phiên bản SSL nhất định một cách rõ ràng. Nói cách khác, crawler cố gắng kết nối với server sử dụng SSLv2, SSLV3, TLSv1.0, TLSv1.1 và TLSv1.2 để quyết định tất cả những phiên bản mà dịch vụ SSL hỗ trợ. Những thông tin thu thập được có trong khu vực ssl.versions:
{ "ssl": {
"versions": ["TLSv1", "SSLv3", "-SSLv2", "-TLSv1.1", "-TLSv1.2"]
}
}
Nếu phiên bản có một dấu – trước tên thì thiết bị không hỗ trợ phiên bản SSL đó. Nếu không bắt đầu với dấu – thì dịch vụ hỗ trợ phiên bản SSL cho trước.
Ví dụ, server 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ể tìm kiếm qua website/API. Ví dụ, lệnh tìm kiếm sau sẽ phản hồi với tất cả dịch vụ SSL (HTTPS, POP3 với SSL, etc.) cho phép kết nối sử dụng SSLv2:
ssl.version:sslv2
Theo chuỗi
Chuỗi chứng thư là danh sách chứng thư SSL từ user gốc đến user cuối. Banner cho dịch vụ SSL bao gồm thuộc tính ssl.chain bao gồm tất cả các chứng thư SSL thuộc chuỗi trong chứng thư xếp theo thứ tự PEM.
Vượt qua nền tảng
Đối với đa số dịch vụ, crawler cố gắng phân tích văn bản banner chính và phân tách các thông tin hữu ích. Một vài ví dụ gồm thu thập tên của MongoDB, chụp ảnh màn hình từ dịch vụ desktop xa và dự trữ danh sách đồng đẳng cho Bitcoin. Có hai phương pháp phân tích dữ liệu nâng cao Shodan sử dụng mà tôi muốn nhấn mạnh.
Thành phần cấu tạo web
Crawler cố gắng xác định các công nghệ web sử dụng để tạo ra website. Với mô đun http và https, header và HTML được phân tách để xem xét thành phần cấu tạo của website. Thông tin kết quả được lưu trữ trong thuộc tính http.components. Thuộc tính là một từ điển công nghệ, nơi mà khóa là tên công nghệ (ví dụ như jQuery) và giá trị là một từ điển khác với thuộc tính của các loại. Thuộc tích phân loại là danh sách các loại liên quan đến công nghệ. Ví dụ:
"http": {
...
"components": {
"jQuery": {
"categories": ["javascript-frameworks"]
},
"Drupal": {
"categories": ["cms"]
},
"PHP": {
"categories": ["programming-languages"]
}
},
...
},
Thuộc tính
http.components cho thấy website đang chạy hệ thống quản lí nội dung Drupal, mà hệ thống này lại sử dụng jQuery và PHP. Shodan REST API làm thông tin có thể tìm kiếm được qua bộ lọc r http.component and 2 khía cạnh (http.component and http.component_category). Để có danh sách toàn bộ những giá trị thành phần/ loại có thể có, hãy sử dụng những khía cạnh mới.
Ví dụ, để lấy tất cả loại có thể sử dụng lệnh shodan sau đây:
$ shodan stats --facets http.component_category:1000 http
Top 47 Results for Facet: http.component_category
javascript-frameworks 8,982,996
web-frameworks 1,708,503
programming-languages 1,409,763
font-scripts 1,280,397
Tác động nối tiếp
Nếu banner trả lại thông tin về đồng đẳng hay một địa chỉ IP khác chạy dịch vụ thì crawler sẽ thực hiện thu thập banner trên IP/dịch vụ đó. Ví dụ: port mặc định của đường chủ lực DHT (sử dụng bởi Bittorrent) là 6881. Banner của nút DHT đó như sau:
DHT Nodes
97.94.250.250 58431
150.77.37.22 34149
113.181.97.227 63579
252.246.184.180 36408
83.145.107.53 52158
77.232.167.126 52716
25.89.240.146 27179
147.23.120.228 50074
85.58.200.213 27422
180.214.174.82 36937
241.241.187.233 60339
166.219.60.135 3297
149.56.67.21 13735
107.55.196.179 8748
Trước đó, một crawler sẽ bắt lấy banner trên và tiếp tục. Kích hoạt tấn công đối tiếp đối với bắt banner DHT thì crawler sẽ phát nhiều yêu cầu bắt banner mới trên tất cả đồng đẳng. Trong ví dụ trên, crawler sẽ khởi chạy một lần quét cho IP 54.70.96.157 trên port 61770 sử dụng công cụ bắt banner, IP 85.82.92.188 trên port 42155... Ví dụ: lần quét duy nhất cho một IP có thể tạo ra tấn công quét nối tiếp nếu dữ liệu quét đầu tiên chứa thông tin về host tiềm năng.
Để theo dõi mối quan hệ giữa yêu cầu quét ban đầu và các yêu cầu con/nối tiếp, chúng tôi giới thiệu hai thuộc tính:
- _shodan.id: một ID duy nhất cho banner. Thuộc tính này được bảo đảm tồn tại nếu yêu cầu nối tiếp có thể khởi chạy từ dịch vụ, mặc dù điều đó không có nghĩa là mọi yêu cầu nối tiếp đều thành công.
- _shodan.options.referrer: cung cấp ID duy nhất cho banner, từ đó dẫn đến sự hình thành banner hiện tại. Ví dụ: referrer là cha đẻ của banner hiện tại.