Nikto 로 SSL 또는 TLS 사용 웹사이트 스캔하기

Kali LinuxBeginner
지금 연습하기

소개

Nikto 는 인기 있는 오픈 소스 웹 서버 스캐너로, 6,700 개 이상의 잠재적으로 위험한 파일/프로그램, 1,250 개 이상의 서버의 최신 버전 확인, 270 개 이상의 서버에 대한 버전별 문제 등 다양한 항목에 대해 웹 서버를 포괄적으로 테스트합니다.

Nikto 는 표준 HTTP 웹사이트를 쉽게 스캔할 수 있지만, SSL/TLS(HTTPS)를 사용하는 사이트를 스캔하려면 특정 옵션이 필요합니다. 이 실험실에서는 Nikto 를 사용하여 SSL/TLS가 활성화된 웹사이트를 스캔하는 방법을 배우게 됩니다. 테스트 목적으로 로컬에서 호스팅되는 보안 웹 서버를 사용할 것입니다. SSL 스캔을 시작하고, 특정 포트로 지시하고, 스캔 결과에서 SSL 관련 정보를 해석하는 방법을 배우게 됩니다.

HTTPS 를 사용하여 대상 웹사이트 식별하기

이 단계에서는 대상 보안 웹 서버가 실행 중이고 접근 가능한지 확인할 것입니다. 이 실험실의 설정 스크립트는 이미 SSL/TLS를 사용하는 간단한 Python 웹 서버를 시작했습니다. 이 서버는 localhost4433 포트에서 수신 대기 중입니다.

서버가 실행 중인지 확인하기 위해 curl 명령을 사용할 수 있습니다. 저희 서버는 자체 서명된 인증서 (인증 기관에서 신뢰하지 않는 인증서) 를 사용하므로, 신뢰할 수 없는 인증서에도 불구하고 진행하도록 curl-k 또는 --insecure 플래그를 사용해야 합니다.

터미널에서 다음 명령을 실행하십시오:

curl -k https://localhost:4433

서버의 메인 페이지 HTML 콘텐츠가 표시되어야 하며, 이는 서버가 활성화되어 HTTPS 를 통해 콘텐츠를 제공하고 있음을 확인합니다.

<html><body><h1>Welcome to the Secure Test Server!</h1></body></html>

이제 대상이 작동 중임을 확인했으므로 스캔을 진행할 수 있습니다.

SSL 모드 활성화를 위한 -ssl 플래그 사용

이 단계에서는 HTTPS 사이트를 스캔하는 데 -ssl 플래그가 왜 필수적인지 배우게 됩니다. 기본적으로 Nikto 는 포트 80 에서 표준 HTTP 를 통해 대상을 스캔하려고 시도합니다. SSL 사용을 지정하지 않고 SSL/TLS 연결을 예상하는 포트로 지정하면, 초기 통신 핸드셰이크가 올바르지 않아 스캔이 실패합니다.

이 동작을 관찰하기 위해 -ssl 플래그 없이 포트 4433에서 보안 서버에 대해 Nikto 를 실행해 보겠습니다.

nikto -h localhost -p 4433

웹 서버를 찾을 수 없다는 표시가 나오거나 오류 메시지가 표시될 수 있습니다. 이는 Nikto 가 HTTPS 를 수신 대기 중인 포트에 HTTP 로 통신하려고 시도하기 때문입니다.

- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP:          127.0.0.1
+ Target Hostname:    localhost
+ Target Port:        4433
---------------------------------------------------------------------------
+ Start Time:         ...
---------------------------------------------------------------------------
+ ERROR: No web server found on localhost:4433
---------------------------------------------------------------------------
+ 0 host(s) tested

이는 -ssl 플래그의 필요성을 보여줍니다. 이 플래그는 Nikto 에게 웹 요청을 SSL/TLS 계층으로 래핑하도록 명시적으로 지시하여 보안 서버와 통신할 수 있도록 합니다. 다음 단계에서는 이 플래그를 사용하여 올바른 스캔을 수행할 것입니다.

HTTPS 대상에 대한 스캔 실행

이 단계에서는 -ssl 플래그를 사용하여 보안 웹 서버에 대한 적절한 취약점 스캔을 수행합니다. -h (호스트), -p (포트), -ssl 플래그를 결합하여 Nikto 가 올바른 호스트 및 포트에 연결하고 SSL/TLS 연결을 사용하도록 지시할 수 있습니다.

스캔을 시작하려면 터미널에서 다음 명령을 실행하십시오:

nikto -h localhost -p 4433 -ssl

이제 Nikto 가 스캔을 시작합니다. 저희 서버는 자체 서명된 인증서를 사용하고 있으므로, Nikto 는 인증서 발급자가 신뢰되지 않았다는 경고를 표시할 가능성이 높으며, 이는 이 경우 예상되는 동작입니다. 그런 다음 스캔이 진행됩니다.

출력은 다음과 유사하게 표시됩니다:

- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP:          127.0.0.1
+ Target Hostname:    localhost
+ Target Port:        4433
+ SSL Info:           Self-signed certificate.
+ Start Time:         ...
---------------------------------------------------------------------------
+ Server:             SimpleHTTP/0.6 Python/3.10.12
+ The anti-clickjacking X-Frame-Options header is not present.
+ The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS
+ The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type
...
+ 1 host(s) tested

이제 Nikto 를 사용하여 SSL 이 활성화된 웹사이트를 성공적으로 스캔했습니다.

출력에서 SSL 관련 검사 관찰

이 단계에서는 이전 스캔의 출력을 분석하여 SSL/TLS 연결에 특정한 정보를 식별합니다. -ssl 플래그를 사용하면 Nikto 는 일반적인 웹 취약점을 스캔할 뿐만 아니라 서버의 SSL/TLS 인증서 및 구성에 대한 세부 정보도 제공합니다.

이전 단계의 명령 출력에서 다시 스크롤하면 SSL 인증서와 관련된 정보를 찾을 수 있습니다. 이 정보를 격리하려면 스캔을 다시 실행하고 grep을 사용하여 출력을 필터링할 수 있습니다. 인증서의 "Subject" 줄을 검색해 보겠습니다.

nikto -h localhost -p 4433 -ssl | grep "Subject"

이 명령은 스캔을 다시 실행하지만 "Subject"라는 단어가 포함된 줄만 표시합니다.

+ Subject: C=US, ST=California, L=MountainView, O=LabEx, OU=IT, CN=localhost

이 줄은 서버의 SSL 인증서에 포함된 국가 (C), 주 (ST), 일반 이름 (CN) 과 같은 세부 정보를 보여줍니다. 이 정보는 보안 평가 중에 서버의 신원을 확인하는 데 유용할 수 있습니다. Nikto 는 또한 암호 정보 및 기타 SSL 관련 취약점을 검사하여 보안 서버 구성에 대한 보다 완전한 그림을 제공합니다.

비표준 포트에서 SSL 모드 강제 실행

이 단계에서는 일반적으로 암호화되지 않은 트래픽을 처리하는 포트에서도 Nikto 가 SSL 을 사용하도록 "강제"하는 방법을 살펴봅니다. 이는 8080과 같이 특이한 포트에서 HTTPS 를 실행하는 잘못 구성된 서비스를 식별하는 데 유용합니다.

먼저 기존 서버를 중지하고 포트 8080에서 새 서버를 시작해야 합니다.

## 이전 서버 중지
pkill -f "python3 /home/labex/project/https_server/server.py"

## 포트 8080에 대한 새 서버 구성 생성
cat << EOF > /home/labex/project/https_server/server_8080.py
import http.server
import ssl
import os
os.chdir(os.path.dirname(os.path.abspath(__file__)))
server_address = ('0.0.0.0', 8080)
httpd = http.server.HTTPServer(server_address, http.server.SimpleHTTPRequestHandler)
httpd.socket = ssl.wrap_socket(httpd.socket,
                               server_side=True,
                               certfile='cert.pem',
                               keyfile='key.pem',
                               ssl_version=ssl.PROTOCOL_TLS)
httpd.serve_forever()
EOF

## 새 서버를 백그라운드에서 시작하고 잠시 대기
python3 /home/labex/project/https_server/server_8080.py &> /dev/null &
sleep 3

이제 보안 서버가 포트 8080에서 실행됩니다. -ssl 플래그가 없으면 Nikto 는 이를 표준 HTTP 포트로 가정합니다. -ssl을 포함하면 TLS 핸드셰이크를 시작하도록 강제합니다.

포트 8080에 대한 스캔을 실행합니다:

nikto -h localhost -p 8080 -ssl

출력은 이전 스캔과 유사하며, Nikto 가 비표준 포트에서 SSL/TLS를 사용하여 성공적으로 연결하고 테스트를 수행했음을 확인합니다.

- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP:          127.0.0.1
+ Target Hostname:    localhost
+ Target Port:        8080
+ SSL Info:           Self-signed certificate.
...

이를 통해 임의의 포트에서 SSL/TLS 서비스를 스캔하기 위해 Nikto 를 사용할 수 있음을 확인할 수 있습니다.

요약

이 실습에서는 Nikto 를 사용하여 SSL/TLS가 활성화된 웹사이트를 스캔하는 기본 프로세스를 배웠습니다. 대상 HTTPS 서버를 식별하고 확인하는 것부터 시작했습니다. 그런 다음 단순히 Nikto 를 HTTPS 포트에 가리키는 것이 실패하는 이유를 직접 확인하고 SSL/TLS 통신을 활성화하려면 -ssl 플래그가 필요하다는 것을 배웠습니다.

보안 서버에 대한 스캔을 성공적으로 실행하고, 인증서 세부 정보와 같은 SSL 관련 정보를 위해 출력을 분석했으며, 마지막으로 비표준 포트에서 SSL 모드를 강제 실행하는 방법을 배웠습니다. 이 기술은 보안을 위해 HTTPS 에 의존하는 최신 웹 애플리케이션에 대한 철저한 보안 평가를 수행하는 데 중요합니다.