Содержание статьи
- В чем опасность
- Как утекают пароли
- Ищем утечки паролей в процессах Windows
- Версия для SCCM
- Ищем утечки пароля в Linux
- Проверяем хосты на Linux с помощью Ansible
- Уязвимые сценарии и примеры
- CI/CD конвейеры и скрипты развертывания
- Резервное копирование и batch-скрипты
- Сценарии автоматизации и обслуживания
- CI/CD и DevOps инструменты с плагинами
- Удаленный доступ и RDP-консолидаторы
- Небезопасные инструменты
- PuTTY и производные
- WinSCP (CLI)
- rsync при прямом подключении к демону
- sshpass
- FTP-клиенты и утилиты для других протоколов
- Утилиты баз данных
- cURL, Wget и другие HTTP-клиенты
- Прочие утилиты
- Как обезопасить себя
- Выводы
Отдельное внимание уделим инструментам, часто используемым администраторами (PuTTY Connection Manager, SuperPuTTY, mRemoteNG, WinSCP CLI, plink, pscp, rsync, sshpass и другим), и рекомендациям по безопасной работе.
В чем опасность
Передача пароля через аргументы командной строки означает, что секретный пароль фактически «зашит» в текст команды. Несмотря на то, что сама SSH-сессия шифрует данные при передаче по сети, пароль, указанный в параметрах, остается видимым на локальном компьютере.
Главная угроза в том, что такой пароль может быть легко прочитан посторонними процессами или пользователями на той же системе. В операционных системах семейства Unix/Linux любой пользователь по умолчанию может просмотреть список процессов и командные строки, с которыми они запущены (например, с помощью команд ps или через чтение файлов /
). Аналогично в Windows диспетчер задач или утилиты вроде Process Explorer позволяют увидеть полную командную строку запущенных процессов.
Другими словами, если администратор запускает утилиту с указанием пароля в явном виде, этот пароль может попасть в историю командной оболочки или отобразиться в списке процессов, доступном для просмотра локальными пользователями. В результате злоумышленник, имеющий ограниченный доступ к системе (либо другой пользователь на том же сервере, либо вредоносное ПО), может незаметно прочитать пароль из командной строки.
Это подрывает саму суть SSH-авторизации: пароль, может быть, и не передается в открытую по сети, но хранится в открытом виде на стороне клиента.
Администраторы часто пользуются надстройками и утилитами для удобной работы с SSH: например, GUI-менеджеры сессий (PuTTY CM, SuperPuTTY, mRemoteNG), инструменты автоматизации файловых трансферов (WinSCP, psftp, pscp), скриптовые обертки (plink, sshpass) и даже команды резервного копирования (rsync с паролем). Все эти средства предоставляют возможность указать пароль в параметрах командной строки, что одинаково опасно.
Авторы документации sshpass, например, подчеркивают, что подобный способ аутентификации небезопасен и не рекомендуется, так как пароли передаются или хранятся в виде открытого текста. В целом, любая программа, принимающая пароль через аргумент командной строки, потенциально уязвима, если использовать эту возможность.
Как утекают пароли
В диспетчере задач Windows можно определить, что процесс PuTTY (psftp) запущен с опцией -pw и с явным указанием пароля. В таком случае пароль сохраняется в открытом виде в командной строке процесса. Это наглядно подтверждает, что любые пароли, переданные через параметры, могут быть прочитаны из списка процессов локальной системой.
Точно так же в Linux достаточно выполнить команду вроде ps
или просмотреть файл /
, чтобы увидеть всю командную строку активного процесса. К примеру, администратор может выполнить такую команду:
sshpass -p 'P@ssw0rd' ssh user@server.example.com
Тогда другой пользователь на этом же хосте может выполнить ps
и обнаружить в выводе строку с указанным паролем.
В журнале Red Hat приводится предупреждение:
«Все случаи предоставления пароля в командной строке включают риск того, что пароль будет захвачен в истории оболочки пользователя или будет виден всем системным пользователям в списке процессов».
Документация PuTTY также отмечает, что опция -pw
делает пароль видимым для других локальных пользователей (например, через команду w
) и не рекомендуется к использованию.
Эта проблема касается не только sshpass и PuTTY. Утилиты plink, pscp, psftp (входящие в состав PuTTY) принимают параметр -pw <
для автоматизации входа и таким образом отображают пароль в памяти процесса.
В Linux такой пароль можно получить, просмотрев командную строку процесса через /
. В Windows ситуация похожая: нескольких кликов в диспетчере задач достаточно, чтобы увидеть полный запуск процесса вместе с переданным паролем. WinSCP в командном режиме позволяет передавать пароль через ключ /
, что тоже делает этот пароль видимым локально. Администратор WinSCP предупреждает, что такой способ небезопасен.
Даже инструменты, не связанные напрямую с SSH, подвержены этой проблеме. Например, клиент MySQL позволяет указать пароль через параметр --password=
или короткий -p
: при таком использовании MySQL выводит предупреждение: «Using a password on the command line interface can be insecure» (использование пароля в командной строке может быть небезопасно). Причина все та же — пароль может быть перехвачен локально, пока процесс выполняется.
Хотя некоторые современные программы пытаются очистить или скрыть пароль в аргументах после запуска, полностью полагаться на это нельзя. Всегда существует короткий промежуток времени, когда пароль виден в памяти процесса и может быть прочитан посторонними. Кроме того, списки процессов нередко собираются системами мониторинга и журналирования, поэтому пароль, даже использованный в быстром одноразовом процессе, может сохраниться в логах аудитора или мониторинга.
Вывод простой: передавая пароль через аргументы команд, ты фактически делаешь его открыто доступным на локальной машине. Ниже я расскажу, как выявить такие случаи и какие меры принять, чтобы этого избежать.
Ищем утечки паролей в процессах Windows
Администраторы Windows могут воспользоваться PowerShell для сканирования запущенных процессов и обнаружения тех, в командных строках которых присутствуют подозрительные параметры, похожие на пароли.
Для этого нужно запрашивать у системы командные строки процессов (атрибут CommandLine
класса Win32_Process
) и искать в них известные ключи или паттерны (например, -p
, -pw
, --password
, /
и тому подобные). Ниже приведен скрипт на PowerShell, который можно запустить вручную на отдельной системе для выявления таких случаев:
$insecureProcs = Get-CimInstance Win32_Process | Where-Object { ($_.CommandLine -match '-p\s') -or # найдены '-p ' ($_.CommandLine -match '-pw\s') -or # найдены '-pw ' ($_.CommandLine -match '--password=') -or # найдены '--password=' ($_.CommandLine -match '/password=') # найдены '/password=' } | Select-Object ProcessId, Name, CommandLineif ($insecureProcs) { Write-Host "Обнаружены процессы с потенциальной утечкой пароля:" $insecureProcs | Format-Table -AutoSize} else { Write-Host "Не найдено процессов с паролями в командной строке."}
Этот скрипт выводит таблицу с идентификатором процесса, именем и полной командной строкой для каждого найденного случая. В фильтре условия -match
используются регулярные выражения для поиска различных способов передачи пароля. Здесь мы проверяем наличие подстрок -p
(дефис p и пробел), -pw
, а также --password=
и /
. Эти шаблоны охватывают типичные ключи, используемые разными утилитами (sshpass, plink/pscp, WinSCP, mysql и другими). При необходимости список можно расширить или уточнить.
Версия для SCCM
Если нужно выполнить подобную проверку централизованно на многих машинах через System Center Configuration Manager (SCCM) или аналогичную систему, можно адаптировать скрипт. Например, SCCM-скрипт проверки может возвращать код выполнения или вывод, на основании которого система сделает вывод о соответствии политики.
Ниже приведен вариант, который в случае обнаружения небезопасного процесса завершится кодом 1 (несоответствие), а при отсутствии — кодом 0 (все чисто):
$found = $falseGet-CimInstance Win32_Process | Where-Object { ($_.CommandLine -match '-p\s') -or ($_.CommandLine -match '-pw\s') -or ($_.CommandLine -match '--password=') -or ($_.CommandLine -match '/password=') } | ForEach-Object { $found = $true # Запись в лог при необходимости: "$($_.ProcessId): $($_.Name) $($_.CommandLine)" | Out-File "C:\\temp\\insecure_procs.log" -Append }if ($found) { exit 1 } else { exit 0 }
Этот сценарий перебирает процессы, записывает обнаруженные случаи (PID, имя, команду) в локальный лог‑файл и устанавливает флаг $found
. В конце скрипта возвратом exit
он может сигнализировать SCCM о проблеме.
Администратор SCCM может настроить соответствующее правило, помечающее машину как Non-compliant (несоответствующую требованиям безопасности), если скрипт вернул 1, что позволит быстро выявить системы, где кто‑то использует небезопасные способы передачи паролей.
Ищем утечки пароля в Linux
В Linux подобную проверку можно выполнить с помощью скрипта на Bash, анализируя вывод команды ps или содержимое директорий /
. Скрипт должен выполняться с правами, достаточными для просмотра процессов всех пользователей (например, от имени root), иначе он увидит только свои процессы.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее