Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
mquire — 제로 의존성 리눅스 메모리 포렌식: 커널 내장 BTF 및 kallsyms를 활용하여 외부 디버그 정보 없이 타입 인식 메모리 분석을 수행합니다. | Kitploit
도구/GitHubGitHub/trailofbits/mquire
OSINT (Open Source Intelligence)Memory ForensicsVulnerability AnalysisReverse EngineeringForensicsMalware AnalysisDigital ForensicsBinary AnalysisThreat IntelligenceLearning & EducationIncident Response
18484623일 전Kitploit 검토 완료

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
GitHub
trailofbits/mquire

mquire

제로 의존성 리눅스 메모리 포렌식: 커널 내장 BTF 및 kallsyms를 활용하여 외부 디버그 정보 없이 타입 인식 메모리 분석을 수행합니다.

저장소 보기웹사이트

mquire

mquire는 memory와 inquire 단어를 합친 것으로, osquery에서 영감을 받은 메모리 쿼리 도구입니다.

주요 장점: 외부 디버그 심볼 필요 없음

mquire는 외부 디버그 심볼 없이 Linux 커널 메모리 스냅샷을 분석할 수 있습니다.

분석에 필요한 모든 것은 메모리 덤프 자체에 이미 포함되어 있습니다. 즉, 다음을 분석할 수 있습니다:

  • 이전에 본 적 없는 알 수 없거나 사용자 정의 커널
  • 준비 없이 모든 Linux 배포판
  • 외부 디버그 심볼을 사용할 수 없거나 분실된 메모리 스냅샷

요구 사항

커널 버전 요구 사항:

  • BTF 지원: BTF가 활성화된 커널 4.18 이상 (대부분의 최신 배포판은 기본적으로 활성화됨)
  • Kallsyms 지원: 커널 6.4 이상 (scripts/kallsyms.c 형식 변경으로 인해)

작동 방식

mquire는 최신 Linux 커널에 내장된 두 가지 유형의 정보를 읽어 커널 메모리를 분석합니다:

  1. BTF의 유형 정보 (BPF Type Format) - 커널 데이터 유형의 구조와 레이아웃을 설명합니다. BTF 데이터는 btfparse crate를 사용하여 파싱됩니다.
  2. Kallsyms의 심볼 정보 - 커널 심볼의 메모리 위치를 제공합니다 (/proc/kallsyms에서 사용하는 동일한 데이터).

유형 정보와 심볼 위치를 결합함으로써 mquire는 다음과 같은 복잡한 커널 데이터 구조를 찾고 읽을 수 있습니다:

  • 프로세스 메모리 매핑 (maple tree 구조 사용)
  • 캐시된 파일 데이터 (XArray 구조 사용)
  • 커널 로그 메시지

이를 통해 디스크에서 삭제된 경우에도 커널의 파일 캐시에서 직접 파일을 추출할 수 있습니다.

호환성 참고 사항

Kallsyms 스캐너는 커널 소스의 scripts/kallsyms.c 데이터 형식에 의존합니다. 향후 커널 버전에서 이 형식이 변경되면 스캐너 휴리스틱을 업데이트해야 할 수 있습니다.

기능

테이블

mquire는 시스템의 다양한 측면이나 도구 자체의 상태를 쿼리하기 위한 SQL 테이블을 제공합니다.

mquire는 데이터베이스가 아닙니다. 각 쿼리는 메모리를 스캔하고 포인터를 따라가며 커널 데이터 구조를 재구성합니다. 미리 계산된 인덱스나 캐시된 결과는 없습니다. 모든 테이블 액세스는 커널 데이터를 순회하는 것입니다. 중복 스캔을 방지하려면 AS MATERIALIZED를 사용하고(Query Optimization 참조), task_open_files 및 memory_mappings와 같은 프로세스별 테이블을 쿼리할 때는 task와 같은 제약 조건을 제공하여 단일 프로세스로 스캔을 제한하세요.

설계 원칙: 가상 주소를 조인 키로 사용. 테이블은 virtual_address(기본 데이터 구조의 커널 주소)를 표준 조인 키로 사용합니다. pid나 다른 사용자에게 보이는 식별자가 아닙니다. 이는 의도적인 것입니다. 동일한 PID가 여러 검색 소스와 루트 작업에 걸쳐 여러 번 나타날 수 있지만, 가상 주소는 특정 커널 객체를 고유하게 식별하기 때문입니다. SQL 테이블과 기본 LinuxOperatingSystem API 모두 이 규칙을 중심으로 구축되었습니다.

시스템 정보

  • os_version - 커널 버전 및 아키텍처
  • system_info - 호스트 이름 및 도메인 이름
  • boot_time - 시스템 부팅 시간
  • kallsyms - 커널 심볼 주소 (/proc/kallsyms와 동일한 데이터)
  • dmesg - 커널 링 버퍼 메시지 (dmesg 명령어와 동일한 데이터)

프로세스 정보

  • tasks - 명령줄 및 바이너리 경로와 함께 실행 중인 프로세스. 각 작업은 여러 독립적인 소스를 통해 발견되며, 이는 루트킷 탐지에 유용합니다. 루트킷 탐지를 위한 작업 열거 방법 비교 및 중복 제거된 프로세스 목록을 참조하세요.
  • task_open_files - 각 프로세스가 연 파일 (대상 분석을 위해 task 제약 조건을 제공하거나 모든 작업을 한 번에 쿼리)
  • memory_mappings - 각 프로세스가 매핑한 메모리 영역 (대상 분석을 위해 task 제약 조건을 제공하거나 모든 작업을 한 번에 쿼리)
  • task_capabilities - 작업에 대한 Linux capability 집합 (effective, permitted, inheritable, bounding, ambient). task 제약 조건이 필요하므로 tasks/processes와 조인하세요 (예: JOIN task_capabilities c ON c.task = p.virtual_address).
  • task_ptrace_flags - 주어진 작업의 ptrace 필드를 디코딩합니다. task 제약 조건이 필요합니다.

커널 모듈

  • kernel_modules - 메타데이터(이름, 상태, 버전, 매개변수, 오염 플래그)와 함께 로드된 커널 모듈
  • kernel_module_mem_entries - 커널 모듈 객체의 mem 항목. kernel_module 제약 조건이 필요하므로 kernel_modules와 조인하세요 (예: JOIN kernel_module_mem_entries r ON r.kernel_module = m.virtual_address).
  • ftrace_ops - 기본적으로 ftrace_ops_list 심볼에서부터 탐색한 struct ftrace_ops 노드 목록. 단일 노드를 읽으려면 virtual_address를 제한하고, 임의의 노드에서부터 탐색하려면 start_vaddr(선택적으로 end_vaddr로 범위 지정)를 제한하세요.

네트워크 정보

  • network_connections - 활성 네트워크 연결 (TCP 소켓)
  • network_interfaces - IP 주소 및 MAC 주소가 있는 네트워크 인터페이스

파일 시스템

  • syslog_file - 커널의 파일 캐시에서 읽은 시스템 로그 (로그 파일이 삭제되었거나 사용할 수 없어도 메모리에 캐시되어 있으면 작동)

디버깅

  • mquire_diagnostics - 분석 진행 상황, 경고 및 오류를 표시하는 내부 mquire 로그

명령어

mquire는 세 가지 주요 명령어를 제공합니다:

  • mquire shell - 메모리 스냅샷을 쿼리하기 위한 대화형 SQL 셸 시작
  • mquire query - 단일 SQL 쿼리 실행 및 결과 출력 (JSON 또는 테이블 형식 지원)
  • mquire command - 메모리 스냅샷에서 사용자 정의 명령어 실행 (예: .task_tree, .system_version, .dump)

점(dot) 명령어

mquire는 SQL 쿼리와 구분하기 위해 점(.)으로 시작하는 특수 명령어를 제공합니다.

내장 명령어

이 명령어들은 대화형 셸과 mquire query에서 작동합니다:

  • .tables - 사용 가능한 모든 테이블 나열
  • .schema - 모든 테이블의 스키마 표시
  • .schema <table> - 특정 테이블의 스키마 표시
  • .commands - 사용 가능한 모든 사용자 정의 명령어 나열
  • .exit - 대화형 셸 종료 (셸 전용)

사용자 정의 명령어

이 명령어들은 대화형 셸과 mquire command에서 작동합니다:

--help를 사용하여 사용 가능한 옵션과 사용 정보를 확인하세요. 예: .task_tree --help

.system_version

운영 체제 버전 정보를 표시합니다.

이 명령어는 SELECT * FROM os_version과 동일하지만, 형식화된 출력을 제공하는 편의 명령어입니다.

.task_tree

Linux의 pstree 명령어와 유사하게 실행 중인 프로세스 및 스레드의 계층 트리를 표시합니다.

옵션:

  • --show-threads - 프로세스 외에 스레드도 포함합니다. 활성화되면 각 항목에 대해 TGID와 TID를 모두 표시합니다.
  • --use-real-parent - 트리 구조를 작성할 때 parent 대신 real_parent 필드를 사용합니다. real_parent 필드는 재부모화 전의 원래 부모 프로세스를 보여줍니다 (부모 프로세스가 종료된 후에도 프로세스 생성 체인을 추적하는 데 유용).

참고:

  • 형식은 스레드 표시 시 [TGID TID], 스레드 숨김 시 [TGID]입니다. TGID(Thread Group ID)는 일반적으로 PID라고 불리는 것입니다. 메인 스레드(TGID == TID인 경우)는 두 값이 동일합니다.

.carve

가상 메모리 영역을 디스크로 추출합니다. 이 명령어는 주어진 페이지 테이블을 사용하여 특정 가상 주소 범위에서 원시 메모리 내용을 추출하며, 프로세스 메모리, 힙 내용 또는 기타 메모리 영역을 추출하는 데 유용합니다.

인수:

  • ROOT_PAGE_TABLE - 루트 페이지 테이블의 물리적 주소 (선택적 0x 접두사가 있는 16진수 문자열). 변환에 사용할 주소 공간을 결정합니다.
  • VIRTUAL_ADDRESS - 추출을 시작할 가상 주소 (선택적 0x 접두사가 있는 16진수 문자열).
  • SIZE - 추출할 바이트 수.
  • DESTINATION_PATH - 추출된 메모리가 기록될 출력 파일 경로.

참고:

  • 명령어는 쓰기 전에 매핑된 영역과 매핑되지 않은 영역의 요약을 표시합니다.
  • 매핑되지 않은 영역은 출력 파일에서 0으로 채워집니다.

.dump

커널의 파일 캐시에서 파일을 추출하여 메모리에서 직접 파일을 복구합니다. 이 명령어는 모든 작업과 해당 열린 파일 디스크립터를 반복하며 페이지 캐시에서 파일 내용을 추출합니다.

인수:

  • OUTPUT - 추출된 파일의 출력 디렉터리. 파일은 TGID별로 구성됩니다 (예: tgid_1234/path/to/file).

참고:

  • 현재 파일 디스크립터(프로세스 파일 디스크립터 테이블에서)를 통해 열린 파일에 대해 작동합니다.
  • 아직 메모리 매핑된 파일에서 데이터 추출을 지원하지 않습니다.
  • 빈 파일(페이지 캐시에 데이터가 없음)은 건너뜁니다.
  • 읽기 오류가 있는 영역은 출력에서 0으로 채워집니다.

사용 사례

mquire는 다음을 위해 설계되었습니다:

  • 포렌식 분석 - 손상된 시스템의 메모리 스냅샷을 분석하여 실행 중인 프로세스와 액세스된 파일을 확인
  • 사고 대응 - 메모리 덤프를 신속하게 쿼리하여 악성 활동의 증거를 찾음
  • 보안 연구 - 메모리 스냅샷에서 커널 내부 및 프로세스 동작 연구
  • 악성코드 분석 - 탐지되지 않고 실행 중인 프로세스와 파일 작업을 검사
  • 사용자 정의 도구 - 커널 메모리 분석을 위한 재사용 가능한 API를 제공하는 mquire 라이브러리 크레이트를 사용하여 자체 분석 도구 구축

빌드 및 설치

CI에서 사전 빌드된 패키지

사전 빌드된 패키지는 CI 실행의 산출물로 제공됩니다. Actions 탭에서 성공적인 워크플로 실행을 선택하고 산출물을 다운로드하여 받을 수 있습니다. 다음 패키지 형식을 사용할 수 있습니다:

  • linux-deb-package - Debian/Ubuntu .deb 패키지
  • linux-rpm-package - Fedora/RHEL/CentOS .rpm 패키지
  • linux-tgz-package - 일반 Linux .tar.gz 아카이브

소스에서 빌드

mquire는 Rust로 작성되었습니다. 빌드하려면:```bash

Clone the repository

git clone https://github.com/trailofbits/mquire cd mquire

Build the project

cargo build --release

The binary will be in target/release/

- mquire: Unified tool with shell, query, and command modes

## 지원되는 스냅샷 형식

mquire는 다음 메모리 스냅샷 형식을 지원하며, 파일 확장자로 감지됩니다:

| 형식 | 확장자 | 설명 |
|--------|-----------|-------------|
| Raw | `.raw` | 평면 물리 메모리 덤프 (물리 주소 공간의 바이트 단위 복사본) |
| LiME | `.lime` | 주소 범위 헤더가 있는 [Linux Memory Extractor](https://github.com/504ensicsLabs/LiME) 형식 |
| ELF 코어 | `.elf` | PT_LOAD 세그먼트가 포함된 ELF 코어 덤프 (`virsh dump` 또는 QEMU `dump-guest-memory`에서 생성된 형태) |

## 메모리 스냅샷 획득

### AVML 사용 (권장)

라이브 Linux 시스템에서 메모리 스냅샷을 획득하려면 [AVML](https://github.com/microsoft/avml)을 권장합니다. 이전에는 [LiME](https://github.com/504ensicsLabs/LiME)가 제안되었으나 더 이상 적극적으로 유지 관리되지 않습니다.```bash
sudo avml output.lime

중요: mquire용 스냅샷을 획득할 때 --compress를 사용하지 마십시오. mquire는 압축된 AVML 스냅샷을 지원하지 않습니다. 압축된 스냅샷이 있는 경우 먼저 avml-convert를 사용하여 압축을 해제하십시오: avml-convert compressed.lime uncompressed.lime

추가 옵션은 AVML 문서를 참조하십시오.

virsh 사용 (가상 머신)

libvirt/KVM 가상 머신의 경우 virsh dump를 사용하여 ELF 코어 덤프를 생성하십시오:```bash virsh -c qemu:///system dump output.elf --memory-only --format elf

VM은 덤프 중에 일시 중지되고 이후에 재개됩니다. `--live`를 추가하면 일시 중지를 피할 수 있지만, 스냅샷 일관성이 떨어집니다.

## 시작하기

메모리 스냅샷을 얻으면 SQL 쿼리와 사용자 정의 명령을 사용하여 상호작용할 수 있습니다. mquire는 스냅샷과 상호작용하는 세 가지 방법을 제공합니다:

### 대화형 셸
도구 다운로드