26 Aralık 2013 Perşembe

Windows API Programlamaya İlişkin Temel Bilgiler

Windows API programlama yaparken kaynak kodun içerisine windows.h dosyasi include edilmelidir. Bu dosya içerisinde içerisinde gereken pekçok bildirim vardir.
Sistem programlamada yazim stili olarak macar notasyonu (hungarian notation) kullanilir.

Macar notasyonuna göre;
  • Fonksiyonlar pascal tarzı harflendirilir. Yani her sözcüğün ilk harfi büyüktür. (her sozcugun ilk harfi buyuktur. Fiiller ince kullanilir.)
  • GetWindowLong(), CreateProcess()
  • Degiskenler genellikle onun turunu belirten bir önek ile başlatılır. Degişkenler deve notasyonu ile isimlendirilir. (camel notation)
  • BYTE, WORD ve DWORD typedef isimleri sırasiyla 1, 2 ve 4 byte lik işaretsiz tam sayı türlerini temsil eder.
  • Typedef isimlerindeki P öneki ve LP öneki gösterici anlamına gelir. (Windows 3.x sistemlerinde farkli anlama gelmektedir.)
  • Word kavramı donanım ve yazılımda farklıdırlar. Yazılımda 2 byte, ama donanimda register uzunlugu olarak adlandirilirlar.
  • Gösterdigi yer const olan const göstericilerde PC veya LPC öneki kullanılır.
  • Yazi türleri (char türden göstericiler) SZ yada LPSZ ile baslatilir.
  • PSTR, LPSTR, LPCSTR yazıyı gösteren gösterici anlamındadır.
  • BOOL türü başarı ve başarısızlığı anlatan bir türdür. INT olarak typedef edilmistir. ( 0 basarisiz, 0 disi basarisiz)
  • fonksiyon tanimlarinda in, in_out, ve __out ifadeleri sirasiyla ver kullanayim, ver icini ben de doldurayim ve ver icicin doldurayim manasinda kullanilir. CreateProcess() fonksiyonunun msdn icerisindeki dokumani icerisinde gorulebilir.

Unicode Kullanımı


  • java ve c# da char turu 2 byte tutar. C de ise 1 byte dir.
  • typedef unsigned short wchart;
  • 32 bi windows sistemlerine gecildiginde unicode kullanimi da devreye girmistir. Butun yazi parametresi alan fonksiyonlardan aslinda 2 tane bulunmektedir. Sonu A ile birenler ASCII sonu W ile bitenler UNICODE anlamina gelmektedir.
  • Biz program yazarken genellikle A ve W olmayan isimleri kullaniriz bu isimler duruma gore A ve W lu bicime donusturulurler.
  • IDE de bu ayar proje seceneklerinden yapilmaktadir ve default durum UNICODE bicimindedir.
  • CreateProcessA (ascii)
  • CreateProcessW (unicode)
  • C de ascii string “xxxx” biciminde, unicode string L”xxxxx” biciminde yazilir. Eger programimizi ascci ile unicode arasinda istedigimiz zaman cevirebilecegimiz bicimde yazmak istiyorsak. Butun iki tirnaklari TEXT macrosu ile girmelidir


#ifdef UNICODE
#define TEXT() L##S
#else
#define TEXT(,) S
#endif


  • Ayrica Standat C fonksiyonlarinin ascii ve unicode versiyonlari vardir. Bunlar arasinda otomatik gecis yapmak icin ozel makrolar kullanilmaktadir. Bu makrolar tchar.h dosyasi icerisinde.
  • Aslinda standartlara gore printf fonksiyonunun ascii ismi printf unicode ismi wprintf dir. Windowsta _tprintf der isek bu ide deki ayara gore wprintf veya printf kullanir.

HANDLE Kavramı


  • Bir veri yapisina erismekte kullanilan anahtar degerlere handle denir.
  • Handle genel olarak bir veri yapisina erismekte kullanilan tekil anahtar degerdir. Handle tipik olarak bir adres formunda bulunabuilir. Bir dizide index belirtiyor olabilir.
  • Handle kullanan kisi onun ne anlam ifade ettigini bilmek zorunda degildir.
  • Bir handle sisteminde tipik olarak handle sistemini yaratan bir fonksiyon bulunur. Bunlar tipik olarak CreateXxxxx veya OpenXxxx olarak adlandirilir
  • Handle sistemini kullanan fonksiyonlar vardir. bunlara biz handle degerini veririz ve giris yaptiririz. Nihayet handle sistemini yok eden fonksiyonalr vardir. Bunlar CloseXxx veya DestroyXxxx olarak adlandirilir.

28 Kasım 2013 Perşembe

Truecrypt Başlangıç Mesajını Değiştirmek

Eğer kurumsal bilgilerinizi korumak amacı ile tüm diskinizi truecrypt ile şifrelediyseniz sistem başladığında truecrypt boot loader aşağıdaki gibi görünmektedir.


işte bu görünen başlangıç mesajını gizlemek için yapılması gereken oldukça basit. Truecrypt içerisinde System > Setting  seçeneğide bu mesaj değiştirilebilir. Gelen menüde başlangıç mesajını değiştirebilirsiniz.

Başlangıç mesajı değiştirildikten sonra görünümü aşağıdaki gibi olur.


2 Eylül 2013 Pazartesi

Local Linux Enumeration & Privilege Escalation Cheatsheet

Kernel, Operating System & Device Information:

CommandResult
uname -aPrint all available system information
uname -rKernel release
uname -nSystem hostname
hostnameAs above
uname -mLinux kernel architecture (32 or 64 bit)
cat /proc/versionKernel information
cat /etc/*-releaseDistribution information
cat /etc/issueAs above
cat /proc/cpuinfoCPU information
df -aFile system information

Users & Groups:

CommandResult
cat /etc/passwdList all users on the system
cat /etc/groupList all groups on the system
cat /etc/shadowShow user hashes – Privileged command
grep -v -E "^#" /etc/passwd | awk -F: '$3 == 0 { print $1}'List all super user accounts
fingerUsers currently logged in
pinkyAs above
usersAs above
who -aAs above
wWho is currently logged in and what they’re doing
lastListing of last logged on users
lastlogInformation on when all users last logged in
lastlog –u %username%Information on when the specified user last logged in

User & Privilege Information:

CommandResult
whoamiCurrent username
idCurrent user information
cat /etc/sudoersWho’s allowed to do what as root – Privileged command
sudo -lCan the current user perform anything as root

Environmental Information:

CommandResult
envDisplay environmental variables
setAs above
echo $PATHPath information
historyDisplays command history of current user
pwdPrint working directory, i.e. ‘where am I’
cat /etc/profileDisplay default system variables

Interesting Files:

CommandResult
find / -perm -4000 -type f 2>/dev/nullFind SUID files
find / -uid 0 -perm -4000 -type f 2>/dev/nullFind SUID files owned by root
find / -perm -2000 -type f 2>/dev/nullFind files with GUID bit set
find / -perm -2 -type f 2>/dev/nullFind world-writable files
find / -perm -2 -type d 2>/dev/nullFind word-writable directories
find /home –name *.rhosts -print 2>/dev/nullFind rhost config files
ls -ahlR /root/See if you can access other user directories to find interesting files  – Privileged command
cat ~/.bash_historyShow the current users’ command history
ls -la ~/.*_historyShow the current users’ various history files
ls -la ~/.ssh/ Check for interesting ssh files in the current users’ directory
ls -la /usr/sbin/in.*Check Configuration of inetd services
grep -l -i pass /var/log/*.log 2>/dev/nullCheck log files for keywords (‘pass’ in this example) and show positive matches
find /var/log -type f -exec ls -la {} \; 2>/dev/nullList files in specified directory (/var/log)
find /var/log -name *.log -type f -exec ls -la {} \; 2>/dev/nullList .log files in specified directory (/var/log)
find /etc/ -maxdepth 1 -name *.conf -type f -exec ls -la {} \; 2>/dev/nullList .conf files in /etc (recursive 1 level)
ls -la /etc/*.confAs above
find / -maxdepth 4 -name *.conf -type f -exec grep -Hn password {} \; 2>/dev/nullFind .conf files (recursive 4 levels) and output line number where the word password is located
lsof -i -nList open files (output will depend on account privileges)

Service Information:

CommandResult
ps aux | grep rootView services running as root
cat /etc/inetd.confList services managed by inetd
cat /etc/xinetd.confAs above for xinetd

Jobs/Tasks:

CommandResult
crontab -l -u %username%Display scheduled jobs for the specified user – Privileged command
ls -la /etc/cron*Scheduled jobs overview (hourly, daily, monthly etc)
ls -aRl /etc/cron* | awk '$1 ~ /w.$/' 2>/dev/nullWhat can ‘others’ write in /etc/cron* directories
topList of current tasks

Networking, Routing & Communications:

CommandResult
/sbin/ifconfig -aList all network interfaces
cat /etc/network/interfacesAs above
arp -aDisplay ARP communications
routeDisplay route information
cat /etc/resolv.confShow configured DNS sever addresses
netstat -antpList all TCP sockets and related PIDs (-p Privileged command)
netstat -anupList all UDP sockets and related PIDs (-p Privileged command)
iptables -LList rules – Privileged command
cat /etc/servicesView port numbers/services mappings

Programs Installed:

CommandResult
dpkg -lInstalled packages (Debian)
rpm -qaInstalled packages (Red Hat)
sudo -VSudo version – does an exploit exist?
httpd -vApache version
apache2 -vAs above
apache2ctl (or apachectl) -MList loaded Apache modules
mysql --versionInstalled MYSQL version details
perl -vInstalled Perl version details
java -versionInstalled Java version details
python --versionInstalled Python version details
ruby -vInstalled Ruby version details
find / -name %program_name% 2>/dev/null (i.e. nc, netcat, wget, nmap etc)Locate ‘useful’ programs (netcat, wget etc)
which %program_name% (i.e. nc, netcat, wget, nmap etc)As above

Common Shell Escape Sequences:

CommandProgram(s)
:!bashvi, vim
:set shell=/bin/bash:shellvi, vim
!bashman, more, less
find / -exec /usr/bin/awk 'BEGIN {system("/bin/bash")}' \; find
awk 'BEGIN {system("/bin/bash")}'awk
--interactivenmap
perl -e 'exec "/bin/bash";'Perl

Microsoft EMET Attack Mitigations - By Neil Sikka

31 Ağustos 2013 Cumartesi

Linux Sistemlerde Bellek Taşması Koruma Mekanizmaları

Linux sistemler içerisinde bellek taşması hatalarını önlemek için birçok mekanizma bulunmaktadır. Bu koruma mekanizmalarından bazıları çekirdek seviyesinde çalışmakta, bazıları ise derleyici tarafından oluşturulan koruma mekanizmalarıdır. Bu yazıda Linux sistemler üzerinde bulunan bellek taşması (Buffer Overflow), oluşturan zararlı kodlara (exploit) karşı hazırlanan önleme mekanizmalarının bazılarına değinilecektir.

ASLR (Address Space Randomization)

Çalıştırılabilir dosyaların, her çalışma esnasında sanal adres alanında oluşturulan adres değerlerinin rasgele olarak belirlendiği bir mekanizmadır. Bu yapı, saldırganların uygulamanın sanal adres alanındaki yerlerini tespit edebilmesini ve zararlı kod çalıştırmasını oldukça güçleştirmektedir.

ASLR çalışma mekanizmasını bir örnek bir kod parçacığı üzerinde inceleyelim.



Bu kod parçacığında görüldüğü gibi "buffer" değişkeninin bulunduğu adres bilgisi ekranda gösterilir. Bu uygulama her çalıştırıldığında bu adres bilgisinin farklı olduğu görülmektedir.



Ancak sistem üzerinde ASLR koruması pasif hale getirilirse, kod içerisinde görmüş olduğumuz "buffer" değişkenine ait adres bilgisinin bir önceki örnekteki gibi değişmediği görülecektir.  Linux sistemlerde ASLR korumasını pasif hale getirmek için /proc/sys/kernel/randomize_va_space içerisindeki değerin 0 olması gerekmektedir.


Örnek programı tekrar çalıştırıldığında uygulama çıktısı aşağıdaki gibi görülmektedir.


Görüldüğü üzere ASLR koruma mekanizması kapatıldığı zaman, uygulama her çalıştırıldığında, içinde bulunan değişkenin sanal adres alanı içerisindeki adresi değişmemektedir. Bu ASLR koruma mekanizmasının aktif halde tutulması önerilmektedir.

Executable Stack Protection

Executable Stack Protection, bellek taşması saldırılarına karşı derleyici tarafında gerçekleştirilen bir koruma mekanizmasıdır. Bu koruma metodunda uygulama derlenirken, stack üzerinde herhangi bir kod çalıştırmaması için işaretlenir. Uygulamanın stack yapısında kod çalıştırma korumasının olup olmadığını anlamak için çalıştırılabilir dosyanın içeriği incelenmelidir.  Bunun için "readelf" komutu bize yardımcı olacaktır.


Readelf komut çıktısı incelendiğinde GNU_STACK değeri aşağıdaki gibi elde edilmiştir. Bu değere göre bu uygulamanın stack yapısında okuma ve yazma yapılabilir ancak çalıştırma yapılamaz durumda olduğu görülmektedir.

GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4 

GCC derleyicisi derleme esnasında varsayılan olarak çalıştırma yetkisi vermez. Bu nedenle uygulamaya ait stack içerisinde kod çalıştırma yetkisinin aktif hale getirilmesi için, "-z execstack" parametresinin kullanılması gerekmektedir.

root@bt:~$ gcc -ggdb -m32 -z execstack ornek.c -o ornek 

Bu parametre aktif hale getirildikten sonra readelf komutu çıktısı incelendiğinde, stack yapısında kod çalıştırmaya izin verildiği görülmektedir.

 GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RWE 0x4 

Stack Smashing Protector

“GCC Stack Smashing Protector” bellek taşması saldırılarına karşı koruma sağlayan bir mekanizmadır. Eğer bir bellek tasma saldırısı gerçekleşir ise bunu kullanıcıya anında belirtir. Çalışma yöntemi olarak, stack frame yapısı içerisine “canary” değeri eklenir ve bu değer herhangi bir şekilde değişir ise bu bellek taşması veya bozulması olarak algılanır. Bu özellik bellek tasması zafiyetlerinin yanında stack üzerinde oluşan programlamadan kaynaklanan hataların oluşmasını da engeller. “Stack-Smashing Protector” yapısı StackGuard koruma mekanizmasının genişletilmiş halidir.

Bu stack koruma mekanizmasını aktif hale getirmek için derleme sırasında gerekli olan bayrakların eklenmesi gerekmektedir. Örneğin, eğer string koruması eklenmek isteniyor ise -fstack-protector, tüm türlerdeki korumaların aktif hale getirilmesi isteniyor ise -fstack-protector-all bayrağının eklenmesi gerekmektedir. OpenBSD gibi bazı sistemlerde bu stack koruma bayrakları varsayılan olarak her derlemede kullanılmaktadır. Eğer derleme işleminde stack korumasının iptal edilmesi isteniyor ise o zaman derleme esnasında -fno-stack-protector bayrağının parametre olarak eklenmesi gerekmektedir.

Yazının başında gösterilen örnek uygulama içerinde ayrılmış bellek alanından fazla bir girdiyi stack koruması eklenmiş durumu ve stack koruması eklenmemiş durumu ile bellek taşması gerçekleştirilmeye çalışılacaktır.



Görüldüğü üzere uygulamayı derlerken stack koruması eklenmez ise, uygulama çalıştırıldığında “segmentation fault” hatası alınır. Burada uygulamaya argüman olarak göderilen “A” karakteri ile stack yapısı içerisinde ayrılmış alandan fazlasına yazmaya çalışıldı. Eğer girdiğimiz değerler içerisinde fonksiyonun stack yapısı içerisindeki geri dönüş adresi içine anlamlı bir değer girilir ise uygulama kapanmadan farklı bir yöne doğru yönlendirilebilir. Sonrasında -fstack-protection parametresi ile uygulamayı derledikten sonra çalıştırıldığında stack üzerindeki belek taşmasının tespit edildiği görülmektedir.

Fortify Source

GCC içerisinde bellek taşmalarını tanıyan ve zafiyete uğratılmadan önce önleyen “FORTIFY_SOURCE” isminde bir özellik bulunmaktadır. Bu yapı ile derleyici derleme sırasında boyutlarını tanımlayabildiği bellek alanları için bir koruma yapısı ekler. Bu bellek alanlarına örnek olarak stack üzerinde oluşturulmuş sabit boyutlu bellek(buffer) alanları veya malloc() gibi fonksiyonlar ile heap üzerinde oluşturulmuş alanlar örnek olarak gösterilebilir.

Yazının başında gösterilen  uygulama C kodunu incelenecek olursa, buffer değişkeninin boyutu 10 byte olarak belirlenmiş olduğu görülür. Bu uygulama kodunu GCC’nin FORTIFY_SOURCE özelliği aktif edilerek derlenir ise, burada GCC strcpy() fonksiyonunu çağırırken aynı zamanda kopyalanan verinin uzunluğunu kontrol eder. Değişkenin boyutu belirlendikten sonra 10 byte'tan fazla veri buffer değişkeninin içerine kopyalanmaz. Eğer 10 byte'tan fazla bir veri gönderilir ise programdan çıkılır. Eğer derleme sırasında bu buffer değişkeninde bellek taşması ihtimali görülür ise GCC tarafından uyarı mesajı verilmektedir. 


Kendi yazdığınız uygulamalarda FORTIFY_SOURCE özelliğini aktif etmek için GCC ile derleme sırasında –D_FORTIFY_SOURCE=2 argümanı ile derlenebilir. Derleme işlemi gerçekleştirildikten sonra objdump uygulaması ile yazdığımız uygulama içerisindeki kontrol mekanizması aşağıdaki komut çıktısı ile görülebilir. 


Bu komutun çıktısında herhangi bir değer görülür ise FORTIFY_SOURCE yapısının aktif olduğu söylenebilir. Eğer bir sonuç alamazsak FORTIFY_SOURCE yapısı aktif edilmemiş veya bu uygulama içerisinde risk oluşturabilecek bir kod parçacığı bulunamadığı için uygulanmamış demektir.



30 Ağustos 2013 Cuma

OpenCV ile Webcam Kullanimi

Bu yazimizda OpenCV ile basit anlamda bir webcam kullanimi ile ilgili ornek kodlar verecegiz


Webcam kullanarak fotograf cekmek, Webcam kullanarak anlik goruntu aktarimi,

26 Şubat 2013 Salı

Seslisozluk Script

Bu yazımızda seslisozluk (http://m.seslisozluk.com) adresini kullanarak browser kullanmadan bilmediğimiz kelimeleri getiren bir betik yazacağım. yazdığımız betik bittikten sonra aşağıdaki gibi bir bir çıktı elde etmiş olacağız.


Oncelikle gerekli olan kutuphaneler/paketler eklenir.

Seslisozluk icerisinde bir arama yaptigimiz zaman, eger tek kelimelik bir arama yapiyor isek http://m.seslisozluk.com/?word= gibi bir url adresine yonlendiriliyoruz. Ancak bir kelime obegini aramak istiyorsak portal bizi http://m.seslisozluk.com/?word=+ gibi bir url ye yonlendirir.




Bu amacla scriptimizi yazarken arayacagimiz kelime yada kelime obegini bu url yapisina gore duzenlememiz lazim. Arama icin kullanacagimiz kelime obegini olusturduktan sonra url'i olusturmamiz grekiyor. url olusturulduktn sonra aragidaki kod parcacigi ile url'i aliriz. indirdigmiz html formattaki veri icerisinden html tag taglari arasindaki veriyi cekip alacagiz. Ancak istedigimiz veriyi bir sekilde alsak da yine de bazi html kodlari veri icerisine karismis olabiliyor. Bu nedenle elde ettigimiz veriyi html taglerinden arindirmamiz gerekiyor. istedigimiz veriyi asagidaki sekilde suzuyoruz. kodun tamamini asagida gorebiliriz.

18 Ocak 2013 Cuma

Python ile Service Banner bilgisini ogrenme


Kullanım şekli 

./service-banner.py 192.168.1.22 25

Uygulamanın kaynak kodu ise;





The Eternal Life of Malware