Com una de les millors eines de captura de paquets de xarxa del món, Wireshark us permet obtenir paquets de dades específics perquè pugueu analitzar-los tant fora de línia com en temps real. Penseu en l'aplicació com una manera d'examinar de prop les dades que flueixen per la vostra xarxa, cosa que us permet detectar problemes i irregularitats.
Podeu utilitzar dissectors si voleu analitzar una part específica de les dades d'un paquet. Com el seu nom indica, aquest procés 'dissecciona' el codi, permetent-te retallar certs aspectes que necessiten la teva atenció. Aquest tutorial explica com crear i utilitzar dissectors a Wireshark utilitzant el llenguatge de scripting Lua.
Abans de començar: el que heu de saber sobre els dissectors
Tot i que els dissectors ofereixen una manera ràpida d'analitzar porcions d'un paquet de dades a Wireshark, han de seguir alguns protocols per funcionar de manera eficaç. Aquests protocols inclouen els següents:
- Cada dissector que creeu s'ha de registrar per gestionar un tipus definit de càrrega útil des d'un protocol diferent. Per completar aquest registre, heu d'assignar un objecte 'Proto' al vostre dissector, que veureu a continuació.
- Quan truqueu a un dissector mitjançant Wireshark, rep tres coses de l'aplicació:
- Objecte TVB: un buffer TVB del paquet de dades.
- Objecte TreeItem: arrel d'arbre que representa un sol node en un arbre de dades.
- Objecte Pinfo: un registre d'informació de paquets.
- Només podeu trucar a un dissector si el vostre paquet de dades coincideix amb la DissectorTable que heu establert al vostre objecte 'Proto'.
- Podeu evitar aquest requisit forçant l'ús d'un dissector mitjançant la funció 'Descodificar com'. Però fins i tot llavors, només podeu forçar el dissector si el DissectorTable que heu definit al vostre objecte 'Proto' és del tipus correcte.
Configuració del vostre Dissector mitjançant LUA
Com que Wireshark està escrit i utilitza el llenguatge de programació C, la majoria dels dissectors s'escriuen de manera similar en C. Tanmateix, potser voldreu utilitzar Lua. Aquest llenguatge de script és més senzill que C i, per tant, més accessible per als nouvinguts de la codificació o aquells que simplement volen crear un dissector amb un llenguatge més lleuger.
Tot i que el vostre codi serà més senzill, el dissector que obteniu quan feu servir Lua sol ser més lent que el que crearíeu amb C. No obstant això, aquests són els passos a seguir si voleu crear un dissector Wireshark amb Lua.
Pas 1: configureu Lua a Wireshark
Haureu de configurar Lua si no l'heu utilitzat abans a Wireshark:
- Feu clic a 'Ajuda' seguit de 'Quant a Wireshark'.
- Feu clic a 'Carpetes'.
- Trieu una de les opcions següents per crear un script Lua actiu:
- Complements globals de Lua
- Connectors personals de Lua
- Personal
Un cop activat, el vostre script estarà a punt sempre que inicieu Wireshark. Cada vegada que feu un canvi a aquest script, heu de reiniciar Wireshark per registrar el canvi o premeu 'Ctrl + Maj + L' per tornar a carregar tots els vostres scripts de Lua per activar els vostres canvis.
Pas 2: els passos bàsics per crear el vostre dissector
Si ja esteu familiaritzat amb Lua, podeu seguir els passos següents per crear el vostre propi script dissector que funcionarà a Wireshark:
instal·leu Chrome OS al portàtil antic
- Declareu el protocol per al vostre dissector, que requereix que establiu tant un nom llarg per utilitzar-lo a l'arbre de protocols com un nom curt que serveixi de nom de filtre de visualització del dissector.
- Creeu els tres camps següents, amb els seus tipus adequats:
- Pregunta: mostra el tipus de pregunta.
- Resposta: mostra el tipus de resposta.
- MessageType: demostra si el vostre paquet sol·licita una pregunta o una resposta.
- Registreu els vostres camps perquè Wireshark sàpiga com mostrar-los. Sense camps registrats, rebreu un missatge d''Error Lua', que normalment us indica que el vostre ProtoField d'element d'arbre no és vàlid.
- Creeu una funció de dissecció que inclogui el Pinfo esmentat anteriorment (que conté dades sobre el vostre paquet) i l'element de l'arbre (creant l'arbre que afegireu a un subarbre). També heu de crear un 'buffer', que es troba a la part superior del vostre TCP.
- Especifiqueu tant el protocol com el port per als quals Wireshark ha d'utilitzar el dissector. Per exemple, podeu configurar el protocol a 'TCP' i el número de port al que vulgueu utilitzar.
Pas 3: afegiu el vostre Dissector a Wireshark
Ara mateix, el teu dissector és com una bombeta sense electricitat. Existeix, però no us serveix de res fins que no pugueu fer-hi passar una mica de poder. En altres paraules, el vostre dissector encara no s'ha afegit a Wireshark, de manera que l'heu d'afegir manualment per fer-lo funcionar mitjançant aquests passos:
per què les noies publiquen fruites a Snapchat?
- Feu clic a 'Ajuda' i aneu al menú 'Quant a Wireshark'.
- Seleccioneu la pestanya 'Carpeta' per trobar una llista de camins per al vostre fitxer Lua.
- Trieu 'Connectors Lua personals'. Creeu un directori si cal.
- Copieu i enganxeu el fitxer Lua que heu creat al directori 'Connectors Lua personals'. Torneu a carregar Wireshark per encendre el dissector.
És una bona idea fer una prova al vostre nou dissector obrint alguns dels paquets que heu capturat. Wireshark hauria de lliurar un missatge que mostri el nom llarg que heu triat per al vostre dissector, juntament amb informació sobre el tipus de missatge (pregunta o resposta) i el resultat de la vostra comprovació.
Alguns codis de mostra
Si no heu creat un dissector abans (o sou nou a Lua), Wireshark ofereix un exemple de dissector pràctic perquè el proveu:
local p_multi = Proto("multi", "MultiProto");
local vs_protos = {
[2] = "mtp2",
[3] = "mtp3",
[4] = "alcap",
[5] = "h248",
[6] = "ranap",
[7] = "rnsap",
[8] = "nbap"
}
local f_proto = ProtoField.uint8("multi.protocol", "Protocol", base.DEC, vs_protos)
local f_dir = ProtoField.uint8("multi.direction", "Direction", base.DEC, { [1] = "incoming", [0] = "outgoing"})
local f_text = ProtoField.string("multi.text", "Text")
p_multi.fields = { f_proto, f_dir, f_text }
local data_dis = Dissector.get("data")
local protos = {
[2] = Dissector.get("mtp2"),
[3] = Dissector.get("mtp3"),
[4] = Dissector.get("alcap"),
[5] = Dissector.get("h248"),
[6] = Dissector.get("ranap"),
[7] = Dissector.get("rnsap"),
[8] = Dissector.get("nbap"),
[9] = Dissector.get("rrc"),
[10] = DissectorTable.get("sctp.ppi"):get_dissector(3), -- m3ua
[11] = DissectorTable.get("ip.proto"):get_dissector(132), -- sctp
}
function p_multi.dissector(buf, pkt, tree)
local subtree = tree:add(p_multi, buf(0,2))
subtree:add(f_proto, buf(0,1))
subtree:add(f_dir, buf(1,1))
local proto_id = buf(0,1):uint()
local dissector = protos[proto_id]
if dissector ~= nil then
-- Dissector was found, invoke subdissector with a new Tvb,
-- created from the current buffer (skipping first two bytes).
dissector:call(buf(2):tvb(), pkt, tree)
elseif proto_id < 2 then
subtree:add(f_text, buf(2))
-- pkt.cols.info:set(buf(2, buf:len() - 3):string())
else
-- fallback dissector that just shows the raw data.
data_dis:call(buf(2):tvb(), pkt, tree)
end
end
local wtap_encap_table = DissectorTable.get("wtap_encap")
local udp_encap_table = DissectorTable.get("udp.port")
wtap_encap_table:add(wtap.USER15, p_multi)
wtap_encap_table:add(wtap.USER12, p_multi)
udp_encap_table:add(7555, p_multi)
Postdissectors i Dissectors encadenats
És possible que vulgueu aprofundir una mica més en l'ús del vostre dissector un cop hàgiu dominat la creació d'ells a Lua. Wireshark ofereix dos tipus addicionals de dissectors: postdissectors i dissectors encadenats, que ofereixen més funcionalitat.
Un postdissector és molt semblant a una comprovació final de tots els dissectors que heu executat per a un paquet. El registreu per rebre una notificació un cop Wireshark hagi trucat a tots els altres dissectors que vulgueu que utilitzi, i podeu utilitzar-lo per filtrar les columnes 'Protocol' i 'Informació'. Aquesta funció és especialment útil si voleu filtrar diversos paquets en una sessió en què heu tingut un llarg espai entre conjunts de dades i no podeu recordar-ne cadascun individualment.
Encadenar els dissectors compleix una funció similar (almenys pel que fa al filtratge dels dissectors utilitzats anteriorment) ja que us permet accedir a les dades d'un únic dissector. L'avantatge clau aquí és que el dissector encadenat no ha de tornar a passar per tots els paquets, donant-vos un resultat sense obligar-vos a esperar que el dissector original torni a funcionar.
Disseccionar en Lua
Tenint en compte que Wireshark ja ofereix la possibilitat de crear dissectors en C (el seu llenguatge natural), potser no veieu la necessitat de crear-los també en Lua. Tot i això, aquells que no se senten còmodes amb C, així com els que ja han dominat Lua, poden trobar que el script lleuger de Lua facilita la creació dels seus dissectors. Per descomptat, heu de compensar un temps de càrrega més llarg quan executeu el procés en comparació amb els dissectors basats en C, però és útil tenir l'opció independentment.
Dit això, volem saber de vostè. Amb quina freqüència utilitzeu els dissectors a Wireshark? Has provat de crear-los en C abans i quins avantatges creus que ofereix fer dissectors a Lua? Feu-nos-ho saber a la secció de comentaris a continuació.