[{"categories":["Diğer"],"content":"Bir Şehir Düşünün Bir şehir düşünün. Bu şehirde binlerce insan yaşıyor, her saniye yüzlerce araç giriş çıkış yapıyor. Kimileri ticaret için geliyor, kimileri yalnızca geçip gidiyor. Ancak şehre gelen herkesin iyi niyetli olduğunu söyleyebilir miyiz?\nBir gün şehir yönetimi, giriş ve çıkışları kontrol etmek amacıyla belirli noktalara güvenlik görevlileri yerleştirmeye karar veriyor. Bu görevlilerin işi oldukça basit:\nGelenlerin kim olduğunu, nereden geldiklerini ve nereye gitmek istediklerini kontrol etmek. Kurallara uyanlar yollarına devam ederken şüpheli görülenler durduruluyor. Bilgisayar ağlarında da durum pek farklı değil. İnternete bağlı bir bilgisayar, sürekli olarak farklı adreslerle iletişim kurar. Bu iletişim sırasında sayısız veri paketi ağ üzerinden geçer. Ancak her paketin sistemimize ulaşmasını veya sistemimizden çıkmasını istemeyebiliriz.\nPaket Nedir? Bir internet araması yaptınız, bir arkadaşınızla yazıştınız veya bir zoom konferansındasınız. Hiç karşı tarafla nasıl iletişim kurabildiğinizi ve arkada nelerin döndüğünü düşünmüş müydünüz?\nBiz bu arkadaki veri taşıyıcı kutulara Paket diyoruz. Paketler ağ iletişimindeki en temel veri birimlerinden biridir. 7 Adet Paket türü vardır.\nBunlar:\nProtokol\tOSI Katmanı\tAçıklama\tKullanım Alanı TCP\tL4 (Transport) | Bağlantı odaklı, güvenilir ve sıralı veri iletimi sağlar. SSH, HTTP/1.1, HTTPS (TCP üzerinden) UDP\tL4 (Transport) | Bağlantısız çalışır. Teslimat ve sıralama garantisi sağlamaz.\tDNS, VoIP, çevrim içi oyunlar ICMP\tL3 (Network) | Ağ hatalarını bildirir ve bağlantı teşhisinde kullanılır.\tPing, Traceroute ARP\tL2/L3 arası | IPv4 adresine karşılık gelen MAC adresini öğrenir.\tYerel ağ iletişimi IGMP\tL3 (Network) | IPv4 multicast grup üyeliklerini yönetir.\tIPTV, multicast yayınlar IPv4\tL3 (Network) | 32 bit IP adresleri kullanarak paketlerin yönlendirilmesini sağlar.\tİnternet ve yerel ağlar IPv6\tL3 (Network) | 128 bit adresleme sağlayan yeni nesil IP protokolüdür.\tModern internet ağları Ethernet\tL2 (Data Link) | MAC adresleri aracılığıyla yerel ağda çerçevelerin iletilmesini sağlar.\tLAN, switch bağlantıları Basitleştirilmiş bir IPv4 Paketi Şu Şekildedir:\n+-------------------------------------+ | IP HEADER | |-------------------------------------| | Source IP: 192.168.1.10 | | Destination IP: 142.250.185.14 | | Protocol: TCP | | TTL: 64 | +-------------------------------------+ | PAYLOAD | |-------------------------------------| | TCP Header | | Application Data | +-------------------------------------+ Firewall Nedir? İşte burada Firewall (Güvenlik Duvarı) devreye girer. Firewall, ağ trafiğini önceden belirlenmiş kurallara göre denetleyen ve hangi bağlantılara izin verilip hangilerinin engelleneceğine karar veren bir güvenlik mekanizmasıdır.\nÇalışma Prensiblerine Göre Firewall\u0026rsquo;lar Firewall Türleri 1- Packet Filtering Firewall En temel güvenlik duvarı türlerinden birisidir. Paketlerin kaynak ve hedef ip adreslerini, port numaralarını ve protokollerini kontrol eder. Hızlıdır, fazla kaynak tüketmez. Önceden tanımlanan kurallara göre paketlere izin verir veya engeller. Kurallarla eşleşmeyen paketler ise güvenlik duvarının yapılandırmasına bağlı olarak drop edilebilir ya da reject edilebilir. (Genelde drop tercih edilir, default\u0026rsquo;ta da drop vardır.)\n2- Stateful Inspection Firewall Stateful Inspection (durum bilgili denetim), modern firewall\u0026rsquo;ların temel çalışma prensibidir. İsim, \u0026ldquo;connection state\u0026rdquo; (bağlantı durumu) takibi yaptığından gelir.\nBir paket ağdan geçtiğinde şu bilgiler kaydedilir:\nKaynak IP ve port Hedef IP ve port Protokol (TCP/UDP/ICMP) Bağlantının durumu (SYN_SENT, ESTABLISHED, TIME_WAIT vb.) Çalışma adımları şu şekildedir:\nYeni bağlantı gelir ──► Firewall, kural setini (rule set) kontrol eder ──► Pakete izin verilirse durum tablosuna girilir.\nAynı bağlantının devam paketleri geldiğinde sadece bu durum tablosuna bakılır, eğer kaydı varsa direkt geçilir. (Fast path)\nBir iç makine bağlantı başlatmadıysa, dışarıdan gelen paketin state table\u0026rsquo;da karşılığı yoktur ──► düşürülür.\n3- Circuit-Level Gateway OSI Modelinin Session(Oturum) Katmanında çalışan ve iki sistemi birbirine bağlayarak sanal bir devre kuran firewall türüdür. En büyük temsilcisi SOCKS Proxy\u0026rsquo;dir. Paketlerin içeriğine yani Application Data\u0026rsquo;ya bakmak yerine bağlantının durumuna bakar ardından tünel/pipe açar. Modern tehtitler için yetersizdir çünkü içerik kontrolü yapmaz. Ayrıca trafik şeffaftır.\nGünümüzde tek başına firewall olarak sayılamayacak kadar zayıflamıştır.\n4- Application-Level Gateway En derin incelemeyi yapan firewall türüdür. OSI modelinin 7. katmanında proxy olarak çalışır. En büyük örneği Squid (HTTP proxy). Ayrıca FTP, SMTP, DNS gibi protokollere özel proxy\u0026rsquo;ler de bu kategoriye girer.\nALG trafiği sonlandırır, protokolü çözümler, kurallara göre değerlendirir ve gerekiyorsa yeniden oluşturarak hedefe gönderir:\nİstemci ──► ALG Proxy ──► Hedef Sunucu (bağlantı 1) (bağlantı 2, proxy kendi adına)\nİstemci asla hedef ile doğrudan konuşmaz, iki ayrı bağlantı kurulur. Proxy bu ikisinin arasında tam yetkili bir tercümandır.\nİstemci proxy\u0026rsquo;e GET http://ornek.com/dosya isteği gönderir Proxy isteği çözümler:\nHTTP metodu izinli mi? (GET ✓, POST? CONNECT?) URL kara listede mi? Kategori filtresi (gambling, malware\u0026hellip;) Header\u0026rsquo;lar şüpheli mi? (SQL injection imzaları, aşırı uzun header) İçerik tipi / dosya uzantısı engelli mi? Kullanıcı kimlik doğrulaması gerekli mi? Proxy kendi adına hedefe bağlanır, isteği gönderir Gelen cevabı da denetler (virüs taraması, boyut limiti, MIME tipi)\nSonucu istemciye iletir — gerekiyorsa içeriği değiştirerek (ör. reklam engelleme, header temizleme)\n5- Next-Generation Firewall (NGFW) Stateful firewall şuna bakıyor:\n\u0026ldquo;Bu bağlantı kural listesindeki porta gidiyor mu?\u0026rdquo; Fakat artık internet trafiğinin yaklaşık %95\u0026rsquo;i 443 (HTTPS) portundan geçiyor. Yani \u0026ldquo;443 açık\u0026rdquo; demek, kontrolün bittiği anlamına geliyor. En uç örnek olarak bir C2 aracı 443 portunu istismar ederek firewall\u0026rsquo;u atlatabilir demek oluyor bu.\nNGFW\u0026rsquo;nin amacı bu sorunları çözmek. Peki NGFW bunu nasıl çözüyor?\nŞu üç yeteneği tek cihazda birleştiriyor:\n1- Uygulama tanıma (App-ID) Port numarasına değil, trafiğin kendisine bakar. İmza veritabanı + davranış analiziyle \u0026ldquo;bu 443\u0026rsquo;teki trafik gerçekten tarayıcı trafiği mi, yoksa Tor/WireGuard/kişisel VPN mi?\u0026rdquo; sorusuna cevap verir. Bu olmadan port bazlı kurallar amaçsızdır.\n2- İçerik denetimi (IPS) Bağlantı geçerli olsa bile içindeki payload\u0026rsquo;ı tarar: exploit kalıpları, shellcode, protokol ihlalleri.\n3- SSL/TLS inceleme 443 şifreli olduğu için bunu görebilmek için trafiği çözümler: istemciye kendi sertifikasını sunar, iki ayrı şifreli trafik kurar. Trafiğin NGFW üzerinden geçerken açık metin halinde olması sayesinde içeriği inceleyebilir, sonra yeniden şifreleyip karşı tarafa iletir. Bu olmadan ilk iki madde şifreli trafikte çalışmaz.\nNGFW, bilerek ve kurumsal CA sertifikasıyla yapılan meşru bir MITM(Man In The Middle)\u0026lsquo;dır.\nKonuma Göre Firewall\u0026rsquo;lar Firewall Türleri 1- Host-Based Firewall Ağ cihazında değil, işletim sisteminde çalışan firewall\u0026rsquo;dur. Trafiği ağın bir ucunda değil, paketin vardığı makinenin içinde filtreler. En büyük örnekleri: Windows Defender Firewall, iptables/nftables (Linux), macOS Application Firewall, ZoneAlarm. Çalışma şekli:\nGelen paket, ağ kartından(ethernet kartı) çekilir ──► Çekirdekteki firewall kural setine uğrar ──► Kurala uyan, işlem düzeyinde kontrolden geçer ──► Uygunsa uygulamaya teslim edilir, değilse düşürülür\nNe zaman işe yarar?\nSeyahat eden laptop / uzak çalışan: Korumalı kurumsal ağın dışındayken bile koruma devam eder Şüpheli yazılım containment: Bir uygulamaya ağ erişimini tamamen kapatabilirsin (sandbox) Sunucu sertleştirme (hardening): Web sunucusunda \u0026ldquo;sadece 80, 443 açık, her şey kapalı\u0026rdquo; demek Sıfır-gün saldırılarında ikinci halka: Çevre firewall\u0026rsquo;u aşan trafik makineye ulaşınca tekrar filtrelenir Fazla makinede kural tutarlılığı sağlamak için MDM/GPO gibi araçlar gerekir.\n2- Network-Based Firewall Trafiği tek bir noktada, ağın kendisinde filtreleyen firewall\u0026rsquo;dur. Genellikle iki ağın birleşim noktasında bulunur. Tüm trafik bu tek cihazdan geçmek zorundadır, o da kurallara göre geçirir veya keser.\nÖrnekler: Palo Alto, FortiGate, Cisco ASA, Check Point (Stateful inspection, NGFW hepsi bu kategoridedir.)\nNetwork-based firewall çevre savunmasının omurgasıdır. Trafiği tek noktadan toplar, merkezi kural uygular, loglar. Host-based firewall ise onun yapamadığını tamamlar.\n3- Cloud Firewall Bu firewall türü kendi içerisinde ikiye ayrılıyor:\n2- Cloud-native (hizmet)\nBulut sağlayıcının kendi sunduğu, altyapısına gömülü firewall:\nAWS Security Groups (en temel hali — instance bazlı stateful filtreleme) AWS Network Firewall / Azure Firewall (tam NGFW yetenekleri: IPS, uygulama filtreleme) GCP Cloud Firewall API ile kuralları tanımlanır. Fiziksel cihaz ve bakım derdi yoktur. 2- Sanal cihaz (virtual appliance)\nPalo Alto, FortiGate gibi üreticilerin firewall\u0026rsquo;unun sanal makine (VM) hali:\nKendi sanal makine olarak çalışır Trafiği kendine yönlendirerek incelemesi gerekir (routing ile) Cloud-native ile karşılaştırıldığında daha fazla kontrol ama daha fazla yönetim yükü ister.\nNeden Klasik Firewall Buluta Uymuyor? Klasik firewall veri merkezinden buluta konulamaz çünkü:\nBulutta perimeter yok: trafik sabit bir kapıdan geçmiyor; kaynaklar dinamik olarak doğup ölüyor, IP\u0026rsquo;ler sürekli değişiyor. Auto-scaling: Fiziksel bir cihaz trafiğe göre boyutunu artıramaz. Multi-cloud / hybrid: Trafiğin bir kısmı AWS\u0026rsquo;de, bir kısmı Azure\u0026rsquo;de, bir kısmı şirket içinde bulunur. Okuduğunuz için teşekkürler :)\n","permalink":"/posts/firewall-nedir-turleri-nelerdir/","summary":"Firewall\u0026#39;ları birlikte inceledik.","tags":["writeup"],"title":"Firewall Nedir, Türleri Nelerdir"},{"categories":["Reversing"],"content":"Önceki yazımızda nispeten basit sayılabilecek bir crackme çözmüştük. Bu sefer orta seviye, biraz daha gerçekçi bir crackme çözeceğiz.\nİyi okumalar dilerim.\n$ chmod +x crackme\n$ ./crackme\nStripped Stripped demek bizim fonksiyonlarımızın isimleri derleyici tarafından gizlendi demek oluyor. Yani Main fonksiyonunu, şifreleyici fonksiyonları vb. tespit etmek için akışı takip etmeliyiz.\n[0x00001080]\u0026gt; afl 0x00001010 1 6 sym.imp.puts 0x00001020 1 6 sym.imp.strlen 0x00001030 1 6 sym.imp.strcspn 0x00001040 1 6 sym.imp.fgets 0x00001050 1 6 sym.imp.fflush 0x00001060 1 6 sym.imp.__printf_chk 0x00001070 1 6 sym.imp.exit 0x00001080 1 18 entry0 0x000011a6 10 210 fcn.000011a6 0x00001140 13 102 fcn.00001140 0x00001093 5 53 fcn.00001093 0x000010c8 5 76 fcn.000010c8 0x00001114 3 44 fcn.00001114 Bizim olayımız şimdilik entry0 fonksiyonunda. Main\u0026rsquo;i bulmak için Main\u0026rsquo;i çağıran fonksiyona gitmeliyiz.\n[0x00001080]\u0026gt; pdf ;-- section..text: ;-- rip: ┌ 18: entry0 (); // noreturn │ 0x00001080 31ed xor ebp, ebp ; [11] -r-x section size 504 named .text │ 0x00001082 4883e4f0 and rsp, 0xfffffffffffffff0 │ 0x00001086 e81b010000 call fcn.000011a6 │ 0x0000108b 89c7 mov edi, eax ; int status └ 0x0000108d e8deffffff call sym.imp.exit ; void exit(int status) xor ebp, ebp ; bir register kendisi ile xor\u0026#39;lanırsa 0 olur. ebp = 0 and rsp, 0xfffffffffffffff0 ; rsp\u0026#39;yi 16 byte\u0026#39;a hizala call fcn.000011a6 ; asıl program (main) mov edi, eax ; dönüş değeri → exit\u0026#39;in 1. argümanı call sym.imp.exit $ s fcn.00011a6\n$ pdf\n┌ 210: fcn.000011a6 (); │ afv: vars(2:sp[0x3e..0x43]) │ 0x000011a6 53 push rbx │ 0x000011a7 4883ec40 sub rsp, 0x40 │ 0x000011ab 488d354e0e.. lea rsi, str.Serial: ; segment.LOAD2 │ ; 0x2000 ; \u0026#34;Serial: \u0026#34; │ 0x000011b2 bf02000000 mov edi, 2 │ 0x000011b7 b800000000 mov eax, 0 │ 0x000011bc e89ffeffff call sym.imp.__printf_chk │ 0x000011c1 488b3d382e.. mov rdi, qword [obj.stdout] ; [0x4000:8]=0 ; FILE *stream │ 0x000011c8 e883feffff call sym.imp.fflush ; int fflush(FILE *stream) │ 0x000011cd 4889e7 mov rdi, rsp ; char *s │ 0x000011d0 488b15392e.. mov rdx, qword [obj.stdin] ; [0x4010:8]=0 ; FILE *stream │ 0x000011d7 be40000000 mov esi, 0x40 ; elf_phdr ; int size │ 0x000011dc e85ffeffff call sym.imp.fgets ; char *fgets(char *s, int size, FILE *stream) │ 0x000011e1 4885c0 test rax, rax │ ┌─\u0026lt; 0x000011e4 0f8487000000 je 0x1271 │ │ 0x000011ea 4889e3 mov rbx, rsp │ │ 0x000011ed 488d35150e.. lea rsi, [0x00002009] ; \u0026#34;\\r\\n\u0026#34; ; const char *s2 │ │ 0x000011f4 4889df mov rdi, rbx ; const char *s1 │ │ 0x000011f7 e834feffff call sym.imp.strcspn ; size_t strcspn(const char *s1, const char *s2) │ │ 0x000011fc c6040400 mov byte [rsp + rax], 0 │ │ 0x00001200 4889df mov rdi, rbx ; int64_t arg1 │ │ 0x00001203 e838ffffff call fcn.00001140 │ │ 0x00001208 85c0 test eax, eax │ ┌──\u0026lt; 0x0000120a 743f je 0x124b │ ││ 0x0000120c 4889e7 mov rdi, rsp ; int64_t arg1 │ ││ 0x0000120f e87ffeffff call fcn.00001093 │ ││ 0x00001214 85c0 test eax, eax │ ┌───\u0026lt; 0x00001216 741c je 0x1234 │ │││ 0x00001218 488d7c2405 lea rdi, [var_5h] ; int64_t arg1 │ │││ 0x0000121d e8a6feffff call fcn.000010c8 │ │││ 0x00001222 85c0 test eax, eax │ ┌────\u0026lt; 0x00001224 740e je 0x1234 │ ││││ 0x00001226 488d7c240a lea rdi, [var_ah] ; uint32_t arg1 │ ││││ 0x0000122b e8e4feffff call fcn.00001114 │ ││││ 0x00001230 85c0 test eax, eax │ ┌─────\u0026lt; 0x00001232 752a jne 0x125e │ │││││ ; CODE XREFS from fcn.000011a6 @ 0x1216(x), 0x1224(x) │ │└└───\u0026gt; 0x00001234 488d3df10d.. lea rdi, str.Access_denied. ; 0x202c ; \u0026#34;Access denied.\u0026#34; ; const char *s │ │ ││ 0x0000123b e8d0fdffff call sym.imp.puts ; int puts(const char *s) │ │ ││ 0x00001240 b801000000 mov eax, 1 │ │ ││ ; CODE XREFS from fcn.000011a6 @ 0x125c(x), 0x126f(x), 0x1276(x) │ ┌─┌┌───\u0026gt; 0x00001245 4883c440 add rsp, 0x40 │ ╎│╎╎││ 0x00001249 5b pop rbx │ ╎│╎╎││ 0x0000124a c3 ret │ ╎│╎╎││ ; CODE XREF from fcn.000011a6 @ 0x120a(x) │ ╎│╎╎└──\u0026gt; 0x0000124b 488d3dba0d.. lea rdi, str.Invalid_format. ; 0x200c ; \u0026#34;Invalid format.\u0026#34; ; const char *s │ ╎│╎╎ │ 0x00001252 e8b9fdffff call sym.imp.puts ; int puts(const char *s) │ ╎│╎╎ │ 0x00001257 b801000000 mov eax, 1 │ └──────\u0026lt; 0x0000125c ebe7 jmp 0x1245 │ │╎╎ │ ; CODE XREF from fcn.000011a6 @ 0x1232(x) │ └─────\u0026gt; 0x0000125e 488d3db70d.. lea rdi, str.Access_granted. ; 0x201c ; \u0026#34;Access granted.\u0026#34; ; const char *s │ ╎╎ │ 0x00001265 e8a6fdffff call sym.imp.puts ; int puts(const char *s) │ ╎╎ │ 0x0000126a b800000000 mov eax, 0 │ └────\u0026lt; 0x0000126f ebd4 jmp 0x1245 │ ╎ │ ; CODE XREF from fcn.000011a6 @ 0x11e4(x) │ ╎ └─\u0026gt; 0x00001271 b801000000 mov eax, 1 └ └───\u0026lt; 0x00001276 ebcd jmp 0x1245 Adım adım ilerleyelim. push rbx sub rsp, 0x40 Bu klasik fonksiyon prolog\u0026rsquo;u. Bir alt satırında gerçekleşen işlem fgets()\u0026rsquo;e verilen adres. Fark ettiyseniz o adres de RSP pointer\u0026rsquo;ımızdan başlıyor.\nprintf(fmt, ...) // normal __printf_chk(flag, fmt, ...) // fortify\u0026#39;lı, iki adet parametre alıyor Calling Convention\u0026rsquo;u hatırlayalım. Argüman sırası şu şekildeydi:\nrdi -\u0026gt; rsi -\u0026gt; rdx -\u0026gt; rcx...\nmaalesef __printf_chk\u0026rsquo;de durumlar biraz daha farklı.\nregister\tnormal printf\t__printf_chk rdi\tformat string\tflag (edi = 2) rsi\t1. argüman\tformat string (\u0026#34;Serial: \u0026#34;) rdx\t2. argüman\t1. argüman __printf_chk, __sprintf_chk, __fprintf_chk gibi _chk ekli fonksiyonlarda argümanlar bir register kaymış olur. Bunu aklımızda bulundurmalıyız.\nPeki şuanda ne biliyoruz? fcn.000011a6 -\u0026gt; Büyük ihtimalle main fonksiyonu. fcn.00001140 -\u0026gt; Başarısız olursa invalid format yazdırıyor. fcn.00001093, fcn.000010c8, fcn.00001114 -\u0026gt; Kontrol fonksiyonları. Şimdi bildiklerimizin isimlendirmelerini yapalım. [0x000011a6]\u0026gt; afn main_ @ fcn.000011a6\n0x00001203 call fcn.00001140 ; rdi = girdi buffer\u0026#39;ı 0x00001208 test eax, eax 0x0000120a je 0x124b ; eax == 0 ise 0x124b\u0026#39;ye atla ... 0x0000124b lea rdi, str.Invalid_format. 0x00001252 call sym.imp.puts [0x000011a6]\u0026gt; afn check_format @ fcn.00001140\nDiğer fonksiyonlara şimdilik geçici adlar tanımlayalım.\n[0x00001140]\u0026gt; afn fn_arg0 @ fcn.00001093 [0x00001140]\u0026gt; afn fn_arg5 @ fcn.000010c8 [0x00001140]\u0026gt; afn fn_arg10 @ fcn.00001114 En çok ilgimizi çeken ilk fonksiyona bir bakalım.\n[0x00001140]\u0026gt; pdf @ check_format ; CALL XREF from main_ @ 0x1203(x) ┌ 102: check_format (int64_t arg1); │ `- args(rdi) │ 0x00001140 53 push rbx │ 0x00001141 4889fb mov rbx, rdi ; arg1 │ 0x00001144 e8d7feffff call sym.imp.strlen ; size_t strlen(const char *s) │ 0x00001149 4889c2 mov rdx, rax ; rdx = uzunluk oldu. │ 0x0000114c b800000000 mov eax, 0 │ 0x00001151 4883fa0e cmp rdx, 0xe ; UZUNLUK KONTROLÜ!! Eğer 14 değilse çık. │ ┌─\u0026lt; 0x00001155 7547 jne 0x119e │ │ 0x00001157 807b042d cmp byte [rbx + 4], 0x2d ; \u0026#39;-\u0026#39; 4. indeks\u0026#39;te tire işareti │ ┌──\u0026lt; 0x0000115b 7541 jne 0x119e │ ││ 0x0000115d 807b092d cmp byte [rbx + 9], 0x2d ; \u0026#39;-\u0026#39; 9. indeks\u0026#39;te tire işareti │ ┌───\u0026lt; 0x00001161 753b jne 0x119e │ │││ 0x00001163 b800000000 mov eax, 0 │ ┌────\u0026lt; 0x00001168 eb0a jmp 0x1174 │ ││││ ; CODE XREFS from check_format @ 0x1188(x), 0x1190(x) │ ┌┌─────\u0026gt; 0x0000116a 4883c001 add rax, 1 │ ╎╎││││ 0x0000116e 4883f80e cmp rax, 0xe │ ┌───────\u0026lt; 0x00001172 7425 je 0x1199 │ │╎╎││││ ; CODE XREFS from check_format @ 0x1168(x), 0x11a4(x) │ ───└────\u0026gt; 0x00001174 83f804 cmp eax, 4 │ │╎╎┌────\u0026lt; 0x00001177 7427 je 0x11a0 │ │╎╎││││ 0x00001179 83f809 cmp eax, 9 │ ────────\u0026lt; 0x0000117c 7422 je 0x11a0 │ │╎╎││││ 0x0000117e 0fb61403 movzx edx, byte [rbx + rax] │ │╎╎││││ 0x00001182 8d4abf lea ecx, [rdx - 0x41] │ │╎╎││││ 0x00001185 80f919 cmp cl, 0x19 │ │└──────\u0026lt; 0x00001188 76e0 jbe 0x116a │ │ ╎││││ 0x0000118a 83ea30 sub edx, 0x30 │ │ ╎││││ 0x0000118d 80fa09 cmp dl, 9 │ │ └─────\u0026lt; 0x00001190 76d8 jbe 0x116a │ │ ││││ 0x00001192 b800000000 mov eax, 0 │ │ ┌─────\u0026lt; 0x00001197 eb05 jmp 0x119e │ │ │││││ ; CODE XREF from check_format @ 0x1172(x) │ └───────\u0026gt; 0x00001199 b801000000 mov eax, 1 │ │││││ ; CODE XREFS from check_format @ 0x1155(x), 0x115b(x), 0x1161(x), 0x1197(x) │ └─└└└─\u0026gt; 0x0000119e 5b pop rbx │ │ 0x0000119f c3 ret │ │ ; CODE XREFS from check_format @ 0x1177(x), 0x117c(x) │ ───└────\u0026gt; 0x000011a0 4883c001 add rax, 1 └ ────────\u0026lt; 0x000011a4 ebce jmp 0x1174 Şimdilik 0x00001151, 0x00001157 ve 0x0000115d adreslerindeki olaylara bakalım. Detayına sonra ineceğiz. İlk önemli instruction\u0026rsquo;umuz 14 karakterli olmasını kontrol ediyor. İkinci ve üçüncü instructionlarımız 4. ve 9. indekslerde \u0026lsquo;-\u0026rsquo; işaretinin olmasını kontrol ediyor. Bir deneyelim.\nGördüğünüz gibi Format hatası vermek yerine Access Denied hatası verdi. Yani şifremiz kontrol etmeye değer hale geldi. Formatı tutturabildik.\nDiğer önemli fonksiyonlara bir göz atalım.\n[0x00001140]\u0026gt; pdf @ fn_arg0 ; CALL XREF from main_ @ 0x120f(x) ┌ 53: fn_arg0 (int64_t arg1); │ `- args(rdi) │ 0x00001093 b800000000 mov eax, 0 │ 0x00001098 488d35a00f.. lea rsi, [0x0000203f] ; \u0026#34;+^\\x91\\a\u0026#34; │ 0x0000109f 488d0d950f.. lea rcx, [0x0000203b] ; \u0026#34;}f\\xc0_+^\\x91\\a\u0026#34; │ ; CODE XREF from fn_arg0 @ 0x10ba(x) │ ┌─\u0026gt; 0x000010a6 0fb61407 movzx edx, byte [rdi + rax] ; arg1 │ ╎ 0x000010aa 321406 xor dl, byte [rsi + rax] │ ╎ 0x000010ad 3a1401 cmp dl, byte [rcx + rax] │ ┌──\u0026lt; 0x000010b0 7510 jne 0x10c2 │ │╎ 0x000010b2 4883c001 add rax, 1 │ │╎ 0x000010b6 4883f804 cmp rax, 4 │ │└─\u0026lt; 0x000010ba 75ea jne 0x10a6 │ │ 0x000010bc b801000000 mov eax, 1 │ │ 0x000010c1 c3 ret │ │ ; CODE XREF from fn_arg0 @ 0x10b0(x) │ └──\u0026gt; 0x000010c2 b800000000 mov eax, 0 └ 0x000010c7 c3 ret EAX Register\u0026rsquo;ımız burada for döngüsündeki i, 0x1098 ve 0x109f: İki lea, .rodata’daki iki dizinin adresini rsi ve rcx’e alıyor. lea içeriği okumaz, sadece adresi hesaplar.\n0x10a6: movzx edx, byte [rdi + rax], girdinin i. karakterini edx’e alır böylece döngümüz devam edecek.\n0x10aa: xor dl, byte [rsi + rax]\n0x10ad: cmp dl, byte [rcx + rax], sonucu 2. dizinin i. byte’ıyla karşılaştırır. Eşit değilse jne ile eax = 0 yoluna gider.\n0x10b2 ve 0x10ba: i++, i != 4 ise döngü devam. 4 tur sonra eax = 1\nŞimdi bayt dökümlerini okuyalım.\n[0x00001140]\u0026gt; px 8 @ 0x203b - offset - 3B3C 3D3E 3F40 4142 4344 4546 4748 494A BCDEF0123456789A 0x0000203b 7d66 c05f 2b5e 9107 }f._+^.. İlk 4 byte enc (karşılaştırılan hedef), sonraki 4 byte tbl (XOR anahtarı)\nÖnceki crackme\u0026rsquo;de de XOR anahtarı çözmüştük. Formülü biliyoruz:\ngirdi[i] = enc[i] ^ tbl[i]\n[0x00001140]\u0026gt; ? 0x7d ^ 0x2b [0x00001140]\u0026gt; ? 0x66 ^ 0x5e [0x00001140]\u0026gt; ? 0xc0 ^ 0x91 [0x00001140]\u0026gt; ? 0x5f ^ 0x07 Stringleri birleştirdiğimizde V8QX elde ediyoruz. Bu bizim ilk grubumuz. Şimdi ikinci grubu bulalım.\n[0x00001140]\u0026gt; pdf @ fn_arg5 ; CALL XREF from main_ @ 0x121d(x) ┌ 76: fn_arg5 (int64_t arg1); │ `- args(rdi) │ 0x000010c8 0fb637 movzx esi, byte [rdi] ; arg1 │ 0x000010cb 0fb65701 movzx edx, byte [rdi + 1] ; arg1 │ 0x000010cf 400fb6c6 movzx eax, sil │ 0x000010d3 0fb6ca movzx ecx, dl │ 0x000010d6 01c8 add eax, ecx │ 0x000010d8 b900000000 mov ecx, 0 │ 0x000010dd 3d85000000 cmp eax, 0x85 │ ┌─\u0026lt; 0x000010e2 752d jne 0x1111 │ │ 0x000010e4 0fb64702 movzx eax, byte [rdi + 2] ; arg1 │ │ 0x000010e8 31c2 xor edx, eax │ │ 0x000010ea 80fa03 cmp dl, 3 │ ┌──\u0026lt; 0x000010ed 7522 jne 0x1111 │ ││ 0x000010ef 0fb65703 movzx edx, byte [rdi + 3] ; arg1 │ ││ 0x000010f3 0fb6c0 movzx eax, al │ ││ 0x000010f6 0fb6ca movzx ecx, dl │ ││ 0x000010f9 29c8 sub eax, ecx │ ││ 0x000010fb b900000000 mov ecx, 0 │ ││ 0x00001100 83f809 cmp eax, 9 │ ┌───\u0026lt; 0x00001103 750c jne 0x1111 │ │││ 0x00001105 31d6 xor esi, edx │ │││ 0x00001107 4080fe73 cmp sil, 0x73 ; \u0026#39;s\u0026#39; │ │││ 0x0000110b 0f94c1 sete cl │ │││ 0x0000110e 0fb6c9 movzx ecx, cl │ │││ ; CODE XREFS from fn_arg5 @ 0x10e2(x), 0x10ed(x), 0x1103(x) │ └└└─\u0026gt; 0x00001111 89c8 mov eax, ecx └ 0x00001113 c3 ret Bu fonksiyonumuz epey zor görünmekte. Devam edelim.\nmovzx esi, byte [rdi] movzx edx, byte [rdi + 1] add eax, ecx cmp eax, 0x85 jne 0x1111 Burada ilk iki karakterin toplamı alınıyor. 0x85\u0026rsquo;e eşit olup olmadığı kontrol ediliyor.\nmovzx eax, byte [rdi + 2] xor edx, eax cmp dl, 3 jne 0x1111 [rdi + 2]: Üçüncü karakter.\nedx: İkinci karakterin değerini tutuyordu\nxor edx, eax: İkinci ve üçüncü karaktere XOR uyguluyor.\ncmp dl, 3: XOR sonucunun 3 olup olmadığını kontrol ediyor.\nmovzx edx, byte [rdi + 3] sub eax, ecx cmp eax, 9 jne 0x1111 [rdi + 3]: Dördüncü karakter.\nsub: Üçüncü karakterden dördüncü karakterin ASCII değerini çıkarıyor.\ncmp eax, 9: Sonucun 9 olmasını istiyor.\nxor esi, edx cmp sil, 0x73 sete cl esi: Birinci karakterin değerini tutuyor.\nedx: Dördüncü karakterin değerini tutuyor.\nxor esi, edx: Bu iki karakter arasında XOR gerçekleştiriyor.\n0x73: Hexadecimal olarak 115, yani ASCII\u0026rsquo;de \u0026rsquo;s\u0026rsquo;.\nsete cl: Karşılaştırma eşitse cl = 1, değilse cl = 0 yapıyor.\nKoşulları sıraladığımızda:\nNo.\tKoşul\tAssembly 1\ta + b == 133\tcmp eax, 0x85 2 (b ^ c) == 3\tcmp dl, 3 3\tc - d == 9\tcmp eax, 9 4\t(a ^ d) == 115\tcmp sil, 0x73 İkinci parça 7NMD\nArtık son parçaya gelebiliriz.\n[0x00001140]\u0026gt; pdf @ fn_arg10 ; CALL XREF from main_ @ 0x122b(x) ┌ 44: fn_arg10 (uint32_t arg1); │ `- args(rdi) │ 0x00001114 488d4f04 lea rcx, [rdi + 4] ; arg1 │ 0x00001118 ba05150000 mov edx, 0x1505 │ ; CODE XREF from fn_arg10 @ 0x1132(x) │ ┌─\u0026gt; 0x0000111d c1c205 rol edx, 5 │ ╎ 0x00001120 0fb607 movzx eax, byte [rdi] ; arg1 │ ╎ 0x00001123 31d0 xor eax, edx │ ╎ 0x00001125 69d093010001 imul edx, eax, 0x1000193 │ ╎ 0x0000112b 4883c701 add rdi, 1 ; arg1 │ ╎ 0x0000112f 4839cf cmp rdi, rcx ; arg1 │ └─\u0026lt; 0x00001132 75e9 jne 0x111d │ 0x00001134 3d05ad381c cmp eax, 0x1c38ad05 │ 0x00001139 0f94c0 sete al │ 0x0000113c 0fb6c0 movzx eax, al └ 0x0000113f c3 ret lea rcx, [rdi + 4] mov edx, 0x1505 rcx: Kontrol edilecek 4 karakterin bittiği adres.\nedx: Başlangıç değeri 0x1505 (5381).\nrol edx, 5 movzx eax, byte [rdi] xor eax, edx imul edx, eax, 0x1000193 rol: edx değerinin bitlerini 5 konum sola döndürür.\nmovzx: Sıradaki karakterin ASCII değerini eax içine alır.\nxor: Karakterin değeriyle döndürülmüş edx değerine XOR uygular.\nimul: XOR sonucunu 0x1000193 ile çarpar, sonucu edx içine yazar.\nadd rdi, 1 cmp rdi, rcx jne 0x111d ^^ Döngü\ncmp eax, 0x1c38ad05 sete al Son karakterin XOR sonucunu 0x1c38ad05 ile karşılaştırır Burada koşulu sağlayan girdimiz 3KPA şimdi bulduğumuz parçaları birleştirelim.\nV8QX-7NMD-3KPA\n","permalink":"/posts/orta-seviye-crackme-cozumu/","summary":"Bu yazımızda orta seviye, fonksiyonları stripped olan bir programı radare2 ile çözdük.","tags":["reverse-engineering","crackme"],"title":"Orta Seviye Crackme"},{"categories":["Reversing"],"content":"Bu yazımızda Radare2 aracını kullanarak basit seviye bir crackme\u0026rsquo;yi birlikte çözeceğiz. ilk başta aracımızı açtık.\nBizden ikinci parametreyi yani argv[1]\u0026lsquo;i istediğini görebiliriz. Yani argc == 2 olmalı. Bunu kafadan söyleyebilirsiniz. Kullandığınız terminal programlarında da eğer bir argüman sayısı hatası alıyorsanız böyle. Bu argc parametresi içerdiği içinidir. Şimdi devam edelim.\nGördüğünüz gibi -A parametresi, Radare2\u0026rsquo;ye programı analiz etmemizi söyler ve fonksiyonların konumlarını ve adlarını arar.\nŞimdi çıkan sonuca dönelim. Bütün programlar başladığında ilk başta main fonksiyonu çalışır. Bu yüzden Main fonksiyonumuzun içine şu şekilde girebiliriz $ s main\nEvet bu şuanda main fonksiyonunun içerisinde olduğumuzu gösteriyor. Şimdi pdf komudu ile instruction\u0026rsquo;ları gözlemleyebiliriz.\nBurayı anlamanız için assembly intel instruction komutlarından bir kaçını bilmeniz gerekmekte. Bunlardan bazıları:\nBunları kafamıza yerleştirdiğimize göre devam edebiliriz.\nencoded[0] = 0x50 = 80\n0 + 35 = 35\n80 XOR 35 = 115\nascii 115 = s\nBöyle gittiğimizde stack_trace_7 şifresini elde ediyoruz.\n","permalink":"/posts/basit-seviye-bir-crackme-cozumu/","summary":"Bu yazımızda Radare2 aracını kullanarak basit seviye bir crackme’yi birlikte çözeceğiz. ilk başta aracımızı açtık.\nBizden ikinci parametreyi yani argv[1]‘i istediğini görebiliriz. …","tags":["reverse-engineering","crackme"],"title":"Basit Seviye Bir Crackme Çözümü"},{"categories":["Diğer"],"content":"Sanallaştırma Nedir? Sanallaştırma tek bir bilgisayarın kaynaklarını kullanarak birden fazla sanal bilgisayar veya sanal teknoloji çalıştırma biçimidir.\nBu yazıda sanallaştırmanın 4 farklı türünü ele alacağız.\nSanallaştırma Türleri 1- Tam Sanallaştırma Komple işletim sisteminin sanal bir makinede çalıştırılması işlemidir. KVM ve VirtualBox programları en popüler tam sanallaştırma yazılımlarıdır. Bilgisayarınızın özellikleri dahilinde sanal makinenize ram, depolama alanı vb özellikler tahsis edebilirsiniz.\n2- Ağ Sanallaştırma Sanal ağların, bunlara bağlı olarak switch\u0026rsquo;lerin ve routerların oluşturulması işlemidir. Sanal ağların fiziksel ağ altyapısından mantıksal olarak ayrılmasını da kapsar. Program olarak Open vSwitch örnek verilebilir.\n3- Depolama Sanallaştırma Depolama kaynaklarını mantıksal olarak birleştirir veya ayırır. ZFS, LVM yazılımları bunlara örnek verilebilir. (ZFS Aynı zamanda bir dosya sistemidir. Checksum ile veri bütünlüğü denetimi sağlayabilir)\n4- Konteyner Sanallaştırma (Bu yazıda ele alacağımız konu) Aynı çekirdeği paylaşan izole ortamların oluşturulması hususundaki teknolojinin adıdır. Örneğin bir program yazdınız ve sizin bilgisayarınızda çalıştı fakat bu programın gereksinimleri her bilgisayarda olmayabilir ya da sürüm farkı olabilir. Bu konuda Docker, Podman, LXC gibi yazılımlar bize yardımcı olur. Temel prensibi yapılan yazılım ve gereksinimlerinin \u0026lsquo;image\u0026rsquo; adını verdiğimiz taşınabilir paketlere dönüştürülmesidir. Bu image\u0026rsquo;lar kullanılarak \u0026lsquo;Konteyner\u0026rsquo; adını verdiğimiz izole çalışma ortamları oluşturulur. Image\u0026rsquo;lar uzaktan indirilebilir ve uygun bir Konteyner ortamında doğrudan çalıştırılıp programımızın test edilmesini sağlar. Bu sebeple Sistem Yöneticileri ve Yazılım Geliştiriciler için son derece önemli bir teknolojidir.\nDocker ve Podman\u0026rsquo;ın Farkı Nedir? Docker ve Podman aynı işleri yapsalar da mimarileri ve güvenlik yaklaşımları farklıdır. Docker daemon ile çalışır yani arkada çalışan bir dockerd servisi gereklidir bu yüzden daha çok kaynak tüketir. Podman ise daemonless\u0026rsquo;tir bu yüzden daha hafiftir. Docker root yetkisi ile çalışmaktadır, Podman ise varsayılan olarak rootless kullanımı benimsemektedir. Pod desteğiyse Podman\u0026rsquo;da yerleşik olarak gelirken Docker\u0026rsquo;da bulunmaz. Ayrıca Docker oldukça yaygınken Podman biraz daha niştir.\nHangisi Seçilmeli? CI/CD, Yaygın endüstri araçları, yazılım geliştirme hedefleniyorsa Docker seçilmeli. Fakat Linux Sistem Yönetimi, minimal mimari daha ağırlıklı tercih ediliyorsa Podman güzel bir alternatif.\n","permalink":"/posts/docker-nedir-podman-ile-farki-nedir/","summary":"Sanallaştırma Nedir? Sanallaştırma tek bir bilgisayarın kaynaklarını kullanarak birden fazla sanal bilgisayar veya sanal teknoloji çalıştırma biçimidir.\nBu yazıda sanallaştırmanın …","tags":["linux","virtualization"],"title":"Docker Nedir Podman ile Farkı Nedir"},{"categories":["Network"],"content":"Wireshark Nedir ve Ne Değildir Wireshark, sistem yöneticileri, ağ yöneticileri ve siber güvenlik uzmanları tarafından ağ trafiğini analiz etmek, anomalileri tespit etmek ve bağlantı sorunlarını gidermek amacıyla kullanılan açık kaynaklı bir paket analiz aracıdır.\nGünümüzde birçok uygulama TLS gibi şifreleme protokollerini kullandığından, paketlerin uygulama katmanındaki içerikleri doğrudan okunamayabilir. Ancak IP adresleri, port numaraları, TCP bayrakları ve paketlerin iletim sırası gibi bilgiler incelenebilir.\nWireshark, özellikle TCP/IP protokol ailesinin çalışma mantığını anlamak ve ağ iletişimini paket düzeyinde gözlemlemek isteyenler için oldukça faydalı bir araçtır.\nPackets don\u0026rsquo;t lie. Laura Chappell\nİlk olarak eğer network temeliniz yoksa bu yazıyı okuduktan sonra network ile ilgili olan yazımı okuyup bu yazıya geri dönmenizi tavsiye ederim. Wireshark\u0026rsquo;ı İndirmek Eğer Windows veya MacOS kullanıyorsanız buraya tıklayarak indirebilirsiniz. Eğer Linux kullanıyorsanız ilgili paket yöneticinizden indirmenizi tavsiye ederim. Örnek (Devuan)\n$ sudo apt-get install -y wireshark wireshark-qt\nWireshark Neye Benziyor? Evet Wireshark\u0026rsquo;ı indirdiğimize göre bir giriş yapalım. Başta bizden bir \u0026lsquo;interface\u0026rsquo; seçmemizi istiyor, peki nedir bu interface? Interface bir cihazın ağ ile iletişim kurmasını sağlayan fiziksel veya sanal bağlantı noktasıdır.\nHangisini seçeceğimizi nereden bileceğiz? wlan0 / wlp2s0\tWi-Fi üzerinden internete bağlanıyorsan eth0 / enp3s0\tEthernet kablosunun trafiği incelenecekse lo\tlocalhost (127.0.0.1) trafiğini inceleyecekse seç tun0\tVPN üzerinden geçen trafiği inceleyeceksen seç docker0\tDocker ağ trafiğini inceleyeceksen seç.\nBen şimdilik bir şey seçmeyeceğim çünkü yönetici yetkisi ile açmadım. Bunun yerine örnek bir dump inceleyeceğiz.\nEvet. Şimdi görebildiğiniz üzere Source yani kaynak ve Destination yani Hedef IP adreslerimiz var. Bu tahmin de edilebileceği üzere kullanılan protokolün kaynak ve hedef parametreleri. Bunlara ekstra olarak çok fazla tab daha konulabilir elbette. Fakat biz şimdilik bunlarla yetineceğiz. devamına baktığımızda Protocol, Length ve Info tablarını görmekteyiz.\nProtocol: Paketin hangi protokolle ilişkili olduğunu gösterir. Örneğin TCP, UDP, DNS, HTTP veya TLS. Length (Uzunluk): Yakalanan paketin bayt (byte) cinsinden toplam uzunluğunu gösterir. Örneğin 74, 74 bayt demektir. Info (Bilgi): Paketin içeriğine ve amacına ilişkin kısa bilgiler sunar. Örneğin SYN bağlantı isteğini, SYN, ACK ise bu isteğe verilen yanıtı belirtir. Aşağı tarafa geldiğimizde ise sol taraf bize bilgileri ağ katmanlarına göre gösterirken sağdaki ekran, aynı paketin ham baytlarını hex ve ascii kullanarak gösterir. Burayı daha iyi anlamak için network bilgisi şarttır. Örneğin Ethernet II katmanımızda kaynak ve hedef MAC Adresleri bulunur. Bu yapı ayrıca Encapsulation mantığını görmek açısından faydalıdır.\nFrame: Paketin toplam boyutu ve yakalanma bilgileri. Ethernet II: Kaynak ve hedef MAC adresleri. IPv4: Kaynak ve hedef IP adresleri. UDP: Kaynak ve hedef port numaraları. DNS: Paketin taşıdığı DNS sorgusu. ","permalink":"/posts/wireshark-nedir-ve-nasil-kullanilir/","summary":"Wireshark kullanımı hakkında bilgilendirme","tags":["writeup","network"],"title":"Wireshark Nedir ve Nasıl Kullanılır?"}]