SecurityHeroblog

처음 보는 주소에서 파일 세 개 — 문패가 낯익었다

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

동네에 새 가게가 하나 생겼다고 해 봅시다. 한 번도 본 적 없는 자리, 처음 보는 상호입니다. 그런데 들어가 보니 이상하게 낯이 익습니다. 간판 글씨체가 같고, 메뉴판에 붙은 번호 매기는 방식이 같고, 심지어 메뉴 이름 하나는 글자까지 똑같습니다.

여기서 두 가지를 말할 수 있습니다. 하나는 “같은 매뉴얼로 차린 가게다” — 이건 맞습니다. 다른 하나는 “주인이 옮겨온 거다” — 이건 모릅니다. 같은 프랜차이즈 본사에서 매뉴얼을 받은, 서로 얼굴도 모르는 다른 사장님일 수 있으니까요.

어제 우리 서버에 찍힌 것이 딱 그 새 가게였습니다.

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 줄의 초 단위를 눈여겨보세요. 그리고 각 줄 끝의 다운로드 건수가 서로 얼마나 다른지도 함께 보시면 좋습니다.

  1. 사실 ATK-E07AC3(183.95.x.x) 텔넷 로그인 성공. 약 85.0초 · 명령 31개 · 다운로드 1건. 의도 3종 — 파일 다운로드 · 실행 권한 부여 · 다운로드 후 실행. completeness 16. 8/20 브리프의 주제였던 네 세션과 수치 형태가 동일하다. TTY 녹화됨(내용 미포함). 텔넷이라 지문·클라이언트 값은 빈 문자열
  2. 사실 ATK-A64398(112.46.x.x) 텔넷 로그인 성공. 약 5.1초 안에 명령 19개(초당 약 3.7개) · 다운로드 2건. 의도 2종 — 파일 다운로드 · 실행 권한 부여. completeness 17. 받아간 것은 9바이트 ASCII 텍스트 두 개(1193dde1… · a9b1c85a…)이며 URL 은 기록되지 않았다
  3. 사실 ATK-4CA329(223.123.x.x) 텔넷 로그인 성공. 약 63.0초 · 명령 17개. 의도 5종으로 어제 최다 — 정찰(시스템) · 파일 다운로드 · 실행 권한 부여 · 다운로드 후 실행 · 지속성(SSH 키 심기). 그런데 다운로드는 0건. completeness 17. 8/18·8/19·8/20 에 이어 네 번째로 같은 형태
  4. 사실 어제의 주제 세션. ATK-377ED5(94.154.x.x) 텔넷 로그인 성공. 약 10.4초 · 명령 8개 · 다운로드 3건. 의도 3종 — 파일 다운로드 · 실행 권한 부여 · 다운로드 후 실행. completeness 22 로 의도가 기록된 세션 중 최고값. 세 검체 합계 380,885바이트가 10초 남짓 만에 들어왔다
  5. 사실 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…)
  6. 사실 호스트 176[.]65[.]139[.]196 은 8/16~8/20 다섯 개 브리프 어디에도 없다. 어제가 첫 관측이다. 또 아카이브에서 ELF 가 내려온 URL 은 hxxp://31[.]77[.]227[.]121/bins/pmips 하나뿐이었고 언제나 한 세션에 한 개씩이었다 — 한 세션이 x86 과 MIPS 를 함께 받아간 것은 어제가 처음
  7. 사실 ATK-792ADF(218.154.x.x) 텔넷 로그인 성공. 약 23.7초 · 명령 48개(어제 최다) · 다운로드 12건(어제 최다) · completeness 43 으로 어제 전체 최고값. 그런데 의도 배열이 비어 있다 — 하나도 분류되지 않았다. 이 별칭이 유일한 전달 출처인 검체는 1바이트 파일(01ba4719…, 11회)과 202바이트 POSIX 셸 스크립트(0c99433c…, 1회)이며 11+1=12 로 다운로드 수와 맞는다
  8. 사실 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종이 어제 하루 안에 나왔다
  9. 사실 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 이며 출처 수는 최저값
  10. 사실 389바이트 OpenSSH RSA 공개키(a8460f44…)가 서로 다른 출처 10곳에서 10회 관측. URL 미기록. 8/16 10곳 → 8/17 12곳 → 8/18 16곳 → 8/19 12곳 → 8/20 8곳 → 어제 10곳으로 엿새 연속 같은 해시
  11. 사실 압축을 풀어야만 나왔던 12개 URL(31[.]77[.]227[.]121/bins/ 계열)에서는 어제도 다운로드가 0건 — 8/20 에 이어 이틀 연속. 이 12건은 감시 목록에 계속 올라 있다
  12. 사실 의도 분류 — 정찰(시스템) 1,154회, 실행 권한 부여 181회, 파일 다운로드 109회, 다운로드 후 실행 107회, 흔적 삭제 12회, 지속성(SSH 키 심기) 11회, 정찰(네트워크) 1회. 전체 명령 1,910개 중 정찰(시스템)이 약 60.4%. '정찰 — 네트워크'는 8/20 에 항목 자체가 없었는데 어제 1회 다시 나타났고, '방어 무력화'는 어제도 항목이 없다
  13. 사실 세션 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%)
  14. 사실 자격증명 조합 nobody/nobody 는 서로 다른 IP 4곳에서만 나왔는데 시도는 151회 — 한 곳당 약 37.8회. 반대로 admin/admin 은 IP 18곳에서 35회로 곳당 약 2회. 같은 '빈출 조합'이라도 두드리는 방식이 정반대다
  15. 사실 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:// 와 [.] 는 그대로 두었습니다.

sha256
bb36568c1f0a4f4d604cc67f8692506291eb1ffd217a451ffc846c94daa094403,013바이트 Bourne-Again 셸 스크립트 · 출처 1곳(ATK-377ED5)·1회 · 신규 유포지에서 내려온 첫 번째 파일
url
hxxp://176[.]65[.]139[.]196/bins/kla[.]sh위 스크립트의 주소. 이 호스트는 아카이브 8/16~8/20 에 없던 신규 유포지다
sha256
979bd80a9ffde500946e02911d2824eab5fb25c265086b6569e6fff6977d21a6133,452바이트 ELF 32-bit LSB Intel 80386, statically linked·stripped · 출처 1곳(ATK-377ED5)·1회 · 아카이브에 x86 ELF 다운로드 기록은 없었다 — 어제가 처음
url
hxxp://176[.]65[.]139[.]196/bins/px86위 실행파일의 주소
sha256
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배다
url
hxxp://176[.]65[.]139[.]196/bins/pmips위 실행파일의 주소. 폴더 규칙과 파일명 규칙이 감시 목록과 겹친다
sha256
c850a2851bfe46c6761f09b21368f167afa8b2745800618ebbb926caf7fa80ba1,608바이트 Bourne-Again 셸 스크립트 · 출처 ATK-10149C·1회 · 아래 7a5dcc03… 과 같은 URL·같은 크기인데 해시가 다르다 — 어제 하루에 두 종류
sha256
7a5dcc03b6274d723da5ff6fe15a8a4b332daa6f56a928fd64f65d04f4ba1f0b1,608바이트 Bourne-Again 셸 스크립트 · 출처 ATK-10149C·1회 · 8/18·8/19 는 6aa5054a…, 8/20 은 b7728639… 로 같은 URL·같은 크기·다른 해시가 나흘째
url
hxxp://5[.]182[.]210[.]174/ok위 두 스크립트의 주소. 주소도 크기도 그대로인데 내용만 바뀐다
sha256
a6296a79f44e21b76604d2d2bbf795d2cf380f70e39d45fbf166707ff3b4a6a4306바이트 POSIX 셸 스크립트 · 출처 5곳(ATK-3F4FA3 · ATK-42B427 · ATK-D9B325 · ATK-E07AC3 · ATK-338C04)·5회 · 8/17~8/20 과 같은 해시·같은 URL 로 닷새 연속이며 출처 수는 최저
url
hxxp://185[.]93[.]89[.]72/wget위 스크립트의 주소. 닷새 연속 같은 주소
sha256
a8460f446be540410004b1a8db4083773fa46f7fe76fa84219c93daa1669f8f2389바이트 OpenSSH RSA 공개키 · 출처 10곳·10회 · URL 미기록 · 8/16~8/20 과 같은 해시로 엿새 연속
sha256
01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b1바이트 파일(내용을 알아볼 표식이 없음) · 출처 1곳(ATK-792ADF)·11회 · URL 미기록 · 이 세션의 다운로드 12건 중 11건이 이 파일이다
sha256
0c99433c7d433d65ab890dcee20b330f262379d532bc76f91e18f09ecfa5fb54202바이트 POSIX 셸 스크립트 · 출처 1곳(ATK-792ADF)·1회 · URL 미기록
sha256
4af5a5c98ad132095c6fbe7b02c242153a190a01cc321e50a916a0ca46fbaa629바이트 ASCII 텍스트 · 출처 1곳(ATK-BECAD3)·5회 · URL 미기록 · 8/18·8/19·8/20 에도 같은 해시·같은 별칭
sha256
1193dde1c831808bf6f2db6f5b850b846b8a7f870873ec3b8a347f21cc5d96e39바이트 ASCII 텍스트 · 출처 1곳(ATK-A64398)·1회 · URL 미기록
sha256
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/ 아래에서 한 세션에 함께 내려온 것 — 이 이 구조와 같습니다.

사실 그런데 두 사례가 딱 하나 짚어 주는 게 있습니다. 둘 다 소스가 공개된 계열이라, 서로 무관한 운영자들이 각자 같은 규칙의 유포지를 세우는 것이 흔합니다. 프랜차이즈 매뉴얼이 인터넷에 통째로 풀려 있는 셈입니다. 그래서 “새 가게가 같은 간판으로 등장했다”는 어제 관측은 이 사례들과 방향이 같고, “두 가게 주인이 같은 사람인가”는 이 사례들이 답해 주지 않습니다.

그래서 뭘 해야 하나

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

  1. 텔넷 같은 원격 접속을 끕니다. 어제 텔넷은 전체 세션의 15.2% 인데 완결 세션 5건은 전부 텔넷입니다. 텔넷은 비밀번호가 그대로 흘러가고, 키 인증이라는 선택지 자체가 없습니다 — 끄는 것 말고 방법이 없습니다. 공유기·홈캠 설정에서 “원격 접속”, “Telnet”, “원격 관리”를 찾아 꺼 두시면 됩니다.
  2. 기본 계정·초기 비밀번호를 바꿉니다. 로그인 시도 1,519회, 완결 세션 5건은 전부 로그인 성공입니다. 명령 1,910개는 전부 로그인에 성공한 뒤에 실행된 것입니다. 위 표의 조합을 쓰고 계시다면 그게 전부입니다.
  3. 장비가 밖에서 파일을 받아오지 못하게 막습니다. 어제 파일 다운로드 109회, 실행 권한 부여 181회, 다운로드 후 실행 107회입니다. 밖으로 나가는 연결이 막혀 있었다면 ATK-377ED5 는 다운로드 단계에서 끊깁니다. 특히 어제 내려온 두 실행파일은 정적 링크라 배포판·버전과 무관하게 돌아갑니다. 여기가 마지막으로 끊을 수 있는 지점이었습니다.
  4. 로그인 실패 횟수를 제한합니다. nobody/nobody 한 조합을 네 곳이 곳당 서른여덟 번씩 두드렸는데 아무것도 걸리지 않았습니다. 게다가 세션 하나가 5~10초면 끝나므로, “오래 붙어 있는 연결”을 기준으로 잡은 임계값에는 애초에 걸리지 않습니다.
  5. ~/.ssh/authorized_keys 파일이 바뀌면 알림을 받습니다. 어제 키 심기 의도 11회, 같은 해시 공개키를 남긴 출처 10곳입니다. ATK-4CA329 는 검체를 한 건도 저장하지 못한 세션인데도 키 심기 단계까지 분류됐습니다. 백신이 잡을 실행파일이 없고 키 파일을 직접 들여다보지 않으면 뚫렸다는 사실 자체를 모릅니다.
  6. 로그를 장비 밖에 저장합니다. 흔적 삭제가 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개 조합은 개수만 밝히고 값은 싣지 않았습니다.