Статья [Python] Пишем динамический C2 сервер

Приветствую всех! Недавно меня опять посетила идея. А что если сделать динамический 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()

Пример работы:
Запускаем главный скрипт:
2018-10-25_19-54-32.png


Я указал чтобы через каждые 20 секунд(желательно 12 часов) менялся тоннель, ждем истечения 20 секунд.
В консоли вывелся адрес нового тоннеля:
2018-10-25_19-55-00.png

Для теста я создал на локальном сервере index.html(типа симулятор откуда малварь будет брать задание), перейдем на полученный адрес:
У меня в index.html мануал по http.server.
2018-10-25_19-55-13.png

Ждем истечения следующих 20 секунд, адрес опять обновился:
2018-10-25_19-55-31.png

Попробуем перейти по СТАРОМУ адресу:
2018-10-25_19-55-38.png

Теперь перейдем по новому адресу, который мы получили:
2018-10-25_19-55-53.png


Весь код:
Код:
#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()

Надеюсь идею я доходчиво объяснил.
Осталось только завершить проект))))

На этом все. Спасибо за внимание!)
 
Последнее редактирование:

gushmazuko

Green Team
24.03.2017
173
451
BIT
1
Понадобится еще один промежуточный сервер, но в любом слуячае агенту придется указать статичный адрес где он должен брать обновление.
А не легче в коде прописать доменное имя и в случае проблемы с сервером просто сменить IP на новый C2 sercer в dns хостинге. Если кто то заметит мальвар он не ограничится блокировкой сервера на который исходит соединение а примет меры по очистке системы и предотвращениею повторного заражения, динамический C2 тут уже не поможет!?
 
1

1tachi

проще говоря это сервер для контроля малваря, например малварь стучит на этот сервер, получает задание и выполняет его на зараженной системе.
Сразу поясню , что я новичок в этой теме и было бы интересно пообщаться на данную тему с целью саморазвития)
Мне не совсем понятно , зачем вшивать в код малвари ip адрес C2 сервера. Не проще написать малварь в виде демона и слушать определенный порт откуда собственно и будут идти команды при необходимости. Вы просто не сказали с какой целью вы пишите динамический C2 сервер. Проблема в том , что если написать в виде демона , то по открытому порту будет палится , поэтому решили написать динамик с2?
 
B

Bearsec

Сразу поясню , что я новичок в этой теме и было бы интересно пообщаться на данную тему с целью саморазвития)
Мне не совсем понятно , зачем вшивать в код малвари ip адрес C2 сервера. Не проще написать малварь в виде демона и слушать определенный порт откуда собственно и будут идти команды при необходимости. Вы просто не сказали с какой целью вы пишите динамический C2 сервер. Проблема в том , что если написать в виде демона , то по открытому порту будет палится , поэтому решили написать динамик с2?
Нужно учитывать наличие фаерволов, которые просто могут не дать подключиться к зараженной тачке из интернета. Тут же получается реверс, то есть зараженная тачка лезет в интернет, а с этим меньше проблем.
 
  • Нравится
Реакции: 1tachi и gushmazuko

gushmazuko

Green Team
24.03.2017
173
451
BIT
1
Сразу поясню , что я новичок в этой теме и было бы интересно пообщаться на данную тему с целью саморазвития)
Мне не совсем понятно , зачем вшивать в код малвари ip адрес C2 сервера. Не проще написать малварь в виде демона и слушать определенный порт откуда собственно и будут идти команды при необходимости. Вы просто не сказали с какой целью вы пишите динамический C2 сервер. Проблема в том , что если написать в виде демона , то по открытому порту будет палится , поэтому решили написать динамик с2?
REVERSE или BIND shell? В чем разница?Какой выбрать?
 
  • Нравится
Реакции: 1tachi
1

1tachi

Благодарю всех за ответы. Я видимо летал в облаках с максимальными привиллегиями:) Тогда еще один вопрос)
ТС сказал , что "проблема таких серверов, что ip такого сервера жестко установлен в коде, и тем самым этот сервер легче отключить." Я так понимаю имеется в виду отключить на фаере запросы к этому ip или какие то еще варианты рассматриваются? Если да , то что мешает заблочить все запросы к домену ngrok.io и его поддоменам , я так понял в ngrok они выглядят так -> subdomen.ngrok.io?

Такая мысль в голову пришла , сразу поясню , что я такое не тестил , просто интересно стороннее мнение. А что если купить пак прокси и на управляющем сервере их устанавливать , беря из пака по одному прокси каждые N часов. Соответственно агенты будут стучаться не на ip управляющего сервера , а на прокси , которые будут динамически меняться. Исходя из этого агент при запросе задания в ответе от сервера помимо задания будет еще брать и N число прокси для последующих запросов для получения задания. Что скажете?
 
Q

quality

Это тупик, точно такой же, как и любая централизация.
Единственное правильное направление, это
Принцип возможно применить для децентрализации, но только принцип. Применение же совершенно иное.

И если есть практики, которые готовы поучавствовать, пишите в личку.
Настоятельно рекомендую обратить внимание на то, что именно практики. Теоретики, которые пишут прекрасные статьи и замечательно рассуждают о бренном бытие, не тратьте моего времени, очень вас прошу. Только практик, который готов не просто принять участие в какой то перспективе, а сделать сейчас, чтоб в будующем улучшать.

Кстати, Kelihos, писал скорее всего 1 человек. Ну по крайней мере базу для него создал 1 разработчик. Тот же самый, кто создал инфреймер для Severa. Ник тут писать не буду, гугл и так всё знает, а вот людям этого знать не нужно. Суть в том, что один человек его сделать то сделал, да вот ушло на это более 10 лет. Начало было положено ещё со времен Zeus'а и Pinch'a, потом появились 2 бота, один загуглится думаю легко (у них общие куски кода), а второй в названии использует никнейм разработчика. Так вот, они создали конфетку не сразу, - этим и отличаются практики от теоретиков.

Если найдутся практики, пишите в личку. Тут есть моя тема, с обозначенным мной интересом, предварительно рекомендую ознакомиться.
 

pp11

Green Team
16.09.2018
201
82
BIT
1
Это всё конечно здорово. Но как малварь будет отслеживать новый сервер? То есть 12 часов тикнули, ngrok выдал новый адрес. Как малварь узнает этот адрес?
 
  • Нравится
Реакции: dumianman

Diplomat

Green Team
28.11.2017
25
4
BIT
0
Я я однажды придумал продукт и парень мне написал, как придет время. я раскрою детали. Там не принцип децентрализации а при каждом новом обращение создавался новый запланированый рандомный адрес считывания команд! Работал как часики, почему работал? потому что я е белый и не черный а грей, и мне нравится создавать и ломать голову!
 

Proxy n1nja

Green Team
28.06.2018
118
149
BIT
0
Это всё конечно здорово. Но как малварь будет отслеживать новый сервер? То есть 12 часов тикнули, ngrok выдал новый адрес. Как малварь узнает этот адрес?
Ну можно сделать что бы сервер пулил свой новый адресс на гитхаб например или пастебин какой, а малварь при разрыве соеденения с сервером чекала изменения в файле и брала новый адрес для подключения от туда.
 

RavenHack

Member
28.03.2020
5
0
BIT
0
Вообще мое мнение исходя из работы в реальном времени с реальными целями ! вы не о том паритесь ! Ботнет спецом упрощают до максима чтоб меньше ругался антивир ! Даже если вы его обошли дальнейшии ваши действия вас и определять ! А дальше ваш ip в лабу а потом задедосят ваш сервак ! Мое мнение таково что надо создать малварь с минимальным функцианалом допустимым системой фаером и ав ! И при надобности подтягивать сесию временую под нужный антивир настроеную ! Вот так сейчас все работают ! Смена ip миграция вызов из реестра это все прописано уже в антивир ! Тут была не плохая статья на тему SSL сертификатов для meterpreter сесии ! Ну так вот я думаю что автору надо заняться этим делом и минимизировать возможности своего ботнета ! НО оставить фунцую подтянуть что нужно в любой момент ! Для тех кто совсем не понимает о чем речь ! пример манифест андройда при установке apk там пишут что программа будет использовать и какие будет иметь права ! Доверительный сервис с простым функционалом не вызовит ни каких подозрений у AV ! Кстати я последнее время понял что реверс инженеры уже давно сотрудничают с владельцами ботнетов путем внедрения их кода ! Также скаченая Windows уже каждая вторая как бы не первая заражена !

Еще момент на заметку ! В хост файле при установке пиратской проги на сколько я помню ! Комментируют или направляют на 127.0.0.1 группу сетевых адресов что допустимо в любой программе ! Многие начали создавать стилеры хоть эта функция и доступна всем остальным оболочкам ! Из-за упрощенного интерфейса ! Вобщем схема проста используете доменое имя ( лучше штук 5) по возможности регистрируете SSL сертификат ! Пишете программу а не малварь ( с возможностями подтянуть что вам нужно в нужный момент ) ! Не работайте от админа без не обходимости ( можно в любой момент повысить привелегии ) . Вообще надо читать что достигли антивирусы ! Если кто все время работает могли заметить огромные изменения в поведении ! Даже митм атаки уже стали не актуальны !
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!