Пишем динамический C2 сервер на python

Пишем динамический C2 сервер на python

@webware

t.me/webware

Приветствую всех! Недавно меня опять посетила идея. А что если сделать динамический C2 сервер, возможно ли это?

Теперь давайте пройдемся по теории, 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 секунд.

В консоли вывелся адрес нового тоннеля:

Я указал чтобы через каждые 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()

Надеюсь идею я доходчиво объяснил.

Осталось только завершить проект))))


На этом все. Спасибо за внимание!)

Источник codeby.net

Report Page