0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Powershell スクリプト内での認証情報秘匿【難読化の超基本】

Last updated at Posted at 2021-06-27

どこで使うの?

Windows資格情報を設定するバッチファイルを、どうしてもユーザーに配布して実行させる必要があるとします。この時、cmdkeyコマンド実行部分にてパスワードを平文で書いたりするのはナンセンスです。そこで、内容を難読化しておきます。

免責

この方法は、一般ユーザーがうっかりバッチファイルの中身を見てしまってもパスワードなどの認証情報が読めないようにするためです。この程度ではプロ相手には通用しませんので、本格的なセキュリティ対策として利用するのはお控えください。

スクリプトを用意

とりあえず、実行したいスクリプトを用意します。cmdkey /add:Altair /user:Vega /pass:Bengbuのようなものを実行するわけですが、今回は動作確認をしやすくするために、文字列をechoするだけの簡単なスクリプトにします。

write-host hello-obfuscation

暗号化

上記の文字列を何かしらの方法で暗号化します。

[Convert]::ToBase64String( ([System.Text.Encoding]::Default).GetBytes("write-host hello-obfuscation"))

今回はBase64暗号を用いて、このような文字列になりました。

output
d3JpdGUtaG9zdCBoZWxsby1vYmZ1c2NhdGlvbg==

復号化

それではデコードしてみます。

[System.Text.Encoding]::Default.GetString([System.Convert]::FromBase64String("d3JpdGUtaG9zdCBoZWxsby1vYmZ1c2NhdGlvbg=="))

デコード出来ました。

output
write-host hello-obfuscation

Invoke-Expression

しかし、これでは文字列のままなので、コマンドとして実行できていません。
そこで、Invoke-Expressionコマンドを使用します。

先ほどのデコードした時のコマンドをInvoke-Expressionの引数として渡します。

Invoke-Expression -Command $([System.Text.Encoding]::Default.GetString([System.Convert]::FromBase64String("d3JpdGUtaG9zdCBoZWxsby1vYmZ1c2NhdGlvbg==")))

出力結果を見ると、もともとのWrite-Hostコマンドが実行できていることが分かります。

hello-obfuscation

Aliasと省略

Invoke-Expressionは長いので、省略します。また、-Commandも無くてもいいので省略します。
Invoke-Expression-Commandの代わりにiexを使いましょう。

iexInvoke-Expression-Commandの代わりになることは、Get-Aliasコマンドで確認できます。

Get-Alias iex
output
CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           iex -> Invoke-Expression

実際に省略したコマンドはこのようになっています。

iex $([System.Text.Encoding]::Default.GetString([System.Convert]::FromBase64String("d3JpdGUtaG9zdCBoZWxsby1vYmZ1c2NhdGlvbg==")))

出力結果から省略前と同様にWrite-Hostコマンドが実行できています。

hello-obfuscation

iexの秘匿

iexという文字列がそのまま入っているスクリプトはセキュリティ対策ソフトで検知されることが多いです。そこで、文字列iexを動的に生成し、これをコマンド化して使うことにしましょう。

まずは、iex文字列でコマンドが実行できることを確認します。

 & "iex" "write-host hello-obfuscation"
output
hello-obfuscation

このように、&の後ろに書いた最初の文字列がコマンドとして認識され、その引数に2番目の文字列が利用されていることが分かります。
後は、iexという文字列をどう生成するのかが分かれば良さそうです。

そこで利用するのは、確実に結果が分かっているコマンドです。そのコマンドの選定条件は下記です。

  • 想定する環境での実行結果が常に同じであること
  • 実行結果に同じ位置でiexの3文字が出現すること

ここでは、こんなコマンドを利用してみましょう。

gcm cmd
output
CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Application     cmd.exe                                            10.0.1904… C:\WINDOWS\system32\cmd.exe

簡単にしたいので、Source部分だけ取り出しましょう。

$(gcm cmd).Source
output
C:\WINDOWS\system32\cmd.exe

まずは、ここからiを取り出してみます。

$(gcm cmd).Source[-23]
output
I

大文字ですね。Windowsでは大文字小文字は無視されるので、見なかったことにします。
次に、eも取り出しましょう。

$(gcm cmd).Source[-23,-1]
output
I
e

最後に、xです。

$(gcm cmd).Source[-23,-1,-2]
output
I
e
x

そして、配列に格納された3つの文字を連結して、文字列にします。

$(gcm cmd).Source[-23,-1,-2] -Join $Null
output
Iex

動的生成はできたようです。先ほどのコマンドと混ぜてみましょう。& "iex" "write-host hello-obfuscation"でしたね。

& $($(gcm cmd).Source[-23,-1,-2] -Join $Null) "write-host hello-obfuscation"
output
hello-obfuscation

完璧です。

完成したスクリプト

最後に、先ほどの暗号化と混ぜてみましょう。

 & $($(gcm cmd).Source[-23,-1,-2] -join $null) $([System.Text.Encoding]::Default.GetString([System.Convert]::FromBase64String("d3JpdGUtaG9zdCBoZWxsby1vYmZ1c2NhdGlvbg==")))
output
hello-obfuscation

Hello Obfuscation !

まとめ

Base64は簡単な可逆暗号なので、セキュリティ対策としては甘いです。
ソースに平文でBase64って書いてあるので、
一般ユーザーの目は誤魔化せても、プロなら一瞬で解読されますね。
不可逆暗号を使ったほうが良いと思います。
ここでは、タイトルに銘打ったとおり基本なので割愛します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?