Điểm:0

OpenVPN Sửa đổi lưu lượng đến hoặc tải trọng bằng tập lệnh tùy chỉnh

lá cờ ph

Gần đây tôi đã thiết lập OpenVPN với Dnsmasq làm DNS và muốn làm điều gì đó mà dường như tôi không thể tìm thấy bất kỳ thông tin nào về nó.

Đây là sự hiểu biết hiện tại của tôi cũng dựa trên những gì tôi hiện đang thiết lập trên máy chủ của mình.

A. Máy khách kết nối với OpenVPN, giả sử từ điện thoại

B. Khách hàng gửi lưu lượng truy cập tức là mở một trang web, chẳng hạn như YouTube

C. Máy chủ OpenVPN nhận yêu cầu.

D. Chuyển tiếp yêu cầu đến máy chủ đích, tức là YouTube.

E. YouTube phản hồi lại.

F. OpenVPN chuyển tiếp phản hồi tới máy khách từ A

Tất nhiên ở trên là quá đơn giản.

Tôi muốn làm gì?

Ở giữa các giai đoạn C và D, như sau khi OpenVPN nhận yêu cầu (hoặc nhận phản hồi từ máy chủ đích, tức là D->C), tôi muốn xử lý dữ liệu thực tế.

Ví dụ, một trường hợp sử dụng điển hình.

Ở giữa D và C, tôi muốn chuyển tải trọng sang, chẳng hạn như tập lệnh Python, thay đổi tất cả văn bản "Tôi yêu bạn" trong html của trang web thành "Tôi ghét bạn" trước khi tải trọng được gói lại và gửi đến máy khách.

Câu hỏi

Có bất kỳ hình thức "Móc vòng đời" nào với OpenVPN mà về cơ bản tôi có thể lắng nghe và thay đổi tải trọng của yêu cầu không?

Tôi hiểu rằng mọi kết nối vào hoặc ra từ OpenVPN đều được bảo mật bằng 'fort knox'. Tôi quan tâm đến điểm mà tải trọng phản hồi không có trên máy chủ.

lựa chọn có sẵn của tôi là gì? Tôi có cần sử dụng một gói phần mềm/phần mềm khác để được tư vấn đạt được kết quả như vậy không?

lá cờ us
Tôi có thể nghĩ rằng nơi duy nhất bạn có thể theo dõi và thao tác với gói TCP là trên giao diện mạng vật lý như `eth0` hoặc `ens2p0`. Tuy nhiên: Nếu máy chủ VPN của bạn đang sử dụng NAT để chuyển tiếp lưu lượng truy cập tới Internet, điều đó sẽ phức tạp hơn một chút vì bạn muốn kết nối Internet với lưu lượng rời khỏi VPN trước khi nó đi qua NAT. Đó là một nhiệm vụ không tầm thường.
lá cờ us
Đã cập nhật câu trả lời của tôi bên dưới, giải thích chi tiết lý do tại sao bạn không thể thực hiện bất kỳ mục tiêu nào bạn muốn.
Điểm:3
lá cờ us

Ý tưởng của bạn không khả thi vì một số lý do:

1)

Theo như tôi nhớ thì bản thân OpenVPN không có tính năng nào để chuyển dữ liệu từ kết nối VPN sang một quy trình tùy chỉnh, trước khi chuyển tiếp.

Để tham khảo nhanh: Kiểm tra xem TCP/IP đang được sử dụng ở đâu trong ngăn xếp OSI.

OpenVPN nằm ở lớp 3 của ngăn xếp OSI (Lớp mạng), trong khi các gói TCP thuộc lớp 4 (Lớp vận chuyển).

Câu hỏi của bạn chỉ vì lý do này nằm ngoài phạm vi những gì OpenVPN muốn đạt được.

Điều duy nhất bạn có thể thao tác là điều gì sẽ xảy ra khi máy khách kết nối với máy chủ hoặc ngắt kết nối.

Những tình huống đó có thể được xác định trong tệp cấu hình máy chủ của bạn thông qua các cài đặt sau:

# máy khách được kết nối với máy chủ VPN
kết nối máy khách "/script/client_connect.sh"

# máy khách bị ngắt kết nối với máy chủ VPN
ngắt kết nối máy khách "/script/client_disconnect.sh"

Tất cả các biến môi trường có sẵn cho tập lệnh tùy chỉnh của bạn đều có tại đây:

https://openvpn.net/community-resources/reference-manual-for-openvpn-2-4/#scripting-and-environmental-variables

Nhưng về bản chất, thông tin duy nhất bạn có thể theo dõi là chứng chỉ ứng dụng khách nào đã được sử dụng để kết nối với máy chủ và địa chỉ IP nào được gán cho ứng dụng khách, sau đó thực hiện một số logic tùy chỉnh trên máy chủ tùy thuộc vào người kết nối và phải làm gì khi họ ngắt kết nối lại.

Một thiết lập điển hình có thể là triển khai phía máy chủ DNS động hoặc thực hiện một số định tuyến tùy chỉnh, chẳng hạn như định tuyến chuyển đổi dự phòng tùy thuộc vào kết nối VPN nào đang hoạt động.

2)

Đề cập đến sơ đồ này của gói IPv4 từ WikiPedia:

Sơ đồ gói tin IPv4

Về bản chất, điều bạn muốn làm là thao tác với trường dữ liệu, tùy thuộc vào địa chỉ nguồn hoặc địa chỉ đích.

Đây còn được gọi là tấn công trung gian.

Như bạn đã phát hiện ra, thật khó để làm điều đó bằng cách nghe trên giao diện OpenVPN vì tất cả nội dung đều là mã hóa. Điều xảy ra là gói IPv4 dành cho Internet được gói gọn trong một gói IPv4 khác, gói này dành cho máy chủ OpenVPN.

Gói IPv4 được đóng gói được lưu trữ trong trường dữ liệu trong sơ đồ trên.

Đó là gói giải mã được chuyển tiếp tới Internet từ máy chủ VPN.

Tuy nhiên có một lời cảnh báo:

Tôi đoán máy khách VPN không không phải có một địa chỉ ip công khai. Điều này có nghĩa là bản dịch NAT được mở rộng và địa chỉ nguồn được viết lại thành địa chỉ của máy chủ VPN trước khi bất kỳ máy chủ nào được liên hệ trên Internet.

Tương tự như vậy, khi máy chủ trả lời lại bằng câu trả lời, chúng tôi có địa chỉ IPv4 đích giống với máy chủ VPN.

Điều này có nghĩa là để thao tác với trường dữ liệu, chúng ta cần theo dõi cổng nào đang được sử dụng trong trường dữ liệu. bảng dịch địa chỉ mạng (hay còn gọi là NAT).

Các cổng được sử dụng thường có bản chất động vì nhiều máy khách VPN có thể kết nối với Internet thông qua VPN và NAT và mọi phiên TCP (mail, web, ssh bất cứ thứ gì) đều sử dụng một cổng khác.

Vì vậy, nếu bạn muốn thao tác gói TCP được giải mã nó phải xảy ra sau khi giải mã, nhưng trước khi nó được dịch trong NAT.

Về lý thuyết, bạn có thể chặn gói bằng cách sử dụng iptables, nhưng nó không tầm thường khi VPN và NAT nằm trên cùng một máy.

Một cách tiếp cận khác là tấn công trực tiếp lưu lượng OpenVPN được mã hóa, vì bạn kiểm soát máy chủ OpenVPN có nghĩa là bạn cũng kiểm soát chứng chỉ và khóa riêng nào đang được sử dụng trên cả máy chủ và máy khách.

Điều này có thể thực hiện được như một cuộc tấn công trung gian cổ điển. Tôi không biết làm thế nào điều này được thực hiện mặc dù. :-)

... nhưng điều này dẫn đến lập luận cuối cùng của tôi:

3)

Hầu hết lưu lượng truy cập trên Internet là mã hóa TLS.

Vì vậy, ngay cả sau khi bạn đã giải mã lưu lượng OpenVPN, vẫn có một lớp mã hóa khác mà bạn phải đánh bại để thao tác nội dung của trường dữ liệu.

Phần này thậm chí còn khó tấn công hơn là chỉ tấn công lưu lượng OpenVPN được mã hóa vì bạn không kiểm soát được các khóa mã hóa được sử dụng cho phiên.

Ngay cả khi bạn đã cố giải mã lưu lượng truy cập TLS và mã hóa lại nội dung để người dùng cuối có vẻ như lưu lượng truy cập được mã hóa thực sự bắt nguồn từ YouTube hoặc bất cứ thứ gì thì nó vẫn vô ích, vì chứng chỉ bạn sử dụng để mã hóa lưu lượng truy cập https là Không đáng tin cậy bởi các trình duyệt trên máy tính của người dùng cuối.

Điều này một mình làm cho cuộc tấn công trung gian của bạn trở nên vô ích.

Bây giờ điều này gần như là một câu trả lời hoàn chỉnh cho câu hỏi của bạn.

Có nhiều góc độ khác để tấn công phiên TCP, nhưng bây giờ chúng ta sẽ chuyển sang lĩnh vực nâng cao thuộc về một diễn đàn có nhiều chuyên gia bảo mật.

Phần đó là CÁCH vượt quá trình độ của tôi. :-)

lá cờ ph
Thực sự đánh giá cao câu trả lời sâu sắc. Có cho tôi nhiều gợi ý để đọc thêm về.
lá cờ us
Sau đó, bạn có thể muốn đánh dấu câu trả lời là "được chấp nhận". Rốt cuộc - bạn không thể được hoàn lại tiền thưởng danh tiếng của mình. :-)

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.