39th Chaos Communication Congress
27th of December 2025
The contents of this presentation constitutes our own opinions and work.
Whilst some of this work has been partially supported by the Max-Planck-Gesellschaft zur Förderung der Wissenschaften e.V., any opinions presented here do not constitute opinions of the Max-Planck-Gesellschaft.
This talk has not been endorsed nor sanctioned by the German Government, federal nor state, the University of Ljubljana, the University of Geneva, the Karlsruhe Institute of Technology, the European Union Agency for Railways, the Verband Deutscher Verkehrsunternehmen e.V., the Union internationale des chemins de fer, the Deutschlandtarifverbund GmbH, nor any of their respective members.
Stadtwerke SchweinfurtPeople provided fake payment information, which is not verified at the time of the preview - the ticket is invalid when scanned on the train, because there are also cancellation data available - but this only applies to the DB. Elsewhere, one might probably get through with such a ticket.
Letter EPC098-13, European Payments CouncilThe SEPA Regulation does not specify how a mandate should be signed by the payer.
In the highly distributed world of German public transport,
communicating revocation can be
difficult.
Issuers can have more success simply removing access in their own app.
Oh no...
| 2024-08 | 2024-09 | 2024-10 | 2024-11 | 2024-12 | 2025-01 | 2025-02 | |
|---|---|---|---|---|---|---|---|
| DB AG | 1 | 1 | 2 | 10 | |||
| RMV GmbH | 14 | 174 | 184 | 173 | 241 | 11 | |
| WSW mobil GmbH | 117 | 21 | |||||
| Ennepe-Ruhr | 1 | ||||||
| Schweinfurt | 2 | 101 | |||||
| Würzburg | 1 | ||||||
| Vetter GmbH | 1 |
20 tickets uploaded in one day, from one IP - O2/Telefónica Germany residential Internet.
That guy on Telegram? His personal PayPal account.
A Signal message from a friendThere are apparantly de-ticket scams going arround that issue u tickets that are signed with the wrong key.
It uses keys from Vetter GmbH Omnibus- und Mietwagenbetrieb.
Senior? Unknown zone?? DB Regio???
d-ticket.su
Wrench
Dealings under the table
???
Apple Wallet Certificate Subject:
UID=pass.com.de-ticket, CN=Pass Type ID: pass.com.de-ticket, OU=X85L8WFJ87, O=Aqib Javeed,
C=US
Payment details:
"merchant_data": {
"category": "travel_agencies_tour_operators",
"category_code": "4722",
"city": "HongKong",
"country": "HK",
"name": "PM *De ticket",
"network_id": "54303994",
"postal_code": null,
"state": null,
"tax_id": null,
"terminal_id": "WPGTID01",
"url": "https://www.payermax.com/"
}
'What are you on about mate, we don't see that?'
Clearly photoshopped with a VDV barcode of the Usedomer Bäderbahn GmbH
Presented with more evidence, they claimed it wasn't their problem at all! It was their partner mo.pla at fault.
'We have nothing to do with mo.pla, we just use their services, you'll have to ask them.'
We don't think so
Please also note that the key 521100001.pem was withdrawn at short notice due to suspected misuse.
Ein Sperren des Ticketschlüssels noch im Dezember 2024 wurde aufgrund von Urlaub und Krankheit des verantwortlichen Mitarbeiters nicht durchgeführt. Ein Back-up für diese Fälle existiert bei der DTVG aufgrund enger Personaldecke nicht.
Wir fahren seit diesem Jahr ein neues Sicherheitskonzept und tauschen die Schlüssel regelmäßig aus. In dem Zuge sind wir von 521100001.pem auf 521100002.pem umgestiegen. Gegebenenfalls werden wir dies in kürzeren Intervallen wiederholen.
A Vetter D-Ticket bought today will still be signed with the same key as in March.
I forwarded the IDs to mo.pla, and they found out, that their PayPal-payment-process needs some fixing. All tickets were bought with the same, empty PayPal account.
FYI: they insinuated, that Zügli is a tool used for fraudulent actions and that you “decode” Barcodes, as if this is a forbidden thing. So please be cautious about what you tell them.
n.b.: this bug has since been fixed
POST https://identitytoolkit.googleapis.com/v1/accounts:signUp?key=XXX HTTP/1.1
Content-Type: application/json
{
"returnSecureToken": True,
"email": "some@email.example",
"password": "Hunter2",
}
POST https://backend.mopla.solutions/api/passengers/create HTTP/1.1
Content-Type: application/json
Authorization: Bearer XXX (from Google)
{
"authenticationProviderId":"XXX (from Google)",
"email":"some@email.example"
}
POST https://backend.mopla.solutions/api/command/addPassengerDetails HTTP/1.1
Content-Type: application/json
Authorization: Bearer XXX
{
"firstName": "Max",
"lastName": "Mustermann",
"phone": "+491711234567",
"dateOfBirth": "1990-10-03T00:00:00.000Z",
"street": "Platz der Vereinten Nationen",
"streetNumber": "9",
"zipcode": "53113",
"city": "Bonn"
}
GET https://backend.mopla.solutions/api/passengers/intent HTTP/1.1
Authorization: Bearer XXX
POST https://api.stripe.com/v1/setup_intents/{setup_intent_id}/confirm HTTP/1.1
Content-Type: application/x-www-form-urlencoded
payment_method_data[type]=card&
payment_method_data[card][number]=XXXXXXXXXXXXXXXX&
payment_method_data[card][cvc]=XXX&
payment_method_data[card][exp_year]=XXXX&
payment_method_data[card][exp_month]=XX&
key=pk_live_XXX&
client_secret=XXX&
use_stripe_sdk=false
POST https://backend.mopla.solutions/api/command/setDefaultPaymentMethod HTTP/1.1
Content-Type: application/json
Authorization: Bearer XXX
{
"paymentMethodId": "XXX"
}
POST https://backend.mopla.solutions/api/command/createSubscription HTTP/1.1
Content-Type: application/json
Authorization: Bearer XXX
{
"startDate": "2025-02-01"
}
GET https://backend.mopla.solutions/api/passengers/tickets HTTP/1.1
[{
"id":"SOME-UUID",
"ticketId":"DT-XXX...",
"status":"VALID",
"type":"GERMANYTICKET",
"validFrom":"2025-01-31T23:00:00Z",
"validTo":"2025-03-01T02:00:00Z",
"firstName":"Max",
"lastName":"Mustermann",
"aztecCode":"I1VUMDE.."
}]
c.f. Der Bahn Song
2,9 Million < 267 Million
VDV-Sondersitzung, 6th March 2025
267 Million EUR at 49 EUR per month
316 Million EUR at current prices — ~9 and a half new ICEs
The contracts establishing the D-Ticket
do not provide for punishment in situations like this.
Thanks to everyone who helped along the way:
Email: qmisell@mpi-inf.mpg.de
Fedi: @q@glauca.space
Email: maya@catgirl.global
Fedi: @maya@catgirl.global
Slides at magicalcodewit.ch/39c3-slides/