Office VBA for macOSでのExecutionについてちょっとだけ
事前知識
わたしが持っていたのはこの辺
とりあえずdocのマクロからpythonを実行するとこまでをゴールにしてみた.
既知の実行方法
ブログの内容と, なんとなくWindowsと同じように備わってそうな機能を確認.
- Private Declare PtrSafe Function system Lib "libc.dylib" + system("echo ...")
- Private Declare PtrSafe Function popen Lib "libc.dylib" + popen("echo ...")
- libc.dylib + .slk file
- Built-in Shell()
だいたいこの辺でsay helloだとかを実行してみた. だが目立つ. libc.dylib もだけど shell() はダメだろって感じ. Objective-See's Blog の解説にもあるが, olevba みたいなマクロ展開ツールがAVとかに入っていて解析していたら即バレする気しかしない.
なのでもうちょい隠せそうな方法を調べてみた.
結論
- AppleScript(MacScript or AppleScriptTask) + one liner shell
VBA for macOS ではMacScript (AppleScriptString) で AppleScript を実行できる. もうちょい言うとこの関数は廃止済み(まだ一部のバージョンでは動くけど)で, 公式は AppleScriptTask を使うことを推奨している.
そんで AppleScript では do shell script "shell command" でコマンド実行ができる. というわけで, 繋げてこんな感じで書くと VBA から sh -c 'say hello' をAppleScript経由で実行できる.
Function helloViaAppleScript() aString = "do shell script " & Chr(34) & "say hello" & Chr(34) MacScript (aString) End Function
ここで攻撃者的に良い点はaStringの内容を適当にエンコードできそうな点. 既知の方法だと実行用の関数とかPrivate Declare PtrSafe Functionで捕まえられそうな気がするが, "do shell script"をエンコードすればolevbaとかだけではそう簡単に解析できなくなるはず. そもそもマクロ内でAppleScriptをどの程度使うのか, って話はあると思うが.
あとは python ファイルを作って実行すればOK. このとき端末へのアクセスはOfficeではなくshellが行なっている点に注意. Officeにアクセス権限を渡していなくてもshell(Terminal.appかも)にFull Disk Access permissionを渡しているとファイル生成を障害なく行える.
ね?簡単でしょう?(開発者の人は注意しよう)
10/19 追記
端末アクセスの箇所は勘違いだった. 遊んだ過程で設定ミスがあった模様. 後日再検証する.
以上