워드프레스 블로그 wp-cron.php를 악용하여 DoS 공격이 들어올때 해결 방법
오늘 새벽에 운영중인 블로그 하나가 서버가 다운되었다. 원인을 찾아보았는데, wp-cron.php 접근이 5건 발견되었다.
52.78.174.152 - - [17/Jan/2024:16:33:22 +0000] "POST /wp-cron.php?doing_wp_cron=1705509202.3372929096221923828125 HTTP/1.1" 200 -
52.78.174.152 - - [17/Jan/2024:16:34:46 +0000] "POST /wp-cron.php?doing_wp_cron=1705509286.0885798931121826171875 HTTP/1.1" 200 -
52.78.174.152 - - [17/Jan/2024:16:35:55 +0000] "POST /wp-cron.php?doing_wp_cron=1705509355.3590059280395507812500 HTTP/1.1" 200 -
52.78.174.152 - - [17/Jan/2024:16:37:28 +0000] "POST /wp-cron.php?doing_wp_cron=1705509448.7402470111846923828125 HTTP/1.1" 200 -
52.78.174.152 - - [17/Jan/2024:16:38:31 +0000] "POST /wp-cron.php?doing_wp_cron=1705509511.8782351016998291015625 HTTP/1.1" 200 -
아마존라이트세일 비트나미 워드프레스 블로그에서 408 오류가 발생할 때 해결 방법은?
wp-cron.php는 무엇인가?
WordPress에서 cron-job.php
파일은 WordPress Cron 시스템의 일부입니다. WordPress Cron은 서버에서 볼 수 있는 전통적인 크론 작업이 아닙니다. 대신 WordPress 사이트 내에서 다양한 작업과 이벤트를 예약할 수 있는 시스템입니다. 이러한 작업에는 예약된 게시물 게시, 업데이트 확인, 이메일 알림 보내기 등이 포함될 수 있습니다.
wp-cron.php가 보안과 접속 속도에 영향
동시 접속자가 많거나 서버 사양이 낮을 수록 상대적으로 접속 속도를 느리게 합니다. 또한 wp-cron.php를 호출해서 공격을 시도하게 됩니다.
<공격시도 로그 확인>
52.78.174.152 - - [17/Jan/2024:16:33:22 +0000] "POST /wp-cron.php?doing_wp_cron=1705509202.3372929096221923828125 HTTP/1.1" 200 -
52.78.174.152 - - [17/Jan/2024:16:34:46 +0000] "POST /wp-cron.php?doing_wp_cron=1705509286.0885798931121826171875 HTTP/1.1" 200 -
52.78.174.152 - - [17/Jan/2024:16:35:55 +0000] "POST /wp-cron.php?doing_wp_cron=1705509355.3590059280395507812500 HTTP/1.1" 200 -
52.78.174.152 - - [17/Jan/2024:16:37:28 +0000] "POST /wp-cron.php?doing_wp_cron=1705509448.7402470111846923828125 HTTP/1.1" 200 -
52.78.174.152 - - [17/Jan/2024:16:38:31 +0000] "POST /wp-cron.php?doing_wp_cron=1705509511.8782351016998291015625 HTTP/1.1" 200 -
wp-cron.php가 활성화된 경우
Wappalyzer(Google Chrome 및 Firefox 모두에서 사용 가능)라는 확장 프로그램을 사용하여 WordPress를 사용하고 있는지 쉽게 식별할 수 있습니다. 웹사이트가 WordPress를 사용하여 실행되고 있음을 알게된다면 wpscan을 사용하여 사이트를 스캔할 수 있습니다. 애플리케이션에 사용되는 취약한 플러그인 및 테마와 함께 잘못된 구성을 나열합니다.
wpscan을 사용하여 취약한 플러그인 찾기:
wpscan --url <대상> -e vp --api-token API_TOKEN --random-user-agent --ignore-main-redirect --force --disable-tls-checks
wpscan을 사용하여 취약한 테마 찾기:
wpscan --url <대상> -e vt --api-token API_TOKEN --random-user-agent --ignore-main-redirect --force --disable-tls-checks
APITOKEN은 wpscan 웹사이트( https://wpscan.com/ )에 등록한 후 얻을 수 있습니다.
wp-cron.php가 활성화되어있는지 확인방법
블로그 주소 뒤에 /wp-cron.php를 입력하여 주소창에 입력해보면 됩니다.
예시: https://playground.naragara.com/wp-cron.php
오류가 발생하지 않았습니다. 그러나 wp-cron.php가 활성화되었음을 나타내는 빈 페이지가 나타난다면 활성화된 것이다. 개발자모드를 켠 후 Network 탭을 클릭 후 해당 페이지에 접근하면 아래와 같이 status 200코드를 확인할 수 있다.
wp-cron.php를 사용하여 DoS 공격 수행
wp-cron.php에 스크립트를 사용하여 광범위한 요청을 보내는 공격을 시도하면, 이로 인해 스크립트가 과도한 양의 리소스를 소비하게 되어 결국 서버에 과부하가 발생하게 됩니다. 결과적으로 애플리케이션이 응답하지 않거나 충돌하는 경우가 발생할 수 있으며, 이로 인해 잠재적인 데이터 손실 및 가동 중지 시간이 발생할 수 있습니다.
PoC에 사용된 DOS 공격 스크립트:https://github.com/Quitten/doser.go
위 스크립트를 사용하여 공격을 시도하면 해당 웹사이트를 사용할 수 없다는 페이지가 나타날 것이다.
wp-cron.php 취약점 공격 해결은?
wp-cron을 비활성하여 성능도 높이고, 취약점 방어도 해봅니다.
wp-cron.php 비활성화하기
예약 게시글을 발행하지 않거나 댓글 알림 또는 워드프레스 자동 업데이트, 플러그인 자동 업데이트를 하지 않는다면 꺼도 됩니다.
wp-config.php 에 다음 명령문을 추가하세요.
define('DISABLE_WP_CRON', true);
wp-cron 실행 주기 설정하기(WP_CRON_LOCK_TIMEOUT)
크론을 일정 시간 동작하지 못하게 잠그는 방법은 다음과 같아요. wp-config.php 에 다음 명령문을 추가하세요.
WP_CRON_LOCK_TIMEOUT를 설정하면 워드프레스는 크론이 실행 중인지(lock 상태인지) 확인 후 크론이 실행되지 않으면 lock을 만들고 lock timeout에 도달하지 않으면 크론 실행을 못하게 합니다. 실행중인 크론작업이 없고 타임아웃이 경과했으면 크론이 실행됩니다.
// 주기설정(초단위) 60초 * 60분 * 1시간
define('WP_CRON_LOCK_TIMEOUT', 3600);
참고로 아래 스크린샷을 보면 알 수 있듯이 root계정으로 로그인 후에 수정가능합니다.
wp-config.php 파일 위치는 /home/bitnami/stack/wordpress/ 경로에 있습니다.(아마존 라이트세일 비트나미 워드프레스 기준)
[2024.01.24 내용추가]
2024년 1월 23일 저녁 또 다시 서버가 죽었다.
서버다운 시간 체크
[Tue Jan 23 13:08:52.211256 2024] [mpm_event:notice] [pid 744:tid 140091009236224] AH00491: caught SIGTERM, shutting down
[Tue Jan 23 21:22:18.386971 2024] [mpm_event:notice] [pid 62705:tid 139853260750080] AH00491: caught SIGTERM, shutting down
해당 시간대에 공격 시도 확인
52.78.174.152 - - [23/Jan/2024:13:04:19 +0000] "POST /wp-cron.php?doing_wp_cron=1706015059.4166910648345947265625 HTTP/1.1" 200 -
52.78.174.152 - - [23/Jan/2024:13:05:52 +0000] "POST /wp-cron.php?doing_wp_cron=1706015152.6224141120910644531250 HTTP/1.1" 200 -
52.78.174.152 - - [23/Jan/2024:13:06:29 +0000] "POST /wp-cron.php?doing_wp_cron=1706015189.7223238945007324218750 HTTP/1.1" 200 -
52.78.174.152 - - [23/Jan/2024:13:07:10 +0000] "POST /wp-cron.php?doing_wp_cron=1706015230.8039879798889160156250 HTTP/1.1" 200 -
지난 17일 공격시도한 IP와 동일하네?? ip주소를 확인해보니, 내 블로그 고정 IP주소이다. 이게 어찌된 일일까?
일단 ip주소로의 워드프레스 블로그 접근을 차단하였다.
그리고 댓글기능을 차단했다.
[2024.02.04 내용추가]
[Sun Feb 04 01:42:58.101318 2024] [mpm_event:notice] [pid 754:tid 140412568337664] AH00491: caught SIGTERM, shutting down
원인을 알 수 없는 이유로 웹서버가 또 다운되었다. 로그를 확인해보았으나 서버가 다운될만한 요소가 아무것도 없었다. 설치된 플러그인이 문제되는건 아닌가???
그래서 아래와같은 조치를 취했다.
- 워드프레스 최신버전으로 업데이트
- All in One SEO 최신버전으로 업데이트
- JetPack 최신버전으로 업데이트
[2024.02.06 내용추가]
[Tue Feb 06 11:38:08.503630 2024] [mpm_event:notice] [pid 771:tid 140606825970944] AH00491: caught SIGTERM, shutting down
2월4일 로그와 확인해보니 규칙이 확인되었다.
40.77.167.143 – – [04/Feb/2024:01:42:37 +0000] “GET /post-sitemap.xml HTTP/1.1” 200 62478
40.77.167.143 – – [04/Feb/2024:01:42:39 +0000] “GET /post-sitemap.xml HTTP/1.1” 503 299
40.77.167.3 – – [06/Feb/2024:11:36:31 +0000] “GET /post-sitemap.xml HTTP/1.1” 200 62479
40.77.167.3 – – [06/Feb/2024:11:36:33 +0000] “GET /post-sitemap.xml HTTP/1.1” 503 299
post-sitemap.xml 페이지를 접근시 첫번째는 성공하지만 두번째 호출되면 503오류가 발생하면서 죽는다??
접근ip주소를 확인해보니 아래와 같은데, 아마도 bing봇이 다녀간 것 같은데…….
에이 설마… 하면서 크롬브라우저를 뛰오고 해당 url를 호출했다..
그결과 4번째 호출에서 서버가 죽었다. ㄷ ㄷ ㄷ ㄷ
[오류 해결방법]
☞ post-sitemap.xml 페이지 접근시 503오류 발생으로 웹서버가 다운(Service Unavailable)되는 현상 해결방법은?