소개
Nikto 는 인기 있는 오픈 소스 웹 서버 스캐너로, 6,700 개 이상의 잠재적으로 위험한 파일/프로그램, 1,250 개 이상의 서버의 최신 버전 확인, 270 개 이상의 서버에 대한 버전별 문제 등 다양한 항목에 대해 웹 서버를 포괄적으로 테스트합니다.
Nikto 는 표준 HTTP 웹사이트를 쉽게 스캔할 수 있지만, SSL/TLS(HTTPS)를 사용하는 사이트를 스캔하려면 특정 옵션이 필요합니다. 이 실험실에서는 Nikto 를 사용하여 SSL/TLS가 활성화된 웹사이트를 스캔하는 방법을 배우게 됩니다. 테스트 목적으로 로컬에서 호스팅되는 보안 웹 서버를 사용할 것입니다. SSL 스캔을 시작하고, 특정 포트로 지시하고, 스캔 결과에서 SSL 관련 정보를 해석하는 방법을 배우게 됩니다.
HTTPS 를 사용하여 대상 웹사이트 식별하기
이 단계에서는 대상 보안 웹 서버가 실행 중이고 접근 가능한지 확인할 것입니다. 이 실험실의 설정 스크립트는 이미 SSL/TLS를 사용하는 간단한 Python 웹 서버를 시작했습니다. 이 서버는 localhost의 4433 포트에서 수신 대기 중입니다.
서버가 실행 중인지 확인하기 위해 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 에 의존하는 최신 웹 애플리케이션에 대한 철저한 보안 평가를 수행하는 데 중요합니다.


