Linux Sistem Programlama - 6

Monday, December 22, 2014

Dosya Betimleyicilerinin Anlami

BIr dosya acildiginda kernel o dosya ile ilgili islem yapabilmek icin bir veru yapisi olusturur. Buna dosya nesnesi (File object) denilmektedir. Bu dosya nesnesinin adresi dosya betimleyici tablosu denilen bir tabloya yazilir.  Dosya betimleyici tablosu bir gosterici dizisidir. Dosya betimleyici tablosunun adresi de proses kontrol blogunda saklanmaktadir.



Linux Sistem Programlama - 5

Fork isleminden sonra once ust prosesin mi yoksan alt prosesin mi cizelgelenecegi sistemden sisteme degisebilmektedir. 


Üst proses

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>

void exitsys(const char *msg);

int g_x;

int main(int argc, char *argv[])
{
 pid_t pid;

 if ((pid = fork()) < 0)
  exitsys("fork");

 if (pid != 0) {
  g_x = 10;
  printf("parent process...\n");
 
 }
 else {
  sleep(2);
  printf("child process: %d\n", g_x);  /* 0 yazdýrýlacak */
 }

 printf("ends...\n");

 return 0;
}

Linux Sistem Programlama - 4

Monday, December 1, 2014

Bir dosyanin hardlink'i komut satirinda ln komutu ile olusturulmaktadir. 
cx@debx86:~$ ls -il a.txt
1061483 -rw-r--r-- 1 cx cx 4 Feb 18 15:10 a.txt
cx@debx86:~$ ln a.txt b.txt
cx@debx86:~$ ls -il *.txt
1061483 -rw-r--r-- 2 cx cx 4 Feb 18 15:10 a.txt
1061483 -rw-r--r-- 2 cx cx 4 Feb 18 15:10 b.txt
cx@debx86:~$

Bir dizin olusturuldugu zaman nokta ve nokta nokta isimli iki dizin otomatik yaratilmaktadir. BUnlar aslinda birer hardlink girisleridir. Boylece nokta dizini kendi dizinin hardlink sayacini 1 artirir. ikinokta dizini de ust dizinin harlnik sayacini 1 artirir.

Sembolik Link Dosyaları

http://www.kaanaslan.com/resource/article/display_article.php?id=74 adresinden detayli bilgilerin elde edilmesi lazim
Sembolik link dosyalari normal bir dosya gibidir. NOrmal bir dosyanin icerisinde dosyanin bilgileri vardir fakat sembolik link dosyalarinin icerisinde o dosyanin belirtdigi asil dosyanin yol ifadesi vardir. Pekcok sistem ve posix fonksiyonuna biz sembolik bir dosyanin yol ifadesini verdigimizde o aslinda o dosyani belirttigi asil dosya uzerinde islem yapar.
Bazen sembolik link izlemek probleme yol acabilir. Ornegin dizin agacini dolasirken biz baska bir dizine bir sembolik link gordugumuzde o dizine gecersek ve o dizin de bizim dizinimizi kapsiyor ise sonsuz dongu olusur. Bu nedenle bazi fonksiyonlari "l" ile baslayan versiyonlari olusturulmustur. Fponksiyonlarin bu "l" 'li versiyonlari sembolik link dosyasi soz konusu oldugunda o dosyanin kendisi uzerinde islem yapar. Dosyanin gosterdigi dosya uzerinde degil. Ornegin stat fonksiyonunun lstat isimli bir verisonu vardir.
Sembolik baglanti dosyasi baska bir sembolik baglanti dosyasini gosterebilir. Hatta dongusel bir durum bile olusabilir. Boyle bir dongusel durumda sistem fonsiyonlar bunu tespit eder ve hata ile donus yapar. errno degiskenine ELOOP degeri set eder. Bazi fonksiyonlar hic sembolik baglantilari izlememektedir.  Dogrudan sembolk dosyanin kendisi uzerinde islem yapmaktadir. hardlink  dosyasi olusturabilmek icin link isimli bir fonksiyon vardir. Sembolik link olusturabilmek icin symlink isimli fonksiyon kullanilmaktadir.


#include <unistd.h>
int link(const char *oldpath, const char *newpath);
int symlink(const char *oldpath, const char *newpath);

Linux Sistem Programlama - 3

Sunday, November 30, 2014

chown ve fchown Fonksiyonu


#include <unistd.h>
int chown(const char *path, uid_t owner, gid_t group);
int fchown(int fd, uid_t owner, gid_t group);
int lchown(const char *path, uid_t owner, gid_t group);

Chown fonksiyonu bir dosyanin sahiplik bilgilerini degistirir. Fonksiyonun prototipi yukaridaki gibidir.
Fonksiyonunlarin birinci parametresi ilfili dosyanin yol ifadesi yada dosya betimleyicisidir. Ikinci parametresi dosyanin yeni sahibinin id'sini, ucuncu parametre de dosyanin yeni grubunun id'sini alir. Ancak root processi bis dosyanin sahiplik bilgisini degistirebilir. Dosyanin sahibinin sahiplik bilgisini yada grup bilgisini degistirebilmesi bazi unix turevi sistemlede mumkundur. Bazilarinda ise degildir. POSIX bunu isletim sisteminin istegine birakmistir. Linux'da default durumda dosyanin sahibi sahipligini baska birisine devredemez. Fakat genel olarak dosyanin sahibi dosyanin grubunu degistirmektedir. Ancak dosyanin sahibi dosyanin grubunu POSIX standartlarina gore herhangi bir grup olarak degistiremez. Kendi etkin grupid'si olarak yada ek gruplarindan biri olarak degistirebilir.

POSIX Standartlarinda degisik baslik dosyalarinda xxx_t biciminde typedef edilmis bazi tur isimleri vardir. BU turlerin gercekte hangi tur olarak typedef edilecegibazi kosullar altinda isletim sistemini yazanlara birakilmistir. Bunlarin hepsi ayrica bir grup olarak /sys/types.h dosyasi icinde tanimlanmistir. Tipik xxx_t turleri sunlardir:
-> mode_tnlink_tuid_tgid_tid_t bir tamsayi olarak typedef edilmek zorundadir.
-> blksize_tpid_tssize_tblkcnt_t ve off_t isaretli tamsayi olacak bicimde typedef edilmek zorundadir.
-> size_t isaretsiz bir tamsayi turu olarak typedef edilmek zorundadir.
-> time_t ve clock_t tam sayi yada gercek sayio turunden typedef edilmek zorundadir.

Linux Sistem Programlama - 2

Wednesday, November 26, 2014

Dosya erişim kontrolü şöyle yapılır.

  • Önce Open fonksiyonunu çağıran prosesin root olup olmadığına bakılır. root ise hiçbir kontrol yapılmaz. Erişim kabul edilir.
  • Değil ise ikinci erişim istenen processin etkin UserID'sinin dosyanın UserID'si ile ayni olup olmadığına bakılır. Eğer aynı ise erişim haklarından owner kısmı dikkate alınır. Değil ise 3. maddeye geçilir.
  • Erişmek isteyen prosesin etkin grupid'sinin dosyanın grupid'si ile aynı olup olmadığına bakılır. Aynı ise grup haklar dikkate alınır. Değil ise 4. maddeye geçilir.
  • Bu durumda dosyanın other bilgileri dikkate alınır.
Belirli bir yıldan sonra bir prosesin tek bir gruba ait olması yetersiz görülmüştür. Çünkü bir kişi birden fazla projede çalışabilmektedir. işte bu durumda ek grupid kavramı ortaya çıkmıştır. Bugünkü sistemde bir prosesin bir tane gerçek grupid'si ve etkin grupid'si vardır. Fakat birden fazla ek gruba da sahiptir. 

Ek gruplar tamamen yukarıdaki 3. madde sırasında prosesin etkin grupid ile dosyanın grupid'si karşılaştırılırken etkin grupid ile ayni değerde karşılaştırılmaktadır. Kullanıcının ek gruplari /etc/group dosyasında belirtilmektedir.

POSIX Programlamada Kullanılan Önemli Bazı Bilgiler

POSIX fonksiyonları standart C fonksiyonları ile birlikte glibc/libc diye bilinen kütüphanenin içerisindedir ve GCC sistemi bu kütüphaneye bakmaktadır. Fakat fonksiyonların prototipleri çeşitli baslık dosyası içinde olabilir. Bunların ayrıca include edilmedi gerekmektedir.

POSIX Fonksiyonlarının çok büyük bolumu basari durumunda 0 başarısızlık durumunda -1 değerine geri dönerler. Programcı programın başarısızlığını test etmelidir. Tabi başarısızlığın da bir sebebi vardır. iste başarısızlığın nedeni int türden global errno isimli bir değişkene yerleştirilmiştir. 

Fonksiyon basarisiz olduğunda bu değişkenin içine bakarsak neden basarisiz olduğunu anlayabiliriz. Tüm başarısızlık değerleri errno.h dosyası içinde EXXX bicimde sembolik sabitlerle define edilmiştir. Programı isterse doğrudan bu sembolik sabitleri kullanabilir.

Linux Sistem Programlama - 1

Tuesday, November 25, 2014

NOT: Buradaki notlar Linux/Unix sistem programlama egitimden alinan notlardir.

1980'li yılların sonlarına doğru UNIX sistemleri standart hale getirilmeye çalışılmştır. Bunun için IEEE bünyesinde stadardizasyon ekibi kurulmuş ve POSIX standartları diye bilinen standartlar oluşturulmuştur. POSIX bir grup standartlardan oluşan bir standartlar topluluğudur. Bu grup içerisindeki herbir standart POSIX 1003.X biçiminde isimlendirilmiştir. Örneğin, 1003.1 POSIX uyumlu UNIX sistemlerinin C'de bulundurması gereken sistem fonksiyonlarına ayrılmştır. 1003.2 Shell programlarının kullandığı standart komutları tanımlamaktadır.

(Bu yazının tarihsel gelişim bölümü C ve sistem programcıları derneğinin Unix/Linux sistem programlama dökümanının giriş ksımından aynen kopyalanmıştır. Dökümana buradan erişim sağlayabilirsiniz.)

Giriş
  • Sistem fonksiyonları user mod'da uygulamayı donanıma en yakın yapan fonksiyonlardır.
  • Sistem çekirdeği içerisinde 2 türlü programlama yapilir. 
  • Kernel modülü yazmak 
  • Kernel yapısını degiştirerek yeniden kerneli derlemek
Standat C fonksiyonlari, POSIX fonksiyonlari, Sistem fonksiyonları

  • Standat C fonksiyonları bütün C derleyicilerinde olmasi gereken fonksiyonlardır ve bu fonksiyonlar en alt seviyeli fonksiyonlardir. 
  • POSIX fonksiyonlarıda butun POSIX sistemlerde var olan fonksiyonlardır ve bütün Unix/Linux sistemler icin kullanilabilir fonksiyonlardır. 
  • Sistem fonksiyonlari da biraz daha sisteme ozellestirilmis fonksiyonlardir.
Yazılımda genel olarak kod tekrarı istenmez. Cünkü kod tekrarı hem fazla yer kaplar hemde bakımı zordur. Bu nedenle yazılım sistemleri katman katman oluşturulur. Yani yeni bir katman başka bir katmanın var olduğu fikriyle oradaki fonksiyonlari cağırarak yapılır. Yazılımsal olarak en asağı katman işletim sisteminin dış dünyaya sunduğu aşagi seviyeli sistem fonksiyonlaridır.

Nmap Sonuclarinin Yorumlanmasi

Sunday, November 23, 2014

Nmap Sonuçlarının Yorumlanması


Nmap normal, xml, script kiddie ve parse edilebilir olmak üzere 4 biçimde rapor üretebilmektedir. Sızma testleri bakış açısından nmap raporlarının yorumlanması oldukça büyük önem taşımaktadır.  

Parse Edilebilir Biçimde NMAP Raporlarının Yorumlanması


192.168.1.0/24 ağı için aşağıda belirtilen Nmap parametleri ile örnek bir taramanın gerçekleştirilmesi sonucunda çalışma dizininde rapor adında Nmap parse edilebilir biçimde bir dosya oluşmaktadır.

# nmap -n -Pn -sS -sU --open -T4 --top-ports 10 192.168.1.1-254 -oG rapor

Oluşan rapor sonucu aşağıda görülebilmektedir.
# ls -l
rapor

Oluşturulan rapor dosyasının içeriği ise belirtildiği şekilde olmaktadır.
# cat rapor
Host: 192.168.1.1 ()    Status: Up
Host: 192.168.1.1 ()    Ports: 21/open/tcp//ftp//, 22/open/tcp//ssh//, 80/open/tcp//http//, 443/open/tcp//https//, 53/open|filtered/udp//domain//, 67/open|filtered/udp//dhcps//
Host: 192.168.1.20 ()   Status: Up

Nmap ile Host/Port Kesif Calismalari

Nmap İle Host/Port Keşif Çalışmaları

Tüm Nmap kullanım parametreleri nmap --help komutu ile görüntülenebilir. Bu bölümde en çok tercih edilen parametrelerinden bahsedilecektir.

-n: Hedef sistemler için ters DNS sorgularının gerçekleştirilmemesini sağlayan parametredir. Özellikle geniş ölçekli ağlar üzerinde gerçekleştirilen işlemlerde kullanılması önerilmektedir. Aksi durumda her bir hedef ip adresi için tersine DNS sorguları gerçekleştirilmeye çalışılacak ve oldukça fazla zaman kaybına sebep olacaktır.

# nmap -n -p80,443 localhost

-Pn: Nmap ön tanımlı olarak hedef sistem ip adres bilgileri için icmp echo request paketleri göndererek hedef sistemin ayakta olup olmadığına karar vermekte ve taramaları bu doğrultuda devam ettirmektedir. Bu şekilde sadece aktif olan sistemler için tarama işlemi gerçekleştirilecek ve daha hızlı sonuç alınması sağlanacaktır. Ancak aktif cihazlarda icmp echo request paketlerinin geçişine izin verilmediği veya hedef sistem üzerinde bulunabilecek güvenlik duvarı veya antivirüs gibi yazılımlarında yine icmp echo request paketlerine geçişi engellediği durumlarda hedef sistem tarama işlemine tabi tutulmayacaktır. Emin olunmadıkça kullanılması önerilmeyen bir parametredir.

# nmap -Pn -p80,443 localhost

Netcat Kullanimi

NC KULLANIMI

NOT:  Burada sunucu ip adresi olarak 192.168.37.154, istemci ip adresi olarak ise 192.168.37.152 ip adresi belirtilmistir. Komutlari ve senaryolari kullanirken lutfen kendi sisteminize uygun ip adreslerini belirtmeyi unutmayiniz. Ayni sekilde kullanilan port numaralari tamamen secimliktir. Port numaralari icin lutfen sisteminizde acik olmayan port numaralarinin secilmesine dikkat ediniz. Aksi takdirde beklenilen sonuclar alinmayabilir.
Senaryolar esnasinda Sunucu tarafinda gerceklestirilmesi gereken adimlar “Sunucu ->” simgeleri ile belirtilmistir. Ornegin Sunucu tarafinda gerceklestirilmesi gereken komutun nc -l -p 3737 oldugu  varsayilirsa eger, bu durum asagidaki sekilde ifade edilecektir.
Sunucu -> # nc -l -p 3737

Yani buradan sunucu tarafinda “nc -l -p 3737” komutunun calistirilmasi gerektigi anlasilmaktadir. Ayni sekilde istemci tarafinda gerceklestirilmesi gereken bir komut icin belirtim “Istemci ->” seklinde olacaktir. Ornegin Istemci tarafinda gerceklestirilmesi gereken komutun nc 192.168.37.154 3737 oldugunu varsayilirsa bu durum asagidaki sekilde ifade edilecektir.
Istemci -> # nc 192.168.37.154 3737

Senaryolar esnasinda komut ciktilarinin veya sunucu hizmetlerinin verecekleri cevaplar uzun ibareler olabilmektedir. Bu durumda sadece gerekli noktalara motivasyonu cekebilmek adina gereksiz gorulen ciktilar icin … ifadesi kullanilabilir. Ornegin sunucu sisteme baglanti gerceklestirildiginde amacin sadece sunucu karsilama mesajini gostermek oldugu varsayilirsa eger, bu durum asagidaki sekilde ifade edilecektir.

# nc 192.168.37.154 3737
OpenSSH 2.2.1
Goruldugu gibi “…” ile aslinda sunucu karsilama mesajinin ekranda gosterilenden uzun oldugu ancak icin beklenen ciktinin gosterilmesinin yeterli oldugu anlasilmaktadir.

Alternatif Kaba Kuvvet Saldiri Araci Crowbar (aka Levye)

Friday, October 17, 2014

Alternatif Brute Force (Kaba Kuvvet Aracı): CROWBAR

Neden Crowbar?


Crowbar (Levye), kaba kuvvet saldırıları gerçekleştirmek için kullanılabilecek bir sızma testi aracıdır. Sızma testlerinde bir bilgisayardan - özellikle Linux bilgisayarlardan - SSH anahtarı, VNC passwd dosyası, OpenVPN sertifikası elde edilmekte ve bu dosyaları kullanarak erişim sağlanabilecek diğer bilgisayarlara tek tek deneme yapılmaktadır. Benzer olarak elde edilen kimlik bilgilerini kullanarak, RDP ile bağlantı kurulabilecek Windows bilgisayarların tespiti de hızlı bir şekilde tespit edilmesi sızma testleri açısından önem arz etmektedir. Crowbar, bu gibi ihtiyaçların karşılanması için hazırlanmıştır.

Crowbar Aracının Diğer Araçlardan Farkı


Crowbar aracının diğerlerinden ayıran fark diğer araçlar tarafından desteklenmeyen protokoller için kaba kuvvet saldırılarını gerçekleştirebilmektedir.

Örneğin; piyasada yaygın olarak kullanılan Hydra aracı kullanıcı adı ve parola ile SSH kaba kuvvet saldırısı gerçekleştirebilmektedir. Crowbar aracı ise SSH anahtarı (SSH key) ile kaba kuvvet saldırısını gerçekleştirebilmekte, böylece ele geçirilen anahtar veya anahtarlarla hangi bilgisayarlara SSH bağlantısı elde edilebileceği listelenebilmektedir.

Crowbar aracı ile sadece SSH için değil; OpenVPN ve VNC bağlantıları için de parolaya gerek duyulmadan, anahtar kullanılarak kaba kuvvet saldırısı gerçekleştirilebilir. Bunun yanında, Crowbar ile mevcut elde edilen kimlik bilgileri (kullanıcı adları ve parolalar) ile NLA deskteği olan ve NLA desteği olmayan Windows bilgisayarlara uzaktan masaüstü bağlantısı (Remote Desktop Connection) yapılabilecek bilgisayarlar da elde edilebilmektedir. Özetlemek gerekirse Crowbar aracı ile gerçekleştirilebilecek kaba kuvvet saldırıları şu şekildedir:

·         SSH anahtarı kullanılarak SSH bağlantısı
·         VNC anahtarı kullanılarak VNC bağlantısı
·         Konfigürasyon dosyaları ve kimlik bilgileri kullanılarak VPN bağlantısı
·         Kimlik bilgileri kullanılarak Windows RDP bağlantısı

DHCP Havuzu Tüketme ve SSL Trafiğinde Araya Girme (Man In The Middle) Saldırısı

Saturday, October 11, 2014

KULLANILAN YAZILIMLAR VE KÜTÜPHANELER:

Yazılım Adı
İşlevi
Ubuntu Server
Saldırı İçin Gerekli Yazılımların Çalışacağı İşletim Sistemi
Isc Dhcp
Dhcp Sunucusu
Squid
İçerik Filtreleme ve SSL Sonlandırıcı
C-icap
İcap Protokolü Destekli İçerik Erişim Yazılımı
Python
Dhcp Starvation Saldırısı İçin Kullanılan Yazılım Dili
Scapy
Python programlama diline entegre kütüphane
C
C-icap modülünün geliştirilmesi amaçlı kullanılan programlama dili
Tika
Dosyaları ayrıştıran açık kaynak kodlu yazılım
Table 1 Kullanılan yazılım ve kütüphaneler

Senaryoda kullanılan tüm sanal sunucular için ağ yapılandırması olarak NAT belirtilmiştir. Dhcp sunucu servislerinin sağlıklı çalışabilmesi için NAT ağ yapılandırması için çalışan Dhcp servisi hizmet dışı bırakılmalıdır. Bu durum Şekil 1’de gösterilmiştir.


Şekil 1 Sanal Sunucular İçin Ağ Yapılandırması

Python - Windows Sistemler Üzerinde Python Kodundan Çalıştırılabilir Dosya (EXE File) Oluşturma

Burada anlatilanlar Python2.7 surumu icin 64 bit Windows surumu uzerinde gerceklestirilmistir. Diger surumler icin farkli durumlar soz konusu olabilir. Kullanilan python surumunu ogrenmek icin komut satirindan pythonun calistirilmasi ve ilgili ciktinin yorumlanmasi gerekmektedir.

Asagidaki gibi bir cikti ile karsilasiliyor ise 32 bit python sistemde kurulu demektir.
Python 2.7.2+ ... [MSC v.1500 32 bit (Intel)] on win32

Asagidaki gibi bir cikti ile karsilasiliyor ise 64 bit python sistemde kurulu demektir.
Python 2.7.2+ ... [MSC v.1500 64 bit (AMD64)] on win32

Arpspoof, Dnsspoof ve Browser Autopwn İle Örnek Sızma Testi Senaryosu

Wednesday, July 16, 2014

Geliştirme Ortamı ve Kütüphaneler:

Python: Arpspoof ve DnsSpoof araçlarının geliştirilmesi amaçlı kullanılan açık kaynak kodlu betik programlama dili.

https://github.com/galkan/tools/blob/master/others/programming/python/arpspoof.py

Arpspoof ile ilgili yazıya http://www.galkan.net/2014/05/scapy-kutuphanesi-kullanilarak-python-ile-arpspoof-man-in-the-middle-saldirisi.html adresinden erişim sağlanabilir.

Dnsspoof yazılımı http://code.activestate.com/recipes/491264-mini-fake-dns-server/ adresindeki yazılımı baz alınarak geliştirilmiştir. main fonksiyonuna ait kod bloğu aşağıda gösterilmiştir.

Python - Syslog Loglama AltYapısının Kullanımı

Friday, May 30, 2014

Özellikle komut satırından çalıştırılan uygulamalar için gerçekleştirilen detaylarını kayıt altına almak, hata mesajlarını kayıt altına almak vb sebeplerden dolayı loglama (işlem kaydı) işlemlerinin gerçekleştirilmesi gerekmektedir.

Bu amaçla kullanılan farklı kütüphaneler bulunmaktadır. Linux/Unix sistemlerde özellikle bu amaç için geliştirilmiş ve en çok tercih edilen servis ile aynı ismi taşıyan syslog kütüphanesi kullanılmaktadır. Aşağıdaki örnek ile syslog servisini kullanan örnek bir loglama servisi geliştirilmiştir. 

Python Scapy Kütüphanesi Kullanılarak Arpspoof , Man In The Middle (Ortadaki Adam Saldırısı) Saldırısı

Arpspoof yerel ağlarda en çok karşılaşılan saldırılardan bir tanesi olarak göze çarpmaktadır. Kısaca saldırgan hedef bilgisayarın arp tablosundaki kayıtları değiştirirerek ön tanımlı ağ geçidi üzerinden akacak trafiğin kendisi üzerinden akmasını sağlamasıdır. http://en.wikipedia.org/wiki/ARP_spoofing adresinden arpspoof ile ilgili daha fazla bilgi edinilebilir.

Bu saldırının önlemi için yapılabileceklere https://www.bilgiguvenligi.gov.tr/aktif-cihaz-guvenligi/ikinci-katman-saldirilari-1-3.html adresinden göz atılabilir. 

Burada https://github.com/byt3bl33d3r/arpspoof/blob/master/arpspoof.py adresindeki örnek temel alınarak arpspoof saldırını gerçekleştirmek üzere dsniff paketi ile birlikte gelen arpsoof yazılımının parametre kullanımı baz alınarak bir geliştirme gerçekleştirilmiştir. 

Yazılım scapy kütüphanesi kullanılarak geliştirilmiştir. Eğer sistemde yoksa kurulması gerekmektedir. Bu işlem apt-get paket yönetimini kullanan sistemlerde apt-get install python-scapy komutunun çalıştırılması ile gerçekleştirilebilir. Scapy ile ilgili daha fazla bilgi almak için http://www.secdev.org/projects/scapy/ adresine göz atılabilir.

Gökhan ALKAN

Information Security, Programming, Linux/Unix ...