상자 네 개가 들어왔는데, 송장에 보낸 사람이 없었다
8월 28일, 이틀 동안 아무것도 안 잡히던 서버에서 파일 네 개가 한꺼번에 나왔습니다. 합쳐서 773,937바이트, 보낸 곳은 전부 같은 한 곳이었습니다. 그런데 이 파일들에는 '어디서 왔는가'를 적는 칸이 아예 없어서, 차단 목록에 올릴 주소도 신고할 유포지도 남지 않았습니다.

집에 왔더니 문 앞에 상자가 하나 놓여 있습니다. 시킨 기억이 없습니다.
그래도 보통은 금방 풀립니다. 송장을 보면 되니까요. 보낸 사람 칸에 가게 이름이 있고, 전화번호가 있고, 주문번호가 있습니다. 잘못 왔으면 그리로 전화해서 가져가라고 하면 됩니다. 계속 이상한 게 오면 그 가게를 신고할 수도 있습니다.
그런데 송장을 봤는데 보낸 사람 칸이 아예 없다면 어떻게 될까요. 인쇄가 지워진 게 아니라, 애초에 그 칸이 종이에 없습니다. 받는 사람만 적혀 있습니다.
이때 할 수 있는 일이 확 줄어듭니다. 반품도 안 되고, 어디에 항의할지도 모르고, “이 가게에서 오는 건 다 막아 주세요”라고 경비실에 말할 수도 없습니다. 남는 건 상자 그 자체뿐입니다. 무게를 재고, 사진을 찍어 두는 것 말고는요.
2026년 8월 28일 하루, 우리 서버에 그런 상자가 네 개 들어왔습니다.
먼저 낯선 말 하나만 풀고 가겠습니다. 허니팟은 일부러 허술하게 만들어 인터넷에 내놓은 미끼 서버입니다. 진짜 업무는 하지 않습니다. 누가 들어와서 무엇을 하는지 통째로 기록하려고 열어 둔 기계입니다. 아래 숫자는 전부 거기에 찍힌 것입니다.
우리 서버는 두 대이고, 성격이 정반대입니다
사실 첫 번째(센서 01)는 고상호작용 서버입니다. 실제로 로그인이 되고, 들어온 사람이 명령을 칠 수 있고, 그 명령이 전부 기록됩니다. 두 번째(센서 02)는 저상호작용 서버입니다. 문 앞에서 인사만 받고 절대 열어 주지 않습니다.
사실 그래서 두 번째 서버에는 로그인 성공도, 명령도, 자격증명도 애초에 존재하지 않습니다. 거기서 셀 수 있는 건 “몇 번 두드렸는가”와 “상대가 무슨 규격으로 말을 걸었는가”뿐입니다. 그리고 아주 가끔, 오늘처럼 물건이 남습니다.
이 글의 상자 네 개는 전부 두 번째 서버 이야기입니다.
이틀 동안 비어 있던 칸이 채워졌습니다
사실 이 서버에서 확보된 검체는 8월 26일 0건, 8월 27일 0건이었습니다. 8월 28일은 4건입니다.
사실 이건 그냥 숫자가 오른 게 아닙니다. 8월 26일 브리프에 우리는 이렇게 적어 뒀습니다 — “이 채널은 투입 내용이 남을 수 있는 유일한 통로인데 상세가 비어 있다. 다음 수집에서 확인이 필요하다.” 8월 27일에도 같은 문장을 또 적었습니다. 사흘째 되는 날 처음으로 그 칸이 채워졌습니다.
사실 네 개의 크기는 이렇습니다. 46,525바이트 · 153,208바이트 · 239,388바이트 · 334,816바이트. 대략 45KB부터 327KB까지입니다. 다 합치면 773,937바이트입니다.
사실
그리고 네 개 전부 같은 한 곳에서 왔습니다. 별칭 ATK-F4738A 하나입니다.
송장에 보낸 사람 칸이 없습니다
사실 이 네 건에 대해 우리 데이터가 들고 있는 건 두 가지뿐입니다. sha256(파일 지문)과 크기입니다.
여기서 지문이라는 말을 풀고 가겠습니다. 파일 전체를 계산해서 뽑아낸 64자리 값입니다. 파일 안의 글자 하나만 달라져도 값이 통째로 바뀝니다. 상자에 붙인 봉인 스티커 같은 것이라, 두 상자가 같은 물건인지 아닌지를 이걸로 판정합니다.
사실 그리고 URL 칸이 없습니다. 값이 비어 있는 게 아니라, 데이터에 그 항목 자체가 존재하지 않습니다. 어디서 내려받은 건지, 어느 주소에 놓여 있던 건지가 기록에 없습니다.
추정 왜 없는지는 이렇게 읽습니다. 서버가 주문해서 받아온 파일이면 주문한 주소가 남습니다. 그런데 상대가 그냥 밀어 넣은 파일이면 주문 자체가 없었으니 주소가 애초에 생기지 않습니다. 송장에 보낸 사람 칸이 없는 게 아니라, 송장을 쓸 일이 없었던 겁니다.
추정 이게 실무에서 뜻하는 건 하나입니다. 차단 목록에 올릴 주소가 없고, 신고할 유포지가 없습니다. 방화벽에 적어 넣을 칸이 비어 있습니다. 남는 건 상자의 봉인 스티커, 즉 sha256 네 개뿐입니다.
사실
같은 문제가 오늘 다른 자리에서도 걸립니다. 우리가 압축을 풀어서만 얻어낸 지표 12건이 있는데(31[.]77[.]227[.]121/bins/ 아래의 파일명들), 이 파일들도 겉면만 봐서는 주소가 하나도 안 보입니다. 압축을 벗겨야 나옵니다. 오늘 상자 네 개는 벗길 겉면조차 없는 쪽입니다.
반대쪽 서버는 송장이 남았습니다
같은 날 첫 번째 서버에서 내려온 파일들은 성격이 다릅니다. 데이터를 먼저 놓고 설명하겠습니다.
사실 8월 28일, 첫 번째 서버에서 확보된 검체는 8종입니다. 그중 두 건에는 주소가 남아 있습니다.
hxxp://185[.]93[.]89[.]72/wget— 306바이트 셸 스크립트가 놓여 있던 자리hxxp://5[.]182[.]210[.]174/ok— 1,608바이트 bash 스크립트가 놓여 있던 자리
사실
주소를 일부러 망가뜨려 적었습니다(hxxp://, [.]). 그대로 복사해 붙여 넣어도 접속되지 않습니다.
사실 오늘 신고 대상이 되는 유포지는 이 두 곳입니다. 두 번째 서버의 상자 네 개에서는 신고할 지표가 하나도 나오지 않았습니다.
추정 이 차이가 오늘의 뼈대입니다. 한쪽은 서버가 밖으로 나가서 받아왔고, 그래서 “어느 가게에서 왔는지”가 남았습니다. 다른 쪽은 상대가 들고 와서 놓고 갔고, 그래서 아무것도 안 남았습니다. 같은 날, 같은 조직의 두 서버에서 정반대 모양이 나왔습니다.
무게를 재 보면 더 이상합니다
사실 첫 번째 서버의 검체 8종을 전부 합치면 2,783바이트입니다. 짧은 문자 메시지 열몇 통 정도 되는 양입니다.
사실 두 번째 서버의 검체는 4종에 773,937바이트입니다. 약 278배 큽니다.
사실 숫자를 하나 더 붙이면 감이 옵니다. 네 상자 중 가장 작은 것 하나(46,525바이트)만으로도, 첫 번째 서버 하루치 여덟 개를 다 합친 것의 약 16.7배입니다.
사실 그리고 첫 번째 서버에서는 ELF 실행파일이 0건입니다. ELF는 리눅스에서 바로 실행되는 프로그램 파일 형식입니다. 8월 27일에 이어 이틀 연속 0건입니다.
추정 백신이 잡을 만한 ’프로그램’은 한쪽에서 이틀째 안 내려오는데, 반대쪽에서는 사흘 만에 처음으로 덩치 큰 상자 네 개가 들어왔습니다. 두 관측면을 따로 보면 각각 “조용한 날”과 “이상한 날”인데, 붙여 놓으면 무게중심이 옮겨 간 그림이 됩니다.
사실 다만 여기서 딱 멈춰야 합니다. 이 네 개가 무슨 파일인지 우리 데이터에는 없습니다. 종류를 적는 칸도 없습니다. 실행파일인지, 압축 파일인지, 사진인지 알 수 없습니다. “45KB에서 327KB니까 실행파일이겠지”라고 쓰지 않습니다.
어느 문으로 들어왔을까
사실 두 번째 서버가 어제 받은 접촉은 47,815건입니다. 하루를 꽉 채워 나누면 약 1.8초에 한 번입니다. 눈 두 번 깜빡일 때마다 어딘가에서 이 기계에 말을 걸었습니다. 서로 다른 출발지는 248곳입니다.
사실 어제(30,804건)보다 55.2% 늘었고, 8월 26일의 42,493건도 넘었습니다. 사흘 중 가장 붐빈 날입니다.
사실 그 47,815건이 어느 문 앞에 몰렸는지 보면 이렇습니다.
| 문 | 접촉 | 고유 출발지 | 비중 |
|---|---|---|---|
| 화면 공유 (VNC 5900) | 45,113건 | 50곳 | 94.35% |
| 원격 데스크톱 (RDP 3389) | 2,114건 | 120곳 | 4.42% |
| 데이터베이스 (MSSQL 1433) | 200건 | 13곳 | 0.42% |
| 파일 공유 (SMB 445) | 175건 | 37곳 | 0.37% |
| 주소록 (LDAP 389) | 126건 | 9곳 | 0.26% |
| 개발자용 디버그 통로 (ADB) | 세션 87건 | 기록 없음 | 0.18% |
사실 표의 맨 아랫줄이 오늘의 자리입니다. ADB는 안드로이드 기기를 컴퓨터에 연결해 개발자가 안을 들여다보고 파일을 넣을 때 쓰는 통로입니다. 원래 케이블로 연결해 쓰라고 만든 것인데, 인터넷 쪽으로 열려 있으면 비밀번호를 묻지 않습니다. 87세션이면 하루에 약 16분에 한 번꼴입니다.
추정 저상호작용 서버에서 파일 투입이 성립할 수 있는 통로는 ADB뿐입니다. 그래서 상자 네 개를 이쪽으로 읽습니다. 데이터가 이걸 명시해 주지는 않습니다. 이 판단은 말미 ’우리가 모르는 것’에서 다시 짚겠습니다.
사실 ADB 세션 수의 사흘 추이는 8/26 86 → 8/27 26 → 8/28 87입니다. 그런데 검체는 0 → 0 → 4입니다. 세션 수가 8월 26일과 거의 같은데 결과만 다릅니다.
상자를 놓고 간 곳은 명단에 없었습니다
사실 두 번째 서버에서 가장 많이 두드린 아홉 곳은 이렇습니다.
| 별칭 | 마스킹 IP | 접촉 |
|---|---|---|
| ATK-943F0E | 129.212.x.x | 5,305건 |
| ATK-43D1F7 | 143.198.x.x | 5,301건 |
| ATK-554563 | 167.99.x.x | 5,269건 |
| ATK-28B422 | 206.81.x.x | 5,073건 |
| ATK-B954FC | 159.203.x.x | 5,065건 |
| ATK-AE6CC0 | 134.122.x.x | 5,023건 |
| ATK-B24952 | 159.223.x.x | 4,683건 |
| ATK-992AD3 | 68.183.x.x | 4,672건 |
| ATK-D9A63B | 159.203.x.x | 4,644건 |
사실 이 아홉 곳이 합쳐서 45,035건, 전체 접촉의 **94.19%**입니다.
사실
그리고 상자를 놓고 간 ATK-F4738A는 이 명단에도, 그 아래 열두 곳 목록에도 없습니다. 접촉 순위에 이름을 올리지 못한 곳입니다.
사실 명단에 없으니 마스킹 IP도, 몇 번 접촉했는지도 우리는 모릅니다. “순위에 없다”까지가 사실이고 그 이상은 말할 수 없습니다.
추정 택배로 다시 옮기면 이렇습니다. 밤새 초인종을 5,000번씩 누른 아홉 집은 경비실 기록에 또렷하게 남았습니다. 상자를 놓고 간 사람은 기록에 없습니다. 위험한 순서대로 정리한 명단이 아니라, 시끄러운 순서대로 정리한 명단이었던 겁니다.
하루를 시간 순서로
시간 순서로 늘어놓으면 이렇게 됩니다. 여기부터는 첫 번째 서버(고상호작용) 기록이 대부분입니다. 세 번째와 네 번째 줄의 걸린 시간을 눈여겨보세요 — 분이 아니라 초 단위입니다.
- 사실 ATK-D62131(220.133.x.x) 텔넷 로그인 성공. 명령 31개, 다운로드 1건. intents 는 파일 다운로드 → 실행 권한 부여 → 다운로드 후 실행 3종이고 정찰·지속성은 없다. 텔넷이라 SSH 지문은 존재하지 않는다(fingerprint 빈 문자열). completeness 16
- 사실 ATK-4F095E(47.82.x.x) 텔넷 로그인 성공. 명령 17개, intents 5종(정찰 — 시스템 · 파일 다운로드 · 실행 권한 부여 · 다운로드 후 실행 · 지속성 — SSH 키 심기). 그런데 download_count 는 0 이다. completeness 17
- 사실 ATK-CA5936(130.12.x.x) SSH 로그인 성공. 명령은 1개인데 intents 5종이 붙었고 다운로드 2건. 클라이언트 SSH-2.0-Go, 지문 16443846…4397. completeness 19 로 오늘 최고
- 사실 같은 별칭 ATK-CA5936 이 83분 뒤 재접속. 명령 1개·intents 5종·다운로드 2건·지문 동일로 09:20 세션과 구성이 완전히 같다
- 사실 ATK-AE28B3(187.52.x.x) SSH 로그인 성공. 명령 18개, intents 4종 — 정찰 — 시스템 · 지속성 — SSH 키 심기 · 지속성 — cron · 흔적 삭제. 오늘 유일한 cron 세션이다(하루 총계도 1회). 다운로드 1건. 클라이언트 SSH-2.0-libssh_0.11.1, 지문 03a80b21…e6fb. completeness 18
- 사실 검체 4건 확보. 크기 46,525 · 239,388 · 334,816 · 153,208바이트, 합 773,937바이트. delivered_by 는 네 건 모두 ATK-F4738A 한 곳이다. 이 센서의 어떤 항목에도 타임스탬프가 없어 하루 중 언제인지 말할 수 없다
- 사실 브리프 생성. 센서 01 하루 집계는 세션 3,303 · 고유 출발지 202 · 로그인 시도 3,051 · 명령 10,940 · TTY 녹화 2,836 이고, 센서 02 는 접촉 47,815 · 고유 출발지 248 이다
사실 표에서 가장 눈에 띄는 건 세 번째·네 번째 줄입니다. 4.8초와 3.7초짜리 세션 두 건이고, 명령 개수·의도 종류·다운로드 수·접속 프로그램 지문이 하나도 안 틀리고 같습니다. 83분 간격입니다.
추정 같은 도구가 두 번 돌아간 모양으로 읽습니다. 여기까지가 말할 수 있는 전부입니다. 같은 사람이라거나 같은 조직이라고는 말할 수 없습니다.
사실 그리고 여섯 번째 줄이 오늘의 주인공인데, 시각 칸이 비어 있습니다. 두 번째 서버에는 시간 기록이 아예 없습니다. 상자가 언제 놓였는지 우리는 모릅니다. 송장에 보낸 사람 칸이 없는 것처럼, 여기엔 배달 시각 칸이 없습니다.
그 사이 첫 번째 서버는 방향이 뒤집혔습니다
사실 어제 첫 번째 서버에서 실행된 명령은 10,940개입니다. 8월 27일은 2,313개였습니다. 하루 만에 4.7배가 됐습니다. 하루를 꽉 채워 나누면 약 8초에 한 번씩 명령이 들어온 셈입니다.
사실 그런데 찾아온 곳의 수는 반대로 갔습니다. 서로 다른 출발지가 202곳으로, 8월 27일 442곳에서 54.3% 줄었습니다.
사실 세션 하나당 명령이 8월 27일 0.89개에서 어제 3.31개가 됐습니다.
추정 어제가 “많은 곳이 넓게 훑은 날”이었다면, 이날은 **“적은 곳이 깊게 들어온 날”**입니다.
사실 접속 통로도 하루 만에 뒤집혔습니다. 텔넷 세션이 **2,081건으로 전체의 63.0%**입니다. 8월 27일에는 186건, 7.1%였습니다. 텔넷은 아주 오래된 원격 접속 방식입니다. 인터넷 너머에서 그 기계의 명령창을 직접 두드릴 수 있게 열어 두는 통로인데, 비밀번호가 암호화되지 않고 그대로 흘러갑니다.
사실 그런데 명령이 4.7배로 늘어난 날에, 의도로 분류된 명령은 1,200회(11.0%)뿐입니다. 8월 27일은 2,313개 중 1,970회(85.2%)였습니다. 나머지 9,740개가 왜 분류되지 않았는지 데이터가 설명하지 않습니다. 그래서 이날 ’정찰 995회’를 명령 총계 대비 비율로 해석하지 않았습니다.
사실 분류된 1,200회의 내역은 이렇습니다.
| 의도 | 횟수 |
|---|---|
| 정찰 — 시스템 | 995회 |
| 실행 권한 부여 | 135회 |
| 다운로드 후 실행 | 21회 |
| 파일 다운로드 | 21회 |
| 지속성 — SSH 키 심기 | 15회 |
| 흔적 삭제 | 12회 |
| 지속성 — cron | 1회 |
여기서 두 가지만 풀고 가겠습니다. SSH 키 심기는 리눅스 서버의 authorized_keys(허용된 열쇠 목록)라는 파일에 남의 공개키 한 줄을 적어 두는 행동입니다. 쉽게 말해 비밀번호 없이 들어올 수 있는 열쇠를 현관에 하나 걸어두는 것입니다. 비밀번호를 바꿔도 그 열쇠는 그대로 열립니다. cron은 “몇 시에 이걸 해라”를 서버에 예약해 두는 기능입니다. 걸어 두면 재부팅을 해도 살아남습니다.
사실 ’지속성 — cron’은 어제 딱 1회입니다. 그리고 그 한 건은 13:38의 ATK-AE28B3 세션에서 나왔습니다. 정찰 → 열쇠 걸기 → 예약 걸기 → 흔적 지우기가 27.5초 안에 한 세션에서 이어졌습니다.
사실
그 세션이 쓴 접속 프로그램의 지문은 03a80b21…e6fb(SSH-2.0-libssh_0.11.1)입니다. 어제 상위 11종 지문 목록에 없고, 8월 16일부터 27일까지의 기록에도 이 버전은 나온 적이 없습니다.
추정 다만 선을 하나 긋겠습니다. 이건 빌드의 지문이지 사람의 지문이 아닙니다. 같은 배포판에 들어 있는 기본 클라이언트를 쓰는, 서로 아무 상관 없는 사람도 같은 값을 갖습니다. 게다가 어제 세션의 63%인 텔넷에는 지문이라는 개념 자체가 없습니다.
사실 그리고 ’방어 무력화’는 어제 항목 자체가 없습니다.
어떤 비밀번호가 시도됐나
사실 어제 로그인 시도는 3,051회입니다. 하루를 꽉 채워 나누면 약 28초에 한 번꼴로 누군가 문고리를 돌려 봤습니다. 출발지 202곳으로 나누면 한 곳당 평균 15.1회입니다.
사실 아래는 그중 서로 다른 IP 3곳 이상에서 관측된 조합만 추린 20종입니다. 한 곳에서만 나온 조합은 유출된 진짜 자격증명일 수 있어 값을 싣지 않습니다.
| 아이디 | 비밀번호 | 시도한 출발지 수 |
|---|---|---|
admin |
admin |
15곳 |
345gs5662d34 |
345gs5662d34 |
10곳 |
root |
1234 |
6곳 |
root |
123456 |
5곳 |
root |
12345 |
5곳 |
root |
3245gs5662d34 |
5곳 |
root |
admin |
4곳 |
root |
123 |
4곳 |
root |
54321 |
3곳 |
support |
support |
3곳 |
root |
root |
3곳 |
root |
pass |
3곳 |
user |
user |
3곳 |
admin |
(빈 비밀번호) |
3곳 |
guest |
guest |
3곳 |
nobody |
nobody |
3곳 |
root |
1q2w3e4r |
3곳 |
root |
123456789 |
3곳 |
root |
qwerty123 |
3곳 |
odoo |
odoo |
3곳 |
사실 이 20종 말고, 단일 출처에서만 나온 조합이 862종 더 있습니다. 어제 757종에서 105종 늘었습니다. 개수만 적고 값은 쓰지 않습니다. 공개한 것보다 공개하지 않은 쪽이 43배 많습니다.
추정
표에서 눈여겨볼 건 두 번째 줄입니다. 345gs5662d34는 아무 의미 없어 보이는 문자열이고, 아이디와 비밀번호가 똑같습니다. 이걸 서로 다른 10곳이 정확히 10회, 곳당 한 번씩 쳤습니다. 사람이 하나씩 떠올린 값이 아니라 어딘가 돌아다니는 목록을 그대로 읽고 있다는 뜻으로 읽습니다.
어제 놓고 간 것들
받아 적을 값들입니다. 값을 누르면 복사됩니다 — 읽으라고 있는 게 아니라 차단 목록에 넣으라고 있는 값입니다. 주소는 일부러 망가뜨려 적었습니다. 맨 아래 네 줄의 URL 칸을 보세요 — 오늘 이야기가 거기 있습니다.
a8460f446be540410004b1a8db4083773fa46f7fe76fa84219c93daa1669f8f2센서 01. 389바이트 OpenSSH RSA 공개키. URL 미기록(세션 안에서 기록됨). 출처 12곳·12회이며 목록에는 10곳만 표기돼 있다. 8/16 이후 13일째 같은 해시다hxxp://185[.]93[.]89[.]72/wget센서 01. 306바이트 POSIX 셸 스크립트가 놓여 있던 자리. 오늘 신고 대상 유포지 두 곳 중 하나a6296a79f44e21b76604d2d2bbf795d2cf380f70e39d45fbf166707ff3b4a6a4센서 01. 위 주소에서 받아간 파일. 00:51 세션(ATK-D62131)이 받아간 것과 같은 해시다hxxp://5[.]182[.]210[.]174/ok센서 01. 1,608바이트 bash 스크립트가 놓여 있던 자리. 오늘 신고 대상 유포지 두 곳 중 나머지 하나bca838fa0f03b6b98ea955c85d0b438ccbc5b1a38d16757971bbeff061e6c8cc센서 01. 위 파일. 크기가 정확히 1,608바이트인 채로 해시만 바뀌는 형태가 기록에 반복된다43728fbfb98bb39ff61a2db0fc2905bd6937997062b05b9ab8b186fdee18c09a센서 01. 399바이트 OpenSSH 개인키, 2회. ATK-CA5936 한 곳. 8/19·8/24·8/25 에도 같은 해시가 있다00b6f15c2274420217ed3098a9f5f00545bf1793d7a324fd18a7809cbbf5b12b센서 01. 54바이트 ASCII 텍스트, 2회. ATK-CA5936 한 곳4af5a5c98ad132095c6fbe7b02c242153a190a01cc321e50a916a0ca46fbaa62센서 01. 9바이트 ASCII 텍스트, 3회. ATK-BECAD3 한 곳a9b1c85a7bd78dd1112ecc75c9070ea8c53078831a17aa09ebeb287fe6e21b72센서 01. 9바이트 ASCII 텍스트. ATK-3E7DA8 한 곳1193dde1c831808bf6f2db6f5b850b846b8a7f870873ec3b8a347f21cc5d96e3센서 01. 9바이트 ASCII 텍스트. ATK-3E7DA8 한 곳. 이 8종을 다 더해도 2,783바이트이고 ELF 실행파일은 0건, 이틀째다a1b6223a3ecb37b9f7e4a52909a08d9fd8f8f80aee46466127ea0f078c7f5437센서 02. 334,816바이트, 오늘 확보된 검체 중 최대. ATK-F4738A. URL 필드 자체가 없다76ae6d577ba96b1c3a1de8b21c32a9faf6040f7e78d98269e0469d896c29dc64센서 02. 239,388바이트. ATK-F4738A. URL 필드 자체가 없다d7188b8c575367e10ea8b36ec7cca067ef6ce6d26ffa8c74b3faa0b14ebb8ff0센서 02. 153,208바이트. ATK-F4738A. URL 필드 자체가 없다0d3c687ffc30e185b836b99bd07fa2b0d460a090626f6bbbd40a95b98ea70257센서 02. 46,525바이트, 2회. ATK-F4738A. 이 4종 합 773,937바이트로 센서 01 의 2,783바이트보다 약 278배 크다. 파일 종류를 적는 칸이 없어 무엇인지 알 수 없다사실
위 열 줄과 아래 네 줄의 차이가 눈에 보입니다. 위쪽에는 url 줄이 두 개 섞여 있습니다. 아래쪽에는 없습니다. 아래 네 개는 차단 목록에 적을 칸이 sha256 하나뿐입니다.
사실 맨 윗줄도 짚고 갑니다. 389바이트 공개키는 8월 16일부터 13일째 똑같은 해시입니다. 문자 메시지 두어 줄 정도 되는 크기이고, 어제 12곳이 이걸 심고 갔습니다. 같은 열쇠가 13일 동안 계속 걸리고 있다는 뜻입니다.
국제 분류표에 대응시키면
공격자가 쓴 수법에는 전 세계가 같이 쓰는 번호가 붙어 있습니다. MITRE ATT&CK라는 목록입니다. 아래에서 ID를 누르면 원문 설명으로 갑니다 — 우리 말을 믿지 말고 직접 확인해 보시라고 붙여 둡니다.
- T1110.001Brute Force: Password Guessing — 센서 01 로그인 시도 3,051회 / 고유 출발지 202곳추정
- T1078.001Valid Accounts: Default Accounts — admin/admin(15곳) 등 인용 가능한 조합 20종이 전부 기본값·단순 숫자열추정
- T1082System Information Discovery — '정찰 — 시스템' 995회추정
- T1105Ingress Tool Transfer — 센서 01 '파일 다운로드' 21회 + 검체 8종. 센서 02 에서도 검체 4건이 유입됐다(경로는 데이터에 명시돼 있지 않다)추정
- T1222.002File and Directory Permissions Modification: Linux — '실행 권한 부여' 135회추정
- T1098.004Account Manipulation: SSH Authorized Keys — '지속성 — SSH 키 심기' 15회추정
- T1053.003Scheduled Task/Job: Cron — '지속성 — cron' 1회. 어제 단 한 건이며 ATK-AE28B3 세션의 의도와 일치한다추정
- T1070Indicator Removal — '흔적 삭제' 12회. 명령 원문이 없어 로그·이력·파일 중 무엇을 지웠는지 구분되지 않으므로 하위 기법은 붙이지 않는다추정
- T1046Network Service Discovery — 센서 02 에서 5개 서비스 포트에 248곳이 접촉. 서비스 접촉 사실만으로 매핑했으며 스캔 도구를 특정한 것이 아니다추정
- T1021.005 / T1021.001Remote Services: VNC / RDP — 서비스 종류로만 매핑했다. 저상호작용 센서라 원격 서비스가 실제로 사용된 사실은 관측되지 않았다추정
추정 열 줄이 전부 ‘추정’ 배지입니다. 우리가 본 것은 명령의 의도 분류와 접촉 횟수이지, 공격자가 스스로 밝힌 목적이 아니기 때문입니다. 특히 맨 아래 두 줄은 “이 포트에 말을 걸었다”까지만 관측한 것입니다. 실제로 뚫렸다는 뜻이 아닙니다.
어제 하루 전체
사실 첫 번째 서버(센서 01, 고상호작용) 기준입니다.
| 항목 | 2026-08-28 | 비고 |
|---|---|---|
| 세션 | 3,303건 | 8/26 5,488 → 8/27 2,605 → +26.8% |
| 명령 | 10,940개 | 8/27 2,313개 → 4.7배 |
| 고유 출발지 | 202곳 | 8/27 442곳 → -54.3% |
| 로그인 시도 | 3,051회 | 약 28초에 한 번꼴 · 한 곳당 평균 15.1회 |
| 포트 2223 (텔넷) | 2,081세션 | 전체의 63.0% (8/27 은 7.1%) |
| 포트 2222 (SSH) | 1,222세션 | 전체의 37.0% |
| TTY 녹화 | 2,836건 | 실제 보관된 것은 200건 |
| 명령 의도 합계 | 1,200회 | 명령 총계의 11.0% (8/27 은 85.2%) |
| 세션당 명령 | 3.31개 | 8/27 0.89개 |
| 검체 | 8종 · 합 2,783바이트 | ELF 0건, 이틀째 |
사실 두 번째 서버(센서 02, 저상호작용) 기준입니다. 세션의 단위가 서로 달라 두 서버를 더하지 않습니다.
| 항목 | 2026-08-28 | 비고 |
|---|---|---|
| 총 접촉 | 47,815건 | 8/27 30,804 → +55.2%, 사흘 중 최대 |
| 고유 출발지 | 248곳 | 상위 9곳이 45,035건(94.19%) |
| VNC 5900 | 45,113건 / 50곳 | 한 곳당 평균 902회 |
| RDP 3389 | 2,114건 / 120곳 | 한 곳당 평균 17.6회 (8/27 1,425건·116곳) |
| ADB | 세션 87건 | 8/26 86 → 8/27 26 → 87 |
| 검체 | 4종 · 합 773,937바이트 | 8/26 0건 · 8/27 0건 → 처음 확보 |
사실
말을 건 규격도 기록에 남습니다. VNC는 버전이 기록된 45,081건 중 45,038건(99.90%)이 003.003을 제안했습니다. 003.008은 43건입니다. SMB 협상에서 제안된 방언은 NT LM 0.12 58 · LANMAN1.0 53 · LM1.2X002 53 등으로 전부 SMB1 계열이고, 어제 1건·그제 2건 있던 SMB 2.??? 제안은 이날 목록에 아예 없습니다.
추정 아주 오래된 규격만 골라 제안하고 있습니다. 요즘 기계가 아니라 낡은 채로 방치된 기계를 찾고 있다는 그림으로 읽습니다. 다만 여기서 관측된 건 협상 단계까지입니다.
사실
RDP 쪽에는 상대가 직접 채워 넣는 문자열(쿠키)이 남습니다. hello 1,586 · <ip> 445 · (빈 값) 5 · nmap 4 · kset 2 · ZRIlUYMXZ 1로 합 2,043이고, 2,114건 중 71건은 기록되지 않았습니다.
추정
nmap 4건은 8월 26~27일 목록에 없던 값입니다. 다만 쿠키는 상대가 마음대로 채워 넣는 자유 문자열입니다. 실제로 그 도구를 썼다는 증거가 아닙니다. 거기 뭐라고 적혀 있든 그건 자기소개일 뿐입니다.
그래서 뭘 해야 하나
추정 브리프가 정리한 ‘이 통제가 없었다면’ 여섯 가지를, 어제 데이터가 가장 세게 받쳐 주는 순서로 놓습니다.
1. 안 쓰는 기기의 전원을 뽑는다 — 어제 상자 네 개가 들어온 통로는 전체 접촉의 0.18%짜리였습니다. 표적이라서 오는 게 아니라 열려 있어서 옵니다. 창고에 처박아 둔 안드로이드 셋톱박스나 태블릿이 인터넷에 물려 있으면, 그건 잠기지 않은 뒷문입니다.
2. 관리 포트를 인터넷에 그대로 열어 두지 않는다 — 어제 202곳이 두 포트를 두드렸고, 옆 서버에서는 VNC에 50곳·45,113건, RDP에 120곳·2,114건이 붙었습니다. 취약점이 없어도 열려 있다는 이유만으로 옵니다.
3. 기본 비밀번호를 쓰지 않는다 — 위 표의 20종은 서로 다른 IP 3곳 이상이 실제로 두드린 조합입니다. 이 중 하나라도 살아 있으면 그날 안에 열립니다. 어제 완결성 상위 5개 세션은 예외 없이 로그인에 성공했습니다. 가장 빠른 건 4.8초였습니다.
4. authorized_keys 파일을 한 번 열어 본다 — 어제 열쇠 걸기 15회, cron 걸기 1회가 관측됐습니다. 심어진 389바이트 공개키는 13일째 같은 파일입니다. 내가 넣은 기억이 없는 줄이 있으면 그게 남의 열쇠입니다. 비밀번호를 바꾸는 것으로는 지워지지 않습니다.
5. 같은 곳이 계속 두드리면 막는다 — 다만 절반만 막힙니다 사실 두 번째 서버는 상위 9곳만 막아도 어제 접촉의 94%가 사라집니다. 막을 대상이 적습니다. 추정 그런데 345gs5662d34 같은 조합은 10곳이 정확히 한 번씩만 시도했습니다. 곳당 1회짜리 분산형 시도에는 IP 단위 차단이 걸리지 않습니다. 두 형태가 같은 날 함께 옵니다.
6. 서버에서 밖으로 나가는 연결을 제한한다 — 여기서 오늘의 한계가 나옵니다 사실 어제 파일 다운로드 21회·다운로드 후 실행 21회가 여기서 끊깁니다. 추정 그런데 아웃바운드 차단은 “주문을 못 하게 막는 것”입니다. 이미 문 앞에 놓고 간 상자에는 아무 효과가 없습니다. 두 번째 서버의 상자 네 개에 URL이 없다는 건, 나가는 트래픽을 다 막아도 그 통로는 그대로 열려 있다는 뜻일 수 있습니다.
7. 로그를 서버 밖에 따로 남긴다 — 흔적을 지우려는 의도가 12회 관측됐습니다(8/25 70회, 8/27 36회에서 계속 줄고 있습니다). 세션 3,303건 대비 0.36%로 적은 편이라 위험도를 ’중간’으로 뒀습니다. 그래도 로그가 서버 안에만 있었다면 그중 일부는 성공했을 겁니다.
전에도 있었던 일
추정 ADB.Miner (2018년). 안드로이드 디버그 브리지가 열린 기기를 훑어 채굴 코드를 확산시킨 웜입니다. 인증 절차 없이 열려 있는 디버그 통로로 파일을 밀어 넣어 퍼졌다는 점이, 어제 유일하게 실물 검체가 확보된 채널이 ADB 계열이고 그 87세션이 전체 접촉의 0.18%뿐이었다는 구도와 맥락이 닿습니다. 다만 우리 데이터에는 파일 종류도 동작도 없습니다. 어제 검체를 이 계열로 특정한 것이 아니고, 감염 규모 수치도 인용하지 않습니다. (근거: 보안업체 공개 리서치 팀 보고 — 360 Netlab, 2018년 2월 — 및 이후 다수 벤더의 공개 분석)
추정 ADB 인터페이스를 경유해 확산한 Mirai 파생 계열 (2019년). 기본 자격증명 사전으로 퍼지던 계열이, 인증이 없는 디버그 포트라는 별도 경로를 함께 쓰기 시작한 형태입니다. 어제 첫 번째 서버의 자격증명 사전 20종과 두 번째 서버의 검체 유입이 같은 날 한 조직의 서로 다른 서버에서 동시에 관측된 구도와 닮았습니다. 다만 두 서버 출발지의 교집합을 우리 데이터로 확인할 수 없으므로, 같은 캠페인이라고 말할 근거는 없습니다. (근거: 벤더 공개 위협 분석 보고 — Trend Micro, 2019 — 및 MITRE ATT&CK T1105 기법 문서)
우리가 모르는 것
이 글에서 가장 중요한 부분입니다. 위에서 적은 것보다 적지 못한 것이 더 많습니다.
- 센서 02의 검체 4건이 ADB로 들어왔다는 것은 추정입니다. 데이터는 이 4건이 어느 서비스를 거쳤는지 명시하지 않고, 서비스 목록에 ADB 항목이 없으며, 8/26·8/27에 이어 이날도 별도 ADB 상세 블록이 없습니다. “저상호작용 서버에서 파일 투입이 성립할 수 있는 채널은 ADB뿐”이라는 전제에 기댄 판단입니다.
- ADB 세션은 8/26 86 → 8/27 26 → 8/28 87인데 검체는 0 · 0 · 4입니다. 세션 수가 8/26과 거의 같은데 결과가 다릅니다. 공격 행동이 바뀐 것인지 수집기 상태가 바뀐 것인지 데이터로 구분할 수 없습니다. 이 글의 제목이 이 차이에 걸려 있으므로, 가장 중요한 불확실성입니다.
- 센서 02 검체 4건에는 파일 종류를 적는 칸이 없습니다. 크기만 있고 실행파일인지 압축 파일인지 이미지인지 알 수 없습니다. “45KB~327KB라서 실행파일일 것”이라고 쓰지 않았습니다.
ATK-F4738A는 상위 출발지 12곳 목록에 없어 마스킹 IP도 접촉 수도 알 수 없습니다. “접촉 순위에 없다”까지만 사실이고, 이 출발지가 몇 번 접촉했는지는 말할 수 없습니다.- 센서 02에서 ’한 출발지가 여러 서비스를 훑었는지’는 판정할 수 없습니다. 출발지별 서비스 목록이 없고, 서비스별 고유 IP 합(50+120+13+37+9=229)이 총 고유 IP 248보다 작아 중복이 전혀 없어도 수치가 성립합니다.
- 상위 9곳의 합(45,035)이 VNC 접촉(45,113)과 거의 같지만, 데이터가 출발지와 서비스를 연결해 주지 않습니다. 이들이 VNC 쪽이라고 확정할 수 없습니다.
- 센서 01의 명령 10,940개 중 의도로 분류된 것은 1,200회(11.0%)뿐입니다. 8/27은 85.2%였습니다. 나머지 9,740개가 의도 없는 명령인지 분류가 실패한 것인지 데이터가 설명하지 않습니다.
- ‘지속성 — SSH 키 심기’ 15회와 389바이트 공개키의 다운로드 12회(별칭 12곳)는 연결되지 않습니다. 15회 전부가 이 키를 심은 것인지 확인할 수 없고, 전달 출처는 12곳 중 10곳만 표기돼 있습니다.
- 05:49의 ATK-4F095E 세션은 의도에 ’파일 다운로드’와 ’다운로드 후 실행’이 있는데 다운로드 수는 0입니다. 실패한 것인지, 성공했는데 저장이 안 된 것인지 구분할 수 없습니다.
- ATK-CA5936의 두 세션은 명령이 1개인데 의도가 5종, 다운로드가 2건입니다. 명령 한 줄이 어떻게 다섯 단계로 분류됐는지 데이터가 설명하지 않습니다. 8/19에도 같은 형태가 있었으나 명령 원문이 없어 확인할 수 없습니다.
- 그 두 세션은 명령 수·의도·다운로드 수·지문이 모두 같습니다. 같은 도구가 두 번 돌아간 것으로 보이지만, 같은 사람·같은 조직이라는 근거는 없습니다.
- 참고 지표에 Discord 웹훅 주소 한 건이 실려 있는데 이날 관측분인지 누적분인지 날짜가 없습니다. 이날 검체 어디에도 연결되지 않아 본문 사실로 쓰지 않았습니다. 8/27 기록에도 같은 문제가 적혀 있습니다.
- 같은 이유로 압축을 풀어서만 얻은 12건(
31[.]77[.]227[.]121/bins/아래)도 날짜 표기가 없고, 이날 센서 01에는 ELF가 0건이므로 이날 관측과 연결하지 않았습니다. - TTY 녹화 건수는 2,836인데 실제 보관된 것은 200건입니다. 14배 차이가 보관 정책 때문인지 집계 기준 차이인지 알 수 없습니다.
- 센서 01의 고유 IP 202곳 중 클라이언트 지문 11종이 덮는 것은 35곳뿐입니다. 나머지 167곳의 분포는 알 수 없고, 이날 세션의 63%인 텔넷에는 지문 자체가 존재하지 않습니다. 군집 총수는 45인데 데이터에는 11종만 실려 있습니다.
- 완결성 상위 5개 중 텔넷 2건은 지문과 클라이언트가 빈 문자열입니다. 값이 없는 게 아니라 프로토콜에 그 개념이 없는 것입니다. ’지문이 지워졌다’로 읽으면 안 됩니다.
- 두 서버를 합친 고유 출발지 450곳은 교집합을 알 수 없어 나온 상한입니다. 두 서버를 모두 건드린 곳이 몇 곳인지는 알 수 없습니다.
그리고 아래는 애초에 확인할 수단이 없는 것들입니다. 추정하지 않습니다.
- ASN·ISP — 관련 데이터베이스가 없습니다. 유포지
185[.]93[.]89[.]72·5[.]182[.]210[.]174가 어느 사업자에 있는지, 센서 02의 상위 9곳이 같은 네트워크인지 말할 수 없습니다. - 지리정보 — 동일하게 없습니다. 그리고 IP 지리정보는 애초에 귀속 근거가 되지 않습니다. 어떤 국가·기업·개인도 이날의 공격자로 지목하지 않습니다.
- VPN·Tor·클라우드 여부 — 판별 수단이 없습니다. 출발지 202곳·248곳 중 어느 것이 경유지이고 어느 것이 원점인지 구분할 수 없습니다.
- VirusTotal — 연동돼 있지 않습니다. 어제 확보된 검체 12건(01의 8종 + 02의 4종)에 외부 다중 엔진 판정을 붙일 수 없습니다. 특히 02의 4건은 파일 종류조차 데이터에 없습니다.
- User-Agent — 두 관측면 다 HTTP가 아닙니다. 01은 SSH·텔넷, 02는 SMB·RDP·VNC·MSSQL·LDAP·ADB입니다.
- CVE 연결 — 어제 두 서버 어디에도 특정 취약점을 참조한 흔적이 없습니다. 배경 통계로 들고 있는 CVE 수치는 어제 관측된 어떤 세션·검체와도 연결되지 않습니다.
추정 정리하면 어제는 이렇습니다. 이틀 동안 비어 있던 칸에 상자 네 개가 한꺼번에 들어왔습니다. 합쳐서 773,937바이트, 옆 서버 하루치 여덟 개를 다 합친 것의 약 278배입니다. 보낸 곳은 전부 같은 한 곳인데, 그 한 곳은 초인종을 많이 누른 명단에 이름이 없었습니다.
그리고 상자에는 송장이 없었습니다. 우리가 적어 둘 수 있는 건 봉인 스티커 네 개, sha256 네 줄뿐입니다. 차단 목록도 신고서도 “어디서 왔는가”를 알아야 쓸 수 있는 물건인데, 어제 들어온 것들에는 그 칸이 아예 없었습니다.
그래서 오늘 할 일은 문 앞을 지키는 쪽이 아니라 문 자체를 줄이는 쪽에 있습니다. 안 쓰는 기기의 전원을 뽑고, 안 쓰는 포트를 닫는 것 말입니다. 송장이 없는 상자는 온 뒤에 처리할 방법이 별로 없습니다.
관측일은 2026년 8월 28일(UTC) 하루입니다. 출발지 IP는 브리프의 마스킹 형태(187.52.x.x)를 그대로 옮겼고 복원하지 않았습니다. 유포 주소는 접속되지 않도록 변형해 적었습니다(hxxp://, [.]). 자격증명은 서로 다른 IP 3곳 이상에서 관측된 조합 20종만 인용했고, 단일 출처에서만 나온 조합 862종은 개수만 밝히고 값을 싣지 않았습니다. ASN·국적·행위자 귀속은 확인 수단이 없어 추정하지 않습니다.
