[Expl0it_Z3r0_T0_H3r0] Bài 3: Một số lệnh Linux cơ bản

Marcus1337

VIP Members
01/04/2021
62
76 bài viết
[Expl0it_Z3r0_T0_H3r0] Bài 3: Một số lệnh Linux cơ bản
Trong bài trước mình đã giới thiệu cho các bạn làm quen với Linux. Trong bài này chúng ta sẽ tiếp tục thực hành với các lệnh linux hữu dụng khác.

Learning Path:

307136990_3399968766951209_4439304161248966491_n.png

I. Piping và Redirection

Pipe là một cơ chế trong Linux như 1 đường ống dòng chảy dữ liệu cho phép bạn sử dụng hai hoặc nhiều lệnh sao cho đầu ra của một lệnh đóng vai trò là đầu vào cho lệnh tiếp theo.

Redirection là tính năng cho phép chuyển hướng đầu vào/đầu ra (INPUT/OUTPUT) trong hệ điều hành Linux. Redirection cho phép chúng ta thay đổi đầu vào tiêu chuẩn (stdin) và đầu ra tiêu chuẩn (stdout) khi thực hiện một lệnh trên terminal. Theo mặc định, thiết bị đầu vào tiêu chuẩn là bàn phím của bạn và thiết bị đầu ra tiêu chuẩn là màn hình của bạn. Ví dụ như bạn cần lưu lại toàn bộ output hiển thị ra màn hình của câu lệnh nmap ra 1 file thì lúc này tính năng chuyển hướng sẽ giúp bạn.

Mọi chương trình chạy từ dòng lệnh trên Linux đều có ba luồng dữ liệu được kết nối với nó để phục vụ như các kênh giao tiếp với môi trường bên ngoài. Các luồng này được định nghĩa như sau:
  • Standard Input (STDIN) : Định nghĩa dữ liệu được đưa vào chương trình
  • Standard Output (STDOUT) : Đầu ra từ chương trình (mặc định là terminal)
  • Standard Error (STDERR) : Thông báo lỗi (mặc định là terminal)
Pipe (sử dụng toán tử | ) và Redirection (sử dụng toán tử> và <) kết nối các luồng này giữa các chương trình và tệp.

Chuyển hướng ra 1 file mới​

Ta có thể sử dụng toán tử > để lưu kết quả đầu ra của một lệnh vào một tệp để giữ nó để tham khảo hoặc thao tác trong tương lai. Ví dụ như bạn muốn lưu lại kết quả nmap vào 1 file trong quá trình dò quét pentest để sử dụng sau này bạn có thể dùng lệnh sau:

nmap <IP> > <file_ket_qua>
Mã:
$ nmap 10.211.55.3
Starting Nmap 7.93 ( <https://nmap.org> ) at 2022-10-06 11:36 +07
Nmap scan report for 10.211.55.3
Host is up (0.00016s latency).
Not shown: 999 closed tcp orts (conn-refused)
PORT   STATE SERVICE
22/tcp open  ssh
[/QUOTE]

[QUOTE]
Nmap done: 1 IP address (1 host up) scanned in 8.66 seconds
$ nmap 10.211.55.3 > result_nmap.txt #Lenh chuyen huong ket qua nmap vao 1 file
$ cat result_nmap.txt
Starting Nmap 7.93 ( <https://nmap.org> ) at 2022-10-06 11:36 +07
Nmap scan report for 10.211.55.3
Host is up (0.00016s latency).
Not shown: 999 closed tcp ports (conn-refused)
PORT   STATE SERVICE
22/tcp open  ssh
[/QUOTE]

Nmap done: 1 IP address (1 host up) scanned in 8.66 seconds

Kết quả lưu vào file sẽ giống hệt những gì xuất ra trên terminal khi thực hiện lệnh đó. Nếu chúng ta chuyển hưởng vào 1 file chưa tồn tại thì hệ thống sẽ tự tạo file đó. Tuy nhiên nếu file đó đã tồn tại trước thì lệnh này sẽ ghi đè tệp thay thế các nội dung đã có của tệp bằng nội dung mới.

Chuyển hướng ra 1 file đã tồn tại​

Để thêm dữ liệu bổ sung vào tệp hiện có (thay vì ghi đè tệp), hãy sử dụng toán tử >> . Trong ví dụ trên trường hợp ta muốn ghi chú các thông tin khai thác được từ các cổng tìm được vào tệp kết quả ta sẽ dùng thêm tùy chọn chuyển hướng ghi vào file đã tồn tại như sau:
Mã:
$ echo "Port 22 tim duoc tai khoan dang nhap user root mat khau root." >> result_nmap.txt
$ cat result_nmap.txt
Starting Nmap 7.93 ( <https://nmap.org> ) at 2022-10-06 11:36 +07
Nmap scan report for 10.211.55.3
Host is up (0.00016s latency).
Not shown: 999 closed tcp ports (conn-refused)
PORT   STATE SERVICE
22/tcp open  ssh
[/QUOTE]

Nmap done: 1 IP address (1 host up) scanned in 8.66 seconds
Port 22 tim duoc tai khoan dang nhap user root mat khau root

Chuyển hướng từ một tệp​

Trong trường hợp ngược lại là chuyển nội dung từ tệp làm đầu vào cho một lệnh thì ta sẽ sử dụng toán tử < . Trong ví dụ sau, sẽ chuyển hướng STDIN của lệnh wc với dữ liệu có nguồn gốc trực tiếp từ tệp kết quả của lệnh nmap được tạo ra trước đó chúng ta sẽ đếm xem có bao nhiêu dòng trong tệp đó bằng lệnh wc -l :
Mã:
$ wc -l < result_nmap.txt
9

Chuyển hướng STDERR​

Theo POSIX thì STDIN, STDOUT và STDERR sẽ tương ứng với các giá trị 0, 1 và 2. Những con số này rất quan trọng vì chúng có thể được sử dụng để thao tác với các luồng dữ liệu tương ứng từ dòng lệnh trong khi thực hiện hoặc nối các lệnh khác nhau lại với nhau. Để hiểu rõ về cách dùng các con số này, hãy xem xét ví dụ này chuyển hướng lỗi (STDERR):

Ví dụ chúng ta cần tìm các file có tên là “passwd” mà user hiện tại có quyền đọc trên hệ thống. Rõ ràng ta thấy kết quả dưới đây chúng ta sẽ nhận được thông báo lỗi là user không có quyền là các kết quả mà ta không mong muốn và nó làm kết quả in ra rất rối:

Mã:
$ find / -name "passwd"
find: ‘/run/speech-dispatcher’: Permission denied
find: ‘/run/openvpn-server’: Permission denied
find: ‘/run/openvpn-client’: Permission denied
find: ‘/proc/3/fd’: Permission denied
find: ‘/proc/3/map_files’: Permission denied
/usr/bin/passwd
/usr/share/doc/passwd
/usr/share/lintian/overrides/passwd

Tuy nhiên ta có thể chuyển hướng các thông báo lỗi này vào 1 file hoặc thậm chỉ như trường hợp dưới đây ta sẽ ghi ra 1 file đặc biệt là /dev/null ( Mọi thứ ghi vào file này đều sẽ bị xóa, có thể hiểu đây là 1 file đặc biệt ghi tất cả mọi thứ mà ta không muốn lưu), ta sẽ thu được kết quả lệnh trên gọn gàng hơn:

Mã:
$ find / -name "passwd" 2> /dev/null
/usr/bin/passwd
/usr/share/doc/passwd
/usr/share/lintian/overrides/passwd

Piping​

Pipip sẽ giúp kết hợp nhiều lệnh trong linux lại với nhau. Đầu ra lệnh này là đầu vào của lệnh kia. Ví dụ dưới đây ta sẽ kết hợp lệnh cat và lệnh wc để đếm số dòng có trong file kết quả nmap trên
Mã:
$ cat result_nmap.txt | wc -l
9

II. Một số lệnh Linux liên quan xử lý text​

Đây là các lệnh liên quan đến xử lý chuỗi trên Linux và cực hữu ích trong việc xử lý phân tích trích xuất thông tin từ các file, đầu ra

Lệnh grep​

grep là lệnh dùng để tìm kiếm chính xác cá từ từ 1 file hoặc 1 input đầu ra sẽ hiển thị ngay trên màn hình command line theo dòng nào có chứa chuỗi sẽ hiển thị cả dòng trong file đó ra và chuỗi đó sẽ được highlight. Cũng với ví dụ file nmap trên chúng ta chỉ cần lọc các port đang được open thì ta sẽ sử dụng lệnh sau:

Mã:
parallels@ubuntu-linux-20-04-desktop:/tmp$ cat result_nmap.txt  | grep open
22/tcp open  ssh
grep có hỗ trợ tìm kiếm theo regex và nhiều tùy chọn khác. Chi tiết thêm: man grep

Lệnh sed​

Lệnh sed là công cụ xử lý văn bản mạnh mẽ và là một tiện ích UNIX lâu đời nhất và phổ biến nhất. Nó được sử dụng để sửa đổi nội dung của một tệp, thường đặt nội dung vào một tệp mới. Lệnh sed có thể lọc văn bản, cũng như thực hiện thay thế trong luồng dữ liệu.

sed [tùy chọn] commands [file]

Ví dụ lệnh sau:

Mã:
$ sed -n 's/Nmap/Tools scan/p' result_nmap.txt
Starting Tools scan 7.93 ( <https://nmap.org> ) at 2022-10-06 11:36 +07
Tools scan scan report for 10.211.55.3
Tools scan done: 1 IP address (1 host up) scanned in 8.66 seconds
Chi tiết thêm: man sed

Lệnh cut​

Lệnh cut được sử dụng thao tác với tệp dựa trên cột và được thiết kế để trích xuất các cột cụ thể. Dấu phân cách cột mặc định là ký tự tab. Ví dụ sau sẽ sử dụng lệnh cut để lấy mỗi username của hệ thống:

Mã:
$ cat /etc/passwd | cut -d ":" -f 1
root
daemon
bin
sys
sync
games
man
lp
mail
news
uucp
proxy
Chi tiết thêm: man cut

Lệnh awk​

Lệnh awk sử dụng để tìm kiếm và xử lý file text. Nó có thể tìm kiếm một hoặc nhiều file để xem các file có dòng nào bao gồm những pattern cần tìm kiếm và sau đó thực hiện những action. Cú pháp của lệnh awk như sau:
awk <pattern> <actions> <file>
Mã:
$cat /etc/passwd | awk -F: '{print "Username: " $1}'
Username: root
Username: daemon
Username: bin
Username: sys
Username: sync
Username: games
Username: man
Username: lp
Username: mail
Username: news
Username: uucp
Username: proxy
Chi tiết thêm: man awk

Lệnh sort​

Lệnh sort được sử dụng để sắp xếp các dòng của tệp văn bản theo thứ tự tăng dần hoặc giảm dần, theo một khoá sắp xếp. Khóa sắp xếp mặc định là thứ tự của các ký tự ASCII (theo thứ tự bảng chữ cái). Cú pháp của lệnh sort:
Mã:
sort <tuỳ chọn> <file>

Chi tiết thêm về lệnh sort có thể sử dụng lệnh man để xem: man sort

Lệnh head​

Lệnh head dùng để xem những dòng đầu của tệp tin (theo mặc định là 10 dòng đầu tiên). Chúng ta có thể thay đổi số dòng bằng cách thêm -n vào sau lệnh head. Cách dùng lệnh head:
Mã:
head [tuỳ chọn] file
Chi tiết thêm về lệnh sort có thể sử dụng lệnh man để xem: man head

Lệnh uniq​

Lệnh uniq dùng để bỏ các dòng liên tiếp trùng lặp trong một tệp văn bản rất hữu ích để đơn giản hóa hiển thị văn bản. Tuy nhiên uniq yêu cầu các dòng trùng lặp phải liên tiếp, nên chúng ta thường chạy sắp xếp trước.
Chi tiết thêm: man uniqa

III. Thực hành​

Ta sẽ có 1 ví dụ nhỏ sử dụng các lệnh trên để phân tích 1 file access.log đơn giản. Trong nhiều trường hợp cần nhanh gọn thì việc sử dụng các lệnh linux để phân tích log điều tra sự cố là rất hữu ích.

Ta sẽ sử dụng file log demo: access.log. ở đây để tương tác. Đầu tiên chạy lệnh download file log về:
Mã:
$wget <https://raw.githubusercontent.com/linuxacademy/content-elastic-log-samples/master/access.log>
Ví dụ để lọc giữ lại các IP truy cập có trong access.log ta có thể sử dụng lệnh cut với ký tự phân tách là khoảng trắng. Do ta thấy dữ liệu IP ta cần lấy là phần tử đầu tiên do đó ta sẽ kèm tùy chọn -f 1:

Mã:
$ cat access.log | cut -d " " -f 1
83.149.9.216
83.149.9.216
83.149.9.216
83.149.9.216
83.149.9.216
83.149.9.216
83.149.9.216
.......

Sau khi chạy lệnh trên các bạn sẽ thấy nó sẽ cắt và giữ lại phần tử đầu tiên của mỗi hàng chính là địa chỉ IP tuy nhiên các IP này sẽ bị lặp lại và sẽ khó thống kê. Do đó ta có thể sử dụng lệnh dưới đây để thống kê lượt truy cập của các IP:

Mã:
$ cat access.log | cut -d " " -f 1  | sort | sort -ru | uniq -cc
  482 66.249.73.135
364 46.105.14.53
357 130.237.218.86
273 75.97.9.59
113 50.16.19.13
102 209.85.238.199
  99 68.180.224.225
  84 100.43.83.137
  83 208.115.111.72
  82 198.46.149.143
  ......

Từ câu lệnh trên chúng ta có thể thấy IP nào truy cập vào hệ thống nhiều nhất. Trong trường hợp IP đó có hành động đang rà quét hệ thống gửi rất nhiều request chúng ta có thể dễ dàng nhận ra IP nào đang tấn công

Nhiệm vụ tiếp theo: Như ở trên ta thấy IP 66.249.73.135 đang có lượt truy cập vào hệ thống nhiều nhất. Chúng ta cần điều tra xem các url mà IP này truy cập là gì?

Với trường hợp này đầu tiên ta cũng cần phải tách được các request từ IP 66.249.73.135 trong file access.log ban đầu. Với lệnh grep chúng ta có thể log được các request có chứa cụm từ “75.97.9.59”
Mã:
$ cat access.log| grep 66.249.73.135
66.249.73.135 - - [17/May/2015:10:05:40 +0000] "GET /blog/tags/ipv6 HTTP/1.1" 200 12251 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.73.135 - - [17/May/2015:10:05:16 +0000] "GET /blog/tags/munin HTTP/1.1" 200 9746 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.73.135 - - [17/May/2015:10:05:33 +0000] "GET /blog/tags/firefox?flav=rss20 HTTP/1.1" 200 16021 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.73.135 - - [17/May/2015:10:05:17 +0000] "GET /blog/geekery/eventdb-ideas.html HTTP/1.1" 200 11418 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.73.135 - - [17/May/2015:11:05:17 +0000] "GET /blog/geekery/vmware-cpu-performance.html HTTP/1.1" 200 12908 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
......
Tiếp theo chúng ta cần lọc được các path url từ các output bên trên. Lúc này chúng ta có thể sử dụng lệnh cut với ký tự phân cách là khoảng trắng để tách các trường của output:
Mã:
$ cat access.log| grep 66.249.73.135 | cut -d " " -f 7 | head -n 5
/blog/tags/ipv6
/blog/tags/munin
/blog/tags/firefox?flav=rss20
/blog/geekery/eventdb-ideas.html
/blog/geekery/vmware-cpu-performance.html
Để thống kê số lượng truy cập các url path ta sẽ dùng tương tự với trường hợp thống kê IP là dùng kết hợp lệnh sort:
Mã:
$ cat access.log| grep 66.249.73.135 | cut -d " " -f 7 | sort | uniq -cc | sort -ru | head -n 10
  31 /?flav=rss20
  31 /?flav=atom
  30 /blog/tags/firefox?flav=rss20
  22 /
   3 /projects/xdotool/xdotool.xhtml
   2 /projects/xdotool/
   2 /presentations/vim/
   2 /presentations/mpi/
   2 /misc/worst-it-job-posting-ever.pdf
   2 /misc/Title.php.txt

Bài hôm nay mình xin khép lại ở đây. Hẹn các bạn ở bài tiếp theo!

From M4rcus. Happy Hacking
 
Chỉnh sửa lần cuối:
Thẻ
linux
Bên trên