PowerShell パスワードをブチやぶれ!
過日、あるWebアプリケーションの自動ログインスクリプトを作ったときの話である。
ユーザIDはまあスクリプトに埋め込んでも問題ないだろう。
一方のログインパスワードはそうはいかない。スクリプト起動後、Read-Host コマンドレットを使用して、対話入力させることにした。
しかし、このRead-Host コマンドレット、特にパラメータ付与せず、そのまま使ってしまうと、パスワードがプロンプトに丸見えになってしまうのである。
「うおっ、丸見えはヤバすぎる!隠すとこは隠しやがれ。」
ということで、AsSecureString パラメータというものがあり、これを付与すると、プロンプト上で伏字表示(アスタリスク)してくれる。
またパラメータ名からも分かる通り、入力された文字列をセキュアな文字列に変換してくれるのである。
だが、待て。セキュアな文字列に変換されたということはつまり、そのままアプリにパスワードを飛ばしても弾き返されてしまうことは必至ではないか。
平文化しないと、アプリにログインはできない。
よって、今回はプロンプトに伏字表示されたパスワードであるセキュアな文字列を、最終的に平文化する、ということについていろいろ検証していきたいと思う。
パスワードは、PowerShellと打ちこんだ。
▼ソースはこれ
#-----------------------
# セキュア文字列の検証
#-----------------------
#伏字でユーザ入力させる
$secureStr = Read-Host "パスワード" -AsSecureString
#ユーザ入力値(セキュア文字列)
Write-Host "▼セキュア文字列/型"
Write-Host $secureStr
Write-Host $secureStr.GetType().Name
Write-Host ""
#セキュア文字列を記録したメモリのポインタを取得
$pointerStr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secureStr)
Write-Host "▼ポインタ/型"
Write-Host $pointerStr
Write-Host $pointerStr.GetType().Name
Write-Host ""
#ポインタから平文文字列を取得
$hirabunStr = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($pointerStr)
Write-Host "▼平文文字列/型"
Write-Host $hirabunStr
Write-Host $hirabunStr.GetType().Name
Write-Host ""
Read-Host "×ボタンで終了"
・SecureStringの操作について
「System.Runtime.InteropServices.Marshal」クラスのメソッドを2種類利用して、段階的に文字列取得をしていく。
・文字列取得後にやること
各段階で取得した文字列内容と、型の確認をする。
結果はこんな感じで、最終的にパスワードPowerShellを得ることができた。
パスワードをブチやぶることに成功したが、結局一番やりたいことは伏字表示したいだけということだけなのに、アプリに平文文字列を飛ばさねば意味がないわけで、色々やらんといかんわけであった。
PowerShell、裏で色々頑張ってますのよ、アハーン!