You are on page 1of 21

HỌC VIỆN KỸ THUẬT MẬT MÃ

Ngành An toàn thông tin

BÁO CÁO THỰC HÀNH


Môn : Thực tập cơ sở chuyên ngành
Firewall Evasion Lab : Bypassing Firewalls using VPN

Giáo viên hướng dẫn : PGS.TS Lương Thế Dũng


Sinh viên thực hiện : Đinh Trọng Hòa
I. Tổng quan.
Các tổ chức, nhà cung cấp dịch vụ (ISPs), và các quốc gia thường chặn
các người dùng nội bộ của họ khỏi việc truy cập vào những trang web
bên ngoài. Việc này được gọi là lọc đầu ra. Ví dụ, để chống lại việc bị
phân tâm, xao lãng trong lúc làm việc, nhiều công ty thường thiết lập
những thiết bị lọc tường lửa để chặn những trang mạng xã hội, vì vậy
nhân viên của họ không thể truy cập vào những trang web đó từ mạng
nội bộ. Vì lí do chính trị, nhiều quốc gia thiết lập 1 bộ lọc đầu ra từ hệ
thống ISPs của họ để chặn những người muốn truy cập vào các trang
web nước ngoài. Thật không may, những bức tường lửa này có thể vượt
qua một cách dễ dàng, và những dịch vụ, sản phẩm có thể giúp cho
người dùng có thể vượt qua tường lửa đó là Virtual Private Network
(VPN) (mạng bí mật ảo). Đặc biệt, công nghệ này được sử dụng rộng rãi
từ các người sử dụng điện thoại thông minh bị ảnh hưởng bởi bộ lọc đầu
ra, có rất nhiều ứng dụng VPN ( cho android, iOS, và trên các nền tảng
khác) có thể giúp người dùng vượt qua lọc tường lửa.

Mục tiêu bài học của bài thực hành này là cho sinh viên biết được cách
VPN làm việc trong lúc hoạt động và cách mà VPN có thể giúp vượt qua
lọc tường lửa. chúng ta sẽ thực hiện một VPN rất đơn giản trong bài
thực hành này, và sử dụng nó để vượt qua tường lửa. Loại VPN phụ
thuộc vào 2 phần : IP tunneling và mã hóa. Công nghệ tunneling là thứ
thiết yếu nhất để giúp vượt tường lửa; việc mã hóa được dùng cho việc
bảo vệ thông tin của lưu lượng đi qua VPN tunnel. Để đơn giản, chúng
ta chỉ tập trung vào phần tunneling, vì vậy lưu lượng bên trong tunnel sẽ
không được mã hóa. Chúng tôi có 1 lab VPN riêng, bảo gồm cả
tunneling và mã hóa. Nếu người đọc cảm thấy hứng thú, bạn có thể thực
hiện bài thực hành VPN của chúng tôi và học hỏi về cách xây dựng 1
VPN hoàn chỉnh. Trong bài thực hành này, chúng ta chỉ tập trung vào
cách sử dụng VPN tunnel để vượt qua tường lửa. Bài thực hành này gồm
2 chủ đề : Firewall, VPN.
II. Thực hành.
2.1 Bài 1 : Cài đặt máy ảo.
Chúng ta cần 2 máy ảo, 1 máy bên trong tường lửa, máy còn lại nằm bên
ngoài tường lửa. Mục tiêu là để giúp máy bên trong tường lửa có thể đến
được trang web bên ngoài đã bị chặn bởi tường lửa. Chúng ta sử dụng 2
máy ảo, VM1 và VM2, cho 2 máy này. VM1 và VM2 được cho là 2
máy kết nối với nhau thông qua Internet bằng router. Việc thiết lập này
có thể yêu cầu nhiều hơn 2 máy ảo. Để đơn giản, chúng ta sử dụng mạng
LAN để mô phỏng kết nổi Internet. Về cơ bản, chúng ta cần kết nối
VM1 và VM2 bằng card mạng “ Nat Network “. Hình dưới đây miêu tả
bài thực hành.

Tải và giải nén máy ảo Ubuntu 16.04 VMs trên trang chủ của
Seedsecuritylabs.org.

Cài đặt và sử dụng máy ảo trên phần mềm Virtual Box. Nhớ chỉnh lại
card mạng thành card Nat Network.
2.2 Bài 2 : Thiết lập tường lửa.
Trong bài này, chúng ta sẽ thiết lập tường lửa trên máy VM1 (Ubuntu
Client) để chặn truy cập vào 1 trang web nào đó. Bạn cần phải chắc rằng
địa chỉ IP của trang web mục tiêu là cố định hoặc nằm trong 1 dãy cố
định; Nếu không, bạn có thể gặp sự cố khi chặn hoàn toàn trang web
mục tiêu. Vui lòng tham khảo bài thực hành tường lửa để biết thêm chi
tiết về cách chặn một trang web.
Trong thế giới thực, tường lửa nên vận hành trên 1 máy riêng biệt,
không phải trên máy VM1 (Ubuntu Client). Để giảm thiểu số lượng máy
ảo sử dụng trong bài thực hành này, chúng ta đặt tường lửa vào máy
VM1 (Ubuntu Client). Thiết lập tường lửa trên máy VM1 yêu cầu quyền
người dùng cao nhất, và để thiết lập đường hầm VPN. Người ta có thể
nói răng khi chúng ta đã có quyền người dùng cao nhất, tại sao chúng ta
không thể tắt tường lửa trên máy VM1. Đây là một ý kiến tốt, nhưng hay
nhớ rằng chúng ta đặt tường lửa vào máy VM1 bởi vì chúng ta không
muốn tạo một cái máy ảo khác trong bài thực hành này. Vì vậy, mặc dù
bạn có quyền người dùng cao nhất trên máy VM1, bạn không được phép
sử dụng quyền để cấu hình lại tường lửa. Bạn phải sử dụng VPN để vượt
qua nó.
So sánh với việc đặt tường lửa vào một máy tính bên ngoài, thì việc đặt
tường lửa trên VM1 có một vấn đề nhỏ mà chúng ta cần phải giải quyết.
Khi chúng ta thiết lập tường lửa để chặn gói tin, chúng ta cần phải chắc
rằng sẽ không chặn phải gói tin dùng để truy cập vào giao diện ảo được
VPN sử dụng, nếu không VPN của chúng ta sẽ không thể nhận được gói
tin. Vì vậy, chúng ta không thể thiết lập các quy tắc tường lửa trước khi
định tuyến, càng không thể thiết lập các quy tắc trên giao diện ảo. Chúng
ta chỉ cần thiết lập các quy tắc trên giao diện mạng lưới thật của máy
VM1, vì thế nó sẽ không ảnh hưởng đến gói tin gửi đến giao diện ảo.
Chúng ta có thể sử dụng chương trình ufw để thiết lập các quy tắc cho
tường lửa. Chương trình này là giao diện người dùng của chương trình
iptables. Người ta có thể sử dụng trực tiếp iptables, nhưng theo kinh
nghiệm, thì sử dụng ufw sẽ tiện lợi hơn.
+ Chỉnh IP cho 2 máy Server và Client.

+ Tìm địa chỉ của trang web, target là www.facebook.com


(150.240.13.35)
+ Ping vào địa chỉ 157.240.13.35 để kiểm tra kết nối.

 Kết nối vẫn thành công.


+ Thiết lập quy tắc cho tường lửa. Chặn truy cập đến địa chỉ
157.240.16.35

+ Sau khi thiết lập tường lửa, ta tiến hành ping để kiểm tra xem có
ping đến địa chỉ 157.240.13.35 được không.

 Ping không thành công.


Vậy là chúng ta thiết lập tường lửa trên máy VM1 (Ubuntu Client) để
chặn trang web thành công (target website: www.facebook.com
157.240.13.35)
2.3 Bài 3 : Vượt tường lửa sử dụng VPN.
Ý tưởng của việc sử dụng VPN để vượt tường lửa được mô tả ở hình
dưới đây.

Chúng ta thiết lập một đường hầm VPN giữa VM1 (Ubuntu Client) và
VM2 (Ubuntu Server). Khi người dùng trên máy VM1 cố gắng truy cập
vào một trang web bị chặn, lưu lượng truy cập sẽ không điều hướng đi
qua mạng của nó, bởi vì nó sẽ bị chặn. Thay vì thế, gói tin gửi đến trang
web bị chặn từ máy VM1 sẽ được định tuyến đến đường hầm VPN và
đến VM2. Một khi gói tin đã đến đó, VM2 sẽ định tuyến nó đến đích
đến cuối cùng. Khi gói tin trả lời trở về, nó sẽ trở về VM2, nơi mà sẽ
điều hướng gói tin vào đường hầm VPN, cuối cùng đưa gói tin về VM1.
Đó là cách mà VPN giúp VM1 vượt qua tường lửa.
Chúng tôi đã tạo ra một chương trình VPN mẫu, bao gồm chương trình
máy khách (vpnclient) và chương trình máy chủ (vpnserver), cả 2
chương trình này có thể được tải về từ trang web Seedsecuritylabs.org.
Chương trình VPN đơn giản này chỉ thiết lập một đường hầm VPN giữa
máy khách và máy chủ, nó không có mã hóa lưu lượng đường hầm.
Chương trình vpnclient và vpnserver là hai đầu của đường hầm VPN.
Chúng giao tiếp với nhau bằng cách sử dụng giao thức TCP hoặc UDP
thông qua các sockets được miêu tả như hình dưới đây.

Trong mẫu code của chúng tôi, chúng tôi chọn sử dụng UDP cho đơn
giản. Đường dấu chấm giữa máy client và server mô tả đường dẫn của
đường hầm VPN. Chương trình VPN Client và Server kết nối với hệ
thống chủ thông qua TUN, bằng cách thực hiện 2 bước : (1) : Lấy gói tin
IP từ hệ thống lưu trữ, vì thế gói tin có thể được gửi thông qua đường
hầm, (2) lấy gói tin IP từ đường hầm, và sau đó chuyển hướng nó đến hệ
thống lưu trữ, nơi này sẽ chuyển tiếp gói tin đến đích đến cuối cùng của
nó.
Mô tả cách tạo đường hầm VPN bằng cách sử dụng chương trình
vpnclient và vpnserver.
Bước 1 : Chạy chương trình VPN Server.
Đầu tiên, chúng ta chạy chương trình VPN Server vpnserver trên máy ảo
Ubuntu Server. Sau khi chạy chương trình, cổng mạng ảo TUN sẽ xuất
hiện trong hệ thống. ( chúng ta có thể kiểm tra bằng câu lệnh ifconfig -a;
tên của cổng sẽ là tun0 trong hầu hết các trường hợp, nhưng chúng có
thể là tunX, với X là 1 con số). Đây là 1 cổng mới chưa được cấu hình,
vì vậy chúng ta cần phải cấu hình nó bằng cách đặt địa chỉ IP cho nó.
Chúng ta sử dụng 192.168.53.1 cho cổng này, ngoài ra bạn có thể sử
dụng địa chỉ IP khác.
Chạy lệnh bên dưới. Lệnh đầu tiên sẽ khởi động chương trình server, và
lệnh thứ hai sẽ chỉ định địa chỉ IP cho cổng tun0 và kích hoạt nó. Chú ý
rằng câu lệnh đầu tiên sẽ khóa và chờ đợi cho việc kết nối, vậy nên
chúng ta sẽ sử dụng một cửa sổ dòng lệnh khác để chạy dòng lệnh thứ
hai.
Qua máy Client ping để kiểm tra.

Bước 2 : Chạy VPN Client.


Bây giờ chúng ta sẽ chạy chương trình VPN Client trên máy Ubuntu
Client. Chúng ta sẽ chạy lệnh bên dưới trên máy này ( câu lệnh đầu tiên
sẽ kết nối đến chương trình VPN Server đang chạy trên 10.0.2.8. Câu
lệnh này sẽ chặn, vì vậy chúng ta cần phải tìm một cửa sổ dòng lệnh
khác để cấu hình cổng tun0 được tạo bởi chương trình VPN client.
Chúng ta chỉ định địa chỉ IP 192.168.53.3 cho cổng tun0 (Bạn có thể
chọn địa chỉ IP khác)
Qua máy Server kiểm tra.

Đã tạo VPN Tunnel thành công.


Bước 3 : Thiết lập định tuyến trên máy Client và máy Server.
Sau khi hoàn thành 2 bước trên, đường hầm sẽ được thiết lập. Trước khi
chúng ta có thể sử dụng đường hầm, chúng ta cần phải thiết lập định
tuyến các đường dẫn trên cả 2 máy Client và Server để điều chuyển lưu
lượng thông qua đường hầm. Chúng ta có thể sử dụng câu lệnh route để
thêm cổng định tuyến.
Để vượt qua tường lửa trên máy Client, bạn cần phải thiết lập cổng định
tuyến, vì thế lưu lượng đến trang web bị chặn sẽ được định tuyến qua
VPN. Bạn cần phải nghĩ xem cần thêm cổng định tuyến nào để có thể
vượt qua tường lửa.
Bên máy Server.
Bên máy Client.
Bước 4 : Thiết lập NAT trên máy Server.
Khi đích đến cuối cùng gửi gói tin ngược lại cho người dùng, gói tin sẽ
được gửi đến máy chủ VPN đầu tiên. Gói tin trả về sẽ được đưa đến
cổng NAT của máy chủ VPN đầu tiên ( bởi vì source IP của tất cả gói
tin đi ra từ máy chủ Server được thay đổi bằng địa chỉ IP của card NAT
bên ngoài (Về cơ bản thì là IP của máy chủ trong thiết lập của chúng
tôi). Bình thường, mạng NAT sẽ thay thế địa chỉ IP đích đến với một địa
chỉ IP của gói tin gốc ( ví dụ như trong trường hợp này là192.168.53.5)
và gửi nó về cho người sở hữu địa chỉ IP đó. Thật không may, chúng ta
có một vấn đề ở đây.
Trước khi mạng NAT gửi gói tin đi, nó cần phải biết địa chỉ MAC của
máy có IP 192.168.53.5, vì vậy nó gửi một gói tin ARP Request. Mạng
nội bộ của chúng tôi là mạng ảo, và địa chỉ IP thuộc về cổng tun0 trên
máy Client. Vì vậy, 192.168.53.5 sẽ không nhận gói tin ARP Request
(kể cả nếu có nhận, thì nó vô dụng). Mạng NAT sẽ bỏ gói tin, bởi vì
người nhận không tồn tại.
Người nhận thực sự phải là VPN Server VM, mặc dù nó không sở hữu
địa chỉ IP 192.168.53.5. Nếu chúng ta có thể cấu hình NAT làm cổng,
chúng ta có thể yêu cầu NAT định tuyến các gói cho 192.168.53.5 tới
Máy chủ VPN, máy chủ này cuối cùng sẽ phân phối các gói thông qua
đường hầm đến Máy khách VPN. Tuy nhiên, chúng tôi chưa tìm ra cách
định cấu hình NAT làm cổng trong VirtualBox, chúng tôi đã đưa ra hai
các giải pháp xung quanh công việc. Một ý tưởng là "đánh lừa" NAT tin
rằng địa chỉ MAC của 192.168.53.5 là địa chỉ MAC của VPN Server
VM, vì vậy gói tin sẽ được NAT gửi đến Máy chủ VPN. chúng tôi có
thể đạt được điều này bằng cách sử dụng nhiễm độc bộ nhớ cache ARP
trên NAT, về cơ bản nói với NAT trước về điịa chỉ MAC của
192.168.53.5.
Một giải pháp tốt hơn để vượt qua giới hạn của NAT là tạo một NAT
khác ngay trên Server VM, vì vậy tất cả các gói ra khỏi Server VM sẽ có
địa chỉ IP của VM này làm IP nguồn của chúng. Để đạt được Internet,
các gói này sẽ đi qua một NAT khác, được cung cấp bởi VirtualBox,
nhưng vì nguồn IP là Server VM, NAT thứ hai này sẽ không có vấn đề
gì khi chuyển tiếp lại các gói được trả về từ Internet đến máy chủ ảo. Sử
dụng giải pháp này, chúng tôi không cần phải sử dụng ARP cache để
"đánh lừa" NAT nữa. Các lệnh sau có thể kích hoạt NAT trên Server
VM:

Sau khi cấu hình NAT, kiểm tra bypassing Firewall.


Trên máy Client, ping đến địa chỉ facebook đã chặn trước đó.
Ping thành công.
Sử dụng Wireshark để bắt gói tin đường hầm tun0.

You might also like