SecurityHeroblog

두드린 횟수는 평범했는데, 들어온 뒤가 전부 최고치였다

어제 우리 서버의 문을 두드린 횟수 자체는 평범했습니다. 그런데 문이 열린 다음의 행동 세 가지가 같은 날 나란히 열흘 최고치를 찍었습니다. 남의 이름을 출입 명단에 올린 게 69번, 다녀간 기록을 지운 게 70번 — 딱 하나 차이였습니다.

큰 건물 1층에는 보통 장부가 두 개 있습니다.

하나는 상시 출입 등록 명단입니다. 여기 이름이 올라가 있으면 매번 확인받지 않고 그냥 들어갑니다. 입주사 직원, 계약된 청소 업체, 정기 배송 기사. 한 번 올려두면 계속 유효합니다.

다른 하나는 방문 기록부입니다. 누가 몇 시에 들어와서 몇 시에 나갔는지 적어 두는 종이입니다. 나중에 무슨 일이 생겼을 때 되짚어 보라고 있는 겁니다.

건물 보안을 생각할 때 우리는 대개 현관문만 봅니다. 잠겼나, 비밀번호는 어렵나, 누가 자꾸 문고리를 돌리나. 그런데 실제로 사고가 나고 나면 문제가 되는 건 문이 아니라 두 장부입니다. 명단에 모르는 이름이 언제 올라갔는지, 기록부의 어느 줄이 사라졌는지.

어제 우리 서버에 남은 기록이 정확히 그 이야기였습니다. 문을 두드린 횟수는 평범했습니다. 장부 두 개를 만진 횟수가 최고치였습니다.

어제, 장부 쪽 숫자만 튀었습니다

사실 먼저 안 튄 숫자부터 놓겠습니다. 어제 우리가 관측한 세션은 1,652건, 로그인 시도는 1,229회입니다. 하루를 꽉 채워 나누면 약 1분 10초에 한 번꼴로 누군가 문고리를 돌려 본 셈입니다. 이 정도는 평소와 크게 다르지 않습니다.

사실 실행된 명령 1,329개 중 **’정찰 — 시스템’이 899회로 약 67.6%**입니다. 이건 들어와서 “여기가 무슨 기계지?“를 확인하는 행동입니다. 파일 다운로드 89회, 다운로드 후 실행 82회도 특별히 높은 값이 아닙니다.

사실 그런데 세 항목이 튀었습니다.

어제의 행동 어제 최근 열흘 최댓값 배수
지속성 — SSH 키 심기 69회 22회 (8/24) 약 3.1배
흔적 삭제 70회 21회 (8/24) 약 3.3배
방어 무력화 2회 1회 열흘 중 처음 나온 2

사실 앞의 두 항목이 열흘 동안 어떤 값이었는지 그대로 옮기면 이렇습니다. ’SSH 키 심기’는 8/16 9 · 8/17 13 · 8/18 18 · 8/19 16 · 8/20 9 · 8/21 11 · 8/22 9 · 8/23 7 · 8/24 22 였습니다. ’흔적 삭제’는 8/16 9 · 8/17 13 · 8/18 19 · 8/19 13 · 8/20 8 · 8/21 12 · 8/22 8 · 8/23 7 · 8/24 21 이었습니다. 열흘 내내 한 자리에서 스무 몇 회 사이를 오가던 값이 어제 갑자기 69와 70이 됐습니다.

사실 69회면 하루를 나눠서 약 21분에 한 번입니다. 70회는 약 20분 30초에 한 번입니다. 출근해서 커피 한 잔 마시는 사이에 한 번씩, 하루 종일입니다.

추정 그리고 두 숫자는 딱 하나 차이입니다. 명단에 이름을 올린 게 69번, 기록부의 줄을 지운 게 70번. 우리는 이 두 값이 한 쌍으로 실행됐다고 말할 수 없습니다 — 뒤에 ’우리가 모르는 것’에서 다시 짚겠습니다. 다만 이 열흘 중 침입 이후 단계 셋이 같은 날 동시에 최고치를 찍은 건 어제가 처음입니다. ’들어오려는 시도’가 아니라 ’들어온 뒤 눌러앉는 행위’가 늘었다는 쪽으로 읽습니다.

어제 하루를 시간 순서로

시간 순서로 늘어놓으면 이렇게 됩니다. 줄이 길지만 네 번째·다섯 번째 줄의 시각과, 여섯 번째·일곱 번째 줄의 시각을 눈여겨보세요. 분이 아니라 초 단위로 겹칩니다.

  1. 사실 '지속성 — SSH 키 심기' 의도 69회. 389바이트 OpenSSH RSA 공개키(sha256 a8460f44…)가 서로 다른 출처 21곳에서 관측됐다. 이 지문은 8/16~8/24 기록과 같아 열흘 연속 동일한 파일이다. 출처 수 추이는 8/16 10곳 → 8/17 12곳 → 8/18 16곳 → 8/19 12곳 → 8/20 8곳 → 8/21 10곳 → 8/22 8곳 → 8/23 6곳 → 8/24 19곳 → 어제 21곳으로, 어제가 확인 구간 최댓값이다
  2. 사실 '흔적 삭제' 의도 70회. 8/16 9 · 8/17 13 · 8/18 19 · 8/19 13 · 8/20 8 · 8/21 12 · 8/22 8 · 8/23 7 · 8/24 21 회에서 어제 70회로, 확인 구간 최댓값의 약 3.3배다. 지속성 69회와는 1회 차이다
  3. 사실 '방어 무력화' 의도 2회. 8/16·8/17·8/18·8/22 는 각 1회, 8/19 는 0회, 8/20·8/21·8/23·8/24 는 항목 자체가 없었다. 확인 구간에서 이 값이 2가 된 것은 어제가 처음이다
  4. 사실 ATK-31C779(94.154.x.x), 텔넷 로그인 성공. 약 8.06초 동안 명령 5개, 다운로드 6건. 의도 4종 — 정찰(시스템) · 파일 다운로드 · 실행 권한 부여 · 다운로드 후 실행. completeness 33. TTY 녹화됨(내용 미포함). 텔넷이라 지문·클라이언트 값은 빈 문자열이다
  5. 사실 같은 별칭 ATK-31C779 가 첫 세션 시작으로부터 약 1분 48초 뒤 다시 들어왔다. 약 8.08초, 명령 5개, 다운로드 6건, 의도 4종, completeness 33 — 첫 세션과 모든 값이 같다. 두 번 다 로그인 성공이고 두 번 다 제지되지 않았다
  6. 사실 ATK-C53A45(45.224.x.x), 텔넷 로그인 성공. 약 72.10초 동안 명령 22개, 다운로드 11건. 의도는 '방어 무력화' 단독. completeness 42 로 어제 최고값. TTY 녹화됨
  7. 사실 ATK-7A654C(124.168.x.x), 텔넷 로그인 성공. 약 75.06초 동안 명령 22개, 다운로드 11건, 의도 '방어 무력화' 단독, completeness 42 — 앞 세션과 마스킹된 출발지만 다르고 다섯 값이 모두 같다. 두 세션은 04:29:02 부터 04:29:34 까지 약 32.38초 동안 동시에 열려 있었다
  8. 사실 ATK-50016C(220.135.x.x), 텔넷 로그인 성공. 약 24.06초 동안 명령 20개, 다운로드 11건. 의도 배열은 비어 있는데 completeness 는 40 이다. TTY 녹화됨
  9. 사실 같은 별칭 ATK-31C779 의 세션이 사흘 연속 관측됐고 규모가 커졌다. 8/23 기록 약 5.1초·명령 3개·다운로드 4건·completeness 25, 8/24 기록 약 4.79초·명령 3개·다운로드 3건·completeness 22, 어제 약 8.06초·명령 5개·다운로드 6건·completeness 33. 별칭은 기록 사이에서 같은 출발지를 가리키는 값이며 신원이 아니다
  10. 사실 '텔넷 · 로그인 성공 · 명령 22개 · 다운로드 11건 · 의도 방어 무력화 단독 · 11건 전부 1바이트 빈 파일 · completeness 42' 라는 조합은 8/18 기록(ATK-ABE8B7, 약 75초)과 8/22 기록(ATK-F604B7, 약 19.7초)에 각각 1건씩 단독으로 남아 있다. 어제는 이 조합이 하루에 2건, 서로 다른 출발지에서, 시간까지 겹쳐 나타났다. 지속 시간(72.1초·75.1초)은 8/22 의 19.7초보다 8/18 의 약 75초에 가깝다
  11. 사실 1바이트·매직 넘버 없는 빈 파일(sha256 01ba4719…)의 다운로드 이벤트는 33회이고, 전달 출처는 ATK-C53A45 · ATK-7A654C · ATK-50016C 세 곳뿐이다. 세 세션의 다운로드 수가 각 11건이므로 11×3=33 으로 정확히 맞아떨어진다
  12. 사실 176[.]65[.]139[.]202 의 로더 telnet.sh 는 sha256 ad19b70c…·2,107바이트로 8/23·8/24·어제 사흘 연속 지문과 크기가 완전히 같다. 반면 같은 호스트의 daredevil ELF 5종은 8/24 와 지문이 전부 다르고 크기는 5종 모두 늘었다 — armv7l +852, mips +1,140, mipsel +1,268, armv5l +832, armv6l +856 바이트. 5종 합계는 8/24 259,344바이트에서 어제 264,292바이트다. 노리는 아키텍처는 8/23 3종 → 8/24 5종 → 어제 5종으로 유지됐다
  13. 사실 hxxp://5[.]182[.]210[.]174/ok 에서 1,608바이트 Bourne-Again 셸 스크립트가 어제 두 개의 서로 다른 지문(dae728b8…, 4c0c071d…)으로 각 1회씩 내려왔다. 8/24 까지 집계한 이 URL 의 누적 지문 8종에 어제 2종이 더해져 10종이며, 8/17 첫 관측 이후 크기는 매번 정확히 1,608바이트다. 아흐레 동안 열 번 다시 만들어졌는데 파일 크기는 1바이트도 변하지 않았다
  14. 사실 31바이트 ASCII 텍스트(sha256 a2f3d6d2…)가 46회로 어제 최다 다운로드 검체인데, 전달 출처는 ATK-E150E4 한 곳뿐이고 이 별칭은 주제 세션 목록에 없다. URL 은 기록되지 않았다
  15. 사실 399바이트 OpenSSH 개인키(sha256 43728fbf…)가 ATK-CA5936 · ATK-2DE05A 두 출처에서 2회 관측됐다. 같은 두 출처가 54바이트 ASCII 텍스트(00b6f15c…)도 함께 남겼다. 이 지문은 8/23 기록에도 있다
  16. 사실 SSH 클라이언트 지문 11종이 기록됐다. 최다는 acaa53e0…(SSH-2.0-OpenSSH_7.4) 어제 125곳·누적 139곳, 다음이 f555226d…(SSH-2.0-libssh_0.9.6) 어제 24곳·누적 245곳이다. 11종 중 실제로 검체를 내려보낸 것은 16443846…(SSH-2.0-Go, 어제 4곳·누적 28곳) 단 하나뿐이다. 어제 로그인에 성공한 주제 세션 5건은 전부 텔넷이라 지문 값이 비어 있다
  17. 사실 집계값: 세션 1,652건, 고유 출발지 361곳, 포트 2222 1,387건 · 포트 2223 262건, 프로토콜 SSH 1,387건 · 텔넷 262건, 로그인 시도 1,229회, 명령 1,329개, TTY 녹화 1,007건. 텔넷 비중은 약 15.9%로 8/24 의 약 36.7% 에서 내려왔다. 명령 1,329개 중 '정찰 — 시스템' 899회는 약 67.6%다. 검체는 15종·다운로드 이벤트 134회이며 외부 URL 이 기록된 유포지는 176[.]65[.]139[.]202(6종) · 185[.]93[.]89[.]72(1종) · 5[.]182[.]210[.]174(2종) 세 곳이다
  18. 사실 로그인 시도 1,229회 중 서로 다른 IP 3곳 이상에서 관측돼 원문 인용이 가능한 조합은 20종이고, 단일 출처에서만 관측돼 공개하지 않은 조합이 1,017종이다. 최다는 345gs5662d34/345gs5662d34 로 18곳, 다음이 admin/admin 13곳, root/admin 7곳, root/3245gs5662d34 7곳이다

사실 표에서 눈에 걸리는 건 두 군데입니다. 하나는 01:54 와 01:56 — 같은 출발지가 약 1분 48초 간격으로 두 번 들어왔고, 두 번 다 열렸습니다. 다른 하나는 04:28 과 04:29 — 서로 다른 두 출발지가 약 32초 동안 동시에 열려 있었습니다.

명단에 올라간 이름 — 열흘째 같은 한 줄

사실 ’SSH 키 심기’가 무슨 말인지 여기서 풀고 가겠습니다. 리눅스 기계에는 authorized_keys(허용된 열쇠 목록)라는 파일이 있습니다. 여기에 한 줄이 들어가 있으면 비밀번호를 묻지 않고 들여보냅니다. 건물로 치면 상시 출입 등록 명단이고, 한 줄이 이름 하나입니다.

사실 어제 관측된 공개키는 389바이트입니다. 문자 메시지 두어 줄 분량입니다. 그 두 줄이 명단에 들어가면 비밀번호는 더 이상 관문이 아닙니다.

사실 그리고 이 파일의 지문(sha256)이 a8460f44… 로, 8/16부터 어제까지 열흘 연속 똑같습니다. 남긴 출처는 21곳으로 확인 구간 최댓값입니다. 추이는 이렇습니다.

날짜 이 공개키를 남긴 출처
8/16 10곳
8/17 12곳
8/18 16곳
8/19 12곳
8/20 8곳
8/21 10곳
8/22 8곳
8/23 6곳
8/24 19곳
8/25 21곳

사실 같은 이름을 열흘 동안 계속 적고 있습니다. 적는 손은 스물한 개로 늘었는데 적는 내용은 그대로입니다. 참고로 8/17·8/18 기록은 이 파일을 외부에서 내려받은 것이 아니라 세션 안에서 만들어진 것으로 적어 뒀습니다. 그래서 다운로드 주소가 비어 있는 날이 있습니다.

추정 여기서 중요한 건 이겁니다. 문고리를 아무리 여러 번 돌려도 한 번 실패하면 그걸로 끝입니다. 그런데 명단에 이름 한 줄이 들어가면 그 뒤로는 계속 유효합니다. 비밀번호를 전부 바꿔도 명단은 그대로 있습니다. 어제 1,229회의 시도와 명단의 한 줄은 성격이 아예 다른 값입니다.

사실 그리고 이 키가 열흘 연속 같은 지문이라는 건, 열흘 사이 어느 하루라도 명단에 적히는 데 성공한 기계가 있다면 지금도 같은 이름으로 열린다는 뜻입니다.

기록부에서 지워진 줄 — 70번

사실 두 번째 장부입니다. 어제 ‘흔적 삭제’ 의도가 70회 기록됐습니다. 전날 21회의 약 3.3배입니다.

사실 다만 여기서 선을 그어야 합니다. 우리 기록에는 명령 원문이 들어 있지 않습니다. 의도 분류만 있습니다. 그래서 70회가 정확히 무엇을 지웠는지 — 로그 파일인지, 받아온 파일인지, 명령 이력인지 — 말할 수 없습니다. 나중에 나올 MITRE 분류에서 하위 기법을 붙이지 않은 이유가 그것입니다.

사실 ’방어 무력화’는 2회입니다. 작은 숫자로 보이지만, 열흘 동안 이 항목은 매일 0회 아니면 1회였고 아예 없는 날도 나흘이었습니다. 2가 된 건 어제가 처음입니다. 이것도 무엇을 껐는지는 기록에 없습니다.

추정 장부 비유로 정리하면 어제 벌어진 일은 이렇습니다. 명단에는 이름을 올리고, 기록부에서는 자기 줄을 지웠습니다. 앞으로 들어올 길은 열어 두고, 지나온 길은 덮은 겁니다. 이 두 가지가 같은 날 나란히 최고치라는 것이 어제 기록에서 가장 눈에 띄는 부분입니다.

8초짜리가 두 번, 72초짜리가 두 번

사실 어제 로그인에 성공한 주요 세션은 5건이고 전부 텔넷입니다. 텔넷은 아주 오래된 원격 접속 방식입니다. 쉽게 말해 인터넷 너머에서 그 기계의 명령창을 직접 두드릴 수 있게 열어 둔 통로인데, 비밀번호가 암호화되지 않고 그대로 흘러갑니다.

사실 첫 두 건은 별칭 ATK-31C779(94.154.x.x)입니다. 01:54:24 에 한 번, 01:56:12 에 한 번. 약 1분 48초 간격입니다. 두 세션 모두 약 8.06초·8.08초, 명령 5개, 다운로드 6건, completeness 33 으로 다섯 값이 전부 같습니다.

사실 같은 별칭이 사흘 연속 나왔고, 규모가 커졌습니다.

8/23 8/24 8/25
머문 시간 약 5.1초 약 4.79초 약 8.06초
명령 3개 3개 5개
다운로드 4건 3건 6건
completeness 25 22 33

사실 completeness(완결성)는 한 세션이 침입의 처음부터 끝까지 중 어디까지 갔는지를 점수로 매긴 값입니다. 들어와서 둘러보기만 하고 나가면 낮고, 파일까지 받아 실행하면 높습니다.

사실 다만 별칭에 대해 선을 그어야 합니다. 우리는 출발지 IP 를 그대로 쓰지 않고 ATK- 로 시작하는 별칭으로 바꿔 기록합니다. 별칭은 같은 출발지를 가리키는 값이지 신원이 아닙니다. 사흘 사이 그 주소를 쓰는 주체가 바뀌었을 가능성을 배제할 수 없습니다.

사실 다음 두 건은 04:28 과 04:29 입니다. ATK-C53A45(45.224.x.x)가 약 72.10초, ATK-7A654C(124.168.x.x)가 약 75.06초. 명령 22개, 다운로드 11건, 의도 ‘방어 무력화’ 단독, completeness 42. 마스킹된 출발지만 다르고 다섯 값이 전부 같습니다. 그리고 두 세션은 약 32.38초 동안 동시에 열려 있었습니다.

사실 이 조합은 처음 보는 게 아닙니다. ‘텔넷 · 로그인 성공 · 명령 22개 · 다운로드 11건 · 방어 무력화 단독 · 11건 전부 1바이트 빈 파일 · completeness 42’ 는 8/18 에 1건(약 75초), 8/22 에 1건(약 19.7초) 단독으로 기록돼 있습니다. 어제는 이게 하루에 두 건, 서로 다른 출발지에서, 시간까지 겹쳐 나왔습니다.

사실 여기서 우리가 평소 쓰는 묶는 방법이 통하지 않습니다. SSH 로 들어오면 접속 프로그램이 처음 건네는 인사말의 구성으로 지문을 만들어 “같은 도구”끼리 묶을 수 있습니다. 어제도 그 지문이 11종 잡혔고, 최다인 acaa53e0…(OpenSSH_7.4) 하나가 하루에 IP 125곳을 묶습니다. 그런데 어제 실제로 열린 문 다섯 개는 전부 텔넷이라 지문 값이 빈 문자열입니다. 텔넷에는 그 인사말 절차가 아예 없습니다.

추정 그래서 04:29 에 겹쳐 열렸던 두 세션이 같은 도구인지 지문으로는 판정할 수 없습니다. 근거는 명령 22개·다운로드 11건·1바이트 빈 파일이라는 행동 수치가 같다는 것이 전부입니다.

사실 덧붙이자면 지문은 빌드의 지문이지 사람의 지문이 아닙니다. 같은 배포판의 기본 프로그램을 쓰는 서로 모르는 사람도 같은 값을 갖습니다. 그래서 이 블로그는 “같은 도구”까지만 쓰고 “같은 조직”이라고는 쓰지 않습니다.

사실 그 1바이트 빈 파일 이야기도 짚고 갑니다. 크기 1바이트, 즉 글자 한 개 분량이고 파일 종류를 알려주는 표식조차 없습니다. 어제 33회 관측됐는데 전달 출처가 세 곳뿐이고, 세 세션의 다운로드가 각 11건이라 11×3=33 으로 정확히 맞습니다. 무엇을 받으려다 빈 것이 왔는지, 원래 빈 파일을 받은 것인지는 기록이 말해 주지 않습니다.

유포지 — 맨 앞 한 장은 사흘째 그대로

사실 외부 주소가 기록된 유포지는 세 곳입니다. 주소는 일부러 망가뜨려 적었습니다(hxxp://, [.]) — 복사해 붙여 넣어도 접속되지 않습니다.

사실 176[.]65[.]139[.]202 에서는 로더 telnet.sh(2,107바이트)와 CPU 종류별 실행파일 5종이 나왔습니다. 로더는 실행파일을 직접 담고 있지 않고 “어디서 무엇을 받아 실행해라”만 적어 둔 메모지입니다. 이 로더는 지문 ad19b70c…, 크기 2,107바이트로 8/23·8/24·어제 사흘 연속 한 글자도 다르지 않습니다.

사실 반대로 실행파일 5종은 8/24 와 지문이 전부 다르고, 크기는 5종 모두 늘었습니다.

파일 어제 크기 8/24 대비
daredevil.armv7l 41,224바이트 +852
daredevil.mips 56,788바이트 +1,140
daredevil.mipsel 58,724바이트 +1,268
daredevil.armv5l 50,928바이트 +832
daredevil.armv6l 56,628바이트 +856

사실 다섯 개를 하나씩만 합치면 8/24 259,344바이트에서 어제 264,292바이트가 됐습니다. 약 258KB, 스마트폰 사진 한 장보다 작습니다. 이게 8초짜리 세션 안에 들어옵니다.

사실 armv5l·armv6l·armv7l·mips·mipsel 은 전부 CPU 종류이고 서로 호환되지 않습니다. 일반 PC·서버에서 도는 x86 계열은 어제도 한 건도 없습니다. ARM·MIPS 계열은 공유기·IP 카메라·NAS 같은 장비에서 흔한 규격입니다.

사실 세 번째 유포지 5[.]182[.]210[.]174/ok 는 계속 이상합니다. 어제 하루에만 서로 다른 지문 두 개가 각 1회씩 내려왔습니다. 8/17 첫 관측 이후 누적 지문은 10종인데, 크기는 매번 정확히 1,608바이트입니다. 아흐레 동안 열 번 다시 만들어졌는데 파일 크기는 1바이트도 안 변했습니다. 왜 그런지는 파일 내용이 없어 설명할 수 없습니다.

사실 어제 다운로드 횟수가 가장 많았던 검체는 뜻밖에도 31바이트짜리 텍스트입니다. 46회. 그런데 전달 출처가 ATK-E150E4 한 곳뿐이고, 이 별칭은 주요 세션 목록에 없습니다. 주소도 기록돼 있지 않습니다. 어제 최다 검체인데 무슨 세션이었는지 모릅니다.

어떻게 들어왔나 — 어제도 비밀번호입니다

사실 어제 로그인 시도는 1,229회, 서로 다른 출발지는 361곳입니다. 출발지 한 곳당 평균 약 3.4회입니다.

사실 서로 다른 IP 3곳 이상에서 관측된 조합만 원문을 싣습니다. 어제는 20종입니다.

아이디 비밀번호 관측된 IP 수
345gs5662d34 345gs5662d34 18곳
admin admin 13곳
root admin 7곳
root 3245gs5662d34 7곳
root root 4곳
admin password 4곳
root (빈 비밀번호) 3곳
user 1 3곳
root Aa123456 3곳
root default 3곳
root password 3곳
root qwerty 3곳
root root123 3곳
root rootroot 3곳
guest guest 3곳
username password 3곳
user1 1234 3곳
debian 12345 3곳
config config 3곳
admin P@ssw0rd 3곳

사실 일곱 번째 줄을 보세요. 비밀번호 칸이 비어 있습니다. 서로 다른 세 곳이 각각 “그냥 빈칸”으로 로그인을 시도했습니다. 그게 통하는 기계가 있다는 걸 알고 있다는 뜻입니다.

사실 맨 위 345gs5662d34/345gs5662d34 는 사람이 떠올릴 만한 문자열이 아닙니다. 아이디와 비밀번호가 같고, 서로 다른 18곳이 정확히 이 값을 시도했습니다. root/3245gs5662d34 도 7곳입니다.

추정 특정 장비에 하드코딩된 초기값을 목록으로 들고 다니는 것으로 읽습니다. 어느 제조사 장비인지는 우리 기록에 없습니다.

사실 그리고 1,017종의 조합은 싣지 않았습니다. 단 한 곳에서만 나온 조합들입니다. 한 곳에서만 나온 조합은 어딘가에서 실제로 유출된 누군가의 계정일 수 있어서, 값은 쓰지 않고 개수만 셉니다.

남기고 간 것

어제 관측된 검체와 주소 전부입니다. 값을 누르면 복사됩니다 — 지문은 읽으라고 있는 게 아니라 차단 목록에 넣으라고 있습니다. hxxp:// 와 [.] 는 그대로 두었습니다. 맨 위 두 줄과 맨 아래 줄이 어제 이야기의 핵심입니다 — 열흘 연속 같은 공개키, 그리고 사흘 연속 안 바뀐 로더.

sha256
a8460f446be540410004b1a8db4083773fa46f7fe76fa84219c93daa1669f8f2389바이트 OpenSSH RSA 공개키 · 출처 21곳 · 21회 · URL 미기록 · 8/16~8/24 와 같은 지문으로 열흘 연속이며 출처 수는 확인 구간 최댓값이다. 8/17·8/18 기록은 이 파일을 외부 다운로드가 아니라 세션 안에서 만들어진 것으로 적었다. 전달 출처는 ATK-7BDE7E · ATK-9CDD7F · ATK-D33E9B · ATK-BFAFF6 · ATK-C79920 · ATK-779578 · ATK-A7AC8D · ATK-533A05 · ATK-DF7CFF · ATK-B2E933 외 11곳(기록에는 10곳까지만 표기돼 있다)
sha256
01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b1바이트 · very short file / no magic · 33회 · URL 미기록 · 출처 3곳(ATK-7A654C · ATK-50016C · ATK-C53A45) · 세 세션의 다운로드가 각 11건이라 11×3=33 으로 맞는다. 8/17·8/18·8/22·8/23 기록에도 같은 지문이 있다
sha256
ad19b70c4e523ef24baf5e062d2200e139b619b56049219d41cd0397faff2c402,107바이트 POSIX 셸 스크립트(로더) · 출처 1곳(ATK-31C779) · 5회 · 8/23·8/24 와 지문·크기가 완전히 동일해 사흘 연속 무변경이다. 이 유포지에서 사흘 내내 바뀌지 않은 유일한 파일
url
hxxp://176[.]65[.]139[.]202:80/telnet.sh위 로더의 주소. 사흘 연속 같은 자리·같은 내용
sha256
4a9a6cf71efa9793bc277ba6859293f9ea0e927199500958e06a38520b96190141,224바이트 ELF 32-bit LSB ARM EABI4 · statically linked · no section header · 출처 1곳(ATK-31C779) · 5회 · 8/24 의 29fb2896…(40,372바이트)를 대체한 신규 지문, +852바이트
url
hxxp://176[.]65[.]139[.]202/daredevil.armv7l이름은 그대로, 내용만 교체됐다
sha256
66326f22c7f5c6f8f1d4ea8772a61a93d51614a78530143379fffbc2a19bf6a356,788바이트 ELF 32-bit MSB MIPS-I(빅엔디안) · statically linked · no section header · 출처 1곳(ATK-31C779) · 5회 · 8/24 의 95f5156a…(55,648바이트)를 대체한 신규 지문, +1,140바이트
url
hxxp://176[.]65[.]139[.]202/daredevil.mips이름은 그대로, 내용만 교체됐다
sha256
83d490e7d957ade322b6607680a03ef57b902cbd2a78727d1d5385444782db6758,724바이트 ELF 32-bit LSB MIPS-I(리틀엔디안) · statically linked · no section header · 출처 1곳(ATK-31C779) · 5회 · 8/24 의 6210a1c6…(57,456바이트)를 대체한 신규 지문, +1,268바이트
url
hxxp://176[.]65[.]139[.]202/daredevil.mipsel이름은 그대로, 내용만 교체됐다
sha256
9d7b93ba19385d888464df216ccaaf0155efbba4ebbc119167d1a13b9e1eaf0b50,928바이트 ELF 32-bit LSB ARM version 1 · statically linked · no section header · 출처 1곳(ATK-31C779) · 2회 · 8/24 의 eb05c127…(50,096바이트)를 대체한 신규 지문, +832바이트
url
hxxp://176[.]65[.]139[.]202/daredevil.armv5l이름은 그대로, 내용만 교체됐다
sha256
103780f703b680311f9e0e591153c6c7d8cc85478412225c7f4d49547626060a56,628바이트 ELF 32-bit LSB ARM EABI4 · statically linked · no section header · 출처 1곳(ATK-31C779) · 2회 · 8/24 의 06c0d953…(55,772바이트)를 대체한 신규 지문, +856바이트. ELF 5종을 하나씩만 합치면 264,292바이트다
url
hxxp://176[.]65[.]139[.]202/daredevil.armv6l이름은 그대로, 내용만 교체됐다
sha256
dae728b80aec56617055dc84a625ba5fadf6928f0f69dbfbf0c993558db930dd1,608바이트 Bourne-Again 셸 스크립트 · 출처 1곳(ATK-10149C) · 1회 · 신규 지문
sha256
4c0c071da6754eddbc4585ceb959b514963618180e488d7f179d83719d7167e61,608바이트 Bourne-Again 셸 스크립트 · 출처 1곳(ATK-10149C) · 1회 · 위와 같은 주소·같은 크기인데 지문이 다르다. 하루에 두 종이며 8/24 기준 누적 8종에 어제 2종이 더해져 10종이다
url
hxxp://5[.]182[.]210[.]174/ok자리도 크기(1,608바이트)도 그대로인데 내용만 계속 바뀌는 주소. 8/17 첫 관측 이후 크기는 매번 정확히 같다
sha256
a6296a79f44e21b76604d2d2bbf795d2cf380f70e39d45fbf166707ff3b4a6a4306바이트 POSIX 셸 스크립트 · 출처 2곳(ATK-512192 · ATK-44E538) · 2회 · 8/23·8/24 기록에도 같은 지문이 있다
url
hxxp://185[.]93[.]89[.]72/wget사흘 연속 같은 주소·같은 지문
sha256
a2f3d6d2bd82a65939f4e939bce242e8e246014fb3a9a9d5c3769ed7dcfffe2431바이트 ASCII 텍스트 · 출처 1곳(ATK-E150E4) · 46회 · URL 미기록 · 어제 다운로드 이벤트가 가장 많은 검체인데 출처가 한 곳뿐이고 그 별칭은 주요 세션 목록에 없다
sha256
43728fbfb98bb39ff61a2db0fc2905bd6937997062b05b9ab8b186fdee18c09a399바이트 OpenSSH 개인키 · 출처 2곳(ATK-CA5936 · ATK-2DE05A) · 2회 · URL 미기록 · 8/23 기록에도 같은 지문이 있다. 심어진 것인지 가져가려던 것인지는 기록이 구분해 주지 않는다
sha256
00b6f15c2274420217ed3098a9f5f00545bf1793d7a324fd18a7809cbbf5b12b54바이트 ASCII 텍스트 · 출처 2곳(ATK-CA5936 · ATK-2DE05A) · 2회 · URL 미기록 · 위 개인키와 같은 두 출처이며 8/23·8/24 기록에도 같은 지문이 있다. 내용이 기록에 없어 무엇인지 판단하지 않는다
sha256
4af5a5c98ad132095c6fbe7b02c242153a190a01cc321e50a916a0ca46fbaa629바이트 ASCII 텍스트 · 출처 1곳(ATK-BECAD3) · 2회 · URL 미기록 · 8/23·8/24 기록에도 같은 지문이 있다. 내용 미포함

사실 이 목록을 위아래로 읽으면 어제의 두 얼굴이 보입니다. 가운데 다섯 줄은 하루 만에 다시 적어야 했던 값이고, 맨 위와 맨 아래는 열흘·사흘째 그대로인 값입니다. 같은 목록에 들어 있지만 버티는 시간이 다릅니다.

공격 단계로 옮기면

관측된 행동을 MITRE ATT&CK 라는 국제 분류표에 대응시키면 이렇습니다. ID 를 누르면 원문 설명을 직접 볼 수 있습니다 — 우리 말을 믿지 않고 확인하셔도 됩니다. 전부 [추정]입니다. 우리가 본 것은 명령이지 공격자의 의도가 아닙니다.

  • T1110.001Brute Force: Password Guessing — 로그인 시도 1,229회, 고유 출발지 361곳, 인용 가능 조합 20종 + 비인용 1,017종추정
  • T1078.001Valid Accounts: Default Accounts — admin/admin 13곳 · root/root 4곳 · guest/guest 3곳 · config/config 3곳 등 기본값 조합이 다수이고, 주요 세션 5건 모두 로그인 성공이다추정
  • T1082System Information Discovery — '정찰 — 시스템' 899회, 전체 명령 1,329개의 약 67.6%추정
  • T1105Ingress Tool Transfer — '파일 다운로드' 89회, 검체 15종 · 다운로드 이벤트 134회, 외부 유포지 3곳추정
  • T1222.002File and Directory Permissions Modification: Linux and Mac — '실행 권한 부여' 145회추정
  • T1059.004Command and Scripting Interpreter: Unix Shell — '다운로드 후 실행' 82회, 내려온 검체 중 셸 스크립트 4종추정
  • T1098.004Account Manipulation: SSH Authorized Keys — '지속성 — SSH 키 심기' 69회, 389바이트 공개키가 출처 21곳. 다만 이 공개키의 다운로드 이벤트는 21회뿐이라 69회와 맞지 않는다추정
  • T1070Indicator Removal — '흔적 삭제' 70회. 명령 원문이 없어 무엇을 지웠는지 모르므로 하위 기법은 붙이지 않는다추정
  • T1562Impair Defenses — '방어 무력화' 2회. 무엇을 무력화하려 했는지 알 수 없어 하위 기법은 붙이지 않는다추정
  • T1608.001Stage Capabilities: Upload Malware — 176[.]65[.]139[.]202 한 호스트가 사흘 연속 로더 1종과 아키텍처별 ELF 를 함께 내보냈고 그 사이 ELF 만 교체됐다. 그 호스트를 누가 운영하는지는 확인 불가다추정
  • T1027.002Obfuscated Files or Information: Software Packing — 압축을 풀어야만 나온 지표가 기록에 있다추정

사실 마지막 줄에 단서를 붙여야 합니다. T1027.002 의 근거인 ‘압축을 풀어야 나온 지표’ 12건은 다른 호스트(31[.]77[.]227[.]121)의 검체에서 나온 것입니다. 그 호스트의 /bins/ 아래 12개 아키텍처를 가리키며, 겉면만 봐서는 주소가 하나도 보이지 않습니다. 어제의 daredevil 다섯 개가 압축돼 있는지는 기록에 없습니다. 그래서 이 줄은 어제 검체에 대한 판단이 아닙니다.

사실 T1098.004 줄에도 어긋나는 숫자가 있습니다. 의도 분류는 69회인데 공개키의 다운로드 이벤트는 21회입니다. 3배 넘게 차이가 납니다. 이건 어제 기록의 가장 큰 미해결 항목이라 아래에서 따로 적습니다.

어디서 본 것 같다면

추정 2016년 Mirai 봇넷과 배포 형태가 겹칩니다. 텔넷에 하드코딩된 기본 자격증명 목록으로 로그인한 뒤, HTTP 서버에 올려 둔 아키텍처별 실행파일을 장비 종류에 맞춰 받아가는 구조입니다. 어제의 ‘텔넷 로그인 성공 → 로더 셸 스크립트 → daredevil 다섯 종’ 배치와 형태가 같습니다. 소스코드가 공개돼 파생 계열이 다수 존재한다는 점도 함께 알려져 있습니다. 미국 US-CERT/CISA 의 공개 경보 TA16-288A 와 공개된 소스코드가 근거 자료입니다.

추정 2020년 TeamTNT 의 리눅스·클라우드 대상 캠페인과는 다른 지점에서 맞물립니다. authorized_keys 에 공격자 공개키를 심어 자리를 잡고, 같은 단계에서 보안 프로그램을 무력화하고 로그·이력을 지우는 조합입니다. 어제 지속성 69회 · 흔적 삭제 70회 · 방어 무력화 2회가 같은 날 동시에 최고치를 찍은 형태와 맥락이 닿습니다. 복수 보안업체의 위협 리포트가 남아 있습니다.

사실 다만 우리 데이터에는 명령 원문이 없어 같은 도구라고 말할 근거가 없습니다. 그래서 “형태가 비슷하다”까지만 씁니다. daredevil 은 관측된 파일 이름일 뿐이고 계열 이름이나 캠페인 이름이 아닙니다.

그래서 뭘 해야 하나

추정 어제 데이터가 가리키는 순서입니다.

  1. ~/.ssh/authorized_keys 를 지금 열어 보세요. 어제 키 심기 69회, 같은 지문의 공개키를 남긴 출처 21곳입니다. 이 파일에 본인이 등록한 기억이 없는 줄이 있으면 그게 전부입니다. 비밀번호를 전부 바꿔도 그 줄은 남습니다. 그리고 이 키는 열흘 연속 같은 지문이라, 열흘 중 어느 하루라도 심는 데 성공한 기계라면 지금도 열립니다.
  2. 로그를 장비 밖에 저장하세요. 흔적 삭제 70회, 전날의 약 3.3배입니다. 로그가 그 기계 안에만 있으면 지워진 뒤에는 되돌릴 방법이 없습니다. 그리고 이 글이 성립한 이유가 로그입니다 — 열흘치 기록이 남아 있었기에 “69가 평소의 3배”라는 말을 할 수 있습니다. 하루치만 보면 69도 그냥 69입니다.
  3. 기본 계정·초기 비밀번호를 바꾸세요. 주요 세션 5건은 전부 로그인 성공입니다. 위 표의 20개 조합 중 하나라도 쓰고 계시다면 잠금장치가 없는 것과 같습니다. 로그인 성공에서 실행파일 확보까지 약 8초면 끝났습니다.
  4. 텔넷 같은 원격 접속을 끄세요. 어제 트래픽의 약 84%는 SSH 인데, 실제로 열린 문 다섯 개는 전부 텔넷이었습니다. 텔넷 비중은 8/24 약 36.7% 에서 어제 약 15.9% 로 내려왔는데도 결과는 같습니다. 비중이 줄어도 뚫리는 쪽은 그대로라는 뜻입니다. 게다가 텔넷은 비밀번호가 그대로 흘러가고 키 인증이라는 선택지 자체가 없습니다 — 끄는 것 말고 방법이 없습니다. 공유기·홈캠 설정에서 “원격 접속”, “Telnet”, “원격 관리”를 찾아 꺼 두시면 됩니다.
  5. 관리 접속을 인터넷에 직접 열어두지 마세요. 어제 361곳에서 1,652건이 붙었습니다. 특정 대역이나 VPN 뒤에서만 접속을 허용했다면 이 361곳 중 대부분은 세션 자체를 열지 못합니다.
  6. 장비가 밖에서 파일을 받아오지 못하게 막으세요. 파일 다운로드 89회, 실행 권한 부여 145회, 다운로드 후 실행 82회입니다. 로그인은 이미 뚫린 뒤이므로 여기가 실제 피해를 막는 마지막 지점입니다. 나가는 길이 없었다면 로더 메모지만 남고 실행파일 264,292바이트는 도착하지 못합니다.
  7. 로그인 실패·반복 접속을 제한하되, 이것 하나로 끝내지 마세요. 같은 출발지가 1분 48초 간격으로 두 번 들어와 두 번 다 성공했고, 04:29 에는 두 출발지가 32초 동안 동시에 열려 있었습니다. 여기까지는 IP 단위 차단으로 끊을 수 있는 지점입니다. 그런데 345gs5662d34 조합은 18곳에서 정확히 18회, root/3245gs5662d34 는 7곳에서 7회로 한 곳당 딱 한 번씩입니다. 이렇게 흩어서 두드리는 쪽에는 IP 단위 제한이 걸리지 않습니다. 두 형태가 어제 같이 왔으니 차단 하나로는 절반만 막힙니다.

사실 순서를 바꿔 적었습니다. 평소 같으면 ’비밀번호부터’가 1번인데, 어제 데이터에서는 명단 점검과 로그 반출이 먼저입니다. 비밀번호를 아무리 잘 바꿔도 명단에 이름이 이미 올라가 있으면 소용이 없기 때문입니다.

어제 하루 전체

세션 1,652건
고유 IP 361곳
로그인 시도 1,229회
실행된 명령 1,329개
SSH (2222) 1,387건
텔넷 (2223) 262건

출발지 한 곳당 평균 약 4.6세션, 약 3.4회 시도입니다. 세션 1,652건은 하루를 나누면 약 52초에 한 번입니다.

사실 여기에 덧붙일 값이 셋 있습니다. TTY 녹화 1,007건, 검체 15종, 다운로드 이벤트 134회입니다. TTY 녹화는 그 세션 안에서 오간 화면을 그대로 되감아 볼 수 있게 남긴 기록입니다. 8초짜리 세션 안에서 명령 5개가 어떤 순서로 흘렀는지 재구성할 수 있었던 건 이 녹화 덕분입니다. 녹화 내용 자체는 이 글에 포함하지 않습니다.

사실 그리고 어제 관측된 유포지·C2(176[.]65[.]139[.]202, 185[.]93[.]89[.]72, 5[.]182[.]210[.]174)는 C-TAS 로 신고했습니다. 전송 계층 성공까지만 확인되며, KISA 측 적재 여부는 별도 확인이 필요합니다.

60초로 보기

같은 관측분을 짧은 영상으로도 만들었습니다. 영상은 1,229회의 시도와 한 개의 열쇠를 나란히 놓는 쪽에 초점을 맞췄습니다.

우리가 모르는 것

이 블로그는 아는 것과 모르는 것을 나눠서 씁니다. 어제 관측분에서 확인할 수 없었던 것들입니다.

  • 69회와 21회의 차이. ’지속성 — SSH 키 심기’는 69회인데 389바이트 공개키의 다운로드 이벤트는 21회입니다. 3배 넘게 벌어지고, 기록이 의도 카운트와 검체 카운트를 이어 주지 않습니다. 69회 전부가 이 키를 심은 것인지, 일부는 다른 키이거나 다운로드로 잡히지 않는 방식인지 확인할 수 없습니다. 이 글의 제목이 이 숫자에 걸려 있으므로 가장 큰 미해결 항목입니다.
  • 70과 69가 한 쌍인지. 두 값이 1회 차이인 것이 같은 세션에서 한 쌍으로 실행된 결과인지, 무관한 두 흐름이 우연히 비슷해진 것인지 판정할 근거가 없습니다. 세션별 의도 카운트를 주는 값이 없습니다.
  • ‘방어 무력화’ 2회가 누구 것인지. 04:28·04:29 의 두 세션 것으로 읽었지만, 그 두 세션의 의도가 각각 ‘방어 무력화’ 단독이고 어제 전체 카운트도 2회라는 개수 일치에 근거한 추론입니다. 기록이 명시하지 않습니다.
  • 세션 3건의 행방. 집계는 1,652건인데 프로토콜별 합(SSH 1,387 + 텔넷 262)은 1,649건입니다. 3건이 어디로 분류됐는지 알 수 없습니다.
  • 명령 1,329개와 의도 합계 1,356회의 차이 27. 명령 하나에 의도가 여럿 붙는 것으로 보이나 계산식이 기록에 없습니다.
  • 어느 포트로 들어왔는지. 주요 세션의 접속 포트를 2223 으로 적은 것은 텔넷 262건과 포트 2223 의 262건이 정확히 같다는 데 근거한 것입니다. 기록이 개별 세션과 포트를 직접 이어 주지 않습니다. 덧붙여 2222·2223 은 우리 관측 장비가 열어 둔 포트이며 일반 서버의 22·23 과 같지 않습니다.
  • ATK-31C779 의 세션이 몇 건이었는지. 목록에 실린 2건의 다운로드 합은 12건인데, 이 별칭이 유일한 전달 출처인 검체 6종의 관측 횟수 합은 24건(5+5+5+5+2+2)입니다. 목록에 없는 같은 별칭의 세션이 더 있었던 것으로 보이나 몇 건인지 알 수 없습니다.
  • completeness 산식. ATK-50016C 는 의도가 하나도 없는데 40 이고, ATK-C53A45·ATK-7A654C 는 의도가 하나인데 42 입니다. 계산식이 기록에 없어 설명할 수 없습니다. 8/18·8/21·8/22 에도 같은 항목이 남아 있습니다.
  • ELF 다섯 개의 지문이 바뀐 이유. 컴파일 옵션이 달라진 것인지, 접속할 주소 같은 설정값이 새로 박힌 것인지, 아예 다른 코드인지 판단할 근거가 없습니다. 크기가 832~1,268바이트씩 늘었다는 사실만 확인됩니다. 검체 내부를 뜯어본 결과는 이 기록에 없습니다.
  • 5[.]182[.]210[.]174/ok 가 왜 항상 1,608바이트인지. 아흐레 동안 지문 10종이 나오면서 크기는 매번 정확히 같습니다. 같은 길이의 문자열을 갈아 끼우는 방식일 수도 있으나 파일 내용이 없어 추정에 그칩니다.
  • 어제 최다 검체가 무슨 세션이었는지. ATK-E150E4 한 곳이 31바이트 텍스트를 46회 받아갔는데, 주소도 없고 이 별칭은 주요 세션 목록에도 없습니다.
  • 399바이트 개인키가 어떻게 세션에 나타났는지. 공격자가 가져온 것인지 서버에서 만들어진 것인지 기록이 구분해 주지 않습니다.
  • Discord 웹훅 주소 1건. 어느 세션·어느 검체와 연결되는지 명시돼 있지 않아 어제 서술에 쓰지 않았습니다. 8/17 이후 여드레 동안 같은 이유로 제외해 왔습니다. 웹훅의 토큰 문자열은 그 자체가 악용될 수 있는 값이라 본문에 옮기지 않습니다.
  • 배경 취약점 통계. 추적 CVE 6,579건 · CISA KEV 387건 · 랜섬웨어 확인 98건과 EPSS 상위 CVE 5건은 KISA 보안공지에서 뽑은 배경 수치입니다. 어제 허니팟 관측과 직접 연결되지 않습니다.
  • 8/24 의 합계 오기. 8/24 기록은 ELF 5종 합계를 261,451바이트로 적었지만 같은 기록의 개별 크기를 더하면 259,344바이트입니다. 어제의 증감 비교는 개별 크기를 다시 더한 값으로 계산했습니다.
  • C-TAS 신고의 적재·활용 여부. 전송 계층 성공만 확인됐습니다.

그리고 애초에 확인할 수단이 없는 것들입니다. 이건 모르는 것과 다릅니다 — 추정하지 않는 쪽이 정답입니다.

  • ASN·ISP — GeoIP·ASN 데이터베이스를 갖고 있지 않습니다. 176[.]65[.]139[.]202 · 185[.]93[.]89[.]72 · 5[.]182[.]210[.]174 · 31[.]77[.]227[.]121 이 각각 어느 사업자에 있는지, 서로 같은 네트워크인지 말할 수 없습니다.
  • 지리 위치 — 동일하게 미보유입니다. 덧붙여 IP 지리정보는 애초에 귀속 근거가 되지도 않습니다. 마스킹된 출발지 94.154.x.x · 45.224.x.x · 124.168.x.x · 220.135.x.x 에서 국가를 읽지 않습니다.
  • VPN·Tor·클라우드 여부 — 판별 수단이 없습니다. 361곳이 실제로 서로 다른 주체인지, 몇 곳이 같은 경유지인지 확인 불가입니다.
  • VirusTotal 탐지 결과 — 미연동입니다. 어제의 daredevil ELF 5종과 셸 스크립트 4종이 백신에서 어떻게 탐지되는지, 어떤 계열로 불리는지 말할 수 없습니다. 검체 분류는 MalwareBazaar 태그를 씁니다.
  • User-Agent — SSH·텔넷에는 User-Agent 자체가 존재하지 않습니다. HTTP 공격은 별도 소스입니다.
  • CVE 연결 — SSH·텔넷 공격은 취약점을 참조하지 않는 경우가 대부분이고, 어제 관측분도 전부 자격증명이었습니다. 어떤 세션도 특정 취약점과 연결하지 않았습니다.
  • 원문 자료 — 이 글의 근거에는 명령 원문·페이로드 내용·TTY 세션 재생이 포함돼 있지 않습니다. 그래서 ‘흔적 삭제’ 70회가 정확히 무엇을 지웠는지, ‘방어 무력화’ 2회가 무엇을 껐는지 말할 수 없습니다.
  • daredevil 이라는 이름 — 관측된 파일 이름일 뿐입니다. 악성코드 계열명이나 캠페인명으로 해석하지 않았습니다.
  • 누구인지 — 특정 국가·기업·개인을 공격자로 지목하지 않습니다. 우리에겐 지리정보조차 없습니다.

장부 이야기로 시작했습니다.

어제 알아낸 것은 딱 그 정도입니다. 문을 두드린 횟수는 평범했습니다. 1,229회, 약 1분 10초에 한 번. 이 숫자만 보면 어제는 조용한 날로 기록될 뻔했습니다.

그런데 문이 열린 다음이 달랐습니다. 상시 출입 명단에 이름을 올린 게 69번, 방문 기록부에서 줄을 지운 게 70번. 둘 다 열흘 최고치이고, 딱 하나 차이입니다. 그리고 열흘 내내 매일 0이나 1이던 ’방어 무력화’가 처음으로 2가 됐습니다.

명단에 올라간 이름은 열흘째 똑같은 한 줄, 389바이트입니다. 문자 메시지 두어 줄 길이입니다. 그 두 줄이 하는 일은 문고리를 1,229번 돌리는 것보다 오래 갑니다.

그래서 어제 데이터가 권하는 건 하나입니다. 현관만 보지 말고 장부 두 개를 보세요. 명단에 모르는 이름이 있는지, 그리고 기록부가 애초에 그 건물 안에만 있는 건 아닌지. 지워진 다음에 확인하면 거기엔 아무것도 안 남습니다.


이 글은 2026-08-25 허니팟 관측분을 바탕으로 작성됐습니다. 출발지 IP 는 브리프의 마스킹 형태 그대로 표기했고, 유포 주소는 접속되지 않도록 변형(defang)했습니다. 인용한 자격증명은 서로 다른 IP 3곳 이상에서 관측된 20개 조합만 포함했으며, 단일 출처에서만 관측된 1,017개 조합은 개수만 밝히고 값은 싣지 않았습니다.