初期状態のPowerShellでスクリプトファイルを実行する

UWSC公式掲示板で教えてもらったのでメモ。

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>

結論

ExecutionPolicyなんて飾りです。
マッ黒い人には判らんのです。


までも、せっかくなのでAllSigned運用は変えないです、はい。