SSH Brute-force 공격
리눅스 서버를 운영하다 보면 syslog 또는 로그 서버상에
일정한 ID를 이용한 ssh 접속 시도가 지속적으로 이루어지는 경우를 볼수 있다.
대부분 중국IP 또는 불특정 해외IP로 이루어지는데 …
이런 공격은 brute-force(무차별 공격)로서, 패스워드 사전 파일을 이용하여 미리 지정한 아이디와 대입하여,
접속 계정을 알아 내는 해킹 방법이다.
대부분 ROOT 계정 또는 잘 알려진 ID를 이용하여 접속계정을 알아내려 한다.
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);
}
}
}
소스코드를 컴파일 하여,실행파일을 파일을 생성하고 실행하면 이미 공격하고자 하는
서버에 대해서 ssh brute-force 공격을 하게 된다.
이렇게 하여 공격을 통해 접근 권한이 해커에게 넘어가게 되면 이제 부터 서버는 해커의 놀이터가 된다.
DDOS 에 이용 되거나 관리자 모르게 스팸 서버가 되어 다량의 스팸을 발송하게 되는 스팸서버 가 되어
어느날 사어버경찰 공문을 받게 되어지는 상황이 올 수도 있다.
ssh brute-force 공격에 대한 방어를 위해선 아래와 같은 간단한 보안 설정으로 해결이 가능하다.
① ssh포트 변경.
/etc/ssh/sshd_config 설정에 기본 포트 tcp 22 를 변경하라
대부분 ssh brute-force의 경우 ssh 기본 포트인 22를 타겟으로 한 공격이 이루어진다.
포트 변경후 sshd 대몬을 갱신 한다.
②강력한 패스워드로 변경하라.
부득이 포트를 변경하지 못할 상황이라면, 패스워드를 강력하게 설정
해야 한다. 대부분의 brute-force 공격은 사전(dictionary) 공격이기
때문에 공격자가 예측하기 어려운 패턴으로 패스워드를 생성한다.
영단어와 숫자 , 특스문자 로 구성 하며 , 일정한 패턴은 피하자.
강력한 패스워드는 관리자 측면에서 외우기 어려운 부분이 있겠지만
서버측면에서 패스워드가 가장 중요한 부분임을 간과해선 안될 것이다.
③ 필터링 툴 적용
tcpwrapper / iptables 등과 같은 필터링 툴로서 ssh에 접속할수 있는 IP를 제한시켜 준다.
▷ tcpwrapper
- /etc/hosts.allow와 /etc/hosts.deny를 이용한다.
/etc/hosts.deny를 vi로 열어서 아래와 같이 설정한 뒤에,
------------------
sshd: ALL (모든 ssh 접속을 막겠다는 의미이다.)
------------------
/etc/hosts.allow를 vi로 열어서 아래와 같이 설정한다.
-------------------
sshd : 192.168.1.x 172.16.0.0/24
-> ssh 접속에는 192.168.1.x 와 172.16.0.0/24 만이 접속할 수 있게 되어진다.
-------------------
▷ iptables
- iptables -A INPUT -p tcp -s xxx.xxx.xxx.xxx --dport 22 -j ACCEPT
- iptables -A INPUT -p tcp --dport 22 -j DROP
위와 같은 방식으로 22번에 접속할수 있는 사용자를 제한해 주면 된다.
위 두가지 방법으로 설정하는 경우 반드시 접속 허용한 대역에서 ssh접속을 먼저 시도 해본다.
단. 접속테스트가 완료되기 전까지는 기존 ssh 접속을 끊지 않아야 된다.
기존 접속을 끊는경우 IDC에 달려가 모니터를 붙여야 하는 상황 ㅜㅜ
④ 방화벽 도입
위와 같은 방법을 모두 사용할 수가 없다면,방화벽을 도입하자.
방화벽은 이런 공격뿐만 아니라, 현재 알려진 공격에 대해서는 차단을
해줄수 있어 서버 보안이 상당히 향상된다.
다만 어떤 방화벽도 완벽한 것은 없다. 이점을 잊지 말자
방화벽 또한 사람이 만든 부분이고 취약점이란 항상 새로운 부분이 발생한다.
항상 보안이슈를 보고 , 서버를 항상 최신의 상태로 유지하는 방법이 좋다.
'[IT 관련 지식] > [Security]' 카테고리의 다른 글
ssh 보안 점검툴 ssh-audit (0) | 2021.01.24 |
---|---|
TMS / ESM (0) | 2014.09.03 |
iptables 시간 정책 (0) | 2014.08.16 |
패킷 생성툴 NPING (0) | 2014.05.14 |
오픈SSL 보안취약점 (0) | 2014.05.10 |