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 9974565Diver26{9974565}. It’s the fourth and last vessel in the container’s chain, and “last” is exactly where the trap sits.

Quayside with a yellow MSC container, a red container beside it, and a Kamigumi gantry crane in front of a warehouse

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.

Cropped and sharpened close-up of the container number reading MSMU 145296 9

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.

DateLocationEvent
2026-04-03Osaka, JapanGate out empty by truck
2026-04-06Osaka, JapanGate in full by truck
2026-04-09Osaka, JapanLoaded on vessel JULIE
2026-04-12Busan, South KoreaDischarged from vessel JULIE
2026-04-17Busan, South KoreaLoaded on vessel MSC RAYA
2026-04-19Ningbo, ChinaDischarged from vessel MSC RAYA
2026-04-24Ningbo, ChinaLoaded on vessel MSC ROME
2026-06-10Le Havre, FranceDischarged from vessel MSC ROME
2026-06-13Le Havre, FranceLoaded on vessel MSC BENIN
2026-06-16London Gateway, UKDischarged from vessel MSC BENIN
2026-06-18London Gateway, UKDelivered by truck
2026-06-22London Gateway, UKEmpty 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

TrackingMSC · SeaRates · ShipsGo · Visiwise · TraceContainer

Vessel dataVesselFinder · MarineTraffic · Flexport Atlas · MaritimeOptima · Shipnext · Equasis

BackgroundBIC · IMO Ship Identification Number Scheme · Kamigumi · DIVER OSINT CTF