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
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.
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
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ẽ
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à
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ó
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
•
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.
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.
•
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()
và
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.
đả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()
và
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);
và
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 TCP19
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.
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
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:
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.
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;
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;
}
để 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;