같은 파일을 두 벌 — 안쪽 이름표는 떼지 않았다
9월 7일, 22일치 기록에 한 번도 없던 주소가 처음 나타났습니다. 거기서 내려온 실행파일 두 개는 크기도 거의 같고 하는 일도 같은데, 숫자를 읽는 순서만 반대로 만든 두 벌이었습니다. 만든 쪽은 파일 안쪽의 이름표를 지우지 않은 채로 보냈습니다.

해외여행을 가서 충전기를 꽂으려다 멈칫한 적이 있을 겁니다. 우리나라 콘센트는 동그란 다리 두 개짜리인데, 어떤 나라는 납작한 다리 두 개고 어떤 나라는 세 개입니다. 안에 든 부품이 같아도 꽂히는 모양이 다르면 소용이 없습니다.
그래서 물건을 많이 파는 회사는 같은 제품을 나라별 플러그로 여러 벌 만들어 둡니다. 창고에 나란히 쌓아 놓고, 주문이 오면 그 나라에 맞는 걸 꺼내 보냅니다.
어제 우리 서버에 들어온 것이 딱 그 모양이었습니다.
먼저, 어제 오후에 있었던 일
사실 9월 7일 오후 3시 41분, 우리 허니팟에 텔넷으로 누가 들어왔습니다. 허니팟은 일부러 허술하게 열어 둔 가짜 서버입니다. 공격자가 무엇을 하는지 보려고 놓아둔 것이라, 여기서 벌어진 일은 진짜 피해가 아니라 관찰 기록입니다. 텔넷은 아주 오래된 원격 접속 방식인데, 주고받는 글자가 암호화되지 않고 그대로 오간다는 문제가 있습니다.
사실
들어온 쪽에는 ATK-33267B라는 별칭을 붙였습니다. 별칭은 신원이 아닙니다. 같은 마스킹 출발지를 브리프끼리 이어 부르려고 붙인 표식일 뿐입니다. 이 별칭은 우리 아카이브 8월 16일~9월 6일 22일치에 한 번도 없던 새 별칭입니다.
시간 순서로 늘어놓으면 이렇게 됩니다. 맨 오른쪽 초 단위와, 세션끼리의 간격을 눈여겨보세요.
- 사실 ATK-33267B, 텔넷으로 접속해 로그인 성공. 24.3초 동안 명령 3개, 다운로드 3건. TTY 녹화됨
- 사실 같은 별칭이 재접속. 22.5초, 명령 3개, 다운로드 3건 — 첫 세션과 값이 완전히 동일
- 사실 3회차. 22.4초, 명령 3개, 다운로드 3건. 2회차와 2분 7초 간격
- 사실 4회차. 23.4초, 명령 3개, 다운로드 3건. 3회차와 1분 27초 간격 — 06:41~06:52 11분 안에 네 번
- 사실 5회차. 23.1초, 명령 3개, 다운로드 3건. 1회차 시작 시각에서 2시간 0분 39초 뒤
- 사실 이 별칭이 배달한 파일 3종의 관측 횟수 합계는 12+10+5=27건이고, 셋 다 delivered_by 가 ATK-33267B 단독이다
- 추정 세션당 다운로드가 3건이므로 27건은 약 9세션에 해당한다 — notable_sessions 에 노출된 5개는 그중 완결성 상위분이다
- 추정 5회차가 1회차와 정확히 2시간 간격이고 세션 길이가 22.4~24.3초 안에 모여 있는 것은 사람이 앉아 치는 조작이 아니라 스케줄러가 도는 자동화다
사실 다섯 번의 방문이 전부 같습니다. 로그인 성공, 명령 3개, 다운로드 3건. 머문 시간은 22.4초에서 24.3초 사이입니다. 가장 긴 것과 가장 짧은 것의 차이가 1.9초입니다. 사람이 다섯 번 타자를 쳐서 이렇게 되기는 어렵습니다.
사실 이 별칭이 접속한 통로는 텔넷 포트 2223번입니다. 여기에는 접속 프로그램 지문이 남지 않습니다. SSH는 접속할 때 서로 규격을 맞추는 인사말을 주고받아서 그 모양으로 지문(hassh)을 뜰 수 있는데, 텔넷에는 그 절차가 아예 없습니다. 실제로 기록의 지문 칸과 클라이언트 칸이 빈 문자열입니다.
추정 그러니 “지문이 없다”는 말을 “조용히 다녀갔다”로 읽으면 안 됩니다. 우리 계측기가 그 통로에서는 애초에 안 보이는 것입니다.
받아 간 파일 세 개
여기서부터가 오늘의 본론입니다.
사실
세션마다 받아 간 파일은 세 개, 전부 같은 주소에서 왔습니다. hxxp://131[.]123[.]40[.]104/ 입니다. 주소를 이렇게 이상하게 적는 건 오타가 아닙니다. 실수로 눌러 접속하는 일이 없도록 http를 hxxp로, 점을 [.]로 바꿔 놓는 관행입니다. 디팽(defang), 이빨을 뽑아 둔다는 뜻입니다.
사실 이 주소도, 여기서 내려온 파일 세 개의 해시도 우리 아카이브 22일치에 단 한 건도 없습니다. 주소·해시·파일 이름·별칭이 전부 처음 보는 것입니다.
파일 목록입니다. 크기 두 개와, 그 옆의 MSB·LSB 라는 글자를 봐 주세요.
8e06754e5e64bdf5f61dd604a5f12e9bc10f5502316b5379fb258f84a5d84702924바이트 로더 스크립트 (ASCII text) · 오늘 12회 · 신규 해시hxxp://131[.]123[.]40[.]104/bins.sh위 로더의 유포지. 아카이브 22일치에 없던 신규 주소30c7d351e70323915566d2bb648b4313c9722b34252929a8c7050f6495ae14fc304,889바이트 ELF 32-bit MSB(빅엔디언) MIPS MIPS-I · 정적 링크 · not stripped · 오늘 10회 · 신규 해시hxxp://131[.]123[.]40[.]104/GHfjfgvj위 MSB 실행파일의 경로7cc0b40e8819ec9139ffae5942add2db1c26e168edaeda57302c9047f23dfb6c305,654바이트 ELF 32-bit LSB(리틀엔디언) MIPS MIPS-I · 정적 링크 · not stripped · 오늘 5회 · 신규 해시. MSB 판과 크기 차이 765바이트hxxp://131[.]123[.]40[.]104/JIPJIPJj위 LSB 실행파일의 경로a6296a79f44e21b76604d2d2bbf795d2cf380f70e39d45fbf166707ff3b4a6a4306바이트 POSIX 셸 스크립트 · 오늘 10회 · 서로 다른 10개 별칭이 배달. 8/17 첫 관측 이후 계속 같은 해시hxxp://185[.]93[.]89[.]72/wget위 스크립트의 유포지. 오늘의 주제가 아니라 배경이다a8460f446be540410004b1a8db4083773fa46f7fe76fa84219c93daa1669f8f2389바이트 OpenSSH RSA 공개키 · 오늘 6회 · 서로 다른 6개 별칭. 8/16 이후 반복 관측된 같은 파일. URL 미기록4af5a5c98ad132095c6fbe7b02c242153a190a01cc321e50a916a0ca46fbaa629바이트 ASCII 텍스트 · 오늘 9회 · 출처 1곳. 8/28·8/30 브리프에도 같은 9바이트 항목이 있다. URL 미기록사실 표에서 봐야 할 것은 두 줄입니다. 304,889바이트와 305,654바이트. 차이가 765바이트뿐입니다. 30만 바이트 중에 765바이트면 **0.25%**입니다. 그리고 둘 다 MIPS라는 같은 CPU 계열용이고, 다른 건 괄호 안의 글자 하나뿐입니다. 하나는 MSB, 하나는 LSB.
MSB와 LSB — 숫자를 읽는 순서
사실
컴퓨터는 큰 숫자를 여러 칸에 나눠 저장합니다. 그런데 어느 자리부터 적을지가 기계마다 다릅니다. 1234를 앞에서부터 1-2-3-4로 적는 기계가 있고, 뒤에서부터 4-3-2-1로 적는 기계가 있습니다. 앞에서부터 적는 쪽을 빅엔디언(MSB), 뒤에서부터 적는 쪽을 리틀엔디언(LSB)이라고 부릅니다.
사실 같은 값인데 적는 순서가 반대입니다. 그래서 한쪽 기계용으로 만든 프로그램을 다른 쪽 기계에 넣으면 숫자를 엉뚱하게 읽고 그냥 멈춥니다. 콘센트 구멍이 안 맞는 것과 똑같습니다.
추정 그래서 만든 쪽은 두 벌을 준비했습니다. 같은 프로그램을, 바이트 순서가 반대인 두 CPU 계열용으로 각각 빌드한 것입니다. 크기 차이 765바이트는 그렇게 다시 빌드할 때 생기는 정도의 차이입니다. 어느 집 콘센트가 어떤 모양인지 미리 알 필요가 없습니다. 두 벌을 다 창고에 두고, 문이 열리면 둘 다 내려보내면 됩니다.
사실 맨 앞의 924바이트짜리는 실행파일이 아니라 글자로 된 스크립트입니다. 문자 메시지 열 줄쯤 되는 크기입니다. 실행파일 하나가 이것의 330배쯤 되니, 얇은 안내문 한 장 뒤에 무거운 상자 두 개가 따라 들어온 모양입니다.
안쪽 이름표를 떼지 않았다
사실
파일 정보에 not stripped라는 말이 붙어 있습니다. 프로그램을 만들면 그 안에는 만든 사람이 붙인 이름표가 잔뜩 들어갑니다. 어떤 부품이 무슨 이름인지 적어 둔 표식입니다. 배포할 때는 보통 이걸 지웁니다. 용량도 줄고, 남이 뜯어보기도 어려워지니까요. not stripped는 그걸 안 지웠다는 뜻입니다.
추정 옷 안쪽에 공장 라벨이 그대로 붙은 채로 배송된 셈입니다. 뜯어보는 쪽에서는 반가운 일입니다. 덧씌운 포장을 벗겨낼 필요 없이 안쪽 표식을 그대로 읽을 수 있습니다.
사실
이게 눈에 띄는 이유는, 우리가 갖고 있는 다른 목록이 정반대이기 때문입니다. 우리 unpack_only_iocs 목록에는 URL이 12개 들어 있습니다. hxxp://31[.]77[.]227[.]121/bins/ 아래의 parm · parm5 · parm6 · parm64 · parm7 · pm68k · pmips · pmpsl · pppc · psh4 · pspc · x86_64 입니다. 이 12개는 압축을 풀어야만 나온 지표입니다. UPX라는 도구로 눌러 놓으면 겉면에는 주소가 하나도 안 보이거든요.
사실 그 12개 이름을 읽어 보면 CPU 종류가 그대로 적혀 있습니다. arm 계열 다섯, m68k, mips, mipsel, ppc 둘, sh4, x86_64. 한 프로그램을 CPU 종류별로 12벌 만들어 둔 메뉴판의 모양입니다. 어제 받아 간 MIPS 빅엔디언 한 벌과 리틀엔디언 한 벌은, 그 메뉴판으로 치면 정확히 두 칸에 해당합니다.
추정
다만 유포지가 다릅니다. 12개 지표는 31[.]77[.]227[.]121 에서 나온 것이고, 어제 것은 131[.]123[.]40[.]104 입니다. 같은 인프라라거나 같은 사람이 운영한다고 말할 근거는 우리에게 없습니다. 말할 수 있는 것은 구조가 닮았다는 것까지입니다. 그리고 겉을 눌러 주소를 감춘 쪽과 아예 감추지 않은 쪽이 같은 날 한 관측면에 같이 들어왔다는 것까지입니다.
앞 두 자리가 같았다
사실
들어온 곳의 IP는 131.123.x.x 입니다. 뒤 두 칸은 가려 놓았습니다. 우리는 이걸 복원하지 않습니다. 그리고 파일을 내려받은 주소는 131[.]123[.]40[.]104 입니다. 앞 두 칸이 같습니다.
추정 침입해 온 지점과 물건을 배달한 지점이 같은 대역 안에 있다고까지는 말할 수 있습니다. 그 이상은 안 됩니다. 셋째·넷째 칸이 가려져 있으니 같은 컴퓨터인지, 같은 동네의 다른 컴퓨터인지 우리 데이터로는 판정할 수 없습니다. 가린 것을 되돌려 맞춰 보지 않았고, 같은 호스트라고 쓰지도 않았습니다.
문을 열게 한 열쇠
사실 어제 하루 로그인 시도는 2,841회, 서로 다른 271곳에서 들어왔습니다. 하루 24시간으로 나누면 30초에 한 번꼴로 누가 아이디와 비밀번호를 넣어 본 셈입니다.
사실 시도된 조합은 2,547개였습니다. 그중 이 글에 옮긴 것은 20개뿐입니다. 나머지 2,527개는 개수만 세고 값은 적지 않습니다. 서로 다른 IP 세 곳 이상에서 반복된 조합만 원문을 인용하는 것이 우리 규칙입니다. 한두 곳에서만 나온 조합은 어디선가 유출된 누군가의 진짜 계정일 수 있기 때문입니다.
| 아이디 | 비밀번호 | 서로 다른 출발지 |
|---|---|---|
| admin | admin | 20곳 |
| 345gs5662d34 | 345gs5662d34 | 6곳 |
| root | 1234 | 6곳 |
| root | xmhdipc | 5곳 |
| ubuntu | ubuntu | 5곳 |
| root | 12345 | 5곳 |
| support | support | 4곳 |
| root | admin | 4곳 |
| root | root | 4곳 |
| root | root123 | 4곳 |
| root | 123456 | 4곳 |
| root | 12345678 | 4곳 |
| root | 123456789 | 4곳 |
| root | linux | 4곳 |
| root | password | 4곳 |
| root | uClinux | 3곳 |
| username | password | 3곳 |
| admin | password | 3곳 |
| vagrant | vagrant | 3곳 |
| runner | runner | 3곳 |
사실
목록 아래쪽의 uClinux와 xmhdipc를 보세요. 이건 사람이 만들어 쓰는 비밀번호가 아니라 공유기·CCTV 녹화기·카메라 같은 기기에 공장에서 넣어 놓는 초기 비밀번호입니다. 이 사전은 서버가 아니라 집과 사무실의 작은 기계를 겨냥하고 있습니다.
사실
그리고 이 20개가 만든 시도는 139회, 전체 2,841회의 **4.9%**뿐입니다. 눈에 띄는 admin/admin은 빙산의 일각입니다. 시도의 95%는 우리가 이름을 부를 수 없는 꼬리에서 나왔습니다.
어제 하루 전체
허니팟 01(SSH·텔넷)이 받아 적은 하루입니다. 오른쪽 끝, 어제와 비교한 칸을 봐 주세요.
| 항목 | 9월 7일 | 9월 6일 대비 |
|---|---|---|
| 세션 | 3,406건 | 2,207 → +54.3% |
| 서로 다른 출발지 | 271곳 | 414 → −34.5% |
| 출발지 한 곳당 세션 | 12.57회 | 5.33 → 2.4배 |
| 로그인 시도 | 2,841회 | 1,889 → +50.4% |
| 명령 | 3,537개 | 2,711 → +30.5% |
| SSH (포트 2222) | 2,854세션 | 1,883 → +51.6% |
| 텔넷 (포트 2223) | 551세션 | 324 → +70.1% |
| TTY 녹화 | 2,628건 | — |
추정 읽는 법이 조금 이상합니다. 찾아온 곳은 줄었는데 세션은 늘었습니다. 한 곳이 평균 12.57번씩 들어왔다는 뜻입니다. 어제의 2.4배입니다. 더 적은 수가 더 오래 머물렀습니다.
사실 명령 3,537개 중 의도가 분류된 것은 2,962개(83.7%)입니다. 그 안쪽은 이렇습니다.
| 무엇을 하려 했나 | 횟수 |
|---|---|
| 정찰 — 시스템 살펴보기 | 2,407회 |
| 실행 권한 부여 | 298회 |
| 다운로드 후 실행 | 121회 |
| 파일 다운로드 | 121회 |
| 지속성 — SSH 키 심기 | 8회 |
| 흔적 삭제 | 7회 |
사실 ’파일 다운로드’와 ’다운로드 후 실행’이 정확히 같은 121회입니다. 어제 내려받은 파일은 예외 없이 실행까지 이어졌습니다. 그리고 실행 권한을 주는 명령이 298회로, 다운로드보다 2.5배 많습니다.
사실
ATK-33267B의 세션에서 관측된 조합은 ‘파일 다운로드 → 실행 권한 부여 → 다운로드 후 실행’ 3단계입니다. 이 별칭 세션에는 SSH 키 심기도, 흔적 삭제도 들어 있지 않습니다. 열쇠를 걸어 둔 8회와 흔적을 지운 7회는 다른 별칭들이 한 일입니다.
옆 서버에서는 다른 문이 울렸다
사실 우리는 서버를 두 대 놓아뒀습니다. 두 번째(허니팟 02)는 안쪽까지 들여보내지 않는 얕은 함정이라, “어느 문을 몇 곳이 몇 번 두드렸나”만 남습니다. 로그인 성공도 명령도 자격증명도 여기엔 존재하지 않습니다.
| 서비스 | 포트 | 접촉 | 서로 다른 출발지 | 9월 6일 대비 |
|---|---|---|---|---|
| VNC (화면공유) | 5900 | 58,811건 | 285곳 | 48,605 → +21.0% |
| RDP (원격 데스크톱) | 3389 | 2,074건 | 142곳 | 1,474 → +40.7% |
| SMB (파일 공유) | 445 | 627건 | 49곳 | 200 → 3.1배 |
| MSSQL (데이터베이스) | 1433 | 60건 | 40곳 | 77 → 감소 |
| LDAP (계정 조회) | 389 | 5건 | 4곳 | 14 → 감소 |
| ADB (안드로이드 디버그) | — | 50건 | — | — |
사실 VNC 58,811건은 1.5초에 한 번꼴입니다. 285곳이 나눠서 만들었으니 한 곳이 평균 206번 두드린 셈입니다. 그리고 이 중 97.9%가 가장 오래된 규격인 RFB 3.3을 먼저 제안했습니다. SMB 쪽은 더합니다. 상대가 꺼낸 방언이 전부 SMB1 계열이고, SMB2·SMB3은 한 건도 제안되지 않았습니다.
추정 일부러 낡은 규격만 던지는 건, 특정 취약점을 노렸다기보다 아무 응답이나 최대한 끌어내려는 범용 스캐너의 행동에 가깝습니다. 어떤 취약점과 연결됐는지는 우리 데이터에 없습니다.
사실
02에서 확보한 검체 4종(46,525 / 239,388 / 334,816 / 153,208바이트, 합 773,937바이트)은 전부 ADB 통로로 들어왔고 배달 별칭은 ATK-B987B3 하나입니다. 이 네 개의 해시는 8월 28일·30일 브리프에 이미 나온 것과 같습니다. 당시 배달 별칭은 각각 달랐습니다.
추정 파일은 고정돼 있고 출발지만 바뀝니다. 다만 별칭이 다르다는 건 가려진 출발지가 다르다는 뜻일 뿐, 뒤에 있는 쪽이 같은지 다른지는 판단할 수 없습니다.
국제 분류표에 대응시키면
공격자가 쓴 수법을 세계 공통 분류표(MITRE ATT&CK)에 맞춰 보면 이렇습니다. ID를 누르면 원문 설명을 직접 확인할 수 있습니다 — 우리 말을 믿지 않아도 됩니다.
- T1110.001Brute Force: Password Guessing — 로그인 시도 2,841회 / 고유 출발지 271곳. 관측된 조합 2,547개 중 2,527개가 IP 3곳 미만에서만 나타난 꼬리다추정
- T1078.001Valid Accounts: Default Accounts — admin/admin 이 서로 다른 20개 IP 에서 41회. root/1234 · ubuntu/ubuntu 등 기본값 조합이 상위를 채웠다추정
- T1105Ingress Tool Transfer — '파일 다운로드' 의도 121회, 검체 6종 확보. ATK-33267B 는 hxxp://131[.]123[.]40[.]104/ 에서 3종을 받아갔다추정
- T1222.002File and Directory Permissions Modification: Linux and Mac — '실행 권한 부여' 298회로 다운로드(121회)보다 2.5배 많다추정
- T1059.004Command and Scripting Interpreter: Unix Shell — '다운로드 후 실행' 121회. 924바이트 로더 스크립트가 텍스트로 확보됐다추정
- T1082System Information Discovery — '정찰 — 시스템' 2,407회로 오늘 분류된 의도의 81.3%추정
- T1098.004Account Manipulation: SSH Authorized Keys — '지속성 — SSH 키 심기' 8회, 389바이트 공개키를 6개 별칭이 남겼다. ATK-33267B 세션에는 없다추정
- T1070Indicator Removal — '흔적 삭제' 7회. 전체 명령 3,537개의 0.2% 로 오늘은 드물었다추정
- T1595Active Scanning — 허니팟 02 에서 5개 서비스 61,577세션 + ADB 50세션, 고유 출발지 546곳. 로그인 성공은 존재하지 않는다추정
사실 아홉 줄 중 어제의 주인공이 밟은 건 세 줄뿐입니다. T1105(파일 가져오기), T1222.002(실행 권한 주기), T1059.004(받은 걸 실행하기). 딱 3단계, 22초. 나머지 여섯 줄은 다른 손님들이 남긴 것입니다.
예전에 이런 모양이 있었다
추정 “로더 스크립트 한 장 + CPU 계열별로 나뉜 실행파일”이라는 배포 방식은 처음 보는 게 아닙니다.
- Mirai 봇넷 (2016) — 텔넷 기본 자격증명으로 임베디드 기기에 로그인한 뒤, 셸 스크립트 로더가 CPU 아키텍처별로 나뉜 ELF 바이너리(MIPS 빅엔디언·리틀엔디언, ARM, PPC, SH4, x86 등)를 순서대로 내려받게 하는 구조였습니다. 어제 관측된 ’924바이트 로더 + MIPS MSB/LSB 두 벌’과 배포 방식의 형태가 같습니다. (출처: 미국 CISA(당시 US-CERT) 경보 TA16-288A 및 공개된 소스코드)
- Mozi 봇넷 (2019) — 텔넷 약한 비밀번호를 통한 초기 접근, MIPS 계열 ELF 배포라는 점에서 관측 형태가 겹칩니다. 감염 규모나 피해 금액은 우리 데이터로 확인할 수 없어 쓰지 않습니다. (출처: 360 Netlab, Microsoft Security Blog 등 공개 분석 보고서)
사실 여기서 멈춥니다. 우리는 검체 분류 서비스를 연동해 두지 않았습니다. 그래서 어제 확보한 ELF 두 개가 이 계열이라는 판정은 하지 않습니다. 닮은 건 만드는 방식이지, 이름표가 아닙니다.
그래서 무엇을 해야 하나
콘센트 모양은 우리가 바꿀 수 없습니다. 바꿀 수 있는 건 우리 집 벽에 콘센트를 몇 개나 밖으로 내놓고 있느냐입니다.
사실 1. 기본 계정·쉬운 비밀번호를 그대로 쓰고 있다면 — 가능성 높음. 위 표의 조합을 하나라도 쓰고 있으면 통과는 시간 문제가 아니라 즉시입니다. 어제 관측된 세션 하나가 로그인부터 파일 실행까지 22초에 끝났습니다.
사실 2. 비밀번호 로그인을 허용하고 키 인증을 안 쓰고 있다면 — 가능성 높음. 어제 완결성 상위 5개 세션이 전부 비밀번호로 성공했습니다. 그것도 텔넷이라 자격증명이 암호화 없이 오갔습니다. 별개로, 어제 8회·서로 다른 6곳이 389바이트짜리 공개키 파일 하나를 남겼습니다. 이건 비밀번호를 바꿔도 남는 뒷문입니다. 침해 시점과 발견 시점이 몇 달 벌어지는 전형적인 경로입니다.
사실 3. 관리 포트를 인터넷에 그대로 열어 뒀다면 — 가능성 높음. 우리 허니팟 주소는 어디에도 광고한 적이 없습니다. 그런데도 271곳이 찾아왔고, 옆 서버에는 VNC로만 58,811건이 왔습니다. 열려 있으면 발견됩니다.
추정 4. 접속 빈도 제한(fail2ban 같은 것)이 없다면 — 가능성 높음. 어제 같은 곳이 11분 안에 네 번 들어왔고, 재접속 간격이 1분 27초까지 좁혀졌습니다. 빈도 제한만 있어도 잘렸을 구간입니다. 차단이 없으면 공격자는 실패해도 비용을 치르지 않습니다.
사실 5. 나가는 연결(아웃바운드)을 안 막고 있다면 — 가능성 높음. 파일 다운로드 121회와 다운로드 후 실행 121회가 정확히 같습니다. 이 서버에서 저 주소로 나가는 연결이 막혀 있었다면 세 파일 모두 도착하지 못합니다. 침입은 열쇠 문제지만 무장은 통신 문제입니다. 로그인이 뚫려도 페이로드 단계에서 끊을 수 있습니다.
추정 6. 로그를 서버 밖으로 안 빼고 있다면 — 가능성 중간. 어제 흔적을 지우려는 의도는 7회 관측됐습니다. 전체 명령의 0.2%로 드물었고, 어제 주인공의 세션에는 들어 있지 않았습니다. 그래서 ’중간’으로 둡니다 — 어제 데이터로 조직적인 로그 파괴를 주장할 근거는 없습니다. 다만 22초에 끝나는 세션은 실시간 탐지가 아니면 사후 기록으로만 잡힙니다. 그 기록이 서버 안에만 있으면, 지워진 뒤엔 방법이 없습니다.
사실
어제 새로 관측된 유포지 131[.]123[.]40[.]104 는 C-TAS(한국인터넷진흥원 사이버 위협정보 공유 체계) 신고 대상입니다. 다만 우리가 확인할 수 있는 것은 전송이 성공했다는 것까지이고, 상대 쪽에 실제로 적재됐는지는 따로 확인해야 합니다.
우리가 모르는 것
이 블로그가 다른 곳과 다른 지점입니다. 아는 것보다 모르는 것을 적는 데 시간을 더 씁니다.
사실
ATK-33267B가 하루에 몇 번 들어왔는지 총 횟수를 모릅니다. 기록에 상세히 남은 건 5개뿐이고, 이 별칭이 배달한 파일 3종의 관측 횟수 합이 27건입니다. 세션당 3건 기준이면 약 9세션이지만, 파일별 횟수가 12·10·5로 균등하지 않아 모든 세션이 같은 3종을 받았다고 단정할 수 없습니다.- 출발지
131.123.x.x와 유포지131[.]123[.]40[.]104의 앞 두 칸이 같은 건 사실입니다. 그러나 뒤 두 칸이 가려져 있어 같은 IP인지 같은 대역의 다른 호스트인지 판정할 수 없습니다. 복원을 시도하지 않았습니다. - 어제의 주인공은 텔넷이라 접속 프로그램 지문이 없습니다. 우리가 쓰는 묶기 도구(actor_clustering)는 클러스터를 38개 갖고 있지만 SSH 전용이라, 어제 가장 완결성 높은 침투에는 구조적으로 적용되지 않습니다.
- 어제 가장 큰 지문 무리는
SSH-2.0-OpenSSH_7.4계열로 80개 IP였습니다. 그런데 이 무리는 파일을 한 개도 놓고 가지 않았습니다. 어제 검체를 배달한 지문은SSH-2.0-Go하나(6개 IP)뿐입니다. 규모와 실효는 다른 축입니다. 그리고 지문은 빌드의 지문이지 사람의 지문이 아닙니다 — 같은 배포판 기본 OpenSSH를 쓰는 무관한 사람도 같은 값이 나옵니다. - 9월 5일에 지적한 문제가 어제도 유효합니다. 지문의 ‘지금까지 누적 IP’ 값이 날마다 줄어들 때가 있어 진짜 누적치인지 확인되지 않았습니다. 어제 값도 같은 유보 아래 읽어야 합니다.
- 허니팟 02에서 한 출발지가 여러 서비스를 훑었는지 계산할 수 없습니다. 출발지별 서비스 매핑이 없고, 서비스별 고유 IP 합(520)이 전체(546)보다 작습니다. 표적인지 무차별 스캔인지를 어제 데이터로는 뒷받침할 수 없어, 0으로 적지 않고 ’알 수 없음’으로 뒀습니다.
- 02의 검체 4종에는 URL·파일 종류 칸이 아예 없습니다. 크기와 해시, 배달 별칭만 있습니다. 무슨 파일인지 이 데이터로는 말할 수 없습니다.
- 389바이트 공개키와 9바이트 텍스트는 URL 칸이 비어 있습니다. 세션 안에서 직접 기록된 것으로 보이나 경로가 밝혀져 있지 않습니다.
- 별도 지표에 Discord 웹훅 주소 1건이 있는데, 어제 세션·검체 중 무엇과 연결되는지 데이터가 밝히지 않습니다. 어제 다운로드 어느 항목에도 나타나지 않아 별도 경로로 확보된 것으로 보이며, 어제 사건과 연결해 서술하지 않았습니다. 웹훅 토큰은 그 자체가 악용 가능한 값이라 본문에 옮기지 않습니다.
- 취약점 배경 지표(추적 CVE 6,622건 · CISA KEV 390건 · 랜섬웨어 연계 확인 98건)는 KISA 보안공지에서 뽑은 것입니다. 어제 허니팟에서 관측된 어떤 세션과도 연결돼 있지 않으며, 연결된 것처럼 쓰지 않았습니다.
unpack_only_iocs의 12개 URL은 언제 관측된 것인지 날짜가 없습니다. 어제 새로 뽑은 것인지 누적 목록인지 구분할 수 없어 ’어제 나왔다’고 쓰지 않고 구조 비교 재료로만 썼습니다.- ELF 두 개의 파일 종류는 확인했지만 그 안에서 무슨 동작을 하는지는 우리 데이터에 없습니다. 채굴인지 DDoS 봇인지 프록시인지 말할 수 없습니다. 어제 서술은 ’어떻게 들어와 무엇을 받아갔는가’까지입니다.
- 명령 3,537개 중 의도가 붙은 건 2,962개입니다. 나머지 575개(16.3%)가 무엇이었는지 알 수 없습니다.
그리고 아예 계측기가 없어서 못 보는 것들입니다. 이건 조사를 더 한다고 나오는 게 아닙니다.
- 통신사·조직(ASN·ISP) — 데이터베이스가 없습니다. 출발지의 통신사업자나 조직을 알 수 없고, 추정하지 않습니다.
- 지리 정보 — 마찬가지입니다. 애초에 IP 지리정보는 귀속의 근거가 되지 못합니다. 이 글은 어떤 국가·기업·개인도 공격자로 지목하지 않습니다.
- VPN·Tor·클라우드 여부 — 판별 수단이 없습니다.
- 검체 분류(VirusTotal) — 연동돼 있지 않습니다. 어제 확보한 ELF 두 개가 알려진 악성코드 계열인지 이 글로는 판정하지 않았습니다.
- 접속 프로그램 문자열(User-Agent) — 두 관측면 다 웹(HTTP)이 아닙니다. 01은 SSH·텔넷, 02는 SMB·RDP·VNC·MSSQL·LDAP·ADB입니다.
- 취약점 번호(CVE) 연결 — SSH·텔넷 공격은 대부분 특정 취약점을 참조하지 않고, 02도 규격을 맞추는 단계라 마찬가지입니다. 어제 관측을 특정 취약점과 연결하지 않았습니다.
여행용 어댑터를 여러 개 사 두는 이유는, 어느 나라에 갈지 몰라서가 아닙니다. 어느 나라든 가려고입니다.
어제 우리 서버에 들어온 두 벌짜리 파일도 같은 이유로 두 벌이었습니다. 어느 기계가 걸릴지 모르니까 양쪽을 다 준비해 둔 겁니다. 그러니 이쪽에서 할 일은 어댑터를 못 만들게 하는 게 아닙니다. 그건 불가능합니다.
벽에 난 구멍을 줄이는 것. 텔넷을 끄고, 공장 초기 비밀번호를 바꾸고, 장비가 밖에서 파일을 받아오는 길을 막는 것. 어제 22초짜리 세션 다섯 번이 가리킨 곳은 정확히 거기였습니다.
관측일은 2026년 9월 7일이고, 이 글은 그다음 날 정리했습니다. 출발지 IP는 브리프에 마스킹된 형태(131.123.x.x) 그대로 옮겼고 복원하지 않았습니다. 유포지 주소는 실수로 접속되지 않도록 디팽(hxxp://, [.]) 상태를 본문과 IOC 블록 모두에서 유지했습니다. 자격증명은 서로 다른 IP 3곳 이상에서 반복 관측된 조합 20개만 원문 인용했고, 나머지 2,527개는 개수만 밝히고 값을 적지 않았습니다. 통신사·국적·VPN 여부처럼 우리에게 계측 수단이 없는 항목은 추정하지 않고 “모른다”로 남겨 뒀습니다.
