실행파일 아홉 벌, 명령은 세 줄 — 33초짜리가 두 번
9월 8일, 23일치 기록에 없던 주소 하나가 CPU 종류만 다른 실행파일 아홉 개를 한꺼번에 내려보냈습니다. 그걸 받아 간 침입은 명령을 딱 세 줄 쳤고 33.25초 만에 끝났습니다. 그리고 1분 12초 뒤, 33.26초짜리가 한 번 더 들어왔습니다.

벽에 선반 하나 달려고 공구함을 열어 본 적이 있을 겁니다. 나사 머리가 십자인 줄 알고 십자 드라이버를 꺼냈는데, 막상 보니 일자입니다. 어떤 건 육각이고 어떤 건 별 모양입니다.
그래서 공구를 자주 쓰는 사람은 드라이버 하나를 들고 다니지 않습니다. 머리 모양별로 비트를 열 개쯤 담은 세트를 통째로 들고 갑니다. 무슨 나사가 박혀 있을지 미리 알 필요가 없어지거든요. 하나만 맞으면 나사는 돌아갑니다.
어제 우리 서버에 올라온 것이 딱 그 세트였습니다. 아홉 개짜리였고요.
어제 오후 4시 45분에 있었던 일
사실 우리는 허니팟 서버를 돌립니다. 허니팟은 일부러 허술하게 열어 두고 누가 무엇을 하는지 지켜보는 미끼 서버입니다. 그래서 여기서 벌어진 일은 진짜 피해가 아니라 관찰 기록입니다.
사실
9월 8일 오후 4시 45분 31초, 텔넷으로 누가 들어와 로그인에 성공했습니다. 텔넷은 아주 오래된 원격 접속 방식인데, 주고받는 글자가 암호화되지 않고 그대로 오간다는 문제가 있습니다. 들어온 쪽에는 ATK-2872E4(94.154.x.x)라는 별칭을 붙였습니다. 별칭은 신원이 아닙니다. 글과 글 사이에서 같은 가림 처리된 출발지를 이어 부르려고 붙인 표식일 뿐입니다. 이 별칭은 우리 아카이브 8월 16일~9월 7일 어디에도 없던 새 별칭입니다.
사실 이 세션은 33.25초 동안 이어졌습니다. 그 안에서 공격자가 친 명령은 세 개, 내려받은 파일은 열 개입니다. 33.25초에 열 개면 3.3초에 하나꼴입니다. 어제 관측된 세션 중 기록이 가장 촘촘했습니다(완결성 41 — 어제 최고치).
시간 순서로 늘어놓으면 이렇게 됩니다. 초 단위와, 세션과 세션 사이의 간격을 눈여겨보세요.
- 사실 ATK-640E4E(59.126.x.x)가 텔넷으로 접속해 로그인 성공. 67.06초 동안 명령 31개, 다운로드 1건. 의도는 파일 다운로드·실행 권한 부여·다운로드 후 실행 세 가지이고 화면이 녹화됐다
- 사실 ATK-245F71(59.125.x.x)이 텔넷으로 접속해 로그인 성공. 67.24초, 명령 31개, 다운로드 1건, 의도 세 가지가 앞 세션과 완전히 동일하다. 두 별칭 모두 hxxp://185[.]93[.]89[.]72/wget 의 306바이트 셸 스크립트를 배달한 8곳 명단에 들어 있다
- 추정 서로 다른 두 출발지가 13분 간격으로 들어와 '67초 남짓·명령 31개·다운로드 1건'이라는 같은 모양을 남겼다. 이 형태는 8/20 브리프(네 곳이 명령 수까지 31개로 동일)와 9/02 브리프(다섯 곳이 67초 남짓·명령 31개)에도 있다 — 같은 자동화 도구가 돌고 있다는 뜻이다
- 사실 ATK-50016C(220.135.x.x)가 텔넷으로 접속해 로그인 성공. 23.76초, 명령 20개, 다운로드 11건. 그런데 의도 목록은 비어 있다. 받아 간 11건은 전부 1바이트짜리 빈 파일이다
- 사실 ATK-2872E4(94.154.x.x)가 텔넷으로 접속해 로그인 성공. 33.25초 동안 명령은 단 3개인데 다운로드는 10건. 의도 세 단계가 모두 붙었고 화면이 녹화됐다. 완결성 41로 오늘 최고치
- 사실 세션이 끝나고 정확히 72.01초 뒤 같은 별칭이 다시 들어왔다
- 사실 두 번째 세션. 33.26초, 명령 3개, 다운로드 10건, 의도 동일, 완결성 41. 첫 세션과 지속시간 차이가 0.01초다
- 추정 명령 3개로 파일 10개가 들어왔다는 것은, 사람이 한 줄씩 친 것이 아니라 받아 놓은 스크립트가 나머지를 대신했다는 뜻이다. 실제로 이 별칭이 배달한 검체에는 1,875바이트짜리 셸 스크립트(hxxp://94[.]154[.]43[.]221/cat.sh)가 한 건 들어 있다
- 사실 cat.sh 를 뺀 나머지 9건은 전부 ELF 실행파일이고 이름이 iran.x86_64 · iran.aarch64 · iran.m68k · iran.mips · iran.mipsel · iran.powerpc · iran.sparc · iran.sh4 · iran.arc 다. 각 검체가 관측된 횟수는 모두 2 — 세션 한 번에 한 벌씩, 두 번 왔다. 10종 × 2회 = 20건이 두 세션의 다운로드 10 + 10 과 정확히 맞는다
- 추정 x86_64 와 aarch64 만 64비트 서버·최신 기기 계열이고, 나머지 일곱(m68k · MIPS 빅엔디언 · MIPS 리틀엔디언 · PowerPC · SPARC · 르네사스 SH · Synopsys ARC)은 공유기·NVR·셋톱박스·산업용 컨트롤러 같은 임베디드 장비 쪽 CPU 다. 서버 한 종류를 노린 것이 아니라 '리눅스가 도는 물건이면 뭐든'을 노린 배포 세트다
- 사실 9종 중 8종은 정적 링크·이름표 제거 상태인데 iran.sparc 만 동적 링크(인터프리터 /lib/ld-uClibc.so.0)이고 크기도 43,832바이트로 혼자만 4~5분의 1 수준이다. 나머지는 142,140~211,648바이트 구간에 몰려 있다. 9종 합계는 1,464,352바이트다
- 추정 가림 처리된 출발지 94.154.x.x 와 유포지 94[.]154[.]43[.]221 은 앞 두 칸이 같다. 뒤 두 칸은 가려져 있고 우리는 그것을 복원하지 않는다 — 따라서 '같은 장비'인지 '같은 대역'인지조차 확정할 수 없다. 9/07 브리프의 131.123.x.x ↔ 131[.]123[.]40[.]104 과 같은 모양이 이틀 만에 다시 나왔다
- 사실 세션 1,824건 · 고유 출발지 175곳 · 로그인 시도 1,523회 · 명령 1,980개 · 화면 녹화 1,390건. 의도는 정찰 1,281 · 실행 권한 부여 179 · 다운로드 후 실행 34 · 파일 다운로드 34 · 흔적 삭제 26 · SSH 키 심기 19 이다. '파일 다운로드'와 '다운로드 후 실행'이 34로 정확히 같다
- 사실 접촉 67,401건 · 고유 출발지 675곳. 이 중 65,322건(96.9%)이 화면공유(VNC) 포트 5900 하나다. 9/06 브리프가 '관측 12일 중 최고치'로 기록한 48,605건을 이틀 만에 다시 넘겼다
사실 여기서 봐야 할 줄은 아래쪽 두 개입니다. 33.25초와 33.26초. 같은 별칭이 1분 12초 간격으로 두 번 들어왔는데, 머문 시간 차이가 0.01초입니다. 사람이 두 번 타자를 쳐서 이렇게 되기는 어렵습니다.
받아 간 열 개
사실
받아 간 파일 열 개는 전부 같은 주소에서 왔습니다. hxxp://94[.]154[.]43[.]221/ 입니다. 주소를 이렇게 이상하게 적는 건 오타가 아닙니다. 실수로 눌러 접속하는 일이 없도록 http를 hxxp로, 점을 [.]로 바꿔 두는 관행입니다. 디팽(defang), 이빨을 뽑아 둔다는 뜻입니다.
사실
이 주소는 우리 아카이브 23일치에 한 번도 없던 것입니다. iran.<CPU이름>이라는 파일 이름 규칙도 처음 봅니다.
사실
열 개 중 하나는 실행파일이 아니라 글자로 된 스크립트입니다. cat.sh, 1,875바이트입니다. 문자 메시지 열두 줄쯤 되는 크기예요. 나머지 아홉 개는 전부 ELF 실행파일입니다. ELF는 리눅스에서 프로그램 파일이 쓰는 규격 이름입니다.
추정 명령은 세 줄인데 파일은 열 개였습니다. 세 줄로 열 번 받아오기는 어렵습니다. 첫 줄에서 받아 온 저 스크립트가 나머지를 대신 받아 온 것으로 봅니다. 공구함 비유로 옮기면, 손으로 비트를 하나씩 갈아 끼운 게 아니라 비트를 알아서 바꿔 무는 전동 드라이버를 먼저 꺼낸 셈입니다.
왜 아홉 벌이었나
사실
아홉 개의 이름은 이렇습니다. iran.x86_64 · iran.aarch64 · iran.m68k · iran.mips · iran.mipsel · iran.powerpc · iran.sparc · iran.sh4 · iran.arc. 점 뒤에 붙은 말은 전부 CPU 종류 이름입니다.
사실 컴퓨터의 두뇌인 CPU는 종류마다 알아듣는 말이 다릅니다. 한쪽용으로 만든 프로그램을 다른 쪽에 넣으면 아예 시작도 못 하고 멈춥니다. 나사 머리가 십자인데 일자 드라이버를 대는 것과 같습니다.
추정
그래서 만든 쪽은 같은 프로그램을 CPU 종류별로 아홉 벌 준비했습니다. 그중 서버나 최신 기기에 흔한 건 x86_64와 aarch64 둘뿐입니다. 나머지 일곱(m68k · MIPS 두 벌 · PowerPC · SPARC · 르네사스 SH · Synopsys ARC)은 공유기·CCTV 녹화기·셋톱박스·산업용 컨트롤러 같은 물건에 들어가는 CPU입니다. 특히 ARC는 서버에는 쓰이지 않는, 임베디드 전용 칩입니다.
추정 서버 한 종류를 노린 세트가 아닙니다. “리눅스가 도는 물건이면 뭐든”을 노린 세트입니다. 어느 집 나사가 무슨 머리인지 물어보지 않았다는 뜻이고, 물어볼 생각도 없었다는 뜻입니다.
사실 하루에 관측된 CPU 종류 아홉 가지는 우리 아카이브에서 확인 가능한 범위의 최댓값입니다. 종전 최대는 8월 23~25일에 본 다섯 종(armv5l · armv6l · armv7l · mips · mipsel)이었고, 바로 전날인 9월 7일은 두 종(MIPS 빅엔디언·리틀엔디언)이었습니다. 다섯에서 아홉으로 늘어난 날입니다.
사실 아홉 개를 다 더하면 1,464,352바이트, 약 1.4메가바이트입니다. 스마트폰 사진 한 장 정도예요. 그 한 장 분량이 두 번에 걸쳐 스무 건으로 들어왔습니다.
하나만 달랐다
사실 아홉 개 중 여덟 개는 만듦새가 똑같습니다. 정적 링크이고 이름표가 지워져 있습니다. 정적 링크는 프로그램이 쓸 부품을 전부 안에 넣어 통째로 만든다는 뜻입니다. 남의 집에 가서도 부품을 빌릴 필요가 없으니 잘 돌아갑니다. 이름표를 지웠다는 건, 만든 사람이 붙여 둔 내부 표식을 배포 전에 떼어냈다는 뜻입니다. 뜯어보기 어려워집니다.
사실
그런데 iran.sparc 하나만 다릅니다. 이건 동적 링크입니다. 부품을 안에 넣지 않고 들어간 기계에서 빌려 쓰겠다는 뜻입니다(빌려 올 곳으로 /lib/ld-uClibc.so.0이 적혀 있습니다). 크기도 43,832바이트로 혼자만 45분의 1입니다. 나머지 여덟은 142,140211,648바이트 사이에 몰려 있습니다.
추정 비트 아홉 개짜리 세트인데 하나만 재질이 다른 셈입니다. 만드는 도구가 그 하나만 달랐거나, 통째로 만들기에 실패해 부품을 빌리는 쪽으로 넘어갔을 수 있습니다. 어느 쪽인지는 우리 데이터로 알 수 없습니다.
72초 뒤, 한 번 더
사실 첫 세션은 오후 4시 46분 4초에 끝났습니다. 그리고 정확히 72.01초 뒤인 4시 47분 16초에 같은 별칭이 다시 들어왔습니다. 두 번째 세션은 33.26초, 명령 3개, 다운로드 10건. 첫 번째와 같습니다.
사실 검체 아홉 종의 관측 횟수가 전부 2회인 것도 여기서 맞아떨어집니다. 10종 × 2회 = 20건이고, 두 세션의 다운로드 10건 + 10건과 정확히 같습니다. 같은 세트를 두 번 통째로 내려놓고 간 것입니다.
추정 사람이 두 번 왔다고 보기는 어렵습니다. 사람은 두 번째에 더 빠르거나 더 느립니다. 0.01초 차이는 사람의 손이 만드는 숫자가 아닙니다.
앞 두 칸이 같았다
사실
들어온 쪽의 IP는 94.154.x.x 입니다. 뒤 두 칸은 가려 놓았고, 우리는 이걸 복원하지 않습니다. 그리고 파일이 내려온 주소는 94[.]154[.]43[.]221 입니다. 앞 두 칸이 같습니다.
추정
말할 수 있는 건 여기까지입니다. 뒤 두 칸이 가려져 있으니 같은 컴퓨터인지, 같은 동네의 다른 컴퓨터인지 판정할 수 없습니다. 가린 것을 되돌려 맞춰 보지 않았고, 같은 장비라고 쓰지도 않았습니다. 다만 이 모양은 9월 7일에도 있었습니다. 그날은 131.123.x.x가 들어와 131[.]123[.]40[.]104에서 파일을 받아 갔습니다. 이틀 만에 같은 모양이 다시 나왔다는 것까지가 사실입니다.
어제 문 앞에 놓인 것
사실 방어에 쓰실 수 있게 값을 그대로 옮깁니다. 값을 클릭하면 복사됩니다. 주소는 접속되지 않도록 변형해 두었으니 그대로 두고 쓰세요. 위쪽 열 줄과 아래쪽 줄들을 견줘 보세요 — 위는 어제 처음 나온 값이고, 아래는 3주 넘게 안 바뀐 값입니다.
4de34e22fec36167a9fabbe29b8eb38482ad5d16e59bce2fdd735b7ac15a0a861,875바이트 POSIX 셸 스크립트 · 오늘 2회 · 출처 1곳 · 아카이브 23일치에 없던 신규 해시hxxp://94[.]154[.]43[.]221/cat.sh위 스크립트의 유포지. 아카이브 23일치에 없던 신규 주소다de1de068b151fa14fdf94ba39d0503f0ee10a05fe0f9146c43928a96db25e084iran.x86_64 · 164,272바이트 ELF 64-bit LSB x86-64 · 정적 링크 · 이름표 제거 · 오늘 2회 · 신규 해시e102ee5bbf9282a4c5f5b38c5554668eefc67a9782004631d1aa837e18dfe159iran.aarch64 · 194,552바이트 ELF 64-bit LSB ARM aarch64 · 정적 링크 · 이름표 제거 · 오늘 2회 · 신규 해시b77142d8fa79f421c402fae649e041589c6e3584e69def5789b704af6b522535iran.m68k · 182,244바이트 ELF 32-bit MSB Motorola m68k 68020 · 정적 링크 · 이름표 제거 · 오늘 2회 · 신규 해시dea6d274c1c7c34d160bd12c87a27ef5c5edb1f4934c4557bb54f1857c7be360iran.mips · 209,376바이트 ELF 32-bit MSB(빅엔디언) MIPS MIPS-I · 정적 링크 · 이름표 제거 · 오늘 2회 · 신규 해시abc54ab37e423461c6a67b7d65f342451e42fbd93e4ba83fd571c3236cfcfc25iran.mipsel · 211,648바이트 ELF 32-bit LSB(리틀엔디언) MIPS MIPS-I · 오늘 9종 중 최대 크기 · 위 iran.mips 와 2,272바이트 차이라 같은 프로그램의 엔디언 두 벌로 보인다 · 오늘 2회 · 신규 해시7b46bce6515f1189593f7fbd7edb24ce2e152e0fbb6b57808515db882b331060iran.powerpc · 158,956바이트 ELF 32-bit MSB PowerPC or cisco 4500 · 정적 링크 · 이름표 제거 · 오늘 2회 · 신규 해시60bd242f448228391063d6a1521233087ba3602f5521f526a784d6325ffe8377iran.sparc · 43,832바이트 ELF 32-bit MSB SPARC · 9종 중 유일하게 동적 링크(인터프리터 /lib/ld-uClibc.so.0)이고 크기도 혼자 4~5분의 1 · 오늘 2회 · 신규 해시b610ed02b56e1634c71f36076e61e7bf69aca774e745df6c698d5d9f470d48b8iran.sh4 · 142,140바이트 ELF 32-bit LSB 르네사스 SH · 정적 링크 · 이름표 제거 · 오늘 2회 · 신규 해시b5099a274a6192b76e132488df1a051b2e6ccb68fc916901ddf73ef9d0f01fe2iran.arc · 157,332바이트 ELF 32-bit LSB Synopsys ARCompact ARC700 · ARC 는 서버에 쓰이지 않는 임베디드 전용 코어다 · 오늘 2회 · 신규 해시hxxp://94[.]154[.]43[.]221/위 실행파일 9종과 cat.sh 가 모두 이 주소 아래에서 왔다. 파일 이름 규칙은 iran.<CPU종류> 다a6296a79f44e21b76604d2d2bbf795d2cf380f70e39d45fbf166707ff3b4a6a4306바이트 POSIX 셸 스크립트 · 오늘 8회 · 서로 다른 8곳이 배달 · 8/17 첫 관측 이후 오늘로 23일째 같은 해시다 (오늘의 주제가 아니라 배경)hxxp://185[.]93[.]89[.]72/wget위 306바이트 스크립트의 유포지. 23일 동안 파일이 한 비트도 바뀌지 않았다a8460f446be540410004b1a8db4083773fa46f7fe76fa84219c93daa1669f8f2389바이트 OpenSSH RSA 공개키 · 오늘 19회 · 서로 다른 14곳 · 주소 칸이 비어 있어 외부에서 받은 게 아니라 세션 안에서 만들어진 파일로 본다 · 8/16 이후 24일째 같은 해시4cec26851bdf98ec62e9bb7df003efe139b4014e5dc19f1ec7d56c3b79c4116d1,608바이트 Bourne-Again 셸 스크립트 · 오늘 1회 · 출처 1곳 · 8/17 이후 크기는 매번 1,608바이트인데 해시는 계속 바뀐다 · 오늘 것도 아카이브에 없던 해시다hxxp://5[.]182[.]210[.]174/ok위 스크립트의 유포지. 9/06 브리프가 이 주소의 누적 해시를 '최소 14종'으로 적었다01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b1바이트 빈 파일 · 오늘 11회 · 출처 1곳(ATK-50016C) · 8/17·8/18·8/21·8/22·8/23·8/30·9/03·9/06 브리프에도 '출처 1곳·11회'로 반복 기록된 계열이다4af5a5c98ad132095c6fbe7b02c242153a190a01cc321e50a916a0ca46fbaa629바이트 ASCII 텍스트 · 오늘 8회 · 출처 1곳 · 8/18 이후 거의 매일 나오는 상시 해시 · 주소 미기록 · 내용은 우리 데이터에 없어 판단하지 않는다151cc94bab7928de2aacf2e9bdd9a2c362a70082dbb3749d35354f45fd303ddd3,514,627바이트 · 센서 02 · 오늘 3회 · 출처 1곳 · 주소 칸 자체가 없다 · 아카이브 23일치에 없던 신규 해시01bc2eccefe19f057c593875010187cb28608d03267034ef006206061b88234a3,518,723바이트 · 센서 02 · 오늘 2회 · 출처 1곳 · 신규 해시 · 위 파일과 크기 차이가 정확히 4,096바이트인데, 그게 무엇을 뜻하는지는 근거가 없다사실
여기서 눈에 걸리는 줄이 하나 더 있습니다. 어제 11번 관측된 1바이트짜리 빈 파일입니다. 1바이트면 글자 하나 분량입니다. 오후 1시 9분에 들어온 ATK-50016C가 23.76초 동안 명령 20개를 치고 11건을 받아 갔는데, 그 11건이 전부 이 빈 파일이었습니다. 같은 해시가 8월 17일 이후 여덟 개 브리프에 똑같이 ’출처 1곳·11회’로 적혀 있습니다.
추정 비트 세트를 열었는데 케이스가 비어 있던 셈입니다. 침입에는 성공했는데 배달에는 실패한 계열로 봅니다. 문이 열렸다고 해서 항상 뭔가 들어오는 건 아닙니다.
이번엔 이름이 보였을 뿐입니다
사실 어제 파일 아홉 개의 이름에 CPU 종류가 그대로 적혀 있었습니다. 그래서 우리가 “아홉 종류다”라고 셀 수 있었습니다. 원래는 이렇게 잘 안 보입니다.
사실
우리에게는 압축을 풀어야만 드러난 유포 주소 12건이 따로 있습니다. hxxp://31[.]77[.]227[.]121/bins/ 아래의 parm · parm5 · parm6 · parm64 · parm7 · pm68k · pmips · pmpsl · pppc · psh4 · pspc · x86_64 입니다. UPX라는 도구로 실행파일을 눌러 놓으면 겉면에는 주소가 한 줄도 안 보입니다. 껍질을 벗겨야 나옵니다.
추정 이 12개의 이름 뒷자리도 CPU 종류입니다. m68k · mips · mipsl · ppc · sh4 · spc · x86_64 · arm 여러 벌이라, 어제 온 세트와 구성이 겹칩니다. 그런데 이건 ’같은 조직’의 근거가 아닙니다. 두 유포지를 잇는 값은 우리 데이터에 없습니다. 여기서 읽어야 할 것은 하나입니다 — 임베디드 리눅스를 통째로 겨냥해 CPU별로 한 벌씩 만들어 두는 방식이 여러 계열에서 공통이라는 것.
추정 그리고 하나 더. 어제 것은 겉면에 이름이 그대로 적혀 있어서 셀 수 있었습니다. 눌러서 감춘 쪽이었다면 아홉 개 중 한 줄도 안 보였을 겁니다. 오늘 세어 본 아홉이라는 숫자는, 상대가 굳이 감추지 않았기 때문에 나온 숫자입니다.
문을 열게 한 비밀번호
사실 어제 하루 로그인 시도는 1,523회, 서로 다른 175곳에서 들어왔습니다. 하루를 초로 쪼개 나누면 약 57초에 한 번꼴 — 거의 1분에 한 번씩 누가 아이디와 비밀번호를 넣어 본 셈입니다.
사실 시도된 조합은 최소 944종입니다. 그중 이 글에 옮기는 건 20종뿐입니다. 나머지 924종은 개수만 세고 값은 적지 않습니다. 서로 다른 IP 세 곳 이상에서 반복된 조합만 원문을 인용하는 것이 우리 규칙입니다. 한두 곳에서만 나온 조합은 어디선가 유출된 누군가의 진짜 계정일 수 있기 때문입니다.
아래 20종은 반대쪽입니다. 여러 곳에서 반복돼서 **‘누구의 것도 아닌 출고 기본값’**이라고 볼 수 있는 것들입니다.
| 아이디 | 비밀번호 | 서로 다른 출발지 |
|---|---|---|
| admin | admin | 17곳 |
| 345gs5662d34 | 345gs5662d34 | 13곳 |
| user | user | 6곳 |
| support | support | 5곳 |
| root | root | 5곳 |
| root | 12345678 | 5곳 |
| root | 111111 | 5곳 |
| root | 1234 | 5곳 |
| root | admin | 4곳 |
| root | password | 4곳 |
| guest | guest | 4곳 |
| test | test | 4곳 |
| root | 123321 | 4곳 |
| root | 12345 | 4곳 |
| root | 123456 | 4곳 |
| root | 123456789 | 4곳 |
| root | 1234567890 | 4곳 |
| root | 1q2w3e4r | 4곳 |
| root | vizxv | 3곳 |
| admin | password | 3곳 |
사실
스무 줄 중 절반이 아이디와 비밀번호가 똑같습니다. 나머지는 키보드에서 손가락이 지나가는 자리 그대로고요. 맨 아래 vizxv만 성격이 다릅니다. 이건 사람이 지어 쓰는 비밀번호가 아니라 공유기나 카메라 같은 기기에 공장에서 넣어 놓는 초기 비밀번호입니다.
추정 이 사전은 우리를 겨냥해 만든 게 아닙니다. 어디서나 통하는 값을 순서대로 넣어 보는 목록입니다. 어제 문이 열린 이유가 ’우리라서’가 아니라는 뜻입니다.
어제 하루 전체
사실 문이 실제로 열리는 쪽(센서 01)의 하루 집계입니다. 오른쪽 칸을 함께 봐 주세요 — 숫자 하나만 보면 크기가 안 잡힙니다.
| 항목 | 9월 8일 | 견줄 것 |
|---|---|---|
| 세션 | 1,824건 | 한 곳당 평균 10.4건 |
| 고유 출발지 | 175곳 | — |
| 로그인 시도 | 1,523회 | 하루로 약 57초에 한 번 · 한 곳당 평균 8.7회 |
| 명령 | 1,980개 | 하루로 약 44초에 한 번 |
| 포트 2222 (SSH) | 1,561세션 | 전체의 85.6% |
| 포트 2223 (텔넷) | 263세션 | 그런데 어제 완결 세션 다섯은 전부 이쪽 |
| 화면 녹화 | 1,390건 | 그중 열람 가능한 건 247건 |
| 보관 중인 검체 | 113개 | — |
사실 포트별 합(1,561 + 263)이 세션 총계 1,824와 정확히 맞습니다. 그리고 옆 서버(센서 02)는 세는 단위가 달라 더하지 않습니다. 두 서버의 고유 출발지 합은 겹침을 알 수 없어 850곳이 상한이고, 실제 값은 그보다 작습니다.
사실 어제 서버 안에서 벌어진 일을 종류별로 세면 이렇습니다.
| 무엇을 하려 했나 | 횟수 | 견줄 것 |
|---|---|---|
| 정찰 — 시스템 살펴보기 | 1,281회 | 전체 명령 1,980개의 64.7% |
| 실행 권한 부여 | 179회 | 다운로드 34회의 5.3배 |
| 다운로드 후 실행 | 34회 | — |
| 파일 다운로드 | 34회 | 위와 정확히 같다 |
| 흔적 삭제 | 26회 | — |
| 지속성 — SSH 키 심기 | 19회 | — |
사실 ’실행 권한 부여’는 파일에 “이건 실행해도 되는 파일이야”라는 표시를 붙이는 동작입니다. 리눅스에서는 이 표시가 없으면 프로그램이어도 그냥 안 돌아갑니다.
사실 ‘파일 다운로드’ 34회와 ‘다운로드 후 실행’ 34회가 정확히 같습니다. 어제 내려받은 것은 예외 없이 실행 단계로 이어졌다는 뜻입니다.
사실
다만 어제 주인공인 ATK-2872E4의 세션에 붙은 의도는 세 가지뿐입니다. 파일 다운로드 → 실행 권한 부여 → 다운로드 후 실행. 정찰도, 키 심기도, 흔적 삭제도 이 세션에는 없습니다. 그 19회와 26회는 다른 별칭들이 한 일입니다. 하루 집계에 있다고 해서 이 세션 것으로 옮겨 적지 않습니다.
옆 서버에서는 다른 문이 울렸다
사실 우리는 서버를 두 대 놓아뒀습니다. 두 번째(센서 02)는 안쪽까지 들여보내지 않는 얕은 함정이라 “어느 문을 몇 곳이 몇 번 두드렸나”만 남습니다. 로그인 성공도, 명령도, 자격증명도 여기엔 존재하지 않습니다.
| 문 (서비스) | 포트 | 두드린 횟수 | 두드린 곳 |
|---|---|---|---|
| VNC (화면공유) | 5900 | 65,322건 (96.9%) | 416곳 |
| RDP (원격 데스크톱) | 3389 | 1,443건 | 110곳 |
| SMB (파일 공유) | 445 | 331건 | 80곳 |
| LDAP (계정 조회) | 389 | 222건 | 41곳 |
| MSSQL (데이터베이스) | 1433 | 57건 | 12곳 |
| ADB (안드로이드 디버깅) | (미기록) | 26건 | (미기록) |
사실 화면공유 65,322건은 하루로 나누면 1.3초에 한 번꼴입니다. 416곳이 나눠서 만들었으니 한 곳이 평균 157번 두드린 셈이고요. 이 값은 9월 6일 브리프가 ’관측 12일 중 최고치’로 적었던 48,605건을 이틀 만에 다시 넘긴 것입니다.
사실
상대가 먼저 꺼낸 규격도 기록됩니다. 화면공유에서는 003.003이 63,822회, 003.008이 1,052회 — **구식인 003.003이 98.4%**입니다. 파일 공유 쪽은 NT LM 0.12 116 · LANMAN1.0 107 · LM1.2X002 107 · PC NETWORK PROGRAM 1.0 54 · Windows for Workgroups 3.1 54로, 1990년대 어휘가 목록 앞에 실려 옵니다. 원격 데스크톱 쿠키는 hello 845 · <ip> 442 · 빈 값 5 · 무작위 9자리 3건입니다.
추정 구식 규격을 먼저 내미는 건 상대가 옛 시스템까지 받아 주는 스캐너를 쓰고 있다는 뜻이지, 우리 서버가 구식이라는 뜻이 아닙니다.
공격자가 쓴 수법을 국제 분류표에 대응시키면
MITRE ATT&CK은 공격 수법마다 번호를 붙여 놓은 국제 목록입니다. 어제 본 행동을 그 번호에 맞추면 이렇습니다. ID를 누르면 원문 설명으로 갑니다 — 우리 말을 믿지 말고 직접 확인하시라고 링크를 겁니다.
- T1110.001Brute Force: Password Guessing — 로그인 시도 1,523회, 인용 가능 조합 20종추정
- T1078.001Valid Accounts: Default Accounts — admin/admin 17곳, root/1234 계열 다수, 완결 세션 5건 전부 로그인 성공추정
- T1105Ingress Tool Transfer — '파일 다운로드' 34회, ATK-2872E4 세션당 10건추정
- T1222.002File and Directory Permissions Modification: Linux and Mac — '실행 권한 부여' 179회추정
- T1059.004Command and Scripting Interpreter: Unix Shell — '다운로드 후 실행' 34회, cat.sh 1,875바이트 POSIX 셸 스크립트추정
- T1098.004Account Manipulation: SSH Authorized Keys — '지속성 — SSH 키 심기' 19회, 389바이트 공개키 14곳추정
- T1070Indicator Removal — '흔적 삭제' 26회추정
- T1082System Information Discovery — '정찰 — 시스템' 1,281회로 어제 의도 1위추정
- T1046Network Service Discovery — 센서 02 에서 675곳이 VNC·RDP·SMB·LDAP·MSSQL 다섯 서비스에 67,401회 접촉추정
사실 아홉 줄 전부에 [추정] 배지가 붙은 것을 봐 주세요. 우리 손에 있는 건 명령의 ’의도 분류 결과’와 ’몇 번이었나’까지입니다. 명령 원문은 없습니다. 분류표에 맞추는 일은 언제나 해석이고, 해석에는 해석이라고 적습니다.
사실 그리고 아홉 줄 중 어제 주인공이 밟은 건 세 줄뿐입니다. T1105(파일 가져오기) · T1222.002(실행 권한 주기) · T1059.004(받은 걸 실행하기). 딱 3단계, 33초입니다.
예전에 이런 모양이 있었다
추정
Mirai 봇넷 (2016). 텔넷 기본 계정 사전으로 리눅스 기기에 로그인한 뒤, CPU 종류별로 따로 만들어 둔 ELF 실행파일을 골라 내려받게 하는 구조였습니다. 어제 관측된 iran.<CPU종류> 아홉 벌 세트와 배포 방식이 같은 계열입니다. 겹치는 지점은 셋입니다. ① 텔넷 + 기본 계정 사전 ② 로더 스크립트가 CPU별 실행파일을 순서대로 시도 ③ x86 말고도 MIPS·ARM·PowerPC·SPARC·SH·m68k 같은 임베디드 CPU를 함께 겨냥. (출처 유형: 공개된 소스코드 · 미국 US-CERT/CISA 경보 TA16-288A · 다수 벤더 분석 보고서)
추정 Bashlite / Gafgyt (2014~2016). Mirai보다 먼저 같은 3단 구조를 쓰던 초기 IoT 봇넷 계열입니다. 기본 비밀번호 → 셸 스크립트 로더 → CPU별 실행파일. 10년 가까이 지난 어제도 우리 센서에 같은 모양이 들어온다는 게 요지입니다. (출처 유형: 다수 보안 벤더 기술 분석 보고서)
사실 여기서 멈춥니다. 우리는 검체 분류 서비스를 연동해 두지 않았습니다. 어제 받은 아홉 개가 이 계열이라는 판정은 하지 않습니다. 닮은 건 만드는 방식이지 이름표가 아닙니다.
그래서 뭘 해야 하나
비트 세트를 못 만들게 할 방법은 우리에게 없습니다. 바꿀 수 있는 건 우리 쪽 나사가 밖으로 얼마나 나와 있느냐입니다.
사실 1. 기본 계정·쉬운 비밀번호를 그대로 쓰고 있다 · 가능성 높음 위 표 스무 줄이 전부 장비나 배포판이 출고할 때 넣어 두는 값입니다. 어제 1,523회의 시도가 이 사전으로 들어왔고, 기록이 남은 다섯 세션은 예외 없이 로그인에 성공한 뒤 시작됩니다. 우리 서버는 일부러 열어 준 것이지만, 시도되는 사전이 무엇인지는 그대로 보여줍니다. 비밀번호 하나가 뚫린 뒤 33초 만에 외부 파일 열 개가 올라왔습니다. 실제 서버였다면 그 33초가 침해 시점입니다.
사실
2. 비밀번호 로그인을 허용하고 열쇠 방식을 안 쓰고 있다 · 가능성 높음
어제 들어온 인증 시도는 전량이 비밀번호 경로입니다. 열쇠 방식이었다면 1,523회는 성립하지 않습니다. 그런데 침입한 쪽은 성공하면 자기 열쇠부터 걸어 둡니다. 어제 키 심기가 19회, 389바이트짜리 SSH 공개키가 서로 다른 14곳에서 나왔어요. SSH 공개키는 쉽게 말해 비밀번호 없이 들어올 수 있는 여벌 열쇠입니다. 서버의 authorized_keys(허용된 열쇠 목록)라는 파일에 한 줄 적히면, 나중에 비밀번호를 바꿔도 그 열쇠로 계속 들어옵니다. 이 파일은 8월 16일 이후 24일 내내 한 비트도 안 바뀌었습니다. 다만 어제 완결성 최상위 세션들은 텔넷인데, 텔넷에는 애초에 열쇠 인증이라는 선택지가 없습니다.
사실 3. 관리 포트를 인터넷에 그대로 열어 두고 있다 · 가능성 높음 우리 서버 주소는 어디에도 알린 적이 없습니다. 그런데도 어제 문이 열리는 쪽에 175곳, 옆 서버에 675곳이 왔습니다. 두 대를 합쳐 상한 850곳입니다. 화면공유 문 하나에만 하루 6만 5천 건이 붙었어요. 실제 서버였다면 관리 화면이 그 6만 5천 번의 후보 중 하나였다는 뜻입니다. 노출 자체가 조건입니다.
추정
4. 횟수 기반 차단(fail2ban 등)만 믿고 있다 · 가능성 중간
어제는 한 곳이 같은 서버를 반복해 두드리는 방식이 아니었습니다. 곳당 평균 8.7회이고, admin/admin도 17곳에서 38회니 한 곳당 2.2회입니다. 345gs5662d34는 13곳에서 14회로 곳당 1.08회고요. ‘5번 틀리면 잠근다’ 같은 규칙은 어제 대부분의 출발지에서 발동조차 하지 않았을 겁니다. 그래서 이 통제의 부재가 어제 결정타였다고는 말할 수 없어 ’중간’으로 둡니다. IP 단위로만 걸어 두면 이렇게 얇게 퍼진 시도에는 거의 무력합니다. 계정 단위·전체 시도 횟수 기준을 함께 걸어야 걸립니다.
사실
5. 밖으로 나가는 연결을 안 막고 있다 · 가능성 높음
여기가 어제의 핵심입니다. ‘파일 다운로드’ 34회와 ‘다운로드 후 실행’ 34회가 정확히 같습니다. 어제 실제 피해를 만드는 단계는 전부 서버가 바깥으로 나가서 파일을 받아오는 동작이었어요. 유포지는 hxxp://94[.]154[.]43[.]221/ · hxxp://185[.]93[.]89[.]72/wget · hxxp://5[.]182[.]210[.]174/ok 세 곳입니다. 나가는 길이 막혀 있었다면 이 34건은 전부 실패합니다. 침입은 열쇠 문제지만 무장은 통신 문제입니다.
추정 6. 로그를 서버 안에만 두고 있다 · 가능성 중간 어제 흔적을 지우려는 의도가 26회 분류됐습니다. 우리는 허니팟이라 세션이 통째로 녹화되지만(어제 1,390건), 실제 서버는 로그를 밖으로 내보내지 않으면 지워진 뒤에 남는 게 없습니다. 다만 어제 주인공의 세션에는 흔적 삭제가 들어 있지 않아 ’중간’으로 둡니다. 33초짜리 세션은 다음 날 아침에 흔적이 남아 있지 않을 수 있습니다.
사실
어제 새로 확인된 유포지 hxxp://94[.]154[.]43[.]221/ 은 C-TAS(한국인터넷진흥원 사이버 위협정보 공유 체계) 신고 대상입니다. 다만 우리가 확인할 수 있는 것은 전송이 성공했다는 것까지이고, 상대 쪽에 실제로 적재됐는지는 따로 확인해야 합니다.
우리가 모르는 것
이 블로그가 다른 곳과 다른 지점입니다. 아는 것보다 모르는 것을 적는 데 시간을 더 씁니다.
어제 주제에 대해 확인할 수 없는 것
- [확인 불가] 기록이 남은 다섯 세션 전부 접속 프로그램 지문 칸이 비어 있습니다. 텔넷에는 지문(hassh)이 남지 않기 때문입니다. 그래서 어제 주인공
ATK-2872E4를 우리가 가진 지문 군집 39개 어디에도 붙일 수 없습니다. 어제 검체를 놓고 간 지문은SSH-2.0-Go계열 두 개(16443846…·98ddc5604…)인데, 이들이iran.*배달과 관련 있는지 우리 데이터는 연결해 주지 않습니다. - [확인 불가] 가림 처리된 출발지
94.154.x.x와 유포지94[.]154[.]43[.]221이 같은 장비인지, 같은 대역의 다른 장비인지 판단할 근거가 없습니다. 뒤 두 칸은 가려져 있고 복원하지 않습니다. - [확인 불가]
iran.sparc하나만 동적 링크·43,832바이트로 나머지 여덟과 다른 이유를 알 수 없습니다. 만드는 도구가 달랐는지, 통째로 만들기에 실패했는지 구분할 수 없습니다. - [확인 불가]
cat.sh를 포함해 어제 검체의 내용은 우리 손에 없습니다. 이 실행파일들이 무슨 일을 하는지(DDoS인지 채굴인지 프록시인지) 판단할 근거가 없습니다. 외부 검체 분류 태그도 이번엔 붙어 있지 않습니다. - [확인 불가]
ATK-50016C는 명령 20개, 다운로드 11건인데 의도 목록이 비어 있습니다. 분류기가 하나도 분류하지 못한 것인지, 분류 대상 행위가 실제로 없었던 것인지 구분할 수 없습니다. - [확인 불가] 접속 포트를 2223으로 적은 것은, 포트별 집계의 2223(263건)과 프로토콜별 집계의 텔넷(263건)이 수치상 일치하기 때문입니다. 세션 기록 자체에는 포트 칸이 없습니다. 추정 매핑입니다.
- [확인 불가] ’아카이브에 없던 신규’라는 판단은 8월 16일~9월 7일 브리프 23건과 대조한 것이지 원본 로그 전수 대조가 아닙니다. 브리프에 실리지 않은 검체는 이 비교에 잡히지 않습니다.
데이터 자체를 의심해야 하는 것
- [확인 불가] 지문의 ‘지금까지 누적 IP’ 값이 여전히 줄어들 때가 있습니다.
f555226d…(SSH-2.0-libssh_0.9.6)는 8/29 289곳 → 8/30 366곳 → 어제 226곳입니다. 9월 5일에 지적한 ‘누적이 누적이 아니다’ 상태가 사흘 뒤에도 그대로입니다. 이 칸을 ’누적’으로 읽으면 안 됩니다. - [확인 불가] 센서 02에서 한 출발지가 여러 문을 함께 훑었는지 계산할 수 없습니다. 서비스별 집계는 출발지 목록을 주지 않고, 상위 출발지 목록은 서비스별로 나뉘어 있지 않습니다. 서비스별 고유 IP 합(659)과 전체(675)의 16곳 차이도 ADB 출발지 때문으로 보이지만 확정할 수 없습니다. 0으로 적으면 거짓이 되므로 ’산출 불가’로 둡니다.
- [확인 불가] 센서 02의 검체 2건이 ADB 통로로 들어온 것인지 명시돼 있지 않습니다. 02에서 파일을 저장할 수 있는 통로가 ADB뿐이고 저장 검체 수가 2로 맞는다는 정황뿐입니다. 파일 종류 정보도 없어 무엇인지 알 수 없습니다.
- [확인 불가] 그 두 검체의 크기 차이가 정확히 4,096바이트인 것이 무엇을 뜻하는지 근거가 없습니다. 9월 3일에도 다른 검체 쌍에서 같은 4,096 차이를 기록하고 같은 결론(근거 없음)을 냈습니다.
일부러 연결하지 않은 것
- [제외] 배경 통계로 들어온 취약점 지표(추적 CVE 6,622건 · CISA KEV 390건 · 랜섬웨어 연계 확인 98건)는 KISA 보안공지에서 뽑은 값입니다. 어제 관측된 어떤 세션·검체와도 연결되지 않으며, 어제 침입은 CVE를 쓰지 않았습니다.
- [확인 불가] C-TAS 신고는 전송이 성공했다는 것까지만 확인됩니다. 어제 신규 유포지의 처리 결과도 마찬가지입니다.
아예 판단하지 않는 것
- 통신사·조직(ASN·ISP) — 관련 데이터베이스가 없습니다. 추정하지 않습니다.
- 지리 정보 — 위와 같습니다. 애초에 IP 지리정보는 귀속의 근거가 되지 못합니다. 파일 이름에
iran이라는 글자가 들어 있지만, 이건 공격자가 붙인 문자열일 뿐입니다. 국가나 주체와 연결할 근거가 우리에게 전혀 없습니다. 이 글은 어떤 국가·기업·개인도 공격자로 지목하지 않습니다. - VPN·Tor·클라우드 여부 — 판별 수단이 없습니다.
- 검체 분류(VirusTotal) — 연동돼 있지 않습니다. 어제 아홉 종이 알려진 악성코드 계열인지 이 글로는 판정하지 않습니다.
- 접속 프로그램 문자열(User-Agent) — 두 관측면 다 웹(HTTP)이 아닙니다. 01은 SSH·텔넷, 02는 SMB·RDP·VNC·MSSQL·LDAP·ADB입니다.
- 취약점 번호(CVE) 연결 — SSH·텔넷 공격은 대부분 특정 취약점을 참조하지 않고, 02도 규격을 맞추는 단계라 마찬가지입니다.
공구 세트를 통째로 들고 다니는 사람은, 그 집 나사가 무슨 머리인지 궁금해하지 않습니다. 하나만 맞으면 되니까 물어볼 이유가 없습니다.
어제 우리 서버에 올라온 아홉 벌도 같은 이유로 아홉 벌이었습니다. 공유기든 녹화기든 셋톱박스든, 뭐가 걸릴지 모르니 전부 던져 놓고 맞는 것만 돌리면 됩니다. 우리가 골라진 게 아니라, 목록에 걸린 겁니다.
그러니 이쪽에서 할 일은 세트를 못 만들게 하는 게 아닙니다. 그건 불가능합니다. 공장 초기 비밀번호를 바꾸고, 텔넷 같은 관리 포트를 인터넷에 그대로 내놓지 않고, 장비가 밖에서 파일을 받아오는 길을 막는 것. 어제 33초짜리 세션 두 번이 가리킨 곳은 정확히 거기였습니다.
관측일은 2026년 9월 8일이고, 이 글은 그다음 날 정리했습니다. 출발지 IP는 브리프에 가림 처리된 형태(94.154.x.x) 그대로 옮겼고 복원하지 않았습니다. 유포지 주소는 실수로 접속되지 않도록 디팽(hxxp://, [.]) 상태를 본문과 IOC 블록 모두에서 유지했습니다. 자격증명은 서로 다른 IP 3곳 이상에서 반복 관측된 조합 20개만 원문 인용했고, 나머지 924개는 개수만 밝히고 값은 적지 않았습니다. 통신사·국적·VPN 여부처럼 우리에게 계측 수단이 없는 항목은 추정하지 않고 “모른다”로 남겨 뒀습니다.
