攻防世界 hackme

攻防世界 hackme

链接

hackme

思路

sub_406D90是一个随机数生成函数(根据返回值猜的,静态我看不太出来,动态多调试几次可能会发现生成的数字不同)。

v15是输入的,v16是需要相等的。

逻辑大概就是随机抽10个数用解(加)密算法计算结果与数据段的数据比较,如果全相等即正确。

python逆向代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import bitstring


s = "DufhbmfpG`imosewUglpt"
l = [95, 242, 94, 139, 78, 14, 163, 170, 199, 147, 129, 61, 95, 116, 163, 9, 145, 43, 73, 40, 147, 103]
res = []
# for i in range(10):
for i in range(22):
v18 = 0
v19 = 0
temp1 = l[i]
temp2 = i+1
while v18 < temp2:
v18 += 1
v19 = 1828812941 * v19 + 12345
v13 = (v19 ^ temp1) & 0xFF
res.append(v13)

print("".join([chr(i) for i in res]))

flag:flag{d826e6926098ef46}

由于原先的代码与的时候存的是int8八位数据, 所以异或后和0xFF与一下

攻防世界 Reversing-x64Elf-100

Reversing-x64Elf-100

链接

Reversing-x64Elf-100

思路

64位elf直接丢进ida,注意这是一个int64位数组,24字节。可以当作一个3*8的二维数组。i%3确定的是行,2*(i/3)确定的是列。

python脚本

1
2
3
4
5
6
7
8
import bitstring


s = "DufhbmfpG`imosewUglpt"
res = []
for i in range(12):
res.append(ord(s[(i%3*7)+2*(i//3)]) - 1)
print("".join([chr(i) for i in res]))

flag:Code_Talkers

攻防世界 IgniteMe

IgniteMe

链接

IgniteMe

思路

丢进exeinfo

32位,IDA打开

已知前四个字符是EIS{ 最后一个字符是}

查看验证输入的函数

写一个逆向的算法即可、

与后-72与0x55在异或一次,记得与的优先级较低,用括号防止运算顺序错误。

idc脚本提取前面的数据。

[13, 19, 23, 17, 2, 1, 32, 29, 12, 2, 25, 47, 23, 43, 36, 31, 30, 22, 9, 15, 21, 39, 19, 38, 10, 47, 30, 26, 45, 12, 34, 4]

python脚本逆运算:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import bitstring


def fun(ch, temp):
return ((ch ^ ord(temp)) - 72) ^ 85

l = [13, 19, 23, 17, 2, 1, 32, 29, 12, 2, 25, 47, 23, 43, 36, 31, 30, 22, 9, 15, 21, 39, 19, 38, 10, 47, 30, 26, 45, 12, 34, 4]
s = r"GONDPHyGjPEKruv{{pj]X@rF"
res = []
c = 0
k = 0
for i in range(len(s)):
res.append(fun(l[i],s[i]))
if res[i] >= 65 and res[i] <= 90:
res[i] += 32
elif res[i] >=97 and res[i] <= 122:
res[i] -= 32

print(''.join([chr(i) for i in res]))

flag:wadx_tdgk_aihc_ihkn_pjlm

渗透测试CKC

渗透测试

概念

渗透测试在测试过程中广泛使用”黑客“的攻击技术和攻击程序,可以模拟实际网络中的攻击,因此是一种更加直观的测试方法。
渗透测试不仅要例举出被测系统可能存在的漏洞,还要验证这些漏洞。
渗透测试的结果对于一个系统的安全性评估更具有参考价值

WEB渗透测试

对Web应用程序的测试,是对渗透测试的研究热点之一

  1. Web技术的发展,Web应用程序的功能不断增强,网站的规模不断增大,导致安全隐患不断增多;
  2. Web网站的访问量巨大,而且用户对网页的和Web应用程序的访问往往绕过了各种安全防护措施,因此容易造成巨大的损失;

测试模型

渗透测试的复杂性使得测试需要依据一定的测试模型来进行;
一个测试模型的优劣直接影响测试的效率,完整性和准确性。
比较有名的测试模型:

  • 美国海军实验室的FHM模型
  • KSAJ公司的OOM模型
  • ISECOM的OSSTMM模型

自动化测试工具

自动化渗透测试工具一直是研究的热点,研究人员试图开发出安全有效的渗透测试工具,以提高测试的效率和准确性,同时降低测试的成本。
目前比较成熟的渗透测试工具(半自动化,仍需人工干预):

  • CoreImpact
  • Metasploit Framework (MSF)

FHM模型

FHM模型使用的是”缺陷假设方法“对目标系统进行测试,逐一例举目标网络缺陷并测试之。
FHM测试分成四个阶段:

  1. 缺陷产生:列出怀疑存在的缺陷的清单。

  2. 缺陷验证:验证每个缺陷是否存在,不存在还是无法测试。

  3. 缺陷归纳:分析每个被验证的缺陷所具有的安全脆弱性的一般化

  4. 缺陷消除:修复缺陷或使用额外的控制手段限制残留缺陷的危险性。

后三个阶段循环进行,直到到达渗透测试目标,这种方法实际上就是在研究自然科学常用的”假设,校验“的方式,是最直接的渗透测试方法。

OSSTMM

开放源码安全测试方法模型(OSSTMM)是目前被渗透测试人员广泛采用或者参考的测试模型,分成了6个阶段:
1.信息安全测试 2.过程安全测试 3.互联网安全测试 4.通信安全测试 5.无线安全测试 6.物理安全测试
每个测试又分成若干个模块,各个模块由若干任务组成。每一个任务是对目标系统一项测试。
特点:各个模块之间是有一定顺序性的,每个模块都有输入和输出;输入实质性模块需要用到的信息,而输出是模块各项任务执行完毕后的结果。
一个模块有可能是另一个模块的输入,这样就可以把目标系统的测试有机的组织起来,提高测试的效率。

OMM模型(攻击操作模型)将测试的重点放在目标系统对攻击的繁育能力上,将对目标系统的典型攻击分成了五个阶段:

1.侦查 2.分析和攻击策略生成 3.漏洞攻击 4.开设后门 5.控制目标主机

Cyber killchain

由 Lockheed Martin 开发的 Cyber KillChain®框架是 Intelligence DrivenDefense®模型的一部分,用于预防和识别网络入侵活动。 该模型确定攻击者必须完成什么才能实现其目标。

reconnaissance(侦查)

Harvesting email addresses,conference information,etc.

收集电子邮件地址,会议信息等等

主动的信息搜集

通过直接访问,扫描网站这类流量经过网站的网站行为称为主动方式。

  1. nessus

  2. ```
    kali
    whatweb xxx.cm

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65

    3. zenmap

    4. IBM security appscan standard

    5. AWVS

    6. 弱口令,敏感文件,网站备份,验证码机制,未授权访问

    ###### 被动的信息搜集

    利用第三方服务了解目标,whois查询,漏洞搜索,googlehack。

    1. whois

    kali

    whois xxxx.com

    2. zoomeye

    3. googlehack

    搜索职员信息,使用社工等

    4. github,gitee

    搜索其代码

    ###### 资产暴露面

    ```mermaid

    graph TB

    A[网络场景] -->B1[可访问服务器信息]
    A[网络场景] -->B2[网络设备信息]
    A[网络场景] -->B3[网络拓扑信息]
    B1 --> C1[各类应用]
    B1 --> C2[服务与端口]
    B1 --> C3[操作系统信息]
    C1 --> D1[WEB相关应用]
    C1 --> D2[非WEB相关应用]
    D1 --> E1[WEB前端框架]
    D1 --> E2[WEB应用框架]
    D1 --> E3[WEB开发框架]
    D1 --> E4[WEB服务器端语言]
    D1 --> E5[WEB服务器端软件]
    D1 --> E6[WEB数据库]
    D2 --> E7[数据库软件]
    D2 --> E8[邮件服务器]
    D2 --> E9[DNS服务器]
    D2 --> E10[FTP服务器]
    D2 --> E11[SSH服务器]
    B2 --> C4[交换机/路由器]
    B2 --> C5[VPN]
    B2 --> C6[VoIP]
    B2 --> C7[防护设备]
    B2 --> C8[CDN]
    C7 --> D3[传统防火墙]
    C7 --> D4[IDS]
    C7 --> D5[IPS]
    C7 --> D6[WAF]
    C7 --> D7[云主机防护]

工具Wappalyzer,namp,waf00f

weaponization(武器化)

Coupling exploit with backdoor into deliverable payload

联合开发武器,制作可以交付的工具

准备工具

信息搜集工具,漏洞扫描工具,密码相关工具,HTTP代理工具,中间人工具,漏洞利用工具,权限提升工具,远控/后门工具,端口转发工具,清理痕迹工具,隐藏文件工具

漏洞准备

搜集,挖掘,购买

恶意文件准备

同上

恶意服务器准备

域名申请/购买,恶意服务器租赁,已经被黑的服务器

肉鸡准备

用作DDOS的僵尸网络肉鸡,购买已经植入攻击目标的木马,用做跳板/木马的肉鸡。

  1. 漏洞扫描工具

    recondog,AWVS

  2. http代理工具,中间人工具

    responder,brupsuite,

  3. 漏洞利用,权限提升,远控后门

    windows-kernel-exploits-master,cobalt strike,msf

  4. 恶意软件,服务器,肉鸡准备

    exploit database,cobalt strike

delivery(模拟攻击)

Delivering weaponized bundle to the victim via email,web,USB,etc.
使用邮件,网页,USB等方式将攻击程式发送给受害者

攻击模拟

从一个点,渗透面,随后点面结合的方法获取到最后的目标。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
graph TB

A[服务器] -->B1[漏洞攻击]
A[服务器] -->B2[口令攻击]
A[服务器] -->B3[逻辑攻击]
A[服务器] -->B4[DoS攻击]
B1 --> C1[应用漏洞]
B1 --> C2[系统漏洞]
B1 --> C3[其他漏洞]
C1 --> D1[WEB相关应用]
C1 --> D2[非WEB相关应用]
D1 --> E1[常规漏洞]
D1 --> E2[通用漏洞]
D2 --> E3[各类web server]
D2 --> E4[各类数据库]
D2 --> E5[ftp]
D2 --> E6[邮件服务器]
D2 --> E7[dns]
D2 --> E8[ssh]
D2 --> E9[openssl]
C2 --> D3[攻击目标]
C2 --> D4[漏洞形式]
D3 --> E10[系统网络服务]
D3 --> E11[系统设备驱动]
D3 --> E12[系统内核本身]
D4 --> E13[缓冲溢出攻击]
D4 --> E14[return-to-libc攻击]
D4 --> E15[格式化字符串攻击]
D4 --> E16[整数溢出和整数符号攻击]
D4 --> E17[dangling pointer攻击]
D4 --> E18[符号链接攻击]
D4 --> E19[竞争条件攻击]
D4 --> E20[core文件攻击]
D4 --> E21[dll攻击]
D4 --> E22[SUID文件攻击]
D4 --> E23[全局可写文件攻击]
D4 --> E24[系统内核缺陷]
C3 --> D5[应用配置问题]
C3 --> D6[信息泄露]
B2 --> C4[暴力破解]
B2 --> C5[口令嗅探]
B2 --> C6[口令重放]
C5 --> D5[窃听widnows口令]
C5 --> D6[中间人攻击]
C6 --> D7[传递哈希攻击]
C6 --> D8[传递kerberos ticket]
B3 --> C7[漏洞发现]
B3 --> C8[越权攻击]
B3 --> C9[商业逻辑攻击]
C7 --> D9[测试客户端数据传输]
C7 --> D10[测试客户端数据输入]
C7 --> D11[测试客户端组件逻辑]
C7 --> D12[测试多阶段过程逻辑]
C7 --> D13[测试信任边界]
C7 --> D14[测试业务逻辑]
C8 --> D15[水平越权]
C8 --> D16[垂直越权]
C9 --> D17[电子邮件提取]
C9 --> D18[垃圾评论]
C9 --> D19[收集用户信息 获得商业情报 控制商进程]
  1. 身份验证

    用户注册,用户登录,修改密码,密码重置,自动登录功能,用户证书传输,用户锁定功能,其他方式登入

  2. 会话管理

    cookie属性,cookie重放攻击,会话令牌分析,会话令牌泄露,会话固定攻击,会话结束/超时,session变量重载

  3. 访问控制

    功能滥用,垂直权限提升,水平权限提升

  4. 输入处理

    sql注入,oracle sqli,mysql sqli,sql server sqli,ms access sqli, postgresql sqli,文件上传漏洞,任意文件下载漏洞,Nosql注入,LDAP注入,ORM注入,SOAP注入,XPATH注入,XML注入,服务端包含漏洞,目录穿越漏洞,SSRF漏洞,邮件头部漏洞,命令注入漏洞,本地文件包含漏洞,远程文件包含漏洞,远程命令/代码执行漏洞,HTTP参数污染漏洞,HTTP响应分个漏洞,HTTP请求偷渡漏洞,测试Web服务,测试websocket。

  5. 加解密

    测试SSL/TLS协议

  6. 信息泄露

    error code,stack traces,敏感信息分类。

  7. 客户端

    内容欺骗漏洞,XSS,CSRF,js注入漏洞,CSS注入漏洞,html注入漏洞,客户端资源编辑漏洞,客户端跨站资源共享漏洞,测试flash跨站问题,点击劫持漏洞

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
graph TB

A[客户端] -->B1[钓鱼邮件]
A[客户端] -->B2[钓鱼短信]
A[客户端] -->B3[钓鱼wifi]
A[客户端] -->B4[漏洞钓鱼]
A[客户端] -->B5[多种方式组合钓鱼]
A[客户端] -->B6[水坑挂马]
A[客户端] -->B7[USB摆渡攻击]
B1 --> C1[使用邮箱]
B1 --> C2[攻击方式]
C1 --> D1[使用与公司等邮箱相似的邮箱]
C1 --> D2[使用同事 上级 朋友等的邮箱发送 需要先攻陷]
C2 --> D3[使用office做附件 引诱运行宏病毒]
C2 --> D4[使用欺骗手段 引诱运行附件中的src等格式程序]
C2 --> D5[使用钓鱼网站或挂马网站等]
B2 --> C3[短信发送者]
B2 --> C4[攻击方式]
C3 --> D6[伪基站伪造短信发送者]
C4 --> D7[下载安装恶意app]
C4 --> D8[引诱登录钓鱼网站]
B3 --> C5[获取通信信息]
B4 --> C6[使用xss漏洞钓鱼]
B6 --> C7[攻陷目标个人或群体经常活动的网站]
B6 --> C8[挂马攻击]

参考书籍 欺骗的艺术

exploitation(漏洞利用)

Exploiting a vulnerability to execute code on victim’s system
利用漏洞在受害者系统上执行 代码

installation(安装恶意软件)

Installing malware on the asset
在有价值的设备上安装恶意软件

在实际渗透过程中,我们成功入侵了目标服务器。接着我们想在本机上通过浏览器或者其他客户端软件访问目标机器内部网络中所开放的端口,比如内网的3389端口、内网网站8080端口等等。传统的方法是利用nc、lcx等工具,进行端口转发。
适用端口转发的网络环境有以下几种:
1.服务器处于内网,可以访问外部网络。
2.服务器处于外网,可以访问外部网络,但是服务器安装了防火墙来拒绝敏感端口的连接。
3.服务器处于内网,对外只开放了80端口,并且服务器不能访问外网网络。
对于以上三种情况,lcx可以突破1和2二种,但是第3种就没有办法了,因为lcx在使用中需要访问外部网络。
这里的第3种就可以用到我们今天重点要讲的SOCKS代理。Socks是一种代理服务,可以简单地将一端的系统连接到另外一端。支持多种协议,包括http、ftp请求及其它类型的请求。它分socks 4 和socks 5两种类型,socks 4只支持TCP协议而socks 5支持TCP/UDP协议,还支持各种身份验证机制等协议。其标准端口为1080。

恶意软件:安装后门程序,远控木马

工具

Earthworm · EW 是一套便携式的网络穿透工具

Proxifier是一款非常强大的代理客户端,可以通过指定IP、端口、域名、程序、用户名密码授权等模式设置代理规则,类似于SocksCap。

command & control(远控)

Command channel for remote manipulation of victim
使用命令通道远程操纵受害者

打通通道,权限维持

内网渗透

通过常规web渗透,已经拿到webshell。那么接下来作重要的就是探测系统信息,提权,针对windows想办法开启远程桌面连接,针对linux想办法使用反弹shell来本地连接。

与外网渗透不同,内网渗透需要更多的随机性和突破口,情况较为复杂,遇到障碍,有时可以换种思路突破,很多时候则无奈的只能止步于此。

内部侦查
搜集被入侵主机中的信息

用户和组相关,系统相关,网络相关,进程相关,文件相关,防火墙相关,DOMEX

获取域相关的信息

查询域用户,查询域组名称,查询域管理员,查看域控制器

内网扫描
监听信息

监听局域网中的数据包获取敏感信息,持续监听被入侵主机中的敏感信息

内部渗透
口令攻击

弱口令,社工信息组合的口令,穷举爆破,口令漏洞

漏洞攻击
  • web应用漏洞
  • 协议漏洞
    • kerberos
    • smb
    • samba
    • openssl
数据信道
  • windows
    • powershell下载文件
    • vbs脚本下载文件
    • smb文件传输
    • nc+telnet传输
    • hta下载文件
  • linux
    • wget文件下载
    • ftp下载和上传
    • perl,ruby,python文件在下
    • tar+ssh上传
  • 高级数据传输
    • 利用其他协议
    • 修改原始数据
  • 流量劫持
  • 攻击客户端
    • 钓鱼攻击
      • 邮件
      • IM
    • 客户端漏洞
      • 浏览器
      • 浏览器插件
      • 办公软件
域渗透
信息搜集

当前用户信息 whoami /all

打当前计算机名 hostname

查看域所有用户 net user /domain

查看单个域用户信息 net user xxxx /domain

查看本地管理员组 net localgroup administrators

查看域管理组 net group “Domain Admins” /dimain

定位域控主机 net time,nslookup -type=SRV_ldap_tcp corp,ping net time主机,ifconfig查看dns

权限提升

mimlkatz读取域用户内存明文密码

清楚票据 klist purge

kekeo进行提权

查看共享,获得域控权限

添加域管理员
psexec开启远程桌面
端口转发
远控

PHP伪协议

PHP伪协议

file协议
条件

php.ini

  • allow_url_fopen:off/on
  • allow_url_include:off/on
作用

用来访问本地文件系统,ctf中读取文件且不受allow_url_fopen和allow_url_include的影响
include()/require()/include_once()/require_once()参数可控的情况下,如导入为非.php文件,则仍按照php语法进行解析,这是include()函数所决定的。

php协议
条件

php.ini

  • allow_url_fopen:off/on
  • allow_url_include:off/on php://input php://stdin php://memory php://temp需要on
    作用
    php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是php://filter和php://input,php://filter用于读取源码,php://input用于执行php代码
    说明
    PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符,
    内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。
协议 作用
php://input 可以访问请求的原始数据的只读流,在POST请求中访问POST的data部分,在(form表单属性)enctype=”multipart/form-data” 的时候php://input 是无效的。
php://output 只写的数据流,允许以 print 和 echo 一样的方式写入到输出缓冲区。
php://fd (>=5.3.6)允许直接访问指定的文件描述符。例如 php://fd/3 引用了文件描述符 3。(文件描述符是内核用来标识文件的非负整数)
php://memory php://temp (>=5.1.0)一个类似文件包装器的数据流,允许读写临时数据。两者的唯一区别是 php://memory 总是把数据储存在内存中,而 php://temp 会在内存量达到预定义的限制后(默认是 2MB)存入临时文件中。临时文件位置的决定和 sys_get_temp_dir() 的方式一致。
php://filter (>=5.0.0)一种元封装器,设计用于数据流打开时的筛选过滤应用。对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、file() 和 file_get_contents(),在数据流内容读取之前没有机会应用其他过滤器。
php://filter协议参数
参数 描述
resource=<要过滤的数据流> 必须。它指定了你要筛选过滤的数据流。
read=<读链的过滤器> 可选项。可以设定一个或多个过滤器名称,以管道符(**)分隔。
write=<写链的过滤器> 可选项。可以设定一个或多个过滤器名称,以管道符(\ )分隔。
<; 两个链的过滤器> 任何没有以 read= 或 write= 作前缀的筛选器列表会视情况应用于读或写链。
过滤器:https://www.php.net/manual/zh/filters.php
示例
  1. filter://read=convert.base64-encode/resource=[文件名]
  2. php://input
zip:// & bzip2:// & zlib:// 协议
示例
  1. zip://
    zip://[压缩文件绝对路径]%23[压缩文件内的子文件名](#编码为%23)

  2. compress.bzip2://file.bz2
    http://127.0.0.1/include.php?file=compress.bzip2://E:\phpStudy\PHPTutorial\WWW\phpinfo.bz2

  3. compress.zlib://file.gz
    http://127.0.0.1/include.php?file=compress.zlib://E:\phpStudy\PHPTutorial\WWW\phpinfo.gz

data协议
条件
http:// & https:// 协议
条件
  • allow_url_fopen:on
  • allow_url_include:on
    作用
    常规 URL 形式,允许通过 HTTP 1.0 的 GET方法,以只读访问文件或资源。CTF中通常用于远程包含。
phar://协议

phar://协议与zip://类似,同样可以访问zip格式压缩包内容

示例
http://127.0.0.1/include.php?file=phar://E:/phpStudy/PHPTutorial/WWW/phpinfo.zip/phpinfo.txt

PHP反序列化漏洞原理

PHP反序列化

简述

序列化是将对象保存为可保持或可传输的格式的过程(其实我觉得对象的内存dump下来也可以保存,但是传输的过程中会不会造成信息的失真,或者说传输的数据大小是否会变大,这个需要进行试验分析。)反序列化是与其相对的一个概念,它将数据流(其实每次输入我总感觉是一个json的字符串当然说其为数据流也没问题。)转换为对象。

作用

若反序列化的参数可控,则可以构造任意变量。若代码中有一个类则可以构造此类的对象。

反序列化格式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
类型:d			->d代表一个整型数字
O:d -> 对象 ->d代表该对象类型的长度,例如上述的azhe类对象长度为4,原生类对象Error长度为5
a:d -> 数组 ->d代表数组内部元素数量,例如array('a'=>'b','x'=>1)有两个元素
s:d -> 字符串 -dN代表字符串长度,例如abc序列化后为s:3:"abc";
i:d -> 整型 ->d代表整型变量的值,例如300序列化后的值则为i:300;

a - array
b - boolean
d - double
i - integer
o - common object
r - reference
s - string
C - custom object
O - class
N - null
R - pointer reference
U - unicode string
例子
1
2
3
4
5
6
7
8
9
1 <?php
2 class test{
3 private $test1="hello";
4 public $test2="hello";
5 protected $test3="hello";
6 }
7 $test = new test();
8 echo serialize($test); // O:4:"test":3:{s:11:" test test1";s:5:"hello";s:5:"test2";s:5:"hello";s:8:" * test3";s:5:"hello";}
9 ?>

通过对网页抓取输出是这样的 O:4:”test”:3:{s:11:”\00test\00test1”;s:5:”hello”;s:5:”test2”;s:5:”hello”;s:8:”\00*\00test3”;s:5:”hello”;}
当序列化字符串设定的类的成员属性个数大于实际个数的时候,会绕过wakeup函数。

常见魔术方法
1
2
3
4
5
6
7
8
9
10
11
12
__wakeup() //使用unserialize时触发
__sleep() //使用serialize时触发
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发——对象调用一个没有声明的方法时,触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__toString() //把类当作字符串使用时触发 echo 对象; $text=$test+$对象;
__invoke() //当脚本尝试将对象调用为函数时触发

例子

后续遇到了再补充吧,最近对在学习渗透相关的内容。

攻防世界 re4-unvm-me

攻防世界 re4-unvm-me

链接

re4-unvm-me

思路

  1. 看到pyc,丢去在线反编译网站得到代码。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #!/usr/bin/env python
    # visit https://tool.lu/pyc/ for more information
    import md5
    md5s = [
    0x831DAA3C843BA8B087C895F0ED305CE7L,
    0x6722F7A07246C6AF20662B855846C2C8L,
    0x5F04850FEC81A27AB5FC98BEFA4EB40CL,
    0xECF8DCAC7503E63A6A3667C5FB94F610L,
    0xC0FD15AE2C3931BC1E140523AE934722L,
    0x569F606FD6DA5D612F10CFB95C0BDE6DL,
    0x68CB5A1CF54C078BF0E7E89584C1A4EL,
    0xC11E2CD82D1F9FBD7E4D6EE9581FF3BDL,
    0x1DF4C637D625313720F45706A48FF20FL,
    0x3122EF3A001AAECDB8DD9D843C029E06L,
    0xADB778A0F729293E7E0B19B96A4C5A61L,
    0x938C747C6A051B3E163EB802A325148EL,
    0x38543C5E820DD9403B57BEFF6020596DL]
    print 'Can you turn me back to python ? ...'
    flag = raw_input('well as you wish.. what is the flag: ')
    if len(flag) > 69:
    print 'nice try'
    exit()
    if len(flag) % 5 != 0:
    print 'nice try'
    exit()
    for i in range(0, len(flag), 5):
    s = flag[i:i + 5]
    if int('0x' + md5.new(s).hexdigest(), 16) != md5s[i / 5]:
    print 'nice try'
    exit()
    continue
    print 'Congratz now you have the flag'

  2. 代码审计,65个字符的flag。五个一组,要么自己开始爆破,要么直接解密md5。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
override fun onClick(v: View?) {
if (v == null) {
return
}
when (v.id) {
R.id.btGoLogin -> {
if (!nameLegal) {
Toast.makeText(this, "name illegal! Please retry.", Toast.LENGTH_SHORT).show()
return
}
if (!psdLegal) {
Toast.makeText(this, "password illegal! Please retry.", Toast.LENGTH_SHORT)
.show()
return
}
//name&psd均合法
Toast.makeText(this, "Login success!", Toast.LENGTH_SHORT).show()
//跳转到登录成功页面
val intent: Intent = Intent(this, LoginActivity::class.java)
intent.putExtra(KEY_LOGIN_NAME, etLoginName.text.toString())
intent.putExtra(KEY_LOGIN_PSD, etLoginPsd.text.toString())
startActivity(intent)
}
}
}

渗透测试 信息搜集

信息搜集

​ 黑客为了更加有效地实施攻击而在攻击前或攻击过程中对目标的所有探测活动,在整个渗透过程中大约60%的时间被用来从事信息收集工作。

信息收集的作用

  1. 了解组织安全架构
  2. 描绘网络拓扑
  3. 缩小攻击范围
  4. 建立脆弱点数据库

信息收集分类

  1. 主动信息搜集

    与目标主机进行直接交互,从而拿到目标信息,缺点是会记录自己的操作信息。

  2. 被动信息搜集、

    不与目标主机进行直接交互,通过搜索引擎或者社会工程等方式间接的获取目标主机的信息。

渗透测试中的敏感信息泄露包括

  • 目录遍历
  • web服务器配置不当引起的目录
  • 文件读取(下载/包含)引起的目录穿越
  • 报错(调试)信息
  • 绝对路径信息泄露
  • 数据库运行错误信息泄露
  • 调试信息泄露
  • 测试信息泄露
  • 运行环境信息泄露
备份文件

vim编辑器备份文件(.swp),WEB-INF文件,数据库文件信息,日志信息,帮助信息 ,robots.txt,crossdomin.xml,sitemap.xml,后台目录,安装包,上传目录,mysql管理页面,编辑器,探针文件,Web框架,CMS类型,HTML中的注释,cookie中的关键字,页面底部版权信息,web中间件,开发语言,数据库。

第三方软件应用

github上泄露源码、数据库、邮箱密码泄漏
网盘信息泄露
QQ群信息泄露
SVN源代码
CVS源代码
DS_Store文件

网络信息

运维监控等系统弱口令
网络拓扑泄漏

Whois信息收集

whois是用来查询域名的IP以及所有者等信息的传输协议。 whois信息可以获取关键注册人的信息,包括注册商、所有者、所有者联系邮箱、联系电话、域名注册时间、域名到期时间、域名状态、DNS服务器等。

企业信息

员工信息(手机号码、邮箱、姓名等),组织框架、企业法人、企业综合信息等。
其中员工信息收集是信息收集中的一项重要工作,员工信息包括:
员工基本信息:员工姓名,员工工号、员工家庭及交际信息、上网习惯等。
员工身份信息:员工简历,员工身份证,手机号,生日,家乡,住址等个人信息。
员工社交账号信息:QQ号,QQ群,微博,微信,支付宝,员工邮箱账号等。

收集企业信息可以获取相关的员工信息(手机号码、邮箱、姓名等),组织框架、企业法人、企业综合信息等。

收集企业信息的作用

提供更多的攻击入口
方便攻击者定点打击

企业邮箱信息收集方法

常见的在线邮箱收集网站,这些网站通过爬虫,搜索引擎等方式,获取互联网上暴露的邮箱地址。
http://www.skymem.info/
https://hunter.io/
https://email-format.com/


https://www.tianyancha.com 天眼查
http://www.miitbeian.gov.cn/icp/publish/query/icpMemoInfo_showPage.action# ICP备案查询
http://www.beian.gov.cn/portal/recordQuery 公安部备案查询
天眼查账号密码可以通过微信小程序“号多多”获取

子域名枚举

子域名枚举是为一个或多个域查找子域的过程。它是信息收集阶段的重要组成部分。

为什么要进行子域名枚举?
子域名枚举可以显示很多域名或者子域名,它们在安全评估的范围内,从而增加了发现漏洞的机会。
发现运行在隐藏的被遗忘的子域名上的应用程序可以使我们发现关键的漏洞。
通常情况下,同一组织的不同域名或应用程序会出现相同的漏洞。

搜索引擎查询(site:xxx.com) googlehac
在线查询接口
http://tool.chinaz.com/subdomain/
http://i.links.cn/subdomain/
http://subdomain.chaxun.la/
http://searchdns.netcraft.com/
https://www.virustotal.com/
https://censys.io/
https://x.threatbook.cn/
https://phpinfo.me/domain/
https://dnsdumpster.com/

子域名暴力猜解工具

layer子域名挖掘机
Kali recon-ng
wydomain: https://github.com/ring04h/wydomain
subDomainsBrute: https://github.com/lijiejie/
Sublist3r: https://github.com/aboul3la/Sublist3r

DNS查询/枚举

host命令来查询dns服务器a记录、mx记录 (http://tool.chinaz.com/dns/ https://tool.lu/dns/)
DNS暴力破解:fierce
域传送漏洞

证书透明度公开日志枚举

https://crt.sh/
https://certdb.com/domain/sangfor.com.cn
https://censys.io/

旁站信息

旁站是和目标网站在同一台服务器上的其它的网站
主站无法获取权限的情况下,作为攻击入口

旁站信息收集

http://s.tool.chinaz.com/same
https://phpinfo.me/bing.php
http://www.webscan.cc

端口扫描

C段信息

C段指的是同一内网段内的其他服务器,每个IP有ABCD四个段,举个例子,192.168.0.1,A段就是192,B段是168,C段是0,D段是1,而C段嗅探的意思就是拿下它同一C段中的其中一台服务器,也就是说是D段1-255中的一台服务器,然后利用工具嗅探拿下该服务器。

  1. 在线接口查询
    http://www.webscan.cc
    https://phpinfo.me/bing.php
    https://www.chinabaiker.com/cduan.php
  2. 扫描工具
    Nmap扫描C段

真实IP地址

CDN介绍

CDN的全称是Content Delivery Network(内容分发网络),通过在网络各处的加速节点服务器来为网站抵挡恶意流量,把正常流量进行转发。用简单点的话来说,CDN一般有三个作用:

  1. 跨运营商加速:我们自己的网站常常只属于一个运营商(比如:电信),而加速节点遍布每家运营商,于是和网站不同运营商(比如:联通)的用户访问起来就不会那么慢了。

  2. 缓存加速:很多的静态资源以及一部分页面更新都是比较慢的(比如首页),这个时候CDN就会根据浏览器的max-age和last-modified值以及管理员的预设值来进行缓存,于是很多流量CDN节点就不会每次都来向网站请求,CDN节点可以直接自作主张地将命中的缓存内容返回。

  3. 恶意流量过滤:这是CDN非常重要的一个作用,也是很多网站会用CDN的原因,因为CDN能为我们抵挡攻击大流量攻击、普通的攻击(比如注入等),只有正常流量才会转发给网站。

验证是否存在CDN
  1. 使用各种多地 ping 的服务,查看对应 IP 地址是否唯一,如果不唯一多半是使用了CDN,多地 Ping 网站有:
    http://ping.chinaz.com/
    http://ping.aizhan.com/
  2. 修改本地hosts文件,强行将域名与IP解析对应,然后访问域名查看页面是否变化。
网站真实IP

查看IP与域名绑定的历史记录,可能会存在使用CDN前的记录
https://dnsdb.io/zh-cn/ DNS查询
https://x.threatbook.cn/ 微步在线
http://toolbar.netcraft.com/site_report?url= 在线域名信息查询
http://viewdns.info/ DNS、IP等查询
https://tools.ipip.net/cdn.php CDN查询IP

SecurityTrails平台(DNS 记录)
https://securitytrails.com
在搜索字段中输入网站域名,然后按Enter键即可,这时“历史数据”就可以在左侧的菜单中找到真实原始IP 。

查询子域名

CDN是不便宜的,所以很多站长可能只会对主站或者流量大的子站点做了CDN,而很多小站子站点又跟主站在同一台服务器或者同一个C段内,此时就可以通过查询子域名对应的IP来辅助查找网站的真实IP,收集方法同子域名收集。
Subdomainbrute为例,仅需打开cmd进入它所在的目录输入Python subdomainbrute.py baidu.com –full即可收集百度的子域名,收集子域名后尝试以解析ip不在cdn上的ip解析主站,直到真实ip成功被获取到。

网络空间搜索引擎

常见的有以前的钟馗之眼,shodan,fofa搜索。以fofa为例,只需输入:title:“网站的title关键字”或者body: “网站的body特征”就可以找出fofa收录的有这些关键字的ip域名,很多时候能获取网站的真实ip。

利用SSL证书寻找真实原始IP

假如在www.wangsu.com上托管了一个服务,原始服务器IP是136.23.63.44,而wangsu会为你提供DDoS保护,Web应用程序防火墙等服务,以保护你的服务免受攻击。为此,你的Web服务器就必须支持SSL并具有证书。
当在端口443(https://136.23.63.44:443)上直接连接到IP时,SSL证书就会被暴露。如果攻击者扫描0.0.0.0/0,即整个互联网,他们就可以在端口443上获取在wangsu上的有效证书,进而获取提供给你的Web服务器IP。
目前Censys工具就能实现对整个互联网的扫描,Censys是一款用以搜索联网设备信息的新型搜索引擎,能够扫描整个互联网,Censys每天都会扫描IPv4地址空间,以搜索所有联网设备并收集相关的信息,并返回一份有关资源(如设备、网站和证书)配置和部署信息的总体报告。

使用国外主机解析域名

国内很多 CDN 厂商因为各种原因只做了国内的线路,而针对国外的线路可能几乎没有,此时我们使用国外的主机直接访问可能就能获取到真实IP。

网站漏洞查找

目标敏感文件泄露,例如:phpinfo之类的探针、GitHub信息泄露等。
XSS盲打,命令执行反弹shell,SSRF等。
无论是用社工还是其他手段,拿到目标网站管理员在CDN的账号,从而在从CDN的配置中找到网站的真实IP。

网站邮件订阅查找

RSS邮件订阅,很多网站都自带 sendmail,会发邮件给我们,此时查看邮件源码里面就会包含服务器的真实 IP 了。

zmap扫全网
  1. 获取CN的IP http://www.ipdeny.com/ipblocks/data/countries/cn.zone,使用zmap对全CN IP的80端口进行扫描。
    root@kali:~# zmap -p 80 -w bbs.txt -o 80.txt

  2. 使用zmap的banner-grab对扫描出来80端口开放的主机进行banner抓取。

    root@kali:~/zmap-1.2.1/examples/banner-grab# cat /root/bbs.txt |./banner-grab-tcp -p 80 -c 100 -d http-req -f ascii > http-banners.out

搜索引擎信息收集

主要收集的信息包括
  1. 搜索子域名
  2. 搜索后台管理页面
  3. 搜索泄露的敏感信息
  4. 搜索未授权访问
  5. 搜索开放端口服务
  6. 搜索过往或未修复漏洞
  7. 搜索目标相关人员信息
网络空间资产搜索引擎信息收集

网络空间搜索引擎的作用就是将互联网上公开的网络资产收集和整理,以此方便人们进行查阅和利用。网络空间可以发现了不少企业的脆弱系统,未授权访问、SQL注入、弱口令等等都是存在的。

  1. Shodan https://www.shodan.io/
  2. FOFA https://fofa.so/
  3. Zoomeye https://www.zoomeye.org/
报错(调试)信息收集

绝对路径信息收集
数据库运行错误信息收集
调试信息收集
测试信息收集
运行环境信息收集

绝对路径信息泄露

IIS等服务器在不安全的配置情况下可以通过构造不存在的文件例如abc.asp或者一些特殊字符例如~<>@等,可以爆出绝对路径

运行环境信息泄露

如:某ThinkPHP框架,在搜索框中输入恶意字符(~· · @ ! # ¥ $ % ^*<>),即可爆出该ThinkPHP版本信息
curl -i http://xxx.chk3.cn/index.php\?s\=captcha -X POST -d “_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=ls -al”

网站架构

  1. 操作系统
  2. 数据库
  3. Web中间件
  4. 网站开发语言

Web应用指纹信息

  1. Web前端框架
  2. Web应用框架
  3. Web开发框架
  4. CMS类型
  5. 指定路径下指定名称的js文件或代码。
  6. 指定路径下指定名称的css文件或代码。
  7. display:none中的版权信息。
  8. 页面底部版权信息,关键字© Powered by等。
  9. 注释掉的html代码中的内容
  10. http头中X-Powered-By中的值,有的应用程序框架会在此值输出。
  11. cookie中的关键字
  12. robots.txt文件中的关键字
  13. 404页面
  14. 302返回时的旗标
  15. title头信息
Web应用指纹信息识别工具
  1. 云悉 http://www.yunsee.cn/
  2. wappalyzer插件
  3. whatweb工具
  4. CMS识别工具
    http://whatweb.bugscaner.com/look/
Github

Github不仅能托管代码,还能对代码进行搜索,当上传并公开代码时,一时大意,会让某些敏感的配置信息文件等暴露于众。Github主要收集:

  1. 泄露源码
  2. 泄露数据库、邮箱、ftp、ssh、3389等账号
  3. 泄露的人员信息
  4. 泄露其他敏感信息
Git源代码泄露

由于当在一个空目录执行git init时,git 会创建一个.git目录。这个目录包含所有的Git存储和操作对象
git信息泄露检测手段

访问http://www.xxx.com/.git/config

Git源代码

github高级搜索 https://github.com/search/advanced
文件后缀:extension:xxx
关键词出现在文件内容:xxx in:file
关键词出现在文件路径:xxx in:path
关键词出现在仓库名称:xxx in:name
关键词出现在README.MD:xxx in:readme

SVN源代码

SVN(subversion)是源代码版本管理软件,造成SVN源代码漏洞的主要原因是管理员操作不规范。“在使用SVN管理本地代码过程中,会自动生成一个名为.svn的隐藏文件夹,其中包含重要的源代码信息。但一些网站管理员在发布代码时,不愿意使用‘导出’功能,而是直接复制代码文件夹到WEB服务器上,这就使.svn隐藏文件夹被暴露于外网环境,黑客可以借助其中包含的用于版本信息追踪的entries文件,逐步摸清站点结构。”(可以利用.svn/entries文件,获取到服务器源码、svn服务器账号密码等信息)。

检测手段 http://www.xxx.com/.svn/entries
检测工具:https://github.com/admintony/svnExploit
python SvnExploit.py -u https://www.hunantvhr.com/.svn/

CVS源代码
检测方法

http://url/CVS/Root 返回根信息
http://url/CVS/Entries 返回所有文件的结构

取回源码的命令

bk clone http://url/name dir
这个命令的意思就是把远端一个名为name的repo clone到本地名为dir的目录下。
查看所有的改变的命令,转到download的目录
bk changes

网盘信息泄露

http://magnet.chongbuluo.com/
http://www.panduoduo.net/
http://www.zhuzhupan.com/
https://www.quzhuanpan.com/
https://www.panc.cc

敏感文件、目录信息收集

  1. robots.txt
  2. crossdomin.xml
  3. sitemap.xml
  4. 后台目录
  5. 安装包
  6. 上传目录
  7. mysql管理页面
  8. phpinfo
  9. 编辑器
  10. 测试文件
  11. 网站备份文件(.rar、zip、.7z、.tar.gz、.bak、.swp)
  12. 日志信息
  13. 接口文件信息
  14. WEB—INF/web.xml文件
  15. 数据库文件
  16. 帮助信息
备份文件

​ 在网站的升级和维护过程中,通常需要对网站中的文件进行修改。此时就需要对网站整站或者其中某一页面进行备份。
​ 当备份文件或者修改过程中的缓存文件因为各种原因而被留在网站 web 目录下,而该目录又没有设置访问权限时,便有可能导致备份文件或者编辑器的缓存文件被下载,导致敏感信息泄露,给服务器的安全埋下隐患。

备份文件信息收集

收集方法:扫目录

日志信息

收集方法:fuzz目录、目录遍历、已知POC测试

帮助信息

在登录页面,如果有帮助文档,要仔细查看帮助文档的内容。

接口信息收集

http://www.xxx.xxxx:8090/wcm/services 发现wsdl接口,soapui写入shell

phpinfo信息可以告诉我们什么?

详细的操作系统信息,为提权做准备
extension_dir php扩展的路径、http_x_real_ip真实ip、web根目录和临时文件路径

allow_url_include:远程文件包含

disable_functions:表示禁用的函数名

short_open_tag 允许这种形式,并且<?=等价于<? echo

enable_dl 利用扩展库绕过disable_functions,需要使用dl()并且开启该选项

magic_quotes_gpc 它是用来实现addslshes()和stripslashes()这两个功能的,对SQL注入进行防御

open_basedir 将用户可操作的文件限制在某目录下,但是这个限制是可以绕过的。

P牛 open_basedir绕过:
https://www.leavesongs.com/bypass-open-basedir-readfile.html

WEB-INF文件信息收集

WEB-INF 是 Java 的 WEB 应用的安全目录。该目录原则上来说是客户端无法访问,只有服务端才可以访问。如果想在页面中直接访问其中的文件,必须通过 web.xml 文件对要访问的文件进行相应映射才能访问。
WEB-INF 主要包含一下文件或目录:
/WEB-INF/web.xml:Web 应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则;
/WEB-INF/classes/:含了站点所有用的 class 文件,包括 servlet class 和非 servlet class,他们不能包含在 .jar 文件中;
/WEB-INF/lib/:存放 web 应用需要的各种 JAR 文件,放置仅在这个应用中要求使用的 jar 文件 , 如数据库驱动 jar 文件;
/WEB-INF/src/:源码目录,按照包名结构放置各个 java 文件;
/WEB-INF/database.properties:数据库配置文件。

历史漏洞信息收集

查询历史漏洞,获取目标之前存在的安全问题,可以利用已知漏洞直接对目标系统进行攻击。
https://shuimugan.com/
http://www.anquan.us/
http://wooyun.webbaozi.com/

Waf信息收集

WAF也称Web应用防护系统,Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。

  1. wafw00f
  2. Nmap(http-waf-detect和http-waf-fingerprint脚本)
    Nmap探测WAF有两种脚本,一种是http-waf-detect,一种是http-waf-fingerprint。
内网入口点信息收集
  1. webmail登陆口
  2. VPN登陆口
  3. 各类oa/crm/sso系统的web入口
  4. 各类中间件web入口
  5. 各类监控系统、防火墙、虚拟化、路由器入口等
端口、服务信息收集

服务和安全是相对应的,每开启一个端口,那么攻击面就大了一点,开启的端口越多,也就意味着服务器面临的威胁越大。

收集方
  1. nmap
  2. 各种端口扫描工具

逻辑漏洞挖掘

逻辑漏洞

前言

本处所写评论均是自我猜测,后续真正有逻辑漏洞挖掘经验后我会进行更新 — 2022/04/06

产生原因

  1. 业务发展迅速

    过快的发展会导致代码安全性不高。

  2. 内部监管不严

    对代码的审核不够严谨,或者确实代码测试的环节。

  3. 开发水平不一

    代码模块由不同的人编写,编写者没有互相协调好。

  4. 第三方组件缺陷

逻辑漏洞特点

  1. 无有效自动化测试方法
  2. 利用简单
  3. k防护设备(?)
  4. 危害极大

分类

  • 登录体系安全
    1. 暴力破解
    2. cookie安全
    3. 登录验证绕过
    4. 加密测试
    5. 任意注册
  • 业务一致性
    1. 手机号篡改
    2. 邮箱和用户名篡改
    3. 订单ID篡改
    4. 商品编号篡改
    5. 用户ID篡改
    6. 流程顺序
  • 业务数据篡改
    1. 金额数据篡改
    2. 商品数量篡改
    3. 最大数限制突破
    4. 金额&优惠组合突破
  • 密码找回
    1. 分析数据包,定位敏感信息
    2. 分析找回机制
    3. 修改数据包验证
    4. 任意账号密码找回
  • 验证码突破
    1. 暴力破解
    2. 时间,次数突破
    3. 回显测试
    4. 验证码绕过测试
    5. 验证码检验机制猜解
  • 会话权限
    1. 未授权访问
    2. 水平&垂直越权测试
    3. 会话固定&会话挟持
  • 数据重放
    1. 恶意注册
    2. 短信&邮箱炸弹
    3. 内容编辑
    4. 条件竞争
    5. 信息遍历
  • 接口安全
    1. app接口webservice
    2. 邮箱&短信网关接口
    3. 数据库接口
    4. 三方接口

接口安全

  • 数据库接口
    • 查询搜索
    • 读取写入
    • 关联调用
  • 三方接口
    • Oauth(?)
    • DB API(?)
    • 分享接口
    • 跳转接口
  • 支付/订单接口
    • 金额篡改
    • 数据篡改
    • 程序异常
    • 订单遍历
  • 登录接口
    • 注册接口
    • 登录接口
    • 忘记密码
    • 用户检测
  • 短信&邮件接口
    • 验证码
    • 内容截获
    • 数据重放
    • 其他信息调用接口
  • APP接口
    • Web调用
    • 内网应用调用
    • 内置链接(结合反编译)(?获取非公开API的意思吗?)
支付接口
程序处理异常

例子:

  • 金额数量大额溢出
  • 115网盘存在支付绕过
  • wooyun-2012-05353
  • (请求重发)阿里云主机多次下订单会出现0元订单
  • (参数干扰)仍有个别参数会对金额产生影响而没有一起做签名
金额数据篡改
  • 直接更改价格 wooyun-2014-82754
  • 结合优惠促销篡改 wooyun-2016-200301
数量修改漏洞
  • 负数
  • 没有对购买数量进行限制 wooyun-2012-06708

验证码突破

  • 图形验证码易识别
  • 验证码不刷新
  • 验证码前端校验
  • 验证码前端回显
  • 存在无验证码页面
  • 验证码控制绕过
  • ….
图形验证码测试方法
验证码时间,次数测试

重复提交携带验证码的数据包,查看返回值,验证次数

验证码客户端回显测试

抓包测试,是否有回显,验证码是会被返回

验证码绕过测试

抓包,删除验证码字段,查看是否可以成功发送。

抓包,正常流程下,记录验证码厚度数据包,替换目标包中内容,直接发送,查看是否可以绕过验证码。

图片验证码突破
验证码易识别

Burpsuite抓包,随后丢进Pkav HTTP Fuzzer爆破

验证码回显

验证码出现在了前端

验证码无条件不刷新

无条件不刷新是指在某一时间段,无论登陆失败多少次,只要不刷新页面就可以对一个账号或者多个账号进行无限次的暴力破解。

验证码有条件不刷新

有条件不刷新多见于如下情况:登录失败之后,系统会打开一个新页面或者弹出一个新的警告窗口,提示用户登录失败,点击确定后返回登录界面且验证码刷新。这种情况下,只要我们不关闭新窗口或弹窗,配合使用Burpsuite的intruder模块就可以进行暴力破解了。

验证码返回状态值绕过

修改response的返回值,绕过前端的验证。

存在无验证码的页面

如果我们发现网站验证码自身并不存在缺陷,那我们可以尝试寻找一些其他的无验证码的登录页面或接口来尝试暴力破解。

(这大概就是业务水平不一定情况,因为登录接口是可以服)

验证码空值绕过

验证码空值绕过是在日常的渗透测试中很容易被我们忽略的一点,实际应用中我们可以通过直接删除验证码参数或者Cookie中的一些值来绕过判断。

数据重放
短信炸弹

burpsuits截获数据包,重放,造成短信轰炸效果。

短信炸弹 空格绕过

找回密码处,可以发送短信验证码,此处有时间频率限制,对同一目标2分钟内限一次,在手机号前面加空格即可突破频率限制

短信炸弹 \n绕过

同上

条件竞争

多线程同一时间重放。

密码找回

密码找回测试流程
  1. 尝试正常密码找回流程
  2. 选择不同的找回方式,记录所有的数据包
  3. 分析数据包,找出敏感部分
  4. 分析后台找回机制所采用的的验证手段
  5. 修改数据宝进行验证是否存在密码找回漏洞
密码找回漏洞挖掘
  1. 用户凭证暴力破解

    wooyun-2012-011833

    wooyun-2012-011720

  2. 返回凭证

    1. url返回验证码及token

      wooyun-2012-05630

      wooyun-2010-058210

    2. 密码找回凭证在页面中

      wooyun-2012-04728

    3. 返回短信验证码

      wooyun-2010-085124

  3. 邮箱弱token

    1. 时间戳的md5

      wooyun-2012-08333

    2. 用户名

    3. 服务器时间

      wooyun-2015-090226

  4. 用户凭证有效性

    1. 短信验证码

      wooyun-2010-053349

      wooyun-2010-053079

      wooyun-2010-020032

    2. 邮箱token

      wooyun-2012-012572

    3. 重置密码token

      wooyun-2010-078208

  5. 重新绑定

    1. 手机绑定

      wooyun-2012-08307

      wooyun-2010-081467

    2. 邮箱绑定

      wooyun-2015-092319

      wooyun-2010-086726

  6. 服务器验证

    1. 最终提交步骤

      wooyun-2013-018263

    2. 服务器验证可控内容

      wooyun-2014-080278

      wooyun-2010-082582

    3. 服务器验证逻辑为空

      wooyun-2015-088927

  7. 用户身份验证

    1. 账号与手机号码绑定

      wooyun-2014-080278

    2. 账号与邮箱账号绑定

      wooyun-2010-078208

      wooyun-2015-091216

  8. 找回步骤

    跳过验证步骤直接到设置新密码页面

    wooyun-2010-042404

    wooyun-2015-098765

  9. 本地验证

    1. 在本地验证服务器的返回信息,确定是否执行重置密码,但其返回信息是可控的内容,或者可以得到的内容

      wooyun-2010-069987

      wooyun-2010-083035

      wooyun-2014-069987

    2. 发送短信等验证信息的动作在本地进行,可以通过修改返回包进行控制

      wooyun-2010-020532

      wooyun-2010-020425

  10. 再找回密码处存在注入漏洞

    wooyun-2010-068060

  11. token生成

    1. token生成可控

      wooyun-2015-094242

      wooyun-2015-095729

  12. 注册覆盖

    1. 注册重复的用户名

      wooyun-2010-088709

  13. session覆盖

    wooyun-2014-085843

用户凭证暴力破解
  1. 四位或六位纯数字,验证码次数未限制
    例如:根据手机号找回密码,随便输个验证码,抓包,暴力破解验证码(假如只有四位),很快就可以破解出来。
返回凭证(验证码及token)
  1. 抓包直接返回
    例如:根据手机号找回密码,抓包,可以发现验证码直接显示verifycode=xxxx,或者由 md5 加密后显示,解密即可(同理,有的时候输入用户名,抓包可以看到返回的手机号等其他信息)。
  2. 密码找回凭证在页面中
    例如:通过密保问题找回密码,查看源码,密保问题和答案就在源码中显示。
邮箱弱token
  1. 用户名
    重置密码链接直接使用用户名来区别,改变用户名即可更改他人密码。

  2. Unix时间戳 + md5
    例如:
    通过邮箱找回密码,正常流程去邮箱查看重置密码链接,发现链接处有一串 md5 加密字符串;
    字符串解密,类似 1491293277(10位),可以判断为 Unix时间戳;
    重置他人密码只需要利用他人邮箱发送重置密码邮箱,在短时间内对 Unix时间戳 进行暴力破解,即可获得重置密码的链接。

  3. 服务器时间
    例如:利用两个帐号同时点击找回密码,去邮箱查看找回密码的链接,发现两者的随机 token 只差 1-2,而且可以猜测出为服务器时间,所以可以用一个未知帐号和一个已知帐号同时点击找回密码,稍微遍历一下随机 token,就可以构造出未知帐号的密码找回链接

用户凭证有效性
  1. 短信验证码

    例如:通过他人手机号找回密码,抓包,将他人手机号替换成自己的手机号,获取验证码,提交后修改密码。
    通过自己手机号找回密码,获取验证码后抓包,将数据包中的 username 改为他人用户名,提交后成功修改他人密码。

    2.邮箱 token
    例如:通过邮箱找回密码,访问链接重置密码,输入新密码后提交时抓包,虽然有 token,但是依然可以直接修改用户ID进而修改他人密码。

    3.重置密码token

    例如:正常流程下,对每个功能模块进行抓包,分别是发送验证码,验证验证码是否正确,获取token,重置密码;
    接下来,用他人帐号通过邮箱验证,抓包,将其中 Cookie 内从 JSESSIONID 开始的内容替换至正常流程的发生验证码包内,同时替换自己接受验证码的邮箱,提交;
    通过邮箱获取验证码后,将验证码、Cookie、他人帐号、自己邮箱替换至验证验证码模块,提交(不用在意返回是否错误);
    继续替换内至获取 token 模块,提交获取 token;
    最后将获取的 token 和上面的内容替换至最后的重置密码模块,提交成功修改密码。

    wooyun案例:https://www.secpulse.com/archives/26590.html

重新绑定
  1. 手机绑定

    例如:
    给已知账户绑定手机,查看绑定手机的URL链接中的uid参数,修改uid参数为他人的,看是否可实现将他人的账户绑定上自己的手机,之后通过手机来修改密码。
    修改个人资料处抓包,修改userId为他人,修改mobilePhone为自己的手机,看是否可实现将他人的账户绑定上自己的手机,之后通过手机来修改密码。

  2. 邮箱绑定
    例如:
    通过邮箱找回密码,URL链接中修改用户ID为他人,邮箱不变,之后通过链接看是否可以将他人账户绑定为自己的邮箱,之后通过邮箱找回密码

服务器验证
  1. 最终提交步骤
    例如:通过邮箱找回密码,最后通过链接至修改密码页面,修改密码后提交,抓包,即最后一步修改动作中的Uid参数,修改为他人的,看是否可以修改其他用户密码。

  2. 服务器验证可控内容
    例如:
    正常流程,通过手机号提交验证码找回密码处抓包,记录下这个包的内容;
    通过已知用户名找回密码,查看源代码中是否可以发现用户其他信息(比如:手机号、邮箱);
    通过发现的手机号选择通过手机找回密码,随便输入短信验证码,抓包;
    修改之前记录下的包的内容,将其中 Session id、用户ID 修改为刚刚从其他用户名抓包获得的内容,提交这个包,即可成功修改他人密码。
    woyun案例:https://www.secpulse.com/archives/13935.html

  3. 服务器验证的验证逻辑为空(绕过认证)
    例如:通过密码保护问题找回密码,抓包,将密码保护问题删除,直接修改密码,提交。

  4. 用户身份验证
    帐号与手机号的绑定
    例如:通过手机找回密码,到保存密码步骤时,输入验证码和新的密码,并修改自己的手机为他人手机,看是否可以修改他人密码。
    帐号与邮箱的绑定
    例如:通过邮箱找回密码,点击请重新发送邮件处抓包,将邮箱改为自己的邮箱,通过链接成功修改密码w.secpulse.com/archives/13935.html

找回步骤

跳过验证步骤,找回方式,直接到设置新密码页面。

越权

​ 越权漏洞是Web应用程序中一种常见的安全漏洞。它的威胁在于一个账户即可控制全站用户数据。越权漏洞的成因主要是因为开发人员在对数据进行增、删、改、查询时对客户端请求的数据过分相信而遗漏了权限的判定。而且属于逻辑漏洞的一种,防护和检测都不好做。

越权类型
  1. 水平越权:相同级别(权限)的用户或者同一角色不同的用户之间,可以越权访问、修改或者删除的非法操作,如果出现此漏洞,可能会造成大批量的数据泄漏,严重的甚至会造成用户信息被恶意篡改。

  2. 垂直越权:不同级别之间或不同角色之间的越权。

    1. 向上越权
      普通用户可以执行管理员权限,比如发布文章、删除文章等操作。

    2. 向下越权

      一个高级用户可以访问低级用户信息(暴露用户隐私)。

易发生的地方
  1. 基础参数:通过修改一下参数就可以产生水平越权,例如查看用户信息页面 URL 后加上自己的 id 便可查看,当修改为他人的id号时会返回他人的信息。再比如cookie中的参数就作为用户的凭据,修改这个凭据便可以其他用户身份通过验证。

  2. 多阶段验证:多阶段功能是一个功能有多个阶段的实现。例如修改密码,可能第一步是验证用户身份信息,号码验证码类的。当验证成功后,跳到第二步,输入新密码,很多程序会在这一步不再验证用户身份,导致恶意攻击者抓包直接修改参数值,导致可修改任意用户密码。

  3. 基于参数的访问控制:有的程序会在参数里面进行权限认证。如:www.xxx.com/uid=test&admin=0 ,把0改为1就有了admin权限。

  4. 隐藏链接:有的程序会把页面独立,让爬虫爬取不到,但是可以使用扫目录的方式扫到url,如果此时页面不做权限认证,就可直接访问到功能点,或者只是前端跳转,可以使用burp抓回包,然后删除js代码绕过。

  5. 越权可能存在的地方:增、删、改、查、详情、导出等功能,当有这些功能的时候提高重视,在url、post data、cookie处寻找是否有鉴权参数

    最关键的点就是定位鉴权参数,然后替换为其他账户鉴权参数的方法来发现越权漏洞。

越权漏洞挖掘

​ 测试水平越权漏洞一般要控制2个账号,来互相探测能否影响到对方数据,一般是使用2个浏览器,分别使用2个账号登陆,在各个功能点修改参数(get、post、cookie)观察是否会影响到另一个账号的数据。 测试垂直越权一般看是否补通过认证即可访问管理页面,或是找是否有一个参数表示身份权限是否是管理员。
在测试越权漏洞的过程中也必然会涉及到订单ID的篡改、编号篡改、用户ID遍历、数据重放等操作。

未授权访问

​ 未授权访问是指用户在没有通过认证授权的情况下能够直接访问需要通过认证才能访问到的页面或文本信息。可以尝试在登录某网站前台或后台之后,将相关的页面链接复制于其他浏览器或其他电脑上进行访问,看是否能访问成功。

登录体系安全

  • 登录账号密码可以暴力破解
  • 登录默认口令/弱口令的
  • 短信验证码可爆破
  • 登录返回包中有验证码
  • 登录返回页面hidden中有验证码
  • 有些其他登陆url中不需要验证码
  • 登录验证码不变,验证码没有一个完整的服务请求,只在刷新url时才变
  • 第一次登录请求包验证了验证码是否正确,第二次请求不需要验证
  • 登录验证码和用户名、密码是否一次同时提交
  • 公众号,app无验证
  • 登录时默认填充账号的
  • 弱加密,未使用 HTTPS,前端加密,用密文去后台验证
账号暴力破解——未限制登录次数

未限制爆破,即对于用户登录的地方没有做什么限制爆破的策略,因此对于这个地方可以直接使用burpsuit来抓包放进intruder模块爆破

账号暴力破解——限制登录次数

限制登录次数即对某个账号的登录次数进行限制,如果超过限制次数,账号就会被锁定,除非管理员解锁或者设定一段时间过后自动解锁,对于这种情况,通常可以采用弱密码来爆破账户的方式,即设置任意的不超过爆破次数的弱密码数量来反过来爆破用户名

账号暴力破解——限制IP登录次数

限制某IP登录次数即对某个IP的登录次数进行限制,如果超过限制次数,账号就会被锁定,除非管理员解锁或者设定一段时间过后自动解锁,对于这种情况,可以采用X-Forwarded-For的方法爆破账户。

x-forwarded-for

X-Forwarded-For (XFF) 在客户端访问服务器的过程中如果需要经过HTTP代理或者负载均衡服务器,可以被用来获取最初发起请求的客户端的IP地址,这个消息首部成为事实上的标准。在消息流从客户端流向服务器的过程中被拦截的情况下,服务器端的访问日志只能记录代理服务器或者负载均衡服务器的IP地址。如果想要获得最初发起请求的客户端的IP地址的话,那么 X-Forwarded-For 就派上了用场。

这个消息首部会被用来进行调试和统计,以及生成基于位置的定制化内容,按照设计的目的,它会暴露一定的隐私和敏感信息,比如客户端的IP地址。所以在应用此消息首部的时候,需要将用户的隐私问题考虑在内。

HTTP 协议中的 Forwarded 是这个消息首部的标准化版本。

X-Forwarded-For 也是一个电子邮件相关协议中用到的首部,用来表示一封电子邮件是从其他账户转发过来的。

账号自动填充

访问页面,发现页面自动填充了管理员账号,尝试密码123456

默认口令

如戴尔控制卡默认口令root/calvin,海康威视默认口令admin/12345等

弱口令

admin /admin123

万能密码

1’ or 1=1 –登录

业务逻辑漏洞终总结

  • 测试业务的时候,先了解清楚业务整体流程,可以利用思维导图快速理清各个业务之间的关系,也可以通过查看 JS 了解(JS 中可能会存在信息泄漏)

  • 重点关注的业务:个人(他人)信息、密码修改(找回)、支付流程、注册流程、需要手机(邮箱)验证的业务
    对每个业务模块进行抓包,分析其中各种请求,注意特殊参数,很有可能就是这些特殊参数决定了业务步骤
    抓包重放的过程,需要多次实验,判断是否可以跳过(绕过),如何跳过(绕过),纯数字可以用 数字 + 字母 尝试绕过

  • 返回包中数据的分析,关注特殊字符串和特殊参数

综上所述,业务流程需同时结合HTTP/HTTPS请求分析,关注重点在各种可以用于区别的参数,绕过必要验证,跳过业务步骤。

IDA 使用

IDA使用

缘由

最近几天发现IDA远程动态调试又又又出问题了,顺便感觉自己对工具使用仍然不太熟悉,决定看看《IDA pro权威指南》和IDA官方文档,记录一下IDA的功能。

IDA版本

7.7版本

反汇编器

反汇编的难点
  1. 编译过成会造成损失。

    机器语言中没有变量或变量名,变量类型信息只有个通过数据的用途来确定。看到一个32位数据被传送,需要进行一番分析,才能确定这个32位数据表示的到底是一个整数,一个32位浮点数,还是一个32位指针。

  2. 编译属于多对多的操作。

    源程序可以通过许多种不同的方式转换成汇编语言。机器语言也可以通过多种不同的方式转换成高级语言。编译一个文件,并立即反汇编,可能会得到截然不同的源文件。

  3. 反编译器非常依赖语言和库。

    用用来生成C语言代码的反汇编器处理由Delphi编译器生成的二进制文件,可能会得到非常奇怪的结果。用对windows变成api一无所知的反编译器处理编译后的windows二进制文件,也不会得到任何有用的结果。

  4. 反汇编阶段的任何错误都会影响反汇编代码

反汇编的用途
  1. 分析恶意软件
  2. 分析闭源软件的漏洞
  3. 分析闭源软件的互操作性
  4. 分析编译器生成的代码,验证编译器的性能和准确性
  5. 在调试时显示程序指令

对我来说1,2,5功能是我所需要的。

分析恶意软件

​ 由于缺乏源代码,动态分析和静态分析时分析恶意软件的两种主要技术。动态分析是指在严格控制的环境中执行恶意软件,并用系统检测实用工具记录其所有行为。相反,静态分析则试图通过浏览程序代码来理解程序的行为。此时,要查看的就是对恶意软件进行反汇编后得到的代码清单。

漏洞分析

​ 安全审核过程划分成3个步骤:发现漏洞,分析漏洞,开发破解程序。发现漏洞,是发现程序中潜在的可供利用的条件。一般情况下我们可以通过模糊测试等动态技术来达到这一目的,也可通过静态分析来实现(通常代价会更高)。一旦发现漏洞,通常需要对其进行深入分析,以确定该漏洞是否可被利用,如果可利用,在什么情况下利用。

​ 程序员声明一个70字节的数据,在由编译器分配时,会扩大到80字节。另外要了解编译器到底如何对全局生命或在函数中声明的所有变量进行排序,查看反汇编代码清单是唯一的办法。

软件互操作性

​ 如果仅以二进制形式发布一个软件,竞争对手要想创建可以和它互操作的软件,或者为该软件提供插件,将会非常困难。如果我们想要达到这个目的,有可能需要完成大量逆向工程工作。

显示调试信息

​ 在调试器中生成代码清单,可能是反汇编器最常见的一种用途。遗憾的是,调试其中内嵌反汇编器往往相当简单(OD是例外)

分类工具

file

file通过文件中的某些特定字段来确认文件的类型。某些文件类型特有的标签值(同通常成为幻数)如jpg文件的FF D8,PE文件的4D 5A(MZ),java .class file的CA FE BA BE。

二进制文件的符号

​ 编译过程会在二进制目标文件中留下符号。在创建最终的可执行文件或二进制文件时,其中一些符号用于在连接过程中解析文件之间的引用关系。其他情况下,符号用于提供与所是使用的调试器有关的其他信息。

PE Tools

​ PE Tools时一组用于分析windows系统中正在运行的进程和可执行文件的工具。在其进程列表中,用户可以将一个进程的内存映射转储到某个文件中,也可以用PE Sniffer实用工具确认可执行文件由何种编译器构建,或者该文件是否经过某种已知的模糊实用工具 哈看PE文件头字段,使用该工具还可以方便的修改任何文件头的值。

二进制文件模糊技术

​ 模糊指任何掩盖真实意图的行为。应用于可执行文件时,模糊是指掩盖程序真是行为的行为。该行为可以保护专有算法及掩盖恶意意图。

摘要工具

nm

​ 将源文件编译成目标文件时,编译器必须嵌入一些全局(外部)符号的位置信息,以便链接器在组合目标文件以创建可执行文件时,能够解析对这些符号的引用。nm工具可以列举目标文件的符号。

​ 使用nm检查中间文件(.o后缀),默认输出结果是在这个文件中声明的任何函数和全局变量的名称。如下:

  • U:未定义符号,通常为外部符号的引用
  • T:在文本部分定义的符号,通常为函数名称
  • t:在文本部分定义的符号。在C程序中,这个符号通常等于一个景天函数
  • D:已初始化的数据值
  • C:未初始化的数据值

​ 在连接过程中,符号被解析成虚拟地址(如果有可能)

ldd

​ 创建可执行文件时,必须解析他该文件引用的任何库函数的地址。连接器通过两种方法解析对库函数的调用:静态链接和动态链接。

​ 静态链接,连接器会将程序的目标文件和所需的库函数组合起来,生成一个可执行文件。这样,在运行时就不需要确定库代码的位置,因为以及包含在可执行文件中了。在分析一个静态链接二进制文件时,要回答”这个二进制文件连接了那些库“。

​ 动态链接,链接不需要复制它所需要的任何库。相反,连接器只需对所需库(.so,.dl)的引用插入到最终的可执行文件中。因此,这时生成的可执行文件也更小一些。

​ ldd(list dynamic dependencies)可以用来列举任何可执行文件所需的文件库。windows系统中,vs的dumpbin也可以列举某文件的依赖库dumpbin /dependents

objdump

​ objdump的功能是显示与目标文件有关的信息。

  1. 节头部

    程序文件每节的摘要信息

  2. 专用头部

    程序内存分布信息,还有运行时加载器所需的其他信息,包括ldd等工具生成的库列表

  3. 调试信息

    提取出程序文件中的任何调试信息

  4. 反汇编代码清单

    objdump对文件中标记为代码的部分执行线性扫描反汇编。反汇编x86代码时,objdump可以生成AT&T或Intel语法,并可以将反汇编代码保存在文本文件中,这样的文本叫做反汇编代码清单。

c++flit

​ 由于每一个重载函数都使用与原函数相同的名称,因此,支持函数重载的语言必须拥有一种机制,以区分同一个函数的许多重载版本。这种过程被叫做名称改编(name mangling)

这一点应该在c++反汇编那本书种会再次提及。

深度检测工具

strings

​ 默认情况下strings仅仅扫描文件中加载的,经初始化的部分。使用命令行参数-a可迫使strings扫描整个文件。

​ strings不会指出字符串在文件中的位置。使用命令行参数-t可以指出每一个字符串的文件偏移量

​ 使用命令行参数-e可使strings搜索更广泛的字符,如16位unicode字符。

反汇编器

​ 当遇到不采用常用文件格式的二进制文件,在这种情况下,需要一些能够从用户指定的偏移量开始反汇编的工具。

​ 两个用于x86指令集的流式反汇编器:ndsiasm,diStorm。这些可以分析网络数据包中可能包含shellcode的部分。

IDA

IDB

​ IDA的任务时将选定的可执行文件加载到内存中,并对相关的部分进行分析。随后,IDA会创建一个数据库,其组件分别保存在4给文件中,这些文件的名称与可执行文件相同。.id0时一个二叉树形式的数据库,.id1文件包含描述每个程序字节的标记。.name问价内包含与IDA的Named窗口中显示的给定程序位置有关的索引信息。.til文件用于存储与一个给定数据库的本地类型定义有关的信息。

​ 关闭项目后,这四个文件可以选择被压缩成一个IDB文件,如果工作目录存在这些,往往是因为数据库异常关闭。

​ 加载器开始分析文件后,用户可能需要输入额外的信息,以外城加载过程。例如,使用PDB调试信息创建的PE文件。如果IDA发现一个程序数据库(program database,PDB)文件,他会提示你处理相应的PDB文件。

​ 一旦IDA为某个可执行程序创建数据库,就不需要再访问这个可执行文件。

IDA数据显示窗口

反汇编窗口 IDA-View
列表视图:

文本显示串口会呈现一个程序完整反汇编代码清单。用户只有通过这个窗口才能查看一个二进制文件的数据部分。

显示窗口左边的叫做箭头窗口,实现表示非条件跳转,虚线表示条件跳转。

这是IDA对于函数栈帧布局的最准确估算。IDA对于函数栈指针及函数使用的任何栈帧指针的行为进行仔细分析,从而计算出该函数的栈帧的结构。

这里的代码交叉引用,它表示另一个程序指令引用了交叉引用注释所在位置的指令。

图形视图:

空格切换,图形视图将一个函数分解成许多块,根据条件跳转位置种植的基本快可能会生成两种流,YES的箭头为绿色,No的箭头为红色。

如果函数复杂可以看右下角的图形概况(graph overview)

右键某一个块,graph node可以折叠该块。

通过view - > oepnsubview - > disassembly命令打开另一个反汇编窗口。第一个叫IDA-ViewA,后续叫IDA-ViewB。

为了展示更多信息可以打开行前缀。

虚拟地址以【区域名称】:【虚拟地址】这种格式显示,如.text:0040110c0。

name窗口

shift+f4打开,它简要列举了一个二进制文件的所有全局名称。名称是指对一个程序虚拟地址的符号描述。在最初加载文件的过程中,IDA会根据符号表和签名分析派生出名称列表。用户可通过Names窗口快速导航到程序列表中的一直位置。

消息窗口

IDA执行相关,以及脚本执行相关。

Strings窗口

Shift+f12打开

要显示C风格以外的字符串,配置setup string windows。

ignore instruction/data definitions,这个选项会是IDA扫描指令和现有数据定义中的字符串。

导出窗口

导出窗口列出文件的入口点。这包括程序的执行入口点,以及任何由文件到处给其他文件使用的变量或者函数。

导入窗口

导入窗口的功能是列出由被分析二进制文件导入的所有函数。导入窗口仅显示二进制文件想要动态加载其自行处理的符号,二进制文件选择使用dlopen/dlsym或LoadLibraruy/GetProcAdddress等机制自行加载的符号不会再导入窗口显示。

函数窗口

函数窗口用于列出数据库的每一个函数。

结构体窗口

结构体窗口用于显示IDA决定在一个二进制文件中使用的任何负载的数据结构的布局。在分析阶段,IDA会查询它的函数类型签名扩展库,设法将函数的参数类型与程序使用的内存匹配起来。

枚举窗口

IDA检测到标准枚举数据类型,它将在枚举类型传酷狗列出该数据类型。在枚举窗口中也可以定义自己的枚举类型,和应用到反汇编的代码中。

段窗口

pass

签名窗口

shift+f5打开签名窗口,IDA使用一个庞大的签名库来识别已知的代码块。签名用于识别由编译器生成的常用启动顺序,以确定可能已被用来构建给定二进制文件的编译器。签名还可以用来将函数划归为由编译器插入的已知库函数,或者因为静态链接而添加到二进制文件中的函数。

IDA已经对该二进制文件应用了vc32rtf签名,并在这个过程中将326个函数识别为库函数。

类型库窗口

类型库保存IDA积累的一些信息,即IDA从常用的编译器的头文件中搜索到的有关预定义数据类型和函数原型的信息。通过处理头文件,IDA可以确定常用库函数所需的数据类型,并为反汇编代码添加注释。

反汇编导航

反汇编一个程序,程序的每个位置都分配到了一个虚拟地址。因此,只要提供希望访问的虚拟地址,就可以导航到程序的任何地方。

跳转到地址

在反汇编窗口按下g,输入名字或者地址。esc可以跳转到前一个位置。ctrl+enter跳转到下一个位置。

调用约定
c调用约定

x86体系结构的许多c编译器使用默认的约定叫做c调用约定。c/c++程序中常用的_decl修饰符会迫使编译器利用c调用约定。调用方按从右到左的顺序将函数参数放入栈,在被调用的函数完成其操作的时候,调用方负责从栈中清除参数(本质上就是栈帧平衡)。

如果函数能够接受数量可变的参数,调用方非常适于进行这种调整,因为它清楚地知道,它向函数传递了多少个参数。

标准调用约定

微软为自己调用约定起到名称,在函数声明时使用修饰符_stdcall。它也是从右到左的顺序将函数参数放在程序栈上。函数结束执行的时候,由被调用的函数负责删除栈中的函数参数。接受可变数量的参数的函数无法使用这个调用约定。

x86编译器能使用RET指令的一种特殊形式,同时从栈顶提取返回地址,并给栈指针加上12,以消除函数参数。

ret 12 ; return and clear 12 bytes from the stack

使用stdcall的主要优点在于,在每次函数调用之后,不需要通过代码从栈中清除参数,因而能够生成体积稍小,速度稍快的程序。根据惯例,微软对所有由共享库文件输出的参数数量固定的函数使用stdcall约定。

x86 fastcall调用约定

fastcall约定是stdcall约定的一个变体,它向CPU寄存器(而非程序栈)最多传递两个参数。Microsoft Visual C/C++和GNU gcc/g++ (3.4及更低版本)编译器能够识别雨数声明中的fastcall修饰符。如果指定使用fastcall约定,则传递给函数的前两个参数将分别位于ECX和EDX寄存器中。剩余的其他参数则以类似于stdcall约定的方式从右到左放入栈上。同样与stdcall约定类似的是,在返回其调用方时,fastcall 函数负责从栈中刪除参数。下面的声明中即使用了fastcall修饰符。

局部变量布局

存在规定如何向函数传递参数的调用约定,但不存在规定函数的局部变量布局的约定。编译器的第一一个任务,是计算出函数的局部变量所需的空间。编译器的第二个任务,则是确定这些变函数的调用方无关,也与被调用的函数无关。值得注意的是,通过检查函数的源代码,通常无法函数的调用方无关,也与被调用的函数无关。值得注意的是,通过检查函数的源代码,通常无法确定函数的局部变量布局。

栈帧示例

栈帧

文本搜索

在反汇编窗口进行字符串搜索alt+tctrl+t找到下一个搜索结果。

二进制搜索

如果需要搜索特定的二进制内容,如已知的字节序列,快捷键alt+bctrl+b。用引号可以搜索字符串。

反汇编操作

名称与命名

快捷键n

参数与局部变量

栈变量的名称根据给定栈帧所属的函数,这类名称的作用域受到限制。程序中的每一个函数可能都有一个名为arg_0的栈变量,但没有一个函数拥有一个以上的arg_0变量。

输入空白,IDA会生成默认的名称。

已命名的位置
  • Local names (局部名称):局部名称的作用域仅限于当前函数,因此,局部名称的唯一性仅在某个给定的函数中有效。与局部变量一样,两个不同的函数可能含有完全相同的局部名称,但一个函数不可能包含两个完全相同的局部名称。在函数边界以外的已命名的函数中的跳转目标提供符号名称,如那些与分支控制结构有关的名称。
  • Include in names list (包含在名称列表中):选择这个选项将有一个名称被添加到名称窗口中,这样,当你需要返回该名称所在位置时,就更容易找到这个名称。默认情况下,自动生成的名称(哑名)不包含在名称窗口中。
  • Public name (公共名称):通常,公共名称是指由二进制文件(如共享库)输出的名称。在最初加载数据库的过程中,IDA的解析器会在解析文件头的同时查找公共名称。选择这个属性,你可以迫使IDA将一个符号看成是公共名称。一般来说, 这样做除了给反汇编代码清单和名称窗口中的名称添加公共注释外,不会对反汇编代码造成任何影响。
  • Autogenerated oame (自动生成的名称):这个属性似乎不会对反汇编代码产生任何明显的影响。选择它并不会使IDA自动生成一个名称。
  • Weak name (弱名称):弱符号(weak symbol)是公共符号的一种特殊形式,只有没有找到相同名称的公共符号来重写时,才会使用弱符号。将一个符号标记为弱符号对汇编器有一定意义,但对IDA反汇编代码却没有任何意义。
  • Create name anyway (无论如何都要创建名称):如前所述,一个函数中不会有两个位置使用相同的名称。同样,在函数以外(全局范围内),也不能有两个位置使用相同的名称。这个选项比较容易引起混淆,因为你创建的名称的类型不同,它的行为也不一样。
寄存器名称

在函数边界内,IDA允许对寄存器进行重命名。并使用它在当前函数执行期间引用该寄存器。如果一段代码不属于某个函数,重命名这段代码中的寄存器是不可能的。

IDA中的注释

常规注释

:默认情况下,常规注释以蓝色显示

可重复注释

;可重复注释一旦输入,将会自动出现在反汇编窗口的许多位置。默认颜色为蓝色。可重复注释的行为与交叉引用的概念相关。如果一个程序位置引用了另一个包含重复注释的位置,则该注释会在第一个位置回显(回显的是灰色)。

在前注释和在后注释

在前注释和在后注释是出现在指定的反汇编行之前或之后的注释,他们仅仅是不以分号为前缀的注释

函数注释

pass

基本代码转换

许多时候,对于IDA生成的反汇编代码清单,你会感到非常满意。但有些情况并非始终如此。如果你所分析的文件类型与常见编译器生成的曾通二进制可执行文件相差甚大,你可能需要对反汇编分析和显示过程进行更多的控制。在分析采用自定义文件格式(IDA无法识别)的模糊代码或文件时,情况更是如此。

IDA提供的代码转换包括以下几类。

  • 将数据转换为代码;
  • 将代码转换为数据;
  • 指定一个指令序列为函数;
  • 更改现有函数的起始或结束地址;
  • 更改指令操作数的显示格式。

利用这些操作的频繁程度取决于诸多因素及你的个人喜好。一般而言, 如果二进制文件非常复杂,或者说IDA不熟悉用于构建二进制文件的编译器所生成的代码序列,那么,IDA在分析阶段可能会遇到更多麻烦;因此,你也就需要对反汇编代码进行手动调整。

格式化指令操作数

use stander symbolic constant可以选择将操作数替换成一些标准库中的枚举常量。

操作函数

IDA无法定位一个函数调用,由于无法到达函数,IDA将无法识别它们。IDA也可能无法确定函数的结束部分,需要手动干预。编译器优化代码将数个函数的指共同指结束序列合并在一起,IDA也无法确定函数的结束部分。

新建函数

将光标放在新函数的第一个字节或指令上,选择edit->function->creat function即可以创建一个新函数。必要的时候IDA会把数据转换成代码。接下来,它向前扫描,分析函数的结构,并搜索放回语句。如果找到函数的结束部分就创建一个新的函数名,分析栈帧。无法找到结束部分或者找到非法指令,操作失败。

删除函数

edit->function->delete function

函数块

vc++编译器生成的代码,经常可以找到函数块。编译器移动不常执行的代码段,用以将经常执行的代码段“挤入”不太可能换出的内存也,由此便产生了函数块。

如果一个函数以这种方式被分割,ida会通过跟踪指向每个块的跳转,尝试定位所有相关的块。

函数属性
  • 函数名称
  • 起始地址
  • 结束地址 函数最后一条指令之后的地址
  • 局部变量区 局部变量专用的栈字节数
  • 保存到寄存器 保存寄存器所使用的字节数
  • 已删除字节 表示当函数返回调用方的时候,IDA从栈中删除的参数的字节数。对cdecl函数而言,这个值为0;对stdcall函数而言,这个值表示传递到栈上所有参数占用的空间。在x86程序中,如果IDA观察到程序使用了返回指令的RETN变体,他将自动确定这个值。
  • 帧指针增量 有时候,编译器可能会对函数的帧指针进行调整,使其指向局部变量区域的中间,而不是指向保存在局部变量区域底部的帧指针。调整后的帧指针到保存的帧指针之间的这段距离叫做帧指针增量(frame pointer delta)。多数情况下,IDA会在分析函数的过程中自动计算出帧指针增量。编译器利用栈帧增量进行速度优化。使用增量的目的,是在离帧指针1个字节(带符号)的偏移量(-128+127) 内保存尽可能多的栈帧变量。
  • 不返回 函数不返回到它的调用方,如果调用这样的函数。在相关的调用指令之后,IDA认为函数不会继续执行。
  • 远函数 这个属性用与在分段体系结构上将一个函数标记为远函数。
  • 库函数 将一个函数标记为库函数
  • 静态函数 除在函数的属性列表中显示静态修饰符外,其他扫描也不做
  • 基于bp的帧 这个属性表示函数利用了一个帧指针。
  • bp=sp 它的作用等同于将帧指针增量的大小设置为等于局部变量区域。

数据与代码互相转化

反汇编界面u转为数据 c转为代码

基本数据转换

alt+d指定数据大小


此上是第七章及之前的内容

请我喝杯咖啡吧~

支付宝
微信