Как я делал Удаленное Управление, реверсшелл и многое другое на WinAPI в моем RAT

  • Автор темы Admin

Admin

#1
Администратор
Регистрация
31.12.2019
Сообщения
6,890
Реакции
25
Это история в картинках и видео, в исходниках и переписках о моем ратнике, в котором я постепенно реализовываю нужный мне функционал, за его прогрессом вы можете следить на гитхабе, а так же просто интересуясь у меня в комментариях этой темы, начнем статью...


1f423.png
Часть первая: "Рождение"


Всё началось когда я выклянчал у своего друга (голова, товарищ, братишка) аккаунт от кору, не всегда же мне реверсшеллы на питоне делать, да? Моей мыслью было найти какой нибудь проект наподобие ратника, что бы можно было опереться на плечо тех, кто что либо писал до меня. Но к сожалению такого проекта не было, кроме тининайка, который итак лежал на гитхабе, но с кору я вытащил код который опубликовал один юзер, исходник был реверсшеллом на си, и тут зародилась идея, о написании собственного проекта, который я бы мог развить во что нибудь стоящее, это был пресловутый хакатон, на котором программист реализует что то подобное чему то. Я решил без малого сделать клон Quasar, на основе хотя бы чего то, и что бы принципиально разобраться самому как это работает!


1f991.png
Часть вторая: "Протокол"


Первой мыслью было конечно писать что то подобное как у шара и джевса, но давайте представим себе, если бы я хотел бы добавить "Управление рабочим столом" как в Quasar? Что бы получилось в итоге? А если бы я посылал все это еще в виде json? Это как мне нужно было бы сервер накодить, что бы он это дело все обрабатывал? А это не лоадер без функционала, а полноценная система управлением компьютером должна быть, вы же все пользовались РМС или Тимвьювером, они что ль по http работают!?


По этому я принял решение получать команды от сервера в таких вот структурах, чем использовать обычный json или xml:
Код:
typedef struct BIGSCREEN
{
    int DO;
    int w;
    int h;
    int RealW;
    int RealH;
    int ClickX;
    int ClickY;
    DWORD ZipSize;
    DWORD Size;
} BIGSCREEN;


Причина думаю почему сокеты думаю уже вам была ясна, и мне тоже, далее я начал штудировать гугл в поисках подсказок о том как все это правильно сварить и получить результат, одновременно ковыряя исходы TinyNuke и впитывая для себя идеи о том как правильно или неправильно кодить вирусы:


10944



1f60e.png
Часть третья: "Не побоялся и обосрался"


Второго числа этого месяца я начал проект по созданию ратника и написал небольшую статью о нем и выложил на гитхаб исходники.
Вот статья: https://xss.is/threads/37990/
Вот ссылка на проект: https://github.com/techkote/RAT_WINAPI
В статье я подробно выговорил всё об его устройстве, протоколе по которому взаимодействует ратник и панель, разобрал все до мельчайших деталек, в принципе это был готовый конструктор лего, из которого можно было собрать всё что угодно. Но планы на него у меня были и я продолжил разработку далее. Замечу, что это хоть и не готовый проект, но на форуме статей и подробных разборов аналогичных не было, и я продолжу эту славную традицию...
Затем последовало много критики, ведь я не претендую на звания лучшего кодера планеты, но к некоторым людям я прислушался и оно того стоило:




10943



1) Как правильно заметил Haunt - разработка на сокетах была обусловлена тем, что я хотел бы в дальнейшем расширять этот функционал в сторону аналогов "quasar" или "tinynuke" и выбрал его потому, что другой альтернативы не видел для себя, если я пишу на си c винапи в клиенте, то нужно быть максимально разборчивым в том, чем ты будешь пользоваться в дальнейшем, например я в тот момент не мог ответить на этот вопрос - ведь если я бы не выполнил или не смог сделать как я бы хотел - я бы был п#даболом.


2) Это был прототип, и я плавно съехал с консольного варианта сервера, на популярный в С++ кругах фреймворк Qt, хотя движок полностью остался прежним как и был. Движок не изменился, так как для моих целей он был важен.


3) Я написал код для себя в первую очередь, во вторую для людей, ведь люди после меня будут что то делать свое и возможно - я им пригожусь, вспомнят добрым словом нелепого меня, который пытался реализовать недостижимое и заложил фундамент для будущих ребят которые захотят создавать что то на базе пары моих статей, ведь я включаю подробную документацию о том как готовить этот ратник, ведь слишком много откровенно скамерских и глупых тем HVNC и ратников в продаже:? Сами же были свидетелями, того что люди хоть и пытаются скопировать тининьюк или что то подобное, но у них ничего не выходит из за проблем в самом тининьюке, или из за нехватки знаний, или из за того что тини это единственное что у них скомпилировалось и они пошли пытаться его впарить кому то...


2620.png
Часть четвертая: "Приделываю реверсшелл и получение скриншотов"


Ни один уважающий себя RAT не может быть полнофункциональным если он не имеет доступа к командой строке, о том для чего она важна вы можете почитать в предыдущей моей статье про распространение с помощью неё ваших вирусов: https://xss.is/threads/38293/, можно запускать, короче говоря, полноценные программы, от лоадеров до стиллеров написанных хоть на пауршелле, пайтоне или батче, или любом другом скриптовом языке программирования который установлен на компьютере жертвы аттаки. Можно например скачать стиллер из этой моей же статьи и попробовать его запустить https://xss.is/threads/38304/ таким вот методом распространения... Вообщем был нужен доступ, и я его как говорилось выше нашел самым первым, переписал под себя, и мог полноценно вставить в ратник:




Реверсшелл это прекрасно, но что было со скриншотами это конечно атас, требовалось их получать не сохраняя на диск, а конвертируя HBITMAP в набор байтов и отправлять их по сокетам на сервер где бы мне пришлось конвертировать обратно байты в HBITMAP и вставлять это дело в мой кастомный класс QLabel. Но дело спорилось, и все что было мне нужно это гугл, тот же тини, пара часов на понимание как делать скрин, как его маштабировать под разрешение QLabel; как построить структуры для их передачи между клиентом и сервером, и в итоге я получил нормально работающую систему, которую доработать до стриминга изображения рабочего стола не составило труда, на ваших глазах вы увидете как у автора появилось простое решение этой насущной задачи:




1f47e.png
Часть пятая: "Удаленное управление"


Многим может показаться, что кликать мышкой по импровизированному экрану это было бы очень просто, ведь сколько игр, сколько программ написано про это, но я сталкиваюсь с новой для меня задачей, в которой требуется передавать нажатия мышкой из одной программы в другую операционную систему, и тут я пошел по непроторенной дорожке, в которой пришлось изучать Qt.
А именно получать разрешение Лейбла пересылать его жертве, получать разрешение экрана у жертвы, на стороне жертвы скейлить (подгонять одно разрешение под другое) и пересылать серверу готовый таким образом скриншот, который уже оптимизирован и прекрасен... А ранее я скейлил все на строне сервера, это было просто... Но разрешение экрана жертвы мне еще пригодилось я смог с помощью него и размеров QLabel рассчитывать координаты тычков (кликов) мышей по QLabel и подгонять их под разрешения экрана, по формуле которая была взята из тини:


Код:
int x = GET_X_LPARAM(lParam);
int y = GET_Y_LPARAM(lParam);


float ratioX = (float)client->screenWidth / client->pixelsWidth;
float ratioY = (float)client->screenHeight / client->pixelsHeight;


x = (int)(x * ratioX);
y = (int)(y * ratioY);


в более мне подходящую:


Код:
void DisplayLabel::mousePressEvent(QMouseEvent *ev)
{
    float ratioX = (float)ClientW / this->width();
    float ratioY = (float)ClientH / this->height();
    int x = (int)(ev->pos().x() * ratioX);
    int y = (int)(ev->pos().y() * ratioY);


На этом код позаимствованный из серверной части тининьюка для моего ратника начинается и заканчивается...


Далее идет код отработки событий нажатия клавиш, он получился простым и максимально содержательным:


Код:
    CMDiDATA indata; \\ создаю структуры из первой части:)
    memset(&indata, 0, sizeof(CMDiDATA));
    indata.CMD = CMD_SCREEN; \\ говорю ей что это будет команда связанная со скриншотами


    BIGSCREEN inBIGSCREEN; \\ создаю структуру для инфромации по скриншотам
    memset(&inBIGSCREEN, 0, sizeof(BIGSCREEN));


    switch (ev->type())
    {
        case QEvent::MouseButtonDblClick: { \\ тут регистрируется двойное нажатие
            inBIGSCREEN.DO = DO_DCLICK;  \\ этой структуре говорю что это будет операция связанная с "двойными кликами мышкой"
            break;
        }
        case QEvent::MouseButtonPress: {
            if (ev->buttons() == Qt::LeftButton){
                inBIGSCREEN.DO = DO_LCLICK;  \\ этой структуре говорю что это будет операция связанная с "левым кликом мыши"
            }else{
                inBIGSCREEN.DO = DO_RCLICK; \\ а тут с правым
            }
            break;
        }
        default:
            break;
    }


    inBIGSCREEN.ClickX = x; \\записываю координаты клика
    inBIGSCREEN.ClickY = y;


    memcpy(indata.DATA, &inBIGSCREEN, sizeof(BIGSCREEN)); \\копирую одну структуру в другую
    send(MSOCKETS[NOMER], (char*)&indata, sizeof(CMDiDATA), 0); \\ и отправляю ее на сервер
    memset(&indata, 0, sizeof(CMDiDATA));
    memset(&inBIGSCREEN, 0, sizeof(BIGSCREEN));
}


А на клиентской части был бедлам, я закопался в коде на добрых два дня, пытаясь разобраться с исходниками чужого проекта, разобраться со всеми делами - что бы получить результаты которые граничили с катастрофой:




А все объяснялось очень просто - я не знал как работает WinApi в окнах, ведь по сути на них писал лишь консольные приложения, которые по большей части и есть все вирусы... «Ученье - свет, а неученье - тьма! (Суворов)» Так я перешел на мдсн и начал разбираться ползая по сети, и ища ответы, и в итоге у меня получилось! Не без страданий, но проект ожил, начал приносить осязаемый отклик, что меня не могло ни радовать.




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


Но давайте прямо скажем - мой проект принципиально решает задачи, хоть его допиливать и допиливать, до состояния аналогичных, но если хватит сил и постараться выйти из яслей, то возможно создать полноценные альтернативы многим софтам, например таким классным как этот:




10950



Никого не смутило что там в окне у него написано - Online (80), а клиентов нету? В принципе чего и стоило ожидать:


10951



Зачастую мы не видим как люди кодят долго и упорно классные софты, а иногда просто создают концепты, без функционала, в моем же случае я создал целую лабораторию по изучению и отладке работы ратников - так что если вы так же мечтаете написать что то такое - присоединяйтесь к разработке, это на самом деле весело!


Автор: shkolnick1337
 

Members, viewing this thread

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