Шифрование и дешифрование в PowerShell

Шифрование и дешифрование в PowerShell

С помощью PowerShell можно не только защитить конфиденциальные данные, но и использовать другие возможности командлетов, таких, как Invoke-Command или New-PSSession. В этой небольшой статье я покажу, насколько просто шифровать или дешифровать данные в PowerShell и как можно использовать зашифрованные данные для создания данных учетных записей.

Еще по теме: Как обойти PowerShell AMSI

Шифрование и дешифрование в PowerShell

В PowerShell командлеты ConvertTo-SecureString и ConvertFrom-SecureString можно использовать для шифрования и дешифрования стандартной строки System.String в System.Security.SecureString.

Вот пример, когда строка шифруется и сохраняется в переменной:

Если мы введем имя переменной, содержащей зашифрованную строку, то увидим ее тип System.Security.SecureString:

Шифрование и дешифрование PowerShell

Мы также можем расшифровать данные, хранящиеся в объекте System.Security.SecureString, следующим образом:

Использование зашифрованных строк для учетных данных PowerShell

Возможность выполнить командлет от имени другого пользователя может в некоторых ситуациях быть очень полезной возможностью. Например, Red Team (хакеры, которые специализируются исключительно на взломе и компрометации компьютеров и мобильных устройств), которым удалось получить учетные данные скомпрометированного пользователя, могут попытаться выполнить команды на удаленной машине от имени этого пользователя, используя украденные учетные данные.

Командлеты, которые определяют параметр Credential, позволяют нам указать учетные данные, под которыми должен запускаться командлет. Значение, передаваемое параметру Credential, должно быть объектом PSCredential. И для того, чтобы мы могли создать объект PSCredential, нам нужны имя пользователя и пароль в виде защищенной строки, что означает, что нам нужно будет зашифровать пароль.

Чтобы надежно зашифровать строку, не рекомендуется указывать пароль в виде открытого текста в командной строке в качестве аргументов. Это связано с тем, что ведение журнала PowerShell или любое ведение журнала командной строки, которое включено, может регистрировать эти учетные данные в виде открытого текста, что не есть хорошо!

Поэтому вместо этого пароль следует считывать со стандартного потока stdn и сохранять в переменной. Командлет Read-Host, который позволяет считывать данные со стандартного потока, имеет параметр AsSecureString, который преобразует для нас данные, считанные со стандартного потока, в System.Security.SecureString.

С помощью следующего кода PowerShell можно считывать данные со стандартного ввода и сохранять их в переменной в виде защищенной строки:

Затем мы можем взять эту безопасную строку и создать требуемый объект PSCredential:

Теперь мы можем использовать этот объект PSCredential с командлетами, позволяющими указать параметр Credential. Вот как я выполняю командлет Invoke-Command на удаленной машине с WINRM от имени другого пользователя, используя созданный нами PSCredential:

На этом все. Мы разобрались с шифорванием и дешифрованием PowerShel. Надеюсь статья была полезна, и вы сможете использовать полученные знания в ИБ. Я также рекомендую прочитать статью «Обфускация PowerShell».

РЕКОМЕНДУЕМ:

ВКонтакте
OK
Telegram
WhatsApp
Viber

Один комментарий

  1. Eugene

    что не есть нехорошо!)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *