> For the complete documentation index, see [llms.txt](https://h08.gitbook.io/undefined/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://h08.gitbook.io/undefined/custom-rule-and-active-response/1./1.3/evalhook.md).

# EvalHook 을 활용한 런타임 웹쉘 감지

## 1. 개요

* 소스코드가 아닌 실제 서버 메모리에서 코드가 실행되는 시점을 포착하기 위해, PHP 내부 컴파일 과정을 가로채는(Hooking) PHP 확장 모듈인 EvalHook을 적용
* `eval`, `assert` 등을 통해 메모리상에서 복호화되어 실행되는 웹쉘의 최종 페이로드를 실행 직전에 탐지하여, 정적 분석을 우회하는 공격을 효과적으로 차단

***

## 2. 룰

### 100503

```xml
<rule id="100503" level="12">
    <decoded_as>evalhook-detect</decoded_as>
    <description>[evalhook] Webshell detected at $(file), patterns: $(pattern)</description>
    <mitre>
        <id>T1105</id>
        <id>T1505</id>
    </mitre>
</rule>
```

***

## 3. 환경설정

### 3.1 Manager

* /var/ossec/etc/decoders/&#x20;

  ```xml
  <decoder name="evalhook-detect">
      <prematch>^evalhook-detect</prematch>
      <regex type="pcre2">^evalhook-detect FILE=([^\s]+)\s+PATTERNS=([a-zA-Z0-9_,]+)</regex>
      <order>file, pattern</order>
  </decoder>
  ```

  * PHP 엔진에서 출력된 분석 로그로부터 웹쉘 의심 파일명과 매칭된 패턴 목록을 정확히 분리

### 3.2 Agent

* PHP 확장 모듈 등록 `php.ini`
  * 컴파일된 `evalhook.so` 파일을 확장 모듈 디렉터리에 배치하고 설정을 추가하여 PHP 엔진이 시작될 때 런타임 후킹이 활성화되도록 한다

* /var/ossec/etc/ossec.conf/

  ```xml
  <localfile>
    <log_format>syslog</log_format>
    <location>/var/ossec/logs/evalhook_active_response.log</location>
  </localfile>
  ```

  * PHP 엔진의 후킹 결과가 기록되는 로그 파일을 Wazuh Agent가 실시간으로 모니터링하도록 설정

***

## 4. 작동 원리

1. 런타임 후킹

* PHP 서비스가 시작될 때 `zend_compile_string` 함수를 `evalhook_compile_string`으로 교체한다
* 이를 통해 모든 문자열 기반의 코드 실행 요청은 실제 컴파일 전 EvalHook 모듈을 거치게 된다

2. 메모리 내부 페이로드 추출

* 공격자가 `eval(base64_decode(...))`와 같이 난독화된 웹쉘을 실행하면,
* PHP 엔진이 이를 실행하기 위해 평문으로 복호화하는 순간 EvalHook이 해당 페이로드를 가로챈다

3. 시그니처 매칭 및 로그 생성

* 가로챈 코드 내에서 system, shell\_exec, $\_POST 등 정의된 위험 키워드 목록이 존재하는지 검사
* 탐지된 키워드와 파일 경로를 evalhook-detect FILE=... PATTERNS=... 형식으로 로그 파일에 기록

4. Wazuh 분석 및 경보

* Wazuh Agent가 기록된 로그를 읽어 Manager로 전송
* Manager는 전용 디코더를 통해 로그를 해석하고, 룰 100503을 트리거하여 대시보드에 알림

<figure><img src="https://3550524140-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FMQqlpxjtA7kpPBgieO9x%2Fuploads%2Fy467w5OOWNdYnv1kZSbR%2Fimage.png?alt=media&amp;token=5a6a2224-ac88-4637-8f50-b470daf6b743" alt=""><figcaption></figcaption></figure>
