Lab guide · Isla Mercantile Group · 375m net (09:00–16:30)
Schedule
Time
Block
Minutes
09:00
C0 — Engagement kickoff
15
09:15
C1 — The consultancy craft
20
09:35
I-M2 — How Insights sees (live)
25
10:00
I-M3 — Dashboard tour
60
11:00
Break
15
11:15
I-TAG — Tag teams: build the chain
45
12:00
K-1 — Outside-in with Kartis
45
12:45
Lunch
45
13:30
C6 — Verify in the field
20
13:50
X1 — Inside-out meets outside-in
30
14:20
C3 — Baseline assessment (CBA)
70
15:30
Break
15
15:45
C8 — Report & readout
40
16:25
Wrap-up
5
Before you start
Log in
Your slip has your own credentials. Nobody shares a login; working in pairs on one login (one drives, one checks) is fine.
System
Address
Login
Used in
Eon Insights
https://insights.edu.eoncore.net
traineeNN
I-blocks, I-TAG, X1
Eon Center
https://center.edu.eoncore.net
traineeNN (org_admin of team-NN)
C-blocks, K-blocks, X1
Center, Kartis pages only
https://center.edu.eoncore.net
kNN (kartis_only)
K-blocks in the Insights + Kartis tracks
Isla public sites
https://<vhost>.isla.edu.eoncore.net
none
I-M2, K-1, C6, I-M11
In Center, switch the UI to EN on first login. Your Center organisation team-NN has one customer: Isla Mercantile Group (team-NN). traineeNN and kNN are both members of team-NN and work on that same customer.
Shared environment
One Insights for the whole group. Tags are shared: every team sees the others' tags appear.
Custom views are shared: every view you save is in everyone's list. Prefix the name with your team or login (webshop — chain); do not change or delete a view you did not create.
There is no personal reset. Do not delete data, uploads or tags you did not create.
Tag rule: tag only hosts of your own app, one person per host, never remove tags you did not set. Full convention: Tag convention.
Center and the Kartis pages keep state per team customer: register upload, posture runs, finding status and labels are shared by traineeNN and kNN of the same team, and invisible to other teams.
Traffic replays (probe chapters) are started by the trainer. You need no shell on the server.
AI: the Insights Chat is available in the Insights blocks. The Kartis pages have no AI.
Isla at a glance
Client: Isla Mercantile Group, retail and payments, Curaçao. Internal names <host>.<app>.isla.test in 10.20.0.0/16; public names <vhost>.isla.edu.eoncore.net.
App (team)
Internal hosts
Subnet
Public vhosts
webshop
shop, api, db, pay.webshop.isla.test
10.20.1.0/24
www, shop, api, pay
intranet
sso, portal, cache.intranet.isla.test
10.20.2.0/24
intranet
payments
gw, vpn, hsm.payments.isla.test
10.20.3.0/24
none
loyalty
app, api, old.loyalty.isla.test
10.20.4.0/24
loyalty, loyalty-old
Hosts outside isla.test and isla.edu.eoncore.net are background noise. Search isla.test to hide them.
Client documents (handed out per block): client brief, ckm-intake.xlsx, register.xlsx, register-flawed.xlsx.
Exercises
C0 — Engagement kickoff
09:00 · 15 min
Exercise
Task
Finding
C0.1
Read the client brief in pairs: the two engagement questions, one judging criterion per stakeholder, two statements you would not accept without evidence
F08, F11
C0.2
Log in to Center, open Isla Mercantile Group (team-NN), copy its customer ID, set journey milestone "Maturity intake (CMB)" to In progress with a note
—
C1 — The consultancy craft
09:15 · 20 min
Exercise
Task
Finding
C1.1
Definition of done for D1 and D5 (standard/full: D1, D2, D5): who accepts, what it contains, what not; add as journey notes
—
I-M2 — How Insights sees (live)
09:35 · 25 min
Exercise
Task
Finding
I-M2.1
Note your source IP and the time. Browse to https://www.isla.edu.eoncore.net and https://pay.isla.edu.eoncore.net. Find your own handshakes in Handshakes (last 15 min, filter SNI); note TLS version, cipher, JA3
F02
I-M3 — Dashboard tour
10:00 · 60 min
Exercise
Task
Finding
I-M3.1
Hosts: filter insecure + weak, search isla.test, last 7 days. List host and level
Certificates, sort Valid until ascending: first Isla certificate, days left, host
F03
I-TAG — Tag teams: build the chain
11:15 · 45 min
Exercise
Task
Finding
I-TAG.1
Find every host of your app; split the list; tag each with app:, tier:, env:, owner: via HostTagsEdit
—
I-TAG.2
Build the chain view through the Chat (appendix A.1), fix missing tags, Save as View, note the view id
—
I-TAG.3
One minute per team: weakest link, finding, owner, why
F01, F03, F05, F08
K-1 — Outside-in with Kartis
12:00 · 45 min
Exercise
Task
Finding
K-1.1
Log in to Center, switch to EN, start a discovery for isla.edu.eoncore.net on Scorecard; after 30 s note the scorecard counters
F03, F04, F08
K-1.2
Certificates: which host expires first, issuer, days left, scorecard bucket, owning team
F03
K-1.3
DNS / Email for isla.edu.eoncore.net: map every SPF include and DKIM selector to a party; compare with the brief; is spoofing covered?
F11, F12
K-1.4
Technology: CDN and cloud provider per vhost; in the brief? What does a CDN in front of www mean for TLS keys?
—
K-1.5 (full)
Hosts shows intranet on TLS 1.0. Check live (appendix B.1b, B.2), label false_positive with a note, compare Scorecard, remove the label again
F03, F04
K-1.6 (full)
Upload register.xlsx in Central register, run Crypto posture, filter Findings on drift: which finding concerns pay?
F02
C6 — Verify in the field
13:30 · 20 min
Exercise
Task
Finding
C6.1
3DES check against pay (appendix B.1): protocol and cipher; does it confirm the Kartis drift? Which Insights finding matches?
F02
C6.2
TLS 1.0 and 1.2 against intranet (appendix B.2), with the TLS 1.0 control on pay (B.1b); what does the server say, what was the scan date?
F03, F04
C6.3
Set the intranetweak_tls_version finding to false_positive (leave cert_expiring open); add a Labels note (scan date, check, result, initials); leave pay open
F04
X1 — Inside-out meets outside-in
13:50 · 30 min
Exercise
Task
Finding
X1.1
Fill the matrix (appendix C.2): for F01–F14 mark Insights / Kartis / live and classify inside only, outside only or both. Check at least two cells live
F01–F14
X1.2
Add the unregistered asset to register.xlsx, upload, rerun posture. What happens to the finding? Which inside-only assets belong in the internal register?
F08
C3 — Baseline assessment (CBA)
14:20 · 70 min
Exercise
Task
Finding
C3.1
Interview the CISO (trainer). Short: the 10 marked questions; full: all 36, your pair's subcategories. Write her answers in her words; probe at least three
—
C3.2
Set a maturity level per question with a one-line reason; create assessment Isla — PQC baseline for team-NN and import the workbook
—
C3.3
Run the AI assessor on question 17 (full: also 33); compare its level with yours, edit, decide on Approve
F03
C3.4
Gap table per subcategory: current level, 12-month target, gap, driver (DORA / NIS2 article or PQC exposure)
F14
C3.5 (full)
Mark each AI advice recommendation as supported (name the question) or generic; which one do you drop?
—
C8 — Report & readout
15:45 · 40 min
Exercise
Task
Finding
C8.1
Generate the Kartis management report: which of F02, F03, F08, F09, F11, F12 appear, in which counter, which is missing and why?
F02, F03, F08, F09, F11, F12
C8.2 (standard, full)
Top five actions in the remediation tracker: title, domain, owner at Isla, priority, deadline
—
C8.3
One page per group: where we stand (Q1, Q2), what it costs (hours), what first (three actions, owner, date); read out to the CISO
—
Queries, live checks and templates
Queries
Run these through the Insights Chat. The Chat only accepts SELECT/WITH and rejects any query containing words such as INSERT, UPDATE, DELETE, ALTER, CREATE, REPLACE, SET anywhere in the text.
A.1 Chain view (I-TAG.2, I-M11)
Replace app:webshop with your app.
SELECT
hostname,
toString(any(ipv4)) AS ip,
arrayDistinct(groupArrayArray(tags)) AS all_tags,
arrayFirst(t -> startsWith(t, 'tier:'), all_tags) AS tier,
arrayFirst(t -> startsWith(t, 'owner:'), all_tags) AS owner,
anyLast(security_level) AS level,
multiIf(level = 'insecure', 1, level = 'weak', 2,
level = 'secure', 3, level = 'recommended', 4, 5) AS ladder_rank
FROM hosts
GROUP BY hostname
HAVING has(all_tags, 'app:webshop')
ORDER BY ladder_rank, tier
Live checks
Against the Isla public sites. Always pass -servername: web-b routes by SNI, and a client without SNI lands on pay. OpenSSL 3 needs @SECLEVEL=0 in the cipher string for 3DES and TLS 1.0; drop :@SECLEVEL=0 on LibreSSL (openssl version tells you which one you have). Some Linux distributions block TLS 1.0 in the system crypto policy even with @SECLEVEL=0; B.1b shows whether yours does. If it does, use testssl.sh or pair with someone whose client can.
Handshake succeeds: your client can test TLS 1.0. no protocols available or a failure before any server answer: your client refuses TLS 1.0, and B.2 proves nothing.