SecurityHeroblog

해시의 유통기한은 하루였다 — 안 상한 것은 맨 앞 한 줄

어제 우리 허니팟에 어제 그제와 똑같은 주소에서 똑같은 이름의 파일들이 다시 내려왔습니다. 그런데 실행파일 세 개는 내용물이 통째로 바뀌어 있었고, 맨 앞의 로더 스크립트 하나만 이틀째 같았습니다. 차단 목록에 적는 값마다 유통기한이 다르다는 것을, 어제 데이터가 직접 재 줬습니다.

냉장고를 열면 우유와 소금이 같이 들어 있습니다. 둘 다 먹는 건데 버티는 시간이 다릅니다. 우유는 며칠이면 상하고, 소금은 몇 년을 둬도 그대로입니다.

그래서 냉장고를 정리할 때 우리는 물건마다 다른 날짜를 봅니다. 전부 같은 날 버리지도 않고, 전부 그냥 두지도 않습니다.

보안에서 쓰는 차단 목록도 냉장고와 똑같습니다. 목록에는 여러 종류의 값이 섞여 들어갑니다. 파일 지문, 주소, 파일 이름, 행동 순서. 그런데 이 값들의 유통기한이 서로 다릅니다. 어떤 건 하루면 상하고 어떤 건 아흐레를 갑니다.

어제 우리 서버에 남은 기록이 그 유통기한을 실제로 재 줬습니다.

어제, 목록 하나가 하루 만에 상했습니다

사실 먼저 숫자부터 놓겠습니다. 그제(8/23) 우리는 실행파일 세 개의 지문을 받아 적었습니다. c71d74ce…(48,352바이트) · 344bbdca…(57,104바이트) · 9f1897ce…(58,848바이트). 어제 같은 주소에서 같은 이름으로 내려온 파일 세 개의 지문은 이렇습니다. 29fb2896…(40,372바이트) · 95f5156a…(55,648바이트) · 6210a1c6…(57,456바이트).

사실 셋 다 다릅니다. 한 개도 안 맞습니다.

여기서 낯선 말 하나를 풀고 가겠습니다. 해시(지문)는 파일 전체를 계산해서 뽑아낸 64자리 값입니다. 파일 안의 글자 하나만 달라져도 값이 통째로 바뀝니다. 그래서 “이 파일은 위험함”을 기록할 때 이 값을 씁니다. 사람 지문처럼 파일마다 하나씩 붙는다고 보면 됩니다.

사실 파일이 놓인 주소는 그제와 같은 hxxp://176[.]65[.]139[.]202 입니다. 주소는 일부러 망가뜨려 적었습니다(hxxp://, [.]) — 복사해 붙여 넣어도 접속되지 않습니다. 파일 이름도 daredevil.armv7l·daredevil.mips·daredevil.mipsel 로 그제와 같습니다. 들어온 별칭도 ATK-31C779(94.154.x.x)로 같고, 들어온 통로도 텔넷으로 같습니다.

사실 같은 자리, 같은 이름, 다른 내용물. 크기는 각각 7,980 · 1,456 · 1,392바이트씩 줄었습니다. 첫 번째는 원래 크기의 약 16.5%가 깎였고, 나머지 둘은 2%대입니다.

추정 그제 적어 둔 지문 세 개로 만든 차단 목록은 24시간 만에 전부 빗나갔습니다. 우유였던 겁니다.

어제 하루를 시간 순서로

시간 순서로 늘어놓으면 이렇게 됩니다. 맨 위 다섯 줄의 시각을 눈여겨보세요. 시·분이 아니라 초 단위로 붙어 있습니다.

  1. 사실 어제의 주제 세션 ①. ATK-31C779(94.154.x.x), 텔넷 로그인 성공. 약 4.79초 동안 명령 3개, 다운로드 3건. 의도 4종 — 정찰(시스템) · 파일 다운로드 · 실행 권한 부여 · 다운로드 후 실행. completeness 22. TTY 녹화됨(내용 미포함). 텔넷이라 지문·클라이언트 값은 빈 문자열이다
  2. 사실 주제 세션 ②. 첫 세션 종료 약 18.4초 뒤 재진입. 약 4.70초, 명령 3개, 다운로드 4건, 의도 동일 4종, completeness 25
  3. 사실 주제 세션 ③. 두 번째 종료 약 71.9초 뒤. 약 4.73초, 명령 3개, 다운로드 4건, completeness 25 — ② 와 모든 값이 같다
  4. 사실 주제 세션 ④. 어제 이 별칭의 세션 중 가장 길고(약 11.55초) 가장 무겁다 — 명령 6개, 다운로드 6건, completeness 33(어제 최고값). 앞뒤 세션의 두 배 분량이다
  5. 사실 주제 세션 ⑤. 약 4.99초, 명령 3개, 다운로드 3건, completeness 22. 첫 세션 시작부터 여기까지 약 2분 55.3초, 세션 5건의 지속 시간 합계는 약 30.8초다. 5회 모두 login_success=true 이고 어느 시점에도 차단되지 않았다
  6. 사실 ATK-31C779 이 유일한 전달 출처인 검체는 6종이다 — ① hxxp://176[.]65[.]139[.]202:80/telnet.sh, 2,107바이트 POSIX 셸 스크립트(ad19b70c…, 6회) ② daredevil.armv7l, 40,372바이트 ELF 32-bit LSB ARM EABI4(29fb2896…, 5회) ③ daredevil.mips, 55,648바이트 ELF 32-bit MSB MIPS-I(95f5156a…, 5회) ④ daredevil.mipsel, 57,456바이트 ELF 32-bit LSB MIPS-I(6210a1c6…, 3회) ⑤ daredevil.armv5l, 50,096바이트 ELF 32-bit LSB ARM version 1(eb05c127…, 1회) ⑥ daredevil.armv6l, 55,772바이트 ELF 32-bit LSB ARM EABI4(06c0d953…, 1회). ELF 5종은 전부 statically linked · no section header 이며, 각 1개씩 합치면 261,451바이트다
  7. 사실 그제(8/23) 이 유포지에서 나온 ELF 3종의 지문·크기는 c71d74ce…(48,352) · 344bbdca…(57,104) · 9f1897ce…(58,848)였고, 어제 같은 이름의 3종은 29fb2896…(40,372) · 95f5156a…(55,648) · 6210a1c6…(57,456)로 지문이 모두 다르며 크기는 각각 7,980 · 1,456 · 1,392바이트씩 줄었다. 반면 로더 telnet.sh 는 ad19b70c…·2,107바이트로 이틀 연속 동일하다
  8. 사실 8/19 의 주제 별칭 ATK-CA5936 이 닷새 만에 재등장했다. 어제 이 별칭이 유일한 전달 출처인 검체는 399바이트 OpenSSH 개인키(43728fbf…, 1회)와 54바이트 ASCII 텍스트(00b6f15c…, 1회)로, 8/19 에 기록된 지문과 완전히 같다. 다만 8/19 에는 두 파일이 각 3회였고 어제는 각 1회다
  9. 사실 SSH 클라이언트 지문 묶음이 총 41개로 확인 범위 최다다(8/17 33 → 8/18 36 → 8/19 37 → 8/20 37 → 8/21 38 → 8/22 40 → 8/23 40 → 어제 41). 가장 큰 묶음은 f555226df1963d1d3c09daf865abdc9a(SSH-2.0-libssh_0.9.6)로 어제 IP 19곳·누적 216곳이며 당일·누적 모두 최댓값이다. 목록 9개 중 검체를 실제로 내려보낸 묶음은 16443846184eafde36765c9bab2f4397(SSH-2.0-Go, 어제 IP 4곳·누적 28곳) 하나뿐이고, 8/21·8/22·8/23 은 0개였다
  10. 사실 389바이트 OpenSSH RSA 공개키(a8460f44…)를 서로 다른 출처 19곳이 남겼다. 8/16~8/23 과 같은 지문이므로 아흐레 연속이다. 출처 수는 8/20 8곳 → 8/21 10곳 → 8/22 8곳 → 8/23 6곳으로 사흘째 줄다가 어제 19곳으로 반등했고, 의도 분류의 '지속성 — SSH 키 심기'도 8/21 11회 → 8/22 9회 → 8/23 7회 → 어제 22회로 함께 반등했다
  11. 사실 hxxp://185[.]93[.]89[.]72/wget 의 306바이트 POSIX 셸 스크립트(a6296a79…)가 어제도 같은 지문으로 나왔다 — 8/17~8/23 에 이어 여드레 연속이다. 다만 출처는 4곳으로, 8/17 6곳 · 8/18 13곳 · 8/19 7곳 · 8/20 8곳 · 8/21 5곳 · 8/22 15곳 · 8/23 6곳과 비교해 최저값이다
  12. 사실 hxxp://5[.]182[.]210[.]174/ok 에서 1,608바이트 Bourne-Again 셸 스크립트가 또 새 지문(7fc87b54…)으로 내려왔다. 출처는 ATK-10149C 한 곳·1회로 그제와 같은 별칭이다. 이 URL 의 누적 지문은 8/18 이래 8종이 됐다 — 크기는 매번 1,608바이트로 같다
  13. 사실 집계값: 세션 809건, 고유 출발지 201곳, 포트 2222(SSH) 512건 · 2223(텔넷) 297건, 로그인 시도 410회, 명령 612개, TTY 녹화 258건. 텔넷 비중은 약 36.7% 로 8/23 의 18.2% 의 두 배다. 의도 분포는 정찰(시스템) 130회, 실행 권한 부여 123회, 파일 다운로드 54회, 다운로드 후 실행 47회, 지속성(SSH 키 심기) 22회, 흔적 삭제 21회이며 합계 397회로 명령 총계 612개와 215회 차이가 난다
  14. 사실 원문을 싣지 않고 개수만 센 자격증명 조합이 308건이다. 아카이브 8개 기록의 값(8/16 934 · 8/17 830 · 8/18 1,388 · 8/19 848 · 8/20 440 · 8/21 806 · 8/22 703 · 8/23 1,007) 어느 것보다도 적다. 인용 기준(서로 다른 IP 3곳 이상)을 넘긴 조합은 6개뿐이다

사실 표에서 제일 먼저 보이는 건 맨 위 다섯 줄입니다. 13시 25분 50초에 시작해서 13시 28분 46초에 끝났습니다. 약 2분 55초 안에 다섯 번입니다. 그 안에서 실제로 붙어 있던 시간을 다 합쳐도 약 30.8초 뿐입니다. 나머지는 나갔다 들어오는 사이의 빈 시간입니다.

3분 안에 다섯 번, 다섯 번 다 열렸습니다

사실 어제 주제로 삼은 것은 별칭 ATK-31C779(94.154.x.x)입니다. 텔넷으로 들어왔습니다. 텔넷은 아주 오래된 원격 접속 방식입니다. 쉽게 말해 인터넷 너머에서 그 기계의 명령창을 직접 두드릴 수 있게 열어 둔 통로인데, 비밀번호가 암호화되지 않고 그대로 흘러갑니다.

사실 다섯 번의 간격은 약 18.4초 · 71.9초 · 30.8초 · 23.5초입니다. 컵라면 물 붓고 기다리는 3분, 그 안에 다섯 번이 다 들어갑니다.

사실 그리고 다섯 번 다 로그인에 성공했습니다. 다섯 번 다 아무것도 막지 않았습니다.

사실 네 번째 세션만 모양이 다릅니다. 다른 넷은 약 4.7~5.0초에 명령 3개인데, 네 번째만 약 11.55초에 명령 6개, 다운로드 6건입니다. 앞뒤 세션의 딱 두 배 분량입니다. completeness 값도 33 으로 어제 가장 높습니다.

추정 5초짜리를 네 번, 11초짜리를 한 번. 사람이 손으로 치면 이렇게 고르게 안 나옵니다. 정해진 순서가 그대로 재생됐다는 쪽에 가깝습니다.

사실 다만 여기서 선을 그어야 합니다. 우리는 출발지 IP 를 그대로 두지 않고 ATK- 로 시작하는 별칭으로 바꿔서 기록합니다. 이때 소금(salt)이라는 값을 섞기 때문에 날짜가 다르면 같은 IP 라도 다른 별칭이 됩니다. 그제 기록의 ATK-31C779 와 어제 기록의 ATK-31C779 는 같은 하루 안에서만 이어 볼 수 있는 값입니다.

받아간 것이 무엇이었나 — 어제는 다섯 종류였습니다

사실 어제 이 별칭 한 곳만 전달 출처로 기록된 파일은 여섯 개입니다.

파일 크기 정체 그제와 비교
telnet.sh 2,107바이트 POSIX 셸 스크립트 지문·크기 그대로
daredevil.armv5l 50,096바이트 ELF 32-bit LSB ARM version 1 어제 처음
daredevil.armv6l 55,772바이트 ELF 32-bit LSB ARM EABI4 어제 처음
daredevil.armv7l 40,372바이트 ELF 32-bit LSB ARM EABI4 지문 교체
daredevil.mips 55,648바이트 ELF 32-bit MSB MIPS-I(빅엔디안) 지문 교체
daredevil.mipsel 57,456바이트 ELF 32-bit LSB MIPS-I(리틀엔디안) 지문 교체

낯선 말이 넷 있으니 그 자리에서 풀겠습니다.

  • 셸 스크립트 — 명령을 순서대로 적어 둔 메모지입니다. 사람이 한 줄씩 치는 대신 파일 하나를 실행하면 적힌 순서대로 돌아갑니다. 2,107바이트면 A4 한 장에 못 미치는 글자 분량입니다.
  • ELF — 리눅스에서 쓰는 실행파일 형식입니다. 윈도우의 .exe 에 해당한다고 보면 됩니다.
  • statically linked(정적 링크) — 필요한 부품을 전부 안에 넣고 다닌다는 뜻입니다. 밖에서 뭘 빌리지 않으니 그 CPU 를 쓰는 리눅스라면 종류·버전과 상관없이 돌아갑니다.
  • no section header(섹션 헤더 없음) — 파일 안의 구역을 나눠 적어 둔 안내판을 떼어냈다는 뜻입니다. 뜯어보는 쪽을 어렵게 만듭니다.

사실 armv5l·armv6l·armv7l·mips·mipsel 은 전부 CPU 종류입니다. 서로 호환되지 않습니다. 그제는 세 종류였는데 어제는 다섯 종류가 됐습니다. 어느 것이 맞는지 모르니 다 챙겨 두는 방식이고, 챙겨 두는 칸이 어제 두 개 늘었습니다.

사실 그리고 어제도 일반 PC·서버에서 도는 x86 계열은 한 건도 없습니다. ARM·MIPS 계열은 공유기·IP 카메라·NAS 같은 장비에서 흔한 규격입니다. 사무실 책상 위가 아니라 천장과 벽에 붙어 있는 기계 쪽입니다.

사실 다섯 개를 하나씩만 합치면 261,451바이트입니다. 약 255KB, 스마트폰 사진 한 장보다 작습니다. 이게 5초짜리 세션 안에서 들어옵니다.

그리고 안 상한 것 — 맨 앞 한 줄

사실 telnet.sh 는 지문 ad19b70c…, 크기 2,107바이트입니다. 그제와 한 글자도 다르지 않습니다. 어제 이 유포지에서 유일하게 안 바뀐 파일입니다.

사실 이 파일은 로더입니다. 실행파일을 직접 담고 있지 않고, “어디서 무엇을 받아다 실행해라”를 적어 둔 메모지 역할을 합니다. 어제 관측된 순서에서 맨 앞에 오는 한 장입니다.

추정 그러니까 어제는 두 가지가 동시에 벌어졌습니다. 실어 나른 목록의 내용물은 하루 만에 전부 갈렸고, 그 목록을 들고 있는 메모지는 그대로였습니다. 지문으로 만든 차단 목록이 어디를 겨누고 있었느냐에 따라, 어제 결과가 정반대로 갈립니다.

사실 어제 데이터로 잴 수 있는 값들의 유통기한을 그대로 늘어놓으면 이렇습니다. 아카이브에서 같은 값이 연속으로 확인된 날수입니다.

목록에 적는 값 연속 확인 어제 상태
daredevil.* ELF 지문 1일 하루 만에 3종 전부 교체
hxxp://5[.]182[.]210[.]174/ok 의 지문 1일 또 새 지문. 8/18 이래 누적 8종
telnet.sh 지문 ad19b70c… 2일 그대로
유포지 176[.]65[.]139[.]202 2일 그대로
9바이트 ASCII 4af5a5c9… 7일 그대로
hxxp://185[.]93[.]89[.]72/wget 의 a6296a79… 8일 그대로. 출처는 4곳으로 최저
389바이트 공개키 a8460f44… 9일 그대로. 출처는 19곳으로 최다

사실 같은 표 안에 하루짜리와 아흐레짜리가 같이 있습니다. 우유와 소금을 한 칸에 넣어 두고 같은 날짜를 붙여 둔 셈입니다.

사실 hxxp://5[.]182[.]210[.]174/ok 는 특히 눈에 걸립니다. 크기는 매번 1,608바이트로 똑같은데 지문만 계속 달라집니다. 8/18 이후 이 주소 하나에서 누적 여덟 종류가 나왔습니다.

어떻게 들어왔나 — 어제도 비밀번호입니다

사실 어제 로그인 시도는 410회입니다. 아카이브 8개 기록 어느 값보다도 낮습니다(8/17 1,168 · 8/18 1,581 · 8/19 975 · 8/20 2,251 · 8/22 3,324 · 8/23 1,187).

추정 하루 전체를 덮는 수치라고 놓으면 약 3분 30초에 한 번꼴로 누군가 문고리를 돌려 본 셈입니다. 세션 809건은 약 1분 47초에 한 번꼴입니다. 조용한 편이었습니다.

사실 그런데 뚫린 건 조용한 날에 뚫렸습니다. 어제 완결성 상위 5개 세션이 전부 로그인 성공이고, 그 5건이 모두 같은 별칭입니다.

사실 서로 다른 IP 3곳 이상에서 관측된 조합만 추리면 이렇습니다.

아이디 비밀번호 관측된 IP 수
345gs5662d34 345gs5662d34 19곳
admin admin 15곳
root 3245gs5662d34 11곳
root (빈 비밀번호) 4곳
root root 3곳
root 123456 3곳

사실 네 번째 줄을 보세요. 비밀번호 칸이 비어 있습니다. 서로 다른 네 곳이 각각 “그냥 빈칸”으로 로그인을 시도했습니다. 그게 통하는 기계가 있다는 걸 알고 있다는 뜻입니다.

사실 그리고 308개 조합은 싣지 않았습니다. 서로 다른 IP 3곳 미만에서만 나온 것들입니다. 한 곳에서만 나온 조합은 어딘가에서 실제로 유출된 누군가의 계정일 수 있어서, 값은 쓰지 않고 개수만 셉니다. 308건은 아카이브 8일 중 가장 적은 값입니다.

사실 숫자 하나가 세 군데에서 겹칩니다. 345gs5662d34 조합의 출처가 19곳, 가장 큰 SSH 지문 묶음의 어제 IP 가 19곳, 389바이트 공개키를 남긴 출처가 19곳입니다.

추정 같은 19곳일 수 있습니다. 그런데 데이터가 이 세 값을 서로 이어 주지 않습니다. 우연히 겹친 것과 구분할 방법이 없어서, 여기서는 “같다”고 쓰지 않습니다.

닷새 만에 돌아온 두 파일

사실 어제 기록에 8/19 의 주제 별칭이었던 ATK-CA5936 이 다시 나왔습니다. 남긴 파일은 399바이트 OpenSSH 개인키(43728fbf…)와 54바이트 ASCII 텍스트(00b6f15c…) 두 개입니다. 둘 다 8/19 에 기록된 지문과 완전히 같습니다. 다만 8/19 에는 각 3회였고 어제는 각 1회입니다.

사실 같은 날 SSH 지문 묶음 중 검체를 실제로 내려보낸 묶음은 딱 하나였습니다. 16443846184eafde36765c9bab2f4397(SSH-2.0-Go)입니다. 8/19 기록이 ATK-CA5936 의 지문으로 적어 둔 값과 같습니다. 8/21·8/22·8/23 은 이런 묶음이 0개였으니 나흘 만입니다.

사실 여기서도 선을 긋습니다. 지문 묶음은 접속 프로그램이 처음 건네는 인사말의 구성으로 만듭니다. 그러니까 이건 빌드의 지문이지 사람의 지문이 아닙니다. 같은 배포판·같은 라이브러리를 쓰는 서로 모르는 사람들도 같은 값을 갖습니다. “같은 도구”까지만 말할 수 있고 “같은 조직”이라고는 말할 수 없습니다.

사실 그리고 정작 어제 가장 완결성 높은 침입 다섯 건에는 이 방법을 쓸 수 없습니다. 텔넷이라 지문과 클라이언트 값이 빈 문자열이기 때문입니다. 텔넷에는 그 인사말 절차가 애초에 없습니다.

사실 한편 389바이트 OpenSSH RSA 공개키(a8460f44…)는 아흐레 연속 같은 지문으로 나왔습니다. 출처 수는 사흘째 줄다가 어제 19곳으로 반등했고, ‘SSH 키 심기’ 의도도 7회에서 22회로 함께 튀었습니다. 389바이트면 문자 메시지 두어 줄 분량입니다. 이 작은 파일이 authorized_keys(허용된 열쇠 목록)에 한 줄로 들어가면, 비밀번호 없이 들어올 수 있는 열쇠가 현관에 하나 걸립니다. 비밀번호를 전부 바꿔도 그 열쇠는 남습니다.

남기고 간 것

어제 관측된 검체와 주소 전부입니다. 값을 누르면 복사됩니다 — 지문은 읽으라고 있는 게 아니라 차단 목록에 넣으라고 있습니다. hxxp:// 와 [.] 는 그대로 두었습니다. 어느 줄이 하루짜리이고 어느 줄이 아흐레짜리인지, 설명 칸을 같이 보세요.

sha256
ad19b70c4e523ef24baf5e062d2200e139b619b56049219d41cd0397faff2c402,107바이트 POSIX 셸 스크립트(로더) · 출처 1곳(ATK-31C779) · 6회 · 8/23 과 지문·크기가 완전히 동일하다. 어제 이 유포지에서 유일하게 바뀌지 않은 파일
url
hxxp://176[.]65[.]139[.]202:80/telnet.sh위 로더의 주소. 이틀 연속 같은 자리·같은 내용
sha256
29fb2896608e2b8250ae782a68c1c10e0fc02b2e312da5a603cd8d491f4d0f8940,372바이트 ELF 32-bit LSB ARM EABI4 · statically linked · no section header · 출처 1곳(ATK-31C779) · 5회 · 8/23 의 c71d74ce…(48,352바이트)를 대체한 신규 지문
url
hxxp://176[.]65[.]139[.]202/daredevil.armv7l이름은 그제와 같고 내용만 교체됐다
sha256
95f5156abcddb7fba0f4adb0915769fbad23256ac6344c791f10fdf08a1057ba55,648바이트 ELF 32-bit MSB MIPS-I(빅엔디안) · statically linked · no section header · 출처 1곳(ATK-31C779) · 5회 · 8/23 의 344bbdca…(57,104바이트)를 대체한 신규 지문
url
hxxp://176[.]65[.]139[.]202/daredevil.mips이름은 그제와 같고 내용만 교체됐다
sha256
6210a1c6ff3c633555c8578b34caf5df58462fdfc65226b75ac2a0773e682a2b57,456바이트 ELF 32-bit LSB MIPS-I(리틀엔디안) · statically linked · no section header · 출처 1곳(ATK-31C779) · 3회 · 8/23 의 9f1897ce…(58,848바이트)를 대체한 신규 지문
url
hxxp://176[.]65[.]139[.]202/daredevil.mipsel이름은 그제와 같고 내용만 교체됐다
sha256
eb05c12761cf7d2da32e0d6c1079e41f4239c94300d87e39c678bd345dc25b2250,096바이트 ELF 32-bit LSB ARM version 1 · statically linked · no section header · 출처 1곳(ATK-31C779) · 1회 · 그제 이 유포지에 없던 아키텍처다
url
hxxp://176[.]65[.]139[.]202/daredevil.armv5l어제 새로 생긴 칸 ①
sha256
06c0d953a56629d869230c7962836b020e0977e8086c1fbfb7e6470a6047dbc055,772바이트 ELF 32-bit LSB ARM EABI4 · statically linked · no section header · 출처 1곳(ATK-31C779) · 1회 · 그제 이 유포지에 없던 아키텍처다
url
hxxp://176[.]65[.]139[.]202/daredevil.armv6l어제 새로 생긴 칸 ②. ELF 5종을 하나씩만 합치면 261,451바이트다
sha256
a6296a79f44e21b76604d2d2bbf795d2cf380f70e39d45fbf166707ff3b4a6a4306바이트 POSIX 셸 스크립트 · 출처 4곳(ATK-BF4E13 · ATK-EEF0E3 · ATK-338C04 · ATK-E74D5F) · 4회 · 8/17~8/23 과 같은 지문으로 여드레 연속이며, 출처 수는 8일 중 최저다
url
hxxp://185[.]93[.]89[.]72/wget여드레 연속 같은 주소·같은 지문
sha256
a8460f446be540410004b1a8db4083773fa46f7fe76fa84219c93daa1669f8f2389바이트 OpenSSH RSA 공개키 · 출처 19곳(ATK-EF2527 · ATK-E2942E · ATK-D9A633 · ATK-CC691B · ATK-53EC65 · ATK-9C026E · ATK-9AAD87 · ATK-2A9957 · ATK-51B27B · ATK-2476C1 외, 기록에는 10곳까지만 표기돼 있다) · 19회 · URL 미기록 · 8/16~8/23 과 같은 지문으로 아흐레 연속. 8/17·8/18 기록은 이 파일을 '외부 다운로드가 아니라 세션 안에서 만들어진 것'으로 적었다
sha256
7fc87b548727d0d5cbef66216e496bb18b2b877075896fb7df181554e23b8e271,608바이트 Bourne-Again 셸 스크립트 · 출처 1곳(ATK-10149C) · 1회 · 신규 지문. 크기는 늘 1,608바이트인데 지문은 8/18 이래 누적 8종째다
url
hxxp://5[.]182[.]210[.]174/ok자리도 크기도 그대로인데 내용만 계속 바뀌는 주소
sha256
43728fbfb98bb39ff61a2db0fc2905bd6937997062b05b9ab8b186fdee18c09a399바이트 OpenSSH 개인키 · 출처 1곳(ATK-CA5936) · 1회 · URL 미기록 · 8/19 와 같은 지문·같은 별칭이며 닷새 만의 재관측이다. 심어진 것인지 가져가려던 것인지는 기록이 구분해 주지 않는다
sha256
00b6f15c2274420217ed3098a9f5f00545bf1793d7a324fd18a7809cbbf5b12b54바이트 ASCII 텍스트 · 출처 1곳(ATK-CA5936) · 1회 · URL 미기록 · 위 개인키와 같은 별칭이고 8/19 와 같은 지문이다. 내용이 기록에 없어 무엇인지 판단하지 않는다
sha256
4af5a5c98ad132095c6fbe7b02c242153a190a01cc321e50a916a0ca46fbaa629바이트 ASCII 텍스트 · 출처 1곳(ATK-BECAD3) · 4회 · URL 미기록 · 8/18~8/23 에도 같은 지문이 있었으므로 이레 연속이다. 내용 미포함

사실 이 목록을 위에서 아래로 읽으면 어제의 이야기가 그대로 보입니다. 위쪽 여섯 줄은 어제 새로 적어야 했던 값이고, 아래쪽 세 줄은 이레·여드레·아흐레째 같은 값입니다. 같은 목록에 들어 있지만 버티는 시간이 다릅니다.

공격 단계로 옮기면

관측된 행동을 MITRE ATT&CK 라는 국제 분류표에 대응시키면 이렇습니다. ID 를 누르면 원문 설명을 직접 볼 수 있습니다 — 우리 말을 믿지 않고 확인하셔도 됩니다. 전부 [추정]입니다. 우리가 본 것은 명령이지 공격자의 의도가 아닙니다.

  • T1110Brute Force — 로그인 시도 410회, 인용 기준을 넘긴 조합 6개 + 비인용 308건추정
  • T1078.001Valid Accounts: Default Accounts — admin/admin, root/root, root/123456 등으로 완결 세션 5건 전부 로그인 성공추정
  • T1082System Information Discovery — '정찰 — 시스템' 130회추정
  • T1105Ingress Tool Transfer — '파일 다운로드' 54회, '다운로드 후 실행' 47회, 검체 12종추정
  • T1222.002File and Directory Permissions Modification: Linux — '실행 권한 부여' 123회추정
  • T1098.004Account Manipulation: SSH Authorized Keys — '지속성 — SSH 키 심기' 22회, 389바이트 공개키가 출처 19곳추정
  • T1070Indicator Removal — '흔적 삭제' 21회추정
  • T1608.001Stage Capabilities: Upload Malware — 176[.]65[.]139[.]202 한 호스트가 이틀 연속 로더 1종과 아키텍처별 ELF 를 함께 내보냈고, 그 사이 ELF 만 교체됐다추정
  • T1027.002Obfuscated Files or Information: Software Packing — 압축을 풀어야만 나온 지표가 기록에 있다추정

사실 마지막 줄에 단서를 붙여야 합니다. T1027.002 의 근거인 ’압축을 풀어야 나온 지표’는 다른 호스트(31[.]77[.]227[.]121)의 검체에서 나온 것입니다. 어제의 daredevil 다섯 개가 압축돼 있는지는 기록에 없습니다. 그래서 이 줄은 어제 검체에 대한 판단이 아닙니다. T1070(흔적 지우기)도 명령 원문이 없어 무엇을 지웠는지 말할 수 없어 하위 기법을 붙이지 않았습니다.

어디서 본 것 같다면

추정 2016년부터 이어진 Mirai 봇넷 계열 및 그 파생과 배포 형태가 겹칩니다. 텔넷 기본 계정으로 들어간 뒤 로더 셸 스크립트를 받고, CPU 종류별로 따로 빌드한 정적 링크 실행파일을 순서대로 내려받아 맞는 것을 실행하는 방식입니다. 어제 관측된 armv5l·armv6l·armv7l·mips·mipsel 구성과 x86 부재는 서버가 아니라 임베디드 리눅스 장비를 노리는 이 계열의 배포 형태와 맞습니다. 소스가 공개된 뒤 파생 계열이 자주 다시 빌드해 지문이 자꾸 바뀌는 점도 어제 관측과 겹칩니다. 미국 CISA(옛 US-CERT)의 경보 TA16-288A 와 여러 벤더의 공개 분석 보고서가 남아 있는 사건입니다.

추정 Gafgyt(Bashlite/Lizkebab/Torlus) 계열과도 맞물립니다. 텔넷·SSH 의 약한 자격증명으로 들어간 뒤 셸 명령만으로 아키텍처별 바이너리를 받아 실행하는 구조입니다. 명령 몇 줄로 전 과정이 끝나는 짧은 세션 형태가 어제의 약 4.7~11.5초와 겹칩니다.

사실 다만 우리 데이터에는 악성코드의 계열명을 판정할 근거가 없습니다. 그래서 “형태가 비슷하다”까지만 씁니다. daredevil 은 관측된 파일 이름일 뿐이고, 계열 이름이나 캠페인 이름이 아닙니다.

그래서 뭘 해야 하나

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

  1. 기본 계정·초기 비밀번호를 바꿉니다. 어제 완결 세션 5건은 전부 로그인 성공입니다. 위 표의 여섯 조합 중 하나라도 쓰고 계시다면 그게 전부입니다. 로그인 성공에서 실행파일 확보까지 약 4.7초면 끝났습니다.
  2. 텔넷 같은 원격 접속을 끕니다. 어제 텔넷은 297건입니다. 전체 세션이 8/23 의 1,523건에서 809건으로 절반 아래로 줄었는데 텔넷은 8/19 299 · 8/20 297 · 8/21 281 · 8/23 277 과 같은 띠에 그대로 있습니다. 총량과 상관없이 늘 두들겨진다는 뜻입니다. 그리고 텔넷은 비밀번호가 그대로 흘러가고 키 인증이라는 선택지 자체가 없습니다 — 끄는 것 말고 방법이 없습니다. 공유기·홈캠 설정에서 “원격 접속”, “Telnet”, “원격 관리”를 찾아 꺼 두시면 됩니다.
  3. 장비가 밖에서 파일을 받아오지 못하게 막습니다. 어제 파일 다운로드 54회, 실행 권한 부여 123회, 다운로드 후 실행 47회입니다. 로그인은 이미 뚫린 뒤이므로 여기가 실제 피해를 막는 마지막 지점입니다. 밖으로 나가는 길이 없었다면 로더 메모지만 남고 실행파일 261,451바이트는 도착하지 못합니다.
  4. 로그인 실패·반복 접속을 제한합니다. 같은 출발지가 3분 안에 다섯 번 들어왔는데 아무것도 걸리지 않았습니다. 다만 이것 하나로는 절반만 막힙니다 — 345gs5662d34 조합은 19곳에서 정확히 19회, root/3245gs5662d34 는 11곳에서 11회로 한 곳당 딱 한 번씩입니다. 이렇게 흩어서 두드리는 쪽에는 IP 단위 제한이 걸리지 않습니다. 두 형태가 같은 날 같이 관측됐습니다.
  5. ~/.ssh/authorized_keys 파일이 바뀌면 알림을 받습니다. 어제 키 심기 의도 22회, 같은 지문의 공개키를 남긴 출처 19곳입니다. 심어진 열쇠는 비밀번호를 전부 바꿔도 그대로 남습니다.
  6. 로그를 장비 밖에 저장합니다. 흔적 삭제 의도가 어제 21회로, 8/23 의 7회에서 세 배가 됐습니다. 로그가 기계 밖에 나가 있지 않으면 지워진 뒤에는 되돌릴 수 없습니다. 그리고 어제 이 글이 성립한 이유가 로그입니다 — 그제 기록이 남아 있었기에 “이름은 같은데 지문이 갈렸다”를 알 수 있었습니다. 하루치만 보면 어제 파일 여섯 개는 전부 ’처음 보는 것’으로 기록됩니다.
  7. 지문 목록에는 유통기한이 있다고 전제하고 운영합니다. 어제가 그 증거입니다. 실행파일 지문은 24시간을 못 버텼고, 로더 지문 하나는 이틀째 유효했습니다. 목록을 지문으로만 채우지 말고 잘 안 바뀌는 값(주소, 이름 규칙, 행동 순서)을 함께 두는 쪽이 어제 데이터가 가리키는 방향입니다.

사실 “비밀번호 대신 키 인증을 쓰세요”는 어제 데이터로는 중간 정도의 권고입니다. 로그인이 성공한 완결 세션이 전부 텔넷이고, 텔넷에는 키 인증이 없기 때문입니다.

어제 하루 전체

세션 809건
고유 IP 201곳
로그인 시도 410회
실행된 명령 612개
SSH (2222) 512건
텔넷 (2223) 297건

출발지 한 곳당 평균 약 4.0세션, 약 2.0회 시도입니다.

사실 8/23 과 나란히 놓으면 세션은 1,523→809, 로그인 시도는 1,187→410 으로 줄었습니다. 세션 809건은 확인된 값(8/20 2,607 · 8/22 3,553 · 8/23 1,523) 중 최저입니다. 그런데 텔넷만 277→297 로 그대로입니다. 총량이 빠진 결과 텔넷 비중은 18.2%에서 약 36.7%로 두 배가 됐습니다.

추정 텔넷 쪽은 전체 유행과 무관하게 따로 도는 흐름으로 보입니다. 조용한 날이라고 노출 위험이 줄지 않습니다. 어제가 그 예입니다 — 가장 조용한 날에 아키텍처가 세 종에서 다섯 종으로 늘었습니다.

어제 관측된 유포지·C2(176[.]65[.]139[.]202, 185[.]93[.]89[.]72, 5[.]182[.]210[.]174)는 C-TAS 로 신고했습니다. 전송 계층 성공까지만 확인되며, KISA 측 적재 여부는 별도 확인이 필요합니다.

60초로 보기

같은 관측분을 짧은 영상으로도 만들었습니다. 영상은 바뀐 세 개와 안 바뀐 한 개를 나란히 보여주는 쪽에 초점을 맞췄습니다.

우리가 모르는 것

이 블로그는 아는 것과 모르는 것을 나눠서 씁니다. 어제 관측분에서 확인할 수 없었던 것들입니다.

  • 어느 세션에서 무엇을 받았는지. 주제 세션 5건의 다운로드 합은 20건(3+4+4+6+3)인데, 이 별칭이 유일한 전달 출처인 검체 6종의 관측 횟수 합은 21건(6+5+5+3+1+1)입니다. 1건이 어긋납니다. 기록이 세션과 검체를 하나씩 이어 주지 않습니다. 특히 로더 telnet.sh 의 관측 6회가 세션 5건보다 많은 이유를 확인할 수 없습니다.
  • ELF 세 개의 지문이 바뀐 이유. 컴파일 옵션이 달라진 것인지, 접속할 주소 같은 설정값이 새로 박힌 것인지, 아예 다른 코드인지 판단할 근거가 없습니다. 크기가 각각 7,980 · 1,456 · 1,392바이트 줄었다는 사실만 확인됩니다. 검체 내부를 뜯어본 결과는 이 기록에 없습니다.
  • 로더 안에 무엇이 적혀 있는지. telnet.sh 가 이틀 연속 같은 지문이라는 건 확인되지만, 그 안에서 어떤 아키텍처를 어떤 순서로 시도하는지는 알 수 없습니다. 그제 3종 · 어제 5종이라는 차이가 로더를 바꾸지 않고 유포지에 파일만 더 얹어서 생긴 것인지도 확인할 수 없습니다.
  • 176[.]65[.]139[.]196(8/21)과 176[.]65[.]139[.]202(그제·어제)가 같은 운영자인지. 앞 세 마디가 같다는 것 외에 근거가 없습니다. 우리에겐 사업자 정보조차 없습니다. 8/23 에 남긴 이 항목이 어제도 그대로입니다.
  • 8/19 의 ATK-CA5936 과 어제의 ATK-CA5936 이 같은 사람인지. 별칭이 같으니 같은 마스킹 출발지를 가리키는 건 맞습니다. 그러나 별칭은 신원이 아닙니다. 닷새 사이 그 주소를 쓰는 주체가 바뀌었을 가능성을 배제할 수 없습니다.
  • 399바이트 개인키가 심어진 것인지 가져가려던 것인지. 기록이 이 둘을 구분해 주지 않습니다. 다운로드 목록에 있지만 주소 칸이 비어 있습니다. 8/19 에 남긴 같은 항목이 그대로 남아 있습니다.
  • 지문 묶음 목록이 상위 몇 개인지 전수인지. 묶음 총계는 41인데 목록은 9개입니다. 따라서 “검체를 내려보낸 묶음이 어제 하나뿐”이라는 것은 그 9개 범위 안에서의 사실입니다.
  • TTY 녹화 수치 두 개가 왜 다른지. 집계값은 258인데 다른 칸에는 156으로 적혀 있습니다. 두 값의 정의 차이가 설명돼 있지 않아 어느 쪽이 실제 보유 수인지 단정하지 않습니다. 어느 경우에도 녹화 내용은 이 글에 포함하지 않습니다.
  • 명령 612개와 의도 분류 합계 397회의 차이 215. 약 35.1%가 분류되지 않았습니다. 그 안에 어제 서술하지 않은 다른 의도가 있을 수 있습니다.
  • 세 군데의 ’19곳’이 같은 집합인지. 자격증명 조합 345gs5662d34, libssh_0.9.6 지문 묶음, 389바이트 공개키가 모두 19입니다. 기록이 세 값을 이어 주지 않아 우연의 일치와 구분할 수 없습니다.
  • Discord 웹훅 주소 1건. 어제 검체에서 나온 것인지 누적 목록인지 명시돼 있지 않아 어제 서술에 쓰지 않았습니다.
  • C-TAS 신고의 적재·활용 여부. 전송 계층 성공만 확인됐습니다.
  • 배경 취약점 통계. 추적 CVE 6,579건 · CISA KEV 386건 · 랜섬웨어 확인 98건은 KISA 보안공지에서 뽑은 배경 수치입니다. 어제 허니팟 관측과 직접 연결되지 않습니다 — 어제 SSH·텔넷 공격에서 CVE 를 참조한 흔적은 없습니다.

그리고 애초에 확인할 수단이 없는 것들입니다. 이건 모르는 것과 다릅니다 — 추정하지 않는 쪽이 정답입니다.

  • ASN·ISP — GeoIP·ASN 데이터베이스를 갖고 있지 않습니다. 추정하지 않습니다.
  • 지리 위치 — 동일합니다. 덧붙여 IP 지리정보는 애초에 귀속 근거가 되지도 않습니다. 어느 나라·어느 기업·어느 개인도 이 글에서 공격자로 지목되지 않습니다.
  • VPN·Tor·클라우드 여부 — 판별 수단이 없습니다.
  • VirusTotal 탐지 결과 — 미연동입니다. 어제의 daredevil ELF 다섯 개가 백신에서 어떻게 탐지되는지, 어떤 계열로 불리는지 말할 수 없습니다. 검체 분류는 MalwareBazaar 태그를 씁니다.
  • User-Agent — SSH·텔넷에는 User-Agent 자체가 존재하지 않습니다. HTTP 공격은 별도 소스입니다.
  • CVE 연결 — SSH·텔넷 공격은 취약점을 참조하지 않는 경우가 대부분이고, 어제 관측분도 전부 자격증명이었습니다.
  • 원문 자료 — 이 글의 근거에는 명령 원문·페이로드 내용·TTY 세션 재생이 포함돼 있지 않습니다. 출발지 IP 는 뒤 두 마디가 가려져 있고, 별칭은 소금 섞은 값이라 되돌릴 대상이 아닙니다.

냉장고 이야기로 시작했습니다.

어제 알아낸 것은 딱 그 정도입니다. 우리가 그제 적어 둔 지문 세 개는 하루 만에 상했습니다. 주소도 그대로, 이름도 그대로였는데 내용물만 갈렸습니다. 그리고 노리는 장비 칸이 세 개에서 다섯 개로 늘었습니다.

안 상한 것도 있었습니다. 맨 앞의 메모지 한 장, telnet.sh 2,107바이트. 여드레째 같은 306바이트 스크립트. 아흐레째 같은 389바이트 공개키. 같은 목록 안에 하루짜리와 아흐레짜리가 같이 들어 있습니다.

우유와 소금을 한 칸에 넣고 같은 날짜를 붙여 두면, 매일 아침 헛것을 버리거나 상한 걸 그냥 두게 됩니다. 목록을 만들 때 이 값이 며칠짜리인지를 같이 적어 두는 것, 어제 데이터가 권하는 건 그것 하나입니다.

그리고 어제 3분 동안 다섯 번 챙겨간 다섯 개는 전부 PC 용이 아니라 장비용이었습니다. 지금 이 글을 띄워 주고 있는 공유기, 거실 구석의 홈캠, 책상 밑의 NAS. 그 기계들 위에서 도는 물건입니다.


이 글은 2026-08-24 허니팟 관측분을 바탕으로 작성됐습니다. 출발지 IP 는 브리프의 마스킹 형태 그대로 표기했고, 유포 주소는 접속되지 않도록 변형(defang)했습니다. 인용한 자격증명은 서로 다른 IP 3곳 이상에서 관측된 6개 조합만 포함했으며, 그 미만에서만 관측된 308개 조합은 개수만 밝히고 값은 싣지 않았습니다.