
능동적 TLS 서버 핑거프린팅 도구로, 조작된 Client Hello 패킷을 전송하여 고유한 JARM 해시를 생성합니다. 이를 통해 서버 구성을 식별하고, 인프라를 그룹화하며, 악성 서버를 탐지합니다.
자세한 내용은 초기 JARM 블로그 게시물을 참조하십시오.
JARM은 능동적인 TLS(전송 계층 보안) 서버 지문 분석 도구입니다.
JARM 지문은 다음 용도로 사용할 수 있습니다:
JARM 지원은 다음 도구에 추가되었거나 추가되고 있습니다: SecurityTrails Shodan BinaryEdge RiskIQ Palo Alto Networks Censys 360
python3 jarm.py [-h] [-i INPUT] [-p PORT] [-v] [-V] [-o OUTPUT] [-j] [-P PROXY] [domain/IP]
예시:
% python3 jarm.py www.salesforce.com
Domain: www.salesforce.com
Resolved IP: 23.50.225.123
JARM: 2ad2ad0002ad2ad00042d42d00000069d641f34fe76acdc05c40262f8815e5
Python 2에서 사용하려면 ipaddress 모듈이 필요합니다:
pip install -r requirements.txt
./jarm.sh <list> <output_file>
예시:
% ./jarm.sh alexa500.txt jarm_alexa_500.csv
JARM의 작동 방식을 배우기 전에 TLS가 어떻게 작동하는지 이해하는 것이 중요합니다. TLS와 그 전신인 SSL은 인터넷 브라우저와 같은 일반 애플리케이션의 데이터를 안전하게 유지하고 악성코드가 잡음 속에 숨을 수 있도록 통신을 암호화하는 데 사용됩니다. TLS 세션을 시작하기 위해 클라이언트는 TCP 3-way 핸드셰이크 후에 TLS Client Hello 메시지를 보냅니다. 이 패킷과 패킷 생성 방식은 클라이언트 애플리케이션을 빌드할 때 사용된 패키지와 메서드에 따라 달라집니다. 서버는 TLS 연결을 수락하는 경우 TLS Server Hello 패킷으로 응답합니다.
TLS 서버는 TLS Client Hello 패킷에서 수신한 세부 정보를 기반으로 Server Hello 패킷을 구성합니다. 특정 Client Hello에 대해 Server Hello가 구성되는 방식은 애플리케이션이나 서버가 구축된 방식에 따라 달라질 수 있으며, 여기에는 다음이 포함됩니다:
이러한 모든 요소로 인해 각 TLS 서버가 고유한 방식으로 응답하게 됩니다. 이러한 요소들의 조합으로 인해 서로 다른 조직에서 배포한 서버가 동일한 응답을 가질 가능성은 낮습니다.
JARM은 대상 TLS 서버에 10개의 TLS Client Hello 패킷을 능동적으로 전송하고 TLS Server Hello 응답의 특정 속성을 캡처하여 작동합니다. 집계된 TLS 서버 응답은 특정 방식으로 해시되어 JARM 지문을 생성합니다.
이것이 TLS 지문 분석을 처음 사용하는 것은 아닙니다. 2017년에 우리는 현재 대부분의 네트워크 보안 도구에서 볼 수 있는 수동 TLS 클라이언트/서버 지문 분석 방법인 JA3/S를 개발했습니다. 하지만 JA3/S가 네트워크 트래픽을 수신하여 클라이언트와 서버의 지문을 분석하는 수동 방식인 반면, JARM은 능동적인 서버 지문 분석 스캐너입니다. TLS 협상 및 JA3/S 수동 지문 분석에 대한 자세한 내용은 여기에서 확인할 수 있습니다.
JARM의 10개 TLS Client Hello 패킷은 TLS 서버의 고유한 응답을 끌어내기 위해 특별히 제작되었습니다. JARM은 다양한 TLS 버전, 암호 및 확장을 서로 다른 순서로 보내 고유한 응답을 수집합니다. 서버가 TLS 1.3을 지원합니까? TLS 1.2 암호로 TLS 1.3을 협상할 수 있습니까? 암호를 가장 약한 것에서 가장 강한 순서로 정렬하면 어떤 암호를 선택합니까? 이것이 JARM이 서버에 물어보고 가장 독특한 응답을 끌어내는 특이한 질문 유형입니다. 그런 다음 10개의 응답을 해시하여 JARM 지문을 생성합니다.
JARM 지문 해시는 하이브리드 퍼지 해시로, 가역 및 비가역 해시 알고리즘의 조합을 사용하여 62자 지문을 생성합니다. 처음 30자는 전송된 각 10개의 client hello에 대해 서버가 선택한 암호와 TLS 버전으로 구성됩니다. "000"은 서버가 해당 client hello와의 협상을 거부했음을 나타냅니다. 나머지 32자는 서버가 보낸 누적 확장의 잘린 SHA256 해시이며, x509 인증서 데이터는 무시됩니다. JARM 지문을 비교할 때 처음 30자는 같지만 마지막 32자가 다르다면 이는 서버의 구성이 매우 유사하여 동일한 버전과 암호를 수락하지만 확장이 다르기 때문에 완전히 동일하지는 않다는 것을 의미합니다.
각 TLS 서버 헬로 메시지를 수신한 후 JARM은 FIN으로 연결을 정상 종료하여 소켓이 열려 있지 않도록 합니다.
JARM은 고성능 핑거프린트 함수이며 보안 암호 함수로 간주되거나 혼동되어서는 안 된다는 점에 유의해야 합니다. 우리는 JARM 지문을 기계가 소비할 수 있을 뿐만 아니라 사람이 소비할 수 있도록 설계했습니다. 즉, 눈으로 확인하고 공유하고 트윗할 수 있을 정도로 작으면서도 맥락적 세부 정보를 담을 수 있는 공간이 있습니다.
악성코드 명령 및 제어(C2) 서버와 악성 서버는 다른 서버와 마찬가지로 제작자가 구성한 후 자체 서버에 배포합니다. 따라서 고유한 JARM 지문을 생성하는 경향이 있습니다. 다음은 일반적인 악성코드 및 공격 도구와 Alexa Top 1M 웹사이트(2020년 10월 기준) 간의 JARM 중복 예시입니다:
Alexa Top 1M 웹사이트와 중복이 거의 없거나 전혀 없으므로, 조직 내 호스트가 이러한 JARM 지문을 가진 서버에 연결할 가능성은 낮습니다.
John Althouse - 최초 아이디어, 개념 및 프로젝트 리드 Andrew Smart - 개념 및 테스트 RJ Nunnally - 프로그래밍 및 테스트 Mike Brady - 프로그래밍 및 테스트
운영 사용을 위해 Python으로 재작성: Caleb Yu
| 도메인 | JARM |
|---|
| salesforce.com | 2ad2ad0002ad2ad00042d42d00000069d641f34fe76acdc05c40262f8815e5 |
| force.com | 2ad2ad0002ad2ad00042d42d00000069d641f34fe76acdc05c40262f8815e5 |
| google.com | 27d40d40d29d40d1dc42d43d00041d4689ee210389f4f6b4b5b1b93f92252d |
| youtube.com | 27d40d40d29d40d1dc42d43d00041d4689ee210389f4f6b4b5b1b93f92252d |
| gmail.com | 27d40d40d29d40d1dc42d43d00041d4689ee210389f4f6b4b5b1b93f92252d |
| facebook.com | 27d27d27d29d27d1dc41d43d00041d741011a7be03d7498e0df05581db08a9 |
| instagram.com | 27d27d27d29d27d1dc41d43d00041d741011a7be03d7498e0df05581db08a9 |
| oculus.com | 29d29d20d29d29d21c41d43d00041d741011a7be03d7498e0df05581db08a9 |
| 악성 서버 C2 | JARM 지문 | Alexa Top 1M과 중복 |
|---|
| Trickbot | 22b22b09b22b22b22b22b22b22b22b352842cd5d6b0278445702035e06875c | 0 |
| AsyncRAT | 1dd40d40d00040d1dc1dd40d1dd40d3df2d6a0c2caaa0dc59908f0d3602943 | 0 |
| Metasploit | 07d14d16d21d21d00042d43d000000aa99ce74e2c6d013c745aa52b5cc042d | 0 |
| Cobalt Strike | 07d14d16d21d21d07c42d41d00041d24a458a375eef0c576d23a7bab9a9fb1 | 0 |
| Merlin C2 | 29d21b20d29d29d21c41d21b21b41d494e0df9532e75299f15ba73156cee38 | 303 |