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


게시판에서 웹 쉘을 열 수 있는 파일을 서버의 파일 업로드 기능을 통해 업로드한다.
파일 업로드 경로(여기서는 /board/pds)에 디렉토리 리스팅을 통해 접근하면

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

웹 쉘이 열린다.


쉘에서 서버의 데이터를 회수해올 수 있다.
/etc/apache2/apache2.conf 170줄 밑에 Indexes 옵션을 None으로 변경


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

403 Forbidden 에러가 출력된다.

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

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

최상위 경로까지 접근이 가능하다.
/etc/apache2/apache2.conf
171 라인 아래에 FollowSymLinks 옵션 제거


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

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


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

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

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


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

/etc/apache2/ipblacklist.conf

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

메인 페이지조차 접근이 불가능하다.
웹 서버를 개발할 떄 사용했던 파일들, 기본 페이지, 백업 파일들을 삭제한다.

board 디렉터리를 제외한 2개의 파일은 제거해주는 것이 좋다.
추가로 파일 이름은 유추하기 쉬운 이름을 사용하지 않는다.
HTTP에서 사용 가능한 메서드 확인.
curl 설치 후 curl 이용해 사용 가능한 메서드 확인.
curl -i -X OPTIONS http://web.server.com

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

<LimitExcept>로 GET, POST를 제외한 모든 메서드를 제한한다.
파일 맨 마지막에 구문 추가.

apt install -y libapache2-mod-security2
/etc/modsecurity 경로로 이동 후 modsecurity.conf-recommended 파일을 modsecurity.conf 파일로 복사해준다.

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

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

저장을 누르면

Forbidden이 출력된다.
apt install -y openssl
cd /etc/apache2
mkdir ssl
cd ssl

비밀번호 2번 입력
openssl req -new -key server.key -out server.csr

이전에 생성한 key 암호 입력






/etc/apache2/ssl/default-ssl.conf
25라인

32라인




사설 인증서이기 때문에 이런 화면으로 출력된다.
/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
위 명령어로 특정 필드만 가져올 수 있다.

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