옷은 매번 새로 샀는데, 걸음걸이가 엿새째 같았다
9월 3일, 닷새 전에 차단 목록으로 적어 둔 파일 네 개가 그대로 다시 들어왔습니다. 그런데 지문을 찍어 보니 세 개는 아카이브 18일치에 한 번도 없던 새 파일이었고, 딱 하나만 여섯 날째 한 비트도 안 바뀐 같은 파일이었습니다. 옷은 갈아입어도 안 바뀌는 게 무엇인지, 그날 데이터가 네 줄로 보여 줬습니다.

멀리서 누가 걸어옵니다. 얼굴은 아직 안 보입니다. 처음 보는 옷을 입고 있습니다.
그런데 벌써 압니다. 아, 쟤구나.
옷을 보고 안 게 아닙니다. 걷는 모양, 가방 메는 각도, 손 흔드는 습관. 얼굴이 안 보여도 그것들이 먼저 도착합니다. 옷은 바꿀 수 있는데 걸음걸이는 잘 안 바뀌기 때문입니다.
보안에서 “이 파일은 위험함”을 적어 두는 일이 딱 이 문제입니다. 우리는 수첩에 뭘 적어 둘지 골라야 합니다. 옷 색깔을 적으면 내일 빗나갑니다. 걸음걸이를 적으면 좀 더 갑니다.
2026년 9월 3일, 우리 서버에 파일 네 개가 들어왔습니다. 닷새 전에 이미 한 번 적어 둔 네 개였습니다. 그런데 지문을 찍어 보니 셋은 처음 보는 파일이었고, 하나만 그대로였습니다.
먼저 낯선 말 하나만 풀고 가겠습니다. 허니팟은 일부러 허술하게 만들어 인터넷에 내놓은 미끼 서버입니다. 진짜 업무는 하지 않습니다. 누가 들어와서 무엇을 하는지 통째로 기록하려고 열어 둔 기계입니다. 아래 숫자는 전부 거기에 찍힌 것입니다.
서버는 두 대이고, 성격이 정반대입니다
사실 01번은 사람이 실제로 들어와서 명령을 칠 수 있는 서버입니다. 문이 두 개 달려 있습니다. 하나는 SSH, 하나는 텔넷입니다. 둘 다 멀리 있는 컴퓨터에 접속해 명령을 내리는 방법입니다. 텔넷이 훨씬 오래된 방식이고, 비밀번호가 암호화되지 않은 채 그대로 흘러갑니다.
사실 02번은 문고리만 달아 둔 서버입니다. 누가 두드리면 “여기 문 있어요” 하고 대답만 합니다. 안으로 들여보내지 않습니다. 그래서 이쪽에는 로그인 성공도, 명령도, 비밀번호 기록도 애초에 존재하지 않습니다. 여기서 ’접촉’이라는 말은 문을 두드린 횟수이지 열린 횟수가 아닙니다.
사실 그런데 02번에도 예외가 딱 하나 있습니다. ADB입니다. ADB는 ’안드로이드 디버그 브리지’의 줄임말로, 안드로이드 기기를 컴퓨터에 연결해 앱을 넣고 빼는 개발자용 통로입니다. 02번에서 실제로 파일이 실려 들어올 수 있는 통로는 여기 하나뿐입니다.
이 글에 나오는 파일 네 개는 전부 02번 이야기입니다.
그날 하루를 시간 순서로
시간 순서로 늘어놓으면 이렇게 됩니다. 위 네 줄에는 시각이 없다는 것을 먼저 보세요. 02번 기록에는 시계가 아예 안 붙어 있습니다. 그 아래부터는 초 단위까지 남아 있습니다.
- 사실 센서 02가 ADB 세션 32건에서 검체 4건을 확보했다. 4건 전부 출처가 ATK-5A7674 한 곳이고 각각 3회씩 관측됐다. 02의 어떤 항목에도 타임스탬프가 없어 하루 중 언제인지 말할 수 없다
- 사실 그 4건 중 d7188b8c…(153,208바이트)는 8/28·8/30 브리프에 적힌 해시와 완전히 같다. 나머지 3건(7a48c93c… 46,582B · 608ee011… 235,292B · d4e8c642… 334,752B)의 해시는 아카이브 18일치에 한 건도 없다
- 사실 8/28·8/30 기록의 크기와 견주면 46,525→46,582(+57) · 239,388→235,292(−4,096) · 334,816→334,752(−64) · 153,208→153,208(0)이다. 두 번째의 차이 4,096은 정확히 4KB다. 이 수치가 무엇을 뜻하는지는 원자료에 근거가 없다
- 사실 02의 서비스별 접촉 42,714건 + ADB 세션 32건 = 42,746건으로 총계와 맞는다. ADB는 전체의 0.07%다. 02에서 투입 내용이 남은 채널은 이날도 ADB 하나뿐이다
- 사실 센서 01: ATK-CA5936(130.12.x.x, SSH) 로그인 성공. 3.844초, 명령 1개인데 의도는 5종, 다운로드 2건(399바이트 OpenSSH 개인키 43728fbf… · 54바이트 ASCII 00b6f15c…). 지문 16443846…4397 / SSH-2.0-Go. 8/19·8/24·8/25·8/28·8/30 브리프와 별칭·지문·수치가 같다
- 사실 센서 01: ATK-86979F(212.132.x.x, 텔넷) 로그인 성공. 60.4초, 명령 22개, 다운로드 11건 — 11건 전부 1바이트 빈 파일(01ba4719…)이다. 이 세션의 의도는 '방어 무력화' 하나뿐이고, 이날 '방어 무력화' 총계도 1회다
- 사실 센서 01: ATK-9CF939·ATK-93FAFF·ATK-D0D176 세 텔넷 세션이 10시간에 걸쳐 따로 들어왔는데, 셋 다 로그인 성공·명령 17개·다운로드 0건·의도 5종·완결성 17로 완전히 같다. 지속 시간도 61.1초 · 61.9초 · 70.9초다. 텔넷이라 접속 프로그램 지문은 한 줄도 남지 않았다
- 사실 센서 01 고유 출발지 457곳 — 아카이브 18일치 최고였던 8/27의 442곳을 넘어 19일 중 최다다. 세션은 2,378건으로 곳당 5.20회다. 포트는 2223(텔넷) 1,381 · 2222(SSH) 997로 텔넷이 58.1%다
- 사실 의도 깔때기: 정찰—시스템 488 → 실행 권한 부여 164 → 파일 다운로드 37 / 다운로드 후 실행 37 → 지속성—SSH 키 심기 10 → 흔적 삭제 7 → 방어 무력화 1. 단계마다 3~4배씩 좁아진다. 의도로 분류된 745건은 이날 명령 6,001개의 12.4%다
사실 가운데 세 줄을 다시 보십시오. 61.1초 · 61.9초 · 70.9초. 명령은 셋 다 17개, 다운로드는 셋 다 0건입니다. 그런데 들어온 시각은 02시 52분 · 10시 00분 · 12시 51분으로 10시간에 걸쳐 흩어져 있습니다.
추정 오는 시간은 안 맞췄는데 하는 일은 맞습니다. 사람이 앉아서 하는 일의 모양이 아닙니다. 미리 짜 둔 같은 순서가 세 번 재생된 것으로 읽습니다.
파일 네 개 — 셋은 새 옷, 하나는 그대로
사실 02번이 이날 확보한 파일은 4건입니다. 8월 28일에도 4건이었고, 8월 30일에도 같은 4종 구성이었습니다.
여기서 해시라는 말을 풀고 가겠습니다. 해시(sha256)는 파일 전체를 계산해서 뽑아낸 64자리 값입니다. 파일 안의 글자 하나만 달라져도 값이 통째로 바뀝니다. 그래서 “이 파일과 저 파일이 같은 것인가”를 이 값으로 판정합니다. 사람 지문 같은 것이라고 보면 됩니다.
사실 그날 네 개의 지문을 8/28·8/30 기록과 맞춰 봤습니다. 결과는 이렇습니다.
| 8/28·8/30 크기 | 9/03 크기 | 차이 | 지문(sha256) |
|---|---|---|---|
| 46,525바이트 | 46,582바이트 | +57 | 7a48c93c… — 아카이브 18일치에 없음 |
| 239,388바이트 | 235,292바이트 | −4,096 | 608ee011… — 아카이브 18일치에 없음 |
| 334,816바이트 | 334,752바이트 | −64 | d4e8c642… — 아카이브 18일치에 없음 |
| 153,208바이트 | 153,208바이트 | 0 | d7188b8c… — 8/28·8/30과 완전히 동일 |
사실 네 줄 중 세 줄의 지문이 처음 보는 값입니다. 우리가 들고 있는 8월 16일부터 9월 2일까지 18일치 기록 어디에도 없습니다.
사실 그리고 맨 아랫줄 하나만 한 비트도 안 바뀌었습니다. 8월 28일부터 9월 3일까지 여섯 날째 같은 파일입니다.
추정 차이 숫자에 견줄 것을 붙이겠습니다. +57바이트는 한글로 열아홉 자쯤 되는 분량입니다. −64바이트는 방금 말한 sha256 해시 값 한 줄(64자)만큼입니다. 옷으로 치면 단추 하나 바뀐 정도입니다.
사실 가운데 줄의 4,096바이트는 정확히 4KB입니다. 딱 떨어지는 값이라 눈에 걸립니다.
사실 그래서 여기서 멈춥니다. 이 숫자가 왜 딱 4,096인지 우리는 모릅니다. 원자료에 그 근거가 없습니다. 딱 떨어진다는 사실만 적어 둡니다.
사실 한 가지 더 분명히 해 두겠습니다. 위 표의 위아래 줄이 “같은 자리의 새 판본”이라고 원자료가 말해 준 적은 없습니다. 우리가 아는 것은 딱 두 가지입니다. 크기 네 개의 배치가 비슷하다는 것, 그리고 그중 하나는 지문까지 똑같다는 것.
추정 그런데 이게 방어하는 쪽에는 그대로 문제가 됩니다. 8월 28일에 네 개의 지문을 받아 적어 두었다면, 9월 3일에 그 목록은 4분의 3이 빗나갑니다. 네 줄 중 한 줄만 여전히 맞습니다.
추정 걸음걸이 이야기로 돌아가겠습니다. 옷 색깔을 적어 둔 셈입니다. 세 벌은 새로 사 입고 왔고, 한 벌만 그대로였습니다.
이름표도 매번 달랐습니다
사실 이 파일들을 놓고 간 출발지의 별칭도 매번 다릅니다.
| 날짜 | 출발지 별칭 |
|---|---|
| 8월 28일 | ATK-F4738A 1곳 |
| 8월 30일 | ATK-E23F05 · ATK-1D7F04 2곳 |
| 9월 3일 | ATK-5A7674 1곳 |
사실
그리고 여기서 선을 하나 긋습니다. 별칭(ATK-XXXXXX)은 글과 글 사이에서 같은 마스킹 출발지를 가리키려고 붙인 표식입니다. 신원이 아닙니다. 별칭이 다르다는 것은 마스킹된 출발지가 다르다는 뜻이고, 그 이상은 말하지 않습니다.
추정 그래서 이 글에서 “같은 사람”이라는 말은 쓰지 않습니다. 걸음걸이가 같아 보인다고 같은 사람인 건 아닙니다. 같은 학원에서 같은 걸 배운 사람들일 수도 있습니다. 널리 퍼진 같은 도구를 서로 아무 상관 없는 사람들이 각자 돌려도 똑같은 모양이 나옵니다.
그 파일들이 들어온 문은 전체의 0.07%였습니다
사실 02번 서버가 이날 받은 접촉은 42,746건입니다.
추정 하루를 꽉 채워 나누면 약 2초에 한 번입니다. 아무 홍보도 하지 않은 기계인데 그렇습니다.
사실 그중 ADB 세션은 32건입니다. 전체의 0.07% 입니다. 같은 날 VNC(화면공유) 포트 하나는 41,705번 두드려졌습니다.
추정 견줘 보면 1,303배입니다. 그리고 파일이 남은 쪽은 32건짜리 문이었습니다.
사실 크기도 견줘 둡니다. 이날 02번이 받은 4건의 합계는 769,834바이트입니다. 같은 날 01번에서 나온 검체 6종을 다 합치면 1,158바이트입니다.
추정 665배 차이입니다. 사람이 실제로 들어와서 명령까지 친 서버 쪽이 훨씬 가볍습니다. 8월 28일·30일에도 똑같은 비대칭이 있었습니다.
추정
그리고 이날 4건 중 가장 오래 안 바뀐 d7188b8c…는 153,208바이트입니다. 같은 날 01번에 내려온 306바이트짜리 셸 스크립트를 500개쯤 이어 붙인 크기입니다.
사실 다만 이 파일들이 무엇인지는 이 글에서 말하지 않습니다. 02번 기록에는 파일 종류·분류를 적는 칸이 아예 없습니다. 우리가 가진 것은 크기와 지문뿐입니다.
받아 적을 값들
사실
이날 관측된 파일을 아래에 옮깁니다. 값을 누르면 복사됩니다 — 읽으라고 있는 게 아니라 차단 목록에 넣으라고 있는 값입니다. 주소는 일부러 망가뜨려 적었습니다(hxxp://, [.]). 그대로 복사해 붙여 넣어도 접속되지 않습니다. 위 네 줄이 02번, 아래가 01번입니다. 그리고 ’주소 미기록’이라고 적힌 줄이 몇 개인지 세어 보세요.
7a48c93c5cb63a09505a009260d1cca8203285e0c1c6ff5b0df9cbb47082086546,582바이트. 센서 02, 출처 ATK-5A7674 한 곳·3회. 유포 주소 미기록. 아카이브 18일치에 없던 신규 해시다. 8/28·8/30 같은 자리 파일은 46,525바이트였다(+57)608ee011537005f368c9731f4c4dee6a247b620cde52908ed0678df28c617971235,292바이트. 센서 02, 출처 ATK-5A7674 한 곳·3회. 유포 주소 미기록. 신규 해시다. 8/28·8/30 같은 자리 파일은 239,388바이트로 차이가 정확히 4,096바이트다. 이 차이의 뜻은 판단하지 않는다d4e8c642ac8485d2ac316f16b5ed2285c93734c62a3e1bc2852a49f3737053c5334,752바이트로 이날 최대 검체. 센서 02, 출처 ATK-5A7674 한 곳·3회. 유포 주소 미기록. 신규 해시다. 8/28·8/30 같은 자리 파일은 334,816바이트였다(−64)d7188b8c575367e10ea8b36ec7cca067ef6ce6d26ffa8c74b3faa0b14ebb8ff0153,208바이트. 센서 02, 출처 ATK-5A7674 한 곳·3회. 이날 4건 중 유일하게 아카이브에 있던 해시다 — 8/28(ATK-F4738A)·8/30(ATK-E23F05·ATK-1D7F04, 4회)에 같은 값·같은 크기로 기록돼 있다. 8/28~9/03 여섯 날 동안 한 비트도 바뀌지 않았다a6296a79f44e21b76604d2d2bbf795d2cf380f70e39d45fbf166707ff3b4a6a4306바이트 POSIX 셸 스크립트. 센서 01, 출처 7곳·7회(ATK-092C8D · ATK-BA4E6C · ATK-09B617 · ATK-C74CDE · ATK-0E5703 · ATK-0D0AD8 · ATK-1C06A2). 9/02 브리프가 '17일째'로 기록한 그 파일이라 이날로 18일째다hxxp://185[.]93[.]89[.]72/wget위 스크립트가 놓여 있던 자리. 이날 01번 다운로드 중 외부 주소가 기록된 유일한 항목이다a8460f446be540410004b1a8db4083773fa46f7fe76fa84219c93daa1669f8f2389바이트 OpenSSH RSA 공개키. 센서 01, 출처 5곳·5회(ATK-A32B09 · ATK-839EB6 · ATK-FDF87F · ATK-DD04E4 · ATK-7EBF4C). 주소 미기록이라 외부에서 내려받은 것이 아니라 세션 안에서 만들어진 것으로 본다. 8/16 이후 여러 날에 같은 해시로 반복 등장했고, 출처는 107곳이던 8/30 대비 크게 줄었다01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b1바이트 빈 파일. 센서 01, 출처 ATK-86979F 한 곳·11회. 이 횟수는 그 세션의 다운로드 11건과 정확히 맞는다 — 이날 완결성 최고 세션이 받아 간 파일 11개가 전부 이것이었다. 8/17·8/22와 같은 패턴이다43728fbfb98bb39ff61a2db0fc2905bd6937997062b05b9ab8b186fdee18c09a399바이트 OpenSSH 개인키. 센서 01, 출처 ATK-CA5936 한 곳·1회. 주소 미기록. 8/19·8/23·8/24·8/25·8/28·8/30·9/01과 같은 해시·같은 별칭이다00b6f15c2274420217ed3098a9f5f00545bf1793d7a324fd18a7809cbbf5b12b54바이트 ASCII 텍스트. 센서 01, 출처 ATK-CA5936 한 곳·1회. 위 개인키와 같은 별칭·같은 세션 시각대다. 내용은 기록에 없어 무엇인지 판단하지 않는다4af5a5c98ad132095c6fbe7b02c242153a190a01cc321e50a916a0ca46fbaa629바이트 ASCII 텍스트. 글자 아홉 개 분량이다. 센서 01, 출처 ATK-BECAD3 한 곳·7회. 8/23·8/24·8/25·8/30에도 같은 해시가 있다사실 주소가 적힌 줄은 열한 줄 중 하나뿐입니다. 나머지는 전부 ’주소 미기록’입니다.
추정 방어하는 쪽에는 이게 성가십니다. 막을 주소가 없으면 차단 목록에 올릴 것도 없습니다. 신고할 유포지도 남지 않습니다. 남는 건 지문뿐인데, 방금 본 것처럼 그 지문의 4분의 3은 엿새 만에 갈아입혀졌습니다.
사실 그리고 이날 01번 검체 6종에는 실행 바이너리가 한 건도 없습니다. 빈 파일, 셸 스크립트, ASCII 텍스트 두 종, 공개키, 개인키뿐입니다.
이 비밀번호 쓰고 계십니까
사실 이날 로그인 시도는 2,047회입니다.
추정 하루를 꽉 채워 나누면 약 42초에 한 번입니다. 밥 한 끼 먹는 30분 동안 마흔 번 넘게 문고리가 돌아갔다는 뜻입니다.
사실 아래는 그중 서로 다른 IP 3곳 이상에서 관측된 조합만 추린 20종입니다.
| 아이디 | 비밀번호 | 출발지 수 |
|---|---|---|
admin |
admin |
22곳 |
root |
123456 |
9곳 |
root |
12345 |
7곳 |
root |
1234 |
7곳 |
root |
admin |
6곳 |
root |
root |
6곳 |
root |
12345678 |
6곳 |
root |
vizxv |
5곳 |
345gs5662d34 |
345gs5662d34 |
5곳 |
enable\x00 |
linuxshell\x00 |
4곳 |
root |
default |
4곳 |
root |
(빈 비밀번호) | 4곳 |
root |
7ujMko0admin |
4곳 |
admin |
123456 |
4곳 |
root |
Password1 |
4곳 |
root |
1q2w3e4r |
4곳 |
root |
111111 |
4곳 |
root |
123 |
4곳 |
root |
123123 |
4곳 |
root |
123456789 |
4곳 |
사실
몇 개는 횟수까지 남아 있습니다. admin/admin은 서로 다른 22곳이 96번, root/admin은 6곳이 77번, root/vizxv는 5곳이 73번, enable\x00/linuxshell\x00은 4곳이 69번 시도했습니다. 비밀번호를 아예 비워 둔 시도도 4곳에서 30번 있었습니다.
사실 이날 관측된 조합은 이 20개가 전부가 아닙니다. 기준을 넘지 못한 조합이 594개 더 있습니다. 그 594개는 개수만 세고 값을 싣지 않았습니다.
추정 이유는 이렇습니다. 한두 곳에서만 나온 조합은 어딘가에서 실제로 유출된 진짜 누군가의 계정일 수 있습니다. 여기 옮겨 적으면 그 사람에게 두 번째 피해를 주는 일이 됩니다. 그래서 세기만 합니다. 위에 실은 20개는 전부 4곳 이상에서 반복된, 누구의 것도 아닌 공장 기본값 계열입니다.
사실 594개는 우리가 들고 있는 18일치 중 여섯 번째로 큰 값입니다. 앞에 8/18(1,388) · 8/25(1,017) · 8/23(1,007) · 8/16(934) · 8/30(897)이 있습니다.
추정
표에서 눈여겨볼 것은 root/vizxv, root/7ujMko0admin, root/default 같은 값입니다. 사람이 만든 비밀번호가 아닙니다. 장비를 만든 회사가 공장에서 넣어 둔 값입니다. 그래서 “내가 정한 비밀번호가 아니니까 안전하다”는 감각이 정확히 반대로 작동합니다. 관리자가 한 번도 로그인해 본 적 없는 장비가 가장 위험합니다.
국제 분류표에 대응시키면
공격자가 쓴 수법에는 전 세계가 같이 쓰는 번호가 붙어 있습니다. MITRE ATT&CK라는 목록입니다. 아래에서 ID를 누르면 원문 설명으로 갑니다 — 우리 말을 믿지 말고 직접 확인해 보시라고 붙여 둡니다.
- T1110.001Brute Force: Password Guessing — 로그인 시도 2,047회, 원문 인용 가능한 조합 20종추정
- T1078.001Valid Accounts: Default Accounts — admin/admin(22곳), root/vizxv(5곳) 등 장비 공장 기본값 계열추정
- T1082System Information Discovery — '정찰 — 시스템' 488회추정
- T1046Network Service Discovery — '정찰 — 네트워크' 1회추정
- T1105Ingress Tool Transfer — '파일 다운로드' 37회, 02번 ADB 검체 4건추정
- T1222.002File and Directory Permissions Modification: Linux — '실행 권한 부여' 164회추정
- T1098.004Account Manipulation: SSH Authorized Keys — '지속성 — SSH 키 심기' 10회, 389바이트 공개키 5곳추정
- T1070Indicator Removal — '흔적 삭제' 7회추정
- T1562Impair Defenses — '방어 무력화' 1회(ATK-86979F 세션)추정
- T1021.005Remote Services: VNC — 02번 접촉 41,705건 / 출처 135곳추정
- T1021.001Remote Services: Remote Desktop Protocol — 02번 접촉 568건 / 출처 102곳추정
- T1021.002Remote Services: SMB/Windows Admin Shares — 02번 접촉 388건 / 출처 48곳추정
사실 열두 줄이 전부 ‘추정’ 배지입니다. 우리가 본 것은 명령의 의도 분류와 개수이지, 공격자가 스스로 밝힌 목적이 아니기 때문입니다.
사실 그리고 아래 세 줄에는 단서가 하나 더 붙습니다. 02번은 문고리만 달린 서버라 로그인 성공이라는 사건 자체가 없습니다. 저 4만 건은 ’두드렸다’이지 ’들어왔다’가 아닙니다.
어제 하루 전체
사실 센서 01(사람이 실제로 들어올 수 있는 쪽) 기준입니다.
| 항목 | 2026-09-03 | 견줄 것 |
|---|---|---|
| 세션 | 2,378건 | 하루로 나누면 약 36초에 한 건 |
| 고유 출발지 | 457곳 | 아카이브 19일 중 최다. 종전 최고는 8/27의 442곳 |
| 곳당 세션 | 5.20회 | 한 곳이 평균 다섯 번 두드리고 빠졌다 |
| 로그인 시도 | 2,047회 | 약 42초에 한 번씩 아이디와 비밀번호를 넣어 봤다 |
| 명령 | 6,001개 | 약 14초에 하나 |
| 포트 2223 (텔넷) | 1,381세션 | 전체의 58.1% |
| 포트 2222 (SSH) | 997세션 | 전체의 41.9% |
| TTY 녹화 | 1,597건 | 세션의 67.2% |
| 명령 의도 합계 | 745회 | 명령 6,001개의 12.4% |
추정 맨 아랫줄이 이 표에서 가장 조용한 숫자입니다. 명령 여덟 개 중 일곱 개에는 뜻이 안 붙었습니다. 우리가 “이건 무엇을 하려던 명령이다”라고 분류할 수 있었던 건 12.4%뿐입니다.
사실 그 745개의 내역은 이렇습니다. ’의도’는 친 명령이 무엇을 하려던 것인지 분류한 값입니다.
| 의도 | 횟수 |
|---|---|
| 정찰 — 시스템 | 488회 |
| 실행 권한 부여 | 164회 |
| 파일 다운로드 | 37회 |
| 다운로드 후 실행 | 37회 |
| 지속성 — SSH 키 심기 | 10회 |
| 흔적 삭제 | 7회 |
| 방어 무력화 | 1회 |
| 정찰 — 네트워크 | 1회 |
| 합계 | 745회 |
추정 위에서 아래로 내려가는 모양을 보십시오. 488 → 164 → 37 → 10 → 7 → 1. 단계마다 3~4배씩 좁아집니다. 둘러보는 것까지는 다 하는데, 실제로 뭔가를 놓고 가는 데까지 가는 건 아주 적습니다.
사실 ’실행 권한 부여’는 내려받은 파일에 “이건 실행해도 되는 프로그램이다”라는 표시를 붙이는 작업입니다. 리눅스에서는 파일을 받아만 놓으면 돌아가지 않습니다. 표시를 따로 붙여야 합니다.
사실 그리고 ‘파일 다운로드’ 37회와 ‘다운로드 후 실행’ 37회가 정확히 같은 숫자입니다. 내려받은 것은 예외 없이 실행 단계로 이어졌다는 뜻입니다.
사실 옆에 세워 둔 02번 서버의 숫자도 옮겨 둡니다. 다시 말하지만 여기 ’접촉’은 두드린 횟수입니다.
| 서비스 | 포트 | 접촉 | 고유 출발지 | 한 곳당 평균 |
|---|---|---|---|---|
| VNC | 5900 | 41,705건 | 135곳 | 309회 |
| RDP | 3389 | 568건 | 102곳 | 5.6회 |
| SMB | 445 | 388건 | 48곳 | 8.1회 |
| LDAP | 389 | 36건 | 5곳 | 7.2회 |
| MSSQL | 1433 | 17건 | 12곳 | 1.4회 |
| ADB | (미기록) | 32건 | (미기록) | 확보 검체 4건 |
사실 여섯 줄의 합이 42,746으로 총계와 정확히 맞습니다. 맨 위와 맨 아래를 나란히 보십시오. 41,705건에서 나온 파일은 0개, 32건에서 나온 파일은 4개입니다.
사실 ADB 줄에 ’미기록’이 두 개 있습니다. 이날 서비스별 내역표에 ADB 항목이 아예 없어서 포트 번호와 고유 출발지 수를 알 수 없습니다. 8월 27일·30일 기록에는 있었습니다. 여기서 0은 ’없음’이 아니라 ’안 적혀 있음’입니다.
사실 VNC 쪽에는 모양이 하나 더 있습니다. 이날 02번에서 이벤트가 가장 많은 상위 7곳의 숫자는 7,183 / 7,131 / 6,323 / 5,094 / 5,035 / 5,007 / 5,000입니다. 그런데 8위는 182입니다.
추정 7위와 8위 사이가 27.5배 절벽입니다. 상위 7곳을 합친 40,773건은 02번 전체 접촉의 95.4%, VNC 접촉의 97.8% 입니다. 이 일곱 곳이 VNC 폭주의 실체로 보입니다.
사실 다만 여기서 멈춥니다. 이 일곱 곳이 서로 관련이 있는지는 알 수 없습니다. 숫자가 비슷하다는 것만으로 같은 주체라고 쓸 수 없고, 확인할 수단도 없습니다. 그리고 이날 파일 4건을 남긴 ATK-5A7674는 이 상위 목록에 없습니다.
사실 문을 두드린 쪽이 무슨 규격으로 말을 걸었는지도 옮겨 둡니다. 프로토콜 어휘란 접속하는 쪽이 “나는 이 버전으로 말하겠다”고 먼저 제안하는 값입니다.
- VNC에서 제안된 버전은
003.003이 40,826건,003.008이 645건입니다. 버전이 기록된 41,471건 중 98.4%가 옛 버전입니다. 234건은 버전 기록이 없습니다. - SMB 방언은 기록된 327건 중
SMB 2.???가 딱 1건이고, 나머지 326건(99.7%)이NT LM 0.12·LANMAN1.0·LM1.2X002·PC NETWORK PROGRAM 1.0같은 SMB1 이전 어휘입니다. 388건 중 61건은 기록이 없습니다. - RDP 접속 쿠키는 기록된 440건 중 433건(98.4%)이 정제 결과
<ip>로 남았습니다. 쿠키 자리에 IP 형태 문자열이 들어 있었다는 뜻입니다. 나머지는hello3건과 아홉 자 무작위 문자열로 보이는 값 4건입니다. 568건 중 128건은 쿠키 기록이 없습니다.
추정 SMB1을 꺼 둔 서버라면 저 326건은 협상 단계에서 그냥 끝납니다. 그리고 쿠키 자리에 사용자명 대신 접속 대상 IP를 그대로 넣는 것은 사람이 아니라 목록을 훑는 자동화 도구의 흔적으로 읽힙니다. 다만 쿠키 안의 IP 문자열은 마스킹 대상이라 원문을 싣지 않고, 그 값이 무엇을 가리키는지도 판단하지 않습니다.
도구는 그대로인데 IP는 매일 바뀝니다
사실 SSH로 들어오는 접속은 프로그램마다 첫 인사말이 조금씩 다릅니다. 그 인사말을 요약한 값을 클라이언트 지문이라고 부릅니다. 어떤 프로그램으로 접속했는지를 가리키는 값입니다.
사실 이날 지문 군집은 39개로 집계됐고, 그중 12종이 기록에 실렸습니다. 12종의 이날 출발지를 합치면 288곳으로, 01번 고유 출발지 457곳의 63% 입니다.
사실
1위는 acaa53e0…(SSH-2.0-OpenSSH_7.4)로 이날 255곳, 누적 1,005곳입니다.
추정 숫자만 보면 “255곳이 한 무리”라고 쓰고 싶어집니다. 쓰지 않습니다. 이 값은 널리 쓰이는 리눅스 배포판에 그냥 들어 있는 기본 클라이언트 문자열입니다. 서로 아무 상관 없는 사람들이 같은 값을 갖는 게 정상입니다. 말할 수 있는 건 “255곳이 같은 도구를 쓴다” 까지이고, “255곳이 한 조직이다” 는 이 데이터로 성립하지 않습니다.
사실
그런데 12종 중 실제로 검체를 남긴 군집은 하나뿐입니다. 16443846…4397(SSH-2.0-Go)이고, 이날 4곳·누적 19곳입니다. 그리고 이것이 위 타임라인의 ATK-CA5936 세션의 지문입니다.
추정
여기서 이 글의 처음으로 돌아갑니다. 도구는 그대로인데 그 도구를 든 출발지는 매일 바뀝니다. 이날 02번의 파일 네 개도 같은 모양이었습니다. 이름표는 ATK-F4738A → ATK-E23F05·ATK-1D7F04 → ATK-5A7674로 매번 달랐는데, 네 개를 한 세트로 들고 온다는 것과 그중 하나의 지문은 여섯 날째 같았습니다.
추정 얼굴이 매번 바뀐다면, 얼굴을 적어 두는 수첩은 쓸모가 없습니다.
사실 그리고 이날은 한계가 하나 더 붙습니다. 세션의 58.1%인 텔넷에는 지문이라는 것이 아예 없습니다. SSH는 접속할 때 서로 인사말을 주고받지만 텔넷은 그 절차 자체가 없습니다. 위 타임라인의 텔넷 세션 네 건에 지문 칸이 비어 있는 이유입니다.
그래서 뭘 해야 하나
추정 ‘이 통제가 없었다면’ 일곱 가지를, 이날 데이터가 가장 세게 받쳐 주는 순서로 놓습니다.
1. 공장 출고 계정과 흔한 비밀번호를 없앤다 — 이날 완결성 상위 다섯 세션은 예외 없이 로그인에 성공한 뒤 시작됩니다. 그리고 위 표 20종이 전부 기본값이거나 숫자 나열입니다. 가장 값싼 자동화에 가장 먼저 뚫리는 자리입니다.
2. 비밀번호 대신 열쇠로 들어오게 한다 — 이날 시도 2,047회는 전부 비밀번호 경로였습니다. 그리고 ’SSH 키 심기’가 10회 관측됐습니다. 리눅스 서버에는 authorized_keys(허용된 열쇠 목록)라는 파일이 있습니다. 여기에 공개키 한 줄이 들어가면 그 짝을 가진 사람은 비밀번호를 아예 묻지 않고 들어옵니다. 쉽게 말해 비밀번호 없이 열리는 여벌 열쇠를 현관에 걸어 두는 겁니다. 그리고 비밀번호를 바꿔도 그 열쇠는 그대로 남습니다. 이날 검체를 한 건도 남기지 못한 세션조차 키 심기 단계에는 도달했습니다.
3. 관리 포트를 인터넷에 그대로 열어 두지 않는다 — 아무 홍보도 하지 않은 기계 두 대에 하루 동안 4만 5천 건대의 접촉이 들어왔습니다. 이날 01번 고유 출발지 457곳은 19일 중 최다입니다. 취약점이 하나도 없어도 이만한 압력이 상시로 걸립니다. VPN이나 점프호스트 뒤로 옮기면 이 압력의 대부분은 애초에 도달하지 않습니다.
4. 안드로이드 디버그 통로(ADB)를 꺼 둔다 — 이날의 요점입니다. 접촉으로는 42,746건 중 32건, 0.07% 입니다. 그런데 이날 확보된 검체 네 개는 전부 여기서 나왔습니다. 두드린 횟수 순으로 방어 우선순위를 정하면 이 문을 정확히 맨 마지막에 보게 됩니다. 개발할 때 잠깐 켜 두고 끄지 않은 경우가 전형적입니다.
5. 서버에서 밖으로 나가는 연결을 제한한다 — 침입과 무기 반입은 분리돼 있습니다. 이날 ‘파일 다운로드’ 37회와 ‘다운로드 후 실행’ 37회가 그 자리입니다. 서로 다른 7곳이 같은 외부 주소(hxxp://185[.]93[.]89[.]72/wget)에서 같은 306바이트 스크립트를 끌어왔습니다. 나가는 통신을 기본으로 막아 두면 로그인이 뚫려도 다음 단계가 끊깁니다. 이날 01번 검체 합계는 1,158바이트뿐이지만, 유포지가 살아 있는 한 크기는 언제든 커집니다 — 실제로 같은 날 02번은 769,834바이트를 받았습니다.
6. 로그를 서버 밖에 따로 남긴다 — 흔적을 지우려는 의도가 이날 7회, 방어를 무력화하려는 의도가 1회 관측됐습니다. 횟수는 적습니다. 그래도 지운 뒤에 들어온 사람은 무엇이 지워졌는지조차 알 수 없습니다. 로그를 서버 밖으로 즉시 내보내지 않으면, 사고가 난 뒤에 복원할 수 있는 건 ’언제 뚫렸는지 모른다’는 사실뿐입니다.
7. ’몇 번 틀리면 잠금’에만 기대지 않는다 — 이 항목은 이날 양면입니다. 01번은 한 곳당 세션이 5.20회입니다. 한 곳이 다섯 번쯤 두드리고 빠지니까 ‘5회 실패하면 차단’ 같은 임계값은 거의 발동하지 않았을 겁니다. 반대로 02번의 VNC는 한 곳당 309회였고, 상위 7곳은 5천 건씩이었습니다. 여기에 속도 제한이 있었다면 대부분이 잘렸습니다. 같은 조치가 어느 문에서는 거의 무효고 어느 문에서는 결정적입니다. IP 하나당 임계값만으로 방어를 설계하면 01번처럼 넓고 얕게 퍼지는 시도에는 걸리지 않습니다.
사실
2번에 단서를 답니다. SSH 키 심기는 밖으로 나가는 연결이 필요 없습니다. 5번을 아무리 조여도 이건 안 막힙니다. 서버를 쓰신다면 ~/.ssh/authorized_keys 파일을 한 번 열어 보십시오. 내가 넣은 기억이 없는 줄이 있으면 그게 남의 열쇠입니다. 비밀번호를 바꾸는 것으로는 지워지지 않습니다.
전에도 있었던 일
추정 ADB.Miner(2018년). 안드로이드 디버그 브리지(5555/tcp)가 열린 기기를 스캔해 채굴 코드를 퍼뜨린 웜입니다. 인증 없이 열린 ADB 통로가 파일 투입 경로가 된다는 구조가 이날 02번과 같습니다. 다만 같은 계열이라고 말하는 것이 아닙니다. 이날 검체의 종류·분류가 우리에게 없어서, 말할 수 있는 것은 경로의 모양이 같다는 것까지입니다. (근거: 보안업체 위협 인텔리전스 공개 보고서 — 360 Netlab)
추정
Mirai 봇넷(2016년). 텔넷과 장비 공장 기본 계정 사전으로 IoT 기기를 대량 감염시킨 사례이고, 이후 소스코드가 공개되면서 파생 계열이 퍼졌습니다. 이날 인용한 상위 조합(root/vizxv, root/7ujMko0admin, admin/admin, root/default)이 그 공개된 기본 계정 사전과 겹치는 계열입니다. 그리고 이날 세션의 58.1%가 텔넷이었습니다. 다만 사전이 겹친다는 것은 도구의 계보를 시사할 뿐 운영 주체를 특정하지 않습니다. (근거: 미국 CISA(당시 US-CERT) 경보 TA16-288A · 공개된 소스코드)
추정
RealVNC 인증 방식 협상 우회 취약점 CVE-2006-2369(2006년). 이날 02번에서 제안된 화면공유 버전 41,471건 중 40,826건(98.4%)이 003.003이었습니다. RFB 3.3은 인증 방식을 고르는 권한이 서버 쪽에 있는 옛 버전이라, 이 계열 결함이나 인증 없는 화면공유 서버를 함께 노리는 스캐너가 선호할 만한 값입니다. 다만 이것은 프로토콜 정의와 공개 CVE에 근거한 배경 설명이며, 이날 관측된 접촉이 이 취약점을 공격했다는 근거는 우리에게 없습니다. (근거: MITRE/NVD 등재 CVE)
우리는 관측에서 끝내지 않습니다
사실
이날 확보한 유포 주소 hxxp://185[.]93[.]89[.]72/wget 과 02번의 신규 해시 세 건은 C-TAS(한국인터넷진흥원 사이버위협정보 분석·공유 체계)로 신고하는 대상입니다.
사실 다만 단서를 답니다. 우리가 확인할 수 있는 것은 전송이 성공했다는 것까지입니다. 받는 쪽에 실제로 적재됐는지는 이 기록으로 말할 수 없습니다.
우리가 모르는 것
이 글에서 가장 중요한 부분입니다. 위에서 적은 것보다 적지 못한 것이 더 많습니다.
- [핵심] 02번 기록에는 시계가 아예 없습니다. 이날 검체 4건이 하루 중 언제, 몇 분 간격으로 들어왔는지 말할 수 없습니다. 타임라인의 02번 줄을 전부 ’시각 미상’으로 둔 이유입니다.
- [핵심] 네 개를 ADB 경로로 본 것은 우리가 이어 붙인 추론입니다. ’02번에서 파일이 실려 들어올 수 있는 통로는 ADB뿐이고, 나머지는 저상호작용이라 파일을 받지 않는다’는 구조에서 나온 것입니다. 원자료가 이 다운로드를 특정 서비스에 명시적으로 연결해 주지는 않았습니다.
- [핵심] 이 네 개가 무엇인지 모릅니다. 02번 기록에는 파일 종류·분류를 적는 칸이 아예 없습니다. 실행 파일인지 라이브러리인지 그냥 자료인지 판단할 근거가 없어, 크기와 지문만으로 서술했습니다.
- 세 건이 8/28·8/30의 세 건과 ’같은 자리의 새 판본’인지, 아예 다른 파일인지 알 수 없습니다. 원자료가 둘을 연결해 주지 않습니다. 우리가 아는 것은 크기 네 개의 배치가 비슷하고 그중 하나는 지문까지 같다는 것뿐입니다. 크기 차이(+57 / −4,096 / −64)가 무엇을 뜻하는지도 근거가 없습니다.
- 별칭이 8/28·8/30·9/03에 각각 다르다는 것은 마스킹된 출발지가 다르다는 뜻이며, 그 이상을 말하지 않습니다. 별칭은 글 사이 대조용 표식이지 신원이 아닙니다.
- 이날 서비스별 내역표에 ADB 항목이 없어 포트 번호와 고유 출발지 수를 알 수 없습니다. 수집 실패로 명시된 것은 아니지만, 8/27·8/30에 견주면 이 통로의 정보량이 줄었다는 사실은 적어 둡니다.
- TTY 녹화 수치가 1,597건과 249건 두 가지로 남아 있습니다. 두 값의 정의가 설명돼 있지 않아 무엇이 기록된 것이고 무엇이 보관된 것인지 구분할 수 없습니다.
- ’SSH 키 심기’는 10회인데 389바이트 공개키는 5곳·5회입니다. 두 수치가 맞지 않는 이유를 원자료가 설명하지 않습니다. 키를 심으려던 시도가 파일 저장까지 이어지지 않은 경우가 있는 것으로 보이지만, 근거는 없습니다.
- 지문 군집은 39개인데 기록에 실린 것은 12종입니다. 목록의 출발지 합 288곳은 01번 고유 출발지의 63%이고, 나머지 169곳이 어떻게 흩어져 있는지 모릅니다. 그리고 이날 세션의 58.1%인 텔넷에는 지문 자체가 존재하지 않습니다.
- 399바이트 개인키(
43728fbf…)가 공격자가 심어 놓은 것인지, 서버에 있던 것을 가져가려 한 것인지 구분되지 않습니다. 다운로드 목록에 있지만 주소 칸은 비어 있습니다. 8월 19일부터 열엿새째 같은 상태입니다. - 별도 경로로 확보된 지표들은 이날 사건과 연결하지 않았습니다. 압축을 풀어야만 드러나는 유포 주소 12건, 그리고 Discord 웹훅 주소 1건이 그것입니다. 이날 다운로드 어느 항목과도 연결돼 있지 않습니다. 웹훅 토큰 문자열은 그 자체가 악용 가능한 값이라 본문에 옮기지 않습니다.
- 배경 통계로 들고 있는 CVE 6,607건 · CISA KEV 390건 · 랜섬웨어 연계 확인 98건은 KISA 보안공지에서 뽑은 배경 맥락입니다. 이날 SSH·텔넷·프로토콜 협상 관측과 직접 연결되지 않아 사실 관계에 넣지 않았습니다.
- 두 서버의 고유 출발지 교집합을 알 수 없어, 합산 고유 출발지는 최대 777곳이라는 상한으로만 말할 수 있습니다. 02번 안에서도 고유 출발지 320곳과 서비스별 합 302곳이 다릅니다 — 한 출발지가 여러 서비스에 걸칠 수 있어 단순히 더할 수 없습니다.
- C-TAS 신고는 전송 계층에서 성공했다는 것까지만 확인됩니다.
- 마지막으로, 허니팟은 문을 열어 주도록 만들어진 서버입니다. 로그인 성공은 ’이 비밀번호가 실제 운영 서버에서도 통한다’는 뜻이 아니라 ‘이 비밀번호가 시도되고 있다’ 는 뜻입니다.
그리고 아래는 애초에 확인할 수단이 없는 것들입니다. 추정하지 않습니다.
- ASN·ISP — 관련 데이터베이스가 없습니다. 어느 통신사·어느 호스팅 대역인지 확인할 수 없습니다.
- 지리정보 — 동일하게 없습니다. 그리고 IP 지리정보는 그 자체로 귀속 근거가 되지 않습니다. 어떤 국가·기업·개인도 이날의 공격자로 지목하지 않습니다.
- VPN·Tor·클라우드 여부 — 판별 수단이 없습니다. 02번 상위 7개 출발지의 규모가 비슷하다는 점을 해석하지 않은 이유도 이것입니다.
- VirusTotal — 연동돼 있지 않습니다. 검체 분류는 MalwareBazaar 태그를 쓰는데, 이날 02번의 네 건에는 그 태그조차 없습니다. 네 건의 악성 여부와 분류를 이 글에서 말할 수 없습니다.
- User-Agent — 두 관측면 다 HTTP가 아닙니다. 01번은 SSH·텔넷, 02번은 SMB·RDP·VNC·MSSQL·LDAP·ADB입니다. 위에서 인용한 RDP 쿠키·SMB 방언·VNC 버전은 User-Agent의 대체물이 아니라 프로토콜이 정해 둔 협상 어휘입니다.
- CVE 연결 — SSH·텔넷 공격은 대개 특정 취약점을 참조하지 않고 자격증명을 씁니다. 02번도 프로토콜 협상 단계라 마찬가지입니다. 이날 관측 어디에도 특정 취약점을 연결할 수 없습니다.
추정 정리하면 이날은 이렇습니다. 문고리는 두 서버에서 4만 5천 번 넘게 돌아갔습니다. 실제로 물건이 남은 문은 32번 열린 문 하나였고, 거기서 나온 네 개 중 세 개는 처음 보는 파일, 하나는 여섯 날째 그대로였습니다.
추정 처음의 걸음걸이 이야기로 돌아가겠습니다. 8월 28일에 우리는 네 개의 지문을 수첩에 적었습니다. 닷새 뒤, 그 수첩은 네 줄 중 한 줄만 맞았습니다. 옷은 갈아입을 수 있으니까요.
추정 그렇다고 지문을 적지 말자는 이야기가 아닙니다. 적되, 그것 하나에 방어를 걸지 말자는 이야기입니다. 네 개가 한 세트로 온다는 것, 그중 하나는 안 바뀐다는 것, 그리고 그것이 하루 서른두 번 열리는 문으로 들어온다는 것 — 이런 모양은 옷보다 오래갑니다.
기계를 한 대라도 인터넷에 붙여 두고 계시면 오늘 두 가지만 해 보시면 됩니다. 켜 둔 기억도 없는 관리·개발자용 통로가 열려 있는지 확인하는 것, 그리고 ~/.ssh/authorized_keys 를 한 번 열어 보는 것. 뒤의 것은 몇 초 걸립니다.
관측일은 2026년 9월 3일(UTC) 하루입니다. 출발지 IP는 브리프의 마스킹 형태(130.12.x.x)를 그대로 옮겼고 복원하지 않았습니다. 유포 주소는 접속되지 않도록 변형해 적었습니다(hxxp://, [.]). 자격증명은 서로 다른 IP 3곳 이상에서 관측된 조합 20종만 인용했고, 그 기준을 넘지 못한 조합 594종은 개수만 밝히고 값을 싣지 않았습니다 — 한두 곳에서만 나온 조합은 실제 유출 계정일 수 있기 때문입니다. ASN·국적·행위자 귀속은 확인 수단이 없어 추정하지 않습니다.
