Các hướng dẫn này dành cho Oracle Linux 7. Các lệnh cho các bản phân phối khác sẽ khác. Đầu tiên cài đặt và khởi động MongoDB
Cài đặt
sudo tee /etc/yum.repos.d/mongodb-org-4.0.repo 100 tài liệu mỗi giây. Hãy bám vào cấu hình này cho ba loại xác thực mà chúng ta đang xem xétThông tin đăng nhập MongoDB trong các bài tập
Trong phần này, chúng tôi muốn phát triển một trình phát hiện để bắt máy chủ, tên người dùng và mật khẩu, tất cả đều được đặt trong cùng một tài liệu
Giới thiệu về Bài tập
Phép gán là bất kỳ cấu trúc mã nào trong đó một giá trị được gán cho một biến. GitGuardian đã phát triển một công cụ so khớp bài tập duy nhất có thể phát hiện nhiều loại bài tập khác nhau, bất kể chúng được viết bằng ngôn ngữ nào. Đây là một danh sách nhỏ các nhiệm vụ có thể chúng tôi sẽ phát hiện
mongo
use admin;
db.createUser[
{
user: "admin",
pwd: "PASSWORD",
roles: [
"userAdminAnyDatabase",
"dbAdminAnyDatabase",
"readWriteAnyDatabase"
]
}
];
2mongo
use admin;
db.createUser[
{
user: "admin",
pwd: "PASSWORD",
roles: [
"userAdminAnyDatabase",
"dbAdminAnyDatabase",
"readWriteAnyDatabase"
]
}
];
3mongo
use admin;
db.createUser[
{
user: "admin",
pwd: "PASSWORD",
roles: [
"userAdminAnyDatabase",
"dbAdminAnyDatabase",
"readWriteAnyDatabase"
]
}
];
4mongo
use admin;
db.createUser[
{
user: "admin",
pwd: "PASSWORD",
roles: [
"userAdminAnyDatabase",
"dbAdminAnyDatabase",
"readWriteAnyDatabase"
]
}
];
5máy dò rộng
Vì chúng tôi có thể phát hiện các mẫu này, hãy tinh chỉnh một chút và thêm một số ràng buộc để tạo phiên bản đầu tiên của trình phát hiện của chúng tôi
Đối với mỗi trận đấu [máy chủ, tên người dùng và mật khẩu], chúng tôi muốn biến được chỉ định có db hoặc cơ sở dữ liệu hoặc mongo làm tiền tố và máy chủ, tên người dùng hoặc mật khẩu làm hậu tố. Lưu ý rằng việc có db làm tiền tố là đủ để thông tin xác thực được coi là thông tin đăng nhập mongoDB vì “mongo” phải có trong nội dung tệp.
Biến cũng phải tuân theo biểu thức chính quy chuyên dụng.
- Máy chủ phải là tên máy chủ thông thường hoặc địa chỉ IPv4. Chúng tôi sử dụng các phương pháp regex tiêu chuẩn cho việc này
- Tên người dùng và mật khẩu có độ dài và bộ ký tự tùy chỉnh mà chúng tôi đã cẩn thận xác định là có liên quan bằng cách thử nghiệm các thuật toán của chúng tôi trên lịch sử GitHub
CHÚNG TÔI SẼ TRẬN GÌ
mongo
use admin;
db.createUser[
{
user: "admin",
pwd: "PASSWORD",
roles: [
"userAdminAnyDatabase",
"dbAdminAnyDatabase",
"readWriteAnyDatabase"
]
}
];
6NHỮNG GÌ CHÚNG TÔI SẼ KHÔNG HỢP LỆ
mongo
use admin;
db.createUser[
{
user: "admin",
pwd: "PASSWORD",
roles: [
"userAdminAnyDatabase",
"dbAdminAnyDatabase",
"readWriteAnyDatabase"
]
}
];
7Các cải tiến với bước xác thực sau
Tại thời điểm đó, mặc dù kết quả rất thú vị, chúng tôi muốn chọn thêm các bí mật bằng cách xóa một số giá trị. Hãy nhớ rằng cuối cùng, chúng tôi muốn xuất ra nhiều bí mật khớp được tạo từ sự kết hợp của tất cả máy chủ, tên người dùng và mật khẩu bị bắt. Để tránh bùng nổ tổ hợp, chúng tôi muốn loại bỏ các trận đấu không liên quan càng sớm càng tốt
Đối với điều này, nhóm kỹ thuật của GitGuardian đã đưa ra một loạt các trình xác thực bài đăng rất hiệu quả
Chẳng hạn, chúng tôi đã phát triển bước xác thực sau để loại bỏ mọi giá trị không liên quan phổ biến cho máy chủ lưu trữ. Nhờ quét trực tiếp luồng GitHub, chúng tôi có thể tự động điều chỉnh danh sách này dựa trên kết quả chúng tôi nhận được. Nó chứa nhiều giá trị vô dụng như. thí dụ. com, đồ giả. com,. mặc định, IP cục bộ và nhiều thứ khác. Chúng tôi áp dụng cùng một loại heuristic cho tên người dùng và mật khẩu đã khớp trước đó
Chúng tôi có thể cấm các giá trị tùy chỉnh khác khỏi kết quả. Chẳng hạn, trong khi chạy trình phát hiện hiện tại, chúng tôi đã thấy nhiều giá trị dương tính giả ở dạng sau
mongo
use admin;
db.createUser[
{
user: "admin",
pwd: "PASSWORD",
roles: [
"userAdminAnyDatabase",
"dbAdminAnyDatabase",
"readWriteAnyDatabase"
]
}
];
8Do đó, config được thêm vào danh sách các giá trị của chúng tôi
Cuối cùng, chúng tôi cũng cấm các giá trị dựa trên entropy Shannon của chúng để loại bỏ một số trình giữ chỗ. Chẳng hạn, một
mongo
use admin;
db.createUser[
{
user: "admin",
pwd: "PASSWORD",
roles: [
"userAdminAnyDatabase",
"dbAdminAnyDatabase",
"readWriteAnyDatabase"
]
}
];
02 sẽ không có entropy đủ cao để được coi là một máy chủ hợp lệ. Ngưỡng sử dụng được xác định theo kinh nghiệm bằng cách kiểm tra thuật toán trong điều kiện thực tếKhi các kết quả khớp chính xác cho máy chủ, tên người dùng và mật khẩu được thu thập, chúng tôi tính toán tất cả các kết hợp có thể có để có các ứng cử viên bí mật. Mặc dù chúng ta có thể dừng lại ở đây, nhưng GitGuardian có vũ khí cuối cùng để dọn dẹp mọi thứ và chỉ mang lại kết quả phù hợp nhất. Chúng tôi đã phát triển các chiến lược khác nhau để thu hẹp các ứng cử viên bí mật có thể có trong một tài liệu. Các chiến lược này có thể dựa trên khoảng cách giữa các kết quả phù hợp trong tài liệu, nhưng cũng có thể dựa trên sự giống nhau giữa các biến gán chẳng hạn
Nói cách khác, điều này tránh đưa ra cảnh báo khi chúng tôi tìm thấy máy chủ lưu trữ ở đầu tài liệu, tên người dùng ở giữa và mật khẩu ở cuối, vì ba giá trị này hầu như không liên quan đến cùng một tài nguyên. Hoặc, điều này cho phép loại bỏ một bí mật trong đó máy chủ được gán cho một
mongo
use admin;
db.createUser[
{
user: "admin",
pwd: "PASSWORD",
roles: [
"userAdminAnyDatabase",
"dbAdminAnyDatabase",
"readWriteAnyDatabase"
]
}
];
03, trong khi tên người dùng và mật khẩu được gán tương ứng cho mongo
use admin;
db.createUser[
{
user: "admin",
pwd: "PASSWORD",
roles: [
"userAdminAnyDatabase",
"dbAdminAnyDatabase",
"readWriteAnyDatabase"
]
}
];
04 và mongo
use admin;
db.createUser[
{
user: "admin",
pwd: "PASSWORD",
roles: [
"userAdminAnyDatabase",
"dbAdminAnyDatabase",
"readWriteAnyDatabase"
]
}
];
05Cuối cùng, máy dò này bắt được 30 bí mật mỗi tuần với độ chính xác rất cao. Nhờ các mô hình trực tiếp và vòng phản hồi của chúng tôi, chúng tôi có thể lặp lại nhanh chóng để tinh chỉnh kết quả
Thông tin đăng nhập MongoDB trong chuỗi kết nối URI
Mẫu URI
Loại xác thực thứ hai có vẻ rất phổ biến là sử dụng chuỗi kết nối URI để cung cấp máy chủ, tên người dùng và mật khẩu [và thậm chí cả cổng, cơ sở dữ liệu hoặc truy vấn] cho trình điều khiển
Vì định dạng chuỗi kết nối URI được chuẩn hóa cho MongoDB nên việc phát triển trình phát hiện khá đơn giản. Chúng tôi đang tìm kiếm một chuỗi có định dạng sau
mongo
use admin;
db.createUser[
{
user: "admin",
pwd: "PASSWORD",
roles: [
"userAdminAnyDatabase",
"dbAdminAnyDatabase",
"readWriteAnyDatabase"
]
}
];
00Trong trường hợp của chúng tôi, lược đồ mà chúng tôi đang tìm kiếm thường được thêm vào trước bởi “mongodb” và biểu thức chính quy tổng thể đảm bảo mức độ tin cậy khá cao
xác thực sau
Không có bất kỳ bước xác thực nào, kết quả vẫn cần một chút công việc
20% kết quả có mật khẩu bằng hoặc gần với “mật khẩu”
mongo
use admin;
db.createUser[
{
user: "admin",
pwd: "PASSWORD",
roles: [
"userAdminAnyDatabase",
"dbAdminAnyDatabase",
"readWriteAnyDatabase"
]
}
];
06Gần 10% giá trị được liên kết với “máy chủ cục bộ” hoặc IP cục bộ
mongo
use admin;
db.createUser[
{
user: "admin",
pwd: "PASSWORD",
roles: [
"userAdminAnyDatabase",
"dbAdminAnyDatabase",
"readWriteAnyDatabase"
]
}
];
07Và 2-3% chứa “xxx” hoặc các hình thức giữ chỗ khác
mongo
use admin;
db.createUser[
{
user: "admin",
pwd: "PASSWORD",
roles: [
"userAdminAnyDatabase",
"dbAdminAnyDatabase",
"readWriteAnyDatabase"
]
}
];
08
mongo
use admin;
db.createUser[
{
user: "admin",
pwd: "PASSWORD",
roles: [
"userAdminAnyDatabase",
"dbAdminAnyDatabase",
"readWriteAnyDatabase"
]
}
];
09
mongo
use admin;
db.createUser[
{
user: "admin",
pwd: "PASSWORD",
roles: [
"userAdminAnyDatabase",
"dbAdminAnyDatabase",
"readWriteAnyDatabase"
]
}
];
10