본문 바로가기

Security

[Webhacking] Misconfiguration

반응형

잘못된 설정 (misconfiguration)취약점은 웹 서버 (apache, nginx) , 데이터베이스 서버 (mysql, postresql, mongodb) 캐시 서버 (redis), 웹 프레임워크 (django, sprong), 컨테이너 (Docker, K8S) 등 모든 웹 어플리케이션 계층에서 발생할 수 있음.

잘못된 설정으로 공격자는 허가되지 않은 동작을 수행할 수 있음.

 

부주의로 인해 발생하는 문제점


메뉴얼에 존재하지 않은 설정이거나 개발자의 부주의로 인해 설정 유무를 알지 못한 상태에서 서비스를 할 경우 자주 발생

  • 권한 설정 문제
    • 잘못된 권한 설정
      • 웹 서버 운용 시스템, 어플리케이션에서 필요 이상의 권한을 부여하는 경우 문제 발생.
      • 서비스를 운용하는 OS의 사용자 권한이 유저 계정이 아닌 root 권한으로 사용할 경우, 서비스 로직이 root 권한으로 수행됨. 파일 취약점이 존재하는 경우 사용자 권한이 접근하지 못하는 시스템 파일 등에도 접근 가능.
      • DB, Docker 등의 어플리케이션 운용 시에도 어플리케이션 사용자 권한 필요 이상 부여할 경우 문제 발생. DBMS에서 root계정 사용 시에 모든 데이터베이스에 접근 가능.
    • 기본 계정
      • 프레임워크 등에서 기본적으로 제공하는 계정을 삭제하지 않아 문제가 발생.
  • 기본 서비스
    • 시스템 또는 어플리케이션에서 개발자가 설정하지 않아도 기본적으로 제공되는 기능에 의해 문제가 발생할 수 있음.
    • 관리 서비스 ( Tomcat Manager, Docker Registry API)
    • 모니터링 서비스 ( Spring Boot Actuator - metrics , Apache mod_status)
  • 임시 / 백업 파일, 개발 관련 파일
    • 임시 파일이나 백업 파일이 존재하면 디렉토리 스캐너를 통해 파일이 유출될 수 있음
    • 자주 사용되는 임시 파일과 백업 파일은 swp, ~, bak, sql등이 있음.
    • ubuntu@u1804aws:/tmp/test$ ls -al
      total 24
      drwxrwxr-x  2 ubuntu ubuntu  4096 Mar  4 07:04 .
      drwxrwxrwt 16 root   root    4096 Mar  4 08:19 ..
      -rw-------  1 ubuntu ubuntu 12288 Mar  4 08:19 .hello.php.swp
      -rw-rw-r--  1 ubuntu ubuntu   109 Mar  4 08:19 hello.php
      ubuntu@u1804aws:/tmp/test$
    • .php 파일은 vim 에디터로 열면 .swp 라는 임시파일이 생성됨.
    • 웹 서버는 .php를 php script로 인식해서 실행 결과 응답, .swp는 소스코드가 포함된 임시파일 응답.
    • .swp 파일 다운로드 받아 vim hello.php 명령어 입력하면
    • E325: ATTENTION
      Found a swap file by the name ".hello.php.swp"
                owned by: ubuntu   dated: Wed Mar  4 08:24:26 2020
               file name: /tmp/test/hello.php
                modified: no
               user name: ubuntu   host name: u1804aws
              process ID: 15961
      While opening file "hello.php"
      (1) Another program may be editing the same file.  If this is the case,
          be careful not to end up with two different instances of the same
          file when making changes.  Quit, or continue with caution.
      (2) An edit session for this file crashed.
          If this is the case, use ":recover" or "vim -r hello.php"
          to recover the changes (see ":help recovery").
          If you did this already, delete the swap file ".hello.php.swp"
          to avoid this message.
      Swap file ".hello.php.swp" already exists!
      [O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:
    • 여기서 R키 누르면 hello.php 복구 가능.

 

악용 가능성 있는 확장자

bak 백업 파일, 대부분의 에디터에서 사용함
config 설정 파일, 비밀 키들이 존재하는 경우가 많음
sql sql schema 파일, 데이터 베이스 구조를 알아낼 수 있음
sh shell script 파일
~ bluefish 에디터 백업 파일

서비스 하기 전에 서비스와 무관한 파일들을 점검하여 제거하여야 한다.

ex) nginx 위험한 확장자 거부 설정.

location ~ (?:\.(?:bak|config|sql|fla|psd|ini|log|sh|inc|swp|dist)|~)$ {
	deny all;
	access_log off;
	log_not_found off;
}

 

버전관리 도구(VCS)를 사용해 소스코드를 다운로드 받거나 웹 폴더 내에서 직접 개발 시에 VCS가 자동으로 생성하는 정보 파일이 남음.

dreamhack@dreamhack:/tmp/dreamhack$ ls -al
total 0
drwxrwxrwx 1 dreamhack dreamhack 4096 Mar 10 10:34 .
drwxrwxrwt 1 root root 4096 Mar 10 10:34 ..
dreamhack@dreamhack:/tmp/dreamhack$ git init
Initialized empty Git repository in /tmp/dreamhack/.git/
dreamhack@dreamhack:/tmp/dreamhack$ ls -al
total 0
drwxrwxrwx 1 dreamhack dreamhack 4096 Mar 10 10:34 .
drwxrwxrwt 1 root root 4096 Mar 10 10:34 ..
drwxrwxrwx 1 dreamhack dreamhack 4096 Mar 10 10:34 .git
dreamhack@dreamhack:/tmp/dreamhack$

git은 .git 폴더가 생성되고 해당 폴더 내에서 트래킹되는 파일들의 소스코드를 쉽게 획득 가능.

조치방안) nginx 웹서버의 설정으로 차단 예시

location ~ /\.(git|hg) {
  deny all;
}

 

 

편의성을 위한 설정에 의해 발생하는 문제점


개발자를 위한 설정이 서비스 환경에도 켜져있어 공격자가 이를 통해 시스템 내부 정보를 알아내 추가 공격 수행

  • DEBUG/ ERROR 메시지
    • 디버그 코드 상에서 특정 정보를 사용자에게 제공할 경우 서버의 환경 및 정보가 노출됨.
    • #!/usr/bin/env python3
      from flask import Flask, request
      app = Flask(name)
      @app.route('/')
      def index():
          return 'hi'
      @app.route('/download')
      def download():
          file = request.args.get("file")
          return open(file).read()
      app.run(host='0.0.0.0', port=8000, debug=True)
    • debug 모드 True인 상태에서 에러 발생 시에
    • 코드와 함께 에러메시지 출력됨.
    • @app.route('/download')
      def download():
      	try:
      		file = request.args.get("file")
      		return open(file).read()
      	except Exception as e:
      		return str(e.args)
    • 디버그 목적으로 error 상세 내용 출력 시에도 공격자에게 정보 노출 됨.
  • 0.0.0.0 으로 네트워크 바인딩
    • 0.0.0.0으로 바인딩 되었다가 서비스 환경 변경 후에도 바인딩 주소 그대로 사용시 문제 발생.
    • 공격자는 인증이 없거나 취약한 내부서비스에 접근 가능. 아래는 서비스 목록
    • redis cache 서버
      mysql RDBMS 서버
      k8s master node 클러스터 관리
    • # IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES
      # JUST COMMENT THE FOLLOWING LINE.
      # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      # bind 127.0.0.1 ::1
      bind 0.0.0.0
    • redis 기본 설정은 인증 절차가 없기 때문에 127.0.0.1에 모든 IP 접근 허용시 외부 인터넷에서 해당 redis서버 접근 가능. 접근 후 redis 명령 수행 가능.
    • $ nc [redis-server-ip] 6379 -v
      Connection to redis.dreamhack.io 6379 port [tcp/*] succeeded!
      SET dreamhack data
      +OK
      get dreamhack
      $4
      data
    • 해결 방법은 방화벽을 통해 특정 포트 제외 모두 삭제. => 인터넷으로 오는 요청에 대한 포트로는 접근 불가
    • 0.0.0.0 바인딩을 127.0.0.1 :: 1로 설정해 로컬에서만 접근하도록 수정.

 

메뉴얼과 실제 구현체의 차이로 인해 발생하는 문제점


  • NGINX ALIAS Path Traversal 취약점
    • Nginx에서 경로 설정시 alias, root 두가지 방식 존재.
      # Defines a replacement for the specified location. For example, with the following configuration
      location /i/ {
          alias /data/w3/images/;
      }
      # on request of “/i/top.gif”, the file /data/w3/images/top.gif will be sent.​

alias는 지시한 다른 경로로 변경, root는 root로 설정한 경로에 추가함. (/data/w3/images/i/ 로 반영됨)

http://server/i/top.gif 요청 시에 alias는 /data/w3/images/top.gif 을 root는 /data/w3/images/i/top.gif를 가져옴.

만약 사용자가 /i를 요청하면

 

location /dreamhack {
        alias /tmp/;
}

만약 /dreamhack/e.xxd를 요청하면  /tmp//e.xxd 를 읽어오는 것을 확인할 수 있고 /dreamhack../etc/passwd를 요청하면 /tmp/../etc/passwd를 읽어옴.

/dreamhack/ 인 경우 

/dreamhack/../~ 식의 요청은 브라우저에서 자동 생략 차단함.

 

조치방안.

alias 대신에 root directive 사용. (../으로 건너뛰어도 디렉을 더 거침)

location 마지막에 / 붙이거나, alias 맨 뒤 / 삭제.

 

 

해당 코드나 설정에 대한 이해 없이 사용해 발생하는 문제점


  • 모든 도메인을 허용한 CORS 설정

 


NGINX Proxy SSRF

 

만약 외부주소를 통해 이미지를 다운받는 엔드포인트를 만든다고 했을 때

https://dreamhack.io/image/{image URL}
https://dreamhack.io/image/http://imageviewer.com/941ba06f-fb7e-46e1-bcba-55a1306d6aa7.png

로컬 주소를 통해 서버 사이드 리소스 접근 가능.

http://dreamhack.io/image/http://127.0.0.1:1234

조치방안

location ~ ^/image/(https?):/((?:hostA|hostB)(?::\d+)?)/(.*) {
    proxy_pass $1://$2/$3;
}

이와같이 hostA, hostB 제외한 어떠한 호스트도 프록시 패스 허용하지 않음.

반응형

'Security' 카테고리의 다른 글

[wargame] pathtraversal  (0) 2021.10.04
[wargame] devtools-sources  (0) 2021.10.04
[wargame] image-storage  (0) 2021.09.30
[Webhacking] Javascript  (0) 2021.09.30
[wargame] php-1  (0) 2021.09.28