Blog >> Apache >> PHP.
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 today3. 계정 홈 디렉터리 및 히스토리 점검
# 홈 디렉터리 경로 확인
grep "^phobe:" /etc/passwd | cut -d: -f6
# 히스토리 파일 확인 (홈 디렉터리가 /home/phobe인 경우)
cat /home/phobe/.bash_history
cat /home/phobe/.sh_history4. 다운로드 흔적(임시 경로) 및 네트워크 연결 점검
# 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


