heron

발단

서버를 새로운 PC로 이전하고 2일이 지났다. 혹시나 하여 apache의 로그를 열어보았는데... 도대체 서버를 들쑤시고 다니는 사람들이 얼마나 많은지, 벌써 수많은 공격 기록이 있다.

xmlrpc.php

다음은 로그 내용이다.

[Sun Sep 22 07:43:30.296423 2024] [php:error] [pid 52646] [client 95.142.121.46:1632] script '/var/www/html/xmlrpc.php' not found or unable to stat

딱 보아도 저 파일이 널리 알려진 취약점인 듯 하다. 해당 파일에 대하여 검색하니, WordPress에서 사용하는 '다른 시스템과의 통신을 처리하는'파일이라 한다.

일반적으로 저렇게 노출되어 있는 PHP 말단 모듈에는, 나름대로의 접근 제한이 철저하게 설정되어 있을 것이다.

아니나 다를까, 역시 DDoS를 통한 서버 속도 저하 혹은 마비를 노리거나, admin계정의 PW를 찾기 위한 무차별 대입(brute-force)이 알려진 공격 방법이란다.

적절한 플러그인으로 공격을 방어할 수 있다고 하는데... 나는 워드프레스를 사용하지 않으니 해당사항이 없다고 할 수 있겠다.

Directory Traversal attack

다음은 로그 내용이다.

[Sun Sep 22 09:12:10.499943 2024] [core:error] [pid 52643] [client 47.250.41.155:45508] AH10244: invalid URI path (/cgi-bin/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/bin/sh)

우리가 유니코드를 외우고 다니지는 않지만, 점과 슬래시가 반복된다는 점에서 충분히 상위폴더로 이동하려는 시도임을 짐작할 수 있다.

이러한 방식의 상위 디렉터리 이동은, 개발자 입장에서 당연히 막혀 있으리라 생각되는 부분이기도 하고, 실제로 막혀 있기도 하다.

하지만, 저런 로그를 보고서도 막혀 있다고 안심하고 넘어갈 수 있겠는가? 바로 웹서버의 루트 디렉터리 상위로의 이동이 막혀 있는지 확인하러 갔다.

다행이도, 아파치의 버전이 최신이라 그런지 권장 옵션대로 잘 막혀 있었다.

이 글을 읽으시는 분께서도, 루트 디렉터리에 대한 Require all denied를 가급적 항상 유지하시길 바랍니다.

환경변수 탐색 시도

다음은 로그 내용이다.

94.156.68.162 - - [22/Sep/2024:00:13:46 +0000] "GET /.env HTTP/1.1" 404 3004 45.155.76.205 - - [22/Sep/2024:03:53:30 +0000] "GET /.env HTTP/1.1" 404 3071

이 작자들은 왜 남의 환경변수를 훔치려 드는가? 물론 내가 환경변수를 웹 루트 내부에 따로 기록하는 실수를 할 일은 없지만, 매우 불쾌한 것은 사실이다.

이 글을 읽으시는 여러분께서도 환경변수는 항상 접근 허용된 웹루트 경로 외부에 보관하시길 바랍니다.

워드프레스 설치 페이지 탐색 시도

다음은 로그 내용이다.

188.166.248.65 - - [22/Sep/2024:05:49:20 +0000] "GET ///wp-admin/install.php?step=1 HTTP/1.1" 301 613 "www.google.com" 188.166.248.65 - - [22/Sep/2024:05:49:21 +0000] "GET /wp-admin/install.php?step=1 HTTP/1.1" 404 3057 "www.google.com"

첫 번째 행의 301 리스폰스를 보면, 웹루트 경로를 '///'으로 입력하여 리다이렉션이 일어났음을 알 수 있다.

두 번째 행의 404 리스폰스를 보면, "/wp-admin/install.php?step=1" 에 해당하는 경로를 탐색하지 못했음을 알 수 있다.

방금도 말했다시피, 나는 워드프레스를 사용하지 않고 있으므로, 이런 종류의 공격 시도로부터는 안전하다고 할 수 있다.

검색에 따르면 해당 경로는 워드프레스 설치 마법사를 실행하는 페이지라고 한다. 워드프레스가 정상 설치되었다면 install.php 파일은 삭제된다고 한다. 하지만 만약의 경우가 있지 않은가? 파일이 삭제되지 않았거나, 워드프레스를 설치 중이거나, 설치 과정 중에 중단했거나... 충분히 그럴듯 한 공격이다.

서버로의 직접 명령 실행 (아마도 셀의 실행 시도)

다음은 로그 내용이다.

45.155.91.226 - - [22/Sep/2024:05:11:53 +0000] "GET /level/15/exec/-/sh/run/CR HTTP/1.1" 404 456 "-" "libwww-perl/6.67"

아마 리눅스 시스템 프로그래밍을 열심히 공부한 사람이라면, 'exec'을 보고 불안감을 느낄 것이다. 공격자는 내 서버의 자원을 탈취하여 무언가를 실행하려 한 것이다.

인터넷에 해당 코드를 그대로 붙여넣고 검색하면, 많은 글이 나온다.

The Top Web Service Exploits in 2020

위 링크의 웹페이지에서 3위에 랭크된 악용 사례가 "/level/15/exec/-/sh/run/CR" 이다.

2002년 8월에 발생한 보안 문제에 대한 공격을 2024년에도 계속 하고 있다는 것이 놀랍다.

물론 20년 전에는 사용자가 서버의 프로그래밍 자원을 사용하는 것에 대한 경각심이 별로 없던 시대이지만, 지금은 아니지 않은가?

JS의 eval()같은 함수가 퇴출당하고, http가 거의 모두 https로 바뀐 시대에, 아직도 서버로의 직접 명령 실행을 시도하는 사람이 많다는 것이 신기하다.

하지만 분명 어딘가에서는 유효하게 서버의 자원을 탈취하고 있기에, 사라지지 않고 끊임없이 같은 방식이 살아남고 있는 것 아니겠는가?

우리 모두 경각심을 갖고 로그를 살펴보아야 할 것이다.

끝맺음

남은 로그가 아직도 너무 많은데, 확인 할 기력이 없다. 겨우 이틀도 안되는 기간동안 들어온 공격 시도가 너무도 많다.

물론 error.log는 모두 확인했고(xmlrpc.php, Directory Traversal attack 이 error.log에 있던 것), 대부분은 access.log이므로 별 문제는 없을 것이다.

나중에 시간이 남을 때 한번 더 로그를 훑어보면 될 것이다.


다만 세상에 악의가 넘쳐 흐르는 것이 참 슬프다. 왜 악의가 없는 사람이 방어를 위해 혼신의 힘을 다해야 하는가? 눈에 보이는 모든 서버에 꼬챙이를 찔러보며 돌아다니는 사악한 종자들이 너무도 싫다.

본문 작성일: 2024년 9월 23일