Lỗ hổng bảo mật trong các camera quan sát
Từ nhiều năm nay, hình ảnh từ các camera giám sát trên thế giới có thể được tìm thấy một cách dễ dàng qua các trang tìm kiếm trên Internet. Máy tìm kiếm thiết bị nổi tiếng Shodan (http://www.shodanhq.com/) đã giúp chuyên gia bảo mật Dan Tentler phát hiện và công bố gần một triệu camera lộ thông tin trên Internet. Nhưng đó mới chỉ là những máy quay “mở” hay sử dụng mật khẩu mặc định của nhà sản xuất. Tại Hội nghị BlackHat 2013 (Mỹ) vừa qua, chuyên gia bảo mật Craig Heffner đã trình bày về lỗ hổng bảo mật và cách hack hơn 50 loại camera khác nhau, từ những loại dùng cho gia đình đến dòng cao cấp, chuyên dụng.
Dưới đây giới thiệu các loại camera mà Craig Hefffner đã khám phá.
1. Camera an ninh cao cấp ngoài trời D-Link DCS-7410 cho phép ghi hình cả ngày và đêm, có hỗ trợ khởi động qua mạng (Power over Ethernet). Giao diện quản trị của DCS-7410 được cung cấp qua web server nguồn mở lighttpd, nhưng script rtpd.cgi của nó lại chứa lỗi bảo mật nghiêm trọng. Script này xử lý các tham số đầu vào bằng cách thay thế tất cả các dấu “&” bằng khoảng trắng rồi đánh giá kết quả. Do dữ liệu trong $QUERY_STRING được xử lý một cách “máy móc”, một tin tặc không được hệ thống xác thực cũng có thể thực hiện bất kỳ lệnh nào bằng cách chỉ định nó trong các tham số HTTP GET:
$ wget http://192.168.1.101/cgi-bin/rtpd.cgi?reboot
Vì lighttpd và các script CGI mà nó thực thi được chạy với quyền root, nên lệnh mà tin tặc gửi vào cũng có quyền root. Hơn nữa, kết quả của câu lệnh sẽ được gửi lại cho trình duyệt web của tin tặc, nên sẽ cung cấp cho chúng một giao diện thực thi lệnh bằng quyền root qua web. Tin tặc cũng có thể lợi dụng lỗ hổng này để lấy được mật khẩu quản trị không được bảo mật của camera. Lệnh sau sẽ được thực hiện bởi các script khởi động của camera để đọc mật khẩu quản trị từ NVRAM:
echo AdminPasswd_ss | tdb get HTTPAccount
Thay thế các khoảng trắng bằng các dấu & để truyền cho rtpd.cgi, yêu cầu của tin tặc sẽ có dạng:
$ wget http://192.168.1.101/cgi-bin/rtpd.cgi?echo &
AdminPasswd_ss|tdb&get&HTTPAccount
Và đây là kết quả được trả cho tin tặc:
AdminPasswd_ss|=”prk441889j”
Usage: tpd.cgi?action =[start|stop|restart|status|get|set]&...
Điểm yếu này đã được xác nhận có trong hầu hết các phiên bản firmware cho các loại camera của nhà cung cấp D-Link và Trendnet. Tháng 2/2013, Shodan cho biết có hơn 20 ngàn camera loại này có thể truy cập rộng rãi hoặc có thể bị tấn công qua lợi dụng điểm yếu trên để lấy cắp dữ liệu.
2. Camera không dây Linksys WVC80N là loại camera IP ghi hình ảnh màu và âm thanh dùng giao thức không dây. Trong cấu hình mặc định cho giao diện web của nó, tất cả người dùng không có quyền (kể cả người dùng chưa được xác thực) đều có thể truy cập địa chỉ /img/snapshot.cgi (trên thực tế là một symlink tới tệp /adm/ez.cgi). Tệp thi hành ez.cgi được tham chiếu tới bởi khá nhiều symlink khác và chọn thực hiện tác vụ dựa trên việc symlink được gọi. Tác vụ của snapshot.cgi được xử lý bởi hàm sub_AE64. Tuy nhiên, hàm sub_AE64 chứa một lỗi nghiêm trọng: nó lấy biến môi trường QUERY_STRING chứa dữ liệu do người dùng cung cấp và dùng hàm strcpy để chép dữ liệu đó vào một ngăn xếp có kích thước cố định tên là “dest”. Biến dest chỉ nằm cách địa chỉ quay về được lưu trên ngăn xếp đó có 152 byte. Vì thế địa chỉ quay về có thể bị ghi đè một cách dễ dàng khi người dùng gửi một chuỗi yêu cầu lớn hơn hoặc bằng 152 byte cho /img/snapshot.cgi:
$ wget http://192.168.1.101/img/snapshot.cgi?$(perl -e ‘print “A”x152’)
Tin tặc có thể tạo ra những cách phá hoại theo ý mình bằng cách tạo các yêu cầu đặc chế. Và do tệp ez.cgi binary cũng xử lý các yêu cầu cho các symlink bị hạn chế khác, tin tặc có thể khiến hàm bị lỗi gọi đến các chức năng mà chỉ có người quản trị được phép dùng. Hàm xử lý cho symlink admcfg.cfg (sub_9B88) có lẽ là hàm dễ thấy và dễ bị lợi dụng nhất; nó không cần tham số nào và trả lại cấu hình hiện thời cho người yêu cầu, trong đó bao gồm cả thông tin tài khoản quản trị và mạng không dây:
$ wget http://192.168.1.101/img/snapshot.cgi?$
(perl -e ‘print “A”x148; print “\x88\x9B”’)
Gửi yêu cầu không cần xác thực trên tới camera sẽ trả về một tệp cấu hình được mã theo base64. WVC80N dùng một chuỗi khóa không chuẩn cho base64. Việc thay thế chuỗi khóa chuẩn của base64 bằng chuỗi tùy biến trong môđun Python không phải là việc quá khó và tin tặc sẽ giải mã được toàn bộ tệp cấu hình, trong đó có cả tài khoản/ mật khẩu trần cho quản trị và mạng không dây:
admin_name=admin
admin_password=11696626
wlan_essid=chupaca
wpa_ascii=grreatcoloroloc1873
Với những thông tin này trong tay, tin tặc có thể truy cập mạng không dây của camera, đồng thời nắm quyền quản trị thiết bị, kể cả việc bật/ tắt âm thanh và cập nhật firmware mới. Lỗ hổng này đã được xác nhận có trong tất cả các phiên bản firmware của WVC80N và phiên bản trước đó của nó là WVC54GCA. Đến tháng 2/2013, Shodan cho biết có hơn 8.200 camera loại này ở các gia đình, doanh nghiệp và công trình xây dựng có thể truy cập rộng rãi, phần lớn trong số đó cho phép truy cập không cần xác thực đến /img/snapshot.cgi.
3. Cisco PVC-2300 là một máy quay internet có khả năng khởi động qua mạng, được thiết kế cho yêu cầu giám sát của các doanh nghiệp nhỏ. Giao diện quản trị qua web của nó được bảo vệ trong các tệp .htpasswd trong các thư mục con của web root directory. Chỉ có một thư mục con trong đó không chứa tệp .htpasswd là /usr/local/www/oamp. Thư mục này chỉ chứa hai tệp thi hành là oamp.cgi và oamp_loadFirmware, các tệp XML còn lại được symlink tới oamp.cgi. Kiểm tra nhanh tệp oamp.cgi cho thấy nó cần một tham số GET được thiết lập. Tham số này có thể nhận nhiều giá trị khác nhau như download-ConfigurationFile, uploadConfigurationFile, updateFirmware, load-Firmware,.... Tuy nhiên, trước khi thực hiện tác vụ được chỉ định, oamp.cgi sẽ kiểm tra xem có session ID hợp lệ hay không. Nếu không có session ID hợp lệ nào được cung cấp, tác vụ duy nhất được phép thi hành là đăng nhập. Hàm chịu trách nhiệm kiểm tra việc đăng nhập nhận tên người dùng và mật khẩu trong yêu cầu GET. Sau đó, nó lấy giá trị của các khóa l1_user và l1_pwd từ tệp cấu hình của camera. Cuối cùng, nó so sánh giá trị của l1_usr và l1_pwd với tên người dùng và mật khẩu được cung cấp. Nếu chúng khớp nhau, một session ID hợp lệ sẽ được cấp. Vấn đề là ở chỗ giao diện OAMP này hoàn toàn không được công bố và các giá trị l1_usr, l1_pwd (độc lập với tài khoản quản trị chính và được đặt cùng giá trị mặc định cho tất cả các camera PVC-2300) không thể được thay đổi một cách dễ dàng. Tin tặc có thể lấy được một OAMP session ID hợp lệ bằng cách tạo yêu cầu sau:
$ wget http://192.168.1.101/oamp/System.xml?action= login&user=L1_admin&password=L1_51
Giá trị session ID sẽ được chỉ ra trong HTTP header trả về.
Với thông tin này, tin tặc có thể dễ dàng gọi thực hiện bất kỳ tác vụ nào ở trên khi cung cấp session ID trong yêu cầu gửi tới camera. Yêu cầu sau sẽ tải xuống tệp cấu hình hiện thời của camera; lưu ý rằng yêu cầu có thể được gửi tới bất kỳ tệp XML nào, vì chúng đều là symlink tới oamp.cgi:
$ wget —header=”sessionID: 57592414”
http://192.168.1.101/oamp/System.xml?action=downloadConfigurationFile
Tệp trả về được mã bằng base64 phi chuẩn. Thay thế giá trị khóa chuẩn trong môđun base64 viết bằng Python bởi giá trị lấy được khi phân tích các hàm encode64 và decode64 (lại là việc thay thế giá trị khóa chuẩn bằng một giá trị tùy biến), tin tặc có thể giải mã toàn bộ tệp cấu hình, trong đó có cả mật khẩu trần của tài khoản quản trị.
Ngoài việc cho phép tin tặc truy cập luồng video và giao diện quản trị, lỗ hổng này còn khiến tác vụ loadFirmware có thể bị lợi dụng để giúp tin tặc chiếm quyền root. Lỗ hổng này đã được xác nhận có trong tất cả các phiên bản firmware của các camera PVC-2300 và WVC-2300 của Cisco. Kết quả tìm kiếm qua Shodan vào tháng 2/2013 cho thấy có hơn 400 camera loại này có thể truy cập rộng rãi (hoặc có thể bị tấn công) đang được lắp đặt tại các khách sạn, phòng máy chủ và các công ty phát triển thiết bị các trạm vũ trụ quốc tế.
4. Camera ngoài trời có độ phân giải cao IQ832N thuộc dòng sản phẩm Sentinal của IQInvision. Theo mặc định, những camera này cung cấp hình ảnh cho người dùng không cần xác thực và trong số các cơ sở lắp đặt loại camera này đã được kiểm tra, không có cơ sở nào thay đổi thiết lập mặc định đó. Mặc dù giao diện quản trị được bảo vệ bằng mật khẩu, nhưng việc cho phép truy cập bất kỳ tài nguyên nào mà không cần xác thực đã giúp tin tặc tấn công dễ dàng hơn. Vũ khí mà tin tặc có thể lợi dụng trong thiết bị này là trang oidtable.cgi. Trang CGI này chấp nhận một tham số duy nhất: grep, dùng để lọc các kết quả trả về. Sau khi kiểm tra rằng giá trị của grep ngắn hơn 32 ký tự, oidtable.cgi dùng hàm sprintf để đưa giá trị của grep vào một chuỗi lệnh rồi chuyển cho popen. Điều này cho phép tin tặc dễ dàng chèn các lệnh của hệ điều hành và thi hành chúng với quyền root. Hơn thế nữa, kết quả của các lệnh đó sẽ được gửi lại cho trình duyệt web của tin tặc:
$ wget http://192.168.101/oidtable.cgi?grep=
’$IFS/tmp/a;ps;’
Tuy chuỗi grep bị giới hạn trong 32 ký tự, các lệnh dài hơn có thể được ghi vào một shell script để thực hiện sau. Ngoài ra, camera này được cài thêm netcat với tham số -e nổi tiếng được kích hoạt, cho phép tin tặc khởi tạo một shell reverse-callback đơn giản. Lỗ hổng này có thể được lợi dụng để lấy hoặc thay thế mật khẩu quản trị mã hóa (được lưu trong /etc/privpasswd). Mật khẩu mã hóa bằng DES này có thể bị giải mã bằng các công cụ như John the Ripper:
$ wget http://192.168.1.101/oidtable.cgi?grep=
’$IFS/etc/privpasswd;’
Phần lớn các dòng sản phẩm của IQInvision có lỗ hổng này, trong đó có các camera 3-series, 7-series, Sentinel, Alliance-Pro, Alliance-MX và Alliance-Mini. Tháng 2/2013, Shodan cho thấy có hơn 100 camera loại này có thể truy cập rộng rãi (hoặc có thể bị tấn công).
5. Camera ngoài trời có độ phân giải cao N5071 của 3SVision có chức năng pan/tilt. Web server của camera này đã thấy được tài khoản và mật khẩu quản trị (3sadmin:27988303) được gắn cứng trong tệp thi hành.
Bất kỳ ai cũng có thể dùng các thông tin trên để truy cập với quyền quản trị tới camera. Cũng như các camera khác được đề cập tới trong bài viết này, mã nguồn của N5071 chứa đầy các lệnh gọi tới các hàm không an toàn như system, sprintf và strcpy. Phần lớn các sản phẩm của 3Svision đều chứa thông tin gắn cứng trong chương trình (như đã đề cập trên đây), kể cả các video server S2071 và S4071. Nhiều camera và video server do Alinking sản xuất của cùng một loại web server như vậy nhưng với giá trị mật khẩu khác. Các thiết bị camera của một số nhà cung cấp: 3Svision, Alinking, đã được xác nhận chứa lỗ hổng “chết người” trên.
Tháng 2/2013, Shodan cho biết có hơn 100 camera loại này có thể truy cập rộng rãi (hoặc có thể bị tấn công).
Thực nghiệm tấn công
Tại Blackhat 2013, Craig Heffner đã trình diễn có thể thay luồng video gửi đến người dùng của camera Trendnet TV-IP410WN bằng một ảnh tĩnh mà vẫn truy cập được luồng video thực. Ông cho biết chọn loại máy quay này không phải vì nó rẻ mà vì nó có điểm yếu cùng lớp với các loại máy khác đã được nêu. Thiết bị này chứa một tài khoản cửa (productmaker:ftvsbannedcode) và nhiều lỗ hổng cho phép chèn lệnh, tạo một web root shell có sẵn để thực thi các lệnh trên hệ thống. Tận dụng những lỗ hổng đó, tin tặc có thể truy cập từ xa, kiểm tra hệ thống để xác định tiến trình nào chịu trách nhiệm cung cấp luồng video cho người dùng. Tiến trình cung cấp luồng video qua web cho người dùng có tên là mjpg.cgi. Mỗi người dùng hợp pháp truy cập giao diện web của camera sẽ được một bản của mjpg.cgi phục vụ.
Trong một cuộc trình diễn, chiếc camera được dùng để giám sát một vật thể của người quản trị đã bị tin tặc vô hiệu bằng cách “kill” tiến trình mjpg.cgi có trách nhiệm gửi luồng video đến trình duyệt web của chủ nhân hợp pháp. Khi đó, hình ảnh hiển thị trên trang web của người quản trị chỉ là hình ảnh cuối của vật thể trước khi nó bị tin tặc lấy cắp. Phương pháp này cực kỳ đơn giản và hiệu quả nhưng có một nguy cơ khá lớn: nếu người quản trị làm mới trang web, anh ta sẽ lại nhận được những hình ảnh từ camera và phát hiện thấy vật thể đã biến mất. Một cách tấn công tinh vi hơn sẽ thay thế tệp mjpg.cgi với một tệp thi hành được khác do tin tặc lựa chọn để gửi các hình ảnh giả đến cho người quản trị. Có thể làm điều đó chỉ với một hình ảnh tĩnh và một script bash như sau:
#!/bin/sh
echo -ne “HTTP/1.1 200 OK\r\nContent-Type: image/jpeg\r\n\r\n”
cat /tmp/static_img.jpg
Nếu tin tặc thay tệp mjpg.cgi gốc trên đĩa với script trên đây, mỗi khi người quản trị yêu cầu xem video qua web, anh ta sẽ chỉ nhìn thấy hình ảnh tĩnh mà tin tặc lựa chọn. Nếu khéo léo hơn, tin tặc có thể tạo một bản sao của tệp mjpg.cgi ở một chỗ khác trong thư mục web root để có thể truy cập và xem những hình ảnh thực từ camera.