AWS EC2 인스턴스에 서빙중이 던 NodeJs 서버로 백엔드 코딩을 하던 중, 우연치 않게 무작위 요청 공격을 포착했다.
사실 "무작위 요청" 이라는 용어가 맞는진 모르겠으나, 정확한 명칭을 찾지 못해 명명함
const Koa = require("koa");
const app = new Koa();
app.use((ctx, next) => {
console.log(ctx);
})
app.listen(4000, () => {
console.log('Listening to port 4000 !!');
})
위와 같이 Koa 프레임워크로 구축된 node 서버에 ctx (context 의 줄임말, 웹 요청과 응답에 대한 정보를 담고 있는 객체) 를 console 에 출력하는 코드를 써두고 작업 중이었는데, 갑자기 아래와 같은 log 가 초당 수십개씩 출력되었다.
(실제 로그를 확인해보니 분당 약 20개 정도의 request 가 약 20분동안 발생했다. 하지만 초당 수십개로 체감할 정도로 많이 당황했었나보다.)
{
request: { // 클라이언트의 요청 정보 부분
method: 'GET',
url: '/program/index.php', // 클라이언트가 요청한 url (base url 은 생략된다.)
header: {
host: '127.0.0.1:4000',
connection: 'close',
'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:52.0) Gecko/20100101 Firefox/52.0',
'cache-control': 'no-cache'
}
},
response: { // 서버의 응답 정보 부분
status: 404, // 해당하는 url 이 서버에 존재하지 않아 404 로 응답
message: 'Not Found',
header: [Object: null prototype] {}
},
app: { subdomainOffset: 2, proxy: false, env: 'development' },
originalUrl: '/program/index.php',
req: '<original node req>',
res: '<original node res>',
socket: '<original node socket>'
}
// 위와 유사한 log 가 수십개 찍힘
어떤 request 의 url 에는 /hack.php 등 심상치 않은 이름들도 보여 순간적으로 꽤 무서웠다...
알고 지내던 개발자분에게 문의를 했고 그 결과 이는 공개된 web server 에 흔히 일어나는 무작위 해킹 시도라는 것을 알게되었다.
좀 더 자세히 상황을 파악하기 위해 해당 web server 를 serving 하고 있는 nginx 의 access log 를 확인했다.
ubuntu 에서 nginx 의 access log 확인하는 명령어 :
(default 위치일 경우)$ cat /var/log/nginx/access.log
nginx access log 의 default 양식 해석하는 법
>> stackoverflow 참조
(클라이언트 ip 주소) - - [09/Jun/2020:06:25:01 +0000] "GET /phpMyAdmin.old/index.php HTTP/1.1" 200 11 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:52.0) Gecko/20100101 Firefox/52.0"
(클라이언트 ip 주소) - - [09/Jun/2020:06:25:01 +0000] "GET /pma-old/index.php HTTP/1.1" 200 11 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:52.0) Gecko/20100101 Firefox/52.0"
(클라이언트 ip 주소) - - [09/Jun/2020:06:25:09 +0000] "GET /pma-old/index.php HTTP/1.1" 200 11 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:52.0) Gecko/20100101 Firefox/52.0"
(클라이언트 ip 주소) - - [09/Jun/2020:06:25:09 +0000] "GET /claroline/phpMyAdmin/index.php HTTP/1.1" 200 11 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:52.0) Gecko/20100101 Firefox/52.0"
(클라이언트 ip 주소) - - [09/Jun/2020:06:25:13 +0000] "GET /claroline/phpMyAdmin/index.php HTTP/1.1" 200 11 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:52.0) Gecko/20100101 Firefox/52.0"
(클라이언트 ip 주소) - - [09/Jun/2020:06:25:13 +0000] "GET /typo3/phpmyadmin/index.php HTTP/1.1" 200 11 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:52.0) Gecko/20100101 Firefox/52.0"
(클라이언트 ip 주소) - - [09/Jun/2020:06:25:17 +0000] "GET /typo3/phpmyadmin/index.php HTTP/1.1" 200 11 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:52.0) Gecko/20100101 Firefox/52.0"
(클라이언트 ip 주소) - - [09/Jun/2020:06:25:21 +0000] "GET /phpma/index.php HTTP/1.1" 200 11 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:52.0) Gecko/20100101 Firefox/52.0"
(클라이언트 ip 주소) - - [09/Jun/2020:06:25:25 +0000] "GET /phpma/index.php HTTP/1.1" 200 11 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:52.0) Gecko/20100101 Firefox/52.0"
... (생략)
그 외 요청된 url
/mysql/admin/index.php
/shopdb/index.php
/sql/index.php
등등...
다양한 URL 을 대상으로 GET 요청이 이뤄졌다. 그리고 그 URL 들은 모두 실제 있을법한 URL 이었다. 만약 내 server 가 저 중 하나의 URL 이라도 사용하고 있었다면 요청한 data 를 응답했거나 올바른 URL 이지만 body 정보가 valid 하지 않다는 등의 error message 를 응답했을 것이다.
(다행히 내 server 는 해당 URL 들을 사용하고 있지 않기 때문에 404 not found error 로 응답했을 것이다.)
대부분의 대상 URL 에서 보듯 DB 해킹을 주로 노리고 있고 만약 response 를 받아낸다면 해당 DB root 계정의 암호를 알아내기 위해 Brute Force(무작위 대입) 공격으로 이어지는 경우가 많다고 한다.
또는, server 가 data 를 응답하는 request URL 을 알아내어 한번에 대량의 트래픽을 발생시키는 DDoS 공격도 가능하다.
물론 개인 포트폴리오나 토이프로젝트 서버에 DDoS 공격을 할 가능성은 희박해보이지만 만약 당하게 된다면, AWS 에 고액의 서버 이용료를 내게될지도 모른다. (개인 이용자들을 위한 면책 정책이 있다고 들어는 봤지만 자세히 알아보진 않았다.)
흥미진진 에피소드 잘 읽었습니다. :>