Wireshark’ta Lua Dissector Nasıl Kullanılır

Dünyanın en iyi ağ paketi yakalama araçlarından biri olan Wireshark, hem çevrimdışı hem de gerçek zamanlı olarak analiz edebilmeniz için belirli veri paketlerine ulaşmanızı sağlar. Uygulamayı, ağınızda akan verileri yakından incelemenin bir yolu olarak düşünün, sorunları ve usulsüzlükleri yakalamanıza olanak tanır. Bir paketin verilerinin belirli bir bölümünü analiz etmek istiyorsanız ayrıştırıcıları kullanabilirsiniz. Adından da anlaşılacağı […]

Wireshark’ta Lua Dissector Nasıl Kullanılır

Dünyanın en iyi ağ paketi yakalama araçlarından biri olan Wireshark, hem çevrimdışı hem de gerçek zamanlı olarak analiz edebilmeniz için belirli veri paketlerine ulaşmanızı sağlar. Uygulamayı, ağınızda akan verileri yakından incelemenin bir yolu olarak düşünün, sorunları ve usulsüzlükleri yakalamanıza olanak tanır.

Bir paketin verilerinin belirli bir bölümünü analiz etmek istiyorsanız ayrıştırıcıları kullanabilirsiniz. Adından da anlaşılacağı gibi, bu işlem kodu “inceler” ve dikkat etmeniz gereken belirli yönleri kesmenize olanak tanır. Bu eğitimde, Lua betik dili kullanılarak Wireshark’ta ayrıştırıcıların nasıl oluşturulacağı ve kullanılacağı açıklanmaktadır.

Başlamadan Önce – Disektörler Hakkında Bilmeniz Gerekenler

Ayrıştırıcılar, Wireshark’ta bir veri paketinin bölümlerini analiz etmenin hızlı bir yolunu sunsalar da, etkili bir şekilde çalışmak için bazı protokolleri takip etmeleri gerekir. Bu protokoller aşağıdakileri içerir:

  • Oluşturduğunuz her ayrıştırıcı, farklı bir protokolden belirli türde bir yükü işlemek için kaydedilmelidir. Bu kaydı tamamlamak için, ayrıştırıcınıza aşağıda göreceğiniz bir “Proto” nesnesi atamanız gerekir.
  • Wireshark aracılığıyla bir disektörü aradığınızda, uygulamadan üç şey alır:
    • TVB Nesnesi – Veri paketinden bir TVB arabelleği.
    • TreeItem Nesnesi – Bir veri ağacında tek bir düğümü temsil eden bir ağaç kökü.
    • Pinfo Nesnesi – Bir paket bilgi kaydı.
  • Yalnızca veri paketiniz “Proto” nesnenize ayarladığınız DissectorTable ile eşleşirse bir ayırıcı çağırabilirsiniz.
    • “Farklı Kod Çöz” işlevi aracılığıyla bir ayrıştırıcı kullanımını zorlayarak bu gereksinimin üstesinden gelebilirsiniz. Ancak o zaman bile, yalnızca “Proto” nesnenize ayarladığınız DissectorTable doğru türdeyse, ayrıştırıcıyı zorlayabilirsiniz.

LUA Kullanarak Disektörünüzü Kurma

Wireshark hem C programlama dilinde yazıldığından hem de C programlama dilini kullandığından, çoğu ayrıştırıcı benzer şekilde C dilinde yazılmıştır. Ancak, Lua’yı kullanmak isteyebilirsiniz. Bu betik dili, C’den daha basittir ve bu nedenle kodlamaya yeni başlayanlar veya daha basit bir dil kullanarak bir ayrıştırıcı oluşturmak isteyenler için daha erişilebilirdir.

Kodunuz daha basit olsa da, Lua’yı kullanırken elde ettiğiniz ayrıştırıcı genellikle C’yi kullanarak oluşturduğunuzdan daha yavaştır.

Adım 1 – Wireshark’ta Lua’yı Kurun

Daha önce Wireshark’ta kullanmadıysanız Lua’yı kurmanız gerekir:

  1. “Yardım”ı ve ardından “Wireshark Hakkında”yı tıklayın.
  2. “Klasörler”i tıklayın.
  3. Aktif bir Lua betiği oluşturmak için aşağıdakilerden birini seçin:
    • Küresel Lua Eklentileri
    • Kişisel Lua Eklentileri
    • Kişisel

Etkinleştirildiğinde, Wireshark’ı her başlattığınızda komut dosyanız hazır olacaktır. Bu komut dosyasında her değişiklik yaptığınızda, değişikliği kaydetmek için Wireshark’ı yeniden başlatmanız veya değişikliklerinizi etkin hale getirmek için tüm Lua komut dosyalarınızı yeniden yüklemek için “Ctrl + Shift + L” tuşlarına basmanız gerekir.

Adım 2 – Disektörünüzü Oluşturmak İçin Temel Adımlar

Lua’ya zaten aşina iseniz, Wireshark’ta çalışacak kendi diseksiyon betiğinizi oluşturmak için aşağıdaki adımları kullanabilirsiniz:

  • Hem protokol ağacında kullanım için uzun bir ad hem de ayırıcının görüntüleme filtresi adı olarak işlev gören bir kısa ad ayarlamanızı gerektiren, ayrıştırıcınız için protokolü bildirin.
    • Uygun türleriyle birlikte aşağıdaki üç alanı oluşturun:
    • Soru – Soru türünü gösterir.
    • Cevap – Cevap türünü gösterir.
  • MessageType – Paketinizin bir soru mu yoksa cevap mı istediğini gösterir.
  • Wireshark’ın onları nasıl görüntüleyeceğini bilmesi için alanlarınızı kaydedin. Kayıtlı alanlar olmadan, genellikle size Ağaç Öğesi ProtoField’inizin geçersiz olduğunu söyleyen bir “Lua Hatası” mesajı alırsınız.
  • Daha önce bahsedilen Pinfo’yu (paketinizle ilgili verileri içeren) ve Ağaç Öğesini (bir alt ağaca ekleyeceğiniz ağacı oluşturarak) içeren bir diseksiyon işlevi oluşturun. Ayrıca, TCP’nizin üzerinde oturan bir “arabellek” oluşturmalısınız.
  • Wireshark’ın ayrıştırıcıyı kullanması gereken protokolü ve bağlantı noktasını belirtin. Örneğin, protokolü “TCP” olarak ve port numarasını kullanmak istediğiniz şekilde ayarlayabilirsiniz.

Adım 3 – Disektörünüzü Wireshark’a Ekleyin

Şu anda, disektörünüz elektriksiz bir ampul gibidir. O var, ama içinden biraz güç geçene kadar sana hiçbir faydası yok. Başka bir deyişle, ayrıştırıcınız henüz Wireshark’a eklenmedi, bu nedenle şu adımları kullanarak onu çalıştırmak için manuel olarak eklemelisiniz:

  1. “Yardım”a tıklayın ve “Wireshark Hakkında” menüsüne gidin.
  2. Lua dosyanız için bir yol listesi bulmak üzere “Klasör” sekmesini seçin.
  3. “Kişisel Lua Eklentileri”ni seçin. Gerekirse bir dizin oluşturun.
  4. Oluşturduğunuz Lua dosyasını kopyalayıp “Kişisel Lua Eklentileri” dizinine yapıştırın. Disektörü açmak için Wireshark’ı yeniden yükleyin.

Yakaladığınız paketlerden bazılarını açarak yeni parçalayıcınızda bir test yapmak iyi bir fikirdir. Wireshark, incelemeniz için seçtiğiniz uzun adı, mesaj türü (soru veya cevap) ve kontrolünüzün sonucu hakkında bilgilerle birlikte gösteren bir mesaj göndermelidir.

Bazı Örnek Kodlar

Daha önce bir ayırıcı oluşturmadıysanız (veya Lua’da yeniyseniz), Tel Köpekbalığı denemeniz için kullanışlı bir örnek ayırıcı sunar:

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)

Postdisektörler ve Zincirli Disektörler

Lua’da onları yaratmada ustalaştıktan sonra, parçalayıcı kullanımınızla biraz daha derinlemesine gitmek isteyebilirsiniz. Wireshark, daha fazla işlevsellik sunan iki ek tür disektör sunar – postdissectors ve zincirleme dissektörler.

Bir postdissector, bir paket için çalıştırdığınız tüm dissector’ların son kontrolüne çok benzer. Wireshark, kullanmasını istediğiniz diğer tüm ayırıcıları çağırdığında bildirim almak için kaydedersiniz ve bunu “Protokol” ve “Bilgi” sütunlarını filtrelemek için kullanabilirsiniz. Bu özellik, veri kümeleri arasında uzun bir boşluk olduğu ve her birini tek tek hatırlayamadığınız bir oturumda birden çok paketi filtrelemek istediğinizde özellikle kullanışlıdır.

Zincirleme ayrıştırıcılar, tek bir ayrıştırıcının verilerine erişmenizi sağlayarak benzer bir işlev görür (en azından daha önce kullanılan ayrıştırıcılar aracılığıyla filtreleme açısından). Buradaki en önemli avantaj, zincirleme ayrıştırıcının her paketi tekrar gözden geçirmesi gerekmemesi ve sizi orijinal ayrıştırıcının tekrar çalışmasını beklemeye zorlamadan bir sonuç vermesidir.

Lua’da inceleme

Wireshark’ın zaten C’de (doğal dili) dissector oluşturma yeteneği sunduğu göz önüne alındığında, bunları Lua’da da yaratma gereğini görmeyebilirsiniz. Yine de, C’de rahat olmayanlar ve Lua’da zaten ustalaşmış olanlar, Lua’nın hafif betiklerinin kendi ayrıştırıcılarını oluşturmayı kolaylaştırdığını görebilirler. Elbette, işlemi çalıştırdığınızda C tabanlı parçalayıcılara kıyasla daha uzun bir yükleme süresinden ödün vermeniz gerekir, ancak ne olursa olsun seçeneğe sahip olmak yararlıdır.

Bununla birlikte, sizden haber almak istiyoruz. Wireshark’ta disektörleri ne sıklıkla kullanıyorsunuz? Onları daha önce C’de yaratmayı denediniz mi ve Lua’da disektör yapmanın ne gibi faydalar sağladığını düşünüyorsunuz? Aşağıdaki yorumlar bölümünde bize bildirin.

Teknory