Binary Pulsar

技術寄りなセキュリティの話題について書きます

rundll32.exeを悪用した命令の実行

概要

攻撃者がWindowsシステムへの侵入に成功し、悪意のあるファイルを実行する際に、EXEファイルだと都合が悪いため様々な手法でファイルの実行を試みます。アンチウイルスソフトにファイルが検知されてしまうことはもちろんですが、侵入したWindowsシステムがAppLockerのような「ファイルの実行を制限するソフトウェア」を導入しておりpowershell.exeやcmd.exeなどの実行を制限している場合は、何かしらの手法で制限を回避してコマンドを実行させる必要があります。今回はAppLockerのようなソフトウェアにより制限されている環境で、制限を回避して命令を実行させるために攻撃者が悪用する手法の一つとして、rudll32.exeを悪用した手法を解説します。

rudll32.exeとは

DLLにはEXE形式のファイルに実装するライブラリ関数が含まれており、Windows OSの根幹をなす機能が含まれているものが多く存在します。Windowsで実行されるプログラムは、DLLから必要な機能を取り出した機能を活用して構成されています。しかし、「DLLからほんの一部の機能だけ取り出して実行したい」という場合に、わざわざC#などによりDLLを読み込んで実行するプログラムを書くのは面倒です。そこで活用できるプログラムがrundll32.exeです。rundll32.exeは「DLLに実装されている関数を取り出して実行するための実行ファイル」であり、Windowsシステムに標準実装されています。以下の書式で実行することにより、対象のDLLに実装されている関数を取り出し実行することが可能です。

rundll32.exe [対象のDLL], [実行したい関数名] [関数の引数]

ただし、rundll32.exeでは、DLLに実装されているすべての関数を呼び出せるわけではありません。これについては本題から離れるため、本記事では割愛します。

例えば、user32.dllに実装されているLockWorkStation関数を実行する場合を考えます。LockWorkStation関数はWindowsに実装されている標準的な関数の一つであり、画面をロックする機能を持ちます。LockWorkStation関数は引数を必要としない関数であるため、以下のようにrundll32.exeを実行することで、画面にロックをかけることが可能です。

rundll32.exe user32.dll, LockWorkStation

命令の呼び出し

それでは、攻撃者が実際にどのような手法でrundll32.exeを悪用して、AppLockerなどのソフトウェア実行制限を回避するかを示します。

単純な呼び出し

もっとも単純な例として、悪意のある関数を実装したDLLからそのまま関数を呼び出す手法を示します。

まずはMetasploitの一部であるmsfvenomを用いて、電卓を起動するDLLを作成します。Kali LinuxなどのMetasploitがインストールされているマシンで以下のコマンドを実行します。以下のコマンドでは、電卓を起動する機能を持ったDLLの名前をupcalc.dllとして出力しています。

msfvenom -p windows/exec CMD=calc.exe -a x86 --platform windows -f dll > upcalc.dll

実行例を以下の図に示します。

f:id:binary-pulsar:20181104223939p:plain

DLLを作成したら、Windowsマシンに作成したDLLを配置します。msfvenomにより作成されたDLLは、エントリポイントに機能が実装されているため、以下の書式でrundll32.exeを実行することで電卓を起動することが可能です。

rundll32.exe C:\Users\testuser\Desktop\upcalc.dll, EntryPoint

実行例を以下の図に示します。

f:id:binary-pulsar:20181104224016p:plain

shell32.dllを経由した呼び出し

DLLを直接呼び出すほかにも、Windowsに標準実装されているDLLに実装されている関数を経由して、攻撃者が作成したDLLを呼び出す手法があります。例えば、shell32.dllというWindows標準のDLLには、Control_RunDLLという関数が実装されており、この関数の引数に攻撃者が作成したDLLを設定することで、対象のDLLをエントリポイントから実行させることが可能です。先ほどの例に挙げたupcalc.dllを用いると、以下のようにrundll32.exeを実行することで電卓を起動することが可能です。

rundll32.exe shell32.dll,Control_RunDLL C:\Users\testuser\Desktop\upcalc.dll

実行例を以下の図に示します。

f:id:binary-pulsar:20181104224038p:plain

JavaScriptを経由した呼び出し

rundll32.exeでは、Internet ExplorerのDLLの一つであるmshtml.dllを経由してJavaScriptを実行することが可能です。mshtml.dllにはInternet Explorerの中心となる機能が実装されており、HTMLとCSS構文解析や表示に用いられます。攻撃者はmshtml.dllのRunHTMLApplicationを用いることで、任意のJavaScriptを実行することでプログラムの実行を試みます。

例えば、Windowsマシンでcmd.exeを起動して以下のコマンドを実行します。

rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";alert('Hack!');

JavaScriptのalert関数が実行され、ポップアップが上がるでしょう。実行例を以下の図に示します。

f:id:binary-pulsar:20181104224054p:plain

mshtml.dllはInternet ExplorerのDLLであるため、こうして実行されたJavaScriptからInternet Explorerで利用可能なオブジェクトを呼び出すことが可能です。よって、ActiveXObjectでWscript.shellのRunメソッドを呼び出せば、任意のファイルを実行することが可能です。例えば、以下のようにrundll32.exe実行することで、電卓を起動することが可能です。

rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";document.write();new%20ActiveXObject("WScript.Shell").Run("calc.exe")

実行例を以下の図に示します。

f:id:binary-pulsar:20181104224116p:plain

まとめ

本記事では、実行可能なファイルが制限された環境下で、攻撃者が実行制限を回避してファイルを実行する手法の一部を解説しました。AppLockerなどにより実行制限をかけた環境でも、何かしらの手法で制限を突破して悪意のある命令が実行されてしまうと考えて、セキュリティ対策したほうが良いでしょう。