
Windows 로컬 권한 상승 익스플로잇으로, NBNS 스푸핑, 가짜 WPAD 프록시, HTTP-to-SMB NTLM 릴레이를 사용하여 NT AUTHORITY\SYSTEM 접근 권한을 획득합니다.
#Potato Windows 7, 8, 10, Server 2008, Server 2012에서의 권한 상승
###작동 방식 Potato는 Windows의 알려진 문제점, 즉 NTLM 릴레이(구체적으로 HTTP->SMB 릴레이)와 NBNS 스푸핑을 악용하여 로컬 권한 상승을 달성합니다.
아래에 설명된 기법을 사용하면, 권한이 없는 사용자가 기본 구성의 Windows 호스트에서 "NT AUTHORITY\SYSTEM" 수준의 접근 권한을 얻을 수 있습니다.
이 익스플로잇은 3가지 주요 부분으로 구성되며, 모두 명령줄 스위치를 통해 어느 정도 구성할 수 있습니다:
#####1. 로컬 NBNS 스푸퍼 NBNS는 Windows 환경에서 흔히 사용되는 이름 확인을 위한 브로드캐스트 UDP 프로토콜입니다. 침투 테스트에서는 종종 네트워크 트래픽을 스니핑하고 로컬 네트워크에서 관찰되는 NBNS 쿼리에 응답합니다. 권한 상승 목적에서는 네트워크 트래픽을 스니핑할 수 있다고 가정할 수 없으므로, 어떻게 NBNS 스푸핑을 수행할 수 있을까요?
대상 머신(이 경우 대상은 127.0.0.1)이 어떤 호스트에 대해 NBNS 쿼리를 보낼지 미리 알 수 있다면, 응답을 위조하여 대상 호스트에 NBNS 응답을 플러딩할 수 있습니다(UDP 프로토콜이기 때문). 한 가지 문제는 NBNS 패킷의 2바이트 필드인 TXID가 요청과 응답에서 일치해야 한다는 점입니다. 이는 빠르게 플러딩하고 65536개의 가능한 모든 값을 반복함으로써 극복할 수 있습니다.
스푸핑하려는 호스트에 이미 DNS 레코드가 있다면 어떻게 될까요? 재미있는 방식으로 DNS 조회를 강제로 실패시킬 수 있습니다. "포트 고갈(port exhaustion)"이라는 기법을 사용하여 모든 UDP 포트에 바인딩합니다. DNS 조회를 시도하면 DNS 응답이 도착할 사용 가능한 소스 포트가 없기 때문에 실패하게 됩니다.
테스트에서 이는 100% 효과적인 것으로 입증되었습니다.
#####2. 가짜 WPAD 프록시 서버 NBNS 응답을 스푸핑할 수 있는 능력을 바탕으로, NBNS 스푸퍼를 127.0.0.1로 대상 지정할 수 있습니다. 대상 머신(우리 자신의 머신)에 "WPAD" 또는 "WPAD.DOMAIN.TLD" 호스트에 대한 NBNS 응답 패킷을 플러딩하고, WPAD 호스트의 IP 주소가 127.0.0.1이라고 알려줍니다.
동시에 127.0.0.1에서 로컬로 HTTP 서버를 실행합니다. "http://wpad/wpad.dat"에 대한 요청을 받으면 다음과 같은 내용으로 응답합니다:
FindProxyForURL(url,host){
if (dnsDomainIs(host, "localhost")) return "DIRECT";
return "PROXY 127.0.0.1:80";}
이로 인해 대상의 모든 HTTP 트래픽이 127.0.0.1에서 실행되는 우리 서버를 통해 리다이렉트됩니다.
흥미롭게도, 이 공격은 낮은 권한의 사용자가 수행하더라도 머신의 모든 사용자에게 영향을 미칩니다. 여기에는 관리자와 시스템 계정도 포함됩니다. 예시는 "egoldstein_spoofing.png" 및 "dade_spoofed.png" 스크린샷을 참조하십시오.
#####3. HTTP -> SMB NTLM 릴레이 이제 모든 HTTP 트래픽이 우리가 제어하는 서버를 통해 흐르므로, NTLM 인증을 요청하는 등의 작업을 할 수 있습니다...
Potato 익스플로잇에서는 모든 요청이 "http://localhost/GETHASHESxxxxx"로 302 리다이렉트되며, 여기서 xxxxx는 고유 식별자입니다. "http://localhost/GETHASHESxxxxx"에 대한 요청은 NTLM 인증을 요구하는 401 응답을 반환합니다.
NTLM 자격 증명은 로컬 SMB 리스너로 릴레이되어 사용자 정의 명령을 실행하는 새로운 시스템 서비스를 생성합니다. 이 명령은 "NT AUTHORITY\SYSTEM" 권한으로 실행됩니다.
###익스플로잇 사용 사용법은 현재 운영 체제에 따라 다릅니다.
또한 Windows가 프록시 설정과 WPAD 파일을 처리하는 방식의 특이성 때문에 때때로 다소 불안정합니다. 익스플로잇이 작동하지 않을 때는 종종 실행 상태로 두고 기다려야 합니다. Windows에 이미 WPAD에 대한 캐시된 항목이 있거나, WPAD를 찾지 못해 직접 인터넷 접근을 허용하는 경우, 새로 고침하는 데 30-60분이 걸릴 수 있습니다. 이 시간이 경과한 후 익스플로잇을 실행 상태로 두고 나중에 다시 트리거를 시도해야 합니다.
여기에 나열된 기법은 가장 단순한 것부터 가장 복잡한 것 순으로 정렬되어 있습니다. 목록에서 뒤에 나오는 기법은 이전의 모든 버전에서 작동해야 합니다. 각 기법에 대한 비디오와 스크린샷이 포함되어 있습니다.
#####Windows 7 - https://www.youtube.com/watch?v=Nd6f5P3LSNM 참조 Windows 7은 Windows Defender 업데이트 메커니즘을 통해 상당히 안정적으로 익스플로잇할 수 있습니다.
Potato.exe에는 이를 자동으로 트리거하는 코드가 있습니다. 다음을 실행하기만 하면 됩니다:
Potato.exe -ip <local ip> -cmd <command to run> -disable_exhaust true
이렇게 하면 NBNS 스푸퍼가 시작되고, "WPAD"를 127.0.0.1로 스푸핑한 다음, Windows Defender 업데이트를 확인합니다.
네트워크에 이미 "WPAD"에 대한 DNS 항목이 있는 경우 "-disable_exhaust false"를 시도할 수 있습니다. 이렇게 하면 DNS 조회가 실패하고 NBNS로 폴백해야 합니다. 몇 번 테스트해 보았고 작동했습니다.
#####Windows Server 2008 - https://www.youtube.com/watch?v=z_IGPWgL5SY 참조 Windows Server에는 Defender가 포함되어 있지 않으므로 대체 방법이 필요합니다. 대신 단순히 Windows 업데이트를 확인합니다. 다른 주의 사항은, 적어도 제 도메인에서는 Server 2K8이 단순히 WPAD가 아닌 WPAD.DOMAIN.TLD를 원했다는 점입니다. 다음은 사용 예입니다:
Potato.exe -ip <local ip> -cmd <command to run> -disable_exhaust true -disable_defender true --spoof_host WPAD.EMC.LOCAL
이것이 성공적으로 실행된 후에는 단순히 Windows 업데이트를 확인하십시오. 트리거되지 않으면 익스플로잇을 실행한 상태로 약 30분 기다린 후 다시 확인하십시오. 그래도 작동하지 않으면 실제로 업데이트를 다운로드해 보십시오.
네트워크에 이미 "WPAD"에 대한 DNS 항목이 있는 경우 "-disable_exhaust false"를 시도할 수 있습니다. 이렇게 하면 DNS 조회가 실패하고 NBNS로 폴백해야 합니다. 몇 번 테스트해 보았고 작동했습니다.
#####Windows 8/10/Server 2012 - https://www.youtube.com/watch?v=Kan58VeYpb8 참조 최신 버전의 Windows에서는 Windows Update가 "인터넷 옵션"에 설정된 프록시 설정을 더 이상 따르지 않거나 WPAD를 확인하지 않는 것으로 보입니다. 대신 Windows Update의 프록시 설정은 "netsh winhttp proxy..."를 사용하여 제어됩니다.
대신 이러한 버전에서는 Windows의 새로운 기능인 "신뢰할 수 없는 인증서의 자동 업데이터"에 의존합니다. 자세한 내용은 https://support.microsoft.com/en-us/kb/2677070 및 https://technet.microsoft.com/en-us/library/dn265983.aspx 에서 확인할 수 있습니다.
technet 문서에서 "Windows Server 2012 R2, Windows Server 2012, Windows 8.1 및 Windows 8 운영 체제에는 인증서 신뢰 목록(CTL)을 매일 다운로드하는 자동 업데이트 메커니즘이 포함되어 있습니다."
Windows의 이 부분은 winhttp 프록시 설정이 직접(direct)으로 설정되어 있어도 여전히 WPAD를 사용하는 것으로 보입니다.
이 경우 Potato의 사용법은 다음과 같습니다:
Potato.exe -ip <local ip> -cmd <cmd to run> -disable_exhaust true -disable_defender true
이 시점에서 최대 24시간을 기다리거나 이 업데이트를 트리거할 다른 방법을 찾아야 합니다.
네트워크에 이미 "WPAD"에 대한 DNS 항목이 있는 경우 "-disable_exhaust false"를 시도할 수 있습니다. 이렇게 하면 DNS 조회가 실패하고 NBNS로 폴백해야 합니다. 몇 번 테스트해 보았고 작동했습니다.
###완화 방법
Windows에서 "인증을 위한 확장 보호(Extended Protection for Authentication)"를 활성화하면 NTLM 릴레이 공격을 막을 수 있습니다.
SMB 서명도 이러한 유형의 공격을 완화할 수 있지만, 이를 확인하려면 더 많은 연구가 필요합니다.
###오프 브로드캐스트 NBNS 스푸핑 Potato 익스플로잇과 동일한 NBNS 스푸핑 기법을 사용하여 UDP 137과 통신할 수 있는 모든 호스트에 대해 NBNS 스푸핑을 수행할 수 있습니다. NBNS 요청이 타임아웃되기 전에 유효한 응답을 끼워 넣을 수 있을 만큼 빠르게 UDP 패킷을 보내기만 하면 됩니다.
이에 대한 데모 비디오는 https://www.youtube.com/watch?v=Mzn7ozkyG5g 에서 볼 수 있습니다.
데모 랩은 다음과 같이 구성되어 있습니다:
PFSense 방화벽 10.0.0.0/24 -> 기업 LAN 10.0.1.0 /24 -> 서버 네트워크
기업 네트워크에서 서버 네트워크의 머신을 공격합니다.
사용법: python Responder.py –I eth0 –spoof <target>:<spoof address>:<spoof host>