처음 보는 주소에서 파일 세 개 — 문패가 낯익었다
어제 우리 허니팟에 닷새 동안 한 번도 없던 새 주소가 등장했습니다. 그런데 폴더 이름도, 파일 이름 짓는 방식도 예전 주소와 똑같았습니다. 처음 본 주소를 첫날에 알아본 이유와, 그것으로 말할 수 있는 것과 없는 것을 나눠 적었습니다.

동네에 새 가게가 하나 생겼다고 해 봅시다. 한 번도 본 적 없는 자리, 처음 보는 상호입니다. 그런데 들어가 보니 이상하게 낯이 익습니다. 간판 글씨체가 같고, 메뉴판에 붙은 번호 매기는 방식이 같고, 심지어 메뉴 이름 하나는 글자까지 똑같습니다.
여기서 두 가지를 말할 수 있습니다. 하나는 “같은 매뉴얼로 차린 가게다” — 이건 맞습니다. 다른 하나는 “주인이 옮겨온 거다” — 이건 모릅니다. 같은 프랜차이즈 본사에서 매뉴얼을 받은, 서로 얼굴도 모르는 다른 사장님일 수 있으니까요.
어제 우리 서버에 찍힌 것이 딱 그 새 가게였습니다.
10.4초, 그리고 처음 보는 주소
사실
어제 08시 24분 58초, ATK-377ED5(94.154.x.x)가 텔넷으로 로그인에 성공했습니다. 텔넷은 아주 오래된 원격 접속 방식입니다. 쉽게 말해 인터넷 너머에서 그 기계의 명령창을 직접 두드릴 수 있게 열어 두는 통로인데, 비밀번호가 암호화되지 않고 그대로 흘러갑니다.
사실 머문 시간은 약 10.4초입니다. 그 사이 명령 8줄을 넣고 파일 3개를 받아갔습니다. 1.3초에 한 줄꼴입니다. 라면 물 올려놓고 뚜껑 덮는 사이에 다 끝난 셈입니다.
사실
받아간 파일 세 개는 전부 hxxp://176[.]65[.]139[.]196/bins/ 아래에서 왔습니다. 주소를 일부러 망가뜨려 적었습니다(hxxp://, [.]) — 그대로 복사해 붙여 넣어도 접속되지 않습니다.
사실
그리고 이 주소 176[.]65[.]139[.]196 은 8/16·8/17·8/18·8/19·8/20 닷새치 기록 어디에도 없습니다. 어제가 처음입니다.
파일 세 개가 무엇이었나
사실 세 개의 정체는 이렇습니다.
| 파일 | 크기 | 정체 |
|---|---|---|
kla[.]sh |
3,013바이트 | Bourne-Again 셸 스크립트 |
px86 |
133,452바이트 | ELF 32-bit LSB Intel 80386 · statically linked · stripped |
pmips |
244,420바이트 | ELF 32-bit MSB MIPS-I · statically linked · stripped |
낯선 말이 셋 있으니 그 자리에서 풀겠습니다.
- 셸 스크립트 — 명령을 순서대로 적어 둔 메모지입니다. 한 줄씩 사람이 치는 대신 파일 하나를 실행하면 적힌 순서대로 돌아갑니다. 3,013바이트면 A4 한 장 남짓한 글자 분량입니다.
- ELF — 리눅스에서 쓰는 실행파일 형식입니다. 윈도우의
.exe에 해당한다고 보면 됩니다. - statically linked · stripped(정적 링크 · 심볼 제거) — 정적 링크는 필요한 부품을 전부 안에 넣고 다닌다는 뜻입니다. 밖에서 뭘 빌리지 않으니 어느 리눅스에 갖다 놔도 돌아갑니다. 심볼 제거는 사람이 읽을 만한 이름표를 지웠다는 뜻이고, 분석을 어렵게 만듭니다.
사실 세 개를 합치면 380,885바이트입니다. 이게 10초 남짓 만에 들어왔습니다.
사실
px86 은 일반 PC 계열, pmips 는 공유기·홈캠 같은 장비 계열에서 도는 실행파일입니다. 서로 호환되지 않는 규격입니다. 아카이브 닷새치를 보면 ELF 파일이 내려온 것은 언제나 pmips 한 종류·한 개씩이었습니다. 한 세션이 두 규격을 함께 받아간 것은 어제가 처음입니다.
문패가 낯익었던 이유
여기서 새 가게 이야기로 돌아옵니다.
사실
우리는 감시 목록에 URL 12개를 올려 두고 있었습니다. 전부 hxxp://31[.]77[.]227[.]121/bins/ 아래의 parm·parm5·parm6·parm64·parm7·pm68k·pmips·pmpsl·pppc·psh4·pspc·x86_64 입니다. 규칙이 보이시나요. /bins/ 라는 폴더 이름, 그리고 p 뒤에 CPU 종류를 붙인 파일 이름.
사실 이 12개는 그냥 얻어진 게 아닙니다. UPX 라는 압축으로 싸여 있던 파일을 풀어야만 나온 주소들입니다. 압축된 겉면만 봐서는 주소가 하나도 보이지 않습니다.
사실
어제 처음 본 주소 176[.]65[.]139[.]196 이 쓴 폴더 이름도 /bins/ 였고, 파일 이름도 p + CPU 종류였습니다. pmips 는 목록에 있던 이름과 글자까지 똑같습니다.
추정 그래서 처음 보는 주소인데도 첫 관측에서 바로 같은 계열로 알아봤습니다. 메뉴판을 미리 베껴 적어 두지 않았다면, 어제 기록에는 “처음 보는 IP 에서 파일 세 개”라고만 적혔을 겁니다.
사실 한 가지는 분명히 해 두겠습니다. 어제 그 세 개의 주소는 세션에서 그대로 보였습니다. 압축을 풀어서 알아낸 게 아닙니다. 압축 해제가 준 것은 주소가 아니라 규칙이었습니다.
사실 그리고 간판이 같다는 것은 매뉴얼이 같다는 뜻이지 주인이 같다는 뜻이 아닙니다. 이 파일 이름 규칙은 소스가 공개된 계열이라, 서로 아무 관계 없는 운영자들도 각자 똑같이 씁니다.
사실
한편 예전 주소 31[.]77[.]227[.]121/bins/ 계열 12개에서는 어제도 다운로드가 0건입니다. 8/20 에 이어 이틀째입니다.
추정 “옛 가게가 닫고 새 가게로 옮겼다”고 말하고 싶어지는 자리입니다. 하지만 그 말은 하지 않겠습니다. 옛 주소가 멈춘 것인지, 그 요청이 우리 허니팟 쪽으로만 안 온 것인지 데이터가 구분해 주지 않습니다.
어제 하루를 시간 순서로
하루치를 순서대로 늘어놓으면 이렇게 됩니다. 08:24 줄의 초 단위를 눈여겨보세요. 그리고 각 줄 끝의 다운로드 건수가 서로 얼마나 다른지도 함께 보시면 좋습니다.
- 사실 ATK-E07AC3(183.95.x.x) 텔넷 로그인 성공. 약 85.0초 · 명령 31개 · 다운로드 1건. 의도 3종 — 파일 다운로드 · 실행 권한 부여 · 다운로드 후 실행. completeness 16. 8/20 브리프의 주제였던 네 세션과 수치 형태가 동일하다. TTY 녹화됨(내용 미포함). 텔넷이라 지문·클라이언트 값은 빈 문자열
- 사실 ATK-A64398(112.46.x.x) 텔넷 로그인 성공. 약 5.1초 안에 명령 19개(초당 약 3.7개) · 다운로드 2건. 의도 2종 — 파일 다운로드 · 실행 권한 부여. completeness 17. 받아간 것은 9바이트 ASCII 텍스트 두 개(1193dde1… · a9b1c85a…)이며 URL 은 기록되지 않았다
- 사실 ATK-4CA329(223.123.x.x) 텔넷 로그인 성공. 약 63.0초 · 명령 17개. 의도 5종으로 어제 최다 — 정찰(시스템) · 파일 다운로드 · 실행 권한 부여 · 다운로드 후 실행 · 지속성(SSH 키 심기). 그런데 다운로드는 0건. completeness 17. 8/18·8/19·8/20 에 이어 네 번째로 같은 형태
- 사실 어제의 주제 세션. ATK-377ED5(94.154.x.x) 텔넷 로그인 성공. 약 10.4초 · 명령 8개 · 다운로드 3건. 의도 3종 — 파일 다운로드 · 실행 권한 부여 · 다운로드 후 실행. completeness 22 로 의도가 기록된 세션 중 최고값. 세 검체 합계 380,885바이트가 10초 남짓 만에 들어왔다
- 사실 ATK-377ED5 가 유일한 전달 출처인 검체는 정확히 3건이고 세션의 다운로드 수도 3이다. ① hxxp://176[.]65[.]139[.]196/bins/kla[.]sh — 3,013바이트 Bourne-Again 셸 스크립트(bb36568c…) ② hxxp://176[.]65[.]139[.]196/bins/px86 — 133,452바이트 ELF 32-bit LSB Intel 80386, statically linked·stripped(979bd80a…) ③ hxxp://176[.]65[.]139[.]196/bins/pmips — 244,420바이트 ELF 32-bit MSB MIPS-I, statically linked·stripped(ed6bae21…)
- 사실 호스트 176[.]65[.]139[.]196 은 8/16~8/20 다섯 개 브리프 어디에도 없다. 어제가 첫 관측이다. 또 아카이브에서 ELF 가 내려온 URL 은 hxxp://31[.]77[.]227[.]121/bins/pmips 하나뿐이었고 언제나 한 세션에 한 개씩이었다 — 한 세션이 x86 과 MIPS 를 함께 받아간 것은 어제가 처음
- 사실 ATK-792ADF(218.154.x.x) 텔넷 로그인 성공. 약 23.7초 · 명령 48개(어제 최다) · 다운로드 12건(어제 최다) · completeness 43 으로 어제 전체 최고값. 그런데 의도 배열이 비어 있다 — 하나도 분류되지 않았다. 이 별칭이 유일한 전달 출처인 검체는 1바이트 파일(01ba4719…, 11회)과 202바이트 POSIX 셸 스크립트(0c99433c…, 1회)이며 11+1=12 로 다운로드 수와 맞는다
- 사실 hxxp://5[.]182[.]210[.]174/ok 에서 1,608바이트 Bourne-Again 셸 스크립트가 내려왔는데, 어제 하루에 서로 다른 해시 두 개가 기록됐다 — c850a285… 와 7a5dcc03…. 둘 다 1,608바이트, 둘 다 출처 ATK-10149C 한 곳·각 1회. 같은 URL·같은 크기가 8/18·8/19 에는 6aa5054a…, 8/20 에는 b7728639… 였다. 나흘에 걸쳐 해시 4종이고 그중 2종이 어제 하루 안에 나왔다
- 사실 306바이트 POSIX 셸 스크립트(a6296a79…, hxxp://185[.]93[.]89[.]72/wget)가 출처 5곳에서 5회 관측. 전달 출처는 ATK-3F4FA3 · ATK-42B427 · ATK-D9B325 · ATK-E07AC3 · ATK-338C04. 8/17·8/18(13곳)·8/19(7곳)·8/20(8곳)에 이어 닷새 연속 같은 해시·같은 URL 이며 출처 수는 최저값
- 사실 389바이트 OpenSSH RSA 공개키(a8460f44…)가 서로 다른 출처 10곳에서 10회 관측. URL 미기록. 8/16 10곳 → 8/17 12곳 → 8/18 16곳 → 8/19 12곳 → 8/20 8곳 → 어제 10곳으로 엿새 연속 같은 해시
- 사실 압축을 풀어야만 나왔던 12개 URL(31[.]77[.]227[.]121/bins/ 계열)에서는 어제도 다운로드가 0건 — 8/20 에 이어 이틀 연속. 이 12건은 감시 목록에 계속 올라 있다
- 사실 의도 분류 — 정찰(시스템) 1,154회, 실행 권한 부여 181회, 파일 다운로드 109회, 다운로드 후 실행 107회, 흔적 삭제 12회, 지속성(SSH 키 심기) 11회, 정찰(네트워크) 1회. 전체 명령 1,910개 중 정찰(시스템)이 약 60.4%. '정찰 — 네트워크'는 8/20 에 항목 자체가 없었는데 어제 1회 다시 나타났고, '방어 무력화'는 어제도 항목이 없다
- 사실 세션 1,845건 / 고유 출발지 205곳 / 로그인 시도 1,519회 / 명령 1,910개 / TTY 녹화 1,250건. 포트 2222(SSH) 1,564건, 포트 2223(텔넷) 281건 — 텔넷은 전체의 약 15.2%인데 완결성 상위 5개 세션은 어제도 전부 텔넷(8/20 11.4%, 8/19 22%, 8/18 18%)
- 사실 자격증명 조합 nobody/nobody 는 서로 다른 IP 4곳에서만 나왔는데 시도는 151회 — 한 곳당 약 37.8회. 반대로 admin/admin 은 IP 18곳에서 35회로 곳당 약 2회. 같은 '빈출 조합'이라도 두드리는 방식이 정반대다
- 사실 SSH 클라이언트 지문 클러스터 총 38개(8/17 33 → 8/18 36 → 8/19 37 → 8/20 37 → 어제 38). 최대 클러스터는 f555226df1963d1d3c09daf865abdc9a(SSH-2.0-libssh_0.9.6), 어제 IP 11곳·누적 169곳. 목록에 오른 8개 클러스터 전부 검체 전달 없음 — 8/20 에는 전달한 클러스터가 1개 있었는데 어제는 0개. 0425c279610910d2d9aef3b285e59b86(SSH-2.0-PuTTY_Release_0.70)은 어제 IP 3곳·누적 3곳으로 누적과 당일이 같다
사실
표에서 눈에 걸리는 줄이 둘 있습니다. 하나는 05:51 의 ATK-4CA329 — 의도가 5종으로 가장 넓은데 다운로드는 0건입니다. 다른 하나는 14:00 의 ATK-792ADF — 명령도 다운로드도 어제 최다인데 의도가 하나도 분류되지 않았습니다. 둘 다 어제 주제로 삼지 않은 이유가 여기 있습니다. 숫자는 커도 무슨 일이 있었는지 설명할 근거가 없습니다.
지문이 잡히는 층과, 실제로 뚫리는 층
사실 SSH 로 들어오는 접속에는 클라이언트 지문이 남습니다. 접속 프로그램이 처음 건네는 인사말의 구성이 도구마다 조금씩 달라서, 그 값을 묶으면 “출발지는 달라도 같은 프로그램”이라는 걸 알 수 있습니다. 어제 이 지문 묶음은 38개로 아카이브 닷새 중 가장 많았습니다.
사실 그런데 어제 완결성 상위 5개 세션은 전부 텔넷이고, 지문·클라이언트 값이 전부 빈 문자열입니다. 텔넷에는 그 인사말 절차가 애초에 없습니다.
사실 목록에 오른 8개 지문 묶음은 하나도 검체를 내려보내지 않았습니다. 8/20 에는 하나 있었는데 어제는 0개입니다.
추정 정리하면, 지문이 잡히는 층(SSH · 1,564세션)과 실제로 파일이 내려오는 층(텔넷 · 281세션)이 어제도 갈라져 있었습니다. 세션 수만 보면 텔넷은 15.2% 입니다. 그 비중으로 방어 순서를 정하면 실제로 뚫린 100% 를 놓칩니다.
사실 그리고 지문은 빌드의 지문이지 사람의 지문이 아닙니다. 같은 배포판의 기본 접속 프로그램을 쓰는, 서로 모르는 사람들도 같은 값을 갖습니다.
어떻게 들어왔나 — 어제도 비밀번호입니다
사실 어제 로그인 시도는 1,519회입니다. 관측 구간을 하루로 놓고 보면 1분에 한 번꼴로 문고리를 돌려본 셈입니다. 출발지는 205곳이니 한 곳당 평균 약 7.4회입니다.
사실 서로 다른 IP 3곳 이상에서 관측된 조합만 추리면 이렇습니다.
| 아이디 | 비밀번호 | 관측된 IP 수 |
|---|---|---|
| admin | admin | 18곳 |
| 345gs5662d34 | 345gs5662d34 | 10곳 |
| root | root | 8곳 |
| root | admin | 5곳 |
| nobody | nobody | 4곳 |
| oracle | oracle | 4곳 |
| user | user | 4곳 |
| root | 12345 | 4곳 |
| root | 1234 | 4곳 |
| root | 3245gs5662d34 | 4곳 |
| ubuntu | 123456789 | 3곳 |
| admin | abc123 | 3곳 |
| portal | portal | 3곳 |
| kali | kali | 3곳 |
| ubuntu | rootroot | 3곳 |
| root | qwe123456 | 3곳 |
| chris | 123456 | 3곳 |
| root | password | 3곳 |
| clawdbot | clawdbot | 3곳 |
| admin | 1qaz@WSX | 3곳 |
사실
여기서 두드리는 방식이 갈립니다. admin/admin 은 IP 18곳에서 35회 — 한 곳이 두 번쯤 넣어 보고 갑니다. 반대로 nobody/nobody 는 IP 4곳뿐인데 151회 — 한 곳이 서른여덟 번씩 두드렸습니다. 넓게 한 번씩 훑는 쪽과, 좁게 파고드는 쪽이 같은 날 같이 왔습니다.
사실 그리고 806개 조합은 싣지 않았습니다. 서로 다른 IP 3곳 미만에서만 나온 것들입니다(8/16 934 → 8/17 830 → 8/18 1,388 → 8/19 848 → 8/20 440 → 어제 806). 한 곳에서만 나온 조합은 어딘가에서 실제로 유출된 누군가의 계정일 수 있어서, 값은 쓰지 않고 개수만 셉니다.
사실 어제도 CVE 나 익스플로잇을 참조한 침투 경로는 없었습니다. 전부 자격증명이었습니다.
남기고 간 것
어제 관측된 검체와 주소 전부입니다. 값을 누르면 복사됩니다 — 해시는 읽으라고 있는 게 아니라 차단 목록에 넣으라고 있습니다. hxxp:// 와 [.] 는 그대로 두었습니다.
bb36568c1f0a4f4d604cc67f8692506291eb1ffd217a451ffc846c94daa094403,013바이트 Bourne-Again 셸 스크립트 · 출처 1곳(ATK-377ED5)·1회 · 신규 유포지에서 내려온 첫 번째 파일hxxp://176[.]65[.]139[.]196/bins/kla[.]sh위 스크립트의 주소. 이 호스트는 아카이브 8/16~8/20 에 없던 신규 유포지다979bd80a9ffde500946e02911d2824eab5fb25c265086b6569e6fff6977d21a6133,452바이트 ELF 32-bit LSB Intel 80386, statically linked·stripped · 출처 1곳(ATK-377ED5)·1회 · 아카이브에 x86 ELF 다운로드 기록은 없었다 — 어제가 처음hxxp://176[.]65[.]139[.]196/bins/px86위 실행파일의 주소ed6bae2157415fa2477745b620368c5056d2a57a0c8a98648cd9352f8f3e248d244,420바이트 ELF 32-bit MSB MIPS-I, statically linked·stripped · 출처 1곳(ATK-377ED5)·1회 · 파일명 pmips 는 감시 목록의 31[.]77[.]227[.]121/bins/pmips 와 같지만 호스트가 다르고 크기도 8/16 51,104바이트·8/19 52,272바이트의 약 4.7배다hxxp://176[.]65[.]139[.]196/bins/pmips위 실행파일의 주소. 폴더 규칙과 파일명 규칙이 감시 목록과 겹친다c850a2851bfe46c6761f09b21368f167afa8b2745800618ebbb926caf7fa80ba1,608바이트 Bourne-Again 셸 스크립트 · 출처 ATK-10149C·1회 · 아래 7a5dcc03… 과 같은 URL·같은 크기인데 해시가 다르다 — 어제 하루에 두 종류7a5dcc03b6274d723da5ff6fe15a8a4b332daa6f56a928fd64f65d04f4ba1f0b1,608바이트 Bourne-Again 셸 스크립트 · 출처 ATK-10149C·1회 · 8/18·8/19 는 6aa5054a…, 8/20 은 b7728639… 로 같은 URL·같은 크기·다른 해시가 나흘째hxxp://5[.]182[.]210[.]174/ok위 두 스크립트의 주소. 주소도 크기도 그대로인데 내용만 바뀐다a6296a79f44e21b76604d2d2bbf795d2cf380f70e39d45fbf166707ff3b4a6a4306바이트 POSIX 셸 스크립트 · 출처 5곳(ATK-3F4FA3 · ATK-42B427 · ATK-D9B325 · ATK-E07AC3 · ATK-338C04)·5회 · 8/17~8/20 과 같은 해시·같은 URL 로 닷새 연속이며 출처 수는 최저hxxp://185[.]93[.]89[.]72/wget위 스크립트의 주소. 닷새 연속 같은 주소a8460f446be540410004b1a8db4083773fa46f7fe76fa84219c93daa1669f8f2389바이트 OpenSSH RSA 공개키 · 출처 10곳·10회 · URL 미기록 · 8/16~8/20 과 같은 해시로 엿새 연속01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b1바이트 파일(내용을 알아볼 표식이 없음) · 출처 1곳(ATK-792ADF)·11회 · URL 미기록 · 이 세션의 다운로드 12건 중 11건이 이 파일이다0c99433c7d433d65ab890dcee20b330f262379d532bc76f91e18f09ecfa5fb54202바이트 POSIX 셸 스크립트 · 출처 1곳(ATK-792ADF)·1회 · URL 미기록4af5a5c98ad132095c6fbe7b02c242153a190a01cc321e50a916a0ca46fbaa629바이트 ASCII 텍스트 · 출처 1곳(ATK-BECAD3)·5회 · URL 미기록 · 8/18·8/19·8/20 에도 같은 해시·같은 별칭1193dde1c831808bf6f2db6f5b850b846b8a7f870873ec3b8a347f21cc5d96e39바이트 ASCII 텍스트 · 출처 1곳(ATK-A64398)·1회 · URL 미기록a9b1c85a7bd78dd1112ecc75c9070ea8c53078831a17aa09ebeb287fe6e21b729바이트 ASCII 텍스트 · 출처 1곳(ATK-A64398)·1회 · URL 미기록 · 위 1193dde1… 과 함께 이 세션의 다운로드 2건을 이룬다사실
목록 가운데 hxxp://5[.]182[.]210[.]174/ok 두 줄이 눈에 걸립니다. 주소도 같고 크기도 1,608바이트로 같은데 해시만 다릅니다. 같은 자리에 놓인 파일이 조용히 바뀌었다는 뜻입니다. 8/18·8/19 · 8/20 · 어제 두 번 — 나흘에 걸쳐 네 종류이고, 그중 둘이 어제 하루 안에 나왔습니다. “이 파일은 위험함”이라고 해시에 이름표를 붙여 막는 방식이 왜 자꾸 늦는지, 이 두 줄이 답입니다. 무엇이 달라졌는지는 내용을 담지 않으므로 말할 수 없습니다.
사실
그리고 389바이트 OpenSSH RSA 공개키가 엿새째 같은 해시로 나옵니다. 어제는 출처 10곳입니다. 389바이트면 문자 메시지 두 줄 정도의 크기입니다. 이 작은 파일이 authorized_keys(허용된 열쇠 목록)에 한 줄로 들어가면, 비밀번호 없이 들어올 수 있는 열쇠가 현관에 하나 걸립니다. 비밀번호를 전부 바꿔도 그 열쇠는 남습니다.
공격 단계로 옮기면
관측된 행동을 MITRE ATT&CK 라는 국제 분류표에 대응시키면 이렇습니다. ID 를 누르면 원문 설명을 직접 볼 수 있습니다 — 우리 말을 믿지 않고 확인하셔도 됩니다. 전부 [추정]입니다. 우리가 본 것은 명령이지 공격자의 의도가 아닙니다.
- T1110.001Brute Force: Password Guessing추정
- T1078Valid Accounts추정
- T1059.004Command and Scripting Interpreter: Unix Shell추정
- T1082System Information Discovery추정
- T1016System Network Configuration Discovery추정
- T1105Ingress Tool Transfer추정
- T1222.002File and Directory Permissions Modification: Linux and Mac추정
- T1098.004Account Manipulation: SSH Authorized Keys추정
- T1070Indicator Removal추정
- T1027.002Obfuscated Files or Information: Software Packing추정
사실
마지막 줄 T1027.002(압축·포장으로 숨기기)에는 단서를 붙여야 합니다. 이건 감시 목록 12개를 만들어 낸 예전의 UPX 압축 검체에 근거한 항목입니다. 어제 내려온 ELF 두 개는 기록이 statically linked stripped 까지만 남아 있어, 포장이 씌워져 있었는지 아닌지는 이 데이터로 말할 수 없습니다.
어디서 본 것 같다면
추정
2016년부터 이어진 Mirai 봇넷 계열과 진입 구조가 같습니다. 텔넷 기본 비밀번호로 들어간 뒤 웹 서버의 /bins/ 경로에서 CPU 종류별 실행파일을 내려받아 맞는 것을 돌리는 방식입니다. 어제 받아간 이름(px86·pmips)과 감시 목록 12개의 이름 규칙이 이 방식과 일치하고, 완결 세션 5건이 전부 텔넷·비밀번호 경로라는 점도 부합합니다. 미국 법무부 기소·유죄인정 기록이 남아 있고 여러 벤더의 공개 분석 보고서가 있는 사건입니다.
추정
Gafgyt(Bashlite) 계열과도 맞물립니다. 셸 스크립트가 먼저 내려오고, 그 스크립트가 CPU 종류별 정적 링크 실행파일을 차례로 시도하는 구조입니다. 어제의 조합 — 셸 스크립트 kla[.]sh 하나 + 정적 링크·심볼 제거 ELF 두 개(x86·MIPS)가 같은 /bins/ 아래에서 한 세션에 함께 내려온 것 — 이 이 구조와 같습니다.
사실 그런데 두 사례가 딱 하나 짚어 주는 게 있습니다. 둘 다 소스가 공개된 계열이라, 서로 무관한 운영자들이 각자 같은 규칙의 유포지를 세우는 것이 흔합니다. 프랜차이즈 매뉴얼이 인터넷에 통째로 풀려 있는 셈입니다. 그래서 “새 가게가 같은 간판으로 등장했다”는 어제 관측은 이 사례들과 방향이 같고, “두 가게 주인이 같은 사람인가”는 이 사례들이 답해 주지 않습니다.
그래서 뭘 해야 하나
추정 어제 데이터가 가리키는 순서입니다.
- 텔넷 같은 원격 접속을 끕니다. 어제 텔넷은 전체 세션의 15.2% 인데 완결 세션 5건은 전부 텔넷입니다. 텔넷은 비밀번호가 그대로 흘러가고, 키 인증이라는 선택지 자체가 없습니다 — 끄는 것 말고 방법이 없습니다. 공유기·홈캠 설정에서 “원격 접속”, “Telnet”, “원격 관리”를 찾아 꺼 두시면 됩니다.
- 기본 계정·초기 비밀번호를 바꿉니다. 로그인 시도 1,519회, 완결 세션 5건은 전부 로그인 성공입니다. 명령 1,910개는 전부 로그인에 성공한 뒤에 실행된 것입니다. 위 표의 조합을 쓰고 계시다면 그게 전부입니다.
- 장비가 밖에서 파일을 받아오지 못하게 막습니다. 어제 파일 다운로드 109회, 실행 권한 부여 181회, 다운로드 후 실행 107회입니다. 밖으로 나가는 연결이 막혀 있었다면
ATK-377ED5는 다운로드 단계에서 끊깁니다. 특히 어제 내려온 두 실행파일은 정적 링크라 배포판·버전과 무관하게 돌아갑니다. 여기가 마지막으로 끊을 수 있는 지점이었습니다. - 로그인 실패 횟수를 제한합니다.
nobody/nobody한 조합을 네 곳이 곳당 서른여덟 번씩 두드렸는데 아무것도 걸리지 않았습니다. 게다가 세션 하나가 5~10초면 끝나므로, “오래 붙어 있는 연결”을 기준으로 잡은 임계값에는 애초에 걸리지 않습니다. ~/.ssh/authorized_keys파일이 바뀌면 알림을 받습니다. 어제 키 심기 의도 11회, 같은 해시 공개키를 남긴 출처 10곳입니다.ATK-4CA329는 검체를 한 건도 저장하지 못한 세션인데도 키 심기 단계까지 분류됐습니다. 백신이 잡을 실행파일이 없고 키 파일을 직접 들여다보지 않으면 뚫렸다는 사실 자체를 모릅니다.- 로그를 장비 밖에 저장합니다. 흔적 삭제가 12회 관측됐습니다(8/18 19 → 8/19 13 → 8/20 8 → 어제 12). 어제처럼 세션이 10초이고 남는 것이 실행파일 두 개뿐인 유형은, 로그가 없으면 처음 보는 유포지가 있었다는 것조차 알아낼 수 없습니다. TTY 녹화 1,250건이 남아 있었기에 10초 안의 흐름을 되짚을 수 있었습니다(내용은 이 글에 포함하지 않습니다).
사실 “비밀번호 대신 키 인증을 쓰세요”는 어제 데이터로는 중간 정도의 권고입니다. 어제 로그인이 성공한 완결 세션은 전부 텔넷이고, 텔넷에는 키 인증이 없습니다. 그리고 1,519회 중 SSH 몫이 얼마인지 데이터가 나눠 주지 않아, “키 인증을 켰다면 어제 침투가 막혔다”고 말할 근거가 없습니다.
어제 하루 전체
| 세션 | 1,845건 |
| 고유 IP | 205곳 |
| 로그인 시도 | 1,519회 |
| 실행된 명령 | 1,910개 |
| SSH (2222) | 1,564건 |
| 텔넷 (2223) | 281건 |
출발지 한 곳당 평균 약 9.0세션, 약 7.4회 시도입니다.
어제 관측된 유포지·C2(176[.]65[.]139[.]196, 185[.]93[.]89[.]72, 5[.]182[.]210[.]174 등)는 C-TAS 로 신고했습니다. 새 주소인 176[.]65[.]139[.]196 이 어제 신고분의 핵심입니다. 전송 계층 성공만 확인되며, KISA 측 적재 여부는 별도 확인이 필요합니다.
60초로 보기
같은 관측분을 짧은 영상으로도 만들었습니다. 영상은 파일 두 개를 왜 둘 다 받아갔는가에 초점을 맞췄습니다.
우리가 모르는 것
이 블로그는 아는 것과 모르는 것을 나눠서 씁니다. 어제 관측분에서 확인할 수 없었던 것들입니다.
- 세 파일이 정말 그 한 세션이 받아간 것인지.
ATK-377ED5의 다운로드 수가 3 이고 이 별칭만 전달 출처로 갖는 검체가 정확히 3건이지만, 데이터가 세션과 검체를 1:1 로 이어 주지는 않습니다.ATK-792ADF(12건=11+1)·ATK-A64398(2건)도 같은 방식의 대응입니다. 176[.]65[.]139[.]196과31[.]77[.]227[.]121이 같은 운영자·같은 인프라인지. 확인되는 것은/bins/폴더 규칙과p+CPU 이름 규칙이 같고pmips라는 이름이 글자까지 일치한다는 것까지입니다. 공개 소스 계열이라 무관한 운영자도 같은 규칙을 씁니다.- 예전 주소가 이틀 연속 0건인 이유. 유포지가 멈춘 것인지, 우리 허니팟으로 그 요청이 오지 않은 것인지 구분할 수 없습니다. “새 호스트로 옮겼다”고 말할 근거도 이 데이터에는 없습니다.
- 어제
pmips가 커진 것인지. 244,420바이트로 8/16(51,104)·8/19(52,272)의 약 4.7배지만 호스트가 다릅니다. 이름만 같은 서로 다른 두 파일일 수 있습니다. - 왜 x86 과 MIPS 두 종류만 받아갔는지. 이 서버를 그 둘로 좁혀 판단한 결과인지, 더 시도했는데 실패한 것인지 데이터가 구분해 주지 않습니다. 명령 원문과 TTY 리플레이가 없어 순서도 알 수 없습니다.
ATK-792ADF의 의도가 왜 하나도 분류되지 않았는지. completeness 43 으로 어제 최고값이고 명령 48개·다운로드 12건인데 의도 배열이 비어 있습니다. 분류기가 못 잡은 것인지 분류 대상이 아닌 명령이었는지 설명이 없습니다. 이 세션을 주제로 삼지 않은 이유이기도 합니다.- completeness 값이 왜 그 값인지. 산식이 데이터에 없습니다.
ATK-792ADF는 의도가 0개인데 43 이고, 의도 5종인ATK-4CA329는 17 입니다. 8/18·8/19·8/20 에도 같은 항목이 미해결로 남아 있습니다. hxxp://5[.]182[.]210[.]174/ok가 하루에 두 종류를 내보낸 이유. 요청마다 새로 만들어지는 것인지 짧은 주기로 교체되는 것인지 알 수 없고, 내용을 담지 않으므로 무엇이 달라졌는지도 말할 수 없습니다.- 1바이트 파일이 11회 반복 저장된 이유. 다운로드 실패의 결과인지 의도된 동작인지 알 수 없습니다. 8/17 에도 같은 형태가 있었습니다.
ATK-4CA329가 다운로드에 실패한 것인지, 받았는데 저장이 안 된 것인지. 의도에는 ‘파일 다운로드’·’다운로드 후 실행’이 있는데 다운로드 수는 0 입니다. 8/18·8/19·8/20 에 이어 네 번째입니다.- 명령 총계 1,910개와 의도 분류 합계 1,575회가 어긋나는 이유. 한 명령이 여러 의도로 분류되는지, 분류되지 않는 명령이 있는지 설명이 없습니다.
- 8/16~8/20 의 출처들이 어제 출처와 겹치는지. 별칭(
ATK-XXXXXX)은 소금을 섞어 만듭니다.ATK-10149C·ATK-BECAD3가 이전 브리프에도 같은 검체와 함께 나오지만, 소금 처리 방식이 문서화돼 있지 않아 날짜 간 동일 출발지의 근거로 쓰지 않았습니다. 따라서 공개키를 심은 출처 수(10 → 12 → 16 → 12 → 8 → 10곳)도 합산할 수 없습니다. - 지문 목록이 상위 몇 개인지 전수인지. 클러스터 총계는 38인데 목록은 8개입니다. 따라서 “어제 검체를 전달한 클러스터가 없다”는 것은 그 8개 범위 안에서의 사실입니다.
SSH-2.0-ZGrab ZGrab SSH Survey(지문dd9bcf09…, 어제 IP 2곳·누적 34곳)의 성격. 공개된 인터넷 스캐너 도구의 이름이지만, 연구·측정 목적인지 공격 준비인지 이 데이터로는 구분할 수 없습니다.0425c279…(SSH-2.0-PuTTY_Release_0.70)가 정말 어제 처음 관측된 것인지. 당일 3곳 = 누적 3곳이라 그렇게 보이지만, 누적 집계의 시작 시점이 명시돼 있지 않습니다.- 9바이트 ASCII 텍스트 3종(
4af5a5c9…·1193dde1…·a9b1c85a…)이 무엇인지. 내용이 브리프에 없습니다.4af5a5c9…는 전달 출처가 1곳인데 관측은 5회입니다. - 같은 해시 공개키를 10곳이 남긴 이유. 같은 도구를 쓴 결과인지 키를 공유한 결과인지 알 수 없습니다. 8/16~8/20 에도 같은 항목이 미해결입니다.
- Discord 웹훅 URL 1건. 어느 세션·어느 검체와 연결되는지 명시돼 있지 않아 어제 사실 관계에 넣지 않았습니다. 8/20 도 같은 이유로 제외했습니다.
- 집계 수치가 하루 전체를 덮는지. 주요 세션이 UTC 00:25~14:00 에 걸쳐 있고 생성 시각은 15:05Z 입니다. 관측 구간이 명시돼 있지 않습니다. 위에서 “1분에 한 번꼴”이라고 쓴 것도 하루 전체를 가정한 계산입니다.
tty_recordings_available(127)·samples_on_honeypot(43)과 집계 TTY 녹화(1,250건)의 관계. 설명이 없습니다.- C-TAS 신고의 적재·활용 여부. 전송 계층 성공만 확인됐습니다.
- 배경 취약점 통계(CVE 4,555건 / 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 데이터베이스를 갖고 있지 않습니다. 추정하지 않습니다. 새 유포지
176[.]65[.]139[.]196의 호스팅 사업자도 마찬가지로 알 수 없습니다. - 지리 위치 — 동일합니다. IP 지리정보는 애초에 귀속 근거가 되지도 않습니다.
- VPN·Tor·클라우드 여부 — 판별 수단이 없습니다.
- VirusTotal 탐지 결과 — 미연동입니다. 어제 확보한 ELF 두 건(
979bd80a…·ed6bae21…)이 어떤 계열로 탐지되는지 이 데이터로는 말할 수 없습니다. 검체 분류는 MalwareBazaar 태그를 씁니다. - User-Agent — SSH·텔넷에는 User-Agent 자체가 존재하지 않습니다. HTTP 공격은 별도 소스입니다.
- CVE 연결 — SSH·텔넷 공격은 취약점을 참조하지 않는 경우가 대부분이고, 어제 관측분도 비밀번호를 노린 것이었습니다.
동네에 새 가게가 생겼습니다. 주인이 누구인지는 끝까지 모릅니다. 그런데 간판 글씨체와 메뉴 이름이 낯익다는 것은 압니다 — 예전 메뉴판을 베껴 적어 뒀기 때문입니다. 베껴 두지 않았다면 어제 기록에는 “처음 보는 주소, 파일 세 개”라고만 적혔을 겁니다.
지금 집에 있는 공유기와 홈캠도 매일 그 간판 앞을 지나갑니다. 아무도 메뉴판을 적어 두지 않는다면, 우리가 아는 것은 계속 0 입니다.
이 글은 2026-08-21 허니팟 관측분을 바탕으로 작성됐습니다. 출발지 IP 는 브리프의 마스킹 형태 그대로 표기했고, 유포 주소는 접속되지 않도록 변형(defang)했습니다. 인용한 자격증명은 서로 다른 IP 3곳 이상에서 관측된 20개 조합만 포함했으며, 그 미만에서만 관측된 806개 조합은 개수만 밝히고 값은 싣지 않았습니다.
