初期状態のPowerShellでスクリプトファイルを実行する
powershell -EncodedCommand ([Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes((gc (ファイルパス)) -join "`r`n")))
これ関数化したらRestrictedかたなし。
いや当然だけど
ExecutionPolicyがRestrictedでも実行できます。はい。AllSignedも意味なし。
まあでもPowerShellで実行しなきゃいけないわけですが、、、。
、、、いや、Base64変換できれば良いなら、、、
以下の.jsと.ps1を置いて.jsがWSHでたたければ、.ps1は実行可能、ということ。
.js
WScript.Quit((function() { // 対象ファイル決定 var path = 'no_sign.ps1' if(WScript.Arguments.length > 0) { path = WScript.Arguments.item(0) } // ファイル読み込み var ins = WScript.CreateObject('ADODB.Stream') ins.Open() ins.Type = 1 // Binary ins.LoadFromFile(path) // Base64変換 var binMan = WScript.CreateObject('Microsoft.XMLDOM').createElement('tmp') binMan.dataType = 'bin.base64' binMan.nodeTypedValue = ins.Read() // 実行 var wsh = new ActiveXObject('WScript.Shell') wsh.Run('powershell -EncodedCommand ' + binMan.text) return 0 })());
.ps1ファイルは、UTF-16LE(BOMなし)で保存しといてください。
そうでない場合は、もうちょっとごにょごにょする必要があります。
(が、ごにょごにょすればOKです)
.jsに.ps1のパスを渡せば、いつでも実行可能!
もちろん、.ps1ファイルの拡張子は何でも良いです。
あ、ちょっとまてよ。
これだ
powershell -Command "powershell -EncodedCommand ([Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes((gc (ファイル名)) -join [Environment]::NewLine)))"
ありゃー、バッチでできちゃったよ。
ってことは、スクリプトの書かれたファイル(UTF-16LEだとダメでShift-JISでやった)を置いてしまえば、なんらかの脆弱性で実行可能ということですね、、、。
防御策は、、、ない、、、UACをONにして少しでも被害を少なくするのみ、、、。
ブラウザの脆弱性攻撃なら、やつらはBase64得意だから、ファイル置かなくてもゲームセット。
あいや、攻撃するなら変換済みを渡すだけか。
<script type="text/javascript"> (new ActiveXObject('WScript.Shell')).Run('powershell -EncodedCommand IgBCMEIwQjAiADsAUgBlAGEAZAAtAEgAbwBzAHQAIAAiAEJ9hk4/ACIA') </script>
- EncodedCommandってセキュリティホールなんじゃないかしらん。
結論
ExecutionPolicyなんて飾りです。
マッ黒い人には判らんのです。
までも、せっかくなのでAllSigned運用は変えないです、はい。