발단
시스템보안실습 수업의 4번째 과제가 올라왔다. (사실 5번째 과제보다 먼저 올라옴...)
과제의 설명은 다음과 같다.
주통기 W-01, W-02, W-04, W-06을 점검하는 스크립트 및 실행 결과를 보이는 블로그 포스트 작성하고 해당 포스트 URL을 제출
여러 방법이 있겠지만, cmd나 powershell로 하는 것보단 파이썬으로 하는 게 더 재밌어 보여서 구글의 힘을 빌려 과제를 진행해보았다.
과제 시작
1. W-01
- 윈도우즈 최상위 관리자 계정인 Administrator의 계정명 변경 또는 보안을 고려한 비밀번호 설정 여부 점검
win32com 모듈을 사용해서 계정 정보들을 가져온 후, Administrator의 이름을 가진 계정이 비활성화되어 있는지 검사하고 winreg 모듈을 이용해서 비밀번호 복잡성 설정이 되어있는지 검사하였다.
import win32com.client
import winreg
def check_admin_account():
wmi = win32com.client.GetObject('winmgmts:')
accounts = wmi.InstancesOf('Win32_UserAccount')
for account in accounts:
if account.Name == "Administrator" and account.LocalAccount:
print('Administrator 활성화 여부 : ', end='')
if account.Disabled == True:
print('비활성화')
return True
else:
print('활성화')
return False
return True
def check_password_complexity():
path = r'SYSTEM\\CurrentControlSet\\Control\\Lsa'
complexity_key = 'PasswordComplexity'
with winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, path) as key:
complexity_value, _ = winreg.QueryValueEx(key, complexity_key)
if complexity_value == 1:
return True
else:
return False
if check_admin_account() or check_password_complexity():
print('양호')
else:
print('취약')
2. W-02
- Guest 계정 비활성화 여부 점검
서브프로세스로 net user guest 명령어를 실행시키고 양호함을 나타내는 문자열이 존재하는지 확인하여 양호, 취약 여부를 점검하는 스크립트이다.
import subprocess
def check_guest():
result = subprocess.run(
['net', 'user', 'guest'],
stdout = subprocess.PIPE,
stderr = subprocess.PIPE,
text = True
)
output = result.stdout
if '활성 계정 아니요' in output:
return True
else:
return False
if check_guest():
print('양호')
else:
print('취약')
3. W-04
- 계정 잠금 임계값의 설정 여부 점검
W-02 점검 스크립트와 기본 로직은 동일하다. 방법을 조금 바꿔서 정규표현식 패턴으로 임계값(정수)를 찾아서 양호, 취약 여부를 판단한다.
import subprocess
import re
def check_lockout_limit():
result = subprocess.run(
['net', 'accounts'],
stdout = subprocess.PIPE,
stderr = subprocess.PIPE,
text = True
)
output = result.stdout
if '잠금 임계값' in output:
lines = output.splitlines()
for line in lines:
if '잠금 임계값' in line:
match = re.search(r'\d+', line)
if match:
limit = int(match.group())
print(f'계정 잠금 임계값: {limit}')
if limit <= 5:
print('양호')
else:
print('취약')
check_lockout_limit()
4. W-06
- 관리자 그룹에 불필요한 사용자의 포함 여부 점검
역시나 위의 두 스크립트와 기본 로직은 동일하다. 출력문에서 필요없는 부분은 제거하고 계정을 나타내는 라인만 뽑아서 개수가 1개를 넘어가면 취약으로 판단한다.
import subprocess
def check_admin_group():
result = subprocess.run(
['net', 'localgroup', 'administrators'],
stdout = subprocess.PIPE,
stderr = subprocess.PIPE,
text = True
)
output = result.stdout
lines = output.splitlines()
members = list()
checker = False
for line in lines:
if line.strip().startswith('---'):
checker = not checker
continue
if checker and line.strip() and '명령을 잘 실행했습니다.' not in line:
members.append(line.strip())
print(f'Administrators 그룹 구성원: {members}')
if len(members) <= 1:
print('양호')
else:
print('취약')
check_admin_group()
결론
주변의 다른 사람들이 한 결과물을 보니 나같은 이레귤러도 필요할 것 같아서 한 번 파이썬을 이용해서 점검 스크립트를 작성해보았다.
레지스트리를 확인하거나 에러 처리 로직이 존재하지 않기 때문에 실용성은 조금 떨어진다.
네트워크보안실습 프로젝트를 진행하면서 powershell에 조금 익숙해졌는데, 좀 더 공부해서 powershell을 통해 점검하는 스크립트도 짜보면 좋을 듯 하다.
'대학생활' 카테고리의 다른 글
시스템보안실습 | 5. 윈도우 RDP 침투 (0) | 2024.12.13 |
---|---|
시스템보안실습 | 3. 버퍼오버플로우 (0) | 2024.10.26 |
시스템보안실습 | 2. Privilege Escalation & Lateral Movement (2) | 2024.10.17 |
시스템보안실습 | 1. shadow 파일 password cracking 해보기 (0) | 2024.09.24 |