mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/generic-methodologies-and-resources/basic-forensic-meth
This commit is contained in:
parent
31abe92346
commit
454e787559
@ -24,8 +24,8 @@ sudo apt-get install -y yara
|
||||
```
|
||||
#### 규칙 준비
|
||||
|
||||
이 스크립트를 사용하여 github에서 모든 yara 악성코드 규칙을 다운로드하고 병합하세요: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\
|
||||
_**rules**_ 디렉토리를 만들고 실행하세요. 그러면 악성코드에 대한 모든 yara 규칙이 포함된 _**malware_rules.yar**_라는 파일이 생성됩니다.
|
||||
Use this script to download and merge all the yara malware rules from github: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\
|
||||
Create the _**rules**_ directory and execute it. This will create a file called _**malware_rules.yar**_ which contains all the yara rules for malware.
|
||||
```bash
|
||||
wget https://gist.githubusercontent.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9/raw/4ec711d37f1b428b63bed1f786b26a0654aa2f31/malware_yara_rules.py
|
||||
mkdir rules
|
||||
@ -67,7 +67,7 @@ clamscan folderpath #Scan the whole folder
|
||||
|
||||
### IOCs
|
||||
|
||||
IOC는 침해 지표(Indicator Of Compromise)를 의미합니다. IOC는 잠재적으로 원치 않는 소프트웨어나 확인된 **악성코드**를 식별하는 **조건 집합**입니다. 블루 팀은 이러한 정의를 사용하여 **시스템**과 **네트워크**에서 이러한 종류의 악성 파일을 **검색**합니다.\
|
||||
IOC는 침해 지표(Indicator Of Compromise)를 의미합니다. IOC는 잠재적으로 원치 않는 소프트웨어나 확인된 **악성코드**를 식별하는 **조건의 집합**입니다. 블루 팀은 이러한 정의를 사용하여 **시스템**과 **네트워크**에서 이러한 종류의 악성 파일을 **검색**합니다.\
|
||||
이러한 정의를 공유하는 것은 매우 유용합니다. 컴퓨터에서 악성코드가 식별되고 해당 악성코드에 대한 IOC가 생성되면, 다른 블루 팀이 이를 사용하여 악성코드를 더 빠르게 식별할 수 있습니다.
|
||||
|
||||
IOC를 생성하거나 수정하는 도구는 [**IOC Editor**](https://www.fireeye.com/services/freeware/ioc-editor.html)**입니다.**\
|
||||
@ -92,7 +92,7 @@ Compares process connection endpoints with C2 IOCs (new since version v.10)
|
||||
```
|
||||
### Linux Malware Detect
|
||||
|
||||
[**Linux Malware Detect (LMD)**](https://www.rfxn.com/projects/linux-malware-detect/)는 공유 호스팅 환경에서 직면하는 위협을 중심으로 설계된 GNU GPLv2 라이센스 하에 출시된 리눅스용 악성코드 스캐너입니다. 이 도구는 네트워크 엣지 침입 탐지 시스템의 위협 데이터를 사용하여 공격에 적극적으로 사용되는 악성코드를 추출하고 탐지를 위한 서명을 생성합니다. 또한, 위협 데이터는 LMD 체크아웃 기능과 악성코드 커뮤니티 리소스에서 사용자 제출을 통해 파생됩니다.
|
||||
[**Linux Malware Detect (LMD)**](https://www.rfxn.com/projects/linux-malware-detect/)는 GNU GPLv2 라이센스 하에 출시된 리눅스용 악성코드 스캐너로, 공유 호스팅 환경에서 직면하는 위협을 중심으로 설계되었습니다. 이 도구는 네트워크 엣지 침입 탐지 시스템의 위협 데이터를 사용하여 공격에 적극적으로 사용되는 악성코드를 추출하고 탐지를 위한 서명을 생성합니다. 또한, 위협 데이터는 LMD 체크아웃 기능과 악성코드 커뮤니티 리소스에서 사용자 제출을 통해 파생됩니다.
|
||||
|
||||
### rkhunter
|
||||
|
||||
@ -106,7 +106,7 @@ sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--sk
|
||||
|
||||
### PEpper
|
||||
|
||||
[PEpper](https://github.com/Th3Hurrican3/PEpper)는 실행 파일 내의 일부 기본 사항(이진 데이터, 엔트로피, URL 및 IP, 일부 yara 규칙)을 확인합니다.
|
||||
[PEpper](https://github.com/Th3Hurrican3/PEpper)는 실행 파일 내의 일부 기본 사항(바이너리 데이터, 엔트로피, URL 및 IP, 일부 yara 규칙)을 확인합니다.
|
||||
|
||||
### PEstudio
|
||||
|
||||
@ -114,7 +114,7 @@ sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--sk
|
||||
|
||||
### Detect It Easy(DiE)
|
||||
|
||||
[**DiE**](https://github.com/horsicq/Detect-It-Easy/)는 파일이 **암호화**되었는지 감지하고 **패커**를 찾는 도구입니다.
|
||||
[**DiE**](https://github.com/horsicq/Detect-It-Easy/)는 파일이 **암호화**되어 있는지 감지하고 **패커**를 찾는 도구입니다.
|
||||
|
||||
### NeoPI
|
||||
|
||||
@ -126,7 +126,7 @@ sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--sk
|
||||
|
||||
### Apple Binary Signatures
|
||||
|
||||
일부 **악성코드 샘플**을 확인할 때는 항상 이진 파일의 **서명**을 확인해야 하며, 서명한 **개발자**가 이미 **악성코드**와 **관련**되어 있을 수 있습니다.
|
||||
일부 **악성코드 샘플**을 확인할 때는 항상 바이너리의 **서명**을 확인해야 하며, 서명한 **개발자**가 이미 **악성코드**와 **관련**되어 있을 수 있습니다.
|
||||
```bash
|
||||
#Get signer
|
||||
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"
|
||||
@ -141,14 +141,96 @@ spctl --assess --verbose /Applications/Safari.app
|
||||
|
||||
### 파일 스태킹
|
||||
|
||||
웹 서버의 **파일**이 포함된 폴더가 **마지막으로 업데이트된 날짜**를 알고 있다면, **웹 서버의 모든 파일**이 **생성 및 수정된 날짜**를 **확인**하고, **의심스러운** 날짜가 있다면 해당 파일을 확인하십시오.
|
||||
웹 서버의 **파일**이 포함된 폴더가 **마지막으로 업데이트된 날짜**를 알고 있다면, **웹 서버의 모든 파일**이 **생성 및 수정된 날짜**를 **확인**하고, 어떤 날짜가 **의심스럽다면**, 해당 파일을 확인하세요.
|
||||
|
||||
### 기준선
|
||||
|
||||
폴더의 파일이 **수정되지 않아야 하는 경우**, 폴더의 **원본 파일**의 **해시**를 계산하고 **현재** 파일과 **비교**할 수 있습니다. 수정된 것은 **의심스러운** 것으로 간주됩니다.
|
||||
폴더의 파일이 **수정되지 않아야 한다면**, 폴더의 **원본 파일**의 **해시**를 계산하고 **현재** 파일과 **비교**할 수 있습니다. 수정된 것은 **의심스럽습니다**.
|
||||
|
||||
### 통계 분석
|
||||
|
||||
정보가 로그에 저장될 때, 각 웹 서버의 파일이 얼마나 자주 접근되었는지와 같은 **통계를 확인**할 수 있으며, 웹 셸이 가장 많이 접근된 파일 중 하나일 수 있습니다.
|
||||
정보가 로그에 저장될 때, 각 웹 서버의 파일이 얼마나 자주 접근되었는지와 같은 **통계를 확인**할 수 있습니다. 웹 셸이 가장 많이 접근될 수 있습니다.
|
||||
|
||||
---
|
||||
|
||||
## 동적 제어 흐름 디오브스큐레이션 해제 (JMP/CALL RAX 디스패처)
|
||||
|
||||
현대의 악성코드 패밀리는 제어 흐름 그래프 (CFG) 난독화를 심각하게 악용합니다: 직접적인 점프/호출 대신 런타임에 목적지를 계산하고 `jmp rax` 또는 `call rax`를 실행합니다. 작은 *디스패처* (일반적으로 아홉 개의 명령어)는 CPU의 `ZF`/`CF` 플래그에 따라 최종 대상을 설정하여 정적 CFG 복구를 완전히 방해합니다.
|
||||
|
||||
이 기술은 SLOW#TEMPEST 로더에 의해 보여지며, IDAPython과 Unicorn CPU 에뮬레이터에만 의존하는 세 단계의 워크플로우로 무력화할 수 있습니다.
|
||||
|
||||
### 1. 모든 간접 점프 / 호출 찾기
|
||||
```python
|
||||
import idautils, idc
|
||||
|
||||
for ea in idautils.FunctionItems(idc.here()):
|
||||
mnem = idc.print_insn_mnem(ea)
|
||||
if mnem in ("jmp", "call") and idc.print_operand(ea, 0) == "rax":
|
||||
print(f"[+] Dispatcher found @ {ea:X}")
|
||||
```
|
||||
### 2. 디스패처 바이트 코드 추출
|
||||
```python
|
||||
import idc
|
||||
|
||||
def get_dispatcher_start(jmp_ea, count=9):
|
||||
s = jmp_ea
|
||||
for _ in range(count):
|
||||
s = idc.prev_head(s, 0)
|
||||
return s
|
||||
|
||||
start = get_dispatcher_start(jmp_ea)
|
||||
size = jmp_ea + idc.get_item_size(jmp_ea) - start
|
||||
code = idc.get_bytes(start, size)
|
||||
open(f"{start:X}.bin", "wb").write(code)
|
||||
```
|
||||
### 3. Unicorn으로 두 번 에뮬레이트하기
|
||||
```python
|
||||
from unicorn import *
|
||||
from unicorn.x86_const import *
|
||||
import struct
|
||||
|
||||
def run(code, zf=0, cf=0):
|
||||
BASE = 0x1000
|
||||
mu = Uc(UC_ARCH_X86, UC_MODE_64)
|
||||
mu.mem_map(BASE, 0x1000)
|
||||
mu.mem_write(BASE, code)
|
||||
mu.reg_write(UC_X86_REG_RFLAGS, (zf << 6) | cf)
|
||||
mu.reg_write(UC_X86_REG_RAX, 0)
|
||||
mu.emu_start(BASE, BASE+len(code))
|
||||
return mu.reg_read(UC_X86_REG_RAX)
|
||||
```
|
||||
`run(code,0,0)` 및 `run(code,1,1)`을 실행하여 *false* 및 *true* 분기 대상을 얻습니다.
|
||||
|
||||
### 4. 직접 점프 / 호출 패치하기
|
||||
```python
|
||||
import struct, ida_bytes
|
||||
|
||||
def patch_direct(ea, target, is_call=False):
|
||||
op = 0xE8 if is_call else 0xE9 # CALL rel32 or JMP rel32
|
||||
disp = target - (ea + 5) & 0xFFFFFFFF
|
||||
ida_bytes.patch_bytes(ea, bytes([op]) + struct.pack('<I', disp))
|
||||
```
|
||||
패치 후, IDA가 함수를 다시 분석하도록 강제하여 전체 CFG와 Hex-Rays 출력을 복원합니다:
|
||||
```python
|
||||
import ida_auto, idaapi
|
||||
idaapi.reanalyze_function(idc.get_func_attr(ea, idc.FUNCATTR_START))
|
||||
```
|
||||
### 5. 간접 API 호출 레이블 지정
|
||||
|
||||
모든 `call rax`의 실제 목적지가 알려지면 IDA에 그것이 무엇인지 알려줄 수 있으므로 매개변수 유형 및 변수 이름이 자동으로 복구됩니다:
|
||||
```python
|
||||
idc.set_callee_name(call_ea, resolved_addr, 0) # IDA 8.3+
|
||||
```
|
||||
### Practical benefits
|
||||
|
||||
* 실제 CFG를 복원 → 디컴파일이 *10* 줄에서 수천 줄로 증가합니다.
|
||||
* 문자열 교차 참조 및 xrefs를 가능하게 하여 행동 재구성이 간단해집니다.
|
||||
* 스크립트는 재사용 가능: 동일한 트릭으로 보호된 로더에 드롭할 수 있습니다.
|
||||
|
||||
---
|
||||
|
||||
## References
|
||||
|
||||
- [Unit42 – Evolving Tactics of SLOW#TEMPEST: A Deep Dive Into Advanced Malware Techniques](https://unit42.paloaltonetworks.com/slow-tempest-malware-obfuscation/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user