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.
Mục lục
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.
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:
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.
thử đổi giá trị ID người dùng thành 1, hiện ra profile của admin Tủ Lạnh
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.
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 type là Sniper
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
Bên tab Payloads, chọn Payload type là Numbers. 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.
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ề
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
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ếp và xử 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 Nam và 100 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.txt và last_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メ)~→
What do you think?
It is nice to know your opinion. Leave a comment.