밤새 울린 쪽은 빈손, 12초 머문 쪽이 열 개를 놓고 갔다
8월 26일 우리 서버 두 대가 받은 접촉은 4만 2천 건과 5천 건이었습니다. 가장 시끄러웠던 쪽은 파일을 한 개도 남기지 않았고, 12.5초 머문 세션 하나가 열 개를 놓고 갔습니다. 소리의 크기로 위험을 재면 순서가 뒤집힌다는 것을, 이날 데이터가 두 번 보여 줬습니다.

아파트 주차장에서 자동차 경보음이 밤새 울린 적 있으실 겁니다. 삐용삐용 소리가 새벽 내내 나서 몇 번을 깼는데, 아침에 나가 보면 차는 멀쩡합니다. 바람에 흔들렸거나 고양이가 올라갔거나, 아무튼 아무 일도 없었습니다.
그런데 같은 밤, 옆 동에서는 소리가 한 번도 안 났습니다. 그리고 거기 세워 둔 차 한 대가 유리 깨진 자국도 없이 안이 비어 있습니다.
밤새 우리가 신경 쓴 쪽은 소리가 난 쪽이었습니다. 정작 무슨 일이 일어난 쪽은 조용했습니다.
2026년 8월 26일 하루, 우리 허니팟에 남은 기록이 정확히 이 모양이었습니다. 그날 가장 큰 숫자를 만든 쪽은 아무것도 남기지 않았고, 12.5초짜리 세션 하나가 파일 열 개를 놓고 갔습니다.
먼저 낯선 말 하나만 풀고 가겠습니다. 허니팟은 일부러 허술하게 만들어 인터넷에 내놓은 미끼 서버입니다. 진짜 업무는 하지 않습니다. 누가 들어와서 무엇을 하는지 통째로 기록하려고 열어 둔 기계입니다. 아래 숫자는 전부 거기에 찍힌 것입니다.
이날부터 서버가 두 대입니다
사실 지금까지 이 일지에 나온 숫자는 전부 서버 한 대에서 나온 것이었습니다. 8월 16일부터 25일까지 열흘 치가 모두 그렇습니다. 이날 처음으로 두 번째 서버가 같은 브리프에 올라왔습니다.
사실 두 대는 성격이 완전히 다릅니다. 첫 번째(센서 01)는 고상호작용 서버입니다. 실제로 로그인이 되고, 들어온 사람이 명령을 칠 수 있고, 그 명령이 전부 기록됩니다. 두 번째(센서 02)는 저상호작용 서버입니다. 문 앞에서 인사만 받고 절대 열어 주지 않습니다.
이 차이가 오늘 글의 뼈대입니다. 소리는 두 번째에서 났고, 일은 첫 번째에서 났습니다.
소리가 난 쪽 — 4만 2천 번
사실 두 번째 서버가 이날 받은 접촉은 42,493건입니다. 하루를 꽉 채워 나누면 약 2초에 한 번입니다. 눈 한 번 깜빡할 때마다 어딘가에서 이 기계에 말을 걸었습니다.
사실 그중 **40,791건, 전체의 96.0%**가 포트 하나에 몰렸습니다. 5900번, 화면 공유(VNC)입니다. 이건 남의 컴퓨터 화면을 그대로 가져와서 내 마우스로 조작하게 해 주는 기능입니다.
사실 그런데 그 40,791건을 만든 곳은 딱 40군데였습니다. 한 곳당 평균 약 1,020회입니다. 한 곳이 하루 종일 1분 반에 한 번씩 같은 문에 말을 건 셈입니다.
사실 바로 옆 포트는 정반대였습니다. 3389번 원격 데스크톱(RDP)에는 1,221건을 139곳이 나눠서 만들었습니다. 한 곳당 약 8.8회입니다. 같은 서버 위에서 한 곳당 밀도가 약 116배 차이 났습니다.
추정 성격이 다른 두 가지 활동으로 읽습니다. 앞쪽은 몇몇 도구가 하루 종일 붙어 있는 집요한 반복이고, 뒤쪽은 여러 곳이 지나가며 한 번씩 확인하는 넓은 훑기에 가깝습니다.
그런데 그 문 안에서는 아무 일도 일어날 수 없습니다
사실 여기서 반드시 짚어야 할 게 있습니다. 두 번째 서버는 저상호작용이라 로그인 성공도, 셸 명령도, 자격증명도 애초에 존재하지 않습니다. 확보된 검체도 0건입니다.
사실 이 서버에서 ’명령’이라고 기록되는 것은 사람이 친 명령이 아니라 프로토콜 프레임입니다. 쉽게 말해 두 기계가 통화를 시작할 때 주고받는 정해진 인사말입니다. “여기 몇 번 규격 쓰세요?” 하고 물어보는 첫 마디까지만 기록됩니다.
사실 그러니 이 42,493건을 두고 “공격자가 침투해서 무엇을 했다”고 쓸 수 없습니다. 쓸 수 있는 것은 규모와 패턴, 그리고 프로토콜이 정한 어휘뿐입니다.
이게 밤새 울린 경보음입니다. 소리는 4만 2천 번 났는데, 그 소리가 난 문은 안에서 아무 일도 일어날 수 없는 문이었습니다.
인사말만 봐도 보이는 것
사실
그래도 인사말에서 읽히는 게 있습니다. 화면 공유 접촉 중 버전이 기록된 40,769건에서, 40,752건(99.96%)이 003.003을 제안했습니다. 나머지 17건이 003.008입니다.
사실 이 규격을 정한 국제 문서(RFC 6143)는 버전 세 개를 정의합니다. 3.3, 3.7, 3.8입니다. 거의 전부가 그중 가장 낮은 것으로 말을 걸었습니다.
추정 낮은 버전으로 말을 거는 이유는 하나입니다. 그래야 오래된 서버까지 다 알아듣기 때문입니다. 특정 상대를 노린 게 아니라 구형까지 한 번에 훑으려는 범용 도구 쪽에 가깝다는 뜻으로 읽습니다.
사실
파일 공유(SMB) 쪽도 같은 방향입니다. 240건의 협상에서 제안된 방언은 NT LM 0.12 55 · LANMAN1.0 45 · LM1.2X002 45 · PC NETWORK PROGRAM 1.0 25 · Windows for Workgroups 3.1 25 · LANMAN2.1 25 · LANMAN 20입니다. 전부 SMB1 계열이고, SMB 2.???는 단 2건입니다.
사실
원격 데스크톱 쪽에서는 접속할 때 붙여 보내는 이름표(쿠키)가 남았습니다. hello 604 · <ip> 449 · Administr 2 · (빈 값) 1 · aZRyuAPjX 1 · tWpPMjUMh 1.
추정
상위 두 개가 hello와 <ip>인 건 사람이 친 사용자명으로 보기 어렵습니다. 도구가 빈칸에 그냥 채워 넣은 자리표시자로 읽습니다. <ip>는 원래 IP 주소가 들어가야 할 자리에 그 글자가 그대로 남아 있는 형태입니다.
조용한 쪽 — 12.5초에 열 개
사실 같은 날 첫 번째 서버에서는 명령 14,344개가 실행됐습니다. 하루로 나누면 약 6초에 한 번씩 누군가 우리 기계 안에서 뭔가를 쳤습니다. 우리가 들고 있는 열흘 기록에서 가장 많은 날입니다(직전 최고 7,574개, +89%).
사실 그중 이날 가장 깊이 들어간 축에 드는 세션 하나가 11시 29분 30초에 시작해 42초에 끝났습니다. 12.5초입니다. 그 12.5초 동안 명령 3개를 치고 파일 10건을 받아 갔습니다. 1.25초에 하나꼴입니다.
사실 그 세션이 한 일은 세 단계였습니다. 파일 다운로드 → 실행 권한 부여 → 다운로드 후 실행. 여기서 실행 권한 부여가 뭔지 풀고 가겠습니다. 리눅스에서 파일은 그냥 받아 놓는다고 실행되지 않습니다. “이건 실행해도 되는 파일”이라는 표시를 따로 붙여 줘야 합니다. 그 표시를 붙이는 행동이 이날 서버 전체에서 182번 있었습니다.
추정 12.5초는 사람이 화면을 보고 판단하는 속도가 아닙니다. 사전에 짜인 순서가 그대로 돌아간 시간으로 읽습니다.
하루를 시간 순서로
시간 순서로 늘어놓으면 이렇게 됩니다. 표가 깁니다. 두 번째 줄과 세 번째 줄의 숫자를 나란히 비교해 보세요. 47분 떨어진 서로 다른 출발지인데 값이 하나도 안 틀립니다.
- 사실 ATK-E17FA9(185.153.x.x, SSH) 로그인 성공. 명령 18개, 다운로드 2건. intents 가 정찰 — 시스템 → 지속성 — SSH 키 심기 → 지속성 — cron → 흔적 삭제 로 4단계 이어진 이날 유일한 세션이다. 당일 전체에서 '지속성 — cron' 은 1건이고, 이 세션이 그 1건이다. hassh 지문 f555226df1963d1d3c09daf865abdc9a (SSH-2.0-libssh_0.9.6)
- 사실 ATK-CC4D29(217.60.x.x, 텔넷) 로그인 성공. 명령 17개, intents 5종 — 다운로드 후 실행·실행 권한 부여·정찰(시스템)·지속성(SSH 키 심기)·파일 다운로드. download_count 는 0
- 사실 ATK-081597(138.2.x.x, 텔넷) 로그인 성공. 명령 17개, intents 5종이 위 ATK-CC4D29 와 완전히 동일하고 completeness 도 17 로 같다. 47분 간격, 서로 다른 출발지
- 추정 명령 수·의도 조합·완결성이 모두 일치하는 두 텔넷 세션은 같은 자동화 도구가 만든 것으로 읽힌다. 텔넷에는 SSH 핸드셰이크가 없어 hassh 지문이 남지 않으므로(두 세션 모두 fingerprint·client 가 빈 문자열) 지문으로 확인할 방법은 없다
- 사실 ATK-F5F4F4(61.46.x.x, 텔넷) 로그인 성공. 명령 22개, 다운로드 11건, completeness 42 로 당일 1위. intents 는 '방어 무력화' 단 하나이며, 당일 전체 '방어 무력화' 1건이 이 세션이다. 이 별칭이 받아간 파일은 sha256 01ba4719…546b — 크기 1바이트, file_kind 는 'very short file (no magic)'
- 사실 ATK-10149C(45.198.x.x, SSH) 로그인 성공. 명령 3개, 다운로드 10건, completeness 41. intents 3단계 — 파일 다운로드·실행 권한 부여·다운로드 후 실행. hassh 지문 16443846184eafde36765c9bab2f4397 (SSH-2.0-Go)
- 사실 이 별칭에 걸린 검체는 hxxp://5[.]182[.]210[.]174 한 곳에서 왔다. 그중 파일명이 /ok 인 1,608바이트 Bourne-Again 셸 스크립트가 sha256 94d15544…5440 · f98ba385…7d73 · 2b40a245…5eeb 세 개로 서로 다르다. 나머지 넷은 CPU 계열이 다른 ELF 32비트 실행파일이다 — PowerPC MSB 50,092바이트 / Intel 80386 LSB 45,860 / MIPS-I 68,632 / ARM EABI4 62,600, 전부 statically linked stripped
- 추정 같은 주소·같은 크기인데 해시만 다른 파일 세 개는, 유포지가 요청마다 내용을 조금씩 바꿔 내보내고 있다는 뜻으로 읽힌다. 그렇다면 해시 기반 차단은 이 파일에 대해 한 번도 유효했던 적이 없다. 다만 JSON 에 파일 내용이 없어 무엇이 달랐는지는 확인할 수 없다
- 사실 명령 의도 분류 — 정찰(시스템) 2,391 / 실행 권한 부여 182 / 다운로드 후 실행 46 / 파일 다운로드 46 / 흔적 삭제 18 / 지속성(SSH 키 심기) 17 / 정찰(네트워크) 1 / 지속성(cron) 1 / 방어 무력화 1
- 사실 sha256 a8460f44…f8f2 — 389바이트 OpenSSH RSA 공개키 파일이 서로 다른 별칭 12곳에서 총 14회 관측됐다(ATK-2C9913·09A5AE·EA9CD5·AEFFBD·E856A7·0870EF·831C59·E17FA9·4795D8·82E025 외). 여러 출발지가 같은 열쇠 파일 하나를 심고 있다
- 사실 접촉 42,493건 / 고유 출발지 253곳. 서비스별로 VNC 40,791(고유 40) · RDP 1,221(고유 139) · SMB 240(고유 43) · LDAP 94(고유 13) · MSSQL 61(고유 7), 그리고 ADB 세션 86. 5개 서비스 합 42,407 + ADB 86 = 42,493 으로 총계가 맞는다
- 사실 VNC 접촉 중 버전이 기록된 40,769건에서 003.003 이 40,752건(99.96%), 003.008 이 17건이다. SMB 협상에서 제안된 방언은 NT LM 0.12 55 · LANMAN1.0 45 · LM1.2X002 45 · PC NETWORK PROGRAM 1.0 25 · Windows for Workgroups 3.1 25 · LANMAN2.1 25 · LANMAN 20 으로 전부 SMB1 계열이고, 'SMB 2.???' 는 단 2건이다. RDP 쿠키는 hello 604 · <ip> 449 · Administr 2 · (empty) 1 · aZRyuAPjX 1 · tWpPMjUMh 1
- 추정 003.003 은 RFC 6143 이 정의한 세 버전(3.3 / 3.7 / 3.8) 중 가장 낮은 것이다. 거의 전부가 가장 낮은 버전을 제안했다는 것은, 상대가 구형 서버까지 한 번에 훑으려는 범용 스캐너 쪽에 가깝다는 뜻으로 읽힌다. SMB 쪽도 같은 방향이다 — 240건 중 SMB2 를 제안한 협상이 2건뿐이라면, 말을 거는 어휘 자체가 구형에 맞춰져 있다
사실 표에서 눈에 걸리는 건 두 군데입니다. 하나는 04:44와 05:31입니다. 서로 다른 출발지인데 명령 개수·의도 조합·완결성 점수가 하나도 안 틀립니다. 다른 하나는 07:26입니다. 이날 완결성 1위 세션인데, 받아 간 파일이 1바이트짜리 빈 파일이었습니다. 글자 하나 크기입니다.
추정 04:44와 05:31 쌍은 같은 자동화 도구가 두 번 돌아간 모양으로 읽습니다. 여기까지가 말할 수 있는 전부입니다. 텔넷에는 접속 프로그램 지문이 아예 남지 않아서, 도구가 같다는 것조차 지문으로는 확인할 수 없습니다.
같은 주소, 같은 크기, 다른 해시 세 개
사실
12.5초 세션이 받아 간 파일들이 흥미롭습니다. 전부 hxxp://5[.]182[.]210[.]174 한 곳에서 왔습니다. 그중 파일 이름이 /ok 인 것 하나가 지문 세 개로 나뉘어 있습니다.
여기서 **지문(sha256)**을 풀고 가겠습니다. 파일 전체를 계산해서 뽑아낸 64자리 값입니다. 파일 안의 글자 하나만 달라져도 값이 통째로 바뀝니다. 그래서 두 파일이 같은지 다른지를 이 값으로 판정합니다.
사실
세 파일은 주소가 같고, 크기도 정확히 1,608바이트로 같고, 파일 종류도 같습니다. A4 반 장 정도 되는 분량의 셸 스크립트입니다. 그런데 지문만 94d15544… · f98ba385… · 2b40a245… 세 개로 갈립니다.
추정 유포하는 쪽이 요청이 올 때마다 내용을 조금씩 바꿔서 내보내고 있다는 뜻으로 읽습니다. 그렇다면 지문을 적어 차단 목록에 넣는 방식은 이 파일에 대해서는 한 번도 유효했던 적이 없습니다. 어제 적은 값이 오늘 안 맞는 게 아니라, 적는 순간 이미 다음 것이 다른 값입니다.
사실 다만 우리 데이터에 파일 내용이 들어 있지 않습니다. 무엇이 달랐는지는 확인할 수 없습니다.
CPU를 가리지 않습니다
사실 같은 주소에서 내려온 나머지 네 개는 성격이 다릅니다. 전부 ELF 32비트 실행파일입니다. ELF는 리눅스에서 바로 실행되는 프로그램 파일 형식입니다.
사실 네 개가 서로 다른 CPU 계열용입니다. PowerPC 50,092바이트 · Intel 80386 45,860 · MIPS-I 68,632 · ARM EABI4 62,600. 전부 statically linked stripped입니다. 쉽게 말해 밖에서 빌려 쓰는 부품 없이 혼자 돌아가게 만들어 놓고, 사람이 읽을 만한 이름표는 다 지운 상태라는 뜻입니다.
사실 네 개를 다 합쳐도 약 222KB입니다. 스마트폰 사진 한 장보다 작습니다.
추정 CPU 종류별로 미리 빌드를 준비해 뒀다는 것은, 상대를 가리지 않겠다는 뜻입니다. 서버든 공유기든 네트워크 카메라든 셋톱박스든, 로그인만 뚫리면 그 기계에 맞는 것 하나를 골라 넣으면 됩니다.
받아 적을 값들
값을 누르면 복사됩니다 — 읽으라고 있는 게 아니라 차단 목록에 넣으라고 있는 값입니다. 주소는 일부러 망가뜨려 적었습니다(hxxp://, [.]). 그대로 복사해 붙여 넣어도 접속되지 않습니다.
94d15544a29933b8841be37e269048fd4c6b72fb942c6373c385b9137f6d5440Bourne-Again 셸 스크립트, 1,608바이트, 관측 2회. 유포지 hxxp://5[.]182[.]210[.]174/ok, ATK-10149Cf98ba385f258230244b01dcadaba771ed1808eabbd23e3244dc12ddc03977d73위와 같은 URL·같은 1,608바이트·같은 file_kind 인데 해시가 다르다2b40a245a557851d0475c02692d8ee406c980c2cb63c7b38edcad92994805eeb같은 URL·크기의 세 번째 해시hxxp://5[.]182[.]210[.]174/ok위 세 해시가 놓여 있던 자리. 한 자리에서 해시가 셋으로 갈렸다9d44d4d051f6aa3fbc95fab0aae818347a602d655fa7f1fba6267e728d7ff2d3ELF 32-bit MSB, PowerPC 또는 cisco 4500, statically linked stripped, 50,092바이트. hxxp://5[.]182[.]210[.]174/6fa74c9c719ba3b1cd4a8cf820c5eaea04aae7d0188da53e75f18f9c04c1fbbd3cc97eELF 32-bit LSB, Intel 80386, statically linked stripped, 45,860바이트. hxxp://5[.]182[.]210[.]174/2b63d8a75a98641037e42abb4c543d90e81dafdae3b27e90972b705a2e9242a5bee123ELF 32-bit LSB, MIPS MIPS-I, statically linked stripped, 68,632바이트. hxxp://5[.]182[.]210[.]174/c7d8c83b2f2f02077aee3efe6dcca1bb84afc59af14fff78d1b6dd18aed0c24e08a313ELF 32-bit LSB, ARM EABI4, statically linked stripped, 62,600바이트. hxxp://5[.]182[.]210[.]174/0d14efhxxp://185[.]93[.]89[.]72/wget306바이트 POSIX 셸 스크립트가 놓여 있던 자리. 서로 다른 별칭 8곳이 같은 파일을 받아 갔다a6296a79f44e21b76604d2d2bbf795d2cf380f70e39d45fbf166707ff3b4a6a4위 파일. delivered_by 는 ATK-4E0B71·324A8A·491648·19974F·7B0C34·723A13·0D632F·7EDE47a8460f446be540410004b1a8db4083773fa46f7fe76fa84219c93daa1669f8f2389바이트 OpenSSH RSA 공개키. URL 없이 세션 안에서 직접 기록됐다. 별칭 12곳, 총 14회01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b1바이트 빈 파일, 12회. 완결성 1위 세션(ATK-F5F4F4)이 받아 간 11건이 여기 포함된다4af5a5c98ad132095c6fbe7b02c242153a190a01cc321e50a916a0ca46fbaa629바이트 ASCII 텍스트, 7회. URL 미기록. ATK-BECAD3추정
같은 표 안에서도 값의 수명이 다릅니다. 185[.]93[.]89[.]72의 파일은 지문 하나로 8곳이 걸립니다. 적어 두면 여러 출발지를 한 번에 잡습니다. 반대로 5[.]182[.]210[.]174/ok는 한 자리에서 지문이 셋으로 갈렸습니다. 같은 목록에 나란히 적히는 값인데, 하나는 그물이고 하나는 이미 찢어진 그물입니다.
여기가 이날의 뒤집힌 지점입니다
사실 SSH로 들어오는 접속은 프로그램마다 조금씩 다른 인사말을 씁니다. 그 인사말을 요약한 값을 **클라이언트 지문(hassh)**이라고 합니다. 어떤 프로그램으로 접속했는지를 가리키는 값입니다.
사실 우리가 누적으로 들고 있는 지문 묶음은 45개입니다. 8/17 33개 → 8/18 36개 → 8/19·8/20 37개 → 8/25 42개 → 이날 45개로, 하루 만에 3개 늘었습니다.
사실
이날 가장 큰 묶음은 acaa53e0a7d7ac7d1255103f37901306(SSH-2.0-OpenSSH_7.4)입니다. 하루에만 IP 169곳을 묶었습니다. 이날 첫 번째 서버에 온 출발지가 373곳이니, 절반에 가까운 곳이 같은 프로그램을 썼습니다. 누적으로는 356곳이고, 8/25의 125곳에서 더 늘었습니다.
사실 그리고 여기가 오늘의 핵심입니다. 이날 잡힌 지문 12종이 예외 없이 파일을 하나도 놓고 가지 않았습니다. 가장 많은 IP를 하나로 묶는 그 도구가, 검체는 0건입니다.
사실
반대로 실제로 검체 10건을 떨어뜨린 12.5초 세션의 지문 16443846…4397(SSH-2.0-Go)은 이날 지문 목록 상위 12개에 들어 있지 않습니다.
추정 가장 시끄러운 도구와 실제로 무언가를 남기는 도구가 서로 다릅니다. 소음의 크기로 위험도를 재면 순서가 통째로 뒤집힙니다. 밤새 울린 경보음은 빈손이었고, 소리 안 난 쪽에서 열 개가 나왔습니다.
사실·경고 다만 선을 하나 그어야 합니다. hassh는 빌드의 지문이지 사람의 지문이 아닙니다. 같은 배포판에 들어 있는 기본 OpenSSH를 쓰는, 서로 아무 상관 없는 사람도 같은 값을 갖습니다. 실제로 이날 12.5초 세션의 지문은 8월 19일 브리프가 다른 별칭(ATK-CA5936)의 지문으로 적어 둔 값과 같습니다. 그래도 같은 사람이라고 말할 수 없습니다. 같은 라이브러리를 쓴 도구라는 뜻일 뿐입니다.
압축을 풀어야만 보이는 주소가 따로 있습니다
사실 검체 중에는 UPX로 압축된 것들이 있습니다. UPX는 실행파일을 작게 줄여 주는 도구인데, 압축된 상태에서는 파일 겉면을 아무리 뒤져도 주소가 하나도 안 나옵니다.
사실
우리가 압축을 풀어서만 얻은 지표가 12건입니다. 전부 31[.]77[.]227[.]121/bins/ 아래의 CPU 종류별 파일명입니다 — parm·parm5·parm6·parm64·parm7·pm68k·pmips·pmpsl·pppc·psh4·pspc·x86_64.
사실
그런데 이날 실제 다운로드 기록에 찍힌 유포지는 5[.]182[.]210[.]174와 185[.]93[.]89[.]72입니다. 압축을 풀어서 나온 그 호스트와 다릅니다.
추정 겉면만 보는 수집으로는 이날 트래픽에서 저 12건을 얻을 방법이 없었습니다. 눈에 보이는 유포지 말고 하나가 더 있다는 뜻입니다.
어떤 비밀번호가 시도됐나
사실 이날 로그인 시도는 5,273회입니다. 하루를 꽉 채워 나누면 약 16초에 한 번꼴로 누군가 아이디와 비밀번호를 넣어 봤습니다. 출발지 373곳으로 나누면 한 곳당 평균 14회입니다.
사실 아래는 그중 서로 다른 IP 3곳 이상에서 관측된 조합만 추린 20종입니다. 한 곳에서만 나온 조합은 실제로 유출된 진짜 계정일 수 있어 값을 싣지 않습니다.
| 아이디 | 비밀번호 | 시도한 출발지 수 |
|---|---|---|
admin |
admin |
23곳 |
root |
root |
10곳 |
345gs5662d34 |
345gs5662d34 |
10곳 |
root |
admin |
9곳 |
root |
123456 |
7곳 |
admin |
admin1234 |
7곳 |
root |
password |
7곳 |
root |
root123 |
7곳 |
admin |
123456 |
6곳 |
support |
support |
5곳 |
root |
pass |
5곳 |
user |
user |
5곳 |
guest |
guest |
5곳 |
root |
P@ssw0rd |
5곳 |
root |
Passw0rd |
5곳 |
root |
qwe123456 |
5곳 |
root |
p@ssw0rd |
5곳 |
pi |
pi |
5곳 |
root |
passw0rd |
5곳 |
root |
qwer@1234 |
5곳 |
사실 이 20종 말고, 공개하지 않은 조합이 204종 더 있습니다. 공개한 것보다 10배 많습니다. 개수만 적고 값은 쓰지 않습니다.
추정
표에서 하나가 눈에 걸립니다. 345gs5662d34는 사전에 있는 단어가 아닙니다. 아이디와 비밀번호가 똑같습니다. 그런데 이게 서로 다른 IP 10곳에서 정확히 10회 나왔습니다. 한 곳당 딱 한 번씩입니다. 뚫으려고 매달린 형태가 아니라, 이 문자열이 통하는지 한 번만 찔러 보고 지나가는 형태로 읽습니다.
사실
그리고 P@ssw0rd·Passw0rd·p@ssw0rd·passw0rd가 표에 나란히 있습니다. 대문자와 특수문자를 섞어 놓은 조합인데, 이미 목록에 들어가 있습니다.
국제 분류표에 대응시키면
공격자가 쓴 수법에는 전 세계가 같이 쓰는 번호가 붙어 있습니다. MITRE ATT&CK라는 목록입니다. 아래에서 ID를 누르면 원문 설명으로 갑니다 — 우리 말을 믿지 말고 직접 확인해 보시라고 붙여 둡니다.
- T1110.001Brute Force: Password Guessing — login_attempts 5,273 / 고유 IP 373추정
- T1078.001Valid Accounts: Default Accounts — admin/admin(23 IP), root/root(10 IP) 등 인용 가능한 조합 20종추정
- T1082System Information Discovery — '정찰 — 시스템' 2,391건추정
- T1105Ingress Tool Transfer — '파일 다운로드' 46건, downloads 배열 11종추정
- T1222.002File and Directory Permissions Modification: Linux — '실행 권한 부여' 182건추정
- T1098.004Account Manipulation: SSH Authorized Keys — '지속성 — SSH 키 심기' 17건추정
- T1053.003Scheduled Task/Job: Cron — '지속성 — cron' 1건추정
- T1070Indicator Removal — '흔적 삭제' 18건추정
- T1562Impair Defenses — '방어 무력화' 1건추정
- T1046Network Service Discovery — 센서 02 에서 5개 서비스 포트에 253곳이 접촉. 서비스 접촉 사실만으로 매핑한 것이며 스캔 도구를 특정한 것이 아니다추정
- T1021.005 / T1021.001Remote Services: VNC / RDP — 서비스 종류로만 매핑했다. 저상호작용 센서라 원격 서비스가 실제로 사용된 사실은 관측되지 않았다추정
사실 표에서 숫자가 가장 작은 두 줄을 보세요. cron 1건, 방어 무력화 1건입니다. 5,488세션이 있던 날에 각각 딱 한 번씩입니다. 그런데 그 한 번씩이 각각 어느 세션에서 나왔는지 우리는 압니다 — cron은 04:04 세션, 방어 무력화는 07:26 세션입니다.
추정 열한 줄이 전부 ‘추정’ 배지입니다. 우리가 본 것은 명령의 의도 분류와 개수이지, 공격자가 스스로 밝힌 목적이 아니기 때문입니다. 특히 맨 아래 두 줄은 접촉 사실만으로 붙인 것이라 더 조심해서 읽어야 합니다.
어제 하루 전체
사실 센서 01(고상호작용) 기준입니다. 센서 02 수치는 세션 단위가 달라 더하지 않았습니다.
| 항목 | 2026-08-26 | 비고 |
|---|---|---|
| 세션 | 5,488건 | 직전 최고 3,553건(8/22) → +54%, 열흘 범위 최고 |
| 명령 | 14,344개 | 직전 최고 7,574개(8/22) → +89%, 열흘 범위 최고. 약 6초에 한 번 |
| 고유 출발지 | 373곳 | 직전 최고 361곳(8/25) → +12곳, 열흘 범위 최고 |
| 로그인 시도 | 5,273회 | 직전 최고 3,324회(8/22). 약 16초에 한 번 |
| 포트 2222 (SSH) | 2,849세션 | |
| 포트 2223 (텔넷) | 2,639세션 | SSH와 거의 반반 |
| TTY 녹화 | 4,797건 | 실제 보관된 것은 183건 |
| 검체 | 78건 | |
| 명령 의도 합계 | 2,703회 | 정찰(시스템) 2,391 · 실행 권한 182 · 다운로드 후 실행 46 · 파일 다운로드 46 · 흔적 삭제 18 · SSH 키 심기 17 · 정찰(네트워크) 1 · cron 1 · 방어 무력화 1 |
사실 ’최고치’는 8/16~8/25 열흘 범위 안에서의 최고치라는 뜻입니다. 그 이전 기록과는 대조하지 않았습니다.
사실 두 번째 서버(센서 02)는 이렇습니다. 다시 말씀드리지만 이쪽은 저상호작용이라 로그인 성공·명령·자격증명이 애초에 존재하지 않습니다.
| 서비스 | 포트 | 접촉 | 고유 출발지 | 한 곳당 평균 |
|---|---|---|---|---|
| VNC (화면 공유) | 5900 | 40,791건 | 40곳 | 약 1,020회 |
| RDP (원격 데스크톱) | 3389 | 1,221건 | 139곳 | 약 8.8회 |
| SMB (파일 공유) | 445 | 240건 | 43곳 | — |
| LDAP (디렉터리) | 389 | 94건 | 13곳 | — |
| MSSQL (데이터베이스) | 1433 | 61건 | 7곳 | — |
| ADB (안드로이드 디버그) | — | 세션 86건 | 기록 없음 | — |
| 합계 | 42,493건 | 253곳 | 약 2초에 한 번 |
사실 두 센서를 합친 고유 출발지는 최대 626곳입니다. 두 서버를 모두 건드린 곳이 몇 곳인지 알 수 없어서, 겹침이 하나도 없다고 가정한 상한입니다.
사실 표 안에 계산이 안 되는 칸이 하나 있습니다. VNC 접촉 상위 8곳의 합(7,623 / 7,599 / 5,181 / 5,178 / 5,118 / 3,354 / 3,353 / 3,334 = 40,740)이 VNC 총량 40,791에 51 차이로 붙습니다. 다만 이 상위 목록에는 서비스 구분이 없어서, 이 8곳이 그 40곳이라고 단정할 수 없습니다.
사실
그리고 마스킹된 159.203.x.x가 서로 다른 두 별칭(ATK-B954FC 5,178건, ATK-D9A63B 3,334건)으로 등장합니다. 앞 두 자리가 같을 뿐 서로 다른 출발지이고, 별칭도 신원이 아닙니다. 같은 조직으로 읽어서는 안 됩니다.
그래서 뭘 해야 하나
추정 브리프가 정리한 ‘이 통제가 없었다면’ 여섯 가지를, 이날 데이터가 세게 받쳐 주는 순서로 놓습니다.
1. 기본 계정과 약한 비밀번호부터 없앤다 (가능성: 높음) — admin/admin이 23곳에서 178회, root/root가 10곳에서 76회, root/admin이 9곳에서 149회 시도됐습니다. 이날 완결성 상위 5개 세션이 예외 없이 로그인에 성공했습니다. 하나만 살아 있으면 그날 안에 열립니다. 뚫린 다음은 이날 관측된 그대로입니다 — 정찰(2,391) → 다운로드(46) → 실행 권한(182) → 실행(46). 짧게는 12.5초에 여기까지 갔습니다.
2. 비밀번호 로그인을 끄고 키 로그인만 남긴다 (가능성: 높음) — 로그인 성공 이후 남의 공개키를 심는 행동이 17건 관측됐습니다. 여기서 SSH 키 심기를 풀고 가겠습니다. 리눅스 서버에는 authorized_keys(허용된 열쇠 목록)라는 파일이 있습니다. 여기 공개키 한 줄이 적혀 있으면, 그 짝을 가진 사람은 비밀번호를 묻지 않고 들어옵니다. 그래서 나중에 비밀번호를 바꿔도 그 줄은 그대로 살아 있습니다. ’비밀번호 변경 완료’가 사고 종결 근거가 되지 못합니다.
3. 관리 포트를 인터넷에 그대로 열어 두지 않는다 (가능성: 높음) — 이날 하루에 373곳이 두 포트를 두드렸고, 옆 서버에서는 253곳이 다섯 서비스에 붙었습니다. 표적이라서 오는 게 아니라 열려 있어서 옵니다. 공지 없이 상시 후보군에 들어갑니다.
4. 같은 곳이 계속 두드리면 자동으로 막는다 (가능성: 높음) — 화면 공유 접촉 40,791건이 40곳에서 나왔습니다. 뒤집어 보면 좋은 소식이기도 합니다. 40곳만 막아도 그날 접촉의 96%가 사라집니다. 막아야 할 대상이 생각보다 적습니다.
5. 서버에서 밖으로 나가는 연결을 제한한다 (가능성: 높음) — 파일 다운로드 46건과 다운로드 후 실행 46건이 여기서 끊깁니다. CPU 종류별 빌드가 준비돼 있다는 건 상대를 안 가린다는 뜻입니다. 로그인이 뚫린 뒤에 남는 마지막 관문이 이겁니다.
6. 로그를 서버 밖에 따로 남긴다 (가능성: 중간) — 흔적을 지우려는 의도가 18건, 방어를 무력화하려는 의도가 1건 관측됐습니다. 04:04 세션은 정찰 → 키 심기 → cron → 흔적 삭제로 46초 만에 끝까지 갔습니다. 로그가 서버 안에만 있었다면 그중 일부는 성공했을 겁니다. 18건은 5,488세션에 비하면 소수라 ’중간’으로 뒀습니다.
전에도 있었던 일
추정
Mirai 봇넷 (2016년). 이날 인용 가능한 자격증명 상위가 admin/admin·root/root·support/support·user/user·guest/guest·pi/pi 같은 기본값이었고(각 5곳 이상), 같은 날 PowerPC·MIPS·ARM·i386용 ELF가 한 유포지에서 함께 내려왔습니다. 기본 계정으로 들어가 장비 CPU에 맞는 실행파일을 골라 넣는 구조가 같습니다. 이날 관측을 특정 악성코드 계열로 단정하는 것은 아니며, 패턴이 공개된 선례와 닮았다는 뜻입니다. (근거: 미국 US-CERT 권고 TA16-288A 및 공개된 소스코드·다수 벤더 분석 보고서)
추정
WannaCry (2017년). 이날 두 번째 서버의 파일 공유 협상 240건에서 제안된 방언이 NT LM 0.12·LANMAN1.0·PC NETWORK PROGRAM 1.0 등 전부 SMB1 계열이었고 SMB 2.???는 2건뿐이었습니다. 9년이 지났는데도 인터넷에서 말을 거는 어휘가 여전히 SMB1에 맞춰져 있다는 사실만 가리킵니다. 이날 관측에서 MS17-010 취약점 공격이 확인된 것은 아닙니다 — 협상 단계까지만 관측됐습니다. (근거: 벤더 보안 게시판 MS17-010, CVE-2017-0144, CISA KEV 등재 항목)
추정 RealVNC 인증 우회 (2006년). 이날 화면 공유 접촉의 99.96%가 RFC 6143의 최하위 버전을 제안했습니다. 버전과 인증 방식을 협상하는 그 단계 자체가 과거 공개 취약점의 무대였다는 배경 맥락으로만 씁니다. 이날 관측은 접촉과 버전 제안까지이며, 인증 우회 시도가 확인된 것이 아닙니다. (근거: CVE-2006-2369 및 벤더 어드바이저리)
우리가 모르는 것
이 글에서 가장 중요한 부분입니다. 위에서 적은 것보다 적지 못한 것이 더 많습니다.
- 두 번째 서버의 ADB 상세가 통째로 없습니다. 세션 86건이 있었다는 것만 총계 계산으로 확인됩니다(5개 서비스 합 42,407 + 86 = 42,493). 고유 IP 수도, 무엇이 투입됐는지도 데이터에 없습니다. ’이날 ADB 공격이 없었다’로 읽으면 안 됩니다. 하필 두 번째 서버에서 유일하게 투입 내용이 남을 수 있는 채널이 ADB라, 이 공백은 다음 수집에서 확인이 필요합니다.
- 두 번째 서버의 검체 목록이 빈 배열이고 확보 검체는 0입니다. 실제로 아무 파일도 투입되지 않은 것인지, 수집기가 잡지 못한 것인지 구분할 수 없습니다.
- 한 출발지가 여러 서비스를 훑었는지 여부는 산출할 수 없습니다. 상위 출발지 목록에 서비스 구분이 없고, 서비스별 IP 목록도 없습니다. 서비스별 고유 IP 합(40+139+43+13+7=242)이 전체 253보다 작다는 부등식에서 **‘최소 11곳은 그 다섯 서비스 밖’**이라는 것만 나옵니다. 그래서 이 값은 0이 아니라 **‘값 없음’**으로 뒀습니다.
- 상위 8곳의 합 40,740이 VNC 총량 40,791에 가깝지만, 서비스별로 나뉜 값이 아니라 같다고 단정할 수 없습니다.
- VNC 버전 제안 합계 40,769와 VNC 세션 40,791이 22건 어긋납니다. 버전이 기록되지 않은 접촉이 있다는 뜻으로 보이나, 사유는 데이터에 없습니다.
- RDP 쿠키
Administr는 9자에서 끊긴 문자열입니다. 원래 값이 무엇이었는지, 왜 끊겼는지 확인할 수 없습니다. - 첫 번째 서버에서 명령 의도 값들의 합은 2,703인데 전체 명령 수는 14,344입니다. 두 값의 단위가 같은지 알 수 없어, “명령의 몇 %가 정찰이었다” 같은 비율 계산은 하지 않았습니다.
- 12.5초 세션의 다운로드 수는 세션 기록에 10인데, 검체 목록에서 이 별칭에 걸린 항목의 합은 12(해시 7개)입니다. 세션 단위 집계와 일자 단위 집계가 섞여 있을 가능성이 있습니다.
- 그 세션의 지문이 이날 지문 목록 12종에 없습니다. 이 지문으로 묶인 IP 수가 목록 하한(2곳)보다 적었을 가능성이 크지만, 그 목록이 상위 몇 개만 실은 것인지 데이터에 명시돼 있지 않습니다.
/ok파일 세 개가 모두 1,608바이트인데 해시가 다른 이유는 확인할 수 없습니다. 파일 내용이 브리프에 없기 때문입니다. 유포지의 요청별 변조인지 다른 원인인지 미확인입니다.- 참고 지표에 Discord 웹훅 주소가 하나 있는데, 어느 검체·어느 세션에서 나왔는지 데이터가 연결해 주지 않습니다. 이날 관측된 특정 세션의 통신 채널이라고 말할 근거가 없습니다.
- 이날 관측한 유포지는 C-TAS로 신고합니다. 다만 확인된 것은 전송 계층 성공까지이며, KISA 적재 여부는 이 시점에 미확인입니다.
- 배경으로 들고 있는 취약점 통계(추적 CVE 6,579건, CISA KEV 등재 387건, 랜섬웨어 연계 98건)는 이날 두 서버의 관측과 연결된 바가 없습니다. 이날 어디에서도 특정 취약점을 참조한 공격은 확인되지 않았습니다.
- 비교 대상은 8/16~8/25 열흘 치뿐입니다. 그 이전과는 대조하지 않았으므로 ’최고치’는 이 범위 안에서만 유효합니다. 그리고 그 열흘은 전부 첫 번째 서버 단독이라 두 번째 서버에는 비교할 과거값이 아예 없습니다 — 이날 42,493건이 평소보다 많은지 적은지 판단할 기준선이 없습니다.
ATK-XXXXXX는 브리프 사이에서 같은 출발지를 가리키기 위한 식별자입니다. 신원이 아니고, 마스킹된 IP를 되살리는 데 쓸 수도 없습니다.
그리고 아래는 애초에 확인할 수단이 없는 것들입니다. 추정하지 않습니다.
- ASN·ISP — 관련 데이터베이스가 없습니다. 유포지
5[.]182[.]210[.]174·185[.]93[.]89[.]72·31[.]77[.]227[.]121이 어느 사업자에 있는지 말할 수 없습니다. 이 글은 어떤 출발지의 통신사도 호스팅 사업자도 언급하지 않습니다. - 지리정보 — 동일하게 없습니다. 그리고 IP 지리정보는 애초에 귀속 근거가 되지 않습니다. 어떤 국가·기업·개인도 이날의 공격자로 지목하지 않습니다.
- VPN·Tor·클라우드 여부 — 판별 수단이 없습니다. 626곳 중 어느 것이 경유지이고 어느 것이 원점인지 구분할 수 없습니다.
- VirusTotal — 연동돼 있지 않습니다. 이날 해시 11종에 대한 다중 엔진 판정 결과가 이 글에는 없습니다. 검체 분류는 MalwareBazaar 태그를 씁니다.
- User-Agent — 두 관측면 다 HTTP가 아닙니다. 첫 번째는 SSH·텔넷, 두 번째는 SMB·RDP·VNC·MSSQL·LDAP·ADB입니다.
- CVE 연결 — SSH·텔넷 공격은 대부분 취약점을 참조하지 않습니다. 두 번째 서버도 협상 단계라 마찬가지입니다. 이날 관측을 특정 CVE와 연결한 서술은 이 글에 하나도 없습니다.
추정 정리하면 이날은 이렇습니다. 가장 큰 숫자를 만든 문은 안에서 아무 일도 일어날 수 없는 문이었습니다. 가장 많은 IP를 하나로 묶은 도구는 파일을 한 개도 놓고 가지 않았습니다. 정작 열 개를 놓고 간 쪽은 12.5초 동안 조용히 다녀갔고, 그 도구의 지문은 이날 목록 상위에 이름도 못 올렸습니다.
경보음이 크게 울린 밤에 차가 멀쩡한 건 다행입니다. 문제는 소리가 안 난 쪽을 아무도 안 봤다는 겁니다. 대시보드에서 가장 큰 막대가 가장 급한 일이라는 보장은 없습니다. 이날 데이터는 그 반대였습니다.
관측일은 2026년 8월 26일(UTC) 하루입니다. 출발지 IP는 브리프의 마스킹 형태(45.198.x.x)를 그대로 옮겼고 복원하지 않았습니다. 유포 주소는 접속되지 않도록 변형해 적었습니다(hxxp://, [.]). 자격증명은 서로 다른 IP 3곳 이상에서 관측된 조합 20종만 인용했고, 공개하지 않은 조합 204종은 개수만 밝히고 값을 싣지 않았습니다. ASN·국적·행위자 귀속은 확인 수단이 없어 추정하지 않습니다.
