SecurityHeroblog

같은 발자국 233개 — 물건을 놓고 간 건 2곳뿐이었다

9월 4일, 우리 서버에 찾아온 419곳 중 233곳이 똑같은 접속 프로그램 표식 하나를 달고 왔습니다. 그런데 그 233곳은 파일을 한 개도 놓고 가지 않았고, 이날 실제로 검체를 배달한 표식은 IP 2곳짜리 하나뿐이었습니다. 가장 많이 찍힌 발자국과 물건을 놓고 간 발자국이 서로 다른 날의 기록입니다.

비 온 다음 날 아파트 현관 로비에 내려가 본 적 있으신가요.

바닥에 신발 자국이 잔뜩 찍혀 있습니다. 그런데 자세히 보면 밑창 무늬가 몇 종류 안 됩니다. 같은 무늬가 스무 개, 서른 개씩 겹쳐 있어요. 그렇다고 그게 한 사람이 서른 번 오간 자국은 아닙니다. 같은 신발을 신은 서로 다른 사람들이 지나간 겁니다. 요즘 다들 신는 그 운동화요.

발자국으로 알 수 있는 건 딱 거기까지입니다. 어떤 신발인지는 알 수 있고, 누구인지는 알 수 없습니다.

어제 우리 허니팟 로비 바닥이 그랬습니다.


발자국이 하나로 몰렸다

먼저 용어 하나만 풀고 가겠습니다.

서버에 접속할 때 상대방의 프로그램은 자기가 어떤 방식으로 대화할지를 먼저 알려줍니다. 이 대화 방식의 조합을 해시(내용을 짧은 글자·숫자 덩어리로 요약한 값)로 뭉쳐 놓은 것을 클라이언트 지문이라고 부릅니다. 이름은 지문인데, 실제로는 지문보다 발자국에 가깝습니다. 사람의 손끝이 아니라 신발 밑창을 찍은 것이거든요.

사실 어제 우리 서버에 남은 발자국 무늬는 모두 38종이었습니다. 그중 브리프 목록에 오른 11종의 출발지를 합치면 264곳입니다. 그런데 그 264곳 중 233곳이 acaa53e0a7d7ac7d1255103f37901306 하나였습니다. 배너 문자열은 SSH-2.0-OpenSSH_7.4. 열 켤레 중 아홉 켤레(88.3%)가 같은 무늬였다는 뜻입니다.

사실 이 무늬가 지금까지 밟은 출발지는 누적 1,029곳입니다. 8월 16일에는 20곳이었습니다. 스무 날 만에 51배가 됐어요. 추이는 이렇습니다. 8/16 20곳 → 8/25 139 → 8/26 356 → 8/27 543 → 8/31 589 → 9/01 758 → 9/02 899 → 9/03 1,005 → 어제 1,029.

사실 그런데 이 무늬에는 20일 내내 한 번도 켜지지 않은 표시가 하나 있습니다. delivered_samples(검체를 배달했는가) 항목이 계속 false입니다. 로비를 제일 많이 밟은 신발이, 스무 날 동안 문 앞에 아무것도 놓고 가지 않았습니다.

물건을 놓고 간 발자국은 따로 있었다

사실 어제 목록에 오른 11종 중 delivered_samples=true인 것은 딱 하나였습니다. 16443846184eafde36765c9bab2f4397, 배너는 SSH-2.0-Go. 어제 출발지 2곳, 누적 19곳입니다.

숫자를 나란히 놓으면 이렇게 됩니다.

발자국 무늬 배너 어제 출발지 누적 출발지 검체 배달
acaa53e0… SSH-2.0-OpenSSH_7.4 233곳 1,029곳 없음 (20일 내내)
16443846… SSH-2.0-Go 2곳 19곳 있음

추정 가장 시끄럽게 드나든 쪽과 실제로 물건을 놓고 간 쪽이 어제는 서로 달랐습니다. 접촉이 많은 순서대로 위험도를 매기면 순서가 뒤집히는 형태입니다. 233대 2니까, 접촉량으로 줄을 세웠다면 물건을 놓고 간 쪽은 목록 한참 아래에 있었을 겁니다.

어제 처음 보는 신발 두 켤레

사실 어제 목록에는 아카이브 19일치(8/16~9/03)에 한 번도 없던 무늬가 두 개 같이 나타났습니다.

  • 3356ae6145fa86124298066e281ea2d9 — 배너 SSH-2.0-PuTTY_Release_0.84. 어제 3곳 = 누적 3곳. 어제가 처음입니다.
  • 5bd26477da5440a6187bd3f1b39a429c — 배너가 그냥 SSH-2.0-PUTTY입니다. 버전 표기가 빠져 있어요. 어제 3곳 · 누적 8곳.

사실 그 전까지 기록에 있던 PuTTY 계열 무늬는 0425c279…(0.70) 하나뿐이었고, 그 하나는 어제 목록에 없습니다.

여기서 반드시 멈춰야 하는 지점

사실 이 값들은 프로그램 빌드의 지문이지 사람의 지문이 아닙니다. 같은 배포판이 기본으로 넣어주는 OpenSSH를 쓰는 사람, 같은 PuTTY 릴리스를 내려받은 사람은 서로 아무 관계가 없어도 같은 값을 갖습니다. 그래서 우리는 “같은 도구”라고만 쓰고 “같은 조직”이라고는 쓰지 않습니다.

사실 게다가 배너 문자열은 상대가 스스로 보내는 값입니다. 자기 신발에 원하는 무늬를 새겨서 신고 올 수 있다는 뜻이고, 우리에게는 그걸 검증할 수단이 없습니다.

사실 비율도 조심해서 읽어야 합니다. 233곳을 어제 전체 출발지 419곳으로 나누면 55.6%가 나오지만, 이 분모는 오염돼 있습니다. 텔넷 세션 328건에는 이 발자국이 애초에 생기지 않습니다. 그래서 우리는 419가 아니라, 발자국이 남은 264곳을 분모로 쓴 88.3%를 씁니다.


어제 하루 전체

시간 순서로 늘어놓으면 이렇게 됩니다. 집계 줄과 아카이브 대조 줄을 번갈아 보세요 — 어제 하루만 보면 안 보이는 것이 앞뒤 날짜와 붙여 놓으면 보입니다.

  1. 사실 센서 01(Cowrie, 고상호작용): 세션 952건 · 고유 출발지 419곳 · 로그인 시도 663회 · 명령 1,403개 · TTY 녹화 319건. 포트별로 2222(SSH) 623건, 2223(텔넷) 328건. 어제(9/03) 세션 2,378 · 명령 6,001 대비 세션 40.0% · 명령 23.4% 수준으로 내려앉았다
  2. 사실 의도 분포: 실행 권한 부여 237 → 정찰—시스템 147 → 다운로드 후 실행 20 / 파일 다운로드 20 → 흔적 삭제 11 → 지속성—SSH 키 심기 10 → 정찰—네트워크 2. 합계 447건으로 어제 명령 1,403개의 31.9%
  3. 사실 '실행 권한 부여'가 '정찰—시스템'을 앞지른 날은 8/29(161대75) · 8/31(195대119) · 9/01(207대144) · 9/02(135대60) · 어제(237대147)로 최근 7일 중 5일. 237회는 역전이 일어난 다섯 날 중 절대값 최대이며, 아카이브 20일 전체로도 8/16(309)·8/17(283)·8/22(271)·8/18(257)에 이은 5위
  4. 사실 반면 8/16~8/28 열사흘은 예외 없이 정찰이 1위였다(8/26 정찰 2,391, 8/27 1,811)
  5. 사실 내려온 파일은 4종. 1바이트 빈 파일(11회), 389바이트 OpenSSH RSA 공개키(출처 8곳), 306바이트 POSIX 셸 스크립트(hxxp://185[.]93[.]89[.]72/wget, 출처 6곳), 9바이트 ASCII 텍스트(6회). ELF·PE 등 실행 바이너리는 file_category·file_kind 어디에도 없다
  6. 사실 SSH 클라이언트 지문 클러스터 총 38개. 최대 클러스터 acaa53e0a7d7ac7d1255103f37901306(SSH-2.0-OpenSSH_7.4)은 어제 233곳 · 누적 1,029곳. 목록에 오른 11개 클러스터의 어제 IP 합계 264곳 중 233곳(88.3%)이 이 하나
  7. 사실 acaa53e0…의 누적 IP 추이: 8/16 20곳 → 8/25 139 → 8/26 356 → 8/27 543 → 8/31 589 → 9/01 758 → 9/02 899 → 9/03 1,005 → 어제 1,029. 20일 내내 delivered_samples 는 계속 false
  8. 사실 목록 11개 지문 중 delivered_samples=true 는 16443846184eafde36765c9bab2f4397(SSH-2.0-Go) 하나뿐이며, 어제 IP 2곳 · 누적 19곳
  9. 사실 3356ae6145fa86124298066e281ea2d9(SSH-2.0-PuTTY_Release_0.84)은 어제 3곳 = 누적 3곳으로, 아카이브 19일치(8/16~9/03)에 이 해시가 한 번도 없다. 5bd26477da5440a6187bd3f1b39a429c(배너가 'SSH-2.0-PUTTY' 로 버전 표기 없음)도 아카이브에 없으며 어제 3곳 · 누적 8곳
  10. 사실 ATK-1A62F3(45.250.x.x) 텔넷 로그인 성공. 약 70.3초, 명령 31개, 다운로드 1건. intents 3종(파일 다운로드 · 실행 권한 부여 · 다운로드 후 실행). completeness 16. TTY 녹화됨(내용 미포함). 306바이트 셸 스크립트의 delivered_by 목록에 있다
  11. 사실 ATK-3C40CA(36.233.x.x) 텔넷 로그인 성공. 약 67.9초, 명령 31개, 다운로드 1건, intents 3종, completeness 16 — ATK-1A62F3 과 명령 수·다운로드 수·의도 조합·completeness 가 전부 같다. 이 별칭도 306바이트 스크립트의 delivered_by 에 있다
  12. 사실 ATK-DB4C25(103.205.x.x) 텔넷 로그인 성공. 약 67.3초, 명령 17개, 다운로드 0건. intents 5종으로 어제 최다 — 정찰—시스템 · 파일 다운로드 · 다운로드 후 실행 · 실행 권한 부여 · 지속성—SSH 키 심기. completeness 17
  13. 사실 ATK-929E7E(165.101.x.x) 텔넷 로그인 성공. 약 73.8초, 명령 17개, 다운로드 0건, intents 5종, completeness 17 — ATK-DB4C25 와 완전히 같은 형태가 5시간 14분 뒤 다른 출발지에서 반복됐다
  14. 사실 ATK-5392AA(122.199.x.x) 텔넷 로그인 성공. 약 19.6초로 어제 가장 짧은데 다운로드 11건 · 명령 20개 · completeness 40 으로 어제 최고값. 그런데 intents 배열은 비어 있고, 받아간 11건은 전부 sha256 01ba4719…(1바이트, 매직 넘버 없음)
  15. 사실 센서 02(Beelzebub+adbhoney, 저상호작용): 접촉 51,367건 · 고유 출발지 317곳. VNC 5900 이 50,065건(97.5%)인데 출발지는 69곳뿐 — 한 곳당 725.6건. RDP 3389 는 795건 · 143곳, SMB 445 는 309건 · 40곳, LDAP 389 는 109건 · 9곳, MSSQL 1433 은 64건 · 40곳
  16. 사실 VNC 협상에서 상대가 제안한 버전은 003.003 이 48,103회, 003.008 이 1,487회로 003.003 이 97.0%. SMB 방언 제안 323건 중 'SMB 2.???'는 2건뿐이고 나머지는 NT LM 0.12 · LANMAN1.0 · LM1.2X002 · PC NETWORK PROGRAM 1.0 같은 구형 어휘. RDP 쿠키는 '<ip>' 396회, 'hello' 208회가 대부분
  17. 사실 ADB 세션 25건이 있었으나 samples_captured=0 이고 downloads 배열은 비어 있다. 어제(9/03)는 ADB 32건에 검체 4건, 그제(9/02)는 733,706바이트 파일이 이 통로로 들어왔다

여기서 눈에 걸리는 건 9월 3일과 4일의 차이입니다. 두드린 곳 수는 거의 그대로인데, 안에서 한 일만 크게 줄었어요.

항목 9/03 9/04 변화
세션 2,378건 952건 −60.0%
명령 6,001개 1,403개 −76.6%
TTY 녹화 1,597건 319건 −80.0%
고유 출발지 457곳 419곳 −8.3%
로그인 시도 — 663회 —
포트 — SSH 2222 623건 / 텔넷 2223 328건 —

추정 로비를 밟고 간 사람 수는 거의 그대로인데, 안에 들어와서 한 일만 4분의 1로 줄어든 모양입니다. 감으로 크기를 재 보면 로그인 시도 663회는 평균 2분에 한 번꼴, 명령 1,403개는 평균 1분에 한 개꼴입니다. 하루 종일 쉬지 않고, 하지만 아주 빠르지도 않게 이어진 속도입니다.

발자국 말고, 안에서 한 일

사실 명령 1,403개 중 뜻이 분류된 것은 447개(31.9%)입니다. 그 447개의 1위는 둘러보기가 아니었습니다.

의도 횟수
실행 권한 부여 237회
정찰 — 시스템 147회
다운로드 후 실행 20회
파일 다운로드 20회
흔적 삭제 11회
지속성 — SSH 키 심기 10회
정찰 — 네트워크 2회

’실행 권한 부여’는 파일에 “이건 실행해도 되는 파일이야”라는 표시를 붙이는 동작입니다. 리눅스에서는 표시가 없으면 아무리 프로그램이어도 실행되지 않거든요.

사실 이 동작이 정찰을 앞지른 날은 8/29(161대75) · 8/31(195대119) · 9/01(207대144) · 9/02(135대60), 그리고 어제(237대147)입니다. 최근 7일 중 5일이에요. 반대로 8/16부터 8/28까지 열사흘은 예외 없이 정찰이 1위였습니다. 어제 237회는 역전이 일어난 다섯 날 중 가장 큰 값이고, 20일 전체로 봐도 5위입니다.

문 앞에 놓인 것

사실 어제 서버로 내려온 파일은 네 종류였습니다. 크기가 감이 잘 안 오실 텐데, 옆에 견줄 것을 붙여 보겠습니다.

파일 크기 어느 정도인가 관측
빈 파일 1바이트 글자 하나 11회 · 별칭 1곳
ASCII 텍스트 9바이트 영어 아홉 글자 6회 · 별칭 1곳
POSIX 셸 스크립트 306바이트 문자 메시지 두 줄 6회 · 별칭 6곳
OpenSSH RSA 공개키 389바이트 문자 메시지 두세 줄 8회 · 별칭 8곳

사실 ELF나 PE 같은 실행 바이너리는 한 개도 없었습니다. 파일 분류 항목 어디에도 없어요. 실행 권한을 붙이는 동작이 237번 있었는데, 정작 붙일 프로그램은 안 들어온 겁니다.

사실 389바이트짜리는 SSH 공개키입니다. 쉽게 말하면 비밀번호 없이 들어올 수 있는 여벌 열쇠예요. 서버의 authorized_keys(허용된 열쇠 목록)라는 파일에 이 값을 한 줄 적어 넣으면, 그 열쇠를 가진 사람은 이후 비밀번호를 물어보지 않아도 들어옵니다. 어제 이 파일은 서로 다른 별칭 8곳에서 왔습니다.

방어에 쓰실 수 있게 값을 그대로 옮깁니다. 값을 클릭하면 복사됩니다. 주소는 접속되지 않도록 변형(defang)해 두었으니 그대로 두고 쓰세요.

sha256
01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b1바이트, very short file (매직 넘버 없음) · 관측 11회 · 별칭 1곳(ATK-5392AA) · 유포지 미기록
sha256
a8460f446be540410004b1a8db4083773fa46f7fe76fa84219c93daa1669f8f2389바이트 OpenSSH RSA 공개키 · 서로 다른 별칭 8곳에서 관측 8회 · 아카이브 원재료 17일치(8/18~9/03)에도 있음 · 유포지 미기록
sha256
a6296a79f44e21b76604d2d2bbf795d2cf380f70e39d45fbf166707ff3b4a6a4306바이트 POSIX 셸 스크립트 · 별칭 6곳에서 관측 6회 · 아카이브 원재료 18일치(8/17~9/03) 전부에 있음
url
hxxp://185[.]93[.]89[.]72/wget위 306바이트 스크립트의 유포지. 어제로 19일째 한 바이트도 바뀌지 않았다
sha256
4af5a5c98ad132095c6fbe7b02c242153a190a01cc321e50a916a0ca46fbaa629바이트 ASCII 텍스트 · 관측 6회 · 별칭 1곳(ATK-BECAD3) · 아카이브 원재료 17일치에도 있음 · 유포지 미기록

네 개 중 세 개는 어디서 왔는지 칸이 비어 있습니다. 차단 목록에 올릴 주소가 남지 않는다는 뜻입니다. 남은 주소는 하나뿐인데, 그 하나는 19일째 그대로입니다.

어떤 비밀번호로 들어오려 했나

사실 어제 로그인 시도는 663회, 아이디·비밀번호 조합은 358종이었습니다. 그중 338종은 여기 싣지 않습니다. 서로 다른 IP 3곳 미만에서만 보인 조합은 실제로 어딘가에서 유출된 진짜 계정일 수 있어서, 우리는 개수만 세고 값은 쓰지 않습니다.

아래는 반대쪽입니다. IP 3곳 이상에서 반복돼서 ’누구의 것도 아닌 출고 기본값’이라고 볼 수 있는 것들이에요.

아이디 비밀번호 서로 다른 출발지
admin admin 16곳
345gs5662d34 345gs5662d34 8곳
root admin 6곳
root 123456 6곳
root 12345 5곳
root root 5곳
support support 4곳
root password1 4곳
test p@ssw0rd 4곳
root (빈 비밀번호) 3곳
root vizxv 3곳
debian 123qwe 3곳

사실 admin/admin 하나만 서로 다른 16곳에서 39회 시도됐습니다. root 계정에 비밀번호를 아예 비워서 시도한 것도 3곳에서 17회 있었습니다.

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

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

  • T1110Brute Force — 로그인 시도 663회 · 자격증명 조합 358종(공개 20 + 미공개 338)추정
  • T1078Valid Accounts — notable_sessions 5건 전부 login_success=true추정
  • T1222.002File and Directory Permissions Modification: Linux — '실행 권한 부여' 237회, 어제 1위 의도추정
  • T1082System Information Discovery — '정찰 — 시스템' 147회추정
  • T1105Ingress Tool Transfer — '파일 다운로드' 20회, 실제 다운로드 이벤트 31건추정
  • T1059.004Command and Scripting Interpreter: Unix Shell — '다운로드 후 실행' 20회, 306바이트 POSIX 셸 스크립트 유입추정
  • T1098.004Account Manipulation: SSH Authorized Keys — '지속성 — SSH 키 심기' 10회, 389바이트 공개키가 별칭 8곳에서 유입추정
  • T1070Indicator Removal — '흔적 삭제' 11회추정
  • T1046Network Service Discovery — '정찰 — 네트워크' 2회추정
  • T1595Active Scanning — 센서 02 접촉 51,367건 · 5개 서비스. 로그인도 명령도 없는 협상 단계 접촉이므로 스캔으로만 분류한다추정

열 줄 전부 [추정] 배지가 붙어 있는 것을 봐 주세요. 우리가 본 것은 명령의 ’의도 분류 결과’와 ’몇 번 있었나’까지입니다. 명령 원문은 우리 손에 없습니다. 그래서 분류표에 대응시키는 일은 언제나 해석이고, 해석에는 해석이라고 적습니다.


옆 건물 로비 — 센서 02

사실 같은 날, 저상호작용 센서 02에는 접촉이 51,367건 들어왔습니다. 센서 01의 세션 952건과 견주면 54배입니다. 출발지는 317곳이었어요.

서비스 포트 접촉 출발지
VNC 5900 50,065건 (97.5%) 69곳
RDP 3389 795건 143곳
SMB 445 309건 40곳
LDAP 389 109건 9곳
MSSQL 1433 64건 40곳
ADB (미기록) 25건 (미기록)

사실 VNC는 화면 공유용 통로입니다. 5만 건이 69곳에서 나왔어요. 한 곳당 725.6건입니다. 하루로 나누면 한 곳이 2분에 한 번씩, 하루 종일 문고리를 돌린 셈입니다.

사실 협상 단계에서 상대가 제안한 VNC 버전은 003.003이 48,103회, 003.008이 1,487회였습니다. 97.0%가 003.003이에요. SMB 쪽도 비슷합니다. 방언 제안 323건 중 최신 계열인 SMB 2.???는 2건뿐이고, 나머지 321건은 NT LM 0.12(70) · LANMAN1.0(63) · LM1.2X002(63) · LANMAN(32) · PC NETWORK PROGRAM 1.0(31) · Windows for Workgroups 3.1(31) · LANMAN2.1(31) 같은 구형 어휘였습니다. RDP 쪽 쿠키는 <ip> 396회, hello 208회가 대부분이었고요.

추정 003.003은 RFB 프로토콜이 정의한 가장 낮은 버전 표기입니다. 상대가 스스로 낮은 쪽을 제안한 형태인데, 왜 그랬는지는 프레임 원문이 없어 말할 수 없습니다.

사실 안드로이드 디버그 통로(ADB)에는 세션 25건이 있었지만 잡힌 검체는 0건이었습니다. 9월 3일에는 32건에 검체 4건, 9월 2일에는 733,706바이트짜리 파일이 이 통로로 들어왔었습니다.

사실 센서 02는 저상호작용이라 로그인 성공·명령·자격증명이라는 개념 자체가 없습니다. 이쪽 관측으로는 “공격자가 들어와서 무엇을 했다”는 문장을 만들 수 없어요. 어느 문을 몇 번 두드렸고, 프로토콜이 뭐라고 말했는지까지가 전부입니다.


전에 이런 일이 있었다

추정 Mirai 봇넷(2016). 텔넷 기본 계정으로 IoT 장비에 로그인한 뒤 CPU 종류별 바이너리를 내려받는 구조였습니다. 어제 우리 관측과 겹치는 지점은 이렇습니다. 완결성 상위 5개 세션이 전부 텔넷이고 전부 로그인에 성공했다는 점, 인용 가능한 자격증명에 장비 출고 기본값 계열(root/vizxv)이 들어 있다는 점입니다. 감염 규모나 피해 금액 수치는 우리 데이터로 확인할 수 없어 옮기지 않습니다. (출처 유형: 정부 기관 경보 US-CERT/CISA Alert TA16-288A, 미 법무부 공개 기소·유죄인정 문서)

추정 XorDDoS 리눅스 트로이목마 캠페인(2022). SSH 무차별 대입으로 리눅스 서버에 들어간 뒤 지속성을 확보하고 흔적을 지우는 순서였습니다. 어제 우리 센서에는 로그인 시도 663회, ‘SSH 키 심기’ 10회, ‘흔적 삭제’ 11회가 같은 날 나란히 기록됐습니다. (출처 유형: 벤더 보안 리서치 공개 보고서, Microsoft Security Threat Intelligence)


그래서 뭘 해야 하나

발자국 이야기로 돌아가 보겠습니다. 로비 바닥의 무늬를 세는 일은 누가 왔는지 알아내려는 게 아닙니다. 어차피 신발은 갈아 신을 수 있으니까요. 세는 이유는 하나입니다. 현관이 어떤 상태로 열려 있길래 이렇게 많이 밟히는지 보려는 겁니다.

어제 데이터로 확인된 순서대로 적습니다.

1. 기본 계정·취약 비밀번호를 그대로 쓰고 있다 · 가능성 높음 위 표 12줄은 전부 장비나 배포판이 출고할 때 넣어두는 값입니다. 사전 준비 없이 즉시 시도 가능해요. 실제 운영 서버였다면 이 목록 중 하나만 걸려도 셸이 열립니다. 어제 다섯 세션이 실제로 로그인에 성공했습니다.

2. 비밀번호 로그인을 허용하고 열쇠 방식을 안 쓰고 있다 · 가능성 높음 성공한 5건은 전부 텔넷(2223)입니다. 텔넷은 비밀번호가 암호화 없이 그대로 흐릅니다. 그리고 침입 이후 남의 공개키를 심는 단계까지 실제로 관측됐습니다(10회). authorized_keys에 남의 열쇠가 한 줄 들어가면, 비밀번호를 바꿔도 그 열쇠로 계속 들어옵니다. 비밀번호 변경만으로는 복구가 안 되는 지점이에요.

3. 관리 포트를 인터넷에 그대로 열어 두고 있다 · 가능성 높음 SSH 623건, 텔넷 328건, 그리고 옆 센서의 VNC 5만 건. 두 관측면을 합쳐 최대 736곳이 문을 두드렸습니다. 특정 조직을 노린 게 아닙니다. 포트를 열어 두는 것만으로 하루 5만 건대의 노크가 붙습니다. 대상이 되는 데 특별한 이유가 필요하지 않아요.

4. 밖으로 나가는 연결을 막지 않고 있다 · 가능성 높음 로그인은 이미 뚫린 다음입니다. 그래서 서버가 밖으로 나가는 연결을 끊는 것이 실제 피해를 막는 마지막 지점입니다. 어제 유포지가 기록된 건 hxxp://185[.]93[.]89[.]72/wget 한 곳이고, 로그인 성공 이후 실제로 밖으로 나가는 연결이 발생했습니다. 이걸 막으면 어제 관측된 세션들은 다운로드 단계에서 전부 끊깁니다.

5. 로그를 서버 안에만 두고 있다 · 가능성 중간 ‘흔적 삭제’ 의도가 11회 분류됐습니다. 우리가 그걸 볼 수 있었던 건 허니팟이라 세션 319건이 따로 녹화됐기 때문입니다. 로그를 서버 안에만 두면 이 11회가 그대로 성공합니다. 침입 사실만 사라지고, 심어진 열쇠는 조용히 남습니다.

6. 횟수 기반 차단(fail2ban 등)만 믿고 있다 · 가능성 중간 여기가 재미있는 지점입니다. 센서 01은 출발지 한 곳당 평균 1.58회밖에 두드리지 않았습니다. ‘5회 틀리면 차단’ 같은 규칙은 대부분 발동하지 않습니다. 419곳이 한두 번씩만 두드리면 임계값 아래로 흩어져 들어오거든요. 예외는 root/빈 비밀번호 조합 하나로, 3곳에서 17회니까 한 곳당 약 5.7회입니다. 반대로 센서 02의 VNC는 한 곳당 725.6건이라 어떤 규칙이든 확실히 걸립니다. 같은 방어가 관측면에 따라 정반대로 동작합니다.


우리가 모르는 것

이 블로그가 다른 곳과 다른 점은 여기입니다. 모르는 것을 모른다고 적습니다.

데이터 자체에서 설명이 안 되는 것

  • [확인 불가] completeness(완결성) 점수의 계산식이 데이터에 없습니다. ATK-5392AA는 40으로 어제 최고값인데 의도 배열이 비어 있고, 열쇠 심기까지 간 ATK-DB4C25·ATK-929E7E는 17입니다. 의도가 하나도 없는 세션이 왜 더 높은 점수를 받았는지 설명할 수 없습니다. 8/18·8/19 브리프에도 같은 항목이 남아 있었습니다.
  • [확인 불가] ATK-5392AA는 명령 20개에 다운로드 11건인데 의도 배열이 비어 있습니다. 분류기가 하나도 분류하지 못한 것인지, 분류 결과가 누락된 것인지 구분할 수 없습니다.
  • [확인 불가] 다운로드 이벤트 합계는 31건(11+8+6+6)인데 ‘파일 다운로드’ 의도는 20회입니다. 집계 단위가 다른 것인지, 명령 없이 발생한 전송이 있는지 데이터가 밝히지 않습니다.
  • [확인 불가] TTY 녹화 수치가 두 곳에서 다르게 나옵니다(218 대 319). samples_on_honeypot 93도 어제 파일 4종과 어떤 관계인지 명시돼 있지 않습니다.
  • [확인 불가] 파일 4종 중 3종의 유포지 칸이 비어 있습니다. 원래 없었던 것인지 기록에서 빠진 것인지 알 수 없고, 따라서 아카이브에 적어 둔 유포지 12개가 어제 쓰였는지도 판단할 수 없습니다.
  • [확인 불가] VNC 버전 제안 합계 49,590은 VNC 세션 50,065건보다 475 적고, RDP 쿠키 합계 609는 RDP 세션 795건보다 186 적습니다. 협상 전에 끊긴 접촉으로 보이지만 이유가 데이터에 없습니다.
  • [확인 불가] 센서 02의 상위 출발지는 단위가 ’events’이고 서비스별 집계는 ’sessions’입니다. 두 값이 같은 것을 세는지 밝혀져 있지 않아, 상위 9곳이 92.2%라는 값은 단위가 같다는 가정 아래의 숫자입니다. 같은 이유로 한 출발지가 여러 서비스를 훑었는지도 셀 수 없습니다 — 그 값 0은 ’없음’이 아니라 ’산출 불가’입니다.
  • [확인 불가] ADB 세션 25건에서 검체가 0건인 것이 실제로 아무 투입이 없었던 것인지, 캡처가 실패한 것인지 구분되지 않습니다. 다만 센서 자체의 수집 실패로 볼 근거는 없습니다. 표의 ADB 포트·출발지 칸도 ’없음’이 아니라 ’미기록’입니다. 9/03에도 같은 누락이 있었습니다.

오늘의 주제인 발자국에 대해서

  • [확인 불가] 누적 출발지 수가 언제부터 쌓인 값인지 데이터에 없습니다. acaa53e0…이 8/16 20곳에서 어제 1,029곳이 된 것을 ’실제 확산’으로 읽을지 ’집계 시작 이후 자연 누적’으로 읽을지 확정할 수 없습니다. 8/21·8/22·8/23 브리프에서도 미해결로 남은 항목입니다.
  • [확인 불가] 배너 문자열(SSH-2.0-OpenSSH_7.4, SSH-2.0-PuTTY_Release_0.84 등)은 상대가 스스로 보내는 값이라 위조가 가능하고, 우리에게 검증할 수단이 없습니다.
  • [확인 불가] 233곳 대 419곳(55.6%)이라는 비율은 분모가 오염돼 있습니다. 텔넷 328건에는 발자국이 아예 생기지 않는데, 프로토콜별 고유 IP 분해가 데이터에 없어 SSH 쪽 실제 점유율을 계산할 수 없습니다. 그래서 본문에서는 88.3%를 씁니다.
  • [확인 불가] 무늬 종류 38개는 8/22 이후 14일 중 최저이고 8/26~8/28의 45에서 내려온 값입니다. 다만 이 수치가 당일 관측된 수인지 누적 수인지 정의돼 있지 않아, 줄어든 것의 의미를 해석할 수 없습니다.

배경 자료 · 신고

  • [확인 불가] 관측한 유포지·C2는 C-TAS로 신고하지만, 전송 자체의 성공만 확인되고 KISA 적재 여부는 별도 확인이 필요합니다.
  • [확인 불가] 배경 통계로 들어온 CVE 6,622건 · CISA KEV 390건 · 랜섬웨어 확인 98건은 KISA 보안공지에서 뽑은 값입니다. 어제 허니팟에서 관측된 어떤 활동과도 연결된 근거가 없습니다.

아예 판단하지 않는 것

  • ASN·ISP — 관련 데이터베이스를 갖고 있지 않습니다. 추정하지 않습니다.
  • 지리정보 — 위와 같습니다. IP 지리정보는 애초에 귀속의 근거가 되지도 않습니다. 어제 나온 마스킹 대역(45.250.x.x, 36.233.x.x, 103.205.x.x, 165.101.x.x, 122.199.x.x, 165.22.x.x, 164.92.x.x 등)으로 국가나 사업자를 유추하지 않습니다.
  • VPN·Tor·클라우드 여부 — 판별 수단이 없습니다.
  • 검체의 악성 여부 — VirusTotal을 연동하지 않았습니다. 어제 파일 4종의 악성 여부는 판정하지 않습니다.
  • User-Agent — 두 관측면 다 HTTP가 아닙니다. 센서 01은 SSH·텔넷, 센서 02는 SMB·RDP·VNC·MSSQL·LDAP·ADB입니다.
  • CVE 연결 — SSH·텔넷 공격은 대개 CVE를 참조하지 않습니다. 센서 02도 프로토콜 협상 단계라 마찬가지입니다. 어제 관측 중 특정 CVE로 연결되는 것은 하나도 없습니다.
  • 출발지 신원 — 별칭(ATK-XXXXXX)은 글과 글 사이에서 같은 출발지를 가리키는 식별자일 뿐 신원이 아닙니다. 마스킹된 두 자리는 복원하지 않습니다.
  • 명령 원문 · 파일 내용 · TTY 리플레이 — 우리 손에 없습니다. 의도 분류와 존재 여부까지만 말할 수 있습니다.

로비 바닥의 발자국은 233개였고, 문 앞에 물건을 놓고 간 발자국은 2곳짜리였습니다. 둘 중 무엇을 먼저 볼지 정하는 기준이 ’몇 개 찍혔나’라면, 어제는 그 기준이 틀린 날입니다.

관측일은 2026-09-04이며, 센서 01은 하루 집계 기준입니다. 출발지 IP는 뒤 두 자리를 가려서 적었고 복원하지 않습니다. 유포 주소는 접속되지 않도록 변형(defang)했습니다. 자격증명은 서로 다른 IP 3곳 이상에서 반복 관측된 조합만 인용했으며, 3곳 미만에서만 보인 338종은 개수만 세고 값은 적지 않았습니다.