nknskn ネタ置き場

IT使ってなんかやってる人間のたわごと

Office VBA for macOSでのExecutionについてちょっとだけ

Windowsに疲れたのでmacOSで遊んだ話.

事前知識

わたしが持っていたのはこの辺

とりあえず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 追記

端末アクセスの箇所は勘違いだった. 遊んだ過程で設定ミスがあった模様. 後日再検証する.

以上