Время на прочтение
9 мин
Количество просмотров 8.4K
Знаете ли вы что хранится в вашем git репозитории? Нет ли среди сотен коммитов паролей от продуктовых серверов, попавших туда по ошибке?
А что если ansible скрипт при публикации упадет и засветит пароли в логе?
Рассказываю о том как мы попробовали автоматизировать такие проверки и что из этого получилось.
Привет, Хабр!
Меня зовут Олег, я работаю в достаточно крупном для РФ банке, в подразделении «IT для IT».
Недавно к нам обратились друзья из внедрения (OPS) с просьбой помочь им автоматизировать процесс приемки изменений в скрипты деплоя (ansible) и конфигурации приложений на промышленных средах.
Исторически у нас есть 2 git хранилища (на самом деле больше, но это не так важно), в одном команды хранят свой код, в другом хранятся скрипты деплоя, конфигурации приложений итд, в общем все что относится к OPS составляющей.
Так вот, исходя из принятого процесса скрипты и конфигурации для промышленных сред хранятся в master ветке и при вливании в нее нужен апрув от OPS.
Почему именно так? Потому что кроме всего там же в git хранятся и пароли от сред (хоть и зашифрованные) и отвечают за них OPSы. Если какой то пароль засветится в логе Jenkins или попадет в открытом виде в git — это серьезная утечка и безопасность придет (с паяльником) именно к OPS.
Пароли в git? Серьезно?
Да, к сожалению серьезно. Конечно же для таких вещей нужно использовать системы secret management, такие как HashiCorp Vault, CyberArk Conjur итд.
Но процесс покупки и внедрения тут сложный и долгий, а работать нужно сейчас.
Число команд, проектов и деплоев растет постоянно и ребята уже просто не могли анализировать то количество pull request которое к ним приходило.
Значит, будем автоматизировать!
Что анализируем?
Совместно с коллегами выявили 3 основных вектора утечки пароля, которые их интересовали и встречались наиболее часто:
Пароль в открытом виде
---
dev_ssh_username1: "admin"
dev_ssh_password1: "admin123"
Тут все должно быть ясно — хранить пароли в открытом виде нельзя.
Передача параметров в shell или command таски ansible
- name: Deploy
hosts: all
tasks:
- name: Update
shell: "update.sh --user={{ update_user }} --password={{ update_password }}"
Тут опасность заключается в том, что если playbook будет вызван с -v то мы получим в логах наши секреты в открытом виде.
$ ansible-playbook deploy.yml -i env/DEV/hosts -v
TASK [Update] ******************************************************************
changed: [192.168.1.2] => {"changed": true, "cmd": "/home/dev/update.sh --user=secret_user --password=secret_password", "delta": "0:00:05.056532", "end": "2020-11-06 09:53:09.397355", "rc": 0, "start": "2020-11-06 09:53:04.340823", "stderr": "", "stderr_lines": [], "stdout": "Update SUCCESS", "stdout_lines": ["Update SUCCESS"]}
Или, если playbook упадет то в логе выведется строка с секретами (даже если не указывать -v)
$ ansible-playbook deploy.yml -i env/DEV/hosts
TASK [Update] ******************************************************************
fatal: [192.168.1.2]: FAILED! => {"changed": true, "cmd": "/home/dev/update.sh --user=secret_user --password=secret_password", "delta": "0:00:00.018710", "end": "2020-11-06 10:14:30.642419", "msg": "non-zero return code", "rc": 127, "start": "2020-11-06 10:14:30.623709", "stderr": "/bin/sh: /home/dev/update.sh: Нет такого файла или каталога", "stderr_lines": ["/bin/sh: /home/dev/update.sh: Нет такого файла или каталога"], "stdout": "", "stdout_lines": []}
Чтобы этого избежать можно использовать environment, например:
- name: Deploy
hosts: all
tasks:
- name: Update
shell: "/home/dev/update.sh $AUTH_DATA"
environment:
AUTH_DATA: "--user={{ update_user }} --password={{ update_password }}"
Тогда в вывод наши credentials не попадут. Еще можно указывать атрибут no_log.
Неосторожное использование withCredentials
У нас используется Jenkins, в котором для работы с credentials используется конструкция withCredentials. С помощью нее внутри pipeline можно получить credential, сохранить его в переменные и использовать, например для подключения к какой нибудь сторонней системе. Jenkins при этом будет маскировать в логе значение этих переменных.
Однако, если мы сделаем, например так:
node {
stage('Jenkins Credentials | Decrypt Secret File') {
withCredentials([file(credentialsId: 'credentials-id', variable: 'secretFile')]) {
sh 'cat $secretFile'
}
}
}
То несмотря на то, что мы не увидим в логе путь к файлу, мы увидим его содержимое. Так же, можно сохранить переменную secretFile в другую и спокойно вывести ее в лог вне конструкции withCredentials.
Перед тем как рассказывать дальше отмечу что все эти проверки направлены на поиск неосторожного, необдуманного использования инструментов. Я конечно же отдаю себе отчет что от злонамеренных действий это не спасет (для этого у банка есть другие структуры).
Ищем пароли
Казалось что поиск паролей в открытом виде это какая то плевая задача. У нас в арсенале есть не только SonarQube но и Checkmarx. Уж они точно должны уметь решать эти задачи.
И вроде бы вот оно — есть такое правило для SonarQube Hard-coded credentials are security-sensitive
Но при внимательном рассмотрении оказывается что правило достаточно простое, оно проверяет попадает ли название переменной под определенный паттерн. Исходник, если интересно тут.
C Checkmarx оказалась так же картина — реагирует он очень выборочно. И правила там тоже очень простые (коллеги из Application Security рассказали). Например, такой код пропускает:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {
@RequestMapping("/show_me_creds")
public @ResponseBody String show_me_creds() {
String thisIsMyLittleSecret = "qwerty12345";
return thisIsMyLittleSecret;
}
}
Изучив что есть на рынке пришли к выводу что будем смотреть в сторону opensource утилит. Запрос в google «find secrets in git» выдает нам примерно такие варианты:
-
https://github.com/awslabs/git-secrets/blob/master/README.rst
-
https://github.com/dxa4481/truffleHog/blob/dev/README.md
-
https://github.com/Yelp/detect-secrets
-
https://github.com/zricethezav/gitleaks
Попробовав их все мы остановились на Gitleaks, вот почему:
-
Проводит анализ на основе regexp, которые можно расширять;
-
Умеет учитывать энтропию при анализе;
-
Репорты в json;
-
Легко задавать исключения;
-
В пилоте показал лучший результат.
Как он работает — в основе лежит toml файл с описанием правил, например:
[[rules]]
description = "generic secret regex"
regex = '''secret(.{0,20})([0-9a-zA-Z-._{}$/+=]{20,120})'''
tags = ["secret", "example"]
Кроме того в правиле можно указывать требуемую энтропию, например:
[[rules]]
description = "entropy and regex example"
regex = '''secret(.{0,20})([0-9a-zA-Z-._{}$/+=]{20,120})'''
[[rules.Entropies]]
Min = "4.5"
Max = "4.7"
В переводе на человеческий это означает: «Если мы встречаем строку кода, которая соответствует регулярному выражению, и эта строка попадает в пределы энтропии от 4,5 до 4,7, то это пароль»
Я не буду заниматься переводом документации, все прекрасно описано тут.
Пример срабатывания:
➜ ~ gitleaks --repo=gitleaks --repo=https://github.com/gitleakstest/gronit.git --verbose --pretty
INFO[2020-04-28T13:00:34-04:00] cloning... https://github.com/gitleakstest/gronit.git
Enumerating objects: 135, done.
Total 135 (delta 0), reused 0 (delta 0), pack-reused 135
{
"line": "const AWS_KEY = "AKIALALEMEL33243OLIAE"",
"offender": "AKIALALEMEL33243OLIA",
"commit": "eaeffdc65b4c73ccb67e75d96bd8743be2c85973",
"repo": "gronit.git",
"rule": "AWS Manager ID",
"commitMessage": "remove fake key",
"author": "Zachary Rice",
"email": "zricethezav@users.noreply.github.com",
"file": "main.go",
"date": "2018-02-04T19:43:28-06:00",
"tags": "key, AWS"
}
...
...
WARN[2020-04-28T13:00:35-04:00] 6 leaks detected. 33 commits audited in 77 milliseconds 738 microseconds
Из вызова выше видно, что gitleaks умеет работать непосредственно с репозиторием — вы можете указать ему ссылку на репо и получить отчет не клонируя репозиторий на локаль.
Если произошло ложное срабатывание — достаточно занести строку в whitelist правила, например:
[[rules]]
description = "entropy and regex example"
regex = '''secret(.{0,20})['|"]([0-9a-zA-Z-._{}$/+=]{20,120})['|"]'''
[[rules.Entropies]]
Min = "4.5"
Max = "4.7"
[[rules.whitelist]]
regex = '''secret.some_value_that_match_regexp_but_not_really_a_secret'''
description = "ignore that string"
В результате мы пришли к такой схеме — при создании pull request через webhook вызывается Jenkins, который скачивает репозиторий, запускает для него gitleaks и если тот находит утечки — ставит статус NEED WORK.
Конечно мы немного затюнили правила под себя, так же мы поправили вывод, чтобы найденные gitleaks пароли не светились в логах (чтобы борясь с компрометацией мы не компрометировали пароли).
Проверяем ansible
Двигаемся дальше, итак, мы хотим находить вот такие playbook, потому что не хотим случайно засветить в логах Jenkins наши креды.
- name: Deploy
hosts: all
tasks:
- name: Update
shell: "update.sh --user={{ update_user }} --password={{ update_password }}"
С ansible все просто — его легко распарсить, можно использовать OPA (рекомендую статью от Александра Токарева по теме), можно самим быстро написать проверки в python.
Хорошо что мы этого не сделали, а вспомнили про Ansible Lint.
Это официальный линтер для Ansible, который имеет «из коробки» кучу полезных проверок, но нас интересует не это.
Нам были нужны вот эти 2 фичи:
-
Возможность писать свои правила;
-
Автоматическое сканирование и поиск playbook. Не нужно передавать конкретные файлы на проверку, можно запустить линтер в папке и он сам найдет их.
Писать правила очень просто — правило представляет собой python код, в котором обязательно должны быть объявлены переменные id, short description, description и tags (их использует Ansible Lint для ведения списка правил) и методы match или matchtask, в которых мы пишем саму логику проверки. Более подробно предлагаю почитать в оригинальной документации.
Для нашей проверки мы используем matchtask, на вход которого поступает каждый найденный task, который мы можем анализировать.
К сожалению я не могу здесь привести код именно нашего таска, но он похож на этот пример (полностью тут):
class CommandsInsteadOfModulesRule(AnsibleLintRule):
id = '303'
shortdesc = 'Using command rather than module'
description = (
'Executing a command when there is an Ansible module '
'is generally a bad idea'
)
severity = 'HIGH'
tags = ['command-shell', 'resources', 'ANSIBLE0006']
_commands = ['command', 'shell']
_modules = {
'apt-get': 'apt-get',
#сокращаю список, чтобы не постить простыню
'yum': 'yum',
}
def matchtask(self, file, task):
if task['action']['__ansible_module__'] not in self._commands:
return
first_cmd_arg = get_first_cmd_arg(task)
if not first_cmd_arg:
return
executable = os.path.basename(first_cmd_arg)
if executable in self._modules and
boolean(task['action'].get('warn', True)):
message = '{0} used in place of {1} module'
return message.format(executable, self._modules[executable])
Логика примерно такая — если task является command или shell и первый аргумент является командой из списка _modules — рекомендуем заменить команду на модуль.
Нашу проверку мы организовали похожим образом — составили список интересующих нас аргументов (password/pass/login итд) и анализируем каждый аргумент тасков command и shell на попадание в список.
Кроме того мы учитываем атрибут no_log, при его наличии аргументы не анализируем. Если в будущем разработчик уберет no_log — новый код опять попадет на проверку и наше правило это увидит.
Итак, после проверки Gitleaks запускается Ansible Lint, который в режиме автоматического сканирования прогоняет наше правило. Другие правила мы отключили, т.к. не можем навязывать командам использование линтера (хотя и рекомендует всем).
Проверяем withCredentials
Напоминаю о проблеме, например вот такой код в Jenkinsfile выведет в лог содержимое секретного файла, что скорее всего будет утечкой (хотя и замаскирует путь к нему).
node {
stage('Jenkins Credentials | Decrypt Secret File') {
withCredentials([file(credentialsId: 'credentials-id', variable: 'secretFile')]) {
sh 'cat $secretFile'
}
}
}
А вот тут нас ждал провал.
Jenkinsfile это по сути groovy, который можно разобрать на Abstract Syntax Tree и анализировать. Мы использовали AstBuilder чтобы получить дерево, научились находить withCredentials, анализировать его параметры и находить их использование внутри withCredentials. Например, код выше мы научились анализировать и реагировать на него.
Однако в жизни все сложнее, например я могу записать secretFile в глобальную переменную и использовать где-то в другом stage, могу записать secretFile в какой то временный файл итп итд.
Когда код скрипта приблизился к 1000 строк стало понятно что его уже сейчас пора рефакторить, плюс логики получается так много что впору выделять под развитие отдельную команду, поэтому пока что эту проверку и ее развитие мы отложили.
Кстати, если у вас используется только декларативный pipeline то потенциально можно использовать Pipeline model definition plugin, в котором можно конвертнуть pipeline в удобный json и анализировать уже его. Нам это к сожалению не подошло — у нас вовсю используется скриптовый.
Что в результате?
Мы провели внутренний пилот, в который попало 1000 pull request. Порядка 3% были ложные срабатывания gitleaks, в некоторых случаях были найдены реальные секреты, опасные скрипты ansible.
В целом схема показала себя работоспособной, коллеги из OPS довольны и уже включают эти проверки на остальные репозитории.
В конце так же хочу поделится интересными проектами, которые использовать в этой работе не удалось:
-
https://nightfall.ai/resources/introducing-radar-api-detect-credentials-secrets-in-code-via-machine-learning/ — обещают интеллектуальный поиск паролей в исходниках. Кто-нибудь пробовал?
-
https://www.shellcheck.net/ — поможет найти кучу проблем в shell скриптах.
-
https://github.com/PyCQA/bandit — отличный security linter для python.
-
https://twitter.com/leak_scavenger — просто интересный бот в твиттер, который сканит github, pastebin, ghostbin на предмет секретов, кредиток, приватных ключей итд. Исходники, конечно, доступны.
Listen to this article
Возможно, вы и не думали, что с правильным подходом к поиску, вы можете взламывать аккаунты, устройства и просто находить тонны конфиденциальной информации, просто вводя запросы в Google.
Поскольку Google отлично справляется с индексацией всего, что связано с Интернетом, можно найти файлы, которые были обнаружены случайно и содержат важную для нас информацию.
Расширенное приложение операторов поиска Google — Google Dorking — использование операторов поиска для поиска определенных уязвимых устройств с помощью целевых поисковых строк. Если мы предположим, что Google проиндексировал большинство устройств, случайно подключенных к Интернету, мы можем использовать текст, который, как мы знаем, появляется на их страницах входа в систему или административных страницах, чтобы найти их.
Что понадобится?
Для этого вам понадобится браузер с доступом в Интернет. Всё.
Прекрасной особенностью использования Google dorks является то, что мы можем использовать инструменты, доступные почти каждому, для поиска уязвимых систем
Когда у вас откроется браузер, перейдите на Google.com, и мы сможем начать.
Поиск FTP-серверов и веб-сайтов с использованием HTTP
Для начала мы воспользуемся следующим запросом для поиска серверов передачи файлов, опубликованных где-то в прошлом году.
Поиск этих серверов может позволить нам найти файлы, которые должны быть внутренними, но по незнанию были обнародованы.
intitle:"index of" inurl:ftp after:2018
Эти серверы становятся общедоступными, потому что индексный файл их FTP-сервера это данные, которые Google любит сканировать.
Сканирование Google приводит к полному списку всех файлов, содержащихся на сервере.
Если мы хотим найти небезопасные веб-страницы, по-прежнему использующие HTTP для поиска, мы можем слегка изменить команду, изменив «ftp» на «http» и повторно выполнив запрос.
intitle:"index of" inurl:http after:2018
Поиск по этой строке должен привести к появлению списка сайтов, использующих HTTP и готовых к атаке. Но если мы ищем определенный тип сайта, мы можем пойти еще дальше.
Если мы хотим начать атаку на некоторые простые цели, мы можем быть более конкретными и искать онлайн-формы, все еще используя HTTP, изменив текст в заголовке поиска.
intitle:"forum" inurl:http after:2018
Мы можем продолжать добавлять поисковые операторы, такие как AND inurl: «registration», чтобы получить более конкретную информацию и искать страницы регистрации незащищенных веб-сайтов.
Находим логи с паролями
Следующим шагом будет поиск файлов типа .LOG.
Поиск файлов LOG позволит нам выяснить, какие учетные данные могут быть у системы или у разных учетных записей пользователей или администраторов.
Трюк, который мы будем использовать для этого, заключается в следующем.
allintext:password filetype:log after:2018
При поиске текущих файлов журналов, мы находим это практически сразу.
Здесь указывается, что пароль не менялся и все такой же — по умолчанию.
С помощью одного запроса мы, возможно, нашли учетные данные этой системы, ничего не взломав.
Ищем файлы конфигурации с паролями
Конфигурационные файлы никогда не должны быть публичными и файлы .ENV являются отличным примером.
Если мы ищем файлы .ENV, которые содержат строку для пароля базы данных, мы немедленно находим пароль для этой базы данных, которую мы обнаружили.
filetype:env "DB_PASSWORD" after:2018
Если мы удалим after: 2018, мы увидим старые файлы, которые также предоставляют открытый доступ.
Как насчет почты?
Списки адресов электронной почты — отличный способ разобраться и попытаться найти информацию в корпоративных или школьных целях.
Эти списки часто выставляются компаниями или школами, которые пытаются составить списки адресов электронной почты для своих людей.
Чтобы найти такие почты, мы будем искать тип файла .XLS электронной таблицы со строкой «email.xls» в URL.
Хотя эти таблицы и будут полезны, не загружайте ничего. Это может быть приманкой.
Камеры!
Если вы думали, что Shodan был единственным сервисом, который может найти открытые камеры, то вы очень сильно ошибаетесь.
Вход в систему с камеры и просмотр страниц обычно выполняются по протоколу HTTP.
Это означает, что Google с радостью проиндексирует их и предоставит их для просмотра, если вы знаете нужный запрос.
Одним из распространенных форматов поиска строк веб-камеры является «top.htm» в URL с указанием текущего времени и даты.
inurl:top.htm inurl:currenttime
Еще одна хитрость для камер, которая выдает результаты общей страницы просмотра в реальном времени, размещенной на маршрутизаторах.
inurl:"lvappl.htm"
С помощью этого, я смог найти лучшую камеру из всех — птичью!
Многие камеры также контролируют зоны внутри заводов или промышленных территорий.
Нужные способы позволяют искать страницы входа в веб-камеры, у которых пароль по умолчанию.
Эта тактика, хотя и незаконна, позволяет легко получить доступ ко многим веб-камерам, не предназначенным для публичного просмотра.
Google Dorks дает возможность взламывать открытые сервисы
Благодаря тому, что Google индексирует практически все, что связано с Интернетом и предлагает веб-интерфейс, мы можем найти любую информацию, которую не скрыли от посторонних глаз.
Если Вам понравилась статья — поделитесь с друзьями
703 просмотров
Отказ от ответственности: Автор или издатель не публиковали эту статью для вредоносных целей. Вся размещенная информация была взята из открытых источников и представлена исключительно в ознакомительных целях а также не несет призыва к действию. Создано лишь в образовательных и развлекательных целях. Вся информация направлена на то, чтобы уберечь читателей от противозаконных действий. Все причиненные возможные убытки посетитель берет на себя. Автор проделывает все действия лишь на собственном оборудовании и в собственной сети. Не повторяйте ничего из прочитанного в реальной жизни. | Так же, если вы являетесь правообладателем размещенного на страницах портала материала, просьба написать нам через контактную форму жалобу на удаление определенной страницы, а также ознакомиться с инструкцией для правообладателей материалов. Спасибо за понимание.
Если вам понравились материалы сайта, вы можете поддержать проект финансово, переведя некоторую сумму с банковской карты, счёта мобильного телефона или из кошелька ЮMoney.
Как чекать логи?
@scweaq [@DqrkStore_Bot]Чему мы научимся после прочтения?
После прочтения, вы будете уметь ставить фильтры на почту, чекать папку wallets, разберем токены дискорда и будем окупать логи!
Начнем с того, что же такое лог?
Лог — это данные с компьютера владельце, который содержит в себе куки, пассы, информацию о железе, айпи, а так же, файлы с рабочего стола.
В 85% процентах случаев, вы будете работать именно с таким типом логов.
Что понадобится для чека логов?
- Браузер Mozila FireFox
- Расширение Cookies Quick Manager, Cookie Cleaner, EditThisCookie2
- VPN
Теперь обьясню что и куда
Установка браузера проста, обьяснений не требует. Все три расширения обязательны, каждое из них вам пригодится. VPN обязателен, но есть и те, кто и без него чекают, что я не поддерживаю. Если скорость интернета позволяет, используйте, ради своей безопасности. Cookie Cleaner нужен чтоб в один клик по расширению, куки удалялись.
Итак, мы купили и включили VPN, зашли в браузер и видим такую картину
Далее нам нужно просто перейти по пути лога и импортировать куки. Тут проблемы не должны возникнуть.
Появилось такое сообщение? Значит вы успешно импортировали куки, можно приступать к чеку
● Гейм-запросы на почте
- epicgames
- steam
- blizzard
- mojang
- mihoyo (genshin impact)
● epicgames
Загрузим куки и войдем в почту
Для начала поставим фильтры
Обьясню, сейчас мы сделаем так, чтобы все письма от epicgames шли в корзину. Таким образом владелец не получит уведомление.
Важно! Почты эпика, на которые рекомендую ставить фильтры: «epic-support@epicgames.com, help@support.epicgames.com, help@accts.epicgames.com»
Вход по почте
Переходим сюда и вводим почту
Пришло письмо в коризну, кликаем по кнопке
Чекаем скины
Теперь заходим в бота — RealEasySkinCheckerBot
Отвязываем лишнее
Смена почты на аккаунте
Важно! Покупаем авторег рамблера или регаем сами. Стараемся пользоваться только рамблером.
Далее ничего трудного, впишем почту, получим код. И все, аккаунт на нашем автореге.
Продажа аккаунта
Переходим сюда
Важно!
Если у вас такая ошибка, вам нужно включить IMAP в настройках
Тут нам и пригодится выше упомянутое расширение EditThisCookie
Жмем по расширению, затем экспорт
После нажатия на значек, куки будут скопированы в буфер обмена. Перейдем к нашему обьявлению и нажмем Ctrl + V, введем почту и пароль, и все — аккаунт продается!
Рокет Лига
Если в транзакциях эпика есть валюта Credits, смело отдавайте на чек Sadness или Владосу
● steam
Загрузим куки и войдем в почту
Поставим фильтры
Ставим фильтры на эту почту: «noreply@steampowered.com»
Приступаем к ресу
Переходим сюда, следуем инструкции
Маркет выдает свои автореги, поэтому переходим сюда, вписываем цену, название и переходим с добавлению товара, копируем почту маркета, вписываем и ждем кода.
Затем переходим в историю покупок, чекаем стоимость инвентаря и игры.
● blizzard
Заходим на почту
Фильтры на почту
Ставим фильтры на эту почту: «noreply@battle.net»
Ресаем
Переходим сюда, вписываем почту
Схема добавления товара на маркет, такая же что у стима. Маркет нам выдаст авторег, на него и вяжем.
Продажа
Переходим сюда, с названием и ценой думаю проблем не возникнет.
После того как ввели почту,на маркете будет кнопка «Войти в почту», нажимаем по ней и получаем ссылку для подтверждения почты.
Снимаем привязку к номеру
Если на аккаунте стоит номер, его легко снять. Для этого понадобится WinAuth.
У нас появится Serial Number и Login Code.
Готово, номер сняли. Чтобы снять аутентификатор, переходим в безопасность и снимаем также, как и номер.
● mojang
Переходим сюда, вводим почту и ждем письма, вяжем на авторег. Что же делать если письмо не пришло? Ответ прост — на этой почте не зарегистрирован mojang.
● Куда продать?
- epicgames(fortnite) или маркет
- steam или маркет
- blizzard или на маркет
- mojang
- aws.amazon
- mihoyo или маркет
- roblox
- escapefromtarkov или маркет
Сразу скажу, что скупов, берущих аккаунты без отлеги нет. Аккаунты без отлеги смело заливайте на маркет.
Не забывайте, что вы всегда можете спросить стоимость того или иного аккаунта в нашем чате. Также на форуме есть специальный раздел оценки товара.
Рекомендую использовать рамблер автореги. Купить их можно тут.
● Чек папки wallets
- Exodus
Скачиваем сам клиент
Все что нужно сделать — заменить файлы в папке %AppData%RoamingExodusexodus.wallet на файлы из лога и запустить клиент.
- Electrum
Скачиваем клиент.
Открываем клиентом файл из лога, подбираем пароль, пароли есть в логе (Passwords.txt), если не удается подобрать пасс, не исключено что наш пиндос хранит мнемоническую фразу для бекапа коша (ищите фразу в папке FileGrabber)
- Любой qt
Если просто, то qt — wallet.dat в вашем логе. Это может быть MinexCoin, Dogecoin, Bitcoin, Litecoin и т.д. Для того, чтобы узнать баланс, нужно открыть wallet.dat через обычный блокнот. Нажать Ctrl + F, ввести «name» и нажать Enter.
Name — это и есть адрес кошелька, который скрыт в этой папочке. И теперь, копируя полученный адрес, мы можем проверить его содержимое на бирже. Есть монеты, у которых нет своего блокчейна, в таком случае, прибегнуть к этому варианту не выйдет.
В данном примере, копируем значение «XXs3Mduh8kxPbgqFQKwGWYM9YjH5R6SYbK»
Теперь идем в гугл и пишем «/имя кошелька/ explorer» . В данном случае «minexcoin explorer»:
Переходим по ссылке, вставляем адрес и видим баланс:
Идем на coinmarketcap или Trust Wallet, смотрим, сколько стоит эта монета:
В данном случае это копейки, и не стоит даже заморачиваться с выводом. Если деньги есть, то качайте кошелек монеты с офф. сайта — пишите в гугле «Minexcoin wallet», например. Скачали — меняйте файл wallet.dat в папке C:UsersимякомпаAppDataRoamingимя кошелька и уже с помощью кошелька выводите куда вам хочется. Если вы захотите, чтобы этим занялся спец, можете прибегнуть к помощи @Wdfr1. Человек проверенный.
Кстати, непопулярные монеты не все есть на биржах. Чтобы узнать, куда нам можно вывести монеты, нужно посмотреть, где торгуется монета. Для этого на том же coinmarketcap есть раздел чуть ниже:
Тут мы видим биржи, на которых торгуется монета. Заводим там аккаунт, выводим себе монеты. Тут думаю все просто.
А сейчас вы поймете, почему в функциях стиллера так необходимо иметь фонт-граббер файлов. У редлайна есть очень гибкая настройка для граббинга файлов — можно задавать путь, тип файла, максимальный размер и т.д. Под всё подряд настраивать не нужно, вполне достаточно настроить на .txt и .doc с рабочего стола. Почему-то многим жертвам нравится хранить там данные, а иногда и подписывать что от чего.
Идем по порядку. Первое, что видим в этом примере — это 12 слов для восстановления блокчейн кошелька. Также выше есть логин, но нет пароля. Пароль, к слову, скорее всего подойдет от файла с логами/пассами. Но сейчас не об этом.
Если есть 12 слов, то мы можем не искать пасс, а сразу восстановить средства. Для этого идем на blockchain
Вводим 12 слов:
Далее придумываем почту, пароль, ставим галочку
Попадаем в кошель. Ну и, соответственно, можем спокойно вывести то, что есть.
Далее, допустим в текстовом файле есть такая вот вещь:
Monero для логина генерирует приватный ключ. Поэтому, если видите вот такую картину, значит это и есть сам вход. Действуем по аналогии блокчейна — заходим на сайт, вводим 13 слов (у всех монет количество слов разное) и смотрим баланс. Выводим.
У Эфира же логин для входа может выглядеть вот так:
Идем на сайт myetherwallet
Видим баланс. Тут его нет, но всегда еще проверяйте прикреплены ли к адресу токены:
Токены есть , но они нигде не торгуются. Если бы имели ценность , то рядом с количеством стояла бы цена . Примерно вот так:
Рекомендую отдавать на чек логи с папкой wallets профессионалам с форума
● Токены Discord
Нашли такую папку, что же делать?
Для начала отсортируем токены, для этого качаем discordparser дабы не делать этого руками. Суть работы чекера предельно проста, открываем DiscordTokenParser.exe
Теперь мы переходим в телеграмм-бота DiscordGift_bot и отправляем ему наш файл output.txt. Бот нам сообщит о чеке.
Валидные токены дискорда можно продать, примерно за 10р/шт за непроспам токены.
Токены с платежками можно отдать на обработку гифтов.
Мануал будет обновляться, По вопросам ко мне. Всем удачного профита!
Взлом сайта — неприятная штука, но рано или поздно это может произойти с вашим сайтом. По данным сервиса Internet Live Stats в 2018 году около 100.000 сайтов взламывалось ежедневно, поэтому к этому событию лучше подготовиться заранее, и знать, что следует делать, если это произойдет.
С помощью записей в журнале событий на сервере можно определить, как сайт был взломан, после этого устранить уязвимость в безопасности, чтобы не допустить повторного заражения.
В этой статье вы узнаете, как хакеры проникают на сайт, как найти их следы в логах сайта, и как попытаться восстановить контроль над сайтом самому.
Содержание:
Как хакеры взламывают сайты
Журнал событий сервера
- Как читать логи сервера
- Как найти нужные данные
- Как отсеять обычных посетителей
Устраните уязвимость
Автоматизируйте процесс
Как хакеры взламывают сайты
Обычно хакеры используют ботов для обхода десятков тысяч сайтов с целью найти в них уязвимости по спискам известных уязвимостей, которые находятся в открытом доступе. Когда боты находят такие сайты, они взламывают их по известному алгоритму и отправляют сообщение хакеру.
Иногда хакеры взламывают сайты вручную, когда хотят получить доступ к какому-то определенному сайту, но по сравнению с автоматическим способом это происходит очень редко.
Основные способы, которыми хакеры проникают на сайты:
- Перебор паролей (взлом грубой силой) — Хакер просто пытается угадать ваш логин и пароль. Если вы используете простые логины, например, Admin или Administrator, это дает хакерам половину данных для доступа к вашему сайту. Если вы используете простые пароли, то это еще более ускоряет проникновение на ваш сайт.
- Уязвимости софта — Когда хакеры определяют, что вы используете устаревший софт, по спискам известных уязвимостей, находящимся в открытом доступе, они находят уязвимость в вашей устаревшей версии Вордпресс, плагина, темы или скрипта, и, например, внедряют свой скрипт для проникновения на ваш сайт.
- Бэкдоры — Хакер внедряет файл в файловую структуру сайта. В файле находится скрипт, который позволяет хакеру получить доступ к сайту, оставаясь при этом незамеченным. Бэкдоры.
- Небезопасный сервер — Сервер, на котором расположен ваш сайт, должен быть безопасным. Если он небезопасен, хакеры могут использовать уязвимости в ПО сервера для проникновения на ваш сайт.
- Неверные права доступа — Права доступа к файлам и папкам определяют, кто может читать, записывать и исполнять файлы. Если вы установите слишком низкие права доступа, хакеры смогут редактировать ваши файлы, внедрять скрипты, например, бэкдоры, и в итоге получат контроль над сайтом.
- XML-RPC эксплоиты — XML-RPC используется для трекбэков и пингбэков. Это позволяет делать несколько удаленных вызовов по одному HTTP запросу. Например, сайт может отправлять пингбеки на другие сайты и получать их от других сайтов. Проблема в том, что хакеры могут использовать эту функцию для выполнения удаленных автоматических атак с перебором паролей, когда они без ограничения с высокой частотой перебирают разные варианты логина и пароля. Подробнее.
- Вредоносное ПО и вирусы — Если у вас на компьютере есть вредоносное ПО или вирусы, хакеры могут их использовать для проникновения на сайт.
- Фишинг — Хакеры могут захватить или создать похожий на оригинальный сайт. На захваченном или похожем сайте хакеры создают похожую на оригинальную форму авторизации, чтобы похитить персональные данные пользователей, когда они авторизуются на сайте.
- XSS-атаки (Cross-site Scripting) — Это код, написанный определенным образом, который позволяет хакеру записывать и выполнять вредоносный JavaScript, который сохраняет данные браузера пользователя. Хакеры отправляют ссылку пользователям сайта, чтобы похитить любую информацию, введенную пользователями при просмотре сайта.
- CSRF (Cross-site request forgery) — Подделка межсайтового запроса. Хакер вносит изменение в оригинальный запрос пользователя, создавая свой вредоносный запрос. У хакера нет прав администратора, поэтому он обманным путем заставляет пользователя совершать действия, которые дают хакеру разрешение на выполнение этого вредоносного запроса. Такой тип атак используется для того, чтобы заставить пользователя делать нужные действия, например, предоставить свои логин и пароль для входа на сайт.
Это основные типы атак, которые используют хакеры, но кроме этих существуют и другие, поэтому практически невозможно угадать, каким именно путем хакер проник на сайт.
Вы можете попробовать что-то сделать, например, поменять пароли, но если вы видите, что хакер все равно продолжает проникать на сайт, значит, проблема еще не решена.
Единственный способ вылечить сайт — это выяснить, как хакер на него попадает, и устранить эту уязвимость.
Журнал событий сервера
Логи веб сервера могут содержать информацию или дать подсказку о том, как сайт был взломан.
Логи находятся на хостинг панели, в зависимости от используемого софта они могут называться по-разному: «Логи», «Журнал событий», «Метрики» или что-нибудь в этом роде. Обычно в этом разделе находятся 2 журнала: «Логи ошибок» и «Логи доступа». Лог ошибок сервера короче, поэтому начать можно с них, но они не показывают успешные попытки доступа.
Логи доступа содержат информацию об успешных попытках доступа, здесь больше вероятность найти следы взлома.
Записи в журнале хранятся на сервере определенное количество дней, после чего они автоматически удаляются. Скопируйте их на компьютер, пока они не были удалены с сервера.
Сохраните файлы на компьютер из хостинг панели или напрямую с сервера, и откройте в любой текстовой программе, например Notepad++ или Brackets.
Как читать логи сервера
Логи доступа и логи ошибок выглядят как трудночитаемое поле текста, но все записи организованы в определенную структуру.
Структура записи в Журнале ошибок:
- Дата и время
- Тип ошибки
- IP адрес пользователя
- Описание ошибки
- Путь к файлу страницы, на которой произошла ошибка
- URL сайта, с которого пользователь пришел на страницу с ошибкой
Большинство логов ошибок имеет такую структуру, но ваш лог может отличаться, это зависит от ПО сервера. Если ваш лог отличается, вы все равно увидите повторяющуюся структуру.
Логи событий тоже имеют стандартную структуру:
- IP адрес пользователя
- Дата и время
- Используемый HTTP метод и версия
- HTTP код ответа
- Количество полученных байтов
- Используемый софт (браузер или ОС посетителя)
- User agent
Как найти нужные данные
Начните с просмотра Лога ошибок, это может дать подсказку для поиска взлома в Логах доступа.
Если вы увидели, что кто-то пытался получить доступ к файлам, которые обычный посетитель не должен посещать, но хакер может, тогда обратите внимание на этот IP. Хакер может попытаться получить доступ к файлам .htaccess, wp-config.php, install.php и другим подобным.
Пример ошибки в Логе ошибок:
[Sat Jul 07 16:17:46 2018] [error] [client 123.45.67.890:20744] AH01630: client denied by server configuration: /путь/к/вашему/сайту/.htaccess
В этом примере сервер отказал пользователю в доступе к файлу .htaccess, потому что у него не было разрешения на просмотр этого файла. Если вы не узнаете этот IP адрес, и это не ваш адрес, то это определенно попытка взлома.
Если вы не знаете свой IP адрес, узнайте его здесь, или спросите в поисковике «мой IP адрес».
Для загрузки страницы обычно требуется загрузить много компонентов — картинки, скрипты, стили, поэтому нормально видеть, что один и тот же IP получает доступ к одной странице несколько раз, как в этом примере:
Но не нормально, если один и тот же IP много раз пытается получить доступ к файлам, к которым обычно требуется получить доступ несколько раз за сессию, особенно если пользователь обращается ко всем файлам подряд и раз в несколько секунд. Если вы видите повторяющиеся запросы к одним и тем же файлам, это может говорить о том, что это хакер или хакбот.
В этом примере вы видите, что пользователь обратился к странице ~/wp-login.php в первой строке, и запрос был успешным.
После того, как загрузились все нужные файлы, пользователь был успешно авторизован и направлен на страницу Консоли в строке 5. Следующим действием администратор прошел в редактор плагинов в строке 9.
В этом примере вы видите подозрительную активность, так как не все пользователи после авторизации пойдут в редактор тем или плагинов, но хакер пойдет. Еще это значит, что хакер знает логин и пароль администратора.
Если вы видите в логе ошибок и логе доступа, что было много неудачных попыток зайти на сайт или обращений к странице восстановления пароля, и после этого вы видите удачную попытку, то вы нашли хакера, который подобрал логин и пароль для входа на сайт.
Большое количество неудачных попыток войти на сайт перед последней удачной попыткой будут иметь один из 400-х ответов сервера:
- 400 Bad Request — Ошибка синтаксиса или неверный запрос.
- 401 Unauthorized — Эта ошибка появляется, когда требуется авторизация для просмотра страницы, но она не была дана, или она недействительна.
- 403 Forbidden — аналогично с ошибкой 401, этот ответ означает, что пользователь не имеет прав для просмотра этой страницы. То есть, технически доступ разрешен, но сервер запретил доступ этому пользователю.
- 429 Too Many Requests — Слишком много запросов за определенный период времени. Обычно пользователи не видят такой ответ, такая ошибка может указывать на активность какого-то бота.
Это не весь список ошибок, которые вы можете увидеть, но смысл в том, что описание событий может дать подсказку, что произошло с сайтом.
Самая сложная часть в просмотре логов доступа — это большое количество записей, даже для маленьких сайтов. Обычный вход администратора на сайт описывается 10 событиями в журнале, даже если он больше ничего не делал, поэтому размер лога становится большим на маленьких сайтах, и очень большим — на больших.
Как отсеять обычных посетителей
Чтобы уменьшить количество информации в логе можно отфильтровать обычные запросы. Откройте SSH клиент, например, Terminal для MacOS или PuTTY для Windows, или встроенный SSH клиент на хостинге, и попробуйте отсеять безопасные запросы.
С помощью этих команд вы можете отсеять 2/3 записей, в которых запрашивались картинки, файлы скриптов и стилей, главная страница, страница контактов и страница регистрации на сайте.
$ cat access-log |grep -Ev «.(js|css|png|jpg|jpeg) HTTP/1″ |grep -Ev » GET (/|/contact|/signup) HTTP/1″| more
Главная страница обозначена /
в части GET (/|/contact|/signup)
. Вы также можете изменить contact
и signup
на другие страницы, или добавить другие страницы.
Если у вас остается много записей, вы можете отфильтровать запросы к странице авторизации и панели администратора:
$ cat access-log |grep -E «wp-admin|wp-login|POST /» | more
Эти страницы часто атакуются хакерами, поэтому сначала просмотрите логи, относящиеся к этим страницам, особенно если было много неудачных попыток доступа к ним, после чего отфильтровать их.
Если вы знаете IP адреса админов, редакторов и других ролей, вы можете исключить эти запросы с помощью этой команды:
$ cat access-log |grep -E «wp-admin|wp-login|POST /» |grep -v «^1.2.3.4|1.2.3.5» | more
Замените 1.2.3.4
и 1.2.3.5
на свои адреса.
Хотя эти команды уменьшат размер лога, чтобы было проще найти действия хакера, это все равно займет много времени. Кроме этого, в большинстве случаев логи хранят информацию только за последние несколько дней, но хакер мог проникнуть на сайт раньше, поэтому лог с его активностью мог быть удален с сервера.
Устраните уязвимость
После того, как вы выяснили, как хакер проник на сайт, устраните найденную уязвимость.
Автоматизируйте процесс
Если еще не поздно, установите какой-нибудь плагин безопасности, он усилит безопасность сайта и предупредит вас в случае подозрительной активности на сайте. Включенный плагин заблокирует будущие попытки взлома и сэкономит много времени на поиск проблемы и восстановление сайта.
Поделитесь в комментариях, взламывали ли хакеры ваш сайт, если да, то как вы его восстановили. Что вы делаете для безопасности сайта?
Читайте также:
- Как проверить и вылечить от вирусов Вордпресс сайт
- 2 Примера взлома и лечения сайта
- Как очистить сайт от вирусов и удалить его из черных списков
- Как зайти в Консоль Вордпресс после взлома сайта
Надеюсь, статья была полезна. Оставляйте комментарии.
Используя групповые политики Active Directory можно настроить аудит смены паролей и других действий связанные с пользователями. Эти события можно получить используя оснастку Event Viewer и Powershell. В этой статье мы разберем эти возможности на примерах и создадим команду Powershell, которая сделает этот процесс более простым.
Настройка политики аудита
Самый удобный способ создать политику — использовать оснастку ‘Group Policy Management’. Эта оснастка может быть открыта через RSAT или на домен-контроллер. Оснастку групповых политик так же открывается командой:
gpedit.msc
Вам необходимо выбрать OU, где находятся компьютеры, и создать в ней новую политику. Можно выбрать так же сайт или домен если вы планируете охватить область большую чем OU:
В примерах я использую OU Moscow. Через Powershell создать и привязать политику тоже можно. Это делается следующим образом:
# Создаем политику
$gpo = New-GPO -Name 'PasswordAudit'
# Соединяем политику с OU Moscow
New-GPLink -Name 'PasswordAudit' -Target 'OU=Moscow,DC=domain,DC=local'
Политика, которая нам нужна, называется ‘Audit account management/Аудит управления учетной записью’. Она включает аудит связанный с изменением пользователя, пароля и групп. Что бы это сделать пройдите по следующему пути
- ‘Computer Configuration’ — ‘Policies’ — ‘Windows Settings’ — ‘Security Settings’ — ‘Local Policies’ = ‘Audit Policy’;
- ‘Конфигурация компьютера’ — ‘Параметры Windows’ — ‘Параметры безопасности’ — ‘Локальные политики’ — ‘Политика аудита’.
В этой политике нужно включить учет успешных попыток изменения данных (Success) и провала (Failure):
Powershell плохо предназначен для настройки политик. Основная проблема в том, что в качестве пути до политики мы должны указывать ветку реестра и знать значения, которые планируем менять. Политики аудита, связанные с безопасностью, не имеют веток реестра вообще и из-за этого установить их командами Powershell не возможно.
Ниже, для примера, показано как через Powershell устанавливается политика включающая заставку через 900 секунд:
# Set-GPRegistryValue -Name "Созданная политика" -Key "HKCUSoftwarePoliciesMicrosoftWindowsControl PanelDesktop" -ValueName "ScreenSaveTimeOut" -Type DWORD -Value 900
У домен контроллеров есть роль FSMO, которая отвечает за пароли. Ее название PDC — ‘Primary domain controller’. На домен контроллере, который держит эту роль, и будут собираться все события связанные с политикой аудита. Увидеть кому принадлежит эта роль можно так:
(Get-ADDomain).PDCEmulator
На клиентских компьютерах запустим обновление политик:
Invoke-GPUpdate -Force -Target 'Computer'
Получение событий
Учитывая, что включенная политика касается не только паролей, можно настроить фильтр через Powershell или GUI. Мы настроим фильтры, которые будут выводить события связанные с определенными идентификаторами ‘Event ID’. Нас интересуют следующие идентификаторы:
- 4723 — попытка смены пароля;
- 4724 — попытка сброса пароля;
- 4740 — пользователь был заблокирован;
- 4767 — пользователь был разблокирован.
Фильтрация логов с Event Viewer
Что бы выполнить фильтрацию через GUI — откройте логи ‘Security’ в ‘Event Viewer’ на домен-контроллере. Открыв журнал вы увидите множество событий не касающихся паролей:
Эти фильтры мы можем применить зайдя в соответствующее меню:
В новом окне мы должны указать идентификаторы событий, их источник и категорию:
После этих установок у нас будут отображаться только нужные события.
Фильтрация логов с Powershell
В Powershell есть две команды для работы с логами:
- Get-WinEvent — получает логи из всех журналов;
- Get-Eventlog — получает логи из журналов Application, System, or Security. Является устаревшим командлетом.
Обе команды имеют параметр ‘ComputerName’, с помощью которого можно подключаться удаленно.
У получения логов средствами Powershell есть две проблемы:
- Процесс получения логов медленный. Выполнение одного запроса может выполняться больше 1 секунды;
- Если брать другие команды Powershell, то их вывод всегда структурирован в виде ‘Ключ’=’Значение’. При получении логов журнала, так же как в EventViewer, часть информации будет представлена как строка, т.е ‘Ключ’= ‘Ключ=Значение Ключ=Значение’. В разных случаях может придется использовать регулярные выражения и парсить значения.
Что бы максимально ускорить процесс получения логов можно использовать 3 параметра фильтрации: FilterXPath, FilterHashtable, FilterXml.
XPath — это язык запросов, который был создан для работы с XML. Мы можем не создавать свой запрос XPath, а увидеть уже составленный на созданном раннее фильтре, на вкладке XML:
Команда, которая получит подобные логи с домен-контроллера ‘AD1’ и используя запрос XPath, будет выглядеть следующим образом:
Get-WinEvent -ComputerName 'AD1' -LogName 'Security' -FilterXPath "*[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and Task = 13824 and (EventID=4723 or EventID=4724 or EventID=4740 or EventID=4767)]]"
Аналогичное можно сделать использовав HashTable. Мы не должны указывать тип логов, т.к. это сделано в массиве:
$log = @{
LogName='Security';
ProviderName='Microsoft-Windows-Security-Auditing';
ID=4723,4724,4740;
}
Get-WinEvent -ComputerName 'AD1' -FilterHashtable $log
Если вам больше нравится вариант с запросом через hashtable, но вы не понимаете как правильно его составить, можно использовать следующий подход. Мы должны найти хоть один лог, который нам нужен используя любые средства Powerhsell. Затем мы выводим все свойства через ‘SELECT *’ и заполняем ими нашу таблицу:
Get-WinEvent -ComputerName 'AD1' -LogName 'Security' | where id -eq 4634 | select *
Отличия между массивом hashtable и обычными средствами Powershell в скорости. Если вы будете фильтровать вывод используя Powerhsell (как в примере выше) — это будет медленнее. Кроме указанных параметров в документации можно найти дополнительные варианты.
Создание команды
Создадим функцию с помощью который мы сможем выполнять эти действия более удобным для нас способом. Эта функция должна будет учитывать следующие моменты:
- возможность указания времени, указывающие на начало создания лога;
- понятный вывод сообщения соответствующий идентификаторам;
- источник и цель аудита. Например администратор изменивший пароль пользователя;
- тип события — success или fail.
Что бы получить события начинающиеся с определенной даты мы можем использовать существующее свойство ‘StartTime’ в массиве. ‘EndTime’ указывает обратное. В примере ниже мы получим события созданные за сутки:
# минус день от сегодняшней даты
$date = (Get-Date).AddDays(-1)
$hash = @{
LogName='Security';
ProviderName='Microsoft-Windows-Security-Auditing';
ID=4723,4724,4740;
StartTime=$date
}
Get-WinEvent -ComputerName 'AD1' -FilterHashtable $hash
Выше уже описывалась, что одна из проблем работы с журналом — это отсутствие форматирования каких-то данных. В примере ниже свойство ‘Messages’ хранит сплошной текст, а ‘Properties’ только некоторые отформатированные данные из ‘Messages’:
(Get-WinEvent -ComputerName 'AD1' -FilterHashtable $hash -MaxEvents 1).Message
(Get-WinEvent -ComputerName 'AD1' -FilterHashtable $hash -MaxEvents 1).Properties
Пример выше — скорее идеальный случай. У вас может отличаться порядок или другая информация в ‘Properties’. Эти данные точно будут отличаться в логах с разными ID. В случае с одинаковыми ID — это так же может случатся.
Готовая функция, выводящая информацию об этих событиях, будет следующей:
Function Get-ADPasswordEvent {
[CmdletBinding()]
Param(
# массив с идентификаторами для проверки событий
[array]$EventID = @(4723,4724,4740,4767),
# поиск логов от указанной даты
[datetime]$BeginTime,
# тип события, которые мы ищем Удача/Провал
[ValidateSet("Success","Failure")]
[array]$EventType,
# IP/DNS имя удаленного компьютера
[string]$ComputerName
)
Process {
# составляем массив для поиска
$log_table = @{
LogName='Security';
ProviderName='Microsoft-Windows-Security-Auditing';
ID=$EventID;
}
# ниже проверяем какие параметры переданы пользователем
# и добавляем их в массив
# пользователь указал дату
if ($BeginTime){
$log_table += @{StartTime=$BeginTime}
}
# пользователю нужен только успех/провал
if ($EventType -eq 'Success'){
$log_table += @{Keywords=9007199254740992}
}
elseif ($EventType -eq 'Failure') {
$log_table += @{Keywords=4503599627370496}
}
$parameters = @{
FilterHashtable=$log_table
}
# если пользователь указал удаленный компьютер
if ($ComputerName){
$parameters += @{ComputerName=$ComputerName}
}
# передаем все параметры в команду
$events = Get-WinEvent @parameters
# массив, который вернем пользователю
# со всеми событиями
$formatted_events = @()
foreach ($event in $events){
# проверяем каждое событие
# и устанавливаем для него свое описание
Switch ($event.ID) {
4723 {
$Description = "Попытка изменения пароля"
Break
}
4724 {
$Description = "Попытка сброса пароля"
Break
}
4740 {
$Description = "Пользователь заблокирован"
Break
}
4767 {
$Description = "Пользователь разблокирован"
Break
}
Default {
# если его идентификатор не найден
$Description = $event.Message
Break
}
}
# определяем тип события
if ($event.KeywordsDisplayNames -like '*Success*'){$type = 'Успех'}
else {$type = 'Провал'}
# создаем массив текущего события
# и добавляем его к остальным найденным
$formatted_events += [PSCustomObject]@{
"Дата создания" = (Get-Date $event.TimeCreated -Format "dd-MM-yyyy HH:mm");
"ID" = $event.ID;
"Описание" = $Description;
"Тип" = $type;
"Цель (имя)" = $event.Properties[0].Value;
"Цель (компьютер)" = $event.Properties[1].Value;
"Кем (имя)" = $event.Properties[4].Value;
"Кем (компьютер)" = $event.Properties[5].Value;
"Цель (SID)" = $event.Properties[2].Value;
"Кем (SID)" = $event.Properties[3].Value;
}
}
# возвращаем составленный массив пользователю
return $formatted_events | ft
}
}
Примеры работы
Варианты использования функции:
# возвращаем все события по идентификаторам 4723,4724,4740,4767
Get-ADPasswordEvent
# возвращаем те же события, но за сутки
Get-ADPasswordEvent -BeginTime (Get-Date).AddDays(-1)
# возвращаем события провала с удаленного компьютера
Get-ADPasswordEvent -ComputerName 'AD1' -EventType 'Failure'
# возвращаем события используя другой идентификатор
Get-ADPasswordEvent -EventID 4724
…
Теги:
#powershell
#ad