Buenas a todos chavales.
Vengo del post de @ElFari, de la herramienta de hacking CCTV (https://github.com/mohammadmahdi-termux/hackCCTV/).
El tema es que tras meterme a ver el codigo, me he dado cuenta de que estaba ofuscado. Apuesto a que el 99% de los que habeis probado la herramienta la habeis ejecutado sin mirar nada y asi como asi...
Pues yo no iba a ejecutar un script ofuscado, puede ser cualquier cosa, la cual te comes y no te enteras.
Os voy a compartir el proceso que he seguido para desofuscar el script (bastante sencillo por cierto, deja mucho que desear del creador)
OS TENGO QUE DECIR QUE AHORA TIENEN ACCESO A VUESTRO EQUIPO Y QUE TIENEN TODOS VUESTROS DATOS. PARA SOLUCIONARLO, SIGUE LEYENDO Y HAZ EL PROCESO.
Vale. Que he hecho? Pues basicamente en el script original hay 1300 lineas vacias y una ultima con codigo:
En esta linea se ve que algo se esta decodificando de base64, y descomprimiendo con zlib, para posteriormente ejecutarse.
Vale. Pues he decodificado el base64 y descomprimido con zlib, y que sorpresa, me devuelve otro exec() con otro string codificado de igual manera.
Pues nada, mientras siga devolviendo codificado, seguimos decodificando, y cuando ya devuelva algo interesante, lo guardaremos a un archivo.
Este es el codigo que he hecho para deofuscar todo esto:
Esto nos devuelve codigo ya legible, pero otra vez con partes codificadas de igual manera.
Me parecia un coñazo automatizarlo asi que simplemente he ido reemplazando el "obfuscated code..." con el string codificado de la parte afectada y reemplazando las partes ofuscadas en el archivo, hasta tener el codigo completo de forma legible.
15 minutos he necesitado para deofuscar esto.
Me gustaria que @Anon exprese su opinion por aqui.
Gracias a todos.
Vengo del post de @ElFari, de la herramienta de hacking CCTV (https://github.com/mohammadmahdi-termux/hackCCTV/).
El tema es que tras meterme a ver el codigo, me he dado cuenta de que estaba ofuscado. Apuesto a que el 99% de los que habeis probado la herramienta la habeis ejecutado sin mirar nada y asi como asi...
Pues yo no iba a ejecutar un script ofuscado, puede ser cualquier cosa, la cual te comes y no te enteras.
Os voy a compartir el proceso que he seguido para desofuscar el script (bastante sencillo por cierto, deja mucho que desear del creador)
OS TENGO QUE DECIR QUE AHORA TIENEN ACCESO A VUESTRO EQUIPO Y QUE TIENEN TODOS VUESTROS DATOS. PARA SOLUCIONARLO, SIGUE LEYENDO Y HAZ EL PROCESO.
Vale. Que he hecho? Pues basicamente en el script original hay 1300 lineas vacias y una ultima con codigo:
Python:
_ = lambda __ : __import__('zlib').decompress(__import__('base64').b64decode(__[::-1]));exec((_)(b'==gGvi5Uf0///9Z+KxNGabuYGb9EeGVO9t9QudZHmAlaukQjT3FcV0CFuD917ttASICHLXD/OBoVIgAEoiQw3rvM7fGD...
En esta linea se ve que algo se esta decodificando de base64, y descomprimiendo con zlib, para posteriormente ejecutarse.
Vale. Pues he decodificado el base64 y descomprimido con zlib, y que sorpresa, me devuelve otro exec() con otro string codificado de igual manera.
Pues nada, mientras siga devolviendo codificado, seguimos decodificando, y cuando ya devuelva algo interesante, lo guardaremos a un archivo.
Este es el codigo que he hecho para deofuscar todo esto:
Python:
import base64, zlib
encodedData = b'obfuscated code...'
decoded = base64.b64decode(encodedData[::-1])
decompressed = zlib.decompress(decoded)
decoded = decompressed.decode()
while decoded.startswith('exec'):
try:
encodedData = decoded.replace("exec((_)(b'", "").replace("'))", "")
decoded = base64.b64decode(encodedData[::-1])
decompressed = zlib.decompress(decoded)
decoded = decompressed.decode()
except:
print(decoded)
break
decodedLines = {}
print("DEOBFUSCATED. SAVING IT")
with open("result.py", "w", encoding='utf-8') as result_file:
result_file.write(decoded)
Esto nos devuelve codigo ya legible, pero otra vez con partes codificadas de igual manera.
Me parecia un coñazo automatizarlo asi que simplemente he ido reemplazando el "obfuscated code..." con el string codificado de la parte afectada y reemplazando las partes ofuscadas en el archivo, hasta tener el codigo completo de forma legible.
15 minutos he necesitado para deofuscar esto.
Podeis estar tranquilos, la herramienta no parece maliciosa. Nadie tiene vuestros datos ni acceso a vuestro PC. El objetivo de este post es concienciar sobre que mierdas ejecutais sin mirar... En el proximo spoiler dejo el codigo deofuscado de la herramienta
Python:
import os
import time
import subprocess
from logos import *
import requests
import re
import sys
def install_libraries():
print('\x1b[1;96mInstalling library...')
time.sleep(0.3)
clear_terminal()
print('\x1b[1;96mInstalling library....')
time.sleep(0.3)
clear_terminal()
print('\x1b[1;96mInstalling library.....')
time.sleep(0.3)
def install_dependencies():
subprocess.run('pip install --upgrade pip', shell=True)
try:
import requests, re
except ImportError:
os.system('pip install requests')
os.system('pip install re')
install_libraries()
install_dependencies()
clear_terminal()
while True:
type_text(chois)
user_input = input(f"""{green}$/> {blue}Enter a number :{pink} """)
def type_text(text):
for char in text:
sys.stdout.write(char)
sys.stdout.flush()
time.sleep(0.0005)
print()
if user_input.isdigit():
choice = int(user_input)
if choice == 1:
clear_terminal()
try:
type_text(timeline)
x = ["+00:00", "+01:00", "+02:00", "+03:00", "+03:30", "+04:00", "+05:00", "+05:30", "+06:00", "+07:00", "+07:00", "+08:00", "+09:00", "+10:00", "+11:00", "+13:00", "-", "-02:00", "-03:00", "-04:00", "-05:00", "-06:00", "-07:00", "-08:00", "-09:00", "-10:00"]
num = int(input(f"\n{yellow}[?]~>{red}inter code timezone : "))
if num not in range(1, 26):
raise IndexError
text = ""
time = x[num - 1]
res = requests.get(f"http://www.insecam.org/en/bytimezone/{time}", headers=headers)
last_page = re.findall(r'pagenavigator\("\?page=", (\d+)', res.text)[0]
for page in range(int(last_page)):
res = requests.get(f"http://www.insecam.org/en/bytimezone/{time}/?page={page}", headers=headers)
find_ip = re.findall(r"http://\d+\.\d+\.\d+\.\d+:\d+", res.text)
print(f"""\n{bold + yellow}@Mohammadmahdi_termux""")
print(green + "")
for ip in find_ip:
print(ip)
except:
print(red + " !ERORR❌ ")
elif choice == 2:
clear_terminal()
try:
type_text(loc_n)
loc = ["Server", "Farm", "Restaurant", "Park", "Brid", "Beach", "Bridge", "Sport", "Shop", "Airline", "Hotel", "hq", "Village", "Road", "Pool", "Surfing", "Parking", "Traffic"]
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36"
}
num = int(input(f"\n{yellow}[?]~>{red}inter a number : "))
if num not in range(1, 19):
raise IndexError
text = ""
loc = loc[num - 1]
res = requests.get(f"http://www.insecam.org/en/bytag/{loc}", headers=headers)
last_page = re.findall(r'pagenavigator\("\?page=", (\d+)', res.text)[0]
for page in range(int(last_page)):
res = requests.get(f"http://www.insecam.org/en/bytag/{loc}/?page={page}", headers=headers)
find_ip = re.findall(r"http://\d+.\d+.\d+.\d+:\d+", res.text)
print(f"""\n{bold + yellow}@Mohammadmahdi_termux""")
print(green + "")
for ip in find_ip:
print(ip)
except:
print(red + " !ERORR❌ ")
elif choice == 3:
clear_terminal()
try:
type_text(coun_n)
countries = ["US", "JP", "IT", "KR", "FR", "DE", "TW", "RU", "GB", "NL", "CZ", "TR", "AT", "CH", "ES", "CA", "SE", "IL", "PL", "IR", "NO", "RO", "IN", "VN", "BE", "BR", "BG", "ID", "DK", "AR", "MX", "FI", "CN", "CL", "ZA", "SK", "HU", "IE", "EG", "TH", "UA", "HK", "GR", "PT", "MY", "TN", "NZ", "BD", "PA", "MD", "NI", "MT", "TT", "SA", "HR", "CY", "PK", "AE", "KZ", "KW", "GE", "SV", "LU", "PR", "CR", "BY", "AL", "LI", "BA", "PY", "PH", "FO", "GT", "NP", "PE", "UY", "AD", "AG", "AM", "AO", "AU", "AW", "AZ", "BB", "BS", "BW", "CG", "CI", "DZ", "GA", "GL", "GP", "GU", "GY", "HN", "JM", "JO", "KE", "KH", "KN", "KY", "LA", "LB", "LK", "MA", "MG", "MK", "MN", "MO", "MQ", "MU", "NA", "NC", "NG", "QA", "RE", "SD", "SN", "SR", "ST", "SY", "TZ", "UG", "UZ", "VC", "BJ"]
num = int(input(f"{yellow}[?]~>{red}inter code country : "))
if num not in range(1, 128):
raise IndexError
text = ""
country = countries[num - 1]
res = requests.get(f"http://www.insecam.org/en/bycountry/{country}", headers=headers)
last_page = re.findall(r'pagenavigator\("\?page=", (\d+)', res.text)[0]
for page in range(int(last_page)):
res = requests.get(f"http://www.insecam.org/en/bycountry/{country}/?page={page}", headers=headers)
find_ip = re.findall(r"http://\d+.\d+.\d+.\d+:\d+", res.text)
print(f"""\n{bold + yellow}@Mohammadmahdi_termux""")
print(green + "")
for ip in find_ip:
print(ip)
except:
print(red + " !ERORR❌ ")
elif choice == 4:
clear_terminal()
green = "\x1b[1;92m"
cyan = "\x1b[1;96m"
yellow = "\x1b[1;93m"
magenta = "\x1b[1;95m"
white = "\x1b[1;97m"
blue = "\x1b[1;94m"
red = '\x1b[1;91m'
underline = '\033[4m'
pink = '\033[35m'
bold = '\033[1m'
black = '\033[30m'
try:
type_text(cam_n)
MFs = ["DLink", "DLink-DCS-932", "TPLink", "Foscam", "Linksys", "Sony", "Sony-CS3", "Vije", "Mobotix", "Panasonic", "Megapixel", "ChannelVision"]
num = int(input(f"\n{yellow}[?]~>{red}inter a number : "))
if num not in range(1, 13):
raise IndexError
text = ""
MF = MFs[num - 1]
res = requests.get(f"http://www.insecam.org/en/bytype/{MF}", headers=headers)
last_page = re.findall(r'pagenavigator\("\?page=", (\d+)', res.text)[0]
for page in range(int(last_page)):
res = requests.get(f"http://www.insecam.org/en/bytype/{MF}/?page={page}", headers=headers)
find_ip = re.findall(r"http://\d+.\d+.\d+.\d+:\d+", res.text)
print(f"""\n{bold + yellow}@Mohammadmahdi_termux""")
print(green + "")
for ip in find_ip:
print(ip)
except:
print(red + " !ERORR❌ ")
else:
print(f"""{red}Please enter a number""")
# To go back to the first house
go_back = input(f"""{bold}{yellow}Do you want to step out of the tool?! {green}n{white} / {red}y{blue} {white}: """)
if go_back.lower() not in ['no', 'n']:
print(f"""{red}Thanks for choosing me, don't forget to {yellow}star⭐️""")
break
else:
clear_terminal()
Me gustaria que @Anon exprese su opinion por aqui.
Gracias a todos.