-- 이글은 HOSTWAY korea cert의 분석을 퍼온글입니다. --

 

 

 SSH Brute-force 공격 분석

 

 최근 들어서 리눅스 서버의 secure 로그나 Abuse 메일들을 확인해 보


 면 일정한 ID를 이용해서 ssh 접속 시도를 하는 것을 볼수가 있다.


 이런 공격은 brute-force(무차별 공격)로서, 패스워드 사전 파일을 이용


 해서 미리 지정한 아이디와 대입하여, 접속 계정을 알아 내는 해킹 방법이다.


 brute-force 공격은 관리자만 부지런 하면 막을수 있는 공격이다.


 아래 예는 대표적인 ssh brute-force 공격툴이 어떤 방식으로 동작을
 

 하는지 실제 구현을 통하여 알아 보았다.

 


 

 아래는 ssh scan tools의 소스코드 로서, 이미 공개된 소스코드 이지만
 

 악의적으로 / 혹은 테스트를 하고자 하다가 잘못해서 다른 네트웍을 스

 캔하면 문제가 발생할수 있으므로 전체를 공개하지는 않았다.

 

 

  <소스 코드 >
#include <unistd.h>
#include <time.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <netinet/in.h>
int flag;
int where;
int shell(SSH_SESSION *session){
struct timeval tv;
int err;
char cmd[]="uname -r -s₩n";
char rd[2048];
BUFFER *readbuf=buffer_new();
time_t start,acum;
....... 중략 .......
checkauth("test","test",buff);
checkauth("guest","guest",buff);
checkauth("admin","admins",buff);
checkauth("admin","admin",buff);
checkauth("user","user",buff);
checkauth("root","password",buff);
checkauth("root","root",buff);
checkauth("root","123456",buff);
checkauth("test","123456",buff);
checkauth("root","
!@#$%^&*",buff);
checkauth("root","*",buff);
checkauth("root","000000",buff);
.......... 중략 .........
numforks++;
if (numforks > maxf)
for (numforks; numforks > maxf; numforks--)
wait(NULL);
}
}
}

 

 

소스코드를 컴파일 하여,실행파일을 파일을 생성하고/Victim Server


로 만들어 놓은 서버에 대해서 ssh brute-force 공격을 시도하였다.

그림 <1-1>은 실행 파일을 실행하는 도중에 한 계정에 대한 공격 성공

을 나타내고 있다.

그림 <1-2>는 Victim 서버의 secure 로그에 남는 로그 로서, 빨간색

테두리에는 해당 계정에 대해서 패스워드 접근이 허가되었다는 내용이

나오고 있다.

이렇게 됨으로써, 공격자는 Victim 서버에 대한 접근 권한을 취득하게

되었고,자연스럽게 서버에 접속 할수 있게 되었다.

만일 Victim 서버가 커널등 패키지 들을 제대로 패치를 하지 않은 서버

라면, root 권한까지 빼앗기는 것은 시간 문제이며, Victim 서버는 다른

서버를 공격하게 되는 중계 서버가 되어 버리게 될것이다.

 

이렇게 됨으로써, 공격자는 Victim 서버에 대한 접근 권한을 취득하게

되었고,자연스럽게 서버에 접속 할수 있게 되었다.

만일 Victim 서버가 커널등 패키지 들을 제대로 패치를 하지 않은 서버

라면, root 권한까지 빼앗기는 것은 시간 문제이며, Victim 서버는 다른

서버를 공격하게 되는 중계 서버가 되어 버리게 될것이다.

 

그렇게 되면 머지 않아 Victim 서버의 관리자는 어느날 외부기관으로부

터 혹은 개인으로부터 Victim 서버가 그들의 서버에 공격 또는 스팸 등

을 보내고 있다는 메일을 받게 될 것이다.

 

 

① 포트를 변경하라.

여러 ssh 공격 코드를 분석해본 결과 포트를 직접 지정하는 공격툴도

있었지만, 대부분은 (위의 공격툴 역시) ssh는 22번으로 고정되어 있

다. 그러므로 ssh 포트를 22번이 아닌 다른 포트로 바꾸는 것만으로도

90% 이상의 공격은 방어할수 있다.

(실제로 ssh를 22번으로 설정해 놓은 서버의 경우에는 수많은 공격로

그가 secure에 쌓여 있었지만, 포트를 변경해 놓은 서버에서는 공격로

그를 찾아 볼수 없었다.)

일반적으로 ssh의 포트를 변경하기 위해서는 /etc/ssh/sshd_config의

#port 22 항목의 주석을 제거 해주고, 22번을 다른 포트 번호로 변경

해 주고, sshd를 restart 해주면 된다.

 

② 패스워드를 변경하라.


부득이 포트를 변경하지 못할 상황이라면, 패스워드를 강력하게 설정

해야 한다. 대부분의 brute-force 공격은 사전(dictionary) 공격이기

 

때문에,영단어와 숫자등으로 구성되어 있다.

(간혹 !@#$%^& 등의 숫자키로 연속되는 패스워드도 등록이 되어 있

다.)

그렇기 때문에 패스워드를 유추할수 없도록 만들면, 해당 ssh 공격에

대해서 안전하다.

강력한 패스워드라는 것은 숫자와 영문자(대/소문자) 그리고 특수문자를

조합하는 방식으로 유추하기는 어렵지만, 외우기는 쉬운 패스워드를 생

성해야 한다.

즉 Kimhoon 이라는 서버 관리자가 자신의 이름으로 패스워드를 만든다

면,다음과 같이 만들 수 있겠다.
                                       

                                          K!mh0oN

 ( 대문자 K, 특수문자 !, 소문자 m, h, 숫자 0, 소문자 o, 대문자 N )

 

외우기 쉬우면서도 대/소문자, 숫자, 특수문자가 모두 들어간 유추하기

어려운 강력한 패스워드가 생성되었다.

이런방식을 이용해서 자신만의 강력한 패스워드를 생성한다면, 비단 이

ssh 공격뿐만 아니라, 일반적인 서버 운영에서도 보안을 향상시킬수가

있다.

 

 

③ 필터링 툴을 사용하라.

tcpwrapper / iptables 등과 같은 필터링 툴로서 ssh에 접속할수 있는

IP를 제한시켜 준다.

 

▷ tcpwrapper
- /etc/hosts.allow와 /etc/hosts.deny를 이용한다.

 /etc/hosts.deny를 vi로 열어서 아래와 같이 설정한 뒤에,

 ------------------

 sshd: ALL (모든 ssh 접속을 막겠다는 의미이다.)

 ------------------

 /etc/hosts.allow를 vi로 열어서 아래와 같이 설정한다.

-------------------
 sshd : 211.239.xxx.xxx 211.239.xxx.xx3

 (ssh 접속에는 211.239.xxx.xxx 와 211.239.xxx.xx3 만이 접속할

 수 있다.)
 

 -------------------

tcpwrapper로 제한을 한뒤에는 반드시 외부에서 연결 테스트를 해

봐야 한다. (허가된곳에서는 정상적으로 접속되는지, 나머지에서는

접속이 되지 않는지 확인 - 테스트가 끝날때까지 현재 서버에 연결

된 터미널은 닫지 않는다.)

 

▷ iptables

- iptables -A INPUT -p tcp -s 211.239.xxx.xxx --dport 22 -j

ACCEPT

위와 같은 방식으로 22번에 접속할수 있는 사용자를 제한해 주면 된

다. (자세한 iptables 사용법은 책/검색엔진을 참고바람)

 

 

④ 방화벽을 사용하라.

위와 같은 방법을 모두 사용할 수가 없다면,방화벽을 사용하면 된다.

방화벽은 이번 공격뿐만 아니라, 현재 알려진 공격에 대해서는 차단을

해줄수 있으므로,서버 보안이 상당히 향상된다.

(다만 어떤 방화벽도 완벽한 것은 없기 때문에,늘 취약점이 발표되면,

관심을 가지고 필요하다면 패치를 시행해야 한다.)

몇가지 방법으로 ssh brute-force 공격에 대비할수 있는 방법을 알아

보았다.

 

이런 공격외에도 네트웍 상에는 엄청나게 많은 공격이 시행되어지고 있

다. 수많은 해커들이 지금도 불특정 다수에 대해서 공격을 시도하고 있

다. 이런 위협으로부터 안전하게 서버를 지키는 길은 주기적인 서버의

패치, 패스워드의 변경, 최신 공격에 대한 정보 수집과 대책이 동시에

마련되어져야 한다.

 

 

< 관련 로그 >

다음은 여러프로그램으로 외부에서 스캔을 했을때 secure에 남는 로그

들이다.

해당 로그를 눈에 익혀두면, 어떤 류의 공격툴에 의한 scan이었는지

확인하는데 도움이 될것이다.

scanssh 라는 프로그램으로 외부 스캔시

#일반 스캔시

#./scanssh 211.239.xxx.xxx

Sep 18 15:28:41 qos1 sshd[317]: scanned from 211.239.xxx.xxx with

SSH-1.0-SSH_Version_Mapper. Don't panic.

#식별 strings을 전송하지 않는 옵션 사용 ( -I )

[root@qos1 test1111]# ./scanssh -I 211.239.xxx.xxx

211.239.xxx.xxx SSH-1.99-OpenSSH_3.1p1

Sep 18 15:27:29 qos1 sshd[32721]: Did not receive identification string

from 211.239.xxx.xxx

 

 

 

sshbsdx 라는 툴로서 스캔/공격시

# ./sshbsdx -l kegos -v 211.239.xxx.xxx

Sep 18 15:31:04 qos1 sshd[366]: input_userauth_request: illegal user

kegos

Sep 18 15:31:04 qos1 sshd[366]: Failed none for illegal user kegos from

211.239.xxx.xxx port 32817 ssh2

Sep 18 15:31:04 qos1 sshd[366]: Failed keyboard-interactive for illegal

user kegos from 211.239.xxx.xxx port 32817 ssh2

Sep 18 15:31:04 qos1 sshd[366]: Failed keyboard-interactive for illegal

user kegos from 211.239.xxx.xxx port 32817 ssh2

Sep 18 15:31:04 qos1 sshd[366]: Connection closed by 211.239.xxx.xxx

bigsshf 툴을 사용해서 스캔/공격시

# ./bigsshf 2

Oct 19 16:28:11 qos1 sshd[32409]: User test not allowed because not

listed in AllowUsers

Oct 19 16:28:11 qos1 sshd[32409]: input_userauth_request: illegal user

test

Oct 19 16:28:13 qos1 sshd[32409]: Failed password for illegal user test

from 211.239.151.21 port 35847 ssh2

Oct 19 16:28:13 qos1 sshd[32409]: Received disconnect from

211.239.151.21: 11: Bye Bye

신고

+ Recent posts

티스토리 툴바