С помощью PowerShell можно не только защитить конфиденциальные данные, но и использовать другие возможности командлетов, таких, как Invoke-Command или New-PSSession. В этой небольшой статье я покажу, насколько просто шифровать или дешифровать данные в PowerShell и как можно использовать зашифрованные данные для создания данных учетных записей.
Еще по теме: Как обойти PowerShell AMSI
Шифрование и дешифрование в PowerShell
В PowerShell командлеты ConvertTo-SecureString и ConvertFrom-SecureString можно использовать для шифрования и дешифрования стандартной строки System.String в System.Security.SecureString.
Вот пример, когда строка шифруется и сохраняется в переменной:
1 2 |
data = "This is some extremely important data" $encryptedData = ConvertTo-SecureString -String $data -AsPlainText |
Если мы введем имя переменной, содержащей зашифрованную строку, то увидим ее тип System.Security.SecureString:
Мы также можем расшифровать данные, хранящиеся в объекте System.Security.SecureString, следующим образом:
1 |
ConvertFrom-SecureString -SecureString $encryptedData -AsPlainText |
Использование зашифрованных строк для учетных данных PowerShell
Возможность выполнить командлет от имени другого пользователя может в некоторых ситуациях быть очень полезной возможностью. Например, Red Team (хакеры, которые специализируются исключительно на взломе и компрометации компьютеров и мобильных устройств), которым удалось получить учетные данные скомпрометированного пользователя, могут попытаться выполнить команды на удаленной машине от имени этого пользователя, используя украденные учетные данные.
Командлеты, которые определяют параметр Credential, позволяют нам указать учетные данные, под которыми должен запускаться командлет. Значение, передаваемое параметру Credential, должно быть объектом PSCredential. И для того, чтобы мы могли создать объект PSCredential, нам нужны имя пользователя и пароль в виде защищенной строки, что означает, что нам нужно будет зашифровать пароль.
Чтобы надежно зашифровать строку, не рекомендуется указывать пароль в виде открытого текста в командной строке в качестве аргументов. Это связано с тем, что ведение журнала PowerShell или любое ведение журнала командной строки, которое включено, может регистрировать эти учетные данные в виде открытого текста, что не есть хорошо!
Поэтому вместо этого пароль следует считывать со стандартного потока stdn и сохранять в переменной. Командлет Read-Host, который позволяет считывать данные со стандартного потока, имеет параметр AsSecureString, который преобразует для нас данные, считанные со стандартного потока, в System.Security.SecureString.
С помощью следующего кода PowerShell можно считывать данные со стандартного ввода и сохранять их в переменной в виде защищенной строки:
1 |
$password = Read-Host -AsSecureString |
Затем мы можем взять эту безопасную строку и создать требуемый объект PSCredential:
1 |
$Cred = New-Object System.Management.Automation.PSCredential("domain\user", $password) |
Теперь мы можем использовать этот объект PSCredential с командлетами, позволяющими указать параметр Credential. Вот как я выполняю командлет Invoke-Command на удаленной машине с WINRM от имени другого пользователя, используя созданный нами PSCredential:
1 |
Invoke-Command -Credential $Cred -ScriptBlock { whoami } -ComputerName 10.10.1.11 |
На этом все. Мы разобрались с шифорванием и дешифрованием PowerShel. Надеюсь статья была полезна, и вы сможете использовать полученные знания в ИБ. Я также рекомендую прочитать статью «Обфускация PowerShell».
РЕКОМЕНДУЕМ:
что не есть нехорошо!)