利用pearcmd实现裸文件包含
利用pearcmd实现裸文件包含在 ctf 中,常常有这样一类题:
题目很简单,一般围绕一个 include 函数展开。
例:
ctfshow 元旦水友赛 easy_include
这类题目没有提供文件上传点,因此不能使用常规方法上传一句话实现命令执行。
裸文件包含是一种针对这类题目的解题手法。
这里引入大佬的文章:https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html
后面我的研究很多都是基于这篇文章的。
由于没有文件上传点,我们只能利用靶机本身的一些特殊文件的特性写入一句话实现命令执行。
常规的用法是日志文件包含,日志文件有以下特点
用户的请求会导致某些日志的跟新
用户请求中的某些参数会写入日志里(如User-Agent)
日志文件的默认位置一般是确定的
但是在 ctf 环境中,题目大多为 docker 环境,docker 环境下的日志会有很多变数(具体参考上面大佬的文章)
那么,docker 环境下,有没有什么更加普适性的方法来实现文件包含+命令执行呢?
接下来就要引出一个docke ...
CTFshow easy_include
ctfshow easy_include
简单读一下代码
定义了个 waf 函数,去除参数中所有的点,并且要求参数必须以小写符号开头。
但是后面仅仅只是判断了waf的返回值,返回值为真则执行下面的语句,需要保证这个 post 参数的值必须以小写字母开头(文件名前面拼接上 localhost 就可以绕过了)
下面的 include 直接包含了$_POST[‘1’] 的原内容(根本就没经过过滤嘛……)
看了下版本为 7.3
在 7.4 以前php是默认安装 pecl 这个用于管理拓展而命令行工具的(pear扩展)
参考大佬文章 0x06 部分:https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html
在 docker 的php任意版本镜像中, pcel/pear 都会被默认安装,安装的路径为 /usr/local/lib/php,这个工具的文件名为:pearcmd.php (简单好记)
由于 ctf 大多是 docker 环境,因此大概率存在这个命令行工具,并且路径已经确定。
docker 环境下的p ...
CTFshow web1(困难题)
CTFshow web1(困难题)
根据前面做题经验,看见登录框基本都是跑一下爆破,弱口令等等
这里用 dirmap 目录爆破爆出来有一个 www.zip
把他下载下来
看了 login.php 和 reg.php
两个文件的源码都对sql注入常见的字符做了严格的过滤,sql注入此路不通
看了下 main.php 看起来是一个显示用户信息的页面。
我们回到登录界面,注册一个账号并登录查看一下是什么样的效果
出来了一个用户信息表,里面是已注册的用户信息
第一行有个提示 flag_is_my_password
看来是要获取这个用户的密码
(才发现题目有提示)
回到 main.php 源码
关键就是这两句,我们可以控制 order by 的参数
我本人到这里就没思路了。看网上别人的 writeup 发现可以利用 ”order by 密码“ 这种方法来猜解密码
手工来操作比较复杂,所以还是得写脚本
这里找到一位大佬写的脚本:https://blog.csdn.net/miuzzx/article/details/104514442
12345678910111213141516171 ...
信息的表示和处理——信息存储
本文参考B站up主 九曲阑干 的系列视频【【CSAPP-深入理解计算机系统】2-1.信息的存储(上)】 https://www.bilibili.com/video/BV1tV411U7N3/?share_source=copy_web&vd_source=73f97624c2b3ff1eb41ea26fb86c72ee
信息存储计算机一般使用 字节 作为最小的可寻址的内存单位
通常情况下,程序将内存视为一个非常大的数组,每个数组的元素是一个个的字节
每个字节的索引称为地址
信息存储的基本单元——字节一个字节(byte)由 8bit(位)组成
我们通常把这种按照 位 来表示数据的方式称为:位模式
十六进制数表示的位模式用二进制表示数据比较冗长,而采用十进制又不方便进行进制转换
因此,我们引入十六进制表示的位模式
字长字长决定了虚拟地址空间的最大值
对于一个字长为w的机器,虚拟地址的范围是0 ~ 2^w - 1
对于32位的机器而言,虚拟地址空间最大为4GB
对于64位的机器而言,虚拟地址空间最大为16EB
寻址和字节顺序对于跨越多字节的对象,他的地址是它所用的字节中的 ...
ctf_web
ctfshowweb13访问题目链接
一看是一道文件上传题,上传文件进行测试
上传php会显示 error suffix 因此推测会检测格式
当文件字数超出一定字数时,显示 error file zise
常规操作就是访问 .php.bak 、.phps 、.swp等文件,看看有没有源码泄露
这道题访问 upload.php.bak 成功获取到了php源码
123456789101112131415161718192021222324252627282930<?php header("content-type:text/html;charset=utf-8"); $filename = $_FILES['file']['name']; $temp_name = $_FILES['file']['tmp_name']; $size = $_FILES['file']['size']; $error = $_FILES['file ...
提权手法收集
提权手法收集DirtyC0w域:No
Local Admin: Yes
操作系统: Linux
类型: 0/1 Exploit
方法: gcc -pthread c0w.c -o c0w; ./c0w; passwd; id
批注:https://github.com/firefart/dirtycow
CVE-2016-1531域:No
Local Admin: Yes
操作系统: Linux
类型: 0/1 Exploit
方法: CVE-2016-1531.sh;id
批注:https://github.com/crypticdante/CVE-2016-1531
Polkit域:No
Local Admin: Yes
操作系统: Linux
类型: 0/1 Exploit
方法:
12https://github.com/secnigma/CVE-2021-3560-Polkit-Privilege-Esclation./2. poc.sh
DirtyPipe域:No
Local Admin: Yes
操作系统: Linux
类型: 0/1 Exploit
方法:
...
第四讲 公钥密码体制
公钥密码体制提出背景对称密码体制满足不了保密通信的需求
网络中用户数量多就需要更多密钥,密钥管理很困难
互不认识的网络用户间通信要求密钥共享双方相互信任,不能解决陌生人之间的密钥传递问题
堆成密码难以提供数字签名功能
于是因为对称密码体制的局限性,非对称密码体制应运而生。
公钥密码的基本思想每个用户都有一个公钥和私钥。
公钥用于其他人向自己发送信息时进行加密。
私钥用于自己解密他人向自己发的信息。
单项陷门函数
对任意明文加密是容易的
已知解密密钥,解密密文是容易的
不知道解密密钥,即使知道其他一切信息,解密也是困难的
满足以上性质的函数称为单向陷门函数。
常见的单项陷门函数问题
大整数的分解问题(rsa)
有限域上的离散对数问题(ELGamal)
椭圆曲线上的离散对数问题(ECC)
公钥密码的应用
机密性的实现(公钥加密私钥解密)
数字签名(发送方用自己私钥签名,接收方用对应公钥鉴别)
密钥分发和协商
公钥密码的局限公钥密码体制虽然很安全,但是运算代价较大。当传送大量数据时,常采用公钥和对称密钥的混合密码体制。
RSA公钥密码体制RSA由Rivest、Shamir、Adle ...
c语言编译系统内部的工作原理
c语言编译系统内部的工作原理程序生命周期概述一个程序的生命周期可以被分成四个部分:
创建
编译
运行
退出
以一个简单的 helloworld.c 程序为例:
123456#include<stdio.h>int main(){ printf("hello world!"); return 0;}
编译的详细过程通过这条命令
1gcc -o helloworld helloworld.c
即可完成对 helloworld.c 的编译,生成可执行程序 hello
这是我们最常使用的编译手段(gcc)
看似很简单,一个命令就能把源码编译成了可执行程序。
实际上,编译的过程可以细分为四个步骤
预处理(Pre-processor)(cpp)
编译(Compiler)(ccl)
汇编(Assembler)(as)
链接(Linker)(ld)
预处理
预处理器会根据以#开头的代码段,来修改原始程序
如:helloworld.c 程序中引入头文件——stdio.h预处理器会读取其中的内容,将其中的内容直接插入到源程序 ...
第三讲 分组密码
分组密码概述明文消息,编码成二元数字序列后,划分为长度为m的一个个组块。
加密:每个长度为m的明文组块分别在密钥K的控制下变成一个个长度为n的密文组块
解密:每个长度为n的密文组块通过密钥K还原成一个个长度为m的明文组块
分组密码通常研究以下三种情况:
如果m>n 说明密文比明文短,存在数据压缩
如果m<n 说明密文比明文长,存在数据拓展
如果m=n 说明既没有数据压缩,也没有数据拓展
分组密码的常见设计方法当今绝大多数的分组密码都是乘积密码。
所谓乘积密码,就是以某种方式连续执行两个或者多个密码。
常见的乘积密码都是迭代密码。
以下是两种用迭代法设计分组的常用方法
Feistel结构DES采用此结构
上一轮的右半部分成为这一轮的左半部分。
上一轮的左半部分和一个复杂的值(右半部分和每一轮的密钥Ki进行运算)进行异或,异或后的结果成为这一轮的右半部分。
SPN结构AES采用此结构
这种结构分两层:第一层:S层,也称为替换层,主要起到扰乱的作用。
第二层:P层,也称为置换层,主要起到扩散的作用。
数据加密标准——DES此加密方案由IBM公司提交,被美国国家标准局 ...
第二讲 古典密码
古典密码密码学的主要任务
加密——密码编码
解密——密码分析
密码学要保障的几个性质
机密性
数据完整性
鉴别
抗抵赖性
保密通信机制
明文——(密钥)加密——密文
密文——(密钥)解密——明文
符号
序号
含义
表示符号
空间符号
1
明文
m
P
2
密文
c
C
3
密钥
k
K
4
加密
Enc
5
解密
Dec
密码体制的分类及特点根据密码算法所用的密钥数量分为:
对称密码体制
非堆成密码体制
根据对明文信息的处理方式分为:
分组密码
序列密码(流密码)
根据是否能进行可逆的加密变换
单向函数变换体制
双向变换密码体制
单表替代密码一般单表替代密码例:
置换对应关系如下:
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
q
w
e
r
t
y
u
i
o
p
a
s
d
f
g
h
j
k
l
z
x
c
v
b
n
m
移位密码P = C = K = { 0 ,1 ,2……25 }
加密: c = Enc k(m)= m + k (mod 26)
解密: ...