SharedIT | 묻고 답하기(AMP)

배치 스크립트 작성 문의

안녕하세요 

이전과 같이 배치 스크립트 작성하다가 문의가 있어 글 작성합니다.

echo ^<%1^> >> ..%COMPUTERNAME%-%DATE%.xml

echo ^<NAME^>패스워드 복잡성 설정^</NAME^> >> ..%COMPUTERNAME%-%DATE%.xml

echo ^<INFO^> >> ..%COMPUTERNAME%-%DATE%.xml

echo 패스워드 설정  문자/숫자/특수문자를 모두 포함하여 강력한 패스워드가 설정될  >> ..%COMPUTERNAME%-%DATE%.xml

echo 있도록 암호 복잡성을 설정하여야 함. 영·숫자만으로 이루어진 암호는 현재 공개된  >> ..%COMPUTERNAME%-%DATE%.xml

echo 스워드 크랙 유틸리티에 의해 쉽게 유추할  있으므로 패스워드 조합  길이에  >> ..%COMPUTERNAME%-%DATE%.xml

echo  최소 암호 길이  암호 복잡성을 적절하게 설정하여 패스워드를 알아낼  있는 >> ..%COMPUTERNAME%-%DATE%.xml

echo 평균 시간을 증가시킬  있도록 설정하여야 함. >> ..%COMPUTERNAME%-%DATE%.xml

echo ^</INFO^> >> ..%COMPUTERNAME%-%DATE%.xml

echo ^<DATA^> ^<![CDATA[  >> ..%COMPUTERNAME%-%DATE%.xml

echo # type Local_Security_Policy.txt ^| find /i "PasswordComplexity" >> ..%COMPUTERNAME%-%DATE%.xml

echo. >> ..%COMPUTERNAME%-%DATE%.xml

type ..ileLocal_Security_Policy.txt | find /i "PasswordComplexity" >> ..%COMPUTERNAME%-%DATE%.xml

echo. >> ..%COMPUTERNAME%-%DATE%.xml

echo # net accounts ^| find "Minimum password length" >> ..%COMPUTERNAME%-%DATE%.xml

echo. >> ..%COMPUTERNAME%-%DATE%.xml

net accounts | find "Minimum password length" >> ..%COMPUTERNAME%-%DATE%.xml

echo. >> ..%COMPUTERNAME%-%DATE%.xml

echo # net accounts ^| find "Maximum" >> ..%COMPUTERNAME%-%DATE%.xml

echo. >> ..%COMPUTERNAME%-%DATE%.xml

net accounts | find "Maximum password age" >> ..%COMPUTERNAME%-%DATE%.xml

echo. >> ..%COMPUTERNAME%-%DATE%.xml

echo # net accounts ^| find "Minimum password age" >> ..%COMPUTERNAME%-%DATE%.xml

echo. >> ..%COMPUTERNAME%-%DATE%.xml

net accounts | find "Minimum password age" >> ..%COMPUTERNAME%-%DATE%.xml

echo. >> ..%COMPUTERNAME%-%DATE%.xml

echo ]]^> ^</DATA^> >> ..%COMPUTERNAME%-%DATE%.xml

echo ^<RELATION^> N/A ^</RELATION^> >> ..%COMPUTERNAME%-%DATE%.xml


echo ^<CRITERION^> >> ..%COMPUTERNAME%-%DATE%.xml

echo [양호] "암호는 복잡성을 만족해야 함" 정책이 "사용"으로 설정되어 있으므로 양호함 >> ..%COMPUTERNAME%-%DATE%.xml

echo [양호] 암호 복잡성 설정이 되어있으므로 양호함 >> ..%COMPUTERNAME%-%DATE%.xml

echo [취약] "암호는 복잡성을 만족해야 함" 정책이 "사용  함"으로 설정되어 있으므로 취약함 >> ..%COMPUTERNAME%-%DATE%.xml 

echo [취약] 암호 복잡성 설정이 되어있지 않으므로 취약함 >> ..%COMPUTERNAME%-%DATE%.xml

echo *PasswordComplexity = 1 (패스워드 복잡성 정책 사용 - 양호)>> ..%COMPUTERNAME%-%DATE%.xml

echo *PasswordComplexity = 0 (패스워드 복잡성 미사용 - 취약) >> ..%COMPUTERNAME%-%DATE%.xml

echo. >> ..%COMPUTERNAME%-%DATE%.xml

echo [양호] 최소 암호 길이가 8이상으로 설정되어 있으므로 양호함 >> ..%COMPUTERNAME%-%DATE%.xml

echo [취약] 최소 암호 길이가 설정되어 있지 않으므로 취약함>> ..%COMPUTERNAME%-%DATE%.xml

echo [취약] 최소 암호 길이가 8이상으로 설정되어 있지 않으므로 취약함 >> ..%COMPUTERNAME%-%DATE%.xml

echo *Minimum password length = 최소 암호 길이 >> ..%COMPUTERNAME%-%DATE%.xml

echo. >> ..%COMPUTERNAME%-%DATE%.xml

echo [양호] 최대 암호 사용 기간이 90일 이하로 설정되어 있으므로 양호함>> ..%COMPUTERNAME%-%DATE%.xml

echo [취약] 최대 암호 사용 기간이 90일 이하로 설정되어 있지 않으므로 취약함 >> ..%COMPUTERNAME%-%DATE%.xml

echo *Maximum password age(days) = 최대 암호 사용기간(일) >> ..%COMPUTERNAME%-%DATE%.xml

echo. >> ..%COMPUTERNAME%-%DATE%.xml

echo [양호] 최소 암호 사용 기간이 0보다  값으로 설정되어 있으므로 양호함 >> ..%COMPUTERNAME%-%DATE%.xml

echo [취약] 최소 암호 사용 기간이 0보다  값으로 설정되어 있지 않으므로 취약함 >> ..%COMPUTERNAME%-%DATE%.xml

echo *Minimum password age(days) = 최소 암호 사용기간(일) >> ..%COMPUTERNAME%-%DATE%.xml

echo ^</CRITERION^> >> ..%COMPUTERNAME%-%DATE%.xml


echo ^<INTERVIEW^> X ^</INTERVIEW^> >> ..%COMPUTERNAME%-%DATE%.xml


echo ^<RESULT_COMMENT^> >> ..%COMPUTERNAME%-%DATE%.xml


type ..ileLocal_Security_Policy.txt | find /i "PasswordComplexity" | find "1"


IF %ERRORLEVEL% EQU 0 (

 echo [양호] "암호는 복잡성을 만족해야 함" 정책이 "사용"으로 설정되어 있으므로 양호함 >> ..%COMPUTERNAME%-%DATE%.xml

 set result=Y

) else (

 echo [취약] "암호는 복잡성을 만족해야 함" 정책이 "사용  함"으로 설정되어 있으므로 취약함 >> ..%COMPUTERNAME%-%DATE%.xml 

 set result=N

)

net accounts | find "Minimum password length" > Minimum_length.txt

FOR /f "tokens=4" %%a IN (Minimum_length.txt) Do SET Minimum_length=%%a


IF %Minimum_length% GEQ 8 (

 echo [양호] 최소 암호 길이가 8이상으로 설정되어 있으므로 양호함 >> ..%COMPUTERNAME%-%DATE%.xml

 set result=Y

) else if %Minimum_length% EQU 0 (

 echo [취약] 최소 암호 길이가 설정되어 있지 않으므로 취약함>> ..%COMPUTERNAME%-%DATE%.xml

 set result=N

) else if %Minimum_length% LSS 8 (

 echo [취약] 최소 암호 길이가 8이상으로 설정되어 있지 않으므로 취약함 >> ..%COMPUTERNAME%-%DATE%.xml

 set result=N

)

net accounts | find "Maximum password age" > Maximum_age.txt

FOR /f "tokens=5" %%a IN (Maximum_age.txt) Do SET Maximum_age=%%a


IF %Maximum_age% LEQ 90 (

 echo [양호] 최대 암호 사용 기간이 90일 이하로 설정되어 있으므로 양호함>> ..%COMPUTERNAME%-%DATE%.xml

 set result=Y

) else (

 echo [취약] 최대 암호 사용 기간이 90일 이하로 설정되어 있지 않으므로 취약함 >> ..%COMPUTERNAME%-%DATE%.xml

 set result=N

)

net accounts | find "Minimum password age" > Minimum_age.txt

FOR /f "tokens=5" %%a IN (Minimum_age.txt) Do SET Minimum_age=%%a


IF %Minimum_age% GTR 0 (

 echo [양호] 최소 암호 사용 기간이 0보다  값으로 설정되어 있으므로 양호함 >> ..%COMPUTERNAME%-%DATE%.xml

 set result=Y

) else (

 echo [취약] 최소 암호 사용 기간이 0보다  값으로 설정되어 있지 않으므로 취약함 >> ..%COMPUTERNAME%-%DATE%.xml

 set result=N

)

echo 결과값: %result%


if "%result%"=="Y" (

    echo [양호]

) else (

    echo [취약]

)


DEL Minimum_length.txt

DEL Maximum_age.txt

DEL Minimum_age.txt


echo ^</RESULT_COMMENT^> >> ..%COMPUTERNAME%-%DATE%.xml

echo ^<RESULT^>%result%^</RESULT^> >> ..%COMPUTERNAME%-%DATE%.xml 

echo. >> ..%COMPUTERNAME%-%DATE%.xml


위의 스크립트 중에서

4개의 항목이 다 양호일 경우 최종적으로 양호가 도출되고 하나라도 취약일 시 취약이 도출되는 스크립트를 구하고 싶습니다.

어떤 부분을 수정을 해야할까요??


챗 GPT를 붙잡고 30분가량을 시도해봤는데 마지막 echo 결과값 부분만 바꾸라고 하고 결국엔 원하는 값은 도출 못했습니다.

Tags : 태그가 없습니다.

1개의 답변이 있습니다.

wansoo
  0 추천 | 9달 전

모두다 양호라는 건 AND 조건에 해당할때라는 의미가 되겠죠.

4가지 조건의 결과 값을 AND 로 연결해서 사용하면 되겠습니다.


batch file에서 and 문은

중첩 if문을 사용해서 구현하면 되겠고요.


4가지 조건이...

암호 복잡성, 최소 암호 길이, 최대 암호 사용 기간, 최소 암호 사용 기간 인걸로 보이는데...


각각의 결과에 대해 모두 동일하게 result 라는 변수에 Y, N를 넣지 말고,

4개의 다른 변수에 결과값을 넣도록 하는게 좋겠고요.


예를 들어

result1, result2, result3, result4 와 같이,  각각의 결과를 다른 변수에 Y, N를 넣은 후에

이 4개를 and화 해서 한개 변수에 모아 준후에, 다시 처리하면 원하는 결과를 얻을 수 있을 것 같네요.



제일 아래 부분에서

set result=N

if %result1% == "Y" (

   if  %result2% == "Y" (

      if %reult3% == "Y" (

          if %result4% == "Y" (

              set result=Y

          )

       )

    )

)


if %result% == "Y"  (

   echo [양호]

) else (

   echo [취약]
)




과 같이 처리해 주면 될 것 같네요.


and를 위한 중첩 if문을 아래와 같이 사용해도 되겠고요.

set result=N

if %result1% == "Y" if  %result2% == "Y" if %reult3% == "Y" if %result4% == "Y" set result=Y


배치 파일에서 if, for 등에 대한 중첩 문을 사용할 때 변수 사용, (), <> 등의 특수 문자 사용 등에 있어 제한이 많아서 인내심도 많이 필요할 수 있고, 발생하는 문제에 대한 원인을 찾기도 난해한 점이 있을 수 있습니다.

필요에 따라서는 goto문이나 다른 배치파일을 호출하는 방식 등등을 적절히 사용해서 예상 밖의 문제에 대한 해피 방법을 사용해야 할 수도 있겠고요.

배치 파일을 이용해서 오라클, MS-SQL 데이터 베이스 접속하여 DB 쿼리하고, 휴대폰 문자 메시지 발송하는 등등의 다양한 프로그램을 만들어 사용하고 있는데...

너무 많은 제한들을 극복해야 하고, 투자한 노력에 비해 얻을 수 있는 효과가 낮은 편이기 때문에...

지금은 가급적 파이썬으로 구현해 버리고 있네요. ^^


간단하게 사용할 때는 OS에서 기본 지원해 주는 배치 파일이 편하긴 합니다만...

wansoo | 9달 전

실행하는 컴퓨터 마다 

컴퓨터명-일자.xml file에 실행 결과에 대한 XML 파일을 생성하는 배치 파일을 만들고 계시는 것 같은데...


일자를 파일명에 넣기 위해 %DATE% 환경 변수를 그대로 사용하고 있네요.

일반적으로는 문제가 안되지만...

하루가 바뀌는 시점에 실행할 경우에는 파일이 둘로 나눠져 생성될 가능성이 있다는 점을 고려해야 할 것 같네요.

처리하는 내용들이 많아서 실행 완료까지 시간이 소요되는 작업이라 심야에 실행될 경우에는 주의가 필요한 부분이라 생각되고요.

%DATE%와 같이 내용이 계속적으로 변하게 되는 환경 변수를 반복적으로 사용할 때는 변화되는 내용을 그대로 반영해서 출력되게 할 것인지, 아니면 특정 시점의 고정된 값을 출력되게 할 것인지 잘 고려해서 고정된 값이 사용되어야 할 경우라면 환경변수 그대로 사용하기 보다는 다른 변수에 옮겨 담아서 값이 변하지 않게 고정해서 처리하는게 만약의 상황에 대비할 수 있는 현명한 배치 파일 작성 노하우가 될 수 있겠네요.

큰 차이는 나지 않을수가 있긴 하겠지만 처리 성능면에서도 %DATE%와 같은 환경 변수 값을 반복적으로 참조하는 것 보다는 다른 변수에 넣어 두고 사용하는 것이 좀 더 빠르게 처리되게 할 수 있게 하는 방법이 될 수 있지 않을까 싶고요.

유애나랑해 | 9달 전

제가 goto 문법을 사용해서 아래처럼 작성을 했습니다.


type ..\file\Local_Security_Policy.txt | find /i "PasswordComplexity" | find "1"


IF %ERRORLEVEL% EQU 0 (

 echo [양호] "암호는 복잡성을 만족해야 함" 정책이 "사용"으로 설정되어 있으므로 양호함 >> ..\%COMPUTERNAME%-%DATE%.xml

 set result=Y

 goto Minimumpasswordlength

) else (

 echo [취약] "암호는 복잡성을 만족해야 함" 정책이 "사용  함"으로 설정되어 있으므로 취약함 >> ..\%COMPUTERNAME%-%DATE%.xml 

 set result=N

 goto END

)

:Minimumpasswordlength

net accounts | find "Minimum password length" > Minimum_length.txt

FOR /f "tokens=4" %%a IN (Minimum_length.txt) Do SET Minimum_length=%%a


IF %Minimum_length% GEQ 8 (

 echo [양호] 최소 암호 길이가 8이상으로 설정되어 있으므로 양호함 >> ..\%COMPUTERNAME%-%DATE%.xml

 set result=Y

 goto Maximumpasswordage

) else if %Minimum_length% EQU 0 (

 echo [취약] 최소 암호 길이가 설정되어 있지 않으므로 취약함>> ..\%COMPUTERNAME%-%DATE%.xml

 set result=N

 goto END

) else if %Minimum_length% LSS 8 (

 echo [취약] 최소 암호 길이가 8이상으로 설정되어 있지 않으므로 취약함 >> ..\%COMPUTERNAME%-%DATE%.xml

 set result=N

 goto END

)

:Maximumpasswordage

net accounts | find "Maximum password age" > Maximum_age.txt

FOR /f "tokens=5" %%a IN (Maximum_age.txt) Do SET Maximum_age=%%a


IF %Maximum_age% LEQ 90 (

 echo [양호] 최대 암호 사용 기간이 90일 이하로 설정되어 있으므로 양호함>> ..\%COMPUTERNAME%-%DATE%.xml

 set result=Y

 goto Minimumpasswordage

) else (

 echo [취약] 최대 암호 사용 기간이 90일 이하로 설정되어 있지 않으므로 취약함 >> ..\%COMPUTERNAME%-%DATE%.xml

 set result=N

 goto END

)

:Minimumpasswordage

net accounts | find "Minimum password age" > Minimum_age.txt

FOR /f "tokens=5" %%a IN (Minimum_age.txt) Do SET Minimum_age=%%a


IF %Minimum_age% GTR 0 (

 echo [양호] 최소 암호 사용 기간이 0보다  값으로 설정되어 있으므로 양호함 >> ..\%COMPUTERNAME%-%DATE%.xml

 set result=Y

 goto Good

) else (

 echo [취약] 최소 암호 사용 기간이 0보다  값으로 설정되어 있지 않으므로 취약함 >> ..\%COMPUTERNAME%-%DATE%.xml

 set result=N

 goto END

)


:Good

   echo [양호] 계정 패스워드 정책이 기준에 맞게 설정되어 있으므로 양호함


:END

   echo [취약] 계정 패스워드 정책이 기준에 맞지 않으므로 취약함

)


근데 결과값으로 출력되는 항목은 아래의 GOOD이나 END가 아닌


[양호] "암호는 복잡성을 만족해야 함" 정책이 "사용"으로 설정되어 있으므로 양호함 

[취약] 최소 암호 길이가 설정되어 있지 않으므로 취약함


이 두줄만 출력이 됩니다.

혹시 어디에  문제가 있는지 여쭤봐도 될까요?

유애나랑해 | 9달 전

기존 스크립트 실행 시 결과 값이

[양호] "암호는 복잡성을 만족해야 함" 정책이 "사용"으로 설정되어 있으므로 양호함 

[취약] 최소 암호 길이가 설정되어 있지 않으므로 취약함

[양호] 최대 암호 사용 기간이 90일 이하로 설정되어 있으므로 양호함

[취약] 최소 암호 사용 기간이 0보다  값으로 설정되어 있지 않으므로 취약함


위처럼 나와서 2번째에서 끊기는 것 같은데 이때 END에 있는 취약 문구가 나오게 하고 싶습니다.

유애나랑해 | 9달 전

이 부분 참고하겠습니다!

유애나랑해 | 9달 전

해결 했습니다....

제가 멍청하게 GOOD 이랑 END 문에 .xml 파일에 해당 줄이 적히도록 설정을 안해서 저렇게 나온거였어여...

항상 답변 잘 해주셔서 감사합니다.

wansoo | 9달 전

:Good

으로 점프될경우에 항상 

 echo [양호] 계정 패스워드 정책이 기준에 맞게 설정되어 있으므로 양호함



echo [취약] 계정 패스워드 정책이 기준에 맞지 않으므로 취약함


이 함께 실행되는 구조로 만드셨네요.


:Good 끝에 다시 goto 문을 사용해서 :END 부분이 실행되지 않고 건너뛰게 처리해 줘야 하겠네요.



댓글에 올려준 goto 문을 사용한 배치 파일은

양호와 취약을 표시하는 목적으로만 사용할 경우라면...

:Good과 :END와

끝에 

:EXIT 와 같은 추가적인 레이블을 추가해 주고, 조금 수정해 주는 형식으로 한다면 처리 시간도 단축되게해 주는 효과도 있기는 하지만...

XML 파일에 각각의 내용에 대한 세부 내역들을 모두 담고 싶을 경우에는 바람직하지 않은 방법이되겠네요.


모든 점검 내용이 양호일 경우에만 XML 파일에 모든 내용들이 담길 수 있지만, 취약 부분이 있을 경우에는 XML에 담길 수 있는 내용들이 상황에 따라 많이 담기기도 하고, 적게 담기기도 하게 되어 XML에 담기는 내용 기준으로 봤을 경우에는 문제가 있는 배치 파일이라 할 수 있을 것 같네요.


유애나랑해 | 9달 전

아하 그렇게 볼수도 있겠네요

말씀하신대로 GOOD 문항 끝에 goto quit 문을 사용해서 :END 부분이 실행이 안되도록 해서 원하는 값 얻어냈습니다.

혹시 스크립트문 관련해서 보신 책이나 블로그, 유튜브 같은게 있을까요??

독학하려는데 어떤 걸 봐야할지 잘 모르겠어서 여쭤봐요

wansoo | 9달 전

인터넷 검색으로 필요한 내용 보충했습니다.

Batch file은 예전 DOS 시절 부터 사용해 왔기 때문에 사용한 역사가 오래되요~ ^^

유애나랑해 | 9달 전

앗... 좀 더 검색하는데에 신경을 써야 겠네요 ㅜㅜ