yeonghoon.kim

  • 게시판
  • 갤러리
  • aws

BPFDoor 악성코드 통합 점검 스크립트 (KISA 가이드 기반)

김영훈 2025.05.16 17:19 조회 수 : 34

#!/bin/bash

# BPFDoor 악성코드 통합 점검 스크립트 (KISA 가이드 기반)

# 반드시 root 권한으로 실행하세요.

 

# 컬러 정의

RED=$(tput setaf 1)

GREEN=$(tput setaf 2)

YELLOW=$(tput setaf 3)

BLUE=$(tput setaf 4)

BOLD=$(tput bold)

RESET=$(tput sgr0)


 

# 0. 구분선 함수

line_add() {

    printf "\n${BLUE}================================================================${RESET}\n\n"

}

 

# 1. 뮤텍스/락(Mutex/Lock) 파일 점검

check_bpfdoor_mutex_lock_files() {

    echo "[*] BPFDoor 악성코드 뮤텍스/락(Mutex/Lock) 파일 점검 시작"

    local suspicious_files=()

    for file in /var/run/*.pid /var/run/*.lock; do

        [ -e "$file" ] || continue

        if [ "$(stat -c "%a %s" "$file" 2>/dev/null)" = "644 0" ]; then

            suspicious_files+=("$file")

        fi

    done

    if [ "${#suspicious_files[@]}" -eq 0 ]; then

        echo "[+] 이상 없음: BPFDoor 의심 뮤텍스/락 파일이 발견되지 않았습니다."

    else

        echo "[!] 의심 파일 발견:"

        for file in "${suspicious_files[@]}"; do

            ls -l "$file"

        done

        echo "※ 추가 점검 필요: 해당 파일이 BPFDoor 악성코드의 흔적일 수 있으니, 다른 점검 항목도 반드시 확인하세요."

    fi

    echo "[*] 점검 종료"

}

 

# 2. 자동 실행 파일 점검

check_bpfdoor_autorun_files() {

    echo "[*] BPFDoor 악성코드 자동 실행 파일 점검 시작"

    local suspicious_lines=()

    for file in /etc/sysconfig/*; do

        [ -f "$file" ] || continue

        while IFS= read -r line; do

            if [[ "$line" =~ \[\ *-f\ +/[^]]+\]\ *&&\ */ ]]; then

                suspicious_lines+=("$file: $line")

            fi

        done < "$file"

    done

    if [ "${#suspicious_lines[@]}" -eq 0 ]; then

        echo "[+] 이상 없음: BPFDoor 의심 자동 실행 구문이 발견되지 않았습니다."

    else

        echo "[!] 의심 자동 실행 구문 발견:"

        for entry in "${suspicious_lines[@]}"; do

            echo "$entry"

        done

        echo "※ 추가 점검 필요: 해당 구문이 BPFDoor 악성코드의 흔적일 수 있으니, 파일 경로와 실행 파일을 반드시 확인하세요."

    fi

    echo "[*] 점검 종료"

}

 

# 3. BPF(Berkeley Packet Filter) 점검

check_bpfdoor_bpf() {

    echo "[*] BPFDoor 악성코드 BPF(Berkeley Packet Filter) 점검 시작"

    local pids

    pids=$(ss -0pb 2>/dev/null | grep -oP 'pid=\K[0-9]+' | sort -u)

    if [ -z "$pids" ]; then

        echo "[+] 이상 없음: 현재 BPF 필터를 사용하는 프로세스가 감지되지 않았습니다."

    else

        echo "[!] BPF 필터 사용 프로세스 발견:"

        for pid in $pids; do

            if [ -e "/proc/$pid" ]; then

                exe_path=$(readlink -f /proc/$pid/exe 2>/dev/null)

                proc_name=$(cat /proc/$pid/comm 2>/dev/null)

                echo " - 프로세스명: ${proc_name:-Unknown}, PID: $pid, 실행파일: ${exe_path:-Not found}"

            fi

        done

        echo "※ 추가 점검 필요: 위 프로세스가 BPFDoor 악성코드와 연관된 것인지 확인하세요."

    fi

    echo "[*] BPFDoor 악성 BPF 매직 넘버 탐지"

    local suspicious_bpf

    suspicious_bpf=$(ss -0pb 2>/dev/null | grep -E "21139|29269|960051513|36204|40783")

    if [ -n "$suspicious_bpf" ]; then

        echo "[!] 의심스러운 BPF 매직 넘버 감지:"

        echo "$suspicious_bpf"

        echo "※ 위 내용이 존재하면 BPFDoor 감염 가능성이 높으니, 해당 프로세스와 실행 파일을 반드시 추가 점검하세요."

    else

        echo "[+] 이상 없음: BPFDoor 관련 의심 BPF 매직 넘버가 발견되지 않았습니다."

    fi

    echo "[*] 점검 종료"

}

 

# 4-1. lsof 기반 RAW 소켓 점검

check_bpfdoor_raw_socket_lsof() {

    echo "[*] BPFDoor 악성코드 RAW 소켓(lsof) 점검 시작"

    local pids

    pids=$(lsof 2>/dev/null | grep -E "IP type=SOCK_RAW|IP type=SOCK_DGRAM" | awk '{print $2}' | sort -u)

    if [ -z "$pids" ]; then

        echo "[+] 이상 없음: RAW/DGRAM 소켓을 사용하는 의심 프로세스가 발견되지 않았습니다."

    else

        echo "[!] RAW/DGRAM 소켓 사용 프로세스 발견:"

        for pid in $pids; do

            ps -fp "$pid"

            if [ -e "/proc/$pid/exe" ]; then

                exe_path=$(readlink -f /proc/$pid/exe 2>/dev/null)

                echo " -> 실행 파일: ${exe_path:-Not found}"

            fi

            echo ""

        done

        echo "※ 추가 점검 필요: 위 프로세스가 BPFDoor 악성코드와 연관된 것인지 확인하세요."

        echo "  (정상 시스템 서비스도 RAW/DGRAM 소켓을 사용할 수 있으므로, 반드시 문자열/YARA 등 추가 점검을 병행해야 합니다.)"

    fi

    echo "[*] 점검 종료"

}

 

# 4-3. ss 명령어 기반 RAW 소켓 점검

check_bpfdoor_raw_socket_ss() {

    echo "[*] BPFDoor 악성코드 RAW 소켓(ss) 점검 시작"

    local ss_lines

    ss_lines=$(ss -apn 2>/dev/null | grep -E ":1 |:6 |:17 ")

    if [ -z "$ss_lines" ]; then

        echo "[+] 이상 없음: ss로 포트 1, 6, 17을 사용하는 프로세스가 발견되지 않았습니다."

    else

        echo "[!] ss 결과, 포트 1, 6, 17 사용 프로세스 발견:"

        echo "$ss_lines"

        echo "$ss_lines" | grep -oP 'pid=\K[0-9]+' | sort -u | while read pid; do

            if [ -n "$pid" ] && [ -e "/proc/$pid/exe" ]; then

                exe_path=$(readlink -f /proc/$pid/exe 2>/dev/null)

                proc_name=$(cat /proc/$pid/comm 2>/dev/null)

                echo "   → 프로세스명: ${proc_name:-Unknown}, PID: $pid, 실행 파일: ${exe_path:-Not found}"

            fi

        done

        echo "  ※ 포트 1, 6, 17은 일반적으로 사용되지 않으므로, 위 프로세스가 BPFDoor와 연관된 것인지 반드시 확인하세요."

    fi

    echo "[*] 점검 종료"

}

 

# 5. 프로세스 환경변수 점검

check_bpfdoor_env_vars() {

    echo "[*] BPFDoor 악성코드 환경변수 사용 프로세스 점검 시작"

    echo "    (점검 대상 환경변수: HOME=/tmp, HISTFILE=/dev/null, MYSQL_HISTFILE=/dev/null)"

    local suspicious_pids=()

    for pid in $(ls /proc/ | grep -E '^[0-9]+$'); do

        if [ -r "/proc/$pid/environ" ]; then

            env_data=$(tr '\0' '\n' < "/proc/$pid/environ")

            if echo "$env_data" | grep -q "HOME=/tmp" &&

               echo "$env_data" | grep -q "HISTFILE=/dev/null" &&

               echo "$env_data" | grep -q "MYSQL_HISTFILE=/dev/null"; then

                suspicious_pids+=("$pid")

            fi

        fi

    done

    if [ "${#suspicious_pids[@]}" -eq 0 ]; then

        echo "[+] 이상 없음: BPFDoor 의심 환경변수를 사용하는 프로세스가 발견되지 않았습니다."

    else

        echo "[!] 의심 환경변수 사용 프로세스 발견:"

        for pid in "${suspicious_pids[@]}"; do

            ps -p "$pid" -o user=,pid=,ppid=,cmd=

            if [ -e "/proc/$pid/exe" ]; then

                exe_path=$(readlink -f "/proc/$pid/exe" 2>/dev/null)

                echo "   → 실행 파일: ${exe_path:-Not found}"

            fi

            echo ""

        done

        echo "※ 추가 점검 필요: 위 프로세스가 BPFDoor 악성코드와 연관된 것인지 문자열, YARA 등으로 2차 확인하세요."

    fi

    echo "[*] 점검 종료"

}

 

# 6. 특정 포트 및 네트워크 패킷 점검

check_bpfdoor_ports_and_packets() {

    echo "[*] BPFDoor 악성코드 특정 포트 사용 점검 시작"

    echo "    (대상 포트: 42391~43390, 8000)"

    local suspicious_lines

    suspicious_lines=$(netstat -tulpn 2>/dev/null | awk '{match($0, /:([0-9]+)/, a); if ((a[1] >= 42391 && a[1] <= 43390) || $0 ~ /:8000([^0-9]|$)/) print $0}')

    if [ -z "$suspicious_lines" ]; then

        echo "  [✓] 42391~43390, 8000번 포트를 LISTEN 중인 프로세스가 없습니다."

    else

        echo "  [!] 다음 포트가 열려 있습니다 (정상 서비스인지 반드시 확인 필요):"

        echo "$suspicious_lines"

        echo "$suspicious_lines" | grep -oP '[0-9]+/(?=[^ ]+$)' | grep -oP '^[0-9]+' | sort -u | while read pid; do

            if [ -n "$pid" ] && [ -e "/proc/$pid/exe" ]; then

                exe_path=$(readlink -f "/proc/$pid/exe" 2>/dev/null)

                proc_name=$(cat /proc/$pid/comm 2>/dev/null)

                echo "    → 프로세스명: ${proc_name:-Unknown}, PID: $pid, 실행 파일: ${exe_path:-Not found}"

            fi

        done

        echo "  ※ 정상 서비스가 아니라면, 문자열/YARA 등 추가 점검을 반드시 하세요."

    fi

    echo "────────────────────────────────────────────"

    echo "[*] BPFDoor 악성코드 네트워크 패킷 점검 안내"

    echo "  - BPFDoor는 매직패킷(특정 페이로드, 시퀀스, 마커 등)을 이용해 C2 통신을 시도합니다."

    echo "  - 네트워크 장비(방화벽, IDS/IPS, 패킷 캡처 등)에서 아래 패턴을 탐지하세요:"

    echo "    • 페이로드 내 매직 시퀀스(16진수/10진수):"

    echo "      - UDP, ICMP: 0x7255(29269), 0x9F4F"

    echo "      - TCP: 0x5293(21139), 0x39393939(960051513), 0x8D6C"

    echo "    • HTTP POST Request-URI 내 마커: '9999' 등"

    echo "    • 페이로드 BODY의 Base16 디코딩 값 등"

    echo "  - 의심 패킷 발견 시, 패킷 전문을 분석하여 BPFDoor 특유의 시퀀스/비밀번호/마커 존재 여부를 확인하세요."

    echo "  - 패킷 탐지 예시: (Wireshark, tcpdump, 방화벽/IPS 로그 등 활용)"

    echo "    ※ 패턴은 공격자에 따라 변경될 수 있으므로, 오탐/누락에 주의하세요."

    echo "[*] 점검 종료"

}

 

# 7. 실행중인 프로세스명 점검

check_bpfdoor_process_names() {

    echo "[*] BPFDoor 악성코드 위장 프로세스명 점검 시작"

    local suspicious_names='/usr/sbin/abrtd|/sbin/udevd|cmathreshd|/sbin/sgaSolAgent|/usr/sbin/atd|pickup'

    local suspicious_found=0

    ps -ef | grep -E "$suspicious_names" | grep -v grep | while read -r line; do

        pid=$(echo "$line" | awk '{print $2}')

        cmd=$(echo "$line" | awk '{for(i=8;i<=NF;++i)printf $i" "; print ""}')

        echo "  [!] 의심 프로세스 발견: $line"

        if [ -e "/proc/$pid/exe" ]; then

            exe_path=$(readlink -f "/proc/$pid/exe" 2>/dev/null)

            pname=$(basename "$cmd" | awk '{print $1}')

            exename=$(basename "$exe_path")

            echo "     → 실행 파일 경로: $exe_path"

            if [ "$pname" = "$exename" ]; then

                echo "     → [✓] 프로세스명과 실행 파일명이 일치 (정상 가능성 높음)"

            else

                echo "     → [!] 프로세스명과 실행 파일명이 불일치 (비정상/악성 의심)"

            fi

        else

            echo "     → 실행 파일 경로 확인 불가 (프로세스가 종료되었거나 메모리 상에서만 동작)"

        fi

        suspicious_found=1

        echo ""

    done

    if [ "$suspicious_found" -eq 0 ]; then

        echo "[+] 이상 없음: BPFDoor 의심 위장 프로세스명이 실행 중이지 않습니다."

    else

        echo "※ 위 결과에서 [!] 표시된 프로세스는 악성코드일 가능성이 있으니, 반드시 문자열 기반 점검(8), YARA 룰(9) 등으로 추가 분석하세요."

    fi

    echo "[*] 점검 종료"

}

 

# 8. 문자열 기반 초동 점검

check_bpfdoor_strings_scan() {

    local scan_dir="$1"

    echo "[*] BPFDoor 악성코드 문자열 기반 초동 점검 시작"

    echo "    (대상 디렉터리: $scan_dir)"

    echo "    (대상 파일: 15KB~4MB, 바이너리 파일 권장)"

    local pattern='MYSQL_HISTFILE=/dev/null|:h:d:l:s:b:t:|:f:wiunomc|:f:x:wiuoc|ttcompat'

    find "$scan_dir" -maxdepth 1 -type f -size +15k -size -4M 2>/dev/null | while read -r file; do

        if strings -a -n 5 "$file" | grep -Eq "$pattern"; then

            echo "  [!] 의심 문자열 발견: $file"

            strings -a -n 5 "$file" | grep -E "$pattern" | sed "s|^|    → |"

            echo "    ※ 반드시 YARA 룰 등으로 2차 정밀 점검을 하세요."

            echo ""

        fi

    done

    echo "[*] 점검 종료"

}

 

# 9. YARA Rule 기반 점검

check_bpfdoor_yara_scan() {

    local yara_rule_path="$1"

    local scan_dir="$2"

    echo "[*] BPFDoor 악성코드 YARA Rule 기반 점검 시작"

    echo "    (YARA 룰: $yara_rule_path, 대상 디렉터리: $scan_dir)"

    if ! command -v yara >/dev/null 2>&1; then

        echo "  [!] YARA 도구가 설치되어 있지 않습니다. 설치 후 재시도하세요."

        return 1

    fi

    if [ ! -f "$yara_rule_path" ]; then

        echo "  [!] YARA 룰 파일이 존재하지 않습니다: $yara_rule_path"

        return 1

    fi

    find "$scan_dir" -maxdepth 1 -type f -size +15k -size -4M 2>/dev/null | while read -r file; do

        result=$(yara "$yara_rule_path" "$file" 2>/dev/null)

        if [ -n "$result" ]; then

            echo "  [!] BPFDoor 악성코드 탐지: $file"

            echo "      → YARA 결과: $result"

            echo "    ※ 침해 흔적이 확인되면 즉시 보호나라(boho.or.kr)에 침해사고를 신고하세요."

            echo ""

        fi

    done

    echo "[*] 점검 종료"

}

 

main() {

    printf "${BOLD}${BLUE}BPFDoor 악성코드 통합 점검 시작${RESET}\n"

    line_add

 

    check_bpfdoor_mutex_lock_files

    printf "${GREEN}✓ 1. 뮤텍스/락(Mutex/Lock) 파일 점검 완료${RESET}\n"

    line_add

 

    check_bpfdoor_autorun_files

    printf "${GREEN}✓ 2. 자동 실행 파일 점검 완료${RESET}\n"

    line_add

 

    check_bpfdoor_bpf

    printf "${GREEN}✓ 3. BPF(Berkeley Packet Filter) 점검 완료${RESET}\n"

    line_add

 

    check_bpfdoor_raw_socket_lsof

    printf "${GREEN}✓ 4-1. lsof 기반 RAW 소켓 점검 완료${RESET}\n"

    line_add

 

    check_bpfdoor_raw_socket_ss

    printf "${GREEN}✓ 4-3. ss 명령어 기반 RAW 소켓 점검 완료${RESET}\n"

    line_add

 

    check_bpfdoor_env_vars

    printf "${GREEN}✓ 5. 프로세스 환경변수 점검 완료${RESET}\n"

    line_add

 

    check_bpfdoor_ports_and_packets

    printf "${GREEN}✓ 6. 특정 포트 및 네트워크 패킷 점검 완료${RESET}\n"

    line_add

 

    check_bpfdoor_process_names

    printf "${GREEN}✓ 7. 실행중인 프로세스명 점검 완료${RESET}\n"

    line_add

 

    printf "${YELLOW}※ 8. 문자열 기반 초동 점검 및 9. YARA Rule 기반 점검은 아래처럼 직접 경로를 지정해 실행하세요:${RESET}\n"

    printf "   예시: check_bpfdoor_strings_scan /tmp\n"

    printf "   예시: check_bpfdoor_strings_scan /dev/shm\n"

    printf "   예시: check_bpfdoor_yara_scan /path/to/bpfdoor.yar /tmp\n"

    line_add

 

    printf "${BOLD}${GREEN}BPFDoor 통합 점검이 완료되었습니다.${RESET}\n"

}

 

# main 함수 마지막에 호출

main


  • 추천 0

  • 비추천 0
이 게시물을
목록

댓글 0

사진 및 파일 첨부

여기에 파일을 끌어 놓거나 왼쪽의 버튼을 클릭하세요.

파일 용량 제한 : 0MB (허용 확장자 : *.*)

업로드 중... (0%)

0개 첨부 됨 ( / )
 
번호 제목 글쓴이 날짜 조회 수
공지 2025 일본 여행 계획 김영훈 2024.10.10 972
공지 현금, 저축, 투자, 지출, 예산, 보험 내역(2024-05-30) 김영훈 2024.03.10 629
» BPFDoor 악성코드 통합 점검 스크립트 (KISA 가이드 기반) 김영훈 2025.05.16 34
264 error: invalid conversion from ‘char’ to ‘char*’ [-fpermissive] 김영훈 2025.05.08 54
263 prometheus, grafana, node-exporter 임시 김영훈 2025.01.03 292
262 MegaCli64 Hotspare 구성 김영훈 2024.11.11 513
261 12월 기타큐슈 2박 3일 관련 김영훈 2024.11.08 437
260 rockylinux8 php7.2 -> php7.4 업그레이드 : dnf module 기능 이용 김영훈 2024.10.14 585
259 rockylinux8 apache-2.4.16, php-5.3.29 설치 file 김영훈 2024.10.11 607
258 정보보안기사 오답노트 김영훈 2024.10.01 429
257 달력 이미지(chatgpt) file 김영훈 2024.09.05 635
256 백업된 디스크 복구 김영훈 2024.06.13 541
255 openai api를 이용한 챗봇 구현 샘플 김영훈 2024.06.11 555
254 Dev-C++ 5.11 설치 매뉴얼 file 김영훈 2024.03.09 855
253 오라클 클라우드 arm 환경에서 Palworld 서버 구축 [11] 김영훈 2024.01.29 1500
252 리눅스 공인 아이피 확인 - curl ipinfo.io 김영훈 2024.01.29 556
251 Oracle 9i cx_Oracle 클라이언트 연결 방법 [1] 김영훈 2024.01.12 651
250 error: rpmdb: BDB2034 unable to allocate memory for mutex; resize mutex region [1] 김영훈 2024.01.08 704
249 마크다운 TIL 템플릿 김영훈 2024.01.03 560
248 Stable Diffusion 설치 - rockylinux9 [테스트 - 나 / 정리 -chatgpt] [1] 김영훈 2024.01.02 731
247 AttributeError: module 'tarfile' has no attribute 'data_filter' 에러 김영훈 2024.01.02 718
246 2023년 월간 소비 비중 file 김영훈 2024.01.01 358
쓰기 태그
 첫 페이지 1 2 3 4 5 6 7 8 9 10 끝 페이지