Nikto

RYEONGO KIM·2026년 2월 12일

kali linux

목록 보기
3/6
post-thumbnail

Nikto는 웹 서버의 취약점을 자동으로 정밀 진단하는 오픈 소스 웹 서버 스캐너입니다.

Nmap이 '문(포트)'을 찾고, Gobuster가 '방(디렉터리)'을 찾았다면, Nikto는 그 방 안에 있는 '위험한 물건(취약점)'을 찾아내는 도구라고 이해하면 쉽습니다.

  1. Nikto의 주요 기능
    위험한 파일 및 CGI 검색: 서버에 남겨진 위험한 스크립트나 파일을 6,700개 이상의 데이터베이스와 대조하여 찾아냅니다.

오래된 소프트웨어 탐지: 서버 소프트웨어(Nginx, Apache 등)가 보안 패치가 안 된 구버전인지 확인합니다.

서버 설정 오류 확인: HTTP 옵션 설정 오류나 보안 헤더(XSS 방어 등) 누락을 점검합니다.

추측 가능한 기본 파일 탐지: 관리자 페이지나 기본 설치 페이지 등 해커의 타겟이 되기 쉬운 경로를 찾습니다.

  1. 기본 사용법
    가장 기본적인 명령어 형식은 다음과 같습니다.

nikto -h [대상IP또는_도메인]
-h (host): 스캔할 대상 서버를 지정합니다. (예: http://192.168.200.23)

만약 HTTPS(443) 포트를 사용 중이라면 주소에 https://를 붙여주면 됩니다.

  1. 차이점
    Gobuster : 숨겨진 경로 / 파일 찾기
    방식 : 무차별 대입
    결과 : /admin, /backup 등 존재 여부

Nikto : 보안 취약점 / 설정 오류 찾기
방식 : 알려진 취약점 패턴 대조
결과 : XSS 취약점, 구버전 소프트웨어

명령어 사용 결과

1. Nikto 결과 분석 (주요 발견 사항)
X-Frame-Options 헤더 누락:
이 헤더가 없으면 해커가 내 웹사이트를 다른 사이트의 프레임 안에 넣어서 사용자의 클릭을 유도하는 '클릭재킹(Clickjacking)' 공격에 취약해집니다.

X-Content-Type-Options 헤더 누락:
웹 브라우저가 파일 내용을 제멋대로 해석하지 못하게 막는 설정입니다. 이게 없으면 텍스트 파일을 악성 스크립트로 오인해 실행하는 공격이 가능할 수 있습니다.

/#wp-config.php# 파일 발견:
이게 이번 스캔의 핵심 보물입니다! 보통 에디터로 수정하다 남은 임시 파일이나 백업 파일인데, 이 안에는 데이터베이스 접속용 아이디와 비밀번호 같은 민감한 정보가 들어있을 확률이 매우 높습니다.

  1. 보안 전문가가 보는 현재 서버 상태
    Nikto는 단순히 파일이 있느냐가 아니라, "이 설정이 없어서 이런 해킹을 당할 수 있어!"라고 경고해주고 있습니다.

X-Frame-Options 미설정 Nginx 설정에 보안 헤더 추가
(중요) 백업 파일 노출 (#wp-config.php#) 해당 파일 즉시 삭제 및 권한 제한
Nginx/1.26.3 버전 노출 서버 정보를 숨기는 설정 (server_tokens off;)

  1. 다음 실습 미션: 보안 구멍 메우기 (방어)
    Nikto가 찾아낸 문제점 중 하나를 직접 해결해 봅시다. 가장 쉬우면서도 효과적인 '보안 헤더 추가' 실습입니다.

Red Hat 서버에서 다음 설정을 추가한다

설정 파일 열기: sudo vi /etc/nginx/nginx.conf

http { ... } 블록 안에 아래 내용 추가:

Nginx
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";

적용: sudo nginx -t (문법검사) 후 sudo systemctl restart nginx (nginx 재시작)
이렇게 했더니 방어가 되지않고 그대로 나와서 다른 코드를 찾아보았습니다.
server 블록 내부에 직접 코드를 넣고 서비스를 재시작했습니다. 원래 코드에 always를 넣었습니다.
결과 성공
add_header X-Frame-Options "SAMEORIGIN" always;
이제 클릭재킹(Clickjacking) 공격으로부터 안전합니다.

add_header X-Content-Type-Options "nosniff" always;
브라우저의 MIME 타입 스니핑 공격을 성공적으로 차단했습니다.

남은 과제: #wp-config.php#
결과를 자세히 보시면 아직 한 줄이 남아있습니다.

  • /#wp-config.php#: #wp-config.php# file found. ...

이것은 우리가 이전에 Gobuster로 찾았던 것과 비슷한 임시/백업 파일입니다. Nikto는 "이 안에 데이터베이스 비밀번호 같은 중요한 정보가 있을 수 있으니 위험해!"라고 경고하고 있는 거예요.

민감파일 보호 코드 작성

1. 왜 Nikto에는 아직도 뜰까?
Nikto는 단순히 "접근이 되는가"만 보는 게 아니라, "이런 파일이 존재할 가능성이 있는가"를 체크합니다.

Nikto의 판단: 서버가 403 Forbidden을 보내면, Nikto는 "어? 차단하네? 차단한다는 건 숨길 게(파일이) 있다는 뜻이구나!"라고 판단해서 리포트에 남기기도 합니다.

진짜 방어 확인: 해커 입장에서 중요한 건 파일의 내용을 보는 것입니다. curl 결과에서 403이 떴다면 해커는 절대 내용을 볼 수 없으므로 보안 실무상으로는 100% 방어 성공입니다.!!

  1. 지금까지 왜 그렇게 안 됐을까?
    범인은 바로 'URL 인코딩'과 '특수문자의 문제'였습니다.

인코딩의 함정 (%23 vs #): * 우리가 주소창에 #을 치면 브라우저는 이를 %23으로 바꿔서 서버에 보냅니다.

이전 설정들에서는 Nginx가 %23으로 들어온 요청과 설정 파일의 #을 서로 다른 것으로 인식해서 차단망을 그냥 통과시켜 버렸던 거예요.

쉘(Shell)의 간섭:
리눅스 터미널에서 #은 주석의 시작입니다. 그래서 따옴표 없이 명령어를 치면 시스템이 파일 이름 뒷부분을 잘라먹어서 "파일이 없다"는 에러만 반복했던 것이죠.

결론: 지금 상태가 최선입니다.
location = /%23wp-config.php%23: 인코딩되어 들어오는 공격을 차단.
location /#wp-config.php#: 혹시 모를 문자 그대로의 요청까지 차단.

최종결론

클릭재킹 방어: X-Frame-Options 적용 완료

MIME 스니핑 방어: X-Content-Type-Options 적용 완료

민감 파일 보호: 백업 파일 접근 시 403 Forbidden 강제 호출 성공

profile
배우는 중 입니다.

0개의 댓글