본 문은 nopernik가 올린 윈도우즈 해킹과 관련한 블로그 글을 바탕으로 작성된 글입니다.
모든 윈도우 버전에서 권한 상승 및 세션을 하이재킹을 할 수 있는 취약점이 발견되었다. 취약점을 발견한 Nopernik는 평소 sethc와 utilman 로그온 화면 백도어를 가지고 놀았다. 그는 작업 관리자 taskmgr.exe를 실행한 후, 사용자 탭에 있는 연결 버튼을 누르니 놀랍게도 선택한 사용자의 세션으로 연결되었다. 더욱이, 로컬 관리자 권한으로 다시 했을 때도 사용자의 암호를 묻지 않았다. 이게 왠 황당한 해킹인가.
다른 사용자 세션에 연결하려면 모든 파일, 모든 경로에 접근할 수 있는 루트 권한이나 혹은 그 세션에 특별히 접근할 수 있는 특정 접근 권한이 있어야 한다. Nopernik는 ‘/dest:<SessionName> parameter’를 사용하면 다른 사용자의 세션을 다른 세션에 연결했다. 이 때, ‘Password’ 매개 변수 위치에 암호를 지정하지 않고 ‘SessionName’에 현재 사용자 세션이 아닌 다른 사용자를 넣으면 원격 데스크톱 세션에서 다른 세션에 연결할 때 사용되는 tscon.exe 파일 실행이 실패한다. 사실 정확히 실패한다는 메시지가 있는 것은 아니다. 이 후, Sticky Keys 백도어를 윈도우 로그인 화면에서 NT AUTHORITY와 SYSTEM과 함께 실행시키면 모든 파일에 접근할 수 있는 권한과 더불어 암호 역시 묻지 않고 모든 사용자 세션에 연결할 수 있다. 이것이 세션 하이재킹이다. 흥미로운 점은 정당한 사용자는 로그아웃을 요구하지 않는다는 것이다. 이러한 공격을 하면 사용자는 아무런 통보 없이 세션에서 빠져나가게 된다.
명령을 실행하면 NT AUTHORITY와 SYSTEM의 권한으로 권한 있는 사용자의 동의 없이 현재 로그인한 사용자의 세션을 가로챌 수 있다. 이때, 터미널 서비스 세션은 연결 상태 또는 연결 해제 상태 일 수 있으며 이러한 취약점은 로컬 관리자의 세션을 하이재킹 할 수 있어 상당히 위험도의 취약점이다. 이 취약점을 통해 공격을 하면 도메인 관리 세션과 사용자의 문서, 사용자가 이전에 로그인한 다른 시스템 등 권한 인증이 필요한 모든 응용 프로그램에 공격자는 접근할 수 있다.
이러한 취약점을 이용한 한 가지 시나리오를 이야기해 보겠다. 은행 직원은 업무를 위해 결제 시스템에 접근을 해야 한다. 이때, 이 은행 직원이 결제 시스템에 접근할 수 있는 사람인지 아닌지를 확인해주는 로그인이라는 인증 절차가 필요하다. 그는 로그인을 하여 자신의 신분을 인증하고 결제 시스템에 연결하여 일을 시작했다. 은행원의 신분 인증 정보는 자신과 자신의 인증을 확인해 줄 데이터베이스만 알고 있어야 한다. 이후, 그는 점심시간이 되어 자신이 하던 워크스테이션을 잠그고 점심을 먹으러 갔다. 이때 시스템 관리자가 직원의 워크스테이션으로 접근하여 관리자 계정으로 로그인을 했다. 은행 정책에 따르면 관리자 계정은 결제 시스템에 대한 접근 권한이 없어야 한다. 하지만 윈도우에 내장된 몇 가지 명령을 사용하면 이 시스템 관리자는 직원의 잠긴 컴퓨터에 접근하여 이를 도용하여 결제 시스템에 접근할 수 있다. 즉, 시스템 관리자는 몇 가지 명령으로 은행 직원의 컴퓨터를 도용하여 결제 시스템에 접근할 수 있다는 것이다. 물론, 결제 시스템에 접근한 관리자가 딴 마음을 품고 악의적인 행동을 할지는 아무도 모를 일이다.
이 취약점을 이용한 공격에서 공격자는 어떠한 해킹 도구도 사용하지 않았다. 공격자는 metasploit, incognito, mimikatz 등의 공격 도구를 사용할 필요조차 없다. 이러한 도구는 보통 사용자의 토큰을 조작하거나 로그인을 한 사용자로 가장하는 데 사용되지만 이번 취약점은 이러한 도구를 사용하는 것이 아니라 단순히 내장된 명령으로만 수행된다. 모든 관리자는 로컬 또는 원격을 이용하여 로그인한 사용자로 가장 할 수 있다. 더욱이 이 취약점에 노출된 운영체제는 윈도우 2016, 윈도우 2012 R2, 윈도우 2008, 윈도우 10, 윈도우 7 등 거의 모든 버전의 윈도우는 이러한 취약점을 가지고 있어 잠재적인 위험에 노출되었다고 보면 된다.
앞에서도 말했지만, 이 취약점은 원격에서 접근하여 공격할 수 있다. 공격자는 원격을 통해 활성화되어 있거나 사용자가 로그아웃하여 연결이 끊긴 세션을 도용할 수 있다. Nopernik는 거의 3주간 매일 이 공격을 테스트했으며 침투 테스트에서도 사용했다. 그는 매우 간단한 방법으로 이메일, 문서, 메모장 등 개인적이고 중요한 정보에 쉽게 접근할 수 있었고 또한, 그는 외부 도메인, 클라우드 컴퓨팅이나 다른 사용자의 로그인 세션을 원격 데스크톱 연결을 통해 연결할 수 있었다.
만약 공격자가 관리자 계정을 가지고 있다면 서버의 메모리를 덤프하고 파싱 할 수 있다. 하지만 이번 취약점에서는 이 또한 필요하지 않다. 그저 두 개의 간단한 명령어만 입력할 수 있으면 공격은 성공한다. 가장 놀라운 점은 사용자의 자격 인증을 할 필요가 없다 점이다. 즉, 암호 입력도 필요 없는 정말로 순도 높은 하이재킹인 것이다.
해킹을 할 때, 수집한 정보가 시간에 매여있는 정보라면 그 공격은 성공적인 공격이라 할 수 있다. 보통 이런 공격은 메모리 공간에 있는 정보를 추출하는 것으로 이를 위해 메모리를 덤프하기도 한다. 하지만 이러한 정보를 얻기에는 작은 문제가 있다. 예를 들어 공격자가 사용자의 데스크톱을 이용하여 원격에서 작업하는 경우 사용자는 자신의 컴퓨터가 하이재킹된 지도 모른다. 더욱이, 이 같은 기술을 사용하면 1분 안에 해당 서버가 손상될 수 있다. 특히나, 이 공격은 언제 일어날 지 예상하기 어렵다는 점에서도 문제가 된다. Nopernik는 Microsoft OMS 사용을 권장하며 tscon.exe 사용에 대해 경고했다.
공격에 사용된 명령어는 일반적인 Windows API 로 앞에서 언급했듯이 관리자라면 모든 것을 할 수 있다. 하지만 여기에는 중요한 점이 있는데 바로, 권한이 없는 사용자가 일종의 로컬 권한 상승을 통해 관리자가 되면 문제는 이로 말할 수 없게 된다는 점이다. 이는 사용자의 의지 없이 토큰을 받아들이고 쉐도잉 모드를 허용하며 사용자의 모든 정보를 노출시킬 수 있기 때문이다. 공격은 단순히 두 개의 명령어 NT AUTHORITY와 SYSTEM만 있으면 된다. 이보다 더 쉽게 하려면 psexec을 사용하는 것도 한 방법이지만 이는 psexec.exe 파일이 있어야 한다. 아래에는 관련한 명령이다.
psexec -s \\localhost cmd
또 다른 방법은 선택된 세션에 연결할 서비스를 만드는 것이다. 세션 서비스에 연결하기 위해서는 먼저 모든 세션의 정보를 알아야 한다. 아래와 같은 명령어를 치면 세션에 대한 정보가 나온다.
C:\Windows\system32>query user
USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME
administrator 1 Disc 1 3/12/2017 3:07 PM
>localadmin rdp-tcp#55 2 Active . 3/12/2017 3:10 PM
C:\Windows\system32>
C:\Windows\system32>sc create sesshijack binpath= "cmd.exe /k tscon 1 /dest:rdp-tcp#55"
[SC] CreateService SUCCESS
3. Start service:
net setart sesshijack
이 후에는 세션이 대상 세션으로 대체되면서 하이재킹을 성공한다. 아래에는 Nopernik가 각각의 윈도우 버전마다 이 공격을 시도한 영상이로 아래에는 Nopernik가 각각의 윈도우 버전마다 이 공격을 시도한 영상이다. 같이 감상해보자.
Windows 7 via Task Manager:
Windows 7 via command line:
Windows 2012 R2 via service creation:
너무 간단하고 짧은 시간 내에 권한 상승을 시켜버리니 상당히 당황스럽기 까지 한다. 어쨌든 Bam!!!!