요약
군대에서 공부하려고 집 PC에 80번 포트로 포트포워딩을 해서 RDP를 구성해 놨었다.
그런데, 80번 포트로 RDP를 열어놓다보니 외부에서 공격자가 포트 스캔을 때린 뒤 나의 RDP에 브루트포스 공격을 시도하고 있었다.
원래였으면 Well Known 포트 외에 다른 포트를 사용하는 방식으로 해결했겠지만, 사지방 특성상 어차피 Well Known 포트가 아니면 RDP를 사용할 수 없었기 때문에 다른 방법을 찾아서 해결했다.
완벽한 해결 방법은 아니지만, 급하게 조치라도 할 수 있으니 참고하면 도움이 될 것 같아 작성했다.
해결
우선, '참조된 계정이 현재 잠겨 있으므로 그 계정으로 로그온할 수 없습니다' 오류에 대해서 알아보자.
윈도우의 이벤트 뷰어를 열어보면 아래와 같이 무수히 많은 '감사 실패' 키워드의 로그가 있을 것이다.
더블 클릭해서 내용을 살펴보면 아래와 같은 형식일 확률이 매우 높다.
계정을 로그온하지 못했습니다.
주체:
보안 ID: XXXXXXXXXXXXXXX
계정 이름: XXXXXXXXXXXXXXX
계정 도메인: XXXXXXXXXXXXXXX
로그온 ID: XXXXXXXXXXXXXXX
로그온 유형: 10
로그온을 실패한 계정:
보안 ID: NULL SID
계정 이름: XXXXXXXXXXXXXXX
계정 도메인: XXXXXXXXXXXXXXX
오류 정보:
오류 이유: 알 수 없는 사용자 이름 또는 잘못된 암호를 사용했습니다.
상태: 0xC000006D
하위 상태: 0xC000006A
프로세스 정보:
호출자 프로세스 ID: XXXXXXXXXXXXXXX
호출자 프로세스 이름: C:\Windows\System32\svchost.exe
네트워크 정보:
워크스테이션 이름: PC
원본 네트워크 주소: XXXXXXXXXXXXXXX
원본 포트: 0
인증 세부 정보:
로그온 프로세스: User32
인증 패키지: Negotiate
전송된 서비스: -
패키지 이름(NTLM 전용): -
키 길이: 0
이 이벤트는 로그온 요청이 실패할 때 액세스하려고 했던 컴퓨터에 생성됩니다.
주체 필드는 로그온을 요청한 로컬 시스템의 계정을 나타냅니다. 이것은 주로 서버 서비스와 같은 서비스 또는 Winlogon.exe나 Services.exe와 같은 로컬 프로세스입니다.
로그온 유형 필드는 요청한 로그온의 유형을 나타냅니다. 가장 일반적인 유형은 2(대화식)와 3(네트워크)입니다.
프로세스 정보 필드는 시스템에서 로그온을 요청한 계정과 프로세스를 나타냅니다.
네트워크 정보 필드는 원격 로그온 요청이 시작된 위치를 나타냅니다. 워크스테이션 이름은 항상 사용할 수 있는 것은 아니며 어떤 경우에는 비워 둘 수도 있습니다.
인증 정보 필드는 이 특정 로그온 요청에 대한 자세한 정보를 제공합니다.
- 전송된 서비스는 이 로그온 요청과 관련된 중간 서비스를 나타냅니다.
- 패키지 이름은 NTLM 프로토콜 간에 사용된 하위 프로토콜을 나타냅니다.
- 키 길이는 생성된 세션 키의 길이를 나타냅니다. 이 값은 요청된 세션 키가 없으면 0이 됩니다.
이번 포스팅에서 중요하게 봐야될 내용들은 '원본 네트워크 주소'와 '로그온 유형'이다.
원본 네트워크 주소가 공격자의 IP이고, 로그온 유형이 공격자가 어떠한 방식으로 로그인을 시도했는지에 대한 이야기이기 때문이다.
우선, '참조된 계정이 현재 잠겨 있으므로 그 계정으로 로그온할 수 없습니다' 오류가 발생했을 때는 기본 값(10분)이 지날 때까지 로그인이 불가능하다.
그러므로 이 글을 보고 조치하는 사람이 군인이라면, 휴가 때까지 기다리거나 가족들에게 부탁해서 해당 PC에서 로컬로 작업해야 한다.
그렇지 않으면, 기본 값이 지나 로그인이 가능해지더라도 브루트 포스 공격이 계속 진행되므로 다시 막히게 된다.
이제 해결 방법을 알아보자.
먼저, 브루트 포스 공격 자체를 막기에는 Well Known 포트를 사용해야 한다는 제약 사항이 있기 때문에 현실적으로는 어렵다고 판단했다.
이에 과감하게 윈도우에서 제공하는 로컬 정책을 아래와 같이 변경해 계정 잠김 옵션 자체를 해제했다.
조치 후부터는 원래 계정으로 로그인이 가능해 질것이다. 다만, 브루트 포스 공격도 10분 제약이 없어진 것이므로 빠르게 아래 방법으로 wail2ban을 구성해 주자.
wail2ban이란 RDP에 대한 브루트 포스 공격을 방어해주는 윈도우 파워쉘 스크립트 툴이다.
https://github.com/glasnt/wail2ban
위 링크에서 다운로드 받아 c:\scripts\wail2ban 폴더로 위치시킨다.
그다음 윈도우의 작업 스케줄러에 불러온다.
이때 가장 높은 수준의 권한으로 실행하는 옵션이 빠져있다면 반드시 체크하도록 하자.
이러면 모든 설정은 종료됐다.
파워쉘 스크립트를 참고하면 실패 로그인 횟수 등 임계치 값을 커스터마이징 할 수 있다.
추가적으로 아래 경로의 파일에서 어떤 IP들이 차단되어 있는지도 확인할 수 있으니 참고바란다.
기본 값을 기준으로 동작 원리를 간단하게 설명해 보자면, 5회 로그인 시도를 실패하면 일정 시간 동안 해당 IP를 방화벽에서 차단한다.
이후 일정 시간이 지난 후에 해당 IP로 동일한 공격이 들어오면, 이전의 시간보다 훨씬 더 긴 시간동안 해당 IP를 차단한다.
즉, 공격 횟수가 늘어날 수록 차단되는 시간도 늘어나는 구조이다.
아래와 같이 인바운드 규칙에 방화벽 정책이 자동으로 추가된다.