SecurityHeroblog

같은 동, 세 번째 집 — 이번 상자엔 관리실 스티커가 붙어 있었다

9월 17일, 8월에 두 번 파일을 나눠 주던 주소와 앞 세 자리가 같은 세 번째 주소가 나타났습니다. 거기서 온 파일 일곱 개는 전부 27일치 기록에 없던 것이고, 다섯 개는 리눅스가 스스로 돌리는 프로그램 이름을 닮은 이름표를 달고 있었습니다. 그런데 이 일곱 개를 들고 온 침입은 그날 기록이 남은 세션 다섯 건 어디에도 없었습니다.

아파트 한 동을 떠올려 보세요. 8월 21일에 그 동의 어느 집에서 우리 집 앞에 상자 세 개를 놓고 갔습니다. 며칠 뒤에는 같은 동 다른 집에서 또 상자를 놓고 갔습니다. 라벨은 매번 달랐습니다.

어제 그 동에서 세 번째 집이 우리 집 앞에 상자를 놓고 갔습니다. 이번엔 일곱 개입니다. 그중 다섯 개에는 ‘관리실 비품’ 이라고 적힌 스티커가 붙어 있습니다. 관리실 물건이면 아무도 열어 보지 않습니다. 하나는 나머지 다섯을 다 합친 것보다 다섯 배 큽니다. 그리고 그 큰 상자에는 공장에서 찍은 제조 번호 스티커가 떼지지 않은 채 그대로 있습니다.

그런데 이상한 게 하나 있습니다. 복도 CCTV 화면 다섯 개를 다 돌려 봤는데, 상자를 들고 온 사람이 어디에도 안 찍혔습니다.

어제 우리 서버에 찍힌 게 이겁니다.

우리 서버는 일부러 안 잠근 집입니다

사실 우리는 허니팟 서버를 돌립니다. 허니팟은 일부러 허술하게 열어 두고 누가 들어와 무엇을 하는지 지켜보는 미끼 서버입니다. 현관을 안 잠근 빈집이라고 보면 됩니다. 그래서 여기서 벌어진 일은 진짜 피해가 아니라 관찰 기록입니다.

사실 어제 상자 일곱 개를 들고 온 쪽에는 ATK-5165FA 라는 별칭을 붙였습니다. 별칭은 신원이 아닙니다. 글과 글 사이에서 같은 가림 처리된 출발지를 이어 부르려고 붙인 표식일 뿐입니다. 이 별칭은 우리 아카이브 27일치(8월 16일~9월 15일) 어디에도 없던 새 별칭입니다. 그리고 이 글에서는 이 별칭의 IP 를 가림 처리된 형태로도 적지 못합니다. 이유는 아래 ’들고 온 사람이 안 찍혔다’에서 말합니다.

같은 동, 세 번째 집

사실 인터넷 주소(IP)는 점으로 나뉜 네 칸짜리 숫자입니다. 어제 파일 일곱 개가 온 주소는 hxxp://176[.]65[.]139[.]206/ 입니다. 주소를 이렇게 이상하게 적는 건 오타가 아닙니다. 실수로 눌러 접속하는 일이 없도록 http 를 hxxp 로, 점을 [.] 로 바꿔 두는 관행입니다. 디팽(defang), 이빨을 뽑아 둔다는 뜻입니다.

사실 이 주소의 앞 세 칸 176.65.139 는 8월에 두 번 본 적이 있습니다. 앞 세 칸이 같고 마지막 칸만 다른 주소는 같은 동에 있는 다른 집과 비슷합니다. 아래 표의 마지막 칸과 라벨을 봐 주세요.

날짜 주소 (디팽) 상자 라벨 — 파일 이름 규칙 PC용(x86) 파일
8월 21일 176[.]65[.]139[.]196 /bins/kla · px86 · pmips — ‘p + CPU 종류’ 있음
8월 23~25일 176[.]65[.]139[.]202 telnet.sh + daredevil.armv5l · armv6l · armv7l · mips · mipsel — ‘daredevil. + CPU 종류’ 0건
9월 17일 176[.]65[.]139[.]206 kworkerd-irq-bal · kworkerd-blkcg · kworkerd-irq · kworkerd-netns-rt · kworkerd-softirq + w.sh + armv5l — ‘kworkerd- + 커널 이름’ 0건

사실 첫 집은 8월 21일 글에서 ’기록 5일치에 한 번도 없던 곳’으로 처음 나왔습니다. 둘째 집은 8월 23일부터 사흘 연속 나왔습니다. 그리고 둘째 집이 마지막으로 보인 8월 25일부터 어제까지 23일 만에 셋째 집이 나왔습니다. 집이 바뀔 때마다 라벨 규칙도 세 번 다 바뀌었습니다.

추정 말할 수 있는 건 여기까지입니다. 마지막 칸이 다르니 같은 기계는 아닙니다. 같은 동에 산다고 같은 가족은 아니듯, 세 집이 같은 사람의 것인지는 확인할 수단이 없습니다. 앞 세 칸이 같다는 사실만 있습니다.

상자 일곱 개를 열어 보면

사실 일곱 개는 이렇습니다. 크기 칸에서 ⑦번 줄을 봐 주세요.

# 파일 이름 크기(바이트) 종류 비고
① kworkerd-irq-bal 274,516 ELF 32비트 ARM 정적 링크 · 이름표 제거
② kworkerd-blkcg 265,836 ELF 32비트 ARM 정적 링크 · 이름표 제거
③ kworkerd-irq 275,476 ELF 32비트 ARM 정적 링크 · 이름표 제거
④ kworkerd-netns-rt 386,320 ELF 32비트 MIPS (빅엔디언) 정적 링크 · 이름표 제거
⑤ kworkerd-softirq 287,260 ELF 32비트 ARM 정적 링크 · 이름표 제거
⑥ w.sh 1,237 텍스트 (CRLF 줄바꿈) 문자 메시지 예닐곱 줄 분량
⑦ armv5l 7,405,752 ELF 32비트 ARM 이름표 제거 표기 없음 · BuildID 남아 있음

사실 용어를 풀면 이렇습니다. ELF 는 리눅스에서 프로그램 파일이 쓰는 규격 이름입니다. ARM 과 MIPS 는 CPU 종류인데, 공유기나 홈캠처럼 작은 장비에 흔히 들어가는 쪽입니다. PC 나 서버에 흔한 x86 계열은 일곱 개 중 하나도 없습니다. 정적 링크는 프로그램이 쓸 부품을 전부 안에 넣어 통째로 만들었다는 뜻입니다. 남의 기계에 가서도 부품을 빌릴 필요가 없으니 잘 돌아갑니다. ’이름표 제거’는 만든 사람이 붙여 둔 내부 표식을 배포 전에 떼어냈다는 뜻이고, 그러면 뜯어보기 어려워집니다. ④번의 빅엔디언은 숫자를 읽는 순서가 반대인 CPU 종류라는 말입니다.

사실 ①~⑤ 다섯 개는 평균 297,882바이트입니다. 스마트폰 사진 한 장의 10분의 1쯤 됩니다. 그런데 ⑦번은 7,405,752바이트입니다. 스마트폰 사진 두세 장 크기입니다. 다섯 개 평균의 24.9배이고, 다섯 개를 다 합쳐도(1,489,408바이트) ⑦번 하나의 5분의 1이 안 됩니다. 어제 이 서버에 저장된 파일 13개 중 압도적으로 가장 큽니다. 같은 이름 규칙으로 8월 24일에 왔던 daredevil.armv5l 은 50,096바이트였으니, 그것과 견주면 148배입니다.

사실 ⑦번에는 하나 더 있습니다. BuildID 가 남아 있습니다. BuildID 는 프로그램을 만들 때 자동으로 찍히는 제조 번호 같은 값입니다. 다른 다섯 개는 이름표를 지웠는데, 이 큰 파일만 제조 번호 스티커를 떼지 않은 채 왔습니다. 값 자체는 우리 재료에서 표기가 잘려 있을 수 있어 옮기지 않습니다.

사실 일곱 개 모두 각각 딱 한 번씩 저장됐고, 합치면 8,896,397바이트입니다. 그리고 일곱 개의 해시가 전부 아카이브 27일치에 없습니다. 해시는 파일 내용을 통째로 계산해 만든 지문이라 한 글자만 달라도 값이 바뀝니다. 즉 일곱 개 다 처음 보는 내용물입니다.

관리실 스티커

사실 다섯 개의 이름을 다시 보세요. kworkerd, irq, softirq, blkcg, netns. 리눅스가 켜져 있는 동안 스스로 돌리는 작은 프로그램들이 있습니다. 실행 중인 프로그램 목록을 열면 kworker, ksoftirqd, irq/…, blkcg, netns 같은 이름으로 늘 떠 있습니다. 커널 스레드라고 부릅니다. 아파트로 치면 관리실 직원입니다. 늘 복도에 있어서 아무도 “누구세요” 하고 묻지 않습니다.

추정 어제 다섯 파일의 이름은 이 관리실 직원 이름과 닮은 문자열입니다. 프로그램 목록을 훑는 눈에 안 띄게 하려는 이름 선택으로 읽힙니다. 다만 여기서 멈춥니다. 파일이 실제로 실행됐을 때 목록에 어떤 이름으로 뜨는지는 파일 내용이 우리 재료에 없어 확인할 수 없습니다. 스티커가 붙어 있다는 것까지가 사실이고, 그 스티커로 사람을 속였는지는 모릅니다.

사실 한 가지 더 눈에 띄는 게 있습니다. 첫 집(px86, pmips)과 둘째 집(daredevil.armv5l, daredevil.mips…)은 라벨에 CPU 종류를 그대로 적었습니다. 어제 다섯 개는 그걸 지웠습니다. 대신 관리실 이름을 붙였습니다.

추정 ⑥번 w.sh 는 줄바꿈이 CRLF 입니다. CRLF 는 윈도우 편집기가 기본으로 쓰는 줄바꿈이라, 이 스크립트를 윈도우에서 썼을 가능성이 있습니다. 하지만 리눅스에서도 만들 수 있어서 단정하지 않습니다. 이 스크립트가 나머지 여섯 개를 내려받는 안내문(로더)인지도 내용이 없어 알 수 없습니다. 다만 일곱 개가 한 별칭·한 유포지에서 각 1회씩 나온 모양은 한 번의 절차로 묶여 내려왔다는 쪽에 맞습니다.

들고 온 사람이 안 찍혔다

사실 우리 재료에는 하루에 기록이 가장 촘촘한 세션 다섯 건이 따로 실립니다. 복도 CCTV 화면 다섯 개라고 보면 됩니다. 어제 그 다섯 화면에 찍힌 별칭은 ATK-A593DF, ATK-BDB53E(2회), ATK-73181C, ATK-CA5936 입니다. ATK-5165FA 는 없습니다. 이 별칭은 ‘파일을 배달한 곳’ 칸에만 이름이 있습니다.

사실 그래서 이 침입에 대해 모르는 게 많습니다. 몇 시에 왔는지, 텔넷인지 SSH 인지, 명령을 몇 개 쳤는지, 화면이 녹화됐는지, 가림 처리된 IP 가 무엇인지. 전부 JSON 에 없습니다. 상자 일곱 개가 놓였다는 사실만 있고, 놓고 간 사람은 어느 화면에도 없습니다.

추정 다섯 화면이 ’기록 촘촘한 순서 상위 5건’이라면, 이 침입의 기록은 다섯 번째(완결성 14)보다 덜 촘촘했다는 뜻이 됩니다. 하지만 선정 기준이 JSON 에 적혀 있지 않아 이것도 추정입니다. 그래서 오늘 글은 ’한 침입을 따라가기’가 아니라 **‘한 집에서 온 상자 일곱 개를 따라가기’**입니다.

시간 순서로 늘어놓으면 이렇게 됩니다. 주제 줄에 시각이 없다는 점과, 12:06 의 두 줄이 2초 간격이라는 점을 봐 주세요.

  1. 사실 ATK-A593DF(61.245.x.x) 텔넷 로그인 성공. 00:56:36Z 까지 22.7초 · 명령 8개 · 다운로드 1건. 의도: 실행 권한 부여 · 파일 다운로드. 받아 간 파일은 9바이트 ASCII 텍스트(0dc95fb4… · 관측 2회). 별칭·해시 모두 아카이브에 없다. 화면 녹화됨(내용은 재료에 없음). 완결성 14
  2. 사실 ATK-BDB53E(160.119.x.x) 텔넷 로그인 성공. 03:06:41Z 까지 6.98초 · 명령 7개 · 다운로드 2건. 의도: 다운로드 후 실행 · 실행 권한 부여 · 파일 다운로드. 완결성 19. 9/15 주제 세션과 명령 수 · 다운로드 수 · 의도 · 완결성이 전부 같다
  3. 사실 같은 별칭 ATK-BDB53E 두 번째 세션. 첫 세션 시작 2.33초 뒤에 시작해 첫 세션이 끝나기 전에 겹쳐 돌았다. 4.75초 · 명령 2개 · 다운로드 2건 · 의도 3개 동일 · 완결성 16. 9/15 에는 두 세션이 6시간 59분 떨어져 있었는데 오늘은 2초 간격 병렬이다
  4. 사실 hxxp://160[.]119[.]66[.]206/bins/kla.sh (3,241바이트 POSIX 셸 스크립트 · 39be6853…) 와 hxxp://160[.]119[.]66[.]206/bins/net.x86_64 (190,632바이트 ELF 64-bit x86-64 · 정적 링크 · 이름표 제거 · cd6ccc5d…). 둘 다 오늘 관측 2회. sha256 은 9/15 와 동일 — 이틀 사이 다시 만들어지지 않았다
  5. 사실 ATK-73181C(124.158.x.x) 텔넷 로그인 성공. 04:40:35Z 까지 65.4초 · 명령 17개 — 오늘 기록된 세션 중 가장 길고 명령이 가장 많다. 의도 5개: 정찰—시스템 · 파일 다운로드 · 실행 권한 부여 · 다운로드 후 실행 · 지속성—SSH 키 심기. 그런데 다운로드 수는 0. 완결성 17. 별칭은 아카이브에 없다
  6. 추정 '파일 다운로드' · 'SSH 키 심기' 의도가 붙었는데 저장된 파일이 0개다. 다운로드가 실패했거나, 키가 파일이 아니라 명령 안의 문자열로 심어졌을 가능성이 있다. 명령 원문이 재료에 없어 어느 쪽인지 확인할 수 없다. 8/18(63초 · 키 심기 · 저장 파일 0)과 같은 모양이다
  7. 사실 ATK-CA5936(130.12.x.x) SSH 로그인 성공. 3.72초 · 명령 1개 · 다운로드 2건 · 의도 5개. 지문 16443846… / SSH-2.0-Go. 파일은 399바이트 OpenSSH 개인키(43728fbf…)와 54바이트 ASCII(00b6f15c…)로 8/19 이후 같은 해시. 오늘의 주제가 아니다
  8. 사실 오늘의 주제. ATK-5165FA 가 유일한 출처인 검체 7종이 hxxp://176[.]65[.]139[.]206/ 에서 왔다. 이 별칭은 기록이 남은 세션 5건 어디에도 없어 시각 · 프로토콜 · 명령 수 · 가림 IP 를 알 수 없다
  9. 사실 ① kworkerd-irq-bal 274,516바이트 ELF 32-bit LSB ARM(0603941e…) ② kworkerd-blkcg 265,836바이트 ARM EABI4(c45ff1d6…) ③ kworkerd-irq 275,476바이트 ARM(89ec6a69…) ④ kworkerd-netns-rt 386,320바이트 ELF 32-bit MSB MIPS32 rel2(951258ff…) ⑤ kworkerd-softirq 287,260바이트 ARM EABI4(93d12190…) ⑥ w.sh 1,237바이트 ASCII · CRLF 줄바꿈(a05b90af…) ⑦ armv5l 7,405,752바이트 ARM EABI5 · BuildID 보존(2dbdb379…). 7종 모두 관측 1회, 합계 8,896,397바이트. sha256 7개 전부 아카이브 27일치(8/16~9/15)에 없다
  10. 사실 ①~⑤ 는 전부 정적 링크 · 이름표 제거. ARM 4종 + MIPS(빅엔디언) 1종으로 x86 계열이 없다. ⑦ armv5l 만 이름표 제거 표기가 없고 BuildID[sha1] 이 남아 있다. ⑦ 은 ①~⑤ 평균(297,882바이트)의 24.9배, 오늘 01 에 저장된 검체 13종 중 압도적 최대. 8/24 의 daredevil.armv5l(50,096바이트)과 견주면 148배
  11. 추정 kworkerd · softirq · irq · blkcg · netns 는 리눅스 커널이 스스로 띄우는 작업 스레드 · 서브시스템 이름(kworker, ksoftirqd, irq/…, blkcg, netns)과 닮은 문자열이다. 프로세스 목록에서 커널 스레드처럼 보이게 하려는 이름 선택으로 읽히지만, 실행 시 프로세스명을 실제로 어떻게 표시하는지는 검체 내용이 없어 확인할 수 없다. 8/21 · 8/23~25 는 CPU 종류를 이름에 드러냈는데 오늘 다섯 개는 이름에서 CPU 종류를 지웠다
  12. 추정 w.sh 는 'ASCII text with CRLF line terminators'. CRLF 는 윈도우 편집기의 기본 줄바꿈이라 작성 환경이 윈도우였을 가능성이 있으나 리눅스에서도 만들 수 있어 단정하지 않는다. 이 스크립트가 나머지 여섯을 내려받는 로더인지는 내용이 없어 알 수 없다. 다만 7종이 한 별칭 · 한 유포지에서 각 1회씩 나온 점은 한 번의 절차로 묶여 내려왔다는 쪽에 부합한다
  13. 사실 176[.]65[.]139[.]196 은 8/21 에 처음 등장해 /bins/kla · px86 · pmips 를 나눠 줬다(x86 포함). 176[.]65[.]139[.]202 는 8/23~8/25 사흘 연속 telnet.sh + daredevil.{armv5l, armv6l, armv7l, mips, mipsel} 을 나눠 줬고 x86 은 0건. 오늘 .206 은 kworkerd-* 5종 + w.sh + armv5l, 역시 x86 0건. 앞 세 칸이 같은 주소 셋이 세 가지 이름 규칙으로 번갈아 나타났다. 마지막 칸이 다르므로 같은 기계는 아니며, 같은 운영자인지는 확인 수단이 없다
  14. 추정 8/24 글은 '이름 · URL 로 만든 목록은 맞고 해시 목록은 하루 만에 빗나갔다'고 썼다. 오늘은 반대다 — 8/21 · 8/24 의 URL · 파일명 목록으로는 오늘 7종을 하나도 잡지 못하고, 해시 목록도 못 잡는다. 남는 것은 앞 세 칸 176.65.139 뿐이다
  15. 사실 세션 791건 · 고유 출발지 196곳 · 로그인 시도 403회 · 명령 1,081개 · 화면 녹화 285건. 아카이브 28일치 중 8/29 634 · 8/31 779 다음의 세 번째 최저. 텔넷 421건(2223) > SSH 369건(2222), 텔넷 비중 53.2% — 8/16(SSH 88%)과 정반대
  16. 사실 의도: 실행 권한 부여 131 · 정찰—시스템 82 · 파일 다운로드 34 · 다운로드 후 실행 29 · 지속성—SSH 키 심기 17 · 흔적 삭제 15. 합 308 로 전체 명령의 28.5%. 1위가 정찰이 아니라 '실행 권한 부여'인 날은 9/4 에 이어 두 번째. 9/15 는 정찰이 의도의 91.7% 였다
  17. 사실 389바이트 OpenSSH RSA 공개키(a8460f44…)를 서로 다른 14곳이 남겼다(별칭은 10곳까지만 표기). 8/16 첫 관측 이후 아카이브에 있는 날마다 같은 해시. 오늘 'SSH 키 심기' 17회와 대체로 맞물린다
  18. 사실 SSH 지문 클러스터 44개(9/15 와 같음). 최다 지문 f555226d…(libssh_0.9.6)은 오늘 14곳 · 집계 205곳인데 파일을 하나도 배달하지 않았다. 검체를 배달한 지문은 16443846…(SSH-2.0-Go · 오늘 3곳 · 집계 21곳) 하나뿐이고 이는 ATK-CA5936 의 것. 주제 별칭은 프로토콜을 몰라 어느 클러스터에도 대응시킬 수 없다. 스캐너 배너 4e066189…(Fingerprintx-SSH2 · 3곳) · dd9bcf09…(ZGrab SSH Survey · 2곳)도 목록에 있다
  19. 사실 세션 24,064건 · 고유 출발지 513곳. VNC 20,953건(258곳 · 87.1%) · RDP 2,210건(118곳 · 9.2%) · SMB 387건(92곳) · LDAP 157건(12곳) · MSSQL 58건(13곳). ADB 세션 299건 · 검체 4건
  20. 사실 VNC 20,953건은 02 아카이브 17일치(8/26~9/15 · 최저 8/27 29,111 · 최고 9/10 65,487) 어느 값보다 적다. 출발지 258곳은 9/6(264곳)과 비슷해, 한 곳당 81.2건으로 줄어든 형태. 제안된 VNC 버전은 003.003 17,315 · 003.008 3,562 (82.6% : 17.0%), 합 20,877 로 세션 수보다 76건 적다
  21. 추정 ADB 세션 299건은 아카이브 기록(8/30 25 · 8/31 52 · 9/1 22 · 9/3 32 · 9/4 25 · 9/6 47 · 9/15 26) 중 최대 52건의 5.7배. 그런데 검체 4건(0d3c687f… 46,525 · 76ae6d57… 239,388 · a1b6223a… 334,816 · d7188b8c… 153,208바이트)은 전부 8/28 · 8/30 · 9/7 에 있던 해시이고 출처 ATK-C93E77 만 새 별칭. 접촉은 늘었는데 투입물은 옛것 그대로다. 02 검체를 ADB 로 읽는 것은 02 에서 파일이 남는 통로가 ADB 뿐이기 때문이며 데이터가 명시하지는 않는다
  22. 사실 상위 1 · 2위 ATK-A9F1B3(68.183.x.x) · ATK-943F0E(129.212.x.x)가 각각 5,675건으로 완전히 같다. 둘이 11,350건 = 02 전체의 47.2%, 상위 4곳(+ATK-0E3BBB 1,323 · ATK-AE264D 671)이 55.5%. 이 두 별칭은 9/10 · 9/13 · 9/15 에도 나란히 상위였고 9/15 에도 5,736 · 5,723 으로 근접했다. 어느 서비스를 두드렸는지는 데이터에 없다
  23. 사실 RDP 쿠키: hello 1,514(68.5%) · <ip> 469 · nmap 6 · rdpaudit 6 · (빈칸) 2 · Domain 1. 9/10 · 9/13 에 3만 번대였던 'mstsc' 는 오늘 없다. 'nmap' · 'rdpaudit' 는 스캐너 도구 이름과 같은 문자열이지만 상대가 스스로 적어 보내는 값이라 위조 가능. SMB 방언 제안 491건 중 'SMB 2.???' 28건을 뺀 463건(94.3%)이 SMB1 세대(NT LM 0.12 121 · LANMAN1.0 86 · LM1.2X002 86 · LANMAN 46 · PC NETWORK PROGRAM 1.0 44 · Windows for Workgroups 3.1 40 · LANMAN2.1 40)
  24. 사실 UPX 압축을 풀어야 나오는 유포지 hxxp://31[.]77[.]227[.]121/bins/ 12개 URL 은 8/16 이후 반복이라 오늘의 신규 지표가 아니다. 평문 지표로는 discord 웹훅 URL 1건(디팽 유지). 취약점 배경 통계(CVE 7,628 · KEV 397 · 랜섬웨어 확인 100)는 KISA 공지 기반이며 오늘 관측과 직접 연결되지 않는다

사실 주제 줄만 시각이 비어 있습니다. 나머지 다섯 화면은 초 단위까지 있는데, 상자 일곱 개를 놓고 간 줄만 **‘시각 미상’**입니다. 그리고 12:06 의 두 줄은 이틀 전 같은 별칭이 7시간 떨어져 두 번 왔던 것과 달리, 2.33초 차이로 겹쳐서 돌았습니다.

목록으로는 못 잡는다 — 남는 건 앞 세 칸

사실 8월 24일 글에서 우리는 이렇게 적었습니다. 파일 이름과 주소로 만든 차단 목록은 맞았고, 해시로 만든 목록은 하루 만에 빗나갔다고. 그때는 같은 집에서 같은 라벨의 상자가 왔는데 내용물만 바뀌었기 때문입니다.

추정 어제는 반대입니다. 8월 21일과 24일의 주소·파일명 목록으로는 어제 일곱 개를 하나도 못 잡습니다. 집이 바뀌었고 라벨도 바뀌었습니다. 해시 목록은 당연히 못 잡습니다. 일곱 개 다 처음 보는 내용물이니까요. 그날 목록에서 어제까지 살아남은 값은 딱 하나, 앞 세 칸 176.65.139 뿐입니다. 집 호수를 외우면 이사 갈 때 빗나가고, 동 이름을 외우면 그 동의 다른 집까지 같이 걸립니다. 어느 쪽이 맞는 선택인지는 서버마다 다르고, 이 글은 그것을 정해 주지 않습니다.

그날 복도에 찍힌 다른 사람들

사실 다섯 화면에 찍힌 쪽도 짚어 둡니다. 낮 12시 6분의 ATK-BDB53E 는 이틀 전 글의 주인공입니다. 파일 두 개(kla.sh 3,241바이트 · net.x86_64 190,632바이트)의 해시가 이틀 전과 똑같습니다. 이틀 사이 다시 만들어지지 않았다는 뜻입니다. 명령 7개·파일 2개·의도 3개·완결성 19 도 그대로입니다. 달라진 건 하나, 두 번째 세션이 2.33초 뒤에 겹쳐서 시작했다는 것입니다. 이틀 전에는 6시간 59분 뒤였습니다.

사실 낮 1시 39분의 ATK-73181C 는 어제 다섯 화면 중 가장 오래(65.4초) 머물고 명령을 가장 많이(17개) 친 침입입니다. 의도도 다섯 가지로 가장 많습니다. 정찰, 파일 다운로드, 실행 권한 부여, 다운로드 후 실행, 그리고 SSH 키 심기. 그런데 저장된 파일이 0개입니다.

추정 파일을 받으려 했는데 실패했거나, 열쇠를 파일이 아니라 명령 문장 안에 글자로 넣어서 심었을 수 있습니다. SSH 공개키는 쉽게 말해 비밀번호 없이 들어올 수 있는 여벌 열쇠인데, 이건 파일을 내려받지 않아도 명령 한 줄로 걸어 둘 수 있습니다. 명령 원문이 재료에 없어 어느 쪽인지 모릅니다. 8월 18일 글의 ’63초·키 심기·저장 파일 0’과 같은 모양이라, 오늘은 곁가지로만 둡니다.

사실 아침 9시 56분의 ATK-A593DF 는 22.7초 동안 명령 8개를 치고 9바이트짜리 글자 파일 하나를 받아 갔습니다. 글자 아홉 개 분량입니다. 별칭도 해시도 처음이지만, 내용은 재료에 없습니다. 밤 11시 19분의 ATK-CA5936 은 8월 19일부터 반복 등장하는 별칭이고 파일 두 개도 그때부터 같은 해시입니다.

어제 상자에서 나온 것 — 받아 적을 값

사실 방어에 쓰실 수 있게 값을 그대로 옮깁니다. 값을 클릭하면 복사됩니다. 주소는 접속되지 않도록 변형해 두었으니 그대로 두고 쓰세요. 위쪽 열네 줄이 어제 처음 나온 값이고, 그 아래는 이틀 전 값, 맨 아래는 몇 주째 안 바뀐 배경입니다.

sha256
0603941eb6e88c7b716a67c1584aedf4d78fc060e18cf72e09cb59f6561387de① kworkerd-irq-bal · 274,516바이트 ELF 32-bit LSB ARM · 정적 링크 · 이름표 제거 · 관측 1회 · 출처 ATK-5165FA · 신규 해시
url
hxxp://176[.]65[.]139[.]206/kworkerd-irq-bal① 유포지 · 신규 주소 · 앞 세 칸이 8/21 .196 · 8/23~25 .202 와 같다
sha256
c45ff1d693057febbed0989a0990d7b0de74006e6f4a0976036df2944692bffa② kworkerd-blkcg · 265,836바이트 ARM EABI4 · 정적 링크 · 이름표 제거 · 관측 1회 · 신규 해시
url
hxxp://176[.]65[.]139[.]206/kworkerd-blkcg② 유포지
sha256
89ec6a698e44c22d39bb822add4abfba32a23e1af991b9f0ad786b9d0ec0be1e③ kworkerd-irq · 275,476바이트 ARM · 정적 링크 · 이름표 제거 · 관측 1회 · 신규 해시
url
hxxp://176[.]65[.]139[.]206/kworkerd-irq③ 유포지
sha256
951258ffa00273ea87d05725471d1174fe7176bf34c56b1b3c9974eeb2e0d5b5④ kworkerd-netns-rt · 386,320바이트 ELF 32-bit MSB MIPS32 rel2 · 정적 링크 · 이름표 제거 · 관측 1회 · 신규 해시 · 7종 중 유일한 MIPS
url
hxxp://176[.]65[.]139[.]206/kworkerd-netns-rt④ 유포지
sha256
93d1219016d2c06a434d3042b9c26e471acbff40062b22fcab73d05bfe169760⑤ kworkerd-softirq · 287,260바이트 ARM EABI4 · 정적 링크 · 이름표 제거 · 관측 1회 · 신규 해시
url
hxxp://176[.]65[.]139[.]206/kworkerd-softirq⑤ 유포지
sha256
a05b90aff2b770c56d025b26d978a5d87ca8686ba2fd4e48010c036f72737310⑥ w.sh · 1,237바이트 ASCII · CRLF 줄바꿈 · 관측 1회 · 신규 해시 · 내용은 재료에 없어 로더인지 판단하지 않는다
url
hxxp://176[.]65[.]139[.]206/w.sh⑥ 유포지
sha256
2dbdb379610e8a9bdbbbe898e896c6ff96285e4ae2f4979ed514aaac57c7804b⑦ armv5l · 7,405,752바이트 ARM EABI5 · 이름표 제거 표기 없음 · BuildID[sha1] 보존 · 관측 1회 · 신규 해시 · 오늘 최대 크기
url
hxxp://176[.]65[.]139[.]206/armv5l⑦ 유포지 · 8/24 daredevil.armv5l(50,096바이트)과 이름 규칙만 같고 크기는 148배
sha256
39be6853a8204ce6455a373a6ffb4cb4672d4a62d90be69f7d6eeb66cda10b96kla.sh · 3,241바이트 POSIX 셸 스크립트 · 오늘 2회 · 출처 ATK-BDB53E · 9/15 와 같은 해시 (이틀 전 값)
url
hxxp://160[.]119[.]66[.]206/bins/kla.sh위 스크립트의 유포지 · 9/15 와 동일 (이틀 전 값)
sha256
cd6ccc5dabe85309a938e43c9508998bb0f52a9264fa9ba9276956f7fa42f48dnet.x86_64 · 190,632바이트 ELF 64-bit x86-64 · 정적 링크 · 이름표 제거 · 오늘 2회 · 출처 ATK-BDB53E · 9/15 와 같은 해시 (이틀 전 값)
url
hxxp://160[.]119[.]66[.]206/bins/net.x86_64위 실행파일의 유포지 · 9/15 와 동일 (이틀 전 값)
sha256
0dc95fb4077cce0bff19aa1a77109d059dff6503bbf6c1b0dd2f41fc0a4c88e79바이트 ASCII 텍스트 · 오늘 2회 · 출처 ATK-A593DF · 주소 미기록 · 신규 해시 · 내용은 재료에 없다
sha256
a8460f446be540410004b1a8db4083773fa46f7fe76fa84219c93daa1669f8f2389바이트 OpenSSH RSA 공개키 · 오늘 14회 · 서로 다른 14곳 · 주소 미기록 · 8/16 이후 같은 해시 · 배달한 별칭은 10곳까지만 표기 (배경)
sha256
43728fbfb98bb39ff61a2db0fc2905bd6937997062b05b9ab8b186fdee18c09a399바이트 OpenSSH 개인키 · 오늘 2회 · 출처 ATK-CA5936 · 8/19 이후 같은 해시 (배경)
sha256
00b6f15c2274420217ed3098a9f5f00545bf1793d7a324fd18a7809cbbf5b12b54바이트 ASCII 텍스트 · 오늘 2회 · 출처 ATK-CA5936 · 8/19 이후 같은 해시 (배경)

사실 위쪽 열네 줄에서 눈여겨볼 것은 주소의 경로입니다. 첫 집과 둘째 집, 그리고 이틀 전 160[.]119[.]66[.]206 은 전부 /bins/ 폴더 아래에서 파일을 나눠 줬습니다. 어제 셋째 집은 폴더 없이 맨 위에서 나눠 줬습니다. 폴더 이름으로 만든 규칙도 어제는 빗나갑니다.

196개는 일부러 가렸습니다

사실 어제 하루 로그인 시도는 403회, 서로 다른 196곳에서 들어왔습니다. 하루를 초로 나누면 3분 34초에 한 번꼴입니다. 한 곳당 평균 2.1회고요. 이틀 전(3,620회, 24초에 한 번)과 견주면 9분의 1입니다.

사실 시도된 아이디·비밀번호 조합 중 이 글에 옮기는 건 10종뿐입니다. 나머지 196종은 개수만 세고 값은 적지 않습니다. 서로 다른 IP 세 곳 이상에서 반복된 조합만 원문을 인용하는 것이 우리 규칙입니다. 한두 곳에서만 나온 조합은 어디선가 유출된 누군가의 진짜 계정일 수 있기 때문입니다. 남의 집 현관 비밀번호를 우연히 봤다고 적어 두지 않는 것과 같습니다.

아래 10종은 반대쪽입니다. 여러 곳에서 반복돼서 **‘누구의 것도 아닌 출고 기본값’**이라고 볼 수 있는 것들입니다.

아이디 비밀번호 서로 다른 출발지
admin admin 14곳
345gs5662d34 345gs5662d34 14곳
root root 7곳
root 3245gs5662d34 6곳
root (빈칸) 5곳
root 123456 4곳
root admin 4곳
root xc3511 3곳
admin password 3곳
tentob tentob 3곳

사실 admin/admin 은 14곳에서 31회 들어왔습니다. 한 곳당 2.2회입니다. root/root 는 7곳에서 15회, 비밀번호 칸이 아예 비어 있는 root 는 5곳에서 23회, root/xc3511 은 3곳에서 15회입니다. 한 곳이 같은 조합을 다섯 번 안팎 넣어 본 셈입니다.

추정 이 목록은 우리를 겨냥해 만든 게 아닙니다. 어디서나 통하는 값을 순서대로 넣어 보는 사전입니다. 그리고 어제 상자 일곱 개를 놓고 간 침입이 어떤 조합으로 들어왔는지는 모릅니다. 그 침입은 애초에 화면에 없으니까요.

어제 하루 전체

사실 문이 실제로 열리는 쪽(센서 01)의 하루 집계입니다. 오른쪽 칸을 함께 봐 주세요 — 숫자 하나만 보면 크기가 안 잡힙니다.

항목 9월 17일 견줄 것
세션 791건 약 2분에 한 번 · 28일치 중 세 번째로 적은 날(8/29 634 · 8/31 779 다음)
고유 출발지 196곳 한 곳당 평균 4.0건
로그인 시도 403회 3분 34초에 한 번 · 한 곳당 2.1회
명령 1,081개 80초에 하나
포트 2223 (텔넷) 421세션 전체의 53.2% — 8/16(SSH 88%)과 정반대
포트 2222 (SSH) 369세션 46.8%
화면 녹화 285건 세션의 36.0%

사실 조용한 날이었습니다. 그런데 조용한 날에 처음 보는 파일 일곱 개가 왔습니다. 시끄러운 날과 위험한 날은 같은 말이 아닙니다. 그리고 어제는 텔넷이 SSH 보다 많았습니다. 텔넷은 아주 오래된 원격 접속 방식으로, 주고받는 글자가 암호화되지 않고 그대로 오갑니다. 8월 16일에는 SSH 가 88%였는데 어제는 텔넷이 절반을 넘었습니다.

사실 어제 서버 안에서 벌어진 일을 종류별로 세면 이렇습니다.

무엇을 하려 했나 횟수 견줄 것
실행 권한 부여 131회 오늘 1위 — 정찰이 1위가 아닌 날은 9/4 이후 두 번째
정찰 — 시스템 살펴보기 82회 9/15 에는 이게 의도의 91.7% 였다
파일 다운로드 34회 —
다운로드 후 실행 29회 위와 5 차이
지속성 — SSH 키 심기 17회 389바이트 공개키가 14곳에서
흔적 삭제 15회 —

사실 ’실행 권한 부여’는 파일에 “이건 실행해도 되는 파일이야”라는 표시를 붙이는 동작입니다. 리눅스에서는 이 표시가 없으면 프로그램이어도 그냥 안 돌아갑니다. 어제는 이게 1위입니다. 의도가 붙은 명령은 308개로 전체의 28.5%이고, 나머지 71.5%는 분류되지 않은 명령입니다.

사실 SSH 로 들어온 쪽은 접속 프로그램의 지문(hassh)이 남습니다. 어제 가장 많이 온 지문 f555226d…(libssh_0.9.6 · 오늘 14곳 · 집계 205곳)은 파일을 하나도 놓고 가지 않았습니다. 파일을 놓고 간 지문은 16443846…(SSH-2.0-Go · 오늘 3곳) 하나뿐이고, 그건 ATK-CA5936 의 것입니다. 어제 주인공은 프로토콜 자체를 몰라서 이 목록 어디에도 놓을 수 없습니다. 지문은 접속 프로그램의 지문이지 사람의 지문이 아닙니다.

옆 서버 — 들여보내지 않는 쪽

사실 우리는 서버를 두 대 놓아뒀습니다. 두 번째(센서 02)는 안쪽까지 들여보내지 않는 얕은 함정이라 “어느 문을 몇 곳이 몇 번 두드렸나”만 남습니다. 경비실만 있고 집은 없는 동이라고 보면 됩니다. 로그인 성공도, 명령도, 자격증명도 여기엔 존재하지 않습니다. 어제는 수집이 정상이었습니다.

문 (서비스) 포트 두드린 횟수 두드린 곳
VNC (화면공유) 5900 20,953건 (87.1%) 258곳
RDP (원격 데스크톱) 3389 2,210건 (9.2%) 118곳
SMB (파일 공유) 445 387건 92곳
LDAP (계정 조회) 389 157건 12곳
MSSQL (데이터베이스) 1433 58건 13곳
ADB (안드로이드 디버깅) (미기록) 299건 (미기록)

사실 여섯 줄을 더하면 24,064건으로 세션 총계와 정확히 맞습니다. 화면공유 20,953건은 4초에 한 번꼴인데, 이 값은 02 아카이브 17일치(최저 8/27 29,111 · 최고 9/10 65,487) 어느 날보다 적습니다. 두드린 곳 258곳은 9월 6일(264곳)과 비슷합니다. 오는 곳은 그대로인데 한 곳이 두드린 횟수가 81.2번으로 줄었습니다.

사실 반대로 늘어난 건 ADB 입니다. ADB 는 안드로이드 기기를 컴퓨터에서 조작할 때 쓰는 디버깅 통로입니다. 어제 299건인데, 아카이브에 적힌 값 중 가장 큰 게 8월 31일의 52건입니다. 5.7배입니다. 그런데 옆 서버에 남은 파일 4건은 전부 8월 28일·30일·9월 7일에 이미 있던 해시이고, 출처 ATK-C93E77 만 새 별칭입니다. 두드리는 건 늘었는데 놓고 간 물건은 옛것 그대로입니다.

추정 이 4건을 ADB 로 들어온 것으로 읽는 건, 옆 서버에서 파일이 남는 통로가 ADB 뿐이라는 구조 때문입니다. 데이터가 그렇게 적어 준 건 아닙니다.

사실 옆 서버의 1위와 2위, ATK-A9F1B3(68.183.x.x)와 ATK-943F0E(129.212.x.x)는 각각 5,675건으로 숫자가 완전히 같습니다. 둘이 11,350건, 전체의 47.2%입니다. 이 둘은 9월 10일·13일·15일에도 나란히 상위였고, 이틀 전에도 5,736 과 5,723 으로 붙어 있었습니다. 어느 문을 두드렸는지는 데이터에 없습니다.

사실 원격 데스크톱 쪽 이름표는 hello 1,514(68.5%) · <ip> 469 · nmap 6 · rdpaudit 6 · 빈칸 2 · Domain 1 입니다. 9월 10일·13일에 3만 번대로 찍혔던 mstsc 는 어제 목록에 없습니다. nmap 과 rdpaudit 는 스캐너 도구 이름과 같은 글자지만, 상대가 스스로 적어 보내는 값이라 얼마든지 거짓으로 쓸 수 있습니다. 파일 공유 쪽은 제안 491건 중 SMB 2.??? 28건을 뺀 463건(94.3%)이 SMB1 세대 규격입니다. 세션 387건보다 제안이 많은 건 한 번 협상할 때 여러 규격을 줄줄이 늘어놓기 때문입니다.

공격자가 쓴 수법을 국제 분류표에 대응시키면

MITRE ATT&CK 은 공격 수법마다 번호를 붙여 놓은 국제 목록입니다. 어제 본 행동을 그 번호에 맞추면 이렇습니다. ID 를 누르면 원문 설명으로 갑니다 — 우리 말을 믿지 말고 직접 확인하시라고 링크를 겁니다.

  • T1110.001Brute Force: Password Guessing — 로그인 시도 403회, 인용 가능 조합 10종이 IP 3~14곳에서 반복추정
  • T1078.001Valid Accounts: Default Accounts — admin/admin · root/root · root/(빈칸) · root/xc3511 등 기본값 조합으로 로그인 성공추정
  • T1021Remote Services (텔넷 2223 · SSH 2222) — 기록된 세션 5건 전부 로그인 성공추정
  • T1082System Information Discovery — '정찰 — 시스템' 82회추정
  • T1105Ingress Tool Transfer — '파일 다운로드' 34회, 유포지 176[.]65[.]139[.]206 7종 · 160[.]119[.]66[.]206 2종추정
  • T1222.002File and Directory Permissions Modification: Linux — '실행 권한 부여' 131회 (오늘 의도 1위)추정
  • T1059.004Command and Scripting Interpreter: Unix Shell — '다운로드 후 실행' 29회, 셸 스크립트 kla.sh · w.sh추정
  • T1098.004Account Manipulation: SSH Authorized Keys — '지속성 — SSH 키 심기' 17회, 공개키 a8460f44… 출처 14곳추정
  • T1070Indicator Removal — '흔적 삭제' 15회 (파일 삭제인지 히스토리 삭제인지 세부 분류 없음)추정
  • T1036.005Masquerading: Match Legitimate Name or Location — kworkerd-irq · softirq · blkcg · netns 라는 커널 스레드형 파일명. 실행 시 프로세스명 위장 여부는 미확인추정
  • T1027.002Obfuscated Files or Information: Software Packing — UPX 압축 검체에서만 나오는 지표 12건 (배경, 오늘 신규 아님)추정

사실 열한 줄 전부에 [추정] 배지가 붙은 것을 봐 주세요. 우리 손에 있는 건 명령의 ’의도 분류 결과’와 ‘몇 번이었나’, 그리고 파일의 이름과 크기까지입니다. 명령 원문도 파일 내용도 없습니다. 분류표에 맞추는 일은 언제나 해석이고, 해석에는 해석이라고 적습니다. 특히 열 번째 줄 T1036.005 — 관리실 스티커 — 는 파일 이름만 보고 붙인 것입니다. 실행됐을 때 실제로 그 이름으로 떴는지는 모릅니다.

전에 이런 모양이 있었다

추정 Mirai 봇넷 (2016). 텔넷의 기본 자격증명 사전으로 리눅스 장비에 들어간 뒤, ARM·MIPS 등 CPU 종류별로 만들어 둔 정적 링크 ELF 를 내려받아 실행하는 구조였습니다. 어제 표에 있는 root/xc3511, root/root, admin/admin 은 2016년에 공개된 Mirai 소스코드의 자격증명 목록에 들어 있는 값입니다. 그리고 ‘텔넷 로그인 → 셸 스크립트 → CPU 종류별 정적 링크 ELF’ 라는 전달 형태도 같습니다. (출처 유형: 공개된 소스코드 분석 · 미국 US-CERT 경보 TA16-288A)

사실 여기서 멈춥니다. 검체 분류 서비스(VirusTotal)가 연동돼 있지 않아 어제 일곱 개가 이 계열이라는 판정은 하지 않습니다. 닮은 건 자격증명 값과 파일의 생김새까지입니다.

그래서 뭘 해야 하나

같은 동 세 번째 집이 어떤 라벨을 붙여 상자를 보낼지 우리가 정할 수는 없습니다. 바꿀 수 있는 건 우리 집 현관이 어떻게 잠겨 있고, 우리 집에서 밖으로 나가는 길이 어떻게 돼 있느냐입니다.

사실 1. 기본 계정·쉬운 비밀번호를 그대로 쓰고 있다 · 가능성 높음 위 표 열 줄이 전부 장비나 배포판이 출고할 때 넣어 두는 값입니다. admin/admin 14곳 31회, root/root 7곳 15회, root/(빈칸) 5곳 23회, root/xc3511 3곳 15회. 어제 기록된 세션 다섯 건은 전부 로그인에 성공했고, 성공한 뒤 4초에서 65초 안에 실행 권한 부여·다운로드·키 심기까지 갔습니다. 실제 서버였다면 그 몇 초가 침해 시점입니다.

사실 2. 비밀번호 로그인을 허용하고 열쇠 방식을 안 쓰고 있다 · 가능성 높음 어제 로그인 시도 403회 중 SSH 세션은 369건입니다. ATK-CA5936 은 SSH 비밀번호 로그인에 성공한 뒤 명령 1개·3.72초로 의도 다섯 가지를 끝냈습니다. 열쇠 방식만 허용했다면 비밀번호 추측 부분은 인증 단계에서 끝납니다. 그리고 침입한 쪽은 성공하면 자기 열쇠부터 걸어 둡니다. 어제 키 심기 17회, 389바이트 공개키가 14곳에서 나왔습니다. 서버의 authorized_keys(허용된 열쇠 목록) 파일에 한 줄 적히면, 나중에 비밀번호를 바꿔도 그 열쇠로 계속 들어옵니다.

사실 3. 관리 포트를 인터넷에 그대로 열어 두고 있다 · 가능성 높음 우리 서버 주소는 어디에도 알린 적이 없습니다. 그런데도 어제 문이 열리는 쪽에 196곳, 옆 서버에 513곳이 왔습니다. 두 대를 합쳐 상한 709곳입니다. 특정 대상을 고른 흔적이 아니라 열려 있는 문을 찾는 형태입니다. 텔넷·SSH·VNC·RDP·SMB 중 어느 하나만 열려 있어도 진입점이 됩니다.

추정 4. 횟수 기반 차단(fail2ban 등)이 없다 · 가능성 중간 어제는 한 곳당 시도가 5회 안팎입니다. admin/admin 은 곳당 2.2회, root/xc3511 은 5.0회, root/(빈칸) 은 4.6회. ‘5회 실패하면 잠금’ 규칙은 발동하지 않거나 이미 늦는 수준입니다. 게다가 ATK-BDB53E 는 2.33초 간격으로 세션 두 개를 겹쳐 돌렸습니다. 잠금 규칙이 있어도 어제 형태의 분산·저빈도 시도는 그 문턱 아래를 지나갑니다. 그래서 ’높음’으로 두지 않습니다.

사실 5. 밖으로 나가는 연결을 안 막고 있다 · 가능성 높음 어제 저장된 파일 13개 중 주소가 있는 9개는 두 유포지(176 쪽 7개 8,896,397바이트 · 160 쪽 2개 193,873바이트)에서 서버가 바깥으로 나가 HTTP 로 받아온 것입니다. 나가는 길이 막혀 있었다면 이 9개는 서버에 도착하지 않습니다. ‘파일 다운로드’ 34회 전부가 같은 자리에서 멈춥니다. 우리 집에서 그 동까지 가는 길이 막혀 있으면, 상자는 우리 집 앞에 놓이지 않습니다. 그리고 어제 받은 것은 ARM·MIPS 용입니다. 서버 자체보다 같은 망의 장비류가 실제 대상일 수 있습니다.

추정 6. 로그를 서버 안에만 두고 있다 · 가능성 중간 어제 흔적을 지우려는 의도가 15회 분류됐습니다. 그리고 파일 다섯 개의 이름이 관리실 직원 이름을 닮아 있어서, 프로그램 목록을 눈으로만 훑어서는 놓치게 설계된 것으로 읽힙니다. 우리는 허니팟이라 세션 285건을 따로 녹화해 두기 때문에 지워도 남습니다. 실제 서버는 로그를 밖으로 내보내지 않으면 지워진 뒤에 남는 게 없습니다. 다만 그 15회가 어느 세션의 것인지 데이터에 없어 ’중간’으로 둡니다.

사실 어제 처음 확인된 유포지 hxxp://176[.]65[.]139[.]206 과 파일 일곱 개의 해시는 C-TAS(한국인터넷진흥원 사이버 위협정보 공유 체계) 신고 대상입니다. 같은 동의 .196(8/21)과 .202(8/23~25)도 당시 신고 대상이었으니, 국가 위협정보 체계 쪽에는 이 동이 한 달 안에 세 번 보고되는 셈입니다. 다만 우리가 확인할 수 있는 것은 전송이 성공했다는 것까지이고, 상대 쪽에 실제로 적재됐는지는 따로 확인해야 합니다.

우리가 모르는 것

이 블로그가 다른 곳과 다른 지점입니다. 아는 것보다 모르는 것을 적는 데 시간을 더 씁니다. 오늘은 특히 그렇습니다. 주인공이 화면에 없었으니까요.

어제 주제에 대해 확인할 수 없는 것

  • [확인 불가] 주제 별칭 ATK-5165FA 는 ‘파일을 배달한 곳’ 칸에만 있고 기록된 세션 다섯 건에 없습니다. 세션 시각·지속 시간·프로토콜(SSH/텔넷)·포트·명령 수·의도·화면 녹화 여부·가림 처리된 IP 를 JSON 으로 확인할 수 없습니다. 이 글에 이 별칭의 포트가 없는 이유입니다.
  • [확인 불가] 기록된 다섯 건이 ’완결성 상위 5건’이라면 이 침입의 완결성은 14 미만이라는 뜻이 되지만, 선정 기준이 JSON 에 적혀 있지 않아 추정입니다.
  • [확인 불가] 일곱 개가 한 세션에서 내려왔는지 여러 세션에 걸쳤는지 알 수 없습니다. 각 ’관측 1회’는 한 번씩 저장됐다는 뜻일 뿐입니다.
  • [확인 불가] 7,405,752바이트 armv5l 이 실제로 실행됐는지, 정적 링크 대형 실행파일이라는 것 외에 어떤 언어·런타임으로 만들어졌는지 알 수 없습니다. BuildID 값 자체는 JSON 표기가 잘려 있을 수 있어 인용하지 않습니다.
  • [확인 불가] w.sh 의 내용, 즉 나머지 여섯을 내려받는 로더인지 여부는 확인할 수 없습니다. CRLF 줄바꿈이 윈도우 작성 환경을 뜻하는지도 단정하지 않습니다.
  • [확인 불가] 176[.]65[.]139[.]196 · .202 · .206 이 같은 운영자인지는 확인 수단이 없습니다. 앞 세 칸이 같다는 사실만 있습니다.
  • [확인 불가] 어제 두 유포지의 마지막 칸이 모두 206(160[.]119[.]66[.]206 · 176[.]65[.]139[.]206)인 것은 우연일 수 있으며 어떤 추론의 근거로도 쓰지 않습니다.
  • [확인 불가] ATK-73181C 의 ‘SSH 키 심기’ 의도와 저장 파일 0개의 관계 — 키가 파일이 아닌 명령 문자열로 심어졌는지, 다운로드가 실패했는지 명령 원문이 없어 알 수 없습니다. 389바이트 공개키의 배달 별칭은 14곳 중 10곳만 표기돼 있어 ATK-73181C 가 포함되는지도 알 수 없습니다.

데이터 자체를 의심해야 하는 것

  • [확인 불가] 옆 서버 1·2위가 정확히 5,675건으로 같은 이유(같은 도구의 병렬 실행인지 우연인지)와 이들이 두드린 서비스는 JSON 에 없습니다.
  • [확인 불가] 옆 서버의 파일 4건을 ADB 경유로 읽는 것은 구조상 추정입니다. ADB 세션 299건의 출발지 수도 JSON 에 없습니다.
  • [확인 불가] 화면공유 버전 제안 합(20,877)과 세션(20,953)의 76건 차이의 원인은 알 수 없습니다.
  • [확인 불가] 문이 열리는 쪽의 포트별 합(421 + 369 = 790)이 세션 총계 791 과 1건 차이 납니다. 원인은 데이터에 없습니다.
  • [확인 불가] 옆 서버에서 한 출발지가 여러 문을 함께 훑었는지 계산할 수 없습니다. 서비스별 고유 출발지 합(493)이 전체(513)보다 작아 겹침을 역산할 수도 없습니다. 0으로 적으면 거짓이 되므로 ’산출 불가’로 둡니다.
  • [우연] 가린 자격증명 196종과 고유 출발지 196곳이 같은 숫자인 것은 단위가 다른 값의 우연이며 의미를 두지 않습니다.
  • [주의] 지문 목록의 ‘집계’ 값은 9월 5일 글이 지적했듯 단조 증가하지 않는 값이라 ’누적’으로 읽지 않습니다(f555226d… 9/15 175 → 어제 205).
  • [주의] 아카이브에 9/9·9/11·9/12·9/14·9/16 이 없어 ‘연속’ 표현은 ’아카이브에 있는 날마다’로 한정했습니다.

일부러 연결하지 않은 것

  • [제외] 배경 통계로 들어온 취약점 지표(추적 CVE 7,628건 · KEV 397건 · 랜섬웨어 연계 확인 100건)는 KISA 보안공지에서 뽑은 값입니다. 어제 관측된 어떤 세션·검체와도 연결되지 않습니다.
  • [제외] 압축을 풀어야만 드러나는 유포지 31[.]77[.]227[.]121/bins/ 12건은 8월 16일 이후 반복 지표라 어제의 신규 지표가 아닙니다. 평문 지표로 남은 discord 웹훅 URL 1건도 디팽 상태로만 보관합니다.
  • [확인 불가] C-TAS 신고는 전송이 성공했다는 것까지만 확인됩니다. 어제 신규 유포지가 KISA 에 적재됐는지는 따로 확인해야 합니다.

아예 판단하지 않는 것

  • 통신사·조직(ASN·ISP) — 관련 데이터베이스가 없습니다. 추정하지 않습니다. 앞 세 칸이 같다는 사실에서 ’같은 통신사’를 끌어내지 않는 이유도 이것입니다.
  • 지리 정보 — 위와 같습니다. 애초에 IP 지리정보는 귀속의 근거가 되지 못합니다. 이 글은 어떤 국가·기업·개인도 공격자로 지목하지 않습니다.
  • VPN·Tor·클라우드 여부 — 판별 수단이 없습니다.
  • 검체 분류(VirusTotal) — 연동돼 있지 않습니다. 검체 분류는 MalwareBazaar 태그를 쓰는데, 어제 일곱 개에는 태그가 없습니다.
  • 접속 프로그램 문자열(User-Agent) — 두 관측면 다 웹(HTTP)이 아닙니다. 01 은 SSH·텔넷, 02 는 SMB·RDP·VNC·MSSQL·LDAP·ADB 입니다. HTTP 공격은 별도 소스입니다.
  • 취약점 번호(CVE) 연결 — SSH·텔넷 공격은 대부분 특정 취약점을 참조하지 않고, 02 도 규격을 맞추는 단계라 마찬가지입니다.

같은 동에서 세 번째 집이 상자를 놓고 갔습니다. 라벨은 세 번 다 달랐고, 이번엔 관리실 스티커까지 붙어 있었습니다. 상자 하나는 유난히 컸고, 제조 번호를 떼지 않은 채 왔습니다. 그리고 들고 온 사람은 어느 화면에도 없었습니다.

우리는 앞 세 칸이 같다는 것까지만 적습니다. 세 집이 한 사람의 것인지, 스티커가 실제로 누굴 속였는지, 화면에 없는 사람이 몇 시에 왔는지 — 모르는 것은 모른다고 둡니다. 모르는 것을 모른다고 적는 것도 관측의 일부입니다.

대신 이쪽에서 할 수 있는 건 분명합니다. 출고 기본 비밀번호를 바꾸고, 텔넷 같은 관리 포트를 인터넷에 그대로 내놓지 않고, 서버가 밖에서 파일을 받아오는 길을 막고, 기록은 서버 밖에 남기는 것. 어제 상자 일곱 개가 가리킨 곳은 정확히 거기였습니다.


관측일은 2026년 9월 17일이고, 이 글은 그다음 날 정리했습니다. 출발지 IP 는 브리프에 가림 처리된 형태(160.119.x.x, 124.158.x.x 등) 그대로 옮겼고 복원하지 않았습니다. 주제 별칭 ATK-5165FA 는 가림 처리된 IP 조차 브리프에 없어 적지 않았습니다. 유포지 주소는 실수로 접속되지 않도록 디팽(hxxp://, [.]) 상태를 본문과 IOC 블록 모두에서 유지했습니다. 자격증명은 서로 다른 IP 3곳 이상에서 반복 관측된 조합 10개만 원문 인용했고, 나머지 196개는 개수만 밝히고 값은 적지 않았습니다. 통신사·국적·VPN 여부처럼 우리에게 계측 수단이 없는 항목은 추정하지 않고 “모른다”로 남겨 뒀습니다.