owned this note
owned this note
Published
Linked with GitHub
# Standoff'11. Как мы реализовали риск с внедрением кода в Heavy Logistics
## Предисловие
Команда-организатор Positive Technologies уже сделала подробный [разбор](https://habr.com/ru/companies/pt/articles/738458/), как команды-участники пытались обойти их решение (PT Application Inspector) для внедрения кода в репозиторий разработчиков сервиса, и как это сделали мы.
![](https://hackmd.io/_uploads/HJURcnnLh.png)
![](https://hackmd.io/_uploads/Skdks2nL3.png)
Но прежде, чем внедрить вренодосный код в репозиторий, к нему еще необходимо было получить доступ, как раз об этом мы и хотим рассказть в этом посте.
## Вектор атаки
### RCE на wordparsing
На Standoff игрокам предоставлена инфрастурктура города, в которой есть несколько компаний со своими внешними и внутренними сетями. Риск, который мы реализовали, находился в транспортной компании Heavy Logistics. К сожалению, это единственный офис, на котором у нас не отработала социалка, и мы не получили доступ во внутреннюю сеть. Для того, чтобы получить возможность сдавать риски, которые находятся во внутренней сети, мы начали искать возможность получить RCE на одном из внешних сервисов. Выбор пал на wordparsing.hv-logistics.stf.
![](https://hackmd.io/_uploads/H1bVa228h.png)
Данный сервис давал возможность по пути http://wordparsing.hv-logistics.stf/thumbnails/ загружать документы Word. При дальнейшем исследовании мы выявили, что приложение сохраняет изображения из документа в папку http://wordparsing.hv-logistics.stf/upload/. Мы начали пытаться протолкнуть через этот механизм файл с расширением `.php`.
Очевидно, мы не можем просто вставить `.php` файл через сам Word как изображение. Перебрав различные функции вставки изображения, мы нашли функции загрузки изображения с сервера.
![](https://hackmd.io/_uploads/HkPddx6U3.png)
Библиотека PHPWord парсила Word и выполняла запрос, чтобы загрузить этот файл. ~~SSRF AS A SERVICE~~
Перебрав различные расширения и форматы, мы загрузили очередную`.gif`, а часть содержимого файла перенеслась в конец документа, перетерев расширение.
Подобрав необходимую длину нагрузки, мы получили следующий GIF.
![](https://hackmd.io/_uploads/HkLqFe6I3.png)
В результате `.php` из файла переместилось в название, и мы получили web-shell.
![](https://hackmd.io/_uploads/BkVRFxTLn.png)
![](https://hackmd.io/_uploads/S1eXcep8n.png)
Таким образом, мы получили доступ во внутреннюю сеть hv-logistics.stf
### Получение доступа к репозиторию
При выполнении НС на внешнем переметире мы наткнулись на приватный ключ в app-ai.hv-logistics.stf.
Затем мы скачали его из аккаунта flights_dev@hv.com.
![](https://hackmd.io/_uploads/BJZ4jyLv3.png)
Доступ в него мы получили довольно забавно - без пароля, войдя просто по логину.
![](https://hackmd.io/_uploads/B1s6_kLPn.png)
Сетевой доступ к репозиторию gitlab-ai.hv-logistics.stf из внешнего периметра отсутствовал. Но это не являлось уже большой проблемой, так как мы получили доступ во внутреннюю сеть, как было описано выше.
### Обход PT Application Inspector
Далее мы скачали с gitlab-ai.hv-logistics.stf исходный код приложения app-ai.hv-logistics.stf, использовав полученный приватный ключ.
![](https://hackmd.io/_uploads/Bka_-eUvn.png)
В README разработчики оставили несколько примечаний:
- Приложение проверяется каким-то анализатором на предмет оставленных бэкдоров.
- Зависимости тянутся с pip локального репозитория.
Считая, что локальным репозиторием является репозиторий во внутренней сети, учитывая последнее примечание, мы попробовали залить вредоносную зависимость в надежде, что PT AI не будет ее проверять.
![](https://hackmd.io/_uploads/B16eXeUw3.png)
К сожалению, эти попытки не увеначались успехом, и мы начали менять исходный код приложения. В первую очередь мы внесли несколько легитимных изменений, которые меняли ответ приложения, чтобы убедиться, что изменения действительно применяются. Попробовав несколько самых очевидных вариантов из паблика, мы решили сбилдить собственную полезную нагрузку, и вот, что у нас получилось:
![](https://hackmd.io/_uploads/SJbNIgLwn.png)
Разберем подробнее эти "закорючки":
`ddddd = d` - присваиваем значение полученного параметра
`__import__('\xff...'.decode('utf-16'))` - импорт строчки subprocess, которая была получена при декодировании байтов в utf-16
`.check_output\<перенос>(ddddd)` - выполнение команды ОС, полученную из GET параметра `d`
Далее выводим флаг и делаем запрос - риск сдан.
![](https://hackmd.io/_uploads/H1NV4eLDh.png)
## Заключение
В этой статье мы решили поделиться одним из векторов атак, который мы реализовали на этих соренваниях. Очень круто, что организаторы предоставляют возможность потестить Enterprise-решения в ходе игры, а также закладывают разные виды и типы атак, как на приложения, так и на инфраструктуру, поддерживая их в актуальном состоянии каждый год.