본문 바로가기
ISMS-P/취약점 진단

Windows 화면보호기 진단 스크립트 분석

by 아기미믹 2023. 5. 23.

요새 회사에서 ISMS 인증 심사를 대비하고 있다. 작년과 마찬가지로 난 웹/인프라 취약점 조치 쪽을 맡고 있다.

인프라 취약점 중, 개인정보처리자 업무용 PC 보안진단을 진행하던중...

컨설팅 업체에서 제공한 진단 스크립트 파일이 문제가 많다... 😭

예외처리가 안 되어 있어서 프로그램이 죽는다거나, 회사 현황에 맞게 진단해주지 않는 등...

이에 내가 스크립트 파일을 수정하는 일이 잦다. 오늘은 화면보호기 진단 결과가 자꾸 '취약'으로 뜨길래,

문제가 뭔가 하고 뜯어봤다.

 

 

 

이슈 사항: 화면보호기 설정을 하였으나, 스크립트 진단 결과 '취약' 진단

 

화면보호기 스크립트 진단 부분
rem echo [PC-11] 화면보호기 대기 시간 설정 및 재시작 시 암호 보호 설정                                                 >> ..\%COMPUTERNAME%-WinPC.txt
reg query "HKEY_CURRENT_USER\Control Panel\Desktop" | find "ScreenSaveActive"        >  logoff1.txt
reg query "HKEY_CURRENT_USER\Control Panel\Desktop" | find "ScreenSaverIsSecure"     >  logoff2.txt
reg query "HKEY_CURRENT_USER\Control Panel\Desktop" | find "ScreenSaveTimeOut"       >  logoff3.txt

type logoff1.txt | find "1" 
IF ERRORLEVEL 1 goto 64-bit-logoff-fail

type logoff2.txt | find "1"
IF ERRORLEVEL 1 goto 64-bit-logoff-fail

type logoff3.txt | find "ScreenSaveTimeOut"
IF ERRORLEVEL 1 goto 64-bit-logoff-fail

FOR /F "tokens=3" %%a in (logoff3.txt) do SET KISATEMP=%%a

if %KISATEMP% GTR 600 GOTO 64-bit-logoff-fail

echo [PC-11] 양호                >> ..\%COMPUTERNAME%-WinPC.txt


goto 64-bit-logoff-end


:64-bit-logoff-fail
echo [PC-11] 취약                >> ..\%COMPUTERNAME%-WinPC.txt
goto 64-bit-logoff-end 

:64-bit-logoff-end

※ 스크립트 진단 파일은 KISA에서 배포한 것임

 

진단 스크립트를 보면..

:64-bit-logoff-fail 라인을 만났을 때, '취약'으로 판단하도록 되어있다.

 

해당 라인이 실행되는 조건의 라인은 총 3개

1) type logoff1.txt | find "1"

2) type logoff2.txt | find "1"

3) type logoff3.txt | find "ScreenSaveTimeOut"

 

각 조건을 분석하기에 앞서,  몇 가지 몰랐던 명령어(키워드)에 대해 조사하였다.

명령어 문법 설명 비고
type type [파일경로] [파일경로]에 오는 파일 내용을 텍스트로 표준출력(Stdout)한다. 테스트 결과, 확장자를 가리지 않는 것 같다...
.txt가 아닌 .png의 내용도 출력한다.
ERRORLEVEL - Windows 프로그램(명령어)의 실행 결과 정상 종료: 0
비정상 종료: 0이 아닌 정수값
FOR /F  FOR /F "[옵션]" [변수] in ([문자열/파일경로]) do [명령어] do 이하의 [명령어]를 [옵션]에 따라  문법이 너무 복잡하다... 이 스크립트에 나오는 것만 분석함
GTR A GTR B B에 대한 A의 초과여부 초과: True
미만: False

 

이제 하나하나 조건을 분석해보자.

 

1) type logoff1.txt | find "1"

reg query "HKEY_CURRENT_USER\Control Panel\Desktop" | find "ScreenSaveActive"    >  logoff1.txt
(중략)
type logoff1.txt | find "1" 
IF ERRORLEVEL 1 goto 64-bit-logoff-fail

HKEY_CURRENT_USER\Control Panel\Desktop 경로의 레지스트리에서 ScreenSaveActive 데이터 값을 보고 판별한다.

정확히는 해당 레지스트리와 관련된 문자열에서 1이라는 문자열은 찾아내는 거지만...

그 의미는  레지스트리값이 1인지 판별하는 것이다.

레지스트리값이 1이면, find "1"의 결과값이 True일 것이고, 이는 ERRORLEVEL이 0임을 의미한다.

 

2) type logoff2.txt | find "1"

reg query "HKEY_CURRENT_USER\Control Panel\Desktop" | find "ScreenSaverIsSecure"  >  logoff2.txt
(중략)
type logoff2.txt | find "1"
IF ERRORLEVEL 1 goto 64-bit-logoff-fail

마찬가지로 이것 또한, 해당 레지스트리 값이 1이면 정상, 0이면 ERRORLEVEL이 1이 된다.

1) 2)는 화면보호기 설정이 되어있다면 1값을 가지므로 큰 문제가 없다.

 

3) type logoff3.txt | find "ScreenSaveTimeOut"

reg query "HKEY_CURRENT_USER\Control Panel\Desktop" | find "ScreenSaveTimeOut" >  logoff3.txt
(중략)
type logoff3.txt | find "ScreenSaveTimeOut"
IF ERRORLEVEL 1 goto 64-bit-logoff-fail

FOR /F "tokens=3" %%a in (logoff3.txt) do SET KISATEMP=%%a

if %KISATEMP% GTR 600 GOTO 64-bit-logoff-fail

가장 분석이 어려웠던 부분이다. 그 원인은 FOR /F 구문에 있는데.. 이 놈 문법을 이해하는 데 시간이 꽤나 걸렸다.

스크립트 내용을 예로 들어 설명해보자면,

FOR /F "tokens=3" %%a in (logoff3.txt) do SET KISATEMP=%%a

→ logoff3.txt 파일 내 문자열을 split(공백을 기준으로 잘랐을 때)하여 3번째 인덱스의 값을 a변수로 초기화하고,

    KISATEMP 변수를 a변수의 값으로 초기화한다.

 

참 이런 구문은 이해하고 보면 쉬운데, 처음에 문법을 파악하는 것이 쉽지가 않은 것 같다.

여하튼, 이걸 토대로 위 코드블럭을 뜯어보면

 

HKEY_CURRENT_USER\Control Panel\Desktop 경로 내의 ScreenSaveTimeOut 레지스트리값을

(이는 사실 logoff3.txt 내 문자열을 split했을 때의 3번째 인덱스 값이다. tokens=3)

 

if %KISATEMP% GTR 600 GOTO 64-bit-logoff-fail

 

600과 비교해 높으면 :64-bit-logoff-fail

ScreenSaveTimeout 은 초단위이므로 600은 10분을 의미한다.

 

즉, 화면보호기 설정이 되어있더라도, 설정된 화면 보호기 대기 시간이 10분을 초과하면 '취약'으로 판단하는 것이다.

 

우리 회사의 화면보호기 규정은 15분이다. ScreenSaveTimeout 값이 900이므로 계속 '취약'으로 나왔던 것...

if %KISATEMP% GTR 900 GOTO 64-bit-logoff-fail

으로 수정하여 정상적으로 잘 작동시켰다. 😄

 

ISMS 인프라 취약점이 있는한,, 간간히 윈도우 스크립트 파일(.bat)을 분석하고, 공부한 내용을 게시할 예정이다.