Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
HTTP-Basma — 사이버 보안 영역에서 웹 서버를 정확하게 식별하고 특성화하는 것은 위협 탐지, 취약점 평가, 네트워크 매핑에 있어 매우 중요합니다. 우리는 다층적 접근 방식을 통해 고유한 서버 프로필을 밝혀내는 새로운 능동 핑거프린팅 알고리즘인 HTTP-Basma를 소개합니다. | Kitploit
도구/GitHubGitHub/netomize/http-basma
ReconnaissanceNetwork MappingVulnerability AnalysisInformation GatheringWeb SecurityMalware AnalysisCommand and ControlThreat IntelligenceRed Teaming
GitHubnetomize/http-basma

HTTP-Basma

사이버 보안 영역에서 웹 서버를 정확하게 식별하고 특성화하는 것은 위협 탐지, 취약점 평가, 네트워크 매핑에 있어 매우 중요합니다. 우리는 다층적 접근 방식을 통해 고유한 서버 프로필을 밝혀내는 새로운 능동 핑거프린팅 알고리즘인 HTTP-Basma를 소개합니다.

31개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
저장소 보기웹사이트
HTTP-Basma Logo

적응형 핑거프린팅: HTTP-Basma의 다단계 프로빙을 통한 세분화된 서버 식별

HTTP-Basma는 https://httpbasma.netomize.ca/ 에서 운영 중입니다.

소개

사이버 보안 분야에서 웹 서버를 정확하게 식별하고 특성화하는 것은 위협 탐지, 취약점 평가, 네트워크 매핑에 있어 매우 중요합니다. 우리는 HTTP-Basma를 소개합니다. 이는 다계층 접근 방식을 통해 고유한 서버 프로필을 밝혀내는 새로운 능동 핑거프린팅 알고리즘으로, 이러한 문제를 해결합니다.

주요 기능: 제작된 요청, 드러나는 응답: HTTP-Basma는 서버 구성을 반영하는 독특한 응답을 이끌어내는 8개의 정교하게 설계된 HTTP 프로브를 전송합니다. 다용성을 위한 이중 해싱: 이 알고리즘은 두 개의 해시를 생성합니다:

  • 가역성을 제공하는 38바이트 퍼지 해시, "verbosus"
  • verbosus에서 파생된 16바이트 단방향 해시, "pacto", 개인정보 보호 및 보안 강화

클러스터링 및 헌팅: 이러한 해시는 서버 클러스터링, 고유 및 유사 서버 식별, 그리고 더 높은 신뢰도로 악성 행위자 추적을 가능하게 합니다.

확장을 위한 모듈식 설계: 알고리즘의 아키텍처는 새로운 해싱 변형의 추가를 촉진하여 협업과 적응성을 장려합니다.

이 문서에서는 먼저 HTTP 핑거프린팅에 관한 주목할 만한 기존 연구를 살펴본 후, 알고리즘의 기능, 설계, 아키텍처 및 결과를 탐구합니다. 또한, 상위 100만 개 Majestic 웹사이트 스캔에서 얻은 흥미로운 결과를 소개할 예정이며, 여기에는 다양한 악성코드 패밀리의 C&C HTTP 서버 식별 및 클러스터링이 포함됩니다.


HTTP-Basma 알고리즘의 핵심 아이디어는 다양한 요구 사항을 가진 8개의 특별히 제작된 HTTP 요청을 전송하여 서버로부터 서로 다른 응답을 이끌어내는 데 있습니다. 서버 응답을 수신한 후, HTTP 상태 줄(status line)의 모든 요소를 정밀하게 분해하여 최적으로 인코딩합니다. 또한, 서버 응답의 선택된 헤더도 인코딩 여부를 확인합니다.

전송하는 요청 유형은 다음과 같습니다:

  1. P1 - GET 일반 - 유효한 요청
  2. P2 - GET 잘못된 HTTP 버전 요청
  3. P3 - GET 임의 리소스 요청
  4. P4 - 임의 동사(Verb) 요청
  5. P5 - get 소문자 동사
  6. P6 - GET 요청 - Accept-Encoding - 전체
  7. P7 - GET 요청 - Accept-Encoding - 축소
  8. P8 - OPTIONS 요청

각 요청 후, 서버의 응답을 분석하여 특정 헤더와 해당 값을 추출합니다. 추출된 데이터는 분해 및 인코딩을 포함한 추가 처리를 거쳐 가역적 핑거프린트를 생성합니다.

알고리즘 작동 방식에 대한 전체 기술적 세부 사항은 첨부된 논문에 있습니다.

이 모듈식 설계 철학은 각 요청 핑거프린트를 구성 요소로 취급하여 우아한 리팩토링을 가능하게 하며, 모든 요청의 핑거프린트를 추가하거나 제거할 수 있습니다.

핑거프린트 샘플:

CobaltStrike

root@kitploit:~
  - verbosus fp: 011420958a0014514bd5221420958a221420958a221420958a2200001420958a22000000001f
  - pacto fp: 02464ae8b7d86f82c9918e2c2b9d6b91
  - 참고: 오탐률 (72/986,910)

Havoc

root@kitploit:~
  - verbosus fp: 01142494d60914514bd522142494d6221420958a701420958a220000140e04922032c37f1609
  - pacto fp: 020769322f3d94ac2f258ddf5ce08502
  - 참고-1: 오탐률 0
  - 참고-2: tevedadav.site/43.209.165.126:443 (TLS)
    - 샘플-(sha-256): 9aa1dec8dd12f8adc7fc1274e1958f3613450109ee8b4ec6442a0fcf06df0972

BruteRatel

root@kitploit:~
  - verbosus fp: 01140a85e40014512f3612140a85e422140a85e422140a85e4220000140a85e4220000000001
  - pacto fp: 0207292309a7a7e798e417d69df5f2a5
  - 참고: 오탐률 (73/986,910)

Google

root@kitploit:~
  - verbosus fp: 01140a85e4001320958a22142494d62214254c5e2214254c5e22080014254c5e220000000000
  - pacto fp: 0202be780e1eaae0eaa6184e20c909b6
  - 참고: 오탐률 (4/986,910)

YouTube

root@kitploit:~
  - verbosus fp: 01140a85e4011320958a22142494d67214254c5e2214254c5e22080014254c5e220000000000
  - pacto fp: 02cc5be6d05192e17de041538508bc22
  - 참고: 오탐률 (38/986,910)

X

root@kitploit:~
  - verbosus fp: 01140a85e40914514bd522140a85e4721420958a701420958a220800140a85e4720000001609
  - pacto fp: 0221b4e46bbd0e5c037f5a852ca3fdc0
  - 참고: 오탐률 (6/986,910)

HTTP-Basma 도구

HTTP-Basma는 이 알고리즘의 실용성과 타당성을 입증하기 위해 제가 개발한 C++ 도구입니다. 모든 HTTP 소켓 상호작용에 Chilkat의 라이브러리를 활용하며, 라이브러리 내의 기타 지원 클래스도 사용합니다. 또한, 이 도구에는 verbosus 퍼지 해시를 분해하고 역변환하여 포괄적인 JSON 객체를 출력하는 demangler 기능과 두 개의 verbosus 핑거프린트 간의 차이를 출력하는 비교(comparator) 기능이 포함되어 있습니다.

도구의 일부 출력은 약간 다른 프로브 번호를 사용할 수 있지만, 기본 순서는 일관됩니다: P1->P1, P2->P2, P3->P3, P4->P4, P->P5, P6->P6F, P7->P6L, P8->P7a.

도구 옵션

클릭하여 펼치기
root@kitploit:~
Usage:
  HTTP-Basma [OPTION...]

  -d, --domain arg         도메인/IP (여러 도메인을 쉼표로 구분하여 쿼리 가능)
  -p, --port arg           포트 번호
  -s, --ssl                HTTP 연결이 SSL/TLS를 통해 이루어져야 합니까?
  -q, --qpath              URL 경로를 포함하여 도메인 확인 (권장하지 않음)
  -w, --redirect           HTTP 리디렉션 활성화/비활성화. 비활성화(false) 시 다음 리디렉션만 따르고,
                           활성화 시 모든 리디렉션을 따릅니다 (기본값: true)
  -t, --ctimeout arg       소켓 연결 제한 시간 값(초) (기본값: 1)
  -g, --rtimeout arg       소켓 읽기(서버로부터) 제한 시간 값(초) (기본값: 1)
  -e, --sleep arg          각 요청 사이의 대기 시간(밀리초) (기본값: 100)
  -x, --proxy arg          프록시 설정: <"socks4|socks5|http">,<도메인>,<포트>,<bool:direct_tls>,<로그인>,<비밀번호>
                                         모든 값은 쉼표로 구분됩니다. <direct_tls>는 비HTTP 프록시에서 무시됩니다
  -f, --file arg           도메인/IP 목록이 포함된 파일 ("-c/--csv" 또는 "-j/--json" 필요)
  -P, --parallel           "-f/--file" 옵션을 통해 전달된 도메인 목록을 병렬로 스캔
  -c, --csv                csv 파일로 저장; 'n' 옵션이 지정되지 않은 경우 CSV 파일 이름은 자동으로
                           생성됩니다
  -n, --csvfile arg        CSV 파일 이름
  -j, --json               json 파일로 저장; 'l' 옵션이 지정되지 않은 경우 JSON 파일 이름은 자동으로
                           생성됩니다
  -l, --jsonfile arg       JSON 파일 이름
  -r, --saveh              요청 응답 헤더 저장
  -o, --pjson              핑거프린트 분해를 JSON 객체로 콘솔에 표시
  -i, --demangle_json arg  핑거프린트를 상세한 json 형식으로 디맹글 (여러 개 가능, 쉼표로
                           구분)
  -u, --demangle_txt arg   핑거프린트의 간결한 텍스트 형식 출력, 여러 결과는 쉼표로 구분
  -C, --compare arg        두 개의 verbosus 핑거프린트 비교 (쉼표로 구분)
  -a, --pacto arg          Verbosus를 사용하여 Pacto 핑거프린트 획득
  -h, --help               사용법 출력	

상세 출력

특정 도메인/IP를 요청하면 응답을 CSV 또는 JSON 파일로 저장할 수 있으며, 서버 응답 헤더와 각 프로브의 고유 핑거프린트에 대한 풍부한 정보가 포함됩니다.

예를 들어, https://google.com 서버의 핑거프린트를 얻고 결과를 JSON 및 CSV 파일로 저장하면서 모든 프로브의 HTTP 응답 헤더를 저장하려면:

root@kitploit:~
HTTPBasma.exe -d https://google.com --json --csv --saveh

Output 폴더에서 CSV 파일 google_hb_results_2026-05-19_08-35-38_am.csv 및 JSON 파일 google_hb_results_2026-05-19_08-35-38_am.json을 찾을 수 있습니다.

디맹글러(Demangler)

도구의 디맹글러 기능 "-i/--demangle_json"은 verbosus 핑거프린트를 입력받아 각 프로브의 속성을 재구성하고 포괄적인 JSON 객체를 출력합니다. 특히, FNV-1a 해시를 역변환할 때 디맹글러는 두 개의 로컬 데이터베이스를 활용합니다: 허용된 HTTP 메서드용 options.csv와 상태 줄 이유 구문용 status_line_db.csv입니다. 이러한 데이터베이스 파일 중 하나라도 없으면 해당 해시 역변환 기능이 자동으로 비활성화됩니다. 이 데이터베이스는 상위 100만 개 Majestic 웹사이트 스캔을 통해 컴파일되었습니다.

example.com 도메인에 대한 verbosus 핑거프린트의 디맹글링:

root@kitploit:~
HTTPBasma.exe --demangle_json 01140a85e40014514bd522142494d67214254c5e721420958a22020214254c5e720000001609
디맹글러 출력 (클릭하여 펼치기)
root@kitploit:~
{
  "type": "verbosus",
  "fp": "01140a85e40014514bd522142494d67214254c5e721420958a22020214254c5e720000001609",
  "p1": {
    "type": "get_normal",
    "fp": "140a85e400",
    "status_line": {
      "http_version": {
        "fp": "14",
        "val_cmt": "HTTP/1.1"
      },
      "status_code": {
        "fp": "0a",
        "val_cmt": "200"
      },
      "http_reason": {
        "fp": "85e4",
        "val_cmt": "OK"
      },
      "sl_reversed_db": {
        "http_version": "HTTP/1.1",
        "status_code": [
          200,
          404,
          403,
          500,
          204,
          999,
          888,
          603
        ],
        "http_reason": "OK"
      }
    },
    "sts_hdr": {
      "fp": "00",
      "cmt": "이 헤더는 사용되지 않습니다"
    }
  },
  "p2": {
    "type": "get_invalid_ver_nb",
    "fp": "14514bd522",
    "status_line": {
      "http_version": {
        "fp": "14",
        "val_cmt": "HTTP/1.1"
      },
      "status_code": {
        "fp": "51",
        "val_cmt": "505"
      },
      "http_reason": {
        "fp": "4bd5",
        "val_cmt": "HTTP Version Not Supported"
      },
      "sl_reversed_db": {
        "http_version": "HTTP/1.1",
        "status_code": [
          505
        ],
        "http_reason": "HTTP Version Not Supported"
      }
    },
    "cont_len_hdr": {
      "fp": "22",
      "name": "Content-Length",
      "value": ">1",
      "cmt": "content-length/transfer-encoding:chunked 헤더가 다음 크기 값 중 하나로 존재합니다: [0,1,>1]"
    },
    "cnx": {
      "ka": false,
      "c": true
    }
  },
  "p3": {
    "type": "get_rnd_resource",
    "fp": "142494d672",
    "status_line": {
      "http_version": {
        "fp": "14",
        "val_cmt": "HTTP/1.1"
      },
      "status_code": {
        "fp": "24",
        "val_cmt": "404"
      },
      "http_reason": {
        "fp": "94d6",
        "val_cmt": "Not Found"
      },
      "sl_reversed_db": {
        "http_version": "HTTP/1.1",
        "status_code": [
          404,
          403,
          501,
          410,
          204,
          400,
          200,
          418
        ],
        "http_reason": "Not Found"
      }
    },
    "cont_len_hdr": {
      "fp": "72",
      "name": "Transfer-Encoding",
      "value": ">1",
      "cmt": "content-length/transfer-encoding:chunked 헤더가 다음 크기 값 중 하나로 존재합니다: [0,1,>1]"
    },
    "cnx": {
      "ka": true,
      "c": false
    }
  },
  "p4": {
    "type": "get_rnd_verb",
    "fp": "14254c5e72",
    "status_line": {
      "http_version": {
        "fp": "14",
        "val_cmt": "HTTP/1.1"
      },
      "status_code": {
        "fp": "25",
        "val_cmt": "405"
      },
      "http_reason": {
        "fp": "4c5e",
        "val_cmt": "Method Not Allowed"
      },
      "sl_reversed_db": {
        "http_version": "HTTP/1.1",
        "status_code": [
          405,
          403,
          204,
          418,
          404
        ],
        "http_reason": "Method Not Allowed"
      }
    },
    "cont_len_hdr": {
      "fp": "72",
      "name": "Transfer-Encoding",
      "value": ">1",
      "cmt": "content-length/transfer-encoding:chunked 헤더가 다음 크기 값 중 하나로 존재합니다: [0,1,>1]"
    },
    "cnx": {
      "ka": true,
      "c": false
    }
  },
  "p5": {
    "type": "get_lowercase_verb",
    "fp": "1420958a22",
    "status_line": {
      "http_version": {
        "fp": "14",
        "val_cmt": "HTTP/1.1"
      },
      "status_code": {
        "fp": "20",
        "val_cmt": "400"
      },
      "http_reason": {
        "fp": "958a",
        "val_cmt": "Bad Request"
      },
      "sl_reversed_db": {
        "http_version": "HTTP/1.1",
        "status_code": [
          400,
          422,
          405,
          401
        ],
        "http_reason": "Bad Request"
      }
    },
    "cont_len_hdr": {
      "fp": "22",
      "name": "Content-Length",
      "value": ">1",
      "cmt": "content-length/transfer-encoding:chunked 헤더가 다음 크기 값 중 하나로 존재합니다: [0,1,>1]"
    },
    "cnx": {
      "ka": false,
      "c": true
    }
  },
  "p6f": {
    "type": "get_accept_encoding_full",
    "fp": "02",
    "cont_enc_hdr": {
      "value": "br",
      "empty_value": false,
      "total_plus": 0
    }
  },
  "p6l": {
    "type": "get_accept_encoding_less",
    "fp": "02",
    "cont_enc_hdr": {
      "value": "br",
      "empty_value": false,
      "total_plus": 0
    }
  },
  "p7a": {
    "type": "options_allow_hdr",
    "fp": "14254c5e72000000",
    "status_line": {
      "http_version": {
        "fp": "14",
        "val_cmt": "HTTP/1.1"
      },
      "status_code": {
        "fp": "25",
        "val_cmt": "405"
      },
      "http_reason": {
        "fp": "4c5e",
        "val_cmt": "Method Not Allowed"
      },
      "sl_reversed_db": {
        "http_version": "HTTP/1.1",
        "status_code": [
          405,
          403,
          204,
          418,
          404
        ],
        "http_reason": "Method Not Allowed"
      }
    },
    "cont_len_hdr": {
      "fp": "72",
      "name": "Transfer-Encoding",
      "value": ">1",
      "cmt": "content-length/transfer-encoding:chunked 헤더가 다음 크기 값 중 하나로 존재합니다: [0,1,>1]"
    },
    "allow_hdr": {
      "fp": "000000",
      "cmt": "이 헤더는 사용되지 않습니다"
    },
    "cnx": {
      "ka": true,
      "c": false
    }
  }
}

"status_code" 배열에 여러 HTTP 상태 코드가 포함되어 있음을 확인할 수 있습니다. 이는 서로 다른 서버가 서로 다른 상태 코드에 대해 동일한 이유 구문을 사용할 수 있기 때문에 발생하며, 결과적으로 동일한 FNV-1a 해시가 생성됩니다.

비교 옵션

비교 옵션 "-C/--compare"은 두 개의 verbosus 핑거프린트를 비교하고 각 프로브의 주요 구성 요소 간 차이를 출력합니다.

예를 들어, Google과 YouTube의 다음 두 핑거프린트를 비교하면:

root@kitploit:~
HTTPBasma.exe --compare 01140a85e4001320958a22142494d62214254c5e2214254c5e22080014254c5e220000000000,01140a85e4011320958a22142494d67214254c5e2214254c5e22080014254c5e220000000000

다음과 같은 출력이 생성됩니다:

root@kitploit:~
 < FPrnt-1 Vs. FPrnt-2 >

 [ P1 ]
    {Strict-Transport-Security}
      sts header: 00 != 01

 [ P2 ]
 [ P3 ]
    {Content-Length}

      cl_name: 2 != 7

 [ P4 ]
 [ P5 ]
 [ P6F ]
 [ P6L ]
 [ P7a ]

출력은 P1 프로브의 해시 구성 요소에서 차이를 보여주며, 첫 번째 fp에는 STS 헤더가 있고 다른 쪽에는 없음을 나타냅니다. 또한, P3 프로브의 두 핑거프린트 간 "Content-Length" 인코딩이 다릅니다.


릴리스

Netomize는 이 저장소의 공개 코드에 대한 컴파일된 Windows 및 Linux x64 버전을 제공합니다. 또한, majestic 1백만 HTTP-Basma 핑거프린트 CSV 파일 - 데이터 세트가 첫 번째 릴리스에 포함되어 있습니다.

사용된 타사 라이브러리

  • Chilkat v11.4.0
  • rang: 콘솔 색상용
  • cxxopts (v3.3.1)

라이선스

  • Netomize 라이선스
  • 라이선스는 2026년 7월 30일에 업데이트되었으며, BSD 3-Clause 라이선스에서 Netomize 라이선스로 변경되었습니다

기여

풀 리퀘스트와 이슈를 환영합니다. 의견과 제안은 크게 감사드립니다.

도구 다운로드