SecurityHeroblog

7초짜리가 두 번 — 명찰 앞부분은 또 같았다

9월 15일 낮 12시 7분, 텔넷으로 들어온 침입이 7초 동안 명령 7개로 파일 2개를 받아 갔습니다. 파일을 꺼내 온 주소와 들어온 주소는 앞 두 자리가 같았고, 이런 모양은 9월 7일·8일에 이어 아흐레 사이 세 번째입니다. 그리고 6시간 59분 뒤, 같은 곳에서 같은 일이 한 번 더 있었습니다.

학교에서 처음 보는 아이가 우리 반 교실에 들어옵니다. 명찰을 봤더니 ‘3학년 2반’ 까지만 보이고, 이름 자리는 테이프로 가려져 있습니다. 그 아이는 빈손입니다. 그런데 7초 만에 어딘가에서 물건 두 개를 꺼내 와 우리 책상 위에 올려놓습니다. 하나를 켭니다. 그리고 나갑니다.

물건에는 사물함 꼬리표가 붙어 있습니다. 거기에도 ‘3학년 2반’ 이라고 적혀 있습니다.

같은 아이의 사물함일까요. 같은 반 다른 아이의 사물함일까요. 명찰 이름이 가려져 있으니 거기까지는 모릅니다. 알 수 있는 건 하나뿐입니다. 명찰 앞부분과 꼬리표 앞부분이 같다는 것.

이 일이 아흐레 사이에 세 번째입니다. 그리고 그 아이는 저녁에 다시 와서, 토씨 하나 안 틀리고 같은 동작을 한 번 더 했습니다.

어제 우리 서버에 찍힌 게 이겁니다.

우리 서버는 일부러 안 잠근 교실입니다

사실 우리는 허니팟 서버를 돌립니다. 허니팟은 일부러 허술하게 열어 두고 누가 들어와 무엇을 하는지 지켜보는 미끼 서버입니다. 문을 안 잠근 빈 교실이라고 보면 됩니다. 그래서 여기서 벌어진 일은 진짜 피해가 아니라 관찰 기록입니다.

사실 어제 이 교실에 들어온 쪽에는 ATK-BDB53E 라는 별칭을 붙였습니다. 별칭은 신원이 아닙니다. 글과 글 사이에서 같은 가림 처리된 출발지를 이어 부르려고 붙인 표식일 뿐입니다. 출발지 IP 는 160.119.x.x 입니다. 뒤 두 칸은 우리가 가렸고, 되돌리지 않습니다. 명찰 이름 자리에 붙인 테이프가 이겁니다. 이 별칭은 우리 아카이브 26일치(8월 16일~9월 13일) 어디에도 없던 새 별칭입니다.

사실 들어온 길은 텔넷입니다. 텔넷은 아주 오래된 원격 접속 방식인데, 주고받는 글자가 암호화되지 않고 그대로 오갑니다. 우리 서버에서는 2223번 포트가 그 길이고, 어제 텔넷 세션은 675건이었습니다.

낮 12시 7분 46초, 그리고 7초

사실 9월 15일 낮 12시 7분 46초. ATK-BDB53E 가 텔넷으로 들어와 로그인에 성공했습니다. 그때부터 12시 7분 53초까지, 7.01초 동안 명령 7개를 쳤습니다. 1초에 하나꼴입니다. 그 사이에 파일 2개가 들어왔습니다.

사실 명령에 붙은 의도는 세 가지입니다. 파일 다운로드 → 실행 권한 부여 → 다운로드 후 실행. 순서대로 ’가져온다, 실행해도 되는 파일이라고 표시한다, 돌린다’입니다. 정찰도 없고, 흔적을 지우는 동작도 없습니다. 딱 이 세 가지만 했습니다.

사실 들어온 파일 두 개는 이렇습니다. 하나는 kla.sh, 3,241바이트짜리 셸 스크립트입니다. 셸 스크립트는 리눅스에 시킬 명령을 글자로 적어 둔 파일이고, 크기는 문자 메시지 스무 줄 남짓입니다. 다른 하나는 net.x86_64, 190,632바이트짜리 ELF 실행파일입니다. ELF 는 리눅스에서 프로그램 파일이 쓰는 규격 이름이고, 이름 뒤의 x86_64 는 이 파일이 돌아갈 CPU 종류입니다. 크기로 치면 앞의 스크립트 59배입니다.

사실 실행파일은 정적 링크에 이름표가 지워진 상태입니다. 정적 링크는 프로그램이 쓸 부품을 전부 안에 넣어 통째로 만든다는 뜻입니다. 남의 기계에 가서도 부품을 빌릴 필요가 없으니 잘 돌아갑니다. 이름표를 지웠다는 건, 만든 사람이 붙여 둔 내부 표식을 배포 전에 떼어냈다는 뜻입니다. 뜯어보기 어려워집니다.

사실 이 세션은 화면이 녹화됐습니다. 다만 녹화 내용은 이 글의 재료에 들어 있지 않습니다. 접속 프로그램 지문 칸도 비어 있습니다. 텔넷에는 지문(hassh)이 남지 않기 때문입니다.

시간 순서로 늘어놓으면 이렇게 됩니다. 12:07 과 19:07 두 줄을 나란히 놓고 보세요 — 숫자가 어디까지 같은지가 오늘의 요점입니다.

  1. 사실 ATK-CA5936(130.12.x.x) SSH 로그인 성공. 3.97초 · 명령 1개 · 다운로드 2건 · 의도 5개(정찰 · 다운로드 · 실행 권한 · 다운로드 후 실행 · SSH 키 심기). 8/19 이후 반복 관측된 별칭이라 오늘의 주제가 아니다
  2. 사실 ATK-E09588(94.68.x.x) 텔넷 로그인 성공. 69.3초 · 명령 22개 · 다운로드 11건 — 11건 전부 1바이트 빈 파일(01ba4719…). 의도는 '방어 무력화' 하나뿐인데 완결성 42로 오늘 최고. 아카이브에 여덟 번 기록된 계열이라 주제에서 뺐다
  3. 사실 오늘의 주제 1회차. ATK-BDB53E(160.119.x.x) 텔넷 로그인 성공. 03:07:53Z 까지 7.01초 · 명령 7개 · 다운로드 2건. 의도는 파일 다운로드 → 실행 권한 부여 → 다운로드 후 실행. 화면 녹화됨. 지문 칸은 비어 있다(텔넷에는 hassh 가 없다)
  4. 사실 받아 간 파일은 hxxp://160[.]119[.]66[.]206/bins/kla.sh (3,241바이트 POSIX 셸 스크립트 · 39be6853…) 와 hxxp://160[.]119[.]66[.]206/bins/net.x86_64 (190,632바이트 ELF 64-bit x86-64 · 정적 링크 · 이름표 제거 · cd6ccc5d…). 둘 다 오늘 출처는 ATK-BDB53E 한 곳, 각각 관측 4회
  5. 사실 유포지 앞 두 자리 160.119 가 출발지 가림값 160.119.x.x 와 같다. 뒤 두 칸은 가려져 있어 같은 기계인지는 알 수 없다
  6. 사실 9/7: 131.123.x.x ↔ 131[.]123[.]40[.]104 · 9/8: 94.154.x.x ↔ 94[.]154[.]43[.]221 · 오늘: 160.119.x.x ↔ 160[.]119[.]66[.]206. 아흐레 사이 세 번째이고, 세 번 다 텔넷 · 셸 스크립트 + 정적 링크 ELF 조합이다
  7. 사실 'kla.sh' 라는 이름은 8/21 브리프에도 있었다. 그때 유포지는 176[.]65[.]139[.]196 이었고 오늘 해시 39be6853… 은 아카이브에 없다 — 이름만 같고 내용은 다른 파일이다
  8. 사실 주제 2회차. 같은 별칭 ATK-BDB53E 텔넷 로그인 성공. 10:07:09Z 까지 7.48초 · 명령 7개 · 다운로드 2건 · 의도 3개 동일 · 완결성 19 동일. 1회차 시작에서 6시간 59분 15.3초 뒤다
  9. 추정 명령 수 · 다운로드 수 · 의도 · 소요 시간(7.0초/7.5초)까지 같다는 것은 사람이 아니라 스크립트가 같은 절차를 두 번 돌린 모양이다. 7시간 간격이 예약 실행인지 우연인지는 알 수 없다
  10. 추정 9/8 은 CPU 아홉 종 실행파일 세트를 통째로 받아 갔는데 오늘은 x86-64 한 종만이다. 스크립트가 CPU 를 먼저 확인하고 맞는 것만 고르는 방식일 수 있으나, 스크립트 내용이 없어 확인할 수 없다
  11. 사실 ATK-CA5936 두 번째 SSH 세션. 3.86초 · 명령 1개 · 다운로드 2건 · 의도 5개 — 11:18 세션과 같은 모양
  12. 사실 세션 4,332건 · 고유 출발지 198곳 · 로그인 시도 3,620회 · 명령 4,088개 · 화면 녹화 3,487건. 9/13(세션 2,016건 · 출발지 322곳)과 견주면 출발지는 124곳 줄고 세션은 2.1배. 출발지 한 곳당 21.9건(9/13 은 6.3건)
  13. 사실 의도: 정찰—시스템 3,337 · 실행 권한 부여 180 · 파일 다운로드 45 · 다운로드 후 실행 40 · SSH 키 심기 17 · 흔적 삭제 16 · 정찰—네트워크 2 · 방어 무력화 1. 합 3,638 로 전체 명령의 89.0%, 정찰 하나가 81.6%. '파일 다운로드' 45 와 '다운로드 후 실행' 40 이 5 차이 나는 것은 두 값이 같던 대부분의 날과 다르다
  14. 사실 SSH 지문 클러스터 44개. 오늘 지문 14종 중 검체를 배달한 것은 16443846…(SSH-2.0-Go · 오늘 2곳 · 누적 21곳) 하나뿐. 최다 지문 f555226d…(libssh_0.9.6 · 오늘 14곳 · 누적 175곳)은 파일을 하나도 배달하지 않았다. 주제 세션은 텔넷이라 어느 클러스터에도 없다
  15. 사실 세션 37,557건 · 고유 출발지 539곳. VNC 35,120건(351곳 · 93.5%) · RDP 2,031건(110곳) · SMB 218건(39곳) · LDAP 132건(12곳) · MSSQL 30건(11곳) · ADB 26건, 검체 3건
  16. 사실 RDP 가 9/10 34,811건 → 9/13 42,578건(아카이브 최고) → 오늘 2,031건으로 21분의 1 이 됐다. 그때 3만 번대였던 쿠키 'mstsc' 는 오늘 목록에 없고, 1위였던 ATK-E37B01 도 오늘 상위 12곳에 없다. 오늘 쿠키는 'hello' 1,461(71.9%) · '<ip>' 405 · 무작위 문자열 4종 각 1
  17. 사실 VNC 고유 출발지 351곳은 9/8 416 · 9/13 407 · 9/10 387 다음의 네 번째 값이고, 접촉 35,120건은 9/6 이후 가장 적다. 제안된 VNC 버전은 003.003 30,437 · 003.008 4,589 (86.9% : 13.1%)
  18. 사실 SMB 방언 제안 276건 중 'SMB 2.???' 26건을 뺀 250건이 SMB1 세대(NT LM 0.12 77 · LANMAN1.0 43 · LM1.2X002 43 · PC NETWORK PROGRAM 1.0 22 · Windows for Workgroups 3.1 22 · LANMAN2.1 22 · LANMAN 21). 세션 218건보다 제안이 많은 것은 한 협상에 여러 방언을 나열하기 때문
  19. 사실 상위 4곳(ATK-943F0E 5,736 · ATK-A9F1B3 5,723 · ATK-AE6CC0 4,691 · ATK-0E3BBB 1,436)이 17,586건으로 02 전체의 46.8%. 이들이 어느 서비스를 두드렸는지는 데이터에 없다
  20. 추정 02 검체 3건은 전부 ATK-4731EE(아카이브에 없던 별칭) 출처. 0d3c687f…(46,525바이트) · d7188b8c…(153,208바이트)는 8/28·8/30·9/3·9/7 에 있던 해시이고 7a656791…(231,196바이트)만 신규. 02 에서 파일이 남는 통로는 ADB 뿐이라 ADB 로 읽지만 데이터가 명시하지는 않는다
  21. 사실 UPX 압축을 풀어야 나오는 유포지 31[.]77[.]227[.]121/bins/ 12개 URL 은 8/16 이후 반복이라 오늘의 신규 지표가 아니다. 평문 지표로는 discord 웹훅 URL 1건이 있다(디팽 유지)

사실 12:07 줄과 19:07 줄에서 다른 숫자는 소요 시간 0.47초뿐입니다. 명령 7개, 파일 2개, 의도 3개, 완결성 19. 나머지는 전부 같습니다.

저녁 7시 7분, 한 번 더

사실 첫 세션이 시작되고 6시간 59분 15.3초 뒤인 저녁 7시 7분 2초, 같은 별칭이 텔넷으로 다시 들어왔습니다. 이번엔 7.48초. 명령 7개, 파일 2개, 의도 세 가지 그대로입니다. 받아 간 파일도 같은 두 개입니다.

추정 사람이 두 번 왔다고 보기는 어렵습니다. 사람은 두 번째에 더 빠르거나 더 느립니다. 명령 개수부터 소요 시간까지 이렇게 맞는 건 같은 절차를 적어 둔 스크립트가 두 번 돈 모양입니다. 교실에 온 아이가 두 번 다 같은 쪽지를 읽으면서 움직인 셈입니다.

추정 다만 “7시간마다 온다”고는 쓰지 않습니다. 두 번뿐입니다. 두 점으로는 주기를 그을 수 없습니다. 예약 실행인지 우연인지, 우리 데이터로는 알 수 없습니다.

명찰 앞부분이 같았다 — 아흐레에 세 번째

사실 들어온 쪽의 IP 는 160.119.x.x 입니다. 파일을 꺼내 온 주소는 hxxp://160[.]119[.]66[.]206/bins/ 입니다. 앞 두 자리가 같습니다. 주소를 이렇게 이상하게 적는 건 오타가 아닙니다. 실수로 눌러 접속하는 일이 없도록 http 를 hxxp 로, 점을 [.] 로 바꿔 두는 관행입니다. 디팽(defang), 이빨을 뽑아 둔다는 뜻입니다.

사실 그리고 이 모양은 이번이 처음이 아닙니다. 아래 세 줄의 앞 두 칸만 보세요.

날짜 들어온 곳 (가림) 파일을 꺼내 온 곳 (디팽) 공통점
9월 7일 131.123.x.x 131[.]123[.]40[.]104 텔넷 · 스크립트 + 정적 링크 ELF
9월 8일 94.154.x.x 94[.]154[.]43[.]221 텔넷 · 스크립트 + 정적 링크 ELF (아홉 종)
9월 15일 160.119.x.x 160[.]119[.]66[.]206 텔넷 · 스크립트 + 정적 링크 ELF (한 종)

사실 아흐레 사이 세 번째입니다. 세 번 다 텔넷이고, 세 번 다 ‘셸 스크립트 하나 + 정적 링크 실행파일’ 조합이고, 세 번 다 파일이 /bins/ 또는 루트 경로 아래에서 왔습니다. 그리고 세 번의 출발지·유포지 여섯 주소는 서로 하나도 겹치지 않습니다.

추정 말할 수 있는 건 여기까지입니다. 뒤 두 칸이 가려져 있으니 같은 컴퓨터인지, 이웃한 다른 컴퓨터인지 판정할 수 없습니다. 명찰 앞부분이 같다고 같은 아이라고 적지 않는 것과 같습니다. 가린 것을 되돌려 맞춰 보지 않았고, 앞으로도 그러지 않습니다. 다만 ’들어온 곳과 파일 창고의 앞부분이 같다’는 형태가 아흐레에 세 번 나왔다는 것, 그리고 매번 새 출연진이었다는 것까지가 사실입니다.

사실 파일 이름 kla.sh 는 8월 21일 글에도 있었습니다. 그때는 176[.]65[.]139[.]196 에서 왔습니다. 그런데 어제 파일의 해시 39be6853… 은 아카이브에 없습니다. 해시는 파일 내용을 통째로 계산해 만든 지문이라, 한 글자만 달라도 값이 바뀝니다. 즉 이름만 같고 속은 다른 파일입니다. 같은 이름의 사물함 꼬리표를 다른 아이가 붙인 셈입니다.

추정 9월 8일에는 CPU 종류별로 아홉 벌을 통째로 받아 갔는데, 어제는 x86_64 한 벌만 받아 갔습니다. 스크립트가 들어간 기계의 CPU 를 먼저 확인하고 맞는 것만 고르는 방식일 수 있습니다. 그러나 스크립트 내용이 우리 재료에 없어 확인할 수 없습니다. 가능성으로만 둡니다.

왜 가장 시끄러운 세션이 아니라 이 세션인가

사실 어제 기록이 남은 세션은 다섯 건이고, 이 중 명령 수가 가장 많고 기록이 가장 촘촘한(완결성 42) 세션은 따로 있습니다. 낮 11시 42분의 ATK-E09588 입니다. 69.3초 동안 명령 22개, 다운로드 11건. 그런데 11건이 전부 1바이트짜리 빈 파일입니다. 글자 하나 분량입니다. 그리고 이 ‘출처 1곳·11회·빈 파일’ 조합은 8월 18일 이후 브리프에 여덟 번 똑같이 적혀 있습니다.

사실 낮 11시 18분과 저녁 8시 6분에 두 번 들어온 ATK-CA5936 도 마찬가지입니다. 8월 19일 이후 반복 등장하는 별칭이고, 어제 놓고 간 두 파일(54바이트 텍스트 · 399바이트 SSH 개인키)도 8월 19일·9월 1일·9월 6일 글에 이미 있는 것입니다.

사실 반면 ATK-BDB53E 는 별칭·유포지·해시 2종이 전부 아카이브에 없습니다. 세 단계 의도가 한 세션 안에서 이어졌고, 하루에 두 번 반복됐습니다. 가장 시끄러운 세션이 아니라 처음 보는 얼굴이 처음 보는 사물함을 연 세션을 골랐습니다.

어제 사물함에서 나온 것 — 받아 적을 값

사실 방어에 쓰실 수 있게 값을 그대로 옮깁니다. 값을 클릭하면 복사됩니다. 주소는 접속되지 않도록 변형해 두었으니 그대로 두고 쓰세요. 위쪽 네 줄이 어제 처음 나온 값이고, 아래는 몇 주째 안 바뀐 배경입니다.

sha256
39be6853a8204ce6455a373a6ffb4cb4672d4a62d90be69f7d6eeb66cda10b96kla.sh · 3,241바이트 POSIX 셸 스크립트 · 오늘 4회 · 출처 1곳(ATK-BDB53E) · 아카이브 26일치에 없던 신규 해시 · 내용은 우리 데이터에 없어 무엇을 하는지 판단하지 않는다
url
hxxp://160[.]119[.]66[.]206/bins/kla.sh위 스크립트의 유포지 · 신규 주소 · 출발지 가림값 160.119.x.x 와 앞 두 자리가 같다 · 같은 기계인지는 알 수 없다
sha256
cd6ccc5dabe85309a938e43c9508998bb0f52a9264fa9ba9276956f7fa42f48dnet.x86_64 · 190,632바이트 ELF 64-bit LSB x86-64 · 정적 링크 · 이름표 제거 · 오늘 4회 · 출처 1곳 · 신규 해시 · 외부 분류 태그 없음
url
hxxp://160[.]119[.]66[.]206/bins/net.x86_64위 실행파일의 유포지 · 9/8 의 아홉 벌과 달리 x86-64 한 종만 관측됐다
sha256
a8460f446be540410004b1a8db4083773fa46f7fe76fa84219c93daa1669f8f2389바이트 OpenSSH RSA 공개키 · 오늘 14회 · 서로 다른 14곳 · 주소 미기록 · 8/16 이후 반복 관측된 같은 파일 · 배달한 별칭은 14곳 중 10곳까지만 표기돼 있다 (배경)
sha256
01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b1바이트 빈 파일 · 오늘 11회 · 출처 1곳(ATK-E09588) · 8/18 이후 여덟 번 브리프에 '출처 1곳·11회'로 반복된 계열 (배경)
sha256
43728fbfb98bb39ff61a2db0fc2905bd6937997062b05b9ab8b186fdee18c09a399바이트 OpenSSH 개인키 · 오늘 2회 · 출처 ATK-CA5936 · 8/19·9/1·9/6 브리프에 있던 같은 해시 (배경)
sha256
00b6f15c2274420217ed3098a9f5f00545bf1793d7a324fd18a7809cbbf5b12b54바이트 ASCII 텍스트 · 오늘 2회 · 출처 ATK-CA5936 · 8/19 이후 반복 (배경)
sha256
7a656791b445fff02ac6e9dd1081cc265db935476a9ee71139cb6aef52102e2b231,196바이트 · 센서 02 · 오늘 2회 · 출처 1곳(ATK-4731EE · 신규 별칭) · 주소 칸 없음 · 신규 해시 · ADB 로 들어온 것으로 읽지만 데이터가 명시하지 않는다

사실 위 네 줄에서 눈여겨볼 것은 ’오늘 4회’입니다. 주제 세션 두 건의 다운로드 수를 더하면 4인데, 파일별 관측 횟수를 더하면 8입니다. 어디서 두 배가 됐는지 우리 데이터로는 알 수 없습니다. 재시도까지 셌을 수도 있고, 기록에 실리지 않은 세션이 더 있었을 수도 있습니다. 아래 ’우리가 모르는 것’에 다시 적습니다.

962개는 일부러 가렸습니다

사실 어제 하루 로그인 시도는 3,620회, 서로 다른 198곳에서 들어왔습니다. 하루를 초로 나누면 24초에 한 번꼴입니다. 한 곳당 평균 18.3회고요.

사실 시도된 아이디·비밀번호 조합 중 이 글에 옮기는 건 20종뿐입니다. 나머지 962종은 개수만 세고 값은 적지 않습니다. 서로 다른 IP 세 곳 이상에서 반복된 조합만 원문을 인용하는 것이 우리 규칙입니다. 한두 곳에서만 나온 조합은 어디선가 유출된 누군가의 진짜 계정일 수 있기 때문입니다. 명찰의 이름을 가리는 것과 같은 이유입니다. 우리가 모르는 사람의 것일 수 있는 건 보여주지 않습니다.

아래 20종은 반대쪽입니다. 여러 곳에서 반복돼서 **‘누구의 것도 아닌 출고 기본값’**이라고 볼 수 있는 것들입니다.

아이디 비밀번호 서로 다른 출발지
admin admin 20곳
345gs5662d34 345gs5662d34 14곳
root admin 10곳
root 123456 9곳
root 12345 8곳
root 1234 8곳
admin password 7곳
root root 7곳
root 111111 7곳
root 123 7곳
root (빈칸) 6곳
root 123123 6곳
root password 6곳
root abcd1234 5곳
root 123321 5곳
root 1q2w3e4r 5곳
root 12345678 5곳
root 123456789 5곳
root 3245gs5662d34 5곳
user user 4곳

사실 admin/admin 은 20곳에서 39회 들어왔습니다. 한 곳당 두 번 남짓입니다. 열한 번째 줄은 비밀번호 칸이 아예 비어 있는 조합입니다. 아이디만 넣고 엔터를 친 시도가 여섯 곳에서 있었다는 뜻입니다.

추정 이 목록은 우리를 겨냥해 만든 게 아닙니다. 어디서나 통하는 값을 순서대로 넣어 보는 사전입니다. 어제 교실 문이 열린 이유가 ’우리라서’가 아니라는 뜻입니다.

사실 다만 주제 세션 두 건이 어떤 조합으로 들어왔는지는 모릅니다. 세션 단위 자격증명은 우리 재료에 없습니다. 위 표는 하루 전체의 표이지, 그 아이가 쓴 열쇠가 아닙니다.

어제 하루 전체

사실 문이 실제로 열리는 쪽(센서 01)의 하루 집계입니다. 오른쪽 칸을 함께 봐 주세요 — 숫자 하나만 보면 크기가 안 잡힙니다.

항목 9월 15일 견줄 것
세션 4,332건 9/13(2,016건)의 2.1배 · 한 곳당 평균 21.9건
고유 출발지 198곳 9/13(322곳)보다 124곳 적다
로그인 시도 3,620회 24초에 한 번 · 한 곳당 18.3회
명령 4,088개 21초에 하나
포트 2222 (SSH) 3,656세션 전체의 84.4%
포트 2223 (텔넷) 675세션 그런데 어제 주제 세션은 이쪽
화면 녹화 3,487건 세션의 80.5%

사실 9월 13일과 견주면 모양이 뒤집혔습니다. 그날은 322곳이 6.3건씩 왔고, 어제는 198곳이 21.9건씩 왔습니다. 오는 곳은 줄고, 한 곳이 하는 일은 3.5배 늘었습니다. 포트별 합(3,656 + 675)은 세션 총계 4,332와 정확히 맞습니다.

사실 어제 서버 안에서 벌어진 일을 종류별로 세면 이렇습니다.

무엇을 하려 했나 횟수 견줄 것
정찰 — 시스템 살펴보기 3,337회 전체 명령 4,088개의 81.6%
실행 권한 부여 180회 다운로드 45회의 4배
파일 다운로드 45회 —
다운로드 후 실행 40회 위와 5 차이
지속성 — SSH 키 심기 17회 —
흔적 삭제 16회 —
정찰 — 네트워크 2회 —
방어 무력화 1회 —

사실 ’실행 권한 부여’는 파일에 “이건 실행해도 되는 파일이야”라는 표시를 붙이는 동작입니다. 리눅스에서는 이 표시가 없으면 프로그램이어도 그냥 안 돌아갑니다. 어제 주제 세션의 두 번째 단계가 이것이었습니다.

사실 ‘파일 다운로드’ 45회와 ‘다운로드 후 실행’ 40회가 5 차이입니다. 아카이브 대부분의 날은 이 두 값이 정확히 같았습니다. 어제는 받아 놓고 실행까지 가지 않은 명령이 다섯 번 있었다는 뜻입니다. 어느 세션의 것인지는 데이터에 없습니다.

사실 하나 더 있습니다. SSH 로 들어온 쪽은 접속 프로그램의 지문(hassh)이 남습니다. 어제 지문은 14종이었는데, 그중 파일을 실제로 놓고 간 지문은 16443846…(SSH-2.0-Go) 하나뿐입니다. 오늘 2곳, 누적 21곳입니다. 어제 가장 많이 온 지문 f555226d…(libssh_0.9.6 · 오늘 14곳 · 누적 175곳)은 파일을 하나도 놓고 가지 않았습니다. 많이 온다고 뭔가 두고 가는 건 아닙니다. 그리고 어제 주인공은 텔넷이라 이 지문 목록 어디에도 없습니다.

옆 서버 — 들여보내지 않는 쪽

사실 우리는 서버를 두 대 놓아뒀습니다. 두 번째(센서 02)는 안쪽까지 들여보내지 않는 얕은 함정이라 “어느 문을 몇 곳이 몇 번 두드렸나”만 남습니다. 로그인 성공도, 명령도, 자격증명도 여기엔 존재하지 않습니다. 어제는 수집이 정상이었습니다.

문 (서비스) 포트 두드린 횟수 두드린 곳
VNC (화면공유) 5900 35,120건 (93.5%) 351곳
RDP (원격 데스크톱) 3389 2,031건 110곳
SMB (파일 공유) 445 218건 39곳
LDAP (계정 조회) 389 132건 12곳
MSSQL (데이터베이스) 1433 30건 11곳
ADB (안드로이드 디버깅) (미기록) 26건 (미기록)

사실 화면공유 35,120건은 하루로 나누면 2.5초에 한 번꼴입니다. 351곳이 나눠서 만들었으니 한 곳이 평균 100번 두드린 셈입니다. 그런데 이 값은 9월 6일 이후 가장 적은 날입니다. 351곳이라는 출발지 수도 9/8(416) · 9/13(407) · 9/10(387) 다음입니다.

사실 어제 옆 서버에서 제일 큰 변화는 원격 데스크톱입니다. 9월 10일 34,811건, 9월 13일 42,578건 — 아카이브 최고치였습니다. 그게 어제 2,031건입니다. 21분의 1입니다. 2초에 한 번 울리던 문이 43초에 한 번으로 돌아갔습니다. 그때 3만 번대로 찍혔던 접속 이름표 mstsc 는 어제 목록에 없고, 그때 1위였던 별칭 ATK-E37B01 도 어제 상위 12곳에 없습니다. 어제 이름표는 hello 1,461(71.9%) · <ip> 405 · 무작위 문자열 4종 각 1건입니다.

추정 사흘 동안 넘치던 게 사라졌다는 것까지가 사실입니다. 왜 끝났는지는 모릅니다. 상대가 그만뒀는지, 다른 곳으로 갔는지, 우리가 알 방법은 없습니다.

사실 상대가 먼저 꺼낸 규격도 기록됩니다. 화면공유에서는 003.003 이 30,437회, 003.008 이 4,589회 — **구식인 003.003 이 86.9%**입니다. 파일 공유 쪽은 제안 276건 중 SMB 2.??? 26건을 뺀 250건이 SMB1 세대입니다(NT LM 0.12 77 · LANMAN1.0 43 · LM1.2X002 43 · PC NETWORK PROGRAM 1.0 22 · Windows for Workgroups 3.1 22 · LANMAN2.1 22 · LANMAN 21). 세션 218건보다 제안 수가 많은 건 한 번 협상할 때 여러 규격을 줄줄이 늘어놓기 때문입니다.

추정 구식 규격을 먼저 내미는 건 상대가 옛 시스템까지 받아 주는 스캐너를 쓰고 있다는 뜻이지, 우리 서버가 구식이라는 뜻이 아닙니다.

사실 옆 서버의 상위 4곳(ATK-943F0E 5,736 · ATK-A9F1B3 5,723 · ATK-AE6CC0 4,691 · ATK-0E3BBB 1,436)이 17,586건으로 **전체의 46.8%**입니다. 네 곳이 절반 가까이 만들었습니다. 이들이 어느 문을 두드렸는지는 데이터에 없습니다. 화면공유가 93.5%라 그쪽으로 읽고 싶어지지만, 그건 근거가 아닙니다.

사실 옆 서버에 남은 검체는 3건이고 전부 ATK-4731EE 라는 처음 보는 별칭에서 왔습니다. 둘은 8월 28일 이후 네 번 나온 해시이고, 7a656791…(231,196바이트) 하나만 새 해시입니다. 두 서버의 고유 출발지 합은 겹침을 알 수 없어 737곳이 상한이고, 실제 값은 그보다 작습니다.

공격자가 쓴 수법을 국제 분류표에 대응시키면

MITRE ATT&CK 은 공격 수법마다 번호를 붙여 놓은 국제 목록입니다. 어제 본 행동을 그 번호에 맞추면 이렇습니다. ID 를 누르면 원문 설명으로 갑니다 — 우리 말을 믿지 말고 직접 확인하시라고 링크를 겁니다.

  • T1078.001Valid Accounts: Default Accounts — 텔넷 로그인 성공 2회. 어떤 자격증명이었는지는 세션 단위로 데이터에 없다추정
  • T1110.001Brute Force: Password Guessing — 하루 로그인 시도 3,620회, 인용 가능 조합 20종 · 비공개 962종추정
  • T1021Remote Services — 텔넷(2223) 원격 접속추정
  • T1105Ingress Tool Transfer — '파일 다운로드' 의도, kla.sh · net.x86_64 수신추정
  • T1222.002File and Directory Permissions Modification: Linux and Mac — '실행 권한 부여' 의도추정
  • T1059.004Command and Scripting Interpreter: Unix Shell — '다운로드 후 실행' 의도, POSIX 셸 스크립트 수신추정
  • T1608.001Stage Capabilities: Upload Malware — 출발지와 앞 두 자리가 같은 주소의 /bins/ 경로에서 배포추정
  • T1098.004Account Manipulation: SSH Authorized Keys — 당일 '지속성 — SSH 키 심기' 17회 (주제 세션 아님)추정
  • T1070Indicator Removal — 당일 '흔적 삭제' 16회 (주제 세션 아님)추정
  • T1562Impair Defenses — 당일 '방어 무력화' 1회. 무엇을 껐는지 알 수 없어 하위 기법은 붙이지 않는다추정

사실 열 줄 전부에 [추정] 배지가 붙은 것을 봐 주세요. 우리 손에 있는 건 명령의 ’의도 분류 결과’와 ’몇 번이었나’까지입니다. 명령 원문은 없습니다. 분류표에 맞추는 일은 언제나 해석이고, 해석에는 해석이라고 적습니다.

사실 그리고 열 줄 중 어제 주인공이 밟은 건 네 줄입니다. T1021(텔넷으로 들어오기) · T1105(파일 가져오기) · T1222.002(실행 권한 주기) · T1059.004(받은 걸 실행하기). 뒤쪽 세 줄 — 키 심기, 흔적 삭제, 방어 무력화 — 은 어제 다른 별칭들이 한 일입니다. 하루 집계에 있다고 해서 이 세션 것으로 옮겨 적지 않습니다.

전에 이런 모양이 있었다

추정 Mirai 봇넷 (2016). 텔넷의 약한 자격증명으로 리눅스 장비에 들어간 뒤, 셸 스크립트 로더가 CPU 종류별로 만들어 둔 정적 링크 ELF 를 내려받아 실행하는 구조였습니다. 2016년에 소스가 공개된 뒤 파생본이 많습니다. 어제 주제 세션의 조합 — 텔넷 로그인 성공 → /bins/ 경로의 셸 스크립트 1개 + 정적 링크·이름표 제거 ELF 1개 → 실행 권한 부여 → 실행 — 이 이 구조와 부합합니다. (출처 유형: 미국 US-CERT 경보 TA16-288A · 공개된 소스 코드 · 다수 벤더 분석 보고서)

사실 여기서 멈춥니다. 명령 원문도 없고, 검체 분류 서비스도 연동돼 있지 않습니다. 어제 받은 두 파일이 이 계열이라는 판정은 하지 않습니다. 닮은 건 만드는 방식이지 이름표가 아닙니다.

그래서 뭘 해야 하나

낯선 아이가 다른 반 사물함을 여는 걸 우리가 막을 방법은 없습니다. 바꿀 수 있는 건 우리 교실 문이 어떻게 잠겨 있고, 교실에서 밖으로 나가는 길이 어떻게 돼 있느냐입니다.

사실 1. 기본 계정·쉬운 비밀번호를 그대로 쓰고 있다 · 가능성 높음 위 표 스무 줄이 전부 장비나 배포판이 출고할 때 넣어 두는 값입니다. 어제 로그인에 성공한 세션 다섯 건이 실재하고, 시도된 조합의 상위는 전부 기본값·연속 숫자입니다. 비밀번호 하나가 뚫린 뒤 7초 안에 스크립트와 실행파일이 내려왔습니다. 실제 서버였다면 그 7초가 침해 시점입니다.

사실 2. 비밀번호 로그인을 허용하고 열쇠 방식을 안 쓰고 있다 · 가능성 높음 텔넷에는 열쇠 인증이라는 선택지 자체가 없습니다. SSH 쪽 3,656세션도 비밀번호 추측이 3,620회 들어왔습니다. 열쇠 방식만 허용했다면 이 3,620회는 전부 인증 단계에서 끝납니다. 그리고 침입한 쪽은 성공하면 자기 열쇠부터 걸어 둡니다. 어제 키 심기가 17회, 389바이트짜리 SSH 공개키가 서로 다른 14곳에서 나왔어요. SSH 공개키는 쉽게 말해 비밀번호 없이 들어올 수 있는 여벌 열쇠입니다. 서버의 authorized_keys(허용된 열쇠 목록) 파일에 한 줄 적히면, 나중에 비밀번호를 바꿔도 그 열쇠로 계속 들어옵니다.

사실 3. 관리 포트를 인터넷에 그대로 열어 두고 있다 · 가능성 높음 우리 서버 주소는 어디에도 알린 적이 없습니다. 그런데도 어제 문이 열리는 쪽에 198곳, 옆 서버에 539곳이 왔습니다. 두 대를 합쳐 상한 737곳입니다. 화면공유 문 하나에만 하루 3만 5천 번이 붙었어요. 노출 자체가 조건입니다.

추정 4. 횟수 기반 차단(fail2ban 등)이 없다 · 가능성 중간 어제는 한 곳이 여러 번 두드리는 날이었습니다. 한 곳당 21.9세션, 9월 13일의 3.5배입니다. admin/admin 도 20곳에서 39회니 한 곳이 같은 조합을 두 번씩 넣은 셈입니다. 같은 출발지의 반복을 막는 규칙이 효과를 보는 모양입니다. 다만 주제 세션이 몇 번째 시도에 성공했는지는 데이터에 없습니다. 첫 시도에 맞는 조합은 이 규칙으로 못 막습니다. 그래서 ’높음’으로 두지 않습니다.

사실 5. 밖으로 나가는 연결을 안 막고 있다 · 가능성 높음 어제 주제 세션의 명령 7개 중 실제 피해를 만드는 단계는 서버가 바깥으로 나가서 파일을 받아오는 동작이었습니다. 나가는 길이 막혀 있었다면 이 세션은 다운로드 단계에서 끊깁니다. 어제 하루 ‘파일 다운로드’ 45회 전부가 같은 자리에서 멈춥니다. 교실에서 사물함까지 가는 복도가 잠겨 있으면, 아이는 빈손인 채로 나가야 합니다. 침입은 열쇠 문제지만 무장은 통신 문제입니다.

추정 6. 로그를 서버 안에만 두고 있다 · 가능성 중간 어제 흔적을 지우려는 의도가 16회, 방어를 끄려는 의도가 1회 분류됐습니다. 우리는 허니팟이라 세션의 80.5%(3,487건)를 따로 녹화해 두기 때문에 지워도 남습니다. 실제 서버는 로그를 밖으로 내보내지 않으면 지워진 뒤에 남는 게 없습니다. 다만 어제 주인공의 세션에는 흔적 삭제도 방어 무력화도 없습니다. 그 16회·1회는 다른 세션의 것이라 ’중간’으로 둡니다.

사실 어제 새로 확인된 유포지 hxxp://160[.]119[.]66[.]206/ 은 C-TAS(한국인터넷진흥원 사이버 위협정보 공유 체계) 신고 대상입니다. 다만 우리가 확인할 수 있는 것은 전송이 성공했다는 것까지이고, 상대 쪽에 실제로 적재됐는지는 따로 확인해야 합니다.

우리가 모르는 것

이 블로그가 다른 곳과 다른 지점입니다. 아는 것보다 모르는 것을 적는 데 시간을 더 씁니다.

어제 주제에 대해 확인할 수 없는 것

  • [확인 불가] 유포지 160[.]119[.]66[.]206 과 침입 출발지 160.119.x.x 가 같은 기계인지 알 수 없습니다. 뒤 두 칸은 가려져 있고 복원 대상이 아닙니다. ’앞 두 자리가 같다’까지만 말합니다. 9월 7일·8일 사례도 마찬가지입니다.
  • [확인 불가] 다운로드 수가 맞지 않습니다. 주제 세션 두 건의 다운로드 합은 4인데, kla.sh 4회와 net.x86_64 4회를 더하면 8입니다. 파일 횟수가 재시도까지 세는지, 기록에 실리지 않은 ATK-BDB53E 세션이 더 있는지 구분할 수 없습니다.
  • [확인 불가] 두 세션이 같은 자격증명으로 들어왔는지 알 수 없습니다. 세션 단위 자격증명은 데이터에 없습니다.
  • [확인 불가] 12시 7분과 19시 7분의 6시간 59분 15초 간격이 예약 실행인지 우연인지 알 수 없습니다. 두 번뿐이라 주기라고 부르지 않습니다.
  • [확인 불가] kla.sh 가 무엇을 하는지, net.x86_64 가 무엇인지 알 수 없습니다. 스크립트 내용도, 검체 분류 태그도 데이터에 없고, VirusTotal 은 연동돼 있지 않습니다. ’x86-64 한 종만 받아 갔다’가 스크립트의 선택 결과인지도 확인할 수 없습니다.
  • [확인 불가] 완결성 점수의 계산식이 데이터에 없습니다. 의도가 하나뿐인 ATK-E09588 이 42로, 의도 세 개인 주제 세션(19)보다 높은 이유를 설명할 수 없습니다.
  • [확인 불가] ‘방어 무력화’ 1회가 ATK-E09588 세션의 것이라는 읽기는 개수가 맞는다는 데 근거한 추론입니다. 세션과 의도 횟수를 1:1 로 잇는 칸은 없습니다.

데이터 자체를 의심해야 하는 것

  • [확인 불가] 옆 서버의 상위 12곳이 어느 서비스를 두드렸는지 데이터에 없습니다. 화면공유가 93.5%라 그쪽으로 읽고 싶어지지만 근거가 아닙니다.
  • [확인 불가] 옆 서버의 검체 3건이 ADB 로 들어왔다고 데이터가 명시하지 않습니다. ADB 세션 26건·검체 3건이라는 수치와 ’02 에서 파일이 남는 통로는 ADB 뿐’이라는 구조로 읽었을 뿐입니다.
  • [확인 불가] 화면공유 버전 제안 합(35,026)이 세션 수(35,120)보다 94건 적고, 원격 데스크톱 이름표 합(1,870)이 세션 수(2,031)보다 161건 적습니다. 협상 단계까지 가지 않은 세션으로 보이나 데이터가 설명하지 않습니다.
  • [확인 불가] 389바이트 SSH 공개키(a8460f44…)를 놓고 간 곳은 14곳인데, 별칭은 10곳까지만 표기돼 있어 나머지 4곳을 모릅니다.
  • [확인 불가] 옆 서버에서 한 출발지가 여러 문을 함께 훑었는지 계산할 수 없습니다. 서비스별 고유 출발지 합(523)이 전체(539)보다 작아 겹침을 역산할 수도 없습니다. 0으로 적으면 거짓이 되므로 ’산출 불가’로 둡니다.

일부러 연결하지 않은 것

  • [제외] 배경 통계로 들어온 취약점 지표(추적 CVE 7,628건 · KEV 397건 · 랜섬웨어 연계 확인 100건)는 KISA 보안공지에서 뽑은 값입니다. 어제 관측된 어떤 세션·검체와도 연결되지 않으며, 어제 침입은 CVE 를 쓰지 않은 자격증명 추측입니다.
  • [제외] 압축을 풀어야만 드러나는 유포지 31[.]77[.]227[.]121/bins/ 12건은 8월 16일 이후 반복 지표라 어제의 신규 지표가 아닙니다. 어제 주제와 잇는 값도 없습니다.
  • [확인 불가] C-TAS 신고는 전송이 성공했다는 것까지만 확인됩니다. 어제 신규 유포지가 KISA 에 적재됐는지는 따로 확인해야 합니다.

아예 판단하지 않는 것

  • 통신사·조직(ASN·ISP) — 관련 데이터베이스가 없습니다. 추정하지 않습니다. 앞 두 자리가 같다는 사실에서 ’같은 통신사’를 끌어내지 않는 이유도 이것입니다.
  • 지리 정보 — 위와 같습니다. 애초에 IP 지리정보는 귀속의 근거가 되지 못합니다. 이 글은 어떤 국가·기업·개인도 공격자로 지목하지 않습니다.
  • VPN·Tor·클라우드 여부 — 판별 수단이 없습니다.
  • 검체 분류(VirusTotal) — 연동돼 있지 않습니다. 검체 분류는 MalwareBazaar 태그를 쓰는데, 어제 두 파일에는 태그가 없습니다.
  • 접속 프로그램 문자열(User-Agent) — 두 관측면 다 웹(HTTP)이 아닙니다. 01 은 SSH·텔넷, 02 는 SMB·RDP·VNC·MSSQL·LDAP·ADB 입니다.
  • 취약점 번호(CVE) 연결 — SSH·텔넷 공격은 대부분 특정 취약점을 참조하지 않고, 02 도 규격을 맞추는 단계라 마찬가지입니다.

명찰 앞부분이 같은 아이가 아흐레 사이 세 번 왔습니다. 세 번 다 다른 명찰이었고, 세 번 다 같은 반 꼬리표가 붙은 사물함에서 물건을 꺼내 왔습니다. 그리고 어제는 저녁에 한 번 더, 7초 남짓 만에 똑같이.

우리는 세 번의 앞부분이 같다는 것까지만 적습니다. 같은 아이인지, 같은 반 다른 아이인지, 이름 자리의 테이프를 뜯어 확인하지 않습니다. 모르는 것을 모른다고 적는 것도 관측의 일부입니다.

대신 이쪽에서 할 수 있는 건 분명합니다. 출고 기본 비밀번호를 바꾸고, 텔넷 같은 관리 포트를 인터넷에 그대로 내놓지 않고, 서버가 밖에서 파일을 받아오는 길을 막는 것. 어제 7초짜리 세션 두 번이 가리킨 곳은 정확히 거기였습니다.


관측일은 2026년 9월 15일이고, 이 글은 그다음 날 정리했습니다. 출발지 IP 는 브리프에 가림 처리된 형태(160.119.x.x) 그대로 옮겼고 복원하지 않았습니다. 유포지 주소는 실수로 접속되지 않도록 디팽(hxxp://, [.]) 상태를 본문과 IOC 블록 모두에서 유지했습니다. 자격증명은 서로 다른 IP 3곳 이상에서 반복 관측된 조합 20개만 원문 인용했고, 나머지 962개는 개수만 밝히고 값은 적지 않았습니다. 통신사·국적·VPN 여부처럼 우리에게 계측 수단이 없는 항목은 추정하지 않고 “모른다”로 남겨 뒀습니다.