
x86_64/x86 Linuxシステム上でELFオブジェクトを完全にメモリ内で読み込み・実行し、実行時にlibcシンボルを解決することで、ステルス性の高いポストエクスプロイテーションコマンド実行を実現します。
これは、ELFオブジェクトをメモリ内でロード/実行するローダー/ランナーです。目的は、すべてのx86_64およびx86のUnix系オペレーティングシステムで後続の機能を実行するために使用できる、単一のelfローダーを作成することです。
このローダーの動作は、コンパイルされたOS向けにELFオブジェクトを構築・ロードするために必要なコードをすべて保持していることです。ELFファイルでないもの、正しいアーキテクチャ用でないもの、または解決できないシンボルにリンクしているものが送信されると、実行を試みずに終了します。
COFFLoaderとこのローダーの主な違いは、使用するすべての関数を再定義する代わりに、OSのlibcの標準定義を使用することです。
.
├── includes
│ ├── beacon_api.h
│ ├── beacon_compatibility.h
│ ├── debug.h
│ ├── ELFLoader.h
│ └── minimal_elf.h
├── Makefile
├── README.md
├── SA
│ └── src
│ ├── cat.c
│ ├── chmod.c
│ ├── env.c
│ ├── find.c
│ ├── grep.c
│ ├── id.c
│ ├── ifconfig.c
│ ├── pwd.c
│ ├── tasklist.c
│ ├── uname.c
│ ├── walk.c
│ └── whoami.c
├── Scripts
│ └── beacon_generate.py
├── src
│ ├── beacon_compatibility.c
│ └── ELFLoader.c
└── testobjects
├── getuid.c
├── test2.c
├── test2_duplicatetext.c
└── test.c
6 directories, 26 files
見つかったファイルをcatするための引数を生成します。find /etc/ -iname *release -exec cat {} \; または cat /etc/*release* の置き換えです。
Beacon>reset
Beacon>addString /etc
Beacon>addString release
Beacon>addString
Beacon>addint 1
Beacon>addint 1
Beacon>addint 1
Beacon>generate
b'26000000050000002f657463000800000072656c65617365000100000000010000000100000001000000'
./ELFLoader.out ./SA/src/find.o 26000000050000002f657463000800000072656c65617365000100000000010000000100000001000000
/proc内でrwxメモリパーミッションを持つすべてのファイルを一覧表示するための引数を生成します。
Beacon>reset
Beacon>addString /proc
Beacon>addString rwx
Beacon>addString maps
Beacon>addint 1
Beacon>addint 0
Beacon>addint 0
Beacon>generate
b'27000000060000002f70726f63000400000072777800050000006d61707300010000000000000000000000'
./ELFLoader.out ./SA/src/grep.o 27000000060000002f70726f63000400000072777800050000006d61707300010000000000000000000000
chmod 777 /tmp/test.sh の引数を生成します。
Beacon>reset
Beacon>addString 777
Beacon>addString /tmp/test.sh
Beacon>generate
b'1900000004000000373737000d0000002f746d702f746573742e736800'
./ELFLoader.out ./SA/src/chmod.o 1900000004000000373737000d0000002f746d702f746573742e736800
これは引数を取らない一般的な例です。
./ELFLoader.out SA/src/uname.o
make x86_64so
make x86_64runner
LD_LIBRARY_PATH=. ./runner.out ./SA/src/env.o