Erdem YILDIZ

Siber Güvenlik Araştırmacısı
Python Geliştiricisi
Linux Hayranı

Python'la Port Tıklatma

Merhaba arkadaşlar bugün python ile yazmış olduğum script'te parametre olarak verdiğiniz IP ve port bilgisine göre hedefle iletişime geçen bir script'in amacını , kodlarını ve video ile kullanımı göstereceğim. Haydi bir giriş yapalım...

Bu yazımda CTF çözerken karşılaştığım bir problemin çözülmesinde kullanılan tool'un çalışma mantığını anlayıp bir benzeri yapıp sizlere göstermek istedim.Kısaca durumu size özetlemem gerekirse.Hedef bir işletim üzerinde açık olan port'ları belirledikten sonra 80 portu üzerinde bir kaç yol bulup inceledim.Bu sırada 80 portu üzerinde bir grubun fotoğrafını buldum ve bu grup ile alakalı biraz araştırma yapıp grup üyelerinin kişisel bilgilerine eriştim. Hedef üzerinde 21 , 22 ve 80 portları açıktı , aklıma bu grup üyelerinin doğum yıllarını kullanarak hedef işletim sistemi üzerine bu yıllara denk gelen port'lara istek yolladıktan sonra açık olan port'larda bir değişiklilik olup olmadığını görüntülemekti. Tabi bu işlemi yaptıktan sonra beklediğim sonucu aldım ve CTF'i başarı bir şekilde çözdüm.Kullandığım tool'un manuelini okuduktan sonra bu tool'un çalışma mantığında hedefin belirli bir portuna TCP tabanlı SYN packeti göndermek yada Port:udp yazıldığında belirlenen port'a UDP packeti göndermek olduğunu anladım ve Python üzerinde kodladım.

Kodlara geçmeden önce Port Knocking yaygın bir yöntem olduğunu ve ağ topolojilerinde bir port'u açık bırakmaktansa , arka planda port'ları takip eden bir servis çalıştırıp daha önceden belirlenmiş port'lara istek geldiğinde istenilen port açılsın şeklinde çalışan bir yapı olduğunu söylemek isterim.Örnek vermek gerekirse siz evden şirket'teki bilgisayarınıza SSH bağlantısı yapmak istiyorsunuz fakat normalde bu port dışarıya kapalı olduğunu düşünün. Arka planda Port Knocking yöntemi ile belirlenmiş port'lara istek yolladığınızda kapalı olan SSH port'u bu istediğinizden sonra size özel açılarak artık bağlanabileceksiniz.Diğer türlü bu SSH portu hiçbir zaman açılmayacaktır.

# -*- coding:utf-8 -*-
#Library
from termcolor import colored, cprint
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
from threading import Thread
import socket
import sys

#Global Variable
IP_ADDR  = ""
TCP_PORT = []
UDP_PORT = []


def HELP():
    print colored('\nThere is a error , You should examine sytax.', 'magenta', attrs= ['bold'])
    print colored('->    python myKnock.py ip-addr port, port:udp (default port is tcp based)','green',attrs = ['bold'])
    print colored('->    python myKnock.py 123.123.123.123 1111 2222 3333 4444 5555:udp 6666:udp\n','green', attrs = ['bold'])

#Translate date from strings to valuable form
def Variable(arr):
    global IP_ADDR
    IP_ADDR = arr[0]

    for i in arr[1:]:
        if ":" in i:
            UDP_PORT.append(int(i.split(":")[0]))
        else:
            TCP_PORT.append(int(i))

def SHOW():
    print "IP address  --> " , IP_ADDR
    print "TCP port    --> " , TCP_PORT
    print "UDP port    --> " , UDP_PORT

class Knock():
    def __init__(self):
         self.TCP_trigger()
         self.UDP_trigger()

    def TCP_trigger(self):
        for i in TCP_PORT:
            t = Thread(target = self.TCP_packet , args=(i,))
            t.start()

    def TCP_packet(self,port):
        send(IP(dst=IP_ADDR)/TCP(dport=port,flags="S"), verbose=False)


    def UDP_trigger(self):
        for i in UDP_PORT:
            t = Thread(target = self.UDP_packet , args=(i,))
            t.start()

    def UDP_packet(self,port):
        send(IP(dst=IP_ADDR)/UDP(dport=port) ,verbose=False)


if __name__=="__main__":

    if len(sys.argv) < 3:
        HELP()
        sys.exit()
    else:
        Variable(sys.argv[1:])

    SHOW()
    k = Knock()




                                        

Yukarıda paylaşmış olduğum kodda bir sıkıntı yada yapılabilecek iyileştirmeler için bana ulaşabilirseniz çok sevinirim.Okuduğunuz için çok teşekkür ederim.Esen kalın :)