Blog >> Apache >> PHP.

PHP 웹서버가 명령 실행(sh, bash 등)이나 파일 다운로드 도구를 실행한 흔적 조회 150 150 phobe

PHP 웹서버가 명령 실행(sh, bash 등)이나 파일 다운로드 도구를 실행한 흔적 조회

1. 실시간 동작 프로세스 점검

# PHP 혹은 웹서버 계정에서 비정상적으로 쉘이나 다운로드 도구가 실행 중인지 확인
ps -u phobe -f --forest
# 검증 기준: Apache(httpd/apache2) 또는 php-fpm 프로세스 하위 자식 노드로 sh, bash, curl, wget, nc 등이 매달려 있지 않은지 확인

# 의심 프로세스 패턴 즉시 검색
pgrep -a -u phobe -f "sh|bash|curl|wget|python|perl|nc|busybox"

2. auditd 감사 로그 조회 (phobe 계정 기준)

# phobe 계정의 UID 확인
id -u phobe

# 해당 UID의 최근 명령어 실행 로그 검색
ausearch -m EXECVE -ua 1000 -ts today

3. 계정 홈 디렉터리 및 히스토리 점검

# 홈 디렉터리 경로 확인
grep "^phobe:" /etc/passwd | cut -d: -f6

# 히스토리 파일 확인 (홈 디렉터리가 /home/phobe인 경우)
cat /home/phobe/.bash_history
cat /home/phobe/.sh_history

4. 다운로드 흔적(임시 경로) 및 네트워크 연결 점검

# phobe 소유로 최근 24시간 내 생성된 임시 파일 검색
find /tmp /var/tmp /dev/shm -user phobe -mtime -1 -ls
# 검증 기준: 알 수 없는 스크립트(.sh, .php), ELF 바이너리 파일이 발견되지 않아야 한다.

# 외부 아웃바운드 연결 확인
ss -tupn | grep "phobe"
#검증 기준: 웹 서비스 기본 포트(80, 443) 수신 외에 외부 IP의 임의 포트로 연결된 세션(ESTAB)이 없는지 확인.

5. Apache 액세스 로그에서 의심 패턴 역추적

# 명령어 실행 프로그램이나 다운로드 도구가 호출되었을 가능성이 높은 URI 요청을 필터링
grep -E -i "(wget|curl|chmod|bash|/bin/sh|cmd=|exec|passthru|system)" /var/log/httpd/*access_log


현재 서버에 execve 실행 기록 감사 규칙이 켜져 있는지 확인
1. Fail2ban으로 자동 차단 (가장 추천)
2. 악성 User-Agent 및 경로 차단 (Apache 설정)
두개 작업하지?

/var/log/httpd/default-ssl-access_log:212.18.114.31 – – [23/Oct/2026:00:54:53 +0900] “POST /cgi-bin/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/bin/sh HTTP/1.1″ 400 3268 164 “-” “libredtail-http” 와 같은 로그 처리 – 이미 400 Bad Request로 막아내고 있지만, 원천 차단 하거나 줄일 계획.
2가지 처리

  • userdir.conf 파일에 해당 차단 규칙을 추가
# ===================================================
# 악성 봇 및 시스템 명령어/쉘 실행 시도 차단
# ===================================================
<IfModule mod_rewrite.c>
    RewriteEngine On

    # 1. 알려진 스캐너 봇 차단 (대소문자 무시)
    RewriteCond %{HTTP_USER_AGENT} (libredtail|sqlmap|nikto|nmap|masscan) [NC]
    RewriteRule ^ - [F,L]

    # 2. cgi-bin 경로 차단
    RewriteRule ^cgi-bin(/.*)?$ - [F,L]

    # 3. 쉘 및 명령어 실행 경로 정밀 차단
    # 예: /bin/sh, /bin/bash, .sh 파일 직접 호출, curl/wget 호출 시도
    RewriteCond %{THE_REQUEST} (bin/sh|bin/bash|\.sh\b|curl\s|wget\s) [NC]
    RewriteRule ^ - [F,L]
</IfModule>

httpd.conf 또는 해당 설정 파일 수정.

# ScriptAlias 주석 처리
<IfModule alias_module>
  .....
  # [보안 조치] 미사용 cgi-bin 경로 비활성화
  #ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
  .....
</IfModule alias_module>

# 혹은 ScriptAlias만 처리할때 <IfModule alias_module> 지시어 몽땅 주석 처리.
# 그리고 <Directory "/var/www/cgi-bin"> 블록도 함께 주석 처리
# [보안 조치] 미사용 cgi-bin 디렉터리 접근 권한 제거
#<Directory "/var/www/cgi-bin">
#    AllowOverride None
#    Options None
#    Require all granted
#</Directory>

설정 구문에 오타나 충돌이 없는지 검사한 후 리로드

apachectl configtest
systemctl reload httpd
  • Fail2ban 연동
# /etc/fail2ban/filter.d/apache-scan-block.local 필터 생성
[Definition]
# cgi-bin, 쉘(/bin/sh, /bin/bash, .sh), 다운로드 도구(curl, wget), 악성 스캐너 봇 감지
failregex = ^<HOST> -.*"(POST|GET) .*(/cgi-bin|bin/sh|bin/bash|\.sh|curl|wget).*" (400|403)
            ^<HOST> -.*"libredtail.*" (400|403)
ignoreregex =

# Jail 설정 (/etc/fail2ban/jail.local)
[apache-scan-block]
enabled  = true
port     = http,https
filter   = apache-scan-block
logpath  = /var/log/httpd/*access_log
maxretry = 1
bantime  = 86400
findtime = 600

필터 정규표현식 테스트 (로그 매칭 검증)

fail2ban-regex /var/log/httpd/default-ssl-access_log /etc/fail2ban/filter.d/apache-scan-block.local
# 실행 결과 끝부분에 Matched: [숫자]가 1 이상 나오면 정규표현식이 완벽히 동작하는 상태

Fail2ban 재시작 및 상태 확인

# 서비스 재시작
systemctl restart fail2ban

# 감시 활성화 상태 확인
fail2ban-client status apache-scan-block