• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Методы перечисления имени пользователя и их значение

вавилонец

CPU register
Пользователь
Регистрация
17.06.2021
Сообщения
1 116
Реакции
1 265
ОРИГИНАЛЬНАЯ СТАТЬЯ
ПЕРЕВЕДЕНО СПЕЦИАЛЬНО ДЛЯ xss.pro
$600 на SSD для Jolah Milovski ---> 0x5B1f2Ac9cF5616D9d7F1819d1519912e85eb5C09 для поднятия ноды ETHEREUM и тестов

Введение

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

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

Веб приложение
Стандартная аутентификация:​
При стандартной аутентификации пользователь должен ввести имя пользователя и пароль в форму, чтобы получить доступ к веб-приложению. При вводе неверного имени пользователя вместе с паролем часто возвращается общее сообщение, такое как «неверный пароль», предполагающее, что имя пользователя не существует. Однако при вводе действительного имени пользователя и неправильного пароля мы часто видим сообщение, такое как «неверный пароль для этого пользователя», предполагающее, что имя пользователя допустимо. Злоумышленник может использовать автоматизированные инструменты для сбора списка действительных имен пользователей с помощью этого метода. После того, как действительные имена пользователей были успешно пронумерованы, для этих имен пользователей может быть использована попытка извлечения паролей методом грубой силы.
Забытый пароль​
При использовании средства восстановления, такого как функция забытого пароля, уязвимое приложение может вернуть сообщение, которое показывает, существует имя пользователя или нет. Ввод действительного имени пользователя или адреса электронной почты может вернуть что-то вроде:
Код:
Your password has been successfully sent to the email address you registered with
где мы можем предположить, что мы определили действительное имя пользователя; однако недопустимое имя пользователя или адрес электронной почты вернет что-то вроде:
Код:
email address is not valid or the specified user was not found

Предсказуемые форматы имени пользователя​


В некоторых случаях идентификаторы пользователей создаются с использованием определенных предсказуемых последовательностей или форматов. Например, мы можем просмотреть пользователей с идентификаторами, созданными в последовательном порядке:


  • CN000100
  • CN000101

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


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


  • Код ошибки, полученный на страницах входа для действительных и недействительных учетных данных;
  • URL-адреса и перенаправления URL-адресов для действительных и недействительных учетных данных;
  • Заголовки веб-страниц для действительных и недействительных учетных данных;

Вордпресс​


Установка по умолчанию​


WordPress — это бесплатная система управления контентом с открытым исходным кодом, основанная на PHP и MySQL. Особенности включают архитектуру плагинов и систему шаблонов. По состоянию на январь 2015 года WordPress использовался более чем на 23,3% из 10 миллионов ведущих веб-сайтов. WordPress — самая популярная система ведения блогов, используемая в Интернете, на более чем 60 миллионах веб-сайтов. [3]


В незащищенной установке WordPress можно перечислить имена пользователей. Например, wpscan [4] можно использовать для перечисления имен пользователей WordPress. Ниже приведен пример типа вывода, полученного от модуля enumerate users (ruby ./wpscan.rb –url http://www.example.com –enumerate u):

+----+---------------+------+
| Идентификатор | Войти | Имя |
+----+---------------+------+
| 1 | администратор | |
| 2 | Эдвард | |
| 3| Гарет | |
| 5 | Дилан | |
| 6| Дэвид | |
| 7 | Сара | |
+----+---------------+------+

В сочетании с возможностью идентифицировать страницу /wp-admin/admin, мы могли бы затем использовать имена пользователей для выполнения целенаправленной атаки грубой силы.


Индивидуальное перечисление имени пользователя WordPress​


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

1664427404876.png


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

Код:
#!/usr/bin/python
#EDW NCCGroup.trust
#enumerate usernames from authors url
from urllib2 import Request, urlopen, URLError, HTTPError
import re
import optparse
p = optparse.OptionParser("usage: %prog -f file", version="%prog 0.1")
p.add_option("-f", "--file", dest="file", type="str", help="name of file for usernames")
(options,args) = p.parse_args()
if len(args) != 0:
 parser.error("parser error")
 exit()
file = options.file
filename = file
try:
 f = open(filename,'a')
except:
 print "unable to open file"
req = Request('http://XXXXX.XXX.XXX.XX/authors/')
try:
 response = urlopen(req)
except HTTPError as e:
 print 'The server couldn\'t fulfill the request.'
 print 'Error code: ', e.code
except URLError as e:
 print 'We failed to reach a server.'
 print 'Reason: ', e.reason
else:
 if response.getcode() == 200:
 for a in response:
 m = re.search("http://XXXXX.XXX.XXX.XX/authors//(.*)/\" title=", a)
 if m:
 f.write(m.group(1)+"\n")

Перечисление на основе инфраструктуры​


Стандартные/общие имена пользователей​


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


  • администратор
  • корень
  • гость
  • резервное копирование
  • тест
  • Сервисные аккаунты, например:
    • SophosManagement
    • SophosUpdateMgr

Перечисление имени пользователя через идентификацию порта​


При проведении внутреннего теста пера обычно профилируют хосты; обычно это делается с помощью сканирования портов, так как открытые порты часто могут привести к перечислению имен пользователей. Например, идентификация TCP-порта 1521 на узле в большинстве случаев будет означать, что на узле есть пользователь oracle. Точно так же открытый TCP-порт 5432 часто имеет пользователя с именем postgres.


Угадываемые имена пользователей​


Часто бывает так, что имена пользователей угадываются, потому что все они созданы с использованием общеизвестного формата. После обнаружения формата, например, с помощью разведки открытых источников (OSINT), можно было бы создать список возможных имен пользователей.

1664427475396.png


Рисунок 1: OSINT для обнаружения формата имени пользователя [5]


Общие примеры форматов имени пользователя включают:

Формат имени пользователя Пример
Имя Эдвард
имя Фамилия Эдвард Уильямс
имя Фамилия Эдвардуильямс
первая буква имени и фамилии ЭУильямс
фамилия и первая буква имени УильямсЭ
возрастающий номер 00001

RID

С помощью процесса циклирования RID можно перечислить всех пользователей домена с контроллера домена Windows 2003. Этот метод будет работать на контроллерах домена Windows 2003, поскольку тогда можно перечислить SID группы «пользователи домена»; это было сделано для обеспечения хорошего уровня совместимости, и тот же метод не будет работать на контроллерах домена Windows 2008. С помощью этой информации затем можно выполнить итерацию по RID для перечисления пользователей. Ниже приведен пример автоматического перечисления имен пользователей с помощью GetAcct [6] с контроллера домена Windows 2003:

1664427514944.png


Рис. 2. Результаты цикла RID


Проверка имени пользователя Kerberos


Поскольку зацикливание RID становится все менее распространенным, можно получить действительные имена пользователей из службы Kerberos контроллера домена. Когда запрашивается недопустимое имя пользователя, сервер отвечает кодом ошибки Kerberos KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN, что позволяет нам определить, что имя пользователя было недопустимым. Действительные имена пользователей вызовут либо ответ TGT, либо ответ AS-REP, либо ошибку KRB5KDC_ERR_PREAUTH_REQUIRED, сигнализирующую о том, что пользователю необходимо выполнить предварительную аутентификацию и что он действителен [6].
С помощью сценария krb5-enum-users [6] nmap nse пользователи могут перечисляться с контроллера домена, как показано в следующем примере:


1664427538762.png


Рисунок 3: Перечисление имени пользователя Kerberos


Перечисление имени пользователя OpenSSH​


Некоторые версии OpenSSH страдают от атаки на основе времени: если указано действительное имя пользователя с длинным паролем, время, необходимое для возврата, заметно больше, чем для недопустимого имени пользователя с длинным паролем.
Ниже приведен пример этого, для которого был написан собственный сценарий; как видно, были пронумерованы как «root», так и «ed» пользователи. Цифра справа — это время, которое потребовалось для ответа, и для пронумерованных пользователей это время значительно больше, чем у незарегистрированных пользователей:

1664427562620.png


Рисунок 4: Перечисление имени пользователя OpenSSH

Перечисление имени пользователя SMTP


Существует несколько методов, которые можно использовать для злоупотребления SMTP для перечисления действительных имен пользователей и адресов; а именно VRFY, EXPN и RCPT TO.

VRFY

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

Пример использования VRFY приведен ниже, где указан пользователь root:

Код:
$ telnet 10.0.0.1 25
Trying 10.0.0.1...
Connected to 10.0.0.1.
Escape character is '^]'.
220 myhost ESMTP Sendmail 8.9.3
HELO
501 HELO requires domain address
HELO x
250 myhost Hello [10.0.0.99], pleased to meet you
VRFY root
250 Super-User <root@myhost>
VRFY blah
550 blah... User unknown

EXPN


EXPN похож на VRFY, за исключением того, что при использовании со списком рассылки он будет отображать всех пользователей в этом списке. Это может быть более серьезной проблемой, чем команда «VRFY», поскольку сайты часто имеют псевдоним, такой как «все».
Пример использования EXPN приведен ниже:

Код:
$ telnet 10.0.10.1 25
Trying 10.0.10.1...
Connected to 10.0.10.1.
Escape character is '^]'.
220 myhost ESMTP Sendmail 8.9.3
HELO
501 HELO requires domain address
HELO x
EXPN test
550 5.1.1 test... User unknown
EXPN root
250 2.1.5 <ed.williams@myhost>
EXPN sshd
250 2.1.5 sshd privsep <sshd@mail2>

RCPT TO


Это идентифицирует получателя сообщения электронной почты. Эту команду можно повторить несколько раз для данного сообщения, чтобы доставить одно сообщение нескольким получателям. Техника RCPT TO: чрезвычайно эффективна для перечисления локальных учетных записей пользователей на большинстве серверов Sendmail.
Далее приведен пример использования метода RCPT TO с перечислением пользователя
Код:
$ telnet 10.0.10.1 25

Trying 10.0.10.1...

Connected to 10.0.10.1.

Escape character is '^]'.

220 myhost ESMTP Sendmail 8.9.3

HELO x

250 myhost Hello [10.0.0.99], pleased to meet you

MAIL FROM:test@test.org

250 2.1.0 test@test.org... Sender ok

RCPT TO:test

550 5.1.1 test... User unknown

RCPT TO:admin

550 5.1.1 admin... User unknown

RCPT TO:ed

250 2.1.5 ed... Recipient ok

ACF2


ACF2 (Access Control Facility) — коммерческая дискреционная программная система безопасности управления доступом, разработанная для операционных систем мэйнфреймов IBM MVS (z/OS), VSE (z/VSE) и VM (z/VM) [7]. По ответам, полученным при подключении к мэйнфрейму, в данном случае AS400, можно перечислить допустимые имена пользователей. Ниже приведен PoC, созданный для автоматизации этого процесса:

Код:
#!/usr/bin/python
# EDW NCCGroup.trust
# ACF2 Username Enumeration
import sys
import time
import optparse
import re
import signal
from telnetlib import Telnet
from socket import *
p = optparse.OptionParser("usage: %prog host user port", version="%prog 0.1")
p.add_option("-H", "--host", dest="host", type="string", help="specify hostname to run on")
p.add_option("-u", "--userfile", dest="user", type="string", help="file of usernames")
p.add_option("-p", "--port", dest="port", type="int", default=23, help="port number, default is 23")
(options, args) = p.parse_args()
host = options.host
user = options.user
port = options.port
def main():
 try:
 u = open(user).read().splitlines()
 except IOError as e:
 print "I/O error({0}): {1}".format(e.errno, e.strerror)
 sys.exit()
for n in u:
 tn = Telnet(host, 23, 120)
 tn.write('test\r\n')
 tn.read_some()
 tn.write(n+'\r\n')
 tn.read_some()
 tn.write('pass\r\n')
 data = tn.read_until('test',1)
 if re.search (r"SUSPENDED BECAUSE OF PASSWORD VIOLATIONS",data):
 print ("user found: "+str(n))
 elif re.search (r"PASSWORD NOT MATCHED",data):
 print ("user found: "+str(n))
 tn.close()
def signal_handler(signal, frame):
 print "\nCtrl+C pressed.. aborting..."
 exit()if __name__ == '__main__':
 signal.signal(signal.SIGINT, signal_handler)
 main()

1664427769106.png


Общие меры по смягчению последствий
  • Для веб-приложений создайте общее сообщение, не позволяющее пользователям запрашивать имена пользователей.
  • При создании имен пользователей Active Directory учитывайте элемент случайности; Например;
    • dylan.williams может быть dylan.williams3280 и
    • dafydd.williams может быть dafydd.williams6782
    • Для WordPress существует ряд плагинов, которые можно использовать для остановки перечисления имен пользователей.
      • Ограничьте доступ к /wp-admin с помощью ограничения IP.
      • Внедрить двухфакторную аутентификацию (Authy, Google)
      • Измените легко угадываемые и стандартные имена пользователей на более сложные и менее угадываемые значения.
      • Убедитесь, что все программное обеспечение работает в последней стабильной версии.
      • Защитите службы таким образом, чтобы нельзя было установить нулевые привязки и запретить удаленную корневую аутентификацию.

Резюме

Хотя перечисление имен пользователей не ново, оно по-прежнему является важным методом при попытке получить доступ к хосту или системе. Oбсудили общие методы перечисления имен пользователей из веб-приложений и инфраструктуры, включая среды Windows, *nix и мейнфреймы. Нельзя недооценивать важность возможности перечисления имен пользователей с точки зрения консультанта по безопасности или злоумышленника; хотя смягчение перечисления имен пользователей ни в коем случае не является серебряной пулей, оно должно быть включено в оценку рисков организации наряду с надежными паролями, надежными исправлениями и соответствующей сегрегацией.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх