ECW - Puzzle

Posted on mer. 16 octobre 2019 in CTF

File : puzzle.pcap

GUI

SCADA/Modbus

puzzle_1.png

Bon, n'ayant (pour l'instant) aucune connaissance sur ModBus ou SCADA, on commence par suivre le flux TCP (ce protocole utilisant TCP) afin d'avoir un visu sur l'ensemble des données qui ont été enregistrées.

On sait également que le flag respecte la nomenclature suivante : ECW{64 char hexa}.

On peut donc chercher tout les { dans cet échange par exemple :

........N)...................N#.5..................Y...........Y...........b.....................N*....................n.v.........n.v.........a...........a...........d...........d... .......s... ..........
.......p...
..................n............v...........6...........6.
.......c.m.
.......c.m.........k.X.........k.X.........V............v........N(....................s.2.........s.2.........O.4.........O.4........._............C.........c...........c..........N,.S.................N&....................d...........d...........c.3.........c.3........N2....................B.C.........B.C.........R......................`.4.........`.4.........s...........s.............7...........7.........i............k. .......q... ........U.!.......o.2.!.......o.2.".......V...".......V...#.......l.7.#.......l.7.$.......z.8.$.......z.8.%.......W...%........V.&.......U.1.&.......U.1.'.......k.f.'.......k.f.(.......a...(..........).......I.d.).......I.d.*......N0...*........+......._.1.+......._.1.,.......b.e.,.......b.e.-.......X...-.......X...........]...........].../......N3.../........0......N-...0........1.......g.b.1.......g.b.2.......t.8.2.......t.8.3.......r.f.3.......r.f.4.......o.*.4.......o.*.5......._.a.5......._.a.6......N..F.6........7......N!...7........8.......\...8.......\...9......N2...9........:.......U...:..........;.......Z...;.......Z...<.......}.b.<.......}.b.=.......c...=.......c...>.......Y...>.......Y...?.......r...?........q.@.......h...@.......h...A.......r...A.......r...B.......j.+.B.......j.+.C......N#...C........D......N*...D........E.......t...E..........F.......Q...F.......Q...G.......V.1.G.......V.1.H.......q...H........U.I.......[...I..........J......._...J......._...K......N(.`.K........L.......b.K.L.......b.K.M.......d. .M.......d. .N......N!...N........O......N&...O........P.......l...P........l.Q.......n.c.Q.......n.c.R.......W.`.R.......W.`.S.......q.2.S.......q.2.T.......i...T.......i...U.......A.E.U.......A.E.V.......|.6.V.......|.6.W.......a...W.......a...X......N&...X........Y.......Z...Y..........Z.......].3.Z.......].3.[......N(...[........\.......Z...\..........]......N2...]........^......N4...^........_.......u.a._.......u.a.`.......V...`.......V...a......N-...a........b.......S...b........h.c......N-...c........d.......X.a.d.......X.a.e.......^...e........3.f.......^.f.f.......^.f.g.......i.3.g.......i.3.h.......`.5.h.......`.5.i.......h.e.i.......h.e.j......N4...j........k.........2.k.........2.l.......W...l.......W...m.......o.O.m.......o.O.n.......\.a.n.......\.a.o.......a...o..........p......N!...p........q.........1.q.........1.r.......d...r........ .s.........}.s.........}.t.........7.t.........7.u.......b.B.u.......b.B.v......N2.V.v........w......N%...w........x.......o...x.......o...y.......Y.0.y.......Y.0.z.......b...z........K.{.......[...{.......[...|.......d...|.......d...}......N*...}........~.......T.4.~.......T.4.........b............B........N2....................p......................a.n.........a.n.........M.a.........M.a.........].....................N0.F..................x.4.........x.4.........a......................~.6.........~.6........N$....................d.c.........d.c........N....................N#....................X......................b............B.........d.9.........d.9.........e......................t......................a...........a..........N/.c..................E.e.........E.e.........w.7.........w.7.........{.c.........{.c........N%...................N%....................Z......................f.3.........f.3.........c......................\.(.........\.(.........Q.6.........Q.6.........W......................P.5.........P.5........N*....................N.f.........N.f.........j.3.........j.3...........3...........3.........m............\.........m.5.........m.5.........C.W.........C.W.........d............c........N.....................e......................p.....................N0....................K.0.........K.0........N/....................\...........\...........a.a.........a.a.........y.2.........y.2........N'....................r......................i......................m...........m...........`............5.........p.8.........p.8........N*....................l...........l..........N%....................i...........i...........F.a.........F.a.........e.0.........e.0.........\.D.........\.D.........r...........r...........b...........b...........R.....................N2....................R.Q.........R.Q.........d............c.........n............v.........f............F.........R.0.........R.0.........r...........r..........N$.R..................H.4.........H.4.........U......................Y.....................N"....................U.{.........U.{........N#....................v.0.........v.0.........Z.7.........Z.7.........Y...........Y...........J.b.........J.b........N2.2..................[.9.........[.9.........D.{.........D.{.........U............{........N)....................G.6.........G.6.........W.1.........W.1........N2.N..................m.....................N#....................b.....................N*....................T...........T..........N0....................`...........`...........S.0.........S.0.........e......................L.8.........L.8

On compte 9 occurrences en tout. Pour chacune d'entre elles, on peut donc regarder le caractère correspondant à l'échange précédent et voir si c'est un W.

Afin de savoir comment les échanges se font avec ModBus, on regarde la partie ModBus de WireShark :

puzzle_2.png

On voit un Transaction Identifier et Reference Number qui pourrait nous donner l'ordre des trames. En regardant le guide d'implémentation, on lit l'information suivante :

  • Transaction Identifier : 2 Bytes - Identification of a MODBUS Request / Response transaction - Initialized by the client - Recopied by the server from the received req

Hum, c'est pas super concluant. On peut essayer avec l'autre champ du coup. On cherche alors les références des paquets avec le caractère '{' en tant que data, soit :

  • 50005
  • 40004

On regarde les paquets ayant pour références 50004 et 40003 :

puzzle_3.png

YEAH ! On a donc le W{ du flag. On remonte donc deux autres trames en arrière et on poursuit jusqu'à l'obtention de } indiquant la fin du flag.

Le début commence à la référence 40001 et se termine à 40069 : les 64 caractères du flag et la nomenclature.

CLI

$ tshark -r puzzle.pcap -O Modbus/TCP -T fields -e modbus.reference_num -e modbus.data | sort -u | awk -F ' ' '{print $2}' | sed ':a;N;$!ba;s/\n//g' | xxd -r -p
���5�R����`�
            ��ScF�2NV�ECW{ea64db08af456004111a079a3fa4ae3903be33f75c282f28a07428c6b6727631}�Q�{��`�������(D���5��K� ��n��Bmc���+X�v*O�����%

On a donc notre flag en clair au milieu du reste : ECW{553d8f4dfb452545515a47da7ae1ee7d649d97ddada0a520288a20461e707cb9}.

Référence

https://en.wikipedia.org/wiki/Modbus http://jamod.sourceforge.net/kbase/protocol.html http://www.modbus.org/docs/Modbus_Messaging_Implementation_Guide_V1_0b.pdf