DNS Rebinding là một kỹ thuật lợi dụng việc thay đổi kết quả của truy vấn DNS để khai thác lỗ hổng SSRF
Mục lục
DNS Rebinding
Từ cú lừa fbi(chấm)com bị trỏ vào 127.0.0.1, khiến Hacker dễ dàng qua mặt hệ thống phòng thủ lỗ hổng Server Side Request Foregery (SSRF). Gã lập trình viên đã thức tỉnh, trước mỗi lần xử lý URL.
- (𝗔) Gã thực hiện phân giải tên miền ra địa chỉ IP trước, sau đó mới kiểm tra.
- (𝗕) Nếu không vi phạm Blacklist Gã mới đưa URL vào trong hàm gửi HTTP Request để thực hiện truy cập.
Tưởng chừng êm xuôi, nhưng đêm ấy hệ thống lại bị giã thêm một trận nữa. Truy vết những tền miền trong URL mà Hacker nhập vào, gã thấy một điều thú vị. Đã bị bại lộ “Bình mới rượu cũ”, Hacker đành tung chiêu cuối “ve sầu thoát xác” hay múa đổi mặt Bian Lian. Trong ngành bảo mật, Hacker gọi kỹ thuật này là DNS Rebinding để thực hiện Bypass Blacklist trong khai thác lỗ hổng SSRF .
“Ve sầu thoát xác” là chiêu thức sử dụng một tên miền hợp lệ nhưng được trỏ IP về 127.0.0.1. Để vượt qua cơ chế chặn từ khoá localhost của gã lập trình viên.
Gã nhớ lại vở kịch múa đổi mặt Bian Lian trong kịch Sichuan Tứ Xuyên, TQ. Diễn viên thay đổi mặt nạ của mình một cách nhanh chóng và khéo léo đến nỗi khán giả chẳng nhìn thấy sự thay đổi.
Dưới đây là ví dụ minh hoạ cho trang Web của gã lập trình viên. Trang Web cho phép người dùng nhập vào một URL bất kỳ, Gã viết hàm validate_url() sẽ thực hiện phân giải tên miền bằng hàm socket.gethostbyname() của Python. Sau đó sẽ thực hiện việc kiểm tra IP trả về có phải địa chỉ Loopback 127.0.0.1 hoặc 0.0.0.0 không. Nếu là URL độc hại sẽ return False và in ra dòng chữ “Bad URL”, còn URL uy tín thì trả về True.
import requests
from urllib.parse import urlparse
import socket
url = "http://08080808.7f000001.rbndr.us"
# Hàm kiểm tra xem URL có chứa Domain mà phân giải IP hợp lệ không (A)
def validate_url(url):
parsed_url = urlparse(url)
if parsed_url.hostname:
try:
ip_address = socket.gethostbyname(parsed_url.hostname)
if ip_address in ['127.0.0.1', '0.0.0.0'] or ip_address.startswith('192.168.'):
print("Bad URL")
return False
else:
return True
except socket.gaierror:
print("Invalid hostname:", parsed_url.hostname)
return False
else:
print("Invalid URL format")
return False
# Tạo HTTP Request nếu URL hợp lệ (B)
if validate_url(url):
response = requests.get(url)
Để khai thác lỗ hổng này, Hacker tạo ra một tên miền 08080808.7f000001.rbndr.us để khai thác lỗ hổng DNS Rebinding. Nó hoạt động theo cách của múa đổi mặt Bian Lian. Ở lần phân giải A (đầu tiên), DNS trả về về một địa chỉ Public IP hợp lệ (8.8.8.8). Khiến nó không vi phạm bất tiêu chí nào trong hàm kiểm tra.
URL lúc này được đưa xuống vị trí B. Tại đây, hàm requests.get() của Python sẽ thực hiện tạo một HTTP Request. Về bản chất của mọi kết nối, giao tiếp giữa các thiết bị qua mạng với nhau đều dùng tới địa chỉ IP, Port. Việc DNS xuất hiện khiến người dùng không phải nhớ những dãy số IP vô vị nữa. Nhiệm vụ của nó là phân giải Domain ra IP để đưa xuống các tầng Transport, Network trong mô hình OSI. Lúc này khi thực hiện tạo HTTP Request, thì domain mà hacker tạo ra đã bị phân giải về địa chỉ 127.0.0.1.
DNS Time To Live
Trong hệ thống DNS, mỗi tên miền sau khi được hệ thống máy tính phân giải hay việc hỏi DNS Server cái Domain vừa nhập vào có IP là gì. Kết quả sẽ được lưu vào bộ nhớ đệm. Bộ nhớ đệm này sẽ giảm tải cho việc truy vấn vào DNS Server của các Client.
Để tránh kết quả bị Outdate, nằm trong bộ nhớ đệm quá lâu. Mỗi máy chủ DNS Server sẽ có các thiết lập DNS Time To Live (TTL) khác nhau. Hay nói một cách dễ hiểu, TTL chính là thời gian hết hạn của kết quả trong bộ nhớ đệm. Hay kết quả sẽ bị xoá đi sau khoảng thời gian TTL tính bằng giây.
Khi thực hiện tấn công DNS Rebinding, kẻ tấn công thường tự quản lý và triển khai các Domain và Name Server riêng. Để nó tự ý trả về kết quả mong muốn. Trong trường hợp này, TTL phải càng ngắn càng tốt, để server của Gã lập trình viên lưu vào cache xong xoá luôn. TTL mà lâu quá thì sẽ không thể khai thác DNS Rebinding được
Tạo DNS Rebinding
Các bạn có thể sử dụng công cụ Rebinder trên trang lock.cmpxchg8b.com để tạo một Domain có 2 lần thay đổi địa IP A, B. Khi chạy lệnh nslookup mô phỏng cho lần phân giải đầu tiên (A). Hệ thống trả về 8.8.8.8, rõ ràng là một Public IP hợp lệ. Nhưng khi chạy lệnh Ping (hệ thống vẫn phải phân giải tên miền lần nữa ra IP thì mới làm việc được) thì nó lại trả về IP 127.0.0.1.
What do you think?
It is nice to know your opinion. Leave a comment.