필자는 블로그(blogger.pe.kr)를 독립서버에서 운영하기 때문에 운영자로서 해야 할 일이 참 많다. 백업도 철저하게 해야하고 해커의 접근도 직접 방어해야 한다. 하지만 필자의 블로그가 올라가 있는 Apache 웹서버의 Access log를 분석하다 보면 사실 대부분은 진짜 해커의 반열에 올랐다기 보다는 여러 툴들을 이용해서 단순한 공격을 일삼는 스크립트 키디(Script Kiddie)의 찔러보기가 대부분이다.
하지만 그 중에는 진짜 해커스러운 접근도 종종 보인다. 특히 무작위로 로그인을 시도하지 않고 이미 해킹을 통해 장악한 여러대의 서버를 동원해 IP와 계정을 지속적으로 바꿔가며 최대한 탐지를 피해가며 로그인을 시도한다던가 취약한 정보가 담긴 파일을 찾는 경우도 있다.
워드프레스를 사용하는 웹사이트 공격의 시발점은 의외로 단순한 것에서부터 시작된다. 웹사이트가 실행중인 서버의 포트를 스캔하고 SSH 또는 DBMS(MySQL 또는 MariaDB) 등 TCP 포트가 열려있는지를 확인하거나 웹서버, PHP의 버전을 확인하는 것 부터 시작된다.
그리고 오늘의 주제인 워드프레스의 사용자 계정 목록을 확인하는 것도 해킹의 시작점 중 하나다. 어제 오전에 바로 그 공격이 필자의 블로그에 들어왔다.
워드프레스 API를 사용한 ID 목록 조회 공격
필자의 블로그는 워드프레스를 사용하고 있다. 혼자 운영하는 블로그이기에 계정은 딱~하나 뿐이다. 워드프레스의 사용자 계정 목록을 조회하는 API를 호출해보면 다음과 같이 하나만 노출된다.

하지만 KBOARD 등 워드프레스를 이용해 회원가입을 받고 글을 작성할 수 있게 해주는 “게시판”을 운영하고 있다면 이야기가 달라진다. 워드프레스에서 동작하는 게시판들도 대부분 워드프레스 자체의 계정을 사용하기 때문에 사이트에 가입한 모든 사용자 계정의 목록이 표시된다. 기본적으로 로그인 하지 않은 상태에서도 계정 목록이 보여진다.
만약 다른 웹사이트에서 유출된 ID와 계정 목록을 갖고 있다면 동일한 ID를 찾아 유출된 비밀번호로 로그인을 시도해볼 수 있는 것이다. 성공 가능성은 꽤 높다고 할 수 있다. 이런 경우 10% 아니 단 1%만 성공해도 개인정보 유출사고로 이어지게 되고 운영자가 개인정보 유출로 인한 법적 책임을 져야 하기 때문이다.
흔히 이름, ID 등 한 가지 종류의 정보만 유출되는 경우 이름 하나가 무슨 개인정보 유출이냐고 반문하는 경우가 있는데 명확하게 이야기하지만 “개인정보 유출사고”가 맞다.
실제로 필자의 워드프레스 사이트에 ID를 빼내기 위해 들어오는 공격은 의외로 흔하다.

이 접근으로 인해 앞의 화면과 같은 결과를 해커는 획득했을 것이다. 계정이 하나만 나온다는 것은 그 계정이 바로 워드프레스의 최고 관리자 계정이라는 것을 의미한다. 당연히 해커는 해당 ID의 비밀번호를 유추하거나 타 사이트에서 유출한 정보를 찾으려 할 것이다. 하지만 taeho 라는 아이디로 워드프레스의 기본 로그인 페이지를 호출해 로그인을 시도하지 않았다.
이어서 해커는 우커머스 플러그인 등 워드프레스에 설치되어 개인정보를 처리하는 몇 개의 플러그인 관련 API를 호출했다. 다만 20초 정도의 짧은 시간에 48개 번의 접근을 한 것으로 보아 워드프레스의 취약점을 찾을 수 있는 스캐너를 사용한 것으로 추정된다. 그리고 워드프레스의 취약한 기능 중 하나인 xmlrpc 를 호출하면서 IP를 차단당했다.

이 로그 이후에는 iptable에 해당 IP 차단정책이 자동으로 적용되어 76.98.79.180의 로그는 없었다. 다음에서 fail2ban에 적용한 sensitive-files Jail에서 자동으로 Ban 되었음을 확인할 수 있었다.

fail2ban에 적용해둔 몇 개의 Filter와 Jail 덕분에 최종적으로 해커의 IP를 차단하긴 했지만 새롭게 워드프레스 API 중 계정목록을 조회할 수 있는 API의 접근을 통제해야할 필요성을 느꼈다.
워드프레스 ID 목록 조회 차단하기
워드프레스는 REST API를 제공해 앞에서 살펴본 바와 같이 플러그인이나 다른 응용프로그램에서 워드프레스의 계정정보를 활용할 수 있게 하고 있다. 특히 게시판 플러그인의 경우 많은 이용자가 회원가입을 통해 글을 작성하거나 조회할 수 있게 하고 있는데 게시판 회원의 ID 목록을 워드프레스(웹사이트)에 로그인하지 않고도 조회해 볼 수 있게 되어 있다.
그래서 회원의 목록을 무조건 차단하거나 승인을 받아 가입한 회원이 로그인한 상태에서만 조회할 수 있게 할 수 있는데 필자의 블로그는 혼자 관리하는 상황이어서 로그인하지 않으면 조회할 수 없도록 하기로 했다.
그래서 필자가 직접 작성해 사용하고 있는 코드스니펫 플러그인에서 다음과 같이 워드프레스의 function.php에 코드를 추가하였다.

다음은 실제로 적용된 코드 스니펫의 목록이다. 가장 하단에 있는 코드 스니펫이 워드프레스 계정 목록 조회를 로그인한 사용자로 제한하는 코드다.

이 코드 스니펫을 적용하고 나면 다음과 같이 로그인하지 않고 워드프레스의 user REST API를 호출할 경우 다음과 같이 403 에러가 리턴된다.

#worpress #코드스니펫 #REST_API
답글 남기기