Journey to Security/리눅스

[서버 보안] Brute Force 공격과 무단 공개키 삽입(SSH 백도어)

Cordilog 2026. 4. 23. 08:59

서버 보안에서 가장 빈번하게 발생하는 위협 중 하나는 SSH를 통한 무차별 대입 공격(Brute Force Attack)이다.

칼리 리눅스의 Hydra를 이용한 실습을 통해 공격자가 무차별 대입 공격으로 서버에 침입하는 루트를 확인하고, 이와 같은 공격을 방지하고 또 대응하기 위한 방법에 대해 알아보자.

1. Brute Force Attack이란?

Brute Force Attack(무차별 대입 공격)이란 공격자가 사용자 ID와 비밀번호의 가능한 모든 조합을 반복적으로 대입하여 올바른 계정 정보를 찾아내는 공격 방식이다.

단순한 방법이지만 비밀번호가 짧거나 유추하기 쉬운 경우 성공 확률이 매우 높은 강력한 공격이다.

서버 관리자가 초기 설정 시 단순한 비밀번호를 사용하거나, 습관적으로 동일한 비밀번호를 여러 계정에 돌려쓰게 되면 이러한 대입 공격에 취약점이 된다.

 

2. Kali Linux에서 Brute Force 공격이 이루어지는 방식 (실습)

Kali Linux의 대표적인 크래킹 도구인 Hydra를 사용하여 공격을 시뮬레이션 해보자.

Hydra는 네트워크 로그인 해킹 분야에서 유명한 도구다.

  • 멀티 프로토콜 지원 : SSH뿐만 아니라 FTP, HTTP, Telnet 등 50개 이상의 프로토콜을 지원한다.
  • 병렬 처리(Multi-threading) : 여러 개의 연결을 동시에 생성하여 공격 속도를 극대화한다.
  • 사전 공격(Dictionary Attack) : 무작위 대입 대신, 사람들이 자주 사용하는 ID와 PW 목록이 담긴 '사전 파일'을 기반으로 공격하여 성공률을 높인다.

1️⃣ 공격 대상 서버에서 사용자 생성

먼저 공격 대상이 될 서버에 취약한 계정을 생성한다.

 

# 사용자 test 생성 및 비밀번호 'test1234' 설정
[root@localhost ~]# useradd test
[root@localhost ~]# echo test | passwd --stdin test


# 서버 IP 확인
[root@localhost ~]# ip -br -4 a

 

Brute force 공격이 진행되는 동안 서버의 인증 로그(/var/log/secure 등)에는 접속 실패 기록이 남게 된다.

/var/log/secure: 리눅스(주로 RHEL/CentOS 계열)에서 인증(Authentication)과 관련된 로그가 저장되는 파일 경로

 

Kali에서 공격을 실행하기 전에 미리 로그 파일을 taill -f로 열어서 실시간으로 접속 시도가 모니터링 되도록 한다.

 

[root@localhost ~]# tail -f /var/log/secure

 

2️⃣ Kali 리눅스에서 사전 파일(Dictionary File) 생성

공격자는 자주 쓰이는 ID와 PW 목록을 파일로 만들어 공격 효율을 높인다.

 

🔴 사용자 ID 샘플 (userList.txt)

공격자는 먼저 시스템의 기본 계정, 서비스 계정, 그리고 유추 가능한 일반 사용자 계정을 타겟팅한다.

 

🔴비밀번호 샘플 (passList.txt)

공격자들은 '계절/연도 조합', '키보드 패턴', '기본 초기 비밀번호' 등을 적극 활용한다.

 

3️⃣ Hydra를 이용한 공격 실행

생성한 사전 파일을 바탕으로 SSH 접속을 시도한다.

  • 명령어: hydra -L userList.txt -P passList.txt ssh://192.168.100.134
  • 옵션 설명:
    • -L: 사용자 리스트 파일 지정
    • -P: 비밀번호 리스트 파일 지정

공격 결과 확인:

 

취약점 발견:

[22][ssh] host: 192.168.100.134   login: test   password: test1234

 

  • 대상 서버(192.168.100.134)의 22번 포트(SSH)를 공격한 결과, 사용자 test와 비밀번호 test1234 조합이 유효하다는 것을 찾아냈다.
  • 이제 공격자는 정식 계정 정보를 확보했으므로, 더 이상 무차별 대입을 할 필요 없이 바로 서버에 로그인할 수 있게 된 상태다.

 

공격 통계 분석 (Data Section):

 

  • 500 login tries (l:20/p:25):
    • 공격자가 준비한 userList.txt에 20명, passList.txt에 25명의 목록이 있었다는 뜻.
    • 20 x 25 = 500, 즉 총 500개의 조합을 다 시도해보려 했다는 뜻.
  • 337.00 tries/min:
    • 1분당 약 337번의 비밀번호를 대입했다는 뜻

주요 경고 및 에러 메시지 해석:

① 병렬 작업 경고 (Parallel Tasks)

[WARNING] Many SSH configurations limit the number of parallel tasks, it is recommended to reduce the tasks: use -t 4

  • Hydra는 기본적으로 16개의 '머리(Task)'를 써서 동시에 16번씩 접속을 시도한다. 하지만 대부분의 리눅스 서버(sshd_config)는 한 번에 들어오는 동시 접속 수를 제한한다.
  • 공격자가 옵션에 -t 4를 추가함으로써 속도를 조금 늦추면 공격의 정확도가 더 높아질 수 있다.

② 워커 스레드 및 타겟 에러

[WARNING] Writing restore file because 4 final worker threads did not complete... [ERROR] 4 targets did not resolve or could not be connected

  • 공격 성공 직후에 나타나는 흔한 메시지. 유효한 비밀번호를 찾는 순간, Hydra는 나머지 실행 중이던 작업들을 강제로 종료하려고 한다. 그 과정에서 아직 응답을 기다리던 4개의 작업(Thread)이 제대로 마무리되지 않아서 발생하는 에러다.

 

4️⃣ 서버 측 공격 로그 확인

이때 서버 측에서 tail -f /var/log/secure 명령어를 실행 중이라면 수많은 접속 시도 로그를 실시간으로 확인할 수 있다.

 

🔴 Hydra 공격 개시 (21:43:12 ~) : 

IP 192.168.100.144로부터 폭발적인 접속 시도가 관찰됨

 

 

① MaxStartups throttling

sshd[983]: error: beginning MaxStartups throttling

  • SSH 서버의 동시 접속 제한치(기본값 보통 10개)를 초과할 정도로 많은 연결이 한꺼번에 들어왔다는 뜻이다. Hydra가 -t 옵션을 높게 주어 공격할 때 나타나는 전형적인 로그다.

② 사용자 사전 대입 (Dictionary Attack)

  • 존재하지 않는 계정(Invalid user)을 포함하여 미리 준비해둔 사용자명과 패스워드를 마구잡이로 대입하는 과정

🔴 계정 탈취 성공 (21:44:03)

 

sshd[1994]: Accepted password for test from 192.168.100.144 port 42150 ssh2

 

  • 공격자가 test 계정의 비밀번호를 알아내는 데 성공함.
  • 로그인 직후(21:44:03) 바로 session closed 로그가 보인다. 이는 Hydra 도구가 비밀번호를 찾았다는 것을 확신하기 위해 실제 로그인을 한 번 수행한 뒤 바로 빠져나왔기 때문이다.

🔴 공격 지속 (21:44:04 ~ 21:44:49)

 

test 계정 탈취에 성공했음에도 불구하고, 공격 도구는 리스트에 남은 나머지 조합들을 계속해서 대입하고 있다.

root 계정에 대한 공격도 멈추지 않고 계속되는 것을 확인할 수 있다.

 

이 로그를 본 보안 담당자는 다음과 같은 결론을 도출할 수 있다.

  1. 비밀번호 정책 실패: test1234 같은 단순한 패턴이 실제 계정에 사용되고 있음.
  2. 계정 관리 부실: 실무에서 사용되지 않는 test 계정이 방치되어 공격의 통로가 됨.
  3. 방어 기제 부재: 1분당 300번이 넘는 공격이 들어오는 동안 서버가 해당 IP를 차단(Fail2Ban 등)하지 못했음.

 

3. 지속성 확보 : 무단 키 삽입을 통한 백도어 구축

공격자는 비밀번호를 알아낸 직후, 관리자가 비밀번호를 바꿀 것에 대비해 '무단 키 삽입' 조치를 취한다.

무단 키 삽입(Unauthorized key insertion)이란 공격자가 자신의 SSH 공개키를 서버의 ~/.ssh/authorized_keys 파일에 몰래 추가하는 행위다.

이렇게 하면 나중에 관리자가 비밀번호를 복잡하게 바꾸더라도 공격자는 자신의 '개인키'만으로 서버에 들어올 수 있으며, 비밀번호 로그인 기록이 남지 않아 침투 사실을 인지하기도 어렵다.

이것이 보안 엔지니어가 가장 경계해야 할 지속성 확보(Persistence) 단계다. 

1️⃣ 공격자의 키 쌍 생성 (Kali Linux)

공격자(로컬 PC)에서 서버에 심어둘 전용 키를 만든다. (이미 키가 있다면 이 단계는 생략해도 된다.)

  • 명령어: ssh-keygen -t ed25519

 

2️⃣ 서버에 공개키 배포 (Kali에서 서버로)

 

탈취한 비밀번호를 이용해 서버의 authorized_keys에 공격자의 키를 강제로 집어넣는다.

kali@kali:~$ ssh-copy-id -i ~/.ssh/id_ed25519.pub test@192.168.100.134

 

💡~/.ssh/ 에 다른 키가 없다면 ssh-copy-id 까지만 입력해서 자동 찾기를 할 수 있다.

 

3️⃣ 결과 확인: 비밀번호 없이 재접속

이제 서버에서 로그아웃한 뒤, 다시 접속해본다.

  • 명령어: ssh test@192.168.100.134
  • 결과: test 사용자의 비밀번호를 입력하지 않고 바로 접속된다. 

 

 

4. 공격 방지를 위해 보안 담당자가 해야 할 것

보안 엔지니어는 시스템 전체의 정책과 개별 계정의 상태를 모두 관리하는 '이중 방어' 체계를 구축해야 한다.

1️⃣ 서비스 레벨: 비밀번호 인증 원천 차단

가장 확실한 방어책은 비밀번호라는 인증 수단 자체를 사용하지 않는 것이다.

  • 설정: /etc/ssh/sshd_config 파일에서 PasswordAuthentication no로 변경.
  • 효과: Hydra 같은 도구가 비밀번호를 대입할 시도조차 할 수 없게 만든다.

2️⃣ 계정 레벨: 정기적인 감사 및 조치

  • 계정 잠금: 퇴사자나 의심 계정은 passwd -l [ID] 명령어로 비밀번호 로그인을 막는다.
  • 백도어 점검: 비밀번호를 잠가도 공개키가 남아있으면 접속이 가능하다. 반드시 ~/.ssh/authorized_keys 파일을 열어 내가 등록하지 않은 낯선 키(예: kali@kali)가 있는지 확인하고 삭제해야 한다.

3️⃣ 요약: 보안 레이어 비교

구분 PasswordAuthentication no passwd -l [ID]
적용 범위 서버 전체 (글로벌 정책) 특정 계정 (로컬 조치)
보안 레이어 서비스 레벨 (출입 규칙) 계정 레벨 (신분증 무효화)
주요 목적 Brute Force 공격 원천 봉쇄 특정 사용자의 활동 중단
키 접속 허용 (권장 방식) 허용 (백도어 위험 존재)

 

결론적으로, 서버 보안의 기본은 "비밀번호 인증을 끄는 것"에서 시작하여 "허가되지 않은 키가 등록되어 있는지 주기적으로 감시하는 것"까지 이어져야 한다.