[Web_hacking] 웹 보안

Song·2024년 9월 24일

1. 디렉토리 리스팅 & File upload 공격

게시판의 임의의 경로에 접근시 해당 서버의 디렉토리 및 웹 애플리케이션 버전, OS, IP, Port를 볼 수 있다. 이를 디렉토리 리스팅이라고 한다. 이는 주로 상위 디렉토리로 이동해 구조를 파악하는 Path traversal을 통해 수행한다.

게시판에서 웹 쉘을 열 수 있는 파일을 서버의 파일 업로드 기능을 통해 업로드한다.

파일 업로드 경로(여기서는 /board/pds)에 디렉토리 리스팅을 통해 접근하면

방금 업로드한 웬 쉘 파일을 볼 수 있다. 이를 클릭해보면

웹 쉘이 열린다.

쉘에서 서버의 데이터를 회수해올 수 있다.

차단

/etc/apache2/apache2.conf 170줄 밑에 Indexes 옵션을 None으로 변경

apache2 재실행 후 디렉터리 리스팅을 다시 시도하면

403 Forbidden 에러가 출력된다.



2. 심볼릭 링크를 이용한 Path traversal

서버에서 최상위 디렉터리를 sample.html에 링크를 걸고

브라우저에서 해당 경로에 접근을 해보면 sample.html을 볼 수있다. 이를 클릭하면

최상위 경로까지 접근이 가능하다.

차단 설정

/etc/apache2/apache2.conf

171 라인 아래에 FollowSymLinks 옵션 제거

apache2 재실행 후 다시 심볼릭 링크에 접근 시 403 코드로 차단된다.



3. 에러 출력

웹 서버는 잘못된 경로로 접근했을 때 404 Not Found 에러를 출력한다. 이 때 우분투 계열은 웹 애플리케이션 버전, OS,IP, Port가 출력되지만, 레드햇 계열에서는 출력되지 않는다.

우분투

레드햇



4. HTTP 응답 헤더 정보

HTTP 응답 헤더에 Server의 종류와 버전이 출력된다.

차단

/etc/apache2/apache2.conf 마지막 줄에 구문 2줄 추가

apache2 재실행 후 HTTP 응답 헤더 확인.

에러 페이지로 이동했을 때도 버전, OS 정보가 출력되지 않는다.

5. 특정 IP 허가 또는 차단

/etc/apache2/ipblacklist.conf

apache2 재실행 후 게시판에 접속해보면

메인 페이지조차 접근이 불가능하다.



6. 필요없는 파일 제거

웹 서버를 개발할 떄 사용했던 파일들, 기본 페이지, 백업 파일들을 삭제한다.

board 디렉터리를 제외한 2개의 파일은 제거해주는 것이 좋다.

추가로 파일 이름은 유추하기 쉬운 이름을 사용하지 않는다.



7. HTTP 메서드 제한

HTTP에서 사용 가능한 메서드 확인.

curl 설치 후 curl 이용해 사용 가능한 메서드 확인.

curl -i -X OPTIONS http://web.server.com

/etc/apache2/apache2.conf 파일 170라인 밑에 아래처럼 작성.

<LimitExcept>로 GET, POST를 제외한 모든 메서드를 제한한다.

파일 맨 마지막에 구문 추가.



8. ModSecurity & OWASP 탐지 룰 설정

1) 패키지 설치

apt install -y libapache2-mod-security2

2) conf 파일 복사

/etc/modsecurity 경로로 이동 후 modsecurity.conf-recommended 파일을 modsecurity.conf 파일로 복사해준다.

3) conf 파일 구문 수정

modsecurity.conf 파일 7라인 구문 수정

4) apache2 재실행

systemctl restart apache2

5) 탐지 & 차단 테스트

게시판에 웹 쉘 파일 업로드 시도

저장을 누르면

Forbidden이 출력된다.

9. HTTPS 적용

1) 사설 SSL 인증서 설치

apt install -y openssl

2) 웹 서버 설정 디렉토리로 이동 및 디렉토리 생성

cd /etc/apache2
mkdir ssl
cd ssl

3) 개인키 생성

비밀번호 2번 입력

4) 인증서 생성

openssl req -new -key server.key -out server.csr

이전에 생성한 key 암호 입력

  1. 국가코드
  2. 시/도
  3. 시/군/구
  4. 회사명
  5. 부서명
  6. 도메인
  7. 이메일
  8. 챌린지 암호
  9. 회사이름

  1. 암호 입력
  2. 회사 이름

5) apache2 SSL 파일 수정

/etc/apache2/ssl/default-ssl.conf

25라인

32라인

6) SSL 활성화

7) 웹 사이트 접속

사설 인증서이기 때문에 이런 화면으로 출력된다.

10. 로그 분석

1) 웹 로그 분석

/var/log/apache2

access.log : 웹 서버 접속한 클라이언트
error.log : 웹 서버의 오류

  • 접속자 IP : 192.168.5.26
  • 접속 시간 : [24/Sep/2024:16:10:21 +0900]
  • 요청 방식 : GET
  • 요청 페이지 : /board/board.php
  • 프로토콜 : HTTP/1.1
  • 응답코드 : 200
  • 패킷 사이즈 : 1230
  • 접속 브라우저 : Chrome/128.0.0.0

awk '{ print $1,$4 }' /var/log/apache2/access.log

위 명령어로 특정 필드만 가져올 수 있다.

2) 특정 필드를 파일로 저장

awk '{ print $1,$4 }' /var/log/apache2/access.log > web_history.txt

3) 특정 아이피가 몇 번 접속했는지 확인.

awk '{arr[i] +=1 } END {for (i in arr) print i, arr[i] }' /var/log/apache2/access.log

profile
안녕하세요

0개의 댓글