Приветствую всех! Недавно меня опять посетила идея. А что если сделать динамический C2 сервер, возможно ли это?
Теперь давайте пройдемся по теории, C2 сервер - проще говоря это сервер для контроля малваря, например малварь стучит на этот сервер, получает задание и выполняет его на зараженной системе.
Но проблема таких серверов, что ip такого сервера жестко установлен в коде, и тем самым этот сервер легче отключить.
Динамический C2(возможно такого понятия нету, но мне кажется, что слово "динамический" легче для восприятия идеи) - это то есть ip не будет жестко указан в коде, он будет меняться n-ое время(желательно 12 часов)
Я написал скажем основу, но идея еще не до конца завершена, осталось придумать как или через что будет поступать для агента(того кто выполняет задания) новый ip.(есть идеи например: через dns или протоколы какие-нибудь)
В будущем хотел бы скрестить этот C2 c koadic. Также если вам понравилась эта идея и вы хотите участвовать в разработке напишите мне в ЛС на codeby(нужны знания python и веба).
Реализовывать будем через сервис - ngrok.
Почему именно ngrok? Потому что там выдается рандомный сабдомен + есть https.
Прежде чем начать писать мы должны скачать ngrok, пройти регистрацию.
Закинуть ngrok в одну папку к нашим скриптам.
Теперь идем по коду.
Будем юзать такие либы:
Вводим переменные:
Через
Запуска
Создадим функцию сна(задержки):
Теперь создадим
В нем:
Запускать будем так(в главном скрипте):
Пропишем получение новых сабдоменов за определенное время:
Пример работы:
Запускаем главный скрипт:
Я указал чтобы через каждые 20 секунд(желательно 12 часов) менялся тоннель, ждем истечения 20 секунд.
В консоли вывелся адрес нового тоннеля:
Для теста я создал на локальном сервере index.html(типа симулятор откуда малварь будет брать задание), перейдем на полученный адрес:
У меня в index.html мануал по http.server.
Ждем истечения следующих 20 секунд, адрес опять обновился:
Попробуем перейти по СТАРОМУ адресу:
Теперь перейдем по новому адресу, который мы получили:
Весь код:
Надеюсь идею я доходчиво объяснил.
Осталось только завершить проект))))
На этом все. Спасибо за внимание!)
Теперь давайте пройдемся по теории, C2 сервер - проще говоря это сервер для контроля малваря, например малварь стучит на этот сервер, получает задание и выполняет его на зараженной системе.
Но проблема таких серверов, что ip такого сервера жестко установлен в коде, и тем самым этот сервер легче отключить.
Динамический C2(возможно такого понятия нету, но мне кажется, что слово "динамический" легче для восприятия идеи) - это то есть ip не будет жестко указан в коде, он будет меняться n-ое время(желательно 12 часов)
Я написал скажем основу, но идея еще не до конца завершена, осталось придумать как или через что будет поступать для агента(того кто выполняет задания) новый ip.(есть идеи например: через dns или протоколы какие-нибудь)
В будущем хотел бы скрестить этот C2 c koadic. Также если вам понравилась эта идея и вы хотите участвовать в разработке напишите мне в ЛС на codeby(нужны знания python и веба).
Реализовывать будем через сервис - ngrok.
Почему именно ngrok? Потому что там выдается рандомный сабдомен + есть https.
Прежде чем начать писать мы должны скачать ngrok, пройти регистрацию.
Закинуть ngrok в одну папку к нашим скриптам.
Теперь идем по коду.
Будем юзать такие либы:
Код:
import os
import requests
import time
import json
import sched
Вводим переменные:
Код:
url = "http://127.0.0.1:4040/api/tunnels" # Сервис создает тонель до локального хоста
url2 = "http://127.0.0.1:4040/api/tunnels/"
stuff = """ngrok.exe http 80"""
headers = {'Content-type':'application/json'}
data = json.dumps({"proto":"http","addr":"80", "name": "tunnel-name"})
Через
.bat
файл будем запускать ngrok с параметрами:
Код:
handle = open('NGstart.bat','w')
handle.write(stuff)
handle.close()
Запуска
.bat
файла:
Код:
os.startfile('NGstart.bat')
Создадим функцию сна(задержки):
Код:
def wait(sec):
time.sleep(sec)
Теперь создадим
server.py
В нем:
Код:
from http.server import HTTPServer, CGIHTTPRequestHandler
server_address = ("", 80) # Запускаем локальный сервер
httpd = HTTPServer(server_address, CGIHTTPRequestHandler)
httpd.serve_forever()
Запускать будем так(в главном скрипте):
Код:
os.startfile('server.py')
Пропишем получение новых сабдоменов за определенное время:
Код:
s = sched.scheduler(time.time, time.sleep)
def do_something(sc):
wait(4)
response = requests.get(url)
a = response.json()
tunname = a['tunnels'][0]['name'] # Тащим нужные значения через API ngrok-а
tunname2 = tunname
tunname = tunname[:-7]
response = requests.delete(url2 + tunname) # Создаем и удаляем новые тунели также через API
response = requests.delete(url2 + tunname2)
wait(4)
response = requests.post(url,data=data,headers=headers)
m = response.json()
print (m['public_url'])
s.enter(20, 1, do_something, (sc,)) # Тут задаем время для получения нового тоннеля
s.enter(20, 1, do_something, (s,)) # Тут задаем время для получения нового тоннеля
s.run()
Пример работы:
Запускаем главный скрипт:
Я указал чтобы через каждые 20 секунд(желательно 12 часов) менялся тоннель, ждем истечения 20 секунд.
В консоли вывелся адрес нового тоннеля:
Для теста я создал на локальном сервере index.html(типа симулятор откуда малварь будет брать задание), перейдем на полученный адрес:
У меня в index.html мануал по http.server.
Ждем истечения следующих 20 секунд, адрес опять обновился:
Попробуем перейти по СТАРОМУ адресу:
Теперь перейдем по новому адресу, который мы получили:
Весь код:
Код:
#main.py
import os
import requests
import time
import json
import sched
#variable
url = "http://127.0.0.1:4040/api/tunnels"
url2 = "http://127.0.0.1:4040/api/tunnels/"
stuff = """ngrok.exe http 80"""
headers = {'Content-type':'application/json'}
data = json.dumps({"proto":"http","addr":"80", "name": "tunnel-name"})
#Setup bat file
handle = open('NGstart.bat','w')
handle.write(stuff)
handle.close()
#Run ngrok with setting
os.startfile('NGstart.bat')
#Wait
def wait(sec):
time.sleep(sec)
wait(5)
#Get new ip
#response = requests.get(url)
#a = response.json()
#newip = a['tunnels'][0]['public_url']
#newip = 'https' + newip[4:]
#tunname = a['tunnels'][0]['name']
#tunname2 = tunname
#tunname = tunname[:-7]
#Stop tunnel
#response = requests.delete(url2 + tunname)
#response = requests.delete(url2 + tunname2)
#Start tunnel
#wait(2)
#response = requests.post(url,data=data,headers=headers)
#s = response.json()
#print (s['public_url'])
os.startfile('server.py')
s = sched.scheduler(time.time, time.sleep)
def do_something(sc):
wait(4)
response = requests.get(url)
a = response.json()
tunname = a['tunnels'][0]['name']
tunname2 = tunname
tunname = tunname[:-7]
response = requests.delete(url2 + tunname)
response = requests.delete(url2 + tunname2)
wait(4)
response = requests.post(url,data=data,headers=headers)
m = response.json()
print (m['public_url'])
s.enter(20, 1, do_something, (sc,))#Время задаем тут
s.enter(20, 1, do_something, (s,)) #Время задаем тут
s.run()
Код:
#server.py
from http.server import HTTPServer, CGIHTTPRequestHandler
server_address = ("", 80)
httpd = HTTPServer(server_address, CGIHTTPRequestHandler)
httpd.serve_forever()
Надеюсь идею я доходчиво объяснил.
Осталось только завершить проект))))
На этом все. Спасибо за внимание!)
Последнее редактирование: