From a Blurry Container Photo to an IMO Number
Maritime OSINT: reading a container number off a low-resolution harbour photo, then tracing the shipping chain to identify the vessel that carried it.
The Challenge
A single photograph: a quayside, a gantry crane, three stacked containers in front of a warehouse.
この黄色いコンテナを最近まで運んでいた船のIMO番号を答えよ。
Answer the IMO number of the ship that was transporting this yellow container until recently.
Flag format: Diver26{IMO}.
No stego, no crypto — read the image, extract an identifier, resolve it, validate.
Up front: the ship is MSC BENIN, IMO 9974565 — Diver26{9974565}. It’s the fourth and last vessel in the container’s chain, and “last” is exactly where the trap sits.

KAMIGUMI on the crane counterweight pins a Japanese port before a single digit is read — cranes don’t travel, containers do.
Reading the Photo
Two things stand out before you go anywhere near the container number.
The yellow container carries the MSC logo and a vertical MEDITERRANEAN SHIPPING COMPANY legend, so we know the carrier immediately. The red container next to it (TWCU prefix, Chinese characters) is a distractor.
More useful: the gantry crane in the foreground has KAMIGUMI painted on its counterweight. Kamigumi Co., Ltd. is a Japanese port and terminal operator — Osaka, Kobe, Nagoya, Yokohama, Tokyo, Shimizu. That pins the location to a Japanese port before we’ve read a single digit.
Standard reflex worth repeating: equipment markings beat cargo markings for location. Containers travel, cranes don’t.
Getting the Container Number
The number runs vertically down the left edge of the container.

After upscale and unsharp mask: MSMU 145296 9 — readable enough to enumerate candidates, not enough to trust without the check digit.
Upscaling adds no detail — Lanczos just interpolates. What it buys you is working surface for the unsharp mask, which lifts contrast at the glyph edges. Unreadable becomes barely readable.
MSMU 145296 9
At this resolution you will misread characters. Verify before you spend time on a wrong number.
Validating with ISO 6346
Container numbers are four letters plus seven digits, where the last digit is a check digit computed from the preceding ten characters. Letter values start at A = 10 and skip every multiple of 11 — which is why K = 21 but L = 23. Each character is weighted by 2^position, the sum taken modulo 11, and a result of 10 written as 0.
VALUES = dict(zip(
"ABCDEFGHIJKLMNOPQRSTUVWXYZ",
[10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24,
25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38]
))
def check_digit(code: str) -> int:
code = code.upper().replace(" ", "")
return sum(
(VALUES[ch] if ch.isalpha() else int(ch)) * (2 ** i)
for i, ch in enumerate(code[:10])
) % 11 % 10
def is_valid(container: str) -> bool:
container = container.upper().replace(" ", "")
return check_digit(container[:10]) == int(container[10])
is_valid("MSMU1452969") # -> True
One caveat on how you use this. Every ten-character string has exactly one valid check digit, so computing the eleventh character from your own reading proves nothing. It only works if you read all eleven independently and check whether they agree. Where it genuinely earns its keep is as a filter: enumerate the plausible readings of each ambiguous position and discard the combinations that don’t match the check digit you actually see.
Tracking the Container
MSMU1452969 into a tracking portal. MSC’s own search is a JavaScript SPA behind a captcha and awkward to script; the aggregators are easier.
| Date | Location | Event |
|---|---|---|
| 2026-04-03 | Osaka, Japan | Gate out empty by truck |
| 2026-04-06 | Osaka, Japan | Gate in full by truck |
| 2026-04-09 | Osaka, Japan | Loaded on vessel JULIE |
| 2026-04-12 | Busan, South Korea | Discharged from vessel JULIE |
| 2026-04-17 | Busan, South Korea | Loaded on vessel MSC RAYA |
| 2026-04-19 | Ningbo, China | Discharged from vessel MSC RAYA |
| 2026-04-24 | Ningbo, China | Loaded on vessel MSC ROME |
| 2026-06-10 | Le Havre, France | Discharged from vessel MSC ROME |
| 2026-06-13 | Le Havre, France | Loaded on vessel MSC BENIN |
| 2026-06-16 | London Gateway, UK | Discharged from vessel MSC BENIN |
| 2026-06-18 | London Gateway, UK | Delivered by truck |
| 2026-06-22 | London Gateway, UK | Empty returned by truck |
Container type: 20’DV.
Osaka confirms the Kamigumi read, and dates the photo to the window between gate-in and loading — 2026-04-06 to 2026-04-09.
The rest is textbook transshipment: feeder legs into the Asian hubs, the long ocean leg Ningbo → Le Havre (six weeks, so Cape of Good Hope rather than Suez), then a short hop across to London Gateway.
Four vessels, and the wording matters. “Until recently” wants the last ocean vessel, not the one with the longest leg. Grab the ocean crossing and you answer MSC ROME. Read to the end of the chain and you get MSC BENIN.
Resolving the IMO
The IMO number is permanently bound to the hull and survives renaming, sale and reflagging — unlike the MMSI, which changes with the flag. Any AIS database resolves it:
MSC BENIN — IMO 9974565, MMSI 636025252, call sign 5LWN7. Neo-Panamax container ship, built 2025, Liberia flag, 260 m LOA, 8,496 TEU.
Worth a cross-check, since ship names repeat and MSC runs over 700 hulls. Flexport lists MSC BENIN on service NWCIPAK (North West Continent ↔ India/Pakistan) — Le Havre → London Gateway is exactly one leg of that rotation, and a three-day hop between two ports on the same service is precisely what the tracking shows. AIS put the vessel in the North Sea heading for Antwerp, and later southbound for Nhava Sheva. Built 2025, so active in June 2026. Consistent on all three counts.
Flag
Diver26{9974565}
Notes
Read the crane, not the container. Place-bound equipment gives you location for free.
Read the task wording carefully — with four vessels in the chain, “until recently” is doing real work.
And be aware this challenge has a shelf life. Carriers only retain tracking data for completed shipments for a limited window, and this container was returned empty on 2026-06-22. Anyone attempting it from the archive in a year’s time will find the chain gone.
Sources
Tracking — MSC · SeaRates · ShipsGo · Visiwise · TraceContainer
Vessel data — VesselFinder · MarineTraffic · Flexport Atlas · MaritimeOptima · Shipnext · Equasis
Background — BIC · IMO Ship Identification Number Scheme · Kamigumi · DIVER OSINT CTF