1
0
mirror of https://github.com/nganhkhoa/malware.git synced 2024-06-10 21:32:07 +07:00
mether049-malware/malware-tech_ref_and_memo.md
2020-01-31 00:11:33 +09:00

14 KiB
Raw Blame History

Anti-analysis

Injection/Hollowing

  • 正規プロセス等のアドレス空間にコードを注入することで検知や分析を妨害するTechnique
  • 利用される正規プロセスsvchost.exe,explorer.exe,regsvr32.exe等
  • Heaven's Gateと組み合わせて利用される場合あり

ref:

Dll Injection

Thread Execution Hijacking

  • 正規プロセス,スレッド探索->スレッドのハンドル取得->スレッド停止->メモリ領域確保->悪性コード注入->EIP書き換え->実行
  • e.g. CreateToolhelp32Snapshot,Thread32First,Thread32Next->OpenThread->SuspendThread->VirtualAllocEx->WriteProcessMemory->SetThreadContext->ResumeThread 787cbc8a6d1bc58ea169e51e1ad029a637f22560660cc129ab8a099a745bd50e

Dll Injection Using SetWindowsHookEx(Hook Injection)

  • Hooking:

Hooking is a technique used to intercept function calls.

  • SetWindowsHookEx
  • The first argument is the type of event. The events reflect the range of hook types, and vary from pressing keys on the keyboard (WH_KEYBOARD) to inputs to the mouse (WH_MOUSE), CBT, etc.
  • The second argument is a pointer to the function the malware wants to invoke upon the event execution.
  • The third argument is a module that contains the function.
  • The last argument to this function is the thread with which the hook procedure is to be associated.

Process Hollowing

  • 正規プロセス作成(サスペンド状態)->空洞化->メモリ領域確保->悪性コード注入->エントリポイント設定->実行
  • e.g. CreateProcess->ZwUnmapViewOfSection(NtUnmapViewOfSection)->VirtualAllocEx->WriteProcessMemory->SetThreadContext->ResumeThread
    eae72d803bf67df22526f50fc7ab84d838efb2865c27aef1a61592b1c520d144

APC Injection

  • プロセス,スレッド探索->アラート状態->ハンドル取得->キューに追加
  • e.g. Createtoolhelp32Snapshot,Thread32First,Thread32Next->WaitForMultipleObjectEx->OpenThread->VirtualAllocEx->WriteProcessMemory->QueueUserAPC
  • QueueUserAPC
  • First args: a handle to the target thread
  • Second args: a pointer to the function that the malware wants to run
  • Third args: the parameter that is passed to the function pointer.

f74399cc0be275376dad23151e3d0c2e2a1c966e6db6a695a05ec1a30551c0ad

ATOM BOMBING

to do...

Shell Tray Window Injection

to do...

Shim Injection

to do...

IAT and Inline Hooking

to do...

ALPC Injection

to do...

REFLECTIVE PE Injection

to do...

LOCKPOS

to do...

KERNEL CALLBACK TABLE

to do...

CLIPBRDWNDCLASS

to do...

PROGATE

to do...

EARLY BIRD

to do...

CONSOLE WINDOW CLASS

to do...

TOOLTIP Process Injection

to do...

Persistence

  • Applnit_Dlls
    to do...
  • AppCertDlls
    to do...
  • IFEO
    to do...

Heaven's Gate

  • 0x33セグメントセレクターを使用して32ビットWOW64プロセスで64ビットコードを実行するTechnique
  • x86用ユーザモードデバッガでの追跡が難しい
  • WinDBG等のカーネルモードデバッガでは追跡することができる
  • 名前の由来はVX Heavenに投稿されたから
  • 少なくともtrickbot,locky,emotet等では利用されていた

ref:
Knockin on Heavens Gate Dynamic Processor Mode Switching(2012-09)
The 0x33 Segment Selector (Heavens Gate)

API obfuscation

A Museum of API Obfuscation on Win32

PowerShell Script obfuscation

Case-insensitive

  • コマンドレット名や変数名に大文字,小文字を混ぜる
    • PowerShellでは区別されない
INvOke-eXpReSsiOn

Alias

  • コマンドのエイリアスを用いる
  • エイリアスの確認方法
get-alias # すべてのエイリアスの確認
get-alias iex #iexのエイリアス(Invoke-Expression)の確認
  • よく利用されるエイリアス
iex -> Invoke-Expression
sal -> Set-Alias
  • エイリアスの設定
set-alias <Name> <Value>
sal ping iex

Dot expression and amp expression(Invoke-Expression)

  • 文字列で表現されたコマンドレットを実行
.("get-alias")
&('gal')
iex("GeT-AliAs")

Combining characters

  • 文字や文字列の結合
'i'+'ex'

Backticks

  • コマンドレットや変数にバッククォートを挿入
`i`e`x("`gal `gal")

Split method

  • 文字列の分割
'bob@alice'-split('@') -> bob alice
'bob@alice' -split '@' -split "i" -> bob al ce

Join method

  • リストの結合
"bob","alice" -join "@" -> bob@alice

Concatenation operations

  • 文字列の並べ替えおよび連結
"{1} {0}" -f "Alice","Bob" -> Bob Alice
"{1} {0}" -f "Alice",("{1}{2}{0}" -f "b","B","o") -> Bob Alice

No Space

  • 空白の省略
"bob","alice"-join"@"

Pipe operator

  • パイプによる引数の引き渡し
'Write-host 1' | iex

$ENV variable

  • 環境変数の値を文字列の作成等に利用
.($seLLId[1]+$shEllId[13]+'x') -> .(iex)
&($EnV:cOmSpEc[4,15,25]-JOIN'') -> &(iex)

Encode

  • xor
    • 文字16進数10進数等で指定可能
10-bxor"10"  -> 0
"0xa"-bxor10 -> 0
  • base64
[System.Convert]::FromBase64String("Ym9iYWxpY2UK") -> bobalice
  • zlib
New-Object System.IO.Compression.DeflateStream([iO.mEmoRySTream] [sysTEM.ConVert]::frOMBASE64STrING("Ym9iYWxpY2UK"))
  • unicode
[System.Text.Encoding]::Unicode.GetString($unicodeBytes)

Ascii code

  • 文字などをasciiコードの10進数16進数表記で示す
[string][char[]](0x69,0x65,0x58) -> i e X

Replace method

  • 文字や文字列を置換する
'i e x'-replace ' ','' -> ieX

%(foreach-object)

  • foreach-objectの省略系で%を利用
((0x69, 0x65, 0x58) | %{([char] [int] $_)})-jOIN'' -> ieX

Comment out

  • コメントアウト
<#bobalice#>

ref:
Powershell Static Analysis & Emotet results

Anti-detection

Living Off The Land(LOL)

  • システムに備わっている信頼性の高いツールを悪用する
  • LOLで利用される各種Binary(LOLBin), Script(LOLScript), Library(LOLLib)のドキュメント
    LOLBAS
    GTFOBins(UNIX ver)
  • LOLBinsとしてのの条件

Be a Microsoft-signed file, either native to the OS or downloaded from Microsoft.

UAC bypass

  • Windows Publisherによってデジタル署名されている且つセキュリティ保護されたフォルダに存在するプログラム(Trusted binary)はUACプロンプトを表示せずにそのプログラムまたはそのプログラムを経由して実行されるプログラムを管理者権限で実行させることができる
  • マルウェアはUACなしで自身を管理者権限で実行させたりセキュリティソフトのホワイトリストに自身を追加することができるようになる
  • プログラムのデジタル署名の確認はWindows Sysinternalsのsigcheckと呼ばれるプログラムで確認することができる

ref:

DGA

  • ドメイン生成アルゴリズム
  • 数学的なアルゴリズムを利用して一定間隔ごとに異なる通信先ドメインを生成することにより,ドメイン名での検知を困難にする
  • 43ファミリのDGAに対してseedタイプDGAタイプエントロピーTLD等様々な観点から比較
    A Comprehensive Measurement Study of Domain Generating Malware,USENIX2016

Fast Flux

  • ドメインに対応するIPアドレスを短い期間で切り替えることにより悪意のあるサイト(マルウェア配布c2フィッシング)を維持させる手法
  • IPアドレスにはボットネットが用いられることがある
  • 切り替えは平均5分

ref:
Fast Flux networks: What are they and how do they work?

Shell Backdoor

rootkit

LKM rootkit

  • 動的にカーネルに組み込めるモジュールであるLKM(Loadable Kernel Module)を利用してsys_call_tableの特定のカーネル関数のアドレスを任意の関数のアドレスへと書き換えることで本来とは異なるカーネル関数であるrootkitのカーネル関数等が呼び出せるようになる(システムコールフック)
  • sys_call_tableへのアクセスは特権モードが必要であるためLKMを利用される
  • rootkitの関数内で本来呼び出されるはずの正規のカーネル関数をあえて呼び出すことで正規の処理を行っているように見せかけることができる
  • /proc/modulesからの隠ぺいも可能
  • LKMについて
    • init_module関数...カーネルにロードする際に最初に実行される関数LKM rootkitではsys_calltableを書き換える処理を記載
    • clean_module関数...カーネルからアンロードする際に実行される関数LKM rootkitではsys_call_tableを元に戻す処理を記載
  • LKMのロード
insmod [lkm_name].ko
  • LKMのアンロード
rmmod [lkm_name].ko

ref: