- xzbot은 xz 백도어(CVE-2024-3094)를 탐색하기 위한 저장소로, 허니팟, ED448 공개키 패치, 백도어 페이로드 형식, 원격 코드 실행 데모를 함께 제공함
- 허니팟은 OpenSSH에 간단한 패치를 적용해 백도어 형식과 맞는 공개키 N 값으로 들어오는 연결 시도를 sshd 로그에 남김
- ED448 패치는 백도어가 서명 검증과 페이로드 복호화에 쓰는 하드코딩 공개키를 사용자가 생성한 키로 바꿔 백도어를 트리거할 수 있게 함
- 백도어 페이로드는 SSH 인증서의 CA 서명키 N 값에 들어가며,
a * b + c로 요청 타입을 만들고 Type 2는 null 종료 명령을system()으로 실행함 - 데모 CLI는 취약 SSH 서버에 접속해 명령을 실행하는 흐름을 보여주며, 성공한 악용은 INFO 이상 로그를 생성하지 않음
xzbot의 범위와 구성
- xzbot은 xz 백도어인 CVE-2024-3094를 탐색하기 위한 프로젝트임
- 포함 항목은 네 가지임
- honeypot: 익스플로잇 시도를 탐지하기 위한 가짜 취약 서버
- ed448 patch: 자체 ED448 공개키를 쓰도록
liblzma.so를 패치 - backdoor format: 백도어 페이로드 형식 정리
- backdoor demo: ED448 개인키를 알고 있다는 가정에서 RCE를 트리거하는 CLI
허니팟: OpenSSH 패치로 시도 탐지
- openssh.patch는 백도어 형식과 맞는 공개키 N 값으로 들어오는 연결 시도를 기록하도록 OpenSSH에 적용하는 간단한 패치임
- 흐름은
openssh-portable을 클론한 뒤 패치를 적용하고autoreconf,configure,make를 실행하는 방식임 - 연결 시도는
sshd로그에xzbot: magic 1 [preauth]와 페이로드 바이트열 형태로 나타남
ED448 공개키 패치
- 백도어는 서명 검증과 페이로드 복호화에 하드코딩된 ED448 공개키를 사용함
- 이 공개키를 사용자가 가진 키로 교체하면 백도어를 트리거할 수 있음
- 저장소는 공격자 ED448 공개키와
seed=0으로 생성한 대체 공개키 값을 함께 제시함 - 시작 단계는 백도어가 포함된
liblzma.so.5.6.1공유 객체를 준비하는 것임- 예시 출처로
xz-utils 5.6.1-1Debian snapshot이 제시됨 pwntools설치 후patch.py liblzma.so.5.6.1를 실행하면liblzma.so.5.6.1.patch가 생성됨- 이후 수정된
liblzma.so.5.6.1.patch공유 객체를 사용해sshd를 실행함
- 예시 출처로
- assets에는 예시가 있음
백도어 페이로드 형식
- 백도어는 SSH 인증서로 연결할 때 CA 서명키 N 값 안에 페이로드를 넣어 트리거할 수 있음
- 이 페이로드는 공격자의 ED448 키로 암호화 및 서명되어야 함
- 바깥 구조는 다음 필드로 구성됨
a: 32비트b: 32비트c: 64비트ciphertext: 240바이트
- 요청 타입은
a * b + c로 파생됨- 값이 3보다 크면 백도어는 처리를 건너뜀
- Type 1: 용도 미상이며 0바이트를 기대함
- Type 2: null 종료 페이로드를
system()으로 실행함 - Type 3: 용도 미상이며 48바이트 서명 데이터를 기대함
ciphertext는 ED448 공개키의 처음 32바이트를 대칭키로 사용해 chacha20으로 암호화됨- 이 때문에 익스플로잇 시도는 제시된 32바이트 키로 복호화할 수 있음
- 복호화된
ciphertext내부에는 114바이트 서명,x와y1비트 필드, 길이, 명령 문자열 등이 들어감x또는y를 설정하면 약간 다른 코드 경로로 이어짐
- 서명은 RFC-8032 ED448 서명임
- 입력에는 32비트 magic 값, 명령 전 5바이트 필드, 선택적으로 명령의
length바이트, 서버 hostkey의 SHA-256 해시 앞 32바이트가 포함됨
- 입력에는 32비트 magic 값, 명령 전 5바이트 필드, 선택적으로 명령의
익스플로잇 데모 CLI
- CLI는 Go로 설치함
go install github.com/amlweems/xzbot@latest
xzbot -h는 세 가지 주요 옵션을 보여줌-addr: SSH 서버 주소, 기본값127.0.0.1:2222-seed: xz 백도어 키와 맞아야 하는 ED448 seed, 기본값0-cmd:system()으로 실행할 명령, 기본값id > /tmp/.xz
- 예시는
127.0.0.1:2222의 취약 SSH 서버에 접속해id > /tmp/.xz명령을 실행함 - 취약 서버에서
system()호출 위치에 watchpoint를 설정하면sshd프로세스가id > /tmp/.xz를 실행하는 모습을 볼 수 있음 - 실행 후
/tmp/.xz에는uid=0(root) gid=0(root) groups=0(root)출력이 남는 예시가 제시됨
프로세스 트리와 로그 특성
- 정상 SSH 접속의 프로세스 트리는
sshd의 사용자 세션과 셸로 이어짐 - 백도어 실행 예시는
xzbot -cmd 'sleep 60'이후sshd: root [priv],sshd: root [net],sh -c sleep 60,sleep 60이 나타나는 형태임 - 성공한 악용은 INFO 이상 로그 항목을 생성하지 않음