Kịch bản của remuda , được chỉnh sửa bởi kevinmicke (7 tháng 2 lúc 21:59) đã không kiểm tra kênh điều khiển của FTP, có thư mục riêng trên hệ thống của tôi (Windows Server 2008 R2). Ngoài ra, những 530 11001
điều chưa được công nhận, dường như xuất hiện khi tin tặc chỉ cố gắng truy cập vào kênh điều khiển. Vì vậy, tôi đã nối thêm một số dòng trong tập lệnh để kiểm tra thư mục FTP-log thứ hai:
# Tập lệnh Windows Powershell này sẽ tự động chặn các địa chỉ IP cố gắng đăng nhập vào hệ thống
# và không thành công số lần được đặt bên dưới với biến $ int_block_limit trở lên. Là quét cả Bảo mật
# log, bao gồm Remote Desktop và các nỗ lực khác, cũng như nhật ký FTP của ngày hiện tại. Nếu $ int_block_limit
# giới hạn được nhấn vào một trong hai nhật ký đó (riêng rẽ, không được kết hợp), sau đó địa chỉ IP sẽ được thêm vào
# quy tắc tường lửa.
#
# Tập lệnh sẽ tự động tạo quy tắc tường lửa có tên "BlockAttackers (Tạo yyyy-MM-dd HH: mm: ss UTC)" bằng cách sử dụng
# thời điểm hiện tại nếu một tên có "BlockAttackers" không tồn tại. Bởi vì có một khó khăn
# giới hạn 1000 mục (địa chỉ IP) bạn có thể chặn theo quy tắc, nó cũng sẽ tạo quy tắc có tên tương tự một lần
# giới hạn đạt được cho cái mới nhất.
#
# Tôi khuyên bạn nên đặt tập lệnh để chạy dưới dạng tác vụ theo lịch được kích hoạt bởi sự kiện kiểm toán đăng nhập sự kiện 4625 từ
# Nhật ký bảo mật hoặc cách khác là bạn có thể đặt nó chạy sau một khoảng thời gian (tức là cứ sau 10 phút).
#
# Tác giả:
# Đa số các tập lệnh được viết bởi người dùng serverfault.com kevinmicke
# Phần Nhật ký bảo mật của Windows được viết bởi remunda của serverfault.com, nơi cung cấp điểm khởi đầu cho kevinmicke
# Kiểm tra kênh điều khiển của FTP được thêm bởi người dùng serverfault.com Uwe Martens
#
# Chi tiết: https://serverfault.com/questions/233222/ban-ip-address-basing-on-x-number-of-unsuccessful-login-attvor
# Đặt số lần thử đăng nhập thất bại sau đó địa chỉ IP sẽ bị chặn
$ int_block_limit = 3
# Cửa sổ thời gian để kiểm tra Nhật ký bảo mật, hiện được đặt để chỉ kiểm tra trong 24 giờ qua
$ dat_time_window = [DateTime] :: Now.AddDays (-1)
# Chọn từ Nhật ký bảo mật tất cả các địa chỉ IP có nhiều hơn $ int_block_limit lỗi kiểm toán (sự kiện 4625) trong $ dat_time_window
$ Array_new_bad_ips_security_log = @ ()
$ Array_new_bad_ips_security_log = Get-EventLog -LogName 'Bảo mật' -InstanceId 4625 -Sau khi $ dat_time_window |
Chọn-Object @ {n = 'IpAddress'; e = {$ _. AlternativeStrings [-2]}} |
IpAddress nhóm-Object -property |
Trong đó {$ _. Đếm -ge $ int_block_limit} |
Chọn tên -perperty
# Nhận UTC thời gian hiện tại để tìm ra tên tệp cho nhật ký FTP hiện tại
$ current_date_utc = (Ngày nhận) .ToUniversalTime ()
# Đặt đường dẫn đến tệp nhật ký Kênh điều khiển FTP ngày nay
$ str_log_file_name_control_channel = "C: \ inetpub \ log \ LogFiles \ FTPSVC \ u_ex" + $ current_date_utc.ToString ("yyMMdd") + ".log"
# Tìm kiếm tệp nhật ký Kênh Điều khiển FTP ngày hôm nay cho "530 1" để tìm các dòng chứa IP của các hệ thống không đăng nhập được,
# chỉ nhận IP từ mỗi dòng, nhóm IP theo IP để đếm số lần thử từ mỗi dòng và chỉ chọn
# IP có $ int_block_limit hoặc nhiều thông tin đăng nhập xấu hiện nay
$ Array_new_bad_ips_ftp_control_channel = @ ()
$ Array_new_bad_ips_ftp_control_channel = Chọn chuỗi $ str_log_file_name_control_channel -potype "530 1" |
ForEach-Object {$ _. Line.Sub chuỗi (20,15) -replace ". *", ""} |
Nhóm |
Trong đó {$ _. Đếm -ge $ int_block_limit} |
Chọn tên -perperty
# Đặt đường dẫn đến tệp nhật ký FTP ngày nay
$ str_log_file_name = "C: \ inetpub \ log \ LogFiles \ FTPSVC * \ u_ex" + $ current_date_utc.ToString ("yyMMdd") + ".log"
# Tìm kiếm tệp nhật ký FTP ngày hôm nay cho "530 1" để tìm các dòng chứa IP của các hệ thống không đăng nhập được,
# chỉ nhận IP từ mỗi dòng, nhóm IP theo IP để đếm số lần thử từ mỗi dòng và chỉ chọn
# IP có $ int_block_limit hoặc nhiều thông tin đăng nhập xấu hiện nay
# Trong FTPSVC * phải được thêm ID của máy chủ FTP thay vì * hoặc chỉ cần lấy đúng thư mục nhật ký
$ Array_new_bad_ips_ftp = @ ()
$ Array_new_bad_ips_ftp = Chọn-Chuỗi $ str_log_file_name -potype "530 1" |
ForEach-Object {$ _. Line.Sub chuỗi (20,15) -replace ". *", ""} |
Nhóm |
Trong đó {$ _. Đếm -ge $ int_block_limit} |
Chọn tên -perperty
# Nối hai mảng IP (một từ Nhật ký bảo mật, một từ nhật ký FTP)
$ Array_new_bad_ips_all = @ ()
# $ Array_new_bad_ips_all = @ ($ Array_new_bad_ips_security_log) + @ ($ Array_new_bad_ips_ftp_over_limit)
$ Array_new_bad_ips_all = @ ($ Array_new_bad_ips_security_log) + @ ($ Array_new_bad_ips_ftp_control_channel) + @ ($ Array_new_bad_ips_ftp)
# Sắp xếp mảng, chỉ chọn các IP duy nhất (trong trường hợp một IP hiển thị trong cả nhật ký Bảo mật và FTP)
$ Array_new_bad_ips_all_sortic = @ ()
$ Array_new_bad_ips_all_sortic = $ Array_new_bad_ips_all |
Foreach-Object {[chuỗi] $ _. Name} |
Chọn-Object -unique
# Nhận đối tượng tường lửa
$ tường lửa = Đối tượng mới -comobject hnetcfg.fwpolicy2
# Nhận tất cả các quy tắc tường lửa phù hợp với "BlockAttackers *"
$ Array_firewall_rules = $ tường lửa.Rules | Trong đó {$ _. Giống như tên 'BlockAttackers *'}
# Nếu chưa có quy tắc tường lửa "BlockAttackers *", hãy tạo một và đặt nó thành một biến
if ($ Array_firewall_rules -eq $ null) {
$ str_new_rule_name = "BlockAttackers (Đã tạo" + $ current_date_utc.ToString ("yyyy-MM-dd HH: mm: ss") + "UTC)"
tường lửa Netsh advfirewall thêm quy tắc dir = in action = block name = $ str_new_rule_name description = "Quy tắc được tạo tự động." enable = yes remoteip = "0.0.0.0" | Hết
$ Array_firewall_rules = $ tường lửa.Rules | Trong đó {$ _. Giống như tên 'BlockAttackers *'}
}
# Tách các IP hiện tại khỏi (các) quy tắc tường lửa "BlockAttackers *" hiện tại thành một mảng để chúng ta có thể dễ dàng tìm kiếm chúng
$ Array_ex hiện_bad_ips = @ ()
foreach (quy tắc $ trong $ Array_firewall_rules) {
$ Array_ex hiện_bad_ips + = $ rule.RemoteAddresses -split (',')
}
# Làm sạch mặt nạ mạng con khỏi các IP hiện bị chặn bởi (các) quy tắc tường lửa
$ Array_ex hiện_bad_ips_without_masks = @ ()
$ Array_ex hiện_bad_ips_without_masks = $ Array_ex hiện_bad_ips | ForEach-Object {$ _ -replace "/.*", ""}
# Nhập IP của máy chủ của bạn (IPv4 và IPv6) vào dòng 115 và 116.
# Chọn địa chỉ IP để thêm vào tường lửa, nhưng chỉ những địa chỉ ...
$ Array_new_bad_ips_for_firewall = @ ()
$ Array_new_bad_ips_for_firewall = $ Array_new_bad_ips_all_sort | Ở đâu {
# chứa địa chỉ IP (nghĩa là không trống hoặc dấu gạch ngang, mà Nhật ký bảo mật dành cho các hệ thống đăng nhập FTP không thành công)
$ _. Chiều dài -gt 6 -và
# chưa có trong quy tắc tường lửa
! ($ Array_ex hiện_bad_ips_without_masks -contains $ _) -và
# không phải là loopback cục bộ
! ($ _. Bắt đầu với ('127.0.0.1')) -và
# không phải là một phần của mạng con cục bộ
! ($ _. Bắt đầu với ('192.168.')) -Và
! ($ _. Bắt đầu với ('0,0.')) -Và
! ($ _. Bắt đầu với ('10 .0. ')) -Và
! ($ _. Bắt đầu với ('*. *. *. *')) -Và
! ($ _. Bắt đầu với ('*: *: *: *: *: *'))
}
# Nếu có IP để chặn, hãy làm như sau ...
if ($ Array_new_bad_ips_for_firewall -ne $ null) {
# Viết ngày và giờ vào tệp nhật ký dành riêng cho tập lệnh
[DateTime] :: Bây giờ | Out-File -Append -Encoding utf8 C: \ inetpub \ log \ LogFiles \ blockattackers.txt
# Ghi địa chỉ IP mới bị chặn vào tệp nhật ký
$ Array_new_bad_ips_for_firewall | Out-File -Append -Encoding utf8 C: \ inetpub \ log \ LogFiles \ blockattackers.txt
# Boolean để đảm bảo IP mới chỉ được thêm vào theo một quy tắc
$ bln_added_to_rule = 0
# Mảng để giữ các IP xấu từ mỗi quy tắc một lần, vì vậy chúng tôi có thể đếm để đảm bảo thêm các IP mới sẽ không vượt quá 1000 IP
$ Array_ex hiện_bad_ips_cản_rule = @ ()
# Đối với mỗi quy tắc "BlockAttackers *" trong tường lửa, hãy làm như sau ...
foreach (quy tắc $ trong $ Array_firewall_rules) {
if ($ bln_added_to_rule -ne 1) {
# Tách các IP hiện có từ quy tắc hiện tại thành một mảng để chúng ta có thể dễ dàng đếm chúng
$ Array_ex hiện_bad_ips_cản_rule = $ rule.RemoteAddresses -split (',')
# Nếu số lượng IP cần thêm ít hơn 1000 trừ số IP hiện tại trong quy tắc, hãy thêm chúng vào quy tắc này
if ($ Array_new_bad_ips_for_firewall.Count -le (1000 - $ Array_ex hiện_bad_ips_cản_rule.Count)) {
# Thêm IP mới vào quy tắc tường lửa
$ Array_new_bad_ips_for_firewall | % {$ rule.RemoteAddresses + = ',' + $ _}
# Viết quy tắc nào IP được thêm vào tệp nhật ký
echo "Địa chỉ IP mới ở trên được thêm vào quy tắc Tường lửa của Windows:" $ rule.Name | Out-File -Append -Encoding utf8 C: \ inetpub \ log \ LogFiles \ blockattackers.txt
# Đặt boolean để mọi quy tắc khác được bỏ qua khi thêm IP
$ bln_added_to_rule = 1
}
}
}
# Nếu không có chỗ trong bất kỳ quy tắc tường lửa "BlockAttackers *" nào khác, hãy tạo một cái mới và thêm IP vào nó
if ($ bln_added_to_rule -ne 1) {
$ str_new_rule_name = "BlockAttackers (Đã tạo" + $ current_date_utc.ToString ("yyyy-MM-dd HH: mm: ss") + "UTC)"
tường lửa Netsh advfirewall thêm quy tắc dir = in action = block name = $ str_new_rule_name description = "Quy tắc được tạo tự động." enable = yes remoteip = "0.0.0.0" | Hết
$ new_rule = $ tường lửa.rules | Trong đó {$ _. Tên -eq $ str_new_rule_name}
# Thêm IP mới vào quy tắc tường lửa
$ Array_new_bad_ips_for_firewall | % {$ new_rule.RemoteAddresses + = ',' + $ _}
# Viết quy tắc nào IP được thêm vào tệp nhật ký
echo "Địa chỉ IP mới ở trên được thêm vào quy tắc Tường lửa Windows mới được tạo:" $ new_rule.Name | Out-File -Append -Encoding utf8 C: \ inetpub \ log \ LogFiles \ blockattackers.txt
}
}
Tên của thư mục nhật ký của FTP FTPSVC*
trên dòng 54 phải được hoàn thành có lý do. Trong dòng 115 và 116 phải được nhập IP của máy chủ của bạn (IPv4 và IPv6), nếu không, IP của máy chủ riêng có thể được thêm vào quy tắc tường lửa hàng trăm lần. Biến $int_block_limit
tôi đang đặt thành 1 tại máy chủ của mình, vì vậy tập lệnh đang chặn một cuộc tấn công của tin tặc gây ra sự kiện 4625 trong vòng hai giây. Tôi vẫn đang suy nghĩ về việc chạy kịch bản bổ sung để xảy ra 4625 sự kiện trong khoảng thời gian vài phút. Vì lý do, cũng có thể, để tách các tập lệnh và để một tập lệnh kiểm tra 4625 sự kiện được kích hoạt bởi sự kiện 4625 và một tập lệnh khác mà các thư mục nhật ký của FTP kiểm tra định kỳ cứ sau 5 hoặc 10 phút, ngay cả với quy tắc tường lửa riêng và tệp nhật ký.