業務改善!Windows PowerShell入門

Windows PowerShellで、とにかく楽をしたい!実際に仕事で楽になった事、便利になった事を紹介しつつ進めていきます。

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種類利用して、段階的に文字列取得をしていく。


 ・文字列取得後にやること
各段階で取得した文字列内容と、型の確認をする。

 

 

f:id:acoustic_groove:20171117211845p:plain


結果はこんな感じで、最終的にパスワードPowerShellを得ることができた。


パスワードをブチやぶることに成功したが、結局一番やりたいことは伏字表示したいだけということだけなのに、アプリに平文文字列を飛ばさねば意味がないわけで、色々やらんといかんわけであった。

 

PowerShell、裏で色々頑張ってますのよ、アハーン!