Sürüm Kontrol : Git ve Github

Yazılım projesi geliştirirken, kademeli olarak kodları yedeklemek ve saklamak gerekmektedir. Bu yedeklemeler yapılırken gerektiğinde önceki sürüme geri dönebilmemiz ve önceki sürüm ile farkları (change log) belirlememiz gerekmektedir.

Bunun yanı sıra, bir projede birden çok yazılımcı çalıştığı için, yapılan değişikliklerin birbiriyle çakışmaması gerekmektedir. Sürüm kontrol sistemlerinin yaptığı şey de budur.

Şu an en yaygın versiyon kontrol sistemi “Git“dir. Bu yazılım aynı zamanda Linuxun da geliştiricisi olan Linus Torvalds tarafından geliştirilmiştir. Açık kaynak kodlu, ücretsiz bir yazılımdır.

Github” ise kodların saklanıldığı uzak sunucu (remote) git servisidir.

Repository : git projelerinin her birine verilen addır.

Commit : Herbir sürüme verilen isimdir. Her değişiklik yapılan adımdır. Hash Key , Ad ve açıklama içerir.

Branch : Değişliğin yapıldığı branşa verilen isimdir. Her repositoryinin ana branşı masterdır. Yani uygulamanın asıl sürümünü master branch oluşturur.

git clone <adres>
- uzak sunucudaki kodları geliştiricinin bilgisayarına klonlar

git commit -am <mesaj>
- Kodda yapılan değişikliklerden commit oluşturur

git push
- Commitleri uzak sunucuya gönderir

git pull
- Uzak sunucudaki commitleri ve güncellemeleri alır.

git init
- Herhangi bir klasörde git repositorysi oluşturur.

Heap Tree (Yığın Ağacı) ve JS kütüphanesi kodları

İkili bir ağaç yapısıdır. Kök hariç , her düğümün bir ebeveyni vardı. Her ebeveyninde en fazla 2 çocuğu vardı.

2 türü vardır ; Minimum heap, Maximum heap.

Amacı

En yüksek performansta, bir diziden en küçük ve en büyük değerleri teker teker sırasıyla çekebilmektir. Bu dizi, sıralı değildir. Ancak ilk elemanı(kökü) daima en büyük veya en küçük elemandır.

Kuralları

  • Eğer minimum heap ise, ebeveyn çocuklarında daima küçük olmalıdır. Maximum heapde tam tersi geçerlidir.
  • Çocuklar arası ilişki yoktur.
  • Tek indeks sahip düğüm solda, çift indekse sahip düğüm sağdadır. (yani 3>sol; 4>sağ)
  • Ebeveyninin indeksinin 2 katının 1 fazlası sol çocuğun indeksi, 2 katının 2 fazlası sağ çocuğun indeksidir. (2nin sol çocuğu 5, sağ çocuğu 6′tir)
  • Yeni eklenen düğüm, her zaman ağacın en alt sol tarafına eklenir. (Yani dizinin en sağına eklenir)
NOT : Kökün indeksi 0'dır.

p : ebeveyn indeksi
x : herhangi bir düğümün indeksi
sol : sol çocuk indeksi
sağ : sağ çocuk indeksi
---
sol = 2*p+1
sağ = 2*p+2
--
x%2 = 0 ise => sağdadır.
p = x / 2 - 1
x%2 = 1 ise => soldadır.
p = (x - 1) / 2

Ekleme

  • Değer dizinin sonuna(en sağına), eklenir.
  • Eklenen değer ebeveyni ile kıyaslanır. Ebeveyninden küçük ise, onunla yer değiştiri ve bu işlemin aynısı ebeveynlerininin ebeveynleri ilede yapılır.

Çıkarma

  • Heapda, daima kök değer çıkartılır. Yani dizinin ilk elemanı çıkartılır.
  • Çıkartılan bu değer ile yeni ağaç oluşur.
  • Bu ağaçta kökten başlayan, çocuğu olmayan düğüme kadar, en küçük değere sahip çocuk ile kıyaslanır, eğer en küçük çocuktan büyük ise yer değiştirilir. Yer değiştirilen çocuk ile aynı işlem ağacın o dalı boyunca tekrarlanır.

Bu işlemi yapan, yeni yazdığım bir Heap sınıfı.

function Heap(sortFunc){
    this.nodes = [];
    this.sortFunc= sortFunc || function(a,b){return a-b;};
 
    this.func = function(a,b){
            return this.sortFunc(a,b) < 0;
    }
}
 
 
 
Heap.prototype = {
    add : function(e){
        var x = this.nodes.length;
        this.nodes.push(e);
        var p = this.parent(x);
 
        // heapify2up
        while(this.func(this.nodes[x],this.nodes[p]) && x!=0){
            this.nodes[x]=this.nodes[p];
            this.nodes[p]=e;
 
            x=p;
            e = this.nodes[x];
            p=this.parent(x);
        }
 
        return this.nodes;
 
    },
    get : function(){
        var r = this.nodes.shift();
 
        //heapify2down
        var x = 0;
        var childs = this.childs(x);
        var min;
        while(childs.length!=0){
            min=childs[0];
            if(childs.length==2 && !this.func(this.nodes[childs[0]],this.nodes[childs[1]])){
                min = childs[1];
            }
 
            if(this.func(this.nodes[min],this.nodes[x])){
                var temp = this.nodes[x];
                this.nodes[x] = this.nodes[min];
                this.nodes[min] = temp;
                x = min;
                childs = this.childs(x);
            }
            else childs=[]
        }
        return r;
    },
    isEmpty : function(){
        return this.nodes.length==0;
    },
    parent : function(x){
        if(this.right(x)) return x/2-1;
        return (x-1)/2;
    },
    childs : function(x){
      var a = [];
      if(this.nodes[2*x+1]){
          a.push(2*x+1);
          if(this.nodes[2*x+2])
              a.push(2*x+2);
      }
      return a;
    },
    right : function(x){
        return x%2==0;
    }
};

 

RDT ve TCP Protokolü Similatörü

    var checksum=false;
    var seqnumenabled = false;
    var onlyack = false;
    var seqnum = 0;
    var rtd30 = false;
    var seqnumold = seqnum;
    var tcp = false;
 
    function send(){
 
        delay();
 
        checksum = $("#checksum").is(":checked");
        seqnumenabled = $("#seqnum").is(":checked");
        onlyack = $("#onlyack").is(":checked");
        rtd30 = $("#rtd30").is(":checked");;
        tcp = $("#tcp").is(":checked");;
 
        if(!checksum)
            return tabloyaekle($("#datawillsend").val(),"==>",recieve());
        else{
            if(seqnumenabled){
                if(onlyack){
                    if(rtd30){
 
                        if(tcp){
                            var recieved = recieve();
                            var crecieved = checksummed(recieved);
                            var sended =  $("#datawillsend").val();
                            var csended = checksummed(sended);
                            if(kayboldumu()){
 
                                tabloyaekle("["+seqnum+"] "+sended+"("+csended+")","=[KAYIP]>","");
 
                                setTimeout(send,$("#time").val());
 
                            }else{
 
                                tabloyaekle("["+seqnum+"] "+sended+"("+csended+")","==> ","["+seqnum+"] "+recieved+"("+csended+"/"+crecieved+")");
 
                                seqnumold = seqnum;
 
                                sendACKforTCP(csended==crecieved)
 
 
                                setTimeout(function () {
                                    if(seqnumold == seqnum)
                                        send();
                                },$("#time").val());
 
 
                            }
 
                        }
                        else{
 
                            var recieved = recieve();
                            var crecieved = checksummed(recieved);
                            var sended =  $("#datawillsend").val();
                            var csended = checksummed(sended);
 
                            if(kayboldumu()){
 
                                tabloyaekle("["+seqnum+"] "+sended+"("+csended+")","=[KAYIP]>","");
 
                                setTimeout(send,$("#time").val());
 
                            }else{
 
                                tabloyaekle("["+seqnum+"] "+sended+"("+csended+")","==> ","["+seqnum+"] "+recieved+"("+csended+"/"+crecieved+")");
 
                                seqnumold = seqnum;
 
                                sendACKwithCS2withLoss(csended==crecieved)
 
 
                                setTimeout(function () {
                                    if(seqnumold == seqnum)
                                        send();
                                },$("#time").val());
 
 
                            }
 
                        }
 
 
 
                    }else{
 
                        var recieved = recieve();
                        var crecieved = checksummed(recieved);
                        var sended =  $("#datawillsend").val();
                        var csended = checksummed(sended);
 
                        tabloyaekle("["+seqnum+"] "+sended+"("+csended+")","==> ","["+seqnum+"] "+recieved+"("+csended+"/"+crecieved+")");
 
                        seqnumold = seqnum;
 
                        sendACKwithCS2(csended==crecieved);
 
                        setTimeout(function () {
                            if(seqnumold == seqnum)
                                send();
                        },$("#time").val());
 
                    }
 
 
                }else{
                    var recieved = recieve();
                    var crecieved = checksummed(recieved);
                    var sended =  $("#datawillsend").val();
                    var csended = checksummed(sended);
 
                    tabloyaekle("["+seqnum+"] "+sended+"("+csended+")","==> ","["+seqnum+"] "+recieved+"("+csended+"/"+crecieved+")");
 
                    if(csended==crecieved){
                        sendACKwithCS();
                    }else{
                        sendNACKwithCS();
                    }
                }
 
 
 
 
            }else{
                var recieved = recieve();
                var crecieved = checksummed(recieved);
                var sended =  $("#datawillsend").val();
                var csended = checksummed(sended);
 
                tabloyaekle(sended+"("+csended+")" , " ==>" , recieved+"("+csended+"/"+crecieved+")");
 
 
                if(csended==crecieved){
                    sendACK();
                }else{
                    sendNACK();
                }
 
            }
 
        }
    }
 
    function sendACK(){
        delay();
 
        if(bozuldumu()){
            tabloyaekle("?NACK?"," <==  ","ACK");
            send();
            return tabloyaekle("","","! HATA : duplikasyon tespit edildi ?");
        }
        else
            return tabloyaekle("ACK"," <==  ","ACK") + tabloyaekle("","BiTTi","");
    }
    function sendNACK(){
        delay();
 
        if(bozuldumu()){
            tabloyaekle("?ACK?"," <==  ","NACK");
            return tabloyaekle("","","! HATA : istenen veri alınamadı ?");
        }
        else
            return tabloyaekle("NACK"," <==  ","NACK");
        return send();
    }
 
    function sendACKwithCS(){
        delay();
 
        if(bozuldumu()){
            if(checksumdogrumu()){
                tabloyaekle("NACK (A)"," <==  ","ACK (A)");
                tabloyaekle("checksum eşleşmedi","   ","");
                tabloyaekle("","","! DÜZELTİLDİ : duplikasyon tespit edildi?");
                send();
            }else{
                tabloyaekle("NACK (N)"," <==  ","ACK (A)");
                send();
            }
        }else{
            tabloyaekle("ACK (A)"," <==  ","ACK (A)");
            seqnum++;
            tabloyaekle("","BiTTi","");
        }
    }
 
    function sendNACKwithCS(){
        if(bozuldumu()){
            if(checksumdogrumu()){
                tabloyaekle("ACK (N)"," <==  ","NACK (N)");
                tabloyaekle("checksum eşleşmedi","   ","");
                send();
            }else{
                tabloyaekle("ACK (A)"," <==  ","NACK (N)");
                seqnum++;
                return tabloyaekle("","","! HATA : istenen veri alınamadı ?");
            }
        }else{
            tabloyaekle("NACK (N)"," <==  ","NACK (N)");
            send();
        }
    }
 
    function sendACKwithCS2(checksum){
        delay();
 
        if(bozuldumu()){
            {
                tabloyaekle("["+seqnum+"] ACK (N)"," <==  ","["+seqnum+"] ACK (A)");
                tabloyaekle("checksum eşleşmedi","   ","");
                send();
                tabloyaekle("","","! DÜZELTİLDİ : duplikasyon tespit edildi ?");
            }
        }else{
            if(checksum){
                tabloyaekle("["+seqnum+"] ACK (A)"," <==  ","["+seqnum+"] ACK (A)");
                seqnum++;
                tabloyaekle("","BiTTi","");
            }
        }
 
 
    }
 
    function sendACKwithCS2withLoss(checksum){
        delay();
 
        if(kayboldumu()){
            tabloyaekle(""," <[KAYIP]=  ","["+seqnum+"] ACK");
        }else{
            sendACKwithCS2(checksum);
        }
 
    }
 
    function sendACKforTCP(checksum){
        delay();
        if(kayboldumu()){
            tabloyaekle(""," <[KAYIP]=  ","["+seqnum+"] ACK");
        }else{
            if(bozuldumu()){
                {
                    if(checksum) {
                        tabloyaekle("[" + seqnum + "] ACK (N)", " <==  ", "[" + seqnum + "] ACK (A)");
                        tabloyaekle("checksum eşleşmedi", "   ", "");
                        send();
                    }
                }
            }else{
                if(checksum){
                    tabloyaekle("["+seqnum+"] ACK (A)"," <==  ","["+seqnum+"] ACK (A)");
                    seqnum+=$("#datawillsend").val().length;
                    tabloyaekle("","BiTTi","");
                }
            }
        }
    }
 
    function checksummed(t){
        var csum = 0;
        for(var i= 0;i<t.length;i++){
                if(t[i]=="1") csum++;
        }
        return csum;
    }
    function recieve(){
        var t = $("#datawillsend").val();
        for(var i= 0;i<t.length;i++){
            if(bozuldumu()){
                if(t[i]=="0") t = t.replaceAt(i, "1");
                else  t = t.replaceAt(i, "0");;
            }
        }
        return t;
    }
 
 
    function bozuldumu(){
        return Math.random()*100<parseInt($("#bozulma").val());
    }
    function kayboldumu(){
        return Math.random()*100<parseInt($("#kayip").val());
    }
    function checksumdogrumu(){
        return Math.random()*100<50;
    }
    function tabloyaekle(a,b,c){
        $("#tablo").append("<tr><td>"+Date.now().toTime()+"</td></td><td>"+a+"</td><td>"+b+"</td><td>"+c+"</td></tr>");
    }
 
    function temizle(){
        $("#tablo").html("<tr><th>GÖNDEREN</th><th>ARA</th><th>ALAN</th></tr>");
        seqnum = 0;
    }
    String.prototype.replaceAt=function(index, character) {
        return this.substr(0, index) + character + this.substr(index+character.length);
    }
 
    Number.prototype.toTime = function(){
        return Math.floor(this%3600000/60000)+":"+ Math.floor(this%60000/1000) + ':' + this%1000
    };
 
    function delay(){
        sleep(parseInt($("#thr").val()));
    }
    function sleep(milliseconds) {
        var start = new Date().getTime();
        for (var i = 0; i < 1e7; i++) {
            if ((new Date().getTime() - start) > milliseconds){
                break;
            }
        }
    }

Content Security Policy

connect-src : WebSocket, XHR, EventSource
font-src : https://themes.googleusercontent.com //fontları sadece ordan alabilir
frame-src: https://youtube.com //frame sadece youtube olabilir.
img-src : * -Her şeye izin ver- // self yazarsan sadece kendi resimleni alır
media-src : *.site.com // mediayi kendi domaninde izin ver
object-src : self // flash vb
script-src : ‘self’ ‘unsafe-eval’ ‘unsafe-inline’ //kendi için evala izin verme
style-src : self

Şeklinde headerda (X-WebKit-CSP) gönderilen güvenlik bilgileridir. Bunlar tarayıcı tarafından uygulanır.

HTML5 Local Storage

Cookieler, max 4KB’tır ve her istekte sunucuya tekrar gönderilir. Eğer kullanıcının browserda bir şey depolamak istersek ve buna sadece javascriptten erişmek istersek Local storage kullanabiliriz.

Veri yazma

localStorage.setItem("key", "value");

Veri okuma

localStorage.getItem("key");

Veri silme

localStorage.removeItem("key");

Sosyal Mühendislik

Hackenen firmalar incelendiğinde, daha çok farkındanlık eksikliğinden kaynaklı olarak hacklendiği ortaya çıkmıştır.

Sosyal Mühendisliğin ilk aşaması, bilgi toplamadır.
Ö: Bankalarda, IT elamanı gibi gözüküp, onların emaili adreslerine ve bilgilerine erişmektir

theharvester

Bilgi toplama uygulaması.(bknz: kali linux) Sitenin emaileri, subdomainleri ve diğer virtual hostları bulabilmektedir.

theharvester -d farukcan.net -l 500 -b all

Google Hacking

Google arama motoru hedefe yönelik optimize aramalar yapabilir.

site:twitter.com
filetype:pdf
intitle:Başlıkta Var
"Beni Bir Bütün Halde Ara"
intext:Dosyanın içinde
inurl : url içinde
ömer -"faruk can" (içinde farukcan geçmeyen ömerler)
tc kimlik hack
site:*.gov.tr filetype:xlsx numrange:10000000000-99999999999

"sifre" filetype:sql

emkei.cz – Sahte mail gönderme

Bu site başkası adına email göndermeyi sağlamaktadır. Fakat spama düşme ihtimalı yüksektir. (eğer hotmail veya gmail kullanıyorsanız)

Bana gönderilen emailin gerçek olduğunu nasıl anlarım?

Gelen emailin kaynak koduna bakalım.

Received: from emkei.cz ([46.167.245.116]) by natrohost.com with MailEnable ESMTP; Thu, 13 Aug 2015 11:38:45 +0300
Received: by emkei.cz (Postfix, from userid 33)
	id DD39C6F95C; Thu, 13 Aug 2015 10:33:22 +0200 (CEST)
To: omer@farukcan.net
Subject: dsadas
From: "dadsInce" <d@das.net>
X-Priority: 3 (Normal)
Importance: Normal
Errors-To: dsa@dsa.net
Reply-To: dsa@ads.net
Content-Type: text/plain; charset=utf-8
Message-Id: <20150813083322.DD39C6F95C@emkei.cz>
Date: Thu, 13 Aug 2015 10:33:22 +0200 (CEST)
Received-SPF: none (natrohost.com: dsa.net does not designate permitted sender hosts)
X-Envelope-Sender: dsa@das.net
Return-Path: <das@das.net>

Dikkat ederseniz. Gönderen sunucu emkei.cz’dir. Email adresi ve gönderen sunucunun farklı olma durumu bu emailin sahte olduğunu gösterir.

http://mxtoolbox.com/ sitesine bakıp farukcan.net ‘ üzerinden eposta göndermeye yetkili sunucu adreslerini görebilirsiniz.

Sahte email gelen kutusu

https://mailinator.com/inbox.jsp?to=sahteemail

Bu adresinde gelen kutusuna, gizli bir adresten email gönderip. Girş yapmadan yine sahteemail@mailinator.com’un gelen kutusunu okuyabilirsiniz.

email sunucusun anti virüs varlığının tespiti

o sunucu üzerinde olmayan bir email adresine mail gönderir. Sunucu bize olmadığına dair email gönderir. Bizde bu emailin kaynağının header bilgisine bakarız. SMTP-Filter veya Antivirüs kısımlarına bakarak varlığını tespit edebiliriz.

setoolkit

Sosyal Mühendislik için bir araçtır. (kali linux)

Sayfa Kolonlama 1,2,3,2

Benzer gözüken bir domain/dns elde etme

freedns.afraid.org : Burdan www.facebook.com.blabla.dasdsad.net/index.html?dasdas&dasdas tarzı anlaşılmayacak bir url oluşturabiliyorsun.

inial paypal kart

Hackerlar ,isimsiz alınan bu karta para yükleyerek, rusya ve çin gibi uzak ülkelerden sunucu kiralayıp kimliklerini gizlemektedir. (bknz: migros)

 

Suriyeli Hackerların Başbakanlık ve içişleri emaillerini yaptığı Sosyal Mühendislik Saldırısı

Site kolonlama ile suriyeli hackerlar yüzlerce başbakanlık ve içişleri email adreslerinin şifrelerini öğrenmişlerdir.

Şifreler : http://pastebin.com/JMrfY2AT

2 aşamalı doğrulama

facebook ve google, şifrenin yanında sms doğrulama kodu isteyerek, giriş isteyebilmektedir. Bunların güvenliği çok yüksektir.

USB HID (USB Rubber ducky)

Takıldığında, bilgisayarla otomatik tuşlar gönderen klavyedir. Taktığınız zaman tuşlar ile gizli bir şekilde bilgisayara komutlara girer. Doğrudan bu yolla casus yazılım yüklenebilir. Hiç bir antivirüs bu aygıtı tanımaz. Kullanıcı oluşturabilir, casus yazılım indirip yükleyebilir. DNS ayarlarını değiştirebilir. Micro USB ile mobil cihazlara takılabilir.

 fimap

sunucunun dosya erişim açığı var mı kontrol eder