홈페이지가 또 죽었다. 지난번 포스트에서 해결된줄 알았는데 이번에는 다른 문제였다. 그동안 무엇이 문제인지 갈피를 잡지 못했다가 이제야 찾았다!!
채굴 스크립트가 동작할때 nginx 권한으로 자꾸 실행 되길래 어떻게 이게 가능할까 싶었는데, nginx location 매칭의 취약점을 이용한 일반적인 공격이었다. 예를 들면 이런거다. /uploads/악성코드/아무거나.php
위치에 파일이 하나 업로드되고 이걸 실행하는 거다.
자세한 내용은 아래 링크를 참고 하자. https://phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=77007&page=#c_77013
사실 uploads
폴더에 php 파일이 어떻게 올라갔는지도 궁금하다. 설마 워드프레스는 POST 요청에 대한 권한 체크를 따로 하지 않는건가? 소스코드를 뜯어보면 알겠지만 귀찮다. -_-;; 올리는건 맘대로하고 일단 업로드 폴더에 올라간 php 파일 실행이나 제대로 막아보자.
업로드 폴더에 올라간 php 파일 접근 제한 걸기
방법은 간단하다. location 매칭할때 uploads 폴더에 php 파일 접근을 거부하면 된다.
# 업로드 폴더에 php 파일은 접근금지
location ~* /(?:uploads|files)/.*.php$ {
deny all;
access_log off;
log_not_found off;
}
로그 디벼보기
일단 문제는 해결했고 그동안 액세스 로그에 어떤 흔적들이 남겨져 있는지 탐정놀이를 해보자. access.log 파일을 열어서 /uploads 패턴매칭을 해봤다.
[04/Nov/2017:15:57:55 +0000] 404 119.59.120.23 https://miconblog.com/wp-content/uploads/2013/01/ysopvvnj.php
POST /wp-content/uploads/2013/01/ysopvvnj.php 어쩌고 저쩌고 에이전트는 생략...
[04/Nov/2017:16:00:56 +0000] 404 69.195.124.153 https://miconblog.com/wp-content/uploads/2016/01/rwjplrax.php
POST /wp-content/uploads/2016/01/rwjplrax.php 어찌고 저찌고 에이전트는 생략...
...
..
.
헐~ 정말 있구나! 한두개가 아니다. -_-;;;
이번엔 정말 저 파일이 저 위치에 있을까 싶어 워드프레스가 설치된 폴더를 검색해봤다.
$> ls -al PATH/wp-content/uploads/2013/01
drwxrwxrw- 2 nginx ec2-user 4096 11월 24 02:14 .
drwxrwxrw- 14 nginx ec2-user 4096 12월 2 2013 ..
-rw-r--r-- 1 nginx nginx 9816 11월 17 15:08 xgzeufph.php
-rw-r--r-- 1 nginx nginx 11128 9월 25 2013 ysopvvnj.php
와~ 대박! 얘네들 언제 업로드 된건지? 왜 난 몰랐었지? -_-…
혹시나 싶어 생성날짜를 확인해봤는데 하나는 최근에 하나는 정말 2013년에 생성됐구나 -_-… 와.. 무섭다…
$> stat ysopvvnj.php
File: `ysopvvnj.php'
Size: 11128 Blocks: 24 IO Block: 4096 일반 파일
Device: ca01h/51713d Inode: 272150 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 498/ nginx) Gid: ( 498/ nginx)
Access: 2013-09-25 00:18:11.000000000 +0000
Modify: 2013-09-25 00:18:11.000000000 +0000
Change: 2017-10-16 15:16:44.775581538 +0000
Birth: -
$> stat xgzeufph.php
File: `xgzeufph.php'
Size: 9816 Blocks: 24 IO Block: 4096 일반 파일
Device: ca01h/51713d Inode: 315331 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 498/ nginx) Gid: ( 498/ nginx)
Access: 2017-11-17 15:08:35.000000000 +0000
Modify: 2017-11-17 15:08:35.000000000 +0000
Change: 2017-11-24 02:14:51.177864545 +0000
Birth: -
uploads 폴더에 php 파일이 있는지 전수 조사를 해봤다.
$> find ./uploads/ | grep php
./uploads/2015/xqqhvjma.php
./uploads/2015/01/fuihfefw.php
./uploads/2013/11/bvwuskgr.php
./uploads/2013/01/xgzeufph.php
./uploads/2013/01/ysopvvnj.php
./uploads/2013/12/jwgfcivx.php
내가 몇개 지운거 빼고도 무려 6개가 더 있었다!! -_-;.. 궁금해서 각 파일을 열어봤더니 더 가관인게 쿠기 정보를 빼가는 스크립트도 있고, 코드 채굴기 처럼 보여지는 어마어마한 해시 블록을 가진 코드도 있었다. 그리고 PHP 전역에 함수를 심어놓는 듯한 백도어 코드도 있었다.
무서운 세상이다. 채굴스크립트의 경우 지난 6월 15일에 생성 됐다가 최근 10월 30일에 코드가 업데이트가 됐다. 가상화폐 난 0.00000001 코인도 없는데 불쌍한 내 서버는 일찍이 내 무지함에 의해 강제 노역을 당해왔구나. ㅜㅜ
어떻게 이런 일이 가능할까?
나도 나름 전공자인데 이렇게 내가 당하는거 보니 정말 수많은 사람들이 지금도 당하고 있을거라 생각이든다. 공격자는 또 어떻게 uploads 폴더를 이용할 생각을 했을까? 똑똑하다는 생각도 들지만 개인이 서버를 운영하려면 정말 많이 알아야겠다는 생각도 든다. 사실 이런 공격을 당하려면 몇가지 조건이 필요하다.
- 첫번째, 워드프레스를 운영하는 서버일것
- 두번째, Apache가 아닌 Nginx를 이용할 것
- 세번째, nginx와 워드프레스 조합에서 발생하는 취약점에 대해 크게 고민을 해본적이 없을 것
특히 세번째가 중요한데 워드프레스를 설치하고 nginx 설정을 할때 uploads 폴더에 접근을 제한해야한다는 가이드라인이 없다는 것이다. 보통 nginx와 php-fpm을 연동하는 문서들은 검색하면 수도 없이 나오지만 워드프레스를 설치해서 쓸경우 uploads 폴더 안에서 php 파일 접근을 제한해야한다는 설명은 그 어디에도 없다. 이게 참 알아도 설명하기가 그렇다.
아무튼 워드프레스를 설치해서 운영하는 사람이라면 혹시 본인의 서버도 강제 노역을 당하고 있는건 아닌지 꼭 확인해보기 바란다.
updated!! 12월 27일 또 공격이 들어왔다.
오랜만에 블로그에 들어가보니 뭔가 좀 늦게 반응하는 느낌이 들어 바로 터미널로 접속해 봤더니.. 역시나 채굴 스크립트가 돌고 있다!! 헉!!! 제대로 막은게 아니었던가? 이번엔 또 어디가 문제인거지? ㅎㅎㅎ 참나.. ㅎㅎㅎ
AWS 클라우드와치에 찍힌 CPU 로그를 보고 채굴 스크립트가 언제 실행됐는지 대략 시간을 파악하고 액세스로그를 디져봤다.
[27/Dec/2017:03:04:57 +0000] 403 40.76.209.29 https://miconblog.com/wp-content/uploads/2016/01/rwjplrax.php POST /wp-content/uploads/2016/01/rwjplrax.php ...
[27/Dec/2017:03:04:59 +0000] 200 79.174.72.152 https://miconblog.com/wp-admin/css/colors/sunrise/iqxpuniw.php POST /wp-admin/css/colors/sunrise/iqxpuniw.php ...
[27/Dec/2017:03:05:03 +0000] 403 54.247.114.112 https://miconblog.com/wp-content/uploads/2016/01/rwjplrax.php POST /wp-content/uploads/2016/01/rwjplrax.php ...
[27/Dec/2017:03:05:34 +0000] 499 95.85.34.184 https://miconblog.com/wp-admin/css/colors/sunrise/iqxpuniw.php POST /wp-admin/css/colors/sunrise/iqxpuniw.php ...
[27/Dec/2017:03:05:35 +0000] 403 203.146.253.98 https://miconblog.com/wp-content/uploads/2016/01/rwjplrax.php POST /wp-content/uploads/2016/01/rwjplrax.php ...
[27/Dec/2017:03:05:36 +0000] 200 184.168.193.16 https://miconblog.com/wp-admin/css/colors/sunrise/iqxpuniw.php POST /wp-admin/css/colors/sunrise/iqxpuniw.php ...
어라 이건 또 뭐야? 생각지도 못한 패턴이 나왔다!!
/wp-admin/css/colors/sunrise/iqxpuniw.php
아놔.. -*- 어쩌자는건지… 저 위치에 파일이 어떻게 올라갔냐? -_-;;; 갑자기 대책이 안선다… 어드민 테마 파일에도 들어가 있다니… 멘붕이다. 정신차려보자. 일단 이녀석이
-rwxr-xr-x 1 nginx ec2-user 12847 11월 17 15:08 colors-rtl.css
-rwxr-xr-x 1 nginx ec2-user 11189 11월 17 15:08 colors-rtl.min.css
-rwxr-xr-x 1 nginx ec2-user 12849 11월 17 15:08 colors.css
-rwxr-xr-x 1 nginx ec2-user 11191 11월 17 15:08 colors.min.css
-rw-r--r-- 1 nginx ec2-user 166 2월 6 2014 colors.scss
-rw-r--r-- 1 nginx nginx 11488 9월 25 2013 iqxpuniw.php
일단 기존 접근 제한을 좀더 보강하고 내 지켜보겠다!!
location ~* /(?:uploads|files|css|image|js)/.*.php$ {
deny all;
access_log off;
log_not_found off;
}
폴더 권한 정리
그리고 보니 wp-admin 폴더의 파일 권한이 생각보다 많이 열려있었구만..-_-;.. nginx 그룹에 쓰기 권한도 열려있고… 허미.. 그랬었구나.. 내가 잘못했네..ㅜㅜ 루트를 제외한 모든 사용자의 권한을 전부 닫아야겠다. 검색해보니 워드프레스의 모든 폴더권한은 755, 파일은 644로 제한해야한다고 한다. 자세한 내용은 이쪽에서 확인하자.
일단 그동안 열려있던 파일과 폴더 권한을 대폭 축소했다.
$ cd 워드프레스폴더위치/wp
$ find ./ -type d -exec chmod 0755 {} \;
$ find ./ -type f -exec chmod 0644 {} \;