For the complete documentation index, see llms.txt. This page is also available as Markdown.

Add RBAC Admins

SCCM 서버는 SQL Server 데이터베이스에 저장된 데이터를 기반으로 실행되기 때문에 SCCM 관리자는 서버의 데이터베이스 내 RBAC Admins 테이블에 저장된 유저를 신뢰합니다.

공격자가 SCCM 서버의 SQL Server에서 관리자 권한을 탈취하는데 성공했다면 데이터베이스를 조작하여 RBAC_Admins 테이블에 새로운 데이터를 추가하여 SCCM 관리자를 탈취할 수 있습니다.

Abuse

hex ↔ SID 변환 코드
#!/usr/bin/env python3
import argparse
import struct
import re
import sys

def hex_to_sid(hex_str: str) -> str:
    hex_str = hex_str.replace("0x", "").replace(" ", "").strip()
    data = bytes.fromhex(hex_str)
    revision = data[0]
    sub_authority_count = data[1]
    identifier_authority = int.from_bytes(data[2:8], 'big')
    sub_authorities = [struct.unpack("<I", data[8 + i*4:12 + i*4])[0] for i in range(sub_authority_count)]
    sid_str = f"S-{revision}-{identifier_authority}-" + "-".join(str(x) for x in sub_authorities)
    return sid_str

def sid_to_hex(sid_str: str) -> str:
    parts = sid_str.strip().split('-')
    if len(parts) < 4 or parts[0].upper() != 'S':
        raise ValueError("SID 형식이 올바르지 않습니다. (예: S-1-5-21-...)")
    revision = int(parts[1])
    identifier_authority = int(parts[2])
    sub_authorities = list(map(int, parts[3:]))
    data = bytearray()
    data.append(revision)
    data.append(len(sub_authorities))
    data += identifier_authority.to_bytes(6, 'big')
    for sub in sub_authorities:
        data += struct.pack("<I", sub)
    return "0x" + data.hex()

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("-i", required=True, help="Input SID or HEX")
    args = parser.parse_args()
    user_input = args.input.strip()

    try:
        if re.match(r'^(0x)?[0-9a-fA-F\s]+$', user_input):
            print(f"[+] 입력값은 HEX로 감지됨")
            print(f"SID → {hex_to_sid(user_input)}")
        elif user_input.upper().startswith("S-"):  
            print(f"[+] 입력값은 SID로 감지됨")
            print(f"HEX → {sid_to_hex(user_input)}")
        else:
            print("[-] 입력 형식이 올바르지 않습니다. SID 또는 HEX 값을 입력하세요.")
            sys.exit(1)

    except Exception as e:
        print(f"[-] 오류 발생: {e}")
        sys.exit(1)

if __name__ == "__main__":
    main()

SCCM 관리자로 추가하려는 도메인 계정의 SID 값을 위 파이썬 코드를 통해 hex로 변환합니다. 변환기를 통해 나온 hex 값과 도메인 계정을 아래 쿼리에 삽입하여 SCCM 서버의 SQL Server에서 실행합니다.

Demo

References

Last updated