SecurityHeroblog

묶을 지문이 없을 때 남는 것 — 세션의 모양

어제 허니팟에서 완결된 텔넷 세션 네 건이 명령 개수 31개, 다운로드 1건, 머문 시간 68초대까지 똑같았습니다. 텔넷에는 접속 프로그램 지문이 존재하지 않아 평소 쓰던 묶는 방법이 통하지 않았습니다. 지문 없이 무엇으로 묶었는지, 그 묶음이 어디까지만 말해 주는지 정리했습니다.

시험 감독을 해 본 사람들이 하는 이야기가 있습니다. 이름을 가린 답안지 네 장이 걷혔는데, 맞은 문제가 같은 건 그렇다 치고 틀린 문제와 틀린 방식까지 똑같다면 — 누가 썼는지는 몰라도 네 장이 같은 데서 나왔다는 건 압니다. 필적을 감정할 필요도 없습니다. 답안지의 모양이 이미 말해 주니까요.

어제 우리 허니팟에서 나온 것이 딱 그 네 장이었습니다.

네 곳, 같은 숫자

사실 어제 완결성 상위 5개 세션 중 4건이 완전히 같은 수치를 갖습니다. ATK-7B6CFE(221.162.x.x), ATK-2E51DB(1.165.x.x), ATK-127D9E(223.80.x.x), ATK-CC119E(220.134.x.x) — 넷 다 텔넷 로그인에 성공했고, 실행한 명령은 31개, 다운로드는 1건, 분류된 의도는 3종(파일 다운로드 · 실행 권한 부여 · 다운로드 후 실행), completeness 값은 16으로 같습니다. 머문 시간도 67.9초 · 68.1초 · 75.8초 · 68.6초로 몰려 있습니다.

사실 그리고 이 네 별칭은 전부 같은 검체(sha256 a6296a79…, 306바이트 POSIX 셸 스크립트)의 전달 출처 목록에 들어 있습니다.

추정 각 세션의 다운로드가 1건이고 네 별칭이 모두 그 목록에 있으니, 그 1건이 이 스크립트일 가능성이 높습니다. 다만 데이터가 세션과 검체를 1:1로 이어 주지는 않습니다.

그런데 지문이 없습니다

여기서 평소 쓰던 방법이 막힙니다.

SSH로 들어오는 접속에는 클라이언트 지문이라는 게 남습니다. 접속 프로그램이 처음 건네는 인사말의 구성이 도구마다 조금씩 달라서, 이 값을 해시로 묶으면 “출발지는 달라도 같은 프로그램”이라는 걸 알 수 있습니다. 어제 브리프의 주제도 그거였습니다 — 지문 하나로 서로 다른 출발지를 한 도구로 묶었습니다.

사실 그런데 어제 완결 세션 5건은 전부 텔넷이고, 데이터의 지문·클라이언트 값이 전부 빈 문자열입니다. 텔넷에는 그런 인사말 절차가 애초에 없습니다. 어제 기록된 SSH 지문 클러스터는 37개인데, 이 네 세션은 그 어디에도 들어가지 않습니다.

추정 남은 축은 두 개뿐이었습니다. 세션의 모양(명령 수 · 다운로드 수 · 의도 조합 · 머문 시간)과 같은 검체 해시. 이름표가 없어도 답안지의 모양이 같으면 출처가 같다는 것까지는 말할 수 있습니다.

사실 다만 여기까지입니다. 세션 형태가 같다는 것은 같은 도구·같은 스크립트를 썼다는 뜻이지 같은 조직·같은 사람이라는 뜻이 아닙니다. 공개된 봇 소스를 각자 내려받아 돌리는, 서로 아무 관계 없는 운영자들도 똑같은 모양을 남깁니다. 같은 문제집을 푼 네 사람이 서로를 모르는 것과 같습니다.

사실 그리고 다섯 번째 세션 ATK-B4B2E2(124.221.x.x)는 이 묶음에서 벗어납니다. 의도가 5종(정찰 추가, 지속성 SSH 키 심기 포함)으로 더 넓고 completeness 17로 어제 최고값인데, 다운로드는 0건입니다.

어제의 기록

  1. 사실 ATK-7B6CFE(221.162.x.x) 텔넷 로그인 성공. 약 67.9초 · 명령 31개 · 다운로드 1건. 의도 3종 — 파일 다운로드 · 실행 권한 부여 · 다운로드 후 실행. TTY 녹화됨(내용 미포함). 텔넷이라 SSH 클라이언트 지문 없음
  2. 사실 ATK-2E51DB(1.165.x.x) 텔넷 로그인 성공. 약 68.1초 · 명령 31개 · 다운로드 1건. 의도·completeness(16)·다운로드 수가 ATK-7B6CFE 와 완전히 동일. 앞 세션 종료로부터 약 2시간 47분 뒤
  3. 사실 ATK-127D9E(223.80.x.x) 텔넷 로그인 성공. 약 75.8초 · 명령 31개 · 다운로드 1건. 역시 동일한 의도 조합·동일 completeness. 앞 세션 시작으로부터 약 1시간 24분 뒤
  4. 사실 ATK-CC119E(220.134.x.x) 텔넷 로그인 성공. 약 68.6초 · 명령 31개 · 다운로드 1건. 네 번째로 같은 형태. 간격은 2시간 47분 · 1시간 24분 · 13분 24초로 일정하지 않다
  5. 사실 ATK-B4B2E2(124.221.x.x) 텔넷 로그인 성공. 약 84.3초 · 명령 17개. 의도 5종(정찰-시스템 · 파일 다운로드 · 실행 권한 부여 · 다운로드 후 실행 · 지속성 SSH 키 심기)인데 다운로드는 0건. completeness 17 로 어제 최고값
  6. 사실 306바이트 POSIX 셸 스크립트(a6296a79…, hxxp://185[.]93[.]89[.]72/wget)가 서로 다른 출처 8곳에서 9회 관측. delivered_by 에 위 네 세션의 별칭이 모두 있고, 나머지 4곳은 ATK-91BE20 · ATK-CAD57F · ATK-15AAF6 · ATK-215E05
  7. 사실 이 해시·이 URL 은 8/17 · 8/18(출처 13곳) · 8/19(출처 7곳)에도 동일하게 기록돼 있다. 어제 8곳 — 나흘 연속 같은 해시, 같은 유포지
  8. 사실 389바이트 OpenSSH RSA 공개키(a8460f44…)가 출처 8곳에서 8회 관측. URL 미기록. 8/16 10곳 → 8/17 12곳 → 8/18 16곳 → 8/19 12곳 → 어제 8곳으로 닷새 연속 동일 해시이며 출처 수는 이틀째 감소
  9. 사실 hxxp://5[.]182[.]210[.]174/ok 에서 1,608바이트 Bourne-Again 셸 스크립트가 내려왔다(b7728639…, 출처 ATK-10149C 한 곳·1회). 8/18·8/19 는 같은 URL·같은 1,608바이트인데 해시가 6aa5054a… 였다 — 파일이 교체됐다
  10. 사실 8/19 에 실제 다운로드가 발생했던 hxxp://31[.]77[.]227[.]121/bins/ 계열 URL 은 어제 다운로드 기록에 한 건도 없다. 이 12개 URL 은 감시 지표로 계속 올라 있다
  11. 사실 의도 분류 — 정찰(시스템) 2,100회, 실행 권한 부여 172회, 파일 다운로드 43회, 다운로드 후 실행 41회, 지속성(SSH 키 심기) 9회, 흔적 삭제 8회. '방어 무력화'와 '정찰 — 네트워크'는 항목 자체가 없다. 전체 명령 2,723개 중 정찰(시스템)이 약 77%
  12. 사실 세션 2,607건 / 고유 출발지 185곳 / 로그인 시도 2,251회 / 명령 2,723개 / TTY 녹화 2,185건. 포트 2222(SSH) 2,310건, 포트 2223(텔넷) 297건 — 텔넷은 약 11.4%인데 완결 세션 5건은 전부 텔넷
  13. 사실 SSH 클라이언트 지문 클러스터 총 37개. 최대는 f555226df1963d1d3c09daf865abdc9a(SSH-2.0-libssh_0.9.6), 어제 IP 8곳·누적 155곳, 검체 전달 없음. 목록 9개 중 검체를 전달한 클러스터는 98ddc5604ef6a1006a2b49a58759fbe6(SSH-2.0-Go, 어제 IP 2곳·누적 13곳) 하나뿐
  14. 사실 8/19 완결 세션 3건을 묶었던 지문 16443846184eafde36765c9bab2f4397(SSH-2.0-Go)은 어제 지문 목록에 없다

소수가 여러 번 들어온 날

사실 어제는 세션 2,607건에 고유 출발지가 185곳뿐이었습니다. 아카이브 나흘 중 세션은 가장 많고 출발지는 가장 적습니다(8/18 2,027건/249곳, 8/19 1,361건/216곳). 출발지 한 곳당 약 14.1세션입니다.

사실 로그인 시도는 2,251회, 출발지당 평균 약 12.2회입니다. 서로 다른 IP 3곳 이상에서 관측된 조합만 추리면 이렇습니다.

아이디 비밀번호 관측된 IP 수
admin admin 14곳
345gs5662d34 345gs5662d34 8곳
root 1234 6곳
root 123456 5곳
root root 5곳
support support 5곳
alex 12345678 4곳
root 3245gs5662d34 4곳
root password 4곳
ubuntu ubuntu 4곳
user user 4곳

사실 그리고 440개 조합은 싣지 않았습니다. 서로 다른 IP 3곳 미만에서만 관측된 것들입니다(8/16 934 → 8/17 830 → 8/18 1,388 → 8/19 848 → 어제 440으로 닷새 중 최소). 한 곳에서만 나온 조합은 어딘가에서 실제로 유출된 누군가의 계정일 수 있어서, 값은 쓰지 않고 개수만 셉니다.

사실 어제도 CVE나 익스플로잇을 참조한 경로는 관측되지 않았습니다. 전부 자격증명 경로였습니다.

남긴 것들

sha256
a6296a79f44e21b76604d2d2bbf795d2cf380f70e39d45fbf166707ff3b4a6a4306바이트 POSIX 셸 스크립트 · 출처 8곳·9회 · 어제 주제인 네 세션의 별칭이 모두 전달 출처에 있다 · 8/17·8/18·8/19 와 동일 해시로 나흘 연속
url
hxxp://185[.]93[.]89[.]72/wget위 스크립트를 내려받은 주소. 나흘 연속 같은 URL
sha256
a8460f446be540410004b1a8db4083773fa46f7fe76fa84219c93daa1669f8f2389바이트 OpenSSH RSA 공개키 · 출처 8곳·8회 · URL 미기록 · 8/16~8/19 와 동일 해시로 닷새 연속
sha256
b7728639ed5087692d5cbf214f16c968b0a5a6e7c185b0f07d6a25e645d8dfe51,608바이트 Bourne-Again 셸 스크립트 · 출처 ATK-10149C 한 곳·1회 · 8/18·8/19 는 같은 URL·같은 크기인데 해시가 6aa5054a… 였다
url
hxxp://5[.]182[.]210[.]174/ok위 스크립트를 내려받은 주소. URL 과 크기는 그대로인데 파일이 바뀌었다
sha256
4af5a5c98ad132095c6fbe7b02c242153a190a01cc321e50a916a0ca46fbaa629바이트 ASCII 텍스트 · 출처 1곳(ATK-BECAD3)·8회 · URL 미기록 · 8/18·8/19 에도 같은 해시
sha256
3631b048df83cc9de347152cebd93e695012381670cb65294967729ac66b9c1d12바이트 ASCII 텍스트 · 출처 1곳(ATK-C146AD)·1회 · URL 미기록 · 8/19 에도 같은 해시·같은 별칭

주소는 일부러 망가뜨려 적었습니다(hxxp://, [.]). 그대로 붙여 넣어도 접속되지 않습니다.

사실 hxxp://5[.]182[.]210[.]174/ok 줄에 눈이 갑니다. 주소도 그대로, 크기도 1,608바이트 그대로인데 해시만 바뀌었습니다. 같은 자리에 놓인 파일이 조용히 교체됐다는 뜻입니다. 무엇이 달라졌는지는 내용을 담지 않으므로 말할 수 없습니다.

사실 반대로, 8/19에 실제 다운로드가 있었던 hxxp://31[.]77[.]227[.]121/bins/ 계열 12개 URL은 어제 한 건도 관측되지 않았습니다. 이 12개는 압축된 검체를 풀어야만 나오는 주소라 겉면에는 하나도 없던 지표입니다.

추정 미리 뽑아 감시 목록에 올려 두었기 때문에 “어제는 조용했다”도 관측 결과로 남습니다. 감시하지 않았다면 8/19의 부활도, 어제의 침묵도 데이터가 되지 않았을 겁니다. 다만 유포지가 멈춘 것인지 우리 쪽으로만 안 온 것인지는 구분할 수 없습니다.

공격 단계로 옮기면

관측된 행동을 MITRE ATT&CK 기법으로 옮기면 이렇습니다. 전부 [추정]입니다 — 우리가 본 것은 명령이지 공격자의 의도가 아닙니다.

  • T1110.001Brute Force: Password Guessing추정
  • T1078Valid Accounts추정
  • T1059.004Command and Scripting Interpreter: Unix Shell추정
  • T1082System Information Discovery추정
  • T1105Ingress Tool Transfer추정
  • T1222.002File and Directory Permissions Modification: Linux and Mac추정
  • T1098.004Account Manipulation: SSH Authorized Keys추정
  • T1070Indicator Removal추정

어디서 본 것 같다면

추정 2016년부터 이어진 Mirai 봇넷 계열과 진입 구조가 같습니다. 텔넷 기본 자격증명으로 들어간 뒤 웹 서버에서 셸 스크립트를 내려받아 CPU 아키텍처별 바이너리를 순서대로 시도하는 방식입니다. 어제 감시 목록에 오른 12개 파일명 규칙(parm, parm5, parm64, pmips, psh4, x86_64 …)이 이 관습과 일치하고, 완결 세션 5건이 전부 텔넷·자격증명 경로라는 점도 부합합니다. 소스가 공개된 계열이라 서로 무관한 운영자들이 같은 루틴을 돌리는 일이 흔하다는 점도 어제 관측과 방향이 같습니다.

미국 법무부 기소·유죄인정 기록이 남아 있고 여러 벤더의 공개 분석 보고서가 있는 사건입니다. 다만 어제의 주제 — 지문 없이 세션 모양으로 묶었다는 것 — 은 이 사례가 검증해 주는 부분이 아닙니다. 비슷하다는 말로 넘어가면 안 되는 자리라 따로 적어 둡니다.

그래서 뭘 해야 하나

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

  1. 텔넷을 끕니다. 어제 텔넷은 전체 세션의 약 11.4%로 나흘 중 비중이 가장 낮은데, 완결 세션 5건은 전부 텔넷입니다. 세션 수 비중으로 우선순위를 정하면 실제로 뚫리는 11%를 놓칩니다. 텔넷은 인증정보가 평문으로 흐르고, 키 인증이라는 선택지가 존재하지 않습니다 — 프로토콜을 끄는 것 외에 방법이 없습니다.
  2. 초기 비밀번호를 바꿉니다. 로그인 시도 2,251회, 완결 세션 5건은 전부 로그인 성공입니다. 위 표의 조합을 쓰고 계시다면 그게 전부입니다.
  3. 로그인 실패 횟수를 제한합니다. 출발지당 평균 14.1세션인데 아무것도 걸리지 않았습니다. 게다가 세션 하나가 1분 남짓이라 “오래 붙어 있는 연결”을 기준으로 잡은 임계값에는 애초에 걸리지 않습니다.
  4. 장비에서 밖으로 나가는 연결을 막습니다. 아웃바운드가 막혀 있었다면 네 세션은 다운로드 단계에서 전부 끊깁니다. 다만 이것만으로는 부족합니다 — ATK-B4B2E2는 다운로드가 0건인데도 키 심기 단계까지 분류됐습니다.
  5. ~/.ssh/authorized_keys 파일의 변경을 알림으로 받습니다. 어제 키 심기 의도 9회, 같은 해시 공개키를 남긴 출처 8곳입니다. 비밀번호를 전부 바꿔도 이미 들어간 키는 남습니다.
  6. 로그를 장비 밖에 저장합니다. 흔적 삭제가 8회 관측됐습니다. 어제 네 곳이 같은 모양이었다는 사실 자체를 알아낼 수 있었던 것은 TTY 녹화 2,185건이 남아 있었기 때문입니다(내용은 이 글에 포함하지 않습니다).

어제 하루 전체

세션 2,607건
고유 IP 185곳
로그인 시도 2,251회
실행된 명령 2,723개
SSH (2222) 2,310건
텔넷 (2223) 297건

명령 2,723개는 전부 로그인에 성공한 뒤에 실행된 것입니다.

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

60초로 보기

같은 관측분을 짧은 영상으로도 만들었습니다.

우리가 모르는 것

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

  • 네 세션이 같은 명령을 같은 순서로 실행했는지. 수치는 완전히 일치하지만 명령 원문과 TTY 리플레이가 브리프에 없습니다. 확인되는 것은 명령 개수 · 다운로드 수 · 의도 조합 · completeness 값이 같다는 것까지입니다.
  • 그 다운로드 1건이 정말 a6296a79…인지. 가능성은 높지만 데이터가 세션과 검체를 1:1로 연결해 주지 않습니다.
  • 의도 배열이 실행 순서를 뜻하는지. 명시돼 있지 않아 단계 진행 순서로 해석하지 않았습니다.
  • 세션 모양이 같다는 것이 같은 조직이라는 뜻인지. 아닙니다. 같은 도구·같은 스크립트를 썼다는 뜻이고, 공개 소스 봇을 각자 돌리는 무관한 운영자들도 같은 모양을 남깁니다.
  • ATK-B4B2E2가 다운로드에 실패한 것인지, 받았는데 저장이 안 된 것인지. 의도에는 ‘파일 다운로드’·’다운로드 후 실행’이 있는데 download_count는 0입니다. 8/18(ATK-C17F4E)·8/19(ATK-103570)에 이어 세 번째로 같은 형태입니다.
  • completeness 값(네 세션 16, ATK-B4B2E2 17)이 왜 그 값인지. 산식이 데이터에 없습니다. 8/18·8/19에도 같은 항목이 미해결로 남아 있습니다.
  • 명령 총계 2,723개와 의도 분류 합계 2,373회가 어긋나는 이유. 한 명령이 여러 의도로 분류되는지, 분류되지 않는 명령이 있는지 설명이 없습니다.
  • 네 세션의 시작 간격이 불규칙한 이유. 2시간 47분 → 1시간 24분 → 13분입니다. 일정한 주기로 도는 자동화인지, 여러 출발지가 각자의 시각에 돈 것인지 알 수 없습니다.
  • 8/16~8/19의 출처들이 어제 출처와 겹치는지. 별칭(ATK-XXXXXX)은 소금을 섞어 만듭니다. ATK-CAD57F·ATK-215E05·ATK-10149C·ATK-BECAD3·ATK-C146AD가 이전 브리프에도 같은 검체와 함께 나오지만, 소금 처리 방식이 문서화돼 있지 않아 날짜 간 동일 출발지의 근거로 쓰지 않았습니다.
  • 따라서 공개키를 심은 출처 수(10 → 12 → 16 → 12 → 8곳)를 합산할 수 없고, 이틀 연속 줄어든 이유도 데이터로 알 수 없습니다.
  • hxxp://5[.]182[.]210[.]174/ok의 파일이 왜 바뀌었는지. 크기는 같고 해시만 다릅니다. 내용을 담지 않으므로 무엇이 달라졌는지도 말할 수 없습니다.
  • hxxp://31[.]77[.]227[.]121/bins/ 계열이 어제 0건인 이유. 유포지가 멈춘 것인지 우리 허니팟에 그 요청이 오지 않은 것인지 구분할 수 없습니다.
  • 8/19 완결 세션을 묶었던 지문 16443846…이 어제 목록에 없는 이유. 지문 목록이 상위 몇 개만 담긴 것인지 전수인지 명시돼 있지 않습니다(클러스터 총계는 37인데 목록은 9개입니다).
  • 9바이트·12바이트 ASCII 텍스트가 무엇인지. 내용이 브리프에 없습니다. 4af5a5c9…는 전달 출처가 1곳인데 관측은 8회입니다.
  • Discord 웹훅 URL 1건. 어느 세션·어느 검체와 연결되는지 명시돼 있지 않아 어제 사실 관계에 넣지 않았습니다.
  • 같은 해시 공개키를 8곳이 남긴 이유. 같은 도구를 쓴 결과인지 키를 공유한 결과인지 알 수 없습니다. 8/16~8/19에도 같은 항목이 미해결로 남아 있습니다.
  • 집계 수치가 하루 전체를 덮는지. 주요 세션이 UTC 02:15~07:43에 걸쳐 있는데 생성 시각은 15:05Z입니다. 관측 구간이 명시돼 있지 않습니다.
  • tty_recordings_available(116)·samples_on_honeypot(36)과 집계 TTY 녹화(2,185건)의 관계. 설명이 없습니다.
  • C-TAS 신고의 적재·활용 여부. 전송 계층 성공만 확인됐습니다.
  • 배경 취약점 통계(CVE 4,532건 / CISA KEV 344건 / 랜섬웨어 연계 확인 95건, EPSS 상위 CVE-2018-13379 · CVE-2022-26134 · CVE-2021-44228 · CVE-2023-4966 · CVE-2024-3400). KISA 보안공지 기반 배경 통계이며 어제 관측분과 직접 연결되지 않습니다.

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

  • ASN·ISP — GeoIP·ASN 데이터베이스를 갖고 있지 않습니다. 추정하지 않습니다.
  • 지리 위치 — 동일합니다. IP 지리정보는 애초에 귀속 근거가 되지도 않습니다.
  • VPN·Tor·클라우드 여부 — 판별 수단이 없습니다.
  • VirusTotal 탐지 결과 — 미연동입니다. 검체 분류는 MalwareBazaar 태그를 씁니다.
  • User-Agent — SSH·텔넷에는 User-Agent 자체가 존재하지 않습니다. HTTP 공격은 별도 소스입니다.
  • CVE 연결 — SSH·텔넷 공격은 취약점을 참조하지 않는 경우가 대부분이고, 어제 관측분도 자격증명을 노린 것이었습니다.

이름을 가린 답안지 네 장이 걷혔습니다. 누가 앉아 있었는지는 끝까지 모릅니다. 그런데 네 장이 같은 데서 나왔다는 건 압니다 — 지문이 아니라 모양이 말해 줬으니까요. 지금 인터넷에 열려 있는 장비도 매일 답안지를 한 장씩 내고 있습니다. 그 모양을 아무도 걷어 보지 않는다면, 우리가 아는 것은 계속 0입니다.


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