
x86_64/x86 Linux 시스템에서 ELF 객체를 메모리에 완전히 로드하고 실행하며, 런타임에 libc 심볼을 해석하여 은밀한 포스트 익스플로잇 명령 실행을 지원합니다.
이것은 ELF 객체를 메모리에서 로드/실행하는 로더/러너입니다. 목표는 모든 x86_64 및 x86 nix 운영 체제에서 후속 기능을 실행하는 데 사용할 수 있는 단일 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개, 파일 26개
발견된 파일을 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