
Apache/nginx 로그에서 웹셸 상호작용, 익스플로잇 패턴, 무차별 대입 공격 폭주를 분석하는 무료 접근 로그 침해 분석기 - 심각도, 신뢰도, 해결 방안 제공. 읽기 전용.
웹 서버 로그에는 이미 공격을 받았는지 여부가 기록되어 있습니다. weblogchecker가 그 로그를 읽습니다.
phpscan은 PHP가 노출되어 있는지 알려줍니다. phpscan hunt는 웹루트에서 셸을 검색합니다. weblogchecker는 세 번째 질문 — 실제로 누군가 그것들을 사용했는가? — 에 답합니다. 대부분의 사이트가 이미 보유하고 있지만 아무도 읽지 않는 단 하나의 기록, 즉 액세스 로그를 통해 말입니다.
이 도구는 당신이 소유한 Apache 및 nginx 액세스 로그를 스트리밍하며, 중요한 상호작용 — 요청에 응답하는 웹셸, 리다이렉트로 끝나는 브루트포스 폭주, 200 응답을 받은 익스플로잇 패턴 — 을 찾아내고, 각각을 심각도, 신뢰도, 증거로서의 실제 로그 라인, 그리고 대응 방법과 함께 보고합니다.
weblogchecker analyze /var/log/apache2/access.log
종료 코드: 0 = 지표 없음, 1 = 지표 발견, 2 = 사용법 오류.
기계 판독 가능한 출력을 위해 --format json을, 기간을 제한하려면
--since 2026-10-01을 추가하세요. .gz 로그는 직접 읽으며, -는 stdin을 읽습니다.
0.2.0의 새로운 기능 — 베이스라인 diff. 시그니처 목록은 이미 이름이 붙은 셸만 알고 있습니다. 당신의 사이트에 침투하는 셸은 무작위 이름을 가집니다. weblogchecker에 같은 사이트의 신뢰할 수 있는 과거 로그를 제공하면 이전에는 없었던 실행 파일을 보고합니다:
weblogchecker analyze access.log --baseline access.log.last-month
처음 등장하는 모든 실행 가능 경로(.php, .phtml, .cgi, .asp, .jsp…)는 로그만으로 다섯 가지 약한 신호 — 2xx/3xx 응답, POST/PUT 사용, 리퍼러 없음, 최대 2개 IP에서만 접근, upload/cache/temp 디렉터리 하위 위치 — 를 기준으로 점수가 매겨지며, 신호, 횟수, 로그 라인을 증거로 삼아 NEW로 보고됩니다. 최초 발견만으로는 낮은 심각도의 참고 사항일 뿐이며, 심각도는 신호가 누적될 때만 올라가므로(자세한 내용은 아래 참조) 지난주에 설치한 플러그인이 사건으로 읽히지 않습니다.
PyPI에서 한 줄로 설치합니다(파이썬 3.11 이상, 표준 라이브러리만 사용 — 의존성 없음):
pip install weblogchecker
첫 PyPI 릴리스 대기 중. PyPI 신뢰할 수 있는 게시자가 구성될 때까지, GitHub에서 동일한 코드를 설치하세요:
pip install git+https://github.com/PHPatch/weblogchecker.git(또는 아래의 서명된 릴리스 tarball을 다운로드하세요). 위의pip install weblogchecker줄은 첫 PyPI 릴리스가 나오는 즉시 작동합니다.
"externally-managed-environment" 오류로 거부하는 시스템 (Debian/Ubuntu 및 Homebrew Python)에서는 대신 pipx를 사용하세요:
python3 -m pip install --user pipx # if you don't have pipx yet
pipx install weblogchecker
서명된 릴리스(sdist + wheel + PGP 서명 + SBOM)는
GitHub releases 페이지에 있습니다.
pgp-key.asc의 키로 서명을 검증하세요 — 지문은
BAA1 586A AD37 18C0 CE41 D288 FE23 A624 54E3 5307입니다. SECURITY.md를 참조하세요.
| 로그에서의 패턴 | 심각도 / 신뢰도 | 중요한 이유 |
|---|---|---|
| 2xx로 응답하는 알려진 웹셸(c99, r57, FilesMan, b374k, WSO) | 높음 / 높음 | 셸이 존재하며 요청을 처리했다 |
| 동일한 이름으로 프로브되었으나 404/403 | 낮음 / 낮음 | 누군가 찾아봤으나 아무것도 발견되지 않음 — 경보가 아닌 맥락 |
응답하는 eval-stdin.php (phpunit) | 높음 / 높음 | 2026년 10월 php2shell 파동의 UnitTest 셸이 POST된 코드를 실행한다 |
/uploads/, /media/, /files/… 내부의 실행 파일(.php 등)이 응답, 특히 POST | 높음 / 높음 | 업로드 디렉터리는 절대 코드를 실행해서는 안 된다 |
| 정적 파일(.jpg, .css…)에 대한 POST/PUT이 2xx로 응답 | 높음 / 중간 | 브라우저는 이미지에 POST하지 않는다; "이미지"는 종종 스크립트다 |
URI 내 익스플로잇 패턴(트래버설, eval(, php://, 긴 base64 토큰)이 2xx로 응답 | 높음 / 중간 | 시도가 성공했을 수 있다 |
| 동일한 패턴이 차단됨 / 404 | 낮음 / 낮음 | 배경 잡음; 캠페인 맥락으로만 유용 |
| wp-login.php / xmlrpc.php에 대한 브루트포스 폭주(10분당 ≥20 POST) | 중간 / 중간 | 단일 IP, 비인간적 속도 |
| 반복된 실패 후 해당 폭주 내의 302 | 높음 / 중간 | 올바른 비밀번호의 형태 — 계정 탈취 가능성 |
| 스캐너 사용자 에이전트(sqlmap, nuclei, nikto…) | 낮음 / 낮음 | 정보성; 스캔은 침해가 아니다 |
--baseline 로그에 없던 실행 파일 경로가 요청에 응답 | 낮음 → 높음 / ≤ 중간 | 어떤 블록리스트도 모르는 이름 없는 셸; 심각도는 POST, 리퍼러 누락, 적은 IP 수, 업로드 디렉터리와 함께 누적된다 |
모든 발견 클래스에는 대응 조치 텍스트가 포함됩니다: 파일 격리, 자격 증명 교체, 해당 IP가 접촉한 모든 것 검토. 웹셸 발견은 동반 도구인 phpscan hunt (pip install phpscan,
github.com/PHPatch/phpscan)를 가리킵니다 — 이 도구는 이러한 로그 패턴이 가리키는 셸을 웹루트 자체에서 스캔합니다.
이 도구는 phpscan과 동일한 원칙 아래 구축되었습니다:
파싱은 라인 스트리밍 방식이다. 파일은 메모리에 전혀 로드되지 않으며, 집계는 발견 항목당 최대 다섯 개의 증거 라인만 유지한다. 이 프로젝트의 픽스처 생성기(366,306줄, 72 MB의 현실적인 결합 로그)에서 측정한 결과, 적당한 사양의 VM에서 7.6초, 최대 RSS 12.8 MB였다. 2 GB 로그도 동일한 메모리를 사용하며, 시간은 비례하여 늘어난다.
$ weblogchecker analyze access.log
weblogchecker 0.2.0 - access-log compromise analysis
Log: access.log
Lines read: 13 | parsed: 13 | unparseable (skipped): 0
Indicators found. These are leads for investigation, not proof of
compromise: work through the findings in severity order ...
SUMMARY: 10 findings (4 high, 1 medium, 5 low) across 9 incidents, 2 IPs flagged
INCIDENT TIMELINE (grouped by IP + path):
[HIGH] 198.51.100.66 /wp-content/uploads/2026/10/c99.php
classes: webshell-access, exec-in-upload-dir | requests: 6 | ...
...
1. [high severity / high confidence] Known webshell filename answered a request
198.51.100.66 /wp-content/uploads/2026/10/c99.php - 3 request(s), ...
| 198.51.100.66 - - [28/Oct/2026:03:13:40 +0000] "GET /wp-content/..." 200 ...
Remediation: Treat the named file as a live webshell until you have
proven otherwise. Locate it in the webroot and quarantine it ...
hunt)모두 무료이며 모두 오픈 소스이고, 어느 것도 익스플로잇 프로브를 전송하지 않습니다.
MIT — LICENSE를 참조하십시오. 보안 신고: SECURITY.md를 참조하십시오.