Xin chào,
Hôm nay, chúng ta sẽ học qua về 2 text editor là Nano và Vim, và cách chúng ta lợi dụng 2 text editor này để thực hiện tấn công Leo Thang Đặc Quyền nếu như Nano và Vim được cấp SUID. Đồng thời, chúng ta cũng sẽ thực tập viết một file Bash scripting đơn giản ở phần 2 của bài.
Để tiện cho việc thực hành, chúng ta sẽ không sử dụng máy Linux của phòng Learn Linux trên TryHackMe mà sẽ sử dụng hệ thống Kali Linux của chúng ta luôn nhé.
1/ Nano và Vim (Task 37)
Ở những bài trước, nếu ta muốn tạo một file tên hello.txt có nội dung “Xin chao”, ta thường sử dụng lệnh echo theo cú pháp sau:
echo "Xin chao" > hello.txt
Cách làm này có phần không hiệu quả khi nội dung chúng ta cần lưu là một bài viết gồm nhiều đoạn văn hoặc mã nguồn (source code) của một ứng dụng. Chưa kể, việc chỉnh sửa nội dung bên trong file cũng không dễ dàng nếu chúng ta chỉ dùng lệnh echo và các operators. Text editor đã ra đời để giải quyết vấn đề đó.
Bạn có thể hiểu text editor như là một trình soạn thảo văn bản gọn nhẹ với chức năng rất cơ bản nếu so sánh nó với bộ Microsoft Office. Các text editors không thể xử lý hình ảnh, bảng tính như Word hay Excel, nó chỉ có chức năng chỉnh sửa những nội dung chỉ bao gồm chữ số và ký tự. Vì lẽ đó, các text editors thường được dùng để ghi chú nhanh những đoạn văn bản không đòi hỏi cách thức trình bày phức tạp. Ngoài ra, text editors còn được rất nhiều lập trình viên dùng để biên soạn code. Chúng ta có những text editors với giao diện GUI đẹp mắt nổi tiếng như Atom, Sublime, v.v. cũng như những text editor chỉ có giao diện dòng lệnh như Emac, Vim, Nano, v.v.
Hôm nay chúng ta sẽ làm quen với 2 trình text editors dòng lệnh phổ biến trên hệ thống Linux đó là Nano và Vim.
1a/ Nano
Nano là một trình text editor trên giao diện dòng lệnh được cài đặt sẵn trên khá nhiều Linux distros. Do sự đơn giản của nó, Nano rất thích hợp đối với những người mới bắt đầu làm quen với giao diện dòng lệnh trên Linux.
Giao diện chính của Nano sẽ như sau:

Các bạn có thấy những dòng hướng dẫn sử dụng ở dưới cùng không?

Đây là những chức năng Nano cung cấp phục vụ trong quá trình soạn thảo văn bản hoặc chỉnh sửa code. Dấu “^” chính là phím Ctrl. Ví dụ: Để thoát khỏi Nano chúng ta sẽ sử dụng tổ hổ phím:
Ctrl + X
Các bạn có thể sử dụng Nano để tạo một file text đơn giản hoặc chỉnh sửa một file nào đó bằng câu lệnh sau:
nano <tên-file>
Chúng ta sẽ thực hành với Nano thông qua vài ví dụ sau:
Ví dụ 1: Tạo một file text có nội dung như bên dưới được lấy từ trang sau. File text có tên là sach.txt
“Quyển 1: Penetration Testing: A Hands-On Introduction to Hacking
Mình khá thích quyển này, đây là quyển mình đã dùng cách đây một năm rưỡi khi mới bắt đầu làm quen với pentest. Vì sách xuất bản từ tận 2014, nên việc tự tìm phần mềm để build lab theo hướng dẫn trong sách khá khoai, cũng như một số kỹ thuật tấn công cũng đã cũ và không còn mấy hữu dụng. Thế nhưng cá nhân mình đánh giá ở mặt trang bị kiến thức căn bản như build lab, tìm hiểu sơ lược về hệ thống, mạng, các hình thức tấn công phổ biến thì sách lại làm rất tốt.
Đặc biệt, mình rất thích phần Exploit Development vì kỹ thuật tấn công Buffer Overflow giống 100% với khi mình luyện OSCP.”
Thực hành
B1: Tạo file sach.txt
nano sach.txt
B2: Copy và paste nội dung màu cam bên trên vào file sach.txt

Như các bạn thấy, trong text editor, do không có giới hạn lề để tự xuống dòng, nên nguyên một đoạn văn dài sẽ được thể hiện trong cùng một dòng. Để cho nội dung dễ đọc hơn bạn có thể sử dụng phím enter để xuống dòng.

Lưu ý 1:
Trong các trình text editors trên giao diện dòng lệnh, bạn không thể sử dụng chuột để điều hướng mà phải sử dụng 4 phím mũi tên để di chuyển bên trong text editors.

Để xóa nội dung, các bạn sử dụng phím backspace (<) y như trong Microsoft Word.
B3: Lưu file
Để lưu file, các bạn sẽ bấm tổ hợp
Ctrl + X
Bạn sẽ được hỏi là có muốn lưu file không? Bạn sẽ trả lời Y

Ví dụ 2: Chỉnh sửa file sach.txt
B1: Mở file sach.txt bằng Nano
nano sach.txt
B2: Thêm nội dung bên dưới vào cuối file sach.txt
“Tự học An Ninh Mạng”

B3: Lưu lại nội dung file và thoát Nano
Ctr + X
Y
Ví dụ 3: Tạo file chứa mã nguồn hello.c
B1: Các bạn tạo file hello.c với Nano, tuy nhiên lần này, chúng ta sẽ sử dùng thêm flag -l để hiện ra số dòng
nano -l hello.c
B2: Các bạn copy/past đoạn code bên dưới vào file hello.c
#include <stdio.h>
int main(void)
{
printf("Hello World\n");
return 0;
}
Đoạn code trên có chức năng in ra dòng chữ “Hello World” sau đó thoát chương trình.
Trong hình bên dưới, các bạn có thể thấy khi sử dụng flag -l, các dòng sẽ được đánh số để giúp lập trình viên dễ chỉnh sửa code hơn.

B3: Lưu lại file và thoát Nano
Ctrl + X
Y
Lưu ý 2: Privilege escalation (leo thang đặc quyền) với Nano
Trình text editor Nano cho phép người sử dụng có thể thực thi câu lệnh bên trong Nano. Nếu Nano được cấp SUID, nó có thể bị hacker lợi dụng cho mục đích priv escalation.
Trong phần thực hành này, mục đích của chúng ta chính là chạy nano với sudo, sau đó là lợi dụng option cho phép “execute command” từ bên trong của nano để tạo một shell điều khiển với đặc quyền của root.
Để mô phỏng lại phần thực hành này, chúng ta sẽ set SUID cho Nano như sau:
sudo chmod u+s /bin/nano
Kiểm tra lại bằng lệnh ls -l
ls -l /bin/nano

Chúng ta thấy bit “s” đã được thêm vào và account hiện tại của mình là vincent chứ không phải root nhé. Chúng ta sẽ bắt đầu thực hành như sau:
B1: Mở text editor Nano lên với sudo
sudo nano
B2: Các bạn sẽ chọn option Read File ở dưới cùng

Ctrl + R
B3: Bên trong option Read File, các bạn chọn tiếp option Execute Command

Bạn sẽ được như hình bên dưới

B4: Chúng ta sẽ gõ dòng lệnh sau vào dòng Command to execute
reset; sh 1>&0 2>&0
Câu lệnh trên sẽ giúp ta tạo ra một shell để tương tác với hệ thống ngay bên trong Nano. Bạn nào muốn tìm hiểu thêm về data stream có thể xem thêm tại đây. Thấy dấu # hiện ra, vậy là bạn đã priv escalation thành công.

Bạn có thể thử lệnh whoami để kiểm tra xem account hiện tại là gì, trước đó, bạn nên enter vài cái để thoát khỏi dòng option của Nano.

Vậy là chúng ta đã leo thang đặc quyền thành công.
B5: Dọn dẹp sau khi hoàn thành lab
Để thoát ra, chúng ta sẽ dùng lệnh exit sau đó thoát ra khỏi Nano như bình thường.
Chúng ta cũng nên bỏ phân quyền SUID với Nano để tránh trường hợp bị tấn công.
sudo chmod u-s /bin/nano

1b/ Vim
Cũng giống như Nano, Vim cũng là một trình text editor được cài đặt sẵn trên khá nhiều Linux distros. Tuy nhiên, Vim có phần khó xài hơn so với Nano vì bạn sẽ phải học khá nhiều các phím tắt để có thể thao tác dễ dàng trên vim. Vậy tại sao phải học Vim? Cá nhân mình thấy Vim có phần phổ biến hơn Nano, trên nhiều máy mình thực tập pentest, Nano có thể không có nhưng vim thì đến 90% là có.
Bạn nào hứng thú muốn tìm hiểu sâu hơn về Vim có thể tham khảo tài liệu sau.
Giao diện của Vim sẽ như sau:

Khi sử dụng Vim, như bạn thấy, bạn sẽ không có dòng hỗ trợ options như bên Nano, điều đó đồng nghĩa với việc bạn phải nhớ toàn bộ các phím tắt chức năng của Vim. Để di chuyển bên trong Vim các bạn có 2 lựa chọn sau:
- Sử dụng 4 phím mũi tên như với nano
- Sử dụng các phím k, j, h, l
- k dùng để đi lên
- j dùng để đi xuống
- h dùng để sang trái
- l dùng để sang phải
Chúng ta sẽ thực hành với Vim thông qua ví dụ sau:
Ví dụ: Tạo file sample1.txt và thêm nội dung vào file bằng cách sử dụng Vim
B1: Chúng ta sẽ sử dụng câu lệnh sau để tạo file:
vi sample1.txt

B2: Để thêm nội dung vào file sample1.txt, đầu tiên các bạn cần bấm phím chữ “i” để vào insert của Vim, lúc này bạn có thể thêm bất kỳ nội dung nào các bạn mong muốn

B3: Copy và paste nội dung sau vào Vim
“Tu hoc An Ninh Mang
Tu hoc Cybersecurity
Tu hoc Linux”
Để có thể paste nội dung vào Vim, trước tiên bạn cần
- Nhấn giữ phím Shift
- Click chuột phải vào Vim, bạn sẽ thấy option paste hiện ra
- Chọn paste

B4: Lưu file và thoát khỏi Vim
Đầu tiên các bạn ấn phím Esc để thoát khỏi insert. Sau đó gõ dòng lệnh sau
:wq!
Với:
- w: Viết tắt của write – Ghi lại nội dung vào bộ nhớ
- q: Viết tắt của quit – Thoát khỏi chương trình Vim
- ! : Dùng để ép Vim phải thực hiện w và q
Có thể hiểu đơn giản là bạn muốn lưu lại file và đồng thời thoát khỏi Vim. Sau đó bấm Enter.

Lưu ý 3: Privilege escalation (leo thang đặc quyền) với Nano
Do Vim cũng cho phép thực thi lệnh bên trong nên cũng tương tự như Nano, Vim có thể bị lợi dụng cho mục đích leo thang đặc quyền nếu nó được set SUID.
Để mô phỏng lại cách tấn công này, đầu tiên chúng ta sẽ set SUID cho Vim.
sudo chmod u+s /usr/bin/vim.basic

Để thực hiện priv escalation với Vim, chúng ta sẽ gõ câu lệnh sau:
sudo vi -c ':!/bin/sh' /dev/null
Flag -c của text editor Vim cho phép bạn thực thi lệnh bên trong Vim y hệt như Nano. Tận dụng điều đó, bạn sẽ sử dụng câu lệnh trên để tạo một shell tương tác với hệ thống với đặc quyền của root.
Khi bạn thấy dấu # hiện ra, chứng tỏ chúng ta đã leo thang đặc quyền thành công.

Sau khi thực hành xong, các bạn thoát khỏi root shell bằng lệnh exit, và thoát khỏi Vim bằng câu lệnh:
:q!
Sau đó, các bạn nhớ xóa SUID của Vim nhé.
sudo chmod u-s /usr/bin/vim.basic
2/ Bash scripting cơ bản (Task 38)
Bash scripting là gì? Nói một cách đơn giản nhất, một Bash scripting là một chương trình được viết bằng Bash dùng để thực hiện một tác vụ nào đó trên hệ thống Linux. Nói cách khác, khi bạn viết Bash scripting, bạn đang tạo ra một phần mềm mới cho hệ thống Linux.
Phần kiến thức này khá cao cấp và chỉ thích hợp với những bạn đã biết về lập trình rồi, tuy nhiên các bạn nào muốn tìm hiểu thêm, có thể tham khảo các nguồn sau:
Trong khuôn khổ bài này, mình cũng sẽ hướng dẫn các bạn cách viết một đoạn Bash script đơn giản nhé.
Bạn nào hứng thú muốn xem ứng dụng của Bash scripting trong việc tối ưu hóa quá trình thu thập thông tin đối tượng trong penetration testing có thể tham khảo source code sau. File script này sẽ tự động sử dụng lần lượt các công cụ scan ví dụ như nmap, wpscan, nikto, v.v. để giúp pen tester có thể scan nhiều mục tiêu cùng một lúc. Tuy nhiên, công cụ này sẽ thích hợp cho những bạn luyện thi OSCP hơn là đi làm ngoài đời thật vì các công cụ được sử dụng trong file script đều ở mức khá căn bản.
Lưu ý 4:
Ở đầu của Bash script bao giờ cũng có 1 dòng gọi là shebang. Shebang thực chất là một đường dẫn (path) dẫn đến trình thông dịch Bash, trình thông dịch Bash này sẽ được hệ thống Linux sử dụng để hiểu và thực thi file scripting. Shebang cho Bash sẽ có dạng như sau:
#!/bin/bash
Lưu ý 5:
Đuôi của file scripting sẽ là .sh.
Lưu ý 6:
Với Bash nói riêng và các ngôn ngữ scripting ví dụ như Python, Ruby, JavaScript, v.v nói riêng. Hệ thống sẽ xử lý từng dòng code một theo thứ tự từ trên xuống dưới.
Chúng ta sẽ thực hành viết một đoạn script đơn giản in ra tên của chúng ta nhé.
Đoạn script của chúng ta như sau:
#!/bin/bash
ten=$1
echo "Ten toi la $ten"
Chúng ta sẽ copy và paste đoạn script trên vào một file tên name.sh bằng Nano hoặc Vim tùy ý các bạn.

Các bạn cấp quyền thực thi cho file name.sh.
sudo chmod +x name.sh
Sau đó chạy file với câu lệnh sau:
./name.sh <tên-của-bạn>
Ví dụ

Như bạn thấy, tên của mình đã được in ra.
Trong đoạn script trên, mình đã sử dụng một kỹ thuật để file script nhận dữ liệu từ bên ngoài file, cụ thể là ở dòng lệnh dùng để thực thi file. Sau đó, dữ liệu nhận được, là tên của mình, sẽ được gán cho variable ten ở bên trong file name.sh. Khi xuất kết quả ra, mình đã gọi variable ten ($ten) để lấy kết quả được gán và ghép vào dòng chữ mình muốn in. Và ta có kết quả như trên.
Cám ơn các bạn đã theo dõi,
Vincent Nguyễn
Source:
https://linuxhint.com/vim_vs_nano/#:~:text=Vim%20behaves%20like%20a%20model,is%20much%20faster%20than%20Nano.
https://bash.cyberciti.biz/guide/Shebang