나흘 전과 같은 20초가, 3.8배 빠르게 다시 왔다
어제 우리 허니팟은 관측 이래 가장 붐볐습니다. 세션 3,553건, 명령 7,574개. 그런데 서버로 내려온 악성 실행파일은 한 건도 없었고, 어떤 세션 하나는 나흘 전 기록과 일곱 개 값이 똑같았습니다. 다른 것은 걸린 시간 하나뿐이었습니다.

휴대폰에 찍어 둔 영상 두 개를 나란히 놓고 본 적 있나요. 작년에 찍은 것과 어제 찍은 것. 장소도 같고, 움직이는 순서도 같고, 화면에 나오는 물건 개수까지 같습니다. 다른 건 딱 하나, 걸린 시간입니다.
여기서 알 수 있는 건 두 가지입니다. 하나는 “같은 걸 두 번 찍어 뒀으니 빨라졌다는 걸 안다” — 이건 맞습니다. 다른 하나는 “같은 사람이 찍은 거다” — 이건 모릅니다. 화면에 찍는 사람은 안 나오니까요.
어제 우리 서버에 남은 기록이 딱 그 두 번째 영상이었습니다.
어제 20시 34분, 아니 UTC 11시 34분
사실
어제 11:34:14Z, ATK-F604B7(45.6.x.x)가 텔넷으로 로그인에 성공했습니다. 텔넷은 아주 오래된 원격 접속 방식입니다. 쉽게 말해 인터넷 너머에서 그 기계의 명령창을 직접 두드릴 수 있게 열어 두는 통로인데, 비밀번호가 암호화되지 않고 그대로 흘러갑니다.
사실
머문 시간은 약 19.7초입니다. 11:34:33Z 에 끊겼습니다. 그 20초 안에 명령 22개를 넣고 파일 11개를 받아갔습니다. 1초에 명령 한 줄 이상을 넣은 속도입니다(초당 약 1.12개). 파일은 2초에 한 개꼴로 들어왔습니다(초당 약 0.56건).
사실 그런데 분류된 의도는 딱 하나였습니다. ‘방어 무력화’ — 지키는 장치를 꺼 버리려는 행동으로 분류된 명령입니다.
사실 이 세션의 completeness 값은 42로 어제 전체 최고값입니다. completeness 는 “이 세션을 얼마나 온전히 들여다봤는가”에 매겨진 점수인데, 어떻게 계산하는지는 데이터에 없습니다. 의도가 하나뿐인 세션이 왜 최고점인지 우리도 설명하지 못합니다. 이건 뒤에서 다시 말하겠습니다.
받아간 파일 11개가 전부 빈 파일이었습니다
사실 이 별칭만 전달 출처로 갖는 검체는 한 종류뿐이고, 관측 횟수가 11회입니다. 세션의 다운로드 수 11과 맞습니다.
사실
그 한 종류가 이겁니다. 1바이트. 종류를 알아볼 표식이 아예 없는 파일입니다(very short file (no magic)). 파일 맨 앞에는 보통 “나는 실행파일이다”, “나는 그림이다” 하는 짧은 표식이 붙어 있는데, 이 파일에는 그게 없습니다. 붙일 자리가 없기 때문입니다.
사실 1바이트는 글자 하나입니다. 11개를 다 합쳐도 11바이트, 글자 열한 개입니다. 20초 동안 열한 번 오간 것이 그게 전부였습니다.
추정 여기서 멈추겠습니다. 다운로드가 실패해서 껍데기만 남은 것인지, 원래 그렇게 동작하는 것인지 우리는 모릅니다. 명령 원문이 없고 화면 녹화 내용도 이 기록에 담기지 않아서, 이 파일로 무엇을 하려 했는지도 말할 수 없습니다.
나흘 전 영상과 나란히 놓아 보면
사실
8월 18일 기록에 ATK-ABE8B7 이라는 세션이 있습니다. 어제 세션과 나란히 놓으면 이렇습니다.
8/18 ATK-ABE8B7 |
어제 ATK-F604B7 |
|
|---|---|---|
| 접속 방식 | 텔넷 | 텔넷 |
| 로그인 | 성공 | 성공 |
| 실행한 명령 | 22개 | 22개 |
| 받아간 파일 | 11건 | 11건 |
| 분류된 의도 | ‘방어 무력화’ 하나 | ‘방어 무력화’ 하나 |
| 그 파일의 정체 | 1바이트 빈 파일 (01ba4719…) |
1바이트 빈 파일 (01ba4719…) |
| 전달 출처 | 1곳 | 1곳 |
| completeness | 42 | 42 |
| 머문 시간 | 약 75초 | 약 19.7초 |
사실 일곱 줄이 같습니다. 파일의 지문(sha256 해시)까지 같은 값입니다. 다른 것은 마지막 줄 하나, 약 3.8배 빨라진 시간입니다.
사실 그런데 이 ’3.8배’는 대략의 비교입니다. 8/18 의 ’약 75초’는 그날 기록에 적힌 값을 그대로 가져온 것이고, 어제의 19.7초는 시작·종료 시각으로 직접 계산한 것입니다. 두 값을 같은 방식으로 잰 것인지 확인할 방법이 없습니다.
사실
그리고 여기가 중요합니다. 같은 곳에서 온 것인지는 알 수 없습니다. 우리는 출발지 IP 를 그대로 두지 않고 ATK- 로 시작하는 별칭으로 바꿔서 기록합니다. 이때 소금(salt)이라는 값을 섞기 때문에, 같은 IP 라도 날짜가 다르면 다른 별칭이 됩니다. 8/18 의 ATK-ABE8B7 과 어제의 ATK-F604B7 이 같은 곳인지, 이 기록으로는 맞춰 볼 수 없습니다.
사실 확인되는 것은 여기까지입니다. 세션의 모양이 같고 파일의 지문이 같다. 이건 같은 도구, 같은 자동 실행 순서를 썼다는 뜻이지 같은 조직, 같은 사람이라는 뜻이 아닙니다. 영상 두 개가 같아도 찍은 사람은 화면에 안 나옵니다.
사실 한 가지 더. ’방어 무력화’라는 분류는 8/16·8/17·8/18 에 하루 1회씩 있다가 8/19 에 0회, 8/20·8/21 에는 항목 자체가 사라졌습니다. 어제 다시 1회로 나타났습니다. 8/18 과 어제, 그 1회는 둘 다 completeness 42 짜리 세션에 붙어 있습니다.
가장 붐빈 밤, 내려온 실행파일은 0개
사실 어제 숫자는 이렇습니다. 세션 3,553건, 로그인 시도 3,324회, 실행된 명령 7,574개. 셋 다 아카이브 엿새 중 최대입니다. 직전 최대와 비교하면 세션은 2,607건(8/20), 명령은 2,966개(8/18)였으니 명령은 두 배 반으로 뛰었습니다.
사실 하루 전체를 덮는 수치라고 보면, 로그인 시도 3,324회는 26초에 한 번꼴로 누군가 비밀번호를 넣어 본 셈입니다. 세션 3,553건은 24초에 한 번꼴로 새 접속이 들어온 것입니다. (다만 이 기록에 관측 구간이 명시돼 있지 않아, 하루 전체를 가정한 계산입니다.)
사실 텔넷이 특히 튀었습니다. 포트 2223(텔넷) 1,203건. 그저께 281건이었으니 하루 만에 약 4.3배입니다. 이전 최대치가 8/18 의 370건이었으니 그것의 약 3.3배입니다. 전체 세션에서 텔넷이 차지한 비중은 33.9% 로 엿새 중 가장 높습니다(8/16 12.0% → 8/17 22.0% → 8/18 18.3% → 8/19 22.0% → 8/20 11.4% → 8/21 15.2%).
사실
그런데 어제 저장된 검체 5종 중 리눅스 실행파일(ELF)은 한 건도 없습니다. ELF 는 리눅스에서 쓰는 실행파일 형식입니다. 윈도우의 .exe 에 해당한다고 보면 됩니다. 어제 남은 것은 이게 전부입니다.
| 크기 | 정체 | 관측 |
|---|---|---|
| 306바이트 | POSIX 셸 스크립트 | 출처 15곳 · 15회 |
| 1,608바이트 | Bourne-Again 셸 스크립트 | 출처 1곳 · 1회 |
| 389바이트 | OpenSSH RSA 공개키 | 출처 8곳 · 8회 |
| 9바이트 | ASCII 텍스트 | 출처 1곳 · 13회 |
| 1바이트 | 표식 없는 빈 파일 | 출처 1곳 · 11회 |
사실 셸 스크립트는 명령을 순서대로 적어 둔 메모지입니다. 사람이 한 줄씩 치는 대신 파일 하나를 실행하면 적힌 순서대로 돌아갑니다. 306바이트면 문단 하나 정도, 1,608바이트면 A4 반 장 정도의 글자 분량입니다.
추정 정리하면 어제는 문은 가장 많이 두들겨 맞았는데, 안으로 배달된 것은 없었던 날입니다. 지표만 보면 관측 이래 최악의 날인데, 실제로 도착한 물건 칸은 비어 있습니다.
’안 온 것’을 기록으로 남기려면
사실
우리는 URL 12개를 감시 목록에 올려 두고 있습니다. 전부 hxxp://31[.]77[.]227[.]121/bins/ 아래의 parm·parm5·parm6·parm64·parm7·pm68k·pmips·pmpsl·pppc·psh4·pspc·x86_64 입니다. 주소는 일부러 망가뜨려 적었습니다(hxxp://, [.]) — 그대로 복사해 붙여 넣어도 접속되지 않습니다.
사실 이 12개는 그냥 얻어진 게 아닙니다. UPX 라는 압축으로 싸여 있던 파일을 풀어야만 나온 주소들입니다. 압축된 겉면만 봐서는 주소가 하나도 보이지 않습니다.
사실 어제 이 12개 주소에서 내려온 것은 0건입니다. 8/20·8/21 에 이어 사흘 연속입니다.
사실
또 그저께(8/21) 처음 나타나 실행파일 두 개를 내보냈던 유포지 176[.]65[.]139[.]196 은 어제 기록에 아예 없습니다.
추정 이 12개를 미리 적어 두지 않았다면, 어제 기록에는 “안 왔다“는 사실 자체가 남지 않습니다. 안 온 것을 관측하려면 무엇이 올 수 있었는지를 먼저 알고 있어야 하니까요. 아무것도 안 적혀 있는 칸과, 적어 둔 목록이 전부 0 인 칸은 다릅니다.
사실 그래도 여기서 한 걸음 더 나가지는 않겠습니다. 유포지가 실제로 멈춘 것인지, 그 요청이 우리 허니팟 쪽으로만 오지 않은 것인지 이 데이터로는 구분할 수 없습니다. 그저께 세웠던 “유포지가 새 주소로 옮겨갔다”는 읽기도 어제 데이터로 이어지지도, 뒤집히지도 않았습니다. 옛 주소도 0건, 새 주소도 0건입니다.
어제 하루를 시간 순서로
하루치를 순서대로 늘어놓으면 이렇게 됩니다. 11:34 두 줄의 초 단위를 눈여겨보세요. 그리고 그 위에 있는 세 줄 — 00:25·02:04·03:57 의 지속 시간과 명령 개수가 서로 얼마나 닮았는지도 함께 보시면 좋습니다.
- 사실 ATK-4D7724(125.224.x.x) 텔넷 로그인 성공. 약 69.4초 · 명령 31개 · 다운로드 1건. 의도 3종 — 파일 다운로드 · 실행 권한 부여 · 다운로드 후 실행. completeness 16. TTY 녹화됨(내용 미포함). 텔넷이라 지문·클라이언트 값은 빈 문자열이다. 이 별칭은 306바이트 POSIX 셸 스크립트(a6296a79…, hxxp://185[.]93[.]89[.]72/wget)의 전달 출처 목록에 있다
- 사실 ATK-383112(125.229.x.x) 텔넷 로그인 성공. 약 67.3초 · 명령 31개 · 다운로드 1건. 의도·completeness(16)·다운로드 수가 ATK-4D7724 와 완전히 동일하다. 이 별칭도 a6296a79… 의 전달 출처 목록에 있다
- 사실 ATK-80B5C2(220.80.x.x) 텔넷 로그인 성공. 약 68.9초 · 명령 31개 · 다운로드 1건. 세 번째로 같은 형태다. 다만 이 별칭은 a6296a79… 의 전달 출처 표기 목록(10개)에는 없다 — 이 검체의 실제 출처는 15곳인데 목록은 10개까지만 표기돼 있다
- 사실 명령 31개 · 다운로드 1건 · 의도 3종 · completeness 16 이라는 이 형태는 8/20 에 4건(ATK-7B6CFE · ATK-2E51DB · ATK-127D9E · ATK-CC119E), 8/21 에 1건(ATK-E07AC3), 어제 3건으로 사흘에 걸쳐 8건이다. 지속 시간도 8/20 약 67.9~75.8초, 8/21 약 85.0초, 어제 약 67.3~69.4초로 모두 1분대다
- 사실 ATK-5A0689(107.161.x.x) 텔넷 로그인 성공. 약 61.0초 · 명령 17개. 의도 5종으로 어제 최다 — 정찰(시스템) · 파일 다운로드 · 실행 권한 부여 · 다운로드 후 실행 · 지속성(SSH 키 심기). 그런데 다운로드는 0건이다. completeness 17. 8/18(ATK-C17F4E) · 8/19(ATK-103570) · 8/20(ATK-B4B2E2) · 8/21(ATK-4CA329)에 이어 다섯 번째로 같은 형태
- 사실 어제의 주제 세션. ATK-F604B7(45.6.x.x) 텔넷 로그인 성공. 약 19.7초 · 명령 22개(초당 약 1.12개) · 다운로드 11건(초당 약 0.56건). 의도는 '방어 무력화' 단독. completeness 42 로 어제 전체 최고값. TTY 녹화됨(내용 미포함)
- 사실 이 별칭을 유일한 전달 출처로 갖는 검체는 sha256 01ba4719… 한 종뿐이고 관측 횟수가 11 이다 — 세션의 다운로드 수 11 과 일치한다. 1바이트, 종류를 알아볼 표식이 없는 빈 파일이다. 19.7초 안에 받아간 11개가 전부 같은 빈 파일이다
- 사실 8/18 기록의 ATK-ABE8B7 세션과 일곱 값이 일치한다 — 텔넷 · 로그인 성공 · 명령 22개 · 다운로드 11건 · 의도 '방어 무력화' 단독 · 11건 전부 1바이트 빈 파일(동일 해시 01ba4719…) · 출처 1곳 · completeness 42. 다른 것은 지속 시간뿐으로, 8/18 기록상 약 75초에서 어제 약 19.7초로 약 3.8배 빨라졌다. 별칭은 소금을 섞어 만들므로 두 출발지가 같은 곳인지는 알 수 없다
- 사실 '방어 무력화'가 어제 1회로 사흘 만에 다시 나타났다 — 8/16 1회, 8/17 1회, 8/18 1회, 8/19 0회, 8/20 항목 없음, 8/21 항목 없음, 어제 1회. 8/18 과 어제는 그 1회가 completeness 42 세션에 붙어 있다
- 사실 검체 5종의 관측 횟수 합이 15+13+11+8+1=48 로, 의도 분류의 '파일 다운로드' 48회와 정확히 같다. 또 '파일 다운로드' 48회와 '다운로드 후 실행' 48회도 서로 같다 — 아카이브 엿새 중 이 두 값이 일치한 날은 어제가 처음이다(8/19 40대38, 8/20 43대41, 8/21 109대107)
- 사실 306바이트 POSIX 셸 스크립트(a6296a79…, hxxp://185[.]93[.]89[.]72/wget)가 서로 다른 출처 15곳에서 15회 관측됐다. 8/17(6곳) · 8/18(13곳) · 8/19(7곳) · 8/20(8곳) · 8/21(5곳)에 이어 엿새 연속 같은 해시 · 같은 URL 이며, 출처 수 15곳은 엿새 중 최대다
- 사실 389바이트 OpenSSH RSA 공개키(a8460f44…)가 서로 다른 출처 8곳에서 8회 관측됐다. URL 은 기록돼 있지 않다. 8/16 10곳 → 8/17 → 8/18 16곳 → 8/19 12곳 → 8/20 8곳 → 8/21 10곳 → 어제 8곳으로 이레 연속 같은 해시다
- 사실 hxxp://5[.]182[.]210[.]174/ok 에서 1,608바이트 Bourne-Again 셸 스크립트가 1회 내려왔다(6ff53177…, 출처 ATK-10149C 한 곳). 같은 URL · 같은 1,608바이트인데 해시는 8/17~8/19 6aa5054a… → 8/20 b7728639… → 8/21 c850a285… · 7a5dcc03…(하루에 두 종) → 어제 6ff53177… 로 바뀌었다. 닷새 동안 해시 5종이다
- 사실 감시 목록의 12개 URL(31[.]77[.]227[.]121/bins/ 계열)에서 어제도 다운로드가 0건이다 — 8/20 · 8/21 에 이어 사흘 연속. 8/21 에 처음 등장했던 유포지 176[.]65[.]139[.]196 도 어제 기록에 없다. 결과적으로 어제 저장된 검체 중 ELF 실행 바이너리는 0건이다(아카이브상 ELF 가 기록된 날은 8/16 · 8/19 · 8/21, 없던 날은 8/18 · 8/20 · 어제)
- 사실 9바이트 ASCII 텍스트(4af5a5c9…)가 출처 1곳(ATK-BECAD3)에서 13회 관측됐다. 8/18 12회 → 8/20 8회 → 8/21 5회 → 어제 13회이며, 언제나 출처는 한 곳이다
- 사실 의도 분류 — 정찰(시스템) 1,980회, 실행 권한 부여 271회, 다운로드 후 실행 48회, 파일 다운로드 48회, 지속성(SSH 키 심기) 9회, 흔적 삭제 8회, 방어 무력화 1회. 합계 2,365회다. 전체 명령 7,574개 중 정찰(시스템)은 약 26.1%로, 8/20 약 77% · 8/21 약 60.4%에서 크게 떨어졌다. '정찰 — 네트워크'는 어제 항목이 없다
- 사실 세션 3,553건 / 고유 출발지 205곳 / 로그인 시도 3,324회 / 명령 7,574개 / TTY 녹화 2,988건. 포트 2222(SSH) 2,350건, 포트 2223(텔넷) 1,203건. 세션 · 명령 · 로그인 시도 모두 아카이브 엿새 중 최대이고, 텔넷 1,203건은 8/21(281건)의 약 4.3배 · 직전 최대치(8/18 370건)의 약 3.3배다. 반면 고유 출발지 205곳은 8/21 과 같고 엿새 중 중간 수준이다(8/18 249, 8/17 236)
- 사실 출발지 한 곳당 평균 약 17.3세션(3,553÷205) · 약 16.2회 로그인 시도(3,324÷205)로 엿새 중 최고다(8/20 약 14.1세션 · 12.2회). 세션당 명령은 약 2.13개다
- 사실 자격증명 조합 admin/admin 이 서로 다른 IP 29곳에서 105회 관측됐다 — 곳당 약 3.6회다. 반면 nobody/nobody 는 5곳에서 105회로 곳당 약 21회, root/admin 은 5곳에서 71회로 곳당 약 14.2회다. 345gs5662d34/345gs5662d34 는 8곳에서 8회, 즉 곳당 정확히 1회다
- 사실 SSH 클라이언트 지문 클러스터 총 40개로 엿새 중 최다다(8/17 33 → 8/18 36 → 8/19 37 → 8/20 37 → 8/21 38 → 어제 40). 최대 클러스터는 f555226df1963d1d3c09daf865abdc9a(SSH-2.0-libssh_0.9.6), 어제 IP 8곳 · 누적 182곳. 목록에 오른 10개 클러스터 전부 검체 전달 없음으로, 8/21 에 이어 이틀 연속 0개다
사실
표에서 눈에 걸리는 줄이 둘 있습니다. 하나는 08:14 의 ATK-5A0689 — 의도가 5종으로 가장 넓은데 다운로드는 0건입니다. 이 형태는 8/18 부터 닷새째 반복됩니다. 다른 하나는 위쪽 세 줄입니다. 00:25·02:04·03:57 이 명령 31개·다운로드 1건·completeness 16 까지 똑같습니다. 새벽에 같은 모양이 세 번 지나갔다는 뜻입니다. 어제만의 일이 아닙니다 — 8/20 에 4건, 8/21 에 1건, 어제 3건으로 사흘에 걸쳐 여덟 번입니다.
지문이 잡히는 층과, 실제로 뚫리는 층
사실 SSH 로 들어오는 접속에는 클라이언트 지문이 남습니다. 접속 프로그램이 처음 건네는 인사말의 구성이 도구마다 조금씩 달라서, 그 값을 묶으면 “출발지는 달라도 같은 프로그램”이라는 걸 알 수 있습니다. 어제 이 지문 묶음은 40개로 엿새 중 가장 많았습니다.
사실 그런데 어제 완결성 상위 5개 세션은 전부 텔넷입니다. 지문·클라이언트 값이 다섯 건 모두 빈 문자열입니다. 텔넷에는 그 인사말 절차가 애초에 없습니다.
사실 그리고 목록에 오른 10개 지문 묶음은 하나도 검체를 내려보내지 않았습니다. 8/21 에 이어 이틀 연속 0개입니다.
추정 정리하면, 지문이 잡히는 층(SSH · 2,350세션)과 실제로 뚫려서 명령이 실행되는 층(텔넷 · 1,203세션)이 어제도 갈라져 있었습니다. 그리고 어제는 그 텔넷 층이 하루 만에 4.3배로 커졌습니다.
사실
그래서 어제 주제 세션을 8/18 세션과 잇는 근거는 지문이 아닙니다. 세션의 모양(명령 22개·다운로드 11건·의도 조합·completeness 42)과 파일 지문(01ba4719…)뿐입니다. 그리고 앞에서 말했듯 그건 같은 도구를 썼다는 뜻이지 같은 사람이라는 뜻이 아닙니다. 지문 값 역시 빌드의 지문이지 사람의 지문이 아닙니다 — 같은 배포판의 기본 접속 프로그램을 쓰는, 서로 모르는 사람들도 같은 값을 갖습니다.
어떻게 들어왔나 — 어제도 비밀번호입니다
사실 어제 로그인 시도는 3,324회, 출발지는 205곳입니다. 한 곳당 평균 약 16.2회씩 두드린 셈이고, 이건 엿새 중 최고입니다(8/20 약 12.2회).
사실 서로 다른 IP 3곳 이상에서 관측된 조합만 추리면 이렇습니다.
| 아이디 | 비밀번호 | 관측된 IP 수 |
|---|---|---|
| admin | admin | 29곳 |
| 345gs5662d34 | 345gs5662d34 | 8곳 |
| root | root | 7곳 |
| support | support | 7곳 |
| root | 12345 | 6곳 |
| nobody | nobody | 5곳 |
| root | admin | 5곳 |
| admin | password | 5곳 |
| user | user | 5곳 |
| root | 1234 | 5곳 |
| guest | guest | 5곳 |
| admin | 123456 | 5곳 |
| user | 1234 | 5곳 |
| root | 123456 | 4곳 |
| root | pass | 4곳 |
| root | password | 4곳 |
| admin | 1111 | 4곳 |
| node | node | 4곳 |
| root | 111111 | 4곳 |
| root | 12345678 | 4곳 |
사실
여기서 두드리는 방식이 갈립니다. admin/admin 은 IP 29곳에서 105회 — 한 곳이 서너 번쯤 넣어 보고 갑니다. 29곳은 엿새 중 가장 넓게 퍼진 값입니다(8/20 14곳, 8/21 18곳). 반대로 nobody/nobody 는 IP 5곳뿐인데 똑같이 105회 — 한 곳이 스물한 번씩 두드렸습니다. root/admin 도 5곳에서 71회, 곳당 약 14.2회입니다. 그리고 345gs5662d34/345gs5662d34 는 8곳에서 8회, 곳당 정확히 한 번입니다. 넓게 한 번씩 훑는 쪽과 좁게 파고드는 쪽이 같은 날 같이 왔습니다.
사실 그리고 703개 조합은 싣지 않았습니다. 서로 다른 IP 3곳 미만에서만 나온 것들입니다(8/16 934 → 8/17 830 → 8/18 1,388 → 8/19 848 → 8/20 440 → 8/21 806 → 어제 703). 한 곳에서만 나온 조합은 어딘가에서 실제로 유출된 누군가의 계정일 수 있어서, 값은 쓰지 않고 개수만 셉니다.
사실 어제도 CVE 나 익스플로잇을 참조한 침투 경로는 없었습니다. 전부 자격증명이었습니다.
남기고 간 것
어제 관측된 검체와 주소 전부입니다. 값을 누르면 복사됩니다 — 해시는 읽으라고 있는 게 아니라 차단 목록에 넣으라고 있습니다. hxxp:// 와 [.] 는 그대로 두었습니다.
01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b1바이트, 종류를 알아볼 표식이 없는 빈 파일 · 출처 1곳(ATK-F604B7) · 11회 · URL 미기록 · 어제 주제 세션의 다운로드 11건이 전부 이 파일이다. 아카이브 대조상 8/17 121회·출처 2곳, 8/18 11회·출처 1곳(ATK-ABE8B7), 8/21 11회·출처 1곳(ATK-792ADF), 어제 11회·출처 1곳a6296a79f44e21b76604d2d2bbf795d2cf380f70e39d45fbf166707ff3b4a6a4306바이트 POSIX 셸 스크립트 · 출처 15곳 · 15회 · 8/17~8/21 과 같은 해시·같은 URL 로 엿새 연속이며 출처 수는 엿새 중 최대. 표기된 전달 출처는 ATK-D010F9 · ATK-B90DD3 · ATK-0880CE · ATK-7458D7 · ATK-DD3BCB · ATK-3651BF · ATK-4D7724 · ATK-383112 · ATK-C6FE9B · ATK-3C87E3 (목록은 10개까지만 표기)hxxp://185[.]93[.]89[.]72/wget위 스크립트의 주소. 엿새 연속 같은 주소·같은 해시a8460f446be540410004b1a8db4083773fa46f7fe76fa84219c93daa1669f8f2389바이트 OpenSSH RSA 공개키 · 출처 8곳(ATK-E72D06 · ATK-6CFD54 · ATK-FFD724 · ATK-AA7FC7 · ATK-C54B57 · ATK-170A8F · ATK-44ED6E · ATK-9B8F5C) · 8회 · URL 미기록 · 8/16~8/21 과 같은 해시로 이레 연속4af5a5c98ad132095c6fbe7b02c242153a190a01cc321e50a916a0ca46fbaa629바이트 ASCII 텍스트 · 출처 1곳(ATK-BECAD3) · 13회 · URL 미기록 · 8/18·8/20·8/21 에도 같은 해시·같은 별칭이 있었고 어제 회수가 가장 많다6ff531776b388e36fd967aa5e38be7b44d1d98c6ad03c5da0a2dbed7f33828e01,608바이트 Bourne-Again 셸 스크립트 · 출처 1곳(ATK-10149C) · 1회 · 같은 URL·같은 크기인데 해시는 8/17~8/19 6aa5054a…, 8/20 b7728639…, 8/21 c850a285…·7a5dcc03…, 어제 6ff53177… 로 닷새간 5종이다hxxp://5[.]182[.]210[.]174/ok위 스크립트의 주소. 주소도 크기도 그대로인데 내용만 바뀐다hxxp://31[.]77[.]227[.]121/bins/ 계열 12건 (parm · parm5 · parm6 · parm64 · parm7 · pm68k · pmips · pmpsl · pppc · psh4 · pspc · x86_64)압축을 풀어야만 나왔던 감시 목록. 어제도 다운로드 0건으로 사흘 연속이며, 계속 목록에 올려 둔다사실
목록에서 hxxp://5[.]182[.]210[.]174/ok 줄이 눈에 걸립니다. 주소도 같고 크기도 1,608바이트로 같은데 해시만 다릅니다. 8/17~8/19 에 한 종, 8/20 에 한 종, 8/21 에 두 종, 어제 또 한 종 — 닷새 동안 다섯 종류입니다. 같은 자리에 놓인 파일이 조용히 바뀌었다는 뜻입니다. “이 파일은 위험함”이라고 해시에 이름표를 붙여 막는 방식이 왜 자꾸 늦는지, 이 한 줄이 답입니다. 무엇이 달라졌는지는 내용을 담지 않으므로 말할 수 없습니다.
사실
그리고 389바이트 OpenSSH RSA 공개키가 이레째 같은 해시로 나옵니다. 어제는 출처 8곳입니다. 389바이트면 짧은 문자 한 통 정도의 크기입니다. 이 작은 파일이 authorized_keys(허용된 열쇠 목록)에 한 줄로 들어가면, 비밀번호 없이 들어올 수 있는 열쇠가 현관에 하나 걸립니다. 비밀번호를 전부 바꿔도 그 열쇠는 남습니다.
공격 단계로 옮기면
관측된 행동을 MITRE ATT&CK 라는 국제 분류표에 대응시키면 이렇습니다. ID 를 누르면 원문 설명을 직접 볼 수 있습니다 — 우리 말을 믿지 않고 확인하셔도 됩니다. 전부 [추정]입니다. 우리가 본 것은 명령이지 공격자의 의도가 아닙니다.
- 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추정
- T1562Impair Defenses추정
사실
마지막 줄 T1562(방어 무력화)에는 단서를 붙여야 합니다. 이건 어제 단 1회로 분류된 의도 하나에만 근거한 항목입니다. 명령 원문이 없어 무엇을 무력화하려 했는지 말할 수 없기 때문에, 더 세부적인 하위 기법은 붙이지 않았습니다.
어디서 본 것 같다면
추정
2016년부터 이어진 Mirai 봇넷 계열과 진입 구조가 같습니다. 텔넷 기본 비밀번호로 들어간 뒤 웹 서버에서 작은 셸 스크립트를 내려받고, /bins/ 경로에 있는 CPU 종류별 실행파일을 차례로 시도하는 방식입니다. 어제 인용한 자격증명 20건이 전부 기본값·단순 조합이라는 점, 완결 세션 5건이 전부 텔넷·비밀번호 경로라는 점, 그리고 감시 목록 12개의 파일 이름 규칙(p + CPU 종류)이 이 방식과 맞습니다. 미국 법무부 기소·유죄인정 기록이 남아 있고 여러 벤더의 공개 분석 보고서가 있는 사건입니다.
사실 이 사례가 짚어 주는 게 하나 있습니다. 소스가 공개된 계열이라, 서로 아무 관계 없는 운영자들이 각자 같은 규칙으로 유포지를 세우고 같은 순서를 돌리는 것이 흔합니다. 어제의 “나흘 간격으로 똑같은 모양의 세션”도 그 방향과 어긋나지 않습니다.
사실 다만 이 사례가 어제의 개별 판단까지 확인해 주지는 않습니다. 8/18 세션과 어제 세션의 관계도, 유포지가 멈춘 것인지 여부도 마찬가지입니다. 그리고 어제는 ELF 실행파일이 한 건도 관측되지 않아 배포 단계 자체가 확인되지 않았습니다.
그래서 뭘 해야 하나
추정 어제 데이터가 가리키는 순서입니다.
- 텔넷 같은 원격 접속을 끕니다. 어제 텔넷은 전체 세션의 33.9%로 하루 만에 4.3배가 됐고, 완결 세션 5건은 전부 텔넷입니다. 텔넷은 비밀번호가 그대로 흘러가고, 키 인증이라는 선택지 자체가 없습니다 — 끄는 것 말고 방법이 없습니다. 공유기·홈캠 설정에서 “원격 접속”, “Telnet”, “원격 관리”를 찾아 꺼 두시면 됩니다. 그리고 비중을 기준으로 방어 순서를 정하면 그 기준 자체가 하루 만에 바뀝니다. 그저께 15%였던 것이 어제 34%입니다.
- 기본 계정·초기 비밀번호를 바꿉니다. 로그인 시도 3,324회, 완결 세션 5건은 전부 로그인 성공입니다. 어제 실행된 명령 7,574개는 전부 로그인에 성공한 뒤에 실행된 것이고, 이건 엿새 중 최대치입니다. 위 표의 조합을 쓰고 계시다면 그게 전부입니다.
- 로그인 실패 횟수를 제한합니다. 같은 출발지가 하루에 열일곱 번씩 다시 들어오고, 한 조합을 스물한 번씩 재시도해도 아무것도 걸리지 않았습니다. 게다가 어제 주제 세션은 20초면 끝났습니다. “오래 붙어 있는 연결”이나 “천천히 쌓이는 시도”를 기준으로 잡은 임계값에는 애초에 걸리지 않습니다.
- 장비가 밖에서 파일을 받아오지 못하게 막습니다. 어제 파일 다운로드 48회, 실행 권한 부여 271회, 다운로드 후 실행 48회입니다. 밖으로 나가는 연결이 막혀 있었다면
ATK-4D7724·ATK-383112·ATK-80B5C2·ATK-F604B7네 세션은 다운로드 단계에서 전부 끊깁니다. 어제 아웃바운드는 열려 있었는데도 실행파일이 안 왔습니다 — 그러니까 어제의 조용함은 우리 방어가 만든 것이 아니라 상대 쪽 사정입니다. ~/.ssh/authorized_keys파일이 바뀌면 알림을 받습니다. 어제 키 심기 의도 9회, 같은 해시 공개키를 남긴 출처 8곳입니다.ATK-5A0689는 검체를 한 건도 저장하지 못한 세션인데도 키 심기 단계까지 분류됐습니다. 특히 어제처럼 실행파일이 0건인 날에는 백신이 잡을 파일 자체가 없습니다. 키 파일을 직접 들여다보지 않으면 뚫렸다는 사실 자체를 모릅니다.- 로그를 장비 밖에 저장합니다. 흔적 삭제가 8회, 방어 무력화가 1회 관측됐습니다. 그리고 어제 이 글이 성립한 이유가 로그입니다. TTY 녹화 2,988건이 있었기에 20초짜리 세션 안에서 명령 22개와 다운로드 11건이 어떻게 흘렀는지 되짚을 수 있었고(내용은 이 글에 포함하지 않습니다), 나흘치 기록을 지우지 않았기에 “8/18 과 같은 모양이 3.8배 빨라졌다”는 걸 알 수 있었습니다. 하루치만 보면 알 수 없는 것입니다.
사실 “비밀번호 대신 키 인증을 쓰세요”는 어제 데이터로는 중간 정도의 권고입니다. 어제 로그인이 성공한 완결 세션은 전부 텔넷이고, 텔넷에는 키 인증이 없습니다. 그리고 3,324회 중 SSH 몫이 얼마인지 데이터가 나눠 주지 않아, “키 인증을 켰다면 어제 침투가 막혔다”고 말할 근거가 없습니다.
어제 하루 전체
| 세션 | 3,553건 |
| 고유 IP | 205곳 |
| 로그인 시도 | 3,324회 |
| 실행된 명령 | 7,574개 |
| SSH (2222) | 2,350건 |
| 텔넷 (2223) | 1,203건 |
출발지 한 곳당 평균 약 17.3세션, 약 16.2회 시도입니다. 세션 하나당 명령은 약 2.13개입니다.
어제 관측된 유포지·C2(185[.]93[.]89[.]72, 5[.]182[.]210[.]174)와 감시 목록의 31[.]77[.]227[.]121 은 C-TAS 로 신고했습니다. 어제 신고분의 초점은 새 주소가 아니라 엿새 연속 같은 해시를 뿌리는 185[.]93[.]89[.]72 와 닷새간 해시 5종을 돌린 5[.]182[.]210[.]174 입니다. 전송 계층 성공만 확인되며, KISA 측 적재 여부는 별도 확인이 필요합니다.
60초로 보기
같은 관측분을 짧은 영상으로도 만들었습니다. 영상은 받아간 파일 11개가 전부 비어 있었다는 쪽에 초점을 맞췄습니다.
우리가 모르는 것
이 블로그는 아는 것과 모르는 것을 나눠서 씁니다. 어제 관측분에서 확인할 수 없었던 것들입니다.
- 어제 세션과 8/18 세션이 같은 출발지인지. 일곱 값이 일치하지만 별칭은 소금을 섞어 만들므로 맞춰 볼 수 없습니다. 확인되는 것은 세션의 모양과 검체 해시가 같다는 것까지이며, 이는 같은 도구·같은 자동 실행 순서를 썼다는 뜻이지 같은 조직·같은 사람이라는 뜻이 아닙니다.
- ’약 3.8배’가 정확한 비교인지. 8/18 의 ’약 75초’는 그날 기록에 적힌 값을 인용한 것이고, 어제의 약 19.7초는 시작·종료 시각으로 직접 계산했습니다. 두 값을 같은 방식으로 냈는지 확인할 수 없습니다.
ATK-F604B7의 completeness 가 왜 42 인지. 의도가 ‘방어 무력화’ 하나뿐인데 어제 최고값입니다. 계산식이 데이터에 없어 설명할 수 없습니다. 8/18(ATK-ABE8B7, 42)·8/21(ATK-792ADF, 의도 0개인데 43)에도 같은 항목이 미해결로 남아 있습니다.- 1바이트 빈 파일이 11회 반복 저장된 이유. 다운로드 실패의 결과인지 의도된 동작인지 알 수 없습니다. 명령 원문과 화면 녹화 내용이 없어 이 파일로 무엇을 하려 했는지도 말할 수 없습니다. 8/17·8/18·8/21 에도 같은 항목이 남아 있습니다.
- ‘방어 무력화’ 1회가 정말 이 세션의 것인지. 데이터가 명시하지 않습니다. 이 세션의 의도가 그것 하나이고 어제 전체 카운트도 1회라 그렇게 읽었지만, 세션과 의도 카운트를 1:1 로 이어 주는 항목은 없습니다.
- 검체 5종의 관측 횟수 합 48 과 ‘파일 다운로드’ 48회가 같은 것이 우연인지. 데이터가 두 값을 연결해 주지 않습니다. 또 389바이트 공개키는 8/17 기록에서 “다운로드가 아니라 세션 안에서 만들어진 것”으로 적혀 있어, 이 8건을 다운로드로 합산하는 것이 타당한지도 판단해 주지 않습니다.
- 명령 7,574개와 의도 분류 합계 2,365회의 차이 5,209 가 왜 이렇게 큰지. 엿새 중 가장 큰 차이입니다(8/21 은 1,910 대 1,575 로 차이 335). 한 명령이 여러 의도로 분류되는지, 분류되지 않는 명령이 있는지, 어제 미분류가 급증한 이유가 무엇인지 설명이 없습니다. 정찰(시스템) 비중이 26.1%로 떨어진 것도 같은 원인일 수 있으나 확인할 수 없습니다.
- 텔넷이 4.3배로 늘어난 이유. 고유 출발지는 205곳으로 그저께와 같습니다. 같은 곳들이 더 자주 들어온 것인지 다른 곳들이 들어온 것인지 데이터가 구분해 주지 않습니다.
- 8/21 의 유포지
176[.]65[.]139[.]196이 어제 없는 이유. 하루짜리 관측이었는지, 계속 살아 있는데 우리 쪽으로만 오지 않은 것인지 구분할 수 없습니다. 그저께의 “유포지가 옮겨갔다”는 읽기는 어제 데이터로 이어지지도, 부정되지도 않았습니다. - 감시 목록 12개가 사흘 연속 0건인 이유. 유포지가 멈춘 것인지 우리 허니팟에 그 요청이 오지 않은 것인지 마찬가지로 구분할 수 없습니다.
ATK-80B5C2가 받아간 1건이 무엇인지. 다운로드 수는 1인데a6296a79…의 전달 출처 표기 목록(10개)에는 없습니다. 실제 출처는 15곳이고 목록은 10개까지만 표기되므로 나머지 5곳 안에 있을 수 있지만, 확인할 수 없습니다.ATK-5A0689가 다운로드에 실패한 것인지, 받았는데 저장이 안 된 것인지. 의도에는 ‘파일 다운로드’·’다운로드 후 실행’이 있는데 다운로드 수는 0 입니다. 8/18·8/19·8/20·8/21 에 이어 다섯 번째입니다.- 의도 목록이 실행 순서를 뜻하는지. 명시돼 있지 않아, 이 글은 의도 배열의 순서를 단계 진행 순서로 읽지 않았습니다.
hxxp://5[.]182[.]210[.]174/ok가 닷새 동안 다섯 종류를 내보낸 이유. 요청마다 새로 만들어지는 것인지 짧은 주기로 교체되는 것인지 알 수 없고, 내용을 담지 않으므로 무엇이 달라졌는지도 말할 수 없습니다.- 9바이트 ASCII 텍스트(
4af5a5c9…)가 무엇인지. 내용이 기록에 없습니다. 전달 출처는 1곳인데 관측은 13회입니다. - 같은 해시 공개키를 8곳이 남긴 이유. 같은 도구를 쓴 결과인지 키를 공유한 결과인지 알 수 없습니다. 별칭 때문에 8/16~8/21 의 출처 수(10 → … → 16 → 12 → 8 → 10 → 어제 8곳)를 날짜 간 합산하거나 같은 출발지로 추적할 수도 없습니다.
- 지문 목록이 상위 몇 개인지 전수인지. 클러스터 총계는 40인데 목록은 10개입니다. 따라서 “어제 검체를 전달한 클러스터가 없다”는 것은 그 10개 범위 안에서의 사실입니다.
0425c279…(SSH-2.0-PuTTY_Release_0.70)가 언제 처음 관측된 것인지. 어제도 당일 3곳 = 누적 3곳입니다. 8/21 기록도 같은 값으로 “그날 처음 관측된 클러스터”라고 적었습니다. 같은 IP 3곳이 이틀 연속 들어온 것인지 누적 집계 방식이 다른 것인지 구분할 수 없고, 누적 집계의 시작 시점도 명시돼 있지 않습니다.SSH-2.0-ZGrab ZGrab SSH Survey(지문dd9bcf09…, 어제 IP 2곳·누적 38곳)의 성격. 공개된 인터넷 스캐너 도구의 이름이지만, 연구·측정 목적인지 공격 준비인지 이 데이터로는 구분할 수 없습니다.- Discord 웹훅 URL 1건. 어느 세션·어느 검체와 연결되는지 명시돼 있지 않아 어제 사실 관계에 넣지 않았습니다. 8/20·8/21 도 같은 이유로 제외했습니다.
- 집계 수치가 하루 전체를 덮는지. 주요 세션이 UTC 00:25~11:34 에 걸쳐 있고 생성 시각은 15:05Z 입니다. 관측 구간이 명시돼 있지 않습니다. 위에서 “26초에 한 번꼴”이라고 쓴 것도 하루 전체를 가정한 계산이며, 세션·명령 수가 급증한 것이 집계 구간이 달라졌기 때문일 가능성도 배제할 수 없습니다.
tty_recordings_available(174)·samples_on_honeypot(45)과 집계 TTY 녹화(2,988건)의 관계. 설명이 없습니다.- C-TAS 신고의 적재·활용 여부. 전송 계층 성공만 확인됐습니다.
- 배경 취약점 통계(CVE 4,556건 / CISA KEV 345건 / 랜섬웨어 연계 확인 95건, EPSS 상위 CVE-2018-13379 · CVE-2022-26134 · CVE-2021-44228 · CVE-2023-4966 · CVE-2024-3400). KISA 보안공지 기반 배경 통계이며 어제 관측분과 직접 연결되지 않습니다. 어제 관측된 침투 경로는 전부 자격증명이었습니다.
그리고 애초에 확인할 수단이 없는 것들입니다. 이건 모르는 것과 다릅니다 — 추정하지 않는 쪽이 정답입니다.
- ASN·ISP — GeoIP·ASN 데이터베이스를 갖고 있지 않습니다. 추정하지 않습니다. 어제 유포지
185[.]93[.]89[.]72·5[.]182[.]210[.]174의 호스팅 사업자도 알 수 없습니다. - 지리 위치 — 동일합니다. IP 지리정보는 애초에 귀속 근거가 되지도 않습니다. 텔넷이 4.3배로 늘었지만 어디서 왔는지는 말할 수 없습니다.
- VPN·Tor·클라우드 여부 — 판별 수단이 없습니다.
- VirusTotal 탐지 결과 — 미연동입니다. 어제 저장된 검체 5종이 어떤 계열로 탐지되는지 이 데이터로는 말할 수 없습니다. 검체 분류는 MalwareBazaar 태그를 씁니다.
- User-Agent — SSH·텔넷에는 User-Agent 자체가 존재하지 않습니다. HTTP 공격은 별도 소스입니다.
- CVE 연결 — SSH·텔넷 공격은 취약점을 참조하지 않는 경우가 대부분이고, 어제 관측분도 비밀번호를 노린 것이었습니다.
영상 두 개를 나란히 놓고 보는 이야기로 시작했습니다.
어제 우리가 알아낸 것은 딱 그 정도입니다. 같은 장면이 나흘 만에 다시 지나갔고, 이번엔 3.8배 빨랐습니다. 찍은 사람이 같은 사람인지는 끝까지 모릅니다. 화면에 안 나오니까요.
그런데 이걸 알 수 있었던 이유는 하나뿐입니다. 나흘 전 영상을 지우지 않았기 때문입니다. 어제 하루치만 놓고 봤다면 “20초짜리 세션이 빈 파일 11개를 받아갔다”에서 끝났을 겁니다. 빨라졌다는 것도, 세 번째로 같은 모양이라는 것도 몰랐을 겁니다.
지금 집에 있는 공유기와 홈캠도 매일 촬영당하고 있습니다. 다만 우리 쪽에는 녹화기가 없습니다. 어제처럼 남는 것이 글자 열한 개뿐인 날에는, 백신이 잡을 것도 없고 되돌려 볼 것도 없습니다.
이 글은 2026-08-22 허니팟 관측분을 바탕으로 작성됐습니다. 출발지 IP 는 브리프의 마스킹 형태 그대로 표기했고, 유포 주소는 접속되지 않도록 변형(defang)했습니다. 인용한 자격증명은 서로 다른 IP 3곳 이상에서 관측된 20개 조합만 포함했으며, 그 미만에서만 관측된 703개 조합은 개수만 밝히고 값은 싣지 않았습니다.
