Giới thiệu NX và ASLR

Thảo luận trong 'Exploitation' bắt đầu bởi tmnt53, 23/03/17, 03:03 AM.

  1. tmnt53

    tmnt53 VIP Members

    Tham gia: 25/04/15, 09:04 AM
    Bài viết: 127
    Đã được thích: 97
    Điểm thành tích:
    28
    Trong bài trước (Video hướng dẫn khai thác BoF cơ bản - https://whitehat.vn/threads/video-huong-dan-khai-thac-bof-co-ban.8391/), mình chưa đề cập đến hai vấn đề: cơ chế ASLR và NX trên Ubuntu (hay Linux nói chung). Hôm nay mình trình bày về hai nội dung này.

    NX (Non-eXecute – Chống thực thi)

    Đây là tính năng ngăn chặn việc thực thi các đoạn mã trong các vùng nhớ chứa data (stack, heap,…). Tính năng này yêu cầu CPU phải hỗ trợ, và HĐH phải sử dụng chế độ địa chỉ “PAE”.

    PAE - Page Address Extension (hay Physical Address Extension), là chế độ truy cập địa chỉ theo Page của CPU. Khi CPU thực thi một lệnh, nó sẽ kiểm tra trong Page Table Entry xem bít NX có được bật không. Nếu không được bật thì lệnh tại đó sẽ không được thực thi. Như trong hình dưới (XP – Settings) là tùy chọn cài đặt cho một máy ảo XP của VirtualBox. Các bạn thấy trong đó có một tùy chọn là Enable PAE/NX. Nếu bật tùy chọn này lên thì máy ảo mới có tính năng Chống thực thi dữ liệu DEP – Data Execution Prevention.


    pae.png

    Khi bật tính năng này lên, shellcode trên stack của ta sẽ không chạy được (trong bài printHello lần trước mình dùng con shellcode binsh vất lên stack). Để có thể demo được, mình phải tắt tính năng này đi

    Các cách tắt DEP trên Ubuntu:

    Tắt khi biên dịch: gcc -z execstack -o outFile inFile.c

    Tắt bằng cách này, gcc sẽ đánh dấu stack là RWE, tức là có quyền thực thi.

    Để kiểm tra quyền thực thi trên stack, dùng:

    readelf -l fileName


    readelf.png

    Tắt tại kernel (HĐH):

    Kể cả các vùng nhớ được đánh dấu là không có quyền thực vẫn thực thi được.

    Thêm noexec=off vào dòng linux trong menu-entry của grub.cfg (thông thường, grub.cfg nằm trong /boot/grub/)

    Mỗi lần update-grub thì file này bị thay đổi dữ liệu hoàn toàn, nên ta phải sửa lại menu-entry sau mỗi lần update-grub

    Kiểm tra nx đang bật hay tắt bằng: dmesg | grep NX

    Tắt NX của máy ảo VirtualBox

    Như hình “XP – settings” trên, để tiện việc demo, ta có thể tắt DEP luôn bằng tùy chọn của VirtualBox mà không phải động đến file thực thi hay HĐH.

    ASLR (Address space layout randomization – Random địa chỉ)

    Tính năng này được cài đặt bởi HĐH. Mỗi khi load một file chạy lên, địa chỉ các phân vùng bộ nhớ (stack, heap, thư viện chia sẻ shared library) sẽ thay đổi. Điều này khiến hacker khó tạo file exploit hơn, vì địa chỉ của các hàm, dữ liệu không cố định.

    Khi nghiên cứu khai thác, ta đôi khi phải tắt ASLR đi, để khai thác được dễ dàng hơn.

    Để tắt ASLR:

    Tắt aslr tạm thời (khi khởi động lại thì aslr lại bật): echo 0 > /proc/sys/kernel/randomize_va_space

    Bật aslr lại: echo 2 > /proc/sys/kernel/randomize_va_space
    Muốn tắt vĩnh viễn, tạo file /etc/sysctl.d/01-disable-aslr.conf có nội dung

    kernel.randomize_va_space = 0

    Như vậy, khi thực hiện tìm hiểu cơ bản về khai thác trên Linux, hãy nhớ tắt 2 tính năng này đi trước nhé.

    Tham khảo:
     
    Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
    Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
    whf thích bài này.