Linux Căn Bản – Bài 9: Câu lệnh ln, find và grep

Chào các bạn,

Hôm nay chúng ta sẽ học tiếp chức năng và cách sử dụng các lệnh ln, find, grep. Xuyên suốt các ví dụ trong bài, mình sẽ sử dụng lại các câu lệnh và operators đã được trình bày trong những bài trước, các bạn nào quên thì hãy xem lại bài cũ nhé.

Ở cuối bài sẽ là thử thách lấy mật khẩu shiba4, chúc các bạn chinh phục thử thách thành công.


1/ Câu lệnh ln (Task 30)

Chắc hẳn nhiều bạn sử dụng hệ điều hành Windows đã quen với việc tạo shortcut cho một folder (thư mục) hoặc shortcut cho một ứng dụng. Dành cho bạn nào chưa biết thì shortcut cung cấp cho bạn một giải pháp truy cập gián tiếp vào dữ liệu bạn cần.

Ví dụ: Bạn có một folder A chứa sách học cybersecurity được phân loại theo từng loại với kích thước khoản 20 GB. Bạn thường xuyên truy cập folder này; tuy nhiên, mỗi lần truy cập, bạn lại phải mở File Explorer, bấm vào Documents rồi lại click vào folder A. Cần đến 3 bước để bạn có thể truy cập đến folder A. Bạn không muốn đem folder này ra màn hình Desktop vì màn hình Desktop của bạn chứa quá nhiều các file dữ liệu khác nhau ví dụ như ảnh chụp màn hình, file word, Excell, nhạc v.v. và bạn cũng có thói quen dọn dẹp màn hình Desktop khoản vài tuần một lần dẫn đến rủi ro nếu không chú ý, nhiều khả năng bạn sẽ delete nhầm folder A. Lúc này sử dụng shortcut là giải pháp tốt nhất dành cho bạn.

Shortcut sẽ tạo một icon với tên là tên của folder A, bạn có thể cut/paste icon này ra màn hình Desktop. Mỗi lần bạn muốn truy cập vào folder A, bạn chỉ cần double click vào shortcut icon của folder A là xong. Nếu chẳng may, bạn vô tình xóa shortcut của folder A, folder A cũng không hề bị ảnh hưởng gì cả. Bạn hoàn toàn có thể tạo lại shorcut cho folder A và sử dụng như bình thường.

Trong Linux command line, cũng có một kỹ thuật tạo shortcut được gọi là link bằng cách sử dụng câu lệnh ln. Cách hoạt động của shortcut và link là gần tương đương nhau mặc dù bản chất sẽ có khác biệt đôi chút. Bạn nào có kiến thức về programming có thể tìm hiểu thêm về sự khác biệt của cả hai tại đây.

Sẽ có 2 dạng link trong Linux command line:

  • Hard link
  • Soft link

1a/ Inode

Để hiểu về hard link và soft link, chúng ta sẽ cần hiểu sơ lược về Inode. Trong hệ thống Linux, dữ liệu được lưu giữ ở hai phần khác nhau ở ổ cứng. Nội dung dữ liệu sẽ được lưu giữ trong các data blocks. Nhưng thông tin về dữ liệu ví dụ như metadata, vị trị lưu trữ, v.v lại được lưu trữ trong Inode.

Inode có thể hiểu đơn giản như là một cơ sở dữ liệu lưu lại các thông tin của dữ liệu ngoại trừ nội dung của dữ liệu. Inode có hình dạng là một dãy số. Dãy số này tương tự như địa chỉ nhà vậy, nghĩa là trong cả một Linux file system sẽ không bao giờ có 2 files/directories hoặc file và directory có giá trị Inode như nhau. Nói một cách đơn giản, Inode có chức năng giống như một mã số định danh một dữ liệu trong cơ sở dữ liệu vậy.

Hệ điều hành Linux sử dụng Inode cho mục đích lấy các thông tin của file hoặc directory như phân quyền và vị trị lưu trữ của file trên ổ cứng, v.v.

Để kiểm tra giá trị Inode, ta sẽ sử dụng lệnh sau:

ls -i 
H1a.1

Các bạn có thấy những dãy số như “1179687” ở phía trước của phần phân quyền không? Đó chính là Inode đấy.

1b/ Hard link

Có thể hiểu đơn giản, hard link là một kết nối đến Inode của một file xác định. Hard link và file có Inode mà nó trỏ tới sẽ có cùng giá trị Inode, và bạn có thể sử dụng hard link để truy cập vào file có Inode mà nó trỏ tới. Hard link có những đặc điểm sau:

  • Nếu file gốc bị xóa, bạn vẫn có thể truy cập file gốc thông qua hard link. Nguyên nhân là vì trong hệ thống Linux, mọi file bình thường (không bao gồm directories) đều là một hard link. Khi bạn tạo một file hay xóa một file, bạn chỉ đơn giản là đang tạo hay xóa một hard link trỏ tới Inode của file đó. Nó gần tương tự như việc nhà bạn có 2 cửa chính, phá bỏ 1 cái thì vẫn còn 1 cái để ra vào vậy.
  • Hard link chỉ có thể trỏ tới Inode của file chứ không thể trỏ tới Inode của directory. Nguyên nhân các bạn có thể tìm hiểu thêm tại đây.
  • Phân quyền của hard link tương tự như phân quyền của file có Inode mà nó trỏ tới. Để thay đổi phân quyền của hard link, bạn phải thay đổi phân quyền của file có Inode mà nó trỏ tới.
  • Hard link chỉ có thể hoạt động trong cùng Linux file system. Ví dụ: Bạn không thể tạo hard link giữa ext3 và ext4 vì chúng khác file systems.
  • Khi dùng ls -l để kiểm tra, bạn sẽ thấy hard link không có ký tự “l” ở đầu biểu thị cho link như soft link

1b-1/ Vậy sự khác biệt giữa hard link và copy là gì?

Khi bạn copy, bạn đang tạo ra dữ liệu mới bằng cách nhân dữ liệu cần copy lên n lần. Mỗi bản dữ liệu đó đều sẽ tốn một số lượng bộ nhớ nhất định trong ổ cứng để lưu trữ. Một bất tiện khác đó là khi bạn thay đổi nội dung của một trong các bản bạn đã copy, nội dung của những bản copy khác không hề bị ảnh hưởng.

Với hard link, điều bạn đang làm là tạo thêm kết nối trỏ tới một file nào đó chứ không phải nhân dữ liệu đã có lên n lần như với copy. Và mỗi khi bạn truy cập file thông qua hard link để thay đổi nội dung file, bạn đang thay đổi nội dung gốc của file. Đồng nghĩa với việc dù bạn truy cập file bằng hard link nào thì nội dung hiện ra vẫn sẽ là nội dung mà bạn đã thay đổi.

1b-2/ Ứng dụng và cách tạo hard link

Ứng dụng lớn nhất của hard link là để backup dữ liệu nhưng không cần phải copy dữ liệu gây lãng phí tài nguyên ổ cứng.

Để tạo hard link, bạn sử dụng lệnh ln theo cú pháp sau

ln <nguồn> <tên-link>

Chúng ta sẽ thực hành tạo hard link theo các bước sau

B1: Tạo một file có tên hello.txt có nội dung Hoc hacking

echo "Hoc hacking" > hello.txt

B2: Tạo một directory có tên tuhoc

mkdir tuhoc 

B3: Tạo một hard link trỏ tới file hello.txt tên hello-link và lưu lại bên trong directory tuhoc

ln hello.txt tuhoc/hello-link

B4: Bạn có thể dùng lệnh ls -l kiểm tra bên trong directory tuhoc sẽ thấy hard link hello-link

ls -l tuhoc 

B5: Bạn có thể dùng lệnh cat để kiểm tra nội dung bên trong hello-link sẽ thấy nội dung file tương tự như trong file hello.txt

cat tuhoc/hello-link
cat hello.txt

B6: Bạn có thể kiểm tra Inode của hello link và hello.txt file sẽ thấy Inode của cả 2 giống nhau.

ls -li tuhoc 
ls -li 
H1b-2.1

1c/ Soft link

H1c.1: Sự khác nhau giữa hard link và soft link

Soft link hay còn gọi là Symbolic link. Chức năng của nó tương tự như shortcut trên Windows. Tương tự như hard link, bạn cũng có thể dùng soft link để truy cập file, tuy nhiên soft link trỏ tới tới file chứ không trỏ tới Inode của file như hard link. Soft link có các đặc điểm sau:

  • Khi bạn xóa soft link sẽ không ảnh hưởng đến file gốc. Tuy nhiên nếu bạn xóa hay chuyển file mà nó trỏ tới đi nơi khác, soft link sẽ không còn hoạt động được nữa
  • Soft link có thể được dùng cho cả file và directory
  • Soft link sẽ có Inode khác với file gốc và phân quyền cũng sẽ không thừa kế từ file gốc. Khi bạn thay đổi phân quyền của file gốc, phân quyền của soft link không thay đổi.
  • Soft link vẫn có thể hoạt động khi file nó trỏ tới và link nằm khác file system
  • Vì bản thân soft link chỉ là một liên kết đến file mà nó trỏ tới, nên khi truy cập nội dung file bằng soft link và thay đổi nội dung bên trong, bạn đang thay đổi nội dung gốc của file mà soft link trỏ tới
  • Khi bạn kiểm tra các thông tin của một soft link bằng lệnh ls -l, bạn sẽ thấy chữ “l” ở đầu báo hiệu đây là một link, ngoài ra ở phía cuối còn có tên file mà nó trỏ tới. Ví dụ
lrwxrwxr-x 2 shiba3 shiba3 4096 Feb 22  2020 test4 -> Sample1

Cú pháp tạo soft link như sau

ln -s <nguồn> <tên-link>

Chúng ta sẽ thực hành những ví dụ sau:

Ví dụ 1: Tạo soft link

B1: Tạo directory Sample1

mkdir Sample1

B2: Bên trong Sample1 chứa file hello.txt có nội dung “Xin chao”

echo "Xin chao" > Sample1/hello.txt

B3: Kiểm tra lại nội dung của directory Sample1 và file hello.txt

ls Sample1 && cat Sample1/hello.txt

(Đọc lại cách dùng operator && tại đây)

B4: Tạo một soft link trỏ tới directory Sample1 và lưu nó ở HOME directory của shiba3 với tên hello-soft

ln -s Sample1 hello-soft

B5: Check Inode và phân quyền của soft link hello-soft và Inode của Sample1, bạn sẽ thấy giá trị Inode và phân quyền của soft link và file gốc khác nhau

ls -il 
H1c.2

B6: Kiểm tra nội dung bên trong soft link hello-soft

ls -H hello-soft && cat hello-soft/hello.txt
H1c.3

Ví dụ 2: Kiểm tra khả năng truy cập nội dung từ soft link sau khi thay đổi phân quyền Sample1

B1: Thay đổi phân quyền của directory hoàn toàn về 0

chmod 000 Sample1

B2: Kiểm tra lại phân quyền mới của Sample1

ls -l

B3: Kiểm tra khả năng truy cập nội dung từ soft link

ls -H hello-soft && cat hello-soft/hello.txt

Kết quả: Lỗi không được quyền truy cập

H1c.4

Kết luận: Dù soft link có toàn quyền như bạn thấy trong hình H1c.4, nhưng vì file mà nó trỏ tới đã chặn tất cả quyền bao gồm cả truy cập, nên truy cập Sample1 thông qua soft link cũng bị chặn nốt.

Ví dụ 3: Thử truy cập soft-link sau khi xóa directory Sample1

B1: Cấp lại phân quyền cho Sample1 và kiểm tra lại phân quyền

chmod 700 Sample1 && ls -l

B2: Xóa directory Sample1

rm -rf Sample1

B3: Kiểm tra lại xem Sample1 đã bị xóa hay chưa

ls -l

B4: Truy cập vào soft link

ls -H hello-soft
H1c.5

Kết quả: Báo lỗi, file không tồn tại.

Dựa vào kiến thức đã học, các bạn hãy tự trả lời câu hỏi ở task 30 nhé.

2/ Câu lệnh Find

Find là một câu lệnh mạnh mẽ dùng để tìm kiếm file dữ liệu trong Linux. Cú pháp cơ bản của câu lệnh find như sau:

find <flag>(optional) <tên-directory-nơi-bắt-đầu-tìm-kiếm> <nội-dung-cần-tìm>

Chúng ta sẽ thực hành lệnh find qua các ví dụ sau. Từ ví dụ 2 trở đi sẽ là ứng dụng của lệnh find trong khi tìm giải pháp cho priv escalation trong pentest.

Ví dụ 1: Tìm tất cả file trong thư mục /tmp

Chúng ta sẽ sử dụng câu lệnh sau để tìm tất cả những file được chứa bên trong /tmp

find /tmp

Khi không có nội dung cần tìm, lệnh find sẽ tự động liệt kê toàn bộ file chứa bên trong /tmp và chứa cả bên trong những directories con của /tmp

H2.1

Ví dụ 2: Sử dụng lệnh find để tìm kiếm các file thuộc quyền sở hữu của account root trong

find /tmp -user root

Chúng ta sẽ dùng câu lệnh phía trên để tìm kiếm tất cả các file thuộc sở hữu của account root bên trong directory /tmp.

H2.2

Ngoài ra, bạn cũng có thể tìm các file thuộc quyền sở hữu của group root bên trong directory /tmp với câu lệnh sau:

find /tmp -dir root 
H2.3

Ví dụ 3: Tìm các tất cả các file trong hệ thống có phân quyền SUID

Để tìm tất cả các file có phân quyền SUID chúng ta sẽ dùng câu lệnh sau

find / -perm -u=s -type f 2>/dev/null

Trong đó

  • / : Bắt đầu tìm từ root directory là file có vị trí cao nhất trong sơ đồ cấu trúc file của hệ thống Linux
  • -perm: Tìm những file thỏa mãn phân quyền theo sau
  • -u=s: Tìm những file binary thuộc sở hữu của root nhưng có phân quyền SUID
  • -type: Dạng file cần tìm *
  • f: Dạng file bình thường, không phải directory hay các file đặc biệt ví dụ như symbolic link, v.v.
  • 2>/dev/null: Chuyển tất cả những cảnh báo lỗi hoặc output lỗi vào /dev/null

* Các dạng file trong lệnh find

H2.4

Sau khi chạy câu lệnh trên, chúng ta sẽ được trả về những file có phân quyền SUID. Nhiệm vụ của chúng ta lúc này chính là phân tích các kết quả xuất ra để tìm giải pháp khả thi nhất cho priv escaltion. Các bạn có thể thấy trong kết quả bên dưới có cả những câu lệnh ví dụ như ping, su, mount, v.v, mục tiêu của chúng ta chính là tìm một câu lệnh nào đó trong số những cái đã được liệt kê ra cho phép chúng ta thực hiện priv escalation ví dụ như git, python, vim, v.v.

H2.5

Với những kiến thức mình đã trình bày, các bạn hãy tự trả lời câu hỏi ở task 31 nhé.

3/ Câu lệnh grep

Câu lệnh grep mình đã có dịp giới thiệu với các bạn một lần khi chúng ta học về pipe operator. Cụ thể chúng ta có thể dùng lệnh grep để tìm một kết quả cụ thể nào đó từ input cho trước. Cú pháp của lệnh grep như sau:

grep <nội-dung-cần-tìm> <dữ-liệu-đầu-vào>

Ngoài ra chúng ta còn có thể dùng pipe để dùng output của một câu lệnh nào đó làm input cho grep để tìm nội dung cần tìm.

Ví dụ: Tìm từ khóa “passwd” khi sử dụng lệnh find để tìm SUID binary file

find / -perm -u=s -type f 2>/dev/null | grep passwd 

Chúng ta sẽ được output như sau

H3.1

Các bạn có thể thấy, tất cả các dòng có chứa từ khóa “passwd” trong lệnh find đều được lệnh grep liệt kê ra như hình H3.1 bên trên.

Với những kiến thức mình đã trình bày cộng thêm tra cứu lệnh man grep, các bạn bạn hãy tự trả lời 2 câu hỏi của task 32 nhé.

4/ Thử thách lấy mật khẩu cho account shiba4

Các bạn hãy vận dụng những kiến thức đã học để lấy mật khẩu cho account shiba4 nhé. Nếu thất bại thì hãy cố gắng đọc lại các bài cũ và tra cứu thêm Google. Đáp án sẽ được mình trình bày ở bài tiếp theo.


Cám ơn các bạn,

Vincent Nguyễn

Source:

https://medium.com/@meghamohan/hard-link-and-symbolic-link-3cad74e5b5dc#:~:text=Hard%20link%20is%20the%20exact,’t%200(zero).
https://medium.com/@307/hard-links-and-symbolic-links-a-comparison-7f2b56864cdd

Leave a comment