Tản mạn về Pwn [Ep0] - Giới thiệu

Hello mọi người . Cũng lâu rồi mình chưa viết cái write ups nào lên page (lười btw ) Nên mình cũng muốn giới thiệu về Pwn, một mục không thể thiếu trong bộ tứ CTF: Web, Crypto, RE và cuối cùng về Pwn - cũng chính là category mà mình chơi chính cho nhóm kể từ khi vào CLB an toàn thông tin của trường. Đây cũng được xem là mục khó nhất, đa số làm việc trên binary (kể cả foreign architecture, sẽ nói ở mục sau) và tương tác hoàn toàn với server -> Gây khó khăn cho những bạn mới biết đến bộ môn này. Do đó mình sẽ cố gắng giải thích chi tiết từng phần từ dễ đến khó + visualize hết mức có thể, mong mọi người ủng hộ .

Pwn là gì ?

Theo Urban dictionary, pwn có nguồn gốc từ own, được hiểu theo nghĩa là hành động “dominate” đối thủ. Và với các cuộc thi CTF, “đối thủ” ở đây sẽ các server được ban tổ chức cung cấp, tìm ra lỗi, qua mặt hệ thống và chiếm quyền (lộ file quan trọng hay thậm chí là tùy ý thực hiện lệnh trên victim) . Thông thường, Pwn sẽ được hiểu theo 2 hướng: privilege escalationbinary exploitation, tuy nhiên trong suốt series này sẽ nói chung về binary exploitation bởi tính đơn giản và giảm thiểu việc guessing, pentest trên toàn hệ thống…

Pwn sẽ được ứng dụng vào thực tế như thế nào?

  • Khai thác lỗi ở kernel linux -> Ảnh hưởng tới các máy chủ, hệ thống router có sử dụng nhân linux.
  • Khai thác lỗi ở phần mềm, ví dụ như Chrome V8 engine, sudo, …

Kiến thức cần thiết

  • Bắt buộc phải có:
    • Khả năng đọc code C
      • Kiểu dữ liệu (đặc biệt là con trỏ) cùng với kích thước
      • Các hàm thông dụng (từ thư viện string.h, stdio.h, …) và một số hàm từ POSIX như read, write, mmap,…
    • Cơ bản về python (ở đây là python3)
      • Kiểu dữ liệu (bytearray)
      • Các cấu trúc lặp, rẽ nhánh
      • Khả năng sử dụng thư viện chuyên dùng cho pwn (pwntools), hoặc native library với struct, socket
  • Có thể có: Assembly… , bao gồm i386, x86-64, arm64, mipsel64…

Yêu cầu hệ thống

  • Cài đặt Ubuntu WSL2 (nên chọn phiên bản mới nhất), hoặc thực hiện ngay trên máy ảo / vật lý có cài Ubuntu. Các máy chủ challenge sẽ dùng Ubuntu để chạy app -> Không nên dùng hđh khác để pwn.

  • Python 3 bản mới nhất

  • Thư viện pwntools:

    1
    2
    3
    4
    sudo apt-get update
    sudo apt-get install python3 python3-pip python3-dev git libssl-dev libffi-dev build-essential
    sudo python3 -m pip install --upgrade pip
    sudo python3 -m pip install --upgrade pwntools
  • Pwninit (Cần phải cài rust trước):

    1
    2
    3
    4
    sudo apt-get openssl liblzma-dev pkg-config
    git clone https://github.com/io12/pwninit
    cd pwninit
    cargo install pwninit
  • one_gadget (Cần cài ruby trước):

    1
    sudo gem install one_gadget
  • Một số dependency cho foreign architecture:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # i386
    sudo apt install libc6-i386
    # qemu-user
    sudo apt install qemu-user
    sudo mkdir /etc/qemu-binfmt
    # ARMv5
    sudo apt install libc6-armel-cross
    sudo ln -s /usr/arm-linux-gnueabi /etc/qemu-binfmt/arm
    # MIPS
    sudo apt install libc6-mipsel-cross
    sudo ln -s /usr/mipsel-linux-gnu /etc/qemu-binfmt/mipsel
  • Phần mềm dịch ngược: có thể tìm trên mạng phiên bản “đã mở khóa” của IDA, nếu không đảm bảo về nguồn gốc thì nên sử dụng trên máy ảo. Phần này sẽ tự tìm hiểu, do trong khuôn khổ bài viết sẽ không cần yêu cầu về việc dịch ngược.

  • Cuối cùng là plugin hỗ trợ cho việc debug: GEF

    1
    bash -c "$(curl -fsSL https://gef.blah.cat/sh)"

Những phần tiếp theo (dự kiến)

  • Interger overflow & signal
  • Out-of-bound (OOB) overwrite vulnerability
  • Return Oriented Programming (ROP)
  • Shellcode
  • Format string (printf) vulnerability
  • Heap…

Một số đầu sách nên đọc: