Tải bản đầy đủ (.pdf) (34 trang)

tìm hiểu các kỹ thuật tấn công và xây dựng một chương trình quét cổng

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (255.83 KB, 34 trang )


1

MỤC LỤC
Trang
LỜI NHẬN XÉT
LỜI CẢM ƠN
MỤC LỤC 1
MỞ DẦU 3
TÓM TẮT 4
Phần 1: CÁC KỸ THUẬT TẤN CÔNG 5
1. Mạng và các điểm yếu 5
2. Các bước chính thực hiện một cuộc tấn công 6
2.1. Thu thập thông tin đích 6
2.1.1. In dấu chân 7
2.1.2. Quét 7
2.1.3. Điểm danh 7
2.2. Truy cập lần đầu 8
2.3. Leo thang đặc quyền 8
2.4. Che đậy dấu vết 9
2.5. Đặt cửa sau 9
3. Một số kỹ thuật tấn công cơ bản 9
3.1. Kỹ thuật Sniffer 9
3.1.1. Passive attack 9
3.1.2. Active attack 10
3.2. Tấn công từ chối dịch vụ (Denial of Service attack – DoS) 11
3.2.1. E-mail bombing 11
3.2.2. Smurf 12
3.2.3. Brute-force 12
3.2.4. Ping of Death 12
3.2.5. Teardrop 12



2

3.2.6. SYN flood 13
4. Một số giải pháp 13
Phần 2: CHƯƠNG TRÌNH MINH HỌA 15
1. Cấu trúc mạng 15
1.1. IP 15
1.2. TCP 17
1.3. UDP 18
1.4. ICMP 19
2. Chương trình quét cổng 20
2.1. Tạo Socket 20
2.2. Phát hiện các cổng đang mở sử dụng giao thức TCP/IP 21
2.3. Phát hiện các cổng đang mở sử dụng giao thức TCP/IP bằng cách gửi
gói tin SYN 21
2.4. Phát hiện các cổng đang mở sử dụng giao thức TCP/IP bằng cách gửi
gói tin ACK 24
2.5. Phát hiện các cổng đang mở sử dụng giao thức TCP/IP bằng cách gửi
gói tin FIN 26
2.6. Phát hiện các cổng đang mở sử dụng giao thức UDP/IP 28
2.7. Kiểm tra bằng gói tin ICMP 29
2.8. Kiểm tra Hệ điều hành đang được sử dụng 30
KẾT LUẬN 34
1. Những vấn đề đạt được 34
2. Hướng phát triển của đề tài 34
TÀI LIỆU THAM KHẢO

3


MỞ ĐẦU

Ngày nay cùng với sự phát triển của kinh tế, mạng Internet ngày càng phát triển.
Nó mở rộng phạm vi liên lạc của con người, các công ty tổ chức ở rất xa nhau vẫn
có thể sử dụng Internet để giao dịch với nhau, thông qua Internet họ có thể quản lý
khách hàng của mình.
Tuy nhiên cùng với sự phát triển của nó, việc tấn công vào các tổ chức, lấy cắp
dữ liệu trên Internet ngày càng phổ biến. Các cuộc tấn công này lợi dụng những
điểm yếu trên mạng để nhằm thực hiện những mục đích của kẻ tấn công.
Để thực hiện một cuộc tấn công, kẻ tấn công phải tìm hiểu những thông tin cụ thể
về mạng của tổ chức đó. Tuy nhiên, việc tìm hiểu những thông tin đó cũng giúp ích
cho những người quản trị mạng trong việc khắc phục những điểm yếu trên mạng
của họ.
Một chương trình quét cổng thường được sử dụng trong trường hợp này nhằm
tìm ra những kẽ hở của mạng. Việc quét cổng sẽ tìm ra các cổng đang mở, hệ điều
hành trên một hệ thống mạng cụ thể nếu như hệ thống đó không được bảo vệ cẩn
thận.
Trên cơ sở những giao thức mạng đã biết, trong Đề tài “Tìm hiểu các kỹ thuật tấn
công và xây dựng một chương trình quét cổng” này, em có xây dựng một chương
trình quét cổng nhằm củng cố những kiến thức mà mình đã tìm hiểu được. Tuy
nhiên chương trình không tránh khỏi những hạn chế do kiến thức của bản thân. Em
sẽ cố gắng khắc phục những hạn chế này trong thời gian tới.

4

TÓM TẮT

Báo cáo gồm 2 phần:
Phần thức nhất: Tìm hiểu các kỹ thuật tấn công
1.

Mạng và các điểm yếu: Phần này giới thiệu chung về hiện trạng và các điểm
yếu của mạng hiện nay.

2.
Các bước chính thực hiện một cuộc tấn công: giới thiệu chung về các bước cơ
bản của một cuộc tấn công trên mạng.

3.
Một số kỹ thuật tấn công trên mạng: Đưa ra các kết quả tìm hiểu về các kỹ
thuật tấn công như: E-mail bombing, IP spoofing, SYN flood,…

4.
Một số giải pháp: Từ việc hiểu các kỹ thuật tấn công mà đưa ra một số biện
pháp nhằm ngăn chặn và hạn chế các cuộc tấn công.

Phần thứ hai: Xây dựng một chương trình quét cổng
Những lý thuyết cơ bản về mạng: Cấu trúc gói tin IP, TCP, UDP, ICMP.
Dựa trên những kiến thức đã tìm hiểu để xây dựng một chương trình nhằm góp
phần tìm ra những lỗi bảo mật, góp phần quan trọng vào việc bảo vệ cũng như tấn
công.

Kết thúc báo cáo là phần kết luận, tóm lược những nội dung đã trình bày và đưa
ra hướng nghiên cứu tiếp theo và danh mục các tài liệu tham khảo.



5

Phần 1: CÁC KỸ THUẬT TẤN CÔNG



1. Mạng và các điểm yếu
Khi Internet ra đời thì nhu cầu trao đổi thông tin trở nên cần thiết. Mục tiêu của
việc nối mạng là để cho mọi người dùng chung tài nguyên từ những vị trí địa lý
khác nhau. Do đó, các tài nguyên rất dễ bị phân tán, dẫn đến việc chúng sẽ bị xâm
phạm gây mất mát dữ liệu cũng như các thông tin có giá trị. Càng giao thiệp rộng
càng dễ bị tấn công, đó là quy luật.
Do đó, mỗi nguy cơ trên mạng là mối nguy hiểm tiềm tàng. Một lỗ hổng bảo mật
nhỏ của các hệ thống nhưng nếu được lợi dụng với tần suất cao và kỹ thuật hack
điêu luyện thì cũng sẽ trở thành tai họa. Trong khi đó Internet là một mô hình vô
cùng rộng lớn.
Theo thống kê của tổ chức bảo mật nổi tiếng CERT (Computer Emegency
Response Team), các vụ tấn công ngày càng tăng, cụ thể :
- Năm 1989 có 200 vụ tấn công và truy cập trái phép trên mạng Internet.
- Năm 1991 có 400 vụ.
- Năm 1993 có 1400 vụ.
- Năm 1994 là 1300 vụ.
- Những năm 200x có hàng chục ngàn vụ trên mỗi năm.
Internet là nơi cực kỳ hỗn loạn, mọi thông tin truyền trên Internet đều có thể bị
xâm hại và nghe lén được. Thậm chí là công khai. Vì vậy, để bảo vệ được, chúng ta
phải hiểu rõ các điểm yếu của mạng để có thể tự bảo vệ.
Sau đây là 14 chỗ yếu dễ bị xâm nhập:
• Thiếu điều khiển truy cập bộ định tuyến và lập cấu hình sai ACL sẽ cho phép
rò rỉ thông tin qua ICMP, IP, NetBIOS, dẫn đến truy cập bất hợp pháp các
dịch vụ trên máy phục vụ DMZ.
• Điểm truy cập từ xa không được theo dõi và bảo vệ sẽ là phương tiện truy
cập dễ dàng nhất đối với mạng công ty.

6


• Rò rỉ thông tin có thể cung cấp thông tin phiên bản hệ điều hành và chương
trình ứng dụng, người dùng, nhóm, DNS cho kẻ tấn công thông qua chuyển
vùng và các dịch vụ đang chạy như SNMP, SMTP, telnet, …
• Máy chủ chạy các dịch vụ không cần thiết (như FTP, DNS, SMTP) sẽ tạo ra
lối vào.
• Mật mã yếu, dễ đoán, dùng lại ở cấp trạm làm việc có thể dồn máy phục vụ
vào chỗ thỏa hiệp.
• Tài khoản người dùng hoặc tài khoản thử nghiệm có đặc quyền quá mức.
• Máy phục vụ internet có cấu hình sai, đặc biệt là kịch bản CGI trên máy phục
vụ web và FTP vô danh.
• Bức tường lửa hoặc ACL bị lập cấu hình sai có thể cho phép truy cập trực
tiếp hệ tống trong hoặc một khi đã thỏa hiệp xong máy phục vụ DMZ.
• Phần mềm chưa được sửa chữa, lỗi thời, dễ bị tấn công, hoặc để ở cấu hình
mặc định.
• Quá nhiều điều khiển truy cập thư mục và tập tin.
• Quá nhiều mối quan hệ ủy quyền như NT Domain Trusts, các tập tin .rhosts
và hosts.equiv trong UNIX sẽ cho kẻ tấn công truy cập hệ thống bất hợp pháp.
• Các dịch vụ không được chứng thực như X Windows.
• Thiếu tính năng ghi nhật ký, theo dõi, và dò tại mạng và cấp độ máy chủ.
• Thiếu chính sách bảo mật, thủ tục, và tiêu chuẩn tối thiểu.
2. Các bước chính thực hiện một cuộc tấn công.
Có nhiều cách để thực hiện một cuộc tấn công và tùy thuộc vào từng mục đích cụ
thể mà phương pháp tấn công có thể khác nhau. Nhưng điểm chung giống nhau là
nó đều được thực hiện qua 5 bước sau:
2.1. Thu thập thông tin đích
Để tiến hành một cuộc tấn công thì người tấn công phải nghiên cứu rất nhiều về
hệ thống trước khi tìm cách truy cập đặc quyền hệ thống đó. Việc thu thập thông tin
đích bao gồm các bước là in dấu chân, quét và điểm danh.

7


2.1.1 In dấu chân
In dấu ấn là việc dùng các công cụ và kỹ thuật để lấy thông tin cơ bản đầu tiên về
một tổ chức hoặc trang web muốn tấn công. Việc in dấu ấn có hệ thống một tổ chức
sẽ cho phép thấy rõ tình hình an ninh (độ bảo mật) của tổ chức đó. In dấu có thể
giúp định danh tất cả các mẩu tin và nắm những thông tin cơ bản.

Có rất nhiều kỹ thuật in dấu ấn khác nhau nhưng chủ yếu nhằm vào khám phá
thông tin liên quan đến những công nghệ: Internet, intranet, truy cập từ xa, extranet.

2.1.2 Quét
Nếu in dấu chân là thu thập tất cả thông tin có liên quan đến tổ chức đích thì
quét là một bước xác định xem trong đó thì cái nào là dùng được bằng các đợt quét
ping, quét cổng và các công cụ phát hiện tự động. Bước này cho phép xác định một
cách chính xác các hệ thống còn sống hay không thông qua ICMP hoặc thông qua
cổng quét chọn lọc.
• Truy vấn ICMP: Có thể thu thập tất cả các kiểu thông tin về một hệ thống
bằng cách đơn giản gửi một gói tin ICMP cho nó.

Quét cổng (port scan): Quét cổng là tiến trình nối với các cổng TCP và UDP
trên hệ đích để xác định các dịch vụ đang chạy hoặc đang ở trạng thái
LISTENNING. Các dịch vụ hoạt động đang lắng chờ (listenning) có thể cho
phép một người dùng trái phép giành được quyền truy cập các hệ thống bị cấu
hình sai. Mục tiêu của việc quét cổng là: Định danh các dịch vụ TCP và UDP
đang chạy trên hệ đích, định danh kiểu hệ điều hành của hệ đích, định danh
các ứng dụng cụ thể hoặc các phiên bản của một dịch vụ cụ thể.

2.1.3 Điểm danh mạng
Giả sử việc thực hiện in dấu chân và quét đều không thành công hoặc những
thông tin thu được không thể đủ để phát động một cuộc tấn công, người tấn công sẽ

chuyển sang phương pháp định danh các tài khoản người dùng hợp lệ hoặc các tài
nguyên dùng chung không được bảo vệ kỹ. Điểm danh là một cách để trích các tài
khoản hợp lệ hoặc các tài nguyên từ hệ thống.

8

Những thông tin mà kỹ thuật điểm danh thu được có thể tạm thu gọn thành các
phạm trù sau: Các tài nguyên mạng và các phần dùng chung, người dùng và nhóm,
các ứng dụng và biểu ngữ (banner).
Kỹ thuật điểm danh cũng cụ thể theo từng hệ điều hành của server, và do đó, nó
cũng phụ thuộc vào các thông tin thu thập được từ phần in dấu chân và quét.
2.2. Truy cập lần đầu
Sau khi có được những thông tin quan trọng ở bước trên, người tấn công bắt đầu
tấn công vào hệ thống đích dựa trên những lỗ hổng mà họ đã tìm được. Để tấn công
có hiệu quả thì người tấn công phải sử dụng những phương pháp tấn công phù hợp
nhằm đạt được hiệu quả cao nhất và tránh bị phát hiện.
2.3. Leo thang đặc quyền
Sự leo thang đặc quyền là một phương thức tấn công mà các User có quyền hạn
thấp hơn sẽ tấn công vào một điểm dễ bị tổn thương nhất của hệ thống để trở thành
một người quản trị hoặc có thể trở thành các User có quyền hạn cao hơn. Cách để
leo thang đặc quyền là chiếm quyền thông qua crack password của người quản trị,
tấn công tràn bộ đệm của máy đó và ăn cắp password.
Chỉ cần phát hiện ra được một Password cho ứng dụng thì coi như việc tấn công
leo thang đặc quyền đã thành công. Vì vậy khi sử dụng password nên chú ý một số
điểm sau:
• Thay đổi password thường xuyên để không bị mất password.
• Các password cần được đặt gồm đủ các ký tự cả số, không nên đặt password
có liên quan đến bản thân vì như vậy làm tăng nguy cơ password bị attacker
đoán được.
• Nên xoá các user không cần thiết sử dụng nếu như thật sự không cần nhằm

giảm nguy cơ bị tấn công leo thang đặc quyền.
• Không cho người lạ mặt tìm hiểu về hệ thống và có các tác động vật lý vào
server.

9


Thiết lập quyền không cho cài đặt các chương trình lạ đối với các user không
tin cậy vào máy server.

2.4. Che đậy dấu vết
Sau khi xâm nhập thành công, người tấn công thường phải xóa dấu vết mà những
nhà quản trị mạng có thể dùng để tìm ra họ. Có nhiều công cụ và kỹ thuật xóa dấu
vết tùy thuộc vào từng hệ điều hành khác nhau.
2.5. Đặt cửa sau
Việc đặt cửa sau là quan trọng nếu như người tấn công vẫn còn muốn quay lại hệ
thống đó. Việc đặt cửa sau cũng giống như việc tạo một tài khoản với user và
password hợp lệ cho người tấn công.
3. Một số kỹ thuật tấn công cơ bản
3.1. Kỹ thuật sniffer
Các hệ thống truyền thông tin qua mạng đôi khi không chắc chắn lắm và lợi dụng
điều này, hacker có thể truy cập vào đường truyền dữ liệu để nghe trộm hoặc đọc
trộm luồng dữ liệu truyền qua.
Các chương trình nghe trộm còn được gọi là các sniffer. Các sniffer này có
nhiệm vụ lắng nghe các cổng của một hệ thống mà hacker muốn nghe trộm. Nó sẽ
thu thập dữ liệu trên các cổng này và chuyển về cho hacker.
Có hai phương pháp mà các sniffer có thể thực hiện như sau:
3.1.1 Passive attack
Một cuộc tấn công passive thực hiện việc nghe lén thông tin nhưng không làm
ảnh hưởng tới tài nguyên của hệ thống. Ảnh hưởng chính của cách tấn công này là

nó đe dọa tính bí mật của dữ liệu đang được truyền. Như trong hình 1.1, dữ liệu
được truyền từ nguồn đến nơi nhận có thể bị theo dõi bởi người nghe lén ở giữa. Dữ
liệu này có thể là những thông điệp e-mail hay username và password được truyền
mà không mã hóa.

10


Trong cách tấn công này có hai phương pháp thường được sử dụng là: Tấn công
nghe trộm (passive wiretapping attack) và tấn công phân tích gói tin (traffic analysis
attacks).
• Tấn công nghe trộm (passive wiretapping attack
)
: Attacker có thể hiểu và lấy
những thông tin mà dữ liệu đã mã hóa để truyền. Ví dụ như khi hai bên truyền
thông với nhau mà không tiến hành mã hóa thì một cuộc tấn công nghe trộm
có thể lấy được toàn bộ thông tin được mã hóa trong dữ liệu.
• Tấn công phân tích (Traffic analysis attack): Kẻ tấn công không thể hiểu
thông tin mà dữ liệu mã hóa để truyền. Thay vào đó, traffic analysis dựa vào
đặc điểm của các gói tin để đưa suy ra thông tin mà nó thu được. Ví dụ, nếu
hai công ty: Một công ty phát triển mạng và một công ty kém phát triển, họ
trao đổi với nhau một số lượng thông điệp lớn thì người tấn công có thể suy ra
rằng họ đang thảo luận về việc hợp nhất hai công ty đó.
Thành công của một cuộc tấn công passive attack phụ thuộc vào đường truyền
vật lý sử dụng và khả năng truy cập đường truyền của người tấn công.
3.1.2 Active attack
Một cuộc tấn công active nhằm thay đổi tài nguyên hệ thống hay làm ảnh hưởng
đến hoạt động của chúng. Nó đe dọa đến tính nguyên vẹn của dữ liệu đang được
truyền. Trong trường hợp như Hình 1.2, dữ liệu được truyền từ nguồn đến nơi nhận
không những chỉ bị theo dõi mà còn bị điều khiển bởi người nghe trộm ở giữa.

Bằng cách này người tấn công có thể chỉnh sửa, thêm vào, xóa hay gửi lại bất kỳ dữ
liệu nào.


Hình 1.1: Dữ liệu bị nghe lén trên đường truyền

11

Cách tấn công này dễ dàng thực hiện các mục đích tấn công khác nhau như là
làm lụt nơi nhận bằng tấn công từ chối dịch vụ (DoS), làm giảm chất lượng dịch vụ,
spoofing, session hijacking,…

3.2.

Tấn công từ chối dịch vụ (Denial of Service attack – DoS):
Kiểu tấn công này thông thường làm tê liệt một số dịch vụ. Và đây là một trong
những kiểu tấn công khó phòng ngừa nhất. Các tấn công này lợi dụng một số lỗi
trong phần mềm hay các lỗ hổng bảo mật trên hệ thống nhằm làm cho đường truyền
bị tắc nghẽn do có quá nhiều yêu cầu được gửi đến máy tính bị tấn công trong một
khoảng thời gian ngắn, khiến cho hệ thống mạng không thể gửi các gói tin báo nhận
kịp thời. Hay nhằm tước đoạt tài nguyên hệ thống làm cho những người dùng hợp lệ
bị từ chối sử dụng tài nguyên.
Có các kiểu tấn công từ chối dịch vụ như sau:
3.2.1

E-mail bombing
Kẻ tấn công làm lụt hộp thư của người bị tấn công với một số lượng lớn các
thông điệp giả mạo.
Các dạng e-mail bomb phổ biến là: E-mail có đính kèm virus, e-mail có đính
kèm file virus dưới dạng file nén, e-mail có đính kèm file nén là tập tin văn bản có

kích thước lớn nhưng chỉ có một ký tự được lặp đi lặp lại hàng ngàn lần.
Có hai phương pháp thực hiện một cuộc tấn công bằng e-mail bomb là: Mass
mailing và list linking.

Mass mailing: Là việc gửi lặp đi lặp lại một mail tới một địa chỉ mail. Tương
tự như khi sử dụng trong spamming, những kẻ tấn công gửi hàng triệu, hàng


Hình 1.2: Dữ liệu bị tấn công trên đường truyền

12

ngàn e-mail, nhưng địa chỉ của các e-mail này chỉ là một hay một vài địa chỉ
mà những kẻ tấn công muốn làm lụt.

List linking: Mỗi thông điệp đến được thêm vào một file plain text gồm tất cả
các thông điệp đã chuyển đến trong ngày hôm đó. Khi ngày đó kết thúc, toàn
bộ file được gửi tới các thành viên khác. Bằng cách này, các thành viên khác
sẽ nhận được một file chứa tất cả các thông điệp trong ngày.
3.2.2

Smurf
Người tấn công gửi những gói tin ICMP echo request multicast hay broadcast tới
hệ thống nào đó với địa chỉ IP nguồn của gói tin là địa chỉ của hệ thống bị tấn công.
Nơi nhận thông điệp ICMP đó sẽ gửi lại thông điệp ICMP reply tới hệ thống bị tấn
công. Kết quả là hệ thống bị tấn công sẽ bị lụt.
3.2.3

Brute-force
Một tấn công kiểu Brute-force, như kiểu ‘Smurf’, nhằm nhanh chóng nhấn chìm

mạng đích với các dữ liệu vô nghĩa. Một hacker Smurf đặt địa chỉ IP đích của gói là
địa chỉ quảng bá của mạng. Máy đích sẽ quảng bá gói ICMP echo request đến tất cả
các trạm trong mạng. Nếu có nhiều trạm, điều này sẽ tạo ra một lượng lớn các gói
ICMP echo request làm tắc nghẽn mạng đích.
3.2.4

Ping of Death
Ping of Death sử dụng công cụ ‘PING’ để tạo các gói IP vượt quá mức tối đa
65535 byte dữ liệu cho phép bởi xác lập IP. Gói vượt kích thước đó được gửi đến
một hệ thống không chờ đợi khiến nó có thể bị hỏng, treo hoặc khởi động lại.
3.2.5

Teardrop
Teardrop khai thác sự yếu kém trong việc tái ghép các phân mảnh của gói IP. Khi
dữ liệu được truyền qua mạng, các gói IP thường được chia thành các mảnh nhỏ.
Mỗi mảnh trông giống như gói nguyên gốc trừ việc nó chứa trường offset. Chương
trình Teardrop tạo ra một loạt các mảnh IP với trường offset chồng chéo. Khi các
mảnh này được tái ghép tại đích, một số hệ thống sẽ bị hỏng, treo hoặc khởi động
lại.

13

3.2.6

SYN flood
Các tấn công SYN nhấn chìm một hệ thống đích với một loạt các gói SYN. Hệ
thống đích sẽ tạo và gửi lại một gói tin SYN/ACK sau khi nhận gói tin SYN. Trong
khi hệ thống đích chờ đợi ACK theo sau mỗi SYN/ACK, nó sẽ nạp vào hàng đợi tất
cả các gói SYN/ACK chờ đến lượt. Các gói SYN/ACK sẽ chỉ được đưa ra khỏi
hàng đợi khi ACK trở lại hoặc khi hết thời gian timeout mà chưa nhận được gói tin

ACK. Khi hàng đợi bị đầy, hệ thống sẽ bỏ qua các yêu cầu SYN khác, làm cho hệ
thống không sử dụng được bởi những người dùng hợp lệ.
Tấn công từ chối dịch vụ kiểu phân tán (Distributed Reflection Denial of
Dervice- DDoS): Kiểu tấn công này thực hiện bằng cách cùng một lúc nhiều máy
cùng gửi gói tin đến đích. Kết quả là máy đích không còn khả năng nhận gói tin.
Thế hệ sau của tấn công từ chối dịch vụ kiểu phân tán (Distributed Denial of
Dervice - DRDoS): Bằng cách giả mạo địa chỉ IP của máy đích, người tấn công
cùng một lúc gửi nhiều gói tin đến các hệ thống máy mạnh trên mạng. Các hệ thống
này khi nhận gói tin SYN giả này, nó chấp nhận kết nối và gửi gói tin SYN/ACK
đến địa chỉ IP trong gói tin SYN. Kết quả là cùng một lúc nhận được nhiều gói tin,
đường truyền đích không đủ đáp ứng, hệ thống máy đích từ chối nhận bất kỳ gói tin
nào.

4.

Một số giải pháp
Dưới đây là một số cách có thể giúp nhà quản trị mạng ngăn chặn những cuộc tấn
công vào hệ thống mạng:

Sử dụng bộ giao thức IPsec (Internet Protocol Security) để mật mã hóa và xác
nhận các gói dữ liệu trao đổi ở lớp mạng.

Sử dụng danh sách kiểm soát việc truy cập (Access Control List - ACL) để
ngăn chặn những gói dữ liệu tải về có địa chỉ IP cá nhân.

Cài đặt bộ lọc dữ liệu

đi vào và đi ra khỏi hệ thống mạng.

14



Cấu hình các bộ chuyển mạch và bộ định tuyến để loại trừ những gói dữ liệu
từ bên ngoài vào hệ thống mạng nhưng lại khai báo là có nguồn gốc từ một
máy tính nằm trong hệ thống.


Kích hoạt các quy trình mật mã hóa trong bộ định tuyến để những máy tính
đã được xác nhận nhưng nằm ngoài hệ thống mạng có thể liên lạc một cách an
toàn với các máy tính nằm trong hệ thống.


Tắt những dịch vụ không cần thiết trên máy chủ.


Quản lý chặt chẽ các tài khoản người dùng và các điểm truy cập từ xa.


Bật tính năng ghi nhật ký, theo dõi và dò tại mạng.


Thường xuyên cập nhật những phiên bản mới của các phần mềm.


15

Phần 2: CHƯƠNG TRÌNH MINH HỌA
(Chương trình quét cổng - Port scanning)
1.


Cấu trúc mạng
Chúng ta biết rằng các máy tính chạy trên mạng Internet giao tiếp với nhau
thông qua hai giao thức TCP (Transmission Control Protocol) và UDP (User
Datagram Protocol). Mô hình mạng Internet có thể đựợc mô tả trong sơ đồ sau:


(1) Tầng ứng dụng (Application): Là các chương trình ứng dụng trên mạng.
(2) Tầng giao vận (Transport): Có nhiệm vụ cơ bản là tryền tin giữa hai điểm
giao tiếp trên mạng. Tại tầng này người ta sử dụng giao thức TCP hoặc UDP.
(3) Tầng mạng (Network): Có chức năng là tìm đường đi trên mạng, tại tầng
này với mạng Internet người ta sử dụng giao thức IP.
(4) Tầng liên kết (Link): Thực hiện việc kết nối máy tính với môi trường
mạng để có thể giao tiếp dữ liệu.
1.1.

IP
IP là giao thức không tạo cầu nối (connectionless), thiếu tin cậy (unreliable) và
chuyển phát tổng lực (best-efort). Khi số liệu được đưa xuống lớp mạng, số liệu
được đóng thành gói. Một header được thêm vào gói tin như Hình 2.2, bao gồm
thông tin địa chỉ và các thông tin điều khiển khác:



Hình 2.1:
Mô hình mạng Internet


16




Version: Chỉ ra phiên bản hiện hành của IP đang được dùng; có 4 bit.


IP header length (HLEN): Chỉ ra chiều dài của header theo các từ 32 bit.


Type of service (TOS): Chỉ ra tầm quan trọng được gán bới một giao thức
lớp trên đặc biệt nào đó, có 8 bit.


Total length: Chỉ ra chiều dài của toàn bộ gói tin tính theo byte, bao gồm dữ
liệu và header, có 16 bit.


Identification: Chứa một số nguyên định danh cho datagram hiện hành, có
16 bit. Đây chính là chỉ số tuần tự.


Flag: Có 3 bit, trong đó 2 bit có thức tự thấp điều khiển sự phân mảnh. Một
bít cho biết gói tin có thể bị phân mảnh hay không, bit kia cho biết gói có
phải là phân mảnh cuối cùng của chuỗi gói bị phân mảnh hay không.


Fragment offset: Được dùng để ghép các mảnh datagram lại vói nhau, có
13bit.


Time to live: Chỉ ra số bước nhảy (hop) mà một gói có thể đi qua.



Protocol: Chỉ ra giao thức lớp trên sẽ tiếp nhận gói tin khi công đoạn xử lý
IP hoàn tất, như TCP hay UDP,…, có 8 bit.


Header checksum: Giúp đảm bảo sự toàn vẹn của IP header, có 16 bit.


Source address: Chỉ ra địa chỉ IP của node truyền datagram, có 32 bit.


Destination address: Chỉ ra địa chỉ IP của node nhận, có 32 bit.


Options: Cho phép IP hỗ trợ các tùy chọn khác nhau, chẳng hạn như bảo
mật, chiều dài thay đổi,….


Padding: Các số 0 được bổ sung vào trường này để đảm bảo IP header luôn
là bội số của 32 bit.


Data: Chứa thông tin của lớp trên, chiều dài thay đổi đến 64Kb.


17


1.2.


TCP
TCP (Transmission Control Protocol) là một giao thức hướng kết nối, nó
cung cấp một đường truyền dữ liệu tin cậy giữa hai máy tính. Tính tin cậy thể
hiện ở việc nó đảm bảo dữ liệu được gửi sẽ đến được đích và theo đúng thứ tự
như khi nó được gửi. Hàm
Send()

Receive()
sẽ được sử dụng để gửi gói tin tới
đích và nhận gói tin quay trở lại từ đích.
Sau đây là các định nghĩa về các trường trong TCP segment (hình 2.3):


Source port: Cổng mà gói tin đi ra.


Destination port: Cổng mà gói tin đi đến.


Sequence number: Chữ số được dùng để đảm bảo tuần tự chính xác của dữ
liệu đến.


Acknowledgment number: TCP octet được mong đợi kế tiếp.


HLEN: Số lượng các từ 32 bit trong header.


Reserved: Tất cả các bit được bật thành 0.



Code bit: Có các chức năng điều khiển như là thiết lập và kết thúc một phiên.


Hình 2.2: Gói tin IP


18



Window: Số octet mà máy thu sẵn sàng chấp nhận.


Checksum: Checksum được tính từ header và trường dữ liệu.


Urgent pointer: Chỉ ra điểm kết thúc của dữ liệu chuẩn.


Option: Một tùy chọn định ra kích thước tối đa hiện hành của TCP segment.


Data: Dữ liệu giao thức của lớp trên.
1.3.

UDP
UDP (User Datagram Protocol) là giao thức không hướng kết nối, nó gửi các
gói dữ liệu độc lập gọi là datagram từ máy tính này đến máy tính khác mà không

đảm bảo việc dữ liệu sẽ tới đích. Không giống như TCP, vì ở đây một kết nối
chưa được tạo ra nên hàm
SendTo()

ReceiveFrom()
sẽ được dùng để gửi gói
tin tới đích và nhận gói tin quay trở lại.
skUdp.SendTo(bytesend, ep);

skUdp.ReceiveFrom(byterecv, ref ep);
Trong đó:

bytesend: Gói tin gửi đi.

byterecv: Gói tin nhận lại.

ep: Địa chỉ đích.


Hình 2.3: Gói tin TCP


19

Sau đây là định nghĩa các trường trong một UDP segment:


Source port: Chữ số của port gọi.

Destination port: Chữ số của port bị gọi.


Length: Số byte trong header và trường dữ liệu.

Checksum: Checksum được tính từ header và trường dữ liệu.

Data: dữ liệu của giao thức lớp trên.
1.4.

ICMP
ICMP (Internet Control Message Protocol) là một giao thức thông báo lỗi của
IP. Khi quá trình truyền dữ liệu xảy ra lỗi thì ICMP được sử dụng để thông báo lỗi
cho nơi gửi dữ liệu.
Cấu trúc gói tin ICMP có dạng như hình 2.5
Trong đó:

Type: Cho biết thông điệp nào của ICMP được gửi đi.

Code: Cho biết chi tiết hơn về loại thông điệp ICMP.

Checksum: Được sử dụng để kiểm tra lỗi cho dữ liệu.


Hình 2.4: Gói tin UDP

Hình 2.5: Gói tin ICMP


20



Identifier: Chứa một số nguyên định danh cho datagram hiện hành, có 16
bit.

Sequence number: Chữ số được dùng để đảm bảo tuần tự chính xác của dữ
liệu đến.

Optional data.
2.

Chương trình quét cổng
Chương trình quét cổng sử dụng các kỹ thuật khác nhau dựa trên cơ sở mạng đã
có nhằm mục đích thu thập thông tin về một đích cụ thể nào đó. Nó có thể khám
phá chính xác những điểm yếu tồn tại bên trong đích đó. Một chương trình quét
cổng hữu ích cho cả việc bảo vệ và tấn công. Và để thực hiện thì phải hiểu rõ các
hoạt động truyền dữ liệu trên mạng.
2.1.

Tạo Socket
Socket như một giao diện nằm giữa tầng ứng dụng và tầng khác trong mô
hình mạng OSI, có nhiệm vụ thực hiện việc giao tiếp giữa chương trình ứng dụng
với các tầng bên dưới của mạng.

Socket skUdp = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Trong đó:

AddressFamily.InterNetwork
: Chỉ ra địa chỉ IP là version 4.
Hình 2.3
:
Mô hình OSI rút gọn



21


SocketType. Stream
: Thường sử dụng cho việc gửi một gói tin theo giao
thức TCP. Trong trường hợp gói tin được gửi theo giao thức UDP,
SocketType
sẽ là Dgram thay vì Stream.

ProtocolType.Tcp
: Chỉ ra giao thức lớp trên sẽ xử lý gói tin là giao thức
TCP. Trong trường hợp nếu giao thức lớp trên là UDP thì
ProtocolType

Udp.
Thay vì lập trình ở mức ứng dụng của mạng, để lập trình ở mức IP (tức tầng
Network trong 4 tầng của Internet) thì phải sử dụng
SocketType.Raw
là một dạng
socket "thô":
Socket sk = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Tcp);
2.2.

Phát hiện các cổng đang mở sử dụng giao thức TCP/IP
Trong trường hợp này, để phát hiện các cổng sử dụng giao thức TCP đang mở,
hàm
connect()
sẽ được sử dụng cho một socket vừa tạo ra để tạo kết nối đến host đã

chỉ ra. Nếu cổng đó đang ở trạng thái listening thì kết nối sẽ thành công
(Connected==true), ngược lại thì cổng đó đóng.
//Chương trình quét cổng TCP.

EndPoint ep = new IPEndPoint(ip, port);
Socket skTcp = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{

//Kết nối tới một địa chỉ cụ thể.
skTcp.Connect(ep);
}
catch { }
if (skTcp.Connected)
{
richTextBox1.Text = richTextBox1.Text + Environment.NewLine + Mang_A[port].PoTy + " "
+ Mang_A[port].Proto;
}
2.3.

Phát hiện các cổng đang mở sử dụng giao thức TCP/IP bằng cách gửi gói tin
SYN
Việc quét các cổng bằng cách tạo ra một kết nối đầy đủ dễ bị phát hiện. Vì vậy,
thay vào đó một kỹ thuật quét bằng cách tạo một kết nối “half-open” sẽ được thực
hiện.
Trước tiên, ta phải tạo một
rawsocket
có tên
sk
như sau:


22

Socket sk = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Tcp);
Trong đó:

SocketType.Raw
: Chỉ ra rằng đây là socket thô, gói tin được gửi qua socket
này do người dùng tự định nghĩa.

ProtocolType.Tcp
: Giao thức lớp trên sẽ tiếp nhận gói tin sau khi nó được xử
lý thành công ở lớp mạng.
Vì trong trường hợp này kết nối chưa được tạo nên phương thức
Socket.SendTo()
được sử dụng để gửi gói tin qua socket.
sk.SendTo(packet1, 20, SocketFlags.None, ep);

Trong đó:
packet1
là gói tin ICMP gửi đi,
20
là kích thước gói tin ICMP gửi đi,
SocketFlags.None
là cờ của socket không được bật,
Ep
là địa chỉ đích.
Cấu trúc của gói tin TCP được chuyển qua rawsocket được định nghĩa như sau:
public struct Tcp_hdr
{

public ushort Sport_tcp;
//Địa chỉ cổng máy gửi.

public ushort Dport_tcp;
//Địa chỉ cổng máy nhận.
public uint Seq_tcp;
//Chỉ số tuần tự của gói tin hiện hành.
public uint Ack_tcp;
//Gói tinmong muốn nhận tiếp theo.

public byte Hlen;
//Chiều dài của header.
public byte Codebit;
// Các cờ FIN, SYN, RST, PSH, ACK, URG.

public ushort Window;
//Cửa sổ nhận.
public ushort Cck_tcp;
//Checksum

public ushort Urgent;
//Vị trí kết thúc của dữ liệu.

}

Dựa trên cấu trúc của một gói tin TCP, một gói tin SYN sẽ được tạo và gửi đến
địa chỉ đích. Trong đó, trường
Codebit
của gói tin có giá trị là 2 chỉ ra rằng đó là gói
tin SYN.


//Khoi tao gói tin SYN
Syn.Sport_tcp = port;
Syn.Dport_tcp = port;
Syn.Seq_tcp = 0;
Syn.Ack_tcp = 0;
Syn.Hlen = 0x45;
Syn.Codebit = 2;
//Tạo gói tin SYN

Syn.Window = 65535;
Syn.Cck_tcp = 0;
Syn.Urgent = 0;

23

Nếu cổng đó mở thì một gói tin ACK sẽ được gửi lại. Việc kiểm tra xem gói tin
trở về có phải là một gói tin ACK hay không được thực hiện bằng cách thực hiện
phép AND giữa trường Codebit của gói tin nhận được với 0x10. Nếu kết quả nhận
được là 0 thì cờ ACK đã không được bật, đó không phải là gói tin ACK. Còn nếu
nhận được giá trị khác 0 thì đó là gói tin ACK.
Khi gói tin ACK được gửi lại thì một gói tin RST sẽ được tạo và gửi đến đích để
đóng kết nối. Trong gói tin RST, trường
Codebit
có giá trị là 4.
//Chương trình quét cổng bằng cách gửi gói tin SYN.
public struct Tcp_hdr
{
public ushort Sport_tcp;
public ushort Dport_tcp;


public uint Seq_tcp;
public uint Ack_tcp;
public byte Hlen;
public byte Codebit;
public ushort Window;

public ushort Cck_tcp;
public ushort Urgent;
}
public static bool SynScan(string st1,string st2, ushort port)
{
//Tao socket
IPAddress addr = IPAddress.Parse(st1);
IPAddress local_addr = IPAddress.Parse(st2);
EndPoint ep = new IPEndPoint(addr, port);
EndPoint localep = new IPEndPoint(local_addr, port);

//S

d

ng Raw socket
Socket sk = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Tcp);
sk.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true);
sk.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 3000);

//Khoi tao Tcp header
Syn.Sport_tcp = port;
Syn.Dport_tcp = port;

Syn.Seq_tcp = 0;
Syn.Ack_tcp = 0;
Syn.Hlen = 0x45;
Syn.Codebit = 2;
//Tạo gói tin SYN

Syn.Window = 65535;
Syn.Cck_tcp = 0;
Syn.Urgent = 0;

//Tao goi tin
getByte();
chcksm();

24

Syn.Cck_tcp = check;
getByte();

bool gui = false;
bool kt_syn = true;
try
{
sk.SendTo(packet1, 20, SocketFlags.None, ep);
}
catch
{
kt_syn = false;
}


try
{
sk.Bind(localep);
sk.ReceiveFrom(packet2, ref ep);
}
catch
{
kt_syn = false;
}
if ((kt_syn = true) && ((packet2[33] & 0x10) != 0))
{
gui = true;
Syn.Codebit = 4;
//Gói tin RST.

getByte();
chcksm();
Syn.Cck_tcp = check;
getByte();

try
{
sk.SendTo(packet1, 20, SocketFlags.None, ep);
}
catch { }
}
else gui = false;
sk.Close();
return gui;
}

2.4.

Phát hiện các cổng đang mở sử dụng giao thức TCP/IP bằng cách gửi gói tin
ACK
Trong trường hợp đích chỉ ra có sử dụng firewall hay bộ lọc gói tin nhằm hạn chế
gói tin SYN thì việc quét cổng bằng gói tin ACK có thể được sử dụng để thay thế
cho việc quét cổng bằng gói tin SYN, bởi không phải bộ lọc gói tin nào cũng hỗ trợ
hết các chức năng. Một gói tin ACK sẽ được gửi tới địa chỉ đích, nếu cổng đã chỉ ra

25

đó mở thì ta sẽ nhận lại một gói tin RST. Trong trường hợp không nhận được gói tin
nào gửi lại thì cổng đó đóng.
Tương tự như gói tin SYN nhưng thay vì trường Code bit=2 gói tin ACK có giá
trị của trường Code bit là 16.

//Khoi tao gói tin ACK
Syn.Sport_tcp = port;
Syn.Dport_tcp = port;
Syn.Seq_tcp = 0;
Syn.Ack_tcp = 0;
Syn.Hlen = 0x45;
Syn.Codebit = 16;
//Tạo gói tin ACK

Syn.Window = 65535;
Syn.Cck_tcp = 0;
Syn.Urgent = 0;
Chương trình sẽ sử dụng hàm
Socket.ReceiveFrom()

để nhận gói tin
packet2
từ
địa chỉ đích
ep
bởi ở đây kết nối chưa được tạo.
sk.ReceiveFrom(packet2, ref ep);
Nếu nhận được một gói tin thì thực hiện phép AND giữa trường Codebit của gói
tin với 0x04. Kết quả là 1 thì đó là gói tin RST, ngược lại gói tin đó không phải là
gói tin RST, cổng không mở.
//Chương trình quét cổng bằng gói tin ACK.
public static bool ACKScan(string st1,string st2, ushort port)
{

//Tao socket
IPAddress addr = IPAddress.Parse(st1);
IPAddress local_addr = IPAddress.Parse(st2);
EndPoint ep = new IPEndPoint(addr, port);
EndPoint localep = new IPEndPoint(local_addr, port);
Socket sk = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Tcp);
sk.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true);
sk.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 3000);

//Khoi tao Tcp header
Syn.Sport_tcp = port;
Syn.Dport_tcp = port;
Syn.Seq_tcp = 0;
Syn.Ack_tcp = 0;
Syn.Hlen = 0x45;
Syn.Codebit = 0x10;

Syn.Window = 65535;
Syn.Cck_tcp = 0;
Syn.Urgent = 0;

×