무작위 요청 공격 경험기

jason·2020년 6월 9일
1

About Server / Network

목록 보기
3/3
post-thumbnail

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 참조

nginx access log 내용 (일부)

(클라이언트 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 에 고액의 서버 이용료를 내게될지도 모른다. (개인 이용자들을 위한 면책 정책이 있다고 들어는 봤지만 자세히 알아보진 않았다.)

남은 의문점

  • console 에 출력한 context 객체 내에 response.status 가 404 인것과 상반되게 nginx access log 에서 확인한 상태는 200 으로 기록되어있다. ("GET (url)" 200)
    대상 url 은 해당 server 에 존재하지 않는데 왜 200 일까..?

대응

  • domain 없이 ip 주소를 접속 url 로 사용하고 있는 내 서버는 EC2 인스턴스 재부팅을 통해 새 ip 주소를 받을 예정이다.
  • 내 blog, github 들을 샅샅히 살펴보며 어떻게 ip 주소가 노출됐는지 알아봤지만 정확히는 알 수 없었다. 우선 몇가지 의심되는 부분을 개선했고 앞으로 조심해야겠다.
  • 서버의 acess 정보를 DB 에 모두 기록해두고 정기적으로 확인할 예정이다.

결론

  1. 무작위 요청 공격은 매우 흔한 일이고 그 자체만으로 치명적이라고 할 순 없지만, 이어질 수 있는 2차 공격에는 충분히 대비를 해두어야 한다.
  2. DB root 계정의 암호는 귀찮더라도 복잡하게 설정하자.
  3. 포트폴리오나 토이프로젝트만을 위한 서버일지라도 서버의 access 정보를 관리하는 것이 좋다.
profile
개발을 통해 많은 것을 배우고 배운 것을 나누고 싶습니다. 글은 [시리즈] 를 통해 보기 쉽게 분류해두었습니다.

1개의 댓글

comment-user-thumbnail
2020년 6월 11일

흥미진진 에피소드 잘 읽었습니다. :>

답글 달기