Thiết lập điểm dừng XHR để theo dõi yêu cầu
Quá trình phân tích bắt đầu bằng việc xác định endpoint API xử lý yêu cầu tìm kiếm chuyến bay. Sau khi thiết lập điểm dừng trên các yêu cầu XHR, quan sát thấy tham số FECU xuất hiện trong URL với cấu trúc phức tạp.
Khám phá tài nguyên JavaScript
Tập tin flight_security.js chứa hàm mã hóa chính. Bằng cách đặt điểm dừng tại vị trí gọi hàm, phát hiện hàm generateSecureToken() chịu trách nhiệm tạo giá trị cho tham số FECU:
function generateSecureToken(inputData) {
const tokenBase = buildTokenBase(inputData);
const encrypted = encryptAesCbc(tokenBase, 'c77c9ccac77c9cca', 'c77c9ccac77c9cca');
return encrypted.charAt(3) + encrypted + encrypted.charAt(7);
}
Phân tích thành phần tham số
Đối tượng tham số chính được định nghĩa dưới dạng:
const paramContainer = {
0: '', // Giá trị MD5 từ cookie
2: '', // Thông tin kiểm tra trình duyệt
3: false,
4: 'None',
5: 0,
6: 0,
7: 0,
8: '', // Chuỗi băm từ cấu hình
9: '', // MD5 của User-Agent
10: 6,
11: null,
12: '' // Giá trị ngẫu nhiên
};
Thành phần chính
- Vị trí 0: MD5 của giá trị cookie
FECWtừ phản hồi máy chủ - Vị trí 8: Kết quả băm từ mảng cấu hình
['chrome', 'safari'] - Vị trí 9: MD5 của chuỗi User-Agent (Ví dụ:
8f694609bddc4903b8e8fee50d783cc1) - Vị trí 11: Thời gian Unix miligiây (Ví dụ:
1757312528565) - Vị trí 12: Chuỗi ngẫu nhiên 5 ký tự (Ví dụ:
SDq4d)
Cơ chế mã hóa chi tiết
Quá trình mã hóa sử dụng thuật toán AES-CBC với cấu hình:
function encryptAesCbc(plainText, secretKey, initVector) {
const key = CryptoJS.enc.Utf8.parse(secretKey);
const iv = CryptoJS.enc.Utf8.parse(initVector);
const encrypted = CryptoJS.AES.encrypt(
plainText,
key,
{ iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }
);
return encrypted.toString();
}
Chuỗi đầu vào trước mã hóa có cấu trúc:
[MD5_cookie][14_zeroes][config_hash][user_agent_md5][timestamp][random]
Ví dụ chuỗi gốc:
06546dae636aaccdb7a52c5c8065452b00000000000000f6d62a8e69201d3806ac1ef24ec64c4d8f694609bddc4903b8e8fee50d783cc11757312528565SDq4d
Quá trình xử lý cuối cùng:
- Mã hóa chuỗi bằng AES-CBC
- Thêm ký tự tại vị trí 3 vào đầu kết quả
- Thêm ký tự tại vị trí 7 vào cuối kết quả