Kiểm tra bằng gói tin ICMP

Một phần của tài liệu 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 (Trang 29 - 34)

1. Cấu trúc mạng

2.7. Kiểm tra bằng gói tin ICMP

Dựa trên tính chất của gói tin ICMP, một gói tin ICMP echo request sẽ được gửi đến đích nhằm mục đích kiểm tra trạng thái của đích. Nếu nhận lại được một gói tin echo reply thì đích đang ở trạng thái hoạt động.

//Tạo gói tin ICMP echo request.

Icmp_pkt.Type = 0x08; Icmp_pkt.Code = 0x00; Icmp_pkt.Checksum = 0; Icmp_pkt.Id_icmp = 1;

Icmp_pkt.Seq_icmp = 1;

Trường Type trong gói tin ICMP request có giá trị là 8 và gói tin ICMP echo reply là 0. Địa chỉđích được sử dụng với chỉ sốport là 0 bởi ICMP không sử dụng cổng:

EndPoint ep = new IPEndPoint(addr, 0);

//Chương trình quét gói tin bằng gói tin ICMP

public struct ICMP {

public byte Type; public byte Code; public UInt16 Checksum;

public ushort Id_icmp; public ushort Seq_icmp; }

public static bool ICMPScan(string st) {

byte[] data = new byte[1024]; int recv = 0;

bool gui=false ;

Socket host = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp); IPAddress addr = IPAddress.Parse(st);

EndPoint ep = new IPEndPoint(addr, 0);

Icmp_pkt.Type = 0x08; //Thông điệp ICMP request.

Icmp_pkt.Code = 0x00; Icmp_pkt.Checksum = 0; Icmp_pkt.Id_icmp = 1; Icmp_pkt.Seq_icmp = 1; getByte(); chcksm(0, 8); Icmp_pkt.Checksum = check; getByte(); host.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 3000); bool kt_icmp = true;

try {

host.SendTo(data1, 8, SocketFlags.None, ep); } catch { kt_icmp = false; } try {

recv = host.ReceiveFrom(data2, ref ep); }

catch {

kt_icmp = false; }

if ((kt_icmp) && (data[20] == 0)) gui = true; else gui = false;

host.Close(); return gui; }

2.8. Kiểm tra hệđiều hành đang được sử dụng

Về nguyên tắc: Các hệđiều hành có phần nhân mạng phải tuân theo các chuẩn về giao tiếp mạng, nhưng không vì thế mà chúng hoàn toàn giống nhau. Về cơ bản:

Các quy ước bắt buộc thì chúng phải giống nhau, nhưng sẽ có một số ứng xử phải khác nhau, đó là các mẫu nhận diện chúng.

Quét thông tin qua lấy mẫu ID của gói tin IP: Như trong định dạng gói tin IP có trường Identification, offset frag để xác nhận các phân mảnh của một gói tin (phân mảnh IP), với các thông tin xác thực gói tin khác như địa chỉ IP nguồn, địa chỉ IP đích. Vấn đề là các hệ điều hành khác nhau sẽ có các cách xử lý khác nhau với trường ID này: Windows tăng 256.

Số TCP ban đầu: AIX: D16165(0x3f25), các hệ điều hành khác thường là 0X402e (D16430).

Quét dựa trên ACK: Gửi gói tin FIN|PUSH|URG đến một cổng TCP đang đóng. Hầu hết các hệ thống đều gửi về thông điệp với giá trị ACK bằng chính số hiệu mà ta gửi. Tuy nhiên đói với Windows thì số hiệu gói tin gửi + 1. Nếu ta gửi SYN|FIN|URG|PUSH thì hoạt động của Windows sẽ không nhất quán, lúc giữ nguyên, lúc +1, lúc ngẫu nhiên.

Phương pháp dò tìm FIN: Trong phương pháp này, ta gửi một gói FIN đến một cổng đã mở và chờ trả lời. Theo đúng đặc tả của giao thức TCP thì hệ thống đích sẽ không gửi gói tin trả lời, tuy vậy một số hệ thống như: MS Windows, BSDI, CISCO, HP/UX, MVS, IRIX sẽ gửi về một gói tin RESET.

Quét thông tin dựa trên lựa chọn TCP: Nop (No Operation), MSS (Max Segment Size), Window Scale, TimeStamp. Có 2 trường hợp trong định dạng của một lựa chọn: Chỉ có duy nhất một octet trong trường kind và một octet trong trường kind, một octet trong trường length, một hay nhiều octet trong trường data.

Kind Length

1 No Operation

2 4 Max Segment Size

3 3 Window Scale

8 10 TimeStamp

Dựa trên những đặc điểm trên, chương trình sẽ gửi đi những gói tin như sau:

• T1: Là gói tin TCP SYN, được gửi đến một cổng mở. Các trường IP Identification, Sequence và Ack là ngẫu nhiên. Trường Window trong TCP header là 1. Trường TCP Option là: Window Scale (10), Nop, MSS (1460), Timestamp (Tsval: 0xffffff, Tserc: 0). Gói tin này không chứa dữ liệu.

• T2: Là gói tin TCP, được gửi đến một cổng mở. Các bit trong trường Code bit không được bật. Các trường IP Identification, Sequence và Ack là ngẫu nhiên. Bit DF trong trường IP Flag được bật. Trường Window trong TCP header là 128. Trường TCP Option là: Window Scale (10), Nop, MSS (256), Timestamp (Tsval: 0xffffff, Tserc: 0). Gói tin này không chứa dữ liệu.

• T3: Là gói tin TCP, được gửi đến một cổng mở. Các cờ SYN, FIN, URG, PSH trong trường Code bit được bật. Các trường IP Identification, Sequence và Ack là ngẫu nhiên. Bit DF trong trường IP Flag không được bật. Trường Window trong TCP header là 256. Trường TCP Option là: Window Scale (10), Nop, MSS (256), Timestamp (Tsval: 0xffffff, Tserc: 0). Gói tin này không chứa dữ liệu.

• T4: Là gói tin TCP ACK, được gửi đến một cổng mở. Các trường IP Identification, Sequence và Ack là ngẫu nhiên. Bit DF trong trường IP Flag được bật. Trường Window trong TCP header là 1024. Trường TCP Option là: Window Scale (10), Nop, MSS (256), Timestamp (Tsval: 0xffffff, Tserc: 0). Gói tin này không chứa dữ liệu.

• T5: Là gói tin TCP SYN, được gửi đến một cổng đóng. Các trường IP Identification, Sequence và Ack là ngẫu nhiên. Bit DF trong trường IP Flag không được bật. Trường Window trong TCP header là 31337. Trường TCP Option là: Window Scale (10), Nop, MSS (256), Timestamp (Tsval: 0xffffff, Tserc: 0). Gói tin này không chứa dữ liệu.

• T6: Là gói tin TCP ACK, được gửi đến một cổng đóng. Các trường IP Identification, Sequence và Ack là ngẫu nhiên. Bit DF trong trường IP Flag

được bật. Trường Window trong TCP header là 32768. Trường TCP Option là: Window Scale (10), Nop, MSS (256), Timestamp (Tsval: 0xffffff, Tserc: 0). Gói tin này không chứa dữ liệu.

• T7: Là gói tin TCP vói các cờ FIN, PSH, URG trong trường Code bit được bật, được gửi đến một cổng đóng. Các trường IP Identification, Sequence và Ack là ngẫu nhiên. Bit DF trong trường IP Flag không được bật. Trường

Window trong TCP header là 65535. Trường TCP Option là: Window Scale

(10), Nop, MSS (256), Timestamp (Tsval: 0xffffff, Tserc: 0). Gói tin này không chứa dữ liệu.

Kết quả của gói tin nhận được sẽ được so sánh với cơ sở dữ liệu OSScan1.txt.

Nếu kết quả phù hợp chương trình sẽđưa ra hệđiều hành của máy được quét. Ví dụ thông tin nhận được sau khi gửi các gói tin của hệ điều hành Microsoft Windows XP Pro SP1 như sau:

Class Microsoft | Windows | NT/2K/XP | general purpose

T1(DF=Y%W=4470|771C|8820|FAF0|F990%ACK=S++|O%Flags=AS|A%Ops=M|) T2(DF=N%W=0%ACK=S%Flags=AR%Ops=) T3(DF=Y%W=4470|771C|8820|FAF0|F990%ACK=S++|O%Flags=AS||A%Ops=M||) T4(DF=N%W=0%ACK=O%Flags=R%Ops=) T5(DF=N%W=0%ACK=S++%Flags=AR%Ops=) T6(DF=N%W=0%ACK=O%Flags=R%Ops=) T7(DF=N%W=0%ACK=S++%Flags=AR%Ops=)

KT LUN

1. Những vấn đềđạt được

Theo yêu cầu đặt ra ban đầu: “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 nay đã thực hiện được những công việc sau:

• Tìm hiểu các kỹ thuật tấn công: Kỹ thuật nghe lén Sniffer.

Kỹ thuật tấn công từ chối dịch vụ: E-mail bombing, IP Spoofing, SYN flood,…

• Xây dựng chương trình quét cổng: Xây dựng được chương trình quét cổng sử dụng ngôn ngữ lập trình C#, nhằm mục đích kiểm tra xem: Cổng nào đang mở, giao thức gì đang chạy trên đó.

Quét cổng bằng cách kiểm tra các kết nối TCP. Quét cổng bằng cách gủi gói tin SYN.

Quét cổng bằng cách gủi gói tin ACK. Quét cổng bằng cách gủi gói tin FIN.

Quét cổng bằng cách gủi kiểm tra các kết nối UDP.

Quét cổng bằng cách gửi gói tin ICMP để kiểm tra máy đang hoạt động hay không.

Tuy với sự cố gắng của bản thân nhưng hiện tại vẫn còn một số phần chưa thực hiện được như: Chương trình chưa cho biết hệ điều hành của máy hiện đang sử dụng là gì.

2. Hướng phát triển của đề tài

Đề tài đã đạt được được các yêu cầu đề ra nhưng vẫn còn khiêm tốn. Trong thời gian tới, nếu có điều kiện, em sẽ cố gắng phát triển những hướng sau:

• Tìm hiểu thêm các kỹ thuật tấn công và đưa ra các ví dụ cụ thể, từ đó đưa ra các phương pháp bảo vệ.

• Tìm hiểu thêm các kỹ thuật tấn công Web và phương pháp bảo mật Web.

Một phần của tài liệu 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 (Trang 29 - 34)

Tải bản đầy đủ (PDF)

(34 trang)