단독으로 운영하는 리눅스 서버에 아파치 웹서버, PHP, MariaDB와 워드프레스를 직접 설치하여 블로그를 운영하는 것은 매우 피곤한 일이다. 게다가 아주 오랫동안 구글 검색엔진에 노출된 나름 알려진(?) 도메인이라면 해커들의 불손한 접근은 일상이다.
php2shell 취약점 (CVE-2026-109618, CVE-2026-109619)
공식적으로는 2026년 10월 21일에 발견된 것으로 되어 있으나 사실상 뭔가 문제가 있을 것이라는 예측은 10여년 전 부터 개발진에서 인지하고 있었다고 한다.
이 두 취약점이 심각한 이유는 PHP를 사용하는 웹서비스는 해커가 취약점 공격에 성공할 경우 무조건 웹서버 대몬이 실행되는 계정의 권한을 탈취하여 운영체제에 접근하여 쉘(Shell) 권한을 획득할 수 있기 때문이다. 이런 취약점을 RCE(Remote Code Execution) 취약점이라고 한다. 사실 쉘(Shell)권한을 해커가 획득한다는 것은 그 서버의 모든 것을 해커가 차지할 수 있다는 것을 의미한다. 서버에게는 사망선고나 마찬가지다.
php2shell 공격을 받다.
취약점 발표 후 3일이 지난 후 php의 업데이트를 하기 전에 아파치 웹서버의 access.log를 보던 중 특이한 User Agent를 발견했다.

User Agent에 “shellflow-php2shell/1.0” 이라는 값이 들어가 있었다. 그리고 동일한 IP에서 같은 시간에 index.php를 호출하는 4개의 POST 접근이 이상하게도 403 Error로 응답된 것이 확인되었다.
이후 해당 IP의 접근은 없었는데 그 이유는 필자가 적용해둔 fail2ban과 ipset 조합의 웹 방화벽에서 403 에러가 4회 이상 연속으로 발생시키는 IP를 차단하도록 해두었기 때문이다.
index.php 접근이 403 에러를 유발한 이유
index.php는 정상적인 접근 시 403 에러가 발생할 이유가 없다. 정교한 침투(APT)를 수행하는 해커는 서버를 먼저 분석하여 웹 서버의 종류와 버전, 정확한 PHP 버전, 메모리 주소 배치(ASLR), 스택/힙 구조를 파악한 뒤 성공 가능성이 높은 셸코드를 조립하여 신중하게 공격한다. 하지만 이번 공격을 수행한 해커는 자동화된 공격도구를 사용해 정교하지 못한 무작위 RCE 공격을 시도했기 때문에 4번 연속 403 에러를 리턴 받았고 필자가 적용한 웹방화벽 정책에 의해 IP가 차단되어 더 이상 공격할 수 없게된 것이다.
아파치 웹서버의 access log를 보면 다음과 같이 403 에러가 발생할 때 응답 데이터의 사이즈가 5K가 넘는 것을 볼 수 있다.
taeho@www:/var/log/apache2$ sudo grep "45.192.213.7" /var/log/apache2/error.log.1*
taeho@www:/var/log/apache2$ sudo grep "45.192.213.7" /var/log/apache2/access.log.1*
/var/log/apache2/access.log.1:45.192.213.7 - - [24/Oct/2026:01:47:36 +0900] "GET / HTTP/1.1" 200 91524 "-" "shellflow-php2shell/1.0"
/var/log/apache2/access.log.1:45.192.213.7 - - [24/Oct/2026:01:47:36 +0900] "POST /index.php HTTP/1.1" 403 5254 "-" "-"
/var/log/apache2/access.log.1:45.192.213.7 - - [24/Oct/2026:01:47:37 +0900] "POST /index.php HTTP/1.1" 403 5254 "-" "-"
/var/log/apache2/access.log.1:45.192.213.7 - - [24/Oct/2026:01:47:38 +0900] "POST /index.php HTTP/1.1" 403 5254 "-" "-"
/var/log/apache2/access.log.1:45.192.213.7 - - [24/Oct/2026:01:47:38 +0900] "POST / HTTP/1.1" 403 5254 "-" "-"
응답 데이터의 사이즈가 5K가 넘는 것은 RCE 공격을 위한 exploit 코드가 Apache 웹서버와 php-fpm을 통과해 워드프레스의 코어 코드까지 접근에 성공했다는 것을 의미한다. 다만 워드프레스 자체에도 최소한의 시큐어코딩은 적용되어 있기 때문에 워드프레스가 코드를 검증하다가 이상한 점을 발견하고 에러를 리턴시켜 403 에러가 응답되는 것이다.
만약 이 상황에서 fail2ban을 활용한 웹방화벽이 적용되어 있지 않았다면 해커는 페이로드를 조금씩 조금씩 수정해서 공격이 성공할 때까지 반복했을 것이다.
fail2ban의 403 차단 로그
4번의 403 에러로 인해 해커의 출발지 IP가 차단된 것은 fail2ban의 로그에서 확인할 수 있었다.

fail2ban 로그를 보니 이 해커는 10월 19일에 다른 공격을 이미 시도했던 것 같다. 그리고 10월 24일에 어디서 얻었는지는 모르겠으나 php2shell 공격도구를 얻어 공격을 시도한 것이다.
하지만 정교하지 못한 공격으로 인해 403 에러를 연속으로 발생시켰고 10월24일 01시47분에 해커가 사용하던 45.192.213.7 IP는 Ban 되었다.
해커의 공격 IP 차단
이후 필자는 45.192.213.7 IP의 위치와 용도를 확인하였다.

이 IP의 물리적 위치는 홍콩이었다. 그리고 IP는 Antbox라는 웹호스팅 서비스를 제공하는 기업의 IP 대역이었다. 이런 IP는 개별 IP를 차단하는 것 보다 대역을 막아버리는 것이 현명하다. 그래서 ipset에 45.192.213.0/24 대역을 모두 영구히 차단해버렸다.
이후 느긋하게 php 버전을 php2shell 취약점이 패치된 최신 버전으로 업그레이드하여 마무리하였다.
#php2shell #워드프레스보안
답글 남기기