JB-RPINM – Jarno’s Raspberry Pi Network Meter 2/2
In het eerste deel van de JB-RPINM post hebben we de basisinstellingen compleet gemaakt. Het systeem is nu klaar om geprogrammeerd te worden. Helaas is er geen kant-en-klare GUI applicatie zoals Sticky-Fingers die we kunnen tweaken om te laten functioneren. We gaan het systeem dus zelf programmeren. HTML5 is een goede optie en dan gebruiken we de browser als runtime environment. Maar Python lijkt ook een prima keuze. Python support is enabled by-default en Python is krachtig genoeg om een applicatie met touch buttons te maken. Laten we daar dus eens een start mee maken!
Als basis gaan we gebruik maken van GTK (GIMP Toolkit). GTK biedt een complete set van widgets en is geschikt voor projecten die variëren van kleine eenmalige tools tot complete applicatiesuites. GTK is van origine een C/C++ toolkit maar is eveneens herschreven voor Perl en Python. Daarnaast wil ik gebruik maken van Glade (een RAD / Rapid Application Development tool) welke een grafische interface biedt. User Interfaces die via Glade gemaakt worden kunnen worden opgeslagen als XML bestand welke vervolgens weer via de GTKBuilder omgezet kunnen worden naar GTK interfaces.
Ik ontwikkel de applicaties op mijn Windows machine om de simpele reden dat ik hier meer schermen op aangesloten heb en dat dus fijner werkt. Ik download de Glade RAD tool van: https://glade.gnome.org/ en download de Windows GTK binaries van https://www.gtk.org/download/windows.php. De GTK binaries installeren gaat als volgt.
Download en installeer Visual Studio (als je dat nog niet gedaan had). https://visualstudio.microsoft.com en installeer deze met de juiste C++ ondersteuning:
Download vervolgens de GTK binaries van https://github.com/Microsoft/vcpkg, pak deze uit en ga via een administrator prompt naar de folder. Vervolgens voer je de volgende commando’s uit:
.\bootstrap-vcpkg.bat
-
vcpkg install gtk:x64-windows |
Nu gaan we GTK op de Raspberry Pi installeren.
Eerst moeten we een aantal dependencies installeren zoals Pango, ATK en Cairo. Deze installeren we als volgt:
#Download en installeer Pango: apt-get install libpango-1.0-0 apt-get install libpango1.0-dev #Download en installeer ATK: apt-get install libatk1.0-dev apt-get install libatk-bridge2.0-dev apt-get install gir1.2-atk-1.0 #Download en installeer Cairo: apt-get install libcairo2-dev #Download en installeer LibGDK Pixbuf 2 apt-get install libgdk-pixbuf2.0-0 apt-get install libgdk-pixbuf2.0-dev #Download en installeer XOrg apt-get install xorg-dev #Download en installeer Epoxy apt-get install libepoxy-dev apt-get install libatk-bridge2.0-dev |
Nu gaan we GTK downloaden. Dit doen we door het GTK package “gtk+-3.24.0.tar.xz” te downloaden van de GTK site. Vervolgens installeren we GTK als volgt:
#Pak de bestanden uit: tar xvfJ gtk+-3.2.0.tar.xz #Ga naar de GTK directory (en verwijder eventueel het tar.xz bestand: cd gtk+-3.2.0 #Exporteer verschillende variabelen zodat alle afhankelijkheden weten #waar ze GTK na de installatie kunnen vinden. #Let erop dat de variabelen het toekomstige installatiepad bevatten: CPPFLAGS="-I/opt/gtk/include" LDFLAGS="-L/opt/gtk/lib" PKG_CONFIG_PATH="/opt/gtk/lib/pkgconfig" LD_LIBRARY_PATH="/opt/gtk/lib" PATH="/opt/gtk/bin:$PATH" export CPPFLAGS LDFLAGS PKG_CONFIG_PATH LD_LIBRARY_PATH PATH #Draai het configure script en bepaal waar deze geïnstalleerd wordt (b.v. in /opt/gtk): ./configure --prefix=/opt/gtk #Draai de “make” en “make install” files om de applicatie te installeren: make make install #Draai “ldconfig” omdat we de libraries in een system directory hebben geïnstalleerd. Zonder dit commando worden deze niet gevonden. ldconfig |
Nu wordt het tijd om Glade te installeren op de Raspberry Pi (alleen als je ook direct op de Raspberry Pi wilt ontwikkelen):
apt-get install glade |
Nu GTK geïnstalleerd is op de Raspberry Pi gaan we ervoor zorgen dat apps die we bouwen met Glade op onze ontwikkel PC er moderner uitzien dan de default Win7 theming. Laten we de Win10 theme installeren. Dit is niet per definitie nodig voor dit project….maar wel mooi. We beginnen met het downloaden van de Win10 binaries op https://github.com/B00merang-Project/Windows-10. Vervolgens pakken we deze uit. en kopiëren we de “gtk-3.20” folder in de installatiefolder van GTK. Default “C:\Users\%username%\AppData\Local\GNOME Foundation\Glade Interface Designer Gtk+ 2\share\themes\Windows10\gtk-3.0”.
Nu moeten we nog 1 folder kopiëren naar de “icons” folder. Default: “C:\Users\%username%\AppData\Local\GNOME Foundation\Glade Interface Designer Gtk+ 2\share\icons”. Deze folders zijn aanwezig op de Linux installatie in de mappen:
/usr/share/icons/Adwaita/
Ook moet de file “/usr/share/glib-2.0/schemas/gschemas.compiled” gekopieerd worden naar “C:\Users\%username%\AppData\Local\GNOME Foundation\Glade Interface Designer Gtk+ 2\share\glib-2.0\schemas”
Vervolgens maken we een file aan in “C:\Users\%username%\AppData\Local\GNOME Foundation\Glade Interface Designer Gtk+ 2\etc\gtk-2.0”. Deze file noemen we “settings.ini”. In deze file plaatsen we de volgende content:
[Settings] gtk-theme-name=Windows10 gtk-font-name=Segoe UI 9 |
Voor Python 3.x
Gebruik je Python 3.x dan gebruik je de volgende instructies. Gebruik je alleen Python 2.x dan ben je nu klaar met de installatie.
Om GTK succesvol te laten functioneren met Python 3 installaties is het zaak dat we de PyGObject gebruiken om GTK, GLib en andere bindings te gebruiken. Gebruik je Python 3.x dan moeten ook onderstaande stappen uitgevoerd worden.
Op Windows installeren we PyGObject als volgt.
1. Ga naar http://www.msys2.org en download en installeer het x64 package.
2. Start de MinGW terminal op (C:\msys64\mingw64.exe)
3. Update de libraries:
pacman -Suy |
4. Installeer de juiste packages:
pacman -S mingw-w64-x86_64-gtk3 mingw-w64-x86_64-python3 mingw-w64-x86_64-python3-gobject |
5. Test of het functioneert met het volgende commando:
gtk3-demo |
6. Test eventueel ook een simpel script welke je in “C:\msys64\home\%username%” plaatst. Maak b.v. onderstaande “test.py” script en roep deze nu als volgt aan in je MinGW terminal “python3 test.py”:
import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk window = Gtk.Window(title="Hello World") window.show() window.connect("destroy", Gtk.main_quit) Gtk.main() |
Voor Debian is de installatie als volgt:
1. Update je repository:
apt-get update |
2. Installeer het PyGObject:
apt install python3-gi python3-gi-cairo gir1.2-gtk-3.0 |
3. Maak een test.py bestand met onderstaande content en test je installatie door deze uit te voeren “python3 test.py”. Er moet nu een venster getoond worden.
import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk window = Gtk.Window(title="Hello World") window.show() window.connect("destroy", Gtk.main_quit) Gtk.main() |
Zo, dat is ook weer klaar! Klaar om te gaan bouwen.
Programmeren Algemeen
In deze tutorial ga ik niet in op alle functies en mogelijkheden van Glade en Python. Hier bestaan vele andere tutorials voor. Ik vermeld hieronder alleen de opmerkelijke zaken uit de code en uit het Glade ontwerp:
1. Het importeren van de GTK library met Python 2 doen we als volgt:
#import import gtk |
Maar in Python 3 in combinatie met het PyGObject doen we dit als volgt:
#import import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk |
Let erop dat je bij PyGObject in de code verwijst naar “Gtk” objecten en niet naar “gtk” objecten zoals bij Python 2.
2. Bij Windows moeten je Python en Glade bestanden in de MSYS (MinGW) directory staan “C:\msys64\home\%username%” en vervolgens moet je ze aanroepen vanuit de MSYS (MinGW) console (C:\msys64\mingw64.exe) met “python3 %bestandsnaam.py%”. Bij Debian kun je de bestanden gewoon aanroepen als “python3 %bestandsnaam.py%”. Deze hoeven niet in een speciale directory te staan of vanuit een speciale console gestart te worden.
3. De volgende zaken moeten we installeren omdat we deze in het script gebruiken. In onderstaande commando’s gebruik ik “pip3” omdat we werken met Python3. Als je werkt met Python2 dan gebruik je gewoon “pip”.
NetIFaces:
pip3 install netifaces |
PSUtil:
pip3 install psutil |
NetDiscover:
apt-get install netdiscover |
Speedtest-CLI:
pip3 install speedtest-cli |
IFMetric:
apt-get install ifmetric |
PlumBum:
pip3 install plumbum |
IPADDR:
pip3 install ipaddr |
Scapy*:
Scapy is met het schrijven van deze post nog niet in-use (en uit-ge-quote in het script). Omdat ik echter de waarde van Scapy voor de toekomst erg hoog schat neem ik deze al wel mee in deze installatiefase.
pip3 install scapy |
PyShark*:
PyShark, ofwel de WireShark implementatie voor Python is met het schrijven van deze post nog niet in-use (en uit-ge-quote in het script). Omdat ik echter de waarde van PyShark voor de toekomst erg hoog schat neem ik deze al wel mee in deze installatiefase.
pip3 install pyshark |
NMap:
pip3 install python-nmap |
4. De opbouw en het programmeren van de applicatie zijn voor de professional waarschijnlijk betreurenswaardig. Helaas ben ik geen professionele ontwikkelaar en heb ik mijn code opgebouwd zoals ik hier omschrijf. Alle verbeteringen op de code zijn zeer welkom!!
-
Ik start de code met de eerste variabelen die ik nodig heb, en dat is de locatie van het script en de loot directory:
workingdir = "/root/Desktop/JBRPINM/" workinglootdir = workingdir + "loot/"
Mocht je het script ooit naar een andere locatie verplaatsen is dit de enige waarde in het script die aangepast moet worden.
- Vervolgens starten we de import fase waar we alle modules importeren die we nodig hebben. Dit zijn er nogal wat en dat zal ongetwijfeld minder kunnen. Voor nu is dit wat ik nodig had om mijn doel te behalen.
- Daarna volgen alle global functions. Elke actie is gedefinieerd in een functie. Zoals het ophalen van het IP adres, of het omzetten naar een CIDR adres. Op deze manier kunnen we de functies gebruiken om de variabelen in het script op elke moment te vullen en te updaten. Ik maak veel gebruik van native OS commando’s en dus veel “subprocess.Popen”, “os.system” commando’s. Op mijn ToDo list wil ik de os.system commando’s zo veel mogelijk vervangen voor subproces.Popen commando’s maar voor nu werkte dit prima. Het definiëren van de functies is absoluut het grootste blok van de code. Hier gebeurt eigenlijk alles.
- Vervolgens komen we aan bij het settings blok. Hier kun je snel definieren of je logging aan of uit zet (standaard staat dit aan) en of je een default NIC wilt selecteren (indien beschikbaar) tijdens het booten van de applicatie.
- In het volgende blok worden alle globale variabelen gedefinieerd. Feitelijk wordt hier elke functie eenmaal uitgevoerd om de variabelen te vullen.
- Daarna verwijderen we alle temp files die aangemaakt worden door sommige functies. In principe worden de temp files door de functie zelf opgeruimd maar voor het geval dat dit faalt ruimen we ze ook op met de initialisatie van de applicatie.
- En dan starten we de “Jarno” class waarin we de applicatie gaan definiëren. Allereerst vertellen we waar de gladefile te vinden is en maken we een instance van de GTK builder. Daarna initialiseren we diverse objecten uit de Glade file zodat we ze kunnen aanroepen in het script. We zetten hier meteen de content voor een aantal labels welke variabel gevuld worden. Tenslotte starten we de applicatie.
- Nu worden alle button functies geïnitialiseerd. De buttons worden aangeroepen en vervolgens wordt er een actie uitgevoerd als de button geactiveerd wordt. Vaak zal een globale definitie aangeroepen worden. Ook wordt er logging weggeschreven naar de console en naar de logfile (als logging ingeschakeld is). Alereerst kom het topmenu aan bod maar deze is verborgen in de uiteindelijke applicatie. Daarna komen de linker buttons aan bod van de homepage en vervolgens de buttons van het “tools” menu.
- In de volgende sectie starten we de refresh functies. Deze fucties roepen weer andere globale functies aan om alle informatie te refreshen, tonen, loggen en printen.
- Nu eindigen we de “Jarno” class en starten we de applicatie.
Glade Design
Het uiteindelijke Glade design ziet er als volgt uit en noemen we “JBRPINM.glade”:
Zoals je ziet is het bestand opgebouwd uit verschillende vakken met aan de rechterkant een “notebook” object om meerdere tabs te kunnen maken. In het hoofdscherm zien we statische labels zoals “IP address” met rechts daarvan een leeg label welke dynamisch wordt gevuld met bijbehorende waarde. Daarnaast is het mogelijk om met de applicatie de Raspberry Pi te rebooten of af te sluiten. Het topmenu wat zichtbaar is in het ontwerp is verborgen in de uiteindelijke applicatie. Het Tools menu ziet eruit als 9 grote buttons waarvan er nu 8 bezet zijn. 7 met een functie en 1 met een statisch informatie label.
Als vervolgens het Glade bestand door Python is ingeladen ziet de applicatie op ons 7 inch scherm er als volgt uit.
Nice toch!! Direct informatie van je bekabelde LAN en je draadloze verbinding (mits verbonden). Een ingebouwde speedtest en interessante functies zoals het capturen van een PCAP bestand of het draaien van een NMap scan. De loot wordt verzameld in een separate “loot” directory met duidelijke naamgeving welke de volgende opbouw heeft: %type_scan% – %Timestamp% – %source IP%.%extensie%.
De inhoud van de loot ziet er b.v. als volgt uit:
En als je alle algemene informatie wilt terugzien kijk je gewoon even in de logfile:
Pretty cool right…. (I think it is)!
Finishing touch
Nu we de code en interface compleet hebben moeten we ervoor zorgen dat onze applicatie start als de Raspberry Pi start. Dit doen we door het aanmaken van een *.desktop file in de autostart folder. In ons geval is dit de volgende folder “/root/.config/autostart”. Mocht er iets in de folderpad niet bestaan kunnen we dat gewoon aanmaken. Het bestand dat we hiervoor aangemaakt hebben heet “JBRPINM.desktop” en bevat de volgende content:
[Desktop Entry] Type=Application Name=JBRPINM Exec=/usr/bin/python3 /root/Desktop/JBRPINM/JBRPINM.py |
Nu zal onze python applicatie starten wanneer het Kali OS geboot is.
Maar als we echter op pad zijn zonder toetsenbord willen we de applicatie ook weer graag kunnen starten als we deze per ongeluk afgesloten hebben. Om dit te fasciliteren maak ik een shell bestand aan om de applicatie opnieuw te starten. Dit shell bestand heet “Start-JB-RPINM.sh” en staat op de desktop met de volgende content:
#!/bin/bash python3 /root/Desktop/JBRPINM/JBRPINM.py |
Perfect om de applicatie niet via de terminal te starten maar simpelweg met een dubbelklik. Het enige probleem nu nog is … het touchscreen ondersteund geen dubbelklik. Dit maken we voor elkaar door de volgende changes te maken.
Download de “twofing” applicatie:
cd /root/Downloads mkdir twofing cd twofing wget http://plippo.de/dwl/twofing/twofing-0.1.2.tar.gz |
Installeer packages die nodig zijn om TwoFing werkend te maken:
apt-get install build-essential libx11-dev libxtst-dev libxi-dev x11proto-randr-dev libxrandr-dev |
Nu pakken we TwoFing uit en maken we de installatie klaar:
tar -xvzf twofing-0.1.2.tar.gz cd twofing-0.1.2 make |
We maken een regel aan in de “rules.d” folder en die noemen we “70-touchscreen-egalax.rules”:
sudo nano /etc/udev/rules.d/70-touchscreen-egalax.rules |
In deze regel zetten we de volgende content:
KERNEL=="event*",ATTRS{name}=="FT5406 memory based driver",SYMLINK+="twofingtouch",RUN+="/bin/chmod a+r /dev/twofingtouch" |
Nu kopiëren we het TwoFing bestand naar de “/usr/bin/” directory:
cd /root/Downloads/twofing/twofing-0.1.2 cp twofing /usr/bin/ |
Nu starten we TwoFing in debug mode:
twofing --debug |
Als het goed gaat ziet er dit als volgt uit:
Nu starten we de TwoFing applicatie en functioneert het aantikken met 2 vingers als een rechter muisklik. Op deze manier kunnen we dus snel op het “Start-JB-RPINM.sh” shell icoontje klikken en kiezen voor “Execute” om de applicatie opnieuw te starten.
twofing |
Het enige wat we nu nog moeten doen is zorgen dat de “TwoFing” applicatie gestart wordt tijdens het booten.
Ga naar de “/root/.config/autostart” directory en maak een nieuw autostart item:
cd /root/.config/autostart nano TwoFing.desktop |
En vul de volgende content in het TwoFing.desktop bestand:
[Desktop Entry] Type=Application Name=twofing Exec=twofing |
En voilà… TwoFing start nu ook met het starten van de Raspberry Pi en is dus meteen beschikbaar.
JB-RPINM Roadmap
Er is helaas nog erg veel te doen en genoeg ideeën om te verwerken. Wie zich geroepen voelt om te helpen … je bent altijd welkom. Wat staat er op dit moment nog op de roadmap:
- Nieuw tabblad maken voor WiFi Pentesting met o.a. Airmon-Ng dump optie en een DeAuth functie
- Code opschonen en verbeteren
- LLMNR Responder integreren
- Tumble buttons maken zodat men zelf een scan kan starten en stoppen. Je bent dan af van de vaste timeframes (zoals b.v. bij het maken van een PCAP file)
- Informatie verzamelen (indien mogelijk) over de verbonden switches / access points en topologieën zoals spanning tree
- Logo verwerken in onderkant van rechter tab-menu
- NIC’s van hosts uitlezen met een crosscable
- GUI om vanuit applicatie statisch een IP adres op de NIC te plaatsen
- GUI om vanuit applicatie te kunnen verbinden met de WiFi
- Ondersteuning inbouwen voor een externe WLAN adapter zoals b.v. een Alpha
- Scripts en required packages als applicatie aanbieden voor makkelijkere installatie
- Batterijmodule in de behuizing bouwen zodat geen externe powerbank meer nodig is
- Auto-setting om automatische een PCAP te capturen, NMap scan uit te voeren etc. bij het verbinden van een nieuw netwerk
En dan zullen er de komende periode nog wel meer wensen ontstaan om het e.e.a. te verbeteren!
JB-RPINM Installeren
Als je dus ook de JB-RPINM wilt gebruiken zul je deze dus moeten installeren. Voor het script alleen is het zaak dat je de GTK Binaries installeert alsmede alle required packages voor GTK zoals eerder in dit artikel is uitgelegd. Vervolgens moet je zorgen dat Python3 (bij voorkeur) draait en dat je alle (Python) tools hebt geïnstalleerd die JB-RPINM gebruikt. Deze staan ook stap voor stap uitgelegd in deze post.
Nu kun je de JB-RPINM files downloaden en op de gewenste positie van je OS plaatsen. Vervolgens pas je in het “JBRPINM.py” bestand regel 34 (workingdir pad) aan zodat deze naar de directory verwijst waar je de files hebt geplaatst.
That’s it. Wil je echter ook gebruik maken van het 7 inch scherm en de geoptimaliseerde OS settings dan is het zaak om de hele post stap-voor-stap te volgen. Het enige wat je niet hoeft te doen is het installeren van de Glade builder omdat je zelf waarschijnlijk niet de Glade files gaat aanpassen op het systeem waar je de tool gaat gebruiken.
Download hier de JB-RPINM files!
Conclusie
Tot zover de JB-RPINM. Al met al een cool project met veel goedkopere en veelzijdigere hardware van een officiële hardware netwerk meter. Wil je meedenken of helpen met de doorontwikkeling van de JB-RPINM stuur me dan even een berichtje.
Deze post en het ontwikkelen van de JP-RPINM zoals hij nu is heeft sowieso veel tijd gekost. Maar ik heb er wel ontzettend veel van geleerd. Python blijft een mooie taal. Glade/GTK zijn voor mij nog wat lastiger en ook de documentatie is hierin niet altijd erg behulpzaam. Desalniettemin kun je met Glade/GTK prachtige interfaces maken welke ideaal zijn voor een touchsceen.
Vindt je de JB-RPINM leuk, ga je hem uitproberen of vindt je deze post interessant laat dan even een leuk berichtje achter, deel deze post op je website of sociale kanalen en zegt het voort, zegt het voort!
Ow ja… en tegen een kleine donatie zeg ik uiteraard ook geen nee 🙂
Hartelijk dank alvast!