Loading
April 12, 2024By samuel

Tạo Wordlist dò đoán mật khẩu WiFi

Wordlist là tập hợp các mật khẩu tiềm năng được sử dụng trong các cuộc tấn công Bruteforce. Một bộ Wordlist sẽ bao gồm các từ, cụm từ, dãy số và các biến thể của chúng.

Wordlist được tổng hợp bởi cộng đồng

Việc sở hữu một bộ Wordlist chất lượng sẽ làm tăng khả năng thành công quá trình dò đoán mật khẩu WiFi. Trong các phần tiếp theo, mình sẽ hướng dẫn mọi người cách để tự trang bị cho bản thân vài bộ Wordlist độc đáo.

Cộng đồng an ninh mạng trên toàn thế giới đã đóng góp không nhỏ vào việc phát triển các Wordlist chất lượng cao. Khi gõ từ khóa “Password Wordlist” lên thanh tìm kiếm Google, bạn sẽ nhận được gần 14 triệu kết quả trả về, với các Wordlist hỗ trợ mọi ngôn ngữ cũng như mọi mục đích bạn đang tìm kiếm.

tìm kiếm từ khóa password wordlist trên Google

Dưới đây là một số Wordlist nổi tiếng được tổng hợp bởi cộng đồng:

  • rockyou.txt: Vào năm 2009, một công ty tên RockYou ở Bắc California, Mỹ đã bị hack. Các hacker sau khi phát hiện ra công ty này lưu trữ mật khẩu của 32 triệu khách hàng dưới dạng text, đã tổng hợp lại và tạo thành Wordlist rockyou.txt.
  • Rockyou2021: bao gồm 8,459,060,239 – 8.4 tỉ mật khẩu khác nhau, được tổng hợp từ các vụ data leak trên toàn thế giới và từ nhiều nguồn khác, là một bản big update của rockyou.txt từ 2009.
  • Danh sách password WiFi phổ biến của người Việt Nam: được cộng đồng tổng hợp từ ứng dụng WiFi Chùa, Wordlist này chứa khoảng 400 nghìn mật khẩu WiFi của các hộ gia đình tại Việt Nam.
  • Danh sách số điện thoại Việt Nam: bao gồm 33 danh sách số điện thoại từ xxx0000000 đến xxx9999999, trong đó có đầu số của các nhà mạng: Vinaphone, Mobifone, Viettel, Vietnammobile, Beeline, Sfone,…

Ngoài ra, hệ điều hành Kali Linux còn tích hợp sẵn một số Wordlist phổ biến bên trong thư mục /usr/share/wordlists. Bạn có thể chạy lệnh wordlists để liệt kê danh sách các Wordlist có sẵn trong hệ điều hành này.

Tạo Wordlist ngày tháng năm

Với tiêu chí mật khẩu cần dễ nhớ và mang tính cá nhân cao, nhiều người đã và đang sử dụng các mốc thời gian quan trọng để làm mật khẩu WiFi, ví dụ như ngày sinh của con cái, ngày kỉ niệm cưới, ngày sinh của vợ hoặc chồng, ngày xảy ra một sự kiện đáng nhớ… Sau đây là cách để tạo một Wordlist ngày tháng năm theo định dạng ddmmyyyy sử dụng Python:

  • Bước 1: Tạo 1 file Python và thiết lập quyền thực thi. Trong ví dụ này mình sẽ sử dụng vim để thực hiện. Bạn có thể dùng bất kỳ text editor nào nếu muốn.
vim date_time.py
  • Bước 2: Paste đoạn code dưới đây vào nội dung file Python và lưu lại.
from datetime import datetime, timedelta

# khai báo ngày bắt đầu và ngày kết thúc
start_date = datetime(1930, 1, 1)
end_date = datetime(2030, 12, 31)

# khởi tạo 1 list để lưu kết quả
date_times = []

# vòng lặp while để lấy giá trị ngày tháng năm
current_date = start_date
while current_date <= end_date:
    date_times.append(current_date.strftime('%d%m%Y'))
    current_date += timedelta(days=1)

# lưu danh sách vừa tạo vào file date_times.txt
with open('date_times.txt', 'w') as file:
    for dt in date_times:
        file.write(dt + '\n')
  • Bước 3: Chạy file Python vừa tạo.
chmod +x date_time.py

python3 date_time.py

Kết quả sẽ được lưu trong file date_times.txt bên trong thư mục làm việc hiện tại

Tổng hợp Wordlist từ tên người dùng trên các Forum

Quan sát trên các Forum đang hoạt động tại Việt Nam, có thể thấy tên người dùng thường là biệt danh hoặc tên riêng, theo sau bởi chữ, số và các ký tự đặc biệt. Cách đặt tên người dùng cũng mang tính cá nhân hóa giống như việc đặt mật khẩu. Vì vậy, khả năng xuất hiện một mật khẩu WiFi trùng với tên người dùng forum là có thể xảy ra.

Sau đây mình sẽ ví dụ cho quá trình lấy danh sách tên người dùng của forum voz.vn:

  • Xác định chức năng xem thành viên của Forum:
chức năng xem thành viên trên forum voz.vn

Bấm vào profile người dùng mới nhất, ta thấy thanh URL chứa tên người dùng và một dãy số ngẫu nhiên 1985671, ở đây chính là ID của người dùng.

theo dõi tài khoản của một thành viên

thử đổi giá trị ID người dùng thành 1, hiện ra profile của admin Tủ Lạnh

đổi giá trị ID trên thanh url, hiện ra tài khoản thành viên mới

Theo hướng này, ta có thể thay ID từ 1 tới 1985671 để thực hiện thu thập tên người dùng trên Forum VOZ

  • Thực hiện thu thập tên người dùng:

Cách 1: Sử dụng Burp Suite

Quan sát Request và Response bằng Burp Suite, nhận thấy rằng chỉ cần thay đổi giá trị ID trên thanh URL, server sẽ trả về HTTP Response với Status code 301, sau đó chuyển hướng về profile của người dùng có ID tương ứng thông qua header Location. Giá trị tên người dùng đứng trước ID không đóng vai trò quan trọng trong HTTP Request, có thể được thay thế bằng một giá trị ngẫu nhiên.

sử dụng Burp Suite quan sát HTTP Request và Response

Bắt lại Request và chuyển sang Intruder, bỏ qua tham số tên người dùng, bôi đen tham số ID và nhấn Add. Chọn Attack typeSniper

chuyển Request sang Intruder để thực hiện lấy danh sách tên người dùng

Tại phần Settings, trong mục Grep – Extract, nhấn Add và đánh dấu vào Extract from regex group, sau đó bôi đen giá trị tên người dùng bên trong HTTP Response, hoặc thêm vào nội dung Extract giá trị sau: https\://voz\.vn/u/(.*?)\. , sau đó nhấn Ok

thiết lập để lấy giá trị tên người dùng

Bên tab Payloads, chọn Payload typeNumbers. Thiết lập số đầu tiên là 1, số cuối cùng là ID của người dùng mới nhất (có 7 chữ số) và bước nhảy là 1. Các tham số Min interger digits, Max interger digits, Min fraction digits, Max fraction digits có giá trị lần lượt là 0, 7, 0, 0.

thiết lập thay đổi tham số ID tự động

Sau khi thiết lập xong các tham số cần thiết, nhấn Start Attack và theo dõi kết quả trả về

kết quả khi chạy lấy tên người dùng tự động

Khi Burp Suite chạy xong, bôi đen toàn bộ cột chứa tên người dùng, nhấn tổ hợp phím Ctrl C để copy kết quả thu được và Paste vào một file text.

Nếu sử dụng Burp Suite Professional, có thể chọn Save > Results table, sau đó bỏ chọn hết các cột, chỉ để lại cột tên người dùng rồi nhấn Save, cuối cùng là đặt tên cho file kết quả rồi nhấn Save để lưu lại

lưu kết quả sử dụng Burp Suite Pro

Cách 2: Sử dụng Python

  • Bước 1: Cài đặt thư viện Requests
pip install requests
  • Bước 2: Tạo 1 file Python và thiết lập quyền thực thi. Trong ví dụ này mình sẽ sử dụng vim để thực hiện. Bạn có thể dùng bất kỳ text editor nào nếu muốn.
vim vozer_crawler.py
  • Bước 3: Paste đoạn code dưới đây vào nội dung file Python và lưu lại
import requests

def get_user_locations(base_url, user_id_range, filename):
  with open(filename, "w") as outfile:  
    for user_id in user_id_range:
      url = f"{base_url}.{user_id}/"
      try:
        response = requests.get(
            url, 
            allow_redirects=False,
            headers={
                "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:124.0) samuel/69420 Firefox/124.0"
            } # tạo một User-Agent để script không bị chặn bởi Cloudflare
            )
        response.raise_for_status() 
        location_url = response.headers.get('Location')
        username = location_url.split("/")[-2].split(".")[-2] # tách username khỏi nội dung của header Location
        if username:
            outfile.write(f"{username}\n")

      except requests.exceptions.RequestException:
        pass
      print(f"Crawled id: {user_id}, User: {username}") #thông báo tiến trình

if __name__ == "__main__":
  base_url = "https://voz.vn/u/dummy" # giá trị username được gửi đi từ request có thể thay thế bằng một giá trị khác (vd: dummy)
  user_id_range = range(1, 1001)  #thay bằng ID người dùng mới nhất
  filename = "vozer_crawler.txt"  
  get_user_locations(base_url, user_id_range, filename)
  • Bước 4: Chạy file Python vừa tạo
chmod +x vozer_crawler.py

python3 vozer_crawler.py

Kết quả sẽ được lưu trong file vozer_crawler.txt trong thư mục làm việc hiện tại.

  • Xử lý dữ liệu

Sau khi thu thập dữ liệu, ta cần thêm các công đoạn xử lý như lọc trùng và loại bỏ các dữ liệu không mong muốn. Trong trường hợp này, mình sẽ lọc ra các kết quả trùng nhau bằng lệnh sort -u, sau đó xóa các ký tự “” và “_” bằng lệnh tr -d, cuối cùng lọc ra các kết quả dài 8 ký tự trở lên bằng lệnh grep và ghi ra file vozer_crawler_sort.txt

 sort -u vozer_crawler.txt | tr -d "-" | tr -d "_" | grep -E '^.{8,}$' >> vozer_crawler_sort.txt

Tự tạo Wordlist bằng Python

Trong trường hợp, mật khẩu bạn cần crack sẽ không nằm trong bất kỳ Wordlist nào phía trên, hoặc bạn đang có nhu cầu tạo một bộ Wordlist từ các dữ liệu có sẵn. Có rất nhiều công cụ có thể hỗ trợ bạn việc đó, ví dụ như crunch. Các công cụ đều yêu cầu dữ liệu đầu vào, tùy chọn để sắp xếpxử lý dữ liệu, trả về kết quả hoặc lưu vào file.

Đầu tiên ta cần tổng hợp 100 họ phổ biến ở Việt Nam100 tên nam giới phổ biến ở Việt Nam từ trang https://hoten.org. Mình viết một đoạn mã Python như sau:

from typing import Any
import unicodedata
import scrapy
from scrapy.crawler import CrawlerProcess
from scrapy.http import Response
from scrapy.utils.project import get_project_settings

class NewsSpider(scrapy.Spider):
    name = "crawl_name_spider"  
    start_urls = ["https://hoten.org/100-ten-nam-pho-bien-vietnam/"] #đổi thành url muốn crawl

    def remove_unicode(self, text):  
        nfkd_form = unicodedata.normalize('NFKD', text)
        only_ascii = nfkd_form.encode('ascii', 'ignore')
        accentless_text = only_ascii.decode('utf-8')
        return accentless_text

    def parse(self, response: Response, **kwargs: Any) -> Any:
        for id in range(2, 102): #lấy nội dung từ thẻ <tr> số 2 đến số 101
            name_xpath = f"/html/body/div[1]/div/div/main/article/div/div[2]/figure[1]/table/tbody/tr[{id}]/td[2]/a/text()" #đổi thành vị trí XPath muốn crawl
            name_raw = response.xpath(name_xpath).get()
            if name_raw:  
                name_encode = self.remove_unicode(name_raw).lower() #chuyển các chữ cái viết hoa, có dấu thành chữ cái bình thường
                with open("name.txt", "a") as file_writer: #đổi thành tên file muốn lưu
                    file_writer.write(f"{name_encode}\n")

if __name__ == '__main__':
    settings = get_project_settings()
    process = CrawlerProcess(settings)
    process.crawl(NewsSpider)
    process.start()

Kết quả thu được 2 file, đặt tên là name.txtlast_name.txt, sau đó sử dụng đoạn code Python dưới đây để tạo một Wordlist mới:

def combine_wordlists(file1, file2, output_file):
  combined_list = []
  with open(file1, 'r') as f1, open(file2, 'r') as f2:
    wordlist1 = f1.readlines()
    wordlist2 = f2.readlines()
  # xóa ký tự xuống dòng
  wordlist1 = [line.strip() for line in wordlist1]
  wordlist2 = [line.strip() for line in wordlist2]

  for word1 in wordlist1:
    for word2 in wordlist2:
      combined_list.append(word1 + word2)

  with open(output_file, 'w') as f:
    for word in combined_list:
      f.write(word + '\n')  
#thay bằng đường dẫn tới file
file1 = "name.txt"  
file2 = "last_name.txt"  
output_file = "combined_wordlist.txt"  

combine_wordlists(file1, file2, output_file)

Kết bài

Bài viết này đã hướng dẫn cho bạn cách để có một Wordlist phục vụ cho quá trình học tập và nghiên cứu. Hãy thường xuyên cập nhật những Wordlist được chia sẻ bởi cộng đồng và tự tạo Wordlist cho các mục tiêu cụ thể. Mong rằng bài viết này sẽ có ích cho bạn. Happy hacking! ∋━━o(`∀´oメ)~→

samuel

master of human stubid-ity

svg

What do you think?

It is nice to know your opinion. Leave a comment.

Leave a reply